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 1wbdxh-002jP8-2y for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 12:41:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wbdxg-006Z0G-2m for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 12:41:12 +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 1wbdxg-006Z08-1B for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 12:41:12 +0000 Received: from mail-ej1-x62c.google.com ([2a00:1450:4864:20::62c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wbdxd-00000001kun-1ddW for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 12:41:11 +0000 Received: by mail-ej1-x62c.google.com with SMTP id a640c23a62f3a-c08acccf4a4so443961366b.3 for ; Mon, 22 Jun 2026 05:41:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782132067; cv=none; d=google.com; s=arc-20240605; b=LTSgCUFh3VXpsbmR3u1ySESuH6enI3g9gal1IAd7n4YTf28GAx8U2xBrWWJNBp24se UNpjnihQNcMQI6NCRxHdtbcwdjsiV+GgToWVtMmaGxztWh4jhy2DQzQygy7IcCq1tURl AEArU0FESptKLCJI6cLiFS4fYpr/M9MU4lYgav/ig9Yz/qYDB3KAiQPBxc+VBxRKZogq 225eBdX2PAExU6VNrQ3C5afCsk9LKsVNT6T0nNE3CLwzjlk2Xegexw2AnbUQz+rDZz2V YgSLYCanZg2UQQjw8cg8pMRyVjucb5a2BlbmR+vLE2uO/vKbJFHXm2ISy3QcUZ8d4g7r N1gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=siChR4w1FtX+wfamh+Xy4FDsBuZO2RQcCT8MEchACcg=; fh=Wwxc7HeSpJab+u+ZDVAt75ouIAJ6zj6C0h5ytpyu8H8=; b=BwkxjFTRLtgaJx9VcQSMI18p4mn0WcM1wdC6C94AD17/HB/Oxy+Vk0De85DV24IcEL uRvZ6pkPrZql3+z1pox5c0yNxeSd8g2EaXCQYm4D/LiS9/CGJobFFt3g2mT81j3iiVMj /i533cOLfnbPUCLkTl+uiB9mBQoxJb354T8u/r2QVijwf6zuA9EOFbBdzHff0AOT+2w7 pG7PYZ/KQw5c0jxRVKGKEfFW/QdrtJ5p2hGNqDyGffNGeT5LdyQQeUJOCIHPXqqkCTD7 CoGIsWCPcRx2KUL6hEjkNibINYe2HaLJcmVnbPtd/Nnexydc75f9sruIOWp2OP4FmlkN gqaA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1782132067; x=1782736867; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=siChR4w1FtX+wfamh+Xy4FDsBuZO2RQcCT8MEchACcg=; b=kbMDdlwDWm8sgjkd8Q/tJDXMLkdzJE0LXjj/hvrV1lctEO+DlXbpjG0CVHUYCYvdg3 D5ahKCEbTNsFH51CRwg6E3+Q6lKICHdxyAQ7gdF4RFE5lBsrKpdfw9dWXwqRbA7qwoXO RH45xMnuIvGIjifSGazziZ6yyquDrZlVhH27nBssiSNUHaottGcU2GyprzKRR0fjElG1 tnLk7Mclxu1R3PF3tu8nwiEVv11WWksdkAFukm+hF6AzO9NGYXdm2/zckNrSv15KaPhF fzM9pPnJy4BcO5WqFFsVmBmUOeMF39P5PER8yn6UhAj5t5ZT3WKLIY/76Z5E8/QYr1JM 4tXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782132067; x=1782736867; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=siChR4w1FtX+wfamh+Xy4FDsBuZO2RQcCT8MEchACcg=; b=mCl3a52IsGYyNg2VMX8WCUHt2KT4Mx8sxyWznONOORPa9pYesexGYRZru+y0rfLMTY Jg2HPrpwZzZfQOq9s25syXBINA86SGZjb3g+VITcRgqMwQhMBtHmHr237RdISeIzRM7r o0VxB2eAFlqF0C9COoQdwsIju9sLWMuEgX8+E0dipQAYCkere3zcLx8REipjNhrvYyfW Wxik+3kCJjaRkZiPrrs5C2inS29mOCg+zQwctcbv/duqSYKjYInMvQQFyntMHoERptno avz7m0bMjEdxfgov+wZ3BlQuqur3uwvOq97uqFpzNwaC+iCWIeEox0ZTKT/52GwxC8Ea e30A== X-Forwarded-Encrypted: i=1; AFNElJ98Lj36QnLm9S6uOVIxSh0l84wmb0yX9rsA7jG3rvspk2kZEgUEbItmHfMfpuCes+iehVsuxGHLO8WWSnjo@lists.postgresql.org X-Gm-Message-State: AOJu0YzwxUAmJFYW5RUHB+5pJVV6QtpfjT2siAJptdsDHySGNWcDhdYO T2ROXXuabfYkrWGaMYoFx011wC+/YX5nWr638EqoPBzwtwDai3AbQn2/B5p8lRPhiKwr8z74ZSs OGi8elMEkkRdmGp+wfoD13lCeFNgtJefFsCM/Edsg X-Gm-Gg: AfdE7cn9clljontP7jlOtqrhtjEZaus/WbdRXf+n0kQlo2a8CAMeIupsK2lj2njqwrh jX3npRf05PPgC5h1pDml2p2W4TjYhWzkos/DhyUFjZvAm4JAfpCqGyAUq6GUeiaVXRN90e9tbh0 8fvzcJi/k0Sb2/+cQd9rX5OnWorrBB7PgbuMgNz7lhhF5p4gP710hS5fZcsZ92GAUN7rRWzOZr8 aRz9qmXcKpjQDnPNMLzKhg9gb7ctNm5pSbzPZWV2vS14+YS4j3OPnoeJa2oMkKOArMQLPFAtg== X-Received: by 2002:a17:907:a806:b0:c07:e0b6:13ff with SMTP id a640c23a62f3a-c0b62136ce1mr617077866b.30.1782132066591; Mon, 22 Jun 2026 05:41:06 -0700 (PDT) MIME-Version: 1.0 References: <983C7B03-D9C3-4F15-8913-7616EC5E6414@gmail.com> In-Reply-To: <983C7B03-D9C3-4F15-8913-7616EC5E6414@gmail.com> From: Akshay Joshi Date: Mon, 22 Jun 2026 18:10:53 +0530 X-Gm-Features: AVVi8Cc5RXe6sUgtA9DynXhXtZCRMmEVWtQ5YmgpHIzTzR6dV76chs9iZ7bFwjU Message-ID: Subject: Re: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: Chao Li Cc: Zsolt Parragi , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000c5fa380654d6f485" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c5fa380654d6f485 Content-Type: multipart/alternative; boundary="000000000000c5fa360654d6f483" --000000000000c5fa360654d6f483 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable You're right, and thanks for spotting this. The existing pattern in pg_proc.dat for variadic-text functions (e.g., jsonb_delete, json_extract_path) uses _text at the variadic position in both proargtypes and proallargtypes, with provariadic =3D> 'text'. That is the convention documented by the sanity check in src/test/regress/sql/opr_sanity.sql. The same issue applies to *pg_get_role_ddl*, *pg_get_tablespace_ddl* (both variants), and *pg_get_database_ddl*, but that will require a separate patch. The v9 patch is ready for review. On Mon, Jun 22, 2026 at 12:25=E2=80=AFPM Chao Li w= rote: > > > > On Jun 22, 2026, at 14:26, Akshay Joshi > wrote: > > > > Thanks for the review; you're right, `includes_foreign_keys=3Dfalse` on > its own is a half-measure. Re-running with the default to add FKs back > collides with the existing CREATE TABLE, UNIQUE indexes, etc. > > > > I've added an only_foreign_keys option (boolean, default false) as the > natural complement of includes_foreign_keys=3Dfalse. When set to true, th= e > function emits only the ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY > statements and suppresses everything else (CREATE TABLE, owner, indexes, > non-FK constraints, rules, statistics, replica identity, RLS toggles). > Partition-child recursion still runs so child FKs are reached too. > Combining `only_foreign_keys=3Dtrue` with `includes_foreign_keys=3Dfalse`= is > rejected upfront since it would produce no output. > > > > The documentation paragraph for `includes_foreign_keys` now directs > users to `only_foreign_keys` as the intended second pass. Regression > coverage adds three cases: the FK-only emission for your cons example, th= e > zero-row result for a table without FKs, and the error path. > > > > The v8 patch is ready for review. > > > > On Sat, Jun 20, 2026 at 1:15=E2=80=AFAM Zsolt Parragi > wrote: > > The previous features all look good to me, I only have one question > > for the new flag. > > > > > Calling > > > pg_get_table_ddl(t, 'includes_foreign_keys', 'false') now emits > everything > > > except FOREIGN KEY constraints. This covers the multi-tenant clone > > > workflow: create tables first without cross-table references, then > re-run > > > with the default to add the constraints once all targets exist. > > > > I think this feature needs a bit more documentation, an > > "only_foreign_keys" flag, or both. > > > > CREATE TABLE refd (id int PRIMARY KEY); > > CREATE TABLE cons (a int CHECK(a>0), b int UNIQUE, c int REFERENCES > refd(id)); > > > > -- pass 1: running without foreign keys > > SELECT * FROM pg_get_table_ddl('cons','includes_foreign_keys','false'); > > -- execute everything > > > > -- loading data > > > > -- pass 2: running with everything > > SELECT * FROM pg_get_table_ddl('cons','includes_foreign_keys','true'); > > -- ERROR: relation "cons" already exists (and the unique constraint > > also collides) > > > > I could do a "grep FOREIGN KEY" before executing (unless it's a tricky > > schema where that phrase appears elsewhere), or since psql continues > > on error, it will simply work if I accept a significant error noise, > > but then the documentation should be clear about this limitation. > > Following the documented approach and getting a bunch of unexpected > > errors could be confusing for users. > > > > > > > > I have a comment, or maybe a question: > ``` > +{ oid =3D> '8215', descr =3D> 'get DDL to recreate a table', > + proname =3D> 'pg_get_table_ddl', prorows =3D> '50', provariadic =3D> '= text', > + proisstrict =3D> 'f', proretset =3D> 't', provolatile =3D> 's', propar= allel > =3D> 'r', > + pronargdefaults =3D> '1', prorettype =3D> 'text', > + proargtypes =3D> 'regclass text', proallargtypes =3D> '{regclass,text}= ', > + proargmodes =3D> '{i,v}', proargdefaults =3D> '{NULL}', > + prosrc =3D> 'pg_get_table_ddl' }, > ``` > > Since provariadic is text, I wonder if proallargtypes should be > {regclass,_text}, with _text meaning an array of text. > > I=E2=80=99m asking because I have had this suspicion for some time. I saw= a few > other procs using the same pattern, for example: > ``` > { oid =3D> '6501', descr =3D> 'get DDL to recreate a role', > proname =3D> 'pg_get_role_ddl', prorows =3D> '10', provariadic =3D> 'te= xt', > proisstrict =3D> 'f', proretset =3D> 't', provolatile =3D> 's', > pronargdefaults =3D> '1', prorettype =3D> 'text', proargtypes =3D> 'reg= role > text', > proallargtypes =3D> '{regrole,text}', proargmodes =3D> '{i,v}', > proargdefaults =3D> '{NULL}', prosrc =3D> 'pg_get_role_ddl' }, > ``` > > But for jsonb_delete etc procs, _text is used: > ``` > { oid =3D> '3343', > proname =3D> 'jsonb_delete', provariadic =3D> 'text', prorettype =3D> '= jsonb', > proargtypes =3D> 'jsonb _text', proallargtypes =3D> '{jsonb,_text}', > proargmodes =3D> '{i,v}', proargnames =3D> '{from_json,path_elems}', > prosrc =3D> 'jsonb_delete_array' }, > ``` > > So I wonder whether =E2=80=9Ctext=E2=80=9D rather than =E2=80=9C_text" is= intentionally used in > proallargtypes, or if this was just never noticed. > > Best regards, > -- > Chao Li (Evan) > HighGo Software Co., Ltd. > https://www.highgo.com/ > > > > > --000000000000c5fa360654d6f483 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
You're right, and thanks for spotting this. The existi= ng pattern in pg_proc.dat for variadic-text functions (e.g., jsonb_delete, = json_extract_path) uses _text at the variadic position in both proargtypes = and proallargtypes, with provariadic =3D> 'text'. That is the co= nvention documented by the sanity check in src/test/regress/sql/opr_sanity.= sql.

The same issue applies to pg_get_role_ddl, pg_get_tab= lespace_ddl (both variants), and pg_get_database_ddl, but that w= ill require a separate patch.

The v9 patch is ready for review.
On Mon, Jun 22, 2026 at 12:25=E2=80=AFPM Chao Li <li.evan.chao@gmail.com> wrote:<= br>


> On Jun 22, 2026, at 14:26, Akshay Joshi <akshay.joshi@enterprisedb.com&= gt; wrote:
>
> Thanks for the review; you're right, `includes_foreign_keys=3Dfals= e` on its own is a half-measure. Re-running with the default to add FKs bac= k collides with the existing CREATE TABLE, UNIQUE indexes, etc.
>
> I've added an only_foreign_keys option (boolean, default false) as= the natural complement of includes_foreign_keys=3Dfalse. When set to true,= the function emits only the ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY= statements and suppresses everything else (CREATE TABLE, owner, indexes, n= on-FK constraints, rules, statistics, replica identity, RLS toggles). Parti= tion-child recursion still runs so child FKs are reached too. Combining `on= ly_foreign_keys=3Dtrue` with `includes_foreign_keys=3Dfalse` is rejected up= front since it would produce no output.
>
> The documentation paragraph for `includes_foreign_keys` now directs us= ers to `only_foreign_keys` as the intended second pass. Regression coverage= adds three cases: the FK-only emission for your cons example, the zero-row= result for a table without FKs, and the error path.
>
> The v8 patch is ready for review.
>
> On Sat, Jun 20, 2026 at 1:15=E2=80=AFAM Zsolt Parragi <zsolt.parragi@percona.co= m> wrote:
> The previous features all look good to me, I only have one question > for the new flag.
>
> > Calling
> > pg_get_table_ddl(t, 'includes_foreign_keys', 'false&#= 39;) now emits everything
> > except FOREIGN KEY constraints. This covers the multi-tenant clon= e
> > workflow: create tables first without cross-table references, the= n re-run
> > with the default to add the constraints once all targets exist. >
> I think this feature needs a bit more documentation, an
> "only_foreign_keys" flag, or both.
>
> CREATE TABLE refd (id int PRIMARY KEY);
> CREATE TABLE cons (a int CHECK(a>0), b int UNIQUE, c int REFERENCES= refd(id));
>
> -- pass 1: running without foreign keys
> SELECT * FROM pg_get_table_ddl('cons','includes_foreign_ke= ys','false');
> -- execute everything
>
> -- loading data
>
> -- pass 2: running with everything
> SELECT * FROM pg_get_table_ddl('cons','includes_foreign_ke= ys','true');
> -- ERROR: relation "cons" already exists (and the unique con= straint
> also collides)
>
> I could do a "grep FOREIGN KEY" before executing (unless it&= #39;s a tricky
> schema where that phrase appears elsewhere), or since psql continues > on error, it will simply work if I accept a significant error noise, > but then the documentation should be clear about this limitation.
> Following the documented approach and getting a bunch of unexpected > errors could be confusing for users.
>
>
> <v8-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch>=

I have a comment, or maybe a question:
```
+{ oid =3D> '8215', descr =3D> 'get DDL to recreate a tab= le',
+=C2=A0 proname =3D> 'pg_get_table_ddl', prorows =3D> '50= ', provariadic =3D> 'text',
+=C2=A0 proisstrict =3D> 'f', proretset =3D> 't', pro= volatile =3D> 's', proparallel =3D> 'r',
+=C2=A0 pronargdefaults =3D> '1', prorettype =3D> 'text&#= 39;,
+=C2=A0 proargtypes =3D> 'regclass text', proallargtypes =3D>= '{regclass,text}',
+=C2=A0 proargmodes =3D> '{i,v}', proargdefaults =3D> '{N= ULL}',
+=C2=A0 prosrc =3D> 'pg_get_table_ddl' },
```

Since provariadic is text, I wonder if proallargtypes should be {regclass,_= text}, with _text meaning an array of text.

I=E2=80=99m asking because I have had this suspicion for some time. I saw a= few other procs using the same pattern, for example:
```
{ oid =3D> '6501', descr =3D> 'get DDL to recreate a role= ',
=C2=A0 proname =3D> 'pg_get_role_ddl', prorows =3D> '10&#= 39;, provariadic =3D> 'text',
=C2=A0 proisstrict =3D> 'f', proretset =3D> 't', prov= olatile =3D> 's',
=C2=A0 pronargdefaults =3D> '1', prorettype =3D> 'text= 9;, proargtypes =3D> 'regrole text',
=C2=A0 proallargtypes =3D> '{regrole,text}', proargmodes =3D>= '{i,v}',
=C2=A0 proargdefaults =3D> '{NULL}', prosrc =3D> 'pg_get_= role_ddl' },
```

But for jsonb_delete etc procs, _text is used:
```
{ oid =3D> '3343',
=C2=A0 proname =3D> 'jsonb_delete', provariadic =3D> 'tex= t', prorettype =3D> 'jsonb',
=C2=A0 proargtypes =3D> 'jsonb _text', proallargtypes =3D> &#= 39;{jsonb,_text}',
=C2=A0 proargmodes =3D> '{i,v}', proargnames =3D> '{from_= json,path_elems}',
=C2=A0 prosrc =3D> 'jsonb_delete_array' },
```

So I wonder whether =E2=80=9Ctext=E2=80=9D rather than =E2=80=9C_text"= is intentionally used in proallargtypes, or if this was just never noticed= .

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
ht= tps://www.highgo.com/




--000000000000c5fa360654d6f483-- --000000000000c5fa380654d6f485 Content-Type: application/octet-stream; name="v9-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v9-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqp7edjx0 RnJvbSBmMDI5MTZlMmZmNTJmMTA5NmJjNzI3MDY4NjU3ODQ2MmRhOWFlZjIyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHY5XSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM RQogc3RhdGVtZW50cwoKVGhlIGZ1bmN0aW9uIHJlY29uc3RydWN0cyB0aGUgQ1JFQVRFIFRBQkxF IHN0YXRlbWVudCBmb3IgYW4gb3JkaW5hcnkgb3IKcGFydGl0aW9uZWQgdGFibGUsIGZvbGxvd2Vk IGJ5IHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvCkNSRUFURSBSVUxFIC8gQ1JFQVRF IFNUQVRJU1RJQ1Mgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVzdG9yZSBpdHMgZnVsbApkZWZpbml0 aW9uLiAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSByb3cuCgpTdXBw b3J0ZWQgcGVyLWNvbHVtbiBmZWF0dXJlczogZGF0YSB0eXBlIHdpdGggdHlwZSBtb2RpZmllcnMs IENPTExBVEUsClNUT1JBR0UsIENPTVBSRVNTSU9OIChwZ2x6IC8gbHo0KSwgR0VORVJBVEVEIEFM V0FZUyBBUyAoZXhwcikKU1RPUkVEL1ZJUlRVQUwsIEdFTkVSQVRFRCBBTFdBWVN8QlkgREVGQVVM VCBBUyBJREVOVElUWSAod2l0aCBzZXF1ZW5jZQpvcHRpb25zKSwgREVGQVVMVCwgTk9UIE5VTEws IGFuZCBwZXItY29sdW1uIGF0dG9wdGlvbnMgZW1pdHRlZCBhcwpBTFRFUiBDT0xVTU4gU0VUICgu Li4pLgoKU3VwcG9ydGVkIHRhYmxlLWxldmVsIGZlYXR1cmVzOiBVTkxPR0dFRCwgSU5IRVJJVFMs IFBBUlRJVElPTiBCWSAoUkFOR0UKLyBMSVNUIC8gSEFTSCBwYXJlbnRzKSwgUEFSVElUSU9OIE9G IHBhcmVudCBGT1IgVkFMVUVTIChGUk9NL1RPLCBXSVRICm1vZHVsdXMvcmVtYWluZGVyLCBERUZB VUxUKSwgVVNJTkcgdGFibGUgYWNjZXNzIG1ldGhvZCwgV0lUSAoocmVsb3B0aW9ucyksIFRBQkxF U1BBQ0UsIGFuZCBpbmxpbmUgQ0hFQ0sgY29uc3RyYWludHMgaW4gdGhlCkNSRUFURSBUQUJMRSBi b2R5LgoKU3VwcG9ydGVkIHN1Yi1vYmplY3RzIChyZS11c2luZyBleGlzdGluZyBkZXBhcnNlIGhl bHBlcnMgZnJvbQpydWxldXRpbHMuYyk6IGluZGV4ZXMgdmlhIHBnX2dldF9pbmRleGRlZl9zdHJp bmcsIGNvbnN0cmFpbnRzCihQUklNQVJZIEtFWSwgVU5JUVVFLCBGT1JFSUdOIEtFWSwgRVhDTFVE RSwgbmFtZWQgTk9UIE5VTEwpIHZpYQpwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBydWxl cyB2aWEgcGdfZ2V0X3J1bGVkZWYsIGV4dGVuZGVkCnN0YXRpc3RpY3MgdmlhIHBnX2dldF9zdGF0 aXN0aWNzb2JqZGVmX3N0cmluZywgUkVQTElDQSBJREVOVElUWQpOT1RISU5HL0ZVTEwvVVNJTkcg SU5ERVgsIEFMVEVSIFRBQkxFIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFksCmFuZCBj aGlsZC1sb2NhbCBERUZBVUxUIG92ZXJyaWRlcyBvbiBpbmhlcml0YW5jZS9wYXJ0aXRpb24gY2hp bGRyZW4uCgpEZWZhdWx0IG9taXNzaW9uIGNvbnZlbnRpb246IGV2ZXJ5IG9wdGlvbmFsIGNsYXVz ZSBpcyBkcm9wcGVkIHdoZW4gaXRzCnZhbHVlIGVxdWFscyB3aGF0IHRoZSBzeXN0ZW0gd291bGQg cmVhcHBseSBvbiByb3VuZC10cmlwLCBpbmNsdWRpbmcKdHlwZS1kZWZhdWx0IENPTExBVEUsIHBl ci10eXBlIFNUT1JBR0UsIHRoZSBhdXRvLWdlbmVyYXRlZCBpZGVudGl0eQpzZXF1ZW5jZSBuYW1l IGFuZCBwYXJhbWV0ZXIgZGVmYXVsdHMsIGhlYXAgYWNjZXNzIG1ldGhvZCwgZGVmYXVsdApSRVBM SUNBIElERU5USVRZLCBkaXNhYmxlZCBSTFMgdG9nZ2xlcywgZW1wdHkgcmVsb3B0aW9ucywgYW5k IHRoZQpkZWZhdWx0IHRhYmxlc3BhY2UuCgpBIHJlZ3Jlc3Npb24gdGVzdCB1bmRlciBzcmMvdGVz dC9yZWdyZXNzIGNvdmVycyBvcmRpbmFyeSB0YWJsZXMsCmlkZW50aXR5IChkZWZhdWx0IGFuZCBj dXN0b20gc2VxdWVuY2Ugb3B0aW9ucyksIGdlbmVyYXRlZCBjb2x1bW5zLApTVE9SQUdFL0NPTVBS RVNTSU9OLCBjb25zdHJhaW50cyAoQ0hFQ0svVU5JUVVFL0ZLIHdpdGggZGVmZXJyYWJsZSksCmZ1 bmN0aW9uYWwgYW5kIHBhcnRpYWwgaW5kZXhlcywgaW5oZXJpdGFuY2UgYW5kIHBhcnRpdGlvbmlu ZywKcGFydGl0aW9uIGNoaWxkcmVuIHdpdGggRk9SIFZBTFVFUyBGUk9NL1RPLCBXSVRIIG1vZHVs dXMvcmVtYWluZGVyLCBhbmQKREVGQVVMVCwgcnVsZXMsIGV4dGVuZGVkIHN0YXRpc3RpY3MsIFJM UyB0b2dnbGVzLCBSRVBMSUNBIElERU5USVRZLApVTkxPR0dFRCB3aXRoIHJlbG9wdGlvbnMsIHBl ci1jb2x1bW4gYXR0b3B0aW9ucywgY2hpbGQgREVGQVVMVApvdmVycmlkZXMsIHByZXR0eSBtb2Rl LCBvd25lcj1mYWxzZSwgYW5kIHRoZSBlcnJvciBwYXRocyBmb3Igdmlld3MsCnNlcXVlbmNlcywg TlVMTCwgdW5rbm93biBvcHRpb25zLCBhbmQgb2RkLXZhcmlhZGljIGFyZ3VtZW50IGNvdW50cy4K CkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9zaGlAZW50ZXJwcmlzZWRiLmNvbT4KUmV2 aWV3ZWQtYnk6IE1hcmNvcyBQZWdvcmFybyA8bWFyY29zQGYxMC5jb20uYnI+ClJldmlld2VkLWJ5 OiBac29sdCBQYXJyYWdpIDx6c29sdC5wYXJyYWdpQHBlcmNvbmEuY29tPgpSZXZpZXdlZC1ieTog S3lvdGFybyBIb3JpZ3VjaGkgPGhvcmlreW90YS5udHRAZ21haWwuY29tPgpSZXZpZXdlZC1ieTog Q2hhbyBMaSA8bGkuZXZhbi5jaGFvQGdtYWlsLmNvbT4KLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy9m dW5jLWluZm8uc2dtbCAgICAgICAgICAgICAgfCAgMTA1ICsKIHNyYy9iYWNrZW5kL2NhdGFsb2cv cGdfaW5oZXJpdHMuYyAgICAgICAgICAgICB8ICAgOTMgKwogc3JjL2JhY2tlbmQvY29tbWFuZHMv dGFibGVjbWRzLmMgICAgICAgICAgICAgIHwgICAzMCArLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2RkbHV0aWxzLmMgICAgICAgICAgICAgIHwgMTc3NSArKysrKysrKysrKysrKysrKwogc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19pbmhlcml0cy5oICAgICAgICAgICAgIHwgICAgMSArCiBzcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAgfCAgICA3ICsKIHNyYy9pbmNs dWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oICAgICAgICAgICAgICB8ICAgIDMgKwogLi4uL3JlZ3Jl c3MvZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQgICAgIHwgIDgxOCArKysrKysrKwogc3Jj L3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAgICAgICAgIHwgICAgMiArLQogc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5zcWwgICAgIHwgIDQ4MiArKysrKwog MTAgZmlsZXMgY2hhbmdlZCwgMzMxMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2Rk bC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFi bGVfZGRsLnNxbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21s IGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKaW5kZXggOGZmYTdlODMyNzUuLmIw M2I2NTY4OWQzIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbApAQCAtMzk0Nyw2ICszOTQ3LDEx MSBAQCBhY2wgICAgICB8IHtwb3N0Z3Jlcz1hcndkRHh0bS9wb3N0Z3Jlcyxmb289ci9wb3N0Z3Jl c30KICAgICAgICAgPGxpdGVyYWw+VEFCTEVTUEFDRTwvbGl0ZXJhbD4uCiAgICAgICAgPC9wYXJh PjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9 ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAgICAgICAg PGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PnBnX2dldF90YWJsZV9kZGw8L3ByaW1hcnk+ CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfZ2V0X3RhYmxlX2Rk bDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1ldGVyPiA8dHlw ZT5yZWdjbGFzczwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwgPGxpdGVyYWw+VkFSSUFESUM8 L2xpdGVyYWw+IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1ldGVyPgorICAgICAgICA8dHlwZT50 ZXh0PC90eXBlPiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5zZXRvZiB0ZXh0 PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFJl Y29uc3RydWN0cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxFPC9jb21tYW5kPiBzdGF0ZW1lbnQg Zm9yIHRoZQorICAgICAgICBzcGVjaWZpZWQgb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUs IGZvbGxvd2VkIGJ5IHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRTwvY29tbWFuZD4s IDxjb21tYW5kPkNSRUFURSBJTkRFWDwvY29tbWFuZD4sCisgICAgICAgIDxjb21tYW5kPkNSRUFU RSBSVUxFPC9jb21tYW5kPiwgYW5kIDxjb21tYW5kPkNSRUFURSBTVEFUSVNUSUNTPC9jb21tYW5k PgorICAgICAgICBzdGF0ZW1lbnRzIG5lZWRlZCB0byByZWNyZWF0ZSB0aGUgdGFibGUncyBjb2x1 bW5zLCBjb25zdHJhaW50cywKKyAgICAgICAgaW5kZXhlcywgcnVsZXMsIGV4dGVuZGVkIHN0YXRp c3RpY3MsIGFuZCByb3ctbGV2ZWwgc2VjdXJpdHkgZmxhZ3MuCisgICAgICAgIEluaGVyaXRlZCBj b2x1bW5zIGFuZCBjb25zdHJhaW50cyBhcmUgZW1pdHRlZCBieSB0aGUgcGFyZW50IHRhYmxlJ3MK KyAgICAgICAgRERMIGFuZCBhcmUgbm90IGR1cGxpY2F0ZWQgb24gaW5oZXJpdGFuY2UgY2hpbGRy ZW4gb3IgcGFydGl0aW9ucy4KKyAgICAgICAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJuZWQgYXMg YSBzZXBhcmF0ZSByb3cuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9y dGVkOgorICAgICAgICA8bGl0ZXJhbD5wcmV0dHk8L2xpdGVyYWw+IChib29sZWFuKSBmb3IgZm9y bWF0dGVkIG91dHB1dCwKKyAgICAgICAgPGxpdGVyYWw+b3duZXI8L2xpdGVyYWw+IChib29sZWFu KSB0byBpbmNsdWRlIHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRSAuLi4gT1dORVIg VE88L2NvbW1hbmQ+IHN0YXRlbWVudCwKKyAgICAgICAgPGxpdGVyYWw+dGFibGVzcGFjZTwvbGl0 ZXJhbD4gKGJvb2xlYW4pIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIDxsaXRlcmFsPlRBQkxFU1BB Q0U8L2xpdGVyYWw+IGNsYXVzZSBvbiB0aGUKKyAgICAgICAgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxF PC9jb21tYW5kPiBzdGF0ZW1lbnQsIGFuZCBhIGZhbWlseSBvZgorICAgICAgICA8bGl0ZXJhbD5p bmNsdWRlc188cmVwbGFjZWFibGU+Y2F0ZWdvcnk8L3JlcGxhY2VhYmxlPjwvbGl0ZXJhbD4KKyAg ICAgICAgYm9vbGVhbnMgdGhhdCBnYXRlIGVtaXNzaW9uIG9mIG9wdGlvbmFsIHN1Yi1vYmplY3Rz OgorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19pbmRleGVzPC9saXRlcmFsPiwKKyAgICAgICAg PGxpdGVyYWw+aW5jbHVkZXNfY29uc3RyYWludHM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJh bD5pbmNsdWRlc19mb3JlaWduX2tleXM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNs dWRlc19ydWxlczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3N0YXRpc3Rp Y3M8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc190cmlnZ2VyczwvbGl0ZXJh bD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3BvbGljaWVzPC9saXRlcmFsPiwKKyAgICAg ICAgPGxpdGVyYWw+aW5jbHVkZXNfcmxzPC9saXRlcmFsPiAodGhlCisgICAgICAgIDxjb21tYW5k PkVOQUJMRTwvY29tbWFuZD4vPGNvbW1hbmQ+Rk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZPC9jb21t YW5kPgorICAgICAgICB0b2dnbGVzKSwgYW5kCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3Jl cGxpY2FfaWRlbnRpdHk8L2xpdGVyYWw+LiAgRWFjaCBvZiB0aGVzZQorICAgICAgICBkZWZhdWx0 cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNf Zm9yZWlnbl9rZXlzPC9saXRlcmFsPiBhY3RzIGFzIGEgZmluZXItZ3JhaW5lZAorICAgICAgICBn YXRlIGJlbmVhdGggPGxpdGVyYWw+aW5jbHVkZXNfY29uc3RyYWludHM8L2xpdGVyYWw+OiB3aGVu IHNldAorICAgICAgICB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPkZPUkVJ R04gS0VZPC9saXRlcmFsPgorICAgICAgICBjb25zdHJhaW50cyBhcmUgc3VwcHJlc3NlZCB3aGls ZSBvdGhlciBjb25zdHJhaW50IHR5cGVzCisgICAgICAgICg8bGl0ZXJhbD5QUklNQVJZIEtFWTwv bGl0ZXJhbD4sIDxsaXRlcmFsPlVOSVFVRTwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPkNI RUNLPC9saXRlcmFsPiwgPGxpdGVyYWw+RVhDTFVERTwvbGl0ZXJhbD4sIGFuZCBuYW1lZAorICAg ICAgICA8bGl0ZXJhbD5OT1QgTlVMTDwvbGl0ZXJhbD4pIGFyZSBzdGlsbCBlbWl0dGVkOyB0aGlz IGlzIGludGVuZGVkCisgICAgICAgIGZvciBzY2hlbWEtY2xvbmluZyB3b3JrZmxvd3MgdGhhdCBu ZWVkIHRvIGNyZWF0ZSBhbGwgdGFibGVzCisgICAgICAgIGJlZm9yZSBhbnkgY3Jvc3MtdGFibGUg cmVmZXJlbmNlcyBleGlzdC4gIFRoZQorICAgICAgICA8bGl0ZXJhbD5vbmx5X2ZvcmVpZ25fa2V5 czwvbGl0ZXJhbD4gb3B0aW9uIChib29sZWFuLCBkZWZhdWx0CisgICAgICAgIDxsaXRlcmFsPmZh bHNlPC9saXRlcmFsPikgaXMgdGhlIG5hdHVyYWwgY29tcGxlbWVudDogd2hlbiBzZXQKKyAgICAg ICAgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4sIHRoZSBmdW5jdGlvbiBlbWl0cyBvbmx5IHRo ZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJTlQgLi4uIEZP UkVJR04gS0VZPC9jb21tYW5kPgorICAgICAgICBzdGF0ZW1lbnRzIGFuZCBzdXBwcmVzc2VzIGV2 ZXJ5dGhpbmcgZWxzZSAodGhlCisgICAgICAgIDxjb21tYW5kPkNSRUFURSBUQUJMRTwvY29tbWFu ZD4sIG93bmVyLCBpbmRleGVzLCBub24tRksKKyAgICAgICAgY29uc3RyYWludHMsIHJ1bGVzLCBz dGF0aXN0aWNzLCByZXBsaWNhIGlkZW50aXR5LCBhbmQgUkxTCisgICAgICAgIHRvZ2dsZXMpLiAg Q29tYmluZWQgd2l0aCBhIHByaW9yIGNhbGwgdXNpbmcKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVk ZXNfZm9yZWlnbl9rZXlzPC9saXRlcmFsPiBzZXQgdG8KKyAgICAgICAgPGxpdGVyYWw+ZmFsc2U8 L2xpdGVyYWw+LCB0aGlzIHN1cHBvcnRzIHRoZSB0eXBpY2FsIHR3by1wYXNzCisgICAgICAgIHdv cmtmbG93OiBjcmVhdGUgdGhlIHRhYmxlcyBhbmQgbG9hZCBkYXRhIGZpcnN0LCB0aGVuIGFkZCB0 aGUKKyAgICAgICAgY3Jvc3MtdGFibGUgZm9yZWlnbi1rZXkgcmVmZXJlbmNlcy4gIFNldHRpbmcK KyAgICAgICAgPGxpdGVyYWw+b25seV9mb3JlaWduX2tleXM8L2xpdGVyYWw+IHRvIDxsaXRlcmFs PnRydWU8L2xpdGVyYWw+CisgICAgICAgIHRvZ2V0aGVyIHdpdGggPGxpdGVyYWw+aW5jbHVkZXNf Zm9yZWlnbl9rZXlzPC9saXRlcmFsPiBzZXQgdG8KKyAgICAgICAgPGxpdGVyYWw+ZmFsc2U8L2xp dGVyYWw+IGlzIHJlamVjdGVkIGFzIGl0IHdvdWxkIHByb2R1Y2Ugbm8KKyAgICAgICAgb3V0cHV0 LiAgVGhlIDxsaXRlcmFsPmluY2x1ZGVzX3BhcnRpdGlvbjwvbGl0ZXJhbD4gb3B0aW9uLAorICAg ICAgICB3aGljaCBkZWZhdWx0cyB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIGNvbnRyb2xz IHdoZXRoZXIKKyAgICAgICAgdGhlIERETCBmb3IgcGFydGl0aW9uIGNoaWxkcmVuIGlzIGFwcGVu ZGVkIGFmdGVyIGEKKyAgICAgICAgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50LgorICAgICAgIDwv cGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxsaXRlcmFsPnNjaGVtYV9xdWFsaWZp ZWQ8L2xpdGVyYWw+IG9wdGlvbiAoYm9vbGVhbiwgZGVmYXVsdAorICAgICAgICA8bGl0ZXJhbD50 cnVlPC9saXRlcmFsPikgY29udHJvbHMgd2hldGhlciB0aGUgdGFyZ2V0IHRhYmxlJ3Mgb3duCisg ICAgICAgIHNjaGVtYSBpcyBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIERETC4gIFdoZW4gc2V0 IHRvCisgICAgICAgIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPiwgdGhlIHRhYmxlIG5hbWUgaXMg ZW1pdHRlZCB1bnF1YWxpZmllZAorICAgICAgICBpbiB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxF PC9jb21tYW5kPiBhbmQgZXZlcnkgc3Vic2VxdWVudAorICAgICAgICA8Y29tbWFuZD5BTFRFUiBU QUJMRTwvY29tbWFuZD4sIDxjb21tYW5kPkNSRUFURSBJTkRFWDwvY29tbWFuZD4sCisgICAgICAg IDxjb21tYW5kPkNSRUFURSBSVUxFPC9jb21tYW5kPiwgYW5kCisgICAgICAgIDxjb21tYW5kPkNS RUFURSBTVEFUSVNUSUNTPC9jb21tYW5kPiBzdGF0ZW1lbnQuICBSZWZlcmVuY2VzIHRvCisgICAg ICAgIG9iamVjdHMgaW4gdGhlIHNhbWUgc2NoZW1hIGFzIHRoZSB0YXJnZXQgdGFibGUgKGluaGVy aXRhbmNlCisgICAgICAgIHBhcmVudHMsIHBhcnRpdGlvbiBwYXJlbnRzLCBpZGVudGl0eSBzZXF1 ZW5jZXMsIGFuZCBhbnkKKyAgICAgICAgc2FtZS1zY2hlbWEgb2JqZWN0IHRoZSBkZXBhcnNlIGhl bHBlcnMgaGFwcGVuIHRvIG1lbnRpb24pIGFyZQorICAgICAgICBhbHNvIGVtaXR0ZWQgdW5xdWFs aWZpZWQsIHNvIHRoZSBzY3JpcHQgY2FuIGJlIHJlcGxheWVkIHVuZGVyIGEKKyAgICAgICAgZGlm ZmVyZW50IDx2YXJuYW1lPnNlYXJjaF9wYXRoPC92YXJuYW1lPiB0byByZWNyZWF0ZSB0aGUgdGFi bGUKKyAgICAgICAgaW4gYW5vdGhlciBzY2hlbWEuICBDcm9zcy1zY2hlbWEgcmVmZXJlbmNlcyAo Zm9yIGV4YW1wbGUgYQorICAgICAgICBmb3JlaWduIGtleSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQg c2NoZW1hKSByZW1haW4gcXVhbGlmaWVkIGZvcgorICAgICAgICBjb3JyZWN0bmVzcy4KKyAgICAg ICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIEFsbCB0aHJlZSBmb3JtcyBvZiA8Y29t bWFuZD5DUkVBVEUgVEFCTEU8L2NvbW1hbmQ+IGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgIHRoZSBv cmRpbmFyeSBjb2x1bW4tbGlzdCBmb3JtLCB0aGUgdHlwZWQtdGFibGUgZm9ybQorICAgICAgICAo PGxpdGVyYWw+T0YgPHJlcGxhY2VhYmxlPnR5cGVfbmFtZTwvcmVwbGFjZWFibGU+PC9saXRlcmFs Piwgd2l0aAorICAgICAgICBwZXItY29sdW1uIDxsaXRlcmFsPldJVEggT1BUSU9OUzwvbGl0ZXJh bD4gb3ZlcnJpZGVzIGZvciBsb2NhbAorICAgICAgICBkZWZhdWx0cywgPGxpdGVyYWw+Tk9UIE5V TEw8L2xpdGVyYWw+LCBhbmQgPGxpdGVyYWw+Q0hFQ0s8L2xpdGVyYWw+CisgICAgICAgIGNvbnN0 cmFpbnRzKSwgYW5kIHRoZSA8bGl0ZXJhbD5QQVJUSVRJT04gT0Y8L2xpdGVyYWw+IGZvcm0uCisg ICAgICAgIDxsaXRlcmFsPlRFTVBPUkFSWTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlVOTE9HR0VE PC9saXRlcmFsPgorICAgICAgICBwZXJzaXN0ZW5jZSBtb2RlcyBhcmUgZW1pdHRlZCBmcm9tCisg ICAgICAgIDxzdHJ1Y3RmaWVsZD5yZWxwZXJzaXN0ZW5jZTwvc3RydWN0ZmllbGQ+LiAgRm9yIHRl bXBvcmFyeSB0YWJsZXMKKyAgICAgICAgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9u LCB0aGUKKyAgICAgICAgPGxpdGVyYWw+T04gQ09NTUlUIERFTEVURSBST1dTPC9saXRlcmFsPiBh bmQKKyAgICAgICAgPGxpdGVyYWw+T04gQ09NTUlUIERST1A8L2xpdGVyYWw+IGNsYXVzZXMgYXJl IGVtaXR0ZWQ7IHRoZSBkZWZhdWx0CisgICAgICAgIDxsaXRlcmFsPk9OIENPTU1JVCBQUkVTRVJW RSBST1dTPC9saXRlcmFsPiBpcyBvbWl0dGVkLgorICAgICAgIDwvcGFyYT48L2VudHJ5PgorICAg ICAgPC9yb3c+CiAgICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19pbmhlcml0cy5jIGIvc3JjL2JhY2tlbmQv Y2F0YWxvZy9wZ19pbmhlcml0cy5jCmluZGV4IDRiOTgwMmFhZmNjLi44OTcxNTFiZDZkMSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19pbmhlcml0cy5jCisrKyBiL3NyYy9iYWNr ZW5kL2NhdGFsb2cvcGdfaW5oZXJpdHMuYwpAQCAtMjM2LDYgKzIzNiw5OSBAQCBmaW5kX2luaGVy aXRhbmNlX2NoaWxkcmVuX2V4dGVuZGVkKE9pZCBwYXJlbnRyZWxJZCwgYm9vbCBvbWl0X2RldGFj aGVkLAogfQogCiAKKy8qCisgKiBmaW5kX2luaGVyaXRhbmNlX3BhcmVudHMKKyAqCisgKiBSZXR1 cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBPSURzIG9mIGFsbCByZWxhdGlvbnMgdGhhdCB0aGUg cmVsYXRpb24gd2l0aAorICogT0lEICdyZWxpZCcgaW5oZXJpdHMgKmRpcmVjdGx5KiBmcm9tLCBp biBpbmhzZXFubyBvcmRlciAodGhlIG9yZGVyIGluIHdoaWNoCisgKiB0aGV5IHNob3VsZCBhcHBl YXIgaW4gYW4gSU5IRVJJVFMgY2xhdXNlKS4KKyAqCisgKiBUaGUgc3BlY2lmaWVkIGxvY2sgdHlw ZSBpcyBhY3F1aXJlZCBvbiBlYWNoIHBhcmVudCByZWxhdGlvbiAoYnV0IG5vdCBvbiB0aGUKKyAq IGdpdmVuIHJlbDsgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgbG9ja2VkIGl0KS4gIElmIGxv Y2ttb2RlIGlzIE5vTG9jaworICogdGhlbiBubyBsb2NrcyBhcmUgYWNxdWlyZWQsIGJ1dCBjYWxs ZXIgbXVzdCBiZXdhcmUgb2YgcmFjZSBjb25kaXRpb25zCisgKiBhZ2FpbnN0IHBvc3NpYmxlIERS T1BzIG9mIHBhcmVudCByZWxhdGlvbnMuCisgKgorICogUGFydGl0aW9uIGNoaWxkcmVuIGFsc28g aGF2ZSBhIHBnX2luaGVyaXRzIGVudHJ5IHBvaW50aW5nIHRvIHRoZQorICogcGFydGl0aW9uZWQg cGFyZW50OyBjYWxsZXJzIHRoYXQgZGlzdGluZ3Vpc2ggSU5IRVJJVFMgZnJvbSBQQVJUSVRJT04g T0YKKyAqIG11c3QgY2hlY2sgcmVsaXNwYXJ0aXRpb24gdGhlbXNlbHZlcy4KKyAqLworTGlzdCAq CitmaW5kX2luaGVyaXRhbmNlX3BhcmVudHMoT2lkIHJlbGlkLCBMT0NLTU9ERSBsb2NrbW9kZSkK K3sKKwlMaXN0CSAgICpsaXN0ID0gTklMOworCVJlbGF0aW9uCXJlbGF0aW9uOworCVN5c1NjYW5E ZXNjIHNjYW47CisJU2NhbktleURhdGEga2V5WzFdOworCUhlYXBUdXBsZQlpbmhlcml0c1R1cGxl OworCU9pZAkJCWluaHBhcmVudDsKKwlPaWQJCSAgICpvaWRhcnI7CisJaW50CQkJbWF4b2lkcywK KwkJCQludW1vaWRzLAorCQkJCWk7CisKKwkvKgorCSAqIFNjYW4gcGdfaW5oZXJpdHMgdmlhIHRo ZSAoaW5ocmVsaWQsIGluaHNlcW5vKSBpbmRleCBzbyB0aGF0IHRoZSByb3dzCisJICogY29tZSBv dXQgaW4gaW5oc2Vxbm8gb3JkZXIsIHdoaWNoIGlzIHRoZSBvcmRlciByZXF1aXJlZCBmb3IgdGhl CisJICogSU5IRVJJVFMgY2xhdXNlLgorCSAqLworCW1heG9pZHMgPSA4OworCW9pZGFyciA9IChP aWQgKikgcGFsbG9jKG1heG9pZHMgKiBzaXplb2YoT2lkKSk7CisJbnVtb2lkcyA9IDA7CisKKwly ZWxhdGlvbiA9IHRhYmxlX29wZW4oSW5oZXJpdHNSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2sp OworCisJU2NhbktleUluaXQoJmtleVswXSwKKwkJCQlBbnVtX3BnX2luaGVyaXRzX2luaHJlbGlk LAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERh dHVtKHJlbGlkKSk7CisKKwlzY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHJlbGF0aW9uLCBJbmhl cml0c1JlbGlkU2Vxbm9JbmRleElkLCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMSwga2V5KTsKKwor CXdoaWxlICgoaW5oZXJpdHNUdXBsZSA9IHN5c3RhYmxlX2dldG5leHQoc2NhbikpICE9IE5VTEwp CisJeworCQlpbmhwYXJlbnQgPSAoKEZvcm1fcGdfaW5oZXJpdHMpIEdFVFNUUlVDVChpbmhlcml0 c1R1cGxlKSktPmluaHBhcmVudDsKKwkJaWYgKG51bW9pZHMgPj0gbWF4b2lkcykKKwkJeworCQkJ bWF4b2lkcyAqPSAyOworCQkJb2lkYXJyID0gKE9pZCAqKSByZXBhbGxvYyhvaWRhcnIsIG1heG9p ZHMgKiBzaXplb2YoT2lkKSk7CisJCX0KKwkJb2lkYXJyW251bW9pZHMrK10gPSBpbmhwYXJlbnQ7 CisJfQorCisJc3lzdGFibGVfZW5kc2NhbihzY2FuKTsKKworCXRhYmxlX2Nsb3NlKHJlbGF0aW9u LCBBY2Nlc3NTaGFyZUxvY2spOworCisJLyoKKwkgKiBBY3F1aXJlIGxvY2tzIGFuZCBidWlsZCB0 aGUgcmVzdWx0IGxpc3QuICBVbmxpa2UKKwkgKiBmaW5kX2luaGVyaXRhbmNlX2NoaWxkcmVuIHdl IGRvICpub3QqIHNvcnQgYnkgT0lEOiBjYWxsZXJzIG5lZWQgdGhlCisJICogc2Vxbm8tb3JkZXJl ZCB0cmF2ZXJzYWwuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bW9pZHM7IGkrKykKKwl7CisJ CWluaHBhcmVudCA9IG9pZGFycltpXTsKKworCQlpZiAobG9ja21vZGUgIT0gTm9Mb2NrKQorCQl7 CisJCQlMb2NrUmVsYXRpb25PaWQoaW5ocGFyZW50LCBsb2NrbW9kZSk7CisKKwkJCWlmICghU2Vh cmNoU3lzQ2FjaGVFeGlzdHMxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShpbmhwYXJlbnQpKSkK KwkJCXsKKwkJCQlVbmxvY2tSZWxhdGlvbk9pZChpbmhwYXJlbnQsIGxvY2ttb2RlKTsKKwkJCQlj b250aW51ZTsKKwkJCX0KKwkJfQorCisJCWxpc3QgPSBsYXBwZW5kX29pZChsaXN0LCBpbmhwYXJl bnQpOworCX0KKworCXBmcmVlKG9pZGFycik7CisKKwlyZXR1cm4gbGlzdDsKK30KKworCiAvKgog ICogZmluZF9hbGxfaW5oZXJpdG9ycyAtCiAgKgkJUmV0dXJucyBhIGxpc3Qgb2YgcmVsYXRpb24g T0lEcyBpbmNsdWRpbmcgdGhlIGdpdmVuIHJlbCBwbHVzCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5j CmluZGV4IDI2NWRjZmU3ZmRhLi5hNWY0NjUyMmMzMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv Y29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRz LmMKQEAgLTczOSw3ICs3MzksNiBAQCBzdGF0aWMgT2JqZWN0QWRkcmVzcyBBVEV4ZWNTZXRDb21w cmVzc2lvbihSZWxhdGlvbiByZWwsCiAJCQkJCQkJCQkJICBjb25zdCBjaGFyICpjb2x1bW4sIE5v ZGUgKm5ld1ZhbHVlLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAKIHN0YXRpYyB2b2lkIGluZGV4X2Nv cHlfZGF0YShSZWxhdGlvbiByZWwsIFJlbEZpbGVMb2NhdG9yIG5ld3Jsb2NhdG9yKTsKLXN0YXRp YyBjb25zdCBjaGFyICpzdG9yYWdlX25hbWUoY2hhciBjKTsKIAogc3RhdGljIHZvaWQgUmFuZ2VW YXJDYWxsYmFja0ZvckRyb3BSZWxhdGlvbihjb25zdCBSYW5nZVZhciAqcmVsLCBPaWQgcmVsT2lk LAogCQkJCQkJCQkJCQlPaWQgb2xkUmVsT2lkLCB2b2lkICphcmcpOwpAQCAtMjUxNSw3ICsyNTE0 LDcgQEAgdHJ1bmNhdGVfY2hlY2tfYWN0aXZpdHkoUmVsYXRpb24gcmVsKQogICogc3RvcmFnZV9u YW1lCiAgKgkgIHJldHVybnMgdGhlIG5hbWUgY29ycmVzcG9uZGluZyB0byBhIHR5cHN0b3JhZ2Uv YXR0c3RvcmFnZSBlbnVtIHZhbHVlCiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKK2NvbnN0IGNo YXIgKgogc3RvcmFnZV9uYW1lKGNoYXIgYykKIHsKIAlzd2l0Y2ggKGMpCkBAIC0xOTU1OCw2ICsx OTU1NywzMyBAQCByZW1vdmVfb25fY29tbWl0X2FjdGlvbihPaWQgcmVsaWQpCiAJfQogfQogCisv KgorICogTG9vayB1cCB0aGUgcmVnaXN0ZXJlZCBPTiBDT01NSVQgYWN0aW9uIGZvciBhIHJlbGF0 aW9uLgorICoKKyAqIFJldHVybnMgT05DT01NSVRfTk9PUCB3aGVuIG5vdGhpbmcgd2FzIHJlZ2lz dGVyZWQsIHdoaWNoIGFsc28gY292ZXJzCisgKiB0ZW1wb3JhcnkgdGFibGVzIGNyZWF0ZWQgd2l0 aCB0aGUgZGVmYXVsdCBPTiBDT01NSVQgUFJFU0VSVkUgUk9XUworICogYmVoYXZpb3IgKHJlZ2lz dGVyX29uX2NvbW1pdF9hY3Rpb24oKSBza2lwcyB0aG9zZSwgc2luY2Ugbm8gYWN0aW9uIGlzCisg KiBuZWVkZWQgYXQgY29tbWl0KS4gIEVudHJpZXMgbWFya2VkIGZvciBkZWxldGlvbiBpbiB0aGUg Y3VycmVudAorICogdHJhbnNhY3Rpb24gYXJlIGlnbm9yZWQuCisgKi8KK09uQ29tbWl0QWN0aW9u CitnZXRfb25fY29tbWl0X2FjdGlvbihPaWQgcmVsaWQpCit7CisJTGlzdENlbGwgICAqbDsKKwor CWZvcmVhY2gobCwgb25fY29tbWl0cykKKwl7CisJCU9uQ29tbWl0SXRlbSAqb2MgPSAoT25Db21t aXRJdGVtICopIGxmaXJzdChsKTsKKworCQlpZiAob2MtPnJlbGlkICE9IHJlbGlkKQorCQkJY29u dGludWU7CisJCWlmIChvYy0+ZGVsZXRpbmdfc3ViaWQgIT0gSW52YWxpZFN1YlRyYW5zYWN0aW9u SWQpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG9jLT5vbmNvbW1pdDsKKwl9CisJcmV0dXJuIE9O Q09NTUlUX05PT1A7Cit9CisKIC8qCiAgKiBQZXJmb3JtIE9OIENPTU1JVCBhY3Rpb25zLgogICoK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKaW5kZXggZjMyZmNkNDUzZWYuLjVmYmYxZDUxNWMwIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwpAQCAtMjEsMTIgKzIxLDI1IEBACiAjaW5jbHVkZSAi YWNjZXNzL2dlbmFtLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1 ZGUgImFjY2Vzcy90YWJsZS5oIgorI2luY2x1ZGUgImFjY2Vzcy90b2FzdF9jb21wcmVzc2lvbi5o IgogI2luY2x1ZGUgImNhdGFsb2cvcGdfYXV0aF9tZW1iZXJzLmgiCiAjaW5jbHVkZSAiY2F0YWxv Zy9wZ19hdXRoaWQuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2NsYXNzLmgiCiAjaW5jbHVkZSAi Y2F0YWxvZy9wZ19jb2xsYXRpb24uaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbnN0cmFpbnQu aCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2RhdGFiYXNlLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9w Z19kYl9yb2xlX3NldHRpbmcuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2FtLmgiCisjaW5jbHVk ZSAiY2F0YWxvZy9wZ19pbmhlcml0cy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfcG9saWN5Lmgi CisjaW5jbHVkZSAiY2F0YWxvZy9wZ19zZXF1ZW5jZS5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf c3RhdGlzdGljX2V4dC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdGFibGVzcGFjZS5oIgorI2lu Y2x1ZGUgImNhdGFsb2cvcGdfdHJpZ2dlci5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGFydGl0aW9u LmgiCisjaW5jbHVkZSAiY29tbWFuZHMvZGVmcmVtLmgiCisjaW5jbHVkZSAiY29tbWFuZHMvdGFi bGVjbWRzLmgiCisjaW5jbHVkZSAibm9kZXMvbm9kZXMuaCIKICNpbmNsdWRlICJjb21tYW5kcy90 YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL3JlbHBhdGguaCIKICNpbmNsdWRlICJmdW5j YXBpLmgiCkBAIC04Nyw2ICsxMDAsMTA3IEBAIHN0YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFj ZV9kZGxfc3JmKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBPaWQgdHNpZCwgYm9vbCBpCiBzdGF0 aWMgTGlzdCAqcGdfZ2V0X2RhdGFiYXNlX2RkbF9pbnRlcm5hbChPaWQgZGJpZCwgYm9vbCBwcmV0 dHksCiAJCQkJCQkJCQkJICBib29sIG5vX293bmVyLCBib29sIG5vX3RhYmxlc3BhY2UpOwogCisv KgorICogUGVyLWNvbHVtbiBjYWNoZSBvZiBsb2NhbGx5LWRlY2xhcmVkIE5PVCBOVUxMIGNvbnN0 cmFpbnRzLiAgQnVpbHQgb25jZQorICogYnkgY29sbGVjdF9sb2NhbF9ub3RfbnVsbCgpIGFuZCBj b25zdWx0ZWQgYnkgdGhlIGNvbHVtbi1lbWl0IGhlbHBlcnMKKyAqIGFuZCB0aGUgcG9zdC1DUkVB VEUgY29uc3RyYWludCBsb29wLiAgRW50cmllcyB3aXRoIGNvbm9pZCA9PSBJbnZhbGlkT2lkCisg KiBtZWFuIHRoZSBjb2x1bW4gaGFzIG5vIGxvY2FsIE5PVCBOVUxMIGNvbnN0cmFpbnQgcm93IGlu IHBnX2NvbnN0cmFpbnQKKyAqICh0aGUgY29sdW1uIG1heSBzdGlsbCBoYXZlIGF0dG5vdG51bGw9 dHJ1ZSBvbiBhIHByZS1QRy0xOC11cGdyYWRlZAorICogY2F0YWxvZywgaW4gd2hpY2ggY2FzZSBl bWl0IHBsYWluIGlubGluZSBOT1QgTlVMTCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IExvY2FsTm90 TnVsbEVudHJ5Cit7CisJT2lkCQkJY29ub2lkOworCWNoYXIJICAgKm5hbWU7CisJYm9vbAkJaXNf YXV0bzsJCS8qIG1hdGNoZXMgIjx0YWJsZT5fPGNvbD5fbm90X251bGwiICovCisJYm9vbAkJbm9f aW5oZXJpdDsKK30JCQlMb2NhbE5vdE51bGxFbnRyeTsKKworLyoKKyAqIFdvcmtpbmcgY29udGV4 dCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItcGFzcyBoZWxwZXJzIGJlbG93LiAgSW5wdXRzCisg KiAoY2FsbGVyLXByb3ZpZGVkIG9wdGlvbiBmbGFncykgYXJlIGZpbGxlZCBpbiBvbmNlIGF0IHRo ZSB0b3Agb2YKKyAqIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwgYW5kIHRyZWF0ZWQgYXMgcmVh ZC1vbmx5IHRoZXJlYWZ0ZXIuICBEZXJpdmVkCisgKiBmaWVsZHMgKHF1YWxuYW1lLCBzY2hlbWFf cHJlZml4LCBubl9lbnRyaWVzLCBza2lwX25vdG51bGxfb2lkcykgYXJlCisgKiBjb21wdXRlZCBv bmNlIGR1cmluZyBzZXR1cC4gIEVhY2ggcGFzcyBhcHBlbmRzIHRvIGN0eC0+YnVmIGFuZCBwdXNo ZXMKKyAqIHRoZSBmaW5pc2hlZCBzdGF0ZW1lbnQgb250byBjdHgtPnN0YXRlbWVudHMgdmlhIGFw cGVuZF9zdG10KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFRhYmxlRGRsQ29udGV4dAoreworCVJl bGF0aW9uCXJlbDsKKwlPaWQJCQlyZWxpZDsKKwlib29sCQlwcmV0dHk7CisJYm9vbAkJbm9fb3du ZXI7CisJYm9vbAkJbm9fdGFibGVzcGFjZTsKKwlib29sCQlpbmNsdWRlX2luZGV4ZXM7CisJYm9v bAkJaW5jbHVkZV9jb25zdHJhaW50czsKKwlib29sCQlpbmNsdWRlX2ZvcmVpZ25fa2V5czsKKwli b29sCQlvbmx5X2ZvcmVpZ25fa2V5czsKKwlib29sCQlpbmNsdWRlX3J1bGVzOworCWJvb2wJCWlu Y2x1ZGVfc3RhdGlzdGljczsKKwlib29sCQlpbmNsdWRlX3RyaWdnZXJzOworCWJvb2wJCWluY2x1 ZGVfcG9saWNpZXM7CisJYm9vbAkJaW5jbHVkZV9ybHM7CisJYm9vbAkJaW5jbHVkZV9yZXBsaWNh X2lkZW50aXR5OworCWJvb2wJCWluY2x1ZGVfcGFydGl0aW9uOworCWJvb2wJCXNjaGVtYV9xdWFs aWZpZWQ7CisKKwkvKiBEZXJpdmVkIGR1cmluZyBzZXR1cCAqLworCU9pZAkJCWJhc2VfbmFtZXNw YWNlOworCWNoYXIJICAgKnF1YWxuYW1lOworCWNoYXIJICAgKnNjaGVtYV9wcmVmaXg7CS8qIE5V TEwgd2hlbiBzY2hlbWFfcXVhbGlmaWVkICovCisJaW50CQkJc2F2ZV9uZXN0bGV2ZWw7IC8qID49 IDAgaWYgd2UgbmFycm93ZWQgc2VhcmNoX3BhdGggKi8KKwlMb2NhbE5vdE51bGxFbnRyeSAqbm5f ZW50cmllczsKKwlMaXN0CSAgICpza2lwX25vdG51bGxfb2lkczsKKworCS8qIE11dGFibGUgd29y a2luZyBzdGF0ZSAqLworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwlMaXN0CSAgICpzdGF0ZW1lbnRz OworfQkJCVRhYmxlRGRsQ29udGV4dDsKKworc3RhdGljIExpc3QgKnBnX2dldF90YWJsZV9kZGxf aW50ZXJuYWwoT2lkIHJlbGlkLCBib29sIHByZXR0eSwKKwkJCQkJCQkJCSAgIGJvb2wgbm9fb3du ZXIsIGJvb2wgbm9fdGFibGVzcGFjZSwKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9pbmRleGVz LAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJCQkJICAgYm9v bCBpbmNsdWRlX2ZvcmVpZ25fa2V5cywKKwkJCQkJCQkJCSAgIGJvb2wgb25seV9mb3JlaWduX2tl eXMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcnVsZXMsCisJCQkJCQkJCQkgICBib29sIGlu Y2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV90cmlnZ2VycywKKwkJ CQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9wb2xpY2llcywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVk ZV9ybHMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcmVwbGljYV9pZGVudGl0eSwKKwkJCQkJ CQkJCSAgIGJvb2wgaW5jbHVkZV9wYXJ0aXRpb24sCisJCQkJCQkJCQkgICBib29sIHNjaGVtYV9x dWFsaWZpZWQpOworc3RhdGljIHZvaWQgYXBwZW5kX2NvbHVtbl9kZWZzKFN0cmluZ0luZm8gYnVm LCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9jb25z dHJhaW50cywKKwkJCQkJCQkgICBib29sIHNjaGVtYV9xdWFsaWZpZWQsCisJCQkJCQkJICAgTG9j YWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKTsKK3N0YXRpYyB2b2lkIGFwcGVuZF90eXBlZF9j b2x1bW5fb3ZlcnJpZGVzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkJ ICBib29sIHByZXR0eSwgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJCQkJCSAgTG9j YWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKTsKK3N0YXRpYyB2b2lkIGFwcGVuZF9pbmxpbmVf Y2hlY2tfY29uc3RyYWludHMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwKKwkJCQkJCQkJ CQkJYm9vbCBwcmV0dHksIGJvb2wgKmZpcnN0KTsKK3N0YXRpYyBjaGFyICpmaW5kX2F0dHJkZWZf dGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIgYXR0bnVtLAorCQkJCQkJCSAgIExpc3QgKipk cGNvbnRleHQpOworc3RhdGljIGNoYXIgKmxvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KE9pZCByZWxp ZCwgYm9vbCBzY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJCQkJIE9pZCBiYXNlX25hbWVzcGFjZSk7 CitzdGF0aWMgY2hhciAqc3RyaXBfc2NoZW1hX3ByZWZpeChjb25zdCBjaGFyICpzdG10LCBjb25z dCBjaGFyICpwcmVmaXgpOworc3RhdGljIExvY2FsTm90TnVsbEVudHJ5ICogY29sbGVjdF9sb2Nh bF9ub3RfbnVsbChSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkJCQkgIExpc3QgKipza2lwX29pZHMp OworCitzdGF0aWMgdm9pZCBhcHBlbmRfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3Rh dGljIHZvaWQgZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgpOwor c3RhdGljIHZvaWQgZW1pdF9vd25lcl9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CitzdGF0 aWMgdm9pZCBlbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzKFRhYmxlRGRsQ29udGV4dCAqIGN0 eCk7CitzdGF0aWMgdm9pZCBlbWl0X2F0dG9wdGlvbnMoVGFibGVEZGxDb250ZXh0ICogY3R4KTsK K3N0YXRpYyB2b2lkIGVtaXRfaW5kZXhlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGlj IHZvaWQgZW1pdF9sb2NhbF9jb25zdHJhaW50cyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3Rh dGljIHZvaWQgZW1pdF9ydWxlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQg ZW1pdF9zdGF0aXN0aWNzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CitzdGF0aWMgdm9pZCBlbWl0 X3JlcGxpY2FfaWRlbnRpdHkoVGFibGVEZGxDb250ZXh0ICogY3R4KTsKK3N0YXRpYyB2b2lkIGVt aXRfcmxzX3RvZ2dsZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KTsKK3N0YXRpYyB2b2lkIGVtaXRf cGFydGl0aW9uX2NoaWxkcmVuKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7CisKIAogLyoKICAqIHBh cnNlX2RkbF9vcHRpb25zCkBAIC0xMTg1LDMgKzEyOTksMTY2NCBAQCBwZ19nZXRfZGF0YWJhc2Vf ZGRsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKIAl9CiB9 CisKKy8qCisgKiBsb29rdXBfcmVsbmFtZV9mb3JfZW1pdAorICoJCVJldHVybiBlaXRoZXIgdGhl IHNjaGVtYS1xdWFsaWZpZWQgb3IgdGhlIGJhcmUgcXVvdGVkIG5hbWUgb2YgYQorICoJCXJlbGF0 aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjaGVtYV9xdWFsaWZpZWQgZmxhZy4KKyAqCisgKiBXaGVu IHNjaGVtYV9xdWFsaWZpZWQgaXMgdHJ1ZSB0aGUgc2NoZW1hLXF1YWxpZmllZCBuYW1lIGlzIGFs d2F5cworICogcmV0dXJuZWQuICBXaGVuIGZhbHNlLCB0aGUgYmFyZSByZWxuYW1lIGlzIHJldHVy bmVkIG9ubHkgaWYgdGhlIHRhcmdldAorICogcmVsYXRpb24gbGl2ZXMgaW4gYmFzZV9uYW1lc3Bh Y2UgKHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHRhYmxlIHdob3NlIERETCBpcworICogYmVpbmcgZ2Vu ZXJhdGVkKTsgb3RoZXJ3aXNlIHRoZSBzY2hlbWEtcXVhbGlmaWVkIGZvcm0gaXMgcmV0dXJuZWQs CisgKiBiZWNhdXNlIGNyb3NzLXNjaGVtYSByZWZlcmVuY2VzIChmb3IgZXhhbXBsZSBhbiBpbmhl cml0YW5jZSBwYXJlbnQgb3IKKyAqIGZvcmVpZ24ga2V5IHRhcmdldCBpbiBhIGRpZmZlcmVudCBz Y2hlbWEpIGFyZSBub3Qgc2FmZSB0byBzdHJpcC4KKyAqCisgKiBUaGlzIHJlcGxhY2VzIHRoZSB1 bnNhZmUgcGF0dGVybgorICoJICBxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihnZXRfbmFtZXNw YWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2Uob2lkKSksCisgKgkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGdldF9yZWxfbmFtZShvaWQpKQorICogd2hpY2ggZGVyZWZlcmVuY2VzIE5VTEwg d2hlbiBhIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzIGRyb3BwZWQgdGhlCisgKiByZWZlcmVu Y2VkIHJlbGF0aW9uIChvciBpdHMgc2NoZW1hKSBiZXR3ZWVuIHdoZW4gd2UgY2FjaGVkIGl0cyBP SUQgYW5kCisgKiB3aGVuIHdlIGFzayB0aGUgc3lzY2FjaGUgZm9yIGl0cyBuYW1lLiAgSG9sZGlu ZyBBY2Nlc3NTaGFyZUxvY2sgb24gYQorICogZGVwZW5kZW50IHJlbGF0aW9uIG1ha2VzIHRoaXMg cmFjZSB2YW5pc2hpbmdseSB1bmxpa2VseSBpbiBwcmFjdGljZSwgYnV0CisgKiB3ZSBzdGlsbCBk ZWZlbmQgYWdhaW5zdCBpdCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSBpcyBhIFNJR1NFR1YuCisg KgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZnJlZSgpaW5nIHRoZSByZXN1bHQuCisg Ki8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KE9pZCByZWxpZCwgYm9v bCBzY2hlbWFfcXVhbGlmaWVkLCBPaWQgYmFzZV9uYW1lc3BhY2UpCit7CisJSGVhcFR1cGxlCXRw OworCUZvcm1fcGdfY2xhc3MgcmVsdHVwOworCWNoYXIJICAgKm5zcG5hbWU7CisJY2hhcgkgICAq cmVzdWx0OworCisJdHAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmplY3RJZEdldERhdHVt KHJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHRwKSkKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1QpLAorCQkJCSBlcnJtc2coInJl bGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgcmVsaWQpLAorCQkJCSBlcnJkZXRh aWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKworCXJlbHR1 cCA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QodHApOworCisJLyogQmFyZSBuYW1lIG9ubHkg d2hlbiBjYWxsZXIgYXNrZWQgYW5kIHRhcmdldCBpcyBpbiB0aGUgYmFzZSBuYW1lc3BhY2UuICov CisJaWYgKCFzY2hlbWFfcXVhbGlmaWVkICYmIHJlbHR1cC0+cmVsbmFtZXNwYWNlID09IGJhc2Vf bmFtZXNwYWNlKQorCXsKKwkJcmVzdWx0ID0gcHN0cmR1cChxdW90ZV9pZGVudGlmaWVyKE5hbWVT dHIocmVsdHVwLT5yZWxuYW1lKSkpOworCQlSZWxlYXNlU3lzQ2FjaGUodHApOworCQlyZXR1cm4g cmVzdWx0OworCX0KKworCW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNlX25hbWUocmVsdHVwLT5yZWxu YW1lc3BhY2UpOworCWlmIChuc3BuYW1lID09IE5VTEwpCisJeworCQlPaWQJCQluc3BvaWQgPSBy ZWx0dXAtPnJlbG5hbWVzcGFjZTsKKworCQlSZWxlYXNlU3lzQ2FjaGUodHApOworCQllcmVwb3J0 KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJIGVy cm1zZygic2NoZW1hIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgbnNwb2lkKSwKKwkJCQkg ZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7CisJ fQorCisJcmVzdWx0ID0gcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZpZXIobnNwbmFtZSwgTmFtZVN0 cihyZWx0dXAtPnJlbG5hbWUpKTsKKworCXBmcmVlKG5zcG5hbWUpOworCVJlbGVhc2VTeXNDYWNo ZSh0cCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogc3RyaXBfc2NoZW1hX3ByZWZp eAorICoJCVJldHVybiBhIHBhbGxvYydkIGNvcHkgb2Ygc3RtdCB3aXRoIGV2ZXJ5IG9jY3VycmVu Y2Ugb2YgcHJlZml4CisgKgkJcmVtb3ZlZCwgZXhjZXB0IG9jY3VycmVuY2VzIHRoYXQgZmFsbCBp bnNpZGUgYSBzaW5nbGUtcXVvdGVkIFNRTAorICoJCXN0cmluZyBsaXRlcmFsIG9yIGEgZG91Ymxl LXF1b3RlZCBTUUwgaWRlbnRpZmllci4KKyAqCisgKiBVc2VkIHRvIHN0cmlwIHRoZSBxdWFsaWZp ZWQtc2NoZW1hIHByZWZpeCAoZm9yIGV4YW1wbGUgIm9sZF9zY2hlbWEuIikKKyAqIGZyb20gRERM IGVtaXR0ZWQgYnkgdGhlIGFsd2F5cy1xdWFsaWZpZWQgcnVsZXV0aWxzIGhlbHBlcnMKKyAqIChw Z19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBwZ19nZXRfaW5kZXhkZWZfc3RyaW5nLAorICog cGdfZ2V0X3J1bGVkZWYsIHBnX2dldF9zdGF0aXN0aWNzb2JqZGVmX3N0cmluZykgd2hlbiB0aGUg Y2FsbGVyIGhhcworICogcmVxdWVzdGVkIHVucXVhbGlmaWVkIG91dHB1dCB2aWEgc2NoZW1hX3F1 YWxpZmllZD1mYWxzZS4gIEEgcGxhaW4KKyAqIHN1YnN0cmluZyBzdHJpcCB3b3VsZCBjb3JydXB0 IHN0cmluZyBsaXRlcmFscyB3aG9zZSBjb250ZW50cyBoYXBwZW4KKyAqIHRvIGNvbnRhaW4gIjxz Y2hlbWE+LiIgKGZvciBleGFtcGxlIGEgQ0hFQ0sgY29tcGFyaW5nIGFnYWluc3QKKyAqICdteXNj aGVtYS5zZWNyZXQnKSBvciBkb3VibGUtcXVvdGVkIGNvbHVtbi9pZGVudGlmaWVyIG5hbWVzIHdo b3NlCisgKiBjb250ZW50cyBoYXBwZW4gdG8gY29udGFpbiAiPHNjaGVtYT4uIiAoZm9yIGV4YW1w bGUgYSBjb2x1bW4gbmFtZWQKKyAqICJzLndlaXJkIiB3aGVuIHN0cmlwcGluZyB0aGUgcHJlZml4 ICJzLiIpLCBzbyB3ZSB0cmFjayBxdW90aW5nIHN0YXRlCisgKiBhbmQgc2tpcCBtYXRjaGVzIHRo YXQgb2NjdXIgd2hpbGUgd2UgYXJlIGluc2lkZSBlaXRoZXIga2luZCBvZgorICogcXVvdGVkIHRv a2VuLiAgRXNjYXBlZCBxdW90ZXMgKCcnIGluc2lkZSBhIHN0cmluZywgIiIgaW5zaWRlIGFuCisg KiBpZGVudGlmaWVyKSBhcmUgaGFuZGxlZCBieSBrZWVwaW5nIHRoZSBjb3JyZXNwb25kaW5nIGZs YWcgc2V0IGFjcm9zcworICogdGhlbS4KKyAqLworc3RhdGljIGNoYXIgKgorc3RyaXBfc2NoZW1h X3ByZWZpeChjb25zdCBjaGFyICpzdG10LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJU3RyaW5n SW5mb0RhdGEgYnVmOworCXNpemVfdAkJcGxlbiA9IHN0cmxlbihwcmVmaXgpOworCWNvbnN0IGNo YXIgKnAgPSBzdG10OworCWJvb2wJCWluX3N0cmluZyA9IGZhbHNlOworCWJvb2wJCWluX2lkZW50 ID0gZmFsc2U7CisKKwlpbml0U3RyaW5nSW5mbygmYnVmKTsKKwl3aGlsZSAoKnApCisJeworCQkv KgorCQkgKiBUcnkgdGhlIHByZWZpeCBtYXRjaCBCRUZPUkUgdGhlIHF1b3RlLXN0YXRlIHRvZ2ds ZXMuICBUaGUgcHJlZml4CisJCSAqIGl0c2VsZiBtYXkgYmVnaW4gd2l0aCBhIGRvdWJsZSBxdW90 ZSB3aGVuIHRoZSBiYXNlIHNjaGVtYSBuYW1lCisJCSAqIHJlcXVpcmVzIHF1b3RpbmcgKGUuZy4g Ik15LVNjaGVtYSIuKSwgYW5kIGF0IHRoYXQgbGVhZGluZyAiIHdlIG11c3QKKwkJICogc3RyaXAg dGhlIHdob2xlIHByZWZpeCByYXRoZXIgdGhhbiB0cmVhdCBpdCBhcyB0aGUgb3BlbmluZyBvZiBh CisJCSAqIHJlZ3VsYXIgcXVvdGVkIGlkZW50aWZpZXIuICBUaGUgY2hlY2sgaXMgZ2F0ZWQgb24g IWluX2lkZW50ICYmCisJCSAqICFpbl9zdHJpbmcsIHNvIG9uY2Ugd2UgaGF2ZSB0b2dnbGVkIGlu dG8gYSBxdW90ZWQgdG9rZW4gd2UgbmV2ZXIKKwkJICogc3RyaXAgYSBjb2luY2lkZW50YWwgc3Vi c3RyaW5nIGluc2lkZSBpdC4KKwkJICovCisJCWlmICghaW5fc3RyaW5nICYmICFpbl9pZGVudCAm JiBzdHJuY21wKHAsIHByZWZpeCwgcGxlbikgPT0gMCkKKwkJeworCQkJcCArPSBwbGVuOworCQkJ Y29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcJycgJiYgIWluX2lkZW50KQorCQl7CisJCQkv KiBTUUwgJycgZXNjYXBlOiBlbWl0IGJvdGggcXVvdGVzIGFuZCBzdGF5IGluc2lkZSB0aGUgc3Ry aW5nLiAqLworCQkJaWYgKGluX3N0cmluZyAmJiBwWzFdID09ICdcJycpCisJCQl7CisJCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJ1wnJyk7CisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIo JmJ1ZiwgJ1wnJyk7CisJCQkJcCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaW5fc3Ry aW5nID0gIWluX3N0cmluZzsKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICpwKTsKKwkJ CXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcCA9PSAnIicgJiYgIWluX3N0cmluZykK KwkJeworCQkJLyogU1FMICIiIGVzY2FwZTogZW1pdCBib3RoIHF1b3RlcyBhbmQgc3RheSBpbnNp ZGUgdGhlIGlkZW50LiAqLworCQkJaWYgKGluX2lkZW50ICYmIHBbMV0gPT0gJyInKQorCQkJewor CQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICciJyk7CisJCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoJmJ1ZiwgJyInKTsKKwkJCQlwICs9IDI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlp bl9pZGVudCA9ICFpbl9pZGVudDsKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICpwKTsK KwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYs ICpwKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gYnVmLmRhdGE7Cit9CisKKy8qCisgKiBjb2xsZWN0 X2xvY2FsX25vdF9udWxsCisgKgkJU2NhbiBwZ19jb25zdHJhaW50IG9uY2UgZm9yIGxvY2FsbHkt ZGVjbGFyZWQgTk9UIE5VTEwgY29uc3RyYWludHMKKyAqCQlvbiByZWwsIHJldHVybmluZyBhIHBh bGxvYydkIGFycmF5IGluZGV4ZWQgYnkgYXR0bnVtICgxLi5uYXR0cykuCisgKgorICogRW50cmll cyB3aXRoIGNvbm9pZD09SW52YWxpZE9pZCBtZWFuICJubyBsb2NhbCBOT1QgTlVMTCByb3cgZm9y IHRoaXMKKyAqIGNvbHVtbiIuICBXaGVuIHRoZSBjb25zdHJhaW50IG5hbWUgZG9lcyBub3QgbWF0 Y2ggdGhlIGF1dG8tZ2VuZXJhdGVkCisgKiBwYXR0ZXJuICI8dGFibGVuYW1lPl88Y29sdW1ubmFt ZT5fbm90X251bGwiLCB0aGUgY29uc3RyYWludCBPSUQgaXMKKyAqIGFwcGVuZGVkIHRvICpza2lw X29pZHMgc28gdGhlIHBvc3QtQ1JFQVRFIGNvbnN0cmFpbnQgbG9vcCBjYW4gYXZvaWQKKyAqIHJl LWVtaXR0aW5nIGl0IGFzIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCAtIHRoZSBjb2x1 bW4tZW1pdAorICogcGFzcyB3aWxsIHByb2R1Y2UgaXQgaW5saW5lIGFzICJDT05TVFJBSU5UIG5h bWUgTk9UIE5VTEwiIGluc3RlYWQuCisgKi8KK3N0YXRpYyBMb2NhbE5vdE51bGxFbnRyeSAqCitj b2xsZWN0X2xvY2FsX25vdF9udWxsKFJlbGF0aW9uIHJlbCwgTGlzdCAqKnNraXBfb2lkcykKK3sK KwlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKKwlpbnQJCQluYXR0 cyA9IHR1cGRlc2MtPm5hdHRzOworCUxvY2FsTm90TnVsbEVudHJ5ICplbnRyaWVzOworCWNvbnN0 IGNoYXIgKnJlbG5hbWUgPSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpOworCVJlbGF0aW9u CWNvblJlbDsKKwlTeXNTY2FuRGVzYyBjb25TY2FuOworCVNjYW5LZXlEYXRhIGNvbktleTsKKwlI ZWFwVHVwbGUJY29uVHVwOworCisJZW50cmllcyA9IChMb2NhbE5vdE51bGxFbnRyeSAqKSBwYWxs b2MwKHNpemVvZihMb2NhbE5vdE51bGxFbnRyeSkgKgorCQkJCQkJCQkJCQkobmF0dHMgKyAxKSk7 CisKKwljb25SZWwgPSB0YWJsZV9vcGVuKENvbnN0cmFpbnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFy ZUxvY2spOworCVNjYW5LZXlJbml0KCZjb25LZXksCisJCQkJQW51bV9wZ19jb25zdHJhaW50X2Nv bnJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJ ZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVsKSkpOworCWNvblNjYW4gPSBzeXN0YWJsZV9i ZWdpbnNjYW4oY29uUmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElkLAorCQkJCQkJ CQkgdHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChj b25UdXAgPSBzeXN0YWJsZV9nZXRuZXh0KGNvblNjYW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3Ry YWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJRGF0 dW0JCWNvbmtleURhdDsKKwkJYm9vbAkJY29ua2V5TnVsbDsKKwkJQXJyYXlUeXBlICAqY29ua2V5 QXJyOworCQlpbnQxNgkgICAqY29ua2V5VmFsczsKKwkJaW50CQkJYXR0bnVtOworCQlGb3JtX3Bn X2F0dHJpYnV0ZSBhdHQ7CisJCWNoYXIJCWF1dG9uYW1lW05BTUVEQVRBTEVOXTsKKworCQlpZiAo Y29uLT5jb250eXBlICE9IENPTlNUUkFJTlRfTk9UTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAo IWNvbi0+Y29uaXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWNvbmtleURhdCA9IGhlYXBfZ2V0 YXR0cihjb25UdXAsIEFudW1fcGdfY29uc3RyYWludF9jb25rZXksCisJCQkJCQkJCSBSZWxhdGlv bkdldERlc2NyKGNvblJlbCksICZjb25rZXlOdWxsKTsKKwkJaWYgKGNvbmtleU51bGwpCisJCQlj b250aW51ZTsKKwkJY29ua2V5QXJyID0gRGF0dW1HZXRBcnJheVR5cGVQKGNvbmtleURhdCk7CisK KwkJLyoKKwkJICogRGVmZW5kIGFnYWluc3QgYSBtYWxmb3JtZWQgY29ua2V5OiBhIE5PVCBOVUxM IGNvbnN0cmFpbnQgaXMgYWx3YXlzCisJCSAqIGEgc2luZ2xlLWNvbHVtbiAxLUQgaW50MiBhcnJh eSwgYnV0IGEgY29ycnVwdGVkIGNhdGFsb2cgb3IgYSBmdXR1cmUKKwkJICogcGF0Y2ggdGhhdCBz dG9yZXMgd2lkZXIgY29ua2V5cyBtdXN0bid0IHRyaXAgdXMgaW50byByZWFkaW5nIHBhc3QKKwkJ ICogdGhlIGFycmF5IGhlYWRlci4KKwkJICovCisJCWlmIChBUlJfTkRJTShjb25rZXlBcnIpICE9 IDEgfHwKKwkJCUFSUl9ESU1TKGNvbmtleUFycilbMF0gPCAxIHx8CisJCQlBUlJfSEFTTlVMTChj b25rZXlBcnIpIHx8CisJCQlBUlJfRUxFTVRZUEUoY29ua2V5QXJyKSAhPSBJTlQyT0lEKQorCQkJ Y29udGludWU7CisKKwkJY29ua2V5VmFscyA9IChpbnQxNiAqKSBBUlJfREFUQV9QVFIoY29ua2V5 QXJyKTsKKwkJYXR0bnVtID0gY29ua2V5VmFsc1swXTsKKwkJaWYgKGF0dG51bSA8IDEgfHwgYXR0 bnVtID4gbmF0dHMpCisJCQljb250aW51ZTsKKworCQlhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRl c2MsIGF0dG51bSAtIDEpOworCQlzbnByaW50ZihhdXRvbmFtZSwgc2l6ZW9mKGF1dG9uYW1lKSwg IiVzXyVzX25vdF9udWxsIiwKKwkJCQkgcmVsbmFtZSwgTmFtZVN0cihhdHQtPmF0dG5hbWUpKTsK KworCQllbnRyaWVzW2F0dG51bV0uY29ub2lkID0gY29uLT5vaWQ7CisJCWVudHJpZXNbYXR0bnVt XS5uYW1lID0gcHN0cmR1cChOYW1lU3RyKGNvbi0+Y29ubmFtZSkpOworCQllbnRyaWVzW2F0dG51 bV0uaXNfYXV0byA9IChzdHJjbXAoTmFtZVN0cihjb24tPmNvbm5hbWUpLCBhdXRvbmFtZSkgPT0g MCk7CisJCWVudHJpZXNbYXR0bnVtXS5ub19pbmhlcml0ID0gY29uLT5jb25ub2luaGVyaXQ7CisK KwkJLyoKKwkJICogSW5saW5lIGVtaXNzaW9uIG9mICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwi IG9ubHkgaGFwcGVucyBmb3IKKwkJICogY29sdW1ucyB0aGF0IHRoZSBjb2x1bW4gbGlzdCBhY3R1 YWxseSBlbWl0cywgaS5lLiBhdHRpc2xvY2FsCisJCSAqIGNvbHVtbnMuICBGb3IgYSBsb2NhbGx5 LWRlY2xhcmVkIE5PVCBOVUxMIHNpdHRpbmcgb24gYW4gaW5oZXJpdGVkCisJCSAqIGNvbHVtbiB0 aGUgaW5saW5lIHBhdGggbmV2ZXIgZmlyZXMsIHNvIHdlIG11c3QgbGVhdmUgdGhlIGNvbnN0cmFp bnQKKwkJICogT0lEIG91dCBvZiBza2lwX29pZHMgYW5kIGxldCB0aGUgcG9zdC1DUkVBVEUgY29u c3RyYWludCBsb29wIGVtaXQKKwkJICogQUxURVIgVEFCTEUgLi4uIEFERCBDT05TVFJBSU5ULgor CQkgKi8KKwkJaWYgKCFlbnRyaWVzW2F0dG51bV0uaXNfYXV0byAmJiBhdHQtPmF0dGlzbG9jYWwg JiYgc2tpcF9vaWRzICE9IE5VTEwpCisJCQkqc2tpcF9vaWRzID0gbGFwcGVuZF9vaWQoKnNraXBf b2lkcywgY29uLT5vaWQpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxl X2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJldHVybiBlbnRyaWVzOworfQor CisvKgorICogZmluZF9hdHRyZGVmX3RleHQKKyAqCQlSZXR1cm4gdGhlIGRlcGFyc2VkIERFRkFV TFQvR0VORVJBVEVEIGV4cHJlc3Npb24gZm9yIGF0dG51bSBvbiByZWwsCisgKgkJb3IgTlVMTCBp ZiBubyBlbnRyeSBleGlzdHMgaW4gVHVwbGVDb25zdHItPmRlZnZhbC4KKyAqCisgKiBUaGUgY2Fs bGVyIHBhc3NlcyBhIExpc3QgKiogc28gdGhhdCB0aGUgZGVwYXJzZSBjb250ZXh0IGlzIGJ1aWx0 IGxhemlseQorICogYW5kIHJldXNlZCBhY3Jvc3MgY2FsbHMgKGRlcGFyc2VfY29udGV4dF9mb3Ig aXMgbm90IGNoZWFwKS4gIFJldHVybmVkCisgKiBzdHJpbmcgaXMgcGFsbG9jJ2QgaW4gdGhlIGN1 cnJlbnQgbWVtb3J5IGNvbnRleHQ7IGNhbGxlciBwZnJlZSdzIGl0LgorICovCitzdGF0aWMgY2hh ciAqCitmaW5kX2F0dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIgYXR0bnVtLCBM aXN0ICoqZHBjb250ZXh0KQoreworCVR1cGxlQ29uc3RyICpjb25zdHIgPSBSZWxhdGlvbkdldERl c2NyKHJlbCktPmNvbnN0cjsKKworCWlmIChjb25zdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7 CisKKwlmb3IgKGludCBqID0gMDsgaiA8IGNvbnN0ci0+bnVtX2RlZnZhbDsgaisrKQorCXsKKwkJ aWYgKGNvbnN0ci0+ZGVmdmFsW2pdLmFkbnVtICE9IGF0dG51bSkKKwkJCWNvbnRpbnVlOworCisJ CWlmICgqZHBjb250ZXh0ID09IE5JTCkKKwkJCSpkcGNvbnRleHQgPSBkZXBhcnNlX2NvbnRleHRf Zm9yKFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkJCSBSZWxhdGlvbkdl dFJlbGlkKHJlbCkpOworCisJCXJldHVybiBkZXBhcnNlX2V4cHJlc3Npb24oc3RyaW5nVG9Ob2Rl KGNvbnN0ci0+ZGVmdmFsW2pdLmFkYmluKSwKKwkJCQkJCQkJICAqZHBjb250ZXh0LCBmYWxzZSwg ZmFsc2UpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGFwcGVuZF9pbmxpbmVfY2hl Y2tfY29uc3RyYWludHMKKyAqCQlFbWl0IGVhY2ggbG9jYWxseS1kZWNsYXJlZCBDSEVDSyBjb25z dHJhaW50IG9uIHJlbCBhcworICoJCSJDT05TVFJBSU5UIG5hbWUgPHBnX2dldF9jb25zdHJhaW50 ZGVmPiIsIHNlcGFyYXRlZCBieSAnLCcgZnJvbSBhbnkKKyAqCQlwcmV2aW91c2x5LWVtaXR0ZWQg Y29sdW1uIG9yIGNvbnN0cmFpbnQuCisgKgorICogKmZpcnN0IHRyYWNrcyB3aGV0aGVyIGFueXRo aW5nIGhhcyBiZWVuIGVtaXR0ZWQgb24gdGhpcyBsaXN0IHlldCwgc28gdGhlCisgKiBjYWxsZXIg Y2FuIGNoYWluIGNvbHVtbiBlbWlzc2lvbiBhbmQgY29uc3RyYWludCBlbWlzc2lvbiB0aHJvdWdo IHRoZSBzYW1lCisgKiBidWZmZXIuICBJbmhlcml0ZWQgQ0hFQ0sgY29uc3RyYWludHMgKCFjb25p c2xvY2FsKSBjb21lIGZyb20gdGhlIHBhcmVudCdzCisgKiBEREwgYW5kIGFyZW4ndCByZXBlYXRl ZCBoZXJlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX2lubGluZV9jaGVja19jb25zdHJhaW50 cyhTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBib29sIHByZXR0eSwKKwkJCQkJCQkJYm9v bCAqZmlyc3QpCit7CisJUmVsYXRpb24JY29uUmVsOworCVN5c1NjYW5EZXNjIGNvblNjYW47CisJ U2NhbktleURhdGEgY29uS2V5OworCUhlYXBUdXBsZQljb25UdXA7CisKKwljb25SZWwgPSB0YWJs ZV9vcGVuKENvbnN0cmFpbnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNjYW5LZXlJ bml0KCZjb25LZXksCisJCQkJQW51bV9wZ19jb25zdHJhaW50X2NvbnJlbGlkLAorCQkJCUJURXF1 YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9u R2V0UmVsaWQocmVsKSkpOworCWNvblNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29uUmVsLCBD b25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElkLAorCQkJCQkJCQkgdHJ1ZSwgTlVMTCwgMSwg JmNvbktleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChjb25UdXAgPSBzeXN0YWJsZV9n ZXRuZXh0KGNvblNjYW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3RyYWludCBjb24gPSAoRm9ybV9w Z19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJRGF0dW0JCWRlZkRhdHVtOworCQlj aGFyCSAgICpkZWZib2R5OworCisJCWlmIChjb24tPmNvbnR5cGUgIT0gQ09OU1RSQUlOVF9DSEVD SykKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNvbi0+Y29uaXNsb2NhbCkKKwkJCWNvbnRpbnVlOwor CisJCWlmICghKmZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnLCcpOworCQkq Zmlyc3QgPSBmYWxzZTsKKwkJaWYgKHByZXR0eSkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmco YnVmLCAiXG4gICAgIik7CisJCWVsc2UKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyAn KTsKKworCQlkZWZEYXR1bSA9IE9pZEZ1bmN0aW9uQ2FsbDEoRl9QR19HRVRfQ09OU1RSQUlOVERF Rl9PSUQsCisJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKGNvbi0+b2lkKSk7CisJCWRlZmJvZHkg PSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRlZkRhdHVtKTsKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYs ICJDT05TVFJBSU5UICVzICVzIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoY29u LT5jb25uYW1lKSksCisJCQkJCQkgZGVmYm9keSk7CisJCXBmcmVlKGRlZmJvZHkpOworCX0KKwlz eXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hh cmVMb2NrKTsKK30KKworLyoKKyAqIGFwcGVuZF9jb2x1bW5fZGVmcworICoJCUFwcGVuZCB0aGUg Y29tbWEtc2VwYXJhdGVkIGNvbHVtbiBkZWZpbml0aW9uIGxpc3QgZm9yIGEgdGFibGUuCisgKgor ICogRW1pdHMgZWFjaCBub24tZHJvcHBlZCwgbG9jYWxseS1kZWNsYXJlZCBjb2x1bW4gYXMKKyAq CQluYW1lIHR5cGUgW0NPTExBVEUgeF0gW1NUT1JBR0Ugc10gW0NPTVBSRVNTSU9OIGNdCisgKgkJ W0dFTkVSQVRFRCAuLi4gfCBERUZBVUxUIGVdIFtOT1QgTlVMTF0KKyAqIGZvbGxvd2VkIGJ5IGFu eSBsb2NhbGx5LWRlY2xhcmVkIGlubGluZSBDSEVDSyBjb25zdHJhaW50cy4gIE9wdGlvbmFsCisg KiBjbGF1c2VzIGFyZSBvbWl0dGVkIHdoZW4gdGhlaXIgdmFsdWUgbWF0Y2hlcyB3aGF0IHRoZSBz eXN0ZW0gd291bGQKKyAqIHJlYXBwbHkgb24gcm91bmQtdHJpcCAoZS5nLiB0eXBlLWRlZmF1bHQg Q09MTEFURSwgdHlwZS1kZWZhdWx0IFNUT1JBR0UpLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5k X2NvbHVtbl9kZWZzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAor CQkJCSAgIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkgICBib29sIHNjaGVtYV9xdWFs aWZpZWQsCisJCQkJICAgTG9jYWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKQoreworCVR1cGxl RGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCU9pZAkJCWJhc2VfbmFtZXNw YWNlID0gUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKTsKKwlMaXN0CSAgICpkcGNvbnRleHQgPSBO SUw7CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNj LT5uYXR0czsgaSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0 cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAqdHlwc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJv cHBlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIENvbHVtbnMgaW5oZXJpdGVkIGZyb20g YSBwYXJlbnQgYXJlIGVtaXR0ZWQgYnkgdGhlIElOSEVSSVRTIGNsYXVzZQorCQkgKiAob25jZSBp bXBsZW1lbnRlZCksIG5vdCB0aGUgY29sdW1uIGxpc3QsIHVubGVzcyB0aGUgY2hpbGQKKwkJICog cmVkZWNsYXJlZCB0aGVtIGxvY2FsbHkgKGF0dGlzbG9jYWw9dHJ1ZSkuCisJCSAqLworCQlpZiAo IWF0dC0+YXR0aXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJCQlhcHBl bmRTdHJpbmdJbmZvQ2hhcihidWYsICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJaWYgKHBy ZXR0eSkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXG4gICAgIik7CisJCWVsc2UK KwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyAnKTsKKworCQlhcHBlbmRTdHJpbmdJbmZv U3RyaW5nKGJ1ZiwgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+YXR0bmFtZSkpKTsKKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJCXR5cHN0ciA9IGZvcm1hdF90eXBl X3dpdGhfdHlwZW1vZChhdHQtPmF0dHR5cGlkLCBhdHQtPmF0dHR5cG1vZCk7CisJCWFwcGVuZFN0 cmluZ0luZm9TdHJpbmcoYnVmLCB0eXBzdHIpOworCQlwZnJlZSh0eXBzdHIpOworCisJCS8qIENP TExBVEUgY2xhdXNlLCBvbmx5IGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQu ICovCisJCWlmIChPaWRJc1ZhbGlkKGF0dC0+YXR0Y29sbGF0aW9uKSAmJgorCQkJYXR0LT5hdHRj b2xsYXRpb24gIT0gZ2V0X3R5cGNvbGxhdGlvbihhdHQtPmF0dHR5cGlkKSkKKwkJCWFwcGVuZFN0 cmluZ0luZm8oYnVmLCAiIENPTExBVEUgJXMiLAorCQkJCQkJCSBnZW5lcmF0ZV9jb2xsYXRpb25f bmFtZShhdHQtPmF0dGNvbGxhdGlvbikpOworCisJCS8qIFNUT1JBR0UgY2xhdXNlLCBvbmx5IGlm IGl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICovCisJCWlmIChhdHQtPmF0dHN0 b3JhZ2UgIT0gZ2V0X3R5cHN0b3JhZ2UoYXR0LT5hdHR0eXBpZCkpCisJCQlhcHBlbmRTdHJpbmdJ bmZvKGJ1ZiwgIiBTVE9SQUdFICVzIiwgc3RvcmFnZV9uYW1lKGF0dC0+YXR0c3RvcmFnZSkpOwor CisJCS8qIENPTVBSRVNTSU9OIGNsYXVzZSwgb25seSBpZiBleHBsaWNpdGx5IHNldCBvbiB0aGUg Y29sdW1uLiAqLworCQlpZiAoQ29tcHJlc3Npb25NZXRob2RJc1ZhbGlkKGF0dC0+YXR0Y29tcHJl c3Npb24pKQorCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09NUFJFU1NJT04gJXMiLAorCQkJ CQkJCSBHZXRDb21wcmVzc2lvbk1ldGhvZE5hbWUoYXR0LT5hdHRjb21wcmVzc2lvbikpOworCisJ CS8qCisJCSAqIExvb2sgdXAgdGhlIGRlZmF1bHQvZ2VuZXJhdGVkIGV4cHJlc3Npb24gdGV4dCB1 cCBmcm9udDsgZ2VuZXJhdGVkCisJCSAqIGNvbHVtbnMgaGF2ZSBhdHRoYXNkZWY9dHJ1ZSB3aXRo IGFuIGVudHJ5IGluIHBnX2F0dHJkZWYganVzdCBsaWtlCisJCSAqIHJlZ3VsYXIgZGVmYXVsdHMu CisJCSAqLworCQl7CisJCQljaGFyCSAgICpkZWZleHByID0gTlVMTDsKKworCQkJaWYgKGF0dC0+ YXR0aGFzZGVmKQorCQkJCWRlZmV4cHIgPSBmaW5kX2F0dHJkZWZfdGV4dChyZWwsIGF0dC0+YXR0 bnVtLCAmZHBjb250ZXh0KTsKKworCQkJLyogR0VORVJBVEVEIC8gSURFTlRJVFkgLyBERUZBVUxU IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJCQlpZiAoYXR0LT5hdHRnZW5lcmF0ZWQgPT0g QVRUUklCVVRFX0dFTkVSQVRFRF9TVE9SRUQgJiYgZGVmZXhwcikKKwkJCQlhcHBlbmRTdHJpbmdJ bmZvKGJ1ZiwgIiBHRU5FUkFURUQgQUxXQVlTIEFTICglcykgU1RPUkVEIiwgZGVmZXhwcik7CisJ CQllbHNlIGlmIChhdHQtPmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJUlRV QUwgJiYgZGVmZXhwcikKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBHRU5FUkFURUQgQUxX QVlTIEFTICglcykgVklSVFVBTCIsIGRlZmV4cHIpOworCQkJZWxzZSBpZiAoYXR0LT5hdHRpZGVu dGl0eSA9PSBBVFRSSUJVVEVfSURFTlRJVFlfQUxXQVlTIHx8CisJCQkJCSBhdHQtPmF0dGlkZW50 aXR5ID09IEFUVFJJQlVURV9JREVOVElUWV9CWV9ERUZBVUxUKQorCQkJeworCQkJCWNvbnN0IGNo YXIgKmlka2luZCA9CisJCQkJCShhdHQtPmF0dGlkZW50aXR5ID09IEFUVFJJQlVURV9JREVOVElU WV9BTFdBWVMpCisJCQkJCT8gIkFMV0FZUyIgOiAiQlkgREVGQVVMVCI7CisJCQkJT2lkCQkJc2Vx aWQgPSBnZXRJZGVudGl0eVNlcXVlbmNlKHJlbCwgYXR0LT5hdHRudW0sIHRydWUpOworCisJCQkJ YXBwZW5kU3RyaW5nSW5mbyhidWYsICIgR0VORVJBVEVEICVzIEFTIElERU5USVRZIiwgaWRraW5k KTsKKworCQkJCS8qCisJCQkJICogRW1pdCBvbmx5IHRoZSBzZXF1ZW5jZSBvcHRpb25zIHRoYXQg ZGlmZmVyIGZyb20gdGhlaXIKKwkJCQkgKiBkZWZhdWx0cyAtIG1pcnJvcmluZyBwZ19nZXRfZGF0 YWJhc2VfZGRsJ3MgcGF0dGVybiBvZgorCQkJCSAqIG9taXR0aW5nIHZhbHVlcyB0aGF0IHRoZSBz eXN0ZW0gd291bGQgcmVhcHBseSBvbiBpdHMgb3duLgorCQkJCSAqLworCQkJCWlmIChPaWRJc1Zh bGlkKHNlcWlkKSkKKwkJCQl7CisJCQkJCUhlYXBUdXBsZQlzZXFUdXAgPSBTZWFyY2hTeXNDYWNo ZTEoU0VRUkVMSUQsCisJCQkJCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKHNlcWlkKSk7CisK KwkJCQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQoc2VxVHVwKSkKKwkJCQkJeworCQkJCQkJRm9ybV9w Z19zZXF1ZW5jZSBzZXEgPSAoRm9ybV9wZ19zZXF1ZW5jZSkgR0VUU1RSVUNUKHNlcVR1cCk7CisJ CQkJCQlTdHJpbmdJbmZvRGF0YSBvcHRzOworCQkJCQkJYm9vbAkJZmlyc3Rfb3B0ID0gdHJ1ZTsK KwkJCQkJCWludDY0CQlkZWZfbWluLAorCQkJCQkJCQkJZGVmX21heCwKKwkJCQkJCQkJCWRlZl9z dGFydDsKKwkJCQkJCWludDY0CQl0eXBfbWluLAorCQkJCQkJCQkJdHlwX21heDsKKworCQkJCQkJ LyoKKwkJCQkJCSAqIFBlci10eXBlIGJvdW5kcyBmb3IgdGhlIHNlcXVlbmNlJ3MgdW5kZXJseWlu ZworCQkJCQkJICogaW50ZWdlciB0eXBlLiAgRGVmYXVsdHMgdG8gaW50OCBpZiB0aGUgY29sdW1u IHR5cGUKKwkJCQkJCSAqIGlzIHNvbWV0aGluZyBlbHNlIChzaG91bGRuJ3QgaGFwcGVuIGZvciBJ REVOVElUWSwKKwkJCQkJCSAqIGJ1dCBiZSBkZWZlbnNpdmUpLgorCQkJCQkJICovCisJCQkJCQlz d2l0Y2ggKGF0dC0+YXR0dHlwaWQpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBJTlQyT0lEOgorCQkJ CQkJCQl0eXBfbWluID0gUEdfSU5UMTZfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0gUEdfSU5UMTZf TUFYOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElOVDRPSUQ6CisJCQkJCQkJCXR5cF9t aW4gPSBQR19JTlQzMl9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQzMl9NQVg7CisJCQkJ CQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXR5cF9taW4gPSBQR19JTlQ2NF9N SU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQ2NF9NQVg7CisJCQkJCQkJCWJyZWFrOworCQkJ CQkJfQorCisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgPiAwKQorCQkJCQkJeworCQkJCQkJ CWRlZl9taW4gPSAxOworCQkJCQkJCWRlZl9tYXggPSB0eXBfbWF4OworCQkJCQkJCWRlZl9zdGFy dCA9IGRlZl9taW47CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZGVmX21p biA9IHR5cF9taW47CisJCQkJCQkJZGVmX21heCA9IC0xOworCQkJCQkJCWRlZl9zdGFydCA9IGRl Zl9tYXg7CisJCQkJCQl9CisKKwkJCQkJCWluaXRTdHJpbmdJbmZvKCZvcHRzKTsKKworCQkJCQkJ LyoKKwkJCQkJCSAqIFNFUVVFTkNFIE5BTUUgLSBvbWl0IHdoZW4gaXQgbWF0Y2hlcyB0aGUgaW1w bGljaXQKKwkJCQkJCSAqICI8dGFibGVuYW1lPl88Y29sdW1ubmFtZT5fc2VxIiBwYXR0ZXJuIGlu IHRoZSBzYW1lCisJCQkJCQkgKiBzY2hlbWEsIHNpbmNlIENSRUFURSBUQUJMRSB3aWxsIHJlZ2Vu ZXJhdGUgdGhhdAorCQkJCQkJICogZXhhY3QgbmFtZS4gIFRoZSBzZXF1ZW5jZSBpcyBhbiBJTlRF Uk5BTCBkZXBlbmRlbmN5CisJCQkJCQkgKiBvZiB0aGUgY29sdW1uLCBzbyB0aGUgbG9jayB3ZSBo b2xkIG9uIHRoZSB0YWJsZQorCQkJCQkJICogYWxzbyBwaW5zIGl0LCBidXQgdGhlIGxvb2t1cCBo ZWxwZXIgc3RpbGwgZGVmZW5kcworCQkJCQkJICogYWdhaW5zdCBhIG1pc3NpbmcgcGdfY2xhc3Mg cm93LgorCQkJCQkJICovCisJCQkJCQl7CisJCQkJCQkJSGVhcFR1cGxlCXNlcUNsYXNzVHVwOwor CQkJCQkJCUZvcm1fcGdfY2xhc3Mgc2VxQ2xhc3M7CisJCQkJCQkJY2hhcgkJYXV0b25hbWVbTkFN RURBVEFMRU5dOworCisJCQkJCQkJc2VxQ2xhc3NUdXAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lE LAorCQkJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0oc2VxaWQpKTsKKwkJCQkJCQlpZiAo IUhlYXBUdXBsZUlzVmFsaWQoc2VxQ2xhc3NUdXApKQorCQkJCQkJCQllcmVwb3J0KEVSUk9SLAor CQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJCQkJCQkJ IGVycm1zZygiaWRlbnRpdHkgc2VxdWVuY2Ugd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAor CQkJCQkJCQkJCQkJc2VxaWQpLAorCQkJCQkJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJl ZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwkJCQkJCQlzZXFDbGFzcyA9IChGb3JtX3Bn X2NsYXNzKSBHRVRTVFJVQ1Qoc2VxQ2xhc3NUdXApOworCisJCQkJCQkJc25wcmludGYoYXV0b25h bWUsIHNpemVvZihhdXRvbmFtZSksICIlc18lc19zZXEiLAorCQkJCQkJCQkJIFJlbGF0aW9uR2V0 UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkgTmFtZVN0cihhdHQtPmF0dG5hbWUpKTsKKwkJ CQkJCQlpZiAoc2VxQ2xhc3MtPnJlbG5hbWVzcGFjZSAhPSBSZWxhdGlvbkdldE5hbWVzcGFjZShy ZWwpIHx8CisJCQkJCQkJCXN0cmNtcChOYW1lU3RyKHNlcUNsYXNzLT5yZWxuYW1lKSwgYXV0b25h bWUpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQljaGFyCSAgICpzZXFRdWFsID0KKwkJCQkJCQkJ CWxvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KHNlcWlkLAorCQkJCQkJCQkJCQkJCQkJc2NoZW1hX3F1 YWxpZmllZCwKKwkJCQkJCQkJCQkJCQkJCWJhc2VfbmFtZXNwYWNlKTsKKworCQkJCQkJCQlhcHBl bmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNTRVFVRU5DRSBOQU1FICVzIiwKKwkJCQkJCQkJCQkJCSBm aXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxUXVhbCk7CisJCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNl OworCQkJCQkJCQlwZnJlZShzZXFRdWFsKTsKKwkJCQkJCQl9CisJCQkJCQkJUmVsZWFzZVN5c0Nh Y2hlKHNlcUNsYXNzVHVwKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHNlcS0+c2Vxc3RhcnQgIT0g ZGVmX3N0YXJ0KQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMsICIlc1NU QVJUIFdJVEggIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIg Iiwgc2VxLT5zZXFzdGFydCk7CisJCQkJCQkJZmlyc3Rfb3B0ID0gZmFsc2U7CisJCQkJCQl9CisJ CQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgIT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRT dHJpbmdJbmZvKCZvcHRzLCAiJXNJTkNSRU1FTlQgQlkgIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJ CQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFpbmNyZW1lbnQpOworCQkJCQkJCWZp cnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxbWluICE9IGRlZl9t aW4pCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzTUlOVkFMVUUg IiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5z ZXFtaW4pOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNl cS0+c2VxbWF4ICE9IGRlZl9tYXgpCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygm b3B0cywgIiVzTUFYVkFMVUUgIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQg PyAiIiA6ICIgIiwgc2VxLT5zZXFtYXgpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJ CQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxY2FjaGUgIT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlhcHBl bmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNDQUNIRSAiIElOVDY0X0ZPUk1BVCwKKwkJCQkJCQkJCQkJ IGZpcnN0X29wdCA/ICIiIDogIiAiLCBzZXEtPnNlcWNhY2hlKTsKKwkJCQkJCQlmaXJzdF9vcHQg PSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWN5Y2xlKQorCQkJCQkJeworCQkJ CQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMsICIlc0NZQ0xFIiwgZmlyc3Rfb3B0ID8gIiIgOiAi ICIpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCisJCQkJCQlpZiAoIWZp cnN0X29wdCkKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiAoJXMpIiwgb3B0cy5kYXRh KTsKKworCQkJCQkJcGZyZWUob3B0cy5kYXRhKTsKKwkJCQkJCVJlbGVhc2VTeXNDYWNoZShzZXFU dXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGVmZXhwcikKKwkJCQlhcHBl bmRTdHJpbmdJbmZvKGJ1ZiwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisKKwkJCWlmIChkZWZl eHByKQorCQkJCXBmcmVlKGRlZmV4cHIpOworCQl9CisKKwkJaWYgKGF0dC0+YXR0bm90bnVsbCkK KwkJeworCQkJTG9jYWxOb3ROdWxsRW50cnkgKm5uID0gJm5uX2VudHJpZXNbYXR0LT5hdHRudW1d OworCisJCQlpZiAobm4tPm5hbWUgIT0gTlVMTCAmJiAhbm4tPmlzX2F1dG8pCisJCQkJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIgQ09OU1RSQUlOVCAlcyBOT1QgTlVMTCIsCisJCQkJCQkJCSBxdW90 ZV9pZGVudGlmaWVyKG5uLT5uYW1lKSk7CisJCQllbHNlCisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhidWYsICIgTk9UIE5VTEwiKTsKKwkJCWlmIChubi0+bmFtZSAhPSBOVUxMICYmIG5uLT5u b19pbmhlcml0KQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIE5PIElOSEVSSVQi KTsKKwkJfQorCX0KKworCS8qCisJICogVGFibGUtbGV2ZWwgQ0hFQ0sgY29uc3RyYWludHMgLSBl bWl0dGVkIGlubGluZSBpbiB0aGUgQ1JFQVRFIFRBQkxFIGJvZHkKKwkgKiBzbyB0aGV5IGFwcGVh ciBhbG9uZ3NpZGUgdGhlIGNvbHVtbnMgKHRoZSBwZ19kdW1wIHNoYXBlKS4gIFRoZQorCSAqIGNv bnN0cmFpbnQgbG9vcCBsYXRlciBpbiBwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsIHNraXBzIENI RUNLCisJICogY29uc3RyYWludHMgdG8gYXZvaWQgZG91YmxlLWVtaXNzaW9uLgorCSAqLworCWlm IChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlhcHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRz KGJ1ZiwgcmVsLCBwcmV0dHksICZmaXJzdCk7Cit9CisKKy8qCisgKiBhcHBlbmRfdHlwZWRfY29s dW1uX292ZXJyaWRlcworICoJCUZvciBhIHR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgLi4uIE9G IHR5cGVfbmFtZSksIGFwcGVuZCB0aGUKKyAqCQlvcHRpb25hbCAiKGNvbCBXSVRIIE9QVElPTlMg Li4uLCAuLi4pIiBsaXN0IGNhcnJ5aW5nIGxvY2FsbHkKKyAqCQlhcHBsaWVkIHBlci1jb2x1bW4g b3ZlcnJpZGVzIC0gREVGQVVMVCwgTk9UIE5VTEwsIGFuZCBhbnkgbG9jYWxseQorICoJCWRlY2xh cmVkIENIRUNLIGNvbnN0cmFpbnRzLgorICoKKyAqIENvbHVtbnMgd2hvc2UgdHlwZSBpcyBmdWxs eSBkaWN0YXRlZCBieSByZWxvZnR5cGUgZW1pdCBub3RoaW5nLiAgVGhlCisgKiBwYXJlbnRoZXNp c2VkIGxpc3QgaXMgc3VwcHJlc3NlZCBlbnRpcmVseSB3aGVuIG5vIGNvbHVtbiBuZWVkcyBhbgor ICogb3ZlcnJpZGUgYW5kIHRoZXJlIGFyZSBubyBsb2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0 cmFpbnRzLCBtYXRjaGluZworICogdGhlIGNhbm9uaWNhbCAiQ1JFQVRFIFRBQkxFIHggT0YgdDsi IHNoYXBlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX3R5cGVkX2NvbHVtbl9vdmVycmlkZXMo U3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBwcmV0dHksCisJCQkJCQkJICBib29s IGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJICBMb2NhbE5vdE51bGxFbnRyeSAqIG5uX2Vu dHJpZXMpCit7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJ TGlzdAkgICAqZHBjb250ZXh0ID0gTklMOworCVN0cmluZ0luZm9EYXRhIGlubmVyOworCWJvb2wJ CWZpcnN0ID0gdHJ1ZTsKKworCWluaXRTdHJpbmdJbmZvKCZpbm5lcik7CisKKwlmb3IgKGludCBp ID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBh dHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOworCQljaGFyCSAgICpkZWZleHByID0gTlVM TDsKKwkJYm9vbAkJaGFzX2RlZmF1bHQ7CisJCWJvb2wJCWhhc19ub3RudWxsOworCisJCWlmIChh dHQtPmF0dGlzZHJvcHBlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChhdHQtPmF0dGhhc2RlZikK KwkJCWRlZmV4cHIgPSBmaW5kX2F0dHJkZWZfdGV4dChyZWwsIGF0dC0+YXR0bnVtLCAmZHBjb250 ZXh0KTsKKworCQloYXNfZGVmYXVsdCA9IChkZWZleHByICE9IE5VTEwpOworCQloYXNfbm90bnVs bCA9IGF0dC0+YXR0bm90bnVsbDsKKworCQlpZiAoIWhhc19kZWZhdWx0ICYmICFoYXNfbm90bnVs bCkKKwkJeworCQkJaWYgKGRlZmV4cHIpCisJCQkJcGZyZWUoZGVmZXhwcik7CisJCQljb250aW51 ZTsKKwkJfQorCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmaW5uZXIs ICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisJCWlmIChwcmV0dHkpCisJCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKCZpbm5lciwgIlxuICAgICIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJbmZv Q2hhcigmaW5uZXIsICcgJyk7CisKKwkJYXBwZW5kU3RyaW5nSW5mbygmaW5uZXIsICIlcyBXSVRI IE9QVElPTlMiLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQtPmF0dG5hbWUp KSk7CisJCWlmIChoYXNfZGVmYXVsdCkKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmlubmVyLCAiIERF RkFVTFQgJXMiLCBkZWZleHByKTsKKwkJaWYgKGhhc19ub3RudWxsKQorCQl7CisJCQlMb2NhbE5v dE51bGxFbnRyeSAqbm4gPSAmbm5fZW50cmllc1thdHQtPmF0dG51bV07CisKKwkJCWlmIChubi0+ bmFtZSAhPSBOVUxMICYmICFubi0+aXNfYXV0bykKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZpbm5l ciwgIiBDT05TVFJBSU5UICVzIE5PVCBOVUxMIiwKKwkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIo bm4tPm5hbWUpKTsKKwkJCWVsc2UKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZpbm5lciwg IiBOT1QgTlVMTCIpOworCQkJaWYgKG5uLT5uYW1lICE9IE5VTEwgJiYgbm4tPm5vX2luaGVyaXQp CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICIgTk8gSU5IRVJJVCIpOworCQl9 CisKKwkJaWYgKGRlZmV4cHIpCisJCQlwZnJlZShkZWZleHByKTsKKwl9CisKKwkvKgorCSAqIExv Y2FsbHktZGVjbGFyZWQgQ0hFQ0sgY29uc3RyYWludHMgb24gYSB0eXBlZCB0YWJsZSBiZWxvbmcg aW4gdGhlCisJICogY29sdW1uLWxpc3QgcGFyZW50aGVzZXMsIHNhbWUgYXMgZm9yIGFuIHVudHlw ZWQgdGFibGUuICBUaGUgb3V0LW9mLWxpbmUKKwkgKiBjb25zdHJhaW50IGxvb3AgbGF0ZXIgc3Rp bGwgc2tpcHMgQ0hFQ0tzLgorCSAqLworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlhcHBl bmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRzKCZpbm5lciwgcmVsLCBwcmV0dHksICZmaXJzdCk7 CisKKwlpZiAoIWZpcnN0KQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgKCIp OworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgaW5uZXIuZGF0YSk7CisJCWlmIChwcmV0 dHkpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlh cHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJfQorCXBmcmVlKGlubmVyLmRhdGEpOwor fQorCisvKgorICogYXBwZW5kX3N0bXQgLyBhcHBlbmRfc3RyaXBwZWRfc3RtdAorICoJCVB1c2gg Y3R4LT5idWYgb250byBjdHgtPnN0YXRlbWVudHMuCisgKgorICogYXBwZW5kX3N0bXQgaXMgdXNl ZCBmb3IgZW1pc3Npb25zIHdoZXJlIHRoZSB0YWJsZSByZWZlcmVuY2UgaXMgYnVpbHQKKyAqIGZy b20gY3R4LT5xdWFsbmFtZSAoYWxyZWFkeSBwYXJ0aWFsLXF1YWxpZmllZCBwZXIgc2NoZW1hX3F1 YWxpZmllZCkuCisgKiBhcHBlbmRfc3RyaXBwZWRfc3RtdCBpcyB1c2VkIGFmdGVyIGludm9raW5n IGFsd2F5cy1xdWFsaWZpZWQgcnVsZXV0aWxzCisgKiBoZWxwZXJzIChwZ19nZXRfY29uc3RyYWlu dGRlZl9jb21tYW5kLCBwZ19nZXRfaW5kZXhkZWZfc3RyaW5nLAorICogcGdfZ2V0X3J1bGVkZWYs IHBnX2dldF9zdGF0aXN0aWNzb2JqZGVmX3N0cmluZykgLSB3aGVuCisgKiBzY2hlbWFfcXVhbGlm aWVkIGlzIGZhbHNlLCB0aGUgYmFzZS1zY2hlbWEgcHJlZml4IGlzIHN0cmlwcGVkIGZyb20KKyAq IHRoZWlyIG91dHB1dCBzbyB0aGUgZW1pdHRlZCBEREwgaXMgcmVwbGF5LXJlbG9jYXRhYmxlLgor ICovCitzdGF0aWMgdm9pZAorYXBwZW5kX3N0bXQoVGFibGVEZGxDb250ZXh0ICogY3R4KQorewor CWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1lbnRzLCBwc3RyZHVwKGN0eC0+ YnVmLmRhdGEpKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9zdHJpcHBlZF9zdG10KFRhYmxl RGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoY3R4LT5zY2hlbWFfcHJlZml4ICE9IE5VTEwpCisJ CWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1lbnRzLAorCQkJCQkJCQkgIHN0 cmlwX3NjaGVtYV9wcmVmaXgoY3R4LT5idWYuZGF0YSwKKwkJCQkJCQkJCQkJCQkgIGN0eC0+c2No ZW1hX3ByZWZpeCkpOworCWVsc2UKKwkJY3R4LT5zdGF0ZW1lbnRzID0gbGFwcGVuZChjdHgtPnN0 YXRlbWVudHMsIHBzdHJkdXAoY3R4LT5idWYuZGF0YSkpOworfQorCisvKgorICogZW1pdF9jcmVh dGVfdGFibGVfc3RtdAorICoJCUJ1aWxkIHRoZSBsZWFkaW5nIENSRUFURSBUQUJMRSBzdGF0ZW1l bnQsIGluY2x1ZGluZyBwZXJzaXN0ZW5jZQorICoJCShURU1QT1JBUlkgLyBVTkxPR0dFRCksIGJv ZHkgKGNvbHVtbiBsaXN0IC8gT0YgdHlwZV9uYW1lIC8KKyAqCQlQQVJUSVRJT04gT0YgcGFyZW50 KSwgSU5IRVJJVFMsIFBBUlRJVElPTiBCWSwgVVNJTkcgbWV0aG9kLAorICoJCVdJVEggKHJlbG9w dGlvbnMpLCBUQUJMRVNQQUNFLCBhbmQgT04gQ09NTUlULgorICovCitzdGF0aWMgdm9pZAorZW1p dF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJUmVsYXRpb24J cmVsID0gY3R4LT5yZWw7CisJY2hhcgkJcmVscGVyc2lzdGVuY2UgPSByZWwtPnJkX3JlbC0+cmVs cGVyc2lzdGVuY2U7CisJY2hhcgkJcmVsa2luZCA9IHJlbC0+cmRfcmVsLT5yZWxraW5kOworCWJv b2wJCWlzX3R5cGVkID0gT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVsb2Z0eXBlKTsKKwlIZWFw VHVwbGUJY2xhc3N0dXA7CisJRGF0dW0JCXJlbG9wdERhdHVtOworCWJvb2wJCXJlbG9wdElzbnVs bDsKKworCWNsYXNzdHVwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1 bShjdHgtPnJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGNsYXNzdHVwKSkKKwkJZWxv ZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0aW9uICV1IiwgY3R4LT5yZWxp ZCk7CisKKwlyZWxvcHREYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihSRUxPSUQsIGNsYXNzdHVwLAor CQkJCQkJCQkgIEFudW1fcGdfY2xhc3NfcmVsb3B0aW9ucywgJnJlbG9wdElzbnVsbCk7CisKKwly ZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgt PmJ1ZiwgIkNSRUFURSAiKTsKKwlpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0Vf VEVNUCkKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICJURU1QT1JBUlkgIik7 CisJZWxzZSBpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfVU5MT0dHRUQpCisJ CWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiVU5MT0dHRUQgIik7CisJYXBwZW5k U3RyaW5nSW5mbygmY3R4LT5idWYsICJUQUJMRSAlcyIsIGN0eC0+cXVhbG5hbWUpOworCisJaWYg KHJlbC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbikKKwl7CisJCU9pZAkJCXBhcmVudE9pZCA9IGdl dF9wYXJ0aXRpb25fcGFyZW50KGN0eC0+cmVsaWQsIHRydWUpOworCQljaGFyCSAgICpwYXJlbnRR dWFsID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQocGFyZW50T2lkLAorCQkJCQkJCQkJCQkJCQkg Y3R4LT5zY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJCQkJCQkJCQkgY3R4LT5iYXNlX25hbWVzcGFj ZSk7CisJCWNoYXIJICAgKnBhcmVudFJlbG5hbWUgPSBnZXRfcmVsX25hbWUocGFyZW50T2lkKTsK KwkJRGF0dW0JCWJvdW5kRGF0dW07CisJCWJvb2wJCWJvdW5kSXNudWxsOworCQljaGFyCSAgICpm b3JWYWx1ZXMgPSBOVUxMOworCQljaGFyCSAgICpib3VuZFN0ciA9IE5VTEw7CisKKwkJaWYgKHBh cmVudFJlbG5hbWUgPT0gTlVMTCkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVS UkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJCSBlcnJtc2coInBhcnRpdGlvbiBwYXJlbnQg d2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCXBhcmVudE9pZCksCisJCQkJCSBl cnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwor CQlib3VuZERhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFJFTE9JRCwgY2xhc3N0dXAsCisJCQkJCQkJ CQkgQW51bV9wZ19jbGFzc19yZWxwYXJ0Ym91bmQsICZib3VuZElzbnVsbCk7CisJCWlmICghYm91 bmRJc251bGwpCisJCXsKKwkJCU5vZGUJICAgKmJvdW5kTm9kZTsKKwkJCUxpc3QJICAgKmRwY29u dGV4dDsKKworCQkJYm91bmRTdHIgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGJvdW5kRGF0dW0pOwor CQkJYm91bmROb2RlID0gc3RyaW5nVG9Ob2RlKGJvdW5kU3RyKTsKKwkJCWRwY29udGV4dCA9IGRl cGFyc2VfY29udGV4dF9mb3IocGFyZW50UmVsbmFtZSwgcGFyZW50T2lkKTsKKwkJCWZvclZhbHVl cyA9IGRlcGFyc2VfZXhwcmVzc2lvbihib3VuZE5vZGUsIGRwY29udGV4dCwgZmFsc2UsIGZhbHNl KTsKKwkJfQorCisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBPRiAl cyAlcyIsCisJCQkJCQkgcGFyZW50UXVhbCwgZm9yVmFsdWVzID8gZm9yVmFsdWVzIDogIkRFRkFV TFQiKTsKKwkJaWYgKGZvclZhbHVlcykKKwkJCXBmcmVlKGZvclZhbHVlcyk7CisJCWlmIChib3Vu ZFN0cikKKwkJCXBmcmVlKGJvdW5kU3RyKTsKKwkJcGZyZWUocGFyZW50UXVhbCk7CisJCXBmcmVl KHBhcmVudFJlbG5hbWUpOworCX0KKwllbHNlIGlmIChpc190eXBlZCkKKwl7CisJCWNoYXIJICAg KnR5cG5hbWUgPSBmb3JtYXRfdHlwZV9iZV9xdWFsaWZpZWQocmVsLT5yZF9yZWwtPnJlbG9mdHlw ZSk7CisKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIgT0YgJXMiLCB0eXBuYW1lKTsK KwkJcGZyZWUodHlwbmFtZSk7CisKKwkJYXBwZW5kX3R5cGVkX2NvbHVtbl9vdmVycmlkZXMoJmN0 eC0+YnVmLCByZWwsIGN0eC0+cHJldHR5LAorCQkJCQkJCQkJICBjdHgtPmluY2x1ZGVfY29uc3Ry YWludHMsCisJCQkJCQkJCQkgIGN0eC0+bm5fZW50cmllcyk7CisJfQorCWVsc2UKKwl7CisJCUxp c3QJICAgKnBhcmVudHM7CisJCUxpc3RDZWxsICAgKmxjOworCQlib29sCQlmaXJzdDsKKworCQlh cHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiAoIik7CisKKwkJYXBwZW5kX2NvbHVt bl9kZWZzKCZjdHgtPmJ1ZiwgcmVsLCBjdHgtPnByZXR0eSwKKwkJCQkJCSAgIGN0eC0+aW5jbHVk ZV9jb25zdHJhaW50cywKKwkJCQkJCSAgIGN0eC0+c2NoZW1hX3F1YWxpZmllZCwgY3R4LT5ubl9l bnRyaWVzKTsKKworCQlpZiAoY3R4LT5wcmV0dHkpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KCZjdHgtPmJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmY3R4 LT5idWYsICcpJyk7CisKKwkJcGFyZW50cyA9IGZpbmRfaW5oZXJpdGFuY2VfcGFyZW50cyhjdHgt PnJlbGlkLCBOb0xvY2spOworCQlpZiAocGFyZW50cyAhPSBOSUwpCisJCXsKKwkJCWFwcGVuZFN0 cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIElOSEVSSVRTICgiKTsKKwkJCWZpcnN0ID0gdHJ1 ZTsKKwkJCWZvcmVhY2gobGMsIHBhcmVudHMpCisJCQl7CisJCQkJT2lkCQkJcG9pZCA9IGxmaXJz dF9vaWQobGMpOworCQkJCWNoYXIJICAgKnBuYW1lID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQo cG9pZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+c2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCQkJ CQkJCWN0eC0+YmFzZV9uYW1lc3BhY2UpOworCisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICIsICIpOworCQkJCWZpcnN0ID0gZmFsc2U7CisJ CQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsIHBuYW1lKTsKKwkJCQlwZnJlZShw bmFtZSk7CisJCQl9CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmY3R4LT5idWYsICcpJyk7CisJ CQlsaXN0X2ZyZWUocGFyZW50cyk7CisJCX0KKwl9CisKKwlpZiAocmVsa2luZCA9PSBSRUxLSU5E X1BBUlRJVElPTkVEX1RBQkxFKQorCXsKKwkJRGF0dW0JCXBhcnRrZXlEYXR1bTsKKwkJY2hhcgkg ICAqcGFydGtleTsKKworCQlwYXJ0a2V5RGF0dW0gPSBPaWRGdW5jdGlvbkNhbGwxKEZfUEdfR0VU X1BBUlRLRVlERUYsCisJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7CisJ CXBhcnRrZXkgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKHBhcnRrZXlEYXR1bSk7CisJCWFwcGVuZFN0 cmluZ0luZm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBCWSAlcyIsIHBhcnRrZXkpOworCQlwZnJl ZShwYXJ0a2V5KTsKKwl9CisKKwlpZiAoT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVsYW0pICYm CisJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxFX0FNX09JRCkKKwl7CisJCWNoYXIJ ICAgKmFtbmFtZSA9IGdldF9hbV9uYW1lKHJlbC0+cmRfcmVsLT5yZWxhbSk7CisKKwkJaWYgKGFt bmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwgIiBVU0lO RyAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoYW1uYW1lKSk7CisJCQlwZnJlZShhbW5h bWUpOworCQl9CisJfQorCisJaWYgKCFyZWxvcHRJc251bGwpCisJeworCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiBXSVRIICgiKTsKKwkJZ2V0X3JlbG9wdGlvbnMoJmN0eC0+ YnVmLCByZWxvcHREYXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZjdHgtPmJ1ZiwgJykn KTsKKwl9CisKKwlSZWxlYXNlU3lzQ2FjaGUoY2xhc3N0dXApOworCisJaWYgKCFjdHgtPm5vX3Rh Ymxlc3BhY2UgJiYgT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSkpCisJewor CQljaGFyCSAgICp0c25hbWUgPSBnZXRfdGFibGVzcGFjZV9uYW1lKHJlbC0+cmRfcmVsLT5yZWx0 YWJsZXNwYWNlKTsKKworCQlpZiAodHNuYW1lICE9IE5VTEwpCisJCXsKKwkJCWFwcGVuZFN0cmlu Z0luZm8oJmN0eC0+YnVmLCAiIFRBQkxFU1BBQ0UgJXMiLAorCQkJCQkJCSBxdW90ZV9pZGVudGlm aWVyKHRzbmFtZSkpOworCQkJcGZyZWUodHNuYW1lKTsKKwkJfQorCX0KKworCWlmIChyZWxwZXJz aXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9URU1QKQorCXsKKwkJT25Db21taXRBY3Rpb24gb2Mg PSBnZXRfb25fY29tbWl0X2FjdGlvbihjdHgtPnJlbGlkKTsKKworCQlpZiAob2MgPT0gT05DT01N SVRfREVMRVRFX1JPV1MpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiBP TiBDT01NSVQgREVMRVRFIFJPV1MiKTsKKwkJZWxzZSBpZiAob2MgPT0gT05DT01NSVRfRFJPUCkK KwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIE9OIENPTU1JVCBEUk9QIik7 CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmN0eC0+YnVmLCAnOycpOworCWFwcGVuZF9z dG10KGN0eCk7Cit9CisKKy8qCisgKiBlbWl0X293bmVyX3N0bXQKKyAqCQlBTFRFUiBUQUJMRSBx dWFsbmFtZSBPV05FUiBUTyByb2xlLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9vd25lcl9zdG10 KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwljaGFyCSAgICpvd25lcjsKKworCWlmIChjdHgt Pm5vX293bmVyKQorCQlyZXR1cm47CisKKwlvd25lciA9IEdldFVzZXJOYW1lRnJvbUlkKGN0eC0+ cmVsLT5yZF9yZWwtPnJlbG93bmVyLCBmYWxzZSk7CisJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1 Zik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJBTFRFUiBUQUJMRSAlcyBPV05FUiBU TyAlczsiLAorCQkJCQkgY3R4LT5xdWFsbmFtZSwgcXVvdGVfaWRlbnRpZmllcihvd25lcikpOwor CWFwcGVuZF9zdG10KGN0eCk7CisJcGZyZWUob3duZXIpOworfQorCisvKgorICogZW1pdF9jaGls ZF9kZWZhdWx0X292ZXJyaWRlcworICoJCUFMVEVSIFRBQkxFIHF1YWxuYW1lIEFMVEVSIENPTFVN TiBjb2wgU0VUIERFRkFVTFQgZXhwciAtIG9uZSBwZXIKKyAqCQlpbmhlcml0ZWQgKGF0dGlzbG9j YWw9ZmFsc2UpIG5vbi1nZW5lcmF0ZWQgY29sdW1uIGNhcnJ5aW5nIGEKKyAqCQlsb2NhbGx5LXNl dCBkZWZhdWx0LiAgR2VuZXJhdGVkIGNvbHVtbnMgYXJlIHNraXBwZWQ6IHRoZWlyCisgKgkJZXhw cmVzc2lvbiBpcyBpbmhlcml0ZWQgYXV0b21hdGljYWxseSBhbmQgU0VUIERFRkFVTFQgd291bGQK KyAqCQlmYWlsIGF0IHJlcGxheS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfY2hpbGRfZGVmYXVs dF9vdmVycmlkZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCVR1cGxlRGVzYwl0dXBkZXNj ID0gUmVsYXRpb25HZXREZXNjcihjdHgtPnJlbCk7CisJTGlzdAkgICAqZHBjb250ZXh0ID0gTklM OworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9y bV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkg ICAqZGVmc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCB8fCBhdHQtPmF0dGlzbG9jYWwg fHwgIWF0dC0+YXR0aGFzZGVmKQorCQkJY29udGludWU7CisJCWlmIChhdHQtPmF0dGdlbmVyYXRl ZCAhPSAnXDAnKQorCQkJY29udGludWU7CisKKwkJZGVmc3RyID0gZmluZF9hdHRyZGVmX3RleHQo Y3R4LT5yZWwsIGF0dC0+YXR0bnVtLCAmZHBjb250ZXh0KTsKKwkJaWYgKGRlZnN0ciA9PSBOVUxM KQorCQkJY29udGludWU7CisKKwkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVu ZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xV TU4gJXMgU0VUIERFRkFVTFQgJXM7IiwKKwkJCQkJCSBjdHgtPnF1YWxuYW1lLAorCQkJCQkJIHF1 b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQtPmF0dG5hbWUpKSwKKwkJCQkJCSBkZWZzdHIpOwor CQlhcHBlbmRfc3RtdChjdHgpOworCQlwZnJlZShkZWZzdHIpOworCX0KK30KKworLyoKKyAqIGVt aXRfYXR0b3B0aW9ucworICoJCUFMVEVSIFRBQkxFIHF1YWxuYW1lIEFMVEVSIENPTFVNTiBjb2wg U0VUICguLi4pIC0gb25lIHBlciBjb2x1bW4KKyAqCQl3aXRoIG5vbi1udWxsIHBnX2F0dHJpYnV0 ZS5hdHRvcHRpb25zLiAgVGhlIGlubGluZSBmb3JtIG9mIHRoZXNlCisgKgkJb3B0aW9ucyBpc24n dCBhdmFpbGFibGUgaW4gQ1JFQVRFIFRBQkxFLCBzbyB0aGV5IGNvbWUgb3V0IGhlcmUuCisgKi8K K3N0YXRpYyB2b2lkCitlbWl0X2F0dG9wdGlvbnMoVGFibGVEZGxDb250ZXh0ICogY3R4KQorewor CVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihjdHgtPnJlbCk7CisKKwlmb3Ig KGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJeworCQlGb3JtX3BnX2F0dHJp YnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOworCQlIZWFwVHVwbGUJYXR0VHVw OworCQlEYXR1bQkJb3B0RGF0dW07CisJCWJvb2wJCW9wdElzbnVsbDsKKworCQlpZiAoYXR0LT5h dHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQlhdHRUdXAgPSBTZWFyY2hTeXNDYWNoZTIo QVRUTlVNLAorCQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSwKKwkJCQkJCQkJ IEludDE2R2V0RGF0dW0oYXR0LT5hdHRudW0pKTsKKwkJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGF0 dFR1cCkpCisJCQljb250aW51ZTsKKworCQlvcHREYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihBVFRO VU0sIGF0dFR1cCwKKwkJCQkJCQkJICAgQW51bV9wZ19hdHRyaWJ1dGVfYXR0b3B0aW9ucywgJm9w dElzbnVsbCk7CisJCWlmICghb3B0SXNudWxsKQorCQl7CisJCQlyZXNldFN0cmluZ0luZm8oJmN0 eC0+YnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJCSAiQUxURVIg VEFCTEUgJXMgQUxURVIgQ09MVU1OICVzIFNFVCAoIiwKKwkJCQkJCQkgY3R4LT5xdWFsbmFtZSwK KwkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+YXR0bmFtZSkpKTsKKwkJCWdl dF9yZWxvcHRpb25zKCZjdHgtPmJ1Ziwgb3B0RGF0dW0pOworCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZygmY3R4LT5idWYsICIpOyIpOworCQkJYXBwZW5kX3N0bXQoY3R4KTsKKwkJfQorCQlSZWxl YXNlU3lzQ2FjaGUoYXR0VHVwKTsKKwl9Cit9CisKKy8qCisgKiBlbWl0X2luZGV4ZXMKKyAqCQlD UkVBVEUgSU5ERVggcGVyIG5vbi1jb25zdHJhaW50LWJhY2tlZCBpbmRleCBvbiB0aGUgcmVsYXRp b24uCisgKgkJSW5kZXhlcyB0aGF0IGJhY2sgUEsgLyBVTklRVUUgLyBFWENMVURFIGNvbnN0cmFp bnRzIGFyZSBlbWl0dGVkCisgKgkJb3V0LW9mLWxpbmUgYnkgZW1pdF9sb2NhbF9jb25zdHJhaW50 cyAodGhlIEFMVEVSIFRBQkxFIC4uLiBBREQKKyAqCQlDT05TVFJBSU5UIHN0YXRlbWVudCBjcmVh dGVzIHRoZSBpbmRleCBpbXBsaWNpdGx5KS4KKyAqLworc3RhdGljIHZvaWQKK2VtaXRfaW5kZXhl cyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJTGlzdAkgICAqaW5kZXhvaWRzOworCUxpc3RD ZWxsICAgKmxjOworCisJaWYgKCFjdHgtPmluY2x1ZGVfaW5kZXhlcykKKwkJcmV0dXJuOworCisJ aW5kZXhvaWRzID0gUmVsYXRpb25HZXRJbmRleExpc3QoY3R4LT5yZWwpOworCWZvcmVhY2gobGMs IGluZGV4b2lkcykKKwl7CisJCU9pZAkJCWlkeG9pZCA9IGxmaXJzdF9vaWQobGMpOworCQljaGFy CSAgICppZHhkZWY7CisKKwkJaWYgKE9pZElzVmFsaWQoZ2V0X2luZGV4X2NvbnN0cmFpbnQoaWR4 b2lkKSkpCisJCQljb250aW51ZTsKKworCQlpZHhkZWYgPSBwZ19nZXRfaW5kZXhkZWZfc3RyaW5n KGlkeG9pZCk7CisJCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYpOworCQlhcHBlbmRTdHJpbmdJ bmZvKCZjdHgtPmJ1ZiwgIiVzOyIsIGlkeGRlZik7CisJCWFwcGVuZF9zdHJpcHBlZF9zdG10KGN0 eCk7CisJCXBmcmVlKGlkeGRlZik7CisJfQorCWxpc3RfZnJlZShpbmRleG9pZHMpOworfQorCisv KgorICogZW1pdF9sb2NhbF9jb25zdHJhaW50cworICoJCUFMVEVSIFRBQkxFIC4uLiBBREQgQ09O U1RSQUlOVCBmb3IgZWFjaCBsb2NhbGx5LWRlZmluZWQgY29uc3RyYWludAorICoJCW9uIHRoZSBy ZWxhdGlvbi4gIEluaGVyaXRlZCBjb25zdHJhaW50cyAoY29uaXNsb2NhbD1mYWxzZSkgY29tZQor ICoJCWZyb20gdGhlIHBhcmVudCdzIERETC4gIENIRUNLIGNvbnN0cmFpbnRzIGFyZSBlbWl0dGVk IGlubGluZSBmb3IKKyAqCQlyZWd1bGFyL3R5cGVkIHRhYmxlcyAoc2tpcCBoZXJlKSBidXQgb3V0 LW9mLWxpbmUgZm9yIHBhcnRpdGlvbgorICoJCWNoaWxkcmVuIChubyBjb2x1bW4gbGlzdCB0byBs aXZlIGluKS4gIFVzZXItbmFtZWQgTk9UIE5VTEwKKyAqCQljb25zdHJhaW50cyBhcmUgZW1pdHRl ZCBpbmxpbmUgYnkgdGhlIGNvbHVtbi1lbWl0IGhlbHBlcnMgYW5kCisgKgkJYXJlIHNraXBwZWQg dmlhIHNraXBfbm90bnVsbF9vaWRzOyBhdXRvLW5hbWVkIE5PVCBOVUxMcyBmYWxsCisgKgkJdGhy b3VnaCBoZXJlIGFuZCBhcmUgZGVkdXAnZCBieSBuYW1lIGF0IHJlcGxheS4gIEZPUkVJR04gS0VZ CisgKgkJZW1pc3Npb24gaXMgZnVydGhlciBnYXRlZCBieSBpbmNsdWRlX2ZvcmVpZ25fa2V5cyBz byBjYWxsZXJzCisgKgkJY2xvbmluZyBhIHNjaGVtYSBjYW4gc3VwcHJlc3MgY3Jvc3MtdGFibGUg cmVmZXJlbmNlcyBpbiBhIGZpcnN0CisgKgkJcGFzcyBhbmQgcmUtZW1pdCB0aGVtIGFmdGVyIGFs bCB0YXJnZXRzIGV4aXN0LiAgV2hlbgorICoJCW9ubHlfZm9yZWlnbl9rZXlzIGlzIHNldCwgdGhl IGxvb3AgZW1pdHMgRk9SRUlHTiBLRVkgcm93cyBhbG9uZQorICoJCWFuZCBza2lwcyBldmVyeXRo aW5nIGVsc2UgLSB0aGF0IGlzIHRoZSBuYXR1cmFsIGNvbXBsZW1lbnQgb2YKKyAqCQl0aGUgaW5j bHVkZXNfZm9yZWlnbl9rZXlzPWZhbHNlIGZpcnN0IHBhc3MsIHVzZWQgdG8gYWRkIHRoZQorICoJ CWNyb3NzLXRhYmxlIHJlZmVyZW5jZXMgb25jZSBkYXRhIGhhcyBiZWVuIGxvYWRlZC4KKyAqLwor c3RhdGljIHZvaWQKK2VtaXRfbG9jYWxfY29uc3RyYWludHMoVGFibGVEZGxDb250ZXh0ICogY3R4 KQoreworCVJlbGF0aW9uCWNvblJlbDsKKwlTeXNTY2FuRGVzYyBjb25TY2FuOworCVNjYW5LZXlE YXRhIGNvbktleTsKKwlIZWFwVHVwbGUJY29uVHVwOworCWJvb2wJCWlzX3BhcnRpdGlvbiA9IGN0 eC0+cmVsLT5yZF9yZWwtPnJlbGlzcGFydGl0aW9uOworCisJaWYgKCFjdHgtPmluY2x1ZGVfY29u c3RyYWludHMpCisJCXJldHVybjsKKworCWNvblJlbCA9IHRhYmxlX29wZW4oQ29uc3RyYWludFJl bGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUluaXQoJmNvbktleSwKKwkJCQlB bnVtX3BnX2NvbnN0cmFpbnRfY29ucmVsaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBG X09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oY3R4LT5yZWxpZCkpOworCWNvblNjYW4gPSBz eXN0YWJsZV9iZWdpbnNjYW4oY29uUmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElk LAorCQkJCQkJCQkgdHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxl SXNWYWxpZChjb25UdXAgPSBzeXN0YWJsZV9nZXRuZXh0KGNvblNjYW4pKSkKKwl7CisJCUZvcm1f cGdfY29uc3RyYWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVw KTsKKwkJY2hhcgkgICAqY29uZGVmOworCisJCWlmICghY29uLT5jb25pc2xvY2FsKQorCQkJY29u dGludWU7CisJCWlmIChjdHgtPm9ubHlfZm9yZWlnbl9rZXlzICYmIGNvbi0+Y29udHlwZSAhPSBD T05TVFJBSU5UX0ZPUkVJR04pCisJCQljb250aW51ZTsKKwkJaWYgKGNvbi0+Y29udHlwZSA9PSBD T05TVFJBSU5UX0NIRUNLICYmICFpc19wYXJ0aXRpb24pCisJCQljb250aW51ZTsKKwkJaWYgKGNv bi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX05PVE5VTEwgJiYgIWlzX3BhcnRpdGlvbiAmJgorCQkJ bGlzdF9tZW1iZXJfb2lkKGN0eC0+c2tpcF9ub3RudWxsX29pZHMsIGNvbi0+b2lkKSkKKwkJCWNv bnRpbnVlOworCQlpZiAoY29uLT5jb250eXBlID09IENPTlNUUkFJTlRfRk9SRUlHTiAmJiAhY3R4 LT5pbmNsdWRlX2ZvcmVpZ25fa2V5cykKKwkJCWNvbnRpbnVlOworCisJCWNvbmRlZiA9IHBnX2dl dF9jb25zdHJhaW50ZGVmX2NvbW1hbmQoY29uLT5vaWQpOworCQlyZXNldFN0cmluZ0luZm8oJmN0 eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIlczsiLCBjb25kZWYpOwor CQlhcHBlbmRfc3RyaXBwZWRfc3RtdChjdHgpOworCQlwZnJlZShjb25kZWYpOworCX0KKwlzeXN0 YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVM b2NrKTsKK30KKworLyoKKyAqIGVtaXRfcnVsZXMKKyAqCQlDUkVBVEUgUlVMRSBwZXIgY2FjaGVk IHJld3JpdGUgcnVsZSBvbiB0aGUgcmVsYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitlbWl0X3J1 bGVzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoIWN0eC0+aW5jbHVkZV9ydWxlcyB8 fCBjdHgtPnJlbC0+cmRfcnVsZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpbnQgaSA9 IDA7IGkgPCBjdHgtPnJlbC0+cmRfcnVsZXMtPm51bUxvY2tzOyBpKyspCisJeworCQlPaWQJCQly dWxlaWQgPSBjdHgtPnJlbC0+cmRfcnVsZXMtPnJ1bGVzW2ldLT5ydWxlSWQ7CisJCURhdHVtCQly dWxlZGVmOworCQljaGFyCSAgICpydWxlZGVmX3N0cjsKKworCQlydWxlZGVmID0gT2lkRnVuY3Rp b25DYWxsMShGX1BHX0dFVF9SVUxFREVGX09JRCwKKwkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1 bShydWxlaWQpKTsKKwkJcnVsZWRlZl9zdHIgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKHJ1bGVkZWYp OworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmlu ZygmY3R4LT5idWYsIHJ1bGVkZWZfc3RyKTsKKwkJYXBwZW5kX3N0cmlwcGVkX3N0bXQoY3R4KTsK KwkJcGZyZWUocnVsZWRlZl9zdHIpOworCX0KK30KKworLyoKKyAqIGVtaXRfc3RhdGlzdGljcwor ICoJCUNSRUFURSBTVEFUSVNUSUNTIHBlciBleHRlbmRlZCBzdGF0aXN0aWNzIG9iamVjdCBvbiB0 aGUgcmVsYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitlbWl0X3N0YXRpc3RpY3MoVGFibGVEZGxD b250ZXh0ICogY3R4KQoreworCVJlbGF0aW9uCXN0YXRSZWw7CisJU3lzU2NhbkRlc2Mgc3RhdFNj YW47CisJU2NhbktleURhdGEgc3RhdEtleTsKKwlIZWFwVHVwbGUJc3RhdFR1cDsKKworCWlmICgh Y3R4LT5pbmNsdWRlX3N0YXRpc3RpY3MpCisJCXJldHVybjsKKworCXN0YXRSZWwgPSB0YWJsZV9v cGVuKFN0YXRpc3RpY0V4dFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUlu aXQoJnN0YXRLZXksCisJCQkJQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eHJlbGlkLAorCQkJCUJU RXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKGN0eC0+ cmVsaWQpKTsKKwlzdGF0U2NhbiA9IHN5c3RhYmxlX2JlZ2luc2NhbihzdGF0UmVsLCBTdGF0aXN0 aWNFeHRSZWxpZEluZGV4SWQsCisJCQkJCQkJCSAgdHJ1ZSwgTlVMTCwgMSwgJnN0YXRLZXkpOwor CisJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoc3RhdFR1cCA9IHN5c3RhYmxlX2dldG5leHQoc3Rh dFNjYW4pKSkKKwl7CisJCUZvcm1fcGdfc3RhdGlzdGljX2V4dCBzdGF0ID0gKEZvcm1fcGdfc3Rh dGlzdGljX2V4dCkgR0VUU1RSVUNUKHN0YXRUdXApOworCQljaGFyCSAgICpzdGF0ZGVmID0gcGdf Z2V0X3N0YXRpc3RpY3NvYmpkZWZfc3RyaW5nKHN0YXQtPm9pZCk7CisKKwkJcmVzZXRTdHJpbmdJ bmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiJXM7Iiwgc3Rh dGRlZik7CisJCWFwcGVuZF9zdHJpcHBlZF9zdG10KGN0eCk7CisJCXBmcmVlKHN0YXRkZWYpOwor CX0KKwlzeXN0YWJsZV9lbmRzY2FuKHN0YXRTY2FuKTsKKwl0YWJsZV9jbG9zZShzdGF0UmVsLCBB Y2Nlc3NTaGFyZUxvY2spOworfQorCisvKgorICogZW1pdF9yZXBsaWNhX2lkZW50aXR5CisgKgkJ QUxURVIgVEFCTEUgcXVhbG5hbWUgUkVQTElDQSBJREVOVElUWSAuLi4gLSBlbWl0dGVkIG9ubHkg d2hlbiB0aGUKKyAqCQlyZWxyZXBsaWRlbnQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0ICgnZCcg PSB1c2UgcHJpbWFyeSBrZXkpLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9yZXBsaWNhX2lkZW50 aXR5KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoIWN0eC0+aW5jbHVkZV9yZXBsaWNh X2lkZW50aXR5KQorCQlyZXR1cm47CisJaWYgKGN0eC0+cmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVu dCA9PSBSRVBMSUNBX0lERU5USVRZX0RFRkFVTFQpCisJCXJldHVybjsKKworCXJlc2V0U3RyaW5n SW5mbygmY3R4LT5idWYpOworCXN3aXRjaCAoY3R4LT5yZWwtPnJkX3JlbC0+cmVscmVwbGlkZW50 KQorCXsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX05PVEhJTkc6CisJCQlhcHBlbmRTdHJpbmdJ bmZvKCZjdHgtPmJ1ZiwKKwkJCQkJCQkgIkFMVEVSIFRBQkxFICVzIFJFUExJQ0EgSURFTlRJVFkg Tk9USElORzsiLAorCQkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJCWFwcGVuZF9zdG10KGN0eCk7 CisJCQlicmVhazsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0ZVTEw6CisJCQlhcHBlbmRTdHJp bmdJbmZvKCZjdHgtPmJ1ZiwKKwkJCQkJCQkgIkFMVEVSIFRBQkxFICVzIFJFUExJQ0EgSURFTlRJ VFkgRlVMTDsiLAorCQkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJCWFwcGVuZF9zdG10KGN0eCk7 CisJCQlicmVhazsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0lOREVYOgorCQkJeworCQkJCU9p ZAkJCXJlcGxpZHggPSBSZWxhdGlvbkdldFJlcGxpY2FJbmRleChjdHgtPnJlbCk7CisKKwkJCQlp ZiAoT2lkSXNWYWxpZChyZXBsaWR4KSkKKwkJCQl7CisJCQkJCWNoYXIJICAgKmlkeG5hbWUgPSBn ZXRfcmVsX25hbWUocmVwbGlkeCk7CisKKwkJCQkJaWYgKGlkeG5hbWUgPT0gTlVMTCkKKwkJCQkJ CWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVD VCksCisJCQkJCQkJCSBlcnJtc2coInJlcGxpY2EgaWRlbnRpdHkgaW5kZXggd2l0aCBPSUQgJXUg ZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCQkJCXJlcGxpZHgpLAorCQkJCQkJCQkgZXJyZGV0YWls KCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIpKSk7CisKKwkJCQkJYXBw ZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkJCQkgIkFMVEVSIFRBQkxFICVzIFJFUExJ Q0EgSURFTlRJVFkgVVNJTkcgSU5ERVggJXM7IiwKKwkJCQkJCQkJCSBjdHgtPnF1YWxuYW1lLAor CQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoaWR4bmFtZSkpOworCQkJCQlhcHBlbmRfc3RtdChj dHgpOworCQkJCQlwZnJlZShpZHhuYW1lKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9Cit9 CisKKy8qCisgKiBlbWl0X3Jsc190b2dnbGVzCisgKgkJQUxURVIgVEFCTEUgcXVhbG5hbWUgRU5B QkxFIC8gRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZLgorICovCitzdGF0aWMgdm9pZAorZW1pdF9y bHNfdG9nZ2xlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJaWYgKCFjdHgtPmluY2x1ZGVf cmxzKQorCQlyZXR1cm47CisKKwlpZiAoY3R4LT5yZWwtPnJkX3JlbC0+cmVscm93c2VjdXJpdHkp CisJeworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygm Y3R4LT5idWYsCisJCQkJCQkgIkFMVEVSIFRBQkxFICVzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJ VFk7IiwKKwkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJYXBwZW5kX3N0bXQoY3R4KTsKKwl9CisJ aWYgKGN0eC0+cmVsLT5yZF9yZWwtPnJlbGZvcmNlcm93c2VjdXJpdHkpCisJeworCQlyZXNldFN0 cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJ CQkgIkFMVEVSIFRBQkxFICVzIEZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWTsiLAorCQkJCQkJIGN0 eC0+cXVhbG5hbWUpOworCQlhcHBlbmRfc3RtdChjdHgpOworCX0KK30KKworLyoKKyAqIGVtaXRf cGFydGl0aW9uX2NoaWxkcmVuCisgKgkJRm9yIGVhY2ggZGlyZWN0IHBhcnRpdGlvbiBjaGlsZCBv ZiBhIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVudCwKKyAqCQlyZWN1cnNpdmVseSBjYWxsIHBnX2dl dF90YWJsZV9kZGxfaW50ZXJuYWwgYW5kIGFwcGVuZCB0aGUgY2hpbGQncworICoJCXN0YXRlbWVu dHMuICBFYWNoIGNoaWxkJ3Mgb3duIERETCBoYW5kbGVzIGZ1cnRoZXIgbGV2ZWxzIHRocm91Z2gK KyAqCQl0aGUgc2FtZSByZWN1cnNpb24uCisgKi8KK3N0YXRpYyB2b2lkCitlbWl0X3BhcnRpdGlv bl9jaGlsZHJlbihUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJTGlzdAkgICAqY2hpbGRyZW47 CisJTGlzdENlbGwgICAqbGM7CisKKwlpZiAoIWN0eC0+aW5jbHVkZV9wYXJ0aXRpb24gfHwKKwkJ Y3R4LT5yZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQor CQlyZXR1cm47CisKKwljaGlsZHJlbiA9IGZpbmRfaW5oZXJpdGFuY2VfY2hpbGRyZW4oY3R4LT5y ZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlmb3JlYWNoKGxjLCBjaGlsZHJlbikKKwl7CisJCU9p ZAkJCWNoaWxkb2lkID0gbGZpcnN0X29pZChsYyk7CisJCUxpc3QJICAgKmNoaWxkc3RtdHM7CisK KwkJY2hpbGRzdG10cyA9IHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwoY2hpbGRvaWQsIGN0eC0+ cHJldHR5LAorCQkJCQkJCQkJCQkgICBjdHgtPm5vX293bmVyLAorCQkJCQkJCQkJCQkgICBjdHgt Pm5vX3RhYmxlc3BhY2UsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV9pbmRleGVzLAorCQkJ CQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJCQkJCSAgIGN0eC0+ aW5jbHVkZV9mb3JlaWduX2tleXMsCisJCQkJCQkJCQkJCSAgIGN0eC0+b25seV9mb3JlaWduX2tl eXMsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV9ydWxlcywKKwkJCQkJCQkJCQkJICAgY3R4 LT5pbmNsdWRlX3N0YXRpc3RpY3MsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV90cmlnZ2Vy cywKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJCQkgICBj dHgtPmluY2x1ZGVfcmxzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfcmVwbGljYV9pZGVu dGl0eSwKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCQkJCQkJ ICAgY3R4LT5zY2hlbWFfcXVhbGlmaWVkKTsKKwkJY3R4LT5zdGF0ZW1lbnRzID0gbGlzdF9jb25j YXQoY3R4LT5zdGF0ZW1lbnRzLCBjaGlsZHN0bXRzKTsKKwl9CisJbGlzdF9mcmVlKGNoaWxkcmVu KTsKK30KKworLyoKKyAqIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSBE REwgc3RhdGVtZW50cyB0byByZWNyZWF0ZSBhIHJlZ3VsYXIgb3IgcGFydGl0aW9uZWQgdGFibGUu CisgKgorICogVGhlIGZpcnN0IGxpc3QgZWxlbWVudCBpcyB0aGUgQ1JFQVRFIFRBQkxFIHN0YXRl bWVudC4gIFN1YnNlcXVlbnQKKyAqIGVsZW1lbnRzIGFyZSB0aGUgQUxURVIgVEFCTEUgLyBDUkVB VEUgSU5ERVggLyBDUkVBVEUgUlVMRSAvCisgKiBDUkVBVEUgU1RBVElTVElDUyBzdGF0ZW1lbnRz IG5lZWRlZCB0byByZXN0b3JlIHRoZSB0YWJsZSdzIGZ1bGwKKyAqIGRlZmluaXRpb24uCisgKgor ICogVHJpZ2dlciBhbmQgcG9saWN5IGVtaXNzaW9uIGFyZSBzY2FmZm9sZGVkIGJ1dCBjdXJyZW50 bHkgZGlzYWJsZWQKKyAqICgjaWYgMCkgLSB0aGV5IHdpbGwgYmVjb21lIGEgc2luZ2xlIGhlbHBl ciBjYWxsIG9uY2UgdGhlIHN0YW5kYWxvbmUKKyAqIHBnX2dldF90cmlnZ2VyX2RkbCAvIHBnX2dl dF9wb2xpY3lfZGRsIGhlbHBlcnMgbGFuZC4KKyAqLworc3RhdGljIExpc3QgKgorcGdfZ2V0X3Rh YmxlX2RkbF9pbnRlcm5hbChPaWQgcmVsaWQsIGJvb2wgcHJldHR5LAorCQkJCQkJICBib29sIG5v X293bmVyLCBib29sIG5vX3RhYmxlc3BhY2UsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9pbmRleGVz LAorCQkJCQkJICBib29sIGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkgIGJvb2wgaW5jbHVk ZV9mb3JlaWduX2tleXMsCisJCQkJCQkgIGJvb2wgb25seV9mb3JlaWduX2tleXMsCisJCQkJCQkg IGJvb2wgaW5jbHVkZV9ydWxlcywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3N0YXRpc3RpY3MsCisJ CQkJCQkgIGJvb2wgaW5jbHVkZV90cmlnZ2VycywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3BvbGlj aWVzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcmxzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcmVw bGljYV9pZGVudGl0eSwKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCSAg Ym9vbCBzY2hlbWFfcXVhbGlmaWVkKQoreworCVRhYmxlRGRsQ29udGV4dCBjdHggPSB7MH07CisJ UmVsYXRpb24JcmVsOworCWNoYXIJCXJlbGtpbmQ7CisJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKwor CXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZWxraW5kID0g cmVsLT5yZF9yZWwtPnJlbGtpbmQ7CisKKwkvKgorCSAqIFRoZSBpbml0aWFsIGN1dCBvbmx5IHN1 cHBvcnRzIG9yZGluYXJ5IGFuZCBwYXJ0aXRpb25lZCB0YWJsZXMuICBWaWV3cywKKwkgKiBtYXR2 aWV3cywgZm9yZWlnbiB0YWJsZXMsIHNlcXVlbmNlcywgaW5kZXhlcywgY29tcG9zaXRlIHR5cGVz LCBhbmQKKwkgKiBUT0FTVCB0YWJsZXMgYXJlIG91dCBvZiBzY29wZSBmb3Igbm93LgorCSAqLwor CWlmIChyZWxraW5kICE9IFJFTEtJTkRfUkVMQVRJT04gJiYgcmVsa2luZCAhPSBSRUxLSU5EX1BB UlRJVElPTkVEX1RBQkxFKQorCXsKKwkJY2hhcgkgICAqcmVsbmFtZSA9IHBzdHJkdXAoUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisKKwkJdGFibGVfY2xvc2UocmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JK RUNUX1RZUEUpLAorCQkJCSBlcnJtc2coIlwiJXNcIiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFy dGl0aW9uZWQgdGFibGUiLAorCQkJCQkJcmVsbmFtZSkpKTsKKwl9CisKKwkvKiBDYWxsZXIgbmVl ZHMgU0VMRUNUIG9uIHRoZSB0YWJsZSB0byByZWFkIGl0cyBkZWZpbml0aW9uLiAqLworCWFjbHJl c3VsdCA9IHBnX2NsYXNzX2FjbGNoZWNrKHJlbGlkLCBHZXRVc2VySWQoKSwgQUNMX1NFTEVDVCk7 CisJaWYgKGFjbHJlc3VsdCAhPSBBQ0xDSEVDS19PSykKKwkJYWNsY2hlY2tfZXJyb3IoYWNscmVz dWx0LCBPQkpFQ1RfVEFCTEUsCisJCQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkp OworCisJLyoKKwkgKiBvbmx5X2ZvcmVpZ25fa2V5cyBpcyBtZWFudCB0byBwYWlyIHdpdGggYSBw cmlvciBjYWxsIHRoYXQgc3VwcHJlc3NlZAorCSAqIEZPUkVJR04gS0VZIGVtaXNzaW9uIHZpYSBp bmNsdWRlc19mb3JlaWduX2tleXM9ZmFsc2UuICBDb21iaW5pbmcKKwkgKiBvbmx5X2ZvcmVpZ25f a2V5cz10cnVlIHdpdGggaW5jbHVkZXNfZm9yZWlnbl9rZXlzPWZhbHNlIHdvdWxkIGVtaXQKKwkg KiBub3RoaW5nIHVzZWZ1bCwgc28gcmVqZWN0IHRoYXQgY29tYmluYXRpb24gdXAgZnJvbnQuCisJ ICovCisJaWYgKG9ubHlfZm9yZWlnbl9rZXlzICYmICFpbmNsdWRlX2ZvcmVpZ25fa2V5cykKKwl7 CisJCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJCQkgZXJy bXNnKCJcIm9ubHlfZm9yZWlnbl9rZXlzXCIgcmVxdWlyZXMgXCJpbmNsdWRlc19mb3JlaWduX2tl eXNcIiB0byBiZSB0cnVlIikpKTsKKwl9CisKKwljdHgucmVsID0gcmVsOworCWN0eC5yZWxpZCA9 IHJlbGlkOworCWN0eC5wcmV0dHkgPSBwcmV0dHk7CisJY3R4Lm5vX293bmVyID0gbm9fb3duZXI7 CisJY3R4Lm5vX3RhYmxlc3BhY2UgPSBub190YWJsZXNwYWNlOworCWN0eC5pbmNsdWRlX2luZGV4 ZXMgPSBpbmNsdWRlX2luZGV4ZXM7CisJY3R4LmluY2x1ZGVfY29uc3RyYWludHMgPSBpbmNsdWRl X2NvbnN0cmFpbnRzOworCWN0eC5pbmNsdWRlX2ZvcmVpZ25fa2V5cyA9IGluY2x1ZGVfZm9yZWln bl9rZXlzOworCWN0eC5vbmx5X2ZvcmVpZ25fa2V5cyA9IG9ubHlfZm9yZWlnbl9rZXlzOworCWN0 eC5pbmNsdWRlX3J1bGVzID0gaW5jbHVkZV9ydWxlczsKKwljdHguaW5jbHVkZV9zdGF0aXN0aWNz ID0gaW5jbHVkZV9zdGF0aXN0aWNzOworCWN0eC5pbmNsdWRlX3RyaWdnZXJzID0gaW5jbHVkZV90 cmlnZ2VyczsKKwljdHguaW5jbHVkZV9wb2xpY2llcyA9IGluY2x1ZGVfcG9saWNpZXM7CisJY3R4 LmluY2x1ZGVfcmxzID0gaW5jbHVkZV9ybHM7CisJY3R4LmluY2x1ZGVfcmVwbGljYV9pZGVudGl0 eSA9IGluY2x1ZGVfcmVwbGljYV9pZGVudGl0eTsKKwljdHguaW5jbHVkZV9wYXJ0aXRpb24gPSBp bmNsdWRlX3BhcnRpdGlvbjsKKwljdHguc2NoZW1hX3F1YWxpZmllZCA9IHNjaGVtYV9xdWFsaWZp ZWQ7CisJY3R4LmJhc2VfbmFtZXNwYWNlID0gUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKTsKKwlj dHguc2F2ZV9uZXN0bGV2ZWwgPSAtMTsKKwljdHgucXVhbG5hbWUgPSBsb29rdXBfcmVsbmFtZV9m b3JfZW1pdChyZWxpZCwgc2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCQkgICBjdHguYmFzZV9u YW1lc3BhY2UpOworCisJLyoKKwkgKiBXaGVuIHNjaGVtYV9xdWFsaWZpZWQgaXMgZmFsc2UsIG5h cnJvdyB0aGUgYWN0aXZlIHNlYXJjaF9wYXRoIHRvIHRoZQorCSAqIHRhcmdldCB0YWJsZSdzIG93 biBuYW1lc3BhY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiBEREwgZW1pc3Npb24uICBUaGUKKwkgKiBk ZXBhcnNlIGNvZGUgaW4gcnVsZXV0aWxzIChhbmQgdGhlIHJlZ2NsYXNzL3JlZ3Byb2Mgb3V0cHV0 IGZ1bmN0aW9ucyB3ZQorCSAqIHRyYW5zaXRpdmVseSBjYWxsKSBkZWNpZGVzIHdoZXRoZXIgdG8g c2NoZW1hLXF1YWxpZnkgYSBuYW1lIGJhc2VkIG9uCisJICogd2hldGhlciB0aGUgcmVmZXJlbmNl ZCBvYmplY3QgaXMgcmVhY2hhYmxlIHRocm91Z2ggc2VhcmNoX3BhdGgsIHNvIHRoaXMKKwkgKiBt YWtlcyBzYW1lLXNjaGVtYSByZWZlcmVuY2VzIGluIERFRkFVTFQgYW5kIENIRUNLIGV4cHJlc3Np b25zLCByZWdjbGFzcworCSAqIGxpdGVyYWxzLCBGSyB0YXJnZXRzLCBldGMuIGNvbWUgb3V0IHVu cXVhbGlmaWVkLiAgQ3Jvc3Mtc2NoZW1hCisJICogcmVmZXJlbmNlcyBzdGF5IHF1YWxpZmllZCwg d2hpY2ggaXMgdGhlIGNvcnJlY3RuZXNzIHJlcXVpcmVtZW50LgorCSAqIEF0RU9YYWN0X0dVQyBj bGVhbnMgdXAgYXQgeGFjdCBlbmQgaWYgYW55dGhpbmcgdGhyb3dzIGJldHdlZW4gaGVyZSBhbmQK KwkgKiB0aGUgZXhwbGljaXQgcmVzdG9yZSBiZWxvdzsgb24gdGhlIG5vcm1hbCBwYXRoIHdlIHJl c3RvcmUgcmlnaHQgYmVmb3JlCisJICogcmV0dXJuaW5nLgorCSAqCisJICogUHJlLWNvbXB1dGUg IjxzY2hlbWE+LiIgdG9vIC0gdGhlIGFsd2F5cy1xdWFsaWZpZWQgaGVscGVycworCSAqIChjb25z dHJhaW50ZGVmX2NvbW1hbmQsIGluZGV4ZGVmX3N0cmluZywgcnVsZWRlZiwKKwkgKiBzdGF0aXN0 aWNzb2JqZGVmX3N0cmluZykgaWdub3JlIHNlYXJjaF9wYXRoIGZvciB0aGUgdGFyZ2V0J3Mgb3du ICJBTFRFUgorCSAqIFRBQkxFIHNjaGVtYS50YmwiLyJPTiBzY2hlbWEudGJsIi8iVE8gc2NoZW1h LnRibCIgcHJlZml4IGFuZCBmb3IgdGhlCisJICogcXVhbGlmaWVkIHN0YXRpc3RpY3MgbmFtZTsg d2Ugc3RyaXAgdGhhdCBzdHJpbmcgb3Vyc2VsdmVzIHZpYQorCSAqIHN0cmlwX3NjaGVtYV9wcmVm aXguCisJICovCisJaWYgKCFzY2hlbWFfcXVhbGlmaWVkKQorCXsKKwkJY2hhcgkgICAqbnNwbmFt ZSA9IGdldF9uYW1lc3BhY2VfbmFtZShjdHguYmFzZV9uYW1lc3BhY2UpOworCisJCWlmIChuc3Bu YW1lICE9IE5VTEwpCisJCXsKKwkJCWNvbnN0IGNoYXIgKnFuc3AgPSBxdW90ZV9pZGVudGlmaWVy KG5zcG5hbWUpOworCisJCQljdHguc2NoZW1hX3ByZWZpeCA9IHBzcHJpbnRmKCIlcy4iLCBxbnNw KTsKKwkJCWN0eC5zYXZlX25lc3RsZXZlbCA9IE5ld0dVQ05lc3RMZXZlbCgpOworCQkJKHZvaWQp IHNldF9jb25maWdfb3B0aW9uKCJzZWFyY2hfcGF0aCIsIHFuc3AsCisJCQkJCQkJCQkgUEdDX1VT RVJTRVQsIFBHQ19TX1NFU1NJT04sCisJCQkJCQkJCQkgR1VDX0FDVElPTl9TQVZFLCB0cnVlLCAw LCBmYWxzZSk7CisJCQlwZnJlZShuc3BuYW1lKTsKKwkJfQorCX0KKworCS8qCisJICogQ2FjaGUg bG9jYWxseS1kZWNsYXJlZCBOT1QgTlVMTCBjb25zdHJhaW50IG1ldGFkYXRhIHNvIHRoZSBjb2x1 bW4tIGVtaXQKKwkgKiBoZWxwZXJzIGNhbiBwcm9kdWNlICJDT05TVFJBSU5UIG5hbWUgTk9UIE5V TEwiIGlubGluZSBmb3IgdXNlci1uYW1lZAorCSAqIGNvbnN0cmFpbnRzLCBhbmQgc28gdGhlIGNv bnN0cmFpbnQgbG9vcCBjYW4gYXZvaWQgZG91YmxlLWVtaXR0aW5nIHRoZW0uCisJICovCisJY3R4 Lm5uX2VudHJpZXMgPSBjb2xsZWN0X2xvY2FsX25vdF9udWxsKHJlbCwgJmN0eC5za2lwX25vdG51 bGxfb2lkcyk7CisKKwlpbml0U3RyaW5nSW5mbygmY3R4LmJ1Zik7CisKKwkvKgorCSAqIEVhY2gg cGFzcyBiZWxvdyBhcHBlbmRzIHplcm8gb3IgbW9yZSBmaW5pc2hlZCBzdGF0ZW1lbnRzIHRvCisJ ICogY3R4LnN0YXRlbWVudHMgdmlhIGFwcGVuZF9zdG10IC8gYXBwZW5kX3N0cmlwcGVkX3N0bXQu ICBPcmRlciBpcworCSAqIHNpZ25pZmljYW50OiBDUkVBVEUgVEFCTEUgZmlyc3Q7IE9XTkVSIGFu ZCB0aGUgcGVyLWNvbHVtbiBBTFRFUiBDT0xVTU4KKwkgKiBwYXNzZXMgYmVmb3JlIHN1Yi1vYmpl Y3QgZW1pc3Npb247IHN1Yi1vYmplY3RzIGluIGRlcGVuZGVuY3ktZnJpZW5kbHkKKwkgKiBvcmRl ciAoaW5kZXhlcyBiZWZvcmUgY29uc3RyYWludHMsIHNpbmNlIGNvbnN0cmFpbnQtYmFja2VkIGlu ZGV4ZXMgYXJlCisJICogZW1pdHRlZCBvdXQtb2YtbGluZSBieSB0aGUgY29uc3RyYWludCBsb29w KTsgYW5kIHBhcnRpdGlvbiBjaGlsZHJlbgorCSAqIGxhc3Qgc28gdGhlIHBhcmVudCBhbHJlYWR5 IGV4aXN0cyBhdCByZXBsYXkgdGltZS4KKwkgKgorCSAqIEluIG9ubHlfZm9yZWlnbl9rZXlzIG1v ZGUgdGhlIHRhYmxlIGl0c2VsZiBhbmQgZXZlcnkgbm9uLUZLIHN1Yi1vYmplY3QKKwkgKiBhbHJl YWR5IGV4aXN0ICh0aGUgY2FsbGVyIHByb2R1Y2VkIHRoZW0gaW4gYSBwcmlvciBwYXNzIHZpYQor CSAqIGluY2x1ZGVzX2ZvcmVpZ25fa2V5cz1mYWxzZSksIHNvIHdlIHNraXAgZGlyZWN0bHkgdG8g dGhlIGNvbnN0cmFpbnQKKwkgKiBsb29wLCB3aGljaCB0aGVuIGVtaXRzIEZPUkVJR04gS0VZIHJv d3Mgb25seS4gIFBhcnRpdGlvbi1jaGlsZAorCSAqIHJlY3Vyc2lvbiBzdGlsbCBydW5zIHNvIGNo aWxkIEZLcyBhcmUgcmVhY2hlZCB0b28uCisJICovCisJaWYgKCFvbmx5X2ZvcmVpZ25fa2V5cykK Kwl7CisJCWVtaXRfY3JlYXRlX3RhYmxlX3N0bXQoJmN0eCk7CisJCWVtaXRfb3duZXJfc3RtdCgm Y3R4KTsKKwkJZW1pdF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcygmY3R4KTsKKwkJZW1pdF9hdHRv cHRpb25zKCZjdHgpOworCQllbWl0X2luZGV4ZXMoJmN0eCk7CisJfQorCWVtaXRfbG9jYWxfY29u c3RyYWludHMoJmN0eCk7CisJaWYgKCFvbmx5X2ZvcmVpZ25fa2V5cykKKwl7CisJCWVtaXRfcnVs ZXMoJmN0eCk7CisJCWVtaXRfc3RhdGlzdGljcygmY3R4KTsKKwkJZW1pdF9yZXBsaWNhX2lkZW50 aXR5KCZjdHgpOworCQllbWl0X3Jsc190b2dnbGVzKCZjdHgpOworCX0KKworCS8qCisJICogVHJp Z2dlcnMgYW5kIHJvdy1sZXZlbCBzZWN1cml0eSBwb2xpY2llcyAtIGRpc2FibGVkIHVudGlsIHRo ZQorCSAqIHN0YW5kYWxvbmUgcGdfZ2V0X3RyaWdnZXJfZGRsKCkgYW5kIHBnX2dldF9wb2xpY3lf ZGRsKCkgaGVscGVycyBsYW5kLgorCSAqIFRoZSBzY2FuICsgbG9jayArIGZpbHRlciBzY2FmZm9s ZGluZyBiZWxvdyBpcyBwcmVzZXJ2ZWQgKGluc2lkZSAjaWYgMCkKKwkgKiBzbyB3aXJpbmcgdXAg ZWFjaCBlbWlzc2lvbiBiZWNvbWVzIGEgb25lLWxpbmVyIGluIHRoZSBsb29wIGJvZHkgb25jZQor CSAqIHRob3NlIGhlbHBlcnMgYXJlIGF2YWlsYWJsZS4KKwkgKi8KKyNpZiAwCisJaWYgKGluY2x1 ZGVfdHJpZ2dlcnMpCisJeworCQlSZWxhdGlvbgl0cmlnUmVsOworCQlTeXNTY2FuRGVzYyB0cmln U2NhbjsKKwkJU2NhbktleURhdGEgdHJpZ0tleTsKKwkJSGVhcFR1cGxlCXRyaWdUdXA7CisKKwkJ dHJpZ1JlbCA9IHRhYmxlX29wZW4oVHJpZ2dlclJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7 CisJCVNjYW5LZXlJbml0KCZ0cmlnS2V5LAorCQkJCQlBbnVtX3BnX3RyaWdnZXJfdGdyZWxpZCwK KwkJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCQlPYmplY3RJZEdldERh dHVtKHJlbGlkKSk7CisJCXRyaWdTY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHRyaWdSZWwsIFRy aWdnZXJSZWxpZE5hbWVJbmRleElkLAorCQkJCQkJCQkJICB0cnVlLCBOVUxMLCAxLCAmdHJpZ0tl eSk7CisJCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHRyaWdUdXAgPSBzeXN0YWJsZV9nZXRuZXh0 KHRyaWdTY2FuKSkpCisJCXsKKwkJCUZvcm1fcGdfdHJpZ2dlciB0cmcgPSAoRm9ybV9wZ190cmln Z2VyKSBHRVRTVFJVQ1QodHJpZ1R1cCk7CisKKwkJCWlmICh0cmctPnRnaXNpbnRlcm5hbCkKKwkJ CQljb250aW51ZTsKKworCQkJLyogVE9ETzogYXBwZW5kIHBnX2dldF90cmlnZ2VyX2RkbCh0cmct Pm9pZCkgb3V0cHV0IGhlcmUuICovCisJCX0KKwkJc3lzdGFibGVfZW5kc2Nhbih0cmlnU2Nhbik7 CisJCXRhYmxlX2Nsb3NlKHRyaWdSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJfQorCisJaWYgKGlu Y2x1ZGVfcG9saWNpZXMpCisJeworCQlSZWxhdGlvbglwb2xSZWw7CisJCVN5c1NjYW5EZXNjIHBv bFNjYW47CisJCVNjYW5LZXlEYXRhIHBvbEtleTsKKwkJSGVhcFR1cGxlCXBvbFR1cDsKKworCQlw b2xSZWwgPSB0YWJsZV9vcGVuKFBvbGljeVJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJ CVNjYW5LZXlJbml0KCZwb2xLZXksCisJCQkJCUFudW1fcGdfcG9saWN5X3BvbHJlbGlkLAorCQkJ CQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJCU9iamVjdElkR2V0RGF0dW0o cmVsaWQpKTsKKwkJcG9sU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihwb2xSZWwsIFBvbGljeVBv bHJlbGlkUG9sbmFtZUluZGV4SWQsCisJCQkJCQkJCQkgdHJ1ZSwgTlVMTCwgMSwgJnBvbEtleSk7 CisJCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHBvbFR1cCA9IHN5c3RhYmxlX2dldG5leHQocG9s U2NhbikpKQorCQl7CisJCQkvKiBUT0RPOiBhcHBlbmQgcGdfZ2V0X3BvbGljeV9kZGwocmVsaWQs IHBvbG5hbWUpIG91dHB1dCBoZXJlLiAqLworCQl9CisJCXN5c3RhYmxlX2VuZHNjYW4ocG9sU2Nh bik7CisJCXRhYmxlX2Nsb3NlKHBvbFJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwl9CisjZWxzZQor CSh2b2lkKSBpbmNsdWRlX3RyaWdnZXJzOworCSh2b2lkKSBpbmNsdWRlX3BvbGljaWVzOworI2Vu ZGlmCisKKwllbWl0X3BhcnRpdGlvbl9jaGlsZHJlbigmY3R4KTsKKworCXsKKwkJaW50CQkJbmF0 dHMgPSBSZWxhdGlvbkdldERlc2NyKHJlbCktPm5hdHRzOworCisJCWZvciAoaW50IGkgPSAxOyBp IDw9IG5hdHRzOyBpKyspCisJCQlpZiAoY3R4Lm5uX2VudHJpZXNbaV0ubmFtZSAhPSBOVUxMKQor CQkJCXBmcmVlKGN0eC5ubl9lbnRyaWVzW2ldLm5hbWUpOworCX0KKwlwZnJlZShjdHgubm5fZW50 cmllcyk7CisKKwl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJcGZyZWUoY3R4 LmJ1Zi5kYXRhKTsKKwlwZnJlZShjdHgucXVhbG5hbWUpOworCWlmIChjdHguc2NoZW1hX3ByZWZp eCAhPSBOVUxMKQorCQlwZnJlZShjdHguc2NoZW1hX3ByZWZpeCk7CisJbGlzdF9mcmVlKGN0eC5z a2lwX25vdG51bGxfb2lkcyk7CisKKwkvKgorCSAqIFBvcCB0aGUgbmFycm93ZWQgc2VhcmNoX3Bh dGggbm93IHRoYXQgYWxsIGhlbHBlcnMgaGF2ZSBydW4uICBFcnJvcnMKKwkgKiB0aHJvd24gZWFy bGllciBhcmUgY2xlYW5lZCB1cCBieSBBdEVPWGFjdF9HVUMgYXQgeGFjdCBlbmQuCisJICovCisJ aWYgKGN0eC5zYXZlX25lc3RsZXZlbCA+PSAwKQorCQlBdEVPWGFjdF9HVUModHJ1ZSwgY3R4LnNh dmVfbmVzdGxldmVsKTsKKworCXJldHVybiBjdHguc3RhdGVtZW50czsKK30KKworLyoKKyAqIHBn X2dldF90YWJsZV9kZGwKKyAqCQlSZXR1cm4gRERMIHRvIHJlY3JlYXRlIGEgdGFibGUgYXMgYSBz ZXQgb2YgdGV4dCByb3dzLgorICovCitEYXR1bQorcGdfZ2V0X3RhYmxlX2RkbChQR19GVU5DVElP Tl9BUkdTKQoreworCUZ1bmNDYWxsQ29udGV4dCAqZnVuY2N0eDsKKwlMaXN0CSAgICpzdGF0ZW1l bnRzOworCisJaWYgKFNSRl9JU19GSVJTVENBTEwoKSkKKwl7CisJCU1lbW9yeUNvbnRleHQgb2xk Y29udGV4dDsKKwkJT2lkCQkJcmVsaWQ7CisJCURkbE9wdGlvbglvcHRzW10gPSB7CisJCQl7InBy ZXR0eSIsIERETF9PUFRfQk9PTH0sCisJCQl7Im93bmVyIiwgRERMX09QVF9CT09MfSwKKwkJCXsi dGFibGVzcGFjZSIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX2luZGV4ZXMiLCBERExf T1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19jb25zdHJhaW50cyIsIERETF9PUFRfQk9PTH0sCisJ CQl7ImluY2x1ZGVzX2ZvcmVpZ25fa2V5cyIsIERETF9PUFRfQk9PTH0sCisJCQl7Im9ubHlfZm9y ZWlnbl9rZXlzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfcnVsZXMiLCBERExfT1BU X0JPT0x9LAorCQkJeyJpbmNsdWRlc19zdGF0aXN0aWNzIiwgRERMX09QVF9CT09MfSwKKwkJCXsi aW5jbHVkZXNfdHJpZ2dlcnMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wb2xpY2ll cyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3JscyIsIERETF9PUFRfQk9PTH0sCisJ CQl7ImluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHkiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNs dWRlc19wYXJ0aXRpb24iLCBERExfT1BUX0JPT0x9LAorCQkJeyJzY2hlbWFfcXVhbGlmaWVkIiwg RERMX09QVF9CT09MfSwKKwkJfTsKKworCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FMTF9JTklUKCk7 CisJCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2Fs bF9tZW1vcnlfY3R4KTsKKworCQlpZiAoUEdfQVJHSVNOVUxMKDApKQorCQl7CisJCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisJCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7 CisJCX0KKworCQlyZWxpZCA9IFBHX0dFVEFSR19PSUQoMCk7CisJCXBhcnNlX2RkbF9vcHRpb25z KGZjaW5mbywgMSwgb3B0cywgbGVuZ3Rob2Yob3B0cykpOworCisJCXN0YXRlbWVudHMgPSBwZ19n ZXRfdGFibGVfZGRsX2ludGVybmFsKHJlbGlkLAorCQkJCQkJCQkJCQkgICBvcHRzWzBdLmlzc2V0 ICYmIG9wdHNbMF0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgb3B0c1sxXS5pc3NldCAmJiAhb3B0 c1sxXS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICBvcHRzWzJdLmlzc2V0ICYmICFvcHRzWzJdLmJv b2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzNdLmlzc2V0IHx8IG9wdHNbM10uYm9vbHZhbCwK KwkJCQkJCQkJCQkJICAgIW9wdHNbNF0uaXNzZXQgfHwgb3B0c1s0XS5ib29sdmFsLAorCQkJCQkJ CQkJCQkgICAhb3B0c1s1XS5pc3NldCB8fCBvcHRzWzVdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAg IG9wdHNbNl0uaXNzZXQgJiYgb3B0c1s2XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s3 XS5pc3NldCB8fCBvcHRzWzddLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzhdLmlzc2V0 IHx8IG9wdHNbOF0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbOV0uaXNzZXQgfHwgb3B0 c1s5XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1sxMF0uaXNzZXQgfHwgb3B0c1sxMF0u Ym9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbMTFdLmlzc2V0IHx8IG9wdHNbMTFdLmJvb2x2 YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzEyXS5pc3NldCB8fCBvcHRzWzEyXS5ib29sdmFsLAor CQkJCQkJCQkJCQkgICBvcHRzWzEzXS5pc3NldCAmJiBvcHRzWzEzXS5ib29sdmFsLAorCQkJCQkJ CQkJCQkgICAhb3B0c1sxNF0uaXNzZXQgfHwgb3B0c1sxNF0uYm9vbHZhbCk7CisJCWZ1bmNjdHgt PnVzZXJfZmN0eCA9IHN0YXRlbWVudHM7CisJCWZ1bmNjdHgtPm1heF9jYWxscyA9IGxpc3RfbGVu Z3RoKHN0YXRlbWVudHMpOworCisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsK Kwl9CisKKwlmdW5jY3R4ID0gU1JGX1BFUkNBTExfU0VUVVAoKTsKKwlzdGF0ZW1lbnRzID0gKExp c3QgKikgZnVuY2N0eC0+dXNlcl9mY3R4OworCisJaWYgKGZ1bmNjdHgtPmNhbGxfY250ciA8IGZ1 bmNjdHgtPm1heF9jYWxscykKKwl7CisJCWNoYXIJICAgKnN0bXQ7CisKKwkJc3RtdCA9IGxpc3Rf bnRoKHN0YXRlbWVudHMsIGZ1bmNjdHgtPmNhbGxfY250cik7CisKKwkJU1JGX1JFVFVSTl9ORVhU KGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0dW0oc3RtdCkpOworCX0KKwllbHNlCisJeworCQls aXN0X2ZyZWVfZGVlcChzdGF0ZW1lbnRzKTsKKwkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOwor CX0KK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfaW5oZXJpdHMuaCBiL3Ny Yy9pbmNsdWRlL2NhdGFsb2cvcGdfaW5oZXJpdHMuaAppbmRleCBjYzg3NGFiYWFiYi4uMWU0NjNi MDEwNmQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfaW5oZXJpdHMuaAorKysg Yi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2luaGVyaXRzLmgKQEAgLTU1LDYgKzU1LDcgQEAgREVD TEFSRV9JTkRFWChwZ19pbmhlcml0c19wYXJlbnRfaW5kZXgsIDIxODcsIEluaGVyaXRzUGFyZW50 SW5kZXhJZCwgcGdfaW5oZXJpdHMKIGV4dGVybiBMaXN0ICpmaW5kX2luaGVyaXRhbmNlX2NoaWxk cmVuKE9pZCBwYXJlbnRyZWxJZCwgTE9DS01PREUgbG9ja21vZGUpOwogZXh0ZXJuIExpc3QgKmZp bmRfaW5oZXJpdGFuY2VfY2hpbGRyZW5fZXh0ZW5kZWQoT2lkIHBhcmVudHJlbElkLCBib29sIG9t aXRfZGV0YWNoZWQsCiAJCQkJCQkJCQkJCQlMT0NLTU9ERSBsb2NrbW9kZSwgYm9vbCAqZGV0YWNo ZWRfZXhpc3QsIFRyYW5zYWN0aW9uSWQgKmRldGFjaGVkX3htaW4pOworZXh0ZXJuIExpc3QgKmZp bmRfaW5oZXJpdGFuY2VfcGFyZW50cyhPaWQgcmVsaWQsIExPQ0tNT0RFIGxvY2ttb2RlKTsKIAog ZXh0ZXJuIExpc3QgKmZpbmRfYWxsX2luaGVyaXRvcnMoT2lkIHBhcmVudHJlbElkLCBMT0NLTU9E RSBsb2NrbW9kZSwKIAkJCQkJCQkJIExpc3QgKipudW1wYXJlbnRzKTsKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CmluZGV4IGJlMTU3YTVmYmU5Li5kMTNjZjEwZWI0MyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CkBAIC04NjE1LDYgKzg2MTUsMTMgQEAKICAgcHJvYXJndHlwZXMgPT4gJ3JlZ2RhdGFi YXNlIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3JlZ2RhdGFiYXNlLHRleHR9JywKICAgcHJv YXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVsdHMgPT4gJ3tOVUxMfScsCiAgIHByb3Ny YyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sgb2lkID0+ICc4MjE1JywgZGVzY3IgPT4g J2dldCBEREwgdG8gcmVjcmVhdGUgYSB0YWJsZScsCisgIHByb25hbWUgPT4gJ3BnX2dldF90YWJs ZV9kZGwnLCBwcm9yb3dzID0+ICc1MCcsIHByb3ZhcmlhZGljID0+ICd0ZXh0JywKKyAgcHJvaXNz dHJpY3QgPT4gJ2YnLCBwcm9yZXRzZXQgPT4gJ3QnLCBwcm92b2xhdGlsZSA9PiAncycsIHByb3Bh cmFsbGVsID0+ICdyJywKKyAgcHJvbmFyZ2RlZmF1bHRzID0+ICcxJywgcHJvcmV0dHlwZSA9PiAn dGV4dCcsCisgIHByb2FyZ3R5cGVzID0+ICdyZWdjbGFzcyBfdGV4dCcsIHByb2FsbGFyZ3R5cGVz ID0+ICd7cmVnY2xhc3MsX3RleHR9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJn ZGVmYXVsdHMgPT4gJ3tOVUxMfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X3RhYmxlX2RkbCcgfSwK IHsgb2lkID0+ICcyNTA5JywKICAgZGVzY3IgPT4gJ2RlcGFyc2UgYW4gZW5jb2RlZCBleHByZXNz aW9uIHdpdGggcHJldHR5LXByaW50IG9wdGlvbicsCiAgIHByb25hbWUgPT4gJ3BnX2dldF9leHBy JywgcHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICd0ZXh0JywKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMv dGFibGVjbWRzLmgKaW5kZXggYzNkODUxOGNiNjIuLmQzMzU2M2ZkZWFkIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5k cy90YWJsZWNtZHMuaApAQCAtOTIsNiArOTIsNyBAQCBleHRlcm4gdm9pZCBjaGVja19vZl90eXBl KEhlYXBUdXBsZSB0eXBldHVwbGUpOwogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9vbl9jb21taXRf YWN0aW9uKE9pZCByZWxpZCwgT25Db21taXRBY3Rpb24gYWN0aW9uKTsKIGV4dGVybiB2b2lkIHJl bW92ZV9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxpZCk7CitleHRlcm4gT25Db21taXRBY3Rpb24g Z2V0X29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlkKTsKIAogZXh0ZXJuIHZvaWQgUHJlQ29tbWl0 X29uX2NvbW1pdF9hY3Rpb25zKHZvaWQpOwogZXh0ZXJuIHZvaWQgQXRFT1hhY3Rfb25fY29tbWl0 X2FjdGlvbnMoYm9vbCBpc0NvbW1pdCk7CkBAIC0xMDgsNCArMTA5LDYgQEAgZXh0ZXJuIHZvaWQg UmFuZ2VWYXJDYWxsYmFja093bnNSZWxhdGlvbihjb25zdCBSYW5nZVZhciAqcmVsYXRpb24sCiBl eHRlcm4gYm9vbCBQYXJ0Q29uc3RyYWludEltcGxpZWRCeVJlbENvbnN0cmFpbnQoUmVsYXRpb24g c2NhbnJlbCwKIAkJCQkJCQkJCQkJCSBMaXN0ICpwYXJ0Q29uc3RyYWludCk7CiAKK2V4dGVybiBj b25zdCBjaGFyICpzdG9yYWdlX25hbWUoY2hhciBjKTsKKwogI2VuZGlmCQkJCQkJCS8qIFRBQkxF Q01EU19IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90 YWJsZV9kZGwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRs Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTQwMDVlNTAwMjkK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJs ZV9kZGwub3V0CkBAIC0wLDAgKzEsODE4IEBACistLQorLS0gcGdfZ2V0X3RhYmxlX2RkbAorLS0K Ky0tIEFsbCB0ZXN0cyBwYXNzIG93bmVyPT5mYWxzZSBzbyB0aGUgQUxURVIgVEFCTEUgT1dORVIg VE8gbGluZSBpcyBub3QKKy0tIGVtaXR0ZWQsIGtlZXBpbmcgb3V0cHV0IHN0YWJsZSBhY3Jvc3Mg dGVzdCBydW5uZXJzICh3aGljaCBtYXkgcnVuIHVuZGVyCistLSBkaWZmZXJlbnQgcm9sZSBuYW1l cykuCistLQorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKK1NFVCBzZWFyY2hfcGF0aCA9 IHBndGJsX2RkbF90ZXN0OworLS0gQmFzaWMgdGFibGUgd2l0aCBQUklNQVJZIEtFWSwgTk9UIE5V TEwsIERFRkFVTFQsIENPTExBVEUuCitDUkVBVEUgVEFCTEUgYmFzaWMgKAorICAgIGlkIGludCBQ UklNQVJZIEtFWSwKKyAgICBuYW1lIHRleHQgTk9UIE5VTEwgREVGQVVMVCAnYW5vbicgQ09MTEFU RSAiQyIKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNp YyAoIGlkIGludGVnZXIgTk9UIE5VTEwsIG5hbWUgdGV4dCBDT0xMQVRFICJDIiBERUZBVUxUICdh bm9uJzo6dGV4dCBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMg QUREIENPTlNUUkFJTlQgYmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFC TEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVs bCBOT1QgTlVMTCBuYW1lOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBD T05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIElk ZW50aXR5IGNvbHVtbnMgKHdpdGggZGVmYXVsdCBhbmQgY3VzdG9tIHNlcXVlbmNlIG9wdGlvbnMp LgorQ1JFQVRFIFRBQkxFIGlkX2NvbHMgKAorICAgIGlkX2Fsd2F5cyBpbnQgR0VORVJBVEVEIEFM V0FZUyBBUyBJREVOVElUWSwKKyAgICBpZF9kZWZhdWx0IGludCBHRU5FUkFURUQgQlkgREVGQVVM VCBBUyBJREVOVElUWQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY29s cyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgKCBpZF9h bHdheXMgaW50ZWdlciBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIE5PVCBOVUxMLCBpZF9k ZWZhdWx0IGludGVnZXIgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkgTk9UIE5VTEwp OworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRf Y29sc19pZF9hbHdheXNfbm90X251bGwgTk9UIE5VTEwgaWRfYWx3YXlzOworIEFMVEVSIFRBQkxF IHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9kZWZhdWx0 X25vdF9udWxsIE5PVCBOVUxMIGlkX2RlZmF1bHQ7CisoMyByb3dzKQorCitDUkVBVEUgVEFCTEUg aWRfY3VzdG9tICgKKyAgICB2IGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZICgKKyAg ICAgICAgU0VRVUVOQ0UgTkFNRSBpZF9jdXN0b21fdl9zZXEKKyAgICAgICAgU1RBUlQgV0lUSCAx MDAgSU5DUkVNRU5UIEJZIDUKKyAgICAgICAgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMAorICAg ICAgICBDQUNIRSAxMCBDWUNMRQorICAgICkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ2lkX2N1c3RvbSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5pZF9jdXN0b20gKCB2IGludGVnZXIgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVO VElUWSAoU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZIDUgTUlOVkFMVUUgNTAgTUFYVkFMVUUg MTAwMCBDQUNIRSAxMCBDWUNMRSkgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LmlkX2N1c3RvbSBBREQgQ09OU1RSQUlOVCBpZF9jdXN0b21fdl9ub3RfbnVsbCBOT1QgTlVM TCB2OworKDIgcm93cykKKworLS0gR2VuZXJhdGVkIHN0b3JlZCBjb2x1bW4uCitDUkVBVEUgVEFC TEUgZ2VuX2NvbHMgKAorICAgIGNlbnRzIGludCwKKyAgICBkb2xsYXJzIG51bWVyaWMgR0VORVJB VEVEIEFMV0FZUyBBUyAoY2VudHMgLyAxMDAuMCkgU1RPUkVECispOworU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdnZW5fY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0Lmdlbl9jb2xzICggY2VudHMgaW50ZWdlciwgZG9sbGFycyBudW1lcmljIEdFTkVSQVRF RCBBTFdBWVMgQVMgKCgoY2VudHMpOjpudW1lcmljIC8gMTAwLjApKSBTVE9SRUQpOworKDEgcm93 KQorCistLSBTVE9SQUdFIGFuZCBDT01QUkVTU0lPTiAob25seSBlbWl0dGVkIHdoZW4gbm9uLWRl ZmF1bHQgZm9yIHRoZSB0eXBlKS4KK0NSRUFURSBUQUJMRSBzdG9yYWdlX2NvbHMgKAorICAgIGEg dGV4dCBTVE9SQUdFIEVYVEVSTkFMLAorICAgIGIgdGV4dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0 ZXh0IENPTVBSRVNTSU9OIHBnbHoKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3N0b3JhZ2VfY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdG9yYWdlX2NvbHMgKCBhIHRleHQgU1RPUkFHRSBF WFRFUk5BTCwgYiB0ZXh0IFNUT1JBR0UgTUFJTiwgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHopOwor KDEgcm93KQorCistLSBDb25zdHJhaW50czogQ0hFQ0ssIFVOSVFVRSwgRk9SRUlHTiBLRVkgKERF RkVSUkFCTEUpLgorQ1JFQVRFIFRBQkxFIHJlZmQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVB VEUgVEFCTEUgY29ucyAoCisgICAgYSBpbnQgQ0hFQ0sgKGEgPiAwKSwKKyAgICBiIGludCBVTklR VUUsCisgICAgYyBpbnQgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxMWSBE RUZFUlJFRAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyAoIGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBj IGludGVnZXIsIENPTlNUUkFJTlQgY29uc19hX2NoZWNrIENIRUNLICgoYSA+IDApKSk7CisgQUxU RVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2Jfa2V5IFVO SVFVRSAoYik7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlO VCBjb25zX2NfZmtleSBGT1JFSUdOIEtFWSAoYykgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJB QkxFIElOSVRJQUxMWSBERUZFUlJFRDsKKygzIHJvd3MpCisKKy0tIEluZGV4ZXM6IGZ1bmN0aW9u YWwgYW5kIHBhcnRpYWwuICBDb25zdHJhaW50LWJhY2tpbmcgaW5kZXhlcyBhcmUKKy0tIHN1cHBy ZXNzZWQgKHRoZXkgYXJlIGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCkuCitDUkVBVEUg VEFCTEUgaWR4ZCAoaWQgaW50IFBSSU1BUlkgS0VZLCBuYW1lIHRleHQpOworQ1JFQVRFIElOREVY IGlkeGRfbG93ZXIgT04gaWR4ZCAobG93ZXIobmFtZSkpOworQ1JFQVRFIElOREVYIGlkeGRfcGFy dGlhbCBPTiBpZHhkIChpZCkgV0hFUkUgaWQgPiAxMDA7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgKCBpZCBpbnRlZ2VyIE5PVCBOVUxMLCBuYW1lIHRl eHQpOworIENSRUFURSBJTkRFWCBpZHhkX2xvd2VyIE9OIHBndGJsX2RkbF90ZXN0LmlkeGQgVVNJ TkcgYnRyZWUgKGxvd2VyKG5hbWUpKTsKKyBDUkVBVEUgSU5ERVggaWR4ZF9wYXJ0aWFsIE9OIHBn dGJsX2RkbF90ZXN0LmlkeGQgVVNJTkcgYnRyZWUgKGlkKSBXSEVSRSAoaWQgPiAxMDApOworIEFM VEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9pZF9ub3Rf bnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZHhkIEFERCBD T05TVFJBSU5UIGlkeGRfcGtleSBQUklNQVJZIEtFWSAoaWQpOworKDUgcm93cykKKworLS0gSW5o ZXJpdGFuY2UsIGluY2x1ZGluZyBhIGNoaWxkIERFRkFVTFQgb3ZlcnJpZGUgb24gYW4gaW5oZXJp dGVkIGNvbHVtbi4KK0NSRUFURSBUQUJMRSBwYXIgKGEgaW50IERFRkFVTFQgMSwgYiB0ZXh0KTsK K0NSRUFURSBUQUJMRSBjaCAoYyBpbnQpIElOSEVSSVRTIChwYXIpOworQUxURVIgVEFCTEUgY2gg QUxURVIgQ09MVU1OIGEgU0VUIERFRkFVTFQgOTk5OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu Y2ggKCBjIGludGVnZXIpIElOSEVSSVRTIChwZ3RibF9kZGxfdGVzdC5wYXIpOworIEFMVEVSIFRB QkxFIHBndGJsX2RkbF90ZXN0LmNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsKKygy IHJvd3MpCisKKy0tIFBlci1jb2x1bW4gYXR0b3B0aW9uczogZW1pdHRlZCBhcyBBTFRFUiBDT0xV TU4gU0VUICguLi4pLgorQ1JFQVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQsIGIgdGV4dCk7CitBTFRF UiBUQUJMRSBhdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF90ZXN0LmF0dG9wdCAoIGEgaW50ZWdlciwgYiB0ZXh0KTsKKyBBTFRF UiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5hdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3Rp bmN0PScxMDAnKTsKKygyIHJvd3MpCisKKy0tIFBhcnRpdGlvbmVkIHRhYmxlIHBhcmVudCAoUkFO R0UgYW5kIEhBU0gpLgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZSAoaWQgaW50LCBrIGludCkg UEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3BhcnRlZF9yYW5nZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRl Z2VyLCBrIGludGVnZXIpIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworKDEgcm93KQorCitDUkVB VEUgVEFCTEUgcGFydGVkX2hhc2ggKGlkIGludCkgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2gnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9oYXNoICggaWQgaW50 ZWdlcikgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKKygxIHJvdykKKworLS0gUGFydGl0aW9uIGNo aWxkcmVuOiBGUk9NL1RPLCBXSVRIIChtb2R1bHVzLCByZW1haW5kZXIpLCBERUZBVUxULgorQ1JF QVRFIFRBQkxFIHBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBG T1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEg QUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxl X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBP RiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAw KTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xV TU4gayBTRVQgREVGQVVMVCA3OworKDIgcm93cykKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNo XzAgUEFSVElUSU9OIE9GIHBhcnRlZF9oYXNoCisgICAgRk9SIFZBTFVFUyBXSVRIIChtb2R1bHVz IDIsIHJlbWFpbmRlciAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVk X2hhc2hfMCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaF8wIFBBUlRJ VElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaCBGT1IgVkFMVUVTIFdJVEggKG1vZHVs dXMgMiwgcmVtYWluZGVyIDApOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFydGVkX3Jhbmdl X2RlZiBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlIERFRkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV9kZWYnOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3Rh YmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5wYXJ0ZWRfcmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRf cmFuZ2UgREVGQVVMVDsKKygxIHJvdykKKworLS0gUnVsZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlk IGludCk7CitDUkVBVEUgVEFCTEUgcnRfbG9nIChpZCBpbnQpOworQ1JFQVRFIFJVTEUgcnRfbG9n X2luc2VydCBBUyBPTiBJTlNFUlQgVE8gcnQKKyAgICBETyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xv ZyBWQUxVRVMgKE5FVy5pZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5ydCAoIGlkIGludGVnZXIpOworIENSRUFURSBSVUxFIHJ0X2xv Z19pbnNlcnQgQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICBPTiBJ TlNFUlQgVE8gcGd0YmxfZGRsX3Rlc3QucnQgRE8gIElOU0VSVCBJTlRPIHJ0X2xvZyAoaWQpKwor ICAgVkFMVUVTIChuZXcuaWQpOworKDIgcm93cykKKworLS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4K K0NSRUFURSBUQUJMRSBzdHggKGEgaW50LCBiIGludCwgYyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJ Q1Mgc3R4X25kdiAobmRpc3RpbmN0KSBPTiBhLCBiIEZST00gc3R4OworU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVz dC5zdHggKCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyKTsKKyBDUkVBVEUgU1RBVElT VElDUyBwZ3RibF9kZGxfdGVzdC5zdHhfbmR2IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7 CisoMiByb3dzKQorCistLSBSb3ctbGV2ZWwgc2VjdXJpdHkgdG9nZ2xlcy4KK0NSRUFURSBUQUJM RSBybHMgKGlkIGludCk7CitBTFRFUiBUQUJMRSBybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklU WTsKK0FMVEVSIFRBQkxFIHJscyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KyAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsK KyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklU WTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VS SVRZOworKDMgcm93cykKKworLS0gUkVQTElDQSBJREVOVElUWTogZW1pdHRlZCBvbmx5IHdoZW4g bm90IHRoZSBkZWZhdWx0LgorQ1JFQVRFIFRBQkxFIHJpX2Z1bGwgKGEgaW50KTsKK0FMVEVSIFRB QkxFIHJpX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxMOworU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdyaV9mdWxsJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJpX2Z1bGwgKCBhIGludGVnZXIpOworIEFM VEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJpX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxMOwor KDIgcm93cykKKworQ1JFQVRFIFRBQkxFIHJpX2lkeCAoYSBpbnQgTk9UIE5VTEwpOworQ1JFQVRF IFVOSVFVRSBJTkRFWCByaV9pZHhfYSBPTiByaV9pZHggKGEpOworQUxURVIgVEFCTEUgcmlfaWR4 IFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggcmlfaWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3JpX2lkeCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggKCBhIGludGVnZXIgTk9UIE5VTEwpOworIENSRUFU RSBVTklRVUUgSU5ERVggcmlfaWR4X2EgT04gcGd0YmxfZGRsX3Rlc3QucmlfaWR4IFVTSU5HIGJ0 cmVlIChhKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggQUREIENPTlNUUkFJ TlQgcmlfaWR4X2Ffbm90X251bGwgTk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxf dGVzdC5yaV9pZHggUkVQTElDQSBJREVOVElUWSBVU0lORyBJTkRFWCByaV9pZHhfYTsKKyg0IHJv d3MpCisKKy0tIFVOTE9HR0VEICsgcmVsb3B0aW9ucy4KK0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1 bm8gKGlkIGludCkgV0lUSCAoZmlsbGZhY3RvciA9IDcwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgndW5vJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFVOTE9HR0VE IFRBQkxFIHBndGJsX2RkbF90ZXN0LnVubyAoIGlkIGludGVnZXIpIFdJVEggKGZpbGxmYWN0b3I9 JzcwJyk7CisoMSByb3cpCisKKy0tIFR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgT0YgdHlwZV9u YW1lKS4gIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gdGhlCistLSB0eXBlIGVtaXQgbm90aGluZzsg bG9jYWxseS1hcHBsaWVkIERFRkFVTFQsIE5PVCBOVUxMIGFuZCBDSEVDSyBjb21lCistLSBvdXQg dGhyb3VnaCBhIHNpbmdsZSAiKGNvbCBXSVRIIE9QVElPTlMgLi4uKSIgbGlzdC4KK0NSRUFURSBU WVBFIHR5cGVkX3QgQVMgKGEgaW50LCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIHR5cGVkX3BsYWlu IE9GIHR5cGVkX3Q7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3R5cGVkX3BsYWlu Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnR5cGVkX3BsYWluIE9GIHBndGJsX2RkbF90 ZXN0LnR5cGVkX3Q7CisoMSByb3cpCisKK0NSRUFURSBUQUJMRSB0eXBlZF9vdmVyIE9GIHR5cGVk X3QgKAorICAgIGEgV0lUSCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVMTCwKKyAgICBiIFdJVEgg T1BUSU9OUyBOT1QgTlVMTCwKKyAgICBDT05TVFJBSU5UIGJfbm9uZW1wdHkgQ0hFQ0sgKGxlbmd0 aChiKSA+IDApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9vdmVy Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw Z19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnR5cGVkX292ZXIgT0YgcGd0YmxfZGRsX3Rlc3QudHlwZWRfdCAo IGEgV0lUSCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVMTCwgYiBXSVRIIE9QVElPTlMgTk9UIE5V TEwsIENPTlNUUkFJTlQgYl9ub25lbXB0eSBDSEVDSyAoKGxlbmd0aChiKSA+IDApKSk7CisgQUxU RVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudHlwZWRfb3ZlciBBREQgQ09OU1RSQUlOVCB0eXBlZF9v dmVyX2Ffbm90X251bGwgTk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC50 eXBlZF9vdmVyIEFERCBDT05TVFJBSU5UIHR5cGVkX292ZXJfYl9ub3RfbnVsbCBOT1QgTlVMTCBi OworKDMgcm93cykKKworLS0gVGVtcG9yYXJ5IHRhYmxlcyArIE9OIENPTU1JVC4gIFRlbXAgdGFi bGVzIGxpdmUgaW4gYSBzZXNzaW9uLWxvY2FsCistLSBuYW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJp ZXMgYmV0d2VlbiBydW5zLCBzbyB3ZSBzdHJpcCB0aGUgc2NoZW1hCistLSBwcmVmaXguICBPTiBD T01NSVQgRFJPUCBvbmx5IGZpcmVzIGF0IGNvbW1pdCwgc28gdGhlIHF1ZXJpZXMgdGhhdAorLS0g bmVlZCB0byBzZWUgdGhlIGNhdGFsb2cgZW50cnkgbXVzdCBydW4gaW4gdGhlIHNhbWUgdHJhbnNh Y3Rpb24gYXMKKy0tIHRoZSBDUkVBVEUuCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBf ZGVmYXVsdCAoaWQgaW50KTsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVsZXRlIChpZCBpbnQp IE9OIENPTU1JVCBERUxFVEUgUk9XUzsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQg aW50KSBPTiBDT01NSVQgRFJPUDsKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190 ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCd0ZW1wX2RlZmF1bHQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQor V0hFUkUgbGluZSBMSUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkg VEFCTEUgcGdfdGVtcC50ZW1wX2RlZmF1bHQgKCBpZCBpbnRlZ2VyKTsKKygxIHJvdykKKworU0VM RUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVt cC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUn OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgVEVNUE9SQVJZIFRBQkxFIHBnX3RlbXAudGVtcF9kZWxldGUgKCBpZCBpbnRlZ2VyKSBP TiBDT01NSVQgREVMRVRFIFJPV1M7CisoMSByb3cpCisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShs aW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBw Z19nZXRfdGFibGVfZGRsKCd0ZW1wX2Ryb3AnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykg QVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50ZW1wX2Ryb3Ag KCBpZCBpbnRlZ2VyKSBPTiBDT01NSVQgRFJPUDsKKygxIHJvdykKKworUk9MTEJBQ0s7CistLSBQ cmV0dHkgbW9kZS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJywgJ3ByZXR0eScsICd0cnVlJyk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJM RSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICArCisgICAgIGlkIGludGVnZXIgTk9UIE5VTEwsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgbmFtZSB0 ZXh0IENPTExBVEUgIkMiIERFRkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMICAgICAgICAgICAg ICAgICAgICAgICAgICAgKworICk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMg QUREIENPTlNUUkFJTlQgYmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFC TEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVs bCBOT1QgTlVMTCBuYW1lOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBD T05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIFZB UklBRElDIEFSUkFZWy4uLl0gY2FsbCBmb3JtOiBvcHRpb24gcGFpcnMgY2FuIGJlIHBhc3NlZCBh cyBhIHNpbmdsZQorLS0gdGV4dFtdIHRhZ2dlZCB3aXRoIFZBUklBRElDLCBpbiBhZGRpdGlvbiB0 byB0aGUgcG9zaXRpb25hbCBzcGVsbGluZworLS0gZXhlcmNpc2VkIGFib3ZlLiAgVGhpcyByZXF1 aXJlcyBwcm9hcmd0eXBlcyB0byBkZWNsYXJlIHRoZSB2YXJpYWRpYworLS0gYXJndW1lbnQgYXMg dGhlIGFycmF5IHR5cGUgKF90ZXh0KS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn YmFzaWMnOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJ QyBBUlJBWVsnb3duZXInLCAnZmFsc2UnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0 LmJhc2ljICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0IENPTExBVEUgIkMiIERFRkFV TFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5i YXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRF UiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19uYW1lX25v dF9udWxsIE5PVCBOVUxMIG5hbWU7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMg QUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZIEtFWSAoaWQpOworKDQgcm93cykKKwor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydvd25lcicsICdmYWxzZScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXR0eScs ICd0cnVlJ106OnRleHRbXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAo ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgIGlk IGludGVnZXIgTk9UIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICsKKyAgICAgbmFtZSB0ZXh0IENPTExBVEUgIkMiIERFRkFVTFQg J2Fub24nOjp0ZXh0IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICk7Cisg QUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfaWRf bm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMg QUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1lOworIEFMVEVS IFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJ TUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIFZBUklBRElDIE5VTEw6OnRleHRbXSBpcyBl cXVpdmFsZW50IHRvIG9taXR0aW5nIHRoZSB2YXJpYWRpYyBhcmd1bWVudHM7CistLSBjaGVjayB0 aGUgcm93IGNvdW50IHJhdGhlciB0aGFuIHRoZSByb3dzIHRoZW1zZWx2ZXMsIGJlY2F1c2Ugd2l0 aG91dAorLS0gJ293bmVyJywgJ2ZhbHNlJyB0aGUgb3V0cHV0IGNvbnRhaW5zIGFuIEFMVEVSIFRB QkxFIC4uLiBPV05FUiBUTyBsaW5lCistLSB0aGF0IHZhcmllcyBhY3Jvc3MgdGVzdCBydW5uZXJz LgorU0VMRUNUIGNvdW50KCopID4gMCBBUyBvaworICBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jh c2ljJzo6cmVnY2xhc3MsIFZBUklBRElDIE5VTEw6OnRleHRbXSk7Cisgb2sgCistLS0tCisgdAor KDEgcm93KQorCistLSBpbmNsdWRlc18qIGdhdGluZzogZWFjaCBzdWItb2JqZWN0IGNhdGVnb3J5 IGNhbiBiZSBzdXBwcmVzc2VkIGluZGl2aWR1YWxseS4KKy0tIGluY2x1ZGVzX2luZGV4ZXM9ZmFs c2UgaGlkZXMgdGhlIENSRUFURSBJTkRFWCBzdGF0ZW1lbnRzLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2luZGV4ZXMnLCAnZmFsc2UnKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxF IHBndGJsX2RkbF90ZXN0LmlkeGQgKCBpZCBpbnRlZ2VyIE5PVCBOVUxMLCBuYW1lIHRleHQpOwor IEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9pZF9u b3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZHhkIEFE RCBDT05TVFJBSU5UIGlkeGRfcGtleSBQUklNQVJZIEtFWSAoaWQpOworKDMgcm93cykKKworLS0g aW5jbHVkZXNfY29uc3RyYWludHM9ZmFsc2UgaGlkZXMgYm90aCBpbmxpbmUgQ0hFQ0sgaW4gQ1JF QVRFIFRBQkxFIGFuZAorLS0gdGhlIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBsaW5l cy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19j b25zdHJhaW50cycsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zICggYSBpbnRlZ2VyLCBiIGludGVnZXIsIGMg aW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX2ZvcmVpZ25fa2V5cz1mYWxzZSBzdXBw cmVzc2VzIG9ubHkgRk9SRUlHTiBLRVkgY29uc3RyYWludHM7CistLSBQUklNQVJZIEtFWSwgVU5J UVVFLCBDSEVDSywgYW5kIG5hbWVkIE5PVCBOVUxMIHN0YXkuICBUaGlzIGlzIHRoZQorLS0gc2No ZW1hLWNsb25pbmcgd29ya2Zsb3c6IGVtaXQgdGFibGVzIGZpcnN0IHdpdGhvdXQgY3Jvc3MtdGFi bGUgRktzLAorLS0gdGhlbiBydW4gcGdfZ2V0X3RhYmxlX2RkbCguLi4sIG9ubHlfZm9yZWlnbl9r ZXlzPT50cnVlKSBhZnRlciBkYXRhCistLSBoYXMgYmVlbiBsb2FkZWQgdG8gYWRkIHRoZW0gb25j ZSBhbGwgdGFyZ2V0cyBleGlzdC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29u cyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICdpbmNsdWRlc19mb3JlaWduX2tleXMnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0LmNvbnMgKCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyLCBDT05T VFJBSU5UIGNvbnNfYV9jaGVjayBDSEVDSyAoKGEgPiAwKSkpOworIEFMVEVSIFRBQkxFIHBndGJs X2RkbF90ZXN0LmNvbnMgQUREIENPTlNUUkFJTlQgY29uc19iX2tleSBVTklRVUUgKGIpOworKDIg cm93cykKKworLS0gb25seV9mb3JlaWduX2tleXM9dHJ1ZSBpcyB0aGUgY29tcGxlbWVudCBvZiB0 aGUgcHJldmlvdXMgY2FsbDogaXQKKy0tIGVtaXRzIG9ubHkgdGhlIEFMVEVSIFRBQkxFIC4uLiBB REQgQ09OU1RSQUlOVCAuLi4gRk9SRUlHTiBLRVkgcm93cworLS0gYW5kIHN1cHByZXNzZXMgdGhl IENSRUFURSBUQUJMRSBhbmQgZXZlcnkgbm9uLUZLIHN1Yi1vYmplY3QuCitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seV9mb3JlaWduX2tleXMnLCAndHJ1ZScp OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LmNvbnMgQUREIENPTlNUUkFJTlQgY29uc19jX2ZrZXkgRk9SRUlHTiBLRVkgKGMpIFJFRkVS RU5DRVMgcmVmZChpZCkgREVGRVJSQUJMRSBJTklUSUFMTFkgREVGRVJSRUQ7CisoMSByb3cpCisK Ky0tIEEgdGFibGUgd2l0aCBubyBmb3JlaWduIGtleXMgcHJvZHVjZXMgbm8gcm93cyBpbiBvbmx5 X2ZvcmVpZ25fa2V5cworLS0gbW9kZS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn cmVmZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdvbmx5X2ZvcmVpZ25fa2V5cycsICd0cnVlJyk7CisgcGdfZ2V0X3RhYmxlX2Rk bCAKKy0tLS0tLS0tLS0tLS0tLS0tLQorKDAgcm93cykKKworLS0gQ29tYmluaW5nIG9ubHlfZm9y ZWlnbl9rZXlzPXRydWUgd2l0aCBpbmNsdWRlc19mb3JlaWduX2tleXM9ZmFsc2UKKy0tIHdvdWxk IGVtaXQgbm90aGluZyB1c2VmdWwsIHNvIHRoZSBjb21iaW5hdGlvbiBpcyByZWplY3RlZC4KK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5X2ZvcmVpZ25fa2V5 cycsICd0cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfZm9y ZWlnbl9rZXlzJywgJ2ZhbHNlJyk7CitFUlJPUjogICJvbmx5X2ZvcmVpZ25fa2V5cyIgcmVxdWly ZXMgImluY2x1ZGVzX2ZvcmVpZ25fa2V5cyIgdG8gYmUgdHJ1ZQorLS0gaW5jbHVkZXNfcnVsZXM9 ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBSVUxFLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdpbmNsdWRlc19ydWxlcycsICdmYWxzZScpOworICAgICAgICAgICAgICAg cGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJ0 ICggaWQgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3N0YXRpc3RpY3M9ZmFsc2Ug aGlkZXMgdGhlIENSRUFURSBTVEFUSVNUSUNTLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAnaW5jbHVkZXNfc3RhdGlzdGljcycsICdmYWxzZScpOworICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Quc3R4ICggYSBp bnRlZ2VyLCBiIGludGVnZXIsIGMgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3Js cz1mYWxzZSBoaWRlcyB0aGUgRU5BQkxFL0ZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWSB0b2dnbGVz LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcmxz JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsKKygxIHJvdykK KworLS0gaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eT1mYWxzZSBoaWRlcyB0aGUgUkVQTElDQSBJ REVOVElUWSBjbGF1c2UuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2Z1bGwn OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAnaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eScsICdmYWxzZScpOworICAgICAgICAgICAg ICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QucmlfZnVsbCAoIGEgaW50ZWdlcik7CisoMSByb3cpCisKKy0tIGluY2x1ZGVzX3Bh cnRpdGlvbjogZGVmYXVsdCBpcyBmYWxzZSwgc28gdGhlIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVu dAorLS0gRERMIG9uIGl0cyBvd24gZG9lcyBub3QgaW5jbHVkZSBpdHMgY2hpbGRyZW4uICBTZXR0 aW5nIGl0IHRvIHRydWUKKy0tIGFwcGVuZHMgdGhlIGNoaWxkcmVuJ3MgRERMIGFmdGVyIHRoZSBw YXJlbnQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZSc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICdpbmNsdWRlc19wYXJ0aXRpb24nLCAndHJ1ZScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVnZXIpIFBBUlRJVElP TiBCWSBSQU5HRSAoaWQpOworIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFu Z2VfMSBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3JhbmdlIEZPUiBWQUxVRVMg RlJPTSAoMCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3Jh bmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKKyBDUkVBVEUgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QucGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3Rlc3QucGFy dGVkX3JhbmdlIERFRkFVTFQ7CisoNCByb3dzKQorCistLSBzY2hlbWFfcXVhbGlmaWVkPWZhbHNl IHN0cmlwcyB0aGUgc2NoZW1hIGZyb20gdGhlIHRhcmdldCB0YWJsZSBpdHNlbGYKKy0tIGFuZCBm cm9tIHNhbWUtc2NoZW1hIHNpYmxpbmcgcmVmZXJlbmNlcyAoaW5oZXJpdGFuY2UvcGFydGl0aW9u CistLSBwYXJlbnRzLCBpZGVudGl0eSBzZXF1ZW5jZXMgaW4gdGhlIHNhbWUgc2NoZW1hKSwgd2hp bGUgY3Jvc3Mtc2NoZW1hCistLSByZWZlcmVuY2VzIGFyZSBrZXB0IHF1YWxpZmllZCBmb3IgY29y cmVjdG5lc3MuCistLQorLS0gQmFyZSBDUkVBVEUgVEFCTEUgZm9yIGFuIG9yZGluYXJ5IHRhYmxl LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVh bGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIGJhc2ljICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0IENPTExBVEUgIkMiIERF RkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBiYXNpYyBBREQgQ09O U1RSQUlOVCBiYXNpY19pZF9ub3RfbnVsbCBOT1QgTlVMTCBpZDsKKyBBTFRFUiBUQUJMRSBiYXNp YyBBREQgQ09OU1RSQUlOVCBiYXNpY19uYW1lX25vdF9udWxsIE5PVCBOVUxMIG5hbWU7CisgQUxU RVIgVEFCTEUgYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZIEtFWSAoaWQp OworKDQgcm93cykKKworLS0gSU5IRVJJVFMgcGFyZW50IGluIHRoZSBzYW1lIHNjaGVtYSBpcyBl bWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjaCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBjaCAoIGMgaW50ZWdlcikgSU5IRVJJ VFMgKHBhcik7CisgQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1OIGEgU0VUIERFRkFVTFQgOTk5 OworKDIgcm93cykKKworLS0gUGFydGl0aW9uIHBhcmVudCBpbiB0aGUgc2FtZSBzY2hlbWEgaXMg ZW1pdHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFy dGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFU RSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGFydGVkX3JhbmdlIEZPUiBWQUxV RVMgRlJPTSAoMCkgVE8gKDEwMCk7CisgQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIg Q09MVU1OIGsgU0VUIERFRkFVTFQgNzsKKygyIHJvd3MpCisKKy0tIENyb3NzLXNjaGVtYSBGSyB0 YXJnZXQga2VlcHMgcXVhbGlmaWNhdGlvbi4gIFRoZSAncmVmZCcgdGFibGUgaXMgaW4KKy0tIHBn dGJsX2RkbF90ZXN0OyBwbGFjZSBhbiBGSyB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgc2NoZW1hIGFu ZCB2ZXJpZnkgaXQKKy0tIHN0YXlzIHF1YWxpZmllZCBldmVuIHdpdGggc2NoZW1hX3F1YWxpZmll ZD1mYWxzZS4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX290aGVyOworQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF9vdGhlci5wYXJlbnQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUg eHNjaGVtYV9mayAoCisgICAgaWQgIGludCBQUklNQVJZIEtFWSwKKyAgICBwaWQgaW50IFJFRkVS RU5DRVMgcGd0YmxfZGRsX290aGVyLnBhcmVudAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgneHNjaGVtYV9mayc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90 YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBDUkVBVEUgVEFCTEUgeHNjaGVtYV9mayAoIGlkIGludGVnZXIgTk9UIE5VTEwsIHBp ZCBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJMRSB4c2NoZW1hX2ZrIEFERCBDT05TVFJBSU5UIHhzY2hl bWFfZmtfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgeHNjaGVtYV9mayBB REQgQ09OU1RSQUlOVCB4c2NoZW1hX2ZrX3BpZF9ma2V5IEZPUkVJR04gS0VZIChwaWQpIFJFRkVS RU5DRVMgcGd0YmxfZGRsX290aGVyLnBhcmVudChpZCk7CisgQUxURVIgVEFCTEUgeHNjaGVtYV9m ayBBREQgQ09OU1RSQUlOVCB4c2NoZW1hX2ZrX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJv d3MpCisKKy0tIElkZW50aXR5IGNvbHVtbiB3aXRoIGEgY3VzdG9tIHNlcXVlbmNlIG5hbWUgaW4g dGhlIHNhbWUgc2NoZW1hIGlzCistLSBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJP TSBwZ19nZXRfdGFibGVfZGRsKCdpZF9jdXN0b20nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdm YWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIGlkX2N1c3RvbSAoIHYgaW50 ZWdlciBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIChTVEFSVCBXSVRIIDEwMCBJTkNSRU1F TlQgQlkgNSBNSU5WQUxVRSA1MCBNQVhWQUxVRSAxMDAwIENBQ0hFIDEwIENZQ0xFKSBOT1QgTlVM TCk7CisgQUxURVIgVEFCTEUgaWRfY3VzdG9tIEFERCBDT05TVFJBSU5UIGlkX2N1c3RvbV92X25v dF9udWxsIE5PVCBOVUxMIHY7CisoMiByb3dzKQorCistLSBSb3VuZC10cmlwOiB3aXRoIHNjaGVt YV9xdWFsaWZpZWQ9ZmFsc2UsIGFmdGVyIFNFVCBzZWFyY2hfcGF0aCB0aGUKKy0tIERETCBjYW4g YmUgcmVwbGF5ZWQgaW50byBhIGRpZmZlcmVudCB0YXJnZXQgc2NoZW1hLgorQ1JFQVRFIFNDSEVN QSBwZ3RibF9kZGxfcmVwbGF5OworRE8gJCQKK0RFQ0xBUkUKKyAgICBzdG10IHRleHQ7CitCRUdJ TgorICAgIFNFVCBMT0NBTCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF9yZXBsYXk7CisgICAgRk9S IHN0bXQgSU4KKyAgICAgICAgU0VMRUNUIGxpbmUgRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3Ri bF9kZGxfdGVzdC5iYXNpYyc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJykgQVMgbGluZQor ICAgIExPT1AKKyAgICAgICAgRVhFQ1VURSBzdG10OworICAgIEVORCBMT09QOworRU5EICQkOwor U0VMRUNUIHJlbG5hbWVzcGFjZTo6cmVnbmFtZXNwYWNlOjp0ZXh0LCByZWxuYW1lCitGUk9NIHBn X2NsYXNzIFdIRVJFIG9pZCA9ICdwZ3RibF9kZGxfcmVwbGF5LmJhc2ljJzo6cmVnY2xhc3M7Cisg ICByZWxuYW1lc3BhY2UgICB8IHJlbG5hbWUgCistLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t CisgcGd0YmxfZGRsX3JlcGxheSB8IGJhc2ljCisoMSByb3cpCisKK0RST1AgU0NIRU1BIHBndGJs X2RkbF9yZXBsYXkgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgcGd0 YmxfZGRsX3JlcGxheS5iYXNpYworRFJPUCBUQUJMRSB4c2NoZW1hX2ZrOworRFJPUCBTQ0hFTUEg cGd0YmxfZGRsX290aGVyIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IHBndGJsX2RkbF9vdGhlci5wYXJlbnQKKy0tIExvY2FsbHktZGVjbGFyZWQgQ0hFQ0sgb24gYSBw YXJ0aXRpb24gY2hpbGQgaGFzIG5vIGlubGluZSBjb2x1bW4KKy0tIGxpc3QgdG8gbGl2ZSBpbiAo UEFSVElUSU9OIE9GIGZvcm0pLCBzbyBpdCBtdXN0IGNvbWUgb3V0IGFzIGEKKy0tIHNlcGFyYXRl IEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQuCitDUkVBVEUgVEFCTEUg cGFydGVkX2NoayAoaWQgaW50LCB2YWwgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGlkKTsKK0NS RUFURSBUQUJMRSBwYXJ0ZWRfY2hrX2NoaWxkIFBBUlRJVElPTiBPRiBwYXJ0ZWRfY2hrCisgICAg KENPTlNUUkFJTlQgY2hrX2lubGluZSBDSEVDSyAodmFsID4gMCkpCisgICAgRk9SIFZBTFVFUyBG Uk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVk X2Noa19jaGlsZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUg VEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX2Noa19jaGlsZCBQQVJUSVRJT04gT0YgcGd0Ymxf ZGRsX3Rlc3QucGFydGVkX2NoayBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworIEFMVEVS IFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9jaGtfY2hpbGQgQUREIENPTlNUUkFJTlQgY2hr X2lubGluZSBDSEVDSyAoKHZhbCA+IDApKTsKKygyIHJvd3MpCisKK0RST1AgVEFCTEUgcGFydGVk X2NoazsKKy0tIEluaGVyaXRhbmNlIGNoaWxkcmVuIG9mIGEgcGFyZW50IHdpdGggYSBnZW5lcmF0 ZWQgY29sdW1uIHNob3VsZCBub3QKKy0tIGVtaXQgYW4gQUxURVIgQ09MVU1OIC4uLiBTRVQgREVG QVVMVCBmb3IgdGhlIGluaGVyaXRlZCBnZW5lcmF0ZWQKKy0tIGNvbHVtbjogdGhlIEdFTkVSQVRF RCBleHByZXNzaW9uIGNhcnJpZXMgZG93biB0aHJvdWdoIGluaGVyaXRhbmNlLAorLS0gYW5kIFNF VCBERUZBVUxUIHdvdWxkIGZhaWwgYXQgcmVwbGF5IGFnYWluc3QgYSBnZW5lcmF0ZWQgY29sdW1u LgorQ1JFQVRFIFRBQkxFIHBhcl9nZW4gKAorICAgIGlkIGludCwKKyAgICBnICBpbnQgR0VORVJB VEVEIEFMV0FZUyBBUyAoaWQgKiAyKSBTVE9SRUQKKyk7CitDUkVBVEUgVEFCTEUgY2hfZ2VuICgp IElOSEVSSVRTIChwYXJfZ2VuKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2hf Z2VuJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNoX2dlbiAoKSBJ TkhFUklUUyAocGd0YmxfZGRsX3Rlc3QucGFyX2dlbik7CisoMSByb3cpCisKK0RST1AgVEFCTEUg cGFyX2dlbiBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjaF9nZW4K Ky0tIFVzZXItbmFtZWQgTk9UIE5VTEwgY29uc3RyYWludCBtdXN0IGJlIGVtaXR0ZWQgaW5saW5l IGFzCistLSAiQ09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBzbyBhIHJlcGxheSBkb2VzIG5vdCBj b2xsaWRlIHdpdGggdGhlCistLSBhdXRvLW5hbWVkIE5PVCBOVUxMIHRoYXQgUG9zdGdyZVNRTCB3 b3VsZCBvdGhlcndpc2UgY3JlYXRlIGZyb20gYQorLS0gcGxhaW4gaW5saW5lICJOT1QgTlVMTCIu ICBUaGUgY29uc3RyYWludCBsb29wIHNraXBzIHRoZSB1c2VyLW5hbWVkCistLSBlbnRyeSB0byBh dm9pZCBkb3VibGUtZW1pc3Npb24uCitDUkVBVEUgVEFCTEUgbm5fbmFtZWQgKAorICAgIGEgaW50 IENPTlNUUkFJTlQgbXlfbm4gTk9UIE5VTEwsCisgICAgYiBpbnQgTk9UIE5VTEwKKyk7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX25hbWVkJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19n ZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0Lm5uX25hbWVkICggYSBpbnRlZ2VyIENPTlNUUkFJTlQgbXlfbm4gTk9UIE5V TEwsIGIgaW50ZWdlciBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qubm5f bmFtZWQgQUREIENPTlNUUkFJTlQgbm5fbmFtZWRfYl9ub3RfbnVsbCBOT1QgTlVMTCBiOworKDIg cm93cykKKworRFJPUCBUQUJMRSBubl9uYW1lZDsKKy0tIExvY2FsbHktZGVjbGFyZWQgTk9UIE5V TEwgb24gYW4gaW5oZXJpdGVkIGNvbHVtbi4gIFRoZSBjb2x1bW4gaXRzZWxmCistLSBpcyBvbWl0 dGVkIGZyb20gdGhlIGNoaWxkJ3MgY29sdW1uIGxpc3QgKGF0dGlzbG9jYWw9ZmFsc2UpLCBzbyB0 aGUKKy0tIHVzZXItbmFtZWQgTk9UIE5VTEwgbXVzdCBjb21lIG91dCB2aWEgdGhlIHBvc3QtQ1JF QVRFIGNvbnN0cmFpbnQKKy0tIGxvb3AgcmF0aGVyIHRoYW4gaW5saW5lLgorQ1JFQVRFIFRBQkxF IG5uX3BhciAoYSBpbnQpOworQ1JFQVRFIFRBQkxFIG5uX2NoIChiIGludCkgSU5IRVJJVFMgKG5u X3Bhcik7CitBTFRFUiBUQUJMRSBubl9jaCBBREQgQ09OU1RSQUlOVCBteV9ubiBOT1QgTlVMTCBh OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdubl9jaCc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90 YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qubm5fY2ggKCBiIGludGVn ZXIpIElOSEVSSVRTIChwZ3RibF9kZGxfdGVzdC5ubl9wYXIpOworIEFMVEVSIFRBQkxFIHBndGJs X2RkbF90ZXN0Lm5uX2NoIEFERCBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxMIGE7CisoMiByb3dz KQorCitEUk9QIFRBQkxFIG5uX3BhciBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBubl9jaAorLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBtdXN0IGRyb3AgdGhlIHNj aGVtYSBwcmVmaXggZnJvbSBERUZBVUxUCistLSBleHByZXNzaW9ucyBhbmQgaW5saW5lIENIRUNL IGJvZGllcyB0aGF0IHJlZmVyZW5jZSBzYW1lLXNjaGVtYQorLS0gb2JqZWN0cyAoc2VxdWVuY2Ug dmlhIG5leHR2YWwsIGZ1bmN0aW9uIHZpYSBkaXJlY3QgY2FsbCkuICBUaGlzCistLSByZWxpZXMg b24gdGhlIGRlcGFyc2VyIHJlc3BlY3RpbmcgdGhlIG5hcnJvd2VkIHNlYXJjaF9wYXRoIHJhdGhl cgorLS0gdGhhbiBvbiBzdWJzdHJpbmcgc3RyaXBwaW5nLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9k ZGxfeHJlZjsKK0NSRUFURSBTRVFVRU5DRSBwZ3RibF9kZGxfeHJlZi5teXNlcTsKK0NSRUFURSBG VU5DVElPTiBwZ3RibF9kZGxfeHJlZi5mKGludCkgUkVUVVJOUyBpbnQgTEFOR1VBR0Ugc3FsIElN TVVUQUJMRQorICAgIEFTICdTRUxFQ1QgJDEnOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF94cmVm LnQgKAorICAgIGlkICBpbnQgREVGQVVMVCBuZXh0dmFsKCdwZ3RibF9kZGxfeHJlZi5teXNlcScp LAorICAgIHZhbCBpbnQsCisgICAgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKHBndGJsX2RkbF94cmVm LmYodmFsKSA+IDApCispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9k ZGxfeHJlZi50Jzo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293 bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1 YWxpZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHQgKCBpZCBpbnRlZ2Vy IERFRkFVTFQgbmV4dHZhbCgnbXlzZXEnOjpyZWdjbGFzcyksIHZhbCBpbnRlZ2VyLCBDT05TVFJB SU5UIGNoayBDSEVDSyAoKGYodmFsKSA+IDApKSk7CisoMSByb3cpCisKK0RST1AgU0NIRU1BIHBn dGJsX2RkbF94cmVmIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDMgb3RoZXIg b2JqZWN0cworREVUQUlMOiAgZHJvcCBjYXNjYWRlcyB0byBzZXF1ZW5jZSBwZ3RibF9kZGxfeHJl Zi5teXNlcQorZHJvcCBjYXNjYWRlcyB0byBmdW5jdGlvbiBwZ3RibF9kZGxfeHJlZi5mKGludGVn ZXIpCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBndGJsX2RkbF94cmVmLnQKKy0tIHNjaGVtYV9x dWFsaWZpZWQ9ZmFsc2UgbXVzdCBOT1QgY29ycnVwdCBzdHJpbmcgbGl0ZXJhbHMgd2hvc2UKKy0t IGNvbnRlbnRzIGhhcHBlbiB0byBjb250YWluIHRoZSBzY2hlbWEgbmFtZSBmb2xsb3dlZCBieSBh IGRvdC4gIFRoZQorLS0gaW4tc3RyaW5nIHN0YXRlIG9mIHRoZSBwcmVmaXggc3RyaXBwZXIgcHJl c2VydmVzIHRoZW0gdmVyYmF0aW0uCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9zdHI7CitDUkVB VEUgVEFCTEUgcGd0YmxfZGRsX3N0ci5wIChpZCBpbnQsIG5vdGUgdGV4dCkgUEFSVElUSU9OIEJZ IFJBTkdFIChpZCk7CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3N0ci5wYyBQQVJUSVRJT04gT0Yg cGd0YmxfZGRsX3N0ci5wCisgICAgKENPTlNUUkFJTlQgY2hrIENIRUNLIChub3RlIDw+ICdwZ3Ri bF9kZGxfc3RyLnNlY3JldCcpKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BndGJsX2RkbF9zdHIucGMnOjpyZWdjbGFz cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBDUkVBVEUgVEFCTEUgcGMgUEFSVElUSU9OIE9GIHAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAo MTAwKTsKKyBBTFRFUiBUQUJMRSBwYyBBREQgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKChub3RlIDw+ ICdwZ3RibF9kZGxfc3RyLnNlY3JldCc6OnRleHQpKTsKKygyIHJvd3MpCisKK0RST1AgU0NIRU1B IHBndGJsX2RkbF9zdHIgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUg cGd0YmxfZGRsX3N0ci5wCistLSBzY2hlbWFfcXVhbGlmaWVkPWZhbHNlIG11c3QgTk9UIGNvcnJ1 cHQgZG91YmxlLXF1b3RlZCBpZGVudGlmaWVycworLS0gd2hvc2UgY29udGVudHMgaGFwcGVuIHRv IGNvbnRhaW4gdGhlIHNjaGVtYSBuYW1lIGZvbGxvd2VkIGJ5IGEgZG90CistLSAoZm9yIGV4YW1w bGUgYSBjb2x1bW4gbGl0ZXJhbGx5IG5hbWVkICI8c2NoZW1hPi53ZWlyZCIgaW5zaWRlIHRoYXQK Ky0tIHNjaGVtYSkuICBUaGUgaW4taWRlbnQgc3RhdGUgb2YgdGhlIHByZWZpeCBzdHJpcHBlciBw cmVzZXJ2ZXMgdGhlbQorLS0gdmVyYmF0aW0uCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9xaWQ7 CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3FpZC5wIChpZCBpbnQsICJwZ3RibF9kZGxfcWlkLndl aXJkIiBpbnQpCisgICAgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitDUkVBVEUgVEFCTEUgcGd0 YmxfZGRsX3FpZC5wYyBQQVJUSVRJT04gT0YgcGd0YmxfZGRsX3FpZC5wCisgICAgKENPTlNUUkFJ TlQgY2hrIENIRUNLICgicGd0YmxfZGRsX3FpZC53ZWlyZCIgPiAwKSkKKyAgICBGT1IgVkFMVUVT IEZST00gKDApIFRPICgxMDApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3Ri bF9kZGxfcWlkLnBjJzo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1h X3F1YWxpZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dl dF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBDUkVBVEUgVEFCTEUgcGMgUEFSVElUSU9OIE9GIHAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAo MTAwKTsKKyBBTFRFUiBUQUJMRSBwYyBBREQgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKCgicGd0Ymxf ZGRsX3FpZC53ZWlyZCIgPiAwKSk7CisoMiByb3dzKQorCitEUk9QIFNDSEVNQSBwZ3RibF9kZGxf cWlkIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBndGJsX2RkbF9x aWQucAorLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSB3aGVuIHRoZSBiYXNlIHNjaGVtYSBuYW1l IGl0c2VsZiByZXF1aXJlcworLS0gcXVvdGluZyAoaXRzIHByZWZpeCBzdGFydHMgd2l0aCAiKS4g IEJvdGggZm9ybXMgb2YgdGhlIHByZWZpeCAtCistLSBiYXJlLWxvd2VyY2FzZSBhbmQgcXVvdGVk IC0gbXVzdCBiZSBzdHJpcHBlZCBmcm9tIG91dGVyCistLSBBTFRFUiBUQUJMRSAvIE9OIC8gQ1JF QVRFIElOREVYIHByZWZpeGVzLCB3aGlsZSBpbm5lciBxdW90ZWQKKy0tIGlkZW50aWZpZXJzIHRo YXQgaGFwcGVuIHRvIGJlZ2luIHRoZSBzYW1lIHdheSBtdXN0IGJlIHByZXNlcnZlZC4KK0NSRUFU RSBTQ0hFTUEgIlBnVGJsLURkbC1RIjsKK0NSRUFURSBUQUJMRSAiUGdUYmwtRGRsLVEiLiJUIiAo aWQgaW50LCB2YWwgaW50LAorICAgIENPTlNUUkFJTlQgY2hrIENIRUNLICh2YWwgPiAwKSk7CitD UkVBVEUgSU5ERVggIlRfdmFsX2lkeCIgT04gIlBnVGJsLURkbC1RIi4iVCIgKHZhbCk7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJyJQZ1RibC1EZGwtUSIuIlQiJzo6cmVnY2xhc3Ms CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFICJUIiAoIGlkIGludGVnZXIsIHZhbCBpbnRlZ2VyLCBDT05TVFJBSU5UIGNoayBDSEVD SyAoKHZhbCA+IDApKSk7CisgQ1JFQVRFIElOREVYICJUX3ZhbF9pZHgiIE9OICJUIiBVU0lORyBi dHJlZSAodmFsKTsKKygyIHJvd3MpCisKK0RST1AgU0NIRU1BICJQZ1RibC1EZGwtUSIgQ0FTQ0FE RTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgIlBnVGJsLURkbC1RIi4iVCIKKy0t IEVycm9yOiBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUuCitDUkVBVEUgVklF VyB2IEFTIFNFTEVDVCAxIEFTIHg7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Yn OjpyZWdjbGFzcyk7CitFUlJPUjogICJ2IiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9u ZWQgdGFibGUKK0NSRUFURSBTRVFVRU5DRSBzOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdzJzo6cmVnY2xhc3MpOworRVJST1I6ICAicyIgaXMgbm90IGFuIG9yZGluYXJ5IG9yIHBh cnRpdGlvbmVkIHRhYmxlCistLSBOVUxMIGFyZ3VtZW50IHJldHVybnMgbm8gcm93cy4KK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbChOVUxMKTsKKyBwZ19nZXRfdGFibGVfZGRsIAorLS0t LS0tLS0tLS0tLS0tLS0tCisoMCByb3dzKQorCistLSBVbnJlY29nbml6ZWQgb3B0aW9uLgorU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnYm9ndXMnLCAn dHJ1ZScpOworRVJST1I6ICB1bnJlY29nbml6ZWQgb3B0aW9uOiAiYm9ndXMiCistLSBPZGQgbnVt YmVyIG9mIHZhcmlhZGljIGFyZ3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jh c2ljJzo6cmVnY2xhc3MsICdwcmV0dHknKTsKK0VSUk9SOiAgdmFyaWFkaWMgYXJndW1lbnRzIG11 c3QgYmUgbmFtZS92YWx1ZSBwYWlycworSElOVDogIFByb3ZpZGUgYW4gZXZlbiBudW1iZXIgb2Yg dmFyaWFkaWMgYXJndW1lbnRzIHRoYXQgY2FuIGJlIGRpdmlkZWQgaW50byBwYWlycy4KKy0tIFJv dW5kLXRyaXAgdmVyaWZpY2F0aW9uLiAgRm9yIGV2ZXJ5IHRlc3QgdGFibGUsIGNhcHR1cmUgdGhl IERETCB0aGUKKy0tIGZ1bmN0aW9uIGVtaXRzLCBkcm9wIHRoZSBzY2hlbWEsIHJlcGxheSBlYWNo IHRhYmxlJ3MgRERMIGluCistLSBkZXBlbmRlbmN5IG9yZGVyLCBhbmQgY29uZmlybSB0aGF0IHBn X2dldF90YWJsZV9kZGwgb24gdGhlIHJlY3JlYXRlZAorLS0gcmVsYXRpb24gbWF0Y2hlcyB0aGUg b3JpZ2luYWwgbGluZS1mb3ItbGluZS4gIFRoZSBmaW5hbCBTRUxFQ1QgbXVzdAorLS0gcmV0dXJu IHplcm8gcm93cy4KK0NSRUFURSBURU1QIFRBQkxFIHBndGJsX2RkbF9ydF9vcmlnIChuYW1lIHRl eHQsIG9yZCBpbnQsIGxpbmUgdGV4dCk7CitJTlNFUlQgSU5UTyBwZ3RibF9kZGxfcnRfb3JpZwor U0VMRUNUIHQubmFtZSwgby5vcmQsIG8ubGluZQorRlJPTSAoVkFMVUVTCisgICAgICAgICgnYmFz aWMnKSwgKCdpZF9jb2xzJyksICgnaWRfY3VzdG9tJyksICgnZ2VuX2NvbHMnKSwgKCdzdG9yYWdl X2NvbHMnKSwKKyAgICAgICAgKCdyZWZkJyksICgnY29ucycpLCAoJ2lkeGQnKSwKKyAgICAgICAg KCdwYXInKSwgKCdjaCcpLCAoJ2F0dG9wdCcpLAorICAgICAgICAoJ3BhcnRlZF9yYW5nZScpLCAo J3BhcnRlZF9yYW5nZV8xJyksICgncGFydGVkX3JhbmdlX2RlZicpLAorICAgICAgICAoJ3BhcnRl ZF9oYXNoJyksICgncGFydGVkX2hhc2hfMCcpLAorICAgICAgICAoJ3J0X2xvZycpLCAoJ3J0Jyks CisgICAgICAgICgnc3R4JyksICgncmxzJyksICgncmlfZnVsbCcpLCAoJ3JpX2lkeCcpLCAoJ3Vu bycpCisgICAgICkgQVMgdChuYW1lKSwKKyAgICAgTEFURVJBTCBwZ19nZXRfdGFibGVfZGRsKCgn cGd0YmxfZGRsX3Rlc3QuJyB8fCB0Lm5hbWUpOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScpIFdJVEggT1JESU5BTElUWSBvKGxpbmUsIG9y ZCk7CitETyAkJAorREVDTEFSRQorICAgIHRhYmxlcyBDT05TVEFOVCB0ZXh0W10gOj0gQVJSQVlb CisgICAgICAgICdiYXNpYycsICdpZF9jb2xzJywgJ2lkX2N1c3RvbScsICdnZW5fY29scycsICdz dG9yYWdlX2NvbHMnLAorICAgICAgICAncmVmZCcsICdjb25zJywgJ2lkeGQnLAorICAgICAgICAn cGFyJywgJ2NoJywgJ2F0dG9wdCcsCisgICAgICAgICdwYXJ0ZWRfcmFuZ2UnLCAncGFydGVkX3Jh bmdlXzEnLCAncGFydGVkX3JhbmdlX2RlZicsCisgICAgICAgICdwYXJ0ZWRfaGFzaCcsICdwYXJ0 ZWRfaGFzaF8wJywKKyAgICAgICAgJ3J0X2xvZycsICdydCcsCisgICAgICAgICdzdHgnLCAncmxz JywgJ3JpX2Z1bGwnLCAncmlfaWR4JywgJ3VubycKKyAgICBdOworICAgIHQgdGV4dDsKKyAgICBz dG10IHRleHQ7CitCRUdJTgorICAgIERST1AgU0NIRU1BIHBndGJsX2RkbF90ZXN0IENBU0NBREU7 CisgICAgQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKKyAgICBGT1JFQUNIIHQgSU4gQVJS QVkgdGFibGVzIExPT1AKKyAgICAgICAgRk9SIHN0bXQgSU4KKyAgICAgICAgICAgIFNFTEVDVCBs aW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcgV0hFUkUgbmFtZSA9IHQgT1JERVIgQlkgb3JkCisg ICAgICAgIExPT1AKKyAgICAgICAgICAgIEVYRUNVVEUgc3RtdDsKKyAgICAgICAgRU5EIExPT1A7 CisgICAgRU5EIExPT1A7CitFTkQgJCQ7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDI1IG90 aGVyIG9iamVjdHMKK0RFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgYmFzaWMKK2Ryb3Ag Y2FzY2FkZXMgdG8gdGFibGUgaWRfY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZF9jdXN0 b20KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgZ2VuX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgc3RvcmFnZV9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJlZmQKK2Ryb3AgY2FzY2Fk ZXMgdG8gdGFibGUgY29ucworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZHhkCitkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIHBhcgorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjaAorZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBhdHRvcHQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFydGVkX3JhbmdlCitk cm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9oYXNoCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IHJ0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0X2xvZworZHJvcCBjYXNjYWRlcyB0byB0YWJs ZSBzdHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmxzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IHJpX2Z1bGwKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfaWR4Citkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIHVubworZHJvcCBjYXNjYWRlcyB0byB0eXBlIHR5cGVkX3QKK2Ryb3AgY2FzY2FkZXMg dG8gdGFibGUgdHlwZWRfcGxhaW4KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdHlwZWRfb3Zlcgor ZHJvcCBjYXNjYWRlcyB0byB2aWV3IHYKK2Ryb3AgY2FzY2FkZXMgdG8gc2VxdWVuY2UgcworV0lU SCBhZnRlcl9kZGwgQVMgKAorICAgIFNFTEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUKKyAgICBG Uk9NIChTRUxFQ1QgRElTVElOQ1QgbmFtZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnKSBBUyB0LAor ICAgICAgICAgTEFURVJBTCBwZ19nZXRfdGFibGVfZGRsKCgncGd0YmxfZGRsX3Rlc3QuJyB8fCB0 Lm5hbWUpOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3du ZXInLCAnZmFsc2UnKSBXSVRIIE9SRElOQUxJVFkgbyhsaW5lLCBvcmQpCispCisoU0VMRUNUICdt aXNzaW5nLWluLWNvcHknIEFTIGtpbmQsIG5hbWUsIG9yZCwgbGluZSBGUk9NIHBndGJsX2RkbF9y dF9vcmlnCisgRVhDRVBUCisgU0VMRUNUICdtaXNzaW5nLWluLWNvcHknLCBuYW1lLCBvcmQsIGxp bmUgRlJPTSBhZnRlcl9kZGwpCitVTklPTiBBTEwKKyhTRUxFQ1QgJ2V4dHJhLWluLWNvcHknIEFT IGtpbmQsIG5hbWUsIG9yZCwgbGluZSBGUk9NIGFmdGVyX2RkbAorIEVYQ0VQVAorIFNFTEVDVCAn ZXh0cmEtaW4tY29weScsIG5hbWUsIG9yZCwgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnKQor T1JERVIgQlkga2luZCwgbmFtZSwgb3JkOworIGtpbmQgfCBuYW1lIHwgb3JkIHwgbGluZSAKKy0t LS0tLSstLS0tLS0rLS0tLS0rLS0tLS0tCisoMCByb3dzKQorCistLSBDbGVhbnVwLgorRFJPUCBT Q0hFTUEgcGd0YmxfZGRsX3Rlc3QgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8g MjAgb3RoZXIgb2JqZWN0cworREVUQUlMOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBiYXNpYwor ZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZF9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlk X2N1c3RvbQorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBnZW5fY29scworZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBzdG9yYWdlX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmVmZAorZHJvcCBj YXNjYWRlcyB0byB0YWJsZSBjb25zCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGlkeGQKK2Ryb3Ag Y2FzY2FkZXMgdG8gdGFibGUgcGFyCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGNoCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIGF0dG9wdAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwYXJ0ZWRfcmFu Z2UKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFydGVkX2hhc2gKK2Ryb3AgY2FzY2FkZXMgdG8g dGFibGUgcnRfbG9nCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0Citkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIHN0eAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBybHMKK2Ryb3AgY2FzY2FkZXMgdG8g dGFibGUgcmlfZnVsbAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByaV9pZHgKK2Ryb3AgY2FzY2Fk ZXMgdG8gdGFibGUgdW5vCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3Nj aGVkdWxlIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQppbmRleCA4ZmEwYTZj NDdmYi4uOWVjYTY0Y2NhM2IgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxf c2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQpAQCAtODEs NyArODEsNyBAQCB0ZXN0OiBjcmVhdGVfdGFibGVfbGlrZSBhbHRlcl9nZW5lcmljIGFsdGVyX29w ZXJhdG9yIG1pc2MgYXN5bmMgZGJzaXplIG1lcmdlIG1pcwogIyBjb2xsYXRlLmxpbnV4LnV0Zjgg YW5kIGNvbGxhdGUuaWN1LnV0ZjggdGVzdHMgY2Fubm90IGJlIHJ1biBpbiBwYXJhbGxlbCB3aXRo IGVhY2ggb3RoZXIKICMgcHNxbCBkZXBlbmRzIG9uIGNyZWF0ZV9hbQogIyBhbXV0aWxzIGRlcGVu ZHMgb24gZ2VvbWV0cnksIGNyZWF0ZV9pbmRleF9zcGdpc3QsIGhhc2hfaW5kZXgsIGJyaW4KLXRl c3Q6IHJ1bGVzIHBzcWwgcHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVsaW5lIGFtdXRpbHMgc3RhdHNf ZXh0IGNvbGxhdGUubGludXgudXRmOCBjb2xsYXRlLndpbmRvd3Mud2luMTI1MgordGVzdDogcnVs ZXMgcHNxbCBwc3FsX2Nyb3NzdGFiIHBzcWxfcGlwZWxpbmUgYW11dGlscyBzdGF0c19leHQgY29s bGF0ZS5saW51eC51dGY4IGNvbGxhdGUud2luZG93cy53aW4xMjUyIHBnX2dldF90YWJsZV9kZGwK IAogIyAtLS0tLS0tLS0tCiAjIFJ1biB0aGVzZSBhbG9uZSBzbyB0aGV5IGRvbid0IHJ1biBvdXQg b2YgcGFyYWxsZWwgd29ya2VycwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdf Z2V0X3RhYmxlX2RkbC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRs LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjM2ZDc1YjkwNzIK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRs LnNxbApAQCAtMCwwICsxLDQ4MiBAQAorLS0KKy0tIHBnX2dldF90YWJsZV9kZGwKKy0tCistLSBB bGwgdGVzdHMgcGFzcyBvd25lcj0+ZmFsc2Ugc28gdGhlIEFMVEVSIFRBQkxFIE9XTkVSIFRPIGxp bmUgaXMgbm90CistLSBlbWl0dGVkLCBrZWVwaW5nIG91dHB1dCBzdGFibGUgYWNyb3NzIHRlc3Qg cnVubmVycyAod2hpY2ggbWF5IHJ1biB1bmRlcgorLS0gZGlmZmVyZW50IHJvbGUgbmFtZXMpLgor LS0KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CitTRVQgc2VhcmNoX3BhdGggPSBwZ3Ri bF9kZGxfdGVzdDsKKworLS0gQmFzaWMgdGFibGUgd2l0aCBQUklNQVJZIEtFWSwgTk9UIE5VTEws IERFRkFVTFQsIENPTExBVEUuCitDUkVBVEUgVEFCTEUgYmFzaWMgKAorICAgIGlkIGludCBQUklN QVJZIEtFWSwKKyAgICBuYW1lIHRleHQgTk9UIE5VTEwgREVGQVVMVCAnYW5vbicgQ09MTEFURSAi QyIKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCistLSBJZGVudGl0eSBjb2x1bW5zICh3aXRoIGRlZmF1bHQg YW5kIGN1c3RvbSBzZXF1ZW5jZSBvcHRpb25zKS4KK0NSRUFURSBUQUJMRSBpZF9jb2xzICgKKyAg ICBpZF9hbHdheXMgaW50IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFksCisgICAgaWRfZGVm YXVsdCBpbnQgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkKKyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2NvbHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl Jyk7CisKK0NSRUFURSBUQUJMRSBpZF9jdXN0b20gKAorICAgIHYgaW50IEdFTkVSQVRFRCBBTFdB WVMgQVMgSURFTlRJVFkgKAorICAgICAgICBTRVFVRU5DRSBOQU1FIGlkX2N1c3RvbV92X3NlcQor ICAgICAgICBTVEFSVCBXSVRIIDEwMCBJTkNSRU1FTlQgQlkgNQorICAgICAgICBNSU5WQUxVRSA1 MCBNQVhWQUxVRSAxMDAwCisgICAgICAgIENBQ0hFIDEwIENZQ0xFCisgICAgKQorKTsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpOworCistLSBHZW5lcmF0ZWQgc3RvcmVkIGNvbHVtbi4KK0NSRUFURSBUQUJMRSBn ZW5fY29scyAoCisgICAgY2VudHMgaW50LAorICAgIGRvbGxhcnMgbnVtZXJpYyBHRU5FUkFURUQg QUxXQVlTIEFTIChjZW50cyAvIDEwMC4wKSBTVE9SRUQKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ2dlbl9jb2xzJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCist LSBTVE9SQUdFIGFuZCBDT01QUkVTU0lPTiAob25seSBlbWl0dGVkIHdoZW4gbm9uLWRlZmF1bHQg Zm9yIHRoZSB0eXBlKS4KK0NSRUFURSBUQUJMRSBzdG9yYWdlX2NvbHMgKAorICAgIGEgdGV4dCBT VE9SQUdFIEVYVEVSTkFMLAorICAgIGIgdGV4dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0ZXh0IENP TVBSRVNTSU9OIHBnbHoKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0b3Jh Z2VfY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gQ29uc3RyYWludHM6 IENIRUNLLCBVTklRVUUsIEZPUkVJR04gS0VZIChERUZFUlJBQkxFKS4KK0NSRUFURSBUQUJMRSBy ZWZkIChpZCBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGNvbnMgKAorICAgIGEgaW50 IENIRUNLIChhID4gMCksCisgICAgYiBpbnQgVU5JUVVFLAorICAgIGMgaW50IFJFRkVSRU5DRVMg cmVmZChpZCkgREVGRVJSQUJMRSBJTklUSUFMTFkgREVGRVJSRUQKKyk7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisK Ky0tIEluZGV4ZXM6IGZ1bmN0aW9uYWwgYW5kIHBhcnRpYWwuICBDb25zdHJhaW50LWJhY2tpbmcg aW5kZXhlcyBhcmUKKy0tIHN1cHByZXNzZWQgKHRoZXkgYXJlIGVtaXR0ZWQgYnkgdGhlIGNvbnN0 cmFpbnQgbG9vcCkuCitDUkVBVEUgVEFCTEUgaWR4ZCAoaWQgaW50IFBSSU1BUlkgS0VZLCBuYW1l IHRleHQpOworQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIgT04gaWR4ZCAobG93ZXIobmFtZSkpOwor Q1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBpZHhkIChpZCkgV0hFUkUgaWQgPiAxMDA7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVyJywg J2ZhbHNlJyk7CisKKy0tIEluaGVyaXRhbmNlLCBpbmNsdWRpbmcgYSBjaGlsZCBERUZBVUxUIG92 ZXJyaWRlIG9uIGFuIGluaGVyaXRlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgcGFyIChhIGludCBE RUZBVUxUIDEsIGIgdGV4dCk7CitDUkVBVEUgVEFCTEUgY2ggKGMgaW50KSBJTkhFUklUUyAocGFy KTsKK0FMVEVSIFRBQkxFIGNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl Jyk7CisKKy0tIFBlci1jb2x1bW4gYXR0b3B0aW9uczogZW1pdHRlZCBhcyBBTFRFUiBDT0xVTU4g U0VUICguLi4pLgorQ1JFQVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQsIGIgdGV4dCk7CitBTFRFUiBU QUJMRSBhdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworCistLSBQYXJ0aXRpb25lZCB0YWJsZSBwYXJlbnQgKFJBTkdFIGFuZCBIQVNIKS4K K0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2UgKGlkIGludCwgayBpbnQpIFBBUlRJVElPTiBCWSBS QU5HRSAoaWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2Un OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFz aCAoaWQgaW50KSBQQVJUSVRJT04gQlkgSEFTSCAoaWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdwYXJ0ZWRfaGFzaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKwor LS0gUGFydGl0aW9uIGNoaWxkcmVuOiBGUk9NL1RPLCBXSVRIIChtb2R1bHVzLCByZW1haW5kZXIp LCBERUZBVUxULgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwYXJ0 ZWRfcmFuZ2UKKyAgICBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworQUxURVIgVEFCTEUg cGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFVTFQgNzsKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywg J2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwYXJ0 ZWRfaGFzaAorICAgIEZPUiBWQUxVRVMgV0lUSCAobW9kdWx1cyAyLCByZW1haW5kZXIgMCk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9oYXNoXzAnOjpyZWdjbGFzcywg J293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfZGVmIFBBUlRJ VElPTiBPRiBwYXJ0ZWRfcmFuZ2UgREVGQVVMVDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGFydGVkX3JhbmdlX2RlZic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKwor LS0gUnVsZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlkIGludCk7CitDUkVBVEUgVEFCTEUgcnRfbG9n IChpZCBpbnQpOworQ1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyBPTiBJTlNFUlQgVE8gcnQK KyAgICBETyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMgKE5FVy5pZCk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScp OworCistLSBFeHRlbmRlZCBzdGF0aXN0aWNzLgorQ1JFQVRFIFRBQkxFIHN0eCAoYSBpbnQsIGIg aW50LCBjIGludCk7CitDUkVBVEUgU1RBVElTVElDUyBzdHhfbmR2IChuZGlzdGluY3QpIE9OIGEs IGIgRlJPTSBzdHg7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gUm93LWxldmVsIHNlY3VyaXR5IHRvZ2dsZXMu CitDUkVBVEUgVEFCTEUgcmxzIChpZCBpbnQpOworQUxURVIgVEFCTEUgcmxzIEVOQUJMRSBST1cg TEVWRUwgU0VDVVJJVFk7CitBTFRFUiBUQUJMRSBybHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZ OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJyk7CisKKy0tIFJFUExJQ0EgSURFTlRJVFk6IGVtaXR0ZWQgb25seSB3aGVuIG5v dCB0aGUgZGVmYXVsdC4KK0NSRUFURSBUQUJMRSByaV9mdWxsIChhIGludCk7CitBTFRFUiBUQUJM RSByaV9mdWxsIFJFUExJQ0EgSURFTlRJVFkgRlVMTDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgncmlfZnVsbCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRF IFRBQkxFIHJpX2lkeCAoYSBpbnQgTk9UIE5VTEwpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCByaV9p ZHhfYSBPTiByaV9pZHggKGEpOworQUxURVIgVEFCTEUgcmlfaWR4IFJFUExJQ0EgSURFTlRJVFkg VVNJTkcgSU5ERVggcmlfaWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jp X2lkeCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gVU5MT0dHRUQgKyByZWxv cHRpb25zLgorQ1JFQVRFIFVOTE9HR0VEIFRBQkxFIHVubyAoaWQgaW50KSBXSVRIIChmaWxsZmFj dG9yID0gNzApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd1bm8nOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgT0Yg dHlwZV9uYW1lKS4gIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gdGhlCistLSB0eXBlIGVtaXQgbm90 aGluZzsgbG9jYWxseS1hcHBsaWVkIERFRkFVTFQsIE5PVCBOVUxMIGFuZCBDSEVDSyBjb21lCist LSBvdXQgdGhyb3VnaCBhIHNpbmdsZSAiKGNvbCBXSVRIIE9QVElPTlMgLi4uKSIgbGlzdC4KK0NS RUFURSBUWVBFIHR5cGVkX3QgQVMgKGEgaW50LCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIHR5cGVk X3BsYWluIE9GIHR5cGVkX3Q7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3R5cGVk X3BsYWluJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgdHlw ZWRfb3ZlciBPRiB0eXBlZF90ICgKKyAgICBhIFdJVEggT1BUSU9OUyBERUZBVUxUIDcgTk9UIE5V TEwsCisgICAgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsCisgICAgQ09OU1RSQUlOVCBiX25vbmVt cHR5IENIRUNLIChsZW5ndGgoYikgPiAwKQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgndHlwZWRfb3Zlcic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gVGVt cG9yYXJ5IHRhYmxlcyArIE9OIENPTU1JVC4gIFRlbXAgdGFibGVzIGxpdmUgaW4gYSBzZXNzaW9u LWxvY2FsCistLSBuYW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMgYmV0d2VlbiBydW5zLCBzbyB3 ZSBzdHJpcCB0aGUgc2NoZW1hCistLSBwcmVmaXguICBPTiBDT01NSVQgRFJPUCBvbmx5IGZpcmVz IGF0IGNvbW1pdCwgc28gdGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVlZCB0byBzZWUgdGhlIGNhdGFs b2cgZW50cnkgbXVzdCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKy0tIHRoZSBDUkVB VEUuCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVmYXVsdCAoaWQgaW50KTsKK0NS RUFURSBURU1QIFRBQkxFIHRlbXBfZGVsZXRlIChpZCBpbnQpIE9OIENPTU1JVCBERUxFVEUgUk9X UzsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50KSBPTiBDT01NSVQgRFJPUDsK KworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAn cGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVmYXVsdCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBsaW5lIExJS0UgJ0NS RUFURSAlJzsKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTld KyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBf ZGVsZXRlJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUg TElLRSAnQ1JFQVRFICUnOworCitTRUxFQ1QgcmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVt cF8/WzAtOV0rIj9cLicsICdwZ190ZW1wLicpIEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2Rk bCgndGVtcF9kcm9wJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFTIGxpbmUKK1dIRVJF IGxpbmUgTElLRSAnQ1JFQVRFICUnOworUk9MTEJBQ0s7CisKKy0tIFByZXR0eSBtb2RlLgorU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnLCAncHJldHR5JywgJ3RydWUnKTsKKworLS0gVkFSSUFESUMgQVJSQVlbLi4uXSBjYWxs IGZvcm06IG9wdGlvbiBwYWlycyBjYW4gYmUgcGFzc2VkIGFzIGEgc2luZ2xlCistLSB0ZXh0W10g dGFnZ2VkIHdpdGggVkFSSUFESUMsIGluIGFkZGl0aW9uIHRvIHRoZSBwb3NpdGlvbmFsIHNwZWxs aW5nCistLSBleGVyY2lzZWQgYWJvdmUuICBUaGlzIHJlcXVpcmVzIHByb2FyZ3R5cGVzIHRvIGRl Y2xhcmUgdGhlIHZhcmlhZGljCistLSBhcmd1bWVudCBhcyB0aGUgYXJyYXkgdHlwZSAoX3RleHQp LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydvd25lcicsICdmYWxz ZSddKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsnb3duZXInLCAn ZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdw cmV0dHknLCAndHJ1ZSddOjp0ZXh0W10pOworCistLSBWQVJJQURJQyBOVUxMOjp0ZXh0W10gaXMg ZXF1aXZhbGVudCB0byBvbWl0dGluZyB0aGUgdmFyaWFkaWMgYXJndW1lbnRzOworLS0gY2hlY2sg dGhlIHJvdyBjb3VudCByYXRoZXIgdGhhbiB0aGUgcm93cyB0aGVtc2VsdmVzLCBiZWNhdXNlIHdp dGhvdXQKKy0tICdvd25lcicsICdmYWxzZScgdGhlIG91dHB1dCBjb250YWlucyBhbiBBTFRFUiBU QUJMRSAuLi4gT1dORVIgVE8gbGluZQorLS0gdGhhdCB2YXJpZXMgYWNyb3NzIHRlc3QgcnVubmVy cy4KK1NFTEVDVCBjb3VudCgqKSA+IDAgQVMgb2sKKyAgRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdi YXNpYyc6OnJlZ2NsYXNzLCBWQVJJQURJQyBOVUxMOjp0ZXh0W10pOworCistLSBpbmNsdWRlc18q IGdhdGluZzogZWFjaCBzdWItb2JqZWN0IGNhdGVnb3J5IGNhbiBiZSBzdXBwcmVzc2VkIGluZGl2 aWR1YWxseS4KKy0tIGluY2x1ZGVzX2luZGV4ZXM9ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBJTkRF WCBzdGF0ZW1lbnRzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2luY2x1ZGVzX2luZGV4ZXMnLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNfY29uc3RyYWludHM9 ZmFsc2UgaGlkZXMgYm90aCBpbmxpbmUgQ0hFQ0sgaW4gQ1JFQVRFIFRBQkxFIGFuZAorLS0gdGhl IEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBsaW5lcy4KK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19jb25zdHJhaW50cycsICdmYWxzZScp OworCistLSBpbmNsdWRlc19mb3JlaWduX2tleXM9ZmFsc2Ugc3VwcHJlc3NlcyBvbmx5IEZPUkVJ R04gS0VZIGNvbnN0cmFpbnRzOworLS0gUFJJTUFSWSBLRVksIFVOSVFVRSwgQ0hFQ0ssIGFuZCBu YW1lZCBOT1QgTlVMTCBzdGF5LiAgVGhpcyBpcyB0aGUKKy0tIHNjaGVtYS1jbG9uaW5nIHdvcmtm bG93OiBlbWl0IHRhYmxlcyBmaXJzdCB3aXRob3V0IGNyb3NzLXRhYmxlIEZLcywKKy0tIHRoZW4g cnVuIHBnX2dldF90YWJsZV9kZGwoLi4uLCBvbmx5X2ZvcmVpZ25fa2V5cz0+dHJ1ZSkgYWZ0ZXIg ZGF0YQorLS0gaGFzIGJlZW4gbG9hZGVkIHRvIGFkZCB0aGVtIG9uY2UgYWxsIHRhcmdldHMgZXhp c3QuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNf Zm9yZWlnbl9rZXlzJywgJ2ZhbHNlJyk7CisKKy0tIG9ubHlfZm9yZWlnbl9rZXlzPXRydWUgaXMg dGhlIGNvbXBsZW1lbnQgb2YgdGhlIHByZXZpb3VzIGNhbGw6IGl0CistLSBlbWl0cyBvbmx5IHRo ZSBBTFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJTlQgLi4uIEZPUkVJR04gS0VZIHJvd3MKKy0t IGFuZCBzdXBwcmVzc2VzIHRoZSBDUkVBVEUgVEFCTEUgYW5kIGV2ZXJ5IG5vbi1GSyBzdWItb2Jq ZWN0LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHlfZm9y ZWlnbl9rZXlzJywgJ3RydWUnKTsKKworLS0gQSB0YWJsZSB3aXRoIG5vIGZvcmVpZ24ga2V5cyBw cm9kdWNlcyBubyByb3dzIGluIG9ubHlfZm9yZWlnbl9rZXlzCistLSBtb2RlLgorU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyZWZkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHlfZm9yZWlnbl9rZXlzJywgJ3Ry dWUnKTsKKworLS0gQ29tYmluaW5nIG9ubHlfZm9yZWlnbl9rZXlzPXRydWUgd2l0aCBpbmNsdWRl c19mb3JlaWduX2tleXM9ZmFsc2UKKy0tIHdvdWxkIGVtaXQgbm90aGluZyB1c2VmdWwsIHNvIHRo ZSBjb21iaW5hdGlvbiBpcyByZWplY3RlZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdvbmx5X2ZvcmVpZ25fa2V5cycsICd0cnVlJywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfZm9yZWlnbl9rZXlzJywgJ2ZhbHNlJyk7CisKKy0t IGluY2x1ZGVzX3J1bGVzPWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUgUlVMRS4KK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3RhYmxlX2RkbCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcnVsZXMnLCAnZmFsc2UnKTsK KworLS0gaW5jbHVkZXNfc3RhdGlzdGljcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIFNUQVRJU1RJ Q1MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19z dGF0aXN0aWNzJywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX3Jscz1mYWxzZSBoaWRlcyB0aGUg RU5BQkxFL0ZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWSB0b2dnbGVzLgorU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdybHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfcmxzJywgJ2ZhbHNlJyk7CisKKy0t IGluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk9ZmFsc2UgaGlkZXMgdGhlIFJFUExJQ0EgSURFTlRJ VFkgY2xhdXNlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9mdWxsJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2luY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHknLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNfcGFy dGl0aW9uOiBkZWZhdWx0IGlzIGZhbHNlLCBzbyB0aGUgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50 CistLSBEREwgb24gaXRzIG93biBkb2VzIG5vdCBpbmNsdWRlIGl0cyBjaGlsZHJlbi4gIFNldHRp bmcgaXQgdG8gdHJ1ZQorLS0gYXBwZW5kcyB0aGUgY2hpbGRyZW4ncyBEREwgYWZ0ZXIgdGhlIHBh cmVudC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlJzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2luY2x1ZGVzX3BhcnRpdGlvbicsICd0cnVlJyk7CisKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9ZmFs c2Ugc3RyaXBzIHRoZSBzY2hlbWEgZnJvbSB0aGUgdGFyZ2V0IHRhYmxlIGl0c2VsZgorLS0gYW5k IGZyb20gc2FtZS1zY2hlbWEgc2libGluZyByZWZlcmVuY2VzIChpbmhlcml0YW5jZS9wYXJ0aXRp b24KKy0tIHBhcmVudHMsIGlkZW50aXR5IHNlcXVlbmNlcyBpbiB0aGUgc2FtZSBzY2hlbWEpLCB3 aGlsZSBjcm9zcy1zY2hlbWEKKy0tIHJlZmVyZW5jZXMgYXJlIGtlcHQgcXVhbGlmaWVkIGZvciBj b3JyZWN0bmVzcy4KKy0tCistLSBCYXJlIENSRUFURSBUQUJMRSBmb3IgYW4gb3JkaW5hcnkgdGFi bGUuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9x dWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gSU5IRVJJVFMgcGFyZW50IGluIHRoZSBzYW1lIHNj aGVtYSBpcyBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdjaCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIFBhcnRpdGlv biBwYXJlbnQgaW4gdGhlIHNhbWUgc2NoZW1hIGlzIGVtaXR0ZWQgdW5xdWFsaWZpZWQuCitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV8xJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9x dWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gQ3Jvc3Mtc2NoZW1hIEZLIHRhcmdldCBrZWVwcyBx dWFsaWZpY2F0aW9uLiAgVGhlICdyZWZkJyB0YWJsZSBpcyBpbgorLS0gcGd0YmxfZGRsX3Rlc3Q7 IHBsYWNlIGFuIEZLIHRhcmdldCBpbiBhIGRpZmZlcmVudCBzY2hlbWEgYW5kIHZlcmlmeSBpdAor LS0gc3RheXMgcXVhbGlmaWVkIGV2ZW4gd2l0aCBzY2hlbWFfcXVhbGlmaWVkPWZhbHNlLgorQ1JF QVRFIFNDSEVNQSBwZ3RibF9kZGxfb3RoZXI7CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX290aGVy LnBhcmVudCAoaWQgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSB4c2NoZW1hX2ZrICgK KyAgICBpZCAgaW50IFBSSU1BUlkgS0VZLAorICAgIHBpZCBpbnQgUkVGRVJFTkNFUyBwZ3RibF9k ZGxfb3RoZXIucGFyZW50CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd4c2No ZW1hX2ZrJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKworLS0gSWRlbnRpdHkg Y29sdW1uIHdpdGggYSBjdXN0b20gc2VxdWVuY2UgbmFtZSBpbiB0aGUgc2FtZSBzY2hlbWEgaXMK Ky0tIGVtaXR0ZWQgdW5xdWFsaWZpZWQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J2lkX2N1c3RvbSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIFJvdW5k LXRyaXA6IHdpdGggc2NoZW1hX3F1YWxpZmllZD1mYWxzZSwgYWZ0ZXIgU0VUIHNlYXJjaF9wYXRo IHRoZQorLS0gRERMIGNhbiBiZSByZXBsYXllZCBpbnRvIGEgZGlmZmVyZW50IHRhcmdldCBzY2hl bWEuCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9yZXBsYXk7CitETyAkJAorREVDTEFSRQorICAg IHN0bXQgdGV4dDsKK0JFR0lOCisgICAgU0VUIExPQ0FMIHNlYXJjaF9wYXRoID0gcGd0YmxfZGRs X3JlcGxheTsKKyAgICBGT1Igc3RtdCBJTgorICAgICAgICBTRUxFQ1QgbGluZSBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3BndGJsX2RkbF90ZXN0LmJhc2ljJzo6cmVnY2xhc3MsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAn ZmFsc2UnKSBBUyBsaW5lCisgICAgTE9PUAorICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAgRU5E IExPT1A7CitFTkQgJCQ7CitTRUxFQ1QgcmVsbmFtZXNwYWNlOjpyZWduYW1lc3BhY2U6OnRleHQs IHJlbG5hbWUKK0ZST00gcGdfY2xhc3MgV0hFUkUgb2lkID0gJ3BndGJsX2RkbF9yZXBsYXkuYmFz aWMnOjpyZWdjbGFzczsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9yZXBsYXkgQ0FTQ0FERTsKK0RS T1AgVEFCTEUgeHNjaGVtYV9mazsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9vdGhlciBDQVNDQURF OworCistLSBMb2NhbGx5LWRlY2xhcmVkIENIRUNLIG9uIGEgcGFydGl0aW9uIGNoaWxkIGhhcyBu byBpbmxpbmUgY29sdW1uCistLSBsaXN0IHRvIGxpdmUgaW4gKFBBUlRJVElPTiBPRiBmb3JtKSwg c28gaXQgbXVzdCBjb21lIG91dCBhcyBhCistLSBzZXBhcmF0ZSBBTFRFUiBUQUJMRSAuLi4gQURE IENPTlNUUkFJTlQgc3RhdGVtZW50LgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9jaGsgKGlkIGludCwg dmFsIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitDUkVBVEUgVEFCTEUgcGFydGVkX2No a19jaGlsZCBQQVJUSVRJT04gT0YgcGFydGVkX2NoaworICAgIChDT05TVFJBSU5UIGNoa19pbmxp bmUgQ0hFQ0sgKHZhbCA+IDApKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9jaGtfY2hpbGQnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CitEUk9QIFRBQkxFIHBhcnRlZF9jaGs7CisKKy0tIEluaGVy aXRhbmNlIGNoaWxkcmVuIG9mIGEgcGFyZW50IHdpdGggYSBnZW5lcmF0ZWQgY29sdW1uIHNob3Vs ZCBub3QKKy0tIGVtaXQgYW4gQUxURVIgQ09MVU1OIC4uLiBTRVQgREVGQVVMVCBmb3IgdGhlIGlu aGVyaXRlZCBnZW5lcmF0ZWQKKy0tIGNvbHVtbjogdGhlIEdFTkVSQVRFRCBleHByZXNzaW9uIGNh cnJpZXMgZG93biB0aHJvdWdoIGluaGVyaXRhbmNlLAorLS0gYW5kIFNFVCBERUZBVUxUIHdvdWxk IGZhaWwgYXQgcmVwbGF5IGFnYWluc3QgYSBnZW5lcmF0ZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxF IHBhcl9nZW4gKAorICAgIGlkIGludCwKKyAgICBnICBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyAo aWQgKiAyKSBTVE9SRUQKKyk7CitDUkVBVEUgVEFCTEUgY2hfZ2VuICgpIElOSEVSSVRTIChwYXJf Z2VuKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2hfZ2VuJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworRFJPUCBUQUJMRSBwYXJfZ2VuIENBU0NBREU7CisKKy0tIFVz ZXItbmFtZWQgTk9UIE5VTEwgY29uc3RyYWludCBtdXN0IGJlIGVtaXR0ZWQgaW5saW5lIGFzCist LSAiQ09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBzbyBhIHJlcGxheSBkb2VzIG5vdCBjb2xsaWRl IHdpdGggdGhlCistLSBhdXRvLW5hbWVkIE5PVCBOVUxMIHRoYXQgUG9zdGdyZVNRTCB3b3VsZCBv dGhlcndpc2UgY3JlYXRlIGZyb20gYQorLS0gcGxhaW4gaW5saW5lICJOT1QgTlVMTCIuICBUaGUg Y29uc3RyYWludCBsb29wIHNraXBzIHRoZSB1c2VyLW5hbWVkCistLSBlbnRyeSB0byBhdm9pZCBk b3VibGUtZW1pc3Npb24uCitDUkVBVEUgVEFCTEUgbm5fbmFtZWQgKAorICAgIGEgaW50IENPTlNU UkFJTlQgbXlfbm4gTk9UIE5VTEwsCisgICAgYiBpbnQgTk9UIE5VTEwKKyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX25hbWVkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpOworRFJPUCBUQUJMRSBubl9uYW1lZDsKKworLS0gTG9jYWxseS1kZWNsYXJlZCBOT1QgTlVM TCBvbiBhbiBpbmhlcml0ZWQgY29sdW1uLiAgVGhlIGNvbHVtbiBpdHNlbGYKKy0tIGlzIG9taXR0 ZWQgZnJvbSB0aGUgY2hpbGQncyBjb2x1bW4gbGlzdCAoYXR0aXNsb2NhbD1mYWxzZSksIHNvIHRo ZQorLS0gdXNlci1uYW1lZCBOT1QgTlVMTCBtdXN0IGNvbWUgb3V0IHZpYSB0aGUgcG9zdC1DUkVB VEUgY29uc3RyYWludAorLS0gbG9vcCByYXRoZXIgdGhhbiBpbmxpbmUuCitDUkVBVEUgVEFCTEUg bm5fcGFyIChhIGludCk7CitDUkVBVEUgVEFCTEUgbm5fY2ggKGIgaW50KSBJTkhFUklUUyAobm5f cGFyKTsKK0FMVEVSIFRBQkxFIG5uX2NoIEFERCBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxMIGE7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ25uX2NoJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworRFJPUCBUQUJMRSBubl9wYXIgQ0FTQ0FERTsKKworLS0gc2NoZW1hX3F1 YWxpZmllZD1mYWxzZSBtdXN0IGRyb3AgdGhlIHNjaGVtYSBwcmVmaXggZnJvbSBERUZBVUxUCist LSBleHByZXNzaW9ucyBhbmQgaW5saW5lIENIRUNLIGJvZGllcyB0aGF0IHJlZmVyZW5jZSBzYW1l LXNjaGVtYQorLS0gb2JqZWN0cyAoc2VxdWVuY2UgdmlhIG5leHR2YWwsIGZ1bmN0aW9uIHZpYSBk aXJlY3QgY2FsbCkuICBUaGlzCistLSByZWxpZXMgb24gdGhlIGRlcGFyc2VyIHJlc3BlY3Rpbmcg dGhlIG5hcnJvd2VkIHNlYXJjaF9wYXRoIHJhdGhlcgorLS0gdGhhbiBvbiBzdWJzdHJpbmcgc3Ry aXBwaW5nLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfeHJlZjsKK0NSRUFURSBTRVFVRU5DRSBw Z3RibF9kZGxfeHJlZi5teXNlcTsKK0NSRUFURSBGVU5DVElPTiBwZ3RibF9kZGxfeHJlZi5mKGlu dCkgUkVUVVJOUyBpbnQgTEFOR1VBR0Ugc3FsIElNTVVUQUJMRQorICAgIEFTICdTRUxFQ1QgJDEn OworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF94cmVmLnQgKAorICAgIGlkICBpbnQgREVGQVVMVCBu ZXh0dmFsKCdwZ3RibF9kZGxfeHJlZi5teXNlcScpLAorICAgIHZhbCBpbnQsCisgICAgQ09OU1RS QUlOVCBjaGsgQ0hFQ0sgKHBndGJsX2RkbF94cmVmLmYodmFsKSA+IDApCispOworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfeHJlZi50Jzo6cmVnY2xhc3MsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworRFJPUCBT Q0hFTUEgcGd0YmxfZGRsX3hyZWYgQ0FTQ0FERTsKKworLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxz ZSBtdXN0IE5PVCBjb3JydXB0IHN0cmluZyBsaXRlcmFscyB3aG9zZQorLS0gY29udGVudHMgaGFw cGVuIHRvIGNvbnRhaW4gdGhlIHNjaGVtYSBuYW1lIGZvbGxvd2VkIGJ5IGEgZG90LiAgVGhlCist LSBpbi1zdHJpbmcgc3RhdGUgb2YgdGhlIHByZWZpeCBzdHJpcHBlciBwcmVzZXJ2ZXMgdGhlbSB2 ZXJiYXRpbS4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3N0cjsKK0NSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfc3RyLnAgKGlkIGludCwgbm90ZSB0ZXh0KSBQQVJUSVRJT04gQlkgUkFOR0UgKGlkKTsK K0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfc3RyLnBjIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfc3Ry LnAKKyAgICAoQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKG5vdGUgPD4gJ3BndGJsX2RkbF9zdHIuc2Vj cmV0JykpCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgncGd0YmxfZGRsX3N0ci5wYyc6OnJlZ2NsYXNzLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKK0RST1AgU0NIRU1B IHBndGJsX2RkbF9zdHIgQ0FTQ0FERTsKKworLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBtdXN0 IE5PVCBjb3JydXB0IGRvdWJsZS1xdW90ZWQgaWRlbnRpZmllcnMKKy0tIHdob3NlIGNvbnRlbnRz IGhhcHBlbiB0byBjb250YWluIHRoZSBzY2hlbWEgbmFtZSBmb2xsb3dlZCBieSBhIGRvdAorLS0g KGZvciBleGFtcGxlIGEgY29sdW1uIGxpdGVyYWxseSBuYW1lZCAiPHNjaGVtYT4ud2VpcmQiIGlu c2lkZSB0aGF0CistLSBzY2hlbWEpLiAgVGhlIGluLWlkZW50IHN0YXRlIG9mIHRoZSBwcmVmaXgg c3RyaXBwZXIgcHJlc2VydmVzIHRoZW0KKy0tIHZlcmJhdGltLgorQ1JFQVRFIFNDSEVNQSBwZ3Ri bF9kZGxfcWlkOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF9xaWQucCAoaWQgaW50LCAicGd0Ymxf ZGRsX3FpZC53ZWlyZCIgaW50KQorICAgIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF9xaWQucGMgUEFSVElUSU9OIE9GIHBndGJsX2RkbF9xaWQucAorICAg IChDT05TVFJBSU5UIGNoayBDSEVDSyAoInBndGJsX2RkbF9xaWQud2VpcmQiID4gMCkpCisgICAg Rk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgncGd0YmxfZGRsX3FpZC5wYyc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF9x aWQgQ0FTQ0FERTsKKworLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSB3aGVuIHRoZSBiYXNlIHNj aGVtYSBuYW1lIGl0c2VsZiByZXF1aXJlcworLS0gcXVvdGluZyAoaXRzIHByZWZpeCBzdGFydHMg d2l0aCAiKS4gIEJvdGggZm9ybXMgb2YgdGhlIHByZWZpeCAtCistLSBiYXJlLWxvd2VyY2FzZSBh bmQgcXVvdGVkIC0gbXVzdCBiZSBzdHJpcHBlZCBmcm9tIG91dGVyCistLSBBTFRFUiBUQUJMRSAv IE9OIC8gQ1JFQVRFIElOREVYIHByZWZpeGVzLCB3aGlsZSBpbm5lciBxdW90ZWQKKy0tIGlkZW50 aWZpZXJzIHRoYXQgaGFwcGVuIHRvIGJlZ2luIHRoZSBzYW1lIHdheSBtdXN0IGJlIHByZXNlcnZl ZC4KK0NSRUFURSBTQ0hFTUEgIlBnVGJsLURkbC1RIjsKK0NSRUFURSBUQUJMRSAiUGdUYmwtRGRs LVEiLiJUIiAoaWQgaW50LCB2YWwgaW50LAorICAgIENPTlNUUkFJTlQgY2hrIENIRUNLICh2YWwg PiAwKSk7CitDUkVBVEUgSU5ERVggIlRfdmFsX2lkeCIgT04gIlBnVGJsLURkbC1RIi4iVCIgKHZh bCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJyJQZ1RibC1EZGwtUSIuIlQiJzo6 cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdm YWxzZScpOworRFJPUCBTQ0hFTUEgIlBnVGJsLURkbC1RIiBDQVNDQURFOworCistLSBFcnJvcjog bm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlLgorQ1JFQVRFIFZJRVcgdiBBUyBT RUxFQ1QgMSBBUyB4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd2Jzo6cmVnY2xh c3MpOworCitDUkVBVEUgU0VRVUVOQ0UgczsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgncyc6OnJlZ2NsYXNzKTsKKworLS0gTlVMTCBhcmd1bWVudCByZXR1cm5zIG5vIHJvd3MuCitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoTlVMTCk7CisKKy0tIFVucmVjb2duaXplZCBv cHRpb24uCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3Ms ICdib2d1cycsICd0cnVlJyk7CisKKy0tIE9kZCBudW1iZXIgb2YgdmFyaWFkaWMgYXJncy4KK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ3ByZXR0eScp OworCistLSBSb3VuZC10cmlwIHZlcmlmaWNhdGlvbi4gIEZvciBldmVyeSB0ZXN0IHRhYmxlLCBj YXB0dXJlIHRoZSBEREwgdGhlCistLSBmdW5jdGlvbiBlbWl0cywgZHJvcCB0aGUgc2NoZW1hLCBy ZXBsYXkgZWFjaCB0YWJsZSdzIERETCBpbgorLS0gZGVwZW5kZW5jeSBvcmRlciwgYW5kIGNvbmZp cm0gdGhhdCBwZ19nZXRfdGFibGVfZGRsIG9uIHRoZSByZWNyZWF0ZWQKKy0tIHJlbGF0aW9uIG1h dGNoZXMgdGhlIG9yaWdpbmFsIGxpbmUtZm9yLWxpbmUuICBUaGUgZmluYWwgU0VMRUNUIG11c3QK Ky0tIHJldHVybiB6ZXJvIHJvd3MuCitDUkVBVEUgVEVNUCBUQUJMRSBwZ3RibF9kZGxfcnRfb3Jp ZyAobmFtZSB0ZXh0LCBvcmQgaW50LCBsaW5lIHRleHQpOworSU5TRVJUIElOVE8gcGd0YmxfZGRs X3J0X29yaWcKK1NFTEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUKK0ZST00gKFZBTFVFUworICAg ICAgICAoJ2Jhc2ljJyksICgnaWRfY29scycpLCAoJ2lkX2N1c3RvbScpLCAoJ2dlbl9jb2xzJyks ICgnc3RvcmFnZV9jb2xzJyksCisgICAgICAgICgncmVmZCcpLCAoJ2NvbnMnKSwgKCdpZHhkJyks CisgICAgICAgICgncGFyJyksICgnY2gnKSwgKCdhdHRvcHQnKSwKKyAgICAgICAgKCdwYXJ0ZWRf cmFuZ2UnKSwgKCdwYXJ0ZWRfcmFuZ2VfMScpLCAoJ3BhcnRlZF9yYW5nZV9kZWYnKSwKKyAgICAg ICAgKCdwYXJ0ZWRfaGFzaCcpLCAoJ3BhcnRlZF9oYXNoXzAnKSwKKyAgICAgICAgKCdydF9sb2cn KSwgKCdydCcpLAorICAgICAgICAoJ3N0eCcpLCAoJ3JscycpLCAoJ3JpX2Z1bGwnKSwgKCdyaV9p ZHgnKSwgKCd1bm8nKQorICAgICApIEFTIHQobmFtZSksCisgICAgIExBVEVSQUwgcGdfZ2V0X3Rh YmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0LicgfHwgdC5uYW1lKTo6cmVnY2xhc3MsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnKSBXSVRIIE9SRElOQUxJVFkg byhsaW5lLCBvcmQpOworCitETyAkJAorREVDTEFSRQorICAgIHRhYmxlcyBDT05TVEFOVCB0ZXh0 W10gOj0gQVJSQVlbCisgICAgICAgICdiYXNpYycsICdpZF9jb2xzJywgJ2lkX2N1c3RvbScsICdn ZW5fY29scycsICdzdG9yYWdlX2NvbHMnLAorICAgICAgICAncmVmZCcsICdjb25zJywgJ2lkeGQn LAorICAgICAgICAncGFyJywgJ2NoJywgJ2F0dG9wdCcsCisgICAgICAgICdwYXJ0ZWRfcmFuZ2Un LCAncGFydGVkX3JhbmdlXzEnLCAncGFydGVkX3JhbmdlX2RlZicsCisgICAgICAgICdwYXJ0ZWRf aGFzaCcsICdwYXJ0ZWRfaGFzaF8wJywKKyAgICAgICAgJ3J0X2xvZycsICdydCcsCisgICAgICAg ICdzdHgnLCAncmxzJywgJ3JpX2Z1bGwnLCAncmlfaWR4JywgJ3VubycKKyAgICBdOworICAgIHQg dGV4dDsKKyAgICBzdG10IHRleHQ7CitCRUdJTgorICAgIERST1AgU0NIRU1BIHBndGJsX2RkbF90 ZXN0IENBU0NBREU7CisgICAgQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKKyAgICBGT1JF QUNIIHQgSU4gQVJSQVkgdGFibGVzIExPT1AKKyAgICAgICAgRk9SIHN0bXQgSU4KKyAgICAgICAg ICAgIFNFTEVDVCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcgV0hFUkUgbmFtZSA9IHQgT1JE RVIgQlkgb3JkCisgICAgICAgIExPT1AKKyAgICAgICAgICAgIEVYRUNVVEUgc3RtdDsKKyAgICAg ICAgRU5EIExPT1A7CisgICAgRU5EIExPT1A7CitFTkQgJCQ7CisKK1dJVEggYWZ0ZXJfZGRsIEFT ICgKKyAgICBTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5saW5lCisgICAgRlJPTSAoU0VMRUNUIERJ U1RJTkNUIG5hbWUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZykgQVMgdCwKKyAgICAgICAgIExBVEVS QUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0LicgfHwgdC5uYW1lKTo6cmVnY2xh c3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJykg V0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKQorKQorKFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5 JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZworIEVYQ0VQ VAorIFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5JywgbmFtZSwgb3JkLCBsaW5lIEZST00gYWZ0ZXJf ZGRsKQorVU5JT04gQUxMCisoU0VMRUNUICdleHRyYS1pbi1jb3B5JyBBUyBraW5kLCBuYW1lLCBv cmQsIGxpbmUgRlJPTSBhZnRlcl9kZGwKKyBFWENFUFQKKyBTRUxFQ1QgJ2V4dHJhLWluLWNvcHkn LCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZykKK09SREVSIEJZIGtpbmQs IG5hbWUsIG9yZDsKKworLS0gQ2xlYW51cC4KK0RST1AgU0NIRU1BIHBndGJsX2RkbF90ZXN0IENB U0NBREU7Ci0tIAoyLjUxLjAKCg== --000000000000c5fa380654d6f485--