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 1tBi5w-005aNg-Uc for pgsql-hackers@arkaria.postgresql.org; Thu, 14 Nov 2024 22:13:44 +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 1tBi5s-006tsP-2B for pgsql-hackers@arkaria.postgresql.org; Thu, 14 Nov 2024 22:13:40 +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 1tBi5r-006tsH-Ee for pgsql-hackers@lists.postgresql.org; Thu, 14 Nov 2024 22:13:40 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.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 1tBi5l-001tyV-EU for pgsql-hackers@postgresql.org; Thu, 14 Nov 2024 22:13:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1731622411; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=ZRK32ucKF8gVmm0Bv85+fsqzmEPPCl3RGGYO3hrtQ2g=; b=VK7RPVCN8fa79kAE2HXoQ1OamSHGy3PAk+ycSba3jVkx2+vphHyCz3eM9KOWwHPyAKdtG3 c62OfjmuEPEKw1wi6NyJ0N1XJSz9Stb8zh71xdIwZ9lNXuX5wqvUFS4//ocTfnUqlrZHOj zIVc8aXCJ5dHx0q8MxDAhMo21xB0rmg= Received: from mail-il1-f200.google.com (mail-il1-f200.google.com [209.85.166.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-388-YqsusnzSPF6Sv3yccIZj-A-1; Thu, 14 Nov 2024 17:13:28 -0500 X-MC-Unique: YqsusnzSPF6Sv3yccIZj-A-1 X-Mimecast-MFC-AGG-ID: YqsusnzSPF6Sv3yccIZj-A Received: by mail-il1-f200.google.com with SMTP id e9e14a558f8ab-3a3b9c5bcd8so12197345ab.2 for ; Thu, 14 Nov 2024 14:13:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731622407; x=1732227207; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=VANMARM5g9BdTsevcLeVZpAjHgwM5ljS7qOHooKEim8=; b=kvQJm35db7j5FjF/Ty+bXkUDQW5Yq0iHf6BfXKF4KKA+0GYpGVKKHDDKBs0sVNgc0J vcNnAJHoelnxXdKyK83a/gA6xjaadtL4Rz3yMl5THeqYNHtIhWV2mWLK3YVr05Q/gWrh BSHRhJQNcjhWLqHOy+VdqLl+ZxI647KOhF/sQ2zrDLIZGmPnm3pqPde1SdvfJx6v6xy8 U1P3jP2hJvTWU1vFoy5rJNw6gqvNtoOLmrMsya8YyQ267AavJ0kP3Z2+Tc2HRZwOdOtv p+08+Jcq0Tc+mYoy+yQAUf54SXGCnm/5Do/N0gd7u7zUSy8QB42u7cfN5iH31GBvHfkI 9XRw== X-Gm-Message-State: AOJu0Yw433HEdgwDAen9+P0bix6jUzSy63UsYKt2wfL4pTegq2wurZwW jUItriNOVhfZ/AFUW0IkmkDtjh48CbcW4RqzmWf/hEDjRIyWKyDCMaJZOMUJRUHiE3s6rzsrQ38 3eP4PJGRn77PFXuFxLE0FQQYfyysFESQ/7buS9MXGfVm6Sn1noaoa1b6RnadORYmhWHI0Vf3qhh wKperO9i5c9vC0idXrCt0Ty3jtIpP19K7cVySIg56cXL05kYU= X-Received: by 2002:a05:6e02:388d:b0:3a6:bd97:96bf with SMTP id e9e14a558f8ab-3a7480c1d9fmr4512705ab.24.1731622407560; Thu, 14 Nov 2024 14:13:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IERwf6zPO+dtluMf5yVikM3X36TuRkW9raDuRWz+tEhG+Ut02km5ubMSIC22Sd8eBGavSaA29u8i4Cs8OLKwyc= X-Received: by 2002:a05:6e02:388d:b0:3a6:bd97:96bf with SMTP id e9e14a558f8ab-3a7480c1d9fmr4512375ab.24.1731622407109; Thu, 14 Nov 2024 14:13:27 -0800 (PST) MIME-Version: 1.0 From: Filip Janus Date: Thu, 14 Nov 2024 23:13:16 +0100 Message-ID: Subject: Proposal: Adding compression of temporary files To: pgsql-hackers@postgresql.org X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: ZKR-JFMGS3QqjGycZmxEu5z8kJpRlL70b7t24f1UeTo_1731622408 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000762f000626e6c262" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000762f000626e6c262 Content-Type: multipart/alternative; boundary="000000000000762efe0626e6c260" --000000000000762efe0626e6c260 Content-Type: text/plain; charset="UTF-8" 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 = 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 = 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 = oi.product_id JOIN eshop.orders o ON oi.order_id = 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 = 4MB | | No | 21.89 GiB | 35s | work_mem = 4MB +------------+-------------------------+-----------------------+---------------------------------------- | B | Yes | 333 MB | 1815.545 ms | work_mem = 4MB | | No | 146 MB | 1500.460 ms | work_mem = 4MB | | Yes | 0 MB | 3262.305 ms | work_mem = 80MB | | No | 0 MB | 3174.725 ms | work_mem = 80MB +-------------+------------------------+------------------------+------------------------------------- | C | Yes | 40 MB | 1011.020 ms | work_mem = 1MB | | No | 53 MB | 1034.142 ms | work_mem = 1MB +------------+------------------------+------------------------+-------------------------------------- Regards, -Filip- --000000000000762efe0626e6c260 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi all,
Postgresql su= pports data compression nowadays, but the compression of
temporary file= s has not been implemented yet. The huge queries can=C2=A0
produce a significant amount of temporary data that needs to be=C2=A0= stored on disk=C2=A0
and cause many expensive I/O ope= rations.
I am attaching a proposal of the patch to enable temporary file= s 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 possibl= e improvements
Reducing the number of memory allocations within the dump= ing and loading of
the buffer. I have two ideas for s= olving this problem. I would either add a buffer into
struct BufFile or provide the buffer as an argument from the caller. For t= he sequential=C2=A0
execution, I would prefer the sec= ond option.

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

Experimenting with the stream mode of compression algorithms.= The compression=C2=A0
ratio of LZ4 in block mode see= ms to be satisfying, but the stream mode could=C2=A0
= produce a better ratio, but it would consume more memory due to the require= ment to store
context for LZ4 stream compression.
=
# Benchmark
I prepared three different databases to check expectatio= ns. Each=C2=A0
dataset is described below. My testing= demonstrates that my patch=C2=A0
improves the execut= ion time of huge hash joins.=C2=A0
Also, my implement= ation should not
negatively affect performance within smaller queries.= =C2=A0
The usage of memory needed for temporary files= was reduced in every
=C2=A0execution without a signi= ficant impact on execution time.

## D= ataset 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:=C2=A0 SELECT *=C2=A0 FROM table_a a JOIN table_b b ON a.id =3D b.id;

The tables contain high= ly compressible data.
The query demonstrated a reduction in the u= sage of the temporary=C2=A0
files ~20GB -> 3GB, based on this = reduction also caused the execution=C2=A0
time of the query to be= reduced by about ~10s.


## Dataset B:
Tables:
table_a(i= nteger id, text data_blob) - 1110000 rows
table_b(integer id,= text 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 less compressible data. data_blob was gen= erated by a pseudo-random generator.
In this case, the data = reduction was only ~50%. Also, the execution time was reduced=C2=A0
only slightly with the enabled compression.

The second scenario demonstrates no overhead in the case of enabled=C2=A0=
compression and extended work_mem to avoid temp file usage.

## Dataset C:
Tables
<= div>customers (integer,text,text,text,text)
order_items(integer,i= nteger,integer,integer,numeric(10,2))
orders(integer,integer,time= stamp,numeric(10,2))
products(integer,text,text,numeric(10,2),int= eger)

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 Tim= e (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 | Y= es=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
|=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-
--000000000000762efe0626e6c260-- --000000000000762f000626e6c262 Content-Type: application/octet-stream; name="0001-This-commit-adds-support-for-temporary-files-compres.patch" Content-Disposition: attachment; filename="0001-This-commit-adds-support-for-temporary-files-compres.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m3huoe9d0 RnJvbSAxZjc5OTQ3YzMzNDhhN2YzNTk2MDYyY2FkMjIzNjg1NTA1MzY0MWE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGaWxpcCA8ZmphbnVzQHJlZGhhdC5jb20+CkRhdGU6IFRodSwg MjQgT2N0IDIwMjQgMTI6MTU6MTAgKzAyMDAKU3ViamVjdDogW1BBVENIIHYxXSBBZGQgc3VwcG9y dCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGNvbXByZXNzaW9uClRoaXMgY29tbWl0IGFkZHMgc3VwcG9y dCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGNvbXByZXNzaW9uLCBpdCBjYW4gYmUKdXNlZCBvbmx5IGZv ciBoYXNoam9pbnMgbm93LgoKSXQgYWxzbyBhZGRzIEdVQyBwYXJhbWV0ZXIgdGVtcF9maWxlX2Nv bXByZXNzaW9uIHRoYXQgZW5hYmxlcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCkZvciBub3csIGl0IHN1 cHBvcnRzIGp1c3QgbHo0IGFsZ29yaXRobXMuIEluIHRoZSBmdXR1cmUsIGl0CmNvdWxkIGFsc28g YmUgaW1wbGVtZW50ZWQgcGdseiBhbmQgenN0ZCBzdXBwb3J0LgotLS0KIHNyYy9iYWNrZW5kL2Fj Y2Vzcy9naXN0L2dpc3RidWlsZGJ1ZmZlcnMuYyAgICB8ICAgMiArLQogc3JjL2JhY2tlbmQvYmFj a3VwL2JhY2t1cF9tYW5pZmVzdC5jICAgICAgICAgIHwgICAyICstCiBzcmMvYmFja2VuZC9leGVj dXRvci9ub2RlSGFzaGpvaW4uYyAgICAgICAgICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3N0b3Jh Z2UvZmlsZS9idWZmaWxlLmMgICAgICAgICAgICB8IDE2OCArKysrKysrKysrKysrKysrKy0KIHNy Yy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jICAgICAgICAgICB8ICAyMyArKysKIHNy Yy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZSB8ICAgMSArCiBzcmMv YmFja2VuZC91dGlscy9zb3J0L2xvZ3RhcGUuYyAgICAgICAgICAgICAgfCAgIDIgKy0KIHNyYy9i YWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzdG9yZS5jICAgICAgICAgICB8ICAgMiArLQogc3JjL2lu Y2x1ZGUvc3RvcmFnZS9idWZmaWxlLmggICAgICAgICAgICAgICAgIHwgIDEzICstCiA5IGZpbGVz IGNoYW5nZWQsIDIwMCBpbnNlcnRpb25zKCspLCAxNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMgYi9zcmMvYmFja2Vu ZC9hY2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMKaW5kZXggNGMyMzAxZGEwMC4uOWIzYjAw MTQyYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpc3QvZ2lzdGJ1aWxkYnVmZmVy cy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3RidWlsZGJ1ZmZlcnMuYwpAQCAt NTQsNyArNTQsNyBAQCBnaXN0SW5pdEJ1aWxkQnVmZmVycyhpbnQgcGFnZXNQZXJCdWZmZXIsIGlu dCBsZXZlbFN0ZXAsIGludCBtYXhMZXZlbCkKIAkgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0 byBob2xkIGJ1ZmZlciBwYWdlcyB0aGF0IGFyZSBzd2FwcGVkIG91dCBvZgogCSAqIG1lbW9yeS4K IAkgKi8KLQlnZmJiLT5wZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKGZhbHNlKTsKKwlnZmJiLT5w ZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKGZhbHNlLCBmYWxzZSk7CiAJZ2ZiYi0+bkZpbGVCbG9j a3MgPSAwOwogCiAJLyogSW5pdGlhbGl6ZSBmcmVlIHBhZ2UgbWFuYWdlbWVudC4gKi8KZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2JhY2t1cC9iYWNrdXBfbWFuaWZlc3QuYyBiL3NyYy9iYWNrZW5k L2JhY2t1cC9iYWNrdXBfbWFuaWZlc3QuYwppbmRleCBhMmUyZjg2MzMyLi5mOGEzZTFmMGY0IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9iYWNrdXAvYmFja3VwX21hbmlmZXN0LmMKKysrIGIvc3Jj L2JhY2tlbmQvYmFja3VwL2JhY2t1cF9tYW5pZmVzdC5jCkBAIC02NSw3ICs2NSw3IEBAIEluaXRp YWxpemVCYWNrdXBNYW5pZmVzdChiYWNrdXBfbWFuaWZlc3RfaW5mbyAqbWFuaWZlc3QsCiAJCW1h bmlmZXN0LT5idWZmaWxlID0gTlVMTDsKIAllbHNlCiAJewotCQltYW5pZmVzdC0+YnVmZmlsZSA9 IEJ1ZkZpbGVDcmVhdGVUZW1wKGZhbHNlKTsKKwkJbWFuaWZlc3QtPmJ1ZmZpbGUgPSBCdWZGaWxl Q3JlYXRlVGVtcChmYWxzZSwgZmFsc2UpOwogCQltYW5pZmVzdC0+bWFuaWZlc3RfY3R4ID0gcGdf Y3J5cHRvaGFzaF9jcmVhdGUoUEdfU0hBMjU2KTsKIAkJaWYgKHBnX2NyeXB0b2hhc2hfaW5pdCht YW5pZmVzdC0+bWFuaWZlc3RfY3R4KSA8IDApCiAJCQllbG9nKEVSUk9SLCAiZmFpbGVkIHRvIGlu aXRpYWxpemUgY2hlY2tzdW0gb2YgYmFja3VwIG1hbmlmZXN0OiAlcyIsCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9leGVjdXRvci9ub2RlSGFzaGpvaW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L25vZGVIYXNoam9pbi5jCmluZGV4IDJmNzE3MDYwNGQuLjFiNWM2NDQ4ZWYgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVIYXNoam9pbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVIYXNoam9pbi5jCkBAIC0xNDM0LDcgKzE0MzQsNyBAQCBFeGVjSGFzaEpvaW5T YXZlVHVwbGUoTWluaW1hbFR1cGxlIHR1cGxlLCB1aW50MzIgaGFzaHZhbHVlLAogCXsKIAkJTWVt b3J5Q29udGV4dCBvbGRjdHggPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oaGFzaHRhYmxlLT5zcGls bEN4dCk7CiAKLQkJZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKGZhbHNlKTsKKwkJZmlsZSA9IEJ1 ZkZpbGVDcmVhdGVUZW1wKGZhbHNlLCB0cnVlKTsKIAkJKmZpbGVwdHIgPSBmaWxlOwogCiAJCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjdHgpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9maWxlL2J1ZmZpbGUuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvZmlsZS9idWZmaWxlLmMK aW5kZXggYTI3ZjUxZjYyMi4uZjcyMTQ0N2RiNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9maWxlL2J1ZmZpbGUuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmls ZS5jCkBAIC01NCw2ICs1NCwxNiBAQAogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRl ICJ1dGlscy9yZXNvd25lci5oIgogCisjaWZkZWYgVVNFX0xaNAorI2luY2x1ZGUgPGx6NC5oPgor I2VuZGlmCisKKyNkZWZpbmUgTk9fTFo0X1NVUFBPUlQoKSBcCisJZXJlcG9ydChFUlJPUiwgXAor CQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLCBcCisJCQkgZXJybXNn KCJjb21wcmVzc2lvbiBtZXRob2QgbHo0IG5vdCBzdXBwb3J0ZWQiKSwgXAorCQkJIGVycmRldGFp bCgiVGhpcyBmdW5jdGlvbmFsaXR5IHJlcXVpcmVzIHRoZSBzZXJ2ZXIgdG8gYmUgYnVpbHQgd2l0 aCBsejQgc3VwcG9ydC4iKSkpCisKIC8qCiAgKiBXZSBicmVhayBCdWZGaWxlcyBpbnRvIGdpZ2Fi eXRlLXNpemVkIHNlZ21lbnRzLCByZWdhcmRsZXNzIG9mIFJFTFNFR19TSVpFLgogICogVGhlIHJl YXNvbiBpcyB0aGF0IHdlJ2QgbGlrZSBsYXJnZSBCdWZGaWxlcyB0byBiZSBzcHJlYWQgYWNyb3Nz IG11bHRpcGxlCkBAIC02Miw2ICs3Miw4IEBACiAjZGVmaW5lIE1BWF9QSFlTSUNBTF9GSUxFU0la RQkweDQwMDAwMDAwCiAjZGVmaW5lIEJVRkZJTEVfU0VHX1NJWkUJCShNQVhfUEhZU0lDQUxfRklM RVNJWkUgLyBCTENLU1opCiAKK2ludCB0ZW1wX2ZpbGVfY29tcHJlc3Npb24gPSBURU1QX05PTkVf Q09NUFJFU1NJT047CisKIC8qCiAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBi dWZmZXJlZCBmaWxlIHRoYXQgY29uc2lzdHMgb2Ygb25lIG9yCiAgKiBtb3JlIHBoeXNpY2FsIGZp bGVzIChlYWNoIGFjY2Vzc2VkIHRocm91Z2ggYSB2aXJ0dWFsIGZpbGUgZGVzY3JpcHRvcgpAQCAt OTUsNyArMTA3LDcgQEAgc3RydWN0IEJ1ZkZpbGUKIAlvZmZfdAkJY3VyT2Zmc2V0OwkJLyogb2Zm c2V0IHBhcnQgb2YgY3VycmVudCBwb3MgKi8KIAlpbnQJCQlwb3M7CQkJLyogbmV4dCByZWFkL3dy aXRlIHBvc2l0aW9uIGluIGJ1ZmZlciAqLwogCWludAkJCW5ieXRlczsJCQkvKiB0b3RhbCAjIG9m IHZhbGlkIGJ5dGVzIGluIGJ1ZmZlciAqLwotCisJYm9vbAkJCWNvbXByZXNzOyAvKsKgU3RhdGUg b2YgdXNlZ2UgZmlsZSBjb21wcmVzc2lvbiAqLwogCS8qCiAJICogWFhYIFNob3VsZCBpZGVhbGx5 IHVzIFBHSU9BbGlnbmVkQmxvY2ssIGJ1dCBtaWdodCBuZWVkIGEgd2F5IHRvIGF2b2lkCiAJICog d2FzdGluZyBwZXItZmlsZSBhbGlnbm1lbnQgcGFkZGluZyB3aGVuIHNvbWUgdXNlcnMgY3JlYXRl IG1hbnkgZmlsZXMuCkBAIC0xMjcsNiArMTM5LDcgQEAgbWFrZUJ1ZkZpbGVDb21tb24oaW50IG5m aWxlcykKIAlmaWxlLT5jdXJPZmZzZXQgPSAwOwogCWZpbGUtPnBvcyA9IDA7CiAJZmlsZS0+bmJ5 dGVzID0gMDsKKwlmaWxlLT5jb21wcmVzcyA9IGZhbHNlOwogCiAJcmV0dXJuIGZpbGU7CiB9CkBA IC0xOTAsNyArMjAzLDcgQEAgZXh0ZW5kQnVmRmlsZShCdWZGaWxlICpmaWxlKQogICogdHJhbnNh Y3Rpb24gYm91bmRhcmllcy4KICAqLwogQnVmRmlsZSAqCi1CdWZGaWxlQ3JlYXRlVGVtcChib29s IGludGVyWGFjdCkKK0J1ZkZpbGVDcmVhdGVUZW1wKGJvb2wgaW50ZXJYYWN0LCBib29sIGNvbXBy ZXNzKQogewogCUJ1ZkZpbGUgICAgKmZpbGU7CiAJRmlsZQkJcGZpbGU7CkBAIC0yMTIsNiArMjI1 LDE1IEBAIEJ1ZkZpbGVDcmVhdGVUZW1wKGJvb2wgaW50ZXJYYWN0KQogCWZpbGUgPSBtYWtlQnVm RmlsZShwZmlsZSk7CiAJZmlsZS0+aXNJbnRlclhhY3QgPSBpbnRlclhhY3Q7CiAKKwlpZiAodGVt cF9maWxlX2NvbXByZXNzaW9uICE9IFRFTVBfTk9ORV9DT01QUkVTU0lPTikKKwl7CisjaWZkZWYg VVNFX0xaNAorCQlmaWxlLT5jb21wcmVzcyA9IGNvbXByZXNzOworI2Vsc2UKKwkJTk9fTFo0X1NV UFBPUlQoKTsKKyNlbmRpZgorCX0KKwogCXJldHVybiBmaWxlOwogfQogCkBAIC0yNzUsNiArMjk3 LDcgQEAgQnVmRmlsZUNyZWF0ZUZpbGVTZXQoRmlsZVNldCAqZmlsZXNldCwgY29uc3QgY2hhciAq bmFtZSkKIAlmaWxlLT5maWxlc1swXSA9IE1ha2VOZXdGaWxlU2V0U2VnbWVudChmaWxlLCAwKTsK IAlmaWxlLT5yZWFkT25seSA9IGZhbHNlOwogCisKIAlyZXR1cm4gZmlsZTsKIH0KIApAQCAtNDU1 LDEzICs0NzgsNzIgQEAgQnVmRmlsZUxvYWRCdWZmZXIoQnVmRmlsZSAqZmlsZSkKIAkJSU5TVFJf VElNRV9TRVRfWkVSTyhpb19zdGFydCk7CiAKIAkvKgotCSAqIFJlYWQgd2hhdGV2ZXIgd2UgY2Fu IGdldCwgdXAgdG8gYSBmdWxsIGJ1ZmZlcmxvYWQuCisJICogTG9hZCBkYXRhIGFzIGl0IGlzIHN0 b3JlZCBpbiB0aGUgdGVtcG9yYXJ5IGZpbGUKIAkgKi8KLQlmaWxlLT5uYnl0ZXMgPSBGaWxlUmVh ZCh0aGlzZmlsZSwKKwlpZiAoIWZpbGUtPmNvbXByZXNzKQorCXsKKworCQkvKgorCSAJKiBSZWFk IHdoYXRldmVyIHdlIGNhbiBnZXQsIHVwIHRvIGEgZnVsbCBidWZmZXJsb2FkLgorCSAJKi8KKwkJ ZmlsZS0+bmJ5dGVzID0gRmlsZVJlYWQodGhpc2ZpbGUsCiAJCQkJCQkJZmlsZS0+YnVmZmVyLmRh dGEsCiAJCQkJCQkJc2l6ZW9mKGZpbGUtPmJ1ZmZlciksCiAJCQkJCQkJZmlsZS0+Y3VyT2Zmc2V0 LAogCQkJCQkJCVdBSVRfRVZFTlRfQlVGRklMRV9SRUFEKTsKKwkvKgorCSAqIFJlYWQgYW5kIGRl Y29tcHJlc3MgZGF0YSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQorCSAqIFRoZSBmaXJzdCByZWFk aW5nIGxvYWRzIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sKKwkgKiBTZWNvbmQgcmVhZGlu ZyBsb2FkcyBjb21wcmVzc2VkIGRhdGEKKwkgKi8KKwl9IGVsc2UgeworCQlpbnQgbnJlYWQ7CisJ CWludCBuYnl0ZXM7CisKKwkJbnJlYWQgPSBGaWxlUmVhZCh0aGlzZmlsZSwKKwkJCQkJCQkmbmJ5 dGVzLAorCQkJCQkJCXNpemVvZihuYnl0ZXMpLAorCQkJCQkJCWZpbGUtPmN1ck9mZnNldCwKKwkJ CQkJCQlXQUlUX0VWRU5UX0JVRkZJTEVfUkVBRCk7CisJCS8qIGlmIG5vdCBFT0YgbGV0J3MgY29u dGludWUgKi8KKwkJaWYgKG5yZWFkID4gMCkKKwkJeworCQkJLyoKKwkJCSAqIEEgbG9uZyBsaWZl IGJ1ZmZlciB3b3VsZCBtYWtlIHNlbmNlIHRvIGxpbWl0IG51bWJlciBvZgorCQkJICogbWVtb3J5 IGFsbG9jYXRpb25zCisJCQkgKi8KKwkJCWNoYXIgKiBidWZmOworCisJCQkvKgorCQkJICogUmVh ZCBjb21wcmVzc2VkIGRhdGEsIGN1ck9mZnNldCBkaWZmZXJzIHdpdGggcG9zCisJCQkgKiBJdCBy ZWFkcyBsZXNzIGRhdGEgdGhhbiBpdCByZXR1cm5zIHRvIGNhbGxlcgorCQkJICogU28gdGhlIGN1 ck9mZnNldCBtdXN0IGJlIGFkdmFuY2VkIGhlcmUgYmFzZWQgb24gY29tcHJlc3NlZCBzaXplCisJ CQkgKi8KKwkJCWZpbGUtPmN1ck9mZnNldCs9c2l6ZW9mKG5ieXRlcyk7CisKKwkJCWJ1ZmYgPSBw YWxsb2MobmJ5dGVzKTsKKworCQkJbnJlYWQgPSBGaWxlUmVhZCh0aGlzZmlsZSwKKwkJCQkJCQli dWZmLAorCQkJCQkJCW5ieXRlcywKKwkJCQkJCQlmaWxlLT5jdXJPZmZzZXQsCisJCQkJCQkJV0FJ VF9FVkVOVF9CVUZGSUxFX1JFQUQpOworCisjaWZkZWYgVVNFX0xaNAorCQkJZmlsZS0+bmJ5dGVz ID0gTFo0X2RlY29tcHJlc3Nfc2FmZShidWZmLAorCQkJCWZpbGUtPmJ1ZmZlci5kYXRhLG5ieXRl cyxzaXplb2YoZmlsZS0+YnVmZmVyKSk7CisJCQlmaWxlLT5jdXJPZmZzZXQgKz0gbnJlYWQ7Cisj ZW5kaWYKKworCQkJaWYgKGZpbGUtPm5ieXRlcyA8IDApCisJCQkJZXJlcG9ydChFUlJPUiwKKwkJ CQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAorCQkJCQkJIGVycm1zZ19pbnRl cm5hbCgiY29tcHJlc3NlZCBsejQgZGF0YSBpcyBjb3JydXB0IikpKTsKKwkJCXBmcmVlKGJ1ZmYp OworCQl9CisKKwl9CisKIAlpZiAoZmlsZS0+bmJ5dGVzIDwgMCkKIAl7CiAJCWZpbGUtPm5ieXRl cyA9IDA7CkBAIC00OTQsOSArNTc2LDU2IEBAIHN0YXRpYyB2b2lkCiBCdWZGaWxlRHVtcEJ1ZmZl cihCdWZGaWxlICpmaWxlKQogewogCWludAkJCXdwb3MgPSAwOwotCWludAkJCWJ5dGVzdG93cml0 ZTsKKwlpbnQJCQlieXRlc3Rvd3JpdGUgPSAwOwogCUZpbGUJCXRoaXNmaWxlOwogCisKKwkvKiBT YXZlIG5ieXRlcyB2YWx1ZSBiZWNhdXNlIHRoZSBzaXplIGNoYW5nZXMgZHVlIHRvIGNvbXByZXNz aW9uICovCisJaW50IG5ieXRlc09yaWdpbmFsID0gZmlsZS0+bmJ5dGVzOworCisJYm9vbCBjb21w cmVzc2lvbiA9IGZhbHNlOworCisJY2hhciAqIERhdGFUb1dyaXRlOworCURhdGFUb1dyaXRlID0g ZmlsZS0+YnVmZmVyLmRhdGE7CisKKwkvKgorCSAqIFByZXBhcmUgY29tcHJlc3NlZCBkYXRhIHRv IHdyaXRlCisJICogc2l6ZSBvZiBjb21wcmVzc2VkIGJsb2NrIG5lZWRzIHRvIGJlIGFkZGVkIGF0 IHRoZSBiZWdnaW5pbmcgb2YgdGhlCisJICogY29tcHJlc3NlZCBkYXRhCisJICovCisKKworCWlm IChmaWxlLT5jb21wcmVzcykgeworCQlpbnQgY0J1ZmZlclNpemUgPSAwOworCQljaGFyICogY0Rh dGE7CisJCWludCBjU2l6ZTsKKyNpZmRlZiBVU0VfTFo0CisJCWNCdWZmZXJTaXplID0gTFo0X2Nv bXByZXNzQm91bmQoZmlsZS0+bmJ5dGVzKTsKKyNlbmRpZgorCQkvKgorCQkgKiBBIGxvbmcgbGlm ZSBidWZmZXIgd291bGQgbWFrZSBzZW5jZSB0byBsaW1pdCBudW1iZXIgb2YKKwkJICogbWVtb3J5 IGFsbG9jYXRpb25zCisJCSAqLworCQljb21wcmVzc2lvbiA9IHRydWU7CisJCWNEYXRhID0gcGFs bG9jKGNCdWZmZXJTaXplICsgc2l6ZW9mKGludCkpOworI2lmZGVmIFVTRV9MWjQKKwkJLyoKKwkJ ICogVXNpbmcgc3RyZWFtIGNvbXByZXNzaW9uIHdvdWxkIGxlYWQgdG8gdGhlIHNsaWdodCBpbXBy b3ZlbWVudCBpbgorCQkgKiBjb21wcmVzc2lvbiByYXRpbworCQkgKi8KKwkJY1NpemUgPSBMWjRf Y29tcHJlc3NfZGVmYXVsdChmaWxlLT5idWZmZXIuZGF0YSwKKwkJCQljRGF0YSArIHNpemVvZihp bnQpLGZpbGUtPm5ieXRlcywgY0J1ZmZlclNpemUpOworI2VuZGlmCisKKwkJLyogV3JpdGUgc2l6 ZSBvZiBjb21wcmVzc2VkIGJsb2NrIGluIGZyb250IG9mIGNvbXByZXNzZWQgZGF0YQorCQkgKiBJ dCdzIHVzZWQgdG8gZGV0ZXJtaW5lIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQgd2l0aGluCisJCSAq IGRlY29tcHJlc3Npb24gcHJvY2VzcworCQkgKi8KKwkJbWVtY3B5KGNEYXRhLCZjU2l6ZSxzaXpl b2YoaW50KSk7CisJCWZpbGUtPm5ieXRlcz1jU2l6ZSArIHNpemVvZihpbnQpOworCQlEYXRhVG9X cml0ZSA9IGNEYXRhOworCX0KKwogCS8qCiAJICogVW5saWtlIEJ1ZkZpbGVMb2FkQnVmZmVyLCB3 ZSBtdXN0IGR1bXAgdGhlIHdob2xlIGJ1ZmZlciBldmVuIGlmIGl0CiAJICogY3Jvc3NlcyBhIGNv bXBvbmVudC1maWxlIGJvdW5kYXJ5OyBzbyB3ZSBuZWVkIGEgbG9vcC4KQEAgLTUzNSw3ICs2NjQs NyBAQCBCdWZGaWxlRHVtcEJ1ZmZlcihCdWZGaWxlICpmaWxlKQogCQkJSU5TVFJfVElNRV9TRVRf WkVSTyhpb19zdGFydCk7CiAKIAkJYnl0ZXN0b3dyaXRlID0gRmlsZVdyaXRlKHRoaXNmaWxlLAot CQkJCQkJCQkgZmlsZS0+YnVmZmVyLmRhdGEgKyB3cG9zLAorCQkJCQkJCQkgRGF0YVRvV3JpdGUg KyB3cG9zLAogCQkJCQkJCQkgYnl0ZXN0b3dyaXRlLAogCQkJCQkJCQkgZmlsZS0+Y3VyT2Zmc2V0 LAogCQkJCQkJCQkgV0FJVF9FVkVOVF9CVUZGSUxFX1dSSVRFKTsKQEAgLTU2NCw3ICs2OTMsMTkg QEAgQnVmRmlsZUR1bXBCdWZmZXIoQnVmRmlsZSAqZmlsZSkKIAkgKiBsb2dpY2FsIGZpbGUgcG9z aXRpb24sIGllLCBvcmlnaW5hbCB2YWx1ZSArIHBvcywgaW4gY2FzZSB0aGF0IGlzIGxlc3MKIAkg KiAoYXMgY291bGQgaGFwcGVuIGR1ZSB0byBhIHNtYWxsIGJhY2t3YXJkcyBzZWVrIGluIGEgZGly dHkgYnVmZmVyISkKIAkgKi8KLQlmaWxlLT5jdXJPZmZzZXQgLT0gKGZpbGUtPm5ieXRlcyAtIGZp bGUtPnBvcyk7CisKKworCWlmICghZmlsZS0+Y29tcHJlc3MpCisJCWZpbGUtPmN1ck9mZnNldCAt PSAoZmlsZS0+bmJ5dGVzIC0gZmlsZS0+cG9zKTsKKwllbHNlCisJCWlmIChuYnl0ZXNPcmlnaW5h bCAtIGZpbGUtPnBvcyAhPSAwKQorCQkJLyogY3VyT2Zmc2V0IG11c3QgYmUgY29ycmVjdGVkIGFs c28gaWYgY29tcHJlc3Npb24gaXMKKwkJCSAqIGVuYWJsZWQsIG5ieXRlcyB3YXMgY2hhbmdlZCBi eSBjb21wcmVzc2lvbiBidXQgd2UKKwkJCSAqIGhhdmUgdG8gdXNlIHRoZSBvcmlnaW5hbCB2YWx1 ZSBvZiBuYnl0ZXMKKwkJCSAqLworCQkJZmlsZS0+Y3VyT2Zmc2V0LT1ieXRlc3Rvd3JpdGU7CisK KwogCWlmIChmaWxlLT5jdXJPZmZzZXQgPCAwKQkvKiBoYW5kbGUgcG9zc2libGUgc2VnbWVudCBj cm9zc2luZyAqLwogCXsKIAkJZmlsZS0+Y3VyRmlsZS0tOwpAQCAtNTc3LDYgKzcxOCw5IEBAIEJ1 ZkZpbGVEdW1wQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJICovCiAJZmlsZS0+cG9zID0gMDsKIAlm aWxlLT5uYnl0ZXMgPSAwOworCisJaWYgKGNvbXByZXNzaW9uKQorCQlwZnJlZShEYXRhVG9Xcml0 ZSk7CiB9CiAKIC8qCkBAIC02MDIsOCArNzQ2LDE0IEBAIEJ1ZkZpbGVSZWFkQ29tbW9uKEJ1ZkZp bGUgKmZpbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGJvb2wgZXhhY3QsIGJvb2wgZW9mT0sp CiAJewogCQlpZiAoZmlsZS0+cG9zID49IGZpbGUtPm5ieXRlcykKIAkJewotCQkJLyogVHJ5IHRv IGxvYWQgbW9yZSBkYXRhIGludG8gYnVmZmVyLiAqLwotCQkJZmlsZS0+Y3VyT2Zmc2V0ICs9IGZp bGUtPnBvczsKKwkJCS8qIFRyeSB0byBsb2FkIG1vcmUgZGF0YSBpbnRvIGJ1ZmZlci4KKwkJCSAq CisJCQkgKiBjdXJPZmZzZXQgaXMgbW92ZWQgd2l0aGluIEJ1ZkZpbGVMb2FkQnVmZmVyCisJCQkg KiBiZWNhdXNlIHN0b3JlZCBkYXRhIHNpemUgZGlmZmVycyBmcm9tIGxvYWRlZC8KKwkJCSAqIGRl Y29tcHJlc3NlZCBzaXplCisJCQkgKiAqLworCQkJaWYgKCFmaWxlLT5jb21wcmVzcykKKwkJCQlm aWxlLT5jdXJPZmZzZXQgKz0gZmlsZS0+cG9zOwogCQkJZmlsZS0+cG9zID0gMDsKIAkJCWZpbGUt Pm5ieXRlcyA9IDA7CiAJCQlCdWZGaWxlTG9hZEJ1ZmZlcihmaWxlKTsKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfdGFibGVzLmMKaW5kZXggNjg2MzA5ZGI1OC4uMzgyMWNhZjc2MyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9ndWNfdGFibGVzLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlICJyZXBsaWNh dGlvbi9zeW5jcmVwLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKICNpbmNsdWRlICJz dG9yYWdlL2J1ZnBhZ2UuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1ZmZpbGUuaCIKICNpbmNsdWRl ICJzdG9yYWdlL2xhcmdlX29iamVjdC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcGdfc2htZW0uaCIK ICNpbmNsdWRlICJzdG9yYWdlL3ByZWRpY2F0ZS5oIgpAQCAtNDU0LDYgKzQ1NSwxNyBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnVtX2VudHJ5IGRlZmF1bHRfdG9hc3RfY29tcHJlc3Np b25fb3B0aW9uc1tdID0gewogI2VuZGlmCiAJe05VTEwsIDAsIGZhbHNlfQogfTsKKy8qCisgKiBw Z2x6IGFuZCB6c3RkIHN1cHBvcnQgc2hvdWxkIGJlIGFkZGVkIGFzIGZ1dHVyZSBlbmhhbmNlbWVu dAorICoKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfZW51bV9lbnRyeSB0ZW1wX2Zp bGVfY29tcHJlc3Npb25fb3B0aW9uc1tdID0geworCXsibm8iLCBURU1QX05PTkVfQ09NUFJFU1NJ T04sIGZhbHNlfSwKKyNpZmRlZiAgVVNFX0xaNAorCXsibHo0IiwgVEVNUF9MWjRfQ09NUFJFU1NJ T04sIGZhbHNlfSwKKyNlbmRpZgorCXtOVUxMLCAwLCBmYWxzZX0KK307CiAKIHN0YXRpYyBjb25z dCBzdHJ1Y3QgY29uZmlnX2VudW1fZW50cnkgd2FsX2NvbXByZXNzaW9uX29wdGlvbnNbXSA9IHsK IAl7InBnbHoiLCBXQUxfQ09NUFJFU1NJT05fUEdMWiwgZmFsc2V9LApAQCAtNDg1Niw2ICs0ODY4 LDE3IEBAIHN0cnVjdCBjb25maWdfZW51bSBDb25maWd1cmVOYW1lc0VudW1bXSA9CiAJCU5VTEws IE5VTEwsIE5VTEwKIAl9LAogCisJeworCQl7InRlbXBfZmlsZV9jb21wcmVzc2lvbiIsIFBHQ19V U0VSU0VULCBDTElFTlRfQ09OTl9TVEFURU1FTlQsCisJCQlnZXR0ZXh0X25vb3AoIlNldHMgdGhl IGRlZmF1bHQgY29tcHJlc3Npb24gbWV0aG9kIGZvciBjb21wcmVzc2libGUgdmFsdWVzLiIpLAor CQkJTlVMTAorCQl9LAorCQkmdGVtcF9maWxlX2NvbXByZXNzaW9uLAorCQlURU1QX05PTkVfQ09N UFJFU1NJT04sCisJCXRlbXBfZmlsZV9jb21wcmVzc2lvbl9vcHRpb25zLAorCQlOVUxMLCBOVUxM LCBOVUxMCisJfSwKKwogCXsKIAkJeyJkZWZhdWx0X3RyYW5zYWN0aW9uX2lzb2xhdGlvbiIsIFBH Q19VU0VSU0VULCBDTElFTlRfQ09OTl9TVEFURU1FTlQsCiAJCQlnZXR0ZXh0X25vb3AoIlNldHMg dGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCBvZiBlYWNoIG5ldyB0cmFuc2FjdGlvbi4i KSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNh bXBsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQppbmRl eCA2NjdlMGRjNDBhLi5lOWMwYjM2MzUyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9t aXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9w b3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCkBAIC0xNzcsNiArMTc3LDcgQEAKIAogI21heF9ub3RpZnlf cXVldWVfcGFnZXMgPSAxMDQ4NTc2CSMgbGltaXRzIHRoZSBudW1iZXIgb2YgU0xSVSBwYWdlcyBh bGxvY2F0ZWQKIAkJCQkJIyBmb3IgTk9USUZZIC8gTElTVEVOIHF1ZXVlCisjdGVtcF9maWxlX2Nv bXByZXNzaW9uID0gJ25vJwkjIGVuYWJsZXMgdGVtcG9yYXJ5IGZpbGVzIGNvbXByZXNzaW9uCiAK ICMgLSBLZXJuZWwgUmVzb3VyY2VzIC0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMv c29ydC9sb2d0YXBlLmMgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L2xvZ3RhcGUuYwppbmRleCA0 NGIzMGU4NmFkLi5hZjQzYjNlYmIxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9zb3J0 L2xvZ3RhcGUuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L2xvZ3RhcGUuYwpAQCAtNTky LDcgKzU5Miw3IEBAIExvZ2ljYWxUYXBlU2V0Q3JlYXRlKGJvb2wgcHJlYWxsb2NhdGUsIFNoYXJl ZEZpbGVTZXQgKmZpbGVzZXQsIGludCB3b3JrZXIpCiAJCWx0cy0+cGZpbGUgPSBCdWZGaWxlQ3Jl YXRlRmlsZVNldCgmZmlsZXNldC0+ZnMsIGZpbGVuYW1lKTsKIAl9CiAJZWxzZQotCQlsdHMtPnBm aWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoZmFsc2UpOworCQlsdHMtPnBmaWxlID0gQnVmRmlsZUNy ZWF0ZVRlbXAoZmFsc2UsIGZhbHNlKTsKIAogCXJldHVybiBsdHM7CiB9CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc3RvcmUuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL3Nv cnQvdHVwbGVzdG9yZS5jCmluZGV4IGE3MjBkNzAyMDAuLmE5NTJmMGY0ZjUgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzdG9yZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0 aWxzL3NvcnQvdHVwbGVzdG9yZS5jCkBAIC04NjAsNyArODYwLDcgQEAgdHVwbGVzdG9yZV9wdXR0 dXBsZV9jb21tb24oVHVwbGVzdG9yZXN0YXRlICpzdGF0ZSwgdm9pZCAqdHVwbGUpCiAJCQkgKi8K IAkJCW9sZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhzdGF0ZS0+Y29udGV4dC0+cGFyZW50 KTsKIAotCQkJc3RhdGUtPm15ZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKHN0YXRlLT5pbnRlclhh Y3QpOworCQkJc3RhdGUtPm15ZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKHN0YXRlLT5pbnRlclhh Y3QsIGZhbHNlKTsKIAogCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7CiAKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmZmlsZS5oIGIvc3JjL2luY2x1ZGUvc3RvcmFn ZS9idWZmaWxlLmgKaW5kZXggNWY2ZDdjOGUzZi4uNDg2YjU1MmUzMSAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvc3RvcmFnZS9idWZmaWxlLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZm aWxlLmgKQEAgLTMyLDExICszMiwyMiBAQAogCiB0eXBlZGVmIHN0cnVjdCBCdWZGaWxlIEJ1ZkZp bGU7CiAKK3R5cGVkZWYgZW51bQoreworCVRFTVBfTk9ORV9DT01QUkVTU0lPTiwKKyNpZmRlZiBV U0VfTFo0CisJVEVNUF9MWjRfQ09NUFJFU1NJT04KKyNlbmRpZgorfSBUZW1wQ29tcHJlc3Npb247 CisKK2V4dGVybiBQR0RMTElNUE9SVCBpbnQgdGVtcF9maWxlX2NvbXByZXNzaW9uOworCisKIC8q CiAgKiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgaW4gYnVmZmlsZS5jCiAgKi8KIAotZXh0ZXJu IEJ1ZkZpbGUgKkJ1ZkZpbGVDcmVhdGVUZW1wKGJvb2wgaW50ZXJYYWN0KTsKK2V4dGVybiBCdWZG aWxlICpCdWZGaWxlQ3JlYXRlVGVtcChib29sIGludGVyWGFjdCwgYm9vbCBjb21wcmVzcyk7CiBl eHRlcm4gdm9pZCBCdWZGaWxlQ2xvc2UoQnVmRmlsZSAqZmlsZSk7CiBleHRlcm4gcGdfbm9kaXNj YXJkIHNpemVfdCBCdWZGaWxlUmVhZChCdWZGaWxlICpmaWxlLCB2b2lkICpwdHIsIHNpemVfdCBz aXplKTsKIGV4dGVybiB2b2lkIEJ1ZkZpbGVSZWFkRXhhY3QoQnVmRmlsZSAqZmlsZSwgdm9pZCAq cHRyLCBzaXplX3Qgc2l6ZSk7Ci0tIAoyLjQ2LjIKCg== --000000000000762f000626e6c262--