Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vCO0J-00DHD7-Pl for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Oct 2025 20:03:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vCO0H-000mwD-Db for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Oct 2025 20:03:12 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vCO0G-000mw5-S3 for pgsql-hackers@lists.postgresql.org; Fri, 24 Oct 2025 20:03:12 +0000 Received: from mail-yx1-xb135.google.com ([2607:f8b0:4864:20::b135]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vCO0D-003amg-0P for pgsql-hackers@lists.postgresql.org; Fri, 24 Oct 2025 20:03:11 +0000 Received: by mail-yx1-xb135.google.com with SMTP id 956f58d0204a3-633c1b740c5so2830313d50.3 for ; Fri, 24 Oct 2025 13:03:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761336188; x=1761940988; darn=lists.postgresql.org; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=Psu3stQf/pnAW1hJFfMZGriu7ZM76ugyWD2ha7EdAlY=; b=PlCvYFIE+h3YkUHJgq0GmE9AUYw+sgm9IUuubROkZCNENYFfdkfgK3jkyeUIDFHZO0 2Xes23ZaSxF4B69VPu6qM7dgdaRV++rWMt7h8Qk2zMWnCmhUyL3Dnyf3eAfbnU75+0Xl ZP44N/WDs4Rib9e/0FjaOFTwR5JXw4L3ZQ5wyOvhF80cwnoYNFgaiy2fEJt0C2FAer6z JYrzCrS7e8iGvzPEgUMk1BQ3jgb2nXOQEbc9Rj+vf9IWP3nPe0cf2loR870Bm9hl1jDH J5+URGQ1MjRzanbuVCQgnmkXzhNCmG4mbDSE2igWwdXFuPyu9mO02o/IU6StEtVLlArt y9vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761336188; x=1761940988; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Psu3stQf/pnAW1hJFfMZGriu7ZM76ugyWD2ha7EdAlY=; b=SHvuZAZykg4sEuw/vzKn4ezuL5ObPz2XXpGg8zEVwyCCtyRs7xfECmG6WDLin/D6cN ehm5UMBalj4nF1vWz9+py8t0/SIC71laHVyy31+Ua5L7EmscZtoueGxsTDbuzz2PdY+4 a7EzQrFd38RF+hvaMNzgmOxx5FemsE508aSufSPiw0Piuy8nPypz8MHMIO1r/8g7pbCI yzxdWU9JVvNj32+nDjbew5M6WQAifts7N5Plfl73t0DnP5rfAtr8f9Oajdnj90p+Oezb 8ksTWpdDqXoVWrmGNFqVeowHoI9+Xrx89JWggI1HlAwu084lP5oF+E0kubygy4kLboBy kttQ== X-Gm-Message-State: AOJu0Yym8QYWtEvArsV9qiL3smEnEE1CT/KbQp2m8Pwn4rZztOGflT5O Q0xLft0pOS9vF9n5JbBUNNIVjE5xRnWib76JArkaOmPUouVwC4Q6oXl+TM2lRipkImSOnA== X-Gm-Gg: ASbGncsb4TkxymkLCjFWaYc9Fq4DxzY1IhNmRTc1pV7Dowx6YtlBsAoR8o+5ZN68uOo T+AXgYdQA8OCnvKEvHeChw/Gb11qXN9w+4xf7JZFXOrVP5yM9YA0rzxleIGI7EHu3T9kiW/zVR4 88Uzk7f65bwum+hQeqTxXPptW3yX/Vzc0teDxW0G7RsnOZYlE6XZpErpHaglylIT38LXJNwt6rm QJxX/fYFt/9SqrNXdtbo/1l2YISFtXn81/6PGRRPHIxUSb+iHnrBvZCYUKzKPbuhLeXblW0F7OJ BZHUwiF2Ojv4kWNNTx5VzPFiWVP92VrGEnLaZWd2vMAOSBe0uR8Qh1Pn6+mZgQlmnvcwja8ijwt aq6KU7PLaWZVUV+Emn+bHJTEuTb3qgFUmprQ1egxiXBdta7HnoavqcO6Ri/4BIMyCaV1EAHSWHj o22OdB/XAWstmtQgcqi0EFrvtdneJOruwx49YIYP6cTrSUAVQ810S2VQ== X-Google-Smtp-Source: AGHT+IF1uYIK5LcUxWfe3+1iwdSZbCukmxiTczhQ5LGdreH2EVpJV6qBdf7uQ3KgakoMeLHHbn6Qiw== X-Received: by 2002:a05:690e:124e:b0:63e:8e4:4774 with SMTP id 956f58d0204a3-63f4350721cmr2399148d50.15.1761336187711; Fri, 24 Oct 2025 13:03:07 -0700 (PDT) Received: from ?IPV6:2600:1700:8952:80:8538:d604:170e:6b1f? ([2600:1700:8952:80:8538:d604:170e:6b1f]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-63f4c3bc573sm18381d50.4.2025.10.24.13.03.06 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 24 Oct 2025 13:03:06 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------2y0eNdCJrqA89Ne4vUAatA2l" Message-ID: <4c5f895e-3281-48f8-b943-9228b7da6471@gmail.com> Date: Fri, 24 Oct 2025 15:03:06 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: pgsql-hackers@lists.postgresql.org From: Bryan Green Subject: [PATCH] Add pg_get_role_ddl() functions for role recreation List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------2y0eNdCJrqA89Ne4vUAatA2l Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Attached is a patch adding two new functions for generating DDL to recreate roles: pg_get_role_ddl() and pg_get_role_ddl_statements(). These functions return the CREATE ROLE statement and any ALTER ROLE SET configuration parameters needed to recreate a role. The former returns everything as a single text string, while the latter returns each statement as a separate row for easier programmatic processing. The main use case is dumping role definitions for migration or backup purposes without needing pg_dumpall. The functions handle all role attributes (LOGIN, SUPERUSER, etc.) and both role-wide and database-specific configuration parameters. We intentionally don't include passwords, since we can only see the hashed values. System roles (names starting with "pg_") are rejected with an error, as users shouldn't be recreating those anyway. To test: CREATE ROLE testrole LOGIN CREATEDB CONNECTION LIMIT 5; ALTER ROLE testrole SET work_mem TO '64MB'; SELECT pg_get_role_ddl('testrole'); Should produce: CREATE ROLE testrole LOGIN NOSUPERUSER CREATEDB NOCREATEROLE INHERIT NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 5; ALTER ROLE testrole SET work_mem TO '64MB'; The patch includes regression tests covering various role configurations. Co-authored-by: Mario Gonzalez and Bryan Green. Comments? BG --------------2y0eNdCJrqA89Ne4vUAatA2l Content-Type: text/plain; charset=UTF-8; name="v1-0001-Add-functions-to-generate-DDL-for-recreating-roles.patch" Content-Disposition: attachment; filename*0="v1-0001-Add-functions-to-generate-DDL-for-recreating-roles.p"; filename*1="atch" Content-Transfer-Encoding: base64 RnJvbSA4ZDllN2Q1OWVhMjE2YWU1ZjAwOGM5MjUzMTNlZTE2MjQwODIwMzc3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogQnJ5YW4gR3JlZW4gPGRicnlhbi5ncmVlbkBnbWFp bC5jb20+DQpEYXRlOiBGcmksIDI0IE9jdCAyMDI1IDExOjI5OjUwIC0wNTAwDQpTdWJqZWN0 OiBbUEFUQ0hdIEFkZCBmdW5jdGlvbnMgdG8gZ2VuZXJhdGUgRERMIGZvciByZWNyZWF0aW5n IHJvbGVzLg0KDQpwZ19nZXRfcm9sZV9kZGwocmVncm9sZSkgcmV0dXJucyB0aGUgRERMIG5l ZWRlZCB0byByZWNyZWF0ZSBhIHJvbGUNCmFzIGEgc2luZ2xlIHRleHQgc3RyaW5nLiAgcGdf Z2V0X3JvbGVfZGRsX3N0YXRlbWVudHMocmVncm9sZSkgcmV0dXJucw0KdGhlIHNhbWUgdGhp bmcgYXMgYSBzZXQgb2Ygcm93cywgb25lIHBlciBEREwgc3RhdGVtZW50Lg0KDQpUaGUgb3V0 cHV0IGluY2x1ZGVzIHRoZSBDUkVBVEUgUk9MRSBzdGF0ZW1lbnQgd2l0aCBhbGwgcm9sZSBh dHRyaWJ1dGVzLA0KcGx1cyBhbnkgQUxURVIgUk9MRSBTRVQgY29uZmlndXJhdGlvbiBwYXJh bWV0ZXJzIChib3RoIHJvbGUtd2lkZSBhbmQNCmRhdGFiYXNlLXNwZWNpZmljIHNldHRpbmdz KS4NCg0KUGFzc3dvcmRzIGNhbm5vdCBiZSBpbmNsdWRlZCwgc2luY2Ugd2UgY2FuIG9ubHkg c2VlIHRoZSBoYXNoZWQgdmFsdWVzLg0KU3lzdGVtIHJvbGVzIChuYW1lcyBzdGFydGluZyB3 aXRoICJwZ18iKSBhcmUgcmVqZWN0ZWQsIHNpbmNlIHVzZXJzDQpzaG91bGRuJ3QgYmUgcmVj cmVhdGluZyB0aG9zZSBhbnl3YXkuDQoNCkNvLWF1dGhvcmVkLWJ5OiBNYXJpbyBHb256YWxl eiA8Z29uemFsZW1hcmlvQGdtYWlsLmNvbT4NCkNvLWF1dGhvcmVkLWJ5OiBCcnlhbiBHcmVl biA8ZGJyeWFuLmdyZWVuQGdtYWlsLmNvbT4NCi0tLQ0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1 bmMtaW5mby5zZ21sICAgICAgIHwgIDU2ICsrKystDQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3J1bGV1dGlscy5jICAgICAgfCAzMjQgKysrKysrKysrKysrKysrKysrKysrKysrKw0KIHNy Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgIHwgIDI0ICsrDQogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9yb2xlX2RkbC5vdXQgfCAgOTAgKysrKysrKw0KIHNyYy90 ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgICAgIHwgICA0ICsNCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9yb2xlX2RkbC5zcWwgICAgICB8ICA1NyArKysrKw0KIDYgZmlsZXMgY2hh bmdlZCwgNTU0IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkNCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yb2xlX2RkbC5vdXQNCiBjcmVhdGUg bW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9zcWwvcm9sZV9kZGwuc3FsDQoNCmRpZmYg LS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCBiL2RvYy9zcmMvc2dt bC9mdW5jL2Z1bmMtaW5mby5zZ21sDQppbmRleCBjMzkzODMyZDk0Li5iOThjMmRhZTIyIDEw MDY0NA0KLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwNCisrKyBiL2Rv Yy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sDQpAQCAtMjE3NCw3ICsyMTc0LDYxIEBA IFNFTEVDVCBjdXJydmFsKHBnX2dldF9zZXJpYWxfc2VxdWVuY2UoJ3NvbWV0YWJsZScsICdp ZCcpKTsNCiAgICAgIDwvdGJvZHk+DQogICAgIDwvdGdyb3VwPg0KICAgIDwvdGFibGU+DQot DQorICA8dGFibGUgaWQ9ImZ1bmN0aW9ucy1vYmplY3QtZGRsLXRhYmxlIj4NCisgICAgPHRp dGxlPk9iamVjdCBEREwgRnVuY3Rpb25zPC90aXRsZT4NCisgICAgPHRncm91cCBjb2xzPSIx Ij4NCisgICAgIDx0aGVhZD4NCisgICAgICA8cm93Pg0KKyAgICAgICA8ZW50cnkgcm9sZT0i ZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPkZ1bmN0aW9u PC9wYXJhPg0KKyAgICAgICAgPHBhcmE+RGVzY3JpcHRpb248L3BhcmE+DQorICAgICAgIDwv ZW50cnk+DQorICAgICAgPC9yb3c+DQorICAgICA8L3RoZWFkPg0KKyAgICAgPHRib2R5Pg0K KyAgICAgIDxyb3c+DQorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij4N CisgICAgICAgIDxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4NCisgICAgICAgICA8aW5k ZXh0ZXJtPg0KKyAgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcm9sZV9kZGw8L3ByaW1hcnk+ DQorICAgICAgICAgPC9pbmRleHRlcm0+DQorICAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9y b2xlX2RkbDwvZnVuY3Rpb24+ICggPHBhcmFtZXRlcj5yb2xlPC9wYXJhbWV0ZXI+IDx0eXBl PnJlZ3JvbGU8L3R5cGU+ICkNCisgICAgICAgICA8cmV0dXJudmFsdWU+dGV4dDwvcmV0dXJu dmFsdWU+DQorICAgICAgICA8L3BhcmE+DQorICAgICAgICA8cGFyYT4NCisgICAgICAgICBS ZXR1cm5zIHRoZSBEREwgY29tbWFuZHMgdGhhdCB3b3VsZCByZWNyZWF0ZSB0aGUgZ2l2ZW4g cm9sZSBhcyBhIHNpbmdsZSB0ZXh0IHN0cmluZy4NCisgICAgICAgICBUaGUgcmVzdWx0IGlu Y2x1ZGVzIHRoZSA8Y29tbWFuZD5DUkVBVEUgUk9MRTwvY29tbWFuZD4gc3RhdGVtZW50IGFu ZCBhbnkNCisgICAgICAgICA8Y29tbWFuZD5BTFRFUiBST0xFPC9jb21tYW5kPiBzdGF0ZW1l bnRzIG5lZWRlZCB0byBzZXQgcm9sZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuDQorICAg ICAgICAgUGFzc3dvcmQgaW5mb3JtYXRpb24gaXMgbmV2ZXIgaW5jbHVkZWQgaW4gdGhlIG91 dHB1dC4NCisgICAgICAgIDwvcGFyYT4NCisgICAgICAgIDxwYXJhPg0KKyAgICAgICAgIFJl dHVybnMgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gaWYgdGhlIHJvbGUgZG9lcyBub3QgZXhp c3QuDQorICAgICAgICA8L3BhcmE+DQorICAgICAgIDwvZW50cnk+DQorICAgICAgPC9yb3c+ DQorICAgICAgPHJvdz4NCisgICAgICAgPGVudHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnki Pg0KKyAgICAgICAgPHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPg0KKyAgICAgICAgIDxp bmRleHRlcm0+DQorICAgICAgICAgIDxwcmltYXJ5PnBnX2dldF9yb2xlX2RkbF9zdGF0ZW1l bnRzPC9wcmltYXJ5Pg0KKyAgICAgICAgIDwvaW5kZXh0ZXJtPg0KKyAgICAgICAgIDxmdW5j dGlvbj5wZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50czwvZnVuY3Rpb24+ICggPHBhcmFtZXRl cj5yb2xlPC9wYXJhbWV0ZXI+IDx0eXBlPnJlZ3JvbGU8L3R5cGU+ICkNCisgICAgICAgICA8 cmV0dXJudmFsdWU+c2V0b2YgdGV4dDwvcmV0dXJudmFsdWU+DQorICAgICAgICA8L3BhcmE+ DQorICAgICAgICA8cGFyYT4NCisgICAgICAgICBSZXR1cm5zIHRoZSBEREwgY29tbWFuZHMg dGhhdCB3b3VsZCByZWNyZWF0ZSB0aGUgZ2l2ZW4gcm9sZSBhcyBhIHNldCBvZiByb3dzLA0K KyAgICAgICAgIHdpdGggZWFjaCBzdGF0ZW1lbnQgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBy b3cuIFRoZSBmaXJzdCByb3cgY29udGFpbnMgdGhlDQorICAgICAgICAgPGNvbW1hbmQ+Q1JF QVRFIFJPTEU8L2NvbW1hbmQ+IHN0YXRlbWVudCwgZm9sbG93ZWQgYnkgYW55IDxjb21tYW5k PkFMVEVSIFJPTEU8L2NvbW1hbmQ+DQorICAgICAgICAgc3RhdGVtZW50cyBuZWVkZWQgdG8g c2V0IHJvbGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiBUaGlzIGZvcm1hdCBpcyB1c2Vm dWwgZm9yDQorICAgICAgICAgcHJvZ3JhbW1hdGljIHByb2Nlc3Npbmcgb3Igd2hlbiB5b3Ug d2FudCB0byBmaWx0ZXIgb3IgYW5hbHl6ZSBpbmRpdmlkdWFsIHN0YXRlbWVudHMuDQorICAg ICAgICA8L3BhcmE+DQorICAgICAgICA8cGFyYT4NCisgICAgICAgICBSZXR1cm5zIGFuIGVt cHR5IHNldCBpZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdC4NCisgICAgICAgIDwvcGFyYT4N CisgICAgICAgPC9lbnRyeT4NCisgICAgICA8L3Jvdz4NCisgICAgIDwvdGJvZHk+DQorICAg IDwvdGdyb3VwPg0KKyAgPC90YWJsZT4NCiAgIDxwYXJhPg0KICAgIE1vc3Qgb2YgdGhlIGZ1 bmN0aW9ucyB0aGF0IHJlY29uc3RydWN0IChkZWNvbXBpbGUpIGRhdGFiYXNlIG9iamVjdHMN CiAgICBoYXZlIGFuIG9wdGlvbmFsIDxwYXJhbWV0ZXI+cHJldHR5PC9wYXJhbWV0ZXI+IGZs YWcsIHdoaWNoDQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1bGV1dGls cy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1bGV1dGlscy5jDQppbmRleCA3OWVjMTM2 MjMxLi42YzQ2NTgwYTBlIDEwMDY0NA0KLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1 bGV1dGlscy5jDQorKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMNCkBA IC0yOCw4ICsyOCw5IEBADQogI2luY2x1ZGUgImNhdGFsb2cvcGdfYXV0aGlkLmgiDQogI2lu Y2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9uLmgiDQogI2luY2x1ZGUgImNhdGFsb2cvcGdf Y29uc3RyYWludC5oIg0KKyNpbmNsdWRlICJjYXRhbG9nL3BnX2RiX3JvbGVfc2V0dGluZy5o Ig0KICNpbmNsdWRlICJjYXRhbG9nL3BnX2RlcGVuZC5oIg0KICNpbmNsdWRlICJjYXRhbG9n L3BnX2xhbmd1YWdlLmgiDQogI2luY2x1ZGUgImNhdGFsb2cvcGdfb3BjbGFzcy5oIg0KICNp bmNsdWRlICJjYXRhbG9nL3BnX29wZXJhdG9yLmgiDQogI2luY2x1ZGUgImNhdGFsb2cvcGdf cGFydGl0aW9uZWRfdGFibGUuaCINCkBAIC01OSw2ICs2MCw3IEBADQogI2luY2x1ZGUgInJl d3JpdGUvcmV3cml0ZVN1cHBvcnQuaCINCiAjaW5jbHVkZSAidXRpbHMvYXJyYXkuaCINCiAj aW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCINCisjaW5jbHVkZSAidXRpbHMvZGF0ZXRpbWUu aCINCiAjaW5jbHVkZSAidXRpbHMvZm1ncm9pZHMuaCINCiAjaW5jbHVkZSAidXRpbHMvZ3Vj LmgiDQogI2luY2x1ZGUgInV0aWxzL2hzZWFyY2guaCINCkBAIC01NDksNiArNTUxLDMyOCBA QCBzdGF0aWMgdm9pZCBnZXRfanNvbl90YWJsZV9uZXN0ZWRfY29sdW1ucyhUYWJsZUZ1bmMg KnRmLCBKc29uVGFibGVQbGFuICpwbGFuLA0KIA0KICNkZWZpbmUgb25seV9tYXJrZXIocnRl KSAgKChydGUpLT5pbmggPyAiIiA6ICJPTkxZICIpDQogDQorLyoNCisgKiBwZ19nZXRfcm9s ZV9kZGxfaW50ZXJuYWwNCisgKgkJR2VuZXJhdGUgRERMIHN0YXRlbWVudHMgdG8gcmVjcmVh dGUgYSByb2xlDQorICoNCisgKiBSZXR1cm5zIGEgTGlzdCBvZiBwYWxsb2MnZCBzdHJpbmdz LCBlYWNoIGJlaW5nIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4NCisgKiBUaGUgZmlyc3Qg bGlzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgQ1JFQVRFIFJPTEUgc3RhdGVtZW50OyBzdWJz ZXF1ZW50DQorICogZWxlbWVudHMgYXJlIEFMVEVSIFJPTEUgU0VUIHN0YXRlbWVudHMgZm9y IGFueSByb2xlLXNwZWNpZmljIG9yDQorICogcm9sZS1pbi1kYXRhYmFzZSBjb25maWd1cmF0 aW9uIHNldHRpbmdzLg0KKyAqDQorICogUmV0dXJucyBOSUwgaWYgdGhlIHJvbGUgT0lEIGlz IGludmFsaWQuICBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHJvbGUgd2FzDQorICogZHJvcHBl ZCBjb25jdXJyZW50bHksIG9yIGlmIHdlJ3JlIHBhc3NlZCBhIE9JRCB0aGF0IGRvZXNuJ3Qg bWF0Y2gNCisgKiBhbnkgcm9sZS4NCisgKi8NCitzdGF0aWMgTGlzdCAqDQorcGdfZ2V0X3Jv bGVfZGRsX2ludGVybmFsKE9pZCByb2xlaWQpDQorew0KKwlIZWFwVHVwbGUJdHVwbGU7DQor CUZvcm1fcGdfYXV0aGlkIHJvbGVmb3JtOw0KKwlTdHJpbmdJbmZvRGF0YSBidWY7DQorCWNo YXIJICAgKnJvbG5hbWU7DQorCURhdHVtCQlyb2xldmFsaWR1bnRpbDsNCisJYm9vbAkJaXNu dWxsOw0KKwlSZWxhdGlvbglyZWw7DQorCVNjYW5LZXlEYXRhIHNjYW5rZXk7DQorCVN5c1Nj YW5EZXNjIHNjYW47DQorCUhlYXBUdXBsZQlzZXR0aW5nX3R1cGxlOw0KKwlMaXN0CSAgICpz dGF0ZW1lbnRzID0gTklMOw0KKwljb25zdCBjaGFyICpzZXBhcmF0b3IgPSAiICI7DQorDQor CXR1cGxlID0gU2VhcmNoU3lzQ2FjaGUxKEFVVEhPSUQsIE9iamVjdElkR2V0RGF0dW0ocm9s ZWlkKSk7DQorCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpDQorCQlyZXR1cm4gTklM Ow0KKw0KKwlyb2xlZm9ybSA9IChGb3JtX3BnX2F1dGhpZCkgR0VUU1RSVUNUKHR1cGxlKTsN CisJcm9sbmFtZSA9IE5hbWVTdHIocm9sZWZvcm0tPnJvbG5hbWUpOw0KKw0KKwkvKg0KKwkg KiBXZSBkb24ndCBzdXBwb3J0IGdlbmVyYXRpbmcgRERMIGZvciBzeXN0ZW0gcm9sZXMuICBU aGUgcHJpbWFyeSByZWFzb24NCisJICogZm9yIHRoaXMgaXMgdGhhdCB1c2VycyBzaG91bGRu J3QgYmUgcmVjcmVhdGluZyB0aGVtLg0KKwkgKi8NCisJaWYgKHN0cm5jbXAocm9sbmFtZSwg InBnXyIsIDMpID09IDApDQorCQllcmVwb3J0KEVSUk9SLA0KKwkJCQkoZXJyY29kZShFUlJD T0RFX1JFU0VSVkVEX05BTUUpLA0KKwkJCQkgZXJybXNnKCJyb2xlIG5hbWUgXCIlc1wiIGlz IHJlc2VydmVkIiwgcm9sbmFtZSksDQorCQkJCSBlcnJkZXRhaWwoIlJvbGUgbmFtZXMgc3Rh cnRpbmcgd2l0aCBcInBnX1wiIGFyZSByZXNlcnZlZCBmb3Igc3lzdGVtIHJvbGVzLiIpKSk7 DQorDQorCWluaXRTdHJpbmdJbmZvKCZidWYpOw0KKwlhcHBlbmRTdHJpbmdJbmZvKCZidWYs ICJDUkVBVEUgUk9MRSAlcyIsIHF1b3RlX2lkZW50aWZpZXIocm9sbmFtZSkpOw0KKw0KKwkv Kg0KKwkgKiBBcHBlbmQgcm9sZSBhdHRyaWJ1dGVzLiAgVGhlIG9yZGVyIGhlcmUgZm9sbG93 cyB0aGUgc2FtZSBzZXF1ZW5jZSBhcw0KKwkgKiB5b3UnZCB0eXBpY2FsbHkgd3JpdGUgdGhl bSBpbiBhIENSRUFURSBST0xFIGNvbW1hbmQsIHRob3VnaCBhbnkgb3JkZXINCisJICogaXMg YWN0dWFsbHkgYWNjZXB0YWJsZSB0byB0aGUgcGFyc2VyLg0KKwkgKi8NCisJYXBwZW5kU3Ry aW5nSW5mbygmYnVmLCAiJXMlcyIsIHNlcGFyYXRvciwNCisJCQkJCSByb2xlZm9ybS0+cm9s Y2FubG9naW4gPyAiTE9HSU4iIDogIk5PTE9HSU4iKTsNCisNCisJYXBwZW5kU3RyaW5nSW5m bygmYnVmLCAiJXMlcyIsIHNlcGFyYXRvciwNCisJCQkJCSByb2xlZm9ybS0+cm9sc3VwZXIg PyAiU1VQRVJVU0VSIiA6ICJOT1NVUEVSVVNFUiIpOw0KKw0KKwlhcHBlbmRTdHJpbmdJbmZv KCZidWYsICIlcyVzIiwgc2VwYXJhdG9yLA0KKwkJCQkJIHJvbGVmb3JtLT5yb2xjcmVhdGVk YiA/ICJDUkVBVEVEQiIgOiAiTk9DUkVBVEVEQiIpOw0KKw0KKwlhcHBlbmRTdHJpbmdJbmZv KCZidWYsICIlcyVzIiwgc2VwYXJhdG9yLA0KKwkJCQkJIHJvbGVmb3JtLT5yb2xjcmVhdGVy b2xlID8gIkNSRUFURVJPTEUiIDogIk5PQ1JFQVRFUk9MRSIpOw0KKw0KKwlhcHBlbmRTdHJp bmdJbmZvKCZidWYsICIlcyVzIiwgc2VwYXJhdG9yLA0KKwkJCQkJIHJvbGVmb3JtLT5yb2xp bmhlcml0ID8gIklOSEVSSVQiIDogIk5PSU5IRVJJVCIpOw0KKw0KKwlhcHBlbmRTdHJpbmdJ bmZvKCZidWYsICIlcyVzIiwgc2VwYXJhdG9yLA0KKwkJCQkJIHJvbGVmb3JtLT5yb2xyZXBs aWNhdGlvbiA/ICJSRVBMSUNBVElPTiIgOiAiTk9SRVBMSUNBVElPTiIpOw0KKw0KKwlhcHBl bmRTdHJpbmdJbmZvKCZidWYsICIlcyVzIiwgc2VwYXJhdG9yLA0KKwkJCQkJIHJvbGVmb3Jt LT5yb2xieXBhc3NybHMgPyAiQllQQVNTUkxTIiA6ICJOT0JZUEFTU1JMUyIpOw0KKw0KKwkv Kg0KKwkgKiBDT05ORUNUSU9OIExJTUlUIGlzIG9ubHkgaW50ZXJlc3RpbmcgaWYgaXQncyBu b3QgLTEgKHRoZSBkZWZhdWx0LA0KKwkgKiBtZWFuaW5nIG5vIGxpbWl0KS4NCisJICovDQor CWlmIChyb2xlZm9ybS0+cm9sY29ubmxpbWl0ID49IDApDQorCQlhcHBlbmRTdHJpbmdJbmZv KCZidWYsICIlc0NPTk5FQ1RJT04gTElNSVQgJWQiLA0KKwkJCQkJCSBzZXBhcmF0b3IsIHJv bGVmb3JtLT5yb2xjb25ubGltaXQpOw0KKw0KKwlyb2xldmFsaWR1bnRpbCA9IFN5c0NhY2hl R2V0QXR0cihBVVRIT0lELCB0dXBsZSwNCisJCQkJCQkJCQkgQW51bV9wZ19hdXRoaWRfcm9s dmFsaWR1bnRpbCwNCisJCQkJCQkJCQkgJmlzbnVsbCk7DQorCWlmICghaXNudWxsKQ0KKwl7 DQorCQlzdHJ1Y3QgcGdfdG0gdG07DQorCQlmc2VjX3QJCWZzZWM7DQorCQljaGFyCQl0c19z dHJbTUFYREFURUxFTiArIDFdOw0KKw0KKwkJaWYgKHRpbWVzdGFtcDJ0bShyb2xldmFsaWR1 bnRpbCwgTlVMTCwgJnRtLCAmZnNlYywgTlVMTCwgTlVMTCkgPT0gMCkNCisJCXsNCisJCQlF bmNvZGVEYXRlVGltZSgmdG0sIGZzZWMsIGZhbHNlLCAwLCAiVVRDIiwgVVNFX0lTT19EQVRF UywgdHNfc3RyKTsNCisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIlc1ZBTElEIFVOVElM ICVzIiwNCisJCQkJCQkJIHNlcGFyYXRvciwgcXVvdGVfbGl0ZXJhbF9jc3RyKHRzX3N0cikp Ow0KKwkJfQ0KKwl9DQorDQorCS8qDQorCSAqIFdlIGludGVudGlvbmFsbHkgb21pdCBQQVNT V09SRC4gIFRoZXJlJ3Mgbm8gd2F5IHRvIHJldHJpZXZlIHRoZQ0KKwkgKiBvcmlnaW5hbCBw YXNzd29yZCB0ZXh0IGZyb20gdGhlIHN0b3JlZCBoYXNoLCBhbmQgZXZlbiBpZiB3ZSBjb3Vs ZCwNCisJICogZXhwb3NpbmcgcGFzc3dvcmRzIHRocm91Z2ggYSBTUUwgZnVuY3Rpb24gd291 bGQgYmUgYSBzZWN1cml0eSBpc3N1ZS4NCisJICogVXNlcnMgbXVzdCBzZXQgcGFzc3dvcmRz IHNlcGFyYXRlbHkgYWZ0ZXIgcmVjcmVhdGluZyByb2xlcy4NCisJICovDQorDQorCWFwcGVu ZFN0cmluZ0luZm9DaGFyKCZidWYsICc7Jyk7DQorDQorCXN0YXRlbWVudHMgPSBsYXBwZW5k KHN0YXRlbWVudHMsIHBzdHJkdXAoYnVmLmRhdGEpKTsNCisNCisJUmVsZWFzZVN5c0NhY2hl KHR1cGxlKTsNCisNCisJLyoNCisJICogTm93IHNjYW4gcGdfZGJfcm9sZV9zZXR0aW5nIGZv ciBBTFRFUiBST0xFIFNFVCBjb25maWd1cmF0aW9ucy4NCisJICoNCisJICogVGhlc2UgY2Fu IGJlIHJvbGUtd2lkZSAoc2V0ZGF0YWJhc2UgPSAwKSBvciBzcGVjaWZpYyB0byBhIHBhcnRp Y3VsYXINCisJICogZGF0YWJhc2UgKHNldGRhdGFiYXNlID0gYSB2YWxpZCBEQiBPSUQpLiAg V2UgZ2VuZXJhdGUgb25lIEFMVEVSDQorCSAqIHN0YXRlbWVudCBwZXIgc2V0dGluZywgd2hp Y2ggaXNuJ3QgYXMgY29tcGFjdCBhcyBpdCBjb3VsZCBiZSwgYnV0IGlzDQorCSAqIHN0cmFp Z2h0Zm9yd2FyZCBhbmQgbWF0Y2hlcyBob3cgdXNlcnMgdHlwaWNhbGx5IHNldCB0aGVzZSB1 cC4NCisJICovDQorCXJlbCA9IHRhYmxlX29wZW4oRGJSb2xlU2V0dGluZ1JlbGF0aW9uSWQs IEFjY2Vzc1NoYXJlTG9jayk7DQorCVNjYW5LZXlJbml0KCZzY2Fua2V5LA0KKwkJCQlBbnVt X3BnX2RiX3JvbGVfc2V0dGluZ19zZXRyb2xlLA0KKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIsIEZfT0lERVEsDQorCQkJCU9iamVjdElkR2V0RGF0dW0ocm9sZWlkKSk7DQorCXNjYW4g PSBzeXN0YWJsZV9iZWdpbnNjYW4ocmVsLCBEYlJvbGVTZXR0aW5nRGF0aWRSb2xpZEluZGV4 SWQsIHRydWUsDQorCQkJCQkJCSAgTlVMTCwgMSwgJnNjYW5rZXkpOw0KKw0KKwl3aGlsZSAo SGVhcFR1cGxlSXNWYWxpZChzZXR0aW5nX3R1cGxlID0gc3lzdGFibGVfZ2V0bmV4dChzY2Fu KSkpDQorCXsNCisJCUZvcm1fcGdfZGJfcm9sZV9zZXR0aW5nIHNldHRpbmcgPSAoRm9ybV9w Z19kYl9yb2xlX3NldHRpbmcpIEdFVFNUUlVDVChzZXR0aW5nX3R1cGxlKTsNCisJCU9pZAkJ CWRhdGlkID0gc2V0dGluZy0+c2V0ZGF0YWJhc2U7DQorCQlEYXR1bQkJZGF0dW07DQorCQli b29sCQlzZXR0aW5nX2lzbnVsbDsNCisJCUFycmF5VHlwZSAgKnNldHRpbmdzOw0KKwkJaW50 CQkJaTsNCisJCWNoYXIJICAgKmRhdG5hbWUgPSBOVUxMOw0KKw0KKwkJLyoNCisJCSAqIFRo ZSBzZXRjb25maWcgY29sdW1uIGlzIGEgdGV4dCBhcnJheSBpbiAibmFtZT12YWx1ZSIgZm9y bWF0LiBJdA0KKwkJICogc2hvdWxkIG5ldmVyIGJlIG51bGwgZm9yIGEgdmFsaWQgcm93LCBi dXQgYmUgZGVmZW5zaXZlLg0KKwkJICovDQorCQlkYXR1bSA9IGhlYXBfZ2V0YXR0cihzZXR0 aW5nX3R1cGxlLCBBbnVtX3BnX2RiX3JvbGVfc2V0dGluZ19zZXRjb25maWcsDQorCQkJCQkJ CSBSZWxhdGlvbkdldERlc2NyKHJlbCksICZzZXR0aW5nX2lzbnVsbCk7DQorCQlpZiAoc2V0 dGluZ19pc251bGwpDQorCQkJY29udGludWU7DQorDQorCQlzZXR0aW5ncyA9IERhdHVtR2V0 QXJyYXlUeXBlUChkYXR1bSk7DQorDQorCQkvKg0KKwkJICogSWYgc2V0ZGF0YWJhc2UgaXMg dmFsaWQsIHRoaXMgaXMgYSByb2xlLWluLWRhdGFiYXNlIHNldHRpbmc7DQorCQkgKiBvdGhl cndpc2UgaXQncyBhIHJvbGUtd2lkZSBzZXR0aW5nLiAgTG9vayB1cCB0aGUgZGF0YWJhc2Ug bmFtZSBvbmNlDQorCQkgKiBmb3IgYWxsIHNldHRpbmdzIGluIHRoaXMgcm93Lg0KKwkJICov DQorCQlpZiAoT2lkSXNWYWxpZChkYXRpZCkpDQorCQl7DQorCQkJZGF0bmFtZSA9IGdldF9k YXRhYmFzZV9uYW1lKGRhdGlkKTsNCisJCQlpZiAoZGF0bmFtZSA9PSBOVUxMKQ0KKwkJCXsN CisJCQkJLyoNCisJCQkJICogRGF0YWJhc2UgaGFzIGJlZW4gZHJvcHBlZDsgc2tpcCBhbGwg c2V0dGluZ3MgaW4gdGhpcyByb3cuDQorCQkJCSAqLw0KKwkJCQljb250aW51ZTsNCisJCQl9 DQorCQl9DQorDQorCQkvKiBQcm9jZXNzIGVhY2ggc2V0dGluZyBpbiB0aGUgYXJyYXkgKi8N CisJCWZvciAoaSA9IDE7IGkgPD0gQXJyYXlHZXROSXRlbXMoQVJSX05ESU0oc2V0dGluZ3Mp LCBBUlJfRElNUyhzZXR0aW5ncykpOyBpKyspDQorCQl7DQorCQkJRGF0dW0JCXNldHRpbmdf ZGF0dW07DQorCQkJYm9vbAkJc2V0dGluZ19lbGVtX2lzbnVsbDsNCisJCQljaGFyCSAgICpz ZXR0aW5nX3N0cjsNCisJCQljaGFyCSAgICplcXVhbHNfcG9zOw0KKw0KKwkJCXNldHRpbmdf ZGF0dW0gPSBhcnJheV9yZWYoc2V0dGluZ3MsIDEsICZpLA0KKwkJCQkJCQkJCSAgLTEgLyog dmFybGVuYXJyYXkgKi8gLA0KKwkJCQkJCQkJCSAgLTEgLyogVEVYVCdzIHR5cGxlbiAqLyAs DQorCQkJCQkJCQkJICBmYWxzZSAvKiBURVhUJ3MgdHlwYnl2YWwgKi8gLA0KKwkJCQkJCQkJ CSAgVFlQQUxJR05fSU5UIC8qIFRFWFQncyB0eXBhbGlnbiAqLyAsDQorCQkJCQkJCQkJICAm c2V0dGluZ19lbGVtX2lzbnVsbCk7DQorDQorCQkJaWYgKHNldHRpbmdfZWxlbV9pc251bGwp DQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJCXNldHRpbmdfc3RyID0gVGV4dERhdHVtR2V0Q1N0 cmluZyhzZXR0aW5nX2RhdHVtKTsNCisNCisJCQkvKg0KKwkJCSAqIFBhcnNlIG91dCB0aGUg cGFyYW1ldGVyIG5hbWUgYW5kIHZhbHVlLiAgVGhlIGZvcm1hdCBzaG91bGQNCisJCQkgKiBh bHdheXMgYmUgIm5hbWU9dmFsdWUiIGJ1dCBjaGVjayBhbnl3YXkgdG8gYXZvaWQgYSBjcmFz aCBpZiB0aGUNCisJCQkgKiBjYXRhbG9nIGlzIGNvcnJ1cHRlZC4NCisJCQkgKi8NCisJCQll cXVhbHNfcG9zID0gc3RyY2hyKHNldHRpbmdfc3RyLCAnPScpOw0KKwkJCWlmIChlcXVhbHNf cG9zID09IE5VTEwpDQorCQkJew0KKwkJCQlwZnJlZShzZXR0aW5nX3N0cik7DQorCQkJCWNv bnRpbnVlOw0KKwkJCX0NCisNCisJCQkqZXF1YWxzX3BvcyA9ICdcMCc7DQorDQorCQkJLyog QnVpbGQgYSBmcmVzaCBBTFRFUiBST0xFIHN0YXRlbWVudCBmb3IgdGhpcyBzZXR0aW5nICov DQorCQkJcmVzZXRTdHJpbmdJbmZvKCZidWYpOw0KKwkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1 ZiwgIkFMVEVSIFJPTEUgJXMiLCBxdW90ZV9pZGVudGlmaWVyKHJvbG5hbWUpKTsNCisNCisJ CQlpZiAoZGF0bmFtZSAhPSBOVUxMKQ0KKwkJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIg SU4gREFUQUJBU0UgJXMiLA0KKwkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoZGF0bmFtZSkp Ow0KKw0KKwkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIiBTRVQgJXMgVE8gJXM7IiwNCisJ CQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoc2V0dGluZ19zdHIpLA0KKwkJCQkJCQkgcXVvdGVf bGl0ZXJhbF9jc3RyKGVxdWFsc19wb3MgKyAxKSk7DQorDQorCQkJc3RhdGVtZW50cyA9IGxh cHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOw0KKw0KKwkJCXBmcmVlKHNl dHRpbmdfc3RyKTsNCisJCX0NCisNCisJCWlmIChkYXRuYW1lICE9IE5VTEwpDQorCQkJcGZy ZWUoZGF0bmFtZSk7DQorCX0NCisNCisJc3lzdGFibGVfZW5kc2NhbihzY2FuKTsNCisJdGFi bGVfY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOw0KKw0KKwlwZnJlZShidWYuZGF0YSk7 DQorDQorCXJldHVybiBzdGF0ZW1lbnRzOw0KK30NCisNCisNCisvKg0KKyAqIHBnX2dldF9y b2xlX2RkbA0KKyAqCQlSZXR1cm4gRERMIHRvIHJlY3JlYXRlIGEgcm9sZSBhcyBhIHNpbmds ZSB0ZXh0IHN0cmluZw0KKyAqDQorICogVGhpcyBpcyB0aGUgbWFpbiB1c2VyLWZhY2luZyBm dW5jdGlvbi4gIEl0IGNhbGxzIHBnX2dldF9yb2xlX2RkbF9pbnRlcm5hbA0KKyAqIHRvIGdl dCB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGVtIHdpdGgg bmV3bGluZXMuDQorICoNCisgKiBSZXR1cm5zIE5VTEwgaWYgdGhlIHJvbGUgT0lEIGRvZXNu J3QgZXhpc3QuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZg0KKyAqIHlvdSBwYXNzIGEgT0lE IHJhdGhlciB0aGFuIHVzaW5nIHRoZSByZWdyb2xlIHR5cGUsIG9yIGlmIHRoZXJlJ3MNCisg KiBhIHJhY2UgY29uZGl0aW9uIHdpdGggYSBjb25jdXJyZW50IERST1AgUk9MRS4NCisgKi8N CitEYXR1bQ0KK3BnX2dldF9yb2xlX2RkbChQR19GVU5DVElPTl9BUkdTKQ0KK3sNCisJT2lk CQkJcm9sZWlkID0gUEdfR0VUQVJHX09JRCgwKTsNCisJTGlzdAkgICAqc3RhdGVtZW50czsN CisJU3RyaW5nSW5mb0RhdGEgcmVzdWx0Ow0KKwlMaXN0Q2VsbCAgICpsYzsNCisJYm9vbAkJ Zmlyc3QgPSB0cnVlOw0KKw0KKwlzdGF0ZW1lbnRzID0gcGdfZ2V0X3JvbGVfZGRsX2ludGVy bmFsKHJvbGVpZCk7DQorDQorCWlmIChzdGF0ZW1lbnRzID09IE5JTCkNCisJCVBHX1JFVFVS Tl9OVUxMKCk7DQorDQorCWluaXRTdHJpbmdJbmZvKCZyZXN1bHQpOw0KKw0KKwlmb3JlYWNo KGxjLCBzdGF0ZW1lbnRzKQ0KKwl7DQorCQljaGFyCSAgICpzdG10ID0gKGNoYXIgKikgbGZp cnN0KGxjKTsNCisNCisJCWlmICghZmlyc3QpDQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIo JnJlc3VsdCwgJ1xuJyk7DQorCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZyZXN1bHQsIHN0 bXQpOw0KKwkJZmlyc3QgPSBmYWxzZTsNCisJfQ0KKw0KKwlsaXN0X2ZyZWVfZGVlcChzdGF0 ZW1lbnRzKTsNCisNCisJUEdfUkVUVVJOX1RFWFRfUChjc3RyaW5nX3RvX3RleHQocmVzdWx0 LmRhdGEpKTsNCit9DQorDQorLyoNCisgKiBwZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50cw0K KyAqCQlSZXR1cm4gRERMIHRvIHJlY3JlYXRlIGEgcm9sZSBhcyBhIHNldCBvZiByb3dzDQor ICoNCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gcGdfZ2V0X3JvbGVfZGRsLCBidXQgcmV0dXJu cyBlYWNoIHN0YXRlbWVudCBhcyBhDQorICogc2VwYXJhdGUgcm93LiAgVGhpcyBpcyB1c2Vm dWwgZm9yIHByb2dyYW1tYXRpYyBwcm9jZXNzaW5nIG9yIHdoZW4geW91DQorICogd2FudCB0 byBmaWx0ZXIvYW5hbHl6ZSBpbmRpdmlkdWFsIHN0YXRlbWVudHMuDQorICovDQorRGF0dW0N CitwZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50cyhQR19GVU5DVElPTl9BUkdTKQ0KK3sNCisJ RnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4Ow0KKwlMaXN0CSAgICpzdGF0ZW1lbnRzOw0KKwlM aXN0Q2VsbCAgICpsYzsNCisNCisJaWYgKFNSRl9JU19GSVJTVENBTEwoKSkNCisJew0KKwkJ TWVtb3J5Q29udGV4dCBvbGRjb250ZXh0Ow0KKwkJT2lkCQkJcm9sZWlkID0gUEdfR0VUQVJH X09JRCgwKTsNCisNCisJCWZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsNCisJCW9s ZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2FsbF9t ZW1vcnlfY3R4KTsNCisNCisJCXN0YXRlbWVudHMgPSBwZ19nZXRfcm9sZV9kZGxfaW50ZXJu YWwocm9sZWlkKTsNCisJCWZ1bmNjdHgtPnVzZXJfZmN0eCA9IHN0YXRlbWVudHM7DQorCQlm dW5jY3R4LT5tYXhfY2FsbHMgPSBsaXN0X2xlbmd0aChzdGF0ZW1lbnRzKTsNCisNCisJCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsNCisJfQ0KKw0KKwlmdW5jY3R4ID0g U1JGX1BFUkNBTExfU0VUVVAoKTsNCisJc3RhdGVtZW50cyA9IChMaXN0ICopIGZ1bmNjdHgt PnVzZXJfZmN0eDsNCisNCisJaWYgKGZ1bmNjdHgtPmNhbGxfY250ciA8IGZ1bmNjdHgtPm1h eF9jYWxscykNCisJew0KKwkJY2hhcgkgICAqc3RtdDsNCisNCisJCWxjID0gbGlzdF9udGhf Y2VsbChzdGF0ZW1lbnRzLCBmdW5jY3R4LT5jYWxsX2NudHIpOw0KKwkJc3RtdCA9IChjaGFy ICopIGxmaXJzdChsYyk7DQorDQorCQlTUkZfUkVUVVJOX05FWFQoZnVuY2N0eCwgQ1N0cmlu Z0dldFRleHREYXR1bShzdG10KSk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlsaXN0X2ZyZWVf ZGVlcChzdGF0ZW1lbnRzKTsNCisJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsNCisJfQ0K K30NCisNCiANCiAvKiAtLS0tLS0tLS0tDQogICogcGdfZ2V0X3J1bGVkZWYJCS0gRG8gaXQg YWxsIGFuZCByZXR1cm4gYSB0ZXh0DQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQNCmluZGV4 IGVlY2I0M2VjNmYuLjBkMDUxMTU4OWYgMTAwNjQ0DQotLS0gYS9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3Byb2MuZGF0DQorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0 DQpAQCAtMTI2MDQsNCArMTI2MDQsMjggQEANCiAgIHByb2FyZ25hbWVzID0+ICd7cGlkLGlv X2lkLGlvX2dlbmVyYXRpb24sc3RhdGUsb3BlcmF0aW9uLG9mZixsZW5ndGgsdGFyZ2V0LGhh bmRsZV9kYXRhX2xlbixyYXdfcmVzdWx0LHJlc3VsdCx0YXJnZXRfZGVzYyxmX3N5bmMsZl9s b2NhbG1lbSxmX2J1ZmZlcmVkfScsDQogICBwcm9zcmMgPT4gJ3BnX2dldF9haW9zJyB9LA0K IA0KKyMgcGdfZ2V0X3JvbGVfZGRsIC0gcmV0dXJuIERETCB0byByZWNyZWF0ZSBhIHJvbGUg KGNvbXBhY3QgZm9ybWF0KQ0KK3sgb2lkID0+ICc5OTkxJywgZGVzY3IgPT4gJ2dldCBTUUwg Y29tbWFuZHMgdG8gcmVjcmVhdGUgcm9sZScsDQorICBwcm9uYW1lID0+ICdwZ19nZXRfcm9s ZV9kZGwnLCBwcm9uYW1lc3BhY2UgPT4gJ3BnX2NhdGFsb2cnLA0KKyAgcHJvb3duZXIgPT4g J1BPU1RHUkVTJywgcHJvbGFuZyA9PiAnaW50ZXJuYWwnLCBwcm9jb3N0ID0+ICcxJywgcHJv cm93cyA9PiAnMCcsDQorICBwcm92YXJpYWRpYyA9PiAnMCcsIHByb3N1cHBvcnQgPT4gJzAn LCBwcm9raW5kID0+ICdmJywgcHJvc2VjZGVmID0+ICdmJywNCisgIHByb2xlYWtwcm9vZiA9 PiAnZicsIHByb2lzc3RyaWN0ID0+ICd0JywgcHJvcmV0c2V0ID0+ICdmJywgcHJvdm9sYXRp bGUgPT4gJ3MnLA0KKyAgcHJvcGFyYWxsZWwgPT4gJ3MnLCBwcm9uYXJncyA9PiAnMScsIHBy b25hcmdkZWZhdWx0cyA9PiAnMCcsDQorICBwcm9yZXR0eXBlID0+ICd0ZXh0JywgcHJvYXJn dHlwZXMgPT4gJ3JlZ3JvbGUnLCBwcm9hbGxhcmd0eXBlcyA9PiAnX251bGxfJywNCisgIHBy b2FyZ21vZGVzID0+ICdfbnVsbF8nLCBwcm9hcmduYW1lcyA9PiAnX251bGxfJywgcHJvYXJn ZGVmYXVsdHMgPT4gJ19udWxsXycsDQorICBwcm90cmZ0eXBlcyA9PiAnX251bGxfJywgcHJv c3JjID0+ICdwZ19nZXRfcm9sZV9kZGwnLCBwcm9iaW4gPT4gJ19udWxsXycsDQorICBwcm9z cWxib2R5ID0+ICdfbnVsbF8nLCBwcm9jb25maWcgPT4gJ19udWxsXycsIHByb2FjbCA9PiAn X251bGxfJyB9LA0KKw0KKyMgcGdfZ2V0X3JvbGVfZGRsX3N0YXRlbWVudHMgLSByZXR1cm4g RERMIGFzIHNlcGFyYXRlIHN0YXRlbWVudHMgKGNvbXBhY3QgZm9ybWF0KQ0KK3sgb2lkID0+ ICc5OTkyJywgZGVzY3IgPT4gJ2dldCBTUUwgY29tbWFuZHMgdG8gcmVjcmVhdGUgcm9sZSBh cyByb3cgc2V0JywNCisgIHByb25hbWUgPT4gJ3BnX2dldF9yb2xlX2RkbF9zdGF0ZW1lbnRz JywgcHJvbmFtZXNwYWNlID0+ICdwZ19jYXRhbG9nJywNCisgIHByb293bmVyID0+ICdQT1NU R1JFUycsIHByb2xhbmcgPT4gJ2ludGVybmFsJywgcHJvY29zdCA9PiAnMScsDQorICBwcm9y b3dzID0+ICcxMCcsIHByb3ZhcmlhZGljID0+ICcwJywgcHJvc3VwcG9ydCA9PiAnMCcsIHBy b2tpbmQgPT4gJ2YnLA0KKyAgcHJvc2VjZGVmID0+ICdmJywgcHJvbGVha3Byb29mID0+ICdm JywgcHJvaXNzdHJpY3QgPT4gJ3QnLCBwcm9yZXRzZXQgPT4gJ3QnLA0KKyAgcHJvdm9sYXRp bGUgPT4gJ3MnLCBwcm9wYXJhbGxlbCA9PiAncycsIHByb25hcmdzID0+ICcxJywNCisgIHBy b25hcmdkZWZhdWx0cyA9PiAnMCcsIHByb3JldHR5cGUgPT4gJ3RleHQnLCBwcm9hcmd0eXBl cyA9PiAncmVncm9sZScsDQorICBwcm9hbGxhcmd0eXBlcyA9PiAnX251bGxfJywgcHJvYXJn bW9kZXMgPT4gJ19udWxsXycsIHByb2FyZ25hbWVzID0+ICdfbnVsbF8nLA0KKyAgcHJvYXJn ZGVmYXVsdHMgPT4gJ19udWxsXycsIHByb3RyZnR5cGVzID0+ICdfbnVsbF8nLA0KKyAgcHJv c3JjID0+ICdwZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50cycsIHByb2JpbiA9PiAnX251bGxf JywNCisgIHByb3NxbGJvZHkgPT4gJ19udWxsXycsIHByb2NvbmZpZyA9PiAnX251bGxfJywg cHJvYWNsID0+ICdfbnVsbF8nIH0sDQogXQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvcm9sZV9kZGwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9y b2xlX2RkbC5vdXQNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi5j YmM0MTY3YTcyDQotLS0gL2Rldi9udWxsDQorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3JvbGVfZGRsLm91dA0KQEAgLTAsMCArMSw5MCBAQA0KKy0tIFNldCBmaXhlZCB0aW1l em9uZSBmb3IgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMNCitTRVQgdGltZXpvbmUgPSAnVVRD JzsNCistLSBDcmVhdGUgdGVzdCBkYXRhYmFzZQ0KK0NSRUFURSBEQVRBQkFTRSByZWdyZXNz aW9uX3JvbGVfZGRsX3Rlc3Q7DQorLS0gVGVzdCAxOiBCYXNpYyByb2xlDQorQ1JFQVRFIFJP TEUgcmVncmVzc19yb2xlX2RkbF90ZXN0MTsNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKCdy ZWdyZXNzX3JvbGVfZGRsX3Rlc3QxJyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcm9sZV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgQ1JFQVRF IFJPTEUgcmVncmVzc19yb2xlX2RkbF90ZXN0MSBOT0xPR0lOIE5PU1VQRVJVU0VSIE5PQ1JF QVRFREIgTk9DUkVBVEVST0xFIElOSEVSSVQgTk9SRVBMSUNBVElPTiBOT0JZUEFTU1JMUzsN CisoMSByb3cpDQorDQorLS0gVGVzdCAyOiBSb2xlIHdpdGggTE9HSU4NCitDUkVBVEUgUk9M RSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QyIExPR0lOOw0KK1NFTEVDVCBwZ19nZXRfcm9sZV9k ZGwoJ3JlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDInKTsNCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3JvbGVfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIENSRUFU RSBST0xFIHJlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDIgTE9HSU4gTk9TVVBFUlVTRVIgTk9DUkVB VEVEQiBOT0NSRUFURVJPTEUgSU5IRVJJVCBOT1JFUExJQ0FUSU9OIE5PQllQQVNTUkxTOw0K KygxIHJvdykNCisNCistLSBUZXN0IDM6IFJvbGUgd2l0aCBtdWx0aXBsZSBwcml2aWxlZ2Vz DQorQ1JFQVRFIFJPTEUgcmVncmVzc19yb2xlX2RkbF90ZXN0Mw0KKyAgTE9HSU4NCisgIFNV UEVSVVNFUg0KKyAgQ1JFQVRFREINCisgIENSRUFURVJPTEUNCisgIENPTk5FQ1RJT04gTElN SVQgNQ0KKyAgVkFMSUQgVU5USUwgJzIwMzAtMTItMzEgMjM6NTk6NTkrMDAnOw0KK1NFTEVD VCBwZ19nZXRfcm9sZV9kZGwoJ3JlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDMnKTsNCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ19nZXRfcm9sZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyBDUkVB VEUgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QzIExPR0lOIFNVUEVSVVNFUiBDUkVBVEVE QiBDUkVBVEVST0xFIElOSEVSSVQgTk9SRVBMSUNBVElPTiBOT0JZUEFTU1JMUyBDT05ORUNU SU9OIExJTUlUIDUgVkFMSUQgVU5USUwgJzIwMzAtMTItMzEgMjM6NTk6NTknOw0KKygxIHJv dykNCisNCistLSBUZXN0IDQ6IFJvbGUgd2l0aCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMN CitDUkVBVEUgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3Q0Ow0KK0FMVEVSIFJPTEUgcmVn cmVzc19yb2xlX2RkbF90ZXN0NCBTRVQgd29ya19tZW0gVE8gJzI1Nk1CJzsNCitBTFRFUiBS T0xFIHJlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDQgU0VUIHNlYXJjaF9wYXRoIFRPICdteXNjaGVt YSwgcHVibGljJzsNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKCdyZWdyZXNzX3JvbGVfZGRs X3Rlc3Q0Jyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfcm9sZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgQ1JFQVRFIFJPTEUgcmVncmVzc19y b2xlX2RkbF90ZXN0NCBOT0xPR0lOIE5PU1VQRVJVU0VSIE5PQ1JFQVRFREIgTk9DUkVBVEVS T0xFIElOSEVSSVQgTk9SRVBMSUNBVElPTiBOT0JZUEFTU1JMUzsrDQorIEFMVEVSIFJPTEUg cmVncmVzc19yb2xlX2RkbF90ZXN0NCBTRVQgd29ya19tZW0gVE8gJzI1Nk1CJzsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKw0KKyBB TFRFUiBST0xFIHJlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDQgU0VUIHNlYXJjaF9wYXRoIFRPICci bXlzY2hlbWEsIHB1YmxpYyInOw0KKygxIHJvdykNCisNCistLSBUZXN0IDU6IFJvbGUgd2l0 aCBkYXRhYmFzZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uDQorQ1JFQVRFIFJPTEUgcmVncmVz c19yb2xlX2RkbF90ZXN0NTsNCitBTFRFUiBST0xFIHJlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDUg SU4gREFUQUJBU0UgcmVncmVzc2lvbl9yb2xlX2RkbF90ZXN0IFNFVCB3b3JrX21lbSBUTyAn MTI4TUInOw0KK1NFTEVDVCBwZ19nZXRfcm9sZV9kZGwoJ3JlZ3Jlc3Nfcm9sZV9kZGxfdGVz dDUnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBnX2dldF9yb2xlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyBDUkVBVEUgUk9MRSByZWdyZXNzX3JvbGVf ZGRsX3Rlc3Q1IE5PTE9HSU4gTk9TVVBFUlVTRVIgTk9DUkVBVEVEQiBOT0NSRUFURVJPTEUg SU5IRVJJVCBOT1JFUExJQ0FUSU9OIE5PQllQQVNTUkxTOysNCisgQUxURVIgUk9MRSByZWdy ZXNzX3JvbGVfZGRsX3Rlc3Q1IElOIERBVEFCQVNFIHJlZ3Jlc3Npb25fcm9sZV9kZGxfdGVz dCBTRVQgd29ya19tZW0gVE8gJzEyOE1CJzsNCisoMSByb3cpDQorDQorLS0gVGVzdCA2OiBU ZXN0IHBnX2dldF9yb2xlX2RkbF9zdGF0ZW1lbnRzIGZ1bmN0aW9uDQorU0VMRUNUICogRlJP TSBwZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50cygncmVncmVzc19yb2xlX2RkbF90ZXN0NCcp Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3JvbGVfZGRsX3N0YXRlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIENSRUFURSBST0xFIHJlZ3Jlc3Nfcm9sZV9kZGxf dGVzdDQgTk9MT0dJTiBOT1NVUEVSVVNFUiBOT0NSRUFURURCIE5PQ1JFQVRFUk9MRSBJTkhF UklUIE5PUkVQTElDQVRJT04gTk9CWVBBU1NSTFM7DQorIEFMVEVSIFJPTEUgcmVncmVzc19y b2xlX2RkbF90ZXN0NCBTRVQgd29ya19tZW0gVE8gJzI1Nk1CJzsNCisgQUxURVIgUk9MRSBy ZWdyZXNzX3JvbGVfZGRsX3Rlc3Q0IFNFVCBzZWFyY2hfcGF0aCBUTyAnIm15c2NoZW1hLCBw dWJsaWMiJzsNCisoMyByb3dzKQ0KKw0KKy0tIFRlc3QgNzogUm9sZSB3aXRoIHNwZWNpYWwg Y2hhcmFjdGVycyAocmVxdWlyZXMgcXVvdGluZykNCitDUkVBVEUgUk9MRSAicmVncmVzc19y b2xlLXdpdGgtZGFzaCI7DQorU0VMRUNUIHBnX2dldF9yb2xlX2RkbCgncmVncmVzc19yb2xl LXdpdGgtZGFzaCcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBnX2dldF9yb2xlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyBDUkVBVEUgUk9MRSAi cmVncmVzc19yb2xlLXdpdGgtZGFzaCIgTk9MT0dJTiBOT1NVUEVSVVNFUiBOT0NSRUFURURC IE5PQ1JFQVRFUk9MRSBJTkhFUklUIE5PUkVQTElDQVRJT04gTk9CWVBBU1NSTFM7DQorKDEg cm93KQ0KKw0KKy0tIFRlc3QgODogTm9uLWV4aXN0ZW50IHJvbGUgKHNob3VsZCByZXR1cm4g TlVMTCkNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKDk5OTk5OTk6Om9pZCk7DQorIHBnX2dl dF9yb2xlX2RkbCANCistLS0tLS0tLS0tLS0tLS0tLQ0KKyANCisoMSByb3cpDQorDQorLS0g Q2xlYW51cA0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QxOw0KK0RST1AgUk9M RSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QyOw0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRs X3Rlc3QzOw0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3Q0Ow0KK0RST1AgUk9M RSByZWdyZXNzX3JvbGVfZGRsX3Rlc3Q1Ow0KK0RST1AgUk9MRSAicmVncmVzc19yb2xlLXdp dGgtZGFzaCI7DQorRFJPUCBEQVRBQkFTRSByZWdyZXNzaW9uX3JvbGVfZGRsX3Rlc3Q7DQor LS0gUmVzZXQgdGltZXpvbmUgdG8gZGVmYXVsdA0KK1JFU0VUIHRpbWV6b25lOw0KDQpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSBiL3NyYy90ZXN0 L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUNCmluZGV4IGEwZjVmYWIwZjUuLjM0YzllOThj ZTkgMTAwNjQ0DQotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlDQor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlDQpAQCAtMTI1LDYgKzEy NSwxMCBAQCB0ZXN0OiBwbGFuY2FjaGUgbGltaXQgcGxwZ3NxbCBjb3B5MiB0ZW1wIGRvbWFp biByYW5nZWZ1bmNzIHByZXBhcmUgY29udmVyc2lvbiB0cg0KICMgLS0tLS0tLS0tLQ0KIHRl c3Q6IHBhcnRpdGlvbl9qb2luIHBhcnRpdGlvbl9wcnVuZSByZWxvcHRpb25zIGhhc2hfcGFy dCBpbmRleGluZyBwYXJ0aXRpb25fYWdncmVnYXRlIHBhcnRpdGlvbl9pbmZvIHR1cGxlc29y dCBleHBsYWluIGNvbXByZXNzaW9uIGNvbXByZXNzaW9uX2x6NCBtZW1vaXplIHN0YXRzIHBy ZWRpY2F0ZSBudW1hIGVhZ2VyX2FnZ3JlZ2F0ZQ0KIA0KKyMgVGVzdHMgcm9sZV9kZGwgZnVu Y3Rpb25zIHRvIGNyZWF0ZSBzdGF0ZW1lbnRzIG5lZWRlZA0KKyMgdG8gcmVwcm9kdWNlIGEg cm9sZQ0KK3Rlc3Q6IHJvbGVfZGRsDQorDQogIyBldmVudF90cmlnZ2VyIGRlcGVuZHMgb24g Y3JlYXRlX2FtIGFuZCBjYW5ub3QgcnVuIGNvbmN1cnJlbnRseSB3aXRoDQogIyBhbnkgdGVz dCB0aGF0IHJ1bnMgRERMDQogIyBvaWRqb2lucyBpcyByZWFkLW9ubHksIHRob3VnaCwgYW5k IHNob3VsZCBydW4gbGF0ZSBmb3IgYmVzdCBjb3ZlcmFnZQ0KZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL3JvbGVfZGRsLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jv bGVfZGRsLnNxbA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAuLmEy N2ZmNDQxMzcNCi0tLSAvZGV2L251bGwNCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jv bGVfZGRsLnNxbA0KQEAgLTAsMCArMSw1NyBAQA0KKy0tIFNldCBmaXhlZCB0aW1lem9uZSBm b3IgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMNCitTRVQgdGltZXpvbmUgPSAnVVRDJzsNCisN CistLSBDcmVhdGUgdGVzdCBkYXRhYmFzZQ0KK0NSRUFURSBEQVRBQkFTRSByZWdyZXNzaW9u X3JvbGVfZGRsX3Rlc3Q7DQorDQorLS0gVGVzdCAxOiBCYXNpYyByb2xlDQorQ1JFQVRFIFJP TEUgcmVncmVzc19yb2xlX2RkbF90ZXN0MTsNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKCdy ZWdyZXNzX3JvbGVfZGRsX3Rlc3QxJyk7DQorDQorLS0gVGVzdCAyOiBSb2xlIHdpdGggTE9H SU4NCitDUkVBVEUgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QyIExPR0lOOw0KK1NFTEVD VCBwZ19nZXRfcm9sZV9kZGwoJ3JlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDInKTsNCisNCistLSBU ZXN0IDM6IFJvbGUgd2l0aCBtdWx0aXBsZSBwcml2aWxlZ2VzDQorQ1JFQVRFIFJPTEUgcmVn cmVzc19yb2xlX2RkbF90ZXN0Mw0KKyAgTE9HSU4NCisgIFNVUEVSVVNFUg0KKyAgQ1JFQVRF REINCisgIENSRUFURVJPTEUNCisgIENPTk5FQ1RJT04gTElNSVQgNQ0KKyAgVkFMSUQgVU5U SUwgJzIwMzAtMTItMzEgMjM6NTk6NTkrMDAnOw0KK1NFTEVDVCBwZ19nZXRfcm9sZV9kZGwo J3JlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDMnKTsNCisNCistLSBUZXN0IDQ6IFJvbGUgd2l0aCBj b25maWd1cmF0aW9uIHBhcmFtZXRlcnMNCitDUkVBVEUgUk9MRSByZWdyZXNzX3JvbGVfZGRs X3Rlc3Q0Ow0KK0FMVEVSIFJPTEUgcmVncmVzc19yb2xlX2RkbF90ZXN0NCBTRVQgd29ya19t ZW0gVE8gJzI1Nk1CJzsNCitBTFRFUiBST0xFIHJlZ3Jlc3Nfcm9sZV9kZGxfdGVzdDQgU0VU IHNlYXJjaF9wYXRoIFRPICdteXNjaGVtYSwgcHVibGljJzsNCitTRUxFQ1QgcGdfZ2V0X3Jv bGVfZGRsKCdyZWdyZXNzX3JvbGVfZGRsX3Rlc3Q0Jyk7DQorDQorLS0gVGVzdCA1OiBSb2xl IHdpdGggZGF0YWJhc2Utc3BlY2lmaWMgY29uZmlndXJhdGlvbg0KK0NSRUFURSBST0xFIHJl Z3Jlc3Nfcm9sZV9kZGxfdGVzdDU7DQorQUxURVIgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rl c3Q1IElOIERBVEFCQVNFIHJlZ3Jlc3Npb25fcm9sZV9kZGxfdGVzdCBTRVQgd29ya19tZW0g VE8gJzEyOE1CJzsNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKCdyZWdyZXNzX3JvbGVfZGRs X3Rlc3Q1Jyk7DQorDQorLS0gVGVzdCA2OiBUZXN0IHBnX2dldF9yb2xlX2RkbF9zdGF0ZW1l bnRzIGZ1bmN0aW9uDQorU0VMRUNUICogRlJPTSBwZ19nZXRfcm9sZV9kZGxfc3RhdGVtZW50 cygncmVncmVzc19yb2xlX2RkbF90ZXN0NCcpOw0KKw0KKy0tIFRlc3QgNzogUm9sZSB3aXRo IHNwZWNpYWwgY2hhcmFjdGVycyAocmVxdWlyZXMgcXVvdGluZykNCitDUkVBVEUgUk9MRSAi cmVncmVzc19yb2xlLXdpdGgtZGFzaCI7DQorU0VMRUNUIHBnX2dldF9yb2xlX2RkbCgncmVn cmVzc19yb2xlLXdpdGgtZGFzaCcpOw0KKw0KKy0tIFRlc3QgODogTm9uLWV4aXN0ZW50IHJv bGUgKHNob3VsZCByZXR1cm4gTlVMTCkNCitTRUxFQ1QgcGdfZ2V0X3JvbGVfZGRsKDk5OTk5 OTk6Om9pZCk7DQorDQorLS0gQ2xlYW51cA0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRs X3Rlc3QxOw0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QyOw0KK0RST1AgUk9M RSByZWdyZXNzX3JvbGVfZGRsX3Rlc3QzOw0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRs X3Rlc3Q0Ow0KK0RST1AgUk9MRSByZWdyZXNzX3JvbGVfZGRsX3Rlc3Q1Ow0KK0RST1AgUk9M RSAicmVncmVzc19yb2xlLXdpdGgtZGFzaCI7DQorDQorRFJPUCBEQVRBQkFTRSByZWdyZXNz aW9uX3JvbGVfZGRsX3Rlc3Q7DQorDQorLS0gUmVzZXQgdGltZXpvbmUgdG8gZGVmYXVsdA0K K1JFU0VUIHRpbWV6b25lOw0KDQotLSANCjIuNDYuMC53aW5kb3dzLjENCg0K --------------2y0eNdCJrqA89Ne4vUAatA2l--