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 1tD9lo-00GMDU-G2 for pgsql-hackers@arkaria.postgresql.org; Mon, 18 Nov 2024 21:58:56 +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 1tD9ll-0089sw-7G for pgsql-hackers@arkaria.postgresql.org; Mon, 18 Nov 2024 21:58:53 +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 1tD9lk-0089so-DC for pgsql-hackers@lists.postgresql.org; Mon, 18 Nov 2024 21:58:53 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tD9lc-002aTO-SZ for pgsql-hackers@postgresql.org; Mon, 18 Nov 2024 21:58:51 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1731967122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=l26n3VMJVAOi4w2Wgp4ZiutITkwUi2zUufdHVmvoJzI=; b=FZO64hcHMz+MRQckz5JQXwGplhbPNu0lqCCAjaGI3RjCfiDtM3cWva/KpKdPigKGgIMBJF PD3ekhhSM1zrQFN0JyNH9BuROR6/CwlRGoA5udBdXzeNYDUU15BFXay1duxPmoDWeylV6e ZZvz/Qd/NVbvYW+hFJH+e4JWEKyQi3o= Received: from mail-io1-f72.google.com (mail-io1-f72.google.com [209.85.166.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-29-FsG8TtGVP4KKWbrEboIgOw-1; Mon, 18 Nov 2024 16:58:40 -0500 X-MC-Unique: FsG8TtGVP4KKWbrEboIgOw-1 X-Mimecast-MFC-AGG-ID: FsG8TtGVP4KKWbrEboIgOw Received: by mail-io1-f72.google.com with SMTP id ca18e2360f4ac-83ac354a75fso306553039f.0 for ; Mon, 18 Nov 2024 13:58:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731967119; x=1732571919; h=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=v6Ayy7LVpjvLfnhrV4fcwMMRkkaCeycjK0nQ5D0/xNs=; b=jymgt0LlXQpfmbBeQMyt388ScsNmp922zcHJFR0dT+DCeB5PSzzl3wIq3k/XYPrGdK +vv+fbEH/+3YWpB6pJuofhJeOJK1A9SuqRhqQJ44DIo1v/rWv9UFGmH93ZAKYfnDSXmQ E4wCyU/g/Zxid1ESIxKEBUeo73BpUBc7s5/4OcZqgKvZE2s8085NQ5859IB3FfbKf4Pg lQyBcAaV6975d19tH6AIWE4DYYtsI1JNKwXPSI/Ddc/SFB213ymA/EJ7QOuaI8FM6R7Q yOn206U/NrwhK6xyHM9rngM7fEbgN3ucUe81+0/Ucorm4UdGzp3x7ffXFNQgJtHEi2kq //Pw== X-Gm-Message-State: AOJu0YzW9Xa2p130IaqTrXQH7Hn+zzPaUGHvwOTKCekMELw2qaeHEYOr fFm/L99LLZCNloMlXfYiUChmCFSiRFdaZd3vakYxl7Q0fnnHhs/51OPcOqpXwFaLVb9ykmm4fi/ xyauQQRI4Trp2sC7dMvPCCIVg3JpL9aflkQKkXVbU1+GkWQvgQKAjnUzx+Y21Gysp+K9tw++GEF a7vHumRajCmGrL39sm9JjdR5fuCE3qJrYZYl09xUc1GgDk X-Received: by 2002:a05:6602:27cb:b0:83a:b33a:5dff with SMTP id ca18e2360f4ac-83e6c18025cmr1508786739f.14.1731967119448; Mon, 18 Nov 2024 13:58:39 -0800 (PST) X-Google-Smtp-Source: AGHT+IEOw3QfvbOoqjNt6UowUT5L1CRCKesYRmQmb7znVA6uO6Br2EjSwhYFWGBdDoOzCMSCex8w3vOYC4UNwE6CVuc= X-Received: by 2002:a05:6602:27cb:b0:83a:b33a:5dff with SMTP id ca18e2360f4ac-83e6c18025cmr1508785539f.14.1731967119156; Mon, 18 Nov 2024 13:58:39 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Filip Janus Date: Mon, 18 Nov 2024 22:58:27 +0100 Message-ID: Subject: Re: Proposal: Adding compression of temporary files To: pgsql-hackers@postgresql.org X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: VD46QMWLlga4oFQKPAG-J_vwz41Vcv5tVBscuI9hIKA_1731967120 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000e69b990627370476" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e69b990627370476 Content-Type: multipart/alternative; boundary="000000000000e69b960627370474" --000000000000e69b960627370474 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Let's fix the compiler warning caused by an uninitialized local variable. -Filip- =C4=8Dt 14. 11. 2024 v 23:13 odes=C3=ADlatel Filip Janus napsal: > Hi all, > Postgresql supports data compression nowadays, but the compression of > temporary files has not been implemented yet. The huge queries can > produce a significant amount of temporary data that needs to be stored on > disk > and cause many expensive I/O operations. > I am attaching a proposal of the patch to enable temporary files > compression for > hashjoins for now. Initially, I've chosen the LZ4 compression algorithm. > It would > probably make better sense to start with pglz, but I realized it late. > > # Future possible improvements > Reducing the number of memory allocations within the dumping and loading = of > the buffer. I have two ideas for solving this problem. I would either add > a buffer into > struct BufFile or provide the buffer as an argument from the caller. For > the sequential > execution, I would prefer the second option. > > # Future plan/open questions > In the future, I would like to add support for pglz and zstd. Further, I > plan to > extend the support of the temporary file compression also for sorting, > gist index creation, etc. > > Experimenting with the stream mode of compression algorithms. The > compression > ratio of LZ4 in block mode seems to be satisfying, but the stream mode > could > produce a better ratio, but it would consume more memory due to the > requirement to store > context for LZ4 stream compression. > > # Benchmark > I prepared three different databases to check expectations. Each > dataset is described below. My testing demonstrates that my patch > improves the execution time of huge hash joins. > Also, my implementation should not > negatively affect performance within smaller queries. > The usage of memory needed for temporary files was reduced in every > execution without a significant impact on execution time. > > *## Dataset A:* > Tables > table_a(bigint id,text data_text,integer data_number) - 10000000 rows > table_b(bigint id, integer ref_id, numeric data_value, bytea data_blob) - > 10000000 rows > Query: SELECT * FROM table_a a JOIN table_b b ON a.id =3D b.id; > > The tables contain highly compressible data. > The query demonstrated a reduction in the usage of the temporary > files ~20GB -> 3GB, based on this reduction also caused the execution > time of the query to be reduced by about ~10s. > > > *## Dataset B:* > Tables: > table_a(integer id, text data_blob) - 1110000 rows > table_b(integer id, text data_blob) - 10000000 rows > Query: SELECT * FROM table_a a JOIN table_b b ON a.id =3D b.id; > > The tables contain less compressible data. data_blob was generated by a > pseudo-random generator. > In this case, the data reduction was only ~50%. Also, the execution time > was reduced > only slightly with the enabled compression. > > The second scenario demonstrates no overhead in the case of enabled > compression and extended work_mem to avoid temp file usage. > > *## Dataset C:* > Tables > customers (integer,text,text,text,text) > order_items(integer,integer,integer,integer,numeric(10,2)) > orders(integer,integer,timestamp,numeric(10,2)) > products(integer,text,text,numeric(10,2),integer) > > Query: SELECT p.product_id, p.name, p.price, SUM(oi.quantity) AS > total_quantity, AVG(oi.price) AS avg_item_price > FROM eshop.products p JOIN eshop.order_items oi ON p.product_id =3D > oi.product_id JOIN > eshop.orders o ON oi.order_id =3D o.order_id WHERE o.order_date > > '2020-01-01' AND p.price > 50 > GROUP BY p.product_id, p.name, p.price HAVING SUM(oi.quantity) > 1000 > ORDER BY total_quantity DESC LIMIT 100; > > This scenario should demonstrate a more realistic usage of the database. > Enabled compression slightly reduced the temporary memory usage, but the > execution > time wasn't affected by compression. > > > > +------------+-------------------------+-----------------------+---------= ---------------------+ > | Dataset | Compression. | temp_bytes | Execution Time > (ms) | > +------------+-------------------------+-----------------------+---------= -------------------- > + > | A | Yes | 3.09 GiB | > 22s586ms | work_mem =3D 4MB > | | No | 21.89 GiB | > 35s | work_mem =3D 4MB > > +------------+-------------------------+-----------------------+---------= ------------------------------- > | B | Yes | 333 MB | > 1815.545 ms | work_mem =3D 4MB > | | No | 146 MB | > 1500.460 ms | work_mem =3D 4MB > | | Yes | 0 MB > | 3262.305 ms | work_mem =3D 80MB > | | No | 0 MB > | 3174.725 ms | work_mem =3D 80MB > > +-------------+------------------------+------------------------+--------= ----------------------------- > | C | Yes | 40 MB > | 1011.020 ms | work_mem =3D 1MB > | | No | 53 MB | > 1034.142 ms | work_mem =3D 1MB > > +------------+------------------------+------------------------+---------= ----------------------------- > > > Regards, > > -Filip- > --000000000000e69b960627370474 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Let's fix the compiler warning caused by an unini= tialized local variable.

=C2=A0 =C2=A0 -Filip-
<= /div>

=C4=8Dt 14. 11. 2024 v=C2=A023:13 odes=C3=ADlatel Filip Janus <= fjanus@redhat.com> napsal:
<= /div>
Hi all,
Postgresql supports data compress= ion nowadays, but the compression of
temporary files has not been imple= mented yet. The huge queries can=C2=A0
produce a sign= ificant amount of temporary data that needs to be=C2=A0stored on disk=C2=A0=
and cause many expensive I/O operations.
I am att= aching a proposal of the patch to enable temporary files compression for hashjoins for now. Initially, I've chosen the LZ4 compression algorit= hm. It would
probably make better sense to start with= pglz, but I realized it late.

# Future possible improvements
Re= ducing the number of memory allocations within the dumping and loading of
the buffer. I have two ideas for solving this problem.= I would either add a buffer into
struct BufFile or p= rovide the buffer as an argument from the caller. For the sequential=C2=A0<= /div>
execution, I would prefer the second option.

#= Future plan/open questions
In the future, I would like to add support f= or pglz and zstd. Further, I plan to
extend the support of the temporary= file compression also for sorting, gist index creation, etc.

Experi= menting with the stream mode of compression algorithms. The compression=C2= =A0
ratio of LZ4 in block mode seems to be satisfying= , but the stream mode could=C2=A0
produce a better ra= tio, but it would consume more memory due to the requirement to store
=
context for LZ4 stream compression.

# Benchmark
= I prepared three different databases to check expectations. Each=C2=A0
dataset is described below. My testing demonstrates that = my patch=C2=A0
improves the execution time of huge ha= sh joins.=C2=A0
Also, my implementation should not negatively affect performance within smaller queries.=C2=A0
The usage of memory needed for temporary files was reduced in ever= y
=C2=A0execution without a significant impact on exe= cution time.

## Dataset A:
<= div>Tables
table_a(bigint id,text data_text,integer da= ta_number) - 10000000 rows
table_b(bigint id, integer ref_id,= numeric data_value, bytea data_blob) - 10000000 rows
Query:=C2= =A0 SELECT *=C2=A0 FROM table_a a JOIN table_b b ON a.id =3D b= .id;

The tables contain highly compressible da= ta.
The query demonstrated a reduction in the usage of the tempor= ary=C2=A0
files ~20GB -> 3GB, based on this reduction also cau= sed the execution=C2=A0
time of the query to be reduced by about = ~10s.


## Datase= t B:
Tables:
table_a(integer id, text da= ta_blob) - 1110000 rows
table_b(integer id, text data_blob) -= 10000000 rows
Query:=C2=A0 SELECT *=C2=A0 FROM table_a a JOI= N table_b b ON a.id =3D b.id;

The= tables contain less compressible data. data_blob was generated by a pseudo= -random generator.
In this case, the data reduction was only= ~50%. Also, the execution time was reduced=C2=A0
only slightly w= ith the enabled compression.

The second scena= rio demonstrates no overhead in the case of enabled=C2=A0
compres= sion and extended work_mem to avoid temp file usage.

## Dataset C:
Tables
customers (int= eger,text,text,text,text)
order_items(integer,integer,integer,int= eger,numeric(10,2))
orders(integer,integer,timestamp,numeric(10,2= ))
products(integer,text,text,numeric(10,2),integer)

Query: SELECT=20 p.product_id, p.name, p.price, SUM(oi.quantity) AS total_quantity, AVG(oi.price) AS avg_item_price
FROM eshop.products p JOIN eshop.order_items oi ON p.product_id = =3D oi.product_id JOIN=C2=A0
eshop.orders o ON oi.order_i= d =3D o.order_id WHERE o.order_date > '2020-01-01'= ; AND p.price > 50
<= span>GROUP BY p.product_id, p.name, p.price HAVING SUM(oi.quantity) > 1= 000
ORDER BY total_quanti= ty DESC LIMIT 100;

This scenario should demon= strate a more realistic usage of the database.
Enabled compressio= n slightly reduced the temporary memory usage, but the execution
= time wasn't affected by compression.


+------------+-----------------= --------+-----------------------+------------------------------+
| =C2= =A0Dataset =C2=A0 | Compression. =C2=A0 =C2=A0 =C2=A0 | temp_bytes =C2=A0 = =C2=A0 =C2=A0=C2=A0=C2=A0 | Execution Time (ms)=C2=A0=C2=A0 | =C2=A0 =C2=A0= =C2=A0
+------------+-------------------------+-----------------------= +----------------------------- +
| A =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 | Yes=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 |=C2=A0 3.09 GiB =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=C2= =A0=C2=A0 | 22s586ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 | work_mem=C2=A0 =3D 4MB
| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0=C2=A0 | No=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0 |=C2=A0 21.89 GiB =C2=A0 =C2=A0 = =C2=A0 =C2=A0=C2=A0 | 35s=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 | work_mem=C2=A0 =3D 4MB
+------------+-------------------------+---= --------------------+----------------------------------------
| B= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | = Yes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0= =C2=A0333 MB =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 | 1815.545 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work= _mem =3D 4MB
|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 146=C2=A0 MB =C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 | 1500.460 ms=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 4MB
| = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0=C2=A0 | Yes=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 0 MB =C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0= |=C2=A03262.305 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem = =3D 80MB
|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 0 MB =C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0=C2=A0 |=C2= =A03174.725 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem = =3D 80MB
+-------------+------------------------+----------= --------------+-------------------------------------
| C=C2=A0=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Yes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 | 40 MB=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A01011= .020 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 1MB
<= div>|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0 53 MB=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 1034.142 ms=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 1MB


Regards,

=C2=A0 =C2=A0 -Filip-
--000000000000e69b960627370474-- --000000000000e69b990627370476 Content-Type: application/octet-stream; name="0001-This-commit-adds-support-for-temporary-files-compres-v2.patch" Content-Disposition: attachment; filename="0001-This-commit-adds-support-for-temporary-files-compres-v2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m3nkekca0 RnJvbSA3OTBmOTEzMzkxY2I5ZmZkNTQ0MDIwMjk2MjY3NGFkZGJmYjc5MDAxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGaWxpcCA8ZmphbnVzQHJlZGhhdC5jb20+CkRhdGU6IFRodSwg MjQgT2N0IDIwMjQgMTI6MTU6MTAgKzAyMDAKU3ViamVjdDogW1BBVENIIHYyXSBBZGQgc3VwcG9y dCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGNvbXByZXNzaW9uClRoaXMgY29tbWl0IGFkZHMgc3VwcG9y dCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGNvbXByZXNzaW9uLCBpdCBjYW4gYmUKdXNlZCBvbmx5IGZv ciBoYXNoam9pbnMgbm93LgoKCkl0IGFsc28gYWRkcyBHVUMgcGFyYW1ldGVyIHRlbXBfZmlsZV9j b21wcmVzc2lvbiB0aGF0IGVuYWJsZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgpGb3Igbm93LCBpdCBz dXBwb3J0cyBqdXN0IGx6NCBhbGdvcml0aG1zLiBJbiB0aGUgZnV0dXJlLCBpdApjb3VsZCBhbHNv IGJlIGltcGxlbWVudGVkIHBnbHogYW5kIHpzdGQgc3VwcG9ydC4KLS0tCiBzcmMvYmFja2VuZC9h Y2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMgICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL2Jh Y2t1cC9iYWNrdXBfbWFuaWZlc3QuYyAgICAgICAgICB8ICAgMiArLQogc3JjL2JhY2tlbmQvZXhl Y3V0b3Ivbm9kZUhhc2hqb2luLmMgICAgICAgICAgIHwgICAyICstCiBzcmMvYmFja2VuZC9zdG9y YWdlL2ZpbGUvYnVmZmlsZS5jICAgICAgICAgICAgfCAxNjggKysrKysrKysrKysrKysrKystCiBz cmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyAgICAgICAgICAgfCAgMjMgKysrCiBz cmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAgIDEgKwogc3Jj L2JhY2tlbmQvdXRpbHMvc29ydC9sb2d0YXBlLmMgICAgICAgICAgICAgIHwgICAyICstCiBzcmMv YmFja2VuZC91dGlscy9zb3J0L3R1cGxlc3RvcmUuYyAgICAgICAgICAgfCAgIDIgKy0KIHNyYy9p bmNsdWRlL3N0b3JhZ2UvYnVmZmlsZS5oICAgICAgICAgICAgICAgICB8ICAxMyArLQogOSBmaWxl cyBjaGFuZ2VkLCAyMDAgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpc3QvZ2lzdGJ1aWxkYnVmZmVycy5jIGIvc3JjL2JhY2tl bmQvYWNjZXNzL2dpc3QvZ2lzdGJ1aWxkYnVmZmVycy5jCmluZGV4IDRjMjMwMWRhMDAuLjliM2Iw MDE0MmEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3RidWlsZGJ1ZmZl cnMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMKQEAg LTU0LDcgKzU0LDcgQEAgZ2lzdEluaXRCdWlsZEJ1ZmZlcnMoaW50IHBhZ2VzUGVyQnVmZmVyLCBp bnQgbGV2ZWxTdGVwLCBpbnQgbWF4TGV2ZWwpCiAJICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUg dG8gaG9sZCBidWZmZXIgcGFnZXMgdGhhdCBhcmUgc3dhcHBlZCBvdXQgb2YKIAkgKiBtZW1vcnku CiAJICovCi0JZ2ZiYi0+cGZpbGUgPSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSk7CisJZ2ZiYi0+ cGZpbGUgPSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSwgZmFsc2UpOwogCWdmYmItPm5GaWxlQmxv Y2tzID0gMDsKIAogCS8qIEluaXRpYWxpemUgZnJlZSBwYWdlIG1hbmFnZW1lbnQuICovCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9iYWNrdXAvYmFja3VwX21hbmlmZXN0LmMgYi9zcmMvYmFja2Vu ZC9iYWNrdXAvYmFja3VwX21hbmlmZXN0LmMKaW5kZXggYTJlMmY4NjMzMi4uZjhhM2UxZjBmNCAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYmFja3VwL2JhY2t1cF9tYW5pZmVzdC5jCisrKyBiL3Ny Yy9iYWNrZW5kL2JhY2t1cC9iYWNrdXBfbWFuaWZlc3QuYwpAQCAtNjUsNyArNjUsNyBAQCBJbml0 aWFsaXplQmFja3VwTWFuaWZlc3QoYmFja3VwX21hbmlmZXN0X2luZm8gKm1hbmlmZXN0LAogCQlt YW5pZmVzdC0+YnVmZmlsZSA9IE5VTEw7CiAJZWxzZQogCXsKLQkJbWFuaWZlc3QtPmJ1ZmZpbGUg PSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSk7CisJCW1hbmlmZXN0LT5idWZmaWxlID0gQnVmRmls ZUNyZWF0ZVRlbXAoZmFsc2UsIGZhbHNlKTsKIAkJbWFuaWZlc3QtPm1hbmlmZXN0X2N0eCA9IHBn X2NyeXB0b2hhc2hfY3JlYXRlKFBHX1NIQTI1Nik7CiAJCWlmIChwZ19jcnlwdG9oYXNoX2luaXQo bWFuaWZlc3QtPm1hbmlmZXN0X2N0eCkgPCAwKQogCQkJZWxvZyhFUlJPUiwgImZhaWxlZCB0byBp bml0aWFsaXplIGNoZWNrc3VtIG9mIGJhY2t1cCBtYW5pZmVzdDogJXMiLApkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUhhc2hqb2luLmMgYi9zcmMvYmFja2VuZC9leGVjdXRv ci9ub2RlSGFzaGpvaW4uYwppbmRleCAyZjcxNzA2MDRkLi4xYjVjNjQ0OGVmIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSGFzaGpvaW4uYworKysgYi9zcmMvYmFja2VuZC9l eGVjdXRvci9ub2RlSGFzaGpvaW4uYwpAQCAtMTQzNCw3ICsxNDM0LDcgQEAgRXhlY0hhc2hKb2lu U2F2ZVR1cGxlKE1pbmltYWxUdXBsZSB0dXBsZSwgdWludDMyIGhhc2h2YWx1ZSwKIAl7CiAJCU1l bW9yeUNvbnRleHQgb2xkY3R4ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGhhc2h0YWJsZS0+c3Bp bGxDeHQpOwogCi0JCWZpbGUgPSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSk7CisJCWZpbGUgPSBC dWZGaWxlQ3JlYXRlVGVtcChmYWxzZSwgdHJ1ZSk7CiAJCSpmaWxlcHRyID0gZmlsZTsKIAogCQlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3R4KTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvZmlsZS9idWZmaWxlLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmlsZS5j CmluZGV4IGEyN2Y1MWY2MjIuLjZjYjZkY2M3ODMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvZmlsZS9idWZmaWxlLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2J1ZmZp bGUuYwpAQCAtNTQsNiArNTQsMTYgQEAKICNpbmNsdWRlICJzdG9yYWdlL2ZkLmgiCiAjaW5jbHVk ZSAidXRpbHMvcmVzb3duZXIuaCIKIAorI2lmZGVmIFVTRV9MWjQKKyNpbmNsdWRlIDxsejQuaD4K KyNlbmRpZgorCisjZGVmaW5lIE5PX0xaNF9TVVBQT1JUKCkgXAorCWVyZXBvcnQoRVJST1IsIFwK KwkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwgXAorCQkJIGVycm1z ZygiY29tcHJlc3Npb24gbWV0aG9kIGx6NCBub3Qgc3VwcG9ydGVkIiksIFwKKwkJCSBlcnJkZXRh aWwoIlRoaXMgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyB0aGUgc2VydmVyIHRvIGJlIGJ1aWx0IHdp dGggbHo0IHN1cHBvcnQuIikpKQorCiAvKgogICogV2UgYnJlYWsgQnVmRmlsZXMgaW50byBnaWdh Ynl0ZS1zaXplZCBzZWdtZW50cywgcmVnYXJkbGVzcyBvZiBSRUxTRUdfU0laRS4KICAqIFRoZSBy ZWFzb24gaXMgdGhhdCB3ZSdkIGxpa2UgbGFyZ2UgQnVmRmlsZXMgdG8gYmUgc3ByZWFkIGFjcm9z cyBtdWx0aXBsZQpAQCAtNjIsNiArNzIsOCBAQAogI2RlZmluZSBNQVhfUEhZU0lDQUxfRklMRVNJ WkUJMHg0MDAwMDAwMAogI2RlZmluZSBCVUZGSUxFX1NFR19TSVpFCQkoTUFYX1BIWVNJQ0FMX0ZJ TEVTSVpFIC8gQkxDS1NaKQogCitpbnQgdGVtcF9maWxlX2NvbXByZXNzaW9uID0gVEVNUF9OT05F X0NPTVBSRVNTSU9OOworCiAvKgogICogVGhpcyBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRzIGEg YnVmZmVyZWQgZmlsZSB0aGF0IGNvbnNpc3RzIG9mIG9uZSBvcgogICogbW9yZSBwaHlzaWNhbCBm aWxlcyAoZWFjaCBhY2Nlc3NlZCB0aHJvdWdoIGEgdmlydHVhbCBmaWxlIGRlc2NyaXB0b3IKQEAg LTk1LDcgKzEwNyw3IEBAIHN0cnVjdCBCdWZGaWxlCiAJb2ZmX3QJCWN1ck9mZnNldDsJCS8qIG9m ZnNldCBwYXJ0IG9mIGN1cnJlbnQgcG9zICovCiAJaW50CQkJcG9zOwkJCS8qIG5leHQgcmVhZC93 cml0ZSBwb3NpdGlvbiBpbiBidWZmZXIgKi8KIAlpbnQJCQluYnl0ZXM7CQkJLyogdG90YWwgIyBv ZiB2YWxpZCBieXRlcyBpbiBidWZmZXIgKi8KLQorCWJvb2wJCQljb21wcmVzczsgLyrCoFN0YXRl IG9mIHVzZWdlIGZpbGUgY29tcHJlc3Npb24gKi8KIAkvKgogCSAqIFhYWCBTaG91bGQgaWRlYWxs eSB1cyBQR0lPQWxpZ25lZEJsb2NrLCBidXQgbWlnaHQgbmVlZCBhIHdheSB0byBhdm9pZAogCSAq IHdhc3RpbmcgcGVyLWZpbGUgYWxpZ25tZW50IHBhZGRpbmcgd2hlbiBzb21lIHVzZXJzIGNyZWF0 ZSBtYW55IGZpbGVzLgpAQCAtMTI3LDYgKzEzOSw3IEBAIG1ha2VCdWZGaWxlQ29tbW9uKGludCBu ZmlsZXMpCiAJZmlsZS0+Y3VyT2Zmc2V0ID0gMDsKIAlmaWxlLT5wb3MgPSAwOwogCWZpbGUtPm5i eXRlcyA9IDA7CisJZmlsZS0+Y29tcHJlc3MgPSBmYWxzZTsKIAogCXJldHVybiBmaWxlOwogfQpA QCAtMTkwLDcgKzIwMyw3IEBAIGV4dGVuZEJ1ZkZpbGUoQnVmRmlsZSAqZmlsZSkKICAqIHRyYW5z YWN0aW9uIGJvdW5kYXJpZXMuCiAgKi8KIEJ1ZkZpbGUgKgotQnVmRmlsZUNyZWF0ZVRlbXAoYm9v bCBpbnRlclhhY3QpCitCdWZGaWxlQ3JlYXRlVGVtcChib29sIGludGVyWGFjdCwgYm9vbCBjb21w cmVzcykKIHsKIAlCdWZGaWxlICAgICpmaWxlOwogCUZpbGUJCXBmaWxlOwpAQCAtMjEyLDYgKzIy NSwxNSBAQCBCdWZGaWxlQ3JlYXRlVGVtcChib29sIGludGVyWGFjdCkKIAlmaWxlID0gbWFrZUJ1 ZkZpbGUocGZpbGUpOwogCWZpbGUtPmlzSW50ZXJYYWN0ID0gaW50ZXJYYWN0OwogCisJaWYgKHRl bXBfZmlsZV9jb21wcmVzc2lvbiAhPSBURU1QX05PTkVfQ09NUFJFU1NJT04pCisJeworI2lmZGVm IFVTRV9MWjQKKwkJZmlsZS0+Y29tcHJlc3MgPSBjb21wcmVzczsKKyNlbHNlCisJCU5PX0xaNF9T VVBQT1JUKCk7CisjZW5kaWYKKwl9CisKIAlyZXR1cm4gZmlsZTsKIH0KIApAQCAtMjc1LDYgKzI5 Nyw3IEBAIEJ1ZkZpbGVDcmVhdGVGaWxlU2V0KEZpbGVTZXQgKmZpbGVzZXQsIGNvbnN0IGNoYXIg Km5hbWUpCiAJZmlsZS0+ZmlsZXNbMF0gPSBNYWtlTmV3RmlsZVNldFNlZ21lbnQoZmlsZSwgMCk7 CiAJZmlsZS0+cmVhZE9ubHkgPSBmYWxzZTsKIAorCiAJcmV0dXJuIGZpbGU7CiB9CiAKQEAgLTQ1 NSwxMyArNDc4LDcyIEBAIEJ1ZkZpbGVMb2FkQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJCUlOU1RS X1RJTUVfU0VUX1pFUk8oaW9fc3RhcnQpOwogCiAJLyoKLQkgKiBSZWFkIHdoYXRldmVyIHdlIGNh biBnZXQsIHVwIHRvIGEgZnVsbCBidWZmZXJsb2FkLgorCSAqIExvYWQgZGF0YSBhcyBpdCBpcyBz dG9yZWQgaW4gdGhlIHRlbXBvcmFyeSBmaWxlCiAJICovCi0JZmlsZS0+bmJ5dGVzID0gRmlsZVJl YWQodGhpc2ZpbGUsCisJaWYgKCFmaWxlLT5jb21wcmVzcykKKwl7CisKKwkJLyoKKwkgCSogUmVh ZCB3aGF0ZXZlciB3ZSBjYW4gZ2V0LCB1cCB0byBhIGZ1bGwgYnVmZmVybG9hZC4KKwkgCSovCisJ CWZpbGUtPm5ieXRlcyA9IEZpbGVSZWFkKHRoaXNmaWxlLAogCQkJCQkJCWZpbGUtPmJ1ZmZlci5k YXRhLAogCQkJCQkJCXNpemVvZihmaWxlLT5idWZmZXIpLAogCQkJCQkJCWZpbGUtPmN1ck9mZnNl dCwKIAkJCQkJCQlXQUlUX0VWRU5UX0JVRkZJTEVfUkVBRCk7CisJLyoKKwkgKiBSZWFkIGFuZCBk ZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKKwkgKiBUaGUgZmlyc3QgcmVh ZGluZyBsb2FkcyBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJsb2NrCisJICogU2Vjb25kIHJlYWRp bmcgbG9hZHMgY29tcHJlc3NlZCBkYXRhCisJICovCisJfSBlbHNlIHsKKwkJaW50IG5yZWFkOwor CQlpbnQgbmJ5dGVzOworCisJCW5yZWFkID0gRmlsZVJlYWQodGhpc2ZpbGUsCisJCQkJCQkJJm5i eXRlcywKKwkJCQkJCQlzaXplb2YobmJ5dGVzKSwKKwkJCQkJCQlmaWxlLT5jdXJPZmZzZXQsCisJ CQkJCQkJV0FJVF9FVkVOVF9CVUZGSUxFX1JFQUQpOworCQkvKiBpZiBub3QgRU9GIGxldCdzIGNv bnRpbnVlICovCisJCWlmIChucmVhZCA+IDApCisJCXsKKwkJCS8qCisJCQkgKiBBIGxvbmcgbGlm ZSBidWZmZXIgd291bGQgbWFrZSBzZW5jZSB0byBsaW1pdCBudW1iZXIgb2YKKwkJCSAqIG1lbW9y eSBhbGxvY2F0aW9ucworCQkJICovCisJCQljaGFyICogYnVmZjsKKworCQkJLyoKKwkJCSAqIFJl YWQgY29tcHJlc3NlZCBkYXRhLCBjdXJPZmZzZXQgZGlmZmVycyB3aXRoIHBvcworCQkJICogSXQg cmVhZHMgbGVzcyBkYXRhIHRoYW4gaXQgcmV0dXJucyB0byBjYWxsZXIKKwkJCSAqIFNvIHRoZSBj dXJPZmZzZXQgbXVzdCBiZSBhZHZhbmNlZCBoZXJlIGJhc2VkIG9uIGNvbXByZXNzZWQgc2l6ZQor CQkJICovCisJCQlmaWxlLT5jdXJPZmZzZXQrPXNpemVvZihuYnl0ZXMpOworCisJCQlidWZmID0g cGFsbG9jKG5ieXRlcyk7CisKKwkJCW5yZWFkID0gRmlsZVJlYWQodGhpc2ZpbGUsCisJCQkJCQkJ YnVmZiwKKwkJCQkJCQluYnl0ZXMsCisJCQkJCQkJZmlsZS0+Y3VyT2Zmc2V0LAorCQkJCQkJCVdB SVRfRVZFTlRfQlVGRklMRV9SRUFEKTsKKworI2lmZGVmIFVTRV9MWjQKKwkJCWZpbGUtPm5ieXRl cyA9IExaNF9kZWNvbXByZXNzX3NhZmUoYnVmZiwKKwkJCQlmaWxlLT5idWZmZXIuZGF0YSxuYnl0 ZXMsc2l6ZW9mKGZpbGUtPmJ1ZmZlcikpOworCQkJZmlsZS0+Y3VyT2Zmc2V0ICs9IG5yZWFkOwor I2VuZGlmCisKKwkJCWlmIChmaWxlLT5uYnl0ZXMgPCAwKQorCQkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKKwkJCQkJCSBlcnJtc2dfaW50 ZXJuYWwoImNvbXByZXNzZWQgbHo0IGRhdGEgaXMgY29ycnVwdCIpKSk7CisJCQlwZnJlZShidWZm KTsKKwkJfQorCisJfQorCiAJaWYgKGZpbGUtPm5ieXRlcyA8IDApCiAJewogCQlmaWxlLT5uYnl0 ZXMgPSAwOwpAQCAtNDk0LDkgKzU3Niw1NiBAQCBzdGF0aWMgdm9pZAogQnVmRmlsZUR1bXBCdWZm ZXIoQnVmRmlsZSAqZmlsZSkKIHsKIAlpbnQJCQl3cG9zID0gMDsKLQlpbnQJCQlieXRlc3Rvd3Jp dGU7CisJaW50CQkJYnl0ZXN0b3dyaXRlID0gMDsKIAlGaWxlCQl0aGlzZmlsZTsKIAorCisJLyog U2F2ZSBuYnl0ZXMgdmFsdWUgYmVjYXVzZSB0aGUgc2l6ZSBjaGFuZ2VzIGR1ZSB0byBjb21wcmVz c2lvbiAqLworCWludCBuYnl0ZXNPcmlnaW5hbCA9IGZpbGUtPm5ieXRlczsKKworCWJvb2wgY29t cHJlc3Npb24gPSBmYWxzZTsKKworCWNoYXIgKiBEYXRhVG9Xcml0ZTsKKwlEYXRhVG9Xcml0ZSA9 IGZpbGUtPmJ1ZmZlci5kYXRhOworCisJLyoKKwkgKiBQcmVwYXJlIGNvbXByZXNzZWQgZGF0YSB0 byB3cml0ZQorCSAqIHNpemUgb2YgY29tcHJlc3NlZCBibG9jayBuZWVkcyB0byBiZSBhZGRlZCBh dCB0aGUgYmVnZ2luaW5nIG9mIHRoZQorCSAqIGNvbXByZXNzZWQgZGF0YQorCSAqLworCisKKwlp ZiAoZmlsZS0+Y29tcHJlc3MpIHsKKwkJaW50IGNCdWZmZXJTaXplID0gMDsKKwkJY2hhciAqIGNE YXRhOworCQlpbnQgY1NpemUgPSAwOworI2lmZGVmIFVTRV9MWjQKKwkJY0J1ZmZlclNpemUgPSBM WjRfY29tcHJlc3NCb3VuZChmaWxlLT5uYnl0ZXMpOworI2VuZGlmCisJCS8qCisJCSAqIEEgbG9u ZyBsaWZlIGJ1ZmZlciB3b3VsZCBtYWtlIHNlbmNlIHRvIGxpbWl0IG51bWJlciBvZgorCQkgKiBt ZW1vcnkgYWxsb2NhdGlvbnMKKwkJICovCisJCWNvbXByZXNzaW9uID0gdHJ1ZTsKKwkJY0RhdGEg PSBwYWxsb2MoY0J1ZmZlclNpemUgKyBzaXplb2YoaW50KSk7CisjaWZkZWYgVVNFX0xaNAorCQkv KgorCQkgKiBVc2luZyBzdHJlYW0gY29tcHJlc3Npb24gd291bGQgbGVhZCB0byB0aGUgc2xpZ2h0 IGltcHJvdmVtZW50IGluCisJCSAqIGNvbXByZXNzaW9uIHJhdGlvCisJCSAqLworCQljU2l6ZSA9 IExaNF9jb21wcmVzc19kZWZhdWx0KGZpbGUtPmJ1ZmZlci5kYXRhLAorCQkJCWNEYXRhICsgc2l6 ZW9mKGludCksZmlsZS0+bmJ5dGVzLCBjQnVmZmVyU2l6ZSk7CisjZW5kaWYKKworCQkvKiBXcml0 ZSBzaXplIG9mIGNvbXByZXNzZWQgYmxvY2sgaW4gZnJvbnQgb2YgY29tcHJlc3NlZCBkYXRhCisJ CSAqIEl0J3MgdXNlZCB0byBkZXRlcm1pbmUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZCB3aXRoaW4K KwkJICogZGVjb21wcmVzc2lvbiBwcm9jZXNzCisJCSAqLworCQltZW1jcHkoY0RhdGEsJmNTaXpl LHNpemVvZihpbnQpKTsKKwkJZmlsZS0+bmJ5dGVzPWNTaXplICsgc2l6ZW9mKGludCk7CisJCURh dGFUb1dyaXRlID0gY0RhdGE7CisJfQorCiAJLyoKIAkgKiBVbmxpa2UgQnVmRmlsZUxvYWRCdWZm ZXIsIHdlIG11c3QgZHVtcCB0aGUgd2hvbGUgYnVmZmVyIGV2ZW4gaWYgaXQKIAkgKiBjcm9zc2Vz IGEgY29tcG9uZW50LWZpbGUgYm91bmRhcnk7IHNvIHdlIG5lZWQgYSBsb29wLgpAQCAtNTM1LDcg KzY2NCw3IEBAIEJ1ZkZpbGVEdW1wQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJCQlJTlNUUl9USU1F X1NFVF9aRVJPKGlvX3N0YXJ0KTsKIAogCQlieXRlc3Rvd3JpdGUgPSBGaWxlV3JpdGUodGhpc2Zp bGUsCi0JCQkJCQkJCSBmaWxlLT5idWZmZXIuZGF0YSArIHdwb3MsCisJCQkJCQkJCSBEYXRhVG9X cml0ZSArIHdwb3MsCiAJCQkJCQkJCSBieXRlc3Rvd3JpdGUsCiAJCQkJCQkJCSBmaWxlLT5jdXJP ZmZzZXQsCiAJCQkJCQkJCSBXQUlUX0VWRU5UX0JVRkZJTEVfV1JJVEUpOwpAQCAtNTY0LDcgKzY5 MywxOSBAQCBCdWZGaWxlRHVtcEJ1ZmZlcihCdWZGaWxlICpmaWxlKQogCSAqIGxvZ2ljYWwgZmls ZSBwb3NpdGlvbiwgaWUsIG9yaWdpbmFsIHZhbHVlICsgcG9zLCBpbiBjYXNlIHRoYXQgaXMgbGVz cwogCSAqIChhcyBjb3VsZCBoYXBwZW4gZHVlIHRvIGEgc21hbGwgYmFja3dhcmRzIHNlZWsgaW4g YSBkaXJ0eSBidWZmZXIhKQogCSAqLwotCWZpbGUtPmN1ck9mZnNldCAtPSAoZmlsZS0+bmJ5dGVz IC0gZmlsZS0+cG9zKTsKKworCisJaWYgKCFmaWxlLT5jb21wcmVzcykKKwkJZmlsZS0+Y3VyT2Zm c2V0IC09IChmaWxlLT5uYnl0ZXMgLSBmaWxlLT5wb3MpOworCWVsc2UKKwkJaWYgKG5ieXRlc09y aWdpbmFsIC0gZmlsZS0+cG9zICE9IDApCisJCQkvKiBjdXJPZmZzZXQgbXVzdCBiZSBjb3JyZWN0 ZWQgYWxzbyBpZiBjb21wcmVzc2lvbiBpcworCQkJICogZW5hYmxlZCwgbmJ5dGVzIHdhcyBjaGFu Z2VkIGJ5IGNvbXByZXNzaW9uIGJ1dCB3ZQorCQkJICogaGF2ZSB0byB1c2UgdGhlIG9yaWdpbmFs IHZhbHVlIG9mIG5ieXRlcworCQkJICovCisJCQlmaWxlLT5jdXJPZmZzZXQtPWJ5dGVzdG93cml0 ZTsKKworCiAJaWYgKGZpbGUtPmN1ck9mZnNldCA8IDApCS8qIGhhbmRsZSBwb3NzaWJsZSBzZWdt ZW50IGNyb3NzaW5nICovCiAJewogCQlmaWxlLT5jdXJGaWxlLS07CkBAIC01NzcsNiArNzE4LDkg QEAgQnVmRmlsZUR1bXBCdWZmZXIoQnVmRmlsZSAqZmlsZSkKIAkgKi8KIAlmaWxlLT5wb3MgPSAw OwogCWZpbGUtPm5ieXRlcyA9IDA7CisKKwlpZiAoY29tcHJlc3Npb24pCisJCXBmcmVlKERhdGFU b1dyaXRlKTsKIH0KIAogLyoKQEAgLTYwMiw4ICs3NDYsMTQgQEAgQnVmRmlsZVJlYWRDb21tb24o QnVmRmlsZSAqZmlsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgYm9vbCBleGFjdCwgYm9vbCBl b2ZPSykKIAl7CiAJCWlmIChmaWxlLT5wb3MgPj0gZmlsZS0+bmJ5dGVzKQogCQl7Ci0JCQkvKiBU cnkgdG8gbG9hZCBtb3JlIGRhdGEgaW50byBidWZmZXIuICovCi0JCQlmaWxlLT5jdXJPZmZzZXQg Kz0gZmlsZS0+cG9zOworCQkJLyogVHJ5IHRvIGxvYWQgbW9yZSBkYXRhIGludG8gYnVmZmVyLgor CQkJICoKKwkJCSAqIGN1ck9mZnNldCBpcyBtb3ZlZCB3aXRoaW4gQnVmRmlsZUxvYWRCdWZmZXIK KwkJCSAqIGJlY2F1c2Ugc3RvcmVkIGRhdGEgc2l6ZSBkaWZmZXJzIGZyb20gbG9hZGVkLworCQkJ ICogZGVjb21wcmVzc2VkIHNpemUKKwkJCSAqICovCisJCQlpZiAoIWZpbGUtPmNvbXByZXNzKQor CQkJCWZpbGUtPmN1ck9mZnNldCArPSBmaWxlLT5wb3M7CiAJCQlmaWxlLT5wb3MgPSAwOwogCQkJ ZmlsZS0+bmJ5dGVzID0gMDsKIAkJCUJ1ZkZpbGVMb2FkQnVmZmVyKGZpbGUpOwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgYi9zcmMvYmFja2VuZC91dGls cy9taXNjL2d1Y190YWJsZXMuYwppbmRleCA2ODYzMDlkYjU4Li4zODIxY2FmNzYzIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYworKysgYi9zcmMvYmFja2Vu ZC91dGlscy9taXNjL2d1Y190YWJsZXMuYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgInJl cGxpY2F0aW9uL3N5bmNyZXAuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvYnVmcGFnZS5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnVmZmlsZS5oIgogI2lu Y2x1ZGUgInN0b3JhZ2UvbGFyZ2Vfb2JqZWN0LmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wZ19zaG1l bS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJlZGljYXRlLmgiCkBAIC00NTQsNiArNDU1LDE3IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2VudW1fZW50cnkgZGVmYXVsdF90b2FzdF9jb21w cmVzc2lvbl9vcHRpb25zW10gPSB7CiAjZW5kaWYKIAl7TlVMTCwgMCwgZmFsc2V9CiB9OworLyoK KyAqIHBnbHogYW5kIHpzdGQgc3VwcG9ydCBzaG91bGQgYmUgYWRkZWQgYXMgZnV0dXJlIGVuaGFu Y2VtZW50CisgKgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnVtX2VudHJ5IHRl bXBfZmlsZV9jb21wcmVzc2lvbl9vcHRpb25zW10gPSB7CisJeyJubyIsIFRFTVBfTk9ORV9DT01Q UkVTU0lPTiwgZmFsc2V9LAorI2lmZGVmICBVU0VfTFo0CisJeyJsejQiLCBURU1QX0xaNF9DT01Q UkVTU0lPTiwgZmFsc2V9LAorI2VuZGlmCisJe05VTEwsIDAsIGZhbHNlfQorfTsKIAogc3RhdGlj IGNvbnN0IHN0cnVjdCBjb25maWdfZW51bV9lbnRyeSB3YWxfY29tcHJlc3Npb25fb3B0aW9uc1td ID0gewogCXsicGdseiIsIFdBTF9DT01QUkVTU0lPTl9QR0xaLCBmYWxzZX0sCkBAIC00ODU2LDYg KzQ4NjgsMTcgQEAgc3RydWN0IGNvbmZpZ19lbnVtIENvbmZpZ3VyZU5hbWVzRW51bVtdID0KIAkJ TlVMTCwgTlVMTCwgTlVMTAogCX0sCiAKKwl7CisJCXsidGVtcF9maWxlX2NvbXByZXNzaW9uIiwg UEdDX1VTRVJTRVQsIENMSUVOVF9DT05OX1NUQVRFTUVOVCwKKwkJCWdldHRleHRfbm9vcCgiU2V0 cyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBtZXRob2QgZm9yIGNvbXByZXNzaWJsZSB2YWx1ZXMu IiksCisJCQlOVUxMCisJCX0sCisJCSZ0ZW1wX2ZpbGVfY29tcHJlc3Npb24sCisJCVRFTVBfTk9O RV9DT01QUkVTU0lPTiwKKwkJdGVtcF9maWxlX2NvbXByZXNzaW9uX29wdGlvbnMsCisJCU5VTEws IE5VTEwsIE5VTEwKKwl9LAorCiAJewogCQl7ImRlZmF1bHRfdHJhbnNhY3Rpb25faXNvbGF0aW9u IiwgUEdDX1VTRVJTRVQsIENMSUVOVF9DT05OX1NUQVRFTUVOVCwKIAkJCWdldHRleHRfbm9vcCgi U2V0cyB0aGUgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsIG9mIGVhY2ggbmV3IHRyYW5zYWN0 aW9uLiIpLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNv bmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxl CmluZGV4IDY2N2UwZGM0MGEuLmU5YzBiMzYzNTIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0 aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9t aXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCiAjbWF4X25v dGlmeV9xdWV1ZV9wYWdlcyA9IDEwNDg1NzYJIyBsaW1pdHMgdGhlIG51bWJlciBvZiBTTFJVIHBh Z2VzIGFsbG9jYXRlZAogCQkJCQkjIGZvciBOT1RJRlkgLyBMSVNURU4gcXVldWUKKyN0ZW1wX2Zp bGVfY29tcHJlc3Npb24gPSAnbm8nCSMgZW5hYmxlcyB0ZW1wb3JhcnkgZmlsZXMgY29tcHJlc3Np b24KIAogIyAtIEtlcm5lbCBSZXNvdXJjZXMgLQogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9zb3J0L2xvZ3RhcGUuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jCmlu ZGV4IDQ0YjMwZTg2YWQuLmFmNDNiM2ViYjEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L3NvcnQvbG9ndGFwZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jCkBA IC01OTIsNyArNTkyLDcgQEAgTG9naWNhbFRhcGVTZXRDcmVhdGUoYm9vbCBwcmVhbGxvY2F0ZSwg U2hhcmVkRmlsZVNldCAqZmlsZXNldCwgaW50IHdvcmtlcikKIAkJbHRzLT5wZmlsZSA9IEJ1ZkZp bGVDcmVhdGVGaWxlU2V0KCZmaWxlc2V0LT5mcywgZmlsZW5hbWUpOwogCX0KIAllbHNlCi0JCWx0 cy0+cGZpbGUgPSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSk7CisJCWx0cy0+cGZpbGUgPSBCdWZG aWxlQ3JlYXRlVGVtcChmYWxzZSwgZmFsc2UpOwogCiAJcmV0dXJuIGx0czsKIH0KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzdG9yZS5jIGIvc3JjL2JhY2tlbmQvdXRp bHMvc29ydC90dXBsZXN0b3JlLmMKaW5kZXggYTcyMGQ3MDIwMC4uYTk1MmYwZjRmNSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXN0b3JlLmMKKysrIGIvc3JjL2JhY2tl bmQvdXRpbHMvc29ydC90dXBsZXN0b3JlLmMKQEAgLTg2MCw3ICs4NjAsNyBAQCB0dXBsZXN0b3Jl X3B1dHR1cGxlX2NvbW1vbihUdXBsZXN0b3Jlc3RhdGUgKnN0YXRlLCB2b2lkICp0dXBsZSkKIAkJ CSAqLwogCQkJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHN0YXRlLT5jb250ZXh0LT5w YXJlbnQpOwogCi0JCQlzdGF0ZS0+bXlmaWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoc3RhdGUtPmlu dGVyWGFjdCk7CisJCQlzdGF0ZS0+bXlmaWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoc3RhdGUtPmlu dGVyWGFjdCwgZmFsc2UpOwogCiAJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKIApk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZmaWxlLmggYi9zcmMvaW5jbHVkZS9z dG9yYWdlL2J1ZmZpbGUuaAppbmRleCA1ZjZkN2M4ZTNmLi40ODZiNTUyZTMxIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1ZmZpbGUuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdl L2J1ZmZpbGUuaApAQCAtMzIsMTEgKzMyLDIyIEBACiAKIHR5cGVkZWYgc3RydWN0IEJ1ZkZpbGUg QnVmRmlsZTsKIAordHlwZWRlZiBlbnVtCit7CisJVEVNUF9OT05FX0NPTVBSRVNTSU9OLAorI2lm ZGVmIFVTRV9MWjQKKwlURU1QX0xaNF9DT01QUkVTU0lPTgorI2VuZGlmCit9IFRlbXBDb21wcmVz c2lvbjsKKworZXh0ZXJuIFBHRExMSU1QT1JUIGludCB0ZW1wX2ZpbGVfY29tcHJlc3Npb247CisK KwogLyoKICAqIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiBidWZmaWxlLmMKICAqLwogCi1l eHRlcm4gQnVmRmlsZSAqQnVmRmlsZUNyZWF0ZVRlbXAoYm9vbCBpbnRlclhhY3QpOworZXh0ZXJu IEJ1ZkZpbGUgKkJ1ZkZpbGVDcmVhdGVUZW1wKGJvb2wgaW50ZXJYYWN0LCBib29sIGNvbXByZXNz KTsKIGV4dGVybiB2b2lkIEJ1ZkZpbGVDbG9zZShCdWZGaWxlICpmaWxlKTsKIGV4dGVybiBwZ19u b2Rpc2NhcmQgc2l6ZV90IEJ1ZkZpbGVSZWFkKEJ1ZkZpbGUgKmZpbGUsIHZvaWQgKnB0ciwgc2l6 ZV90IHNpemUpOwogZXh0ZXJuIHZvaWQgQnVmRmlsZVJlYWRFeGFjdChCdWZGaWxlICpmaWxlLCB2 b2lkICpwdHIsIHNpemVfdCBzaXplKTsKLS0gCjIuNDYuMgoK --000000000000e69b990627370476--