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 1waYCe-001sqc-2i for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jun 2026 12:20:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1waYCd-00FyUC-2W for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jun 2026 12:20:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1waYCc-00FyTv-2v for pgsql-hackers@lists.postgresql.org; Fri, 19 Jun 2026 12:20:07 +0000 Received: from mail-ej1-x62a.google.com ([2a00:1450:4864:20::62a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1waYCU-000000018Ze-3uRT for pgsql-hackers@lists.postgresql.org; Fri, 19 Jun 2026 12:20:00 +0000 Received: by mail-ej1-x62a.google.com with SMTP id a640c23a62f3a-c0115a3794bso399929166b.0 for ; Fri, 19 Jun 2026 05:19:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1781871597; cv=none; d=google.com; s=arc-20240605; b=FZw7uDxSRmLHyktfcTYObttk6zom0HkpzSq6ERkjgSqO9e/OXKQ+d2tsgBmeuy+4yx v37ElRJjGv+RLKmltiuQw6VjPMMPemNMC6U4EcIZXjyCB4494NQlQ3+wyJ6Ndecv7P2D thX5LJhXcjoaXUf8i73z2VRHjX3TjvJ8LPUoQkp1zWy9zd4QjATZy9NTh9SAlspnw3Zc AiNVAqWR74frcdu89dIK1RbxyMxUpZyO3qQbKpS3DnG/XlVrhLeTZ8rDKWANeHQ4/JWW WYCk6cJRW8swt3e3MPSc5lySH3i2yt+6J0xKwKSeHFvZVcoJLVT3nGxtx5Tw2RaQhX9h kz1w== 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=sD3SaWRHiTBXEGfcRI2svM49avpHwgYPdI1x3jJo3Tw=; fh=VOWB3fZ4HdpOtljsi2fHEwbzjzMm1+eVQMuuf+LPLkA=; b=kBN8b7cgRHWEHAw39akVrLT+1i8e54fjd7DJXL4WXALKTf8XH+xBwfdfZqy3rAPZb/ Yn70HHNAQutaQffaBiUinETQ86Nas/JVjmTKZ1n4LczFi3uyUT6ZtI7Ack/EGMNx4sJl oeSXnbXDyRVmVqglHwvNsLx/lKwe7nElMSdgDxi+R49H2k3BXSdNkTI6yDvRnU0Yhf9b Q/iwVvSWMEza+/vEXq5EJW+CguUk9EvbgMriGpSvyl7SIC/Y2cUqos+4cCJwuUQvLR9u LET4bTs2rCDgDvtbKCJR387kwOtb33bDvhXpg/ETjSt8e0Sm2W77Np3lh1K4ACRAQowa VMmA==; 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=1781871597; x=1782476397; 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=sD3SaWRHiTBXEGfcRI2svM49avpHwgYPdI1x3jJo3Tw=; b=ce63QhNuPKsAyoP7xsjbH7symjj/komU3LOmkyywHLnoolOTEsE4A3J1hgR8DGaudv EBq1fjmMQqafSDsNCjBeaRx1FQbgNh2hklz68HEFd2v02dZk5OcCRspM/qXJzT4IA0OT 6WpSgJYsRZVir1wp7dDQ8+UlVSbB8boeLewbdpZnVpYQq4B8iezdd2J6TvwA8UkKNGvp hS84CpgXHdCuZ9frcmQjP8cTIp8nizuNa+S7bh+Mk0EImafKkpT2wm584QFYLdQlPIB6 CwDbPSzagXH3fGc17PqDdX4m7zNpnK2sHTbvKrBe9w1lv0qx/ivmaA2865uFufWE8DSR mqlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781871597; x=1782476397; 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=sD3SaWRHiTBXEGfcRI2svM49avpHwgYPdI1x3jJo3Tw=; b=F27PEjdfspGKuPseoGjMBoktiijFL+o8ov9zlPiaODn645VJEPyYrU12sI+hsjGPh6 WzbmywxI3bChlH2eqHhM+01kTDs3aIo5nQWuczvpp1trJujkw1SaA5Y88mW/5XDGp2fd 2qu3NTs5E6RJ4foZsNHoedfSA1IV8cSFfQdKQAzX/Cs6RLXdznshg6Lg1ldsJRxLSrFB h0ZKKlLGsIu8NvZEyXsDfYJ2viKpoMjI4ojv2Pk1YKGtQPgr2dQlSjGIx6OD1v/fWwTv blDnecERQewLYC0eVYpcJMeLbGvL+FYiQ+p6+gW0a4ZiVo47bJEq4riGylTx8DV93KZy 4aAw== X-Forwarded-Encrypted: i=1; AFNElJ9WebU5z+bIsXOIk9cYr27AR/lCRcO3EICDdIuV+tHMBsMYIfwFV6XWoTFjxpL8kHzgzEJnSWROPO0fkuwP@lists.postgresql.org X-Gm-Message-State: AOJu0YxexyfHAk+20Lgx3SZ+hnXlwWa1ttBEm2PrhQdSlk98Co527QjG RjLChZw8GJmfbw2rEn18iHSSPpD0Df70vuBVzrrfc9lD1XRgSp1piH2ZECSRxJTdGhVFlpBVjSx pCBPjO4RWnlty8b45WfKc2AifPmYMlksBFAmwen40 X-Gm-Gg: AfdE7ck/pSPbNolZCVqRCcAuU44dbgh9kR+q+s1maCSjFryhwgNmb4V1yi5DeuUfRVK Gi/E1m3X+VNUBQZB/2pbtbCxf6O91hdB9pOX/Hcb4Jzn9ZtlgqC1f4Ak+pz8Q2PzBx7knxgJhCn NDUfh6hgWRL9afDOYwiIZ+L0djseKh+ZyYWHcLZ9A2OASgzOiR6+4KaoCn3S6mDdDWpyPAi11zm 4naOw0al0VQisblZ5Qaqa37rSa2ZhWVhdlAYcuhxWjGFxiIPGF6bk8n9zFf0J5fftYuP4faanI= X-Received: by 2002:a17:906:7956:b0:bf1:ac1d:94b0 with SMTP id a640c23a62f3a-c097c9c3054mr172885666b.35.1781871596664; Fri, 19 Jun 2026 05:19:56 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Akshay Joshi Date: Fri, 19 Jun 2026 17:49:44 +0530 X-Gm-Features: AVVi8CcpzesROp95TOqXljQ-T1iElPy8a0vZWKEm2sgje1_cdudwliivW7pdK9A Message-ID: Subject: Re: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: Marcos Pegoraro Cc: Zsolt Parragi , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000008e54e606549a4f27" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008e54e606549a4f27 Content-Type: multipart/alternative; boundary="0000000000008e54e406549a4f25" --0000000000008e54e406549a4f25 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Jun 16, 2026 at 2:35=E2=80=AFAM Marcos Pegoraro = wrote: > Em seg., 15 de jun. de 2026 =C3=A0s 04:52, Akshay Joshi < > akshay.joshi@enterprisedb.com> escreveu: > >> I don't think per-contype flags are the right shape, though. The existin= g >> toggles group by catalog (indexes, constraints, rules, ...); splitting >> constraints into PK/FK/CHECK/UNIQUE/EXCLUDE/NOT NULL adds six flags on a >> second axis, and the function already carries nine. Only FKs have the >> cross-table dependency-ordering problem; the rest only reference the sam= e >> table, so splitting them unlocks nothing new. >> > > Ok, I understand your point. Initially, I saw the usefulness of this > function for cloning a schema, something very common in a multi-tenant > model. But creating the foreign keys along with the create table makes th= at > unfeasible. > > Options are variadic, so you could split your emit_local_constraints into > +emit_local_foreign_keys_constraints(TableDdlContext * ctx) > + if (!(ctx->include_constraints || ctx->include_foreign_keys)) then > + return > > +emit_local_primary_keys_constraints(TableDdlContext * ctx) > + if (!(ctx->include_constraints || ctx->include_primary_keys)) then > + return > > pg_get_table_ddl('x','includes_constraints','true') -- would print all > constraints > pg_get_table_ddl('x','include_primary_keys','true') -- would print only > primary key constraints > The schema cloning use case is valid. The v7 patch (attached) adds a single new option, `includes_foreign_keys` (boolean, default true), which acts as an additive gate underneath `includes_constraints`. 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 held off on the broader split into per-contype options (includes_primary_keys, includes_unique, etc.) for two reasons. First, only FOREIGN KEY actually breaks schema cloning. PRIMARY KEY, UNIQUE, CHECK, EXCLUDE, and named NOT NULL constraints are all table local and don't reference anything else, so no workflow currently needs to suppress them independently. Second, the function already exposes thirteen boolean options; adding five more granular ones without a concrete use case expands the surface area unnecessarily. The v7 patch is ready for review. > > regards > Marcos > --0000000000008e54e406549a4f25 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


On Tue, Jun 16,= 2026 at 2:35=E2=80=AFAM Marcos Pegoraro <marcos@f10.com.br> wrote:
=
<= span style=3D"font-family:Arial,Helvetica,sans-serif;color:rgb(34,34,34)">E= m seg., 15 de jun. de 2026 =C3=A0s 04:52, Akshay Joshi <akshay.joshi@enterprised= b.com> escreveu:
=
I don't think per-contype flags are= the right shape, though. The existing toggles group by catalog (indexes, c= onstraints, rules, ...); splitting constraints into PK/FK/CHECK/UNIQUE/EXCL= UDE/NOT NULL adds six flags on a second axis, and the function already carr= ies nine. Only FKs have the cross-table dependency-ordering problem; the re= st only reference the same table, so splitting them unlocks nothing new.

Ok, I understand your point. Initially= , I saw the usefulness of this function for cloning a schema, something ver= y common in a multi-tenant model. But creating the foreign keys along with = the create table makes that unfeasible.

Options are variadic, so you cou= ld split your=C2=A0emit_local_constraints into=C2=A0
+emit_local_foreign_key= s_constraints(TableDdlContext * ctx)=C2=A0
+ if (!(ctx->include_cons= traints || ctx->include_foreign_keys)) then
+=C2=A0 =C2=A0retu= rn

+emit_local_primary_keys_constraints(TableD= dlContext * ctx)=C2=A0
+ if (!(ctx->include_constra= ints || ctx->include_primary_keys)) then
+=C2=A0 =C2=A0return<= br>

pg_get_table_ddl('x','includes_constraints',&#= 39;true') -- would print all constraints
pg_get_table_ddl('x',&#= 39;include_primary_keys','true') -- would print only primary ke= y constraints

The s= chema cloning use case is valid. The v7 patch (attached) adds a single new = option, `includes_foreign_keys` (boolean, default true), which acts as an a= dditive gate underneath `includes_constraints`. Calling pg_get_table_ddl(t,= 'includes_foreign_keys', 'false') now emits everything exc= ept FOREIGN KEY constraints. This covers the multi-tenant clone workflow: c= reate tables first without cross-table references, then re-run with the def= ault to add the constraints once all targets exist.
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0=C2=A0
I held off on the broader split into per-contype options (inclu= des_primary_keys, includes_unique, etc.) for two reasons. First, only FOREI= GN KEY actually breaks schema cloning. PRIMARY KEY, UNIQUE, CHECK, EXCLUDE,= and named NOT NULL constraints are all table local and don't reference= anything else, so no workflow currently needs to suppress them independent= ly. Second, the function already exposes thirteen boolean options; adding f= ive more granular ones without a concrete use case expands the surface area= unnecessarily.=C2=A0

The v7 patch is ready for review.
=

regards
Marcos
--0000000000008e54e406549a4f25-- --0000000000008e54e606549a4f27 Content-Type: application/octet-stream; name="v7-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v7-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqkwbn1l0 RnJvbSA3NzcwZTM1ZGE5YmYzODgzYjcyZmYwZjdiYzYwNDQzMDg0Yjc2NGZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHY3XSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM 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 S3lvdGFybyBIb3JpZ3VjaGkgPGhvcmlreW90YS5udHRAZ21haWwuY29tPgotLS0KIGRvYy9zcmMv c2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAgICAgICAgICB8ICAgODkgKwogc3JjL2JhY2tl bmQvY2F0YWxvZy9wZ19pbmhlcml0cy5jICAgICAgICAgICAgIHwgICA5MyArCiBzcmMvYmFja2Vu ZC9jb21tYW5kcy90YWJsZWNtZHMuYyAgICAgICAgICAgICAgfCAgIDMwICstCiBzcmMvYmFja2Vu ZC91dGlscy9hZHQvZGRsdXRpbHMuYyAgICAgICAgICAgICAgfCAxNzM2ICsrKysrKysrKysrKysr KysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2luaGVyaXRzLmggICAgICAgICAgICAgfCAgICAx ICsKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgICB8ICAgIDcg Kwogc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmggICAgICAgICAgICAgIHwgICAgMyAr CiAuLi4vcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dCAgICAgfCAgNzU0ICsr KysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgICAgICAgICAgICB8ICAg IDIgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BnX2dldF90YWJsZV9kZGwuc3FsICAgICB8ICA0 NDcgKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDMxNTkgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlv bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dl dF90YWJsZV9kZGwub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9zcWwv cGdfZ2V0X3RhYmxlX2RkbC5zcWwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5j LWluZm8uc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCmluZGV4IDhmZmE3 ZTgzMjc1Li4xOGFmYWFmYjJiZCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1p bmZvLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKQEAgLTM5NDcs NiArMzk0Nyw5NSBAQCBhY2wgICAgICB8IHtwb3N0Z3Jlcz1hcndkRHh0bS9wb3N0Z3Jlcyxmb289 ci9wb3N0Z3Jlc30KICAgICAgICAgPGxpdGVyYWw+VEFCTEVTUEFDRTwvbGl0ZXJhbD4uCiAgICAg ICAgPC9wYXJhPjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisgICAgICAgPGVu dHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4K KyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PnBnX2dldF90YWJsZV9kZGw8 L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfZ2V0 X3RhYmxlX2RkbDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1l dGVyPiA8dHlwZT5yZWdjbGFzczwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwgPGxpdGVyYWw+ VkFSSUFESUM8L2xpdGVyYWw+IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1ldGVyPgorICAgICAg ICA8dHlwZT50ZXh0PC90eXBlPiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT5z ZXRvZiB0ZXh0PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+Cisg ICAgICAgIFJlY29uc3RydWN0cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxFPC9jb21tYW5kPiBz dGF0ZW1lbnQgZm9yIHRoZQorICAgICAgICBzcGVjaWZpZWQgb3JkaW5hcnkgb3IgcGFydGl0aW9u ZWQgdGFibGUsIGZvbGxvd2VkIGJ5IHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRTwv Y29tbWFuZD4sIDxjb21tYW5kPkNSRUFURSBJTkRFWDwvY29tbWFuZD4sCisgICAgICAgIDxjb21t YW5kPkNSRUFURSBSVUxFPC9jb21tYW5kPiwgYW5kIDxjb21tYW5kPkNSRUFURSBTVEFUSVNUSUNT PC9jb21tYW5kPgorICAgICAgICBzdGF0ZW1lbnRzIG5lZWRlZCB0byByZWNyZWF0ZSB0aGUgdGFi bGUncyBjb2x1bW5zLCBjb25zdHJhaW50cywKKyAgICAgICAgaW5kZXhlcywgcnVsZXMsIGV4dGVu ZGVkIHN0YXRpc3RpY3MsIGFuZCByb3ctbGV2ZWwgc2VjdXJpdHkgZmxhZ3MuCisgICAgICAgIElu aGVyaXRlZCBjb2x1bW5zIGFuZCBjb25zdHJhaW50cyBhcmUgZW1pdHRlZCBieSB0aGUgcGFyZW50 IHRhYmxlJ3MKKyAgICAgICAgRERMIGFuZCBhcmUgbm90IGR1cGxpY2F0ZWQgb24gaW5oZXJpdGFu Y2UgY2hpbGRyZW4gb3IgcGFydGl0aW9ucy4KKyAgICAgICAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0 dXJuZWQgYXMgYSBzZXBhcmF0ZSByb3cuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBh cmUgc3VwcG9ydGVkOgorICAgICAgICA8bGl0ZXJhbD5wcmV0dHk8L2xpdGVyYWw+IChib29sZWFu KSBmb3IgZm9ybWF0dGVkIG91dHB1dCwKKyAgICAgICAgPGxpdGVyYWw+b3duZXI8L2xpdGVyYWw+ IChib29sZWFuKSB0byBpbmNsdWRlIHRoZQorICAgICAgICA8Y29tbWFuZD5BTFRFUiBUQUJMRSAu Li4gT1dORVIgVE88L2NvbW1hbmQ+IHN0YXRlbWVudCwKKyAgICAgICAgPGxpdGVyYWw+dGFibGVz cGFjZTwvbGl0ZXJhbD4gKGJvb2xlYW4pIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIDxsaXRlcmFs PlRBQkxFU1BBQ0U8L2xpdGVyYWw+IGNsYXVzZSBvbiB0aGUKKyAgICAgICAgPGNvbW1hbmQ+Q1JF QVRFIFRBQkxFPC9jb21tYW5kPiBzdGF0ZW1lbnQsIGFuZCBhIGZhbWlseSBvZgorICAgICAgICA8 bGl0ZXJhbD5pbmNsdWRlc188cmVwbGFjZWFibGU+Y2F0ZWdvcnk8L3JlcGxhY2VhYmxlPjwvbGl0 ZXJhbD4KKyAgICAgICAgYm9vbGVhbnMgdGhhdCBnYXRlIGVtaXNzaW9uIG9mIG9wdGlvbmFsIHN1 Yi1vYmplY3RzOgorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19pbmRleGVzPC9saXRlcmFsPiwK KyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfY29uc3RyYWludHM8L2xpdGVyYWw+LAorICAgICAg ICA8bGl0ZXJhbD5pbmNsdWRlc19mb3JlaWduX2tleXM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0 ZXJhbD5pbmNsdWRlc19ydWxlczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVz X3N0YXRpc3RpY3M8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc190cmlnZ2Vy czwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3BvbGljaWVzPC9saXRlcmFs PiwKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfcmxzPC9saXRlcmFsPiAodGhlCisgICAgICAg IDxjb21tYW5kPkVOQUJMRTwvY29tbWFuZD4vPGNvbW1hbmQ+Rk9SQ0UgUk9XIExFVkVMIFNFQ1VS SVRZPC9jb21tYW5kPgorICAgICAgICB0b2dnbGVzKSwgYW5kCisgICAgICAgIDxsaXRlcmFsPmlu Y2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk8L2xpdGVyYWw+LiAgRWFjaCBvZiB0aGVzZQorICAgICAg ICBkZWZhdWx0cyB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPi4KKyAgICAgICAgPGxpdGVyYWw+ aW5jbHVkZXNfZm9yZWlnbl9rZXlzPC9saXRlcmFsPiBhY3RzIGFzIGEgZmluZXItZ3JhaW5lZAor ICAgICAgICBnYXRlIGJlbmVhdGggPGxpdGVyYWw+aW5jbHVkZXNfY29uc3RyYWludHM8L2xpdGVy YWw+OiB3aGVuIHNldAorICAgICAgICB0byA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIDxsaXRl cmFsPkZPUkVJR04gS0VZPC9saXRlcmFsPgorICAgICAgICBjb25zdHJhaW50cyBhcmUgc3VwcHJl c3NlZCB3aGlsZSBvdGhlciBjb25zdHJhaW50IHR5cGVzCisgICAgICAgICg8bGl0ZXJhbD5QUklN QVJZIEtFWTwvbGl0ZXJhbD4sIDxsaXRlcmFsPlVOSVFVRTwvbGl0ZXJhbD4sCisgICAgICAgIDxs aXRlcmFsPkNIRUNLPC9saXRlcmFsPiwgPGxpdGVyYWw+RVhDTFVERTwvbGl0ZXJhbD4sIGFuZCBu YW1lZAorICAgICAgICA8bGl0ZXJhbD5OT1QgTlVMTDwvbGl0ZXJhbD4pIGFyZSBzdGlsbCBlbWl0 dGVkOyB0aGlzIGlzIGludGVuZGVkCisgICAgICAgIGZvciBzY2hlbWEtY2xvbmluZyB3b3JrZmxv d3MgdGhhdCBuZWVkIHRvIGNyZWF0ZSBhbGwgdGFibGVzCisgICAgICAgIGJlZm9yZSBhbnkgY3Jv c3MtdGFibGUgcmVmZXJlbmNlcyBleGlzdC4gIFRoZQorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRl c19wYXJ0aXRpb248L2xpdGVyYWw+IG9wdGlvbiwgd2hpY2ggZGVmYXVsdHMgdG8KKyAgICAgICAg PGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCBjb250cm9scyB3aGV0aGVyIHRoZSBEREwgZm9yIHBh cnRpdGlvbgorICAgICAgICBjaGlsZHJlbiBpcyBhcHBlbmRlZCBhZnRlciBhIHBhcnRpdGlvbmVk LXRhYmxlIHBhcmVudC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRo ZSA8bGl0ZXJhbD5zY2hlbWFfcXVhbGlmaWVkPC9saXRlcmFsPiBvcHRpb24gKGJvb2xlYW4sIGRl ZmF1bHQKKyAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4pIGNvbnRyb2xzIHdoZXRoZXIg dGhlIHRhcmdldCB0YWJsZSdzIG93bgorICAgICAgICBzY2hlbWEgaXMgaW5jbHVkZWQgaW4gdGhl IGdlbmVyYXRlZCBEREwuICBXaGVuIHNldCB0bworICAgICAgICA8bGl0ZXJhbD5mYWxzZTwvbGl0 ZXJhbD4sIHRoZSB0YWJsZSBuYW1lIGlzIGVtaXR0ZWQgdW5xdWFsaWZpZWQKKyAgICAgICAgaW4g dGhlIDxjb21tYW5kPkNSRUFURSBUQUJMRTwvY29tbWFuZD4gYW5kIGV2ZXJ5IHN1YnNlcXVlbnQK KyAgICAgICAgPGNvbW1hbmQ+QUxURVIgVEFCTEU8L2NvbW1hbmQ+LCA8Y29tbWFuZD5DUkVBVEUg SU5ERVg8L2NvbW1hbmQ+LAorICAgICAgICA8Y29tbWFuZD5DUkVBVEUgUlVMRTwvY29tbWFuZD4s IGFuZAorICAgICAgICA8Y29tbWFuZD5DUkVBVEUgU1RBVElTVElDUzwvY29tbWFuZD4gc3RhdGVt ZW50LiAgUmVmZXJlbmNlcyB0bworICAgICAgICBvYmplY3RzIGluIHRoZSBzYW1lIHNjaGVtYSBh cyB0aGUgdGFyZ2V0IHRhYmxlIChpbmhlcml0YW5jZQorICAgICAgICBwYXJlbnRzLCBwYXJ0aXRp b24gcGFyZW50cywgaWRlbnRpdHkgc2VxdWVuY2VzLCBhbmQgYW55CisgICAgICAgIHNhbWUtc2No ZW1hIG9iamVjdCB0aGUgZGVwYXJzZSBoZWxwZXJzIGhhcHBlbiB0byBtZW50aW9uKSBhcmUKKyAg ICAgICAgYWxzbyBlbWl0dGVkIHVucXVhbGlmaWVkLCBzbyB0aGUgc2NyaXB0IGNhbiBiZSByZXBs YXllZCB1bmRlciBhCisgICAgICAgIGRpZmZlcmVudCA8dmFybmFtZT5zZWFyY2hfcGF0aDwvdmFy bmFtZT4gdG8gcmVjcmVhdGUgdGhlIHRhYmxlCisgICAgICAgIGluIGFub3RoZXIgc2NoZW1hLiAg Q3Jvc3Mtc2NoZW1hIHJlZmVyZW5jZXMgKGZvciBleGFtcGxlIGEKKyAgICAgICAgZm9yZWlnbiBr ZXkgdGFyZ2V0IGluIGEgZGlmZmVyZW50IHNjaGVtYSkgcmVtYWluIHF1YWxpZmllZCBmb3IKKyAg ICAgICAgY29ycmVjdG5lc3MuCisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAg ICBBbGwgdGhyZWUgZm9ybXMgb2YgPGNvbW1hbmQ+Q1JFQVRFIFRBQkxFPC9jb21tYW5kPiBhcmUg c3VwcG9ydGVkOgorICAgICAgICB0aGUgb3JkaW5hcnkgY29sdW1uLWxpc3QgZm9ybSwgdGhlIHR5 cGVkLXRhYmxlIGZvcm0KKyAgICAgICAgKDxsaXRlcmFsPk9GIDxyZXBsYWNlYWJsZT50eXBlX25h bWU8L3JlcGxhY2VhYmxlPjwvbGl0ZXJhbD4sIHdpdGgKKyAgICAgICAgcGVyLWNvbHVtbiA8bGl0 ZXJhbD5XSVRIIE9QVElPTlM8L2xpdGVyYWw+IG92ZXJyaWRlcyBmb3IgbG9jYWwKKyAgICAgICAg ZGVmYXVsdHMsIDxsaXRlcmFsPk5PVCBOVUxMPC9saXRlcmFsPiwgYW5kIDxsaXRlcmFsPkNIRUNL PC9saXRlcmFsPgorICAgICAgICBjb25zdHJhaW50cyksIGFuZCB0aGUgPGxpdGVyYWw+UEFSVElU SU9OIE9GPC9saXRlcmFsPiBmb3JtLgorICAgICAgICA8bGl0ZXJhbD5URU1QT1JBUlk8L2xpdGVy YWw+IGFuZCA8bGl0ZXJhbD5VTkxPR0dFRDwvbGl0ZXJhbD4KKyAgICAgICAgcGVyc2lzdGVuY2Ug bW9kZXMgYXJlIGVtaXR0ZWQgZnJvbQorICAgICAgICA8c3RydWN0ZmllbGQ+cmVscGVyc2lzdGVu Y2U8L3N0cnVjdGZpZWxkPi4gIEZvciB0ZW1wb3JhcnkgdGFibGVzCisgICAgICAgIHJlZ2lzdGVy ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbiwgdGhlCisgICAgICAgIDxsaXRlcmFsPk9OIENPTU1J VCBERUxFVEUgUk9XUzwvbGl0ZXJhbD4gYW5kCisgICAgICAgIDxsaXRlcmFsPk9OIENPTU1JVCBE Uk9QPC9saXRlcmFsPiBjbGF1c2VzIGFyZSBlbWl0dGVkOyB0aGUgZGVmYXVsdAorICAgICAgICA8 bGl0ZXJhbD5PTiBDT01NSVQgUFJFU0VSVkUgUk9XUzwvbGl0ZXJhbD4gaXMgb21pdHRlZC4KKyAg ICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5PgogICAgIDwv dGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdf aW5oZXJpdHMuYyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdfaW5oZXJpdHMuYwppbmRleCA0Yjk4 MDJhYWZjYy4uODk3MTUxYmQ2ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdf aW5oZXJpdHMuYworKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3BnX2luaGVyaXRzLmMKQEAgLTIz Niw2ICsyMzYsOTkgQEAgZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbl9leHRlbmRlZChPaWQgcGFy ZW50cmVsSWQsIGJvb2wgb21pdF9kZXRhY2hlZCwKIH0KIAogCisvKgorICogZmluZF9pbmhlcml0 YW5jZV9wYXJlbnRzCisgKgorICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgT0lEcyBv ZiBhbGwgcmVsYXRpb25zIHRoYXQgdGhlIHJlbGF0aW9uIHdpdGgKKyAqIE9JRCAncmVsaWQnIGlu aGVyaXRzICpkaXJlY3RseSogZnJvbSwgaW4gaW5oc2Vxbm8gb3JkZXIgKHRoZSBvcmRlciBpbiB3 aGljaAorICogdGhleSBzaG91bGQgYXBwZWFyIGluIGFuIElOSEVSSVRTIGNsYXVzZSkuCisgKgor ICogVGhlIHNwZWNpZmllZCBsb2NrIHR5cGUgaXMgYWNxdWlyZWQgb24gZWFjaCBwYXJlbnQgcmVs YXRpb24gKGJ1dCBub3Qgb24gdGhlCisgKiBnaXZlbiByZWw7IGNhbGxlciBzaG91bGQgYWxyZWFk eSBoYXZlIGxvY2tlZCBpdCkuICBJZiBsb2NrbW9kZSBpcyBOb0xvY2sKKyAqIHRoZW4gbm8gbG9j a3MgYXJlIGFjcXVpcmVkLCBidXQgY2FsbGVyIG11c3QgYmV3YXJlIG9mIHJhY2UgY29uZGl0aW9u cworICogYWdhaW5zdCBwb3NzaWJsZSBEUk9QcyBvZiBwYXJlbnQgcmVsYXRpb25zLgorICoKKyAq IFBhcnRpdGlvbiBjaGlsZHJlbiBhbHNvIGhhdmUgYSBwZ19pbmhlcml0cyBlbnRyeSBwb2ludGlu ZyB0byB0aGUKKyAqIHBhcnRpdGlvbmVkIHBhcmVudDsgY2FsbGVycyB0aGF0IGRpc3Rpbmd1aXNo IElOSEVSSVRTIGZyb20gUEFSVElUSU9OIE9GCisgKiBtdXN0IGNoZWNrIHJlbGlzcGFydGl0aW9u IHRoZW1zZWx2ZXMuCisgKi8KK0xpc3QgKgorZmluZF9pbmhlcml0YW5jZV9wYXJlbnRzKE9pZCBy ZWxpZCwgTE9DS01PREUgbG9ja21vZGUpCit7CisJTGlzdAkgICAqbGlzdCA9IE5JTDsKKwlSZWxh dGlvbglyZWxhdGlvbjsKKwlTeXNTY2FuRGVzYyBzY2FuOworCVNjYW5LZXlEYXRhIGtleVsxXTsK KwlIZWFwVHVwbGUJaW5oZXJpdHNUdXBsZTsKKwlPaWQJCQlpbmhwYXJlbnQ7CisJT2lkCQkgICAq b2lkYXJyOworCWludAkJCW1heG9pZHMsCisJCQkJbnVtb2lkcywKKwkJCQlpOworCisJLyoKKwkg KiBTY2FuIHBnX2luaGVyaXRzIHZpYSB0aGUgKGluaHJlbGlkLCBpbmhzZXFubykgaW5kZXggc28g dGhhdCB0aGUgcm93cworCSAqIGNvbWUgb3V0IGluIGluaHNlcW5vIG9yZGVyLCB3aGljaCBpcyB0 aGUgb3JkZXIgcmVxdWlyZWQgZm9yIHRoZQorCSAqIElOSEVSSVRTIGNsYXVzZS4KKwkgKi8KKwlt YXhvaWRzID0gODsKKwlvaWRhcnIgPSAoT2lkICopIHBhbGxvYyhtYXhvaWRzICogc2l6ZW9mKE9p ZCkpOworCW51bW9pZHMgPSAwOworCisJcmVsYXRpb24gPSB0YWJsZV9vcGVuKEluaGVyaXRzUmVs YXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCVNjYW5LZXlJbml0KCZrZXlbMF0sCisJCQkJ QW51bV9wZ19pbmhlcml0c19pbmhyZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZf T0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCisJc2NhbiA9IHN5c3RhYmxl X2JlZ2luc2NhbihyZWxhdGlvbiwgSW5oZXJpdHNSZWxpZFNlcW5vSW5kZXhJZCwgdHJ1ZSwKKwkJ CQkJCQkgIE5VTEwsIDEsIGtleSk7CisKKwl3aGlsZSAoKGluaGVyaXRzVHVwbGUgPSBzeXN0YWJs ZV9nZXRuZXh0KHNjYW4pKSAhPSBOVUxMKQorCXsKKwkJaW5ocGFyZW50ID0gKChGb3JtX3BnX2lu aGVyaXRzKSBHRVRTVFJVQ1QoaW5oZXJpdHNUdXBsZSkpLT5pbmhwYXJlbnQ7CisJCWlmIChudW1v aWRzID49IG1heG9pZHMpCisJCXsKKwkJCW1heG9pZHMgKj0gMjsKKwkJCW9pZGFyciA9IChPaWQg KikgcmVwYWxsb2Mob2lkYXJyLCBtYXhvaWRzICogc2l6ZW9mKE9pZCkpOworCQl9CisJCW9pZGFy cltudW1vaWRzKytdID0gaW5ocGFyZW50OworCX0KKworCXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7 CisKKwl0YWJsZV9jbG9zZShyZWxhdGlvbiwgQWNjZXNzU2hhcmVMb2NrKTsKKworCS8qCisJICog QWNxdWlyZSBsb2NrcyBhbmQgYnVpbGQgdGhlIHJlc3VsdCBsaXN0LiAgVW5saWtlCisJICogZmlu ZF9pbmhlcml0YW5jZV9jaGlsZHJlbiB3ZSBkbyAqbm90KiBzb3J0IGJ5IE9JRDogY2FsbGVycyBu ZWVkIHRoZQorCSAqIHNlcW5vLW9yZGVyZWQgdHJhdmVyc2FsLgorCSAqLworCWZvciAoaSA9IDA7 IGkgPCBudW1vaWRzOyBpKyspCisJeworCQlpbmhwYXJlbnQgPSBvaWRhcnJbaV07CisKKwkJaWYg KGxvY2ttb2RlICE9IE5vTG9jaykKKwkJeworCQkJTG9ja1JlbGF0aW9uT2lkKGluaHBhcmVudCwg bG9ja21vZGUpOworCisJCQlpZiAoIVNlYXJjaFN5c0NhY2hlRXhpc3RzMShSRUxPSUQsIE9iamVj dElkR2V0RGF0dW0oaW5ocGFyZW50KSkpCisJCQl7CisJCQkJVW5sb2NrUmVsYXRpb25PaWQoaW5o cGFyZW50LCBsb2NrbW9kZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlsaXN0ID0g bGFwcGVuZF9vaWQobGlzdCwgaW5ocGFyZW50KTsKKwl9CisKKwlwZnJlZShvaWRhcnIpOworCisJ cmV0dXJuIGxpc3Q7Cit9CisKKwogLyoKICAqIGZpbmRfYWxsX2luaGVyaXRvcnMgLQogICoJCVJl dHVybnMgYSBsaXN0IG9mIHJlbGF0aW9uIE9JRHMgaW5jbHVkaW5nIHRoZSBnaXZlbiByZWwgcGx1 cwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFj a2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwppbmRleCAyNjVkY2ZlN2ZkYS4uYTVmNDY1MjJjMzMg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCisrKyBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCkBAIC03MzksNyArNzM5LDYgQEAgc3RhdGljIE9i amVjdEFkZHJlc3MgQVRFeGVjU2V0Q29tcHJlc3Npb24oUmVsYXRpb24gcmVsLAogCQkJCQkJCQkJ CSAgY29uc3QgY2hhciAqY29sdW1uLCBOb2RlICpuZXdWYWx1ZSwgTE9DS01PREUgbG9ja21vZGUp OwogCiBzdGF0aWMgdm9pZCBpbmRleF9jb3B5X2RhdGEoUmVsYXRpb24gcmVsLCBSZWxGaWxlTG9j YXRvciBuZXdybG9jYXRvcik7Ci1zdGF0aWMgY29uc3QgY2hhciAqc3RvcmFnZV9uYW1lKGNoYXIg Yyk7CiAKIHN0YXRpYyB2b2lkIFJhbmdlVmFyQ2FsbGJhY2tGb3JEcm9wUmVsYXRpb24oY29uc3Qg UmFuZ2VWYXIgKnJlbCwgT2lkIHJlbE9pZCwKIAkJCQkJCQkJCQkJT2lkIG9sZFJlbE9pZCwgdm9p ZCAqYXJnKTsKQEAgLTI1MTUsNyArMjUxNCw3IEBAIHRydW5jYXRlX2NoZWNrX2FjdGl2aXR5KFJl bGF0aW9uIHJlbCkKICAqIHN0b3JhZ2VfbmFtZQogICoJICByZXR1cm5zIHRoZSBuYW1lIGNvcnJl c3BvbmRpbmcgdG8gYSB0eXBzdG9yYWdlL2F0dHN0b3JhZ2UgZW51bSB2YWx1ZQogICovCi1zdGF0 aWMgY29uc3QgY2hhciAqCitjb25zdCBjaGFyICoKIHN0b3JhZ2VfbmFtZShjaGFyIGMpCiB7CiAJ c3dpdGNoIChjKQpAQCAtMTk1NTgsNiArMTk1NTcsMzMgQEAgcmVtb3ZlX29uX2NvbW1pdF9hY3Rp b24oT2lkIHJlbGlkKQogCX0KIH0KIAorLyoKKyAqIExvb2sgdXAgdGhlIHJlZ2lzdGVyZWQgT04g Q09NTUlUIGFjdGlvbiBmb3IgYSByZWxhdGlvbi4KKyAqCisgKiBSZXR1cm5zIE9OQ09NTUlUX05P T1Agd2hlbiBub3RoaW5nIHdhcyByZWdpc3RlcmVkLCB3aGljaCBhbHNvIGNvdmVycworICogdGVt cG9yYXJ5IHRhYmxlcyBjcmVhdGVkIHdpdGggdGhlIGRlZmF1bHQgT04gQ09NTUlUIFBSRVNFUlZF IFJPV1MKKyAqIGJlaGF2aW9yIChyZWdpc3Rlcl9vbl9jb21taXRfYWN0aW9uKCkgc2tpcHMgdGhv c2UsIHNpbmNlIG5vIGFjdGlvbiBpcworICogbmVlZGVkIGF0IGNvbW1pdCkuICBFbnRyaWVzIG1h cmtlZCBmb3IgZGVsZXRpb24gaW4gdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uIGFyZSBpZ25v cmVkLgorICovCitPbkNvbW1pdEFjdGlvbgorZ2V0X29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlk KQoreworCUxpc3RDZWxsICAgKmw7CisKKwlmb3JlYWNoKGwsIG9uX2NvbW1pdHMpCisJeworCQlP bkNvbW1pdEl0ZW0gKm9jID0gKE9uQ29tbWl0SXRlbSAqKSBsZmlyc3QobCk7CisKKwkJaWYgKG9j LT5yZWxpZCAhPSByZWxpZCkKKwkJCWNvbnRpbnVlOworCQlpZiAob2MtPmRlbGV0aW5nX3N1Ymlk ICE9IEludmFsaWRTdWJUcmFuc2FjdGlvbklkKQorCQkJY29udGludWU7CisJCXJldHVybiBvYy0+ b25jb21taXQ7CisJfQorCXJldHVybiBPTkNPTU1JVF9OT09QOworfQorCiAvKgogICogUGVyZm9y bSBPTiBDT01NSVQgYWN0aW9ucy4KICAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvZGRsdXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCmluZGV4IGYz MmZjZDQ1M2VmLi5kNDI5NDdlYmY5ZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2RkbHV0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKQEAgLTIx LDEyICsyMSwyNSBAQAogI2luY2x1ZGUgImFjY2Vzcy9nZW5hbS5oIgogI2luY2x1ZGUgImFjY2Vz cy9odHVwX2RldGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKKyNpbmNsdWRlICJh Y2Nlc3MvdG9hc3RfY29tcHJlc3Npb24uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhfbWVt YmVycy5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfYXV0aGlkLmgiCisjaW5jbHVkZSAiY2F0YWxv Zy9wZ19jbGFzcy5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9uLmgiCisjaW5jbHVk ZSAiY2F0YWxvZy9wZ19jb25zdHJhaW50LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19kYXRhYmFz ZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGJfcm9sZV9zZXR0aW5nLmgiCisjaW5jbHVkZSAi Y2F0YWxvZy9wZ19hbS5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfaW5oZXJpdHMuaCIKKyNpbmNs dWRlICJjYXRhbG9nL3BnX3BvbGljeS5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfc2VxdWVuY2Uu aCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3N0YXRpc3RpY19leHQuaCIKICNpbmNsdWRlICJjYXRh bG9nL3BnX3RhYmxlc3BhY2UuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3RyaWdnZXIuaCIKKyNp bmNsdWRlICJjYXRhbG9nL3BhcnRpdGlvbi5oIgorI2luY2x1ZGUgImNvbW1hbmRzL2RlZnJlbS5o IgorI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21kcy5oIgorI2luY2x1ZGUgIm5vZGVzL25vZGVz LmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVzcGFjZS5oIgogI2luY2x1ZGUgImNvbW1vbi9y ZWxwYXRoLmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgpAQCAtODcsNiArMTAwLDEwNSBAQCBzdGF0 aWMgRGF0dW0gcGdfZ2V0X3RhYmxlc3BhY2VfZGRsX3NyZihGdW5jdGlvbkNhbGxJbmZvIGZjaW5m bywgT2lkIHRzaWQsIGJvb2wgaQogc3RhdGljIExpc3QgKnBnX2dldF9kYXRhYmFzZV9kZGxfaW50 ZXJuYWwoT2lkIGRiaWQsIGJvb2wgcHJldHR5LAogCQkJCQkJCQkJCSAgYm9vbCBub19vd25lciwg Ym9vbCBub190YWJsZXNwYWNlKTsKIAorLyoKKyAqIFBlci1jb2x1bW4gY2FjaGUgb2YgbG9jYWxs eS1kZWNsYXJlZCBOT1QgTlVMTCBjb25zdHJhaW50cy4gIEJ1aWx0IG9uY2UKKyAqIGJ5IGNvbGxl Y3RfbG9jYWxfbm90X251bGwoKSBhbmQgY29uc3VsdGVkIGJ5IHRoZSBjb2x1bW4tZW1pdCBoZWxw ZXJzCisgKiBhbmQgdGhlIHBvc3QtQ1JFQVRFIGNvbnN0cmFpbnQgbG9vcC4gIEVudHJpZXMgd2l0 aCBjb25vaWQgPT0gSW52YWxpZE9pZAorICogbWVhbiB0aGUgY29sdW1uIGhhcyBubyBsb2NhbCBO T1QgTlVMTCBjb25zdHJhaW50IHJvdyBpbiBwZ19jb25zdHJhaW50CisgKiAodGhlIGNvbHVtbiBt YXkgc3RpbGwgaGF2ZSBhdHRub3RudWxsPXRydWUgb24gYSBwcmUtUEctMTgtdXBncmFkZWQKKyAq IGNhdGFsb2csIGluIHdoaWNoIGNhc2UgZW1pdCBwbGFpbiBpbmxpbmUgTk9UIE5VTEwpLgorICov Cit0eXBlZGVmIHN0cnVjdCBMb2NhbE5vdE51bGxFbnRyeQoreworCU9pZAkJCWNvbm9pZDsKKwlj aGFyCSAgICpuYW1lOworCWJvb2wJCWlzX2F1dG87CQkvKiBtYXRjaGVzICI8dGFibGU+Xzxjb2w+ X25vdF9udWxsIiAqLworCWJvb2wJCW5vX2luaGVyaXQ7Cit9CQkJTG9jYWxOb3ROdWxsRW50cnk7 CisKKy8qCisgKiBXb3JraW5nIGNvbnRleHQgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLXBhc3Mg aGVscGVycyBiZWxvdy4gIElucHV0cworICogKGNhbGxlci1wcm92aWRlZCBvcHRpb24gZmxhZ3Mp IGFyZSBmaWxsZWQgaW4gb25jZSBhdCB0aGUgdG9wIG9mCisgKiBwZ19nZXRfdGFibGVfZGRsX2lu dGVybmFsIGFuZCB0cmVhdGVkIGFzIHJlYWQtb25seSB0aGVyZWFmdGVyLiAgRGVyaXZlZAorICog ZmllbGRzIChxdWFsbmFtZSwgc2NoZW1hX3ByZWZpeCwgbm5fZW50cmllcywgc2tpcF9ub3RudWxs X29pZHMpIGFyZQorICogY29tcHV0ZWQgb25jZSBkdXJpbmcgc2V0dXAuICBFYWNoIHBhc3MgYXBw ZW5kcyB0byBjdHgtPmJ1ZiBhbmQgcHVzaGVzCisgKiB0aGUgZmluaXNoZWQgc3RhdGVtZW50IG9u dG8gY3R4LT5zdGF0ZW1lbnRzIHZpYSBhcHBlbmRfc3RtdCgpLgorICovCit0eXBlZGVmIHN0cnVj dCBUYWJsZURkbENvbnRleHQKK3sKKwlSZWxhdGlvbglyZWw7CisJT2lkCQkJcmVsaWQ7CisJYm9v bAkJcHJldHR5OworCWJvb2wJCW5vX293bmVyOworCWJvb2wJCW5vX3RhYmxlc3BhY2U7CisJYm9v bAkJaW5jbHVkZV9pbmRleGVzOworCWJvb2wJCWluY2x1ZGVfY29uc3RyYWludHM7CisJYm9vbAkJ aW5jbHVkZV9mb3JlaWduX2tleXM7CisJYm9vbAkJaW5jbHVkZV9ydWxlczsKKwlib29sCQlpbmNs dWRlX3N0YXRpc3RpY3M7CisJYm9vbAkJaW5jbHVkZV90cmlnZ2VyczsKKwlib29sCQlpbmNsdWRl X3BvbGljaWVzOworCWJvb2wJCWluY2x1ZGVfcmxzOworCWJvb2wJCWluY2x1ZGVfcmVwbGljYV9p ZGVudGl0eTsKKwlib29sCQlpbmNsdWRlX3BhcnRpdGlvbjsKKwlib29sCQlzY2hlbWFfcXVhbGlm aWVkOworCisJLyogRGVyaXZlZCBkdXJpbmcgc2V0dXAgKi8KKwlPaWQJCQliYXNlX25hbWVzcGFj ZTsKKwljaGFyCSAgICpxdWFsbmFtZTsKKwljaGFyCSAgICpzY2hlbWFfcHJlZml4OwkvKiBOVUxM IHdoZW4gc2NoZW1hX3F1YWxpZmllZCAqLworCWludAkJCXNhdmVfbmVzdGxldmVsOyAvKiA+PSAw IGlmIHdlIG5hcnJvd2VkIHNlYXJjaF9wYXRoICovCisJTG9jYWxOb3ROdWxsRW50cnkgKm5uX2Vu dHJpZXM7CisJTGlzdAkgICAqc2tpcF9ub3RudWxsX29pZHM7CisKKwkvKiBNdXRhYmxlIHdvcmtp bmcgc3RhdGUgKi8KKwlTdHJpbmdJbmZvRGF0YSBidWY7CisJTGlzdAkgICAqc3RhdGVtZW50czsK K30JCQlUYWJsZURkbENvbnRleHQ7CisKK3N0YXRpYyBMaXN0ICpwZ19nZXRfdGFibGVfZGRsX2lu dGVybmFsKE9pZCByZWxpZCwgYm9vbCBwcmV0dHksCisJCQkJCQkJCQkgICBib29sIG5vX293bmVy LCBib29sIG5vX3RhYmxlc3BhY2UsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfaW5kZXhlcywK KwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkJCSAgIGJvb2wg aW5jbHVkZV9mb3JlaWduX2tleXMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcnVsZXMsCisJ CQkJCQkJCQkgICBib29sIGluY2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCQkJCSAgIGJvb2wgaW5j bHVkZV90cmlnZ2VycywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9wb2xpY2llcywKKwkJCQkJ CQkJCSAgIGJvb2wgaW5jbHVkZV9ybHMsCisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfcmVwbGlj YV9pZGVudGl0eSwKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9wYXJ0aXRpb24sCisJCQkJCQkJ CQkgICBib29sIHNjaGVtYV9xdWFsaWZpZWQpOworc3RhdGljIHZvaWQgYXBwZW5kX2NvbHVtbl9k ZWZzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCSAg IGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkgICBib29sIHNjaGVtYV9xdWFsaWZp ZWQsCisJCQkJCQkJICAgTG9jYWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKTsKK3N0YXRpYyB2 b2lkIGFwcGVuZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlv biByZWwsCisJCQkJCQkJCQkJICBib29sIHByZXR0eSwgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRz LAorCQkJCQkJCQkJCSAgTG9jYWxOb3ROdWxsRW50cnkgKiBubl9lbnRyaWVzKTsKK3N0YXRpYyB2 b2lkIGFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMoU3RyaW5nSW5mbyBidWYsIFJlbGF0 aW9uIHJlbCwKKwkJCQkJCQkJCQkJYm9vbCBwcmV0dHksIGJvb2wgKmZpcnN0KTsKK3N0YXRpYyBj aGFyICpmaW5kX2F0dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIgYXR0bnVtLAor CQkJCQkJCSAgIExpc3QgKipkcGNvbnRleHQpOworc3RhdGljIGNoYXIgKmxvb2t1cF9yZWxuYW1l X2Zvcl9lbWl0KE9pZCByZWxpZCwgYm9vbCBzY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJCQkJIE9p ZCBiYXNlX25hbWVzcGFjZSk7CitzdGF0aWMgY2hhciAqc3RyaXBfc2NoZW1hX3ByZWZpeChjb25z dCBjaGFyICpzdG10LCBjb25zdCBjaGFyICpwcmVmaXgpOworc3RhdGljIExvY2FsTm90TnVsbEVu dHJ5ICogY29sbGVjdF9sb2NhbF9ub3RfbnVsbChSZWxhdGlvbiByZWwsCisJCQkJCQkJCQkJCQkg IExpc3QgKipza2lwX29pZHMpOworCitzdGF0aWMgdm9pZCBhcHBlbmRfc3RtdChUYWJsZURkbENv bnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQgZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURk bENvbnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQgZW1pdF9vd25lcl9zdG10KFRhYmxlRGRsQ29u dGV4dCAqIGN0eCk7CitzdGF0aWMgdm9pZCBlbWl0X2NoaWxkX2RlZmF1bHRfb3ZlcnJpZGVzKFRh YmxlRGRsQ29udGV4dCAqIGN0eCk7CitzdGF0aWMgdm9pZCBlbWl0X2F0dG9wdGlvbnMoVGFibGVE ZGxDb250ZXh0ICogY3R4KTsKK3N0YXRpYyB2b2lkIGVtaXRfaW5kZXhlcyhUYWJsZURkbENvbnRl eHQgKiBjdHgpOworc3RhdGljIHZvaWQgZW1pdF9sb2NhbF9jb25zdHJhaW50cyhUYWJsZURkbENv bnRleHQgKiBjdHgpOworc3RhdGljIHZvaWQgZW1pdF9ydWxlcyhUYWJsZURkbENvbnRleHQgKiBj dHgpOworc3RhdGljIHZvaWQgZW1pdF9zdGF0aXN0aWNzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCk7 CitzdGF0aWMgdm9pZCBlbWl0X3JlcGxpY2FfaWRlbnRpdHkoVGFibGVEZGxDb250ZXh0ICogY3R4 KTsKK3N0YXRpYyB2b2lkIGVtaXRfcmxzX3RvZ2dsZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KTsK K3N0YXRpYyB2b2lkIGVtaXRfcGFydGl0aW9uX2NoaWxkcmVuKFRhYmxlRGRsQ29udGV4dCAqIGN0 eCk7CisKIAogLyoKICAqIHBhcnNlX2RkbF9vcHRpb25zCkBAIC0xMTg1LDMgKzEyOTcsMTYyNyBA QCBwZ19nZXRfZGF0YWJhc2VfZGRsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCVNSRl9SRVRVUk5fRE9O RShmdW5jY3R4KTsKIAl9CiB9CisKKy8qCisgKiBsb29rdXBfcmVsbmFtZV9mb3JfZW1pdAorICoJ CVJldHVybiBlaXRoZXIgdGhlIHNjaGVtYS1xdWFsaWZpZWQgb3IgdGhlIGJhcmUgcXVvdGVkIG5h bWUgb2YgYQorICoJCXJlbGF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjaGVtYV9xdWFsaWZpZWQg ZmxhZy4KKyAqCisgKiBXaGVuIHNjaGVtYV9xdWFsaWZpZWQgaXMgdHJ1ZSB0aGUgc2NoZW1hLXF1 YWxpZmllZCBuYW1lIGlzIGFsd2F5cworICogcmV0dXJuZWQuICBXaGVuIGZhbHNlLCB0aGUgYmFy ZSByZWxuYW1lIGlzIHJldHVybmVkIG9ubHkgaWYgdGhlIHRhcmdldAorICogcmVsYXRpb24gbGl2 ZXMgaW4gYmFzZV9uYW1lc3BhY2UgKHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHRhYmxlIHdob3NlIERE TCBpcworICogYmVpbmcgZ2VuZXJhdGVkKTsgb3RoZXJ3aXNlIHRoZSBzY2hlbWEtcXVhbGlmaWVk IGZvcm0gaXMgcmV0dXJuZWQsCisgKiBiZWNhdXNlIGNyb3NzLXNjaGVtYSByZWZlcmVuY2VzIChm b3IgZXhhbXBsZSBhbiBpbmhlcml0YW5jZSBwYXJlbnQgb3IKKyAqIGZvcmVpZ24ga2V5IHRhcmdl dCBpbiBhIGRpZmZlcmVudCBzY2hlbWEpIGFyZSBub3Qgc2FmZSB0byBzdHJpcC4KKyAqCisgKiBU aGlzIHJlcGxhY2VzIHRoZSB1bnNhZmUgcGF0dGVybgorICoJICBxdW90ZV9xdWFsaWZpZWRfaWRl bnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2Uob2lkKSksCisgKgkg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZWxfbmFtZShvaWQpKQorICogd2hpY2gg ZGVyZWZlcmVuY2VzIE5VTEwgd2hlbiBhIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzIGRyb3Bw ZWQgdGhlCisgKiByZWZlcmVuY2VkIHJlbGF0aW9uIChvciBpdHMgc2NoZW1hKSBiZXR3ZWVuIHdo ZW4gd2UgY2FjaGVkIGl0cyBPSUQgYW5kCisgKiB3aGVuIHdlIGFzayB0aGUgc3lzY2FjaGUgZm9y IGl0cyBuYW1lLiAgSG9sZGluZyBBY2Nlc3NTaGFyZUxvY2sgb24gYQorICogZGVwZW5kZW50IHJl bGF0aW9uIG1ha2VzIHRoaXMgcmFjZSB2YW5pc2hpbmdseSB1bmxpa2VseSBpbiBwcmFjdGljZSwg YnV0CisgKiB3ZSBzdGlsbCBkZWZlbmQgYWdhaW5zdCBpdCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2 ZSBpcyBhIFNJR1NFR1YuCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZnJlZSgp aW5nIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2xvb2t1cF9yZWxuYW1lX2Zvcl9l bWl0KE9pZCByZWxpZCwgYm9vbCBzY2hlbWFfcXVhbGlmaWVkLCBPaWQgYmFzZV9uYW1lc3BhY2Up Cit7CisJSGVhcFR1cGxlCXRwOworCUZvcm1fcGdfY2xhc3MgcmVsdHVwOworCWNoYXIJICAgKm5z cG5hbWU7CisJY2hhcgkgICAqcmVzdWx0OworCisJdHAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lE LCBPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHRwKSkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1Qp LAorCQkJCSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgcmVs aWQpLAorCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3Bw ZWQuIikpKTsKKworCXJlbHR1cCA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1QodHApOworCisJ LyogQmFyZSBuYW1lIG9ubHkgd2hlbiBjYWxsZXIgYXNrZWQgYW5kIHRhcmdldCBpcyBpbiB0aGUg YmFzZSBuYW1lc3BhY2UuICovCisJaWYgKCFzY2hlbWFfcXVhbGlmaWVkICYmIHJlbHR1cC0+cmVs bmFtZXNwYWNlID09IGJhc2VfbmFtZXNwYWNlKQorCXsKKwkJcmVzdWx0ID0gcHN0cmR1cChxdW90 ZV9pZGVudGlmaWVyKE5hbWVTdHIocmVsdHVwLT5yZWxuYW1lKSkpOworCQlSZWxlYXNlU3lzQ2Fj aGUodHApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNl X25hbWUocmVsdHVwLT5yZWxuYW1lc3BhY2UpOworCWlmIChuc3BuYW1lID09IE5VTEwpCisJewor CQlPaWQJCQluc3BvaWQgPSByZWx0dXAtPnJlbG5hbWVzcGFjZTsKKworCQlSZWxlYXNlU3lzQ2Fj aGUodHApOworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVE X09CSkVDVCksCisJCQkJIGVycm1zZygic2NoZW1hIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0 IiwgbnNwb2lkKSwKKwkJCQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRs eSBkcm9wcGVkLiIpKSk7CisJfQorCisJcmVzdWx0ID0gcXVvdGVfcXVhbGlmaWVkX2lkZW50aWZp ZXIobnNwbmFtZSwgTmFtZVN0cihyZWx0dXAtPnJlbG5hbWUpKTsKKworCXBmcmVlKG5zcG5hbWUp OworCVJlbGVhc2VTeXNDYWNoZSh0cCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICog c3RyaXBfc2NoZW1hX3ByZWZpeAorICoJCVJldHVybiBhIHBhbGxvYydkIGNvcHkgb2Ygc3RtdCB3 aXRoIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgcHJlZml4CisgKgkJcmVtb3ZlZCwgZXhjZXB0IG9jY3Vy cmVuY2VzIHRoYXQgZmFsbCBpbnNpZGUgYSBzaW5nbGUtcXVvdGVkIFNRTAorICoJCXN0cmluZyBs aXRlcmFsIG9yIGEgZG91YmxlLXF1b3RlZCBTUUwgaWRlbnRpZmllci4KKyAqCisgKiBVc2VkIHRv IHN0cmlwIHRoZSBxdWFsaWZpZWQtc2NoZW1hIHByZWZpeCAoZm9yIGV4YW1wbGUgIm9sZF9zY2hl bWEuIikKKyAqIGZyb20gRERMIGVtaXR0ZWQgYnkgdGhlIGFsd2F5cy1xdWFsaWZpZWQgcnVsZXV0 aWxzIGhlbHBlcnMKKyAqIChwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBwZ19nZXRfaW5k ZXhkZWZfc3RyaW5nLAorICogcGdfZ2V0X3J1bGVkZWYsIHBnX2dldF9zdGF0aXN0aWNzb2JqZGVm X3N0cmluZykgd2hlbiB0aGUgY2FsbGVyIGhhcworICogcmVxdWVzdGVkIHVucXVhbGlmaWVkIG91 dHB1dCB2aWEgc2NoZW1hX3F1YWxpZmllZD1mYWxzZS4gIEEgcGxhaW4KKyAqIHN1YnN0cmluZyBz dHJpcCB3b3VsZCBjb3JydXB0IHN0cmluZyBsaXRlcmFscyB3aG9zZSBjb250ZW50cyBoYXBwZW4K KyAqIHRvIGNvbnRhaW4gIjxzY2hlbWE+LiIgKGZvciBleGFtcGxlIGEgQ0hFQ0sgY29tcGFyaW5n IGFnYWluc3QKKyAqICdteXNjaGVtYS5zZWNyZXQnKSBvciBkb3VibGUtcXVvdGVkIGNvbHVtbi9p ZGVudGlmaWVyIG5hbWVzIHdob3NlCisgKiBjb250ZW50cyBoYXBwZW4gdG8gY29udGFpbiAiPHNj aGVtYT4uIiAoZm9yIGV4YW1wbGUgYSBjb2x1bW4gbmFtZWQKKyAqICJzLndlaXJkIiB3aGVuIHN0 cmlwcGluZyB0aGUgcHJlZml4ICJzLiIpLCBzbyB3ZSB0cmFjayBxdW90aW5nIHN0YXRlCisgKiBh bmQgc2tpcCBtYXRjaGVzIHRoYXQgb2NjdXIgd2hpbGUgd2UgYXJlIGluc2lkZSBlaXRoZXIga2lu ZCBvZgorICogcXVvdGVkIHRva2VuLiAgRXNjYXBlZCBxdW90ZXMgKCcnIGluc2lkZSBhIHN0cmlu ZywgIiIgaW5zaWRlIGFuCisgKiBpZGVudGlmaWVyKSBhcmUgaGFuZGxlZCBieSBrZWVwaW5nIHRo ZSBjb3JyZXNwb25kaW5nIGZsYWcgc2V0IGFjcm9zcworICogdGhlbS4KKyAqLworc3RhdGljIGNo YXIgKgorc3RyaXBfc2NoZW1hX3ByZWZpeChjb25zdCBjaGFyICpzdG10LCBjb25zdCBjaGFyICpw cmVmaXgpCit7CisJU3RyaW5nSW5mb0RhdGEgYnVmOworCXNpemVfdAkJcGxlbiA9IHN0cmxlbihw cmVmaXgpOworCWNvbnN0IGNoYXIgKnAgPSBzdG10OworCWJvb2wJCWluX3N0cmluZyA9IGZhbHNl OworCWJvb2wJCWluX2lkZW50ID0gZmFsc2U7CisKKwlpbml0U3RyaW5nSW5mbygmYnVmKTsKKwl3 aGlsZSAoKnApCisJeworCQkvKgorCQkgKiBUcnkgdGhlIHByZWZpeCBtYXRjaCBCRUZPUkUgdGhl IHF1b3RlLXN0YXRlIHRvZ2dsZXMuICBUaGUgcHJlZml4CisJCSAqIGl0c2VsZiBtYXkgYmVnaW4g d2l0aCBhIGRvdWJsZSBxdW90ZSB3aGVuIHRoZSBiYXNlIHNjaGVtYSBuYW1lCisJCSAqIHJlcXVp cmVzIHF1b3RpbmcgKGUuZy4gIk15LVNjaGVtYSIuKSwgYW5kIGF0IHRoYXQgbGVhZGluZyAiIHdl IG11c3QKKwkJICogc3RyaXAgdGhlIHdob2xlIHByZWZpeCByYXRoZXIgdGhhbiB0cmVhdCBpdCBh cyB0aGUgb3BlbmluZyBvZiBhCisJCSAqIHJlZ3VsYXIgcXVvdGVkIGlkZW50aWZpZXIuICBUaGUg Y2hlY2sgaXMgZ2F0ZWQgb24gIWluX2lkZW50ICYmCisJCSAqICFpbl9zdHJpbmcsIHNvIG9uY2Ug d2UgaGF2ZSB0b2dnbGVkIGludG8gYSBxdW90ZWQgdG9rZW4gd2UgbmV2ZXIKKwkJICogc3RyaXAg YSBjb2luY2lkZW50YWwgc3Vic3RyaW5nIGluc2lkZSBpdC4KKwkJICovCisJCWlmICghaW5fc3Ry aW5nICYmICFpbl9pZGVudCAmJiBzdHJuY21wKHAsIHByZWZpeCwgcGxlbikgPT0gMCkKKwkJewor CQkJcCArPSBwbGVuOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcJycgJiYgIWlu X2lkZW50KQorCQl7CisJCQkvKiBTUUwgJycgZXNjYXBlOiBlbWl0IGJvdGggcXVvdGVzIGFuZCBz dGF5IGluc2lkZSB0aGUgc3RyaW5nLiAqLworCQkJaWYgKGluX3N0cmluZyAmJiBwWzFdID09ICdc JycpCisJCQl7CisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJ1wnJyk7CisJCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJ1wnJyk7CisJCQkJcCArPSAyOworCQkJCWNvbnRpbnVl OworCQkJfQorCQkJaW5fc3RyaW5nID0gIWluX3N0cmluZzsKKwkJCWFwcGVuZFN0cmluZ0luZm9D aGFyKCZidWYsICpwKTsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcCA9PSAn IicgJiYgIWluX3N0cmluZykKKwkJeworCQkJLyogU1FMICIiIGVzY2FwZTogZW1pdCBib3RoIHF1 b3RlcyBhbmQgc3RheSBpbnNpZGUgdGhlIGlkZW50LiAqLworCQkJaWYgKGluX2lkZW50ICYmIHBb MV0gPT0gJyInKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICciJyk7CisJ CQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJyInKTsKKwkJCQlwICs9IDI7CisJCQkJY29u dGludWU7CisJCQl9CisJCQlpbl9pZGVudCA9ICFpbl9pZGVudDsKKwkJCWFwcGVuZFN0cmluZ0lu Zm9DaGFyKCZidWYsICpwKTsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFwcGVuZFN0 cmluZ0luZm9DaGFyKCZidWYsICpwKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gYnVmLmRhdGE7Cit9 CisKKy8qCisgKiBjb2xsZWN0X2xvY2FsX25vdF9udWxsCisgKgkJU2NhbiBwZ19jb25zdHJhaW50 IG9uY2UgZm9yIGxvY2FsbHktZGVjbGFyZWQgTk9UIE5VTEwgY29uc3RyYWludHMKKyAqCQlvbiBy ZWwsIHJldHVybmluZyBhIHBhbGxvYydkIGFycmF5IGluZGV4ZWQgYnkgYXR0bnVtICgxLi5uYXR0 cykuCisgKgorICogRW50cmllcyB3aXRoIGNvbm9pZD09SW52YWxpZE9pZCBtZWFuICJubyBsb2Nh bCBOT1QgTlVMTCByb3cgZm9yIHRoaXMKKyAqIGNvbHVtbiIuICBXaGVuIHRoZSBjb25zdHJhaW50 IG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGF1dG8tZ2VuZXJhdGVkCisgKiBwYXR0ZXJuICI8dGFi bGVuYW1lPl88Y29sdW1ubmFtZT5fbm90X251bGwiLCB0aGUgY29uc3RyYWludCBPSUQgaXMKKyAq IGFwcGVuZGVkIHRvICpza2lwX29pZHMgc28gdGhlIHBvc3QtQ1JFQVRFIGNvbnN0cmFpbnQgbG9v cCBjYW4gYXZvaWQKKyAqIHJlLWVtaXR0aW5nIGl0IGFzIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09O U1RSQUlOVCAtIHRoZSBjb2x1bW4tZW1pdAorICogcGFzcyB3aWxsIHByb2R1Y2UgaXQgaW5saW5l IGFzICJDT05TVFJBSU5UIG5hbWUgTk9UIE5VTEwiIGluc3RlYWQuCisgKi8KK3N0YXRpYyBMb2Nh bE5vdE51bGxFbnRyeSAqCitjb2xsZWN0X2xvY2FsX25vdF9udWxsKFJlbGF0aW9uIHJlbCwgTGlz dCAqKnNraXBfb2lkcykKK3sKKwlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Io cmVsKTsKKwlpbnQJCQluYXR0cyA9IHR1cGRlc2MtPm5hdHRzOworCUxvY2FsTm90TnVsbEVudHJ5 ICplbnRyaWVzOworCWNvbnN0IGNoYXIgKnJlbG5hbWUgPSBSZWxhdGlvbkdldFJlbGF0aW9uTmFt ZShyZWwpOworCVJlbGF0aW9uCWNvblJlbDsKKwlTeXNTY2FuRGVzYyBjb25TY2FuOworCVNjYW5L ZXlEYXRhIGNvbktleTsKKwlIZWFwVHVwbGUJY29uVHVwOworCisJZW50cmllcyA9IChMb2NhbE5v dE51bGxFbnRyeSAqKSBwYWxsb2MwKHNpemVvZihMb2NhbE5vdE51bGxFbnRyeSkgKgorCQkJCQkJ CQkJCQkobmF0dHMgKyAxKSk7CisKKwljb25SZWwgPSB0YWJsZV9vcGVuKENvbnN0cmFpbnRSZWxh dGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCVNjYW5LZXlJbml0KCZjb25LZXksCisJCQkJQW51 bV9wZ19jb25zdHJhaW50X2NvbnJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9P SURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVsKSkpOworCWNv blNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4oY29uUmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5h bWVJbmRleElkLAorCQkJCQkJCQkgdHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwl3aGlsZSAo SGVhcFR1cGxlSXNWYWxpZChjb25UdXAgPSBzeXN0YWJsZV9nZXRuZXh0KGNvblNjYW4pKSkKKwl7 CisJCUZvcm1fcGdfY29uc3RyYWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJV Q1QoY29uVHVwKTsKKwkJRGF0dW0JCWNvbmtleURhdDsKKwkJYm9vbAkJY29ua2V5TnVsbDsKKwkJ QXJyYXlUeXBlICAqY29ua2V5QXJyOworCQlpbnQxNgkgICAqY29ua2V5VmFsczsKKwkJaW50CQkJ YXR0bnVtOworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQ7CisJCWNoYXIJCWF1dG9uYW1lW05BTUVE QVRBTEVOXTsKKworCQlpZiAoY29uLT5jb250eXBlICE9IENPTlNUUkFJTlRfTk9UTlVMTCkKKwkJ CWNvbnRpbnVlOworCQlpZiAoIWNvbi0+Y29uaXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWNv bmtleURhdCA9IGhlYXBfZ2V0YXR0cihjb25UdXAsIEFudW1fcGdfY29uc3RyYWludF9jb25rZXks CisJCQkJCQkJCSBSZWxhdGlvbkdldERlc2NyKGNvblJlbCksICZjb25rZXlOdWxsKTsKKwkJaWYg KGNvbmtleU51bGwpCisJCQljb250aW51ZTsKKwkJY29ua2V5QXJyID0gRGF0dW1HZXRBcnJheVR5 cGVQKGNvbmtleURhdCk7CisKKwkJLyoKKwkJICogRGVmZW5kIGFnYWluc3QgYSBtYWxmb3JtZWQg Y29ua2V5OiBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgaXMgYWx3YXlzCisJCSAqIGEgc2luZ2xlLWNv bHVtbiAxLUQgaW50MiBhcnJheSwgYnV0IGEgY29ycnVwdGVkIGNhdGFsb2cgb3IgYSBmdXR1cmUK KwkJICogcGF0Y2ggdGhhdCBzdG9yZXMgd2lkZXIgY29ua2V5cyBtdXN0bid0IHRyaXAgdXMgaW50 byByZWFkaW5nIHBhc3QKKwkJICogdGhlIGFycmF5IGhlYWRlci4KKwkJICovCisJCWlmIChBUlJf TkRJTShjb25rZXlBcnIpICE9IDEgfHwKKwkJCUFSUl9ESU1TKGNvbmtleUFycilbMF0gPCAxIHx8 CisJCQlBUlJfSEFTTlVMTChjb25rZXlBcnIpIHx8CisJCQlBUlJfRUxFTVRZUEUoY29ua2V5QXJy KSAhPSBJTlQyT0lEKQorCQkJY29udGludWU7CisKKwkJY29ua2V5VmFscyA9IChpbnQxNiAqKSBB UlJfREFUQV9QVFIoY29ua2V5QXJyKTsKKwkJYXR0bnVtID0gY29ua2V5VmFsc1swXTsKKwkJaWYg KGF0dG51bSA8IDEgfHwgYXR0bnVtID4gbmF0dHMpCisJCQljb250aW51ZTsKKworCQlhdHQgPSBU dXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQlzbnByaW50ZihhdXRvbmFtZSwg c2l6ZW9mKGF1dG9uYW1lKSwgIiVzXyVzX25vdF9udWxsIiwKKwkJCQkgcmVsbmFtZSwgTmFtZVN0 cihhdHQtPmF0dG5hbWUpKTsKKworCQllbnRyaWVzW2F0dG51bV0uY29ub2lkID0gY29uLT5vaWQ7 CisJCWVudHJpZXNbYXR0bnVtXS5uYW1lID0gcHN0cmR1cChOYW1lU3RyKGNvbi0+Y29ubmFtZSkp OworCQllbnRyaWVzW2F0dG51bV0uaXNfYXV0byA9IChzdHJjbXAoTmFtZVN0cihjb24tPmNvbm5h bWUpLCBhdXRvbmFtZSkgPT0gMCk7CisJCWVudHJpZXNbYXR0bnVtXS5ub19pbmhlcml0ID0gY29u LT5jb25ub2luaGVyaXQ7CisKKwkJLyoKKwkJICogSW5saW5lIGVtaXNzaW9uIG9mICJDT05TVFJB SU5UIG5hbWUgTk9UIE5VTEwiIG9ubHkgaGFwcGVucyBmb3IKKwkJICogY29sdW1ucyB0aGF0IHRo ZSBjb2x1bW4gbGlzdCBhY3R1YWxseSBlbWl0cywgaS5lLiBhdHRpc2xvY2FsCisJCSAqIGNvbHVt bnMuICBGb3IgYSBsb2NhbGx5LWRlY2xhcmVkIE5PVCBOVUxMIHNpdHRpbmcgb24gYW4gaW5oZXJp dGVkCisJCSAqIGNvbHVtbiB0aGUgaW5saW5lIHBhdGggbmV2ZXIgZmlyZXMsIHNvIHdlIG11c3Qg bGVhdmUgdGhlIGNvbnN0cmFpbnQKKwkJICogT0lEIG91dCBvZiBza2lwX29pZHMgYW5kIGxldCB0 aGUgcG9zdC1DUkVBVEUgY29uc3RyYWludCBsb29wIGVtaXQKKwkJICogQUxURVIgVEFCTEUgLi4u IEFERCBDT05TVFJBSU5ULgorCQkgKi8KKwkJaWYgKCFlbnRyaWVzW2F0dG51bV0uaXNfYXV0byAm JiBhdHQtPmF0dGlzbG9jYWwgJiYgc2tpcF9vaWRzICE9IE5VTEwpCisJCQkqc2tpcF9vaWRzID0g bGFwcGVuZF9vaWQoKnNraXBfb2lkcywgY29uLT5vaWQpOworCX0KKwlzeXN0YWJsZV9lbmRzY2Fu KGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJl dHVybiBlbnRyaWVzOworfQorCisvKgorICogZmluZF9hdHRyZGVmX3RleHQKKyAqCQlSZXR1cm4g dGhlIGRlcGFyc2VkIERFRkFVTFQvR0VORVJBVEVEIGV4cHJlc3Npb24gZm9yIGF0dG51bSBvbiBy ZWwsCisgKgkJb3IgTlVMTCBpZiBubyBlbnRyeSBleGlzdHMgaW4gVHVwbGVDb25zdHItPmRlZnZh bC4KKyAqCisgKiBUaGUgY2FsbGVyIHBhc3NlcyBhIExpc3QgKiogc28gdGhhdCB0aGUgZGVwYXJz ZSBjb250ZXh0IGlzIGJ1aWx0IGxhemlseQorICogYW5kIHJldXNlZCBhY3Jvc3MgY2FsbHMgKGRl cGFyc2VfY29udGV4dF9mb3IgaXMgbm90IGNoZWFwKS4gIFJldHVybmVkCisgKiBzdHJpbmcgaXMg cGFsbG9jJ2QgaW4gdGhlIGN1cnJlbnQgbWVtb3J5IGNvbnRleHQ7IGNhbGxlciBwZnJlZSdzIGl0 LgorICovCitzdGF0aWMgY2hhciAqCitmaW5kX2F0dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0 dHJOdW1iZXIgYXR0bnVtLCBMaXN0ICoqZHBjb250ZXh0KQoreworCVR1cGxlQ29uc3RyICpjb25z dHIgPSBSZWxhdGlvbkdldERlc2NyKHJlbCktPmNvbnN0cjsKKworCWlmIChjb25zdHIgPT0gTlVM TCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGludCBqID0gMDsgaiA8IGNvbnN0ci0+bnVtX2Rl ZnZhbDsgaisrKQorCXsKKwkJaWYgKGNvbnN0ci0+ZGVmdmFsW2pdLmFkbnVtICE9IGF0dG51bSkK KwkJCWNvbnRpbnVlOworCisJCWlmICgqZHBjb250ZXh0ID09IE5JTCkKKwkJCSpkcGNvbnRleHQg PSBkZXBhcnNlX2NvbnRleHRfZm9yKFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJ CQkJCQkJCSBSZWxhdGlvbkdldFJlbGlkKHJlbCkpOworCisJCXJldHVybiBkZXBhcnNlX2V4cHJl c3Npb24oc3RyaW5nVG9Ob2RlKGNvbnN0ci0+ZGVmdmFsW2pdLmFkYmluKSwKKwkJCQkJCQkJICAq ZHBjb250ZXh0LCBmYWxzZSwgZmFsc2UpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAq IGFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMKKyAqCQlFbWl0IGVhY2ggbG9jYWxseS1k ZWNsYXJlZCBDSEVDSyBjb25zdHJhaW50IG9uIHJlbCBhcworICoJCSJDT05TVFJBSU5UIG5hbWUg PHBnX2dldF9jb25zdHJhaW50ZGVmPiIsIHNlcGFyYXRlZCBieSAnLCcgZnJvbSBhbnkKKyAqCQlw cmV2aW91c2x5LWVtaXR0ZWQgY29sdW1uIG9yIGNvbnN0cmFpbnQuCisgKgorICogKmZpcnN0IHRy YWNrcyB3aGV0aGVyIGFueXRoaW5nIGhhcyBiZWVuIGVtaXR0ZWQgb24gdGhpcyBsaXN0IHlldCwg c28gdGhlCisgKiBjYWxsZXIgY2FuIGNoYWluIGNvbHVtbiBlbWlzc2lvbiBhbmQgY29uc3RyYWlu dCBlbWlzc2lvbiB0aHJvdWdoIHRoZSBzYW1lCisgKiBidWZmZXIuICBJbmhlcml0ZWQgQ0hFQ0sg Y29uc3RyYWludHMgKCFjb25pc2xvY2FsKSBjb21lIGZyb20gdGhlIHBhcmVudCdzCisgKiBEREwg YW5kIGFyZW4ndCByZXBlYXRlZCBoZXJlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX2lubGlu ZV9jaGVja19jb25zdHJhaW50cyhTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBib29sIHBy ZXR0eSwKKwkJCQkJCQkJYm9vbCAqZmlyc3QpCit7CisJUmVsYXRpb24JY29uUmVsOworCVN5c1Nj YW5EZXNjIGNvblNjYW47CisJU2NhbktleURhdGEgY29uS2V5OworCUhlYXBUdXBsZQljb25UdXA7 CisKKwljb25SZWwgPSB0YWJsZV9vcGVuKENvbnN0cmFpbnRSZWxhdGlvbklkLCBBY2Nlc3NTaGFy ZUxvY2spOworCVNjYW5LZXlJbml0KCZjb25LZXksCisJCQkJQW51bV9wZ19jb25zdHJhaW50X2Nv bnJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJ ZEdldERhdHVtKFJlbGF0aW9uR2V0UmVsaWQocmVsKSkpOworCWNvblNjYW4gPSBzeXN0YWJsZV9i ZWdpbnNjYW4oY29uUmVsLCBDb25zdHJhaW50UmVsaWRUeXBpZE5hbWVJbmRleElkLAorCQkJCQkJ CQkgdHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChj b25UdXAgPSBzeXN0YWJsZV9nZXRuZXh0KGNvblNjYW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3Ry YWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJRGF0 dW0JCWRlZkRhdHVtOworCQljaGFyCSAgICpkZWZib2R5OworCisJCWlmIChjb24tPmNvbnR5cGUg IT0gQ09OU1RSQUlOVF9DSEVDSykKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNvbi0+Y29uaXNsb2Nh bCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKmZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0No YXIoYnVmLCAnLCcpOworCQkqZmlyc3QgPSBmYWxzZTsKKwkJaWYgKHByZXR0eSkKKwkJCWFwcGVu ZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXG4gICAgIik7CisJCWVsc2UKKwkJCWFwcGVuZFN0cmlu Z0luZm9DaGFyKGJ1ZiwgJyAnKTsKKworCQlkZWZEYXR1bSA9IE9pZEZ1bmN0aW9uQ2FsbDEoRl9Q R19HRVRfQ09OU1RSQUlOVERFRl9PSUQsCisJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKGNvbi0+ b2lkKSk7CisJCWRlZmJvZHkgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKGRlZkRhdHVtKTsKKwkJYXBw ZW5kU3RyaW5nSW5mbyhidWYsICJDT05TVFJBSU5UICVzICVzIiwKKwkJCQkJCSBxdW90ZV9pZGVu dGlmaWVyKE5hbWVTdHIoY29uLT5jb25uYW1lKSksCisJCQkJCQkgZGVmYm9keSk7CisJCXBmcmVl KGRlZmJvZHkpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3Nl KGNvblJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKK30KKworLyoKKyAqIGFwcGVuZF9jb2x1bW5fZGVm cworICoJCUFwcGVuZCB0aGUgY29tbWEtc2VwYXJhdGVkIGNvbHVtbiBkZWZpbml0aW9uIGxpc3Qg Zm9yIGEgdGFibGUuCisgKgorICogRW1pdHMgZWFjaCBub24tZHJvcHBlZCwgbG9jYWxseS1kZWNs YXJlZCBjb2x1bW4gYXMKKyAqCQluYW1lIHR5cGUgW0NPTExBVEUgeF0gW1NUT1JBR0Ugc10gW0NP TVBSRVNTSU9OIGNdCisgKgkJW0dFTkVSQVRFRCAuLi4gfCBERUZBVUxUIGVdIFtOT1QgTlVMTF0K KyAqIGZvbGxvd2VkIGJ5IGFueSBsb2NhbGx5LWRlY2xhcmVkIGlubGluZSBDSEVDSyBjb25zdHJh aW50cy4gIE9wdGlvbmFsCisgKiBjbGF1c2VzIGFyZSBvbWl0dGVkIHdoZW4gdGhlaXIgdmFsdWUg bWF0Y2hlcyB3aGF0IHRoZSBzeXN0ZW0gd291bGQKKyAqIHJlYXBwbHkgb24gcm91bmQtdHJpcCAo ZS5nLiB0eXBlLWRlZmF1bHQgQ09MTEFURSwgdHlwZS1kZWZhdWx0IFNUT1JBR0UpLgorICovCitz dGF0aWMgdm9pZAorYXBwZW5kX2NvbHVtbl9kZWZzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiBy ZWwsIGJvb2wgcHJldHR5LAorCQkJCSAgIGJvb2wgaW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkg ICBib29sIHNjaGVtYV9xdWFsaWZpZWQsCisJCQkJICAgTG9jYWxOb3ROdWxsRW50cnkgKiBubl9l bnRyaWVzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOwor CU9pZAkJCWJhc2VfbmFtZXNwYWNlID0gUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKTsKKwlMaXN0 CSAgICpkcGNvbnRleHQgPSBOSUw7CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCisJZm9yIChpbnQg aSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAqdHlwc3RyOworCisJ CWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIENvbHVt bnMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgYXJlIGVtaXR0ZWQgYnkgdGhlIElOSEVSSVRTIGNs YXVzZQorCQkgKiAob25jZSBpbXBsZW1lbnRlZCksIG5vdCB0aGUgY29sdW1uIGxpc3QsIHVubGVz cyB0aGUgY2hpbGQKKwkJICogcmVkZWNsYXJlZCB0aGVtIGxvY2FsbHkgKGF0dGlzbG9jYWw9dHJ1 ZSkuCisJCSAqLworCQlpZiAoIWF0dC0+YXR0aXNsb2NhbCkKKwkJCWNvbnRpbnVlOworCisJCWlm ICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcsJyk7CisJCWZpcnN0ID0g ZmFsc2U7CisKKwkJaWYgKHByZXR0eSkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAi XG4gICAgIik7CisJCWVsc2UKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyAnKTsKKwor CQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0 dC0+YXR0bmFtZSkpKTsKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJCXR5 cHN0ciA9IGZvcm1hdF90eXBlX3dpdGhfdHlwZW1vZChhdHQtPmF0dHR5cGlkLCBhdHQtPmF0dHR5 cG1vZCk7CisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCB0eXBzdHIpOworCQlwZnJlZSh0 eXBzdHIpOworCisJCS8qIENPTExBVEUgY2xhdXNlLCBvbmx5IGlmIGl0IGRpZmZlcnMgZnJvbSB0 aGUgdHlwZSdzIGRlZmF1bHQuICovCisJCWlmIChPaWRJc1ZhbGlkKGF0dC0+YXR0Y29sbGF0aW9u KSAmJgorCQkJYXR0LT5hdHRjb2xsYXRpb24gIT0gZ2V0X3R5cGNvbGxhdGlvbihhdHQtPmF0dHR5 cGlkKSkKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIENPTExBVEUgJXMiLAorCQkJCQkJCSBn ZW5lcmF0ZV9jb2xsYXRpb25fbmFtZShhdHQtPmF0dGNvbGxhdGlvbikpOworCisJCS8qIFNUT1JB R0UgY2xhdXNlLCBvbmx5IGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZSdzIGRlZmF1bHQuICov CisJCWlmIChhdHQtPmF0dHN0b3JhZ2UgIT0gZ2V0X3R5cHN0b3JhZ2UoYXR0LT5hdHR0eXBpZCkp CisJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBTVE9SQUdFICVzIiwgc3RvcmFnZV9uYW1lKGF0 dC0+YXR0c3RvcmFnZSkpOworCisJCS8qIENPTVBSRVNTSU9OIGNsYXVzZSwgb25seSBpZiBleHBs aWNpdGx5IHNldCBvbiB0aGUgY29sdW1uLiAqLworCQlpZiAoQ29tcHJlc3Npb25NZXRob2RJc1Zh bGlkKGF0dC0+YXR0Y29tcHJlc3Npb24pKQorCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09N UFJFU1NJT04gJXMiLAorCQkJCQkJCSBHZXRDb21wcmVzc2lvbk1ldGhvZE5hbWUoYXR0LT5hdHRj b21wcmVzc2lvbikpOworCisJCS8qCisJCSAqIExvb2sgdXAgdGhlIGRlZmF1bHQvZ2VuZXJhdGVk IGV4cHJlc3Npb24gdGV4dCB1cCBmcm9udDsgZ2VuZXJhdGVkCisJCSAqIGNvbHVtbnMgaGF2ZSBh dHRoYXNkZWY9dHJ1ZSB3aXRoIGFuIGVudHJ5IGluIHBnX2F0dHJkZWYganVzdCBsaWtlCisJCSAq IHJlZ3VsYXIgZGVmYXVsdHMuCisJCSAqLworCQl7CisJCQljaGFyCSAgICpkZWZleHByID0gTlVM TDsKKworCQkJaWYgKGF0dC0+YXR0aGFzZGVmKQorCQkJCWRlZmV4cHIgPSBmaW5kX2F0dHJkZWZf dGV4dChyZWwsIGF0dC0+YXR0bnVtLCAmZHBjb250ZXh0KTsKKworCQkJLyogR0VORVJBVEVEIC8g SURFTlRJVFkgLyBERUZBVUxUIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJCQlpZiAoYXR0 LT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9TVE9SRUQgJiYgZGVmZXhwcikK KwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBHRU5FUkFURUQgQUxXQVlTIEFTICglcykgU1RP UkVEIiwgZGVmZXhwcik7CisJCQllbHNlIGlmIChhdHQtPmF0dGdlbmVyYXRlZCA9PSBBVFRSSUJV VEVfR0VORVJBVEVEX1ZJUlRVQUwgJiYgZGVmZXhwcikKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1 ZiwgIiBHRU5FUkFURUQgQUxXQVlTIEFTICglcykgVklSVFVBTCIsIGRlZmV4cHIpOworCQkJZWxz ZSBpZiAoYXR0LT5hdHRpZGVudGl0eSA9PSBBVFRSSUJVVEVfSURFTlRJVFlfQUxXQVlTIHx8CisJ CQkJCSBhdHQtPmF0dGlkZW50aXR5ID09IEFUVFJJQlVURV9JREVOVElUWV9CWV9ERUZBVUxUKQor CQkJeworCQkJCWNvbnN0IGNoYXIgKmlka2luZCA9CisJCQkJCShhdHQtPmF0dGlkZW50aXR5ID09 IEFUVFJJQlVURV9JREVOVElUWV9BTFdBWVMpCisJCQkJCT8gIkFMV0FZUyIgOiAiQlkgREVGQVVM VCI7CisJCQkJT2lkCQkJc2VxaWQgPSBnZXRJZGVudGl0eVNlcXVlbmNlKHJlbCwgYXR0LT5hdHRu dW0sIHRydWUpOworCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgR0VORVJBVEVEICVzIEFT IElERU5USVRZIiwgaWRraW5kKTsKKworCQkJCS8qCisJCQkJICogRW1pdCBvbmx5IHRoZSBzZXF1 ZW5jZSBvcHRpb25zIHRoYXQgZGlmZmVyIGZyb20gdGhlaXIKKwkJCQkgKiBkZWZhdWx0cyAtIG1p cnJvcmluZyBwZ19nZXRfZGF0YWJhc2VfZGRsJ3MgcGF0dGVybiBvZgorCQkJCSAqIG9taXR0aW5n IHZhbHVlcyB0aGF0IHRoZSBzeXN0ZW0gd291bGQgcmVhcHBseSBvbiBpdHMgb3duLgorCQkJCSAq LworCQkJCWlmIChPaWRJc1ZhbGlkKHNlcWlkKSkKKwkJCQl7CisJCQkJCUhlYXBUdXBsZQlzZXFU dXAgPSBTZWFyY2hTeXNDYWNoZTEoU0VRUkVMSUQsCisJCQkJCQkJCQkJCQkJCSBPYmplY3RJZEdl dERhdHVtKHNlcWlkKSk7CisKKwkJCQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQoc2VxVHVwKSkKKwkJ CQkJeworCQkJCQkJRm9ybV9wZ19zZXF1ZW5jZSBzZXEgPSAoRm9ybV9wZ19zZXF1ZW5jZSkgR0VU U1RSVUNUKHNlcVR1cCk7CisJCQkJCQlTdHJpbmdJbmZvRGF0YSBvcHRzOworCQkJCQkJYm9vbAkJ Zmlyc3Rfb3B0ID0gdHJ1ZTsKKwkJCQkJCWludDY0CQlkZWZfbWluLAorCQkJCQkJCQkJZGVmX21h eCwKKwkJCQkJCQkJCWRlZl9zdGFydDsKKwkJCQkJCWludDY0CQl0eXBfbWluLAorCQkJCQkJCQkJ dHlwX21heDsKKworCQkJCQkJLyoKKwkJCQkJCSAqIFBlci10eXBlIGJvdW5kcyBmb3IgdGhlIHNl cXVlbmNlJ3MgdW5kZXJseWluZworCQkJCQkJICogaW50ZWdlciB0eXBlLiAgRGVmYXVsdHMgdG8g aW50OCBpZiB0aGUgY29sdW1uIHR5cGUKKwkJCQkJCSAqIGlzIHNvbWV0aGluZyBlbHNlIChzaG91 bGRuJ3QgaGFwcGVuIGZvciBJREVOVElUWSwKKwkJCQkJCSAqIGJ1dCBiZSBkZWZlbnNpdmUpLgor CQkJCQkJICovCisJCQkJCQlzd2l0Y2ggKGF0dC0+YXR0dHlwaWQpCisJCQkJCQl7CisJCQkJCQkJ Y2FzZSBJTlQyT0lEOgorCQkJCQkJCQl0eXBfbWluID0gUEdfSU5UMTZfTUlOOworCQkJCQkJCQl0 eXBfbWF4ID0gUEdfSU5UMTZfTUFYOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElOVDRP SUQ6CisJCQkJCQkJCXR5cF9taW4gPSBQR19JTlQzMl9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQ R19JTlQzMl9NQVg7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXR5 cF9taW4gPSBQR19JTlQ2NF9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQ2NF9NQVg7CisJ CQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgPiAw KQorCQkJCQkJeworCQkJCQkJCWRlZl9taW4gPSAxOworCQkJCQkJCWRlZl9tYXggPSB0eXBfbWF4 OworCQkJCQkJCWRlZl9zdGFydCA9IGRlZl9taW47CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJ CQl7CisJCQkJCQkJZGVmX21pbiA9IHR5cF9taW47CisJCQkJCQkJZGVmX21heCA9IC0xOworCQkJ CQkJCWRlZl9zdGFydCA9IGRlZl9tYXg7CisJCQkJCQl9CisKKwkJCQkJCWluaXRTdHJpbmdJbmZv KCZvcHRzKTsKKworCQkJCQkJLyoKKwkJCQkJCSAqIFNFUVVFTkNFIE5BTUUgLSBvbWl0IHdoZW4g aXQgbWF0Y2hlcyB0aGUgaW1wbGljaXQKKwkJCQkJCSAqICI8dGFibGVuYW1lPl88Y29sdW1ubmFt ZT5fc2VxIiBwYXR0ZXJuIGluIHRoZSBzYW1lCisJCQkJCQkgKiBzY2hlbWEsIHNpbmNlIENSRUFU RSBUQUJMRSB3aWxsIHJlZ2VuZXJhdGUgdGhhdAorCQkJCQkJICogZXhhY3QgbmFtZS4gIFRoZSBz ZXF1ZW5jZSBpcyBhbiBJTlRFUk5BTCBkZXBlbmRlbmN5CisJCQkJCQkgKiBvZiB0aGUgY29sdW1u LCBzbyB0aGUgbG9jayB3ZSBob2xkIG9uIHRoZSB0YWJsZQorCQkJCQkJICogYWxzbyBwaW5zIGl0 LCBidXQgdGhlIGxvb2t1cCBoZWxwZXIgc3RpbGwgZGVmZW5kcworCQkJCQkJICogYWdhaW5zdCBh IG1pc3NpbmcgcGdfY2xhc3Mgcm93LgorCQkJCQkJICovCisJCQkJCQl7CisJCQkJCQkJSGVhcFR1 cGxlCXNlcUNsYXNzVHVwOworCQkJCQkJCUZvcm1fcGdfY2xhc3Mgc2VxQ2xhc3M7CisJCQkJCQkJ Y2hhcgkJYXV0b25hbWVbTkFNRURBVEFMRU5dOworCisJCQkJCQkJc2VxQ2xhc3NUdXAgPSBTZWFy Y2hTeXNDYWNoZTEoUkVMT0lELAorCQkJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0oc2Vx aWQpKTsKKwkJCQkJCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoc2VxQ2xhc3NUdXApKQorCQkJCQkJ CQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09C SkVDVCksCisJCQkJCQkJCQkJIGVycm1zZygiaWRlbnRpdHkgc2VxdWVuY2Ugd2l0aCBPSUQgJXUg ZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCQkJCQkJc2VxaWQpLAorCQkJCQkJCQkJCSBlcnJkZXRh aWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwkJCQkJCQlz ZXFDbGFzcyA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qoc2VxQ2xhc3NUdXApOworCisJCQkJ CQkJc25wcmludGYoYXV0b25hbWUsIHNpemVvZihhdXRvbmFtZSksICIlc18lc19zZXEiLAorCQkJ CQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkgTmFtZVN0cihh dHQtPmF0dG5hbWUpKTsKKwkJCQkJCQlpZiAoc2VxQ2xhc3MtPnJlbG5hbWVzcGFjZSAhPSBSZWxh dGlvbkdldE5hbWVzcGFjZShyZWwpIHx8CisJCQkJCQkJCXN0cmNtcChOYW1lU3RyKHNlcUNsYXNz LT5yZWxuYW1lKSwgYXV0b25hbWUpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQljaGFyCSAgICpz ZXFRdWFsID0KKwkJCQkJCQkJCWxvb2t1cF9yZWxuYW1lX2Zvcl9lbWl0KHNlcWlkLAorCQkJCQkJ CQkJCQkJCQkJc2NoZW1hX3F1YWxpZmllZCwKKwkJCQkJCQkJCQkJCQkJCWJhc2VfbmFtZXNwYWNl KTsKKworCQkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNTRVFVRU5DRSBOQU1FICVz IiwKKwkJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxUXVhbCk7CisJCQkJCQkJ CWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJCQlwZnJlZShzZXFRdWFsKTsKKwkJCQkJCQl9CisJ CQkJCQkJUmVsZWFzZVN5c0NhY2hlKHNlcUNsYXNzVHVwKTsKKwkJCQkJCX0KKworCQkJCQkJaWYg KHNlcS0+c2Vxc3RhcnQgIT0gZGVmX3N0YXJ0KQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmlu Z0luZm8oJm9wdHMsICIlc1NUQVJUIFdJVEggIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBm aXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFzdGFydCk7CisJCQkJCQkJZmlyc3Rfb3B0ID0g ZmFsc2U7CisJCQkJCQl9CisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgIT0gMSkKKwkJCQkJ CXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNJTkNSRU1FTlQgQlkgIiBJTlQ2 NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFpbmNy ZW1lbnQpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNl cS0+c2VxbWluICE9IGRlZl9taW4pCisJCQkJCQl7CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygm b3B0cywgIiVzTUlOVkFMVUUgIiBJTlQ2NF9GT1JNQVQsCisJCQkJCQkJCQkJCSBmaXJzdF9vcHQg PyAiIiA6ICIgIiwgc2VxLT5zZXFtaW4pOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJ CQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxbWF4ICE9IGRlZl9tYXgpCisJCQkJCQl7CisJCQkJCQkJ YXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzTUFYVkFMVUUgIiBJTlQ2NF9GT1JNQVQsCisJCQkJ CQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFtYXgpOworCQkJCQkJCWZpcnN0 X29wdCA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxY2FjaGUgIT0gMSkKKwkJ CQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNDQUNIRSAiIElOVDY0X0ZP Uk1BVCwKKwkJCQkJCQkJCQkJIGZpcnN0X29wdCA/ICIiIDogIiAiLCBzZXEtPnNlcWNhY2hlKTsK KwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWN5 Y2xlKQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMsICIlc0NZQ0xFIiwg Zmlyc3Rfb3B0ID8gIiIgOiAiICIpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNlOworCQkJCQkJ fQorCisJCQkJCQlpZiAoIWZpcnN0X29wdCkKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg IiAoJXMpIiwgb3B0cy5kYXRhKTsKKworCQkJCQkJcGZyZWUob3B0cy5kYXRhKTsKKwkJCQkJCVJl bGVhc2VTeXNDYWNoZShzZXFUdXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAo ZGVmZXhwcikKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiBERUZBVUxUICVzIiwgZGVmZXhw cik7CisKKwkJCWlmIChkZWZleHByKQorCQkJCXBmcmVlKGRlZmV4cHIpOworCQl9CisKKwkJaWYg KGF0dC0+YXR0bm90bnVsbCkKKwkJeworCQkJTG9jYWxOb3ROdWxsRW50cnkgKm5uID0gJm5uX2Vu dHJpZXNbYXR0LT5hdHRudW1dOworCisJCQlpZiAobm4tPm5hbWUgIT0gTlVMTCAmJiAhbm4tPmlz X2F1dG8pCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09OU1RSQUlOVCAlcyBOT1QgTlVM TCIsCisJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKG5uLT5uYW1lKSk7CisJCQllbHNlCisJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgTk9UIE5VTEwiKTsKKwkJCWlmIChubi0+bmFt ZSAhPSBOVUxMICYmIG5uLT5ub19pbmhlcml0KQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmco YnVmLCAiIE5PIElOSEVSSVQiKTsKKwkJfQorCX0KKworCS8qCisJICogVGFibGUtbGV2ZWwgQ0hF Q0sgY29uc3RyYWludHMgLSBlbWl0dGVkIGlubGluZSBpbiB0aGUgQ1JFQVRFIFRBQkxFIGJvZHkK KwkgKiBzbyB0aGV5IGFwcGVhciBhbG9uZ3NpZGUgdGhlIGNvbHVtbnMgKHRoZSBwZ19kdW1wIHNo YXBlKS4gIFRoZQorCSAqIGNvbnN0cmFpbnQgbG9vcCBsYXRlciBpbiBwZ19nZXRfdGFibGVfZGRs X2ludGVybmFsIHNraXBzIENIRUNLCisJICogY29uc3RyYWludHMgdG8gYXZvaWQgZG91YmxlLWVt aXNzaW9uLgorCSAqLworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlhcHBlbmRfaW5saW5l X2NoZWNrX2NvbnN0cmFpbnRzKGJ1ZiwgcmVsLCBwcmV0dHksICZmaXJzdCk7Cit9CisKKy8qCisg KiBhcHBlbmRfdHlwZWRfY29sdW1uX292ZXJyaWRlcworICoJCUZvciBhIHR5cGVkIHRhYmxlIChD UkVBVEUgVEFCTEUgLi4uIE9GIHR5cGVfbmFtZSksIGFwcGVuZCB0aGUKKyAqCQlvcHRpb25hbCAi KGNvbCBXSVRIIE9QVElPTlMgLi4uLCAuLi4pIiBsaXN0IGNhcnJ5aW5nIGxvY2FsbHkKKyAqCQlh cHBsaWVkIHBlci1jb2x1bW4gb3ZlcnJpZGVzIC0gREVGQVVMVCwgTk9UIE5VTEwsIGFuZCBhbnkg bG9jYWxseQorICoJCWRlY2xhcmVkIENIRUNLIGNvbnN0cmFpbnRzLgorICoKKyAqIENvbHVtbnMg d2hvc2UgdHlwZSBpcyBmdWxseSBkaWN0YXRlZCBieSByZWxvZnR5cGUgZW1pdCBub3RoaW5nLiAg VGhlCisgKiBwYXJlbnRoZXNpc2VkIGxpc3QgaXMgc3VwcHJlc3NlZCBlbnRpcmVseSB3aGVuIG5v IGNvbHVtbiBuZWVkcyBhbgorICogb3ZlcnJpZGUgYW5kIHRoZXJlIGFyZSBubyBsb2NhbGx5LWRl Y2xhcmVkIENIRUNLIGNvbnN0cmFpbnRzLCBtYXRjaGluZworICogdGhlIGNhbm9uaWNhbCAiQ1JF QVRFIFRBQkxFIHggT0YgdDsiIHNoYXBlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX3R5cGVk X2NvbHVtbl9vdmVycmlkZXMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBwcmV0 dHksCisJCQkJCQkJICBib29sIGluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJICBMb2NhbE5v dE51bGxFbnRyeSAqIG5uX2VudHJpZXMpCit7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBSZWxhdGlv bkdldERlc2NyKHJlbCk7CisJTGlzdAkgICAqZHBjb250ZXh0ID0gTklMOworCVN0cmluZ0luZm9E YXRhIGlubmVyOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKworCWluaXRTdHJpbmdJbmZvKCZpbm5l cik7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJeworCQlG b3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOworCQljaGFy CSAgICpkZWZleHByID0gTlVMTDsKKwkJYm9vbAkJaGFzX2RlZmF1bHQ7CisJCWJvb2wJCWhhc19u b3RudWxsOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCWNvbnRpbnVlOworCisJCWlm IChhdHQtPmF0dGhhc2RlZikKKwkJCWRlZmV4cHIgPSBmaW5kX2F0dHJkZWZfdGV4dChyZWwsIGF0 dC0+YXR0bnVtLCAmZHBjb250ZXh0KTsKKworCQloYXNfZGVmYXVsdCA9IChkZWZleHByICE9IE5V TEwpOworCQloYXNfbm90bnVsbCA9IGF0dC0+YXR0bm90bnVsbDsKKworCQlpZiAoIWhhc19kZWZh dWx0ICYmICFoYXNfbm90bnVsbCkKKwkJeworCQkJaWYgKGRlZmV4cHIpCisJCQkJcGZyZWUoZGVm ZXhwcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcigmaW5uZXIsICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisJCWlmIChwcmV0dHkp CisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZpbm5lciwgIlxuICAgICIpOworCQllbHNlCisJ CQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmaW5uZXIsICcgJyk7CisKKwkJYXBwZW5kU3RyaW5nSW5m bygmaW5uZXIsICIlcyBXSVRIIE9QVElPTlMiLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFt ZVN0cihhdHQtPmF0dG5hbWUpKSk7CisJCWlmIChoYXNfZGVmYXVsdCkKKwkJCWFwcGVuZFN0cmlu Z0luZm8oJmlubmVyLCAiIERFRkFVTFQgJXMiLCBkZWZleHByKTsKKwkJaWYgKGhhc19ub3RudWxs KQorCQl7CisJCQlMb2NhbE5vdE51bGxFbnRyeSAqbm4gPSAmbm5fZW50cmllc1thdHQtPmF0dG51 bV07CisKKwkJCWlmIChubi0+bmFtZSAhPSBOVUxMICYmICFubi0+aXNfYXV0bykKKwkJCQlhcHBl bmRTdHJpbmdJbmZvKCZpbm5lciwgIiBDT05TVFJBSU5UICVzIE5PVCBOVUxMIiwKKwkJCQkJCQkJ IHF1b3RlX2lkZW50aWZpZXIobm4tPm5hbWUpKTsKKwkJCWVsc2UKKwkJCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKCZpbm5lciwgIiBOT1QgTlVMTCIpOworCQkJaWYgKG5uLT5uYW1lICE9IE5VTEwg JiYgbm4tPm5vX2luaGVyaXQpCisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICIg Tk8gSU5IRVJJVCIpOworCQl9CisKKwkJaWYgKGRlZmV4cHIpCisJCQlwZnJlZShkZWZleHByKTsK Kwl9CisKKwkvKgorCSAqIExvY2FsbHktZGVjbGFyZWQgQ0hFQ0sgY29uc3RyYWludHMgb24gYSB0 eXBlZCB0YWJsZSBiZWxvbmcgaW4gdGhlCisJICogY29sdW1uLWxpc3QgcGFyZW50aGVzZXMsIHNh bWUgYXMgZm9yIGFuIHVudHlwZWQgdGFibGUuICBUaGUgb3V0LW9mLWxpbmUKKwkgKiBjb25zdHJh aW50IGxvb3AgbGF0ZXIgc3RpbGwgc2tpcHMgQ0hFQ0tzLgorCSAqLworCWlmIChpbmNsdWRlX2Nv bnN0cmFpbnRzKQorCQlhcHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRzKCZpbm5lciwgcmVs LCBwcmV0dHksICZmaXJzdCk7CisKKwlpZiAoIWZpcnN0KQorCXsKKwkJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgKCIpOworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgaW5uZXIu ZGF0YSk7CisJCWlmIChwcmV0dHkpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxu KSIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJfQorCXBm cmVlKGlubmVyLmRhdGEpOworfQorCisvKgorICogYXBwZW5kX3N0bXQgLyBhcHBlbmRfc3RyaXBw ZWRfc3RtdAorICoJCVB1c2ggY3R4LT5idWYgb250byBjdHgtPnN0YXRlbWVudHMuCisgKgorICog YXBwZW5kX3N0bXQgaXMgdXNlZCBmb3IgZW1pc3Npb25zIHdoZXJlIHRoZSB0YWJsZSByZWZlcmVu Y2UgaXMgYnVpbHQKKyAqIGZyb20gY3R4LT5xdWFsbmFtZSAoYWxyZWFkeSBwYXJ0aWFsLXF1YWxp ZmllZCBwZXIgc2NoZW1hX3F1YWxpZmllZCkuCisgKiBhcHBlbmRfc3RyaXBwZWRfc3RtdCBpcyB1 c2VkIGFmdGVyIGludm9raW5nIGFsd2F5cy1xdWFsaWZpZWQgcnVsZXV0aWxzCisgKiBoZWxwZXJz IChwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBwZ19nZXRfaW5kZXhkZWZfc3RyaW5nLAor ICogcGdfZ2V0X3J1bGVkZWYsIHBnX2dldF9zdGF0aXN0aWNzb2JqZGVmX3N0cmluZykgLSB3aGVu CisgKiBzY2hlbWFfcXVhbGlmaWVkIGlzIGZhbHNlLCB0aGUgYmFzZS1zY2hlbWEgcHJlZml4IGlz IHN0cmlwcGVkIGZyb20KKyAqIHRoZWlyIG91dHB1dCBzbyB0aGUgZW1pdHRlZCBEREwgaXMgcmVw bGF5LXJlbG9jYXRhYmxlLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kX3N0bXQoVGFibGVEZGxD b250ZXh0ICogY3R4KQoreworCWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1l bnRzLCBwc3RyZHVwKGN0eC0+YnVmLmRhdGEpKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9z dHJpcHBlZF9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoY3R4LT5zY2hlbWFf cHJlZml4ICE9IE5VTEwpCisJCWN0eC0+c3RhdGVtZW50cyA9IGxhcHBlbmQoY3R4LT5zdGF0ZW1l bnRzLAorCQkJCQkJCQkgIHN0cmlwX3NjaGVtYV9wcmVmaXgoY3R4LT5idWYuZGF0YSwKKwkJCQkJ CQkJCQkJCQkgIGN0eC0+c2NoZW1hX3ByZWZpeCkpOworCWVsc2UKKwkJY3R4LT5zdGF0ZW1lbnRz ID0gbGFwcGVuZChjdHgtPnN0YXRlbWVudHMsIHBzdHJkdXAoY3R4LT5idWYuZGF0YSkpOworfQor CisvKgorICogZW1pdF9jcmVhdGVfdGFibGVfc3RtdAorICoJCUJ1aWxkIHRoZSBsZWFkaW5nIENS RUFURSBUQUJMRSBzdGF0ZW1lbnQsIGluY2x1ZGluZyBwZXJzaXN0ZW5jZQorICoJCShURU1QT1JB UlkgLyBVTkxPR0dFRCksIGJvZHkgKGNvbHVtbiBsaXN0IC8gT0YgdHlwZV9uYW1lIC8KKyAqCQlQ QVJUSVRJT04gT0YgcGFyZW50KSwgSU5IRVJJVFMsIFBBUlRJVElPTiBCWSwgVVNJTkcgbWV0aG9k LAorICoJCVdJVEggKHJlbG9wdGlvbnMpLCBUQUJMRVNQQUNFLCBhbmQgT04gQ09NTUlULgorICov CitzdGF0aWMgdm9pZAorZW1pdF9jcmVhdGVfdGFibGVfc3RtdChUYWJsZURkbENvbnRleHQgKiBj dHgpCit7CisJUmVsYXRpb24JcmVsID0gY3R4LT5yZWw7CisJY2hhcgkJcmVscGVyc2lzdGVuY2Ug PSByZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVuY2U7CisJY2hhcgkJcmVsa2luZCA9IHJlbC0+cmRf cmVsLT5yZWxraW5kOworCWJvb2wJCWlzX3R5cGVkID0gT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+ cmVsb2Z0eXBlKTsKKwlIZWFwVHVwbGUJY2xhc3N0dXA7CisJRGF0dW0JCXJlbG9wdERhdHVtOwor CWJvb2wJCXJlbG9wdElzbnVsbDsKKworCWNsYXNzdHVwID0gU2VhcmNoU3lzQ2FjaGUxKFJFTE9J RCwgT2JqZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlk KGNsYXNzdHVwKSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIHJlbGF0 aW9uICV1IiwgY3R4LT5yZWxpZCk7CisKKwlyZWxvcHREYXR1bSA9IFN5c0NhY2hlR2V0QXR0cihS RUxPSUQsIGNsYXNzdHVwLAorCQkJCQkJCQkgIEFudW1fcGdfY2xhc3NfcmVsb3B0aW9ucywgJnJl bG9wdElzbnVsbCk7CisKKwlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIkNSRUFURSAiKTsKKwlpZiAocmVscGVyc2lzdGVuY2Ug PT0gUkVMUEVSU0lTVEVOQ0VfVEVNUCkKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5i dWYsICJURU1QT1JBUlkgIik7CisJZWxzZSBpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lT VEVOQ0VfVU5MT0dHRUQpCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiVU5M T0dHRUQgIik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJUQUJMRSAlcyIsIGN0eC0+ cXVhbG5hbWUpOworCisJaWYgKHJlbC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbikKKwl7CisJCU9p ZAkJCXBhcmVudE9pZCA9IGdldF9wYXJ0aXRpb25fcGFyZW50KGN0eC0+cmVsaWQsIHRydWUpOwor CQljaGFyCSAgICpwYXJlbnRRdWFsID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQocGFyZW50T2lk LAorCQkJCQkJCQkJCQkJCQkgY3R4LT5zY2hlbWFfcXVhbGlmaWVkLAorCQkJCQkJCQkJCQkJCQkg Y3R4LT5iYXNlX25hbWVzcGFjZSk7CisJCWNoYXIJICAgKnBhcmVudFJlbG5hbWUgPSBnZXRfcmVs X25hbWUocGFyZW50T2lkKTsKKwkJRGF0dW0JCWJvdW5kRGF0dW07CisJCWJvb2wJCWJvdW5kSXNu dWxsOworCQljaGFyCSAgICpmb3JWYWx1ZXMgPSBOVUxMOworCQljaGFyCSAgICpib3VuZFN0ciA9 IE5VTEw7CisKKwkJaWYgKHBhcmVudFJlbG5hbWUgPT0gTlVMTCkKKwkJCWVyZXBvcnQoRVJST1Is CisJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJCSBlcnJtc2co InBhcnRpdGlvbiBwYXJlbnQgd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCXBh cmVudE9pZCksCisJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5 IGRyb3BwZWQuIikpKTsKKworCQlib3VuZERhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFJFTE9JRCwg Y2xhc3N0dXAsCisJCQkJCQkJCQkgQW51bV9wZ19jbGFzc19yZWxwYXJ0Ym91bmQsICZib3VuZElz bnVsbCk7CisJCWlmICghYm91bmRJc251bGwpCisJCXsKKwkJCU5vZGUJICAgKmJvdW5kTm9kZTsK KwkJCUxpc3QJICAgKmRwY29udGV4dDsKKworCQkJYm91bmRTdHIgPSBUZXh0RGF0dW1HZXRDU3Ry aW5nKGJvdW5kRGF0dW0pOworCQkJYm91bmROb2RlID0gc3RyaW5nVG9Ob2RlKGJvdW5kU3RyKTsK KwkJCWRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9mb3IocGFyZW50UmVsbmFtZSwgcGFyZW50 T2lkKTsKKwkJCWZvclZhbHVlcyA9IGRlcGFyc2VfZXhwcmVzc2lvbihib3VuZE5vZGUsIGRwY29u dGV4dCwgZmFsc2UsIGZhbHNlKTsKKwkJfQorCisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVm LCAiIFBBUlRJVElPTiBPRiAlcyAlcyIsCisJCQkJCQkgcGFyZW50UXVhbCwgZm9yVmFsdWVzID8g Zm9yVmFsdWVzIDogIkRFRkFVTFQiKTsKKwkJaWYgKGZvclZhbHVlcykKKwkJCXBmcmVlKGZvclZh bHVlcyk7CisJCWlmIChib3VuZFN0cikKKwkJCXBmcmVlKGJvdW5kU3RyKTsKKwkJcGZyZWUocGFy ZW50UXVhbCk7CisJCXBmcmVlKHBhcmVudFJlbG5hbWUpOworCX0KKwllbHNlIGlmIChpc190eXBl ZCkKKwl7CisJCWNoYXIJICAgKnR5cG5hbWUgPSBmb3JtYXRfdHlwZV9iZV9xdWFsaWZpZWQocmVs LT5yZF9yZWwtPnJlbG9mdHlwZSk7CisKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIg T0YgJXMiLCB0eXBuYW1lKTsKKwkJcGZyZWUodHlwbmFtZSk7CisKKwkJYXBwZW5kX3R5cGVkX2Nv bHVtbl9vdmVycmlkZXMoJmN0eC0+YnVmLCByZWwsIGN0eC0+cHJldHR5LAorCQkJCQkJCQkJICBj dHgtPmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJCQkJCQkgIGN0eC0+bm5fZW50cmllcyk7CisJ fQorCWVsc2UKKwl7CisJCUxpc3QJICAgKnBhcmVudHM7CisJCUxpc3RDZWxsICAgKmxjOworCQli b29sCQlmaXJzdDsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiAoIik7 CisKKwkJYXBwZW5kX2NvbHVtbl9kZWZzKCZjdHgtPmJ1ZiwgcmVsLCBjdHgtPnByZXR0eSwKKwkJ CQkJCSAgIGN0eC0+aW5jbHVkZV9jb25zdHJhaW50cywKKwkJCQkJCSAgIGN0eC0+c2NoZW1hX3F1 YWxpZmllZCwgY3R4LT5ubl9lbnRyaWVzKTsKKworCQlpZiAoY3R4LT5wcmV0dHkpCisJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlhcHBlbmRT dHJpbmdJbmZvQ2hhcigmY3R4LT5idWYsICcpJyk7CisKKwkJcGFyZW50cyA9IGZpbmRfaW5oZXJp dGFuY2VfcGFyZW50cyhjdHgtPnJlbGlkLCBOb0xvY2spOworCQlpZiAocGFyZW50cyAhPSBOSUwp CisJCXsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAiIElOSEVSSVRTICgi KTsKKwkJCWZpcnN0ID0gdHJ1ZTsKKwkJCWZvcmVhY2gobGMsIHBhcmVudHMpCisJCQl7CisJCQkJ T2lkCQkJcG9pZCA9IGxmaXJzdF9vaWQobGMpOworCQkJCWNoYXIJICAgKnBuYW1lID0gbG9va3Vw X3JlbG5hbWVfZm9yX2VtaXQocG9pZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+c2NoZW1hX3F1YWxp ZmllZCwKKwkJCQkJCQkJCQkJCQkJCWN0eC0+YmFzZV9uYW1lc3BhY2UpOworCisJCQkJaWYgKCFm aXJzdCkKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICIsICIpOworCQkJ CWZpcnN0ID0gZmFsc2U7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsIHBu YW1lKTsKKwkJCQlwZnJlZShwbmFtZSk7CisJCQl9CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigm Y3R4LT5idWYsICcpJyk7CisJCQlsaXN0X2ZyZWUocGFyZW50cyk7CisJCX0KKwl9CisKKwlpZiAo cmVsa2luZCA9PSBSRUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFKQorCXsKKwkJRGF0dW0JCXBhcnRr ZXlEYXR1bTsKKwkJY2hhcgkgICAqcGFydGtleTsKKworCQlwYXJ0a2V5RGF0dW0gPSBPaWRGdW5j dGlvbkNhbGwxKEZfUEdfR0VUX1BBUlRLRVlERUYsCisJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1 bShjdHgtPnJlbGlkKSk7CisJCXBhcnRrZXkgPSBUZXh0RGF0dW1HZXRDU3RyaW5nKHBhcnRrZXlE YXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFBBUlRJVElPTiBCWSAlcyIs IHBhcnRrZXkpOworCQlwZnJlZShwYXJ0a2V5KTsKKwl9CisKKwlpZiAoT2lkSXNWYWxpZChyZWwt PnJkX3JlbC0+cmVsYW0pICYmCisJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxFX0FN X09JRCkKKwl7CisJCWNoYXIJICAgKmFtbmFtZSA9IGdldF9hbV9uYW1lKHJlbC0+cmRfcmVsLT5y ZWxhbSk7CisKKwkJaWYgKGFtbmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZv KCZjdHgtPmJ1ZiwgIiBVU0lORyAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoYW1uYW1l KSk7CisJCQlwZnJlZShhbW5hbWUpOworCQl9CisJfQorCisJaWYgKCFyZWxvcHRJc251bGwpCisJ eworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZjdHgtPmJ1ZiwgIiBXSVRIICgiKTsKKwkJZ2V0 X3JlbG9wdGlvbnMoJmN0eC0+YnVmLCByZWxvcHREYXR1bSk7CisJCWFwcGVuZFN0cmluZ0luZm9D aGFyKCZjdHgtPmJ1ZiwgJyknKTsKKwl9CisKKwlSZWxlYXNlU3lzQ2FjaGUoY2xhc3N0dXApOwor CisJaWYgKCFjdHgtPm5vX3RhYmxlc3BhY2UgJiYgT2lkSXNWYWxpZChyZWwtPnJkX3JlbC0+cmVs dGFibGVzcGFjZSkpCisJeworCQljaGFyCSAgICp0c25hbWUgPSBnZXRfdGFibGVzcGFjZV9uYW1l KHJlbC0+cmRfcmVsLT5yZWx0YWJsZXNwYWNlKTsKKworCQlpZiAodHNuYW1lICE9IE5VTEwpCisJ CXsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLCAiIFRBQkxFU1BBQ0UgJXMiLAorCQkJ CQkJCSBxdW90ZV9pZGVudGlmaWVyKHRzbmFtZSkpOworCQkJcGZyZWUodHNuYW1lKTsKKwkJfQor CX0KKworCWlmIChyZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNURU5DRV9URU1QKQorCXsKKwkJ T25Db21taXRBY3Rpb24gb2MgPSBnZXRfb25fY29tbWl0X2FjdGlvbihjdHgtPnJlbGlkKTsKKwor CQlpZiAob2MgPT0gT05DT01NSVRfREVMRVRFX1JPV1MpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3Ry aW5nKCZjdHgtPmJ1ZiwgIiBPTiBDT01NSVQgREVMRVRFIFJPV1MiKTsKKwkJZWxzZSBpZiAob2Mg PT0gT05DT01NSVRfRFJPUCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmN0eC0+YnVmLCAi IE9OIENPTU1JVCBEUk9QIik7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmN0eC0+YnVm LCAnOycpOworCWFwcGVuZF9zdG10KGN0eCk7Cit9CisKKy8qCisgKiBlbWl0X293bmVyX3N0bXQK KyAqCQlBTFRFUiBUQUJMRSBxdWFsbmFtZSBPV05FUiBUTyByb2xlLgorICovCitzdGF0aWMgdm9p ZAorZW1pdF9vd25lcl9zdG10KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwljaGFyCSAgICpv d25lcjsKKworCWlmIChjdHgtPm5vX293bmVyKQorCQlyZXR1cm47CisKKwlvd25lciA9IEdldFVz ZXJOYW1lRnJvbUlkKGN0eC0+cmVsLT5yZF9yZWwtPnJlbG93bmVyLCBmYWxzZSk7CisJcmVzZXRT dHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICJBTFRF UiBUQUJMRSAlcyBPV05FUiBUTyAlczsiLAorCQkJCQkgY3R4LT5xdWFsbmFtZSwgcXVvdGVfaWRl bnRpZmllcihvd25lcikpOworCWFwcGVuZF9zdG10KGN0eCk7CisJcGZyZWUob3duZXIpOworfQor CisvKgorICogZW1pdF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcworICoJCUFMVEVSIFRBQkxFIHF1 YWxuYW1lIEFMVEVSIENPTFVNTiBjb2wgU0VUIERFRkFVTFQgZXhwciAtIG9uZSBwZXIKKyAqCQlp bmhlcml0ZWQgKGF0dGlzbG9jYWw9ZmFsc2UpIG5vbi1nZW5lcmF0ZWQgY29sdW1uIGNhcnJ5aW5n IGEKKyAqCQlsb2NhbGx5LXNldCBkZWZhdWx0LiAgR2VuZXJhdGVkIGNvbHVtbnMgYXJlIHNraXBw ZWQ6IHRoZWlyCisgKgkJZXhwcmVzc2lvbiBpcyBpbmhlcml0ZWQgYXV0b21hdGljYWxseSBhbmQg U0VUIERFRkFVTFQgd291bGQKKyAqCQlmYWlsIGF0IHJlcGxheS4KKyAqLworc3RhdGljIHZvaWQK K2VtaXRfY2hpbGRfZGVmYXVsdF9vdmVycmlkZXMoVGFibGVEZGxDb250ZXh0ICogY3R4KQorewor CVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihjdHgtPnJlbCk7CisJTGlzdAkg ICAqZHBjb250ZXh0ID0gTklMOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0 czsgaSsrKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBk ZXNjLCBpKTsKKwkJY2hhcgkgICAqZGVmc3RyOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCB8 fCBhdHQtPmF0dGlzbG9jYWwgfHwgIWF0dC0+YXR0aGFzZGVmKQorCQkJY29udGludWU7CisJCWlm IChhdHQtPmF0dGdlbmVyYXRlZCAhPSAnXDAnKQorCQkJY29udGludWU7CisKKwkJZGVmc3RyID0g ZmluZF9hdHRyZGVmX3RleHQoY3R4LT5yZWwsIGF0dC0+YXR0bnVtLCAmZHBjb250ZXh0KTsKKwkJ aWYgKGRlZnN0ciA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcmVzZXRTdHJpbmdJbmZvKCZj dHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVmLAorCQkJCQkJICJBTFRFUiBU QUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUIERFRkFVTFQgJXM7IiwKKwkJCQkJCSBjdHgtPnF1 YWxuYW1lLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQtPmF0dG5hbWUpKSwK KwkJCQkJCSBkZWZzdHIpOworCQlhcHBlbmRfc3RtdChjdHgpOworCQlwZnJlZShkZWZzdHIpOwor CX0KK30KKworLyoKKyAqIGVtaXRfYXR0b3B0aW9ucworICoJCUFMVEVSIFRBQkxFIHF1YWxuYW1l IEFMVEVSIENPTFVNTiBjb2wgU0VUICguLi4pIC0gb25lIHBlciBjb2x1bW4KKyAqCQl3aXRoIG5v bi1udWxsIHBnX2F0dHJpYnV0ZS5hdHRvcHRpb25zLiAgVGhlIGlubGluZSBmb3JtIG9mIHRoZXNl CisgKgkJb3B0aW9ucyBpc24ndCBhdmFpbGFibGUgaW4gQ1JFQVRFIFRBQkxFLCBzbyB0aGV5IGNv bWUgb3V0IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCitlbWl0X2F0dG9wdGlvbnMoVGFibGVEZGxD b250ZXh0ICogY3R4KQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihj dHgtPnJlbCk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJ eworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOwor CQlIZWFwVHVwbGUJYXR0VHVwOworCQlEYXR1bQkJb3B0RGF0dW07CisJCWJvb2wJCW9wdElzbnVs bDsKKworCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQlhdHRUdXAg PSBTZWFyY2hTeXNDYWNoZTIoQVRUTlVNLAorCQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShjdHgt PnJlbGlkKSwKKwkJCQkJCQkJIEludDE2R2V0RGF0dW0oYXR0LT5hdHRudW0pKTsKKwkJaWYgKCFI ZWFwVHVwbGVJc1ZhbGlkKGF0dFR1cCkpCisJCQljb250aW51ZTsKKworCQlvcHREYXR1bSA9IFN5 c0NhY2hlR2V0QXR0cihBVFROVU0sIGF0dFR1cCwKKwkJCQkJCQkJICAgQW51bV9wZ19hdHRyaWJ1 dGVfYXR0b3B0aW9ucywgJm9wdElzbnVsbCk7CisJCWlmICghb3B0SXNudWxsKQorCQl7CisJCQly ZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+YnVm LAorCQkJCQkJCSAiQUxURVIgVEFCTEUgJXMgQUxURVIgQ09MVU1OICVzIFNFVCAoIiwKKwkJCQkJ CQkgY3R4LT5xdWFsbmFtZSwKKwkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihOYW1lU3RyKGF0dC0+ YXR0bmFtZSkpKTsKKwkJCWdldF9yZWxvcHRpb25zKCZjdHgtPmJ1Ziwgb3B0RGF0dW0pOworCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsICIpOyIpOworCQkJYXBwZW5kX3N0bXQo Y3R4KTsKKwkJfQorCQlSZWxlYXNlU3lzQ2FjaGUoYXR0VHVwKTsKKwl9Cit9CisKKy8qCisgKiBl bWl0X2luZGV4ZXMKKyAqCQlDUkVBVEUgSU5ERVggcGVyIG5vbi1jb25zdHJhaW50LWJhY2tlZCBp bmRleCBvbiB0aGUgcmVsYXRpb24uCisgKgkJSW5kZXhlcyB0aGF0IGJhY2sgUEsgLyBVTklRVUUg LyBFWENMVURFIGNvbnN0cmFpbnRzIGFyZSBlbWl0dGVkCisgKgkJb3V0LW9mLWxpbmUgYnkgZW1p dF9sb2NhbF9jb25zdHJhaW50cyAodGhlIEFMVEVSIFRBQkxFIC4uLiBBREQKKyAqCQlDT05TVFJB SU5UIHN0YXRlbWVudCBjcmVhdGVzIHRoZSBpbmRleCBpbXBsaWNpdGx5KS4KKyAqLworc3RhdGlj IHZvaWQKK2VtaXRfaW5kZXhlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJTGlzdAkgICAq aW5kZXhvaWRzOworCUxpc3RDZWxsICAgKmxjOworCisJaWYgKCFjdHgtPmluY2x1ZGVfaW5kZXhl cykKKwkJcmV0dXJuOworCisJaW5kZXhvaWRzID0gUmVsYXRpb25HZXRJbmRleExpc3QoY3R4LT5y ZWwpOworCWZvcmVhY2gobGMsIGluZGV4b2lkcykKKwl7CisJCU9pZAkJCWlkeG9pZCA9IGxmaXJz dF9vaWQobGMpOworCQljaGFyCSAgICppZHhkZWY7CisKKwkJaWYgKE9pZElzVmFsaWQoZ2V0X2lu ZGV4X2NvbnN0cmFpbnQoaWR4b2lkKSkpCisJCQljb250aW51ZTsKKworCQlpZHhkZWYgPSBwZ19n ZXRfaW5kZXhkZWZfc3RyaW5nKGlkeG9pZCk7CisJCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYp OworCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwgIiVzOyIsIGlkeGRlZik7CisJCWFwcGVu ZF9zdHJpcHBlZF9zdG10KGN0eCk7CisJCXBmcmVlKGlkeGRlZik7CisJfQorCWxpc3RfZnJlZShp bmRleG9pZHMpOworfQorCisvKgorICogZW1pdF9sb2NhbF9jb25zdHJhaW50cworICoJCUFMVEVS IFRBQkxFIC4uLiBBREQgQ09OU1RSQUlOVCBmb3IgZWFjaCBsb2NhbGx5LWRlZmluZWQgY29uc3Ry YWludAorICoJCW9uIHRoZSByZWxhdGlvbi4gIEluaGVyaXRlZCBjb25zdHJhaW50cyAoY29uaXNs b2NhbD1mYWxzZSkgY29tZQorICoJCWZyb20gdGhlIHBhcmVudCdzIERETC4gIENIRUNLIGNvbnN0 cmFpbnRzIGFyZSBlbWl0dGVkIGlubGluZSBmb3IKKyAqCQlyZWd1bGFyL3R5cGVkIHRhYmxlcyAo c2tpcCBoZXJlKSBidXQgb3V0LW9mLWxpbmUgZm9yIHBhcnRpdGlvbgorICoJCWNoaWxkcmVuIChu byBjb2x1bW4gbGlzdCB0byBsaXZlIGluKS4gIFVzZXItbmFtZWQgTk9UIE5VTEwKKyAqCQljb25z dHJhaW50cyBhcmUgZW1pdHRlZCBpbmxpbmUgYnkgdGhlIGNvbHVtbi1lbWl0IGhlbHBlcnMgYW5k CisgKgkJYXJlIHNraXBwZWQgdmlhIHNraXBfbm90bnVsbF9vaWRzOyBhdXRvLW5hbWVkIE5PVCBO VUxMcyBmYWxsCisgKgkJdGhyb3VnaCBoZXJlIGFuZCBhcmUgZGVkdXAnZCBieSBuYW1lIGF0IHJl cGxheS4gIEZPUkVJR04gS0VZCisgKgkJZW1pc3Npb24gaXMgZnVydGhlciBnYXRlZCBieSBpbmNs dWRlX2ZvcmVpZ25fa2V5cyBzbyBjYWxsZXJzCisgKgkJY2xvbmluZyBhIHNjaGVtYSBjYW4gc3Vw cHJlc3MgY3Jvc3MtdGFibGUgcmVmZXJlbmNlcyBpbiBhIGZpcnN0CisgKgkJcGFzcyBhbmQgcmUt ZW1pdCB0aGVtIGFmdGVyIGFsbCB0YXJnZXRzIGV4aXN0LgorICovCitzdGF0aWMgdm9pZAorZW1p dF9sb2NhbF9jb25zdHJhaW50cyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJUmVsYXRpb24J Y29uUmVsOworCVN5c1NjYW5EZXNjIGNvblNjYW47CisJU2NhbktleURhdGEgY29uS2V5OworCUhl YXBUdXBsZQljb25UdXA7CisJYm9vbAkJaXNfcGFydGl0aW9uID0gY3R4LT5yZWwtPnJkX3JlbC0+ cmVsaXNwYXJ0aXRpb247CisKKwlpZiAoIWN0eC0+aW5jbHVkZV9jb25zdHJhaW50cykKKwkJcmV0 dXJuOworCisJY29uUmVsID0gdGFibGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNjZXNz U2hhcmVMb2NrKTsKKwlTY2FuS2V5SW5pdCgmY29uS2V5LAorCQkJCUFudW1fcGdfY29uc3RyYWlu dF9jb25yZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2Jq ZWN0SWRHZXREYXR1bShjdHgtPnJlbGlkKSk7CisJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nh bihjb25SZWwsIENvbnN0cmFpbnRSZWxpZFR5cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCSB0cnVl LCBOVUxMLCAxLCAmY29uS2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKGNvblR1cCA9 IHN5c3RhYmxlX2dldG5leHQoY29uU2NhbikpKQorCXsKKwkJRm9ybV9wZ19jb25zdHJhaW50IGNv biA9IChGb3JtX3BnX2NvbnN0cmFpbnQpIEdFVFNUUlVDVChjb25UdXApOworCQljaGFyCSAgICpj b25kZWY7CisKKwkJaWYgKCFjb24tPmNvbmlzbG9jYWwpCisJCQljb250aW51ZTsKKwkJaWYgKGNv bi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX0NIRUNLICYmICFpc19wYXJ0aXRpb24pCisJCQljb250 aW51ZTsKKwkJaWYgKGNvbi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX05PVE5VTEwgJiYgIWlzX3Bh cnRpdGlvbiAmJgorCQkJbGlzdF9tZW1iZXJfb2lkKGN0eC0+c2tpcF9ub3RudWxsX29pZHMsIGNv bi0+b2lkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY29uLT5jb250eXBlID09IENPTlNUUkFJTlRf Rk9SRUlHTiAmJiAhY3R4LT5pbmNsdWRlX2ZvcmVpZ25fa2V5cykKKwkJCWNvbnRpbnVlOworCisJ CWNvbmRlZiA9IHBnX2dldF9jb25zdHJhaW50ZGVmX2NvbW1hbmQoY29uLT5vaWQpOworCQlyZXNl dFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsICIl czsiLCBjb25kZWYpOworCQlhcHBlbmRfc3RyaXBwZWRfc3RtdChjdHgpOworCQlwZnJlZShjb25k ZWYpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGNvblNjYW4pOworCXRhYmxlX2Nsb3NlKGNvblJl bCwgQWNjZXNzU2hhcmVMb2NrKTsKK30KKworLyoKKyAqIGVtaXRfcnVsZXMKKyAqCQlDUkVBVEUg UlVMRSBwZXIgY2FjaGVkIHJld3JpdGUgcnVsZSBvbiB0aGUgcmVsYXRpb24uCisgKi8KK3N0YXRp YyB2b2lkCitlbWl0X3J1bGVzKFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoIWN0eC0+ aW5jbHVkZV9ydWxlcyB8fCBjdHgtPnJlbC0+cmRfcnVsZXMgPT0gTlVMTCkKKwkJcmV0dXJuOwor CisJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHgtPnJlbC0+cmRfcnVsZXMtPm51bUxvY2tzOyBpKysp CisJeworCQlPaWQJCQlydWxlaWQgPSBjdHgtPnJlbC0+cmRfcnVsZXMtPnJ1bGVzW2ldLT5ydWxl SWQ7CisJCURhdHVtCQlydWxlZGVmOworCQljaGFyCSAgICpydWxlZGVmX3N0cjsKKworCQlydWxl ZGVmID0gT2lkRnVuY3Rpb25DYWxsMShGX1BHX0dFVF9SVUxFREVGX09JRCwKKwkJCQkJCQkJICAg T2JqZWN0SWRHZXREYXR1bShydWxlaWQpKTsKKwkJcnVsZWRlZl9zdHIgPSBUZXh0RGF0dW1HZXRD U3RyaW5nKHJ1bGVkZWYpOworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmY3R4LT5idWYsIHJ1bGVkZWZfc3RyKTsKKwkJYXBwZW5kX3N0cmlw cGVkX3N0bXQoY3R4KTsKKwkJcGZyZWUocnVsZWRlZl9zdHIpOworCX0KK30KKworLyoKKyAqIGVt aXRfc3RhdGlzdGljcworICoJCUNSRUFURSBTVEFUSVNUSUNTIHBlciBleHRlbmRlZCBzdGF0aXN0 aWNzIG9iamVjdCBvbiB0aGUgcmVsYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitlbWl0X3N0YXRp c3RpY3MoVGFibGVEZGxDb250ZXh0ICogY3R4KQoreworCVJlbGF0aW9uCXN0YXRSZWw7CisJU3lz U2NhbkRlc2Mgc3RhdFNjYW47CisJU2NhbktleURhdGEgc3RhdEtleTsKKwlIZWFwVHVwbGUJc3Rh dFR1cDsKKworCWlmICghY3R4LT5pbmNsdWRlX3N0YXRpc3RpY3MpCisJCXJldHVybjsKKworCXN0 YXRSZWwgPSB0YWJsZV9vcGVuKFN0YXRpc3RpY0V4dFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9j ayk7CisJU2NhbktleUluaXQoJnN0YXRLZXksCisJCQkJQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0 eHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJ ZEdldERhdHVtKGN0eC0+cmVsaWQpKTsKKwlzdGF0U2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihz dGF0UmVsLCBTdGF0aXN0aWNFeHRSZWxpZEluZGV4SWQsCisJCQkJCQkJCSAgdHJ1ZSwgTlVMTCwg MSwgJnN0YXRLZXkpOworCisJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoc3RhdFR1cCA9IHN5c3Rh YmxlX2dldG5leHQoc3RhdFNjYW4pKSkKKwl7CisJCUZvcm1fcGdfc3RhdGlzdGljX2V4dCBzdGF0 ID0gKEZvcm1fcGdfc3RhdGlzdGljX2V4dCkgR0VUU1RSVUNUKHN0YXRUdXApOworCQljaGFyCSAg ICpzdGF0ZGVmID0gcGdfZ2V0X3N0YXRpc3RpY3NvYmpkZWZfc3RyaW5nKHN0YXQtPm9pZCk7CisK KwkJcmVzZXRTdHJpbmdJbmZvKCZjdHgtPmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmN0eC0+ YnVmLCAiJXM7Iiwgc3RhdGRlZik7CisJCWFwcGVuZF9zdHJpcHBlZF9zdG10KGN0eCk7CisJCXBm cmVlKHN0YXRkZWYpOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKHN0YXRTY2FuKTsKKwl0YWJsZV9j bG9zZShzdGF0UmVsLCBBY2Nlc3NTaGFyZUxvY2spOworfQorCisvKgorICogZW1pdF9yZXBsaWNh X2lkZW50aXR5CisgKgkJQUxURVIgVEFCTEUgcXVhbG5hbWUgUkVQTElDQSBJREVOVElUWSAuLi4g LSBlbWl0dGVkIG9ubHkgd2hlbiB0aGUKKyAqCQlyZWxyZXBsaWRlbnQgZGlmZmVycyBmcm9tIHRo ZSBkZWZhdWx0ICgnZCcgPSB1c2UgcHJpbWFyeSBrZXkpLgorICovCitzdGF0aWMgdm9pZAorZW1p dF9yZXBsaWNhX2lkZW50aXR5KFRhYmxlRGRsQ29udGV4dCAqIGN0eCkKK3sKKwlpZiAoIWN0eC0+ aW5jbHVkZV9yZXBsaWNhX2lkZW50aXR5KQorCQlyZXR1cm47CisJaWYgKGN0eC0+cmVsLT5yZF9y ZWwtPnJlbHJlcGxpZGVudCA9PSBSRVBMSUNBX0lERU5USVRZX0RFRkFVTFQpCisJCXJldHVybjsK KworCXJlc2V0U3RyaW5nSW5mbygmY3R4LT5idWYpOworCXN3aXRjaCAoY3R4LT5yZWwtPnJkX3Jl bC0+cmVscmVwbGlkZW50KQorCXsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX05PVEhJTkc6CisJ CQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwKKwkJCQkJCQkgIkFMVEVSIFRBQkxFICVzIFJF UExJQ0EgSURFTlRJVFkgTk9USElORzsiLAorCQkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJCWFw cGVuZF9zdG10KGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0ZVTEw6 CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZjdHgtPmJ1ZiwKKwkJCQkJCQkgIkFMVEVSIFRBQkxFICVz IFJFUExJQ0EgSURFTlRJVFkgRlVMTDsiLAorCQkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJCWFw cGVuZF9zdG10KGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0lOREVY OgorCQkJeworCQkJCU9pZAkJCXJlcGxpZHggPSBSZWxhdGlvbkdldFJlcGxpY2FJbmRleChjdHgt PnJlbCk7CisKKwkJCQlpZiAoT2lkSXNWYWxpZChyZXBsaWR4KSkKKwkJCQl7CisJCQkJCWNoYXIJ ICAgKmlkeG5hbWUgPSBnZXRfcmVsX25hbWUocmVwbGlkeCk7CisKKwkJCQkJaWYgKGlkeG5hbWUg PT0gTlVMTCkKKwkJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVf VU5ERUZJTkVEX09CSkVDVCksCisJCQkJCQkJCSBlcnJtc2coInJlcGxpY2EgaWRlbnRpdHkgaW5k ZXggd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCQkJCXJlcGxpZHgpLAorCQkJ CQkJCQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVkLiIp KSk7CisKKwkJCQkJYXBwZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkJCQkgIkFMVEVS IFRBQkxFICVzIFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggJXM7IiwKKwkJCQkJCQkJCSBj dHgtPnF1YWxuYW1lLAorCQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoaWR4bmFtZSkpOworCQkJ CQlhcHBlbmRfc3RtdChjdHgpOworCQkJCQlwZnJlZShpZHhuYW1lKTsKKwkJCQl9CisJCQl9CisJ CQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBlbWl0X3Jsc190b2dnbGVzCisgKgkJQUxURVIgVEFC TEUgcXVhbG5hbWUgRU5BQkxFIC8gRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZLgorICovCitzdGF0 aWMgdm9pZAorZW1pdF9ybHNfdG9nZ2xlcyhUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJaWYg KCFjdHgtPmluY2x1ZGVfcmxzKQorCQlyZXR1cm47CisKKwlpZiAoY3R4LT5yZWwtPnJkX3JlbC0+ cmVscm93c2VjdXJpdHkpCisJeworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBw ZW5kU3RyaW5nSW5mbygmY3R4LT5idWYsCisJCQkJCQkgIkFMVEVSIFRBQkxFICVzIEVOQUJMRSBS T1cgTEVWRUwgU0VDVVJJVFk7IiwKKwkJCQkJCSBjdHgtPnF1YWxuYW1lKTsKKwkJYXBwZW5kX3N0 bXQoY3R4KTsKKwl9CisJaWYgKGN0eC0+cmVsLT5yZF9yZWwtPnJlbGZvcmNlcm93c2VjdXJpdHkp CisJeworCQlyZXNldFN0cmluZ0luZm8oJmN0eC0+YnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygm Y3R4LT5idWYsCisJCQkJCQkgIkFMVEVSIFRBQkxFICVzIEZPUkNFIFJPVyBMRVZFTCBTRUNVUklU WTsiLAorCQkJCQkJIGN0eC0+cXVhbG5hbWUpOworCQlhcHBlbmRfc3RtdChjdHgpOworCX0KK30K KworLyoKKyAqIGVtaXRfcGFydGl0aW9uX2NoaWxkcmVuCisgKgkJRm9yIGVhY2ggZGlyZWN0IHBh cnRpdGlvbiBjaGlsZCBvZiBhIHBhcnRpdGlvbmVkLXRhYmxlIHBhcmVudCwKKyAqCQlyZWN1cnNp dmVseSBjYWxsIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwgYW5kIGFwcGVuZCB0aGUgY2hpbGQn cworICoJCXN0YXRlbWVudHMuICBFYWNoIGNoaWxkJ3Mgb3duIERETCBoYW5kbGVzIGZ1cnRoZXIg bGV2ZWxzIHRocm91Z2gKKyAqCQl0aGUgc2FtZSByZWN1cnNpb24uCisgKi8KK3N0YXRpYyB2b2lk CitlbWl0X3BhcnRpdGlvbl9jaGlsZHJlbihUYWJsZURkbENvbnRleHQgKiBjdHgpCit7CisJTGlz dAkgICAqY2hpbGRyZW47CisJTGlzdENlbGwgICAqbGM7CisKKwlpZiAoIWN0eC0+aW5jbHVkZV9w YXJ0aXRpb24gfHwKKwkJY3R4LT5yZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1BBUlRJ VElPTkVEX1RBQkxFKQorCQlyZXR1cm47CisKKwljaGlsZHJlbiA9IGZpbmRfaW5oZXJpdGFuY2Vf Y2hpbGRyZW4oY3R4LT5yZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlmb3JlYWNoKGxjLCBjaGls ZHJlbikKKwl7CisJCU9pZAkJCWNoaWxkb2lkID0gbGZpcnN0X29pZChsYyk7CisJCUxpc3QJICAg KmNoaWxkc3RtdHM7CisKKwkJY2hpbGRzdG10cyA9IHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwo Y2hpbGRvaWQsIGN0eC0+cHJldHR5LAorCQkJCQkJCQkJCQkgICBjdHgtPm5vX293bmVyLAorCQkJ CQkJCQkJCQkgICBjdHgtPm5vX3RhYmxlc3BhY2UsCisJCQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVk ZV9pbmRleGVzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfY29uc3RyYWludHMsCisJCQkJ CQkJCQkJCSAgIGN0eC0+aW5jbHVkZV9mb3JlaWduX2tleXMsCisJCQkJCQkJCQkJCSAgIGN0eC0+ aW5jbHVkZV9ydWxlcywKKwkJCQkJCQkJCQkJICAgY3R4LT5pbmNsdWRlX3N0YXRpc3RpY3MsCisJ CQkJCQkJCQkJCSAgIGN0eC0+aW5jbHVkZV90cmlnZ2VycywKKwkJCQkJCQkJCQkJICAgY3R4LT5p bmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJCQkgICBjdHgtPmluY2x1ZGVfcmxzLAorCQkJCQkJ CQkJCQkgICBjdHgtPmluY2x1ZGVfcmVwbGljYV9pZGVudGl0eSwKKwkJCQkJCQkJCQkJICAgY3R4 LT5pbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCQkJCQkJICAgY3R4LT5zY2hlbWFfcXVhbGlmaWVk KTsKKwkJY3R4LT5zdGF0ZW1lbnRzID0gbGlzdF9jb25jYXQoY3R4LT5zdGF0ZW1lbnRzLCBjaGls ZHN0bXRzKTsKKwl9CisJbGlzdF9mcmVlKGNoaWxkcmVuKTsKK30KKworLyoKKyAqIHBnX2dldF90 YWJsZV9kZGxfaW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSBEREwgc3RhdGVtZW50cyB0byByZWNyZWF0 ZSBhIHJlZ3VsYXIgb3IgcGFydGl0aW9uZWQgdGFibGUuCisgKgorICogVGhlIGZpcnN0IGxpc3Qg ZWxlbWVudCBpcyB0aGUgQ1JFQVRFIFRBQkxFIHN0YXRlbWVudC4gIFN1YnNlcXVlbnQKKyAqIGVs ZW1lbnRzIGFyZSB0aGUgQUxURVIgVEFCTEUgLyBDUkVBVEUgSU5ERVggLyBDUkVBVEUgUlVMRSAv CisgKiBDUkVBVEUgU1RBVElTVElDUyBzdGF0ZW1lbnRzIG5lZWRlZCB0byByZXN0b3JlIHRoZSB0 YWJsZSdzIGZ1bGwKKyAqIGRlZmluaXRpb24uCisgKgorICogVHJpZ2dlciBhbmQgcG9saWN5IGVt aXNzaW9uIGFyZSBzY2FmZm9sZGVkIGJ1dCBjdXJyZW50bHkgZGlzYWJsZWQKKyAqICgjaWYgMCkg LSB0aGV5IHdpbGwgYmVjb21lIGEgc2luZ2xlIGhlbHBlciBjYWxsIG9uY2UgdGhlIHN0YW5kYWxv bmUKKyAqIHBnX2dldF90cmlnZ2VyX2RkbCAvIHBnX2dldF9wb2xpY3lfZGRsIGhlbHBlcnMgbGFu ZC4KKyAqLworc3RhdGljIExpc3QgKgorcGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbChPaWQgcmVs aWQsIGJvb2wgcHJldHR5LAorCQkJCQkJICBib29sIG5vX293bmVyLCBib29sIG5vX3RhYmxlc3Bh Y2UsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9pbmRleGVzLAorCQkJCQkJICBib29sIGluY2x1ZGVf Y29uc3RyYWludHMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9mb3JlaWduX2tleXMsCisJCQkJCQkg IGJvb2wgaW5jbHVkZV9ydWxlcywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3N0YXRpc3RpY3MsCisJ CQkJCQkgIGJvb2wgaW5jbHVkZV90cmlnZ2VycywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3BvbGlj aWVzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcmxzLAorCQkJCQkJICBib29sIGluY2x1ZGVfcmVw bGljYV9pZGVudGl0eSwKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3BhcnRpdGlvbiwKKwkJCQkJCSAg Ym9vbCBzY2hlbWFfcXVhbGlmaWVkKQoreworCVRhYmxlRGRsQ29udGV4dCBjdHggPSB7MH07CisJ UmVsYXRpb24JcmVsOworCWNoYXIJCXJlbGtpbmQ7CisJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKwor CXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZWxraW5kID0g cmVsLT5yZF9yZWwtPnJlbGtpbmQ7CisKKwkvKgorCSAqIFRoZSBpbml0aWFsIGN1dCBvbmx5IHN1 cHBvcnRzIG9yZGluYXJ5IGFuZCBwYXJ0aXRpb25lZCB0YWJsZXMuICBWaWV3cywKKwkgKiBtYXR2 aWV3cywgZm9yZWlnbiB0YWJsZXMsIHNlcXVlbmNlcywgaW5kZXhlcywgY29tcG9zaXRlIHR5cGVz LCBhbmQKKwkgKiBUT0FTVCB0YWJsZXMgYXJlIG91dCBvZiBzY29wZSBmb3Igbm93LgorCSAqLwor CWlmIChyZWxraW5kICE9IFJFTEtJTkRfUkVMQVRJT04gJiYgcmVsa2luZCAhPSBSRUxLSU5EX1BB UlRJVElPTkVEX1RBQkxFKQorCXsKKwkJY2hhcgkgICAqcmVsbmFtZSA9IHBzdHJkdXAoUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisKKwkJdGFibGVfY2xvc2UocmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JK RUNUX1RZUEUpLAorCQkJCSBlcnJtc2coIlwiJXNcIiBpcyBub3QgYW4gb3JkaW5hcnkgb3IgcGFy dGl0aW9uZWQgdGFibGUiLAorCQkJCQkJcmVsbmFtZSkpKTsKKwl9CisKKwkvKiBDYWxsZXIgbmVl ZHMgU0VMRUNUIG9uIHRoZSB0YWJsZSB0byByZWFkIGl0cyBkZWZpbml0aW9uLiAqLworCWFjbHJl c3VsdCA9IHBnX2NsYXNzX2FjbGNoZWNrKHJlbGlkLCBHZXRVc2VySWQoKSwgQUNMX1NFTEVDVCk7 CisJaWYgKGFjbHJlc3VsdCAhPSBBQ0xDSEVDS19PSykKKwkJYWNsY2hlY2tfZXJyb3IoYWNscmVz dWx0LCBPQkpFQ1RfVEFCTEUsCisJCQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkp OworCisJY3R4LnJlbCA9IHJlbDsKKwljdHgucmVsaWQgPSByZWxpZDsKKwljdHgucHJldHR5ID0g cHJldHR5OworCWN0eC5ub19vd25lciA9IG5vX293bmVyOworCWN0eC5ub190YWJsZXNwYWNlID0g bm9fdGFibGVzcGFjZTsKKwljdHguaW5jbHVkZV9pbmRleGVzID0gaW5jbHVkZV9pbmRleGVzOwor CWN0eC5pbmNsdWRlX2NvbnN0cmFpbnRzID0gaW5jbHVkZV9jb25zdHJhaW50czsKKwljdHguaW5j bHVkZV9mb3JlaWduX2tleXMgPSBpbmNsdWRlX2ZvcmVpZ25fa2V5czsKKwljdHguaW5jbHVkZV9y dWxlcyA9IGluY2x1ZGVfcnVsZXM7CisJY3R4LmluY2x1ZGVfc3RhdGlzdGljcyA9IGluY2x1ZGVf c3RhdGlzdGljczsKKwljdHguaW5jbHVkZV90cmlnZ2VycyA9IGluY2x1ZGVfdHJpZ2dlcnM7CisJ Y3R4LmluY2x1ZGVfcG9saWNpZXMgPSBpbmNsdWRlX3BvbGljaWVzOworCWN0eC5pbmNsdWRlX3Js cyA9IGluY2x1ZGVfcmxzOworCWN0eC5pbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHkgPSBpbmNsdWRl X3JlcGxpY2FfaWRlbnRpdHk7CisJY3R4LmluY2x1ZGVfcGFydGl0aW9uID0gaW5jbHVkZV9wYXJ0 aXRpb247CisJY3R4LnNjaGVtYV9xdWFsaWZpZWQgPSBzY2hlbWFfcXVhbGlmaWVkOworCWN0eC5i YXNlX25hbWVzcGFjZSA9IFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCk7CisJY3R4LnNhdmVfbmVz dGxldmVsID0gLTE7CisJY3R4LnF1YWxuYW1lID0gbG9va3VwX3JlbG5hbWVfZm9yX2VtaXQocmVs aWQsIHNjaGVtYV9xdWFsaWZpZWQsCisJCQkJCQkJCQkJICAgY3R4LmJhc2VfbmFtZXNwYWNlKTsK KworCS8qCisJICogV2hlbiBzY2hlbWFfcXVhbGlmaWVkIGlzIGZhbHNlLCBuYXJyb3cgdGhlIGFj dGl2ZSBzZWFyY2hfcGF0aCB0byB0aGUKKwkgKiB0YXJnZXQgdGFibGUncyBvd24gbmFtZXNwYWNl IGZvciB0aGUgZHVyYXRpb24gb2YgRERMIGVtaXNzaW9uLiAgVGhlCisJICogZGVwYXJzZSBjb2Rl IGluIHJ1bGV1dGlscyAoYW5kIHRoZSByZWdjbGFzcy9yZWdwcm9jIG91dHB1dCBmdW5jdGlvbnMg d2UKKwkgKiB0cmFuc2l0aXZlbHkgY2FsbCkgZGVjaWRlcyB3aGV0aGVyIHRvIHNjaGVtYS1xdWFs aWZ5IGEgbmFtZSBiYXNlZCBvbgorCSAqIHdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGlz IHJlYWNoYWJsZSB0aHJvdWdoIHNlYXJjaF9wYXRoLCBzbyB0aGlzCisJICogbWFrZXMgc2FtZS1z Y2hlbWEgcmVmZXJlbmNlcyBpbiBERUZBVUxUIGFuZCBDSEVDSyBleHByZXNzaW9ucywgcmVnY2xh c3MKKwkgKiBsaXRlcmFscywgRksgdGFyZ2V0cywgZXRjLiBjb21lIG91dCB1bnF1YWxpZmllZC4g IENyb3NzLXNjaGVtYQorCSAqIHJlZmVyZW5jZXMgc3RheSBxdWFsaWZpZWQsIHdoaWNoIGlzIHRo ZSBjb3JyZWN0bmVzcyByZXF1aXJlbWVudC4KKwkgKiBBdEVPWGFjdF9HVUMgY2xlYW5zIHVwIGF0 IHhhY3QgZW5kIGlmIGFueXRoaW5nIHRocm93cyBiZXR3ZWVuIGhlcmUgYW5kCisJICogdGhlIGV4 cGxpY2l0IHJlc3RvcmUgYmVsb3c7IG9uIHRoZSBub3JtYWwgcGF0aCB3ZSByZXN0b3JlIHJpZ2h0 IGJlZm9yZQorCSAqIHJldHVybmluZy4KKwkgKgorCSAqIFByZS1jb21wdXRlICI8c2NoZW1hPi4i IHRvbyAtIHRoZSBhbHdheXMtcXVhbGlmaWVkIGhlbHBlcnMKKwkgKiAoY29uc3RyYWludGRlZl9j b21tYW5kLCBpbmRleGRlZl9zdHJpbmcsIHJ1bGVkZWYsCisJICogc3RhdGlzdGljc29iamRlZl9z dHJpbmcpIGlnbm9yZSBzZWFyY2hfcGF0aCBmb3IgdGhlIHRhcmdldCdzIG93biAiQUxURVIKKwkg KiBUQUJMRSBzY2hlbWEudGJsIi8iT04gc2NoZW1hLnRibCIvIlRPIHNjaGVtYS50YmwiIHByZWZp eCBhbmQgZm9yIHRoZQorCSAqIHF1YWxpZmllZCBzdGF0aXN0aWNzIG5hbWU7IHdlIHN0cmlwIHRo YXQgc3RyaW5nIG91cnNlbHZlcyB2aWEKKwkgKiBzdHJpcF9zY2hlbWFfcHJlZml4LgorCSAqLwor CWlmICghc2NoZW1hX3F1YWxpZmllZCkKKwl7CisJCWNoYXIJICAgKm5zcG5hbWUgPSBnZXRfbmFt ZXNwYWNlX25hbWUoY3R4LmJhc2VfbmFtZXNwYWNlKTsKKworCQlpZiAobnNwbmFtZSAhPSBOVUxM KQorCQl7CisJCQljb25zdCBjaGFyICpxbnNwID0gcXVvdGVfaWRlbnRpZmllcihuc3BuYW1lKTsK KworCQkJY3R4LnNjaGVtYV9wcmVmaXggPSBwc3ByaW50ZigiJXMuIiwgcW5zcCk7CisJCQljdHgu c2F2ZV9uZXN0bGV2ZWwgPSBOZXdHVUNOZXN0TGV2ZWwoKTsKKwkJCSh2b2lkKSBzZXRfY29uZmln X29wdGlvbigic2VhcmNoX3BhdGgiLCBxbnNwLAorCQkJCQkJCQkJIFBHQ19VU0VSU0VULCBQR0Nf U19TRVNTSU9OLAorCQkJCQkJCQkJIEdVQ19BQ1RJT05fU0FWRSwgdHJ1ZSwgMCwgZmFsc2UpOwor CQkJcGZyZWUobnNwbmFtZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIENhY2hlIGxvY2FsbHktZGVj bGFyZWQgTk9UIE5VTEwgY29uc3RyYWludCBtZXRhZGF0YSBzbyB0aGUgY29sdW1uLSBlbWl0CisJ ICogaGVscGVycyBjYW4gcHJvZHVjZSAiQ09OU1RSQUlOVCBuYW1lIE5PVCBOVUxMIiBpbmxpbmUg Zm9yIHVzZXItbmFtZWQKKwkgKiBjb25zdHJhaW50cywgYW5kIHNvIHRoZSBjb25zdHJhaW50IGxv b3AgY2FuIGF2b2lkIGRvdWJsZS1lbWl0dGluZyB0aGVtLgorCSAqLworCWN0eC5ubl9lbnRyaWVz ID0gY29sbGVjdF9sb2NhbF9ub3RfbnVsbChyZWwsICZjdHguc2tpcF9ub3RudWxsX29pZHMpOwor CisJaW5pdFN0cmluZ0luZm8oJmN0eC5idWYpOworCisJLyoKKwkgKiBFYWNoIHBhc3MgYmVsb3cg YXBwZW5kcyB6ZXJvIG9yIG1vcmUgZmluaXNoZWQgc3RhdGVtZW50cyB0bworCSAqIGN0eC5zdGF0 ZW1lbnRzIHZpYSBhcHBlbmRfc3RtdCAvIGFwcGVuZF9zdHJpcHBlZF9zdG10LiAgT3JkZXIgaXMK KwkgKiBzaWduaWZpY2FudDogQ1JFQVRFIFRBQkxFIGZpcnN0OyBPV05FUiBhbmQgdGhlIHBlci1j b2x1bW4gQUxURVIgQ09MVU1OCisJICogcGFzc2VzIGJlZm9yZSBzdWItb2JqZWN0IGVtaXNzaW9u OyBzdWItb2JqZWN0cyBpbiBkZXBlbmRlbmN5LWZyaWVuZGx5CisJICogb3JkZXIgKGluZGV4ZXMg YmVmb3JlIGNvbnN0cmFpbnRzLCBzaW5jZSBjb25zdHJhaW50LWJhY2tlZCBpbmRleGVzIGFyZQor CSAqIGVtaXR0ZWQgb3V0LW9mLWxpbmUgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCk7IGFuZCBwYXJ0 aXRpb24gY2hpbGRyZW4KKwkgKiBsYXN0IHNvIHRoZSBwYXJlbnQgYWxyZWFkeSBleGlzdHMgYXQg cmVwbGF5IHRpbWUuCisJICovCisJZW1pdF9jcmVhdGVfdGFibGVfc3RtdCgmY3R4KTsKKwllbWl0 X293bmVyX3N0bXQoJmN0eCk7CisJZW1pdF9jaGlsZF9kZWZhdWx0X292ZXJyaWRlcygmY3R4KTsK KwllbWl0X2F0dG9wdGlvbnMoJmN0eCk7CisJZW1pdF9pbmRleGVzKCZjdHgpOworCWVtaXRfbG9j YWxfY29uc3RyYWludHMoJmN0eCk7CisJZW1pdF9ydWxlcygmY3R4KTsKKwllbWl0X3N0YXRpc3Rp Y3MoJmN0eCk7CisJZW1pdF9yZXBsaWNhX2lkZW50aXR5KCZjdHgpOworCWVtaXRfcmxzX3RvZ2ds ZXMoJmN0eCk7CisKKwkvKgorCSAqIFRyaWdnZXJzIGFuZCByb3ctbGV2ZWwgc2VjdXJpdHkgcG9s aWNpZXMgLSBkaXNhYmxlZCB1bnRpbCB0aGUKKwkgKiBzdGFuZGFsb25lIHBnX2dldF90cmlnZ2Vy X2RkbCgpIGFuZCBwZ19nZXRfcG9saWN5X2RkbCgpIGhlbHBlcnMgbGFuZC4KKwkgKiBUaGUgc2Nh biArIGxvY2sgKyBmaWx0ZXIgc2NhZmZvbGRpbmcgYmVsb3cgaXMgcHJlc2VydmVkIChpbnNpZGUg I2lmIDApCisJICogc28gd2lyaW5nIHVwIGVhY2ggZW1pc3Npb24gYmVjb21lcyBhIG9uZS1saW5l ciBpbiB0aGUgbG9vcCBib2R5IG9uY2UKKwkgKiB0aG9zZSBoZWxwZXJzIGFyZSBhdmFpbGFibGUu CisJICovCisjaWYgMAorCWlmIChpbmNsdWRlX3RyaWdnZXJzKQorCXsKKwkJUmVsYXRpb24JdHJp Z1JlbDsKKwkJU3lzU2NhbkRlc2MgdHJpZ1NjYW47CisJCVNjYW5LZXlEYXRhIHRyaWdLZXk7CisJ CUhlYXBUdXBsZQl0cmlnVHVwOworCisJCXRyaWdSZWwgPSB0YWJsZV9vcGVuKFRyaWdnZXJSZWxh dGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCQlTY2FuS2V5SW5pdCgmdHJpZ0tleSwKKwkJCQkJ QW51bV9wZ190cmlnZ2VyX3RncmVsaWQsCisJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9P SURFUSwKKwkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQl0cmlnU2NhbiA9IHN5c3Rh YmxlX2JlZ2luc2Nhbih0cmlnUmVsLCBUcmlnZ2VyUmVsaWROYW1lSW5kZXhJZCwKKwkJCQkJCQkJ CSAgdHJ1ZSwgTlVMTCwgMSwgJnRyaWdLZXkpOworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZCh0 cmlnVHVwID0gc3lzdGFibGVfZ2V0bmV4dCh0cmlnU2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3Ry aWdnZXIgdHJnID0gKEZvcm1fcGdfdHJpZ2dlcikgR0VUU1RSVUNUKHRyaWdUdXApOworCisJCQlp ZiAodHJnLT50Z2lzaW50ZXJuYWwpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRPRE86IGFwcGVu ZCBwZ19nZXRfdHJpZ2dlcl9kZGwodHJnLT5vaWQpIG91dHB1dCBoZXJlLiAqLworCQl9CisJCXN5 c3RhYmxlX2VuZHNjYW4odHJpZ1NjYW4pOworCQl0YWJsZV9jbG9zZSh0cmlnUmVsLCBBY2Nlc3NT aGFyZUxvY2spOworCX0KKworCWlmIChpbmNsdWRlX3BvbGljaWVzKQorCXsKKwkJUmVsYXRpb24J cG9sUmVsOworCQlTeXNTY2FuRGVzYyBwb2xTY2FuOworCQlTY2FuS2V5RGF0YSBwb2xLZXk7CisJ CUhlYXBUdXBsZQlwb2xUdXA7CisKKwkJcG9sUmVsID0gdGFibGVfb3BlbihQb2xpY3lSZWxhdGlv bklkLCBBY2Nlc3NTaGFyZUxvY2spOworCQlTY2FuS2V5SW5pdCgmcG9sS2V5LAorCQkJCQlBbnVt X3BnX3BvbGljeV9wb2xyZWxpZCwKKwkJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVR LAorCQkJCQlPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJCXBvbFNjYW4gPSBzeXN0YWJsZV9i ZWdpbnNjYW4ocG9sUmVsLCBQb2xpY3lQb2xyZWxpZFBvbG5hbWVJbmRleElkLAorCQkJCQkJCQkJ IHRydWUsIE5VTEwsIDEsICZwb2xLZXkpOworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChwb2xU dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHBvbFNjYW4pKSkKKwkJeworCQkJLyogVE9ETzogYXBwZW5k IHBnX2dldF9wb2xpY3lfZGRsKHJlbGlkLCBwb2xuYW1lKSBvdXRwdXQgaGVyZS4gKi8KKwkJfQor CQlzeXN0YWJsZV9lbmRzY2FuKHBvbFNjYW4pOworCQl0YWJsZV9jbG9zZShwb2xSZWwsIEFjY2Vz c1NoYXJlTG9jayk7CisJfQorI2Vsc2UKKwkodm9pZCkgaW5jbHVkZV90cmlnZ2VyczsKKwkodm9p ZCkgaW5jbHVkZV9wb2xpY2llczsKKyNlbmRpZgorCisJZW1pdF9wYXJ0aXRpb25fY2hpbGRyZW4o JmN0eCk7CisKKwl7CisJCWludAkJCW5hdHRzID0gUmVsYXRpb25HZXREZXNjcihyZWwpLT5uYXR0 czsKKworCQlmb3IgKGludCBpID0gMTsgaSA8PSBuYXR0czsgaSsrKQorCQkJaWYgKGN0eC5ubl9l bnRyaWVzW2ldLm5hbWUgIT0gTlVMTCkKKwkJCQlwZnJlZShjdHgubm5fZW50cmllc1tpXS5uYW1l KTsKKwl9CisJcGZyZWUoY3R4Lm5uX2VudHJpZXMpOworCisJdGFibGVfY2xvc2UocmVsLCBBY2Nl c3NTaGFyZUxvY2spOworCXBmcmVlKGN0eC5idWYuZGF0YSk7CisJcGZyZWUoY3R4LnF1YWxuYW1l KTsKKwlpZiAoY3R4LnNjaGVtYV9wcmVmaXggIT0gTlVMTCkKKwkJcGZyZWUoY3R4LnNjaGVtYV9w cmVmaXgpOworCWxpc3RfZnJlZShjdHguc2tpcF9ub3RudWxsX29pZHMpOworCisJLyoKKwkgKiBQ b3AgdGhlIG5hcnJvd2VkIHNlYXJjaF9wYXRoIG5vdyB0aGF0IGFsbCBoZWxwZXJzIGhhdmUgcnVu LiAgRXJyb3JzCisJICogdGhyb3duIGVhcmxpZXIgYXJlIGNsZWFuZWQgdXAgYnkgQXRFT1hhY3Rf R1VDIGF0IHhhY3QgZW5kLgorCSAqLworCWlmIChjdHguc2F2ZV9uZXN0bGV2ZWwgPj0gMCkKKwkJ QXRFT1hhY3RfR1VDKHRydWUsIGN0eC5zYXZlX25lc3RsZXZlbCk7CisKKwlyZXR1cm4gY3R4LnN0 YXRlbWVudHM7Cit9CisKKy8qCisgKiBwZ19nZXRfdGFibGVfZGRsCisgKgkJUmV0dXJuIERETCB0 byByZWNyZWF0ZSBhIHRhYmxlIGFzIGEgc2V0IG9mIHRleHQgcm93cy4KKyAqLworRGF0dW0KK3Bn X2dldF90YWJsZV9kZGwoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlGdW5jQ2FsbENvbnRleHQgKmZ1 bmNjdHg7CisJTGlzdAkgICAqc3RhdGVtZW50czsKKworCWlmIChTUkZfSVNfRklSU1RDQUxMKCkp CisJeworCQlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CisJCU9pZAkJCXJlbGlkOworCQlEZGxP cHRpb24Jb3B0c1tdID0geworCQkJeyJwcmV0dHkiLCBERExfT1BUX0JPT0x9LAorCQkJeyJvd25l ciIsIERETF9PUFRfQk9PTH0sCisJCQl7InRhYmxlc3BhY2UiLCBERExfT1BUX0JPT0x9LAorCQkJ eyJpbmNsdWRlc19pbmRleGVzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfY29uc3Ry YWludHMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19mb3JlaWduX2tleXMiLCBERExf T1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19ydWxlcyIsIERETF9PUFRfQk9PTH0sCisJCQl7Imlu Y2x1ZGVzX3N0YXRpc3RpY3MiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc190cmlnZ2Vy cyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3BvbGljaWVzIiwgRERMX09QVF9CT09M fSwKKwkJCXsiaW5jbHVkZXNfcmxzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfcmVw bGljYV9pZGVudGl0eSIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3BhcnRpdGlvbiIs IERETF9PUFRfQk9PTH0sCisJCQl7InNjaGVtYV9xdWFsaWZpZWQiLCBERExfT1BUX0JPT0x9LAor CQl9OworCisJCWZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKwkJb2xkY29udGV4dCA9 IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgpOwor CisJCWlmIChQR19BUkdJU05VTEwoMCkpCisJCXsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv bGRjb250ZXh0KTsKKwkJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKKwkJfQorCisJCXJlbGlk ID0gUEdfR0VUQVJHX09JRCgwKTsKKwkJcGFyc2VfZGRsX29wdGlvbnMoZmNpbmZvLCAxLCBvcHRz LCBsZW5ndGhvZihvcHRzKSk7CisKKwkJc3RhdGVtZW50cyA9IHBnX2dldF90YWJsZV9kZGxfaW50 ZXJuYWwocmVsaWQsCisJCQkJCQkJCQkJCSAgIG9wdHNbMF0uaXNzZXQgJiYgb3B0c1swXS5ib29s dmFsLAorCQkJCQkJCQkJCQkgICBvcHRzWzFdLmlzc2V0ICYmICFvcHRzWzFdLmJvb2x2YWwsCisJ CQkJCQkJCQkJCSAgIG9wdHNbMl0uaXNzZXQgJiYgIW9wdHNbMl0uYm9vbHZhbCwKKwkJCQkJCQkJ CQkJICAgIW9wdHNbM10uaXNzZXQgfHwgb3B0c1szXS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAh b3B0c1s0XS5pc3NldCB8fCBvcHRzWzRdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzVd Lmlzc2V0IHx8IG9wdHNbNV0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbNl0uaXNzZXQg fHwgb3B0c1s2XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s3XS5pc3NldCB8fCBvcHRz WzddLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzhdLmlzc2V0IHx8IG9wdHNbOF0uYm9v bHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbOV0uaXNzZXQgfHwgb3B0c1s5XS5ib29sdmFsLAor CQkJCQkJCQkJCQkgICAhb3B0c1sxMF0uaXNzZXQgfHwgb3B0c1sxMF0uYm9vbHZhbCwKKwkJCQkJ CQkJCQkJICAgIW9wdHNbMTFdLmlzc2V0IHx8IG9wdHNbMTFdLmJvb2x2YWwsCisJCQkJCQkJCQkJ CSAgIG9wdHNbMTJdLmlzc2V0ICYmIG9wdHNbMTJdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFv cHRzWzEzXS5pc3NldCB8fCBvcHRzWzEzXS5ib29sdmFsKTsKKwkJZnVuY2N0eC0+dXNlcl9mY3R4 ID0gc3RhdGVtZW50czsKKwkJZnVuY2N0eC0+bWF4X2NhbGxzID0gbGlzdF9sZW5ndGgoc3RhdGVt ZW50cyk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCX0KKworCWZ1 bmNjdHggPSBTUkZfUEVSQ0FMTF9TRVRVUCgpOworCXN0YXRlbWVudHMgPSAoTGlzdCAqKSBmdW5j Y3R4LT51c2VyX2ZjdHg7CisKKwlpZiAoZnVuY2N0eC0+Y2FsbF9jbnRyIDwgZnVuY2N0eC0+bWF4 X2NhbGxzKQorCXsKKwkJY2hhcgkgICAqc3RtdDsKKworCQlzdG10ID0gbGlzdF9udGgoc3RhdGVt ZW50cywgZnVuY2N0eC0+Y2FsbF9jbnRyKTsKKworCQlTUkZfUkVUVVJOX05FWFQoZnVuY2N0eCwg Q1N0cmluZ0dldFRleHREYXR1bShzdG10KSk7CisJfQorCWVsc2UKKwl7CisJCWxpc3RfZnJlZV9k ZWVwKHN0YXRlbWVudHMpOworCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJfQorfQpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19pbmhlcml0cy5oIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19pbmhlcml0cy5oCmluZGV4IGNjODc0YWJhYWJiLi4xZTQ2M2IwMTA2ZCAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19pbmhlcml0cy5oCisrKyBiL3NyYy9pbmNs dWRlL2NhdGFsb2cvcGdfaW5oZXJpdHMuaApAQCAtNTUsNiArNTUsNyBAQCBERUNMQVJFX0lOREVY KHBnX2luaGVyaXRzX3BhcmVudF9pbmRleCwgMjE4NywgSW5oZXJpdHNQYXJlbnRJbmRleElkLCBw Z19pbmhlcml0cwogZXh0ZXJuIExpc3QgKmZpbmRfaW5oZXJpdGFuY2VfY2hpbGRyZW4oT2lkIHBh cmVudHJlbElkLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiBleHRlcm4gTGlzdCAqZmluZF9pbmhlcml0 YW5jZV9jaGlsZHJlbl9leHRlbmRlZChPaWQgcGFyZW50cmVsSWQsIGJvb2wgb21pdF9kZXRhY2hl ZCwKIAkJCQkJCQkJCQkJCUxPQ0tNT0RFIGxvY2ttb2RlLCBib29sICpkZXRhY2hlZF9leGlzdCwg VHJhbnNhY3Rpb25JZCAqZGV0YWNoZWRfeG1pbik7CitleHRlcm4gTGlzdCAqZmluZF9pbmhlcml0 YW5jZV9wYXJlbnRzKE9pZCByZWxpZCwgTE9DS01PREUgbG9ja21vZGUpOwogCiBleHRlcm4gTGlz dCAqZmluZF9hbGxfaW5oZXJpdG9ycyhPaWQgcGFyZW50cmVsSWQsIExPQ0tNT0RFIGxvY2ttb2Rl LAogCQkJCQkJCQkgTGlzdCAqKm51bXBhcmVudHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5k ZXggYmUxNTdhNWZiZTkuLmU0NTZjMjI2ZjUzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAg LTg2MTUsNiArODYxNSwxMyBAQAogICBwcm9hcmd0eXBlcyA9PiAncmVnZGF0YWJhc2UgdGV4dCcs IHByb2FsbGFyZ3R5cGVzID0+ICd7cmVnZGF0YWJhc2UsdGV4dH0nLAogICBwcm9hcmdtb2RlcyA9 PiAne2ksdn0nLCBwcm9hcmdkZWZhdWx0cyA9PiAne05VTEx9JywKICAgcHJvc3JjID0+ICdwZ19n ZXRfZGF0YWJhc2VfZGRsJyB9LAoreyBvaWQgPT4gJzgyMTUnLCBkZXNjciA9PiAnZ2V0IERETCB0 byByZWNyZWF0ZSBhIHRhYmxlJywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X3RhYmxlX2RkbCcsIHBy b3Jvd3MgPT4gJzUwJywgcHJvdmFyaWFkaWMgPT4gJ3RleHQnLAorICBwcm9pc3N0cmljdCA9PiAn ZicsIHByb3JldHNldCA9PiAndCcsIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcGFyYWxsZWwgPT4g J3InLAorICBwcm9uYXJnZGVmYXVsdHMgPT4gJzEnLCBwcm9yZXR0eXBlID0+ICd0ZXh0JywKKyAg cHJvYXJndHlwZXMgPT4gJ3JlZ2NsYXNzIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3JlZ2Ns YXNzLHRleHR9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVsdHMgPT4g J3tOVUxMfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X3RhYmxlX2RkbCcgfSwKIHsgb2lkID0+ICcy NTA5JywKICAgZGVzY3IgPT4gJ2RlcGFyc2UgYW4gZW5jb2RlZCBleHByZXNzaW9uIHdpdGggcHJl dHR5LXByaW50IG9wdGlvbicsCiAgIHByb25hbWUgPT4gJ3BnX2dldF9leHByJywgcHJvdm9sYXRp bGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICd0ZXh0JywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L2NvbW1hbmRzL3RhYmxlY21kcy5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmgK aW5kZXggYzNkODUxOGNiNjIuLmQzMzU2M2ZkZWFkIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9j b21tYW5kcy90YWJsZWNtZHMuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMu aApAQCAtOTIsNiArOTIsNyBAQCBleHRlcm4gdm9pZCBjaGVja19vZl90eXBlKEhlYXBUdXBsZSB0 eXBldHVwbGUpOwogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9vbl9jb21taXRfYWN0aW9uKE9pZCBy ZWxpZCwgT25Db21taXRBY3Rpb24gYWN0aW9uKTsKIGV4dGVybiB2b2lkIHJlbW92ZV9vbl9jb21t aXRfYWN0aW9uKE9pZCByZWxpZCk7CitleHRlcm4gT25Db21taXRBY3Rpb24gZ2V0X29uX2NvbW1p dF9hY3Rpb24oT2lkIHJlbGlkKTsKIAogZXh0ZXJuIHZvaWQgUHJlQ29tbWl0X29uX2NvbW1pdF9h Y3Rpb25zKHZvaWQpOwogZXh0ZXJuIHZvaWQgQXRFT1hhY3Rfb25fY29tbWl0X2FjdGlvbnMoYm9v bCBpc0NvbW1pdCk7CkBAIC0xMDgsNCArMTA5LDYgQEAgZXh0ZXJuIHZvaWQgUmFuZ2VWYXJDYWxs YmFja093bnNSZWxhdGlvbihjb25zdCBSYW5nZVZhciAqcmVsYXRpb24sCiBleHRlcm4gYm9vbCBQ YXJ0Q29uc3RyYWludEltcGxpZWRCeVJlbENvbnN0cmFpbnQoUmVsYXRpb24gc2NhbnJlbCwKIAkJ CQkJCQkJCQkJCSBMaXN0ICpwYXJ0Q29uc3RyYWludCk7CiAKK2V4dGVybiBjb25zdCBjaGFyICpz dG9yYWdlX25hbWUoY2hhciBjKTsKKwogI2VuZGlmCQkJCQkJCS8qIFRBQkxFQ01EU19IICovCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wZ19nZXRfdGFibGVfZGRsLm91dApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZmRiMzYyODkyZTgKLS0tIC9kZXYvbnVs bAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0CkBA IC0wLDAgKzEsNzU0IEBACistLQorLS0gcGdfZ2V0X3RhYmxlX2RkbAorLS0KKy0tIEFsbCB0ZXN0 cyBwYXNzIG93bmVyPT5mYWxzZSBzbyB0aGUgQUxURVIgVEFCTEUgT1dORVIgVE8gbGluZSBpcyBu b3QKKy0tIGVtaXR0ZWQsIGtlZXBpbmcgb3V0cHV0IHN0YWJsZSBhY3Jvc3MgdGVzdCBydW5uZXJz ICh3aGljaCBtYXkgcnVuIHVuZGVyCistLSBkaWZmZXJlbnQgcm9sZSBuYW1lcykuCistLQorQ1JF QVRFIFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKK1NFVCBzZWFyY2hfcGF0aCA9IHBndGJsX2RkbF90 ZXN0OworLS0gQmFzaWMgdGFibGUgd2l0aCBQUklNQVJZIEtFWSwgTk9UIE5VTEwsIERFRkFVTFQs IENPTExBVEUuCitDUkVBVEUgVEFCTEUgYmFzaWMgKAorICAgIGlkIGludCBQUklNQVJZIEtFWSwK KyAgICBuYW1lIHRleHQgTk9UIE5VTEwgREVGQVVMVCAnYW5vbicgQ09MTEFURSAiQyIKKyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyAoIGlkIGludGVn ZXIgTk9UIE5VTEwsIG5hbWUgdGV4dCBDT0xMQVRFICJDIiBERUZBVUxUICdhbm9uJzo6dGV4dCBO T1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJ TlQgYmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBu YW1lOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJh c2ljX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIElkZW50aXR5IGNvbHVt bnMgKHdpdGggZGVmYXVsdCBhbmQgY3VzdG9tIHNlcXVlbmNlIG9wdGlvbnMpLgorQ1JFQVRFIFRB QkxFIGlkX2NvbHMgKAorICAgIGlkX2Fsd2F5cyBpbnQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVO VElUWSwKKyAgICBpZF9kZWZhdWx0IGludCBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJREVOVElU WQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY29scyc6OnJlZ2NsYXNz LCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgKCBpZF9hbHdheXMgaW50ZWdl ciBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIE5PVCBOVUxMLCBpZF9kZWZhdWx0IGludGVn ZXIgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkgTk9UIE5VTEwpOworIEFMVEVSIFRB QkxFIHBndGJsX2RkbF90ZXN0LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9hbHdh eXNfbm90X251bGwgTk9UIE5VTEwgaWRfYWx3YXlzOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90 ZXN0LmlkX2NvbHMgQUREIENPTlNUUkFJTlQgaWRfY29sc19pZF9kZWZhdWx0X25vdF9udWxsIE5P VCBOVUxMIGlkX2RlZmF1bHQ7CisoMyByb3dzKQorCitDUkVBVEUgVEFCTEUgaWRfY3VzdG9tICgK KyAgICB2IGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZICgKKyAgICAgICAgU0VRVUVO Q0UgTkFNRSBpZF9jdXN0b21fdl9zZXEKKyAgICAgICAgU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5U IEJZIDUKKyAgICAgICAgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMAorICAgICAgICBDQUNIRSAx MCBDWUNMRQorICAgICkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2N1 c3RvbSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5p ZF9jdXN0b20gKCB2IGludGVnZXIgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoU1RBUlQg V0lUSCAxMDAgSU5DUkVNRU5UIEJZIDUgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMCBDQUNIRSAx MCBDWUNMRSkgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2N1c3Rv bSBBREQgQ09OU1RSQUlOVCBpZF9jdXN0b21fdl9ub3RfbnVsbCBOT1QgTlVMTCB2OworKDIgcm93 cykKKworLS0gR2VuZXJhdGVkIHN0b3JlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgZ2VuX2NvbHMg KAorICAgIGNlbnRzIGludCwKKyAgICBkb2xsYXJzIG51bWVyaWMgR0VORVJBVEVEIEFMV0FZUyBB UyAoY2VudHMgLyAxMDAuMCkgU1RPUkVECispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdnZW5fY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxl X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0Lmdlbl9j b2xzICggY2VudHMgaW50ZWdlciwgZG9sbGFycyBudW1lcmljIEdFTkVSQVRFRCBBTFdBWVMgQVMg KCgoY2VudHMpOjpudW1lcmljIC8gMTAwLjApKSBTVE9SRUQpOworKDEgcm93KQorCistLSBTVE9S QUdFIGFuZCBDT01QUkVTU0lPTiAob25seSBlbWl0dGVkIHdoZW4gbm9uLWRlZmF1bHQgZm9yIHRo ZSB0eXBlKS4KK0NSRUFURSBUQUJMRSBzdG9yYWdlX2NvbHMgKAorICAgIGEgdGV4dCBTVE9SQUdF IEVYVEVSTkFMLAorICAgIGIgdGV4dCBTVE9SQUdFIE1BSU4sCisgICAgYyB0ZXh0IENPTVBSRVNT SU9OIHBnbHoKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0b3JhZ2VfY29s cyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBw Z3RibF9kZGxfdGVzdC5zdG9yYWdlX2NvbHMgKCBhIHRleHQgU1RPUkFHRSBFWFRFUk5BTCwgYiB0 ZXh0IFNUT1JBR0UgTUFJTiwgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHopOworKDEgcm93KQorCist LSBDb25zdHJhaW50czogQ0hFQ0ssIFVOSVFVRSwgRk9SRUlHTiBLRVkgKERFRkVSUkFCTEUpLgor Q1JFQVRFIFRBQkxFIHJlZmQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgY29u cyAoCisgICAgYSBpbnQgQ0hFQ0sgKGEgPiAwKSwKKyAgICBiIGludCBVTklRVUUsCisgICAgYyBp bnQgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRAorKTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY29ucyc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUg cGd0YmxfZGRsX3Rlc3QuY29ucyAoIGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIsIENP TlNUUkFJTlQgY29uc19hX2NoZWNrIENIRUNLICgoYSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2Jfa2V5IFVOSVFVRSAoYik7Cisg QUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyBBREQgQ09OU1RSQUlOVCBjb25zX2NfZmtl eSBGT1JFSUdOIEtFWSAoYykgUkVGRVJFTkNFUyByZWZkKGlkKSBERUZFUlJBQkxFIElOSVRJQUxM WSBERUZFUlJFRDsKKygzIHJvd3MpCisKKy0tIEluZGV4ZXM6IGZ1bmN0aW9uYWwgYW5kIHBhcnRp YWwuICBDb25zdHJhaW50LWJhY2tpbmcgaW5kZXhlcyBhcmUKKy0tIHN1cHByZXNzZWQgKHRoZXkg YXJlIGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCkuCitDUkVBVEUgVEFCTEUgaWR4ZCAo aWQgaW50IFBSSU1BUlkgS0VZLCBuYW1lIHRleHQpOworQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIg T04gaWR4ZCAobG93ZXIobmFtZSkpOworQ1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBpZHhk IChpZCkgV0hFUkUgaWQgPiAxMDA7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lk eGQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJs X2RkbF90ZXN0LmlkeGQgKCBpZCBpbnRlZ2VyIE5PVCBOVUxMLCBuYW1lIHRleHQpOworIENSRUFU RSBJTkRFWCBpZHhkX2xvd2VyIE9OIHBndGJsX2RkbF90ZXN0LmlkeGQgVVNJTkcgYnRyZWUgKGxv d2VyKG5hbWUpKTsKKyBDUkVBVEUgSU5ERVggaWR4ZF9wYXJ0aWFsIE9OIHBndGJsX2RkbF90ZXN0 LmlkeGQgVVNJTkcgYnRyZWUgKGlkKSBXSEVSRSAoaWQgPiAxMDApOworIEFMVEVSIFRBQkxFIHBn dGJsX2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9pZF9ub3RfbnVsbCBOT1QgTlVM TCBpZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlk eGRfcGtleSBQUklNQVJZIEtFWSAoaWQpOworKDUgcm93cykKKworLS0gSW5oZXJpdGFuY2UsIGlu Y2x1ZGluZyBhIGNoaWxkIERFRkFVTFQgb3ZlcnJpZGUgb24gYW4gaW5oZXJpdGVkIGNvbHVtbi4K K0NSRUFURSBUQUJMRSBwYXIgKGEgaW50IERFRkFVTFQgMSwgYiB0ZXh0KTsKK0NSRUFURSBUQUJM RSBjaCAoYyBpbnQpIElOSEVSSVRTIChwYXIpOworQUxURVIgVEFCTEUgY2ggQUxURVIgQ09MVU1O IGEgU0VUIERFRkFVTFQgOTk5OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdjaCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY2ggKCBjIGludGVn ZXIpIElOSEVSSVRTIChwZ3RibF9kZGxfdGVzdC5wYXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2Rk bF90ZXN0LmNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsKKygyIHJvd3MpCisKKy0t IFBlci1jb2x1bW4gYXR0b3B0aW9uczogZW1pdHRlZCBhcyBBTFRFUiBDT0xVTU4gU0VUICguLi4p LgorQ1JFQVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQsIGIgdGV4dCk7CitBTFRFUiBUQUJMRSBhdHRv cHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJs X2RkbF90ZXN0LmF0dG9wdCAoIGEgaW50ZWdlciwgYiB0ZXh0KTsKKyBBTFRFUiBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5hdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3RpbmN0PScxMDAnKTsK KygyIHJvd3MpCisKKy0tIFBhcnRpdGlvbmVkIHRhYmxlIHBhcmVudCAoUkFOR0UgYW5kIEhBU0gp LgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZSAoaWQgaW50LCBrIGludCkgUEFSVElUSU9OIEJZ IFJBTkdFIChpZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5n ZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFU RSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgKCBpZCBpbnRlZ2VyLCBrIGludGVn ZXIpIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFy dGVkX2hhc2ggKGlkIGludCkgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JF QVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9oYXNoICggaWQgaW50ZWdlcikgUEFSVElU SU9OIEJZIEhBU0ggKGlkKTsKKygxIHJvdykKKworLS0gUGFydGl0aW9uIGNoaWxkcmVuOiBGUk9N L1RPLCBXSVRIIChtb2R1bHVzLCByZW1haW5kZXIpLCBERUZBVUxULgorQ1JFQVRFIFRBQkxFIHBh cnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBGT1IgVkFMVUVTIEZS T00gKDApIFRPICgxMDApOworQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1O IGsgU0VUIERFRkFVTFQgNzsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVk X3JhbmdlXzEnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxf dGVzdC5wYXJ0ZWRfcmFuZ2UgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKKyBBTFRFUiBU QUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xVTU4gayBTRVQgREVG QVVMVCA3OworKDIgcm93cykKKworQ1JFQVRFIFRBQkxFIHBhcnRlZF9oYXNoXzAgUEFSVElUSU9O IE9GIHBhcnRlZF9oYXNoCisgICAgRk9SIFZBTFVFUyBXSVRIIChtb2R1bHVzIDIsIHJlbWFpbmRl ciAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX2hhc2hfMCc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaF8wIFBBUlRJVElPTiBPRiBwZ3Ri bF9kZGxfdGVzdC5wYXJ0ZWRfaGFzaCBGT1IgVkFMVUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWlu ZGVyIDApOworKDEgcm93KQorCitDUkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJ T04gT0YgcGFydGVkX3JhbmdlIERFRkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3BhcnRlZF9yYW5nZV9kZWYnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRf cmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgREVGQVVM VDsKKygxIHJvdykKKworLS0gUnVsZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlkIGludCk7CitDUkVB VEUgVEFCTEUgcnRfbG9nIChpZCBpbnQpOworQ1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyBP TiBJTlNFUlQgVE8gcnQKKyAgICBETyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMgKE5F Vy5pZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2Rk bCAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9k ZGxfdGVzdC5ydCAoIGlkIGludGVnZXIpOworIENSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICBPTiBJTlNFUlQgVE8gcGd0 YmxfZGRsX3Rlc3QucnQgRE8gIElOU0VSVCBJTlRPIHJ0X2xvZyAoaWQpKworICAgVkFMVUVTIChu ZXcuaWQpOworKDIgcm93cykKKworLS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4KK0NSRUFURSBUQUJM RSBzdHggKGEgaW50LCBiIGludCwgYyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJQ1Mgc3R4X25kdiAo bmRpc3RpbmN0KSBPTiBhLCBiIEZST00gc3R4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdzdHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdHggKCBhIGlu dGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyKTsKKyBDUkVBVEUgU1RBVElTVElDUyBwZ3RibF9k ZGxfdGVzdC5zdHhfbmR2IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7CisoMiByb3dzKQor CistLSBSb3ctbGV2ZWwgc2VjdXJpdHkgdG9nZ2xlcy4KK0NSRUFURSBUQUJMRSBybHMgKGlkIGlu dCk7CitBTFRFUiBUQUJMRSBybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKK0FMVEVSIFRB QkxFIHJscyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90 YWJsZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgKCBpZCBpbnRlZ2VyKTsKKyBBTFRFUiBUQUJM RSBwZ3RibF9kZGxfdGVzdC5ybHMgRU5BQkxFIFJPVyBMRVZFTCBTRUNVUklUWTsKKyBBTFRFUiBU QUJMRSBwZ3RibF9kZGxfdGVzdC5ybHMgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOworKDMgcm93 cykKKworLS0gUkVQTElDQSBJREVOVElUWTogZW1pdHRlZCBvbmx5IHdoZW4gbm90IHRoZSBkZWZh dWx0LgorQ1JFQVRFIFRBQkxFIHJpX2Z1bGwgKGEgaW50KTsKK0FMVEVSIFRBQkxFIHJpX2Z1bGwg UkVQTElDQSBJREVOVElUWSBGVUxMOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdy aV9mdWxsJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnJpX2Z1bGwgKCBhIGludGVnZXIpOworIEFMVEVSIFRBQkxFIHBn dGJsX2RkbF90ZXN0LnJpX2Z1bGwgUkVQTElDQSBJREVOVElUWSBGVUxMOworKDIgcm93cykKKwor Q1JFQVRFIFRBQkxFIHJpX2lkeCAoYSBpbnQgTk9UIE5VTEwpOworQ1JFQVRFIFVOSVFVRSBJTkRF WCByaV9pZHhfYSBPTiByaV9pZHggKGEpOworQUxURVIgVEFCTEUgcmlfaWR4IFJFUExJQ0EgSURF TlRJVFkgVVNJTkcgSU5ERVggcmlfaWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3JpX2lkeCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9k ZGxfdGVzdC5yaV9pZHggKCBhIGludGVnZXIgTk9UIE5VTEwpOworIENSRUFURSBVTklRVUUgSU5E RVggcmlfaWR4X2EgT04gcGd0YmxfZGRsX3Rlc3QucmlfaWR4IFVTSU5HIGJ0cmVlIChhKTsKKyBB TFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHggQUREIENPTlNUUkFJTlQgcmlfaWR4X2Ff bm90X251bGwgTk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9pZHgg UkVQTElDQSBJREVOVElUWSBVU0lORyBJTkRFWCByaV9pZHhfYTsKKyg0IHJvd3MpCisKKy0tIFVO TE9HR0VEICsgcmVsb3B0aW9ucy4KK0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1bm8gKGlkIGludCkg V0lUSCAoZmlsbGZhY3RvciA9IDcwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn dW5vJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFVOTE9HR0VEIFRBQkxFIHBndGJs X2RkbF90ZXN0LnVubyAoIGlkIGludGVnZXIpIFdJVEggKGZpbGxmYWN0b3I9JzcwJyk7CisoMSBy b3cpCisKKy0tIFR5cGVkIHRhYmxlIChDUkVBVEUgVEFCTEUgT0YgdHlwZV9uYW1lKS4gIENvbHVt bnMgaW5oZXJpdGVkIGZyb20gdGhlCistLSB0eXBlIGVtaXQgbm90aGluZzsgbG9jYWxseS1hcHBs aWVkIERFRkFVTFQsIE5PVCBOVUxMIGFuZCBDSEVDSyBjb21lCistLSBvdXQgdGhyb3VnaCBhIHNp bmdsZSAiKGNvbCBXSVRIIE9QVElPTlMgLi4uKSIgbGlzdC4KK0NSRUFURSBUWVBFIHR5cGVkX3Qg QVMgKGEgaW50LCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIHR5cGVkX3BsYWluIE9GIHR5cGVkX3Q7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3R5cGVkX3BsYWluJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnR5cGVkX3BsYWluIE9GIHBndGJsX2RkbF90ZXN0LnR5cGVkX3Q7 CisoMSByb3cpCisKK0NSRUFURSBUQUJMRSB0eXBlZF9vdmVyIE9GIHR5cGVkX3QgKAorICAgIGEg V0lUSCBPUFRJT05TIERFRkFVTFQgNyBOT1QgTlVMTCwKKyAgICBiIFdJVEggT1BUSU9OUyBOT1Qg TlVMTCwKKyAgICBDT05TVFJBSU5UIGJfbm9uZW1wdHkgQ0hFQ0sgKGxlbmd0aChiKSA+IDApCisp OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9vdmVyJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVf ZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LnR5cGVkX292ZXIgT0YgcGd0YmxfZGRsX3Rlc3QudHlwZWRfdCAoIGEgV0lUSCBPUFRJ T05TIERFRkFVTFQgNyBOT1QgTlVMTCwgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsIENPTlNUUkFJ TlQgYl9ub25lbXB0eSBDSEVDSyAoKGxlbmd0aChiKSA+IDApKSk7CisgQUxURVIgVEFCTEUgcGd0 YmxfZGRsX3Rlc3QudHlwZWRfb3ZlciBBREQgQ09OU1RSQUlOVCB0eXBlZF9vdmVyX2Ffbm90X251 bGwgTk9UIE5VTEwgYTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC50eXBlZF9vdmVyIEFE RCBDT05TVFJBSU5UIHR5cGVkX292ZXJfYl9ub3RfbnVsbCBOT1QgTlVMTCBiOworKDMgcm93cykK KworLS0gVGVtcG9yYXJ5IHRhYmxlcyArIE9OIENPTU1JVC4gIFRlbXAgdGFibGVzIGxpdmUgaW4g YSBzZXNzaW9uLWxvY2FsCistLSBuYW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMgYmV0d2VlbiBy dW5zLCBzbyB3ZSBzdHJpcCB0aGUgc2NoZW1hCistLSBwcmVmaXguICBPTiBDT01NSVQgRFJPUCBv bmx5IGZpcmVzIGF0IGNvbW1pdCwgc28gdGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVlZCB0byBzZWUg dGhlIGNhdGFsb2cgZW50cnkgbXVzdCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKy0t IHRoZSBDUkVBVEUuCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVmYXVsdCAoaWQg aW50KTsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVsZXRlIChpZCBpbnQpIE9OIENPTU1JVCBE RUxFVEUgUk9XUzsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50KSBPTiBDT01N SVQgRFJPUDsKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsi P1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2Rl ZmF1bHQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBM SUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVt cC50ZW1wX2RlZmF1bHQgKCBpZCBpbnRlZ2VyKTsKKygxIHJvdykKKworU0VMRUNUIHJlZ2V4cF9y ZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5l CitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEVNUE9S QVJZIFRBQkxFIHBnX3RlbXAudGVtcF9kZWxldGUgKCBpZCBpbnRlZ2VyKSBPTiBDT01NSVQgREVM RVRFIFJPV1M7CisoMSByb3cpCisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190 ZW1wXz9bMC05XSsiP1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCd0ZW1wX2Ryb3AnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hF UkUgbGluZSBMSUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50ZW1wX2Ryb3AgKCBpZCBpbnRlZ2Vy KSBPTiBDT01NSVQgRFJPUDsKKygxIHJvdykKKworUk9MTEJBQ0s7CistLSBQcmV0dHkgbW9kZS4K K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJywgJ3ByZXR0eScsICd0cnVlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxf dGVzdC5iYXNpYyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICArCisgICAgIGlkIGludGVnZXIgTk9UIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgbmFtZSB0ZXh0IENPTExBVEUg IkMiIERFRkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAg ICAgKworICk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJ TlQgYmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBu YW1lOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljIEFERCBDT05TVFJBSU5UIGJh c2ljX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKyg0IHJvd3MpCisKKy0tIGluY2x1ZGVzXyogZ2F0 aW5nOiBlYWNoIHN1Yi1vYmplY3QgY2F0ZWdvcnkgY2FuIGJlIHN1cHByZXNzZWQgaW5kaXZpZHVh bGx5LgorLS0gaW5jbHVkZXNfaW5kZXhlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIElOREVYIHN0 YXRlbWVudHMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5j bHVkZXNfaW5kZXhlcycsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCAoIGlkIGlu dGVnZXIgTk9UIE5VTEwsIG5hbWUgdGV4dCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3Qu aWR4ZCBBREQgQ09OU1RSQUlOVCBpZHhkX2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVS IFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9wa2V5IFBSSU1B UlkgS0VZIChpZCk7CisoMyByb3dzKQorCistLSBpbmNsdWRlc19jb25zdHJhaW50cz1mYWxzZSBo aWRlcyBib3RoIGlubGluZSBDSEVDSyBpbiBDUkVBVEUgVEFCTEUgYW5kCistLSB0aGUgQUxURVIg VEFCTEUgLi4uIEFERCBDT05TVFJBSU5UIGxpbmVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFi bGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2NvbnN0cmFpbnRzJywgJ2ZhbHNlJyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmNv bnMgKCBhIGludGVnZXIsIGIgaW50ZWdlciwgYyBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5j bHVkZXNfZm9yZWlnbl9rZXlzPWZhbHNlIHN1cHByZXNzZXMgb25seSBGT1JFSUdOIEtFWSBjb25z dHJhaW50czsKKy0tIFBSSU1BUlkgS0VZLCBVTklRVUUsIENIRUNLLCBhbmQgbmFtZWQgTk9UIE5V TEwgc3RheS4gIFRoaXMgaXMgdGhlCistLSBzY2hlbWEtY2xvbmluZyB3b3JrZmxvdzogZW1pdCB0 YWJsZXMgZmlyc3Qgd2l0aG91dCBjcm9zcy10YWJsZSBGS3MsCistLSB0aGVuIHJlLXJ1biB3aXRo IHRoZSBkZWZhdWx0IHRvIGFkZCB0aGVtIG9uY2UgYWxsIHRhcmdldHMgZXhpc3QuCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNl JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfZm9yZWlnbl9rZXlz JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zICggYSBpbnRlZ2Vy LCBiIGludGVnZXIsIGMgaW50ZWdlciwgQ09OU1RSQUlOVCBjb25zX2FfY2hlY2sgQ0hFQ0sgKChh ID4gMCkpKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zIEFERCBDT05TVFJBSU5U IGNvbnNfYl9rZXkgVU5JUVVFIChiKTsKKygyIHJvd3MpCisKKy0tIGluY2x1ZGVzX3J1bGVzPWZh bHNlIGhpZGVzIHRoZSBDUkVBVEUgUlVMRS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnaW5jbHVkZXNfcnVsZXMnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgIHBn X2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5ydCAo IGlkIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19zdGF0aXN0aWNzPWZhbHNlIGhp ZGVzIHRoZSBDUkVBVEUgU1RBVElTVElDUy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgnc3R4Jzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ2luY2x1ZGVzX3N0YXRpc3RpY3MnLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnN0eCAoIGEgaW50 ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19ybHM9 ZmFsc2UgaGlkZXMgdGhlIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkgdG9nZ2xlcy4K K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3Jscycs ICdmYWxzZScpOworICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucmxzICggaWQgaW50ZWdlcik7CisoMSByb3cpCisK Ky0tIGluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHk9ZmFsc2UgaGlkZXMgdGhlIFJFUExJQ0EgSURF TlRJVFkgY2xhdXNlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9mdWxsJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ2luY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHknLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAg ICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LnJpX2Z1bGwgKCBhIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19wYXJ0 aXRpb246IGRlZmF1bHQgaXMgZmFsc2UsIHNvIHRoZSBwYXJ0aXRpb25lZC10YWJsZSBwYXJlbnQK Ky0tIERETCBvbiBpdHMgb3duIGRvZXMgbm90IGluY2x1ZGUgaXRzIGNoaWxkcmVuLiAgU2V0dGlu ZyBpdCB0byB0cnVlCistLSBhcHBlbmRzIHRoZSBjaGlsZHJlbidzIERETCBhZnRlciB0aGUgcGFy ZW50LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2UnOjpyZWdj bGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn aW5jbHVkZXNfcGFydGl0aW9uJywgJ3RydWUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0Ymxf ZGRsX3Rlc3QucGFydGVkX3JhbmdlICggaWQgaW50ZWdlciwgayBpbnRlZ2VyKSBQQVJUSVRJT04g QlkgUkFOR0UgKGlkKTsKKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3Jhbmdl XzEgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZSBGT1IgVkFMVUVTIEZS T00gKDApIFRPICgxMDApOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5n ZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBERUZBVUxUIDc7CisgQ1JFQVRFIFRBQkxFIHBndGJsX2Rk bF90ZXN0LnBhcnRlZF9yYW5nZV9kZWYgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0LnBhcnRl ZF9yYW5nZSBERUZBVUxUOworKDQgcm93cykKKworLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBz dHJpcHMgdGhlIHNjaGVtYSBmcm9tIHRoZSB0YXJnZXQgdGFibGUgaXRzZWxmCistLSBhbmQgZnJv bSBzYW1lLXNjaGVtYSBzaWJsaW5nIHJlZmVyZW5jZXMgKGluaGVyaXRhbmNlL3BhcnRpdGlvbgor LS0gcGFyZW50cywgaWRlbnRpdHkgc2VxdWVuY2VzIGluIHRoZSBzYW1lIHNjaGVtYSksIHdoaWxl IGNyb3NzLXNjaGVtYQorLS0gcmVmZXJlbmNlcyBhcmUga2VwdCBxdWFsaWZpZWQgZm9yIGNvcnJl Y3RuZXNzLgorLS0KKy0tIEJhcmUgQ1JFQVRFIFRBQkxFIGZvciBhbiBvcmRpbmFyeSB0YWJsZS4K K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxp ZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJM RSBiYXNpYyAoIGlkIGludGVnZXIgTk9UIE5VTEwsIG5hbWUgdGV4dCBDT0xMQVRFICJDIiBERUZB VUxUICdhbm9uJzo6dGV4dCBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgYmFzaWMgQUREIENPTlNU UkFJTlQgYmFzaWNfaWRfbm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgYmFzaWMg QUREIENPTlNUUkFJTlQgYmFzaWNfbmFtZV9ub3RfbnVsbCBOT1QgTlVMTCBuYW1lOworIEFMVEVS IFRBQkxFIGJhc2ljIEFERCBDT05TVFJBSU5UIGJhc2ljX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsK Kyg0IHJvd3MpCisKKy0tIElOSEVSSVRTIHBhcmVudCBpbiB0aGUgc2FtZSBzY2hlbWEgaXMgZW1p dHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2gnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworICAgICAgICAgICAgICAgIHBnX2dldF90 YWJsZV9kZGwgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgY2ggKCBjIGludGVnZXIpIElOSEVSSVRT IChwYXIpOworIEFMVEVSIFRBQkxFIGNoIEFMVEVSIENPTFVNTiBhIFNFVCBERUZBVUxUIDk5OTsK KygyIHJvd3MpCisKKy0tIFBhcnRpdGlvbiBwYXJlbnQgaW4gdGhlIHNhbWUgc2NoZW1hIGlzIGVt aXR0ZWQgdW5xdWFsaWZpZWQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRl ZF9yYW5nZV8xJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUg VEFCTEUgcGFydGVkX3JhbmdlXzEgUEFSVElUSU9OIE9GIHBhcnRlZF9yYW5nZSBGT1IgVkFMVUVT IEZST00gKDApIFRPICgxMDApOworIEFMVEVSIFRBQkxFIHBhcnRlZF9yYW5nZV8xIEFMVEVSIENP TFVNTiBrIFNFVCBERUZBVUxUIDc7CisoMiByb3dzKQorCistLSBDcm9zcy1zY2hlbWEgRksgdGFy Z2V0IGtlZXBzIHF1YWxpZmljYXRpb24uICBUaGUgJ3JlZmQnIHRhYmxlIGlzIGluCistLSBwZ3Ri bF9kZGxfdGVzdDsgcGxhY2UgYW4gRksgdGFyZ2V0IGluIGEgZGlmZmVyZW50IHNjaGVtYSBhbmQg dmVyaWZ5IGl0CistLSBzdGF5cyBxdWFsaWZpZWQgZXZlbiB3aXRoIHNjaGVtYV9xdWFsaWZpZWQ9 ZmFsc2UuCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9vdGhlcjsKK0NSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfb3RoZXIucGFyZW50IChpZCBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIHhz Y2hlbWFfZmsgKAorICAgIGlkICBpbnQgUFJJTUFSWSBLRVksCisgICAgcGlkIGludCBSRUZFUkVO Q0VTIHBndGJsX2RkbF9vdGhlci5wYXJlbnQKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ3hzY2hlbWFfZmsnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgQ1JFQVRFIFRBQkxFIHhzY2hlbWFfZmsgKCBpZCBpbnRlZ2VyIE5PVCBOVUxMLCBwaWQg aW50ZWdlcik7CisgQUxURVIgVEFCTEUgeHNjaGVtYV9mayBBREQgQ09OU1RSQUlOVCB4c2NoZW1h X2ZrX2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRBQkxFIHhzY2hlbWFfZmsgQURE IENPTlNUUkFJTlQgeHNjaGVtYV9ma19waWRfZmtleSBGT1JFSUdOIEtFWSAocGlkKSBSRUZFUkVO Q0VTIHBndGJsX2RkbF9vdGhlci5wYXJlbnQoaWQpOworIEFMVEVSIFRBQkxFIHhzY2hlbWFfZmsg QUREIENPTlNUUkFJTlQgeHNjaGVtYV9ma19wa2V5IFBSSU1BUlkgS0VZIChpZCk7CisoNCByb3dz KQorCistLSBJZGVudGl0eSBjb2x1bW4gd2l0aCBhIGN1c3RvbSBzZXF1ZW5jZSBuYW1lIGluIHRo ZSBzYW1lIHNjaGVtYSBpcworLS0gZW1pdHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFs c2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBpZF9jdXN0b20gKCB2IGludGVn ZXIgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSAoU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5U IEJZIDUgTUlOVkFMVUUgNTAgTUFYVkFMVUUgMTAwMCBDQUNIRSAxMCBDWUNMRSkgTk9UIE5VTEwp OworIEFMVEVSIFRBQkxFIGlkX2N1c3RvbSBBREQgQ09OU1RSQUlOVCBpZF9jdXN0b21fdl9ub3Rf bnVsbCBOT1QgTlVMTCB2OworKDIgcm93cykKKworLS0gUm91bmQtdHJpcDogd2l0aCBzY2hlbWFf cXVhbGlmaWVkPWZhbHNlLCBhZnRlciBTRVQgc2VhcmNoX3BhdGggdGhlCistLSBEREwgY2FuIGJl IHJlcGxheWVkIGludG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHNjaGVtYS4KK0NSRUFURSBTQ0hFTUEg cGd0YmxfZGRsX3JlcGxheTsKK0RPICQkCitERUNMQVJFCisgICAgc3RtdCB0ZXh0OworQkVHSU4K KyAgICBTRVQgTE9DQUwgc2VhcmNoX3BhdGggPSBwZ3RibF9kZGxfcmVwbGF5OworICAgIEZPUiBz dG10IElOCisgICAgICAgIFNFTEVDVCBsaW5lIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0Ymxf ZGRsX3Rlc3QuYmFzaWMnOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpIEFTIGxpbmUKKyAg ICBMT09QCisgICAgICAgIEVYRUNVVEUgc3RtdDsKKyAgICBFTkQgTE9PUDsKK0VORCAkJDsKK1NF TEVDVCByZWxuYW1lc3BhY2U6OnJlZ25hbWVzcGFjZTo6dGV4dCwgcmVsbmFtZQorRlJPTSBwZ19j bGFzcyBXSEVSRSBvaWQgPSAncGd0YmxfZGRsX3JlcGxheS5iYXNpYyc6OnJlZ2NsYXNzOworICAg cmVsbmFtZXNwYWNlICAgfCByZWxuYW1lIAorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLQor IHBndGJsX2RkbF9yZXBsYXkgfCBiYXNpYworKDEgcm93KQorCitEUk9QIFNDSEVNQSBwZ3RibF9k ZGxfcmVwbGF5IENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBndGJs X2RkbF9yZXBsYXkuYmFzaWMKK0RST1AgVEFCTEUgeHNjaGVtYV9mazsKK0RST1AgU0NIRU1BIHBn dGJsX2RkbF9vdGhlciBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBw Z3RibF9kZGxfb3RoZXIucGFyZW50CistLSBMb2NhbGx5LWRlY2xhcmVkIENIRUNLIG9uIGEgcGFy dGl0aW9uIGNoaWxkIGhhcyBubyBpbmxpbmUgY29sdW1uCistLSBsaXN0IHRvIGxpdmUgaW4gKFBB UlRJVElPTiBPRiBmb3JtKSwgc28gaXQgbXVzdCBjb21lIG91dCBhcyBhCistLSBzZXBhcmF0ZSBB TFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJTlQgc3RhdGVtZW50LgorQ1JFQVRFIFRBQkxFIHBh cnRlZF9jaGsgKGlkIGludCwgdmFsIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7CitDUkVB VEUgVEFCTEUgcGFydGVkX2Noa19jaGlsZCBQQVJUSVRJT04gT0YgcGFydGVkX2NoaworICAgIChD T05TVFJBSU5UIGNoa19pbmxpbmUgQ0hFQ0sgKHZhbCA+IDApKQorICAgIEZPUiBWQUxVRVMgRlJP TSAoMCkgVE8gKDEwMCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9j aGtfY2hpbGQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9jaGtfY2hpbGQgUEFSVElUSU9OIE9GIHBndGJsX2Rk bF90ZXN0LnBhcnRlZF9jaGsgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKKyBBTFRFUiBU QUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfY2hrX2NoaWxkIEFERCBDT05TVFJBSU5UIGNoa19p bmxpbmUgQ0hFQ0sgKCh2YWwgPiAwKSk7CisoMiByb3dzKQorCitEUk9QIFRBQkxFIHBhcnRlZF9j aGs7CistLSBJbmhlcml0YW5jZSBjaGlsZHJlbiBvZiBhIHBhcmVudCB3aXRoIGEgZ2VuZXJhdGVk IGNvbHVtbiBzaG91bGQgbm90CistLSBlbWl0IGFuIEFMVEVSIENPTFVNTiAuLi4gU0VUIERFRkFV TFQgZm9yIHRoZSBpbmhlcml0ZWQgZ2VuZXJhdGVkCistLSBjb2x1bW46IHRoZSBHRU5FUkFURUQg ZXhwcmVzc2lvbiBjYXJyaWVzIGRvd24gdGhyb3VnaCBpbmhlcml0YW5jZSwKKy0tIGFuZCBTRVQg REVGQVVMVCB3b3VsZCBmYWlsIGF0IHJlcGxheSBhZ2FpbnN0IGEgZ2VuZXJhdGVkIGNvbHVtbi4K K0NSRUFURSBUQUJMRSBwYXJfZ2VuICgKKyAgICBpZCBpbnQsCisgICAgZyAgaW50IEdFTkVSQVRF RCBBTFdBWVMgQVMgKGlkICogMikgU1RPUkVECispOworQ1JFQVRFIFRBQkxFIGNoX2dlbiAoKSBJ TkhFUklUUyAocGFyX2dlbik7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoX2dl bic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jaF9nZW4gKCkgSU5I RVJJVFMgKHBndGJsX2RkbF90ZXN0LnBhcl9nZW4pOworKDEgcm93KQorCitEUk9QIFRBQkxFIHBh cl9nZW4gQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgY2hfZ2VuCist LSBVc2VyLW5hbWVkIE5PVCBOVUxMIGNvbnN0cmFpbnQgbXVzdCBiZSBlbWl0dGVkIGlubGluZSBh cworLS0gIkNPTlNUUkFJTlQgbmFtZSBOT1QgTlVMTCIgc28gYSByZXBsYXkgZG9lcyBub3QgY29s bGlkZSB3aXRoIHRoZQorLS0gYXV0by1uYW1lZCBOT1QgTlVMTCB0aGF0IFBvc3RncmVTUUwgd291 bGQgb3RoZXJ3aXNlIGNyZWF0ZSBmcm9tIGEKKy0tIHBsYWluIGlubGluZSAiTk9UIE5VTEwiLiAg VGhlIGNvbnN0cmFpbnQgbG9vcCBza2lwcyB0aGUgdXNlci1uYW1lZAorLS0gZW50cnkgdG8gYXZv aWQgZG91YmxlLWVtaXNzaW9uLgorQ1JFQVRFIFRBQkxFIG5uX25hbWVkICgKKyAgICBhIGludCBD T05TVFJBSU5UIG15X25uIE5PVCBOVUxMLAorICAgIGIgaW50IE5PVCBOVUxMCispOworU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdubl9uYW1lZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5ubl9uYW1lZCAoIGEgaW50ZWdlciBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxM LCBiIGludGVnZXIgTk9UIE5VTEwpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0Lm5uX25h bWVkIEFERCBDT05TVFJBSU5UIG5uX25hbWVkX2Jfbm90X251bGwgTk9UIE5VTEwgYjsKKygyIHJv d3MpCisKK0RST1AgVEFCTEUgbm5fbmFtZWQ7CistLSBMb2NhbGx5LWRlY2xhcmVkIE5PVCBOVUxM IG9uIGFuIGluaGVyaXRlZCBjb2x1bW4uICBUaGUgY29sdW1uIGl0c2VsZgorLS0gaXMgb21pdHRl ZCBmcm9tIHRoZSBjaGlsZCdzIGNvbHVtbiBsaXN0IChhdHRpc2xvY2FsPWZhbHNlKSwgc28gdGhl CistLSB1c2VyLW5hbWVkIE5PVCBOVUxMIG11c3QgY29tZSBvdXQgdmlhIHRoZSBwb3N0LUNSRUFU RSBjb25zdHJhaW50CistLSBsb29wIHJhdGhlciB0aGFuIGlubGluZS4KK0NSRUFURSBUQUJMRSBu bl9wYXIgKGEgaW50KTsKK0NSRUFURSBUQUJMRSBubl9jaCAoYiBpbnQpIElOSEVSSVRTIChubl9w YXIpOworQUxURVIgVEFCTEUgbm5fY2ggQUREIENPTlNUUkFJTlQgbXlfbm4gTk9UIE5VTEwgYTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnbm5fY2gnOjpyZWdjbGFzcywgJ293bmVy JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0Lm5uX2NoICggYiBpbnRlZ2Vy KSBJTkhFUklUUyAocGd0YmxfZGRsX3Rlc3Qubm5fcGFyKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9k ZGxfdGVzdC5ubl9jaCBBREQgQ09OU1RSQUlOVCBteV9ubiBOT1QgTlVMTCBhOworKDIgcm93cykK KworRFJPUCBUQUJMRSBubl9wYXIgQ0FTQ0FERTsKK05PVElDRTogIGRyb3AgY2FzY2FkZXMgdG8g dGFibGUgbm5fY2gKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2UgbXVzdCBkcm9wIHRoZSBzY2hl bWEgcHJlZml4IGZyb20gREVGQVVMVAorLS0gZXhwcmVzc2lvbnMgYW5kIGlubGluZSBDSEVDSyBi b2RpZXMgdGhhdCByZWZlcmVuY2Ugc2FtZS1zY2hlbWEKKy0tIG9iamVjdHMgKHNlcXVlbmNlIHZp YSBuZXh0dmFsLCBmdW5jdGlvbiB2aWEgZGlyZWN0IGNhbGwpLiAgVGhpcworLS0gcmVsaWVzIG9u IHRoZSBkZXBhcnNlciByZXNwZWN0aW5nIHRoZSBuYXJyb3dlZCBzZWFyY2hfcGF0aCByYXRoZXIK Ky0tIHRoYW4gb24gc3Vic3RyaW5nIHN0cmlwcGluZy4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRs X3hyZWY7CitDUkVBVEUgU0VRVUVOQ0UgcGd0YmxfZGRsX3hyZWYubXlzZXE7CitDUkVBVEUgRlVO Q1RJT04gcGd0YmxfZGRsX3hyZWYuZihpbnQpIFJFVFVSTlMgaW50IExBTkdVQUdFIHNxbCBJTU1V VEFCTEUKKyAgICBBUyAnU0VMRUNUICQxJzsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfeHJlZi50 ICgKKyAgICBpZCAgaW50IERFRkFVTFQgbmV4dHZhbCgncGd0YmxfZGRsX3hyZWYubXlzZXEnKSwK KyAgICB2YWwgaW50LAorICAgIENPTlNUUkFJTlQgY2hrIENIRUNLIChwZ3RibF9kZGxfeHJlZi5m KHZhbCkgPiAwKQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0YmxfZGRs X3hyZWYudCc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25l cicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFs aWZpZWQnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSB0ICggaWQgaW50ZWdlciBE RUZBVUxUIG5leHR2YWwoJ215c2VxJzo6cmVnY2xhc3MpLCB2YWwgaW50ZWdlciwgQ09OU1RSQUlO VCBjaGsgQ0hFQ0sgKChmKHZhbCkgPiAwKSkpOworKDEgcm93KQorCitEUk9QIFNDSEVNQSBwZ3Ri bF9kZGxfeHJlZiBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byAzIG90aGVyIG9i amVjdHMKK0RFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gc2VxdWVuY2UgcGd0YmxfZGRsX3hyZWYu bXlzZXEKK2Ryb3AgY2FzY2FkZXMgdG8gZnVuY3Rpb24gcGd0YmxfZGRsX3hyZWYuZihpbnRlZ2Vy KQorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwZ3RibF9kZGxfeHJlZi50CistLSBzY2hlbWFfcXVh bGlmaWVkPWZhbHNlIG11c3QgTk9UIGNvcnJ1cHQgc3RyaW5nIGxpdGVyYWxzIHdob3NlCistLSBj b250ZW50cyBoYXBwZW4gdG8gY29udGFpbiB0aGUgc2NoZW1hIG5hbWUgZm9sbG93ZWQgYnkgYSBk b3QuICBUaGUKKy0tIGluLXN0cmluZyBzdGF0ZSBvZiB0aGUgcHJlZml4IHN0cmlwcGVyIHByZXNl cnZlcyB0aGVtIHZlcmJhdGltLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfc3RyOworQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF9zdHIucCAoaWQgaW50LCBub3RlIHRleHQpIFBBUlRJVElPTiBCWSBS QU5HRSAoaWQpOworQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF9zdHIucGMgUEFSVElUSU9OIE9GIHBn dGJsX2RkbF9zdHIucAorICAgIChDT05TVFJBSU5UIGNoayBDSEVDSyAobm90ZSA8PiAncGd0Ymxf ZGRsX3N0ci5zZWNyZXQnKSkKKyAgICBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMDApOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfc3RyLnBjJzo6cmVnY2xhc3Ms CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRBQkxFIHBjIFBBUlRJVElPTiBPRiBwIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEw MCk7CisgQUxURVIgVEFCTEUgcGMgQUREIENPTlNUUkFJTlQgY2hrIENIRUNLICgobm90ZSA8PiAn cGd0YmxfZGRsX3N0ci5zZWNyZXQnOjp0ZXh0KSk7CisoMiByb3dzKQorCitEUk9QIFNDSEVNQSBw Z3RibF9kZGxfc3RyIENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBn dGJsX2RkbF9zdHIucAorLS0gc2NoZW1hX3F1YWxpZmllZD1mYWxzZSBtdXN0IE5PVCBjb3JydXB0 IGRvdWJsZS1xdW90ZWQgaWRlbnRpZmllcnMKKy0tIHdob3NlIGNvbnRlbnRzIGhhcHBlbiB0byBj b250YWluIHRoZSBzY2hlbWEgbmFtZSBmb2xsb3dlZCBieSBhIGRvdAorLS0gKGZvciBleGFtcGxl IGEgY29sdW1uIGxpdGVyYWxseSBuYW1lZCAiPHNjaGVtYT4ud2VpcmQiIGluc2lkZSB0aGF0Cist LSBzY2hlbWEpLiAgVGhlIGluLWlkZW50IHN0YXRlIG9mIHRoZSBwcmVmaXggc3RyaXBwZXIgcHJl c2VydmVzIHRoZW0KKy0tIHZlcmJhdGltLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfcWlkOwor Q1JFQVRFIFRBQkxFIHBndGJsX2RkbF9xaWQucCAoaWQgaW50LCAicGd0YmxfZGRsX3FpZC53ZWly ZCIgaW50KQorICAgIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworQ1JFQVRFIFRBQkxFIHBndGJs X2RkbF9xaWQucGMgUEFSVElUSU9OIE9GIHBndGJsX2RkbF9xaWQucAorICAgIChDT05TVFJBSU5U IGNoayBDSEVDSyAoInBndGJsX2RkbF9xaWQud2VpcmQiID4gMCkpCisgICAgRk9SIFZBTFVFUyBG Uk9NICgwKSBUTyAoMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0Ymxf ZGRsX3FpZC5wYyc6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9x dWFsaWZpZWQnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRf dGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRBQkxFIHBjIFBBUlRJVElPTiBPRiBwIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEw MCk7CisgQUxURVIgVEFCTEUgcGMgQUREIENPTlNUUkFJTlQgY2hrIENIRUNLICgoInBndGJsX2Rk bF9xaWQud2VpcmQiID4gMCkpOworKDIgcm93cykKKworRFJPUCBTQ0hFTUEgcGd0YmxfZGRsX3Fp ZCBDQVNDQURFOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBwZ3RibF9kZGxfcWlk LnAKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2Ugd2hlbiB0aGUgYmFzZSBzY2hlbWEgbmFtZSBp dHNlbGYgcmVxdWlyZXMKKy0tIHF1b3RpbmcgKGl0cyBwcmVmaXggc3RhcnRzIHdpdGggIikuICBC b3RoIGZvcm1zIG9mIHRoZSBwcmVmaXggLQorLS0gYmFyZS1sb3dlcmNhc2UgYW5kIHF1b3RlZCAt IG11c3QgYmUgc3RyaXBwZWQgZnJvbSBvdXRlcgorLS0gQUxURVIgVEFCTEUgLyBPTiAvIENSRUFU RSBJTkRFWCBwcmVmaXhlcywgd2hpbGUgaW5uZXIgcXVvdGVkCistLSBpZGVudGlmaWVycyB0aGF0 IGhhcHBlbiB0byBiZWdpbiB0aGUgc2FtZSB3YXkgbXVzdCBiZSBwcmVzZXJ2ZWQuCitDUkVBVEUg U0NIRU1BICJQZ1RibC1EZGwtUSI7CitDUkVBVEUgVEFCTEUgIlBnVGJsLURkbC1RIi4iVCIgKGlk IGludCwgdmFsIGludCwKKyAgICBDT05TVFJBSU5UIGNoayBDSEVDSyAodmFsID4gMCkpOworQ1JF QVRFIElOREVYICJUX3ZhbF9pZHgiIE9OICJQZ1RibC1EZGwtUSIuIlQiICh2YWwpOworU0VMRUNU ICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCciUGdUYmwtRGRsLVEiLiJUIic6OnJlZ2NsYXNzLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFsc2UnKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBU QUJMRSAiVCIgKCBpZCBpbnRlZ2VyLCB2YWwgaW50ZWdlciwgQ09OU1RSQUlOVCBjaGsgQ0hFQ0sg KCh2YWwgPiAwKSkpOworIENSRUFURSBJTkRFWCAiVF92YWxfaWR4IiBPTiAiVCIgVVNJTkcgYnRy ZWUgKHZhbCk7CisoMiByb3dzKQorCitEUk9QIFNDSEVNQSAiUGdUYmwtRGRsLVEiIENBU0NBREU7 CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlICJQZ1RibC1EZGwtUSIuIlQiCistLSBF cnJvcjogbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlLgorQ1JFQVRFIFZJRVcg diBBUyBTRUxFQ1QgMSBBUyB4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd2Jzo6 cmVnY2xhc3MpOworRVJST1I6ICAidiIgaXMgbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVk IHRhYmxlCitDUkVBVEUgU0VRVUVOQ0UgczsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgncyc6OnJlZ2NsYXNzKTsKK0VSUk9SOiAgInMiIGlzIG5vdCBhbiBvcmRpbmFyeSBvciBwYXJ0 aXRpb25lZCB0YWJsZQorLS0gTlVMTCBhcmd1bWVudCByZXR1cm5zIG5vIHJvd3MuCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoTlVMTCk7CisgcGdfZ2V0X3RhYmxlX2RkbCAKKy0tLS0t LS0tLS0tLS0tLS0tLQorKDAgcm93cykKKworLS0gVW5yZWNvZ25pemVkIG9wdGlvbi4KK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ2JvZ3VzJywgJ3Ry dWUnKTsKK0VSUk9SOiAgdW5yZWNvZ25pemVkIG9wdGlvbjogImJvZ3VzIgorLS0gT2RkIG51bWJl ciBvZiB2YXJpYWRpYyBhcmdzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNp Yyc6OnJlZ2NsYXNzLCAncHJldHR5Jyk7CitFUlJPUjogIHZhcmlhZGljIGFyZ3VtZW50cyBtdXN0 IGJlIG5hbWUvdmFsdWUgcGFpcnMKK0hJTlQ6ICBQcm92aWRlIGFuIGV2ZW4gbnVtYmVyIG9mIHZh cmlhZGljIGFyZ3VtZW50cyB0aGF0IGNhbiBiZSBkaXZpZGVkIGludG8gcGFpcnMuCistLSBSb3Vu ZC10cmlwIHZlcmlmaWNhdGlvbi4gIEZvciBldmVyeSB0ZXN0IHRhYmxlLCBjYXB0dXJlIHRoZSBE REwgdGhlCistLSBmdW5jdGlvbiBlbWl0cywgZHJvcCB0aGUgc2NoZW1hLCByZXBsYXkgZWFjaCB0 YWJsZSdzIERETCBpbgorLS0gZGVwZW5kZW5jeSBvcmRlciwgYW5kIGNvbmZpcm0gdGhhdCBwZ19n ZXRfdGFibGVfZGRsIG9uIHRoZSByZWNyZWF0ZWQKKy0tIHJlbGF0aW9uIG1hdGNoZXMgdGhlIG9y aWdpbmFsIGxpbmUtZm9yLWxpbmUuICBUaGUgZmluYWwgU0VMRUNUIG11c3QKKy0tIHJldHVybiB6 ZXJvIHJvd3MuCitDUkVBVEUgVEVNUCBUQUJMRSBwZ3RibF9kZGxfcnRfb3JpZyAobmFtZSB0ZXh0 LCBvcmQgaW50LCBsaW5lIHRleHQpOworSU5TRVJUIElOVE8gcGd0YmxfZGRsX3J0X29yaWcKK1NF TEVDVCB0Lm5hbWUsIG8ub3JkLCBvLmxpbmUKK0ZST00gKFZBTFVFUworICAgICAgICAoJ2Jhc2lj JyksICgnaWRfY29scycpLCAoJ2lkX2N1c3RvbScpLCAoJ2dlbl9jb2xzJyksICgnc3RvcmFnZV9j b2xzJyksCisgICAgICAgICgncmVmZCcpLCAoJ2NvbnMnKSwgKCdpZHhkJyksCisgICAgICAgICgn cGFyJyksICgnY2gnKSwgKCdhdHRvcHQnKSwKKyAgICAgICAgKCdwYXJ0ZWRfcmFuZ2UnKSwgKCdw YXJ0ZWRfcmFuZ2VfMScpLCAoJ3BhcnRlZF9yYW5nZV9kZWYnKSwKKyAgICAgICAgKCdwYXJ0ZWRf aGFzaCcpLCAoJ3BhcnRlZF9oYXNoXzAnKSwKKyAgICAgICAgKCdydF9sb2cnKSwgKCdydCcpLAor ICAgICAgICAoJ3N0eCcpLCAoJ3JscycpLCAoJ3JpX2Z1bGwnKSwgKCdyaV9pZHgnKSwgKCd1bm8n KQorICAgICApIEFTIHQobmFtZSksCisgICAgIExBVEVSQUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3Bn dGJsX2RkbF90ZXN0LicgfHwgdC5uYW1lKTo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnKSBXSVRIIE9SRElOQUxJVFkgbyhsaW5lLCBvcmQp OworRE8gJCQKK0RFQ0xBUkUKKyAgICB0YWJsZXMgQ09OU1RBTlQgdGV4dFtdIDo9IEFSUkFZWwor ICAgICAgICAnYmFzaWMnLCAnaWRfY29scycsICdpZF9jdXN0b20nLCAnZ2VuX2NvbHMnLCAnc3Rv cmFnZV9jb2xzJywKKyAgICAgICAgJ3JlZmQnLCAnY29ucycsICdpZHhkJywKKyAgICAgICAgJ3Bh cicsICdjaCcsICdhdHRvcHQnLAorICAgICAgICAncGFydGVkX3JhbmdlJywgJ3BhcnRlZF9yYW5n ZV8xJywgJ3BhcnRlZF9yYW5nZV9kZWYnLAorICAgICAgICAncGFydGVkX2hhc2gnLCAncGFydGVk X2hhc2hfMCcsCisgICAgICAgICdydF9sb2cnLCAncnQnLAorICAgICAgICAnc3R4JywgJ3Jscycs ICdyaV9mdWxsJywgJ3JpX2lkeCcsICd1bm8nCisgICAgXTsKKyAgICB0IHRleHQ7CisgICAgc3Rt dCB0ZXh0OworQkVHSU4KKyAgICBEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVzdCBDQVNDQURFOwor ICAgIENSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CisgICAgRk9SRUFDSCB0IElOIEFSUkFZ IHRhYmxlcyBMT09QCisgICAgICAgIEZPUiBzdG10IElOCisgICAgICAgICAgICBTRUxFQ1QgbGlu ZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnIFdIRVJFIG5hbWUgPSB0IE9SREVSIEJZIG9yZAorICAg ICAgICBMT09QCisgICAgICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAgICAgIEVORCBMT09QOwor ICAgIEVORCBMT09QOworRU5EICQkOworTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byAyNSBvdGhl ciBvYmplY3RzCitERVRBSUw6ICBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGJhc2ljCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIGlkX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWRfY3VzdG9t Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGdlbl9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IHN0b3JhZ2VfY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSByZWZkCitkcm9wIGNhc2NhZGVz IHRvIHRhYmxlIGNvbnMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWR4ZAorZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBwYXIKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY2gKK2Ryb3AgY2FzY2FkZXMg dG8gdGFibGUgYXR0b3B0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9yYW5nZQorZHJv cCBjYXNjYWRlcyB0byB0YWJsZSBwYXJ0ZWRfaGFzaAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBy dAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBydF9sb2cKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUg c3R4Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJscworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBy aV9mdWxsCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJpX2lkeAorZHJvcCBjYXNjYWRlcyB0byB0 YWJsZSB1bm8KK2Ryb3AgY2FzY2FkZXMgdG8gdHlwZSB0eXBlZF90Citkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIHR5cGVkX3BsYWluCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHR5cGVkX292ZXIKK2Ry b3AgY2FzY2FkZXMgdG8gdmlldyB2Citkcm9wIGNhc2NhZGVzIHRvIHNlcXVlbmNlIHMKK1dJVEgg YWZ0ZXJfZGRsIEFTICgKKyAgICBTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5saW5lCisgICAgRlJP TSAoU0VMRUNUIERJU1RJTkNUIG5hbWUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZykgQVMgdCwKKyAg ICAgICAgIExBVEVSQUwgcGdfZ2V0X3RhYmxlX2RkbCgoJ3BndGJsX2RkbF90ZXN0LicgfHwgdC5u YW1lKTo6cmVnY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVy JywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKQorKQorKFNFTEVDVCAnbWlz c2luZy1pbi1jb3B5JyBBUyBraW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxfcnRf b3JpZworIEVYQ0VQVAorIFNFTEVDVCAnbWlzc2luZy1pbi1jb3B5JywgbmFtZSwgb3JkLCBsaW5l IEZST00gYWZ0ZXJfZGRsKQorVU5JT04gQUxMCisoU0VMRUNUICdleHRyYS1pbi1jb3B5JyBBUyBr aW5kLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBhZnRlcl9kZGwKKyBFWENFUFQKKyBTRUxFQ1QgJ2V4 dHJhLWluLWNvcHknLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBwZ3RibF9kZGxfcnRfb3JpZykKK09S REVSIEJZIGtpbmQsIG5hbWUsIG9yZDsKKyBraW5kIHwgbmFtZSB8IG9yZCB8IGxpbmUgCistLS0t LS0rLS0tLS0tKy0tLS0tKy0tLS0tLQorKDAgcm93cykKKworLS0gQ2xlYW51cC4KK0RST1AgU0NI RU1BIHBndGJsX2RkbF90ZXN0IENBU0NBREU7CitOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIDIw IG90aGVyIG9iamVjdHMKK0RFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgYmFzaWMKK2Ry b3AgY2FzY2FkZXMgdG8gdGFibGUgaWRfY29scworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZF9j dXN0b20KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgZ2VuX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8g dGFibGUgc3RvcmFnZV9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJlZmQKK2Ryb3AgY2Fz Y2FkZXMgdG8gdGFibGUgY29ucworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZHhkCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIHBhcgorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjaAorZHJvcCBjYXNj YWRlcyB0byB0YWJsZSBhdHRvcHQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFydGVkX3Jhbmdl Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9oYXNoCitkcm9wIGNhc2NhZGVzIHRvIHRh YmxlIHJ0X2xvZworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBydAorZHJvcCBjYXNjYWRlcyB0byB0 YWJsZSBzdHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmxzCitkcm9wIGNhc2NhZGVzIHRvIHRh YmxlIHJpX2Z1bGwKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfaWR4Citkcm9wIGNhc2NhZGVz IHRvIHRhYmxlIHVubwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hl ZHVsZSBiL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKaW5kZXggOGZhMGE2YzQ3 ZmIuLjllY2E2NGNjYTNiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3Nj aGVkdWxlCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKQEAgLTgxLDcg KzgxLDcgQEAgdGVzdDogY3JlYXRlX3RhYmxlX2xpa2UgYWx0ZXJfZ2VuZXJpYyBhbHRlcl9vcGVy YXRvciBtaXNjIGFzeW5jIGRic2l6ZSBtZXJnZSBtaXMKICMgY29sbGF0ZS5saW51eC51dGY4IGFu ZCBjb2xsYXRlLmljdS51dGY4IHRlc3RzIGNhbm5vdCBiZSBydW4gaW4gcGFyYWxsZWwgd2l0aCBl YWNoIG90aGVyCiAjIHBzcWwgZGVwZW5kcyBvbiBjcmVhdGVfYW0KICMgYW11dGlscyBkZXBlbmRz IG9uIGdlb21ldHJ5LCBjcmVhdGVfaW5kZXhfc3BnaXN0LCBoYXNoX2luZGV4LCBicmluCi10ZXN0 OiBydWxlcyBwc3FsIHBzcWxfY3Jvc3N0YWIgcHNxbF9waXBlbGluZSBhbXV0aWxzIHN0YXRzX2V4 dCBjb2xsYXRlLmxpbnV4LnV0ZjggY29sbGF0ZS53aW5kb3dzLndpbjEyNTIKK3Rlc3Q6IHJ1bGVz IHBzcWwgcHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVsaW5lIGFtdXRpbHMgc3RhdHNfZXh0IGNvbGxh dGUubGludXgudXRmOCBjb2xsYXRlLndpbmRvd3Mud2luMTI1MiBwZ19nZXRfdGFibGVfZGRsCiAK ICMgLS0tLS0tLS0tLQogIyBSdW4gdGhlc2UgYWxvbmUgc28gdGhleSBkb24ndCBydW4gb3V0IG9m IHBhcmFsbGVsIHdvcmtlcnMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BnX2dl dF90YWJsZV9kZGwuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5z cWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmUzM2VjMTVhZmY4Ci0t LSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5z cWwKQEAgLTAsMCArMSw0NDcgQEAKKy0tCistLSBwZ19nZXRfdGFibGVfZGRsCistLQorLS0gQWxs IHRlc3RzIHBhc3Mgb3duZXI9PmZhbHNlIHNvIHRoZSBBTFRFUiBUQUJMRSBPV05FUiBUTyBsaW5l IGlzIG5vdAorLS0gZW1pdHRlZCwga2VlcGluZyBvdXRwdXQgc3RhYmxlIGFjcm9zcyB0ZXN0IHJ1 bm5lcnMgKHdoaWNoIG1heSBydW4gdW5kZXIKKy0tIGRpZmZlcmVudCByb2xlIG5hbWVzKS4KKy0t CitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF90ZXN0OworU0VUIHNlYXJjaF9wYXRoID0gcGd0Ymxf ZGRsX3Rlc3Q7CisKKy0tIEJhc2ljIHRhYmxlIHdpdGggUFJJTUFSWSBLRVksIE5PVCBOVUxMLCBE RUZBVUxULCBDT0xMQVRFLgorQ1JFQVRFIFRBQkxFIGJhc2ljICgKKyAgICBpZCBpbnQgUFJJTUFS WSBLRVksCisgICAgbmFtZSB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJ2Fub24nIENPTExBVEUgIkMi CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnKTsKKworLS0gSWRlbnRpdHkgY29sdW1ucyAod2l0aCBkZWZhdWx0IGFu ZCBjdXN0b20gc2VxdWVuY2Ugb3B0aW9ucykuCitDUkVBVEUgVEFCTEUgaWRfY29scyAoCisgICAg aWRfYWx3YXlzIGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZLAorICAgIGlkX2RlZmF1 bHQgaW50IEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZCispOworU0VMRUNUICogRlJP TSBwZ19nZXRfdGFibGVfZGRsKCdpZF9jb2xzJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScp OworCitDUkVBVEUgVEFCTEUgaWRfY3VzdG9tICgKKyAgICB2IGludCBHRU5FUkFURUQgQUxXQVlT IEFTIElERU5USVRZICgKKyAgICAgICAgU0VRVUVOQ0UgTkFNRSBpZF9jdXN0b21fdl9zZXEKKyAg ICAgICAgU1RBUlQgV0lUSCAxMDAgSU5DUkVNRU5UIEJZIDUKKyAgICAgICAgTUlOVkFMVUUgNTAg TUFYVkFMVUUgMTAwMAorICAgICAgICBDQUNIRSAxMCBDWUNMRQorICAgICkKKyk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2N1c3RvbSc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKworLS0gR2VuZXJhdGVkIHN0b3JlZCBjb2x1bW4uCitDUkVBVEUgVEFCTEUgZ2Vu X2NvbHMgKAorICAgIGNlbnRzIGludCwKKyAgICBkb2xsYXJzIG51bWVyaWMgR0VORVJBVEVEIEFM V0FZUyBBUyAoY2VudHMgLyAxMDAuMCkgU1RPUkVECispOworU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdnZW5fY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0g U1RPUkFHRSBhbmQgQ09NUFJFU1NJT04gKG9ubHkgZW1pdHRlZCB3aGVuIG5vbi1kZWZhdWx0IGZv ciB0aGUgdHlwZSkuCitDUkVBVEUgVEFCTEUgc3RvcmFnZV9jb2xzICgKKyAgICBhIHRleHQgU1RP UkFHRSBFWFRFUk5BTCwKKyAgICBiIHRleHQgU1RPUkFHRSBNQUlOLAorICAgIGMgdGV4dCBDT01Q UkVTU0lPTiBwZ2x6CispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdG9yYWdl X2NvbHMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIENvbnN0cmFpbnRzOiBD SEVDSywgVU5JUVVFLCBGT1JFSUdOIEtFWSAoREVGRVJSQUJMRSkuCitDUkVBVEUgVEFCTEUgcmVm ZCAoaWQgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBjb25zICgKKyAgICBhIGludCBD SEVDSyAoYSA+IDApLAorICAgIGIgaW50IFVOSVFVRSwKKyAgICBjIGludCBSRUZFUkVOQ0VTIHJl ZmQoaWQpIERFRkVSUkFCTEUgSU5JVElBTExZIERFRkVSUkVECispOworU0VMRUNUICogRlJPTSBw Z19nZXRfdGFibGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCist LSBJbmRleGVzOiBmdW5jdGlvbmFsIGFuZCBwYXJ0aWFsLiAgQ29uc3RyYWludC1iYWNraW5nIGlu ZGV4ZXMgYXJlCistLSBzdXBwcmVzc2VkICh0aGV5IGFyZSBlbWl0dGVkIGJ5IHRoZSBjb25zdHJh aW50IGxvb3ApLgorQ1JFQVRFIFRBQkxFIGlkeGQgKGlkIGludCBQUklNQVJZIEtFWSwgbmFtZSB0 ZXh0KTsKK0NSRUFURSBJTkRFWCBpZHhkX2xvd2VyIE9OIGlkeGQgKGxvd2VyKG5hbWUpKTsKK0NS RUFURSBJTkRFWCBpZHhkX3BhcnRpYWwgT04gaWR4ZCAoaWQpIFdIRVJFIGlkID4gMTAwOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdpZHhkJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworCistLSBJbmhlcml0YW5jZSwgaW5jbHVkaW5nIGEgY2hpbGQgREVGQVVMVCBvdmVy cmlkZSBvbiBhbiBpbmhlcml0ZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIHBhciAoYSBpbnQgREVG QVVMVCAxLCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIGNoIChjIGludCkgSU5IRVJJVFMgKHBhcik7 CitBTFRFUiBUQUJMRSBjaCBBTFRFUiBDT0xVTU4gYSBTRVQgREVGQVVMVCA5OTk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScp OworCistLSBQZXItY29sdW1uIGF0dG9wdGlvbnM6IGVtaXR0ZWQgYXMgQUxURVIgQ09MVU1OIFNF VCAoLi4uKS4KK0NSRUFURSBUQUJMRSBhdHRvcHQgKGEgaW50LCBiIHRleHQpOworQUxURVIgVEFC TEUgYXR0b3B0IEFMVEVSIENPTFVNTiBhIFNFVCAobl9kaXN0aW5jdCA9IDEwMCk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2F0dG9wdCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnKTsKKworLS0gUGFydGl0aW9uZWQgdGFibGUgcGFyZW50IChSQU5HRSBhbmQgSEFTSCkuCitD UkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlIChpZCBpbnQsIGsgaW50KSBQQVJUSVRJT04gQlkgUkFO R0UgKGlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgcGFydGVkX2hhc2gg KGlkIGludCkgUEFSVElUSU9OIEJZIEhBU0ggKGlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgncGFydGVkX2hhc2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0t IFBhcnRpdGlvbiBjaGlsZHJlbjogRlJPTS9UTywgV0lUSCAobW9kdWx1cywgcmVtYWluZGVyKSwg REVGQVVMVC4KK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2VfMSBQQVJUSVRJT04gT0YgcGFydGVk X3JhbmdlCisgICAgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAwKTsKK0FMVEVSIFRBQkxFIHBh cnRlZF9yYW5nZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBERUZBVUxUIDc7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9yYW5nZV8xJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworCitDUkVBVEUgVEFCTEUgcGFydGVkX2hhc2hfMCBQQVJUSVRJT04gT0YgcGFydGVk X2hhc2gKKyAgICBGT1IgVkFMVUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWluZGVyIDApOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfaGFzaF8wJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworCitDUkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlX2RlZiBQQVJUSVRJ T04gT0YgcGFydGVkX3JhbmdlIERFRkFVTFQ7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3BhcnRlZF9yYW5nZV9kZWYnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0t IFJ1bGVzLgorQ1JFQVRFIFRBQkxFIHJ0IChpZCBpbnQpOworQ1JFQVRFIFRBQkxFIHJ0X2xvZyAo aWQgaW50KTsKK0NSRUFURSBSVUxFIHJ0X2xvZ19pbnNlcnQgQVMgT04gSU5TRVJUIFRPIHJ0Cisg ICAgRE8gQUxTTyBJTlNFUlQgSU5UTyBydF9sb2cgVkFMVUVTIChORVcuaWQpOworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KworLS0gRXh0ZW5kZWQgc3RhdGlzdGljcy4KK0NSRUFURSBUQUJMRSBzdHggKGEgaW50LCBiIGlu dCwgYyBpbnQpOworQ1JFQVRFIFNUQVRJU1RJQ1Mgc3R4X25kdiAobmRpc3RpbmN0KSBPTiBhLCBi IEZST00gc3R4OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdHgnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFJvdy1sZXZlbCBzZWN1cml0eSB0b2dnbGVzLgor Q1JFQVRFIFRBQkxFIHJscyAoaWQgaW50KTsKK0FMVEVSIFRBQkxFIHJscyBFTkFCTEUgUk9XIExF VkVMIFNFQ1VSSVRZOworQUxURVIgVEFCTEUgcmxzIEZPUkNFIFJPVyBMRVZFTCBTRUNVUklUWTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScpOworCistLSBSRVBMSUNBIElERU5USVRZOiBlbWl0dGVkIG9ubHkgd2hlbiBub3Qg dGhlIGRlZmF1bHQuCitDUkVBVEUgVEFCTEUgcmlfZnVsbCAoYSBpbnQpOworQUxURVIgVEFCTEUg cmlfZnVsbCBSRVBMSUNBIElERU5USVRZIEZVTEw7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ3JpX2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBU QUJMRSByaV9pZHggKGEgaW50IE5PVCBOVUxMKTsKK0NSRUFURSBVTklRVUUgSU5ERVggcmlfaWR4 X2EgT04gcmlfaWR4IChhKTsKK0FMVEVSIFRBQkxFIHJpX2lkeCBSRVBMSUNBIElERU5USVRZIFVT SU5HIElOREVYIHJpX2lkeF9hOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdyaV9p ZHgnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFVOTE9HR0VEICsgcmVsb3B0 aW9ucy4KK0NSRUFURSBVTkxPR0dFRCBUQUJMRSB1bm8gKGlkIGludCkgV0lUSCAoZmlsbGZhY3Rv ciA9IDcwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndW5vJzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCistLSBUeXBlZCB0YWJsZSAoQ1JFQVRFIFRBQkxFIE9GIHR5 cGVfbmFtZSkuICBDb2x1bW5zIGluaGVyaXRlZCBmcm9tIHRoZQorLS0gdHlwZSBlbWl0IG5vdGhp bmc7IGxvY2FsbHktYXBwbGllZCBERUZBVUxULCBOT1QgTlVMTCBhbmQgQ0hFQ0sgY29tZQorLS0g b3V0IHRocm91Z2ggYSBzaW5nbGUgIihjb2wgV0lUSCBPUFRJT05TIC4uLikiIGxpc3QuCitDUkVB VEUgVFlQRSB0eXBlZF90IEFTIChhIGludCwgYiB0ZXh0KTsKK0NSRUFURSBUQUJMRSB0eXBlZF9w bGFpbiBPRiB0eXBlZF90OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0eXBlZF9w bGFpbic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworQ1JFQVRFIFRBQkxFIHR5cGVk X292ZXIgT0YgdHlwZWRfdCAoCisgICAgYSBXSVRIIE9QVElPTlMgREVGQVVMVCA3IE5PVCBOVUxM LAorICAgIGIgV0lUSCBPUFRJT05TIE5PVCBOVUxMLAorICAgIENPTlNUUkFJTlQgYl9ub25lbXB0 eSBDSEVDSyAobGVuZ3RoKGIpID4gMCkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3R5cGVkX292ZXInOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFRlbXBv cmFyeSB0YWJsZXMgKyBPTiBDT01NSVQuICBUZW1wIHRhYmxlcyBsaXZlIGluIGEgc2Vzc2lvbi1s b2NhbAorLS0gbmFtZXNwYWNlIHdob3NlIG5hbWUgdmFyaWVzIGJldHdlZW4gcnVucywgc28gd2Ug c3RyaXAgdGhlIHNjaGVtYQorLS0gcHJlZml4LiAgT04gQ09NTUlUIERST1Agb25seSBmaXJlcyBh dCBjb21taXQsIHNvIHRoZSBxdWVyaWVzIHRoYXQKKy0tIG5lZWQgdG8gc2VlIHRoZSBjYXRhbG9n IGVudHJ5IG11c3QgcnVuIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCistLSB0aGUgQ1JFQVRF LgorQkVHSU47CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2RlZmF1bHQgKGlkIGludCk7CitDUkVB VEUgVEVNUCBUQUJMRSB0ZW1wX2RlbGV0ZSAoaWQgaW50KSBPTiBDT01NSVQgREVMRVRFIFJPV1M7 CitDUkVBVEUgVEVNUCBUQUJMRSB0ZW1wX2Ryb3AgKGlkIGludCkgT04gQ09NTUlUIERST1A7CisK K1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsiP1wuJywgJ3Bn X3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2RlZmF1bHQnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGluZSBMSUtFICdDUkVB VEUgJSc7CisKK1NFTEVDVCByZWdleHBfcmVwbGFjZShsaW5lLCAnIj9wZ190ZW1wXz9bMC05XSsi P1wuJywgJ3BnX3RlbXAuJykgQVMgbGluZQorRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd0ZW1wX2Rl bGV0ZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBsaW5lIExJ S0UgJ0NSRUFURSAlJzsKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBf P1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwo J3RlbXBfZHJvcCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBs aW5lIExJS0UgJ0NSRUFURSAlJzsKK1JPTExCQUNLOworCistLSBQcmV0dHkgbW9kZS4KK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJywgJ3ByZXR0eScsICd0cnVlJyk7CisKKy0tIGluY2x1ZGVzXyogZ2F0aW5nOiBlYWNoIHN1 Yi1vYmplY3QgY2F0ZWdvcnkgY2FuIGJlIHN1cHByZXNzZWQgaW5kaXZpZHVhbGx5LgorLS0gaW5j bHVkZXNfaW5kZXhlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIElOREVYIHN0YXRlbWVudHMuCitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpyZWdjbGFzcywgJ293bmVyJywg J2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfaW5kZXhl cycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19jb25zdHJhaW50cz1mYWxzZSBoaWRlcyBib3Ro IGlubGluZSBDSEVDSyBpbiBDUkVBVEUgVEFCTEUgYW5kCistLSB0aGUgQUxURVIgVEFCTEUgLi4u IEFERCBDT05TVFJBSU5UIGxpbmVzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdj b25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJ2luY2x1ZGVzX2NvbnN0cmFpbnRzJywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVz X2ZvcmVpZ25fa2V5cz1mYWxzZSBzdXBwcmVzc2VzIG9ubHkgRk9SRUlHTiBLRVkgY29uc3RyYWlu dHM7CistLSBQUklNQVJZIEtFWSwgVU5JUVVFLCBDSEVDSywgYW5kIG5hbWVkIE5PVCBOVUxMIHN0 YXkuICBUaGlzIGlzIHRoZQorLS0gc2NoZW1hLWNsb25pbmcgd29ya2Zsb3c6IGVtaXQgdGFibGVz IGZpcnN0IHdpdGhvdXQgY3Jvc3MtdGFibGUgRktzLAorLS0gdGhlbiByZS1ydW4gd2l0aCB0aGUg ZGVmYXVsdCB0byBhZGQgdGhlbSBvbmNlIGFsbCB0YXJnZXRzIGV4aXN0LgorU0VMRUNUICogRlJP TSBwZ19nZXRfdGFibGVfZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX2ZvcmVpZ25fa2V5cycsICdm YWxzZScpOworCistLSBpbmNsdWRlc19ydWxlcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRFIFJVTEUu CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3J1bGVz JywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX3N0YXRpc3RpY3M9ZmFsc2UgaGlkZXMgdGhlIENS RUFURSBTVEFUSVNUSUNTLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzdHgnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAnaW5jbHVkZXNfc3RhdGlzdGljcycsICdmYWxzZScpOworCistLSBpbmNsdWRlc19ybHM9ZmFs c2UgaGlkZXMgdGhlIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkgdG9nZ2xlcy4KK1NF TEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3JscycsICdm YWxzZScpOworCistLSBpbmNsdWRlc19yZXBsaWNhX2lkZW50aXR5PWZhbHNlIGhpZGVzIHRoZSBS RVBMSUNBIElERU5USVRZIGNsYXVzZS4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgn cmlfZnVsbCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdpbmNsdWRlc19yZXBsaWNhX2lkZW50aXR5JywgJ2ZhbHNlJyk7CisKKy0t IGluY2x1ZGVzX3BhcnRpdGlvbjogZGVmYXVsdCBpcyBmYWxzZSwgc28gdGhlIHBhcnRpdGlvbmVk LXRhYmxlIHBhcmVudAorLS0gRERMIG9uIGl0cyBvd24gZG9lcyBub3QgaW5jbHVkZSBpdHMgY2hp bGRyZW4uICBTZXR0aW5nIGl0IHRvIHRydWUKKy0tIGFwcGVuZHMgdGhlIGNoaWxkcmVuJ3MgRERM IGFmdGVyIHRoZSBwYXJlbnQuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRl ZF9yYW5nZSc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdpbmNsdWRlc19wYXJ0aXRpb24nLCAndHJ1ZScpOworCistLSBzY2hlbWFf cXVhbGlmaWVkPWZhbHNlIHN0cmlwcyB0aGUgc2NoZW1hIGZyb20gdGhlIHRhcmdldCB0YWJsZSBp dHNlbGYKKy0tIGFuZCBmcm9tIHNhbWUtc2NoZW1hIHNpYmxpbmcgcmVmZXJlbmNlcyAoaW5oZXJp dGFuY2UvcGFydGl0aW9uCistLSBwYXJlbnRzLCBpZGVudGl0eSBzZXF1ZW5jZXMgaW4gdGhlIHNh bWUgc2NoZW1hKSwgd2hpbGUgY3Jvc3Mtc2NoZW1hCistLSByZWZlcmVuY2VzIGFyZSBrZXB0IHF1 YWxpZmllZCBmb3IgY29ycmVjdG5lc3MuCistLQorLS0gQmFyZSBDUkVBVEUgVEFCTEUgZm9yIGFu IG9yZGluYXJ5IHRhYmxlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIElOSEVSSVRTIHBhcmVudCBp biB0aGUgc2FtZSBzY2hlbWEgaXMgZW1pdHRlZCB1bnF1YWxpZmllZC4KK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnY2gnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScpOwor CistLSBQYXJ0aXRpb24gcGFyZW50IGluIHRoZSBzYW1lIHNjaGVtYSBpcyBlbWl0dGVkIHVucXVh bGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2VfMSc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisKKy0tIENyb3NzLXNjaGVtYSBGSyB0 YXJnZXQga2VlcHMgcXVhbGlmaWNhdGlvbi4gIFRoZSAncmVmZCcgdGFibGUgaXMgaW4KKy0tIHBn dGJsX2RkbF90ZXN0OyBwbGFjZSBhbiBGSyB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgc2NoZW1hIGFu ZCB2ZXJpZnkgaXQKKy0tIHN0YXlzIHF1YWxpZmllZCBldmVuIHdpdGggc2NoZW1hX3F1YWxpZmll ZD1mYWxzZS4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX290aGVyOworQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF9vdGhlci5wYXJlbnQgKGlkIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUg eHNjaGVtYV9mayAoCisgICAgaWQgIGludCBQUklNQVJZIEtFWSwKKyAgICBwaWQgaW50IFJFRkVS RU5DRVMgcGd0YmxfZGRsX290aGVyLnBhcmVudAorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Rh YmxlX2RkbCgneHNjaGVtYV9mayc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CisK Ky0tIElkZW50aXR5IGNvbHVtbiB3aXRoIGEgY3VzdG9tIHNlcXVlbmNlIG5hbWUgaW4gdGhlIHNh bWUgc2NoZW1hIGlzCistLSBlbWl0dGVkIHVucXVhbGlmaWVkLgorU0VMRUNUICogRlJPTSBwZ19n ZXRfdGFibGVfZGRsKCdpZF9jdXN0b20nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NoZW1hX3F1YWxpZmllZCcsICdmYWxzZScp OworCistLSBSb3VuZC10cmlwOiB3aXRoIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2UsIGFmdGVyIFNF VCBzZWFyY2hfcGF0aCB0aGUKKy0tIERETCBjYW4gYmUgcmVwbGF5ZWQgaW50byBhIGRpZmZlcmVu dCB0YXJnZXQgc2NoZW1hLgorQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfcmVwbGF5OworRE8gJCQK K0RFQ0xBUkUKKyAgICBzdG10IHRleHQ7CitCRUdJTgorICAgIFNFVCBMT0NBTCBzZWFyY2hfcGF0 aCA9IHBndGJsX2RkbF9yZXBsYXk7CisgICAgRk9SIHN0bXQgSU4KKyAgICAgICAgU0VMRUNUIGxp bmUgRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwZ3RibF9kZGxfdGVzdC5iYXNpYyc6OnJlZ2NsYXNz LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2Zh bHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFf cXVhbGlmaWVkJywgJ2ZhbHNlJykgQVMgbGluZQorICAgIExPT1AKKyAgICAgICAgRVhFQ1VURSBz dG10OworICAgIEVORCBMT09QOworRU5EICQkOworU0VMRUNUIHJlbG5hbWVzcGFjZTo6cmVnbmFt ZXNwYWNlOjp0ZXh0LCByZWxuYW1lCitGUk9NIHBnX2NsYXNzIFdIRVJFIG9pZCA9ICdwZ3RibF9k ZGxfcmVwbGF5LmJhc2ljJzo6cmVnY2xhc3M7CitEUk9QIFNDSEVNQSBwZ3RibF9kZGxfcmVwbGF5 IENBU0NBREU7CitEUk9QIFRBQkxFIHhzY2hlbWFfZms7CitEUk9QIFNDSEVNQSBwZ3RibF9kZGxf b3RoZXIgQ0FTQ0FERTsKKworLS0gTG9jYWxseS1kZWNsYXJlZCBDSEVDSyBvbiBhIHBhcnRpdGlv biBjaGlsZCBoYXMgbm8gaW5saW5lIGNvbHVtbgorLS0gbGlzdCB0byBsaXZlIGluIChQQVJUSVRJ T04gT0YgZm9ybSksIHNvIGl0IG11c3QgY29tZSBvdXQgYXMgYQorLS0gc2VwYXJhdGUgQUxURVIg VEFCTEUgLi4uIEFERCBDT05TVFJBSU5UIHN0YXRlbWVudC4KK0NSRUFURSBUQUJMRSBwYXJ0ZWRf Y2hrIChpZCBpbnQsIHZhbCBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworQ1JFQVRFIFRB QkxFIHBhcnRlZF9jaGtfY2hpbGQgUEFSVElUSU9OIE9GIHBhcnRlZF9jaGsKKyAgICAoQ09OU1RS QUlOVCBjaGtfaW5saW5lIENIRUNLICh2YWwgPiAwKSkKKyAgICBGT1IgVkFMVUVTIEZST00gKDAp IFRPICgxMDApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfY2hrX2No aWxkJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworRFJPUCBUQUJMRSBwYXJ0ZWRfY2hr OworCistLSBJbmhlcml0YW5jZSBjaGlsZHJlbiBvZiBhIHBhcmVudCB3aXRoIGEgZ2VuZXJhdGVk IGNvbHVtbiBzaG91bGQgbm90CistLSBlbWl0IGFuIEFMVEVSIENPTFVNTiAuLi4gU0VUIERFRkFV TFQgZm9yIHRoZSBpbmhlcml0ZWQgZ2VuZXJhdGVkCistLSBjb2x1bW46IHRoZSBHRU5FUkFURUQg ZXhwcmVzc2lvbiBjYXJyaWVzIGRvd24gdGhyb3VnaCBpbmhlcml0YW5jZSwKKy0tIGFuZCBTRVQg REVGQVVMVCB3b3VsZCBmYWlsIGF0IHJlcGxheSBhZ2FpbnN0IGEgZ2VuZXJhdGVkIGNvbHVtbi4K K0NSRUFURSBUQUJMRSBwYXJfZ2VuICgKKyAgICBpZCBpbnQsCisgICAgZyAgaW50IEdFTkVSQVRF RCBBTFdBWVMgQVMgKGlkICogMikgU1RPUkVECispOworQ1JFQVRFIFRBQkxFIGNoX2dlbiAoKSBJ TkhFUklUUyAocGFyX2dlbik7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoX2dl bic6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKK0RST1AgVEFCTEUgcGFyX2dlbiBDQVND QURFOworCistLSBVc2VyLW5hbWVkIE5PVCBOVUxMIGNvbnN0cmFpbnQgbXVzdCBiZSBlbWl0dGVk IGlubGluZSBhcworLS0gIkNPTlNUUkFJTlQgbmFtZSBOT1QgTlVMTCIgc28gYSByZXBsYXkgZG9l cyBub3QgY29sbGlkZSB3aXRoIHRoZQorLS0gYXV0by1uYW1lZCBOT1QgTlVMTCB0aGF0IFBvc3Rn cmVTUUwgd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSBmcm9tIGEKKy0tIHBsYWluIGlubGluZSAiTk9U IE5VTEwiLiAgVGhlIGNvbnN0cmFpbnQgbG9vcCBza2lwcyB0aGUgdXNlci1uYW1lZAorLS0gZW50 cnkgdG8gYXZvaWQgZG91YmxlLWVtaXNzaW9uLgorQ1JFQVRFIFRBQkxFIG5uX25hbWVkICgKKyAg ICBhIGludCBDT05TVFJBSU5UIG15X25uIE5PVCBOVUxMLAorICAgIGIgaW50IE5PVCBOVUxMCisp OworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdubl9uYW1lZCc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnKTsKK0RST1AgVEFCTEUgbm5fbmFtZWQ7CisKKy0tIExvY2FsbHktZGVj bGFyZWQgTk9UIE5VTEwgb24gYW4gaW5oZXJpdGVkIGNvbHVtbi4gIFRoZSBjb2x1bW4gaXRzZWxm CistLSBpcyBvbWl0dGVkIGZyb20gdGhlIGNoaWxkJ3MgY29sdW1uIGxpc3QgKGF0dGlzbG9jYWw9 ZmFsc2UpLCBzbyB0aGUKKy0tIHVzZXItbmFtZWQgTk9UIE5VTEwgbXVzdCBjb21lIG91dCB2aWEg dGhlIHBvc3QtQ1JFQVRFIGNvbnN0cmFpbnQKKy0tIGxvb3AgcmF0aGVyIHRoYW4gaW5saW5lLgor Q1JFQVRFIFRBQkxFIG5uX3BhciAoYSBpbnQpOworQ1JFQVRFIFRBQkxFIG5uX2NoIChiIGludCkg SU5IRVJJVFMgKG5uX3Bhcik7CitBTFRFUiBUQUJMRSBubl9jaCBBREQgQ09OU1RSQUlOVCBteV9u biBOT1QgTlVMTCBhOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdubl9jaCc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKK0RST1AgVEFCTEUgbm5fcGFyIENBU0NBREU7CisK Ky0tIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2UgbXVzdCBkcm9wIHRoZSBzY2hlbWEgcHJlZml4IGZy b20gREVGQVVMVAorLS0gZXhwcmVzc2lvbnMgYW5kIGlubGluZSBDSEVDSyBib2RpZXMgdGhhdCBy ZWZlcmVuY2Ugc2FtZS1zY2hlbWEKKy0tIG9iamVjdHMgKHNlcXVlbmNlIHZpYSBuZXh0dmFsLCBm dW5jdGlvbiB2aWEgZGlyZWN0IGNhbGwpLiAgVGhpcworLS0gcmVsaWVzIG9uIHRoZSBkZXBhcnNl ciByZXNwZWN0aW5nIHRoZSBuYXJyb3dlZCBzZWFyY2hfcGF0aCByYXRoZXIKKy0tIHRoYW4gb24g c3Vic3RyaW5nIHN0cmlwcGluZy4KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3hyZWY7CitDUkVB VEUgU0VRVUVOQ0UgcGd0YmxfZGRsX3hyZWYubXlzZXE7CitDUkVBVEUgRlVOQ1RJT04gcGd0Ymxf ZGRsX3hyZWYuZihpbnQpIFJFVFVSTlMgaW50IExBTkdVQUdFIHNxbCBJTU1VVEFCTEUKKyAgICBB UyAnU0VMRUNUICQxJzsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfeHJlZi50ICgKKyAgICBpZCAg aW50IERFRkFVTFQgbmV4dHZhbCgncGd0YmxfZGRsX3hyZWYubXlzZXEnKSwKKyAgICB2YWwgaW50 LAorICAgIENPTlNUUkFJTlQgY2hrIENIRUNLIChwZ3RibF9kZGxfeHJlZi5mKHZhbCkgPiAwKQor KTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGd0YmxfZGRsX3hyZWYudCc6OnJl Z2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9xdWFsaWZpZWQnLCAnZmFs c2UnKTsKK0RST1AgU0NIRU1BIHBndGJsX2RkbF94cmVmIENBU0NBREU7CisKKy0tIHNjaGVtYV9x dWFsaWZpZWQ9ZmFsc2UgbXVzdCBOT1QgY29ycnVwdCBzdHJpbmcgbGl0ZXJhbHMgd2hvc2UKKy0t IGNvbnRlbnRzIGhhcHBlbiB0byBjb250YWluIHRoZSBzY2hlbWEgbmFtZSBmb2xsb3dlZCBieSBh IGRvdC4gIFRoZQorLS0gaW4tc3RyaW5nIHN0YXRlIG9mIHRoZSBwcmVmaXggc3RyaXBwZXIgcHJl c2VydmVzIHRoZW0gdmVyYmF0aW0uCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF9zdHI7CitDUkVB VEUgVEFCTEUgcGd0YmxfZGRsX3N0ci5wIChpZCBpbnQsIG5vdGUgdGV4dCkgUEFSVElUSU9OIEJZ IFJBTkdFIChpZCk7CitDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3N0ci5wYyBQQVJUSVRJT04gT0Yg cGd0YmxfZGRsX3N0ci5wCisgICAgKENPTlNUUkFJTlQgY2hrIENIRUNLIChub3RlIDw+ICdwZ3Ri bF9kZGxfc3RyLnNlY3JldCcpKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BndGJsX2RkbF9zdHIucGMnOjpyZWdjbGFz cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7 CitEUk9QIFNDSEVNQSBwZ3RibF9kZGxfc3RyIENBU0NBREU7CisKKy0tIHNjaGVtYV9xdWFsaWZp ZWQ9ZmFsc2UgbXVzdCBOT1QgY29ycnVwdCBkb3VibGUtcXVvdGVkIGlkZW50aWZpZXJzCistLSB3 aG9zZSBjb250ZW50cyBoYXBwZW4gdG8gY29udGFpbiB0aGUgc2NoZW1hIG5hbWUgZm9sbG93ZWQg YnkgYSBkb3QKKy0tIChmb3IgZXhhbXBsZSBhIGNvbHVtbiBsaXRlcmFsbHkgbmFtZWQgIjxzY2hl bWE+LndlaXJkIiBpbnNpZGUgdGhhdAorLS0gc2NoZW1hKS4gIFRoZSBpbi1pZGVudCBzdGF0ZSBv ZiB0aGUgcHJlZml4IHN0cmlwcGVyIHByZXNlcnZlcyB0aGVtCistLSB2ZXJiYXRpbS4KK0NSRUFU RSBTQ0hFTUEgcGd0YmxfZGRsX3FpZDsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfcWlkLnAgKGlk IGludCwgInBndGJsX2RkbF9xaWQud2VpcmQiIGludCkKKyAgICBQQVJUSVRJT04gQlkgUkFOR0Ug KGlkKTsKK0NSRUFURSBUQUJMRSBwZ3RibF9kZGxfcWlkLnBjIFBBUlRJVElPTiBPRiBwZ3RibF9k ZGxfcWlkLnAKKyAgICAoQ09OU1RSQUlOVCBjaGsgQ0hFQ0sgKCJwZ3RibF9kZGxfcWlkLndlaXJk IiA+IDApKQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ3BndGJsX2RkbF9xaWQucGMnOjpyZWdjbGFzcywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICdzY2hlbWFfcXVhbGlmaWVkJywgJ2ZhbHNlJyk7CitEUk9QIFNDSEVN QSBwZ3RibF9kZGxfcWlkIENBU0NBREU7CisKKy0tIHNjaGVtYV9xdWFsaWZpZWQ9ZmFsc2Ugd2hl biB0aGUgYmFzZSBzY2hlbWEgbmFtZSBpdHNlbGYgcmVxdWlyZXMKKy0tIHF1b3RpbmcgKGl0cyBw cmVmaXggc3RhcnRzIHdpdGggIikuICBCb3RoIGZvcm1zIG9mIHRoZSBwcmVmaXggLQorLS0gYmFy ZS1sb3dlcmNhc2UgYW5kIHF1b3RlZCAtIG11c3QgYmUgc3RyaXBwZWQgZnJvbSBvdXRlcgorLS0g QUxURVIgVEFCTEUgLyBPTiAvIENSRUFURSBJTkRFWCBwcmVmaXhlcywgd2hpbGUgaW5uZXIgcXVv dGVkCistLSBpZGVudGlmaWVycyB0aGF0IGhhcHBlbiB0byBiZWdpbiB0aGUgc2FtZSB3YXkgbXVz dCBiZSBwcmVzZXJ2ZWQuCitDUkVBVEUgU0NIRU1BICJQZ1RibC1EZGwtUSI7CitDUkVBVEUgVEFC TEUgIlBnVGJsLURkbC1RIi4iVCIgKGlkIGludCwgdmFsIGludCwKKyAgICBDT05TVFJBSU5UIGNo ayBDSEVDSyAodmFsID4gMCkpOworQ1JFQVRFIElOREVYICJUX3ZhbF9pZHgiIE9OICJQZ1RibC1E ZGwtUSIuIlQiICh2YWwpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCciUGdUYmwt RGRsLVEiLiJUIic6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdv d25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjaGVtYV9x dWFsaWZpZWQnLCAnZmFsc2UnKTsKK0RST1AgU0NIRU1BICJQZ1RibC1EZGwtUSIgQ0FTQ0FERTsK KworLS0gRXJyb3I6IG5vdCBhbiBvcmRpbmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZS4KK0NSRUFU RSBWSUVXIHYgQVMgU0VMRUNUIDEgQVMgeDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgndic6OnJlZ2NsYXNzKTsKKworQ1JFQVRFIFNFUVVFTkNFIHM7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3MnOjpyZWdjbGFzcyk7CisKKy0tIE5VTEwgYXJndW1lbnQgcmV0dXJu cyBubyByb3dzLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKE5VTEwpOworCistLSBV bnJlY29nbml6ZWQgb3B0aW9uLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNp Yyc6OnJlZ2NsYXNzLCAnYm9ndXMnLCAndHJ1ZScpOworCistLSBPZGQgbnVtYmVyIG9mIHZhcmlh ZGljIGFyZ3MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xh c3MsICdwcmV0dHknKTsKKworLS0gUm91bmQtdHJpcCB2ZXJpZmljYXRpb24uICBGb3IgZXZlcnkg dGVzdCB0YWJsZSwgY2FwdHVyZSB0aGUgRERMIHRoZQorLS0gZnVuY3Rpb24gZW1pdHMsIGRyb3Ag dGhlIHNjaGVtYSwgcmVwbGF5IGVhY2ggdGFibGUncyBEREwgaW4KKy0tIGRlcGVuZGVuY3kgb3Jk ZXIsIGFuZCBjb25maXJtIHRoYXQgcGdfZ2V0X3RhYmxlX2RkbCBvbiB0aGUgcmVjcmVhdGVkCist LSByZWxhdGlvbiBtYXRjaGVzIHRoZSBvcmlnaW5hbCBsaW5lLWZvci1saW5lLiAgVGhlIGZpbmFs IFNFTEVDVCBtdXN0CistLSByZXR1cm4gemVybyByb3dzLgorQ1JFQVRFIFRFTVAgVEFCTEUgcGd0 YmxfZGRsX3J0X29yaWcgKG5hbWUgdGV4dCwgb3JkIGludCwgbGluZSB0ZXh0KTsKK0lOU0VSVCBJ TlRPIHBndGJsX2RkbF9ydF9vcmlnCitTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5saW5lCitGUk9N IChWQUxVRVMKKyAgICAgICAgKCdiYXNpYycpLCAoJ2lkX2NvbHMnKSwgKCdpZF9jdXN0b20nKSwg KCdnZW5fY29scycpLCAoJ3N0b3JhZ2VfY29scycpLAorICAgICAgICAoJ3JlZmQnKSwgKCdjb25z JyksICgnaWR4ZCcpLAorICAgICAgICAoJ3BhcicpLCAoJ2NoJyksICgnYXR0b3B0JyksCisgICAg ICAgICgncGFydGVkX3JhbmdlJyksICgncGFydGVkX3JhbmdlXzEnKSwgKCdwYXJ0ZWRfcmFuZ2Vf ZGVmJyksCisgICAgICAgICgncGFydGVkX2hhc2gnKSwgKCdwYXJ0ZWRfaGFzaF8wJyksCisgICAg ICAgICgncnRfbG9nJyksICgncnQnKSwKKyAgICAgICAgKCdzdHgnKSwgKCdybHMnKSwgKCdyaV9m dWxsJyksICgncmlfaWR4JyksICgndW5vJykKKyAgICAgKSBBUyB0KG5hbWUpLAorICAgICBMQVRF UkFMIHBnX2dldF90YWJsZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2Ns YXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJykgV0lU SCBPUkRJTkFMSVRZIG8obGluZSwgb3JkKTsKKworRE8gJCQKK0RFQ0xBUkUKKyAgICB0YWJsZXMg Q09OU1RBTlQgdGV4dFtdIDo9IEFSUkFZWworICAgICAgICAnYmFzaWMnLCAnaWRfY29scycsICdp ZF9jdXN0b20nLCAnZ2VuX2NvbHMnLCAnc3RvcmFnZV9jb2xzJywKKyAgICAgICAgJ3JlZmQnLCAn Y29ucycsICdpZHhkJywKKyAgICAgICAgJ3BhcicsICdjaCcsICdhdHRvcHQnLAorICAgICAgICAn cGFydGVkX3JhbmdlJywgJ3BhcnRlZF9yYW5nZV8xJywgJ3BhcnRlZF9yYW5nZV9kZWYnLAorICAg ICAgICAncGFydGVkX2hhc2gnLCAncGFydGVkX2hhc2hfMCcsCisgICAgICAgICdydF9sb2cnLCAn cnQnLAorICAgICAgICAnc3R4JywgJ3JscycsICdyaV9mdWxsJywgJ3JpX2lkeCcsICd1bm8nCisg ICAgXTsKKyAgICB0IHRleHQ7CisgICAgc3RtdCB0ZXh0OworQkVHSU4KKyAgICBEUk9QIFNDSEVN QSBwZ3RibF9kZGxfdGVzdCBDQVNDQURFOworICAgIENSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rl c3Q7CisgICAgRk9SRUFDSCB0IElOIEFSUkFZIHRhYmxlcyBMT09QCisgICAgICAgIEZPUiBzdG10 IElOCisgICAgICAgICAgICBTRUxFQ1QgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnIFdIRVJF IG5hbWUgPSB0IE9SREVSIEJZIG9yZAorICAgICAgICBMT09QCisgICAgICAgICAgICBFWEVDVVRF IHN0bXQ7CisgICAgICAgIEVORCBMT09QOworICAgIEVORCBMT09QOworRU5EICQkOworCitXSVRI IGFmdGVyX2RkbCBBUyAoCisgICAgU0VMRUNUIHQubmFtZSwgby5vcmQsIG8ubGluZQorICAgIEZS T00gKFNFTEVDVCBESVNUSU5DVCBuYW1lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpIEFTIHQsCisg ICAgICAgICBMQVRFUkFMIHBnX2dldF90YWJsZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQu bmFtZSk6OnJlZ2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25l cicsICdmYWxzZScpIFdJVEggT1JESU5BTElUWSBvKGxpbmUsIG9yZCkKKykKKyhTRUxFQ1QgJ21p c3NpbmctaW4tY29weScgQVMga2luZCwgbmFtZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0 X29yaWcKKyBFWENFUFQKKyBTRUxFQ1QgJ21pc3NpbmctaW4tY29weScsIG5hbWUsIG9yZCwgbGlu ZSBGUk9NIGFmdGVyX2RkbCkKK1VOSU9OIEFMTAorKFNFTEVDVCAnZXh0cmEtaW4tY29weScgQVMg a2luZCwgbmFtZSwgb3JkLCBsaW5lIEZST00gYWZ0ZXJfZGRsCisgRVhDRVBUCisgU0VMRUNUICdl eHRyYS1pbi1jb3B5JywgbmFtZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpCitP UkRFUiBCWSBraW5kLCBuYW1lLCBvcmQ7CisKKy0tIENsZWFudXAuCitEUk9QIFNDSEVNQSBwZ3Ri bF9kZGxfdGVzdCBDQVNDQURFOwotLSAKMi41MS4wCgo= --0000000000008e54e606549a4f27--