Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vSiJq-0045zt-0X for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Dec 2025 20:58:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vSiJo-001dH6-2D for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Dec 2025 20:58:53 +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.96) (envelope-from ) id 1vSiJo-001dGx-0S for pgsql-hackers@lists.postgresql.org; Mon, 08 Dec 2025 20:58:52 +0000 Received: from mail-qv1-xf2e.google.com ([2607:f8b0:4864:20::f2e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vSiJi-003usT-1Z for pgsql-hackers@lists.postgresql.org; Mon, 08 Dec 2025 20:58:52 +0000 Received: by mail-qv1-xf2e.google.com with SMTP id 6a1803df08f44-8804dd5b71dso1496346d6.1 for ; Mon, 08 Dec 2025 12:58:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765227524; x=1765832324; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=eH3N185B2p9O3aCTxtGWer/sfUgE/lzWLY3GOqW6NVY=; b=acw90hQh5iWvRc4b63ydIW88/VxqmrIz4yE8SL9KsluGsOqHbJ8EhEzdMsDho1vJMQ kd75pTAaQSfv1+p0fT+KLYUjKwldaFRyqaqG+tvvTUG8lBumbxYubjmWiDHsCGiWGvwl K9njqgnXdgtXdUwJ4R36T43mtHk/HfSy6eJZPIjxX+5PYSAhTDKwL9VshSBflU31r+q/ uYOSFi/cWXO+HcsvvcbOPZ9XeWnzuTn/N9Icr8qV0I+K9i2KPrKYraxk6r1o2m/ST39z HB5R32qx508v8PjFWvNOyJWT2yghpVK2JC9X7Kllxk2PZAhIFeiyDY7jM7jdnrpyHssJ DbXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765227524; x=1765832324; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eH3N185B2p9O3aCTxtGWer/sfUgE/lzWLY3GOqW6NVY=; b=oI3+FuLNypRrP84Ncc0ki6R6qdw+16Q4hT4CN+7pT7PKzKkR47JbNuIxTUsrFE3UYe Rk2qENJECV+glgXwwu6t2n8yF+FLk+2qQ3pijhVL1cxU6/oNJ5Jx1oo7AKnMA8LQjarr OJsAKGUDHLWLF3th3WTrsyWcki+Ui43tdwJYllVuHcKO/j19pv4tDGrLZg5yb8ob4gOH qUJRnuyfuYx/LjrZlkpeS+tquxKkqJFqyZa0/B5sCLs1G2mDZ/nvqHH46CI6VkdY919w 2OIBVGw+FlP8JDOwlIHcYzh9lbAZYShA/5PFYoFWIzG4omHE2PdFOH7K1eky+Ar8aSS9 jy7g== X-Gm-Message-State: AOJu0YwrrRK6rH2W5lqgYCtUM9tWtZmkAF65MDyqR9ph3Pbx4O470HJ3 EIeWlz0G99OJUREVMhTp38pMQXDju227PNYTE3bYtFyCaqndYwVPcl4O7KnHM1tXu0uELaKQPiC XKfrvJa/bs7qltB5CrPCdcMIMlDS/KIZfclBM X-Gm-Gg: ASbGncvWk7d/cKHbnwa2pOBtAArF8WBZhMwQ4OlIVdorj40qEq0ijb0L8oHjS1svp9r 3wRMdegFds5e0qcf1jXNDn4xFCoHerMl1Y3cBIUsGtu5dhYfdHeVuL86vyxbXobGmj6Ahd58lut 84A0aTrlp3utfkTMFnSGZV7cKT+Nq3kjVWxbnrfon7dHAy2Slg4PWUeuYvrcpB0RkGvvDwn6IuC Jc1C3fLrAYWNXVmWGMAKNmKCocHiphBAvDLY0zgvuRe8UApB9bHUeUxe4uL8E5zjBi4H7A= X-Google-Smtp-Source: AGHT+IH2M3LvhyEmmMEwzj7f44jYe63EOU5ksm+XGucKUKjhzsz0dS0gO31uzcEJltVnD0O4/BzKhUnqNsEu2UEI9EM= X-Received: by 2002:a05:6214:19cc:b0:880:5222:358 with SMTP id 6a1803df08f44-8883d93162fmr121655736d6.0.1765227523611; Mon, 08 Dec 2025 12:58:43 -0800 (PST) MIME-Version: 1.0 From: Adam Brusselback Date: Mon, 8 Dec 2025 15:58:27 -0500 X-Gm-Features: AQt7F2oluyuBHKr-MgXOS5K3VzfyoG6jUPxsCiD7hsEAgI0weSaqVNolFMIWs6I Message-ID: Subject: [Patch] Add WHERE clause support to REFRESH MATERIALIZED VIEW To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000007e3e940645770fe2" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007e3e940645770fe2 Content-Type: multipart/alternative; boundary="0000000000007e3e930645770fe0" --0000000000007e3e930645770fe0 Content-Type: text/plain; charset="UTF-8" Attached is a patch implementing support for a WHERE clause in REFRESH MATERIALIZED VIEW. The syntax allows for targeted refreshes: REFRESH MATERIALIZED VIEW mv WHERE invoice_id = ANY('{1,2,3}'); REFRESH MATERIALIZED VIEW CONCURRENTLY mv WHERE customer_id = 42; REFRESH MATERIALIZED VIEW mv WHERE order_date >= '2023-01-01'; I was inspired to implement this feature after watching the Hacking Postgres discussion on the topic: https://www.youtube.com/watch?v=6cZvHjDrmlQ This allows the user to restrict the refresh operation to a subset of the view. The qualification is applied to the view's output columns. The optimizer can then push this condition down to the underlying base tables, avoiding a full scan when only a known subset of data has changed. Implementation notes: 1. The grammar accepts an optional WHERE clause. We forbid volatile functions in the clause to ensure correctness. 2. Non-Concurrent Partial Refresh: When `CONCURRENTLY` is not specified, the operation performs an in-place modification using a `ROW EXCLUSIVE` lock. * This mode requires a unique index to ensure constraint violations are handled correctly (e.g., when a row's values change such that it "drifts" into or out of the `WHERE` clause scope). * It executes a Prune + Upsert strategy: * `DELETE` all rows in the materialized view that match the `WHERE` clause. * `INSERT` the new data from the source query. * It uses `ON CONFLICT DO UPDATE` during the insert phase to handle concurrency edge cases, ensuring the refresh is robust against constraint violations. 3. Concurrent Partial Refresh: When `CONCURRENTLY` is specified, it uses the existing diff/merge infrastructure (`refresh_by_match_merge`), limiting the scope of the diff (and the temporary table population) to the rows matching the predicate. This requires an `EXCLUSIVE` lock and a unique index, consistent with existing concurrent refresh behavior. It is much slower than `Non-Concurrent Partial Refresh` 4. The execution logic uses SPI to inject the predicate into the source queries during execution. I have attached a benchmark suite to validate performance and correctness: * `setup.sql`: Creates a schema `mv_benchmark` modeling an invoicing system (`invoices` and `invoice_lines`). It includes an aggregated materialized view (`invoice_summary`) and a control table (`invoice_summary_table`). * `workload_*.sql`: pgbench scripts simulating a high-churn environment (45% inserts, 10% updates, 45% deletes) to maintain roughly stable dataset sizes while generating significant refresh work. * `run_benchmark_comprehensive.sh`: Orchestrates the benchmark across multiple scale factors and concurrency levels. The benchmark compares strategies for keeping a summary up to date (vs baseline): * Partial Refresh: Triggers on the base table collect modified IDs and execute `REFRESH MATERIALIZED VIEW ... WHERE ...`. * Materialized Table (Control): A standard table maintained via complex PL/pgSQL triggers (the traditional manual workaround). * Full Refresh (Legacy): Manually refresh the view after changes. Results are below: Concurrency: 1 client(s) ---------------------------------------------------------------------------------- Scale Batch | Baseline TPS | Full (Rel) Partial (Rel) Table (Rel) ---------- ------ | ------------ | ------------ ------------ ------------ 20000 1 | 5309.05 | 0.002x 0.437x 0.470x 20000 50 | 1209.32 | 0.010x 0.600x 0.598x 20000 1000 | 56.05 | 0.164x 0.594x 0.576x 400000 1 | 5136.91 | 0 x 0.450x 0.487x 400000 50 | 1709.17 | 0 x 0.497x 0.482x 400000 1000 | 110.35 | 0.006x 0.507x 0.460x Concurrency: 4 client(s) ---------------------------------------------------------------------------------- Scale Batch | Baseline TPS | Full (Rel) Partial (Rel) Table (Rel) ---------- ------ | ------------ | ------------ ------------ ------------ 20000 1 | 19197.50 | 0x 0.412x 0.435x 20000 50 | 1016.14 | 0.007x 0.966x 1.036x 20000 1000 | 9.94 | 0.708x 1.401x 1.169x 400000 1 | 19637.36 | 0x 0.436x 0.483x 400000 50 | 4669.32 | 0x 0.574x 0.566x 400000 1000 | 23.26 | 0.029x 1.147x 0.715x Concurrency: 8 client(s) ---------------------------------------------------------------------------------- Scale Batch | Baseline TPS | Full (Rel) Partial (Rel) Table (Rel) ---------- ------ | ------------ | ------------ ------------ ------------ 20000 1 | 30358.32 | 0x 0.440x 0.457x 20000 50 | 262.75 | 0.026x 2.943x 2.740x 20000 1000 | 11.28 | 0.575x 0.840x 0.578x 400000 1 | 36007.15 | 0x 0.430x 0.464x 400000 50 | 6664.58 | 0x 0.563x 0.494x 400000 1000 | 11.61 | 0.058x 1.000x 1.277x In these tests, the partial refresh behaves as O(delta) rather than O(total), performing comparably to the manual PL/pgSQL approach but with significantly lower code complexity for the user. I recognize that adding a WHERE clause to REFRESH is an extension to the SQL standard. I believe the syntax is intuitive, but I am open to discussion regarding alternative implementation strategies or syntax if the community feels a different approach is warranted. New regression tests are included in the patch. This is my first time submitting a patch to PostgreSQL, so please bear with me if I've missed anything or made any procedural mistakes. I'm happy to address any feedback. Thanks, Adam Brusselback --0000000000007e3e930645770fe0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Attached is a patch implementing support for a WHERE claus= e in REFRESH MATERIALIZED VIEW.

The syntax allows for targeted refre= shes:
=C2=A0 =C2=A0 REFRESH MATERIALIZED VIEW mv WHERE invoice_id =3D AN= Y('{1,2,3}');
=C2=A0 =C2=A0 REFRESH MATERIALIZED VIEW CONCURRENT= LY mv WHERE customer_id =3D 42;
=C2=A0 =C2=A0 REFRESH MATERIALIZED VIEW = mv WHERE order_date >=3D '2023-01-01';

I was inspired to = implement this feature after watching the Hacking Postgres discussion on th= e topic: https://= www.youtube.com/watch?v=3D6cZvHjDrmlQ

This allows the user to re= strict the refresh operation to a subset of the view. The qualification is = applied to the view's output columns. The optimizer can then push this = condition down to the underlying base tables, avoiding a full scan when onl= y a known subset of data has changed.

Implementation notes:

1= . The grammar accepts an optional WHERE clause. We forbid volatile function= s in the clause to ensure correctness.

2. Non-Concurrent Partial Ref= resh: When `CONCURRENTLY` is not specified, the operation performs an in-pl= ace modification using a `ROW EXCLUSIVE` lock.
=C2=A0 =C2=A0 * =C2=A0 Th= is mode requires a unique index to ensure constraint violations are handled= correctly (e.g., when a row's values change such that it "drifts&= quot; into or out of the `WHERE` clause scope).
=C2=A0 =C2=A0 * =C2=A0 I= t executes a Prune + Upsert strategy:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 * `DEL= ETE` all rows in the materialized view that match the `WHERE` clause.
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 * `INSERT` the new data from the source query.<= br>=C2=A0 =C2=A0 * =C2=A0 It uses `ON CONFLICT DO UPDATE` during the insert= phase to handle concurrency edge cases, ensuring the refresh is robust aga= inst constraint violations.

3. Concurrent Partial Refresh: When `CON= CURRENTLY` is specified, it uses the existing diff/merge infrastructure (`r= efresh_by_match_merge`), limiting the scope of the diff (and the temporary = table population) to the rows matching the predicate. This requires an `EXC= LUSIVE` lock and a unique index, consistent with existing concurrent refres= h behavior. It is much slower than `Non-Concurrent Partial Refresh`
4. The execution logic uses SPI to inject the predicate into the source qu= eries during execution.

I have attached a benchmark suite to validat= e performance and correctness:

* =C2=A0 `setup.sql`: Creates a schem= a `mv_benchmark` modeling an invoicing system (`invoices` and `invoice_line= s`). It includes an aggregated materialized view (`invoice_summary`) and a = control table (`invoice_summary_table`).
* =C2=A0 `workload_*.sql`: pgbe= nch scripts simulating a high-churn environment (45% inserts, 10% updates, = 45% deletes) to maintain roughly stable dataset sizes while generating sign= ificant refresh work.
* =C2=A0 `run_benchmark_comprehensive.sh`: Orchest= rates the benchmark across multiple scale factors and concurrency levels.
The benchmark compares strategies for keeping a summary up to date (v= s baseline):
* =C2=A0 Partial Refresh: Triggers on the base table collec= t modified IDs and execute `REFRESH MATERIALIZED VIEW ... WHERE ...`.
* = =C2=A0 Materialized Table (Control): A standard table maintained via comple= x PL/pgSQL triggers (the traditional manual workaround).
* =C2=A0 Full R= efresh (Legacy): Manually refresh the view after changes.

Results ar= e below:
Concurrency: 1 client(s)
-----------------------------------= -----------------------------------------------
Scale =C2=A0 =C2=A0 =C2= =A0 Batch | Baseline TPS | Full (Rel) =C2=A0 Partial (Rel) Table (Rel)
= ---------- ------ | ------------ | ------------ ------------ ------------20000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1 | 5309.05 =C2=A0 =C2=A0 =C2=A0= | 0.002x =C2=A0 =C2=A0 =C2=A0 =C2=A00.437x =C2=A0 =C2=A0 =C2=A0 =C2=A00.470= x =C2=A0 =C2=A0 =C2=A0
20000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A050 | 120= 9.32 =C2=A0 =C2=A0 =C2=A0| 0.010x =C2=A0 =C2=A0 =C2=A0 =C2=A00.600x =C2=A0 = =C2=A0 =C2=A0 =C2=A00.598x =C2=A0 =C2=A0 =C2=A0
20000 =C2=A0 =C2=A0 =C2= =A0 =C2=A01000 | 56.05 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 0.164x =C2=A0 =C2=A0 = =C2=A0 =C2=A00.594x =C2=A0 =C2=A0 =C2=A0 =C2=A00.576x =C2=A0 =C2=A0 =C2=A0 =
400000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01 | 5136.91 =C2=A0 =C2=A0 =C2= =A0| 0 =C2=A0 =C2=A0x =C2=A0 =C2=A0 =C2=A0 =C2=A00.450x =C2=A0 =C2=A0 =C2= =A0 =C2=A00.487x =C2=A0 =C2=A0 =C2=A0
400000 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 50 | 1709.17 =C2=A0 =C2=A0 =C2=A0| 0 =C2=A0 =C2=A0x =C2=A0 =C2=A0 =C2= =A0 =C2=A00.497x =C2=A0 =C2=A0 =C2=A0 =C2=A00.482x =C2=A0 =C2=A0 =C2=A0 400000 =C2=A0 =C2=A0 =C2=A0 1000 | 110.35 =C2=A0 =C2=A0 =C2=A0 | 0.006x = =C2=A0 =C2=A0 =C2=A0 =C2=A00.507x =C2=A0 =C2=A0 =C2=A0 =C2=A00.460x =C2=A0 = =C2=A0 =C2=A0

Concurrency: 4 client(s)
-------------------------= ---------------------------------------------------------
Scale =C2=A0 = =C2=A0 =C2=A0 Batch | Baseline TPS | Full (Rel) =C2=A0 Partial (Rel) Table = (Rel)
---------- ------ | ------------ | ------------ ------------ ----= --------
20000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1 | 19197.50 =C2=A0 = =C2=A0 | 0x =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00.412x =C2=A0 =C2=A0 = =C2=A0 =C2=A00.435x =C2=A0 =C2=A0 =C2=A0
20000 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A050 | 1016.14 =C2=A0 =C2=A0 =C2=A0| 0.007x =C2=A0 =C2=A0 =C2=A0 = =C2=A00.966x =C2=A0 =C2=A0 =C2=A0 =C2=A01.036x =C2=A0 =C2=A0 =C2=A0
200= 00 =C2=A0 =C2=A0 =C2=A0 =C2=A01000 | 9.94 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 0.7= 08x =C2=A0 =C2=A0 =C2=A0 =C2=A01.401x =C2=A0 =C2=A0 =C2=A0 =C2=A01.169x =C2= =A0 =C2=A0 =C2=A0
400000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01 | 19637.36= =C2=A0 =C2=A0 | 0x =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00.436x =C2=A0 = =C2=A0 =C2=A0 =C2=A00.483x =C2=A0 =C2=A0 =C2=A0
400000 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 50 | 4669.32 =C2=A0 =C2=A0 =C2=A0| 0x =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A00.574x =C2=A0 =C2=A0 =C2=A0 =C2=A00.566x =C2=A0 =C2=A0 = =C2=A0
400000 =C2=A0 =C2=A0 =C2=A0 1000 | 23.26 =C2=A0 =C2=A0 =C2=A0 = =C2=A0| 0.029x =C2=A0 =C2=A0 =C2=A0 =C2=A01.147x =C2=A0 =C2=A0 =C2=A0 =C2= =A00.715x =C2=A0 =C2=A0 =C2=A0

Concurrency: 8 client(s)
--------= --------------------------------------------------------------------------<= br>Scale =C2=A0 =C2=A0 =C2=A0 Batch | Baseline TPS | Full (Rel) =C2=A0 Part= ial (Rel) Table (Rel)
---------- ------ | ------------ | ------------ -= ----------- ------------
20000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1 | 30= 358.32 =C2=A0 =C2=A0 | 0x =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00.440x = =C2=A0 =C2=A0 =C2=A0 =C2=A00.457x
20000 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A050 | 262.75 =C2=A0 =C2=A0 =C2=A0 | 0.026x =C2=A0 =C2=A0 =C2=A0 =C2=A02.9= 43x =C2=A0 =C2=A0 =C2=A0 =C2=A02.740x
20000 =C2=A0 =C2=A0 =C2=A0 =C2=A01= 000 | 11.28 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 0.575x =C2=A0 =C2=A0 =C2=A0 =C2=A0= 0.840x =C2=A0 =C2=A0 =C2=A0 =C2=A00.578x
400000 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A01 | 36007.15 =C2=A0 =C2=A0 | 0x =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A00.430x =C2=A0 =C2=A0 =C2=A0 =C2=A00.464x
400000 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 50 | 6664.58 =C2=A0 =C2=A0 =C2=A0| 0x =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A00.563x =C2=A0 =C2=A0 =C2=A0 =C2=A00.494x
400000 =C2= =A0 =C2=A0 =C2=A0 1000 | 11.61 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 0.058x =C2=A0 = =C2=A0 =C2=A0 =C2=A01.000x =C2=A0 =C2=A0 =C2=A0 =C2=A01.277x


In these tests, the partial refresh behaves as O(delta) rather than O(tota= l), performing comparably to the manual PL/pgSQL approach but with signific= antly lower code complexity for the user.

I recognize that adding a = WHERE clause to REFRESH is an extension to the SQL standard. I believe the = syntax is intuitive, but I am open to discussion regarding alternative impl= ementation strategies or syntax if the community feels a different approach= is warranted.

New regression tests are included in the patch.
This is my first time submitting a patch to PostgreSQL, so please bear wi= th me if I've missed anything or made any procedural mistakes. I'm = happy to address any feedback.

Thanks,
Adam Brusselback
--0000000000007e3e930645770fe0-- --0000000000007e3e940645770fe2 Content-Type: application/zip; name="benchmark.zip" Content-Disposition: attachment; filename="benchmark.zip" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mixmn8lm0 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 BgAAAAAFAAUA2AEAAKUaAAAAAA== --0000000000007e3e940645770fe2 Content-Type: text/x-patch; charset="US-ASCII"; name="001_implement_mat_view_where.patch" Content-Disposition: attachment; filename="001_implement_mat_view_where.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mixmnc4w1 RnJvbSA1OTlkNmE4ZjNkNDhhZWQ1NmY5NjBiMWU0YmViYTM3YWVlYmEwYTcxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBZGFtIEJydXNzZWxiYWNrIDxhZGFtYnJ1c3NlbGJhY2tAZ21h aWwuY29tPgpEYXRlOiBNb24sIDggRGVjIDIwMjUgMTU6MDA6MTUgLTA1MDAKU3ViamVjdDogW1BB VENIXSBBZGQgc3VwcG9ydCBmb3IgcGFydGlhbCBtYXR2aWV3IHJlZnJlc2ggdXNpbmcgYFJFRlJF U0gKIE1BVEVSSUFMSVpFRCBWSUVXIC4uLiBXSEVSRSAuLi5gCgotLS0KIC4uLi9zZ21sL3JlZi9y ZWZyZXNoX21hdGVyaWFsaXplZF92aWV3LnNnbWwgICB8ICA0NCArLQogc3JjL2JhY2tlbmQvY29t bWFuZHMvY3JlYXRlYXMuYyAgICAgICAgICAgICAgIHwgICA0ICstCiBzcmMvYmFja2VuZC9jb21t YW5kcy9tYXR2aWV3LmMgICAgICAgICAgICAgICAgfCA4MjEgKysrKysrKysrKysrKysrKy0tCiBz cmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jICAgICAgICAgICAgICAgfCAgIDMgKy0KIHNy Yy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgICAgICAgICAgICAgICAgICAgICB8ICAxNCArLQogc3Jj L2JhY2tlbmQvdGNvcC91dGlsaXR5LmMgICAgICAgICAgICAgICAgICAgIHwgICAyICstCiBzcmMv aW5jbHVkZS9jb21tYW5kcy9tYXR2aWV3LmggICAgICAgICAgICAgICAgfCAgIDYgKy0KIHNyYy9p bmNsdWRlL25vZGVzL3BhcnNlbm9kZXMuaCAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL21hdHZpZXdfd2hlcmUub3V0ICAgfCAzNDYgKysrKysrKysKIHNy Yy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgICAgICAgICAgICB8ICAgNSArCiBzcmMv dGVzdC9yZWdyZXNzL3NxbC9tYXR2aWV3X3doZXJlLnNxbCAgICAgICAgfCAzMDUgKysrKysrKwog MTEgZmlsZXMgY2hhbmdlZCwgMTQ3NyBpbnNlcnRpb25zKCspLCA3NCBkZWxldGlvbnMoLSkKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL21hdHZpZXdfd2hlcmUu b3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWF0dmlld193aGVy ZS5zcWwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcmVmL3JlZnJlc2hfbWF0ZXJpYWxpemVk X3ZpZXcuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvcmVmcmVzaF9tYXRlcmlhbGl6ZWRfdmlldy5z Z21sCmluZGV4IDhlZDQzYWRlODAzLi5jYTgxMmRkY2RmOCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9z Z21sL3JlZi9yZWZyZXNoX21hdGVyaWFsaXplZF92aWV3LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21s L3JlZi9yZWZyZXNoX21hdGVyaWFsaXplZF92aWV3LnNnbWwKQEAgLTIyLDcgKzIyLDcgQEAgUG9z dGdyZVNRTCBkb2N1bWVudGF0aW9uCiAgPHJlZnN5bm9wc2lzZGl2PgogPHN5bm9wc2lzPgogUkVG UkVTSCBNQVRFUklBTElaRUQgVklFVyBbIENPTkNVUlJFTlRMWSBdIDxyZXBsYWNlYWJsZSBjbGFz cz0icGFyYW1ldGVyIj5uYW1lPC9yZXBsYWNlYWJsZT4KLSAgICBbIFdJVEggWyBOTyBdIERBVEEg XQorICAgIFsgV0lUSCBbIE5PIF0gREFUQSBdIFsgV0hFUkUgPHJlcGxhY2VhYmxlIGNsYXNzPSJw YXJhbWV0ZXIiPmNvbmRpdGlvbjwvcmVwbGFjZWFibGU+IF0KIDwvc3lub3BzaXM+CiAgPC9yZWZz eW5vcHNpc2Rpdj4KIApAQCAtNDQsNiArNDQsMTUgQEAgUkVGUkVTSCBNQVRFUklBTElaRUQgVklF VyBbIENPTkNVUlJFTlRMWSBdIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5uYW1lPC8K ICAgIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPldJVEggTk8g REFUQTwvbGl0ZXJhbD4gbWF5IG5vdAogICAgYmUgc3BlY2lmaWVkIHRvZ2V0aGVyLgogICA8L3Bh cmE+CisgIDxwYXJhPgorICAgSWYgYSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIGlz IHNwZWNpZmllZCwgb25seSB0aGUgcm93cyBtYXRjaGluZworICAgdGhlIDxyZXBsYWNlYWJsZSBj bGFzcz0icGFyYW1ldGVyIj5jb25kaXRpb248L3JlcGxhY2VhYmxlPiBhcmUgdXBkYXRlZC4KKyAg IFJvd3MgaW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3IHRoYXQgbWF0Y2ggdGhlIGNvbmRpdGlvbiBi dXQgYXJlIG5vIGxvbmdlcgorICAgcHJlc2VudCBpbiB0aGUgdW5kZXJseWluZyBiYXNlIHRhYmxl cyAob3Igbm8gbG9uZ2VyIG1hdGNoIHRoZSBxdWVyeSBkZWZpbml0aW9uKQorICAgYXJlIGRlbGV0 ZWQuIE5ldyByb3dzIGZyb20gdGhlIGJhc2UgdGFibGVzIHRoYXQgbWF0Y2ggdGhlIGNvbmRpdGlv biBhcmUgaW5zZXJ0ZWQuCisgICBSb3dzIGluIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyB0aGF0IGRv IG5vdCBtYXRjaCB0aGUgY29uZGl0aW9uIGFyZSBsZWZ0IHVuY2hhbmdlZC4KKyAgIFRoZSA8bGl0 ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNlIGNhbm5vdCBiZSB1c2VkIHdpdGggPGxpdGVyYWw+ V0lUSCBOTyBEQVRBPC9saXRlcmFsPi4KKyAgPC9wYXJhPgogIDwvcmVmc2VjdDE+CiAKICA8cmVm c2VjdDE+CkBAIC04Nyw2ICs5NiwyOSBAQCBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIFsgQ09O Q1VSUkVOVExZIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm5hbWU8LwogICAgICA8 L3BhcmE+CiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5PgorCisgICA8dmFybGlz dGVudHJ5PgorICAgIDx0ZXJtPjxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiA8cmVwbGFjZWFibGUg Y2xhc3M9InBhcmFtZXRlciI+Y29uZGl0aW9uPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgPGxp c3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAgIEEgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IGNs YXVzZSBzcGVjaWZ5aW5nIGEgY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcworICAgICAgd2hpY2gg cm93cyB0byByZWZyZXNoLiBUaGUgY29uZGl0aW9uIGFwcGxpZXMgdG8gYm90aCB0aGUgZXhpc3Rp bmcgZGF0YQorICAgICAgaW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3IGFuZCB0aGUgbmV3IGRhdGEg Z2VuZXJhdGVkIGJ5IHRoZSB2aWV3J3MgZGVmaW5pbmcgcXVlcnkuCisgICAgIDwvcGFyYT4KKyAg ICAgPHBhcmE+CisgICAgICBXaGVuIGEgPGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IGNsYXVzZSBp cyB1c2VkIHdpdGhvdXQKKyAgICAgIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwvbGl0ZXJhbD4sIHRo ZSBvcGVyYXRpb24gcmVxdWlyZXMgYQorICAgICAgPGxpdGVyYWw+Uk9XIEVYQ0xVU0lWRTwvbGl0 ZXJhbD4gbG9jaywgd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZHMgb24gdGhlCisgICAgICBt YXRlcmlhbGl6ZWQgdmlldyBidXQgYmxvY2tzIG90aGVyIG1vZGlmaWNhdGlvbiBjb21tYW5kcy4g VGhpcyBpcyBhIGxvd2VyCisgICAgICBsb2NrIGxldmVsIHRoYW4gdGhlIDxsaXRlcmFsPkFDQ0VT UyBFWENMVVNJVkU8L2xpdGVyYWw+IGxvY2sgcmVxdWlyZWQgYnkgYQorICAgICAgZnVsbCByZWZy ZXNoLgorICAgICA8L3BhcmE+CisgICAgIDxwYXJhPgorICAgICAgVGhlIDxsaXRlcmFsPldIRVJF PC9saXRlcmFsPiBjbGF1c2UgY2Fubm90IGNvbnRhaW4gdm9sYXRpbGUgZnVuY3Rpb25zIG9yCisg ICAgICBhZ2dyZWdhdGVzLiBUaGUgbWF0ZXJpYWxpemVkIHZpZXcgbXVzdCBiZSBhbHJlYWR5IHBv cHVsYXRlZCB0byB1c2UgdGhpcyBvcHRpb24uCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVt PgorICAgPC92YXJsaXN0ZW50cnk+CiAgIDwvdmFyaWFibGVsaXN0PgogIDwvcmVmc2VjdDE+CiAK QEAgLTEyNSw3ICsxNTcsMTcgQEAgUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBvcmRlcl9zdW1t YXJ5OwogICAgc3RhdGU6CiA8cHJvZ3JhbWxpc3Rpbmc+CiBSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIGFubnVhbF9zdGF0aXN0aWNzX2Jhc2lzIFdJVEggTk8gREFUQTsKKzwvcHJvZ3JhbWxpc3Rp bmc+CisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIFRoaXMgY29tbWFuZCB3aWxsIHVwZGF0ZSBv bmx5IHRoZSByb3dzIGluIHRoZSBtYXRlcmlhbGl6ZWQgdmlldworICAgPGxpdGVyYWw+b3JkZXJf c3VtbWFyeTwvbGl0ZXJhbD4gd2hlcmUgdGhlIDxsaXRlcmFsPm9yZGVyX2RhdGU8L2xpdGVyYWw+ CisgICBpcyBpbiB0aGUgeWVhciAyMDI0OgorPHByb2dyYW1saXN0aW5nPgorUkVGUkVTSCBNQVRF UklBTElaRUQgVklFVyBvcmRlcl9zdW1tYXJ5IFdIRVJFIG9yZGVyX2RhdGUgPj0gJzIwMjQtMDEt MDEnIEFORCBvcmRlcl9kYXRlICZsdDsgJzIwMjUtMDEtMDEnOwogPC9wcm9ncmFtbGlzdGluZz48 L3BhcmE+CisKICA8L3JlZnNlY3QxPgogCiAgPHJlZnNlY3QxPgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvY3JlYXRlYXMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NyZWF0ZWFz LmMKaW5kZXggMWNjYzJlNTVjNjQuLmNlNDBiMTYzZDZmIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9jcmVhdGVhcy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NyZWF0ZWFz LmMKQEAgLTI5Myw4ICsyOTMsOCBAQCBFeGVjQ3JlYXRlVGFibGVBcyhQYXJzZVN0YXRlICpwc3Rh dGUsIENyZWF0ZVRhYmxlQXNTdG10ICpzdG10LAogCQkgKiByZWR1Y2VzIHRoZSBjaGFuY2UgdGhh dCBhIHN1YnNlcXVlbnQgcmVmcmVzaCB3aWxsIGZhaWwuCiAJCSAqLwogCQlpZiAoZG9fcmVmcmVz aCkKLQkJCVJlZnJlc2hNYXRWaWV3QnlPaWQoYWRkcmVzcy5vYmplY3RJZCwgdHJ1ZSwgZmFsc2Us IGZhbHNlLAotCQkJCQkJCQlwc3RhdGUtPnBfc291cmNldGV4dCwgcWMpOworCQkJUmVmcmVzaE1h dFZpZXdCeU9pZChhZGRyZXNzLm9iamVjdElkLCB0cnVlLCBmYWxzZSwgZmFsc2UsIE5VTEwsCisJ CQkJCQkJCXBzdGF0ZS0+cF9zb3VyY2V0ZXh0LCBwYXJhbXMsIHFjKTsKIAogCX0KIAllbHNlCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9tYXR2aWV3LmMgYi9zcmMvYmFja2VuZC9j b21tYW5kcy9tYXR2aWV3LmMKaW5kZXggYTVjNTc5Y2UxMTIuLjgyMTI2OTcwNmU1IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9tYXR2aWV3LmMKKysrIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvbWF0dmlldy5jCkBAIC0zMiwxMiArMzIsMjAgQEAKICNpbmNsdWRlICJleGVjdXRvci9z cGkuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKKyNpbmNs dWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCisjaW5jbHVkZSAicGFyc2VyL3BhcnNlX2NsYXVz ZS5oIgorI2luY2x1ZGUgInBhcnNlci9wYXJzZV9jb2VyY2UuaCIKKyNpbmNsdWRlICJwYXJzZXIv cGFyc2VfZXhwci5oIgorI2luY2x1ZGUgInBhcnNlci9wYXJzZV9yZWxhdGlvbi5oIgogI2luY2x1 ZGUgInJld3JpdGUvcmV3cml0ZUhhbmRsZXIuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIK ICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIK KyNpbmNsdWRlICJ1dGlscy9oc2VhcmNoLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgi CisjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKKyNp bmNsdWRlICJ1dGlscy9ydWxldXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCiAj aW5jbHVkZSAidXRpbHMvc3lzY2FjaGUuaCIKIApAQCAtNTMsNiArNjEsMjggQEAgdHlwZWRlZiBz dHJ1Y3QKIAlCdWxrSW5zZXJ0U3RhdGUgYmlzdGF0ZTsJLyogYnVsayBpbnNlcnQgc3RhdGUgKi8K IH0gRFJfdHJhbnNpZW50cmVsOwogCisvKgorICogU2Vzc2lvbi1sZXZlbCBjYWNoZSBmb3IgUGFy dGlhbCBSZWZyZXNoIHBsYW5zLgorICogV2UgY2FjaGUgdGhlIHByZXBhcmVkIFNQSSBwbGFucyBm b3IgdGhlIERFTEVURSBhbmQgSU5TRVJUL1VQU0VSVCBzdGVwcworICogdG8gYXZvaWQgZXhwZW5z aXZlIGRlY29tcGlsYXRpb24gKHBnX2dldF92aWV3ZGVmKSBhbmQgcGFyc2luZyBvbiBldmVyeSBl eGVjdXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1hdFZpZXdQYXJ0aWFsUmVmcmVzaENhY2hl Cit7CisJT2lkCQkJbWF0dmlld09pZDsJCS8qIEhhc2ggS2V5ICovCisKKwkvKiBWYWxpZGF0aW9u IGZpZWxkcyAqLworCU9pZAkJCXVuaXF1ZUluZGV4T2lkOyAvKiBUaGUgdW5pcXVlIGluZGV4IHVz ZWQgZm9yIGNvbmZsaWN0CisJCQkJCQkJCSAqIHJlc29sdXRpb24gKi8KKwljaGFyCSAgICp3aGVy ZUNsYXVzZVN0cjsgLyogVGhlIFdIRVJFIGNsYXVzZSBzdHJpbmcgdXNlZCB0byBidWlsZCB0aGUK KwkJCQkJCQkJICogcGxhbnMgKi8KKworCS8qIFRoZSBjYWNoZWQgcGxhbnMgKi8KKwlTUElQbGFu UHRyCWRlbGV0ZVBsYW47CisJU1BJUGxhblB0cgl1cHNlcnRQbGFuOworfQkJCU1hdFZpZXdQYXJ0 aWFsUmVmcmVzaENhY2hlOworCitzdGF0aWMgSFRBQiAqTWF0Vmlld1JlZnJlc2hDYWNoZSA9IE5V TEw7CisKIHN0YXRpYyBpbnQJbWF0dmlld19tYWludGVuYW5jZV9kZXB0aCA9IDA7CiAKIHN0YXRp YyB2b2lkIHRyYW5zaWVudHJlbF9zdGFydHVwKERlc3RSZWNlaXZlciAqc2VsZiwgaW50IG9wZXJh dGlvbiwgVHVwbGVEZXNjIHR5cGVpbmZvKTsKQEAgLTYyLDExICs5MiwxOSBAQCBzdGF0aWMgdm9p ZCB0cmFuc2llbnRyZWxfZGVzdHJveShEZXN0UmVjZWl2ZXIgKnNlbGYpOwogc3RhdGljIHVpbnQ2 NCByZWZyZXNoX21hdHZpZXdfZGF0YWZpbGwoRGVzdFJlY2VpdmVyICpkZXN0LCBRdWVyeSAqcXVl cnksCiAJCQkJCQkJCQkgICBjb25zdCBjaGFyICpxdWVyeVN0cmluZywgYm9vbCBpc19jcmVhdGUp Owogc3RhdGljIHZvaWQgcmVmcmVzaF9ieV9tYXRjaF9tZXJnZShPaWQgbWF0dmlld09pZCwgT2lk IHRlbXBPaWQsIE9pZCByZWxvd25lciwKLQkJCQkJCQkJICAgaW50IHNhdmVfc2VjX2NvbnRleHQp OworCQkJCQkJCQkgICBpbnQgc2F2ZV9zZWNfY29udGV4dCwgY2hhciAqd2hlcmVDbGF1c2VTdHIs CisJCQkJCQkJCSAgIFBhcmFtTGlzdEluZm8gcGFyYW1zKTsKK3N0YXRpYyB2b2lkIHJlZnJlc2hf YnlfZGlyZWN0X21vZGlmaWNhdGlvbihPaWQgbWF0dmlld09pZCwgT2lkIHJlbG93bmVyLAorCQkJ CQkJCQkJCSAgIGludCBzYXZlX3NlY19jb250ZXh0LCBjaGFyICp3aGVyZUNsYXVzZVN0ciwKKwkJ CQkJCQkJCQkgICBQYXJhbUxpc3RJbmZvIHBhcmFtcyk7CiBzdGF0aWMgdm9pZCByZWZyZXNoX2J5 X2hlYXBfc3dhcChPaWQgbWF0dmlld09pZCwgT2lkIE9JRE5ld0hlYXAsIGNoYXIgcmVscGVyc2lz dGVuY2UpOwogc3RhdGljIGJvb2wgaXNfdXNhYmxlX3VuaXF1ZV9pbmRleChSZWxhdGlvbiBpbmRl eFJlbCk7CiBzdGF0aWMgdm9pZCBPcGVuTWF0Vmlld0luY3JlbWVudGFsTWFpbnRlbmFuY2Uodm9p ZCk7CiBzdGF0aWMgdm9pZCBDbG9zZU1hdFZpZXdJbmNyZW1lbnRhbE1haW50ZW5hbmNlKHZvaWQp Oworc3RhdGljIGludAltYXR2aWV3X2V4ZWN1dGVfc3BpKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFBh cmFtTGlzdEluZm8gcGFyYW1zLCBib29sIHJlYWRfb25seSk7CitzdGF0aWMgaW50CW1hdHZpZXdf ZXhlY3V0ZV9zcGlfcGxhbihTUElQbGFuUHRyIHBsYW4sIFBhcmFtTGlzdEluZm8gcGFyYW1zLCBi b29sIHJlYWRfb25seSk7CitzdGF0aWMgY2hhciAqZ2V0X21hdHZpZXdfdmlld19xdWVyeShPaWQg bWF0dmlld09pZCk7CitzdGF0aWMgdm9pZCBJbml0TWF0Vmlld0NhY2hlKHZvaWQpOwogCiAvKgog ICogU2V0TWF0Vmlld1BvcHVsYXRlZFN0YXRlCkBAIC03OSw5ICsxMTcsMTcgQEAgU2V0TWF0Vmll d1BvcHVsYXRlZFN0YXRlKFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIG5ld3N0YXRlKQogewogCVJl bGF0aW9uCXBncmVsOwogCUhlYXBUdXBsZQl0dXBsZTsKKwlGb3JtX3BnX2NsYXNzIGNsYXNzRm9y bTsKIAogCUFzc2VydChyZWxhdGlvbi0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfTUFUVklF Vyk7CiAKKwkvKgorCSAqIElmIHRoZSBzdGF0ZSBtYXRjaGVzLCBkbyBub3RoaW5nLiBUaGlzIHBy ZXZlbnRzIGNhY2hlIGludmFsaWRhdGlvbgorCSAqIHN0b3JtcyB3aGVuIGRvaW5nIGZyZXF1ZW50 IHBhcnRpYWwgcmVmcmVzaGVzIHZpYSB0cmlnZ2Vycy4KKwkgKi8KKwlpZiAocmVsYXRpb24tPnJk X3JlbC0+cmVsaXNwb3B1bGF0ZWQgPT0gbmV3c3RhdGUpCisJCXJldHVybjsKKwogCS8qCiAJICog VXBkYXRlIHJlbGF0aW9uJ3MgcGdfY2xhc3MgZW50cnkuICBDcnVjaWFsIHNpZGUtZWZmZWN0OiBv dGhlciBiYWNrZW5kcwogCSAqIChhbmQgdGhpcyBvbmUgdG9vISkgYXJlIHNlbnQgU0kgbWVzc2Fn ZSB0byBtYWtlIHRoZW0gcmVidWlsZCByZWxjYWNoZQpAQCAtOTQsOSArMTQwLDEzIEBAIFNldE1h dFZpZXdQb3B1bGF0ZWRTdGF0ZShSZWxhdGlvbiByZWxhdGlvbiwgYm9vbCBuZXdzdGF0ZSkKIAkJ ZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0aW9uICV1IiwKIAkJCSBS ZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSk7CiAKLQkoKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVD VCh0dXBsZSkpLT5yZWxpc3BvcHVsYXRlZCA9IG5ld3N0YXRlOworCWNsYXNzRm9ybSA9IChGb3Jt X3BnX2NsYXNzKSBHRVRTVFJVQ1QodHVwbGUpOwogCi0JQ2F0YWxvZ1R1cGxlVXBkYXRlKHBncmVs LCAmdHVwbGUtPnRfc2VsZiwgdHVwbGUpOworCWlmIChjbGFzc0Zvcm0tPnJlbGlzcG9wdWxhdGVk ICE9IG5ld3N0YXRlKQorCXsKKwkJY2xhc3NGb3JtLT5yZWxpc3BvcHVsYXRlZCA9IG5ld3N0YXRl OworCQlDYXRhbG9nVHVwbGVVcGRhdGUocGdyZWwsICZ0dXBsZS0+dF9zZWxmLCB0dXBsZSk7CisJ fQogCiAJaGVhcF9mcmVldHVwbGUodHVwbGUpOwogCXRhYmxlX2Nsb3NlKHBncmVsLCBSb3dFeGNs dXNpdmVMb2NrKTsKQEAgLTEwOCw1MSArMTU4LDIyNiBAQCBTZXRNYXRWaWV3UG9wdWxhdGVkU3Rh dGUoUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgbmV3c3RhdGUpCiAJQ29tbWFuZENvdW50ZXJJbmNy ZW1lbnQoKTsKIH0KIAorLyoKKyAqIEhvb2sgdG8gYWxsb3cgcGFyYW1ldGVycyAoZS5nLiAkMSkg aW4gdGhlIFdIRVJFIGNsYXVzZS4KKyAqLworc3RhdGljIE5vZGUgKgorcmVmcmVzaF9wYXJhbXJl Zl9ob29rKFBhcnNlU3RhdGUgKnBzdGF0ZSwgUGFyYW1SZWYgKnByZWYpCit7CisJUGFyYW1MaXN0 SW5mbyBwYXJhbXMgPSAoUGFyYW1MaXN0SW5mbykgcHN0YXRlLT5wX3JlZl9ob29rX3N0YXRlOwor CVBhcmFtCSAgICpwYXJhbTsKKworCXBhcmFtID0gbWFrZU5vZGUoUGFyYW0pOworCXBhcmFtLT5w YXJhbWtpbmQgPSBQQVJBTV9FWFRFUk47CisJcGFyYW0tPnBhcmFtaWQgPSBwcmVmLT5udW1iZXI7 CisJcGFyYW0tPnBhcmFtdHlwZSA9IFVOS05PV05PSUQ7CisJcGFyYW0tPnBhcmFtdHlwbW9kID0g LTE7CisJcGFyYW0tPnBhcmFtY29sbGlkID0gSW52YWxpZE9pZDsKKwlwYXJhbS0+bG9jYXRpb24g PSBwcmVmLT5sb2NhdGlvbjsKKworCWlmIChwYXJhbXMgJiYgcHJlZi0+bnVtYmVyID4gMCAmJiBw cmVmLT5udW1iZXIgPD0gcGFyYW1zLT5udW1QYXJhbXMpCisJeworCQlPaWQJCQlwdHlwZSA9IHBh cmFtcy0+cGFyYW1zW3ByZWYtPm51bWJlciAtIDFdLnB0eXBlOworCisJCWlmIChPaWRJc1ZhbGlk KHB0eXBlKSkKKwkJCXBhcmFtLT5wYXJhbXR5cGUgPSBwdHlwZTsKKwl9CisKKwlyZXR1cm4gKE5v ZGUgKikgcGFyYW07Cit9CisKKy8qCisgKiBUcmFuc2Zvcm0gdGhlIFdIRVJFIGNsYXVzZSBmb3Ig UkVGUkVTSCBNQVRFUklBTElaRUQgVklFVy4KKyAqLworc3RhdGljIE5vZGUgKgordHJhbnNmb3Jt UmVmcmVzaFdoZXJlQ2xhdXNlKE9pZCByZWxpZCwgTm9kZSAqd2hlcmVDbGF1c2UsIFBhcmFtTGlz dEluZm8gcGFyYW1zKQoreworCVBhcnNlU3RhdGUgKnBzdGF0ZSA9IG1ha2VfcGFyc2VzdGF0ZShO VUxMKTsKKwlSZWxhdGlvbglyZWwgPSB0YWJsZV9vcGVuKHJlbGlkLCBOb0xvY2spOworCVBhcnNl TmFtZXNwYWNlSXRlbSAqbnNpdGVtOworCU5vZGUJICAgKnJlc3VsdDsKKworCXBzdGF0ZS0+cF9w YXJhbXJlZl9ob29rID0gcmVmcmVzaF9wYXJhbXJlZl9ob29rOworCXBzdGF0ZS0+cF9yZWZfaG9v a19zdGF0ZSA9ICh2b2lkICopIHBhcmFtczsKKworCW5zaXRlbSA9IGFkZFJhbmdlVGFibGVFbnRy eUZvclJlbGF0aW9uKHBzdGF0ZSwgcmVsLCBBY2Nlc3NTaGFyZUxvY2ssIE5VTEwsIGZhbHNlLCB0 cnVlKTsKKwlhZGROU0l0ZW1Ub1F1ZXJ5KHBzdGF0ZSwgbnNpdGVtLCBmYWxzZSwgdHJ1ZSwgdHJ1 ZSk7CisKKwlyZXN1bHQgPSB0cmFuc2Zvcm1FeHByKHBzdGF0ZSwgd2hlcmVDbGF1c2UsIEVYUFJf S0lORF9XSEVSRSk7CisJcmVzdWx0ID0gY29lcmNlX3RvX2Jvb2xlYW4ocHN0YXRlLCByZXN1bHQs ICJXSEVSRSIpOworCisJaWYgKGNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25zKHJlc3VsdCkpCisJ CWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAorCQkJCSBlcnJtc2coIldIRVJFIGNsYXVzZSBpbiBSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIGNhbm5vdCBjb250YWluIHZvbGF0aWxlIGZ1bmN0aW9ucyIpKSk7CisKKwlpZiAocHN0YXRl LT5wX2hhc0FnZ3MpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9HUk9V UElOR19FUlJPUiksCisJCQkJIGVycm1zZygiV0hFUkUgY2xhdXNlIGluIFJFRlJFU0ggTUFURVJJ QUxJWkVEIFZJRVcgY2Fubm90IGNvbnRhaW4gYWdncmVnYXRlcyIpKSk7CisKKwl0YWJsZV9jbG9z ZShyZWwsIE5vTG9jayk7CisJZnJlZV9wYXJzZXN0YXRlKHBzdGF0ZSk7CisKKwlyZXR1cm4gcmVz dWx0OworfQorCitzdGF0aWMgY2hhciAqCitkZXBhcnNlUmVmcmVzaFdoZXJlQ2xhdXNlKE9pZCBy ZWxpZCwgTm9kZSAqd2hlcmVDbGF1c2UpCit7CisJcmV0dXJuIFRleHREYXR1bUdldENTdHJpbmco RGlyZWN0RnVuY3Rpb25DYWxsMihwZ19nZXRfZXhwciwKKwkJCQkJCQkJCQkJCSAgIENTdHJpbmdH ZXRUZXh0RGF0dW0obm9kZVRvU3RyaW5nKHdoZXJlQ2xhdXNlKSksCisJCQkJCQkJCQkJCQkgICBP YmplY3RJZEdldERhdHVtKHJlbGlkKSkpOworfQorCisvKgorICogSGVscGVyIHRvIGV4ZWN1dGUg U1BJIGNvbW1hbmRzIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludAor bWF0dmlld19leGVjdXRlX3NwaShjb25zdCBjaGFyICpjb21tYW5kLCBQYXJhbUxpc3RJbmZvIHBh cmFtcywgYm9vbCByZWFkX29ubHkpCit7CisJaWYgKHBhcmFtcyAmJiBwYXJhbXMtPm51bVBhcmFt cyA+IDApCisJeworCQlPaWQJCSAgICphcmd0eXBlczsKKwkJRGF0dW0JICAgKmFyZ3ZhbHVlczsK KwkJY2hhcgkgICAqbnVsbHM7CisJCWludAkJCWk7CisJCWludAkJCXJlczsKKworCQlhcmd0eXBl cyA9IChPaWQgKikgcGFsbG9jKHBhcmFtcy0+bnVtUGFyYW1zICogc2l6ZW9mKE9pZCkpOworCQlh cmd2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jKHBhcmFtcy0+bnVtUGFyYW1zICogc2l6ZW9mKERh dHVtKSk7CisJCW51bGxzID0gKGNoYXIgKikgcGFsbG9jKHBhcmFtcy0+bnVtUGFyYW1zICogc2l6 ZW9mKGNoYXIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5udW1QYXJhbXM7IGkrKykK KwkJeworCQkJUGFyYW1FeHRlcm5EYXRhICpwcm0gPSAmcGFyYW1zLT5wYXJhbXNbaV07CisKKwkJ CWFyZ3R5cGVzW2ldID0gcHJtLT5wdHlwZTsKKwkJCWFyZ3ZhbHVlc1tpXSA9IHBybS0+dmFsdWU7 CisJCQludWxsc1tpXSA9IHBybS0+aXNudWxsID8gJ24nIDogJyAnOworCQl9CisKKwkJcmVzID0g U1BJX2V4ZWN1dGVfd2l0aF9hcmdzKGNvbW1hbmQsIHBhcmFtcy0+bnVtUGFyYW1zLCBhcmd0eXBl cywKKwkJCQkJCQkJCWFyZ3ZhbHVlcywgbnVsbHMsIHJlYWRfb25seSwgMCk7CisKKwkJcGZyZWUo YXJndHlwZXMpOworCQlwZnJlZShhcmd2YWx1ZXMpOworCQlwZnJlZShudWxscyk7CisKKwkJcmV0 dXJuIHJlczsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIFNQSV9leGVjKGNvbW1hbmQsIDApOwor CX0KK30KKworLyoKKyAqIEhlbHBlciB0byBleGVjdXRlIFByZXBhcmVkIFNQSSBQbGFucyB3aXRo IG9wdGlvbmFsIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbnQKK21hdHZpZXdfZXhlY3V0ZV9z cGlfcGxhbihTUElQbGFuUHRyIHBsYW4sIFBhcmFtTGlzdEluZm8gcGFyYW1zLCBib29sIHJlYWRf b25seSkKK3sKKwlpZiAocGFyYW1zICYmIHBhcmFtcy0+bnVtUGFyYW1zID4gMCkKKwl7CisJCURh dHVtCSAgICphcmd2YWx1ZXM7CisJCWNoYXIJICAgKm51bGxzOworCQlpbnQJCQlpOworCQlpbnQJ CQlyZXM7CisKKwkJYXJndmFsdWVzID0gKERhdHVtICopIHBhbGxvYyhwYXJhbXMtPm51bVBhcmFt cyAqIHNpemVvZihEYXR1bSkpOworCQludWxscyA9IChjaGFyICopIHBhbGxvYyhwYXJhbXMtPm51 bVBhcmFtcyAqIHNpemVvZihjaGFyKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVt UGFyYW1zOyBpKyspCisJCXsKKwkJCVBhcmFtRXh0ZXJuRGF0YSAqcHJtID0gJnBhcmFtcy0+cGFy YW1zW2ldOworCisJCQlhcmd2YWx1ZXNbaV0gPSBwcm0tPnZhbHVlOworCQkJbnVsbHNbaV0gPSBw cm0tPmlzbnVsbCA/ICduJyA6ICcgJzsKKwkJfQorCisJCXJlcyA9IFNQSV9leGVjdXRlX3BsYW4o cGxhbiwgYXJndmFsdWVzLCBudWxscywgcmVhZF9vbmx5LCAwKTsKKworCQlwZnJlZShhcmd2YWx1 ZXMpOworCQlwZnJlZShudWxscyk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJZWxzZQorCXsKKwkJ cmV0dXJuIFNQSV9leGVjdXRlX3BsYW4ocGxhbiwgTlVMTCwgTlVMTCwgcmVhZF9vbmx5LCAwKTsK Kwl9Cit9CisKIC8qCiAgKiBFeGVjUmVmcmVzaE1hdFZpZXcgLS0gZXhlY3V0ZSBhIFJFRlJFU0gg TUFURVJJQUxJWkVEIFZJRVcgY29tbWFuZAogICoKLSAqIElmIFdJVEggTk8gREFUQSB3YXMgc3Bl Y2lmaWVkLCB0aGlzIGlzIGVmZmVjdGl2ZWx5IGxpa2UgYSBUUlVOQ0FURTsKLSAqIG90aGVyd2lz ZSBpdCBpcyBsaWtlIGEgVFJVTkNBVEUgZm9sbG93ZWQgYnkgYW4gSU5TRVJUIHVzaW5nIHRoZSBT RUxFQ1QKLSAqIHN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hdGVyaWFsaXplZCB2aWV3 LiAgVGhlIHN0YXRlbWVudCBub2RlJ3MKLSAqIHNraXBEYXRhIGZpZWxkIHNob3dzIHdoZXRoZXIg dGhlIGNsYXVzZSB3YXMgdXNlZC4KKyAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBSRUZS RVNIIE1BVEVSSUFMSVpFRCBWSUVXLiAgSXQgaGFuZGxlczoKKyAqCisgKiAtIFdJVEggTk8gREFU QTogZWZmZWN0aXZlbHkgbGlrZSBhIFRSVU5DQVRFLgorICogLSBDT05DVVJSRU5UTFk6IGRpZmYt YmFzZWQgcmVmcmVzaCBhbGxvd2luZyBjb25jdXJyZW50IHJlYWRzLgorICogLSBXSEVSRSBjbGF1 c2U6IHBhcnRpYWwgcmVmcmVzaCBvZiBhIHN1YnNldCBvZiByb3dzLgorICogLSBEZWZhdWx0OiBm dWxsIHJlYnVpbGQgdmlhIGhlYXAgc3dhcC4KKyAqCisgKiBUaGUgc3RhdGVtZW50IG5vZGUncyBz a2lwRGF0YSBmaWVsZCBzaG93cyB3aGV0aGVyIFdJVEggTk8gREFUQSB3YXMgdXNlZC4KICAqLwog T2JqZWN0QWRkcmVzcwogRXhlY1JlZnJlc2hNYXRWaWV3KFJlZnJlc2hNYXRWaWV3U3RtdCAqc3Rt dCwgY29uc3QgY2hhciAqcXVlcnlTdHJpbmcsCi0JCQkJICAgUXVlcnlDb21wbGV0aW9uICpxYykK KwkJCQkgICBQYXJhbUxpc3RJbmZvIHBhcmFtcywgUXVlcnlDb21wbGV0aW9uICpxYykKIHsKIAlP aWQJCQltYXR2aWV3T2lkOwogCUxPQ0tNT0RFCWxvY2ttb2RlOwogCi0JLyogRGV0ZXJtaW5lIHN0 cmVuZ3RoIG9mIGxvY2sgbmVlZGVkLiAqLwotCWxvY2ttb2RlID0gc3RtdC0+Y29uY3VycmVudCA/ IEV4Y2x1c2l2ZUxvY2sgOiBBY2Nlc3NFeGNsdXNpdmVMb2NrOwotCiAJLyoKLQkgKiBHZXQgYSBs b2NrIHVudGlsIGVuZCBvZiB0cmFuc2FjdGlvbi4KKwkgKiBEZXRlcm1pbmUgc3RyZW5ndGggb2Yg bG9jayBuZWVkZWQuCisJICoKKwkgKiBDb25jdXJyZW50IFJlZnJlc2g6IEV4Y2x1c2l2ZUxvY2su IFBhcnRpYWwgTm9uLUNvbmN1cnJlbnQgKFdIRVJFIC4uLik6CisJICogUm93RXhjbHVzaXZlTG9j ay4gRnVsbCBOb24tQ29uY3VycmVudDogQWNjZXNzRXhjbHVzaXZlTG9jay4KIAkgKi8KKwlpZiAo c3RtdC0+Y29uY3VycmVudCkKKwkJbG9ja21vZGUgPSBFeGNsdXNpdmVMb2NrOworCWVsc2UgaWYg KHN0bXQtPndoZXJlQ2xhdXNlKQorCQlsb2NrbW9kZSA9IFJvd0V4Y2x1c2l2ZUxvY2s7CisJZWxz ZQorCQlsb2NrbW9kZSA9IEFjY2Vzc0V4Y2x1c2l2ZUxvY2s7CisKIAltYXR2aWV3T2lkID0gUmFu Z2VWYXJHZXRSZWxpZEV4dGVuZGVkKHN0bXQtPnJlbGF0aW9uLAogCQkJCQkJCQkJCSAgbG9ja21v ZGUsIDAsCiAJCQkJCQkJCQkJICBSYW5nZVZhckNhbGxiYWNrTWFpbnRhaW5zVGFibGUsCiAJCQkJ CQkJCQkJICBOVUxMKTsKIAogCXJldHVybiBSZWZyZXNoTWF0Vmlld0J5T2lkKG1hdHZpZXdPaWQs IGZhbHNlLCBzdG10LT5za2lwRGF0YSwKLQkJCQkJCQkgICBzdG10LT5jb25jdXJyZW50LCBxdWVy eVN0cmluZywgcWMpOworCQkJCQkJCSAgIHN0bXQtPmNvbmN1cnJlbnQsIHN0bXQtPndoZXJlQ2xh dXNlLAorCQkJCQkJCSAgIHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIHFjKTsKIH0KIAogLyoKICAqIFJl ZnJlc2hNYXRWaWV3QnlPaWQgLS0gcmVmcmVzaCBtYXRlcmlhbGl6ZWQgdmlldyBieSBPSUQKICAq Ci0gKiBUaGlzIHJlZnJlc2hlcyB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgYnkgY3JlYXRpbmcgYSBu ZXcgdGFibGUgYW5kIHN3YXBwaW5nCi0gKiB0aGUgcmVsZmlsZW51bWJlcnMgb2YgdGhlIG5ldyB0 YWJsZSBhbmQgdGhlIG9sZCBtYXRlcmlhbGl6ZWQgdmlldywgc28gdGhlIE9JRAotICogb2YgdGhl IG9yaWdpbmFsIG1hdGVyaWFsaXplZCB2aWV3IGlzIHByZXNlcnZlZC4gVGh1cyB3ZSBkbyBub3Qg bG9zZSBHUkFOVAotICogbm9yIHJlZmVyZW5jZXMgdG8gdGhpcyBtYXRlcmlhbGl6ZWQgdmlldy4K KyAqIFRoaXMgcmVmcmVzaGVzIGEgbWF0ZXJpYWxpemVkIHZpZXcgdXNpbmcgb25lIG9mIHRocmVl IHN0cmF0ZWdpZXM6CisgKgorICogMS4gUGFydGlhbCBub24tY29uY3VycmVudCAoV0hFUkUgY2xh dXNlLCBubyBDT05DVVJSRU5UTFkpOgorICogICAgRGlyZWN0bHkgbW9kaWZpZXMgdGhlIG1hdHZp ZXcgaW4tcGxhY2UgdXNpbmcgREVMRVRFL0lOU0VSVCBvciB1cHNlcnQuCisgKiAgICBVc2VzIFJv d0V4Y2x1c2l2ZUxvY2ssIGFsbG93aW5nIGNvbmN1cnJlbnQgcmVhZHMgYnV0IGJsb2NraW5nIHdy aXRlcy4KKyAqCisgKiAyLiBDb25jdXJyZW50IChDT05DVVJSRU5UTFksIHdpdGggb3Igd2l0aG91 dCBXSEVSRSBjbGF1c2UpOgorICogICAgQ3JlYXRlcyBhIHRlbXBvcmFyeSB0YWJsZSB3aXRoIG5l dyBkYXRhLCBjb21wdXRlcyBhIGRpZmYgYWdhaW5zdAorICogICAgdGhlIGV4aXN0aW5nIG1hdHZp ZXcsIGFuZCBhcHBsaWVzIGNoYW5nZXMuICBVc2VzIEV4Y2x1c2l2ZUxvY2ssCisgKiAgICBhbGxv d2luZyBjb25jdXJyZW50IHJlYWRzIHRocm91Z2hvdXQgdGhlIG9wZXJhdGlvbi4KKyAqCisgKiAz LiBGdWxsIHJlYnVpbGQgKGRlZmF1bHQsIG5vIFdIRVJFLCBubyBDT05DVVJSRU5UTFkpOgorICog ICAgQ3JlYXRlcyBhIG5ldyBoZWFwLCBwb3B1bGF0ZXMgaXQsIGFuZCBzd2FwcyByZWxmaWxlbnVt YmVycy4KKyAqICAgIFVzZXMgQWNjZXNzRXhjbHVzaXZlTG9jaywgYmxvY2tpbmcgYWxsIGNvbmN1 cnJlbnQgYWNjZXNzLgorICogICAgVGhlIE9JRCBvZiB0aGUgb3JpZ2luYWwgbWF0ZXJpYWxpemVk IHZpZXcgaXMgcHJlc2VydmVkLCBzbyB3ZQorICogICAgZG8gbm90IGxvc2UgR1JBTlQgbm9yIHJl ZmVyZW5jZXMgdG8gdGhpcyBtYXRlcmlhbGl6ZWQgdmlldy4KICAqCiAgKiBJZiBza2lwRGF0YSBp cyB0cnVlLCB0aGlzIGlzIGVmZmVjdGl2ZWx5IGxpa2UgYSBUUlVOQ0FURTsgb3RoZXJ3aXNlIGl0 IGlzCiAgKiBsaWtlIGEgVFJVTkNBVEUgZm9sbG93ZWQgYnkgYW4gSU5TRVJUIHVzaW5nIHRoZSBT RUxFQ1Qgc3RhdGVtZW50IGFzc29jaWF0ZWQKICAqIHdpdGggdGhlIG1hdGVyaWFsaXplZCB2aWV3 LgogICoKLSAqIEluZGV4ZXMgYXJlIHJlYnVpbHQgdG9vLCB2aWEgUkVJTkRFWC4gU2luY2Ugd2Ug YXJlIGVmZmVjdGl2ZWx5IGJ1bGstbG9hZGluZwotICogdGhlIG5ldyBoZWFwLCBpdCdzIGJldHRl ciB0byBjcmVhdGUgdGhlIGluZGV4ZXMgYWZ0ZXJ3YXJkcyB0aGFuIHRvIGZpbGwgdGhlbQotICog aW5jcmVtZW50YWxseSB3aGlsZSB3ZSBsb2FkLgorICogRm9yIGZ1bGwgcmVidWlsZCwgaW5kZXhl cyBhcmUgcmVidWlsdCB0b28sIHZpYSBSRUlOREVYLiAgU2luY2Ugd2UgYXJlCisgKiBlZmZlY3Rp dmVseSBidWxrLWxvYWRpbmcgdGhlIG5ldyBoZWFwLCBpdCdzIGJldHRlciB0byBjcmVhdGUgdGhl IGluZGV4ZXMKKyAqIGFmdGVyd2FyZHMgdGhhbiB0byBmaWxsIHRoZW0gaW5jcmVtZW50YWxseSB3 aGlsZSB3ZSBsb2FkLgogICoKICAqIFRoZSBtYXR2aWV3J3MgInBvcHVsYXRlZCIgc3RhdGUgaXMg Y2hhbmdlZCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb250ZW50cwogICogcmVmbGVjdCB0aGUgcmVz dWx0IHNldCBvZiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcncyBxdWVyeS4KQEAgLTE2MiwyMiArMzg3 LDIyIEBAIEV4ZWNSZWZyZXNoTWF0VmlldyhSZWZyZXNoTWF0Vmlld1N0bXQgKnN0bXQsIGNvbnN0 IGNoYXIgKnF1ZXJ5U3RyaW5nLAogICovCiBPYmplY3RBZGRyZXNzCiBSZWZyZXNoTWF0Vmlld0J5 T2lkKE9pZCBtYXR2aWV3T2lkLCBib29sIGlzX2NyZWF0ZSwgYm9vbCBza2lwRGF0YSwKLQkJCQkJ Ym9vbCBjb25jdXJyZW50LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZywKKwkJCQkJYm9vbCBjb25j dXJyZW50LCBOb2RlICp3aGVyZUNsYXVzZSwKKwkJCQkJY29uc3QgY2hhciAqcXVlcnlTdHJpbmcs IFBhcmFtTGlzdEluZm8gcGFyYW1zLAogCQkJCQlRdWVyeUNvbXBsZXRpb24gKnFjKQogewogCVJl bGF0aW9uCW1hdHZpZXdSZWw7CiAJUmV3cml0ZVJ1bGUgKnJ1bGU7CiAJTGlzdAkgICAqYWN0aW9u czsKIAlRdWVyeQkgICAqZGF0YVF1ZXJ5OwotCU9pZAkJCXRhYmxlU3BhY2U7CiAJT2lkCQkJcmVs b3duZXI7Ci0JT2lkCQkJT0lETmV3SGVhcDsKIAl1aW50NjQJCXByb2Nlc3NlZCA9IDA7Ci0JY2hh cgkJcmVscGVyc2lzdGVuY2U7CiAJT2lkCQkJc2F2ZV91c2VyaWQ7CiAJaW50CQkJc2F2ZV9zZWNf Y29udGV4dDsKIAlpbnQJCQlzYXZlX25lc3RsZXZlbDsKIAlPYmplY3RBZGRyZXNzIGFkZHJlc3M7 CisJTm9kZQkgICAqcXVhbCA9IE5VTEw7CisJY2hhcgkgICAqcXVhbF9zdHIgPSBOVUxMOwogCiAJ bWF0dmlld1JlbCA9IHRhYmxlX29wZW4obWF0dmlld09pZCwgTm9Mb2NrKTsKIAlyZWxvd25lciA9 IG1hdHZpZXdSZWwtPnJkX3JlbC0+cmVsb3duZXI7CkBAIC0yMDYsNyArNDMxLDExIEBAIFJlZnJl c2hNYXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdPaWQsIGJvb2wgaXNfY3JlYXRlLCBib29sIHNraXBE YXRhLAogCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKIAkJCQkg ZXJybXNnKCJDT05DVVJSRU5UTFkgY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemVk IHZpZXcgaXMgbm90IHBvcHVsYXRlZCIpKSk7CiAKLQkvKiBDaGVjayB0aGF0IGNvbmZsaWN0aW5n IG9wdGlvbnMgaGF2ZSBub3QgYmVlbiBzcGVjaWZpZWQuICovCisJaWYgKHdoZXJlQ2xhdXNlICYm ICFSZWxhdGlvbklzUG9wdWxhdGVkKG1hdHZpZXdSZWwpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJ CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJX SEVSRSBjbGF1c2UgY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaXMg bm90IHBvcHVsYXRlZCIpKSk7CisKIAlpZiAoY29uY3VycmVudCAmJiBza2lwRGF0YSkKIAkJZXJl cG9ydChFUlJPUiwKIAkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCkBAIC0yNDAs NiArNDY5LDEyIEBAIFJlZnJlc2hNYXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdPaWQsIGJvb2wgaXNf Y3JlYXRlLCBib29sIHNraXBEYXRhLAogCQkJICJ0aGUgcnVsZSBmb3IgbWF0ZXJpYWxpemVkIHZp ZXcgXCIlc1wiIGlzIG5vdCBhIHNpbmdsZSBhY3Rpb24iLAogCQkJIFJlbGF0aW9uR2V0UmVsYXRp b25OYW1lKG1hdHZpZXdSZWwpKTsKIAorCWlmICh3aGVyZUNsYXVzZSkKKwl7CisJCXF1YWwgPSB0 cmFuc2Zvcm1SZWZyZXNoV2hlcmVDbGF1c2UobWF0dmlld09pZCwgd2hlcmVDbGF1c2UsIHBhcmFt cyk7CisJCXF1YWxfc3RyID0gZGVwYXJzZVJlZnJlc2hXaGVyZUNsYXVzZShtYXR2aWV3T2lkLCBx dWFsKTsKKwl9CisKIAkvKgogCSAqIENoZWNrIHRoYXQgdGhlcmUgaXMgYSB1bmlxdWUgaW5kZXgg d2l0aCBubyBXSEVSRSBjbGF1c2Ugb24gb25lIG9yIG1vcmUKIAkgKiBjb2x1bW5zIG9mIHRoZSBt YXRlcmlhbGl6ZWQgdmlldyBpZiBDT05DVVJSRU5UTFkgaXMgc3BlY2lmaWVkLgpAQCAtMjk4LDQ3 ICs1MzMsOTIgQEAgUmVmcmVzaE1hdFZpZXdCeU9pZChPaWQgbWF0dmlld09pZCwgYm9vbCBpc19j cmVhdGUsIGJvb2wgc2tpcERhdGEsCiAJICovCiAJU2V0TWF0Vmlld1BvcHVsYXRlZFN0YXRlKG1h dHZpZXdSZWwsICFza2lwRGF0YSk7CiAKLQkvKiBDb25jdXJyZW50IHJlZnJlc2ggYnVpbGRzIG5l dyBkYXRhIGluIHRlbXAgdGFibGVzcGFjZSwgYW5kIGRvZXMgZGlmZi4gKi8KLQlpZiAoY29uY3Vy cmVudCkKLQl7Ci0JCXRhYmxlU3BhY2UgPSBHZXREZWZhdWx0VGFibGVzcGFjZShSRUxQRVJTSVNU RU5DRV9URU1QLCBmYWxzZSk7Ci0JCXJlbHBlcnNpc3RlbmNlID0gUkVMUEVSU0lTVEVOQ0VfVEVN UDsKLQl9Ci0JZWxzZQotCXsKLQkJdGFibGVTcGFjZSA9IG1hdHZpZXdSZWwtPnJkX3JlbC0+cmVs dGFibGVzcGFjZTsKLQkJcmVscGVyc2lzdGVuY2UgPSBtYXR2aWV3UmVsLT5yZF9yZWwtPnJlbHBl cnNpc3RlbmNlOwotCX0KLQogCS8qCi0JICogQ3JlYXRlIHRoZSB0cmFuc2llbnQgdGFibGUgdGhh dCB3aWxsIHJlY2VpdmUgdGhlIHJlZ2VuZXJhdGVkIGRhdGEuIExvY2sKLQkgKiBpdCBhZ2FpbnN0 IGFjY2VzcyBieSBhbnkgb3RoZXIgcHJvY2VzcyB1bnRpbCBjb21taXQgKGJ5IHdoaWNoIHRpbWUg aXQKLQkgKiB3aWxsIGJlIGdvbmUpLgorCSAqIFNUUkFURUdZIDE6IFBBUlRJQUwgTk9OLUNPTkNV UlJFTlQKIAkgKi8KLQlPSUROZXdIZWFwID0gbWFrZV9uZXdfaGVhcChtYXR2aWV3T2lkLCB0YWJs ZVNwYWNlLAotCQkJCQkJCSAgIG1hdHZpZXdSZWwtPnJkX3JlbC0+cmVsYW0sCi0JCQkJCQkJICAg cmVscGVyc2lzdGVuY2UsIEV4Y2x1c2l2ZUxvY2spOwotCUFzc2VydChDaGVja1JlbGF0aW9uT2lk TG9ja2VkQnlNZShPSUROZXdIZWFwLCBBY2Nlc3NFeGNsdXNpdmVMb2NrLCBmYWxzZSkpOwotCi0J LyogR2VuZXJhdGUgdGhlIGRhdGEsIGlmIHdhbnRlZC4gKi8KLQlpZiAoIXNraXBEYXRhKQorCWlm IChxdWFsICYmICFjb25jdXJyZW50ICYmICFza2lwRGF0YSkKIAl7Ci0JCURlc3RSZWNlaXZlciAq ZGVzdDsKKwkJUEdfVFJZKCk7CisJCXsKKwkJCXJlZnJlc2hfYnlfZGlyZWN0X21vZGlmaWNhdGlv bihtYXR2aWV3T2lkLCByZWxvd25lciwKKwkJCQkJCQkJCQkgICBzYXZlX3NlY19jb250ZXh0LCBx dWFsX3N0ciwgcGFyYW1zKTsKKwkJfQorCQlQR19DQVRDSCgpOworCQl7CisJCQlQR19SRV9USFJP VygpOworCQl9CisJCVBHX0VORF9UUlkoKTsKIAotCQlkZXN0ID0gQ3JlYXRlVHJhbnNpZW50UmVs RGVzdFJlY2VpdmVyKE9JRE5ld0hlYXApOwotCQlwcm9jZXNzZWQgPSByZWZyZXNoX21hdHZpZXdf ZGF0YWZpbGwoZGVzdCwgZGF0YVF1ZXJ5LCBxdWVyeVN0cmluZywKLQkJCQkJCQkJCQkJIGlzX2Ny ZWF0ZSk7CisJCXByb2Nlc3NlZCA9IFNQSV9wcm9jZXNzZWQ7CiAJfQogCi0JLyogTWFrZSB0aGUg bWF0dmlldyBtYXRjaCB0aGUgbmV3bHkgZ2VuZXJhdGVkIGRhdGEuICovCi0JaWYgKGNvbmN1cnJl bnQpCisJLyoKKwkgKiBTVFJBVEVHWSAyOiBDT05DVVJSRU5UIChQQVJUSUFMIG9yIEZVTEwpCisJ ICovCisJZWxzZSBpZiAoY29uY3VycmVudCkKIAl7CisJCU9pZAkJCXRhYmxlU3BhY2U7CisJCWNo YXIJCXJlbHBlcnNpc3RlbmNlOworCQlPaWQJCQlPSUROZXdIZWFwOwogCQlpbnQJCQlvbGRfZGVw dGggPSBtYXR2aWV3X21haW50ZW5hbmNlX2RlcHRoOwogCisJCXRhYmxlU3BhY2UgPSBHZXREZWZh dWx0VGFibGVzcGFjZShSRUxQRVJTSVNURU5DRV9URU1QLCBmYWxzZSk7CisJCXJlbHBlcnNpc3Rl bmNlID0gUkVMUEVSU0lTVEVOQ0VfVEVNUDsKKworCQkvKgorCQkgKiBDcmVhdGUgdGhlIHRyYW5z aWVudCB0YWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVnZW5lcmF0ZWQgZGF0YS4KKwkJICog TG9jayBpdCBhZ2FpbnN0IGFjY2VzcyBieSBhbnkgb3RoZXIgcHJvY2VzcyB1bnRpbCBjb21taXQg KGJ5IHdoaWNoCisJCSAqIHRpbWUgaXQgd2lsbCBiZSBnb25lKS4KKwkJICovCisJCU9JRE5ld0hl YXAgPSBtYWtlX25ld19oZWFwKG1hdHZpZXdPaWQsIHRhYmxlU3BhY2UsCisJCQkJCQkJCSAgIG1h dHZpZXdSZWwtPnJkX3JlbC0+cmVsYW0sCisJCQkJCQkJCSAgIHJlbHBlcnNpc3RlbmNlLCBFeGNs dXNpdmVMb2NrKTsKKwkJQXNzZXJ0KENoZWNrUmVsYXRpb25PaWRMb2NrZWRCeU1lKE9JRE5ld0hl YXAsIEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssIGZhbHNlKSk7CisKKwkJLyogR2VuZXJhdGUgdGhlIGRh dGEsIGlmIHdhbnRlZC4gKi8KKwkJaWYgKCFza2lwRGF0YSkKKwkJeworCQkJaWYgKHF1YWxfc3Ry KQorCQkJeworCQkJCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwkJCQljaGFyCSAgICp2aWV3X3NxbCA9 IGdldF9tYXR2aWV3X3ZpZXdfcXVlcnkobWF0dmlld09pZCk7CisJCQkJY2hhcgkgICAqdHJhbnNp ZW50X25hbWU7CisJCQkJUmVsYXRpb24JdHJhbnNpZW50UmVsID0gdGFibGVfb3BlbihPSUROZXdI ZWFwLCBOb0xvY2spOworCisJCQkJdHJhbnNpZW50X25hbWUgPSBxdW90ZV9xdWFsaWZpZWRfaWRl bnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UodHJhbnNpZW50 UmVsKSksCisJCQkJCQkJCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZSh0cmFuc2llbnRS ZWwpKTsKKwkJCQl0YWJsZV9jbG9zZSh0cmFuc2llbnRSZWwsIE5vTG9jayk7CisKKwkJCQkvKgor CQkJCSAqIEluaXQgYnVmZmVyIGJlZm9yZSBTUEkgY29ubmVjdGlvbiB0byBhdm9pZCBkb3VibGUg ZnJlZQorCQkJCSAqIGlzc3VlcyBvbiBjb250ZXh0IGRlc3Ryb3kKKwkJCQkgKi8KKwkJCQlpbml0 U3RyaW5nSW5mbygmYnVmKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICJJTlNFUlQgSU5U TyAlcyBTRUxFQ1QgKiBGUk9NICglcykgX212X3EgV0hFUkUgJXMiLAorCQkJCQkJCQkgdHJhbnNp ZW50X25hbWUsIHZpZXdfc3FsLCBxdWFsX3N0cik7CisKKwkJCQlTUElfY29ubmVjdCgpOworCQkJ CWlmIChtYXR2aWV3X2V4ZWN1dGVfc3BpKGJ1Zi5kYXRhLCBwYXJhbXMsIGZhbHNlKSAhPSBTUElf T0tfSU5TRVJUKQorCQkJCQllbG9nKEVSUk9SLCAiU1BJX2V4ZWMgZmFpbGVkOiAlcyIsIGJ1Zi5k YXRhKTsKKwkJCQlwcm9jZXNzZWQgPSBTUElfcHJvY2Vzc2VkOworCQkJCVNQSV9maW5pc2goKTsK KwkJCQlwZnJlZSh2aWV3X3NxbCk7CisJCQkJcGZyZWUodHJhbnNpZW50X25hbWUpOworCQkJCXBm cmVlKGJ1Zi5kYXRhKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEZXN0UmVjZWl2ZXIgKmRl c3Q7CisKKwkJCQlkZXN0ID0gQ3JlYXRlVHJhbnNpZW50UmVsRGVzdFJlY2VpdmVyKE9JRE5ld0hl YXApOworCQkJCXByb2Nlc3NlZCA9IHJlZnJlc2hfbWF0dmlld19kYXRhZmlsbChkZXN0LCBkYXRh UXVlcnksIHF1ZXJ5U3RyaW5nLCBpc19jcmVhdGUpOworCQkJfQorCQl9CisKIAkJUEdfVFJZKCk7 CiAJCXsKIAkJCXJlZnJlc2hfYnlfbWF0Y2hfbWVyZ2UobWF0dmlld09pZCwgT0lETmV3SGVhcCwg cmVsb3duZXIsCi0JCQkJCQkJCSAgIHNhdmVfc2VjX2NvbnRleHQpOworCQkJCQkJCQkgICBzYXZl X3NlY19jb250ZXh0LCBxdWFsX3N0ciwgcGFyYW1zKTsKIAkJfQogCQlQR19DQVRDSCgpOwogCQl7 CkBAIC0zNDYsMTAgKzYyNiwzNCBAQCBSZWZyZXNoTWF0Vmlld0J5T2lkKE9pZCBtYXR2aWV3T2lk LCBib29sIGlzX2NyZWF0ZSwgYm9vbCBza2lwRGF0YSwKIAkJCVBHX1JFX1RIUk9XKCk7CiAJCX0K IAkJUEdfRU5EX1RSWSgpOworCiAJCUFzc2VydChtYXR2aWV3X21haW50ZW5hbmNlX2RlcHRoID09 IG9sZF9kZXB0aCk7CiAJfQorCisJLyoKKwkgKiBTVFJBVEVHWSAzOiBGVUxMIFJFQlVJTEQKKwkg Ki8KIAllbHNlCiAJeworCQlPaWQJCQl0YWJsZVNwYWNlOworCQljaGFyCQlyZWxwZXJzaXN0ZW5j ZTsKKwkJT2lkCQkJT0lETmV3SGVhcDsKKworCQl0YWJsZVNwYWNlID0gbWF0dmlld1JlbC0+cmRf cmVsLT5yZWx0YWJsZXNwYWNlOworCQlyZWxwZXJzaXN0ZW5jZSA9IG1hdHZpZXdSZWwtPnJkX3Jl bC0+cmVscGVyc2lzdGVuY2U7CisKKwkJT0lETmV3SGVhcCA9IG1ha2VfbmV3X2hlYXAobWF0dmll d09pZCwgdGFibGVTcGFjZSwKKwkJCQkJCQkJICAgbWF0dmlld1JlbC0+cmRfcmVsLT5yZWxhbSwK KwkJCQkJCQkJICAgcmVscGVyc2lzdGVuY2UsIEFjY2Vzc0V4Y2x1c2l2ZUxvY2spOworCisJCWlm ICghc2tpcERhdGEpCisJCXsKKwkJCURlc3RSZWNlaXZlciAqZGVzdDsKKworCQkJZGVzdCA9IENy ZWF0ZVRyYW5zaWVudFJlbERlc3RSZWNlaXZlcihPSUROZXdIZWFwKTsKKwkJCXByb2Nlc3NlZCA9 IHJlZnJlc2hfbWF0dmlld19kYXRhZmlsbChkZXN0LCBkYXRhUXVlcnksIHF1ZXJ5U3RyaW5nLCBp c19jcmVhdGUpOworCQl9CisKIAkJcmVmcmVzaF9ieV9oZWFwX3N3YXAobWF0dmlld09pZCwgT0lE TmV3SGVhcCwgcmVscGVyc2lzdGVuY2UpOwogCiAJCS8qCkBAIC01NTUsMTEgKzg1OSwzNDUgQEAg dHJhbnNpZW50cmVsX2Rlc3Ryb3koRGVzdFJlY2VpdmVyICpzZWxmKQogCXBmcmVlKHNlbGYpOwog fQogCisvKgorICogZ2V0X21hdHZpZXdfdmlld19xdWVyeQorICoKKyAqIFJldHJpZXZlIHRoZSBT UUwgZGVmaW5pdGlvbiBvZiBhIG1hdGVyaWFsaXplZCB2aWV3J3MgdW5kZXJseWluZyBxdWVyeS4K KyAqIFJldHVybnMgdGhlIHF1ZXJ5IHRleHQgd2l0aCB0cmFpbGluZyBzZW1pY29sb25zIGFuZCB3 aGl0ZXNwYWNlIHJlbW92ZWQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9tYXR2aWV3X3ZpZXdf cXVlcnkoT2lkIG1hdHZpZXdPaWQpCit7CisJY2hhcgkgICAqdmlld19zcWw7CisKKwl2aWV3X3Nx bCA9IFRleHREYXR1bUdldENTdHJpbmcoRGlyZWN0RnVuY3Rpb25DYWxsMihwZ19nZXRfdmlld2Rl ZiwKKwkJCQkJCQkJCQkJCQkgICBPYmplY3RJZEdldERhdHVtKG1hdHZpZXdPaWQpLAorCQkJCQkJ CQkJCQkJCSAgIEJvb2xHZXREYXR1bShmYWxzZSkpKTsKKwlpZiAodmlld19zcWwpCisJeworCQlp bnQJCQlsZW4gPSBzdHJsZW4odmlld19zcWwpOworCisJCXdoaWxlIChsZW4gPiAwICYmICh2aWV3 X3NxbFtsZW4gLSAxXSA9PSAnOycgfHwgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgdmlld19zcWxb bGVuIC0gMV0pKSkKKwkJCXZpZXdfc3FsWy0tbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB2aWV3 X3NxbDsKK30KKworc3RhdGljIHZvaWQKK0luaXRNYXRWaWV3Q2FjaGUodm9pZCkKK3sKKwlIQVNI Q1RMCQljdGw7CisKKwltZW1zZXQoJmN0bCwgMCwgc2l6ZW9mKGN0bCkpOworCWN0bC5rZXlzaXpl ID0gc2l6ZW9mKE9pZCk7CisJY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihNYXRWaWV3UGFydGlhbFJl ZnJlc2hDYWNoZSk7CisJY3RsLmhjeHQgPSBDYWNoZU1lbW9yeUNvbnRleHQ7CisKKwlNYXRWaWV3 UmVmcmVzaENhY2hlID0gaGFzaF9jcmVhdGUoIk1hdFZpZXcgUGFydGlhbCBSZWZyZXNoIENhY2hl IiwKKwkJCQkJCQkJCSAgMTYsCisJCQkJCQkJCQkgICZjdGwsCisJCQkJCQkJCQkgIEhBU0hfRUxF TSB8IEhBU0hfQkxPQlMgfCBIQVNIX0NPTlRFWFQpOworfQorCisvKgorICogcmVmcmVzaF9ieV9k aXJlY3RfbW9kaWZpY2F0aW9uCisgKgorICogU3RyYXRlZ3kgZm9yIG5vbi1jb25jdXJyZW50IHBh cnRpYWwgcmVmcmVzaCAoUkVGUkVTSCAuLi4gV0hFUkUgLi4uKS4KKyAqIERpcmVjdGx5IG1vZGlm aWVzIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBpbi1wbGFjZSB3aXRob3V0IGNyZWF0aW5nIGEKKyAq IHRlbXBvcmFyeSBoZWFwIG9yIHN3YXBwaW5nIHJlbGZpbGVudW1iZXJzLgorICoKKyAqIFNUUkFU RUdZOiBERUxFVEUgLT4gVVBTRVJUCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEg c2Vzc2lvbi1sZXZlbCBjYWNoZSB0byBzdG9yZSB0aGUgcHJlcGFyZWQgU1BJCisgKiBwbGFucyBm b3IgdGhlIERFTEVURSBhbmQgVVBTRVJUIG9wZXJhdGlvbnMuIFRoaXMgYXZvaWRzIHRoZSBvdmVy aGVhZCBvZgorICogY2FsbGluZyBwZ19nZXRfdmlld2RlZigpLCByZWNvbnN0cnVjdGluZyBTUUwg c3RyaW5ncywgYW5kIHJlLXBhcnNpbmcKKyAqIHRoZW0gb24gZXZlcnkgZXhlY3V0aW9uLgorICov CitzdGF0aWMgdm9pZAorcmVmcmVzaF9ieV9kaXJlY3RfbW9kaWZpY2F0aW9uKE9pZCBtYXR2aWV3 T2lkLCBPaWQgcmVsb3duZXIsCisJCQkJCQkJICAgaW50IHNhdmVfc2VjX2NvbnRleHQsIGNoYXIg KndoZXJlQ2xhdXNlU3RyLAorCQkJCQkJCSAgIFBhcmFtTGlzdEluZm8gcGFyYW1zKQoreworCVJl bGF0aW9uCW1hdHZpZXdSZWw7CisJT2lkCQkJdW5pcXVlSW5kZXhPaWQgPSBJbnZhbGlkT2lkOwor CUxpc3QJICAgKmluZGV4b2lkbGlzdDsKKwlMaXN0Q2VsbCAgICpsYzsKKwlNYXRWaWV3UGFydGlh bFJlZnJlc2hDYWNoZSAqY2FjaGVFbnRyeSA9IE5VTEw7CisJYm9vbAkJZm91bmQgPSBmYWxzZTsK Kwlib29sCQl1c2VfY2FjaGUgPSBmYWxzZTsKKworCS8qCisJICogU2V0dXAgYW5kIEFuYWx5c2lz IChtdXN0IGhhcHBlbiBldmVyeSB0aW1lIHRvIGxvY2F0ZSBjb3JyZWN0IGluZGV4KQorCSAqIE5v dGU6IFdlIGNvdWxkIGNhY2hlIHRoZSBpbmRleCBPSUQgdG9vLCBidXQgbG9va2luZyBpdCB1cCBp cyBjaGVhcAorCSAqIGNvbXBhcmVkIHRvIHZpZXcgZGVjb21waWxhdGlvbi4KKwkgKi8KKworCW1h dHZpZXdSZWwgPSB0YWJsZV9vcGVuKG1hdHZpZXdPaWQsIE5vTG9jayk7CisKKwkvKiBTZWFyY2gg Zm9yIGEgdXNhYmxlIHVuaXF1ZSBpbmRleCAoUEsgcHJlZmVycmVkKSAqLworCWluZGV4b2lkbGlz dCA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KG1hdHZpZXdSZWwpOworCWZvcmVhY2gobGMsIGluZGV4 b2lkbGlzdCkKKwl7CisJCU9pZAkJCWluZGV4b2lkID0gbGZpcnN0X29pZChsYyk7CisJCVJlbGF0 aW9uCWluZGV4UmVsOworCQlib29sCQl1c2FibGU7CisJCWJvb2wJCWlzX3BrOworCisJCWluZGV4 UmVsID0gaW5kZXhfb3BlbihpbmRleG9pZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJdXNhYmxlID0g aXNfdXNhYmxlX3VuaXF1ZV9pbmRleChpbmRleFJlbCk7CisJCWlzX3BrID0gaW5kZXhSZWwtPnJk X2luZGV4LT5pbmRpc3ByaW1hcnk7CisJCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworCisJCWlmICh1c2FibGUpCisJCXsKKwkJCWlmIChpc19waykKKwkJCXsKKwkJCQl1 bmlxdWVJbmRleE9pZCA9IGluZGV4b2lkOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFPaWRJ c1ZhbGlkKHVuaXF1ZUluZGV4T2lkKSkKKwkJCQl1bmlxdWVJbmRleE9pZCA9IGluZGV4b2lkOwor CQl9CisJfQorCWxpc3RfZnJlZShpbmRleG9pZGxpc3QpOworCisJaWYgKCFPaWRJc1ZhbGlkKHVu aXF1ZUluZGV4T2lkKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX09C SkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJCQkgZXJybXNnKCJjYW5ub3QgcGVy Zm9ybSBwYXJ0aWFsIHJlZnJlc2ggb24gbWF0ZXJpYWxpemVkIHZpZXcgXCIlc1wiIiwKKwkJCQkJ CVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG1hdHZpZXdSZWwpKSwKKwkJCQkgZXJyZGV0YWlsKCJQ YXJ0aWFsIHJlZnJlc2ggcmVxdWlyZXMgYSB1c2FibGUgdW5pcXVlIGluZGV4IHRvIHBlcmZvcm0g YW4gVVBTRVJUIG9wZXJhdGlvbi4iKSkpOworCisJLyoKKwkgKiBDYWNoZSBMb29rdXAKKwkgKi8K KwlpZiAoIU1hdFZpZXdSZWZyZXNoQ2FjaGUpCisJCUluaXRNYXRWaWV3Q2FjaGUoKTsKKworCWNh Y2hlRW50cnkgPSAoTWF0Vmlld1BhcnRpYWxSZWZyZXNoQ2FjaGUgKikgaGFzaF9zZWFyY2goTWF0 Vmlld1JlZnJlc2hDYWNoZSwKKwkJCQkJCQkJCQkJCQkJCSZtYXR2aWV3T2lkLAorCQkJCQkJCQkJ CQkJCQkJSEFTSF9FTlRFUiwKKwkJCQkJCQkJCQkJCQkJCSZmb3VuZCk7CisKKwlpZiAoZm91bmQp CisJeworCQkvKgorCQkgKiBWYWxpZGF0ZSB0aGUgY2FjaGUgZW50cnkuIFdlIG11c3QgZW5zdXJl IHRoZSBXSEVSRSBjbGF1c2Ugc3RyaW5nIGlzCisJCSAqIGlkZW50aWNhbCAoaW4gY2FzZSB0aGUg dXNlciBjYWxscyBkaWZmZXJlbnQgcGFydGlhbCByZWZyZXNoIHF1ZXJpZXMKKwkJICogaW4gdGhl IHNhbWUgc2Vzc2lvbikgYW5kIHRoYXQgdGhlIHVuaXF1ZSBpbmRleCBoYXMgbm90IGNoYW5nZWQK KwkJICogKGUuZy4gZHJvcC9jcmVhdGUgaW5kZXgpLgorCQkgKi8KKwkJaWYgKGNhY2hlRW50cnkt PnVuaXF1ZUluZGV4T2lkID09IHVuaXF1ZUluZGV4T2lkICYmCisJCQlzdHJjbXAoY2FjaGVFbnRy eS0+d2hlcmVDbGF1c2VTdHIsIHdoZXJlQ2xhdXNlU3RyKSA9PSAwKQorCQl7CisJCQl1c2VfY2Fj aGUgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogSW52YWxpZCBlbnRyeS4gQ2xlYW4g dXAgb2xkIHBsYW5zIGFuZCBzdHJpbmdzLiAqLworCQkJaWYgKGNhY2hlRW50cnktPmRlbGV0ZVBs YW4pCisJCQkJU1BJX2ZyZWVwbGFuKGNhY2hlRW50cnktPmRlbGV0ZVBsYW4pOworCQkJaWYgKGNh Y2hlRW50cnktPnVwc2VydFBsYW4pCisJCQkJU1BJX2ZyZWVwbGFuKGNhY2hlRW50cnktPnVwc2Vy dFBsYW4pOworCQkJaWYgKGNhY2hlRW50cnktPndoZXJlQ2xhdXNlU3RyKQorCQkJCXBmcmVlKGNh Y2hlRW50cnktPndoZXJlQ2xhdXNlU3RyKTsKKworCQkJY2FjaGVFbnRyeS0+ZGVsZXRlUGxhbiA9 IE5VTEw7CisJCQljYWNoZUVudHJ5LT51cHNlcnRQbGFuID0gTlVMTDsKKwkJCWNhY2hlRW50cnkt PndoZXJlQ2xhdXNlU3RyID0gTlVMTDsKKwkJCWZvdW5kID0gZmFsc2U7CQkvKiBGb3JjZSByZWJ1 aWxkICovCisJCX0KKwl9CisKKwlPcGVuTWF0Vmlld0luY3JlbWVudGFsTWFpbnRlbmFuY2UoKTsK KwlTUElfY29ubmVjdCgpOworCisJaWYgKHVzZV9jYWNoZSkKKwl7CisJCS8qCisJCSAqIEZBU1Qg UEFUSDogRXhlY3V0ZSBjYWNoZWQgcGxhbnMuIFNQSV9leGVjdXRlX3BsYW4gd2lsbCBoYW5kbGUK KwkJICogcmUtcGxhbm5pbmcgaWYgdW5kZXJseWluZyBzY2hlbWEgY2hhbmdlcy4KKwkJICovCisJ CWlmIChtYXR2aWV3X2V4ZWN1dGVfc3BpX3BsYW4oY2FjaGVFbnRyeS0+ZGVsZXRlUGxhbiwgcGFy YW1zLCBmYWxzZSkgPCAwKQorCQkJZWxvZyhFUlJPUiwgIlNQSV9leGVjdXRlX3BsYW4gZmFpbGVk IGR1cmluZyBkZWxldGUiKTsKKworCQlpZiAobWF0dmlld19leGVjdXRlX3NwaV9wbGFuKGNhY2hl RW50cnktPnVwc2VydFBsYW4sIHBhcmFtcywgZmFsc2UpIDwgMCkKKwkJCWVsb2coRVJST1IsICJT UElfZXhlY3V0ZV9wbGFuIGZhaWxlZCBkdXJpbmcgdXBzZXJ0Iik7CisJfQorCWVsc2UKKwl7CisJ CS8qCisJCSAqIFNMT1cgUEFUSDogQnVpbGQgU1FMLCBQcmVwYXJlLCBDYWNoZS4KKwkJICovCisJ CVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwkJY2hhcgkgICAqdmlld19zcWw7CisJCWNoYXIJICAgKm1h dHZpZXdfbmFtZTsKKwkJY29uc3QgY2hhciAqbWF0dmlld19hbGlhczsKKwkJT2lkCQkgICAqYXJn dHlwZXMgPSBOVUxMOworCQlpbnQJCQluYXJncyA9IDA7CisKKwkJbWF0dmlld19uYW1lID0gcXVv dGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFt ZXNwYWNlKG1hdHZpZXdSZWwpKSwKKwkJCQkJCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUobWF0dmlld1JlbCkpOworCQltYXR2aWV3X2FsaWFzID0gcXVvdGVfaWRlbnRpZmllcihSZWxh dGlvbkdldFJlbGF0aW9uTmFtZShtYXR2aWV3UmVsKSk7CisKKwkJaW5pdFN0cmluZ0luZm8oJmJ1 Zik7CisJCXZpZXdfc3FsID0gZ2V0X21hdHZpZXdfdmlld19xdWVyeShtYXR2aWV3T2lkKTsKKwor CQkvKiBQcmVwYXJlIGFyZ3VtZW50IHR5cGVzIGZvciBTUElfcHJlcGFyZSAqLworCQlpZiAocGFy YW1zICYmIHBhcmFtcy0+bnVtUGFyYW1zID4gMCkKKwkJeworCQkJbmFyZ3MgPSBwYXJhbXMtPm51 bVBhcmFtczsKKwkJCWFyZ3R5cGVzID0gKE9pZCAqKSBwYWxsb2MobmFyZ3MgKiBzaXplb2YoT2lk KSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCQkJYXJndHlwZXNbaV0g PSBwYXJhbXMtPnBhcmFtc1tpXS5wdHlwZTsKKwkJfQorCisJCS8qCisJCSAqIFNURVAgMTogREVM RVRFIChQcnVuZSkKKwkJICovCisJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJYXBwZW5kU3Ry aW5nSW5mbygmYnVmLAorCQkJCQkJICJERUxFVEUgRlJPTSAlcyBtdiAiCisJCQkJCQkgIldIRVJF ICglcykiLAorCQkJCQkJIG1hdHZpZXdfbmFtZSwKKwkJCQkJCSB3aGVyZUNsYXVzZVN0cik7CisK KwkJY2FjaGVFbnRyeS0+ZGVsZXRlUGxhbiA9IFNQSV9wcmVwYXJlKGJ1Zi5kYXRhLCBuYXJncywg YXJndHlwZXMpOworCQlpZiAoY2FjaGVFbnRyeS0+ZGVsZXRlUGxhbiA9PSBOVUxMKQorCQkJZWxv ZyhFUlJPUiwgIlNQSV9wcmVwYXJlIGZhaWxlZCBmb3IgZGVsZXRlOiAlcyIsIGJ1Zi5kYXRhKTsK KwkJU1BJX2tlZXBwbGFuKGNhY2hlRW50cnktPmRlbGV0ZVBsYW4pOworCisJCWlmIChtYXR2aWV3 X2V4ZWN1dGVfc3BpX3BsYW4oY2FjaGVFbnRyeS0+ZGVsZXRlUGxhbiwgcGFyYW1zLCBmYWxzZSkg PCAwKQorCQkJZWxvZyhFUlJPUiwgIlNQSV9leGVjdXRlX3BsYW4gZmFpbGVkIGR1cmluZyBkZWxl dGUiKTsKKworCQkvKgorCQkgKiBTVEVQIDI6IFVQU0VSVAorCQkgKi8KKwkJeworCQkJUmVsYXRp b24JaW5kZXhSZWw7CisJCQlGb3JtX3BnX2luZGV4IGluZGV4U3RydWN0OworCQkJVHVwbGVEZXNj CXR1cGRlc2MgPSBtYXR2aWV3UmVsLT5yZF9hdHQ7CisJCQlTdHJpbmdJbmZvRGF0YSBjb25mbGlj dF9jb2xzOworCQkJU3RyaW5nSW5mb0RhdGEgc2V0X2NsYXVzZTsKKwkJCWJvb2wJCWZpcnN0Owor CQkJYm9vbAkJaGFzX25vbl9rZXlfY29scyA9IGZhbHNlOworCQkJaW50CQkJaTsKKworCQkJaW5k ZXhSZWwgPSBpbmRleF9vcGVuKHVuaXF1ZUluZGV4T2lkLCBBY2Nlc3NTaGFyZUxvY2spOworCQkJ aW5kZXhTdHJ1Y3QgPSBpbmRleFJlbC0+cmRfaW5kZXg7CisKKwkJCWluaXRTdHJpbmdJbmZvKCZj b25mbGljdF9jb2xzKTsKKwkJCWluaXRTdHJpbmdJbmZvKCZzZXRfY2xhdXNlKTsKKworCQkJLyog QnVpbGQgT04gQ09ORkxJQ1Qga2V5cyAqLworCQkJZmlyc3QgPSB0cnVlOworCQkJZm9yIChpID0g MDsgaSA8IGluZGV4U3RydWN0LT5pbmRuYXR0czsgaSsrKQorCQkJeworCQkJCWludAkJCWF0dG51 bSA9IGluZGV4U3RydWN0LT5pbmRrZXkudmFsdWVzW2ldOworCQkJCUZvcm1fcGdfYXR0cmlidXRl IGF0dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQkJCWNoYXIJICAg KmF0dG5hbWUgPSBOYW1lU3RyKGF0dHItPmF0dG5hbWUpOworCisJCQkJaWYgKCFmaXJzdCkKKwkJ CQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY29uZmxpY3RfY29scywgIiwgIik7CisJCQkJZmly c3QgPSBmYWxzZTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZjb25mbGljdF9jb2xzLCAiJXMiLCBx dW90ZV9pZGVudGlmaWVyKGF0dG5hbWUpKTsKKwkJCX0KKworCQkJLyogQnVpbGQgVVBEQVRFIFNF VCBjbGF1c2UgKi8KKwkJCWZpcnN0ID0gdHJ1ZTsKKwkJCWZvciAoaSA9IDA7IGkgPCB0dXBkZXNj LT5uYXR0czsgaSsrKQorCQkJeworCQkJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURl c2NBdHRyKHR1cGRlc2MsIGkpOworCQkJCWNoYXIJICAgKmF0dG5hbWUgPSBOYW1lU3RyKGF0dHIt PmF0dG5hbWUpOworCQkJCWJvb2wJCWlzX2tleSA9IGZhbHNlOworCQkJCWludAkJCWo7CisKKwkJ CQlpZiAoYXR0ci0+YXR0aXNkcm9wcGVkKQorCQkJCQljb250aW51ZTsKKworCQkJCWZvciAoaiA9 IDA7IGogPCBpbmRleFN0cnVjdC0+aW5kbmF0dHM7IGorKykKKwkJCQl7CisJCQkJCWlmIChpbmRl eFN0cnVjdC0+aW5ka2V5LnZhbHVlc1tqXSA9PSAoaSArIDEpKQorCQkJCQl7CisJCQkJCQlpc19r ZXkgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoaXNfa2V5 KQorCQkJCQljb250aW51ZTsKKworCQkJCWlmICghZmlyc3QpCisJCQkJCWFwcGVuZFN0cmluZ0lu Zm9TdHJpbmcoJnNldF9jbGF1c2UsICIsICIpOworCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJaGFz X25vbl9rZXlfY29scyA9IHRydWU7CisKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZzZXRfY2xhdXNl LCAiJXMgPSBFWENMVURFRC4lcyIsCisJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKGF0dG5hbWUp LCBxdW90ZV9pZGVudGlmaWVyKGF0dG5hbWUpKTsKKwkJCX0KKworCQkJaW5kZXhfY2xvc2UoaW5k ZXhSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJ CWlmIChoYXNfbm9uX2tleV9jb2xzKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwK KwkJCQkJCQkJICJJTlNFUlQgSU5UTyAlcyAiCisJCQkJCQkJCSAiU0VMRUNUICogRlJPTSAoJXMp ICVzIFdIRVJFICglcykgIgorCQkJCQkJCQkgIk9OIENPTkZMSUNUICglcykgRE8gVVBEQVRFIFNF VCAlcyIsCisJCQkJCQkJCSBtYXR2aWV3X25hbWUsCisJCQkJCQkJCSB2aWV3X3NxbCwgbWF0dmll d19hbGlhcywgd2hlcmVDbGF1c2VTdHIsCisJCQkJCQkJCSBjb25mbGljdF9jb2xzLmRhdGEsCisJ CQkJCQkJCSBzZXRfY2xhdXNlLmRhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFwcGVu ZFN0cmluZ0luZm8oJmJ1ZiwKKwkJCQkJCQkJICJJTlNFUlQgSU5UTyAlcyAiCisJCQkJCQkJCSAi U0VMRUNUICogRlJPTSAoJXMpICVzIFdIRVJFICglcykgIgorCQkJCQkJCQkgIk9OIENPTkZMSUNU ICglcykgRE8gTk9USElORyIsCisJCQkJCQkJCSBtYXR2aWV3X25hbWUsCisJCQkJCQkJCSB2aWV3 X3NxbCwgbWF0dmlld19hbGlhcywgd2hlcmVDbGF1c2VTdHIsCisJCQkJCQkJCSBjb25mbGljdF9j b2xzLmRhdGEpOworCQkJfQorCisJCQlwZnJlZShjb25mbGljdF9jb2xzLmRhdGEpOworCQkJcGZy ZWUoc2V0X2NsYXVzZS5kYXRhKTsKKwkJfQorCisJCWNhY2hlRW50cnktPnVwc2VydFBsYW4gPSBT UElfcHJlcGFyZShidWYuZGF0YSwgbmFyZ3MsIGFyZ3R5cGVzKTsKKwkJaWYgKGNhY2hlRW50cnkt PnVwc2VydFBsYW4gPT0gTlVMTCkKKwkJCWVsb2coRVJST1IsICJTUElfcHJlcGFyZSBmYWlsZWQg Zm9yIHVwc2VydDogJXMiLCBidWYuZGF0YSk7CisJCVNQSV9rZWVwcGxhbihjYWNoZUVudHJ5LT51 cHNlcnRQbGFuKTsKKworCQlpZiAobWF0dmlld19leGVjdXRlX3NwaV9wbGFuKGNhY2hlRW50cnkt PnVwc2VydFBsYW4sIHBhcmFtcywgZmFsc2UpIDwgMCkKKwkJCWVsb2coRVJST1IsICJTUElfZXhl Y3V0ZV9wbGFuIGZhaWxlZCBkdXJpbmcgdXBzZXJ0Iik7CisKKwkJLyogVXBkYXRlIENhY2hlIE1l dGFkYXRhICovCisJCXsKKwkJCU1lbW9yeUNvbnRleHQgb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3 aXRjaFRvKENhY2hlTWVtb3J5Q29udGV4dCk7CisKKwkJCWNhY2hlRW50cnktPnVuaXF1ZUluZGV4 T2lkID0gdW5pcXVlSW5kZXhPaWQ7CisJCQljYWNoZUVudHJ5LT53aGVyZUNsYXVzZVN0ciA9IHBz dHJkdXAod2hlcmVDbGF1c2VTdHIpOworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7 CisJCX0KKworCQlwZnJlZSh2aWV3X3NxbCk7CisJCXBmcmVlKGJ1Zi5kYXRhKTsKKwkJaWYgKGFy Z3R5cGVzKQorCQkJcGZyZWUoYXJndHlwZXMpOworCX0KKworCVNQSV9maW5pc2goKTsKKwlDbG9z ZU1hdFZpZXdJbmNyZW1lbnRhbE1haW50ZW5hbmNlKCk7CisJdGFibGVfY2xvc2UobWF0dmlld1Jl bCwgTm9Mb2NrKTsKK30KKwogLyoKICAqIHJlZnJlc2hfYnlfbWF0Y2hfbWVyZ2UKICAqCiAgKiBS ZWZyZXNoIGEgbWF0ZXJpYWxpemVkIHZpZXcgd2l0aCB0cmFuc2FjdGlvbmFsIHNlbWFudGljcywg d2hpbGUgYWxsb3dpbmcKLSAqIGNvbmN1cnJlbnQgcmVhZHMuCisgKiBjb25jdXJyZW50IHJlYWRz LiAgVXNlZCBmb3IgUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBDT05DVVJSRU5UTFkuCiAgKgog ICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZGF0YSBoYXMgYmVl biBjcmVhdGVkIGluIGEKICAqIHRlbXBvcmFyeSB0YWJsZS4gIEl0IHBlcmZvcm1zIGEgZnVsbCBv dXRlciBqb2luIGFnYWluc3QgdGhlIG9sZCB2ZXJzaW9uIG9mCkBAIC01NzIsNiArMTIxMCwxMCBA QCB0cmFuc2llbnRyZWxfZGVzdHJveShEZXN0UmVjZWl2ZXIgKnNlbGYpCiAgKiBhcmUgY29uc2lz dGVudCB3aXRoIGRlZmF1bHQgYmVoYXZpb3IuICBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgVU5J UVVFCiAgKiBpbmRleCBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcsIHdlIGhhdmUgZXhhY3RseSB0 aGUgZ3VhcmFudGVlIHdlIG5lZWQuCiAgKgorICogSWYgd2hlcmVDbGF1c2VTdHIgaXMgcHJvdmlk ZWQsIG9ubHkgcm93cyBtYXRjaGluZyB0aGUgV0hFUkUgY29uZGl0aW9uCisgKiBpbiB0aGUgZXhp c3RpbmcgbWF0dmlldyBhcmUgY29uc2lkZXJlZCBmb3IgdGhlIGRpZmYgb3BlcmF0aW9uLCBlbmFi bGluZworICogcGFydGlhbCBjb25jdXJyZW50IHJlZnJlc2guCisgKgogICogVGhlIHRlbXBvcmFy eSB0YWJsZSB1c2VkIHRvIGhvbGQgdGhlIGRpZmYgcmVzdWx0cyBjb250YWlucyBqdXN0IHRoZSBU SUQgb2YKICAqIHRoZSBvbGQgcmVjb3JkIChpZiBtYXRjaGVkKSBhbmQgdGhlIFJPVyBmcm9tIHRo ZSBuZXcgdGFibGUgYXMgYSBzaW5nbGUKICAqIGNvbHVtbiBvZiBjb21wbGV4IHJlY29yZCB0eXBl IChpZiBtYXRjaGVkKS4KQEAgLTU4OSw3ICsxMjMxLDggQEAgdHJhbnNpZW50cmVsX2Rlc3Ryb3ko RGVzdFJlY2VpdmVyICpzZWxmKQogICovCiBzdGF0aWMgdm9pZAogcmVmcmVzaF9ieV9tYXRjaF9t ZXJnZShPaWQgbWF0dmlld09pZCwgT2lkIHRlbXBPaWQsIE9pZCByZWxvd25lciwKLQkJCQkJICAg aW50IHNhdmVfc2VjX2NvbnRleHQpCisJCQkJCSAgIGludCBzYXZlX3NlY19jb250ZXh0LCBjaGFy ICp3aGVyZUNsYXVzZVN0ciwKKwkJCQkJICAgUGFyYW1MaXN0SW5mbyBwYXJhbXMpCiB7CiAJU3Ry aW5nSW5mb0RhdGEgcXVlcnlidWY7CiAJUmVsYXRpb24JbWF0dmlld1JlbDsKQEAgLTcwMyw4ICsx MzQ2LDE1IEBAIHJlZnJlc2hfYnlfbWF0Y2hfbWVyZ2UoT2lkIG1hdHZpZXdPaWQsIE9pZCB0ZW1w T2lkLCBPaWQgcmVsb3duZXIsCiAJYXBwZW5kU3RyaW5nSW5mbygmcXVlcnlidWYsCiAJCQkJCSAi SU5TRVJUIElOVE8gJXMgIgogCQkJCQkgIlNFTEVDVCBtdi5jdGlkIEFTIHRpZCwgbmV3ZGF0YS4q OjolcyBBUyBuZXdkYXRhICIKLQkJCQkJICJGUk9NICVzIG12IEZVTEwgSk9JTiAlcyBuZXdkYXRh IE9OICgiLAotCQkJCQkgZGlmZm5hbWUsIHRlbXBuYW1lLCBtYXR2aWV3bmFtZSwgdGVtcG5hbWUp OworCQkJCQkgIkZST00gIiwKKwkJCQkJIGRpZmZuYW1lLCB0ZW1wbmFtZSk7CisKKwlpZiAod2hl cmVDbGF1c2VTdHIpCisJCWFwcGVuZFN0cmluZ0luZm8oJnF1ZXJ5YnVmLCAiKFNFTEVDVCBjdGlk LCAqIEZST00gJXMgV0hFUkUgJXMpIG12IiwgbWF0dmlld25hbWUsIHdoZXJlQ2xhdXNlU3RyKTsK KwllbHNlCisJCWFwcGVuZFN0cmluZ0luZm8oJnF1ZXJ5YnVmLCAiJXMgbXYiLCBtYXR2aWV3bmFt ZSk7CisKKwlhcHBlbmRTdHJpbmdJbmZvKCZxdWVyeWJ1ZiwgIiBGVUxMIEpPSU4gJXMgbmV3ZGF0 YSBPTiAoIiwgdGVtcG5hbWUpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGxpc3Qgb2YgaW5kZXggT0lE cyBmb3IgdGhlIHRhYmxlIGZyb20gdGhlIHJlbGNhY2hlLCBhbmQgbG9vayB1cApAQCAtODI2LDEz ICsxNDc2LDQyIEBAIHJlZnJlc2hfYnlfbWF0Y2hfbWVyZ2UoT2lkIG1hdHZpZXdPaWQsIE9pZCB0 ZW1wT2lkLCBPaWQgcmVsb3duZXIsCiAJCQkJZXJybXNnKCJjb3VsZCBub3QgZmluZCBzdWl0YWJs ZSB1bmlxdWUgaW5kZXggb24gbWF0ZXJpYWxpemVkIHZpZXcgXCIlc1wiIiwKIAkJCQkJICAgUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUobWF0dmlld1JlbCkpKTsKIAotCWFwcGVuZFN0cmluZ0luZm9T dHJpbmcoJnF1ZXJ5YnVmLAotCQkJCQkJICAgIiBBTkQgbmV3ZGF0YS4qIE9QRVJBVE9SKHBnX2Nh dGFsb2cuKj0pIG12LiopICIKLQkJCQkJCSAgICJXSEVSRSBuZXdkYXRhLiogSVMgTlVMTCBPUiBt di4qIElTIE5VTEwgIgotCQkJCQkJICAgIk9SREVSIEJZIHRpZCIpOworCWlmICh3aGVyZUNsYXVz ZVN0cikKKwl7CisJCVN0cmluZ0luZm9EYXRhIGNvbHM7CisJCWludAkJCWk7CisJCWJvb2wJCWZp cnN0ID0gdHJ1ZTsKKworCQlpbml0U3RyaW5nSW5mbygmY29scyk7CisJCWZvciAoaSA9IDA7IGkg PCByZWxuYXR0czsgaSsrKQorCQl7CisJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVwbGVE ZXNjQXR0cih0dXBkZXNjLCBpKTsKKworCQkJaWYgKGF0dHItPmF0dGlzZHJvcHBlZCkKKwkJCQlj b250aW51ZTsKKwkJCWlmICghZmlyc3QpCisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY29s cywgIiwgIik7CisJCQlmaXJzdCA9IGZhbHNlOworCQkJYXBwZW5kU3RyaW5nSW5mbygmY29scywg Im12LiVzIiwgcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIoTlVMTCwgTmFtZVN0cihhdHRyLT5h dHRuYW1lKSkpOworCQl9CisKKwkJYXBwZW5kU3RyaW5nSW5mbygmcXVlcnlidWYsCisJCQkJCQkg IiBBTkQgbmV3ZGF0YS4qIE9QRVJBVE9SKHBnX2NhdGFsb2cuKj0pIFJPVyglcykpICIKKwkJCQkJ CSAiV0hFUkUgbmV3ZGF0YS4qIElTIE5VTEwgT1IgbXYuY3RpZCBJUyBOVUxMICIKKwkJCQkJCSAi T1JERVIgQlkgdGlkIiwKKwkJCQkJCSBjb2xzLmRhdGEpOworCQlwZnJlZShjb2xzLmRhdGEpOwor CX0KKwllbHNlCisJeworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZxdWVyeWJ1ZiwKKwkJCQkJ CQkgICAiIEFORCBuZXdkYXRhLiogT1BFUkFUT1IocGdfY2F0YWxvZy4qPSkgbXYuKikgIgorCQkJ CQkJCSAgICJXSEVSRSBuZXdkYXRhLiogSVMgTlVMTCBPUiBtdi4qIElTIE5VTEwgIgorCQkJCQkJ CSAgICJPUkRFUiBCWSB0aWQiKTsKKwl9CiAKIAkvKiBQb3B1bGF0ZSB0aGUgdGVtcG9yYXJ5ICJk aWZmIiB0YWJsZS4gKi8KLQlpZiAoU1BJX2V4ZWMocXVlcnlidWYuZGF0YSwgMCkgIT0gU1BJX09L X0lOU0VSVCkKKwlpZiAobWF0dmlld19leGVjdXRlX3NwaShxdWVyeWJ1Zi5kYXRhLCBwYXJhbXMs IGZhbHNlKSAhPSBTUElfT0tfSU5TRVJUKQogCQllbG9nKEVSUk9SLCAiU1BJX2V4ZWMgZmFpbGVk OiAlcyIsIHF1ZXJ5YnVmLmRhdGEpOwogCiAJLyoKQEAgLTg5Nyw3ICsxNTc2LDE1IEBAIHJlZnJl c2hfYnlfaGVhcF9zd2FwKE9pZCBtYXR2aWV3T2lkLCBPaWQgT0lETmV3SGVhcCwgY2hhciByZWxw ZXJzaXN0ZW5jZSkKIH0KIAogLyoKLSAqIENoZWNrIHdoZXRoZXIgc3BlY2lmaWVkIGluZGV4IGlz IHVzYWJsZSBmb3IgbWF0Y2ggbWVyZ2UuCisgKiBpc191c2FibGVfdW5pcXVlX2luZGV4CisgKgor ICogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIHVzYWJsZSBmb3IgY29uY3Vy cmVudCByZWZyZXNoCisgKiAocmVmcmVzaF9ieV9tYXRjaF9tZXJnZSkgb3IgZm9yIHRoZSB1cHNl cnQgc3RyYXRlZ3kgaW4gbm9uLWNvbmN1cnJlbnQKKyAqIHBhcnRpYWwgcmVmcmVzaCAocmVmcmVz aF9ieV9kaXJlY3RfbW9kaWZpY2F0aW9uKS4KKyAqCisgKiBBIHVzYWJsZSBpbmRleCBtdXN0IGJl IHVuaXF1ZSwgdmFsaWQsIGltbWVkaWF0ZSAobm90IGRlZmVycmFibGUpLAorICogbm9uLXBhcnRp YWwgKG5vIFdIRVJFIGNsYXVzZSksIGFuZCBkZWZpbmVkIG92ZXIgcGxhaW4gdXNlciBjb2x1bW5z CisgKiAobm90IGV4cHJlc3Npb25zIG9yIHN5c3RlbSBjb2x1bW5zKS4KICAqLwogc3RhdGljIGJv b2wKIGlzX3VzYWJsZV91bmlxdWVfaW5kZXgoUmVsYXRpb24gaW5kZXhSZWwpCkBAIC05NDUsOCAr MTYzMiwxMCBAQCBpc191c2FibGVfdW5pcXVlX2luZGV4KFJlbGF0aW9uIGluZGV4UmVsKQogICoK ICAqIFdoaWxlIHRoZSBmdW5jdGlvbiBuYW1lcyByZWZsZWN0IHRoZSBmYWN0IHRoYXQgdGhlaXIg bWFpbiBpbnRlbmRlZCB1c2UgaXMKICAqIGluY3JlbWVudGFsIG1haW50ZW5hbmNlIG9mIG1hdGVy aWFsaXplZCB2aWV3cyAoaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyB0bwotICogdGhlIGRhdGEgaW4g cmVmZXJlbmNlZCByZWxhdGlvbnMpLCB0aGV5IGFyZSBpbml0aWFsbHkgdXNlZCB0byBhbGxvdyBS RUZSRVNICi0gKiB3aXRob3V0IGJsb2NraW5nIGNvbmN1cnJlbnQgcmVhZHMuCisgKiB0aGUgZGF0 YSBpbiByZWZlcmVuY2VkIHJlbGF0aW9ucyksIHRoZXkgYXJlIGN1cnJlbnRseSB1c2VkIHRvIGFs bG93OgorICoKKyAqIC0gUkVGUkVTSCBDT05DVVJSRU5UTFkgd2l0aG91dCBibG9ja2luZyBjb25j dXJyZW50IHJlYWRzLgorICogLSBQYXJ0aWFsIFJFRlJFU0ggKHdpdGggV0hFUkUgY2xhdXNlKSB3 aGljaCBtb2RpZmllcyB0aGUgbWF0dmlldyBpbi1wbGFjZS4KICAqLwogYm9vbAogTWF0Vmlld0lu Y3JlbWVudGFsTWFpbnRlbmFuY2VJc0VuYWJsZWQodm9pZCkKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL2V4ZWNNYWluLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5j CmluZGV4IDI3YzllZWM2OTdiLi5iNjg1ZTE0OTUxZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv ZXhlY3V0b3IvZXhlY01haW4uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5j CkBAIC0xMjA4LDcgKzEyMDgsOCBAQCBDaGVja1ZhbGlkUm93TWFya1JlbChSZWxhdGlvbiByZWws IFJvd01hcmtUeXBlIG1hcmtUeXBlKQogCQkJYnJlYWs7CiAJCWNhc2UgUkVMS0lORF9NQVRWSUVX OgogCQkJLyogQWxsb3cgcmVmZXJlbmNpbmcgYSBtYXR2aWV3LCBidXQgbm90IGFjdHVhbCBsb2Nr aW5nIGNsYXVzZXMgKi8KLQkJCWlmIChtYXJrVHlwZSAhPSBST1dfTUFSS19SRUZFUkVOQ0UpCisJ CQlpZiAobWFya1R5cGUgIT0gUk9XX01BUktfUkVGRVJFTkNFICYmCisJCQkJIU1hdFZpZXdJbmNy ZW1lbnRhbE1haW50ZW5hbmNlSXNFbmFibGVkKCkpCiAJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJ CShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAogCQkJCQkJIGVycm1zZygiY2Fu bm90IGxvY2sgcm93cyBpbiBtYXRlcmlhbGl6ZWQgdmlldyBcIiVzXCIiLApkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKaW5k ZXggYzNhMGEzNTRhOWMuLjUyYTI4ZTAxYjRhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJz ZXIvZ3JhbS55CisrKyBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKQEAgLTMyMyw2ICszMjMs NyBAQCBzdGF0aWMgTm9kZSAqbWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwg TGlzdCAqYWxpYXNlcywgTm9kZSAqcXVlcnkpOwogJXR5cGUgPHN0cj4JCQlvcHRfc2luZ2xlX25h bWUKICV0eXBlIDxsaXN0PgkJb3B0X3F1YWxpZmllZF9uYW1lCiAldHlwZSA8Ym9vbGVhbj4JCW9w dF9jb25jdXJyZW50bHkKKyV0eXBlIDxub2RlPgkJb3B0X3JlZnJlc2hfd2hlcmVfY2xhdXNlCiAl dHlwZSA8ZGJlaGF2aW9yPglvcHRfZHJvcF9iZWhhdmlvcgogJXR5cGUgPGxpc3Q+CQlvcHRfdXRp bGl0eV9vcHRpb25fbGlzdAogJXR5cGUgPGxpc3Q+CQlvcHRfd2FpdF93aXRoX2NsYXVzZQpAQCAt NDk4OCwxNyArNDk4OSwyOCBAQCBPcHROb0xvZzoJVU5MT0dHRUQJCQkJCXsgJCQgPSBSRUxQRVJT SVNURU5DRV9VTkxPR0dFRDsgfQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBSZWZyZXNoTWF0 Vmlld1N0bXQ6Ci0JCQlSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG9wdF9jb25jdXJyZW50bHkg cXVhbGlmaWVkX25hbWUgb3B0X3dpdGhfZGF0YQorCQkJUkVGUkVTSCBNQVRFUklBTElaRUQgVklF VyBvcHRfY29uY3VycmVudGx5IHF1YWxpZmllZF9uYW1lIG9wdF93aXRoX2RhdGEgb3B0X3JlZnJl c2hfd2hlcmVfY2xhdXNlCiAJCQkJewogCQkJCQlSZWZyZXNoTWF0Vmlld1N0bXQgKm4gPSBtYWtl Tm9kZShSZWZyZXNoTWF0Vmlld1N0bXQpOwogCiAJCQkJCW4tPmNvbmN1cnJlbnQgPSAkNDsKIAkJ CQkJbi0+cmVsYXRpb24gPSAkNTsKIAkJCQkJbi0+c2tpcERhdGEgPSAhKCQ2KTsKKwkJCQkJbi0+ d2hlcmVDbGF1c2UgPSAkNzsKKworCQkJCQlpZiAobi0+c2tpcERhdGEgJiYgbi0+d2hlcmVDbGF1 c2UpCisJCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRB WF9FUlJPUiksCisJCQkJCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5IFdIRVJFIGNsYXVzZSB3 aXRoIFdJVEggTk8gREFUQSIpKSk7CiAJCQkJCSQkID0gKE5vZGUgKikgbjsKIAkJCQl9CiAJCTsK IAorb3B0X3JlZnJlc2hfd2hlcmVfY2xhdXNlOgorCQkJV0hFUkUgYV9leHByCQkJeyAkJCA9ICQy OyB9CisJCQl8IC8qIGVtcHR5ICovCQkJeyAkJCA9IE5VTEw7IH0KKwkJOworCiAKIC8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Rjb3AvdXRpbGl0eS5j IGIvc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMKaW5kZXggZDE4YTNhNjBhNDYuLmY3YTllYmE1 NTAzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC90Y29wL3V0aWxpdHkuYworKysgYi9zcmMvYmFj a2VuZC90Y29wL3V0aWxpdHkuYwpAQCAtMTY5MCw3ICsxNjkwLDcgQEAgUHJvY2Vzc1V0aWxpdHlT bG93KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQlQR19UUlkoMik7CiAJCQkJewogCQkJCQlhZGRy ZXNzID0gRXhlY1JlZnJlc2hNYXRWaWV3KChSZWZyZXNoTWF0Vmlld1N0bXQgKikgcGFyc2V0cmVl LAotCQkJCQkJCQkJCQkJIHF1ZXJ5U3RyaW5nLCBxYyk7CisJCQkJCQkJCQkJCQkgcXVlcnlTdHJp bmcsIHBhcmFtcywgcWMpOwogCQkJCX0KIAkJCQlQR19GSU5BTExZKDIpOwogCQkJCXsKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL21hdHZpZXcuaCBiL3NyYy9pbmNsdWRlL2NvbW1h bmRzL21hdHZpZXcuaAppbmRleCA3NTBiYjEwZGRjYS4uZjRhM2JmNTJjZmIgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NvbW1hbmRzL21hdHZpZXcuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5k cy9tYXR2aWV3LmgKQEAgLTI0LDkgKzI0LDExIEBACiBleHRlcm4gdm9pZCBTZXRNYXRWaWV3UG9w dWxhdGVkU3RhdGUoUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgbmV3c3RhdGUpOwogCiBleHRlcm4g T2JqZWN0QWRkcmVzcyBFeGVjUmVmcmVzaE1hdFZpZXcoUmVmcmVzaE1hdFZpZXdTdG10ICpzdG10 LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZywKLQkJCQkJCQkJCQlRdWVyeUNvbXBsZXRpb24gKnFj KTsKKwkJCQkJCQkJCQlQYXJhbUxpc3RJbmZvIHBhcmFtcywgUXVlcnlDb21wbGV0aW9uICpxYyk7 CisKIGV4dGVybiBPYmplY3RBZGRyZXNzIFJlZnJlc2hNYXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdP aWQsIGJvb2wgaXNfY3JlYXRlLCBib29sIHNraXBEYXRhLAotCQkJCQkJCQkJCSBib29sIGNvbmN1 cnJlbnQsIGNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLAorCQkJCQkJCQkJCSBib29sIGNvbmN1cnJl bnQsIE5vZGUgKndoZXJlQ2xhdXNlLAorCQkJCQkJCQkJCSBjb25zdCBjaGFyICpxdWVyeVN0cmlu ZywgUGFyYW1MaXN0SW5mbyBwYXJhbXMsCiAJCQkJCQkJCQkJIFF1ZXJ5Q29tcGxldGlvbiAqcWMp OwogCiBleHRlcm4gRGVzdFJlY2VpdmVyICpDcmVhdGVUcmFuc2llbnRSZWxEZXN0UmVjZWl2ZXIo T2lkIHRyYW5zaWVudG9pZCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5v ZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgKaW5kZXggZDE0Mjk0YTRlY2Uu LmNiOGI4YThjNGVlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgK KysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oCkBAIC00MDQxLDYgKzQwNDEsNyBA QCB0eXBlZGVmIHN0cnVjdCBSZWZyZXNoTWF0Vmlld1N0bXQKIAlib29sCQljb25jdXJyZW50OwkJ LyogYWxsb3cgY29uY3VycmVudCBhY2Nlc3M/ICovCiAJYm9vbAkJc2tpcERhdGE7CQkvKiB0cnVl IGZvciBXSVRIIE5PIERBVEEgKi8KIAlSYW5nZVZhciAgICpyZWxhdGlvbjsJCS8qIHJlbGF0aW9u IHRvIGluc2VydCBpbnRvICovCisJTm9kZQkgICAqd2hlcmVDbGF1c2U7CS8qIHF1YWxpZmljYXRp b24gZm9yIHBhcnRpYWwgcmVmcmVzaCAqLwogfSBSZWZyZXNoTWF0Vmlld1N0bXQ7CiAKIC8qIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvbWF0dmlld193aGVyZS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL21hdHZpZXdf d2hlcmUub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40NjRjMTll NzliZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWF0dmll d193aGVyZS5vdXQKQEAgLTAsMCArMSwzNDYgQEAKKy0tCistLSBSRUZSRVNIIE1BVEVSSUFMSVpF RCBWSUVXIC4uLiBXSEVSRSAuLi4KKy0tCistLSBTZXR1cAorQ1JFQVRFIFRBQkxFIG12X2Jhc2Vf YSAoaWQgaW50IHByaW1hcnkga2V5LCB2YWwgdGV4dCk7CitJTlNFUlQgSU5UTyBtdl9iYXNlX2Eg VkFMVUVTICgxLCAnT25lJyksICgyLCAnVHdvJyksICgzLCAnVGhyZWUnKTsKK0NSRUFURSBNQVRF UklBTElaRUQgVklFVyBtdl90ZXN0X2EgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2E7CitDUkVB VEUgVU5JUVVFIElOREVYIE9OIG12X3Rlc3RfYShpZCk7CistLQorLS0gVGVzdCAxOiBTeW50YXgg YW5kIEVycm9yIGhhbmRsaW5nCistLQorLS0gMS4xIFdJVEggTk8gREFUQSArIFdIRVJFIC0+IEVy cm9yCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3Rlc3RfYSBXSVRIIE5PIERBVEEgV0hF UkUgaWQgPSAxOworRVJST1I6ICBjYW5ub3Qgc3BlY2lmeSBXSEVSRSBjbGF1c2Ugd2l0aCBXSVRI IE5PIERBVEEKKy0tIDEuMiBVbnBvcHVsYXRlZCArIFdIRVJFIC0+IEVycm9yCitDUkVBVEUgTUFU RVJJQUxJWkVEIFZJRVcgbXZfdW5wb3AgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2EgV0lUSCBO TyBEQVRBOworUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl91bnBvcCBXSEVSRSBpZCA9IDE7 CitFUlJPUjogIFdIRVJFIGNsYXVzZSBjYW5ub3QgYmUgdXNlZCB3aGVuIHRoZSBtYXRlcmlhbGl6 ZWQgdmlldyBpcyBub3QgcG9wdWxhdGVkCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X3VucG9w OworLS0gMS4zIFZvbGF0aWxlIGZ1bmN0aW9ucyAtPiBFcnJvcgorUkVGUkVTSCBNQVRFUklBTEla RUQgVklFVyBtdl90ZXN0X2EgV0hFUkUgcmFuZG9tKCkgPiAwLjU7CitFUlJPUjogIFdIRVJFIGNs YXVzZSBpbiBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIGNhbm5vdCBjb250YWluIHZvbGF0aWxl IGZ1bmN0aW9ucworLS0gMS40IFN1YnF1ZXJpZXMgLT4gRXJyb3IKK1JFRlJFU0ggTUFURVJJQUxJ WkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIGlkIElOIChTRUxFQ1QgaWQgRlJPTSBwdWJsaWMubXZf YmFzZV9hKTsKKy0tIDEuNSBBZ2dyZWdhdGVzIC0+IEVycm9yCitSRUZSRVNIIE1BVEVSSUFMSVpF RCBWSUVXIG12X3Rlc3RfYSBXSEVSRSBjb3VudCgqKSA+IDA7CitFUlJPUjogIGFnZ3JlZ2F0ZSBm dW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluIFdIRVJFCistLQorLS0gVGVzdCAyOiBOb24tY29u Y3VycmVudCBQYXJ0aWFsIFJlZnJlc2gKKy0tCistLSBNb2RpZnkgYmFzZSBkYXRhCitVUERBVEUg bXZfYmFzZV9hIFNFVCB2YWwgPSAnT25lIFVwZGF0ZWQnIFdIRVJFIGlkID0gMTsKK1VQREFURSBt dl9iYXNlX2EgU0VUIHZhbCA9ICdUd28gVXBkYXRlZCcgV0hFUkUgaWQgPSAyOworLS0gUmVmcmVz aCBvbmx5IGlkPTEKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIGlk ID0gMTsKKy0tIFZlcmlmeTogaWQ9MSBzaG91bGQgYmUgdXBkYXRlZCwgaWQ9MiBzaG91bGQgcmVt YWluIHN0YWxlCitTRUxFQ1QgKiBGUk9NIG12X3Rlc3RfYSBPUkRFUiBCWSBpZDsKKyBpZCB8ICAg ICB2YWwgICAgIAorLS0tLSstLS0tLS0tLS0tLS0tCisgIDEgfCBPbmUgVXBkYXRlZAorICAyIHwg VHdvCisgIDMgfCBUaHJlZQorKDMgcm93cykKKworLS0gUmVmcmVzaCBpZD0yCitSRUZSRVNIIE1B VEVSSUFMSVpFRCBWSUVXIG12X3Rlc3RfYSBXSEVSRSBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIG12 X3Rlc3RfYSBPUkRFUiBCWSBpZDsKKyBpZCB8ICAgICB2YWwgICAgIAorLS0tLSstLS0tLS0tLS0t LS0tCisgIDEgfCBPbmUgVXBkYXRlZAorICAyIHwgVHdvIFVwZGF0ZWQKKyAgMyB8IFRocmVlCiso MyByb3dzKQorCistLQorLS0gVGVzdCAzOiBDb25jdXJyZW50IFBhcnRpYWwgUmVmcmVzaAorLS0K Ky0tIE1vZGlmeSBiYXNlIGRhdGEKK1VQREFURSBtdl9iYXNlX2EgU0VUIHZhbCA9ICdPbmUgQ29u Y3VycmVudCcgV0hFUkUgaWQgPSAxOworVVBEQVRFIG12X2Jhc2VfYSBTRVQgdmFsID0gJ1R3byBD b25jdXJyZW50JyBXSEVSRSBpZCA9IDI7CistLSBSZWZyZXNoIG9ubHkgaWQ9MQorUkVGUkVTSCBN QVRFUklBTElaRUQgVklFVyBDT05DVVJSRU5UTFkgbXZfdGVzdF9hIFdIRVJFIGlkID0gMTsKKy0t IFZlcmlmeTogaWQ9MSB1cGRhdGVkLCBpZD0yIHN0YWxlCitTRUxFQ1QgKiBGUk9NIG12X3Rlc3Rf YSBPUkRFUiBCWSBpZDsKKyBpZCB8ICAgICAgdmFsICAgICAgIAorLS0tLSstLS0tLS0tLS0tLS0t LS0tCisgIDEgfCBPbmUgQ29uY3VycmVudAorICAyIHwgVHdvIFVwZGF0ZWQKKyAgMyB8IFRocmVl CisoMyByb3dzKQorCistLSBSZWZyZXNoIGlkPTIKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcg Q09OQ1VSUkVOVExZIG12X3Rlc3RfYSBXSEVSRSBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIG12X3Rl c3RfYSBPUkRFUiBCWSBpZDsKKyBpZCB8ICAgICAgdmFsICAgICAgIAorLS0tLSstLS0tLS0tLS0t LS0tLS0tCisgIDEgfCBPbmUgQ29uY3VycmVudAorICAyIHwgVHdvIENvbmN1cnJlbnQKKyAgMyB8 IFRocmVlCisoMyByb3dzKQorCistLSBDbGVhbnVwIFRlc3QgMi8zCitEUk9QIE1BVEVSSUFMSVpF RCBWSUVXIG12X3Rlc3RfYTsKK0RST1AgVEFCTEUgbXZfYmFzZV9hOworLS0KKy0tIFRlc3QgNDog Sm9pbiBWaWV3IChJbnZvaWNlIHN0eWxlKQorLS0KK0NSRUFURSBUQUJMRSBpbnZvaWNlcyAoaWQg aW50IHByaW1hcnkga2V5LCB0b3RhbCBudW1lcmljKTsKK0NSRUFURSBUQUJMRSBpbnZvaWNlX2l0 ZW1zIChpbnZfaWQgaW50IHJlZmVyZW5jZXMgaW52b2ljZXMoaWQpLCBhbW91bnQgbnVtZXJpYyk7 CitJTlNFUlQgSU5UTyBpbnZvaWNlcyBWQUxVRVMgKDEsIDApLCAoMiwgMCk7CitJTlNFUlQgSU5U TyBpbnZvaWNlX2l0ZW1zIFZBTFVFUyAoMSwgMTAwKSwgKDEsIDUwKSwgKDIsIDIwMCk7CitDUkVB VEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfaW52b2ljZXMgQVMKKyAgU0VMRUNUIGkuaWQsIHN1bShp aS5hbW91bnQpIGFzIGNvbXB1dGVkX3RvdGFsCisgIEZST00gaW52b2ljZXMgaQorICBKT0lOIGlu dm9pY2VfaXRlbXMgaWkgT04gaS5pZCA9IGlpLmludl9pZAorICBHUk9VUCBCWSBpLmlkOworQ1JF QVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9pbnZvaWNlcyhpZCk7CitTRUxFQ1QgKiBGUk9NIG12X2lu dm9pY2VzIE9SREVSIEJZIGlkOworIGlkIHwgY29tcHV0ZWRfdG90YWwgCistLS0tKy0tLS0tLS0t LS0tLS0tLS0KKyAgMSB8ICAgICAgICAgICAgMTUwCisgIDIgfCAgICAgICAgICAgIDIwMAorKDIg cm93cykKKworLS0gTW9kaWZ5IGl0ZW1zIGZvciBpbnZvaWNlIDEKK0lOU0VSVCBJTlRPIGludm9p Y2VfaXRlbXMgVkFMVUVTICgxLCAyNSk7CistLSBNb2RpZnkgaXRlbXMgZm9yIGludm9pY2UgMgor SU5TRVJUIElOVE8gaW52b2ljZV9pdGVtcyBWQUxVRVMgKDIsIDUwKTsKKy0tIFJlZnJlc2ggb25s eSBpbnZvaWNlIDEKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfaW52b2ljZXMgV0hFUkUg aWQgPSAxOworLS0gVmVyaWZ5OiBJbnZvaWNlIDEgdXBkYXRlZCAoMTc1KSwgSW52b2ljZSAyIHN0 YWxlICgyMDApCitTRUxFQ1QgKiBGUk9NIG12X2ludm9pY2VzIE9SREVSIEJZIGlkOworIGlkIHwg Y29tcHV0ZWRfdG90YWwgCistLS0tKy0tLS0tLS0tLS0tLS0tLS0KKyAgMSB8ICAgICAgICAgICAg MTc1CisgIDIgfCAgICAgICAgICAgIDIwMAorKDIgcm93cykKKworLS0gUmVmcmVzaCBpbnZvaWNl IDIgY29uY3VycmVudGx5CitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSBt dl9pbnZvaWNlcyBXSEVSRSBpZCA9IDI7CistLSBWZXJpZnk6IEludm9pY2UgMiB1cGRhdGVkICgy NTApCitTRUxFQ1QgKiBGUk9NIG12X2ludm9pY2VzIE9SREVSIEJZIGlkOworIGlkIHwgY29tcHV0 ZWRfdG90YWwgCistLS0tKy0tLS0tLS0tLS0tLS0tLS0KKyAgMSB8ICAgICAgICAgICAgMTc1Cisg IDIgfCAgICAgICAgICAgIDI1MAorKDIgcm93cykKKworRFJPUCBNQVRFUklBTElaRUQgVklFVyBt dl9pbnZvaWNlczsKK0RST1AgVEFCTEUgaW52b2ljZV9pdGVtczsKK0RST1AgVEFCTEUgaW52b2lj ZXM7CistLQorLS0gVGVzdCA1OiBSb3dzIGVudGVyaW5nL2xlYXZpbmcgdmlldyBzY29wZQorLS0K K0NSRUFURSBUQUJMRSBpdGVtcyAoaWQgaW50LCBzdGF0dXMgdGV4dCwgdmFsIGludCk7CitJTlNF UlQgSU5UTyBpdGVtcyBWQUxVRVMgKDEsICdhY3RpdmUnLCAxMCksICgyLCAnaW5hY3RpdmUnLCAy MCk7CitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zIEFTCisgIFNFTEVD VCAqIEZST00gaXRlbXMgV0hFUkUgc3RhdHVzID0gJ2FjdGl2ZSc7CitDUkVBVEUgVU5JUVVFIElO REVYIE9OIG12X2FjdGl2ZV9pdGVtcyhpZCk7CitTRUxFQ1QgKiBGUk9NIG12X2FjdGl2ZV9pdGVt cyBPUkRFUiBCWSBpZDsKKyBpZCB8IHN0YXR1cyB8IHZhbCAKKy0tLS0rLS0tLS0tLS0rLS0tLS0K KyAgMSB8IGFjdGl2ZSB8ICAxMAorKDEgcm93KQorCistLSBDYXNlIEE6IFJvdyBjaGFuZ2VzIHN0 YXR1cyBhY3RpdmUgLT4gaW5hY3RpdmUgKHNob3VsZCBiZSByZW1vdmVkKQorVVBEQVRFIGl0ZW1z IFNFVCBzdGF0dXMgPSAnaW5hY3RpdmUnIFdIRVJFIGlkID0gMTsKKy0tIEFsc28gdXBkYXRlIHJv dyAyIHRvIGFjdGl2ZSAoc2hvdWxkIGJlIGFkZGVkKQorVVBEQVRFIGl0ZW1zIFNFVCBzdGF0dXMg PSAnYWN0aXZlJyBXSEVSRSBpZCA9IDI7CistLSBSZWZyZXNoIHBhcnRpYWwgV0hFUkUgaWQ9MQor LS0gU2hvdWxkIHJlbW92ZSBpZD0xIGJlY2F1c2UgaXQgbm8gbG9uZ2VyIG1hdGNoZXMgdmlldyBk ZWZpbml0aW9uCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtcyBXSEVS RSBpZCA9IDE7CitTRUxFQ1QgKiBGUk9NIG12X2FjdGl2ZV9pdGVtcyBPUkRFUiBCWSBpZDsKKyBp ZCB8IHN0YXR1cyB8IHZhbCAKKy0tLS0rLS0tLS0tLS0rLS0tLS0KKygwIHJvd3MpCisKKy0tIENh c2UgQjogUmVmcmVzaCB0byBhZGQgcm93IDIgKHdoaWNoIGlzIG5vdyBhY3RpdmUpCitSRUZSRVNI IE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtcyBXSEVSRSBpZCA9IDI7CitTRUxFQ1Qg KiBGUk9NIG12X2FjdGl2ZV9pdGVtcyBPUkRFUiBCWSBpZDsKKyBpZCB8IHN0YXR1cyB8IHZhbCAK Ky0tLS0rLS0tLS0tLS0rLS0tLS0KKyAgMiB8IGFjdGl2ZSB8ICAyMAorKDEgcm93KQorCistLSBD bGVhbnVwCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtczsKK0RST1AgVEFC TEUgaXRlbXM7CistLQorLS0gVGVzdCA2OiBPcmRlciBvZiBPcGVyYXRpb25zIChWYWx1ZSBTd2Fw KQorLS0gQWRkcmVzc2VkIHNwZWNpZmljIHdvcnJ5OiAiVGhlIG9yZGVyIG9mIHR1cGxlIHByb2Nl c3NpbmcgbWF0dGVycyIKKy0tCitDUkVBVEUgVEFCTEUgbXZfc3dhcF9iYXNlIChpZCBpbnQgcHJp bWFyeSBrZXksIGNvZGUgdGV4dCk7CitJTlNFUlQgSU5UTyBtdl9zd2FwX2Jhc2UgVkFMVUVTICgx LCAnQScpLCAoMiwgJ0InKTsKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9zd2FwIEFTIFNF TEVDVCAqIEZST00gbXZfc3dhcF9iYXNlOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9zd2Fw KGNvZGUpOyAtLSBVbmlxdWUgSW5kZXggaXMgb24gY29kZSwgbm90IElECitTRUxFQ1QgKiBGUk9N IG12X3N3YXAgT1JERVIgQlkgaWQ7CisgaWQgfCBjb2RlIAorLS0tLSstLS0tLS0KKyAgMSB8IEEK KyAgMiB8IEIKKygyIHJvd3MpCisKKy0tIFBlcmZvcm0gYSBzd2FwIGluIHRoZSBiYXNlIHRhYmxl CistLSAxIGJlY29tZXMgQiwgMiBiZWNvbWVzIEEKK0JFR0lOOworVVBEQVRFIG12X3N3YXBfYmFz ZSBTRVQgY29kZSA9ICdURU1QJyBXSEVSRSBpZCA9IDE7CitVUERBVEUgbXZfc3dhcF9iYXNlIFNF VCBjb2RlID0gJ0EnIFdIRVJFIGlkID0gMjsKK1VQREFURSBtdl9zd2FwX2Jhc2UgU0VUIGNvZGUg PSAnQicgV0hFUkUgaWQgPSAxOworQ09NTUlUOworLS0gUmVmcmVzaCBib3RoIHJvd3MgY29uY3Vy cmVudGx5LgorLS0gSWYgdGhlIGltcGxlbWVudGF0aW9uIGluc2VydHMgKDEsICdCJykgYmVmb3Jl IGRlbGV0aW5nICgyLCAnQicpLCB0aGlzIHdpbGwgZmFpbC4KKy0tIEl0IHJlbGllcyBvbiB0aGUg aW1wbGVtZW50YXRpb24gY29ycmVjdGx5IGhhbmRsaW5nIHRoZSBEZWxldGUvTG9jayBzZXQgYmVm b3JlIHRoZSBJbnNlcnQvVXBzZXJ0LgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBDT05DVVJS RU5UTFkgbXZfc3dhcCBXSEVSRSBpZCBJTiAoMSwgMik7CitTRUxFQ1QgKiBGUk9NIG12X3N3YXAg T1JERVIgQlkgaWQ7CisgaWQgfCBjb2RlIAorLS0tLSstLS0tLS0KKyAgMSB8IEIKKyAgMiB8IEEK KygyIHJvd3MpCisKK0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfc3dhcDsKK0RST1AgVEFCTEUg bXZfc3dhcF9iYXNlOworLS0KKy0tIFRlc3QgNzogU2NvcGUgRHJpZnQgLyBDb25zdHJhaW50IFZp b2xhdGlvbgorLS0gQWRkcmVzc2VkIHNwZWNpZmljIHdvcnJ5OiAiSWYgV0hFUkUgcHJlZGljYXRl IHdvdWxkIGJlIGRpZmZlcmVudC4uLiBVSyB2aW9sYXRpb24gY291bGRuJ3QgYmUgc29sdmVkIgor LS0KK0NSRUFURSBUQUJMRSBtdl9kcmlmdF9iYXNlIChpZCBpbnQgcHJpbWFyeSBrZXksIGNhdGVn b3J5X2lkIGludCk7CitJTlNFUlQgSU5UTyBtdl9kcmlmdF9iYXNlIFZBTFVFUyAoMSwgMTAwKSwg KDIsIDIwMCk7CitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfZHJpZnQgQVMgU0VMRUNUICog RlJPTSBtdl9kcmlmdF9iYXNlOworLS0gS0VZIEZJWDogSW5kZXggb24gSUQsIG5vdCBDYXRlZ29y eS4KKy0tIFdlIHdhbnQgdG8gdGVzdCB0aGF0IHRoZSBSZWZyZXNoIGxvZ2ljIGRldGVjdHMgSUQg Y29uZmxpY3RzIHdoZW4gcm93cyBkcmlmdCBpbnRvIHNjb3BlLAorLS0gbm90IHRoYXQgUG9zdGdy ZXMgZW5mb3JjZXMgdW5pcXVlIGluZGV4ZXMgb24gbm9uLXVuaXF1ZSBkYXRhLgorQ1JFQVRFIFVO SVFVRSBJTkRFWCBPTiBtdl9kcmlmdChpZCk7CistLSBVcGRhdGUgUm93IDEgdG8gY29sbGlkZSB3 aXRoIFJvdyAyJ3MgY2F0ZWdvcnkKK1VQREFURSBtdl9kcmlmdF9iYXNlIFNFVCBjYXRlZ29yeV9p ZCA9IDIwMCBXSEVSRSBpZCA9IDE7CistLSBBdHRlbXB0IHRvIHJlZnJlc2ggdXNpbmcgdGhlIE5F VyBjYXRlZ29yeSB2YWx1ZSBhcyB0aGUgZmlsdGVyLgorLS0gVGhlIFZpZXcgc3RpbGwgY29udGFp bnMgKDEsIDEwMCkuCistLSBUaGUgRmlsdGVyICJjYXRlZ29yeV9pZCA9IDIwMCIgc2VlcyB0aGUg TkVXIHJvdyAoMSwgMjAwKSBpbiB0aGUgYmFzZSB0YWJsZS4KKy0tIFRoZSBGaWx0ZXIgImNhdGVn b3J5X2lkID0gMjAwIiBkb2VzIE5PVCBzZWUgdGhlIE9MRCByb3cgKDEsIDEwMCkgaW4gdGhlIFZp ZXcuCistLSBSZXN1bHQ6IFRoZSBzeXN0ZW0gdGhpbmtzICgxLCAyMDApIGlzIGEgYnJhbmQgbmV3 IHJvdyBhbmQgdHJpZXMgdG8gSU5TRVJUIGl0LgorLS0gVGhpcyBNVVNUIGZhaWwgd2l0aCBhIFVu aXF1ZSBDb25zdHJhaW50IFZpb2xhdGlvbiBvbiAnaWQnIGJlY2F1c2UgKDEsIDEwMCkgd2FzIG5l dmVyIGRlbGV0ZWQuCitcc2V0IFZFUkJPU0lUWSB0ZXJzZQorUkVGUkVTSCBNQVRFUklBTElaRUQg VklFVyBDT05DVVJSRU5UTFkgbXZfZHJpZnQgV0hFUkUgY2F0ZWdvcnlfaWQgPSAyMDA7CitFUlJP UjogIGR1cGxpY2F0ZSBrZXkgdmFsdWUgdmlvbGF0ZXMgdW5pcXVlIGNvbnN0cmFpbnQgIm12X2Ry aWZ0X2lkX2lkeCIKK1xzZXQgVkVSQk9TSVRZIGRlZmF1bHQKKy0tIENvcnJlY3QgdXNhZ2U6IFNj b3BlIG11c3QgaW5jbHVkZSBCT1RIIHRoZSBPbGQgbG9jYXRpb24gKDEwMCkgYW5kIE5ldyBsb2Nh dGlvbiAoMjAwKQorLS0gc28gdGhlIHN5c3RlbSBzZWVzIHRoZSB1cGRhdGUgYXMgYW4gdXBkYXRl IChvciBkZWxldGUraW5zZXJ0KS4KK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09OQ1VSUkVO VExZIG12X2RyaWZ0IFdIRVJFIGNhdGVnb3J5X2lkIElOICgxMDAsIDIwMCk7CitTRUxFQ1QgKiBG Uk9NIG12X2RyaWZ0IE9SREVSIEJZIGlkOworIGlkIHwgY2F0ZWdvcnlfaWQgCistLS0tKy0tLS0t LS0tLS0tLS0KKyAgMSB8ICAgICAgICAgMjAwCisgIDIgfCAgICAgICAgIDIwMAorKDIgcm93cykK KworRFJPUCBNQVRFUklBTElaRUQgVklFVyBtdl9kcmlmdDsKK0RST1AgVEFCTEUgbXZfZHJpZnRf YmFzZTsKKy0tCistLSBUZXN0IDg6IE11bHRpcGxlIFVuaXF1ZSBLZXlzCistLSBBZGRyZXNzZWQg c3BlY2lmaWMgd29ycnk6ICJ3aGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgVUtzPyIKKy0tCitDUkVB VEUgVEFCTEUgbXZfbXVsdGlfdWsgKGlkIGludCBwcmltYXJ5IGtleSwgZW1haWwgdGV4dCwgdXNl cm5hbWUgdGV4dCk7CitJTlNFUlQgSU5UTyBtdl9tdWx0aV91ayBWQUxVRVMgKDEsICdhQGV4YW1w bGUuY29tJywgJ3VzZXJfYScpOworQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIG12X211bHRpIEFT IFNFTEVDVCAqIEZST00gbXZfbXVsdGlfdWs7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIG12X211 bHRpKGVtYWlsKTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gbXZfbXVsdGkodXNlcm5hbWUpOwor LS0gVXBkYXRlIGFsbCBjb2x1bW5zCitVUERBVEUgbXZfbXVsdGlfdWsgU0VUIGVtYWlsID0gJ2JA ZXhhbXBsZS5jb20nLCB1c2VybmFtZSA9ICd1c2VyX2InIFdIRVJFIGlkID0gMTsKKy0tIFJlZnJl c2ggc2hvdWxkIHN1Y2NlZWQgdXBkYXRpbmcgYWxsIHVuaXF1ZSBpbmRleGVzCitSRUZSRVNIIE1B VEVSSUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSBtdl9tdWx0aSBXSEVSRSBpZCA9IDE7CitTRUxF Q1QgKiBGUk9NIG12X211bHRpOworIGlkIHwgICAgIGVtYWlsICAgICB8IHVzZXJuYW1lIAorLS0t LSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICAxIHwgYkBleGFtcGxlLmNvbSB8IHVzZXJf YgorKDEgcm93KQorCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X211bHRpOworRFJPUCBUQUJM RSBtdl9tdWx0aV91azsKKy0tCistLSBUZXN0IDk6IFRyaWdnZXItYmFzZWQgQXV0b21hdGljIE1h aW50ZW5hbmNlCistLSBVc2UgQ2FzZTogQXV0b21hdGluZyB0aGUgcGFydGlhbCByZWZyZXNoIHZp YSB0cmlnZ2VycyB1c2luZyBBcnJheXMuCistLQorQ1JFQVRFIFRBQkxFIG12X3RyaWdnZXJfYmFz ZSAoaWQgaW50IHByaW1hcnkga2V5LCB2YWwgdGV4dCk7CitDUkVBVEUgTUFURVJJQUxJWkVEIFZJ RVcgbXZfdHJpZ2dlcl92aWV3IEFTIFNFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl9iYXNlOworQ1JF QVRFIFVOSVFVRSBJTkRFWCBPTiBtdl90cmlnZ2VyX3ZpZXcoaWQpOworLS0gQ3JlYXRlIGEgbWFp bnRhaW5lciBmdW5jdGlvbgorQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbWFpbnRhaW5fbXZf dHJpZ2dlcl92aWV3KCkgUkVUVVJOUyBUUklHR0VSIEFTICQkCitCRUdJTgorICAgIElGIChUR19P UCBJTiAoJ0lOU0VSVCcsICdVUERBVEUnKSkgVEhFTgorICAgICAgICBFWEVDVVRFICdSRUZSRVNI IE1BVEVSSUFMSVpFRCBWSUVXIG12X3RyaWdnZXJfdmlldyBXSEVSRSBpZCA9IEFOWSgkMSk7Jwor ICAgICAgICAgICAgVVNJTkcgKFNFTEVDVCBhcnJheV9hZ2coaWQpIEZST00gbmV3X3RhYmxlKTsK KyAgICBFTkQgSUY7CisKKyAgICBJRiAoVEdfT1AgSU4gKCdERUxFVEUnKSkgVEhFTgorICAgICAg ICBFWEVDVVRFICdSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3RyaWdnZXJfdmlldyBXSEVS RSBpZCA9IEFOWSgkMSk7JworICAgICAgICAgICAgVVNJTkcgKFNFTEVDVCBhcnJheV9hZ2coaWQp IEZST00gb2xkX3RhYmxlKTsKKyAgICBFTkQgSUY7CisKKyAgICBSRVRVUk4gTlVMTDsKK0VORDsK KyQkIExBTkdVQUdFIHBscGdzcWwgVk9MQVRJTEU7CistLSBUcmlnZ2VyIGZvciBJbnNlcnQKK0NS RUFURSBUUklHR0VSIHRfcmVmcmVzaF9tdl9pbnMKKyAgICBBRlRFUiBJTlNFUlQgT04gbXZfdHJp Z2dlcl9iYXNlCisgICAgUkVGRVJFTkNJTkcgTkVXIFRBQkxFIEFTIG5ld190YWJsZQorICAgIEZP UiBFQUNIIFNUQVRFTUVOVAorRVhFQ1VURSBGVU5DVElPTiBtYWludGFpbl9tdl90cmlnZ2VyX3Zp ZXcoKTsKKy0tIFRyaWdnZXIgZm9yIFVwZGF0ZQorQ1JFQVRFIFRSSUdHRVIgdF9yZWZyZXNoX212 X3VwZAorICAgIEFGVEVSIFVQREFURSBPTiBtdl90cmlnZ2VyX2Jhc2UKKyAgICBSRUZFUkVOQ0lO RyBORVcgVEFCTEUgQVMgbmV3X3RhYmxlCisgICAgRk9SIEVBQ0ggU1RBVEVNRU5UCitFWEVDVVRF IEZVTkNUSU9OIG1haW50YWluX212X3RyaWdnZXJfdmlldygpOworLS0gVHJpZ2dlciBmb3IgRGVs ZXRlCitDUkVBVEUgVFJJR0dFUiB0X3JlZnJlc2hfbXZfZGVsCisgICAgQUZURVIgREVMRVRFIE9O IG12X3RyaWdnZXJfYmFzZQorICAgIFJFRkVSRU5DSU5HIE9MRCBUQUJMRSBBUyBvbGRfdGFibGUK KyAgICBGT1IgRUFDSCBTVEFURU1FTlQKK0VYRUNVVEUgRlVOQ1RJT04gbWFpbnRhaW5fbXZfdHJp Z2dlcl92aWV3KCk7CistLSAxLiBUZXN0IEluc2VydAorSU5TRVJUIElOVE8gbXZfdHJpZ2dlcl9i YXNlIFZBTFVFUyAoMSwgJ0F1dG8tSW5zZXJ0JyksICgyLCAnQXV0by1JbnNlcnQnKTsKK1NFTEVD VCAqIEZST00gbXZfdHJpZ2dlcl92aWV3IE9SREVSIEJZIGlkOworIGlkIHwgICAgIHZhbCAgICAg CistLS0tKy0tLS0tLS0tLS0tLS0KKyAgMSB8IEF1dG8tSW5zZXJ0CisgIDIgfCBBdXRvLUluc2Vy dAorKDIgcm93cykKKworLS0gMi4gVGVzdCBVcGRhdGUKK1VQREFURSBtdl90cmlnZ2VyX2Jhc2Ug U0VUIHZhbCA9ICdBdXRvLVVwZGF0ZScgV0hFUkUgaWQgPSAxOworU0VMRUNUICogRlJPTSBtdl90 cmlnZ2VyX3ZpZXcgT1JERVIgQlkgaWQ7CisgaWQgfCAgICAgdmFsICAgICAKKy0tLS0rLS0tLS0t LS0tLS0tLQorICAxIHwgQXV0by1VcGRhdGUKKyAgMiB8IEF1dG8tSW5zZXJ0CisoMiByb3dzKQor CistLSAzLiBUZXN0IERlbGV0ZQorREVMRVRFIEZST00gbXZfdHJpZ2dlcl9iYXNlIFdIRVJFIGlk ID0gMjsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl92aWV3IE9SREVSIEJZIGlkOworIGlkIHwg ICAgIHZhbCAgICAgCistLS0tKy0tLS0tLS0tLS0tLS0KKyAgMSB8IEF1dG8tVXBkYXRlCisoMSBy b3cpCisKKy0tIDQuIFZlcmlmeSBUcmFuc2FjdGlvbiBJc29sYXRpb24KKy0tIEVuc3VyZSB0aGF0 IGlmIHRoZSBtYWluIHRyYW5zYWN0aW9uIHJvbGxzIGJhY2ssIHRoZSBSZWZyZXNoIGFsc28gcm9s bHMgYmFjaworQkVHSU47CitJTlNFUlQgSU5UTyBtdl90cmlnZ2VyX2Jhc2UgVkFMVUVTICg5OSwg J1JvbGxiYWNrJyk7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdnZXJfdmlldyBXSEVSRSBpZCA9IDk5 OyAtLSBTaG91bGQgc2VlIGl0CisgaWQgfCAgIHZhbCAgICAKKy0tLS0rLS0tLS0tLS0tLQorIDk5 IHwgUm9sbGJhY2sKKygxIHJvdykKKworUk9MTEJBQ0s7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdn ZXJfdmlldyBXSEVSRSBpZCA9IDk5OyAtLSBTaG91bGQgTk9UIHNlZSBpdAorIGlkIHwgdmFsIAor LS0tLSstLS0tLQorKDAgcm93cykKKworLS0gQ2xlYW51cAorRFJPUCBNQVRFUklBTElaRUQgVklF VyBtdl90cmlnZ2VyX3ZpZXc7CitEUk9QIFRBQkxFIG12X3RyaWdnZXJfYmFzZTsKK0RST1AgRlVO Q1RJT04gbWFpbnRhaW5fbXZfdHJpZ2dlcl92aWV3KCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hl ZHVsZQppbmRleCBjYzZkNzk5YmNlYS4uMTRhYTU5MjFjOTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxl bF9zY2hlZHVsZQpAQCAtNjgsNiArNjgsMTEgQEAgdGVzdDogc2VsZWN0X2ludG8gc2VsZWN0X2Rp c3RpbmN0IHNlbGVjdF9kaXN0aW5jdF9vbiBzZWxlY3RfaW1wbGljaXQgc2VsZWN0X2hhdmkKICMg LS0tLS0tLS0tLQogdGVzdDogYnJpbiBnaW4gZ2lzdCBzcGdpc3QgcHJpdmlsZWdlcyBpbml0X3By aXZzIHNlY3VyaXR5X2xhYmVsIGNvbGxhdGUgbWF0dmlldyBsb2NrIHJlcGxpY2FfaWRlbnRpdHkg cm93c2VjdXJpdHkgb2JqZWN0X2FkZHJlc3MgdGFibGVzYW1wbGUgZ3JvdXBpbmdzZXRzIGRyb3Bf b3BlcmF0b3IgcGFzc3dvcmQgaWRlbnRpdHkgZ2VuZXJhdGVkX3N0b3JlZCBqb2luX2hhc2gKIAor IyAtLS0tLS0tLS0tCisjIEFkZGl0aW9uYWwgTWF0IFZpZXcgdGVzdHMKKyMgLS0tLS0tLS0tLQor dGVzdDogbWF0dmlld193aGVyZQorCiAjIC0tLS0tLS0tLS0KICMgQWRkaXRpb25hbCBCUklOIHRl c3RzCiAjIC0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL21hdHZp ZXdfd2hlcmUuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWF0dmlld193aGVyZS5zcWwKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjZiZTVlZjhiZjc3Ci0tLSAvZGV2 L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWF0dmlld193aGVyZS5zcWwKQEAgLTAs MCArMSwzMDUgQEAKKy0tCistLSBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIC4uLiBXSEVSRSAu Li4KKy0tCisKKy0tIFNldHVwCitDUkVBVEUgVEFCTEUgbXZfYmFzZV9hIChpZCBpbnQgcHJpbWFy eSBrZXksIHZhbCB0ZXh0KTsKK0lOU0VSVCBJTlRPIG12X2Jhc2VfYSBWQUxVRVMgKDEsICdPbmUn KSwgKDIsICdUd28nKSwgKDMsICdUaHJlZScpOworCitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcg bXZfdGVzdF9hIEFTIFNFTEVDVCAqIEZST00gbXZfYmFzZV9hOworQ1JFQVRFIFVOSVFVRSBJTkRF WCBPTiBtdl90ZXN0X2EoaWQpOworCistLQorLS0gVGVzdCAxOiBTeW50YXggYW5kIEVycm9yIGhh bmRsaW5nCistLQorCistLSAxLjEgV0lUSCBOTyBEQVRBICsgV0hFUkUgLT4gRXJyb3IKK1JFRlJF U0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdJVEggTk8gREFUQSBXSEVSRSBpZCA9IDE7 CisKKy0tIDEuMiBVbnBvcHVsYXRlZCArIFdIRVJFIC0+IEVycm9yCitDUkVBVEUgTUFURVJJQUxJ WkVEIFZJRVcgbXZfdW5wb3AgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2EgV0lUSCBOTyBEQVRB OworUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl91bnBvcCBXSEVSRSBpZCA9IDE7CitEUk9Q IE1BVEVSSUFMSVpFRCBWSUVXIG12X3VucG9wOworCistLSAxLjMgVm9sYXRpbGUgZnVuY3Rpb25z IC0+IEVycm9yCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3Rlc3RfYSBXSEVSRSByYW5k b20oKSA+IDAuNTsKKworLS0gMS40IFN1YnF1ZXJpZXMgLT4gRXJyb3IKK1JFRlJFU0ggTUFURVJJ QUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIGlkIElOIChTRUxFQ1QgaWQgRlJPTSBwdWJsaWMu bXZfYmFzZV9hKTsKKworLS0gMS41IEFnZ3JlZ2F0ZXMgLT4gRXJyb3IKK1JFRlJFU0ggTUFURVJJ QUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIGNvdW50KCopID4gMDsKKworLS0KKy0tIFRlc3Qg MjogTm9uLWNvbmN1cnJlbnQgUGFydGlhbCBSZWZyZXNoCistLQorCistLSBNb2RpZnkgYmFzZSBk YXRhCitVUERBVEUgbXZfYmFzZV9hIFNFVCB2YWwgPSAnT25lIFVwZGF0ZWQnIFdIRVJFIGlkID0g MTsKK1VQREFURSBtdl9iYXNlX2EgU0VUIHZhbCA9ICdUd28gVXBkYXRlZCcgV0hFUkUgaWQgPSAy OworCistLSBSZWZyZXNoIG9ubHkgaWQ9MQorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl90 ZXN0X2EgV0hFUkUgaWQgPSAxOworCistLSBWZXJpZnk6IGlkPTEgc2hvdWxkIGJlIHVwZGF0ZWQs IGlkPTIgc2hvdWxkIHJlbWFpbiBzdGFsZQorU0VMRUNUICogRlJPTSBtdl90ZXN0X2EgT1JERVIg QlkgaWQ7CisKKy0tIFJlZnJlc2ggaWQ9MgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl90 ZXN0X2EgV0hFUkUgaWQgPSAyOworU0VMRUNUICogRlJPTSBtdl90ZXN0X2EgT1JERVIgQlkgaWQ7 CisKKy0tCistLSBUZXN0IDM6IENvbmN1cnJlbnQgUGFydGlhbCBSZWZyZXNoCistLQorCistLSBN b2RpZnkgYmFzZSBkYXRhCitVUERBVEUgbXZfYmFzZV9hIFNFVCB2YWwgPSAnT25lIENvbmN1cnJl bnQnIFdIRVJFIGlkID0gMTsKK1VQREFURSBtdl9iYXNlX2EgU0VUIHZhbCA9ICdUd28gQ29uY3Vy cmVudCcgV0hFUkUgaWQgPSAyOworCistLSBSZWZyZXNoIG9ubHkgaWQ9MQorUkVGUkVTSCBNQVRF UklBTElaRUQgVklFVyBDT05DVVJSRU5UTFkgbXZfdGVzdF9hIFdIRVJFIGlkID0gMTsKKworLS0g VmVyaWZ5OiBpZD0xIHVwZGF0ZWQsIGlkPTIgc3RhbGUKK1NFTEVDVCAqIEZST00gbXZfdGVzdF9h IE9SREVSIEJZIGlkOworCistLSBSZWZyZXNoIGlkPTIKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJ RVcgQ09OQ1VSUkVOVExZIG12X3Rlc3RfYSBXSEVSRSBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIG12 X3Rlc3RfYSBPUkRFUiBCWSBpZDsKKworLS0gQ2xlYW51cCBUZXN0IDIvMworRFJPUCBNQVRFUklB TElaRUQgVklFVyBtdl90ZXN0X2E7CitEUk9QIFRBQkxFIG12X2Jhc2VfYTsKKworLS0KKy0tIFRl c3QgNDogSm9pbiBWaWV3IChJbnZvaWNlIHN0eWxlKQorLS0KKworQ1JFQVRFIFRBQkxFIGludm9p Y2VzIChpZCBpbnQgcHJpbWFyeSBrZXksIHRvdGFsIG51bWVyaWMpOworQ1JFQVRFIFRBQkxFIGlu dm9pY2VfaXRlbXMgKGludl9pZCBpbnQgcmVmZXJlbmNlcyBpbnZvaWNlcyhpZCksIGFtb3VudCBu dW1lcmljKTsKKworSU5TRVJUIElOVE8gaW52b2ljZXMgVkFMVUVTICgxLCAwKSwgKDIsIDApOwor SU5TRVJUIElOVE8gaW52b2ljZV9pdGVtcyBWQUxVRVMgKDEsIDEwMCksICgxLCA1MCksICgyLCAy MDApOworCitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfaW52b2ljZXMgQVMKKyAgU0VMRUNU IGkuaWQsIHN1bShpaS5hbW91bnQpIGFzIGNvbXB1dGVkX3RvdGFsCisgIEZST00gaW52b2ljZXMg aQorICBKT0lOIGludm9pY2VfaXRlbXMgaWkgT04gaS5pZCA9IGlpLmludl9pZAorICBHUk9VUCBC WSBpLmlkOworCitDUkVBVEUgVU5JUVVFIElOREVYIE9OIG12X2ludm9pY2VzKGlkKTsKKworU0VM RUNUICogRlJPTSBtdl9pbnZvaWNlcyBPUkRFUiBCWSBpZDsKKworLS0gTW9kaWZ5IGl0ZW1zIGZv ciBpbnZvaWNlIDEKK0lOU0VSVCBJTlRPIGludm9pY2VfaXRlbXMgVkFMVUVTICgxLCAyNSk7Cist LSBNb2RpZnkgaXRlbXMgZm9yIGludm9pY2UgMgorSU5TRVJUIElOVE8gaW52b2ljZV9pdGVtcyBW QUxVRVMgKDIsIDUwKTsKKworLS0gUmVmcmVzaCBvbmx5IGludm9pY2UgMQorUkVGUkVTSCBNQVRF UklBTElaRUQgVklFVyBtdl9pbnZvaWNlcyBXSEVSRSBpZCA9IDE7CisKKy0tIFZlcmlmeTogSW52 b2ljZSAxIHVwZGF0ZWQgKDE3NSksIEludm9pY2UgMiBzdGFsZSAoMjAwKQorU0VMRUNUICogRlJP TSBtdl9pbnZvaWNlcyBPUkRFUiBCWSBpZDsKKworLS0gUmVmcmVzaCBpbnZvaWNlIDIgY29uY3Vy cmVudGx5CitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSBtdl9pbnZvaWNl cyBXSEVSRSBpZCA9IDI7CistLSBWZXJpZnk6IEludm9pY2UgMiB1cGRhdGVkICgyNTApCitTRUxF Q1QgKiBGUk9NIG12X2ludm9pY2VzIE9SREVSIEJZIGlkOworCitEUk9QIE1BVEVSSUFMSVpFRCBW SUVXIG12X2ludm9pY2VzOworRFJPUCBUQUJMRSBpbnZvaWNlX2l0ZW1zOworRFJPUCBUQUJMRSBp bnZvaWNlczsKKworLS0KKy0tIFRlc3QgNTogUm93cyBlbnRlcmluZy9sZWF2aW5nIHZpZXcgc2Nv cGUKKy0tCisKK0NSRUFURSBUQUJMRSBpdGVtcyAoaWQgaW50LCBzdGF0dXMgdGV4dCwgdmFsIGlu dCk7CitJTlNFUlQgSU5UTyBpdGVtcyBWQUxVRVMgKDEsICdhY3RpdmUnLCAxMCksICgyLCAnaW5h Y3RpdmUnLCAyMCk7CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9hY3RpdmVfaXRlbXMg QVMKKyAgU0VMRUNUICogRlJPTSBpdGVtcyBXSEVSRSBzdGF0dXMgPSAnYWN0aXZlJzsKKworQ1JF QVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9hY3RpdmVfaXRlbXMoaWQpOworCitTRUxFQ1QgKiBGUk9N IG12X2FjdGl2ZV9pdGVtcyBPUkRFUiBCWSBpZDsKKworLS0gQ2FzZSBBOiBSb3cgY2hhbmdlcyBz dGF0dXMgYWN0aXZlIC0+IGluYWN0aXZlIChzaG91bGQgYmUgcmVtb3ZlZCkKK1VQREFURSBpdGVt cyBTRVQgc3RhdHVzID0gJ2luYWN0aXZlJyBXSEVSRSBpZCA9IDE7CistLSBBbHNvIHVwZGF0ZSBy b3cgMiB0byBhY3RpdmUgKHNob3VsZCBiZSBhZGRlZCkKK1VQREFURSBpdGVtcyBTRVQgc3RhdHVz ID0gJ2FjdGl2ZScgV0hFUkUgaWQgPSAyOworCistLSBSZWZyZXNoIHBhcnRpYWwgV0hFUkUgaWQ9 MQorLS0gU2hvdWxkIHJlbW92ZSBpZD0xIGJlY2F1c2UgaXQgbm8gbG9uZ2VyIG1hdGNoZXMgdmll dyBkZWZpbml0aW9uCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtcyBX SEVSRSBpZCA9IDE7CitTRUxFQ1QgKiBGUk9NIG12X2FjdGl2ZV9pdGVtcyBPUkRFUiBCWSBpZDsK KworLS0gQ2FzZSBCOiBSZWZyZXNoIHRvIGFkZCByb3cgMiAod2hpY2ggaXMgbm93IGFjdGl2ZSkK K1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zIFdIRVJFIGlkID0gMjsK K1NFTEVDVCAqIEZST00gbXZfYWN0aXZlX2l0ZW1zIE9SREVSIEJZIGlkOworCistLSBDbGVhbnVw CitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtczsKK0RST1AgVEFCTEUgaXRl bXM7CisKKy0tCistLSBUZXN0IDY6IE9yZGVyIG9mIE9wZXJhdGlvbnMgKFZhbHVlIFN3YXApCist LSBBZGRyZXNzZWQgc3BlY2lmaWMgd29ycnk6ICJUaGUgb3JkZXIgb2YgdHVwbGUgcHJvY2Vzc2lu ZyBtYXR0ZXJzIgorLS0KKworQ1JFQVRFIFRBQkxFIG12X3N3YXBfYmFzZSAoaWQgaW50IHByaW1h cnkga2V5LCBjb2RlIHRleHQpOworSU5TRVJUIElOVE8gbXZfc3dhcF9iYXNlIFZBTFVFUyAoMSwg J0EnKSwgKDIsICdCJyk7CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9zd2FwIEFTIFNF TEVDVCAqIEZST00gbXZfc3dhcF9iYXNlOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9zd2Fw KGNvZGUpOyAtLSBVbmlxdWUgSW5kZXggaXMgb24gY29kZSwgbm90IElECisKK1NFTEVDVCAqIEZS T00gbXZfc3dhcCBPUkRFUiBCWSBpZDsKKworLS0gUGVyZm9ybSBhIHN3YXAgaW4gdGhlIGJhc2Ug dGFibGUKKy0tIDEgYmVjb21lcyBCLCAyIGJlY29tZXMgQQorQkVHSU47CitVUERBVEUgbXZfc3dh cF9iYXNlIFNFVCBjb2RlID0gJ1RFTVAnIFdIRVJFIGlkID0gMTsKK1VQREFURSBtdl9zd2FwX2Jh c2UgU0VUIGNvZGUgPSAnQScgV0hFUkUgaWQgPSAyOworVVBEQVRFIG12X3N3YXBfYmFzZSBTRVQg Y29kZSA9ICdCJyBXSEVSRSBpZCA9IDE7CitDT01NSVQ7CisKKy0tIFJlZnJlc2ggYm90aCByb3dz IGNvbmN1cnJlbnRseS4KKy0tIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBpbnNlcnRzICgxLCAnQicp IGJlZm9yZSBkZWxldGluZyAoMiwgJ0InKSwgdGhpcyB3aWxsIGZhaWwuCistLSBJdCByZWxpZXMg b24gdGhlIGltcGxlbWVudGF0aW9uIGNvcnJlY3RseSBoYW5kbGluZyB0aGUgRGVsZXRlL0xvY2sg c2V0IGJlZm9yZSB0aGUgSW5zZXJ0L1Vwc2VydC4KK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcg Q09OQ1VSUkVOVExZIG12X3N3YXAgV0hFUkUgaWQgSU4gKDEsIDIpOworCitTRUxFQ1QgKiBGUk9N IG12X3N3YXAgT1JERVIgQlkgaWQ7CisKK0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfc3dhcDsK K0RST1AgVEFCTEUgbXZfc3dhcF9iYXNlOworCistLQorLS0gVGVzdCA3OiBTY29wZSBEcmlmdCAv IENvbnN0cmFpbnQgVmlvbGF0aW9uCistLSBBZGRyZXNzZWQgc3BlY2lmaWMgd29ycnk6ICJJZiBX SEVSRSBwcmVkaWNhdGUgd291bGQgYmUgZGlmZmVyZW50Li4uIFVLIHZpb2xhdGlvbiBjb3VsZG4n dCBiZSBzb2x2ZWQiCistLQorCitDUkVBVEUgVEFCTEUgbXZfZHJpZnRfYmFzZSAoaWQgaW50IHBy aW1hcnkga2V5LCBjYXRlZ29yeV9pZCBpbnQpOworSU5TRVJUIElOVE8gbXZfZHJpZnRfYmFzZSBW QUxVRVMgKDEsIDEwMCksICgyLCAyMDApOworCitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZf ZHJpZnQgQVMgU0VMRUNUICogRlJPTSBtdl9kcmlmdF9iYXNlOworLS0gS0VZIEZJWDogSW5kZXgg b24gSUQsIG5vdCBDYXRlZ29yeS4KKy0tIFdlIHdhbnQgdG8gdGVzdCB0aGF0IHRoZSBSZWZyZXNo IGxvZ2ljIGRldGVjdHMgSUQgY29uZmxpY3RzIHdoZW4gcm93cyBkcmlmdCBpbnRvIHNjb3BlLAor LS0gbm90IHRoYXQgUG9zdGdyZXMgZW5mb3JjZXMgdW5pcXVlIGluZGV4ZXMgb24gbm9uLXVuaXF1 ZSBkYXRhLgorQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9kcmlmdChpZCk7CisKKy0tIFVwZGF0 ZSBSb3cgMSB0byBjb2xsaWRlIHdpdGggUm93IDIncyBjYXRlZ29yeQorVVBEQVRFIG12X2RyaWZ0 X2Jhc2UgU0VUIGNhdGVnb3J5X2lkID0gMjAwIFdIRVJFIGlkID0gMTsKKworLS0gQXR0ZW1wdCB0 byByZWZyZXNoIHVzaW5nIHRoZSBORVcgY2F0ZWdvcnkgdmFsdWUgYXMgdGhlIGZpbHRlci4KKy0t IFRoZSBWaWV3IHN0aWxsIGNvbnRhaW5zICgxLCAxMDApLgorLS0gVGhlIEZpbHRlciAiY2F0ZWdv cnlfaWQgPSAyMDAiIHNlZXMgdGhlIE5FVyByb3cgKDEsIDIwMCkgaW4gdGhlIGJhc2UgdGFibGUu CistLSBUaGUgRmlsdGVyICJjYXRlZ29yeV9pZCA9IDIwMCIgZG9lcyBOT1Qgc2VlIHRoZSBPTEQg cm93ICgxLCAxMDApIGluIHRoZSBWaWV3LgorLS0gUmVzdWx0OiBUaGUgc3lzdGVtIHRoaW5rcyAo MSwgMjAwKSBpcyBhIGJyYW5kIG5ldyByb3cgYW5kIHRyaWVzIHRvIElOU0VSVCBpdC4KKy0tIFRo aXMgTVVTVCBmYWlsIHdpdGggYSBVbmlxdWUgQ29uc3RyYWludCBWaW9sYXRpb24gb24gJ2lkJyBi ZWNhdXNlICgxLCAxMDApIHdhcyBuZXZlciBkZWxldGVkLgorXHNldCBWRVJCT1NJVFkgdGVyc2UK K1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09OQ1VSUkVOVExZIG12X2RyaWZ0IFdIRVJFIGNh dGVnb3J5X2lkID0gMjAwOworXHNldCBWRVJCT1NJVFkgZGVmYXVsdAorCistLSBDb3JyZWN0IHVz YWdlOiBTY29wZSBtdXN0IGluY2x1ZGUgQk9USCB0aGUgT2xkIGxvY2F0aW9uICgxMDApIGFuZCBO ZXcgbG9jYXRpb24gKDIwMCkKKy0tIHNvIHRoZSBzeXN0ZW0gc2VlcyB0aGUgdXBkYXRlIGFzIGFu IHVwZGF0ZSAob3IgZGVsZXRlK2luc2VydCkuCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIENP TkNVUlJFTlRMWSBtdl9kcmlmdCBXSEVSRSBjYXRlZ29yeV9pZCBJTiAoMTAwLCAyMDApOworCitT RUxFQ1QgKiBGUk9NIG12X2RyaWZ0IE9SREVSIEJZIGlkOworCitEUk9QIE1BVEVSSUFMSVpFRCBW SUVXIG12X2RyaWZ0OworRFJPUCBUQUJMRSBtdl9kcmlmdF9iYXNlOworCistLQorLS0gVGVzdCA4 OiBNdWx0aXBsZSBVbmlxdWUgS2V5cworLS0gQWRkcmVzc2VkIHNwZWNpZmljIHdvcnJ5OiAid2hh dCBpZiB3ZSBoYXZlIG11bHRpcGxlIFVLcz8iCistLQorCitDUkVBVEUgVEFCTEUgbXZfbXVsdGlf dWsgKGlkIGludCBwcmltYXJ5IGtleSwgZW1haWwgdGV4dCwgdXNlcm5hbWUgdGV4dCk7CitJTlNF UlQgSU5UTyBtdl9tdWx0aV91ayBWQUxVRVMgKDEsICdhQGV4YW1wbGUuY29tJywgJ3VzZXJfYScp OworCitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfbXVsdGkgQVMgU0VMRUNUICogRlJPTSBt dl9tdWx0aV91azsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gbXZfbXVsdGkoZW1haWwpOworQ1JF QVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9tdWx0aSh1c2VybmFtZSk7CisKKy0tIFVwZGF0ZSBhbGwg Y29sdW1ucworVVBEQVRFIG12X211bHRpX3VrIFNFVCBlbWFpbCA9ICdiQGV4YW1wbGUuY29tJywg dXNlcm5hbWUgPSAndXNlcl9iJyBXSEVSRSBpZCA9IDE7CisKKy0tIFJlZnJlc2ggc2hvdWxkIHN1 Y2NlZWQgdXBkYXRpbmcgYWxsIHVuaXF1ZSBpbmRleGVzCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIENPTkNVUlJFTlRMWSBtdl9tdWx0aSBXSEVSRSBpZCA9IDE7CisKK1NFTEVDVCAqIEZST00g bXZfbXVsdGk7CisKK0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfbXVsdGk7CitEUk9QIFRBQkxF IG12X211bHRpX3VrOworCistLQorLS0gVGVzdCA5OiBUcmlnZ2VyLWJhc2VkIEF1dG9tYXRpYyBN YWludGVuYW5jZQorLS0gVXNlIENhc2U6IEF1dG9tYXRpbmcgdGhlIHBhcnRpYWwgcmVmcmVzaCB2 aWEgdHJpZ2dlcnMgdXNpbmcgQXJyYXlzLgorLS0KKworQ1JFQVRFIFRBQkxFIG12X3RyaWdnZXJf YmFzZSAoaWQgaW50IHByaW1hcnkga2V5LCB2YWwgdGV4dCk7CitDUkVBVEUgTUFURVJJQUxJWkVE IFZJRVcgbXZfdHJpZ2dlcl92aWV3IEFTIFNFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl9iYXNlOwor Q1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl90cmlnZ2VyX3ZpZXcoaWQpOworCistLSBDcmVhdGUg YSBtYWludGFpbmVyIGZ1bmN0aW9uCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBtYWludGFp bl9tdl90cmlnZ2VyX3ZpZXcoKSBSRVRVUk5TIFRSSUdHRVIgQVMgJCQKK0JFR0lOCisgICAgSUYg KFRHX09QIElOICgnSU5TRVJUJywgJ1VQREFURScpKSBUSEVOCisgICAgICAgIEVYRUNVVEUgJ1JF RlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdHJpZ2dlcl92aWV3IFdIRVJFIGlkID0gQU5ZKCQx KTsnCisgICAgICAgICAgICBVU0lORyAoU0VMRUNUIGFycmF5X2FnZyhpZCkgRlJPTSBuZXdfdGFi bGUpOworICAgIEVORCBJRjsKKworICAgIElGIChUR19PUCBJTiAoJ0RFTEVURScpKSBUSEVOCisg ICAgICAgIEVYRUNVVEUgJ1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdHJpZ2dlcl92aWV3 IFdIRVJFIGlkID0gQU5ZKCQxKTsnCisgICAgICAgICAgICBVU0lORyAoU0VMRUNUIGFycmF5X2Fn ZyhpZCkgRlJPTSBvbGRfdGFibGUpOworICAgIEVORCBJRjsKKworICAgIFJFVFVSTiBOVUxMOwor RU5EOworJCQgTEFOR1VBR0UgcGxwZ3NxbCBWT0xBVElMRTsKKworLS0gVHJpZ2dlciBmb3IgSW5z ZXJ0CitDUkVBVEUgVFJJR0dFUiB0X3JlZnJlc2hfbXZfaW5zCisgICAgQUZURVIgSU5TRVJUIE9O IG12X3RyaWdnZXJfYmFzZQorICAgIFJFRkVSRU5DSU5HIE5FVyBUQUJMRSBBUyBuZXdfdGFibGUK KyAgICBGT1IgRUFDSCBTVEFURU1FTlQKK0VYRUNVVEUgRlVOQ1RJT04gbWFpbnRhaW5fbXZfdHJp Z2dlcl92aWV3KCk7CisKKy0tIFRyaWdnZXIgZm9yIFVwZGF0ZQorQ1JFQVRFIFRSSUdHRVIgdF9y ZWZyZXNoX212X3VwZAorICAgIEFGVEVSIFVQREFURSBPTiBtdl90cmlnZ2VyX2Jhc2UKKyAgICBS RUZFUkVOQ0lORyBORVcgVEFCTEUgQVMgbmV3X3RhYmxlCisgICAgRk9SIEVBQ0ggU1RBVEVNRU5U CitFWEVDVVRFIEZVTkNUSU9OIG1haW50YWluX212X3RyaWdnZXJfdmlldygpOworCistLSBUcmln Z2VyIGZvciBEZWxldGUKK0NSRUFURSBUUklHR0VSIHRfcmVmcmVzaF9tdl9kZWwKKyAgICBBRlRF UiBERUxFVEUgT04gbXZfdHJpZ2dlcl9iYXNlCisgICAgUkVGRVJFTkNJTkcgT0xEIFRBQkxFIEFT IG9sZF90YWJsZQorICAgIEZPUiBFQUNIIFNUQVRFTUVOVAorRVhFQ1VURSBGVU5DVElPTiBtYWlu dGFpbl9tdl90cmlnZ2VyX3ZpZXcoKTsKKworLS0gMS4gVGVzdCBJbnNlcnQKK0lOU0VSVCBJTlRP IG12X3RyaWdnZXJfYmFzZSBWQUxVRVMgKDEsICdBdXRvLUluc2VydCcpLCAoMiwgJ0F1dG8tSW5z ZXJ0Jyk7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdnZXJfdmlldyBPUkRFUiBCWSBpZDsKKworLS0g Mi4gVGVzdCBVcGRhdGUKK1VQREFURSBtdl90cmlnZ2VyX2Jhc2UgU0VUIHZhbCA9ICdBdXRvLVVw ZGF0ZScgV0hFUkUgaWQgPSAxOworU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX3ZpZXcgT1JERVIg QlkgaWQ7CisKKy0tIDMuIFRlc3QgRGVsZXRlCitERUxFVEUgRlJPTSBtdl90cmlnZ2VyX2Jhc2Ug V0hFUkUgaWQgPSAyOworU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX3ZpZXcgT1JERVIgQlkgaWQ7 CisKKy0tIDQuIFZlcmlmeSBUcmFuc2FjdGlvbiBJc29sYXRpb24KKy0tIEVuc3VyZSB0aGF0IGlm IHRoZSBtYWluIHRyYW5zYWN0aW9uIHJvbGxzIGJhY2ssIHRoZSBSZWZyZXNoIGFsc28gcm9sbHMg YmFjaworQkVHSU47CitJTlNFUlQgSU5UTyBtdl90cmlnZ2VyX2Jhc2UgVkFMVUVTICg5OSwgJ1Jv bGxiYWNrJyk7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdnZXJfdmlldyBXSEVSRSBpZCA9IDk5OyAt LSBTaG91bGQgc2VlIGl0CitST0xMQkFDSzsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl92aWV3 IFdIRVJFIGlkID0gOTk7IC0tIFNob3VsZCBOT1Qgc2VlIGl0CisKKy0tIENsZWFudXAKK0RST1Ag TUFURVJJQUxJWkVEIFZJRVcgbXZfdHJpZ2dlcl92aWV3OworRFJPUCBUQUJMRSBtdl90cmlnZ2Vy X2Jhc2U7CitEUk9QIEZVTkNUSU9OIG1haW50YWluX212X3RyaWdnZXJfdmlldygpOwotLSAKMi4z NC4xCgo= --0000000000007e3e940645770fe2--