ZGlmZiAtLWdpdCBhL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FjY2Vzc2luZ0V4dGVybmFsRGF0YUluQXN0ZXJpeERCLm1kIGIvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vQWNjZXNzaW5nRXh0ZXJuYWxEYXRhSW5Bc3Rlcml4REIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjYjBkYQotLS0gL2Rldi9udWxsCisrKyBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FjY2Vzc2luZ0V4dGVybmFsRGF0YUluQXN0ZXJpeERCLm1kCkBAIC0wLDAgKzEsMTY2IEBACitgPHdpa2k6dG9jIG1heF9kZXB0aD0iNCIgLz5gCisKKyMjIEludHJvZHVjdGlvbiAjIworRGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBBU1RFUklYIGNvdWxkIGJlIHJlc2lkaW5nIG91dHNpZGUgQVNURVJJWCBzdG9yYWdlLiBFeGFtcGxlcyBpbmNsdWRlIGRhdGEgZmlsZXMgb24gYSBkaXN0cmlidXRlZCBmaWxlIHN5c3RlbSBzdWNoIGFzIEhERlMgb3Igb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIGEgbWFjaGluZSB0aGF0IGlzIHBhcnQgb2YgYW4gQVNURVJJWCBjbHVzdGVyLiAgRm9yIEFTVEVSSVggdG8gcHJvY2VzcyBzdWNoIGRhdGEsIGVuZC11c2VyIG1heSBjcmVhdGUgYSByZWd1bGFyIGRhdGFzZXQgaW4gQVNURVJJWCAoYS5rLmEuIGludGVybmFsIGRhdGFzZXQpIGFuZCBsb2FkIHRoZSBkYXRhc2V0IHdpdGggdGhlIGRhdGEuIEFTVEVSSVggc3VwcG9ydHMgJydleHRlcm5hbCBkYXRhc2V0cycnIHNvIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byDigJxsb2Fk4oCdIGFsbCBkYXRhIHByaW9yIHRvIHVzaW5nIGl0LiBUaGlzIGFsc28gYXZvaWRzIGNyZWF0aW5nIG11bHRpcGxlIGNvcGllcyBvZiBkYXRhIGFuZCB0aGUgbmVlZCB0byBrZWVwIHRoZSBjb3BpZXMgaW4gc3luYy4KKworIyMjIEFkYXB0ZXIgZm9yIGFuIEV4dGVybmFsIERhdGFzZXQgIyMjCitFeHRlcm5hbCBkYXRhIGlzIGFjY2Vzc2VkIHVzaW5nIHdyYXBwZXJzIChhZGFwdGVycyBpbiBBU1RFUklYKSB0aGF0IGFic3RyYWN0IGF3YXkgdGhlIG1lY2hhbmlzbSBvZiBjb25uZWN0aW5nIHdpdGggYW4gZXh0ZXJuYWwgc2VydmljZSwgcmVjZWl2aW5nIGRhdGEgYW5kIHRyYW5zZm9ybWluZyB0aGUgZGF0YSBpbnRvIEFETSByZWNvcmRzIHRoYXQgYXJlIHVuZGVyc3Rvb2QgYnkgQVNURVJJWC4gQVNURVJJWCBjb21lcyB3aXRoIGJ1aWx0LWluIGFkYXB0ZXJzIGZvciBjb21tb24gc3RvcmFnZSBzeXN0ZW1zIHN1Y2ggYXMgSERGUyBvciB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCisKKyMjIyBDcmVhdGluZyBhbiBFeHRlcm5hbCBEYXRhc2V0ICMjIworCitBcyBhbiBleGFtcGxlIHdlIGNvbnNpZGVyIHRoZSBMaW5laXRlbSBkYXRhc2V0IGZyb20gW2h0dHA6Ly93d3cub3Blbmxpbmtzdy5jb20vZGF0YXNwYWNlL2RvYy9kYXYvd2lraS9NYWluL1ZPU1RQQ0hMaW5rZWREYXRhL3RwY2guc3FsIFRQQ0ggc2NoZW1hXS4KKworV2UgYXNzdW1lIHRoYXQgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gQVNURVJJWCBpbnN0YW5jZSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBhdCBbSW5zdGFsbGluZ0FzdGVyaXhVc2luZ01hbmFnaXggSW5zdGFsbGluZyBBc3Rlcml4IFVzaW5nIE1hbmFnaXhdLgorX0ZvciBjb25zdHJ1Y3RpbmcgYW4gZXhhbXBsZSwgd2UgYXNzdW1lIGEgc2luZ2xlIG1hY2hpbmUgc2V0dXAuXworCitTaW1pbGFyIHRvIGEgcmVndWxhciBkYXRhc2V0LCBhbiBleHRlcm5hbCBkYXRhc2V0IGhhcyBhbiBhc3NvY2lhdGVkIGRhdGF0eXBlLiAgV2Ugc2hhbGwgZmlyc3QgY3JlYXRlIHRoZSBkYXRhdHlwZSBhc3NvY2lhdGVkIHdpdGggZWFjaCByZWNvcmQgaW4gTGluZWl0ZW0gZGF0YS4KK1Bhc3RlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHF1ZXJ5IHRleHRib3ggb24gdGhlIHdlYnBhZ2UgYXQgaHR0cDovLzEyNy4wLjAuMSBhbmQgaGl0ICdFeGVjdXRlJy4KKworCisgICAgICAgIGNyZWF0ZSBkYXRhdmVyc2UgRXh0ZXJuYWxGaWxlRGVtbzsKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBFeHRlcm5hbEZpbGVEZW1vOworICAgICAgICAKKyAgICAgICAgY3JlYXRlIHR5cGUgTGluZWl0ZW1UeXBlIGFzIGNsb3NlZCB7CisgICAgICAgICAgbF9vcmRlcmtleTppbnQzMiwKKyAgICAgICAgICBsX3BhcnRrZXk6IGludDMyLAorICAgICAgICAgIGxfc3VwcGtleTogaW50MzIsCisgICAgICAgICAgbF9saW5lbnVtYmVyOiBpbnQzMiwKKyAgICAgICAgICBsX3F1YW50aXR5OiBkb3VibGUsCisgICAgICAgICAgbF9leHRlbmRlZHByaWNlOiBkb3VibGUsCisgICAgICAgICAgbF9kaXNjb3VudDogZG91YmxlLAorICAgICAgICAgIGxfdGF4OiBkb3VibGUsCisgICAgICAgICAgbF9yZXR1cm5mbGFnOiBzdHJpbmcsCisgICAgICAgICAgbF9saW5lc3RhdHVzOiBzdHJpbmcsCisgICAgICAgICAgbF9zaGlwZGF0ZTogc3RyaW5nLAorICAgICAgICAgIGxfY29tbWl0ZGF0ZTogc3RyaW5nLAorICAgICAgICAgIGxfcmVjZWlwdGRhdGU6IHN0cmluZywKKyAgICAgICAgICBsX3NoaXBpbnN0cnVjdDogc3RyaW5nLAorICAgICAgICAgIGxfc2hpcG1vZGU6IHN0cmluZywKKyAgICAgICAgICBsX2NvbW1lbnQ6IHN0cmluZ30KKworCitXZSBkZXNjcmliZSBoZXJlIHR3byBzY2VuYXJpb3MuCisKKyMjIyMgMSkgRGF0YSBmaWxlIHJlc2lkZXMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIGEgaG9zdCMjIyMKK1ByZXJlcXVpc2l0ZTogVGhlIGhvc3QgaXMgYSAgcGFydCBvZiB0aGUgQVNURVJJWCBjbHVzdGVyLgorCitFYXJsaWVyLCB3ZSBhc3N1bWVkIGEgc2luZ2xlIG1hY2hpbmUgQVNURVJJWCBzZXR1cC4gVG8gc2F0aXNmeSB0aGUgcHJlcmVxdWlzaXRlLCBsb2ctaW4gdG8gdGhlIG1hY2hpbmUgcnVubmluZyBBU1RFUklYLgorCisgKiBEb3dubG9hZCB0aGUgW2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYXN0ZXJpeGRiL2Rvd25sb2Fkcy9kZXRhaWw/bmFtZT1saW5laXRlbS50YmwmY2FuPTImcT0gIGRhdGEgZmlsZV0gdG8gYW4gYXBwcm9wcmlhdGUgbG9jYXRpb24uIFdlIGRlbm90ZSB0aGlzIGxvY2F0aW9uIGJ5IFNPVVJDRV9QQVRILgorCitBU1RFUklYIHByb3ZpZGVzIGEgYnVpbHQtaW4gYWRhcHRlciBmb3IgZGF0YSByZXNpZGluZyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uIFRoZSBhZGFwdGVyIGlzIHJlZmVycmVkIGJ5IGl0cyBhbGlhcy0gJ2xvY2FsZnMnLiBXZSBjcmVhdGUgYW4gZXh0ZXJuYWwgZGF0YXNldCBuYW1lZCBMaW5laXRlbSBhbmQgdXNlIHRoZSAnbG9jYWxmcycgYWRhcHRlci4KKworCisgICAgICAgIGNyZWF0ZSBleHRlcm5hbCBkYXRhc2V0IExpbmVpdGVtKExpbmVpdGVtVHlwZSkKKyAgICAgICAgdXNpbmcgbG9jYWxmcworCitBYm92ZSwgdGhlIGRlZmluaXRpb24gaXMgbm90IGNvbXBsZXRlIGFzIHdlIG5lZWQgdG8gcHJvdmlkZSBhIHNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgZmlsZS4KKworfHwgUGFyYW1ldGVyIHx8IERlc2NyaXB0aW9uIHx8Cit8fCBwYXRoIHx8IEEgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGZvcm0gYGhvc3Q6Ly88YWJzb2x1dGUgcGF0aD5gLiBVc2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZmlsZXMuIEUuZy4gYGhvc3QxOi8vPGFic29sdXRlIHBhdGg+YCwgYGhvc3QyOi8vPGFic29sdXRlIHBhdGg+YCBhbmQgc28gZm9ydGguIHx8Cit8fCBmb3JtYXQgfHwgVGhlIGZvcm1hdCBmb3IgdGhlIGNvbnRlbnQuIFVzZSAnYWRtJyBmb3IgZGF0YSBpbiBBRE0gKEFTVEVSSVggRGF0YSBNb2RlbCkgb3IgW2h0dHA6Ly93d3cuanNvbi5vcmcvIGpzb25dIGZvcm1hdC4gVXNlICAnZGVsaW1pdGVkLXRleHQnIGlmIGZpZWxkcyBhcmUgc2VwYXJ0ZWQgYnkgLiB8fAorfHwgZGVsaW1pdGVyIHx8IFRoZSBkZWxpbWl0aW5nIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIGZpbGUgaWYgZm9ybWF0IGlzICdkZWxpbWl0ZWQgdGV4dCcgfHwKKworQXMgd2UgYXJlIHVzaW5nIGEgc2luZ2xlIHNpbmdsZSBtYWNoaW5lIEFTVEVSSVggaW5zdGFuY2UsIHdlIHVzZSAxMjcuMC4wLjEgYXMgaG9zdCBpbiB0aGUgcGF0aCBwYXJhbWV0ZXIuCitXZSAqY29tcGxldGUgdGhlIGNyZWF0ZSBkYXRhc2V0IHN0YXRlbWVudCogYXMgZm9sbG93cy4KKworCisgICAgICAgIHVzZSBkYXRhdmVyc2UgRXh0ZXJuYWxGaWxlRGVtbzsKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSBleHRlcm5hbCBkYXRhc2V0IExpbmVpdGVtKExpbmVpdGVtVHlwZSkKKyAgICAgICAgdXNpbmcgbG9jYWxmcworICAgICAgICAoKCJwYXRoIj0iMTI3LjAuMC4xOi8vU09VUkNFX1BBVEgiKSwKKyAgICAgICAgKCJmb3JtYXQiPSJkZWxpbWl0ZWQtdGV4dCIpLAorICAgICAgICAoImRlbGltaXRlciI9InwiKSk7CisKKworUGxlYXNlIHN1YnN0aXR1dGUgU09VUkNFX1BBVEggd2l0aCB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgorCisjIyMjIENvbW1vbiBzb3VyY2Ugb2YgZXJyb3IgIyMjIworCitBbiBpbmNvcnJlY3QgdmFsdWUgZm9yIHRoZSBwYXRoIHBhcmFtZXRlciB3aWxsIGdpdmUgdGhlIGZvbGxvd2luZyBleGNlcHRpb24gbWVzc2FnZSB3aGVuIHRoZSBkYXRhc2V0IGlzIHVzZWQgaW4gYSBxdWVyeS4KKworICAgICAgICBlZHUudWNpLmljcy5oeXJhY2tzLmFsZ2Vicmlja3MuY29tbW9uLmV4Y2VwdGlvbnMuQWxnZWJyaWNrc0V4Y2VwdGlvbjogZWR1LnVjaS5pY3MuaHlyYWNrcy5hcGkuZXhjZXB0aW9ucy5IeXJhY2tzRGF0YUV4Y2VwdGlvbjogZWR1LnVjaS5pY3MuaHlyYWNrcy5hcGkuZXhjZXB0aW9ucy5IeXJhY2tzRGF0YUV4Y2VwdGlvbjogSm9iIGZhaWxlZC4KKworCitWZXJpZnkgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwYXRoIHBhcmFtZXRlciBwcm92aWRlZCB0byB0aGUgbG9jYWxmcyBhZGFwdGVyLiBOb3RlIHRoYXQgdGhlIHBhdGggcGFyYW1ldGVyIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZGF0YSBmaWxlLiBGb3IgZS5nLiBpZiB5b3Ugc2F2ZWQgeW91ciBmaWxlIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkgKGFzc3VtZSBpdCB0byBiZSAvaG9tZS9qb2UpLCB0aGVuIHRoZSBwYXRoIHZhbHVlIHNob3VsZCBiZQorCisgICAgICAgIDEyNy4wLjAuMTovLy9ob21lL2pvZS9saW5laXRlbS50YmwuCisKKworSW4geW91ciB3ZWItYnJvd3NlciwgbmF2aWdhdGUgdG8gMTI3LjAuMC4xIGFuZCBwYXN0ZSB0aGUgYWJvdmUgdG8gdGhlIHF1ZXJ5IHRleHQgYm94LiBGaW5hbGx5IGhpdCAnRXhlY3V0ZScuCisKK05leHQgd2UgbW92ZSBvdmVyIHRvIHRoZSB0aGUgc2VjdGlvbiBbI1dyaXRpbmdfcXVlcmllc19hZ2FpbnN0X2FuX0V4dGVybmFsX0RhdGFzZXQgV3JpdGluZyBRdWVyaWVzIGFnYWluc3QgYW4gRXh0ZXJuYWwgRGF0YXNldF0gYW5kIHRyeSBhIHNhbXBsZSBxdWVyeSBhZ2FpbnN0IHRoZSBleHRlcm5hbCBkYXRhc2V0LgorCisjIyMjIDIpIERhdGEgZmlsZSByZXNpZGVzIG9uIGFuIEhERlMgaW5zdGFuY2UgIyMjIworUHJlLXJlcXVpc2l0ZTogSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGUgTmFtZW5vZGUgYW5kIGF0bGVhc3Qgb25lIG9mIHRoZSBIREZTIERhdGFub2RlcyBhcmUgcmVhY2hhYmxlIGZyb20gdGhlIGhvc3RzIHRoYXQgZm9ybSB0aGUgQVNURVJJWCBjbHVzdGVyLiAgQVNURVJJWCBwcm92aWRlcyBhIGJ1aWx0LWluIGFkYXB0ZXIgZm9yIGRhdGEgcmVzaWRpbmcgb24gSERGUy4gVGhlIEhERlMgYWRhcHRlciBpcyByZWZlcnJlZCAoaW4gQVFMKSBieSBpdHMgYWxpYXMgLSAnaGRmcycuIFdlIGNyZWF0ZSBhbiBleHRlcm5hbCBkYXRhc2V0IG5hbWVkIExpbmVpdGVtIGFuZCBhc3NvY2lhdGUgdGhlIEhERlMgYWRhcHRlciB3aXRoIGl0LgorCisKKyAgICAgICAgY3JlYXRlIGV4dGVybmFsIGRhdGFzZXQgTGluZWl0ZW0oTGluZWl0ZW1UeXBlKQorICAgICAgICB1c2luZyBoZGZzCisKKworVGhlIGFib3ZlIHN0YXRlbWVudCBpcyAqbm90IGNvbXBsZXRlKiBhcyB3ZSBuZWVkIHRvIHByb3ZpZGUgYSBzZXQgb2YgcGFyYW1ldGVycyBzcGVjaWZpYyB0byB0aGUgSERGUyBpbnN0YW5jZSBhbmQgdGhlIHNvdXJjZSBmaWxlLgorVGhlc2UgcGFyYW1ldGVycyBhcmUgZGVzY3JpYmVkIGJlbG93LgorCit8fCBQYXJhbWV0ZXIgfHwgRGVzY3JpcHRpb24gfHwKK3x8IGhkZnMgfHwgVGhlIEhERlMgVVJMIHx8Cit8fCBwYXRoIHx8IFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgSERGUyBmaWxlLiBVc2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZmlsZXMuIHx8Cit8fCBpbnB1dC1mb3JtYXQgfHwgVGhlIGFzc29jaWF0ZWQgaW5wdXQgZm9ybWF0LiBVc2UgJ3RleHQtaW5wdXQtZm9ybWF0JyBmb3IgdGV4dHVhbCBkYXRhIG9yICdzZXF1ZW5jZS1pbnB1dC1mb3JtYXQnIGZvciBiaW5hcnkgZGF0YSAoc2VxdWVuY2UgZmlsZXMpLiB8fAorfHwgZm9ybWF0IHx8IFRoZSBmb3JtYXQgZm9yIHRoZSBjb250ZW50LiBVc2UgJ2FkbScgZm9yIGRhdGEgaW4gQURNIChBU1RFUklYIERhdGEgTW9kZWwpIG9yIFtodHRwOi8vd3d3Lmpzb24ub3JnLyBqc29uXSBmb3JtYXQgYW5kIHVzZSAgJ2RlbGltaXRlZC10ZXh0JyBmb3IgZGVsaW1pdGVkIGRhdGEgdGhhdCBoYXMgZmllbGRzIHNlcGFyYXRlZCBieSBhIGRlbGltaXRpbmcgY2hhcmFjdGVyLiB8fAorfHwgZGVsaW1pdGVyIHx8IFRoZSBkZWxpbWl0aW5nIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIGZpbGUgaWYgZm9ybWF0IGlzICdkZWxpbWl0ZWQgdGV4dCcgfHwKKworKkRpZmZlcmVuY2UgYmV0d2VlbiAnaW5wdXQtZm9ybWF0JyBhbmQgJ2Zvcm1hdCcqCisKKyppbnB1dC1mb3JtYXQqOiBGaWxlIHN0b3JlZCB1bmRlciBIREZTIGhhdmUgYW4gYXNzb2NpYXRlZCBzdG9yYWdlIGZvcm1hdCAgRm9yIGV4YW1wbGUsIFRleHRJbnB1dEZvcm1hdCByZXByZXNlbnRzIHBsYWluIHRleHQgZmlsZXMuICBTZXF1ZW5jZUZpbGVJbnB1dEZvcm1hdCBpbmRpY2F0ZXMgYmluYXJ5IGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlciAnaW5wdXQtZm9ybWF0JyBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlc2UgdHdvIGtpbmQgb2YgZmlsZXMuCisKKypmb3JtYXQqOgorVGhlIHBhcmFtZXRlciAnZm9ybWF0JyByZWZlcnMgdG8gdGhlIHR5cGUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlLiBGb3IgZXhhbXBsZSBkYXRhIGNvbnRhaW5lZCBpbiBhIGZpbGUgY291bGQgYmUgaW4ganNvbiwgQURNIGZvcm1hdCBvciBjb3VsZCBiZSBkZWxpbWl0ZWQtdGV4dCB3aXRoIGZpZWxkcyBzZXBhcmF0ZWQgYnkgYSBkZWxpbWl0aW5nIGNoYXJhY3Rlci4KKworQXMgYW4gZXhhbXBsZS4gY29uc2lkZXIgdGhlIFtodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FzdGVyaXhkYi9kb3dubG9hZHMvZGV0YWlsP25hbWU9bGluZWl0ZW0udGJsJmNhbj0yJnE9IGRhdGEgZmlsZV0uICBUaGUgZmlsZSBpcyBhIHRleHQgZmlsZSB3aXRoIGVhY2ggbGluZSByZXByZXNlbnRpbmcgYSByZWNvcmQuIFRoZSBmaWVsZHMgaW4gZWFjaCByZWNvcmQgYXJlIHNlcGFyYXRlZCBieSB0aGUgJ3wnIGNoYXJhY3Rlci4KKworV2UgYXNzdW1lIHRoZSBIREZTIFVSTCB0byBiZSBoZGZzOi8vaG9zdDpwb3J0LiBXZSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHRoZSBleGFtcGxlIGRhdGEgZmlsZSBpcyBjb3BpZWQgdG8gdGhlIEhERlMgYXQgYSBwYXRoIGRlbm90ZWQgYnkgSERGU19QQVRILgorCitUaGUgY29tcGxldGUgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIG91ciBleGFtcGxlIGZpbGUgYXJlIGFzIGZvbGxvd3MuICgoImhkZnMiPSJIREZTX1VSTCIsKCJwYXRoIj0iSERGU19QQVRIIiksKCJpbnB1dC1mb3JtYXQiPSJ0ZXh0LWlucHV0LWZvcm1hdCIpLCgiZm9ybWF0Ij0iZGVsaW1pdGVkLXRleHQiKSwoImRlbGltaXRlciI9InwiKSkKKworV2UgbW9kaWZ5IHRoZSBjcmVhdGUgZXh0ZXJuYWwgZGF0YXNldCBzdGF0ZW1lbnQgYXMgZm9sbG93cy4KKworCisgICAgICAgIGNyZWF0ZSBleHRlcm5hbCBkYXRhc2V0IExpbmVpdGVtKCdMaW5laXRlbVR5cGUpCisgICAgICAgIHVzaW5nIGhkZnMKKyAgICAgICAgKCgiaGRmcyI9IkhERlNfVVJMIiksKCJwYXRoIj0iSERGU19QQVRIIiksKCJpbnB1dC1mb3JtYXQiPSJ0ZXh0LWlucHV0LWZvcm1hdCIpLCgiZm9ybWF0Ij0iZGVsaW1pdGVkLXRleHQiKSwoImRlbGltaXRlciI9InwiKSk7CisKKworT25jZSB5b3UgaGF2ZSBjb3BpZWQgdGhlIHNvdXJjZSBkYXRhIGZpbGUgdG8geW91ciBIREZTIGluc3RhbmNlLCBzdWJzdGl0dXRlIHRoZSB2YWx1ZXMgb2YgSERGU19VUkwgYW5kIEhERlNfUEFUSCBpbiB0aGUgYWJvdmUgc3RhdGVtZW50LiBJbiB5b3VyIHdlYi1icm93c2VyLCBuYXZpZ2F0ZSB0byBodHRwOi8vMTI3LjAuMC4xOjE5MDAxIGFuZCBleGVjdXRlIHRoZSBhYm92ZSBzdGF0ZW1lbnQgd2l0aCBzdWJzdGl0dXRlZCB2YWx1ZXMuCisKK1lvdSBtYXkgbm93IHJ1biB0aGUgc2FtcGxlIHF1ZXJ5IGluIG5leHQgc2VjdGlvbi4KKworIyMgV3JpdGluZyBRdWVyaWVzIGFnYWluc3QgYW4gRXh0ZXJuYWwgRGF0YXNldCAjIworWW91IG1heSAgd3JpdGUgQVFMIHF1ZXJpZXMgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhc2V0LiBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBBUUwgcXVlcnkgdGhhdCBhcHBsaWVzIGEgZmlsdGVyIGFuZCByZXR1cm5zIGFuIG9yZGVyZWQgcmVzdWx0LgorCisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBFeHRlcm5hbEZpbGVEZW1vOworICAgICAgICAKKyAgICAgICAgZm9yICRjIGluIGRhdGFzZXQoJ0xpbmVpdGVtJykKKyAgICAgICAgd2hlcmUgJGMubF9vcmRlcmtleSA8PSAzCisgICAgICAgIG9yZGVyIGJ5ICRjLmxfb3JkZXJrZXksICRjLmxfbGluZW51bWJlcgorICAgICAgICByZXR1cm4gJGMKKworCitUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisKKyAgICAgICAgeyAibF9vcmRlcmtleSI6IDEsICJsX3BhcnRrZXkiOiAxNTYsICJsX3N1cHBrZXkiOiA0LCAibF9saW5lbnVtYmVyIjogMSwgImxfcXVhbnRpdHkiOiAxNywgImxfZXh0ZW5kZWRwcmljZSI6IDE3OTU0LjU1ZCwgImxfZGlzY291bnQiOiAwLjA0ZCwgImxfdGF4IjogMC4wMmQsICJsX3JldHVybmZsYWciOiAiTiIsICJsX2xpbmVzdGF0dXMiOiAiTyIsICJsX3NoaXBkYXRlIjogIjE5OTYtMDMtMTMiLCAibF9jb21taXRkYXRlIjogIjE5OTYtMDItMTIiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk2LTAzLTIyIiwgImxfc2hpcGluc3RydWN0IjogIkRFTElWRVIgSU4gUEVSU09OIiwgImxfc2hpcG1vZGUiOiAiVFJVQ0siLCAibF9jb21tZW50IjogImVndWxhciBjb3VydHMgYWJvdmUgdGhlIiB9CisgICAgICAgIHsgImxfb3JkZXJrZXkiOiAxLCAibF9wYXJ0a2V5IjogNjgsICJsX3N1cHBrZXkiOiA5LCAibF9saW5lbnVtYmVyIjogMiwgImxfcXVhbnRpdHkiOiAzNiwgImxfZXh0ZW5kZWRwcmljZSI6IDM0ODUwLjE2ZCwgImxfZGlzY291bnQiOiAwLjA5ZCwgImxfdGF4IjogMC4wNmQsICJsX3JldHVybmZsYWciOiAiTiIsICJsX2xpbmVzdGF0dXMiOiAiTyIsICJsX3NoaXBkYXRlIjogIjE5OTYtMDQtMTIiLCAibF9jb21taXRkYXRlIjogIjE5OTYtMDItMjgiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk2LTA0LTIwIiwgImxfc2hpcGluc3RydWN0IjogIlRBS0UgQkFDSyBSRVRVUk4iLCAibF9zaGlwbW9kZSI6ICJNQUlMIiwgImxfY29tbWVudCI6ICJseSBmaW5hbCBkZXBlbmRlbmNpZXM6IHNseWx5IGJvbGQgIiB9CisgICAgICAgIHsgImxfb3JkZXJrZXkiOiAxLCAibF9wYXJ0a2V5IjogNjQsICJsX3N1cHBrZXkiOiA1LCAibF9saW5lbnVtYmVyIjogMywgImxfcXVhbnRpdHkiOiA4LCAibF9leHRlbmRlZHByaWNlIjogNzcxMi40OGQsICJsX2Rpc2NvdW50IjogMC4xZCwgImxfdGF4IjogMC4wMmQsICJsX3JldHVybmZsYWciOiAiTiIsICJsX2xpbmVzdGF0dXMiOiAiTyIsICJsX3NoaXBkYXRlIjogIjE5OTYtMDEtMjkiLCAibF9jb21taXRkYXRlIjogIjE5OTYtMDMtMDUiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk2LTAxLTMxIiwgImxfc2hpcGluc3RydWN0IjogIlRBS0UgQkFDSyBSRVRVUk4iLCAibF9zaGlwbW9kZSI6ICJSRUcgQUlSIiwgImxfY29tbWVudCI6ICJyaW91c2x5LiByZWd1bGFyLCBleHByZXNzIGRlcCIgfQorICAgICAgICB7ICJsX29yZGVya2V5IjogMSwgImxfcGFydGtleSI6IDMsICJsX3N1cHBrZXkiOiA2LCAibF9saW5lbnVtYmVyIjogNCwgImxfcXVhbnRpdHkiOiAyOCwgImxfZXh0ZW5kZWRwcmljZSI6IDI1Mjg0LjBkLCAibF9kaXNjb3VudCI6IDAuMDlkLCAibF90YXgiOiAwLjA2ZCwgImxfcmV0dXJuZmxhZyI6ICJOIiwgImxfbGluZXN0YXR1cyI6ICJPIiwgImxfc2hpcGRhdGUiOiAiMTk5Ni0wNC0yMSIsICJsX2NvbW1pdGRhdGUiOiAiMTk5Ni0wMy0zMCIsICJsX3JlY2VpcHRkYXRlIjogIjE5OTYtMDUtMTYiLCAibF9zaGlwaW5zdHJ1Y3QiOiAiTk9ORSIsICJsX3NoaXBtb2RlIjogIkFJUiIsICJsX2NvbW1lbnQiOiAibGl0ZXMuIGZsdWZmaWx5IGV2ZW4gZGUiIH0KKyAgICAgICAgeyAibF9vcmRlcmtleSI6IDEsICJsX3BhcnRrZXkiOiAyNSwgImxfc3VwcGtleSI6IDgsICJsX2xpbmVudW1iZXIiOiA1LCAibF9xdWFudGl0eSI6IDI0LCAibF9leHRlbmRlZHByaWNlIjogMjIyMDAuNDhkLCAibF9kaXNjb3VudCI6IDAuMWQsICJsX3RheCI6IDAuMDRkLCAibF9yZXR1cm5mbGFnIjogIk4iLCAibF9saW5lc3RhdHVzIjogIk8iLCAibF9zaGlwZGF0ZSI6ICIxOTk2LTAzLTMwIiwgImxfY29tbWl0ZGF0ZSI6ICIxOTk2LTAzLTE0IiwgImxfcmVjZWlwdGRhdGUiOiAiMTk5Ni0wNC0wMSIsICJsX3NoaXBpbnN0cnVjdCI6ICJOT05FIiwgImxfc2hpcG1vZGUiOiAiRk9CIiwgImxfY29tbWVudCI6ICIgcGVuZGluZyBmb3hlcy4gc2x5bHkgcmUiIH0KKyAgICAgICAgeyAibF9vcmRlcmtleSI6IDEsICJsX3BhcnRrZXkiOiAxNiwgImxfc3VwcGtleSI6IDMsICJsX2xpbmVudW1iZXIiOiA2LCAibF9xdWFudGl0eSI6IDMyLCAibF9leHRlbmRlZHByaWNlIjogMjkzMTIuMzJkLCAibF9kaXNjb3VudCI6IDAuMDdkLCAibF90YXgiOiAwLjAyZCwgImxfcmV0dXJuZmxhZyI6ICJOIiwgImxfbGluZXN0YXR1cyI6ICJPIiwgImxfc2hpcGRhdGUiOiAiMTk5Ni0wMS0zMCIsICJsX2NvbW1pdGRhdGUiOiAiMTk5Ni0wMi0wNyIsICJsX3JlY2VpcHRkYXRlIjogIjE5OTYtMDItMDMiLCAibF9zaGlwaW5zdHJ1Y3QiOiAiREVMSVZFUiBJTiBQRVJTT04iLCAibF9zaGlwbW9kZSI6ICJNQUlMIiwgImxfY29tbWVudCI6ICJhcmVmdWxseSBzbHlseSBleCIgfQorICAgICAgICB7ICJsX29yZGVya2V5IjogMiwgImxfcGFydGtleSI6IDEwNywgImxfc3VwcGtleSI6IDIsICJsX2xpbmVudW1iZXIiOiAxLCAibF9xdWFudGl0eSI6IDM4LCAibF9leHRlbmRlZHByaWNlIjogMzgyNjkuOGQsICJsX2Rpc2NvdW50IjogMC4wZCwgImxfdGF4IjogMC4wNWQsICJsX3JldHVybmZsYWciOiAiTiIsICJsX2xpbmVzdGF0dXMiOiAiTyIsICJsX3NoaXBkYXRlIjogIjE5OTctMDEtMjgiLCAibF9jb21taXRkYXRlIjogIjE5OTctMDEtMTQiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk3LTAyLTAyIiwgImxfc2hpcGluc3RydWN0IjogIlRBS0UgQkFDSyBSRVRVUk4iLCAibF9zaGlwbW9kZSI6ICJSQUlMIiwgImxfY29tbWVudCI6ICJ2ZW4gcmVxdWVzdHMuIGRlcG9zaXRzIGJyZWFjaCBhIiB9CisgICAgICAgIHsgImxfb3JkZXJrZXkiOiAzLCAibF9wYXJ0a2V5IjogNSwgImxfc3VwcGtleSI6IDIsICJsX2xpbmVudW1iZXIiOiAxLCAibF9xdWFudGl0eSI6IDQ1LCAibF9leHRlbmRlZHByaWNlIjogNDA3MjUuMGQsICJsX2Rpc2NvdW50IjogMC4wNmQsICJsX3RheCI6IDAuMGQsICJsX3JldHVybmZsYWciOiAiUiIsICJsX2xpbmVzdGF0dXMiOiAiRiIsICJsX3NoaXBkYXRlIjogIjE5OTQtMDItMDIiLCAibF9jb21taXRkYXRlIjogIjE5OTQtMDEtMDQiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk0LTAyLTIzIiwgImxfc2hpcGluc3RydWN0IjogIk5PTkUiLCAibF9zaGlwbW9kZSI6ICJBSVIiLCAibF9jb21tZW50IjogIm9uZ3NpZGUgb2YgdGhlIGZ1cmlvdXNseSBicmF2ZSBhY2NvIiB9CisgICAgICAgIHsgImxfb3JkZXJrZXkiOiAzLCAibF9wYXJ0a2V5IjogMjAsICJsX3N1cHBrZXkiOiAxMCwgImxfbGluZW51bWJlciI6IDIsICJsX3F1YW50aXR5IjogNDksICJsX2V4dGVuZGVkcHJpY2UiOiA0NTA4MC45OGQsICJsX2Rpc2NvdW50IjogMC4xZCwgImxfdGF4IjogMC4wZCwgImxfcmV0dXJuZmxhZyI6ICJSIiwgImxfbGluZXN0YXR1cyI6ICJGIiwgImxfc2hpcGRhdGUiOiAiMTk5My0xMS0wOSIsICJsX2NvbW1pdGRhdGUiOiAiMTk5My0xMi0yMCIsICJsX3JlY2VpcHRkYXRlIjogIjE5OTMtMTEtMjQiLCAibF9zaGlwaW5zdHJ1Y3QiOiAiVEFLRSBCQUNLIFJFVFVSTiIsICJsX3NoaXBtb2RlIjogIlJBSUwiLCAibF9jb21tZW50IjogIiB1bnVzdWFsIGFjY291bnRzLiBldmUiIH0KKyAgICAgICAgeyAibF9vcmRlcmtleSI6IDMsICJsX3BhcnRrZXkiOiAxMjksICJsX3N1cHBrZXkiOiA4LCAibF9saW5lbnVtYmVyIjogMywgImxfcXVhbnRpdHkiOiAyNywgImxfZXh0ZW5kZWRwcmljZSI6IDI3Nzg2LjI0ZCwgImxfZGlzY291bnQiOiAwLjA2ZCwgImxfdGF4IjogMC4wN2QsICJsX3JldHVybmZsYWciOiAiQSIsICJsX2xpbmVzdGF0dXMiOiAiRiIsICJsX3NoaXBkYXRlIjogIjE5OTQtMDEtMTYiLCAibF9jb21taXRkYXRlIjogIjE5OTMtMTEtMjIiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTk0LTAxLTIzIiwgImxfc2hpcGluc3RydWN0IjogIkRFTElWRVIgSU4gUEVSU09OIiwgImxfc2hpcG1vZGUiOiAiU0hJUCIsICJsX2NvbW1lbnQiOiAibmFsIGZveGVzIHdha2UuICIgfQorICAgICAgICB7ICJsX29yZGVya2V5IjogMywgImxfcGFydGtleSI6IDMwLCAibF9zdXBwa2V5IjogNSwgImxfbGluZW51bWJlciI6IDQsICJsX3F1YW50aXR5IjogMiwgImxfZXh0ZW5kZWRwcmljZSI6IDE4NjAuMDZkLCAibF9kaXNjb3VudCI6IDAuMDFkLCAibF90YXgiOiAwLjA2ZCwgImxfcmV0dXJuZmxhZyI6ICJBIiwgImxfbGluZXN0YXR1cyI6ICJGIiwgImxfc2hpcGRhdGUiOiAiMTk5My0xMi0wNCIsICJsX2NvbW1pdGRhdGUiOiAiMTk5NC0wMS0wNyIsICJsX3JlY2VpcHRkYXRlIjogIjE5OTQtMDEtMDEiLCAibF9zaGlwaW5zdHJ1Y3QiOiAiTk9ORSIsICJsX3NoaXBtb2RlIjogIlRSVUNLIiwgImxfY29tbWVudCI6ICJ5LiBmbHVmZmlseSBwZW5kaW5nIGQiIH0KKyAgICAgICAgeyAibF9vcmRlcmtleSI6IDMsICJsX3BhcnRrZXkiOiAxODQsICJsX3N1cHBrZXkiOiA1LCAibF9saW5lbnVtYmVyIjogNSwgImxfcXVhbnRpdHkiOiAyOCwgImxfZXh0ZW5kZWRwcmljZSI6IDMwMzU3LjA0ZCwgImxfZGlzY291bnQiOiAwLjA0ZCwgImxfdGF4IjogMC4wZCwgImxfcmV0dXJuZmxhZyI6ICJSIiwgImxfbGluZXN0YXR1cyI6ICJGIiwgImxfc2hpcGRhdGUiOiAiMTk5My0xMi0xNCIsICJsX2NvbW1pdGRhdGUiOiAiMTk5NC0wMS0xMCIsICJsX3JlY2VpcHRkYXRlIjogIjE5OTQtMDEtMDEiLCAibF9zaGlwaW5zdHJ1Y3QiOiAiVEFLRSBCQUNLIFJFVFVSTiIsICJsX3NoaXBtb2RlIjogIkZPQiIsICJsX2NvbW1lbnQiOiAiYWdlcyBuYWcgc2x5bHkgcGVuZGluZyIgfQorICAgICAgICB7ICJsX29yZGVya2V5IjogMywgImxfcGFydGtleSI6IDYzLCAibF9zdXBwa2V5IjogOCwgImxfbGluZW51bWJlciI6IDYsICJsX3F1YW50aXR5IjogMjYsICJsX2V4dGVuZGVkcHJpY2UiOiAyNTAzOS41NmQsICJsX2Rpc2NvdW50IjogMC4xZCwgImxfdGF4IjogMC4wMmQsICJsX3JldHVybmZsYWciOiAiQSIsICJsX2xpbmVzdGF0dXMiOiAiRiIsICJsX3NoaXBkYXRlIjogIjE5OTMtMTAtMjkiLCAibF9jb21taXRkYXRlIjogIjE5OTMtMTItMTgiLCAibF9yZWNlaXB0ZGF0ZSI6ICIxOTkzLTExLTA0IiwgImxfc2hpcGluc3RydWN0IjogIlRBS0UgQkFDSyBSRVRVUk4iLCAibF9zaGlwbW9kZSI6ICJSQUlMIiwgImxfY29tbWVudCI6ICJnZXMgc2xlZXAgYWZ0ZXIgdGhlIGNhcmVmIiB9CisKZGlmZiAtLWdpdCBhL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FkbUFxbDEwMS5tZCBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FkbUFxbDEwMS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzlkYzAyCi0tLSAvZGV2L251bGwKKysrIGIvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vQWRtQXFsMTAxLm1kCkBAIC0wLDAgKzEsODk4IEBACitgPHdpa2k6dG9jIG1heF9kZXB0aD0iMyIgLz5gCisKKyMgQXN0ZXJpeERCIDEwMTogQW4gQURNIGFuZCBBUUwgUHJpbWVyICMKKworIyMgV2VsY29tZSB0byBBc3Rlcml4REIhICMjCitUaGlzIGRvY3VtZW50IGludHJvZHVjZXMgdGhlIG1haW4gZmVhdHVyZXMgb2YgQXN0ZXJpeERCJ3MgZGF0YSBtb2RlbCAoQURNKSBhbmQgcXVlcnkgbGFuZ3VhZ2UgKEFRTCkgYnkgZXhhbXBsZS4KK1RoZSBleGFtcGxlIGlzIGEgc2ltcGxlIHNjZW5hcmlvIGludm9sdmluZyAoc3ludGhldGljKSBzYW1wbGUgZGF0YSBtb2RlbGVkIGFmdGVyIGRhdGEgZnJvbSB0aGUgc29jaWFsIGRvbWFpbi4KK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGEgc2V0IG9mIHNhbXBsZSBBRE0gZGF0YXNldHMsIHRvZ2V0aGVyIHdpdGggYSBzZXQgb2YgaWxsdXN0cmF0aXZlIEFRTCBxdWVyaWVzLAordG8gaW50cm9kdWNlIHlvdSB0byB0aGUgIkFzdGVyaXhEQiB1c2VyIGV4cGVyaWVuY2UiLgorVGhlIGNvbXBsZXRlIHNldCBvZiBzdGVwcyByZXF1aXJlZCB0byBjcmVhdGUgYW5kIGxvYWQgYSBoYW5kZnVsIG9mIHNhbXBsZSBkYXRhc2V0cywgYWxvbmcgd2l0aCBydW5uYWJsZSBxdWVyaWVzCithbmQgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9yIGVhY2ggcXVlcnksIGFyZSBpbmNsdWRlZC4KKworVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFyZSBhdCBsZWFzdCB2YWd1ZWx5IGZhbWlsaWFyIHdpdGggQXN0ZXJpeERCIGFuZCB3aHkgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0LgorTW9zdCBpbXBvcnRhbnRseSwgaXQgYXNzdW1lcyB5b3UgYWxyZWFkeSBoYXZlIGEgcnVubmluZyBpbnN0YW5jZSBvZiBBc3Rlcml4REIgYW5kIHRoYXQgeW91IGtub3cgaG93IHRvIHF1ZXJ5CitpdCB1c2luZyBBc3Rlcml4REIncyBiYXNpYyB3ZWIgaW50ZXJmYWNlLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzLCB5b3Ugc2hvdWxkIGdvIHRocm91Z2ggdGhlIHN0ZXBzIGluIFtJbnN0YWxsaW5nQXN0ZXJpeFVzaW5nTWFuYWdpeCBJbnN0YWxsaW5nIEFzdGVyaXggVXNpbmcgTWFuYWdpeF0KK2JlZm9yZSByZWFkaW5nIHRoaXMgZG9jdW1lbnQgYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGEgcnVubmluZyBBc3Rlcml4REIgaW5zdGFuY2UgcmVhZHkgdG8gZ28uCitUbyBnZXQgeW91ciBmZWV0IHdldCwgeW91IHNob3VsZCBwcm9iYWJseSBzdGFydCB3aXRoIGEgc2ltcGxlIGxvY2FsIGluc3RhbGxhdGlvbiBvZiBBc3Rlcml4REIgb24geW91ciBmYXZvcml0ZQorbWFjaGluZSwgYWNjZXB0aW5nIGFsbCBvZiB0aGUgZGVmYXVsdCBzZXR0aW5ncyB0aGF0IE1hbmFnaXggb2ZmZXJzLgorTGF0ZXIgeW91IGNhbiBncmFkdWF0ZSB0byB0cnlpbmcgQXN0ZXJpeERCIG9uIGEgY2x1c3RlciwgaXRzIHJlYWwgaW50ZW5kZWQgaG9tZSAoc2luY2UgaXQgdGFyZ2V0cyBCaWcgRGF0YSkuCisoTm90ZTogV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHNwZWNpZnlpbmcgdGhlIGNvcnJlY3QgbG9jYXRpb25zIHdoZXJlIHlvdSBwdXQgdGhlIHNvdXJjZSBkYXRhIGZvciB0aGlzIGV4YW1wbGUsCit0aGVyZSBzaG91bGQgbm8gY2hhbmdlcyBuZWVkZWQgaW4geW91ciBBRE0gb3IgQVFMIHN0YXRlbWVudHMgdG8gcnVuIHRoZSBleGFtcGxlcyBsb2NhbGx5IGFuZC9vciB0byBydW4gdGhlbQorb24gYSBjbHVzdGVyIHdoZW4geW91IGFyZSByZWFkeSB0byB0YWtlIHRoYXQgc3RlcC4pCisKK0FzIHlvdSByZWFkIHRocm91Z2ggdGhpcyBkb2N1bWVudCwgeW91IHNob3VsZCB0cnkgZWFjaCBzdGVwIGZvciB5b3Vyc2VsZiBvbiB5b3VyIG93biBBc3Rlcml4REIgaW5zdGFuY2UuCitPbmNlIHlvdSBoYXZlIHJlYWNoZWQgdGhlIGVuZCwgeW91IHdpbGwgYmUgZnVsbHkgYXJtZWQgYW5kIGRhbmdlcm91cywgd2l0aCBhbGwgdGhlIGJhc2ljIEFzdGVyaXhEQiBrbm93bGVkZ2UKK3RoYXQgeW91J2xsIG5lZWQgdG8gc3RhcnQgZG93biB0aGUgcGF0aCBvZiBtb2RlbGluZywgc3RvcmluZywgYW5kIHF1ZXJ5aW5nIHlvdXIgb3duIHNlbWlzdHJ1Y3R1cmVkIGRhdGEuCisKKy0tLS0KKyMjIEFETTogTW9kZWxpbmcgU2VtaXN0cnVjdGVkIERhdGEgaW4gQXN0ZXJpeERCICMjCitJbiB0aGlzIHNlY3Rpb24geW91IHdpbGwgbGVhcm4gYWxsIGFib3V0IG1vZGVsaW5nIEJpZyBEYXRhIHVzaW5nCitBRE0sIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSBBc3Rlcml4REIgQkRNUy4KKworIyMjIERhdGF2ZXJzZXMsIERhdGF0eXBlcywgYW5kIERhdGFzZXRzICMjIworVGhlIHRvcC1sZXZlbCBvcmdhbml6aW5nIGNvbmNlcHQgaW4gdGhlIEFzdGVyaXhEQiB3b3JsZCBpcyB0aGUgX2RhdGF2ZXJzZV8uCitBIGRhdGF2ZXJzZS0tLXNob3J0IGZvciAiZGF0YSB1bml2ZXJzZSItLS1pcyBhIHBsYWNlIChzaW1pbGFyIHRvIGEgZGF0YWJhc2UgaW4gYSByZWxhdGlvbmFsIERCTVMpIGluIHdoaWNoCit0byBjcmVhdGUgYW5kIG1hbmFnZSB0aGUgdHlwZXMsIGRhdGFzZXRzLCBmdW5jdGlvbnMsIGFuZCBvdGhlciBhcnRpZmFjdHMgZm9yIGEgZ2l2ZW4gQXN0ZXJpeERCIGFwcGxpY2F0aW9uLgorV2hlbiB5b3Ugc3RhcnQgdXNpbmcgYW4gQXN0ZXJpeERCIGluc3RhbmNlIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgc3RhcnRzIG91dCAiZW1wdHkiOyBpdCBjb250YWlucyBubyBkYXRhCitvdGhlciB0aGFuIHRoZSBBc3Rlcml4REIgc3lzdGVtIGNhdGFsb2dzICh3aGljaCBsaXZlIGluIGEgc3BlY2lhbCBkYXRhdmVyc2UgY2FsbGVkIHRoZSBNZXRhZGF0YSBkYXRhdmVyc2UpLgorVG8gc3RvcmUgeW91ciBkYXRhIGluIEFzdGVyaXhEQiwgeW91IHdpbGwgZmlyc3QgY3JlYXRlIGEgZGF0YXZlcnNlIGFuZCB0aGVuIHlvdSB1c2UgaXQgZm9yIHRoZSBfZGF0YXR5cGVzXworYW5kIF9kYXRhc2V0c18gZm9yIG1hbmFnaW5nIHlvdXIgb3duIGRhdGEuCitBIGRhdGF0eXBlIHRlbGxzIEFzdGVyaXhEQiB3aGF0IHlvdSBrbm93IChvciBtb3JlIGFjY3VyYXRlbHksIHdoYXQgeW91IHdhbnQgaXQgdG8ga25vdykgYSBwcmlvcmkgYWJvdXQgb25lCitvZiB0aGUga2luZHMgb2YgZGF0YSBpbnN0YW5jZXMgdGhhdCB5b3Ugd2FudCBBc3Rlcml4REIgdG8gaG9sZCBmb3IgeW91LgorQSBkYXRhc2V0IGlzIGEgY29sbGVjdGlvbiBvZiBkYXRhIGluc3RhbmNlcyBvZiBhIGRhdGF0eXBlLAorYW5kIEFzdGVyaXhEQiBtYWtlcyBzdXJlIHRoYXQgdGhlIGRhdGEgaW5zdGFuY2VzIHRoYXQgeW91IHB1dCBpbiBpdCBjb25mb3JtIHRvIGl0cyBzcGVjaWZpZWQgdHlwZS4KK1NpbmNlIEFzdGVyaXhEQiB0YXJnZXRzIHNlbWlzdHJ1Y3R1cmVkIGRhdGEsIHlvdSBjYW4gdXNlIF9vcGVuXyBkYXRhdHlwZXMgYW5kIHRlbGwgaXQgYXMgbGl0dGxlIG9yIGFzCittdWNoIGFzIHlvdSB3aXNoIGFib3V0IHlvdXIgZGF0YSB1cCBmcm9udDsgdGhlIG1vcmUgeW91IHRlbGwgaXQgdXAgZnJvbnQsIHRoZSBsZXNzIGluZm9ybWF0aW9uIGl0IHdpbGwKK2hhdmUgdG8gc3RvcmUgcmVwZWF0ZWRseSBpbiB0aGUgaW5kaXZpZHVhbCBkYXRhIGluc3RhbmNlcyB0aGF0IHlvdSBnaXZlIGl0LgorSW5zdGFuY2VzIG9mIG9wZW4gZGF0YXR5cGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhZGRpdGlvbmFsIGNvbnRlbnQsIGJleW9uZCB3aGF0IHRoZSBkYXRhdHlwZSBzYXlzLAorYXMgbG9uZyBhcyB0aGV5IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIHByZXNjcmliZWQgYnkgdGhlIGRhdGF0eXBlIGRlZmluaXRpb24uCitPcGVuIHR5cGluZyBhbGxvd3MgZGF0YSB0byB2YXJ5IGZyb20gb25lIGluc3RhbmNlIHRvIGFub3RoZXIgYW5kIGl0IGxlYXZlcyB3aWdnbGUgcm9vbSBmb3IgYXBwbGljYXRpb24KK2V2b2x1dGlvbiBpbiB0ZXJtcyBvZiB3aGF0IG1pZ2h0IG5lZWQgdG8gYmUgc3RvcmVkIGluIHRoZSBmdXR1cmUuCitJZiB5b3Ugd2FudCB0byByZXN0cmljdCBkYXRhIGluc3RhbmNlcyBpbiBhIGRhdGFzZXQgdG8gaGF2ZSBvbmx5IHdoYXQgdGhlIGRhdGF0eXBlIHNheXMsIGFuZCBub3RoaW5nIGV4dHJhLAoreW91IGNhbiBkZWZpbmUgYSBfY2xvc2VkXyBkYXRhdHlwZSBmb3IgdGhhdCBkYXRhc2V0IGFuZCBBc3Rlcml4REIgd2lsbCBrZWVwIHVzZXJzIGZyb20gc3RvcmluZyBvYmplY3RzCit0aGF0IGhhdmUgZXh0cmEgZGF0YSBpbiB0aGVtLgorRGF0YXR5cGVzIGFyZSBvcGVuIGJ5IGRlZmF1bHQgdW5sZXNzIHlvdSB0ZWxsIEFzdGVyaXhEQiBvdGhlcndpc2UuCitMZXQncyBwdXQgdGhlc2UgY29uY2VwdHMgdG8gd29yaworCitPdXIgbGl0dGxlIHNhbXBsZSBzY2VuYXJpbyBpbnZvbHZlcyBoeXBvdGhldGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdXNlcnMgb2YgdHdvIHBvcHVsYXIgc29jaWFsIG5ldHdvcmtzLAorRmFjZWJvb2sgYW5kIFR3aXR0ZXIsIGFuZCB0aGVpciBtZXNzYWdlcy4KK1dlJ2xsIHN0YXJ0IGJ5IGRlZmluaW5nIGEgZGF0YXZlcnNlIGNhbGxlZCAiVGlueVNvY2lhbCIgdG8gaG9sZCBvdXIgZGF0YXR5cGVzIGFuZCBkYXRhc2V0cy4KK1RoZSBBc3Rlcml4REIgZGF0YSBtb2RlbCAoQURNKSBpcyBlc3NlbnRpYWxseSBhIHN1cGVyc2V0IG9mIEpTT04tLS1pdCdzIHdoYXQgeW91IGdldCBieSBleHRlbmRpbmcKK0pTT04gd2l0aCBtb3JlIGRhdGEgdHlwZXMgYW5kIGFkZGl0aW9uYWwgZGF0YSBtb2RlbGluZyBjb25zdHJ1Y3RzIGJvcnJvd2VkIGZyb20gb2JqZWN0IGRhdGFiYXNlcy4KK1RoZSBmb2xsb3dpbmcgaXMgaG93IHdlIGNhbiBjcmVhdGUgdGhlIFRpbnlTb2NpYWwgZGF0YXZlcnNlIHBsdXMgYSBzZXQgb2YgQURNIHR5cGVzIGZvciBtb2RlbGluZworVHdpdHRlciB1c2VycywgdGhlaXIgVHdlZXRzLCBGYWNlYm9vayB1c2VycywgdGhlaXIgdXNlcnMnIGVtcGxveW1lbnQgaW5mb3JtYXRpb24sIGFuZCB0aGVpciBtZXNzYWdlcy4KKyhOb3RlOiBLZWVwIGluIG1pbmQgdGhhdCB0aGlzIGlzIGp1c3QgYSB0aW55IGFuZCBzb21ld2hhdCBzaWxseSBleGFtcGxlIGludGVuZGVkIGZvciBpbGx1c3RyYXRpbmcKK3NvbWUgb2YgdGhlIGtleSBmZWF0dXJlcyBvZiBBc3Rlcml4REIuIDotKSkKKworCisgICAgICAgIGRyb3AgZGF0YXZlcnNlIFRpbnlTb2NpYWwgaWYgZXhpc3RzOworICAgICAgICBjcmVhdGUgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSB0eXBlIFR3aXR0ZXJVc2VyVHlwZSBhcyBvcGVuIHsKKyAgICAgICAgCXNjcmVlbi1uYW1lOiBzdHJpbmcsCisgICAgICAgIAlsYW5nOiBzdHJpbmcsCisgICAgICAgIAlmcmllbmRzX2NvdW50OiBpbnQzMiwKKyAgICAgICAgCXN0YXR1c2VzX2NvdW50OiBpbnQzMiwKKyAgICAgICAgCW5hbWU6IHN0cmluZywKKyAgICAgICAgCWZvbGxvd2Vyc19jb3VudDogaW50MzIKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3JlYXRlIHR5cGUgVHdlZXRNZXNzYWdlVHlwZSBhcyBjbG9zZWQgeworICAgICAgICAJdHdlZXRpZDogc3RyaW5nLAorICAgICAgICAJdXNlcjogVHdpdHRlclVzZXJUeXBlLAorICAgICAgICAJc2VuZGVyLWxvY2F0aW9uOiBwb2ludD8sCisgICAgICAgIAlzZW5kLXRpbWU6IGRhdGV0aW1lLAorICAgICAgICAJcmVmZXJyZWQtdG9waWNzOiB7eyBzdHJpbmcgfX0sCisgICAgICAgIAltZXNzYWdlLXRleHQ6IHN0cmluZworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjcmVhdGUgdHlwZSBFbXBsb3ltZW50VHlwZSBhcyBvcGVuIHsKKyAgICAgICAgCW9yZ2FuaXphdGlvbi1uYW1lOiBzdHJpbmcsCisgICAgICAgIAlzdGFydC1kYXRlOiBkYXRlLAorICAgICAgICAJZW5kLWRhdGU6IGRhdGU/CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSB0eXBlIEZhY2Vib29rVXNlclR5cGUgYXMgY2xvc2VkIHsKKyAgICAgICAgCWlkOiBpbnQzMiwKKyAgICAgICAgCWFsaWFzOiBzdHJpbmcsCisgICAgICAgIAluYW1lOiBzdHJpbmcsCisgICAgICAgIAl1c2VyLXNpbmNlOiBkYXRldGltZSwKKyAgICAgICAgCWZyaWVuZC1pZHM6IHt7IGludDMyIH19LAorICAgICAgICAJZW1wbG95bWVudDogW0VtcGxveW1lbnRUeXBlXQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjcmVhdGUgdHlwZSBGYWNlYm9va01lc3NhZ2VUeXBlIGFzIGNsb3NlZCB7CisgICAgICAgIAltZXNzYWdlLWlkOiBpbnQzMiwKKyAgICAgICAgCWF1dGhvci1pZDogaW50MzIsCisgICAgICAgIAlpbi1yZXNwb25zZS10bzogaW50MzI/LAorICAgICAgICAJc2VuZGVyLWxvY2F0aW9uOiBwb2ludD8sCisgICAgICAgIAltZXNzYWdlOiBzdHJpbmcKKyAgICAgICAgfQorICAgICAgICAKKworCitUaGUgZmlyc3QgdGhyZWUgbGluZXMgYWJvdmUgdGVsbCBBc3Rlcml4REIgdG8gZHJvcCB0aGUgb2xkIFRpbnlTb2NpYWwgZGF0YXZlcnNlLCBpZiBvbmUgYWxyZWFkeQorZXhpc3RzLCBhbmQgdGhlbiB0byBjcmVhdGUgYSBicmFuZCBuZXcgb25lIGFuZCBtYWtlIGl0IHRoZSBmb2N1cyBvZiB0aGUgc3RhdGVtZW50cyB0aGF0IGZvbGxvdy4KK1RoZSBmaXJzdCB0eXBlIGNyZWF0aW9uIHN0YXRlbWVudCBjcmVhdGVzIGEgZGF0YXR5cGUgZm9yIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgVHdpdHRlciB1c2Vycy4KK0l0IGlzIGEgcmVjb3JkIHR5cGUgd2l0aCBhIG1peCBvZiBpbnRlZ2VyIGFuZCBzdHJpbmcgZGF0YSwgdmVyeSBtdWNoIGxpa2UgYSAoZmxhdCkgcmVsYXRpb25hbCB0dXBsZS4KK1RoZSBpbmRpY2F0ZWQgZmllbGRzIGFyZSBhbGwgbWFuZGF0b3J5LCBidXQgYmVjYXVzZSB0aGUgdHlwZSBpcyBvcGVuLCBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgd2VsY29tZS4KK1RoZSBzZWNvbmQgc3RhdGVtZW50IGNyZWF0ZXMgYSBkYXRhdHlwZSBmb3IgVHdpdHRlciBtZXNzYWdlczsgdGhpcyBzaG93cyBob3cgdG8gc3BlY2lmeSBhIGNsb3NlZCB0eXBlLgorSW50ZXJlc3RpbmdseSAoYmFzZWQgb24gb25lIG9mIFR3aXR0ZXIncyBBUElzKSwgZWFjaCBUd2l0dGVyIG1lc3NhZ2UgYWN0dWFsbHkgZW1iZWRzIGFuIGluc3RhbmNlIG9mIHRoZQorc2VuZGluZyB1c2VyJ3MgaW5mb3JtYXRpb24gKGN1cnJlbnQgYXMgb2Ygd2hlbiB0aGUgbWVzc2FnZSB3YXMgc2VudCksIHNvIHRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5lc3RlZAorcmVjb3JkIGluIEFETS4KK1R3aXR0ZXIgbWVzc2FnZXMgY2FuIG9wdGlvbmFsbHkgY29udGFpbiB0aGUgc2VuZGVyJ3MgbG9jYXRpb24sIHdoaWNoIGlzIG1vZGVsZWQgdmlhIHRoZSBzZW5kZXItbG9jYXRpb24KK2ZpZWxkIG9mIHNwYXRpYWwgdHlwZSBfcG9pbnRfOyB0aGUgcXVlc3Rpb24gbWFyayBmb2xsb3dpbmcgdGhlIGZpZWxkIHR5cGUgaW5kaWNhdGVzIGl0cyBvcHRpb25hbGl0eS4KK0FuIG9wdGlvbmFsIGZpZWxkIGlzIGxpa2UgYSBudWxsYWJsZSBmaWVsZCBpbiBTUUwtLS1pdCBtYXkgYmUgcHJlc2VudCBvciBtaXNzaW5nLCBidXQgd2hlbiBpdCdzIHByZXNlbnQsCitpdHMgZGF0YSB0eXBlIHdpbGwgY29uZm9ybSB0byB0aGUgZGF0YXR5cGUncyBzcGVjaWZpY2F0aW9uLgorVGhlIHNlbmQtdGltZSBmaWVsZCBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGEgdGVtcG9yYWwgcHJpbWl0aXZlIHR5cGUsIF9kYXRldGltZV8uCitMYXN0bHksIHRoZSByZWZlcnJlZC10b3BpY3MgZmllbGQgaWxsdXN0cmF0ZXMgYW5vdGhlciB3YXkgdGhhdCBBRE0gaXMgcmljaGVyIHRoYW4gdGhlIHJlbGF0aW9uYWwgbW9kZWw7Cit0aGlzIGZpZWxkIGhvbGRzIGEgYmFnIChhLmsuYS4gYW4gdW5vcmRlcmVkIGxpc3QpIG9mIHN0cmluZ3MuCitTaW5jZSB0aGUgb3ZlcmFsbCBkYXRhdHlwZSBkZWZpbml0aW9uIGZvciBUd2l0dGVyIG1lc3NhZ2VzIHNheXMgImNsb3NlZCIsIHRoZSBmaWVsZHMgdGhhdCBpdCBsaXN0cyBhcmUKK3RoZSBvbmx5IGZpZWxkcyB0aGF0IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBiZSBhbGxvd2VkIHRvIGNvbnRhaW4uCitUaGUgbmV4dCB0d28gY3JlYXRlIHR5cGUgc3RhdGVtZW50cyBjcmVhdGUgYSByZWNvcmQgdHlwZSBmb3IgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgY29tcG9uZW50IG9mCit0aGUgZW1wbG95bWVudCBoaXN0b3J5IG9mIGEgRmFjZWJvb2sgdXNlciBhbmQgdGhlbiBhIHJlY29yZCB0eXBlIGZvciBob2xkaW5nIHRoZSB1c2VyIGluZm9ybWF0aW9uIGl0c2VsZi4KK1RoZSBGYWNlYm9vayB1c2VyIHR5cGUgaGlnaGxpZ2h0cyBhIGZldyBhZGRpdGlvbmFsIEFETSBkYXRhIG1vZGVsIGZlYXR1cmVzLgorSXRzIGZyaWVuZC1pZHMgZmllbGQgaXMgYSBiYWcgb2YgaW50ZWdlcnMsIHByZXN1bWFibHkgdGhlIEZhY2Vib29rIHVzZXIgaWRzIGZvciB0aGlzIHVzZXIncyBmcmllbmRzLAorYW5kIGl0cyBlbXBsb3ltZW50IGZpZWxkIGlzIGFuIG9yZGVyZWQgbGlzdCBvZiBlbXBsb3ltZW50IHJlY29yZHMuCitUaGUgZmluYWwgY3JlYXRlIHR5cGUgc3RhdGVtZW50IGRlZmluZXMgYSB0eXBlIGZvciBoYW5kbGluZyB0aGUgY29udGVudCBvZiBhIEZhY2Vib29rIG1lc3NhZ2UgaW4gb3VyCitoeXBvdGhldGljYWwgc29jaWFsIGRhdGEgc3RvcmFnZSBzY2VuYXJpby4KKworQmVmb3JlIGdvaW5nIG9uLCB3ZSBuZWVkIHRvIG9uY2UgYWdhaW4gZW1waGFzaXplIHRoZSBpZGVhIHRoYXQgQXN0ZXJpeERCIGlzIGFpbWVkIGF0IHN0b3JpbmcKK2FuZCBxdWVyeWluZyBub3QganVzdCBCaWcgRGF0YSwgYnV0IEJpZyBfU2VtaXN0cnVjdHVyZWRfIERhdGEuCitUaGlzIG1lYW5zIHRoYXQgbW9zdCBvZiB0aGUgZmllbGRzIGxpc3RlZCBpbiB0aGUgY3JlYXRlIHR5cGUgc3RhdGVtZW50cyBhYm92ZSBjb3VsZCBoYXZlIGJlZW4KK29taXR0ZWQgd2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSByZXN1bHRpbmcgc2l6ZSBvZiBzdG9yZWQgZGF0YSBpbnN0YW5jZXMgb24gZGlzay4KK0FzdGVyaXhEQiBzdG9yZXMgaXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZHMgZGVmaW5lZCBhIHByaW9yaSBhcyBzZXBhcmF0ZSBtZXRhZGF0YSwgd2hlcmVhcwordGhlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIGZpZWxkcyB0aGF0IGFyZSAianVzdCB0aGVyZSIgaW4gaW5zdGFuY2VzIG9mIG9wZW4gZGF0YXR5cGVzIGlzIHN0b3JlZAord2l0aCBlYWNoIGluc3RhbmNlLS0tbWFraW5nIGZvciBtb3JlIGJpdHMgb24gZGlzayBhbmQgbG9uZ2VyIHRpbWVzIGZvciBvcGVyYXRpb25zIGFmZmVjdGVkIGJ5CitkYXRhIHNpemUgKGUuZy4sIGRhdGFzZXQgc2NhbnMpLgorVGhlIG9ubHkgZmllbGRzIHRoYXQgX211c3RfIGJlIHNwZWNpZmllZCBhIHByaW9yaSBhcmUgdGhlIHByaW1hcnkga2V5IGFuZCBhbnkgZmllbGRzIHRoYXQgeW91Cit3b3VsZCBsaWtlIHRvIGJ1aWxkIGluZGV4ZXMgb24uCisoQXN0ZXJpeERCIGRvZXMgbm90IHlldCBzdXBwb3J0IGF1dG8tZ2VuZXJhdGVkIGtleXMgb3IgaW5kZXhlcyBvbiB0aGUgdW5zcGVjaWZpZWQgIm9wZW4iIGZpZWxkcworb2YgaXRzIGRhdGEgaW5zdGFuY2VzKS4KKworIyMjIENyZWF0aW5nIERhdGFzZXRzIGFuZCBJbmRleGVzICMjIworCitOb3cgdGhhdCB3ZSBoYXZlIGRlZmluZWQgb3VyIGRhdGF0eXBlcywgd2UgY2FuIG1vdmUgb24gYW5kIGNyZWF0ZSBkYXRhc2V0cyB0byBzdG9yZSB0aGUgYWN0dWFsIGRhdGEuCisoSWYgd2Ugd2FudGVkIHRvLCB3ZSBjb3VsZCBldmVuIGhhdmUgc2V2ZXJhbCBuYW1lZCBkYXRhc2V0cyBiYXNlZCBvbiBhbnkgb25lIG9mIHRoZXNlIGRhdGF0eXBlcy4pCitXZSBjYW4gZG8gdGhpcyBhcyBmb2xsb3dzLCB1dGlsaXppbmcgdGhlIERETCBjYXBhYmlsaXRpZXMgb2YgQXN0ZXJpeERCLgorCisKKyAgICAgICAgCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSBkYXRhc2V0IEZhY2Vib29rVXNlcnMoRmFjZWJvb2tVc2VyVHlwZSkKKyAgICAgICAgcHJpbWFyeSBrZXkgaWQ7CisgICAgICAgIAorICAgICAgICBjcmVhdGUgZGF0YXNldCBGYWNlYm9va01lc3NhZ2VzKEZhY2Vib29rTWVzc2FnZVR5cGUpCisgICAgICAgIHByaW1hcnkga2V5IG1lc3NhZ2UtaWQ7CisgICAgICAgIAorICAgICAgICBjcmVhdGUgZGF0YXNldCBUd2l0dGVyVXNlcnMoVHdpdHRlclVzZXJUeXBlKQorICAgICAgICBwcmltYXJ5IGtleSBzY3JlZW4tbmFtZTsKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSBkYXRhc2V0IFR3ZWV0TWVzc2FnZXMoVHdlZXRNZXNzYWdlVHlwZSkKKyAgICAgICAgcHJpbWFyeSBrZXkgdHdlZXRpZAorICAgICAgICBoaW50cyhjYXJkaW5hbGl0eT0xMDApOworICAgICAgICAKKyAgICAgICAgY3JlYXRlIGluZGV4IGZiVXNlclNpbmNlSWR4IG9uIEZhY2Vib29rVXNlcnModXNlci1zaW5jZSk7CisgICAgICAgIGNyZWF0ZSBpbmRleCBmYkF1dGhvcklkeCBvbiBGYWNlYm9va01lc3NhZ2VzKGF1dGhvci1pZCkgdHlwZSBidHJlZTsKKyAgICAgICAgY3JlYXRlIGluZGV4IGZiU2VuZGVyTG9jSW5kZXggb24gRmFjZWJvb2tNZXNzYWdlcyhzZW5kZXItbG9jYXRpb24pIHR5cGUgcnRyZWU7CisgICAgICAgIGNyZWF0ZSBpbmRleCBmYk1lc3NhZ2VJZHggb24gRmFjZWJvb2tNZXNzYWdlcyhtZXNzYWdlKSB0eXBlIGtleXdvcmQ7CisgICAgICAgIAorICAgICAgICBmb3IgJGRzIGluIGRhdGFzZXQgTWV0YWRhdGEuRGF0YXNldCByZXR1cm4gJGRzOworICAgICAgICBmb3IgJGl4IGluIGRhdGFzZXQgTWV0YWRhdGEuSW5kZXggcmV0dXJuICRpeDsKKyAgICAgICAgCisKKworVGhlIEFETSBEREwgc3RhdGVtZW50cyBhYm92ZSBjcmVhdGUgZm91ciBkYXRhc2V0cyBmb3IgaG9sZGluZyBvdXIgc29jaWFsIGRhdGEgaW4gdGhlIFRpbnlTb2NpYWwKK2RhdGF2ZXJzZTogRmFjZWJvb2tVc2VycywgRmFjZWJvb2tNZXNzYWdlcywgVHdpdHRlclVzZXJzLCBhbmQgVHdlZXRNZXNzYWdlcy4KK1RoZSBmaXJzdCBzdGF0ZW1lbnQgY3JlYXRlcyB0aGUgRmFjZWJvb2tVc2VycyBkYXRhIHNldC4KK0l0IHNwZWNpZmllcyB0aGF0IHRoaXMgZGF0YXNldCB3aWxsIHN0b3JlIGRhdGEgaW5zdGFuY2VzIGNvbmZvcm1pbmcgdG8gRmFjZWJvb2tVc2VyVHlwZSBhbmQgdGhhdAoraXQgaGFzIGEgcHJpbWFyeSBrZXkgd2hpY2ggaXMgdGhlIGlkIGZpZWxkIG9mIGVhY2ggaW5zdGFuY2UuCitUaGUgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBBc3Rlcml4REIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgaW5zdGFuY2VzIGZvciB0aGUgcHVycG9zZQorb2YgbGF0ZXIgbG9va3VwIGFuZCBmb3IgdXNlIGluIHNlY29uZGFyeSBpbmRleGVzLgorRWFjaCBBc3Rlcml4REIgZGF0YXNldCBpcyBzdG9yZWQgKGFuZCBpbmRleGVkKSBpbiB0aGUgZm9ybSBvZiBhIEIrIHRyZWUgb24gcHJpbWFyeSBrZXk7CitzZWNvbmRhcnkgaW5kZXhlcyBwb2ludCB0byB0aGVpciBpbmRleGVkIGRhdGEgYnkgcHJpbWFyeSBrZXkuCitJbiBBc3Rlcml4REIgY2x1c3RlcnMsIHRoZSBwcmltYXJ5IGtleSBpcyBhbHNvIHVzZWQgdG8gaGFzaC1wYXJ0aXRpb24gKGEuay5hLiBzaGFyZCkgdGhlCitkYXRhc2V0IGFjcm9zcyB0aGUgbm9kZXMgb2YgdGhlIGNsdXN0ZXIuCitUaGUgbmV4dCB0aHJlZSBjcmVhdGUgZGF0YXNldCBzdGF0ZW1lbnRzIGFyZSBzaW1pbGFyLgorVGhlIGxhc3Qgb25lIGlsbHVzdHJhdGVzIGFuIG9wdGlvbmFsIGNsYXVzZSBmb3IgcHJvdmlkaW5nIHVzZWZ1bCBoaW50cyB0byBBc3Rlcml4REIuCitJbiB0aGlzIGNhc2UsIHRoZSBoaW50IHRlbGxzIEFzdGVyaXhEQiB0aGF0IHRoZSBkYXRhc2V0IGRlZmluZXIgaXMgYW50aWNpcGF0aW5nIHRoYXQgdGhlCitUd2VldE1lc3NhZ2VzIGRhdGFzZXQgd2lsbCBjb250YWluIHJvdWdobHkgMTAwIG9iamVjdHM7IGtub3dpbmcgdGhpcyBjYW4gaGVscCBBc3Rlcml4REIKK3RvIG1vcmUgZWZmaWNpZW50bHkgbWFuYWdlIGFuZCBxdWVyeSB0aGlzIGRhdGFzZXQuCisoQXN0ZXJpeERCIGRvZXMgbm90IHlldCBnYXRoZXIgYW5kIG1haW50YWluIGRhdGEgc3RhdGlzdGljczsgaXQgd2lsbCBjdXJyZW50bHksIGFiaXRyYXJpbHksCithc3N1bWUgYSBjYXJkaW5hbGl0eSBvZiBvbmUgbWlsbGlvbiBvYmplY3RzIHBlciBkYXRhc2V0IGluIHRoZSBhYnNlbmNlIG9mIHN1Y2ggYW4gb3B0aW9uYWwKK2RlZmluaXRpb24tdGltZSBoaW50LikKKworVGhlIGNyZWF0ZSBkYXRhc2V0IHN0YXRlbWVudHMgYWJvdmUgYXJlIGZvbGxvd2VkIGJ5IGZvdXIgbW9yZSBEREwgc3RhdGVtZW50cywgZWFjaCBvZiB3aGljaAorY3JlYXRlcyBhIHNlY29uZGFyeSBpbmRleCBvbiBhIGZpZWxkIG9mIG9uZSBvZiB0aGUgZGF0YXNldHMuCitUaGUgZmlyc3Qgb25lIGluZGV4ZXMgdGhlIEZhY2Vib29rVXNlcnMgZGF0YXNldCBvbiBpdHMgdXNlci1zaW5jZSBmaWVsZC4KK1RoaXMgaW5kZXggd2lsbCBiZSBhIEIrIHRyZWUgaW5kZXg7IGl0cyB0eXBlIGlzIHVuc3BlY2lmaWVkIGFuZCBfYnRyZWVfIGlzIHRoZSBkZWZhdWx0IHR5cGUuCitUaGUgb3RoZXIgdGhyZWUgaWxsdXN0cmF0ZSBob3cgeW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGRlc2lyZWQgdHlwZSBvZiBpbmRleC4KK0luIGFkZGl0aW9uIHRvIGJ0cmVlLCBfcnRyZWVfIGFuZCBpbnZlcnRlZCBfa2V5d29yZF8gaW5kZXhlcyBhcmUgc3VwcG9ydGVkIGJ5IEFzdGVyaXhEQi4KK0luZGV4ZXMgY2FuIGFsc28gaGF2ZSBjb21wb3NpdGUga2V5cywgYW5kIHRoZXJlIGFyZSBtb3JlIGFkdmFuY2VkIGZsYXZvcnMgb2YgdGV4dCBpbmRleGluZworYXZhaWxhYmxlIGFzIHdlbGwgKF9mdXp6eSBrZXl3b3JkXyBhbmQgX25ncmFtKGspXywgd2hlcmUgX2tfIGlzIHRoZSBkZXNpcmVkIGdyYW0gbGVuZ3RoKS4KKworIyMjIFF1ZXJ5aW5nIHRoZSBNZXRhZGF0YSBEYXRhdmVyc2UgIyMjCisKK1RoZSBsYXN0IHR3byBzdGF0ZW1lbnRzIGFib3ZlIHNob3cgaG93IHlvdSBjYW4gdXNlIHF1ZXJpZXMgaW4gQVFMIHRvIGV4YW1pbmUgdGhlIEFzdGVyaXhEQgorc3lzdGVtIGNhdGFsb2dzIGFuZCB0ZWxsIHdoYXQgYXJ0aWZhY3RzIHlvdSBoYXZlIGNyZWF0ZWQuCitKdXN0IGFzIHJlbGF0aW9uYWwgREJNU3MgdXNlIHRoZWlyIG93biB0YWJsZXMgdG8gc3RvcmUgdGhlaXIgY2F0YWxvZ3MsIEFzdGVyaXhEQiB1c2VzCitpdHMgb3duIGRhdGFzZXRzIHRvIHBlcnNpc3QgZGVzY3JpcHRpb25zIG9mIGl0cyBkYXRhc2V0cywgZGF0YXR5cGVzLCBpbmRleGVzLCBhbmQgc28gb24uCitSdW5uaW5nIHRoZSBmaXJzdCBvZiB0aGUgdHdvIHF1ZXJpZXMgYWJvdmUgd2lsbCBsaXN0IGFsbCBvZiB5b3VyIG5ld2x5IGNyZWF0ZWQgZGF0YXNldHMsCithbmQgaXQgd2lsbCBhbHNvIHNob3cgeW91IGEgZnVsbCBsaXN0IG9mIGFsbCB0aGUgbWV0YWRhdGEgZGF0YXNldHMuCisoWW91IGNhbiB0aGVuIGV4cGxvcmUgZnJvbSB0aGVyZSBvbiB5b3VyIG93biBpZiB5b3UgYXJlIGN1cmlvdXMpCitUaGVzZSBsYXN0IHR3byBxdWVyaWVzIGFsc28gaWxsdXN0cmF0ZSBvbmUgb3RoZXIgZmFjdG9pZCB3b3J0aCBrbm93aW5nOgorQXN0ZXJpeERCIGFsbG93cyBxdWVyaWVzIHRvIHNwYW4gZGF0YXZlcnNlcyBieSBhbGxvd2luZyB0aGUgb3B0aW9uYWwgdXNlCitvZiBmdWxseS1xdWFsaWZpZWQgZGF0YXNldCBuYW1lcyAoaS5lLiwgX2RhdGF2ZXJzZW5hbWUuZGF0YXNldG5hbWVfKQordG8gcmVmZXJlbmNlIGRhdGFzZXRzIHRoYXQgbGl2ZSBpbiBhIGRhdGF2ZXJzZSBvdGhlciB0aGFuIHRoZSBvbmUgdGhhdAord2FzIG5hbWVkIGluIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkIF91c2UgZGF0YXZlcnNlXyBkaXJlY3RpdmUuCisKKy0tLS0KKyMjIExvYWRpbmcgRGF0YSBJbnRvIEFzdGVyaXhEQiAjIworT2theSwgc28gZmFyIHNvIGdvb2QtLS1Bc3Rlcml4REIgaXMgbm93IHJlYWR5IGZvciBkYXRhLCBzbyBsZXQncyBnaXZlIGl0IHNvbWUgZGF0YSB0byBzdG9yZQorT3VyIG5leHQgdGFzayB3aWxsIGJlIHRvIGxvYWQgc29tZSBzYW1wbGUgZGF0YSBpbnRvIHRoZSBmb3VyIGRhdGFzZXRzIHRoYXQgd2UganVzdCBkZWZpbmVkLgorSGVyZSB3ZSB3aWxsIGxvYWQgYSB0aW55IHNldCBvZiByZWNvcmRzLCBkZWZpbmVkIGluIEFETSBmb3JtYXQgKGEgc3VwZXJzZXQgb2YgSlNPTiksIGludG8gZWFjaCBkYXRhc2V0LgorSW4gdGhlIGJveGVzIGJlbG93IHlvdSBjYW4gc2VlIHRoZSBhY3R1YWwgZGF0YSBpbnN0YW5jZXMgY29udGFpbmVkIGluIGVhY2ggb2YgdGhlIHByb3ZpZGVkIHNhbXBsZSBmaWxlcy4KK0luIG9yZGVyIHRvIGxvYWQgdGhpcyBkYXRhIHlvdXJzZWxmLCB5b3Ugc2hvdWxkIGZpcnN0IHN0b3JlIHRoZSBmb3VyIGNvcnJlc3BvbmRpbmcgYC5hZG1gIGZpbGVzCisod2hvc2UgVVJMcyBhcmUgaW5kaWNhdGVkIG9uIHRvcCBvZiBlYWNoIGJveCBiZWxvdykgaW50byBhIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGFjY2Vzc2libGUgdG8geW91cgorcnVubmluZyBBc3Rlcml4REIgaW5zdGFuY2UuCitUYWtlIGEgZmV3IG1pbnV0ZXMgdG8gbG9vayBjYXJlZnVsbHkgYXQgZWFjaCBvZiB0aGUgc2FtcGxlIGRhdGEgc2V0cy4KK1RoaXMgd2lsbCBnaXZlIHlvdSBhIGJldHRlciBzZW5zZSBvZiB0aGUgbmF0dXJlIG9mIHRoZSBkYXRhIHRoYXQgd2UgYXJlIGFib3V0IHRvIGxvYWQgYW5kIHF1ZXJ5LgorV2Ugc2hvdWxkIG5vdGUgdGhhdCBBRE0gZm9ybWF0IGlzIGEgdGV4dHVhbCBzZXJpYWxpemF0aW9uIG9mIHdoYXQgQXN0ZXJpeERCIHdpbGwgYWN0dWFsbHkgc3RvcmU7Cit3aGVuIHBlcnNpc3RlZCBpbiBBc3Rlcml4REIsIHRoZSBkYXRhIGZvcm1hdCB3aWxsIGJlIGJpbmFyeSBhbmQgdGhlIGRhdGEgaW4gdGhlIHByZWRlZmluZWQgZmllbGRzCitvZiB0aGUgZGF0YSBpbnN0YW5jZXMgd2lsbCBiZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZWlyIGFzc29jaWF0ZWQgZmllbGQgbmFtZSBhbmQgdHlwZSBtZXRhZGF0YS4KKworKlR3aXR0ZXIgVXNlcnMqOiBodHRwOi8vYXN0ZXJpeGRiLmdvb2dsZWNvZGUuY29tL2ZpbGVzL3R3dS5hZG0KKworICAgICAgICB7InNjcmVlbi1uYW1lIjoiTmF0aGFuR2llc2VuQDIxMSIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjE4LCJzdGF0dXNlc19jb3VudCI6NDczLCJuYW1lIjoiTmF0aGFuIEdpZXNlbiIsImZvbGxvd2Vyc19jb3VudCI6NDk0MTZ9CisgICAgICAgIHsic2NyZWVuLW5hbWUiOiJDb2xpbmVHZXllckA2MyIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjEyMSwic3RhdHVzZXNfY291bnQiOjM2MiwibmFtZSI6IkNvbGluZSBHZXllciIsImZvbGxvd2Vyc19jb3VudCI6MTcxNTl9CisgICAgICAgIHsic2NyZWVuLW5hbWUiOiJOaWxhTWlsbGlyb25fdHciLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50Ijo0NDUsInN0YXR1c2VzX2NvdW50IjoxNjQsIm5hbWUiOiJOaWxhIE1pbGxpcm9uIiwiZm9sbG93ZXJzX2NvdW50IjoyMjY0OX0KKyAgICAgICAgeyJzY3JlZW4tbmFtZSI6IkNoYW5nRXdpbmdfNTczIiwibGFuZyI6ImVuIiwiZnJpZW5kc19jb3VudCI6MTgyLCJzdGF0dXNlc19jb3VudCI6Mzk0LCJuYW1lIjoiQ2hhbmcgRXdpbmciLCJmb2xsb3dlcnNfY291bnQiOjMyMTM2fQorCisqVHdlZXQgTWVzc2FnZXMqOiBodHRwOi8vYXN0ZXJpeGRiLmdvb2dsZWNvZGUuY29tL2ZpbGVzL3R3bS5hZG0KKworICAgICAgICB7InR3ZWV0aWQiOiIxIiwidXNlciI6eyJzY3JlZW4tbmFtZSI6Ik5hdGhhbkdpZXNlbkAyMTEiLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50IjozOTMzOSwic3RhdHVzZXNfY291bnQiOjQ3MywibmFtZSI6Ik5hdGhhbiBHaWVzZW4iLCJmb2xsb3dlcnNfY291bnQiOjQ5NDE2fSwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiNDcuNDQsODAuNjUiKSwic2VuZC10aW1lIjpkYXRldGltZSgiMjAwOC0wNC0yNlQxMDoxMDowMCIpLCJyZWZlcnJlZC10b3BpY3MiOnt7InQtbW9iaWxlIiwiY3VzdG9taXphdGlvbiJ9fSwibWVzc2FnZS10ZXh0IjoiIGxvdmUgdC1tb2JpbGUgaXRzIGN1c3RvbWl6YXRpb24gaXMgZ29vZDopIn0KKyAgICAgICAgeyJ0d2VldGlkIjoiMiIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJDb2xpbmVHZXllckA2MyIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjEyMSwic3RhdHVzZXNfY291bnQiOjM2MiwibmFtZSI6IkNvbGluZSBHZXllciIsImZvbGxvd2Vyc19jb3VudCI6MTcxNTl9LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCIzMi44NCw2Ny4xNCIpLCJzZW5kLXRpbWUiOmRhdGV0aW1lKCIyMDEwLTA1LTEzVDEwOjEwOjAwIiksInJlZmVycmVkLXRvcGljcyI6e3sidmVyaXpvbiIsInNob3J0Y3V0LW1lbnUifX0sIm1lc3NhZ2UtdGV4dCI6IiBsaWtlIHZlcml6b24gaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIn0KKyAgICAgICAgeyJ0d2VldGlkIjoiMyIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJOYXRoYW5HaWVzZW5AMjExIiwibGFuZyI6ImVuIiwiZnJpZW5kc19jb3VudCI6MzkzMzksInN0YXR1c2VzX2NvdW50Ijo0NzMsIm5hbWUiOiJOYXRoYW4gR2llc2VuIiwiZm9sbG93ZXJzX2NvdW50Ijo0OTQxNn0sInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjI5LjcyLDc1LjgiKSwic2VuZC10aW1lIjpkYXRldGltZSgiMjAwNi0xMS0wNFQxMDoxMDowMCIpLCJyZWZlcnJlZC10b3BpY3MiOnt7Im1vdG9yb2xhIiwic3BlZWQifX0sIm1lc3NhZ2UtdGV4dCI6IiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikifQorICAgICAgICB7InR3ZWV0aWQiOiI0IiwidXNlciI6eyJzY3JlZW4tbmFtZSI6Ik5hdGhhbkdpZXNlbkAyMTEiLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50IjozOTMzOSwic3RhdHVzZXNfY291bnQiOjQ3MywibmFtZSI6Ik5hdGhhbiBHaWVzZW4iLCJmb2xsb3dlcnNfY291bnQiOjQ5NDE2fSwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiMzkuMjgsNzAuNDgiKSwic2VuZC10aW1lIjpkYXRldGltZSgiMjAxMS0xMi0yNlQxMDoxMDowMCIpLCJyZWZlcnJlZC10b3BpY3MiOnt7InNwcmludCIsInZvaWNlLWNvbW1hbmQifX0sIm1lc3NhZ2UtdGV4dCI6IiBsaWtlIHNwcmludCB0aGUgdm9pY2UtY29tbWFuZCBpcyBtaW5kLWJsb3dpbmc6KSJ9CisgICAgICAgIHsidHdlZXRpZCI6IjUiLCJ1c2VyIjp7InNjcmVlbi1uYW1lIjoiTmF0aGFuR2llc2VuQDIxMSIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjM5MzM5LCJzdGF0dXNlc19jb3VudCI6NDczLCJuYW1lIjoiTmF0aGFuIEdpZXNlbiIsImZvbGxvd2Vyc19jb3VudCI6NDk0MTZ9LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0MC4wOSw5Mi42OSIpLCJzZW5kLXRpbWUiOmRhdGV0aW1lKCIyMDA2LTA4LTA0VDEwOjEwOjAwIiksInJlZmVycmVkLXRvcGljcyI6e3sibW90b3JvbGEiLCJzcGVlZCJ9fSwibWVzc2FnZS10ZXh0IjoiIGNhbid0IHN0YW5kIG1vdG9yb2xhIGl0cyBzcGVlZCBpcyB0ZXJyaWJsZTooIn0KKyAgICAgICAgeyJ0d2VldGlkIjoiNiIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJDb2xpbmVHZXllckA2MyIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjEyMSwic3RhdHVzZXNfY291bnQiOjM2MiwibmFtZSI6IkNvbGluZSBHZXllciIsImZvbGxvd2Vyc19jb3VudCI6MTcxNTl9LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0Ny41MSw4My45OSIpLCJzZW5kLXRpbWUiOmRhdGV0aW1lKCIyMDEwLTA1LTA3VDEwOjEwOjAwIiksInJlZmVycmVkLXRvcGljcyI6e3siaXBob25lIiwidm9pY2UtY2xhcml0eSJ9fSwibWVzc2FnZS10ZXh0IjoiIGxpa2UgaXBob25lIHRoZSB2b2ljZS1jbGFyaXR5IGlzIGdvb2Q6KSJ9CisgICAgICAgIHsidHdlZXRpZCI6IjciLCJ1c2VyIjp7InNjcmVlbi1uYW1lIjoiQ2hhbmdFd2luZ181NzMiLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50IjoxODIsInN0YXR1c2VzX2NvdW50IjozOTQsIm5hbWUiOiJDaGFuZyBFd2luZyIsImZvbGxvd2Vyc19jb3VudCI6MzIxMzZ9LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCIzNi4yMSw3Mi42IiksInNlbmQtdGltZSI6ZGF0ZXRpbWUoIjIwMTEtMDgtMjVUMTA6MTA6MDAiKSwicmVmZXJyZWQtdG9waWNzIjp7eyJzYW1zdW5nIiwicGxhdGZvcm0ifX0sIm1lc3NhZ2UtdGV4dCI6IiBsaWtlIHNhbXN1bmcgdGhlIHBsYXRmb3JtIGlzIGdvb2QifQorICAgICAgICB7InR3ZWV0aWQiOiI4IiwidXNlciI6eyJzY3JlZW4tbmFtZSI6Ik5hdGhhbkdpZXNlbkAyMTEiLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50IjozOTMzOSwic3RhdHVzZXNfY291bnQiOjQ3MywibmFtZSI6Ik5hdGhhbiBHaWVzZW4iLCJmb2xsb3dlcnNfY291bnQiOjQ5NDE2fSwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiNDYuMDUsOTMuMzQiKSwic2VuZC10aW1lIjpkYXRldGltZSgiMjAwNS0xMC0xNFQxMDoxMDowMCIpLCJyZWZlcnJlZC10b3BpY3MiOnt7InQtbW9iaWxlIiwic2hvcnRjdXQtbWVudSJ9fSwibWVzc2FnZS10ZXh0IjoiIGxpa2UgdC1tb2JpbGUgdGhlIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIn0KKyAgICAgICAgeyJ0d2VldGlkIjoiOSIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJOYXRoYW5HaWVzZW5AMjExIiwibGFuZyI6ImVuIiwiZnJpZW5kc19jb3VudCI6MzkzMzksInN0YXR1c2VzX2NvdW50Ijo0NzMsIm5hbWUiOiJOYXRoYW4gR2llc2VuIiwiZm9sbG93ZXJzX2NvdW50Ijo0OTQxNn0sInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjM2Ljg2LDc0LjYyIiksInNlbmQtdGltZSI6ZGF0ZXRpbWUoIjIwMTItMDctMjFUMTA6MTA6MDAiKSwicmVmZXJyZWQtdG9waWNzIjp7eyJ2ZXJpem9uIiwidm9pY2VtYWlsLXNlcnZpY2UifX0sIm1lc3NhZ2UtdGV4dCI6IiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUifQorICAgICAgICB7InR3ZWV0aWQiOiIxMCIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJDb2xpbmVHZXllckA2MyIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjEyMSwic3RhdHVzZXNfY291bnQiOjM2MiwibmFtZSI6IkNvbGluZSBHZXllciIsImZvbGxvd2Vyc19jb3VudCI6MTcxNTl9LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCIyOS4xNSw3Ni41MyIpLCJzZW5kLXRpbWUiOmRhdGV0aW1lKCIyMDA4LTAxLTI2VDEwOjEwOjAwIiksInJlZmVycmVkLXRvcGljcyI6e3sidmVyaXpvbiIsInZvaWNlLWNsYXJpdHkifX0sIm1lc3NhZ2UtdGV4dCI6IiBoYXRlIHZlcml6b24gaXRzIHZvaWNlLWNsYXJpdHkgaXMgT01HOigifQorICAgICAgICB7InR3ZWV0aWQiOiIxMSIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJOaWxhTWlsbGlyb25fdHciLCJsYW5nIjoiZW4iLCJmcmllbmRzX2NvdW50Ijo0NDUsInN0YXR1c2VzX2NvdW50IjoxNjQsIm5hbWUiOiJOaWxhIE1pbGxpcm9uIiwiZm9sbG93ZXJzX2NvdW50IjoyMjY0OX0sInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjM3LjU5LDY4LjQyIiksInNlbmQtdGltZSI6ZGF0ZXRpbWUoIjIwMDgtMDMtMDlUMTA6MTA6MDAiKSwicmVmZXJyZWQtdG9waWNzIjp7eyJpcGhvbmUiLCJwbGF0Zm9ybSJ9fSwibWVzc2FnZS10ZXh0IjoiIGNhbid0IHN0YW5kIGlwaG9uZSBpdHMgcGxhdGZvcm0gaXMgdGVycmlibGUifQorICAgICAgICB7InR3ZWV0aWQiOiIxMiIsInVzZXIiOnsic2NyZWVuLW5hbWUiOiJPbGlKYWNrc29uXzUxMiIsImxhbmciOiJlbiIsImZyaWVuZHNfY291bnQiOjQ0NSwic3RhdHVzZXNfY291bnQiOjE2NCwibmFtZSI6Ik9saSBKYWNrc29uIiwiZm9sbG93ZXJzX2NvdW50IjoyMjY0OX0sInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjI0LjgyLDk0LjYzIiksInNlbmQtdGltZSI6ZGF0ZXRpbWUoIjIwMTAtMDItMTNUMTA6MTA6MDAiKSwicmVmZXJyZWQtdG9waWNzIjp7eyJzYW1zdW5nIiwidm9pY2UtY29tbWFuZCJ9fSwibWVzc2FnZS10ZXh0IjoiIGxpa2Ugc2Ftc3VuZyB0aGUgdm9pY2UtY29tbWFuZCBpcyBhbWF6aW5nOikifQorCisqRmFjZWJvb2sgVXNlcnMqOmh0dHA6Ly9hc3Rlcml4ZGIuZ29vZ2xlY29kZS5jb20vZmlsZXMvZmJ1LmFkbQorCisgICAgICAgIHsiaWQiOjEsImFsaWFzIjoiTWFyZ2FyaXRhIiwibmFtZSI6Ik1hcmdhcml0YVN0b2RkYXJkIiwidXNlci1zaW5jZSI6ZGF0ZXRpbWUoIjIwMTItMDgtMjBUMTA6MTA6MDAiKSwiZnJpZW5kLWlkcyI6e3syLDMsNiwxMH19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6IkNvZGV0ZWNobm8iLCJzdGFydC1kYXRlIjpkYXRlKCIyMDA2LTA4LTA2Iil9XX0KKyAgICAgICAgeyJpZCI6MiwiYWxpYXMiOiJJc2JlbCIsIm5hbWUiOiJJc2JlbER1bGwiLCJ1c2VyLXNpbmNlIjpkYXRldGltZSgiMjAxMS0wMS0yMlQxMDoxMDowMCIpLCJmcmllbmQtaWRzIjp7ezEsNH19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6IkhleHZpYWZpbmQiLCJzdGFydC1kYXRlIjpkYXRlKCIyMDEwLTA0LTI3Iil9XX0KKyAgICAgICAgeyJpZCI6MywiYWxpYXMiOiJFbW9yeSIsIm5hbWUiOiJFbW9yeVVuayIsInVzZXItc2luY2UiOmRhdGV0aW1lKCIyMDEyLTA3LTEwVDEwOjEwOjAwIiksImZyaWVuZC1pZHMiOnt7MSw1LDgsOX19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6Imdlb21lZGlhIiwic3RhcnQtZGF0ZSI6ZGF0ZSgiMjAxMC0wNi0xNyIpLCJlbmQtZGF0ZSI6ZGF0ZSgiMjAxMC0wMS0yNiIpfV19CisgICAgICAgIHsiaWQiOjQsImFsaWFzIjoiTmljaG9sYXMiLCJuYW1lIjoiTmljaG9sYXNTdHJvaCIsInVzZXItc2luY2UiOmRhdGV0aW1lKCIyMDEwLTEyLTI3VDEwOjEwOjAwIiksImZyaWVuZC1pZHMiOnt7Mn19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6IlphbWNvcnBvcmF0aW9uIiwic3RhcnQtZGF0ZSI6ZGF0ZSgiMjAxMC0wNi0wOCIpfV19CisgICAgICAgIHsiaWQiOjUsImFsaWFzIjoiVm9uIiwibmFtZSI6IlZvbktlbWJsZSIsInVzZXItc2luY2UiOmRhdGV0aW1lKCIyMDEwLTAxLTA1VDEwOjEwOjAwIiksImZyaWVuZC1pZHMiOnt7Myw2LDEwfX0sImVtcGxveW1lbnQiOlt7Im9yZ2FuaXphdGlvbi1uYW1lIjoiS29uZ3JlZW4iLCJzdGFydC1kYXRlIjpkYXRlKCIyMDEwLTExLTI3Iil9XX0KKyAgICAgICAgeyJpZCI6NiwiYWxpYXMiOiJXaWxsaXMiLCJuYW1lIjoiV2lsbGlzV3lubmUiLCJ1c2VyLXNpbmNlIjpkYXRldGltZSgiMjAwNS0wMS0xN1QxMDoxMDowMCIpLCJmcmllbmQtaWRzIjp7ezEsMyw3fX0sImVtcGxveW1lbnQiOlt7Im9yZ2FuaXphdGlvbi1uYW1lIjoiamF5ZGF4Iiwic3RhcnQtZGF0ZSI6ZGF0ZSgiMjAwOS0wNS0xNSIpfV19CisgICAgICAgIHsiaWQiOjcsImFsaWFzIjoiU3V6YW5uYSIsIm5hbWUiOiJTdXphbm5hVGlsbHNvbiIsInVzZXItc2luY2UiOmRhdGV0aW1lKCIyMDEyLTA4LTA3VDEwOjEwOjAwIiksImZyaWVuZC1pZHMiOnt7Nn19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6IkxhYnphdHJvbiIsInN0YXJ0LWRhdGUiOmRhdGUoIjIwMTEtMDQtMTkiKX1dfQorICAgICAgICB7ImlkIjo4LCJhbGlhcyI6Ik5pbGEiLCJuYW1lIjoiTmlsYU1pbGxpcm9uIiwidXNlci1zaW5jZSI6ZGF0ZXRpbWUoIjIwMDgtMDEtMDFUMTA6MTA6MDAiKSwiZnJpZW5kLWlkcyI6e3szfX0sImVtcGxveW1lbnQiOlt7Im9yZ2FuaXphdGlvbi1uYW1lIjoiUGxleGxhbmUiLCJzdGFydC1kYXRlIjpkYXRlKCIyMDEwLTAyLTI4Iil9XX0KKyAgICAgICAgeyJpZCI6OSwiYWxpYXMiOiJXb29kcm93IiwibmFtZSI6Ildvb2Ryb3dOZWhsaW5nIiwidXNlci1zaW5jZSI6ZGF0ZXRpbWUoIjIwMDUtMDktMjBUMTA6MTA6MDAiKSwiZnJpZW5kLWlkcyI6e3szLDEwfX0sImVtcGxveW1lbnQiOlt7Im9yZ2FuaXphdGlvbi1uYW1lIjoiWnVuY2FuIiwic3RhcnQtZGF0ZSI6ZGF0ZSgiMjAwMy0wNC0yMiIpLCJlbmQtZGF0ZSI6ZGF0ZSgiMjAwOS0xMi0xMyIpfV19CisgICAgICAgIHsiaWQiOjEwLCJhbGlhcyI6IkJyYW0iLCJuYW1lIjoiQnJhbUhhdGNoIiwidXNlci1zaW5jZSI6ZGF0ZXRpbWUoIjIwMTAtMTAtMTZUMTA6MTA6MDAiKSwiZnJpZW5kLWlkcyI6e3sxLDUsOX19LCJlbXBsb3ltZW50IjpbeyJvcmdhbml6YXRpb24tbmFtZSI6InBoeXNjYW5lIiwic3RhcnQtZGF0ZSI6ZGF0ZSgiMjAwNy0wNi0wNSIpLCJlbmQtZGF0ZSI6ZGF0ZSgiMjAxMS0xMS0wNSIpfV19CisKKypGYWNlYm9vayBNZXNzYWdlcyo6IGh0dHA6Ly9hc3Rlcml4ZGIuZ29vZ2xlY29kZS5jb20vZmlsZXMvZmJtLmFkbQorCisgICAgICAgIHsibWVzc2FnZS1pZCI6MSwiYXV0aG9yLWlkIjozLCJpbi1yZXNwb25zZS10byI6Miwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiNDcuMTYsNzcuNzUiKSwibWVzc2FnZSI6IiBsb3ZlIHNwcmludCBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjIsImF1dGhvci1pZCI6MSwiaW4tcmVzcG9uc2UtdG8iOjQsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjQxLjY2LDgwLjg3IiksIm1lc3NhZ2UiOiIgZGlzbGlrZSBpcGhvbmUgaXRzIHRvdWNoLXNjcmVlbiBpcyBob3JyaWJsZSJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6MywiYXV0aG9yLWlkIjoyLCJpbi1yZXNwb25zZS10byI6NCwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiNDguMDksODEuMDEiKSwibWVzc2FnZSI6IiBsaWtlIHNhbXN1bmcgdGhlIHBsYW4gaXMgYW1hemluZyJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6NCwiYXV0aG9yLWlkIjoxLCJpbi1yZXNwb25zZS10byI6Miwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiMzcuNzMsOTcuMDQiKSwibWVzc2FnZSI6IiBjYW4ndCBzdGFuZCBhdCZ0IHRoZSBuZXR3b3JrIGlzIGhvcnJpYmxlOigifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjUsImF1dGhvci1pZCI6NiwiaW4tcmVzcG9uc2UtdG8iOjIsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjM0LjcsOTAuNzYiKSwibWVzc2FnZSI6IiBsb3ZlIHNwcmludCB0aGUgY3VzdG9taXphdGlvbiBpcyBtaW5kLWJsb3dpbmcifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjYsImF1dGhvci1pZCI6MiwiaW4tcmVzcG9uc2UtdG8iOjEsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjMxLjUsNzUuNTYiKSwibWVzc2FnZSI6IiBsaWtlIHQtbW9iaWxlIGl0cyBwbGF0Zm9ybSBpcyBtaW5kLWJsb3dpbmcifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjcsImF1dGhvci1pZCI6NSwiaW4tcmVzcG9uc2UtdG8iOjE1LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCIzMi45MSw4NS4wNSIpLCJtZXNzYWdlIjoiIGRpc2xpa2Ugc3ByaW50IHRoZSBzcGVlZCBpcyBob3JyaWJsZSJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6OCwiYXV0aG9yLWlkIjoxLCJpbi1yZXNwb25zZS10byI6MTEsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjQwLjMzLDgwLjg3IiksIm1lc3NhZ2UiOiIgbGlrZSB2ZXJpem9uIHRoZSAzRyBpcyBhd2Vzb21lOikifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjksImF1dGhvci1pZCI6MywiaW4tcmVzcG9uc2UtdG8iOjEyLCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCIzNC40NSw5Ni40OCIpLCJtZXNzYWdlIjoiIGxvdmUgdmVyaXpvbiBpdHMgd2lyZWxlc3MgaXMgZ29vZCJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6MTAsImF1dGhvci1pZCI6MSwiaW4tcmVzcG9uc2UtdG8iOjEyLCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0Mi41LDcwLjAxIiksIm1lc3NhZ2UiOiIgY2FuJ3Qgc3RhbmQgbW90b3JvbGEgdGhlIHRvdWNoLXNjcmVlbiBpcyB0ZXJyaWJsZSJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6MTEsImF1dGhvci1pZCI6MSwiaW4tcmVzcG9uc2UtdG8iOjEsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjM4Ljk3LDc3LjQ5IiksIm1lc3NhZ2UiOiIgY2FuJ3Qgc3RhbmQgYXQmdCBpdHMgcGxhbiBpcyB0ZXJyaWJsZSJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6MTIsImF1dGhvci1pZCI6MTAsImluLXJlc3BvbnNlLXRvIjo2LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0Mi4yNiw3Ny43NiIpLCJtZXNzYWdlIjoiIGNhbid0IHN0YW5kIHQtbW9iaWxlIGl0cyB2b2ljZW1haWwtc2VydmljZSBpcyBPTUc6KCJ9CisgICAgICAgIHsibWVzc2FnZS1pZCI6MTMsImF1dGhvci1pZCI6MTAsImluLXJlc3BvbnNlLXRvIjo0LCJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0Mi43Nyw3OC45MiIpLCJtZXNzYWdlIjoiIGRpc2xpa2UgaXBob25lIHRoZSB2b2ljZS1jb21tYW5kIGlzIGJhZDooIn0KKyAgICAgICAgeyJtZXNzYWdlLWlkIjoxNCwiYXV0aG9yLWlkIjo5LCJpbi1yZXNwb25zZS10byI6MTIsInNlbmRlci1sb2NhdGlvbiI6cG9pbnQoIjQxLjMzLDg1LjI4IiksIm1lc3NhZ2UiOiIgbG92ZSBhdCZ0IGl0cyAzRyBpcyBnb29kOikifQorICAgICAgICB7Im1lc3NhZ2UtaWQiOjE1LCJhdXRob3ItaWQiOjcsImluLXJlc3BvbnNlLXRvIjoxMSwic2VuZGVyLWxvY2F0aW9uIjpwb2ludCgiNDQuNDcsNjcuMTEiKSwibWVzc2FnZSI6IiBsaWtlIGlwaG9uZSB0aGUgdm9pY2VtYWlsLXNlcnZpY2UgaXMgYXdlc29tZSJ9CisKKworSXQncyBsb2FkaW5nIHRpbWUKK1dlIGNhbiB1c2UgQVFMIF9sb2FkXyBzdGF0ZW1lbnRzIHRvIHBvcHVsYXRlIG91ciBkYXRhc2V0cyB3aXRoIHRoZSBzYW1wbGUgcmVjb3JkcyBzaG93biBhYm92ZS4KK1RoZSBmb2xsb3dpbmcgc2hvd3MgaG93IGxvYWRpbmcgY2FuIGJlIGRvbmUgZm9yIGRhdGEgc3RvcmVkIGluIGAuYWRtYCBmaWxlcyBpbiB5b3VyIGxvY2FsIGZpbGVzeXN0ZW0uCisqTm90ZToqIFlvdSBfTVVTVF8gcmVwbGFjZSB0aGUgX2A8SG9zdCBOYW1lPmBfIGFuZCBfYDxBYnNvbHV0ZSBGaWxlIFBhdGg+YF8gcGxhY2Vob2xkZXJzIGluIGVhY2ggbG9hZAorc3RhdGVtZW50IGJlbG93IHdpdGggdmFsaWQgdmFsdWVzIGJhc2VkIG9uIHRoZSBob3N0IElQIGFkZHJlc3MgKG9yIGhvc3QgbmFtZSkgZm9yIHRoZSBtYWNoaW5lIGFuZAorZGlyZWN0b3J5IHRoYXQgeW91IGhhdmUgZG93bmxvYWRlZCB0aGUgcHJvdmlkZWQgYC5hZG1gIGZpbGVzIHRvLgorQXMgeW91IGRvIHNvLCBiZSB2ZXJ5LCB2ZXJ5IGNhcmVmdWwgdG8gcmV0YWluIHRoZSB0d28gc2xhc2hlcyBpbiB0aGUgbG9hZCBzdGF0ZW1lbnRzLCBpLmUuLAorZG8gbm90IGRlbGV0ZSB0aGUgdHdvIHNsYXNoZXMgdGhhdCBhcHBlYXIgaW4gZnJvbnQgb2YgdGhlIGFic29sdXRlIHBhdGggdG8geW91ciBgLmFkbWAgZmlsZXMuCisoVGhpcyB3aWxsIGxlYWQgdG8gYSB0aHJlZS1zbGFzaCBjaGFyYWN0ZXIgc2VxdWVuY2UgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbG9hZCBzdGF0ZW1lbnQncyBmaWxlCitpbnB1dCBwYXRoIHNwZWNpZmljYXRpb24uKQorCisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgbG9hZCBkYXRhc2V0IEZhY2Vib29rVXNlcnMgdXNpbmcgbG9jYWxmcworICAgICAgICAoKCJwYXRoIj0iPEhvc3QgTmFtZT46Ly88QWJzb2x1dGUgRmlsZSBQYXRoPi9mYnUuYWRtIiksKCJmb3JtYXQiPSJhZG0iKSk7CisgICAgICAgIAorICAgICAgICBsb2FkIGRhdGFzZXQgRmFjZWJvb2tNZXNzYWdlcyB1c2luZyBsb2NhbGZzCisgICAgICAgICgoInBhdGgiPSI8SG9zdCBOYW1lPjovLzxBYnNvbHV0ZSBGaWxlIFBhdGg+L2ZibS5hZG0iKSwoImZvcm1hdCI9ImFkbSIpKTsKKyAgICAgICAgCisgICAgICAgIGxvYWQgZGF0YXNldCBUd2l0dGVyVXNlcnMgdXNpbmcgbG9jYWxmcworICAgICAgICAoKCJwYXRoIj0iPEhvc3QgTmFtZT46Ly88QWJzb2x1dGUgRmlsZSBQYXRoPi90d3UuYWRtIiksKCJmb3JtYXQiPSJhZG0iKSk7CisgICAgICAgIAorICAgICAgICBsb2FkIGRhdGFzZXQgVHdlZXRNZXNzYWdlcyB1c2luZyBsb2NhbGZzCisgICAgICAgICgoInBhdGgiPSI8SG9zdCBOYW1lPjovLzxBYnNvbHV0ZSBGaWxlIFBhdGg+L3R3bS5hZG0iKSwoImZvcm1hdCI9ImFkbSIpKTsKKworCistLS0tCisjIyBBUUw6IFF1ZXJ5aW5nIFlvdXIgQXN0ZXJpeERCIERhdGEgIyMKK0NvbmdyYXR1bGF0aW9ucyAgWW91IG5vdyBoYXZlIHNhbXBsZSBzb2NpYWwgZGF0YSBzdG9yZWQgKGFuZCBpbmRleGVkKSBpbiBBc3Rlcml4REIuCisoWW91IGFyZSBwYXJ0IG9mIGFuIGVsaXRlIGFuZCBhZHZlbnR1cm91cyBncm91cCBvZiBpbmRpdmlkdWFscy4gOi0pKQorTm93IHRoYXQgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgcHJvdmlkZWQgc2FtcGxlIGRhdGEgaW50byB0aGUgZGF0YXNldHMgdGhhdCB3ZSBkZWZpbmVkLAoreW91IGNhbiBzdGFydCBydW5uaW5nIHF1ZXJpZXMgYWdhaW5zdCB0aGVtLgorCitUaGUgcXVlcnkgbGFuZ3VhZ2UgZm9yIEFzdGVyaXhEQiBpcyBBUUwtLS10aGUgQXN0ZXJpeCBRdWVyeSBMYW5ndWFnZS4KK0FRTCBpcyBsb29zZWx5IGJhc2VkIG9uIFhRdWVyeSwgdGhlIGxhbmd1YWdlIGRldmVsb3BlZCBhbmQgc3RhbmRhcmRpemVkIGluIHRoZSBlYXJseSB0byBtaWQgMjAwMCdzCitieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSAoVzNDKSBmb3IgcXVlcnlpbmcgc2VtaXN0cnVjdHVyZWQgZGF0YSBzdG9yZWQgaW4gdGhlaXIgWE1MIGZvcm1hdC4KK1dlIGhhdmUgdG9zc2VkIGFsbCBvZiB0aGUgIlhNTCBjcnVmdCIgb3V0IG9mIHRoZWlyIGxhbmd1YWdlIGJ1dCByZXRhaW5lZCBtYW55IG9mIGl0cyBjb3JlIGlkZWFzLgorV2UgZGlkIHRoaXMgYmVjYXVzZSBpdHMgZGVzaWduIHdhcyBkZXZlbG9wZWQgb3ZlciBhIHBlcmlvZCBvZiB5ZWFycyBieSBhIGRpdmVyc2UgY29tbWl0dGVlIG9mIHNtYXJ0CithbmQgZXhwZXJpZW5jZWQgbGFuZ3VhZ2UgZGVzaWduZXJzLCBpbmNsdWRpbmcgIlNRTCBwZW9wbGUiLCAiZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBwZW9wbGUiLCBhbmQKKyJYTUwgcGVvcGxlIiwgYWxsIG9mIHdob20gd2VyZSBmb2N1c2VkIG9uIGhvdyB0byBkZXNpZ24gYSBuZXcgcXVlcnkgbGFuZ3VhZ2UgdGhhdCBvcGVyYXRlcyB3ZWxsIG92ZXIKK3NlbWlzdHJ1Y3R1cmVkIGRhdGEuCisoV2UgZGVjaWRlZCB0byBzdGFuZCBvbiB0aGVpciBzaG91bGRlcnMgaW5zdGVhZCBvZiBzdGFydGluZyBmcm9tIHNjcmF0Y2ggYW5kIHJldmlzaXRpbmcgbWFueSBvZiB0aGUKK3NhbWUgaXNzdWVzLikKK05vdGUgdGhhdCBBUUwgaXMgbm90IFNRTCBhbmQgbm90IGJhc2VkIG9uIFNRTDogSW4gb3RoZXIgd29yZHMsIEFzdGVyaXhEQiBpcyBmdWxseSAiTm9TUUwgY29tcGxpYW50Ii4gOi0pCisKK0luIHRoaXMgc2VjdGlvbiB3ZSBpbnRyb2R1Y2UgQVFMIHZpYSBhIHNldCBvZiBleGFtcGxlIHF1ZXJpZXMsIGFsb25nIHdpdGggdGhlaXIgZXhwZWN0ZWQgcmVzdWx0cywKK2Jhc2VkIG9uIHRoZSBkYXRhIGFib3ZlLCB0byBoZWxwIHlvdSBnZXQgc3RhcnRlZC4KK01hbnkgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZlYXR1cmVzIG9mIEFRTCBhcmUgcHJlc2VudGVkIGluIHRoaXMgc2V0IG9mIHJlcHJlc2VudGF0aXZlIHF1ZXJpZXMuCitZb3UgY2FuIGZpbmQgYSBCTkYgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgQVFMIGdyYW1tYXIgYXQgW3dpa2k6QXN0ZXJpeERCR3JhbW1hcl0sIGFuZCBzb21lZGF5CitpbiB0aGUgbm90LXRvby1kaXN0YW50IGZ1dHVyZSB3ZSB3aWxsIGFsc28gcHJvdmlkZSBhIGNvbXBsZXRlIHJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBsYW5ndWFnZS4KK0luIHRoZSBtZWFudGltZSwgdGhpcyB3aWxsIGdldCB5b3Ugc3RhcnRlZCBkb3duIHRoZSBwYXRoIG9mIHVzaW5nIEFzdGVyaXhEQi4KK0EgbW9yZSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgQXN0ZXJpeERCIHByaW1pdGl2ZSB0eXBlcyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIGNhbiBiZQorZm91bmQgYXQgW3dpa2k6QXN0ZXJpeERCVHlwZXNBbmRGdW5jdGlvbnNdLgorCitBUUwgaXMgYW4gZXhwcmVzc2lvbiBsYW5ndWFnZS4KK0V2ZW4gdGhlIGV4cHJlc3Npb24gMSsxIGlzIGEgdmFsaWQgQVFMIHF1ZXJ5IHRoYXQgZXZhbHVhdGVzIHRvIDIuCisoVHJ5IGl0IGZvciB5b3Vyc2VsZgorT2theSwgbWF5YmUgdGhhdCdzIF9ub3RfIHRoZSBiZXN0IHVzZSBvZiBhIDUxMi1ub2RlIHNoYXJlZC1ub3RoaW5nIGNvbXB1dGUgY2x1c3Rlci4pCitNb3N0IHVzZWZ1bCBBUUwgcXVlcmllcyB3aWxsIGJlIGJhc2VkIG9uIHRoZSBfRkxXT1JfIChwcm9ub3VuY2VkICJmbG93ZXIiKSBleHByZXNzaW9uIHN0cnVjdHVyZQordGhhdCBBUUwgaGFzIGJvcnJvd2VkIGZyb20gWFF1ZXJ5ICgoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GTFdPUikpLgorVGhlIEZMV09SIGV4cHJlc3Npb24gc3ludGF4IHN1cHBvcnRzIGJvdGggdGhlIGluY3JlbWVudGFsIGJpbmRpbmcgKF9mb3JfKSBvZiB2YXJpYWJsZXMgdG8gQURNIGRhdGEKK2luc3RhbmNlcyBpbiBhIGRhdGFzZXQgKG9yIGluIHRoZSByZXN1bHQgb2YgYW55IEFRTCBleHByZXNzaW9uLCBhY3R1YWxseSkgYW5kIHRoZSBmdWxsIGJpbmRpbmcgKF9sZXRfKQorb2YgdmFyaWFibGVzIHRvIGVudGlyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpbiBhIGZhc2hpb24gc2ltaWxhciB0byB0ZW1wb3Jhcnkgdmlld3MgaW4gdGhlIFNRTCB3b3JsZC4KK0ZMV09SIGlzIGFuIGFjcm9ueW0gdGhhdCBpcyBzaG9ydCBmb3IgX2Zvcl8tX2xldF8tX3doZXJlXy1fb3JkZXIgYnlfLV9yZXR1cm5fLAorbmFtaW5nIGZpdmUgb2YgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIGNsYXVzZXMgZnJvbSB0aGUgc3ludGF4IG9mIGEgZnVsbCBBUUwgcXVlcnkuCitBUUwgYWxzbyBpbmNsdWRlcyBfZ3JvdXAgYnlfIGFuZCBfbGltaXRfIGNsYXVzZXMsIGFzIHlvdSB3aWxsIHNlZSBzaG9ydGx5LgorUm91Z2hseSBzcGVha2luZywgZm9yIFNRTCBhZmZpY2lhbmRvcywgdGhlIF9mb3JfIGNsYXVzZSBpbiBBUUwgaXMgbGlrZSB0aGUgX2Zyb21fIGNsYXVzZSBpbiBTUUwsCit0aGUgX3JldHVybl8gY2xhdXNlIGluIEFRTCBpcyBsaWtlIHRoZSBfc2VsZWN0XyBjbGF1c2UgaW4gU1FMIChidXQgYXBwZWFycyBhdCB0aGUgZW5kIGluc3RlYWQgb2YKK3RoZSBiZWdpbm5pbmcgb2YgYSBxdWVyeSksIHRoZSBfbGV0XyBjbGF1c2UgaW4gQVFMIGlzIGxpa2UgU1FMJ3MgX3dpdGhfIGNsYXVzZSwgYW5kIHRoZSBfd2hlcmVfCithbmQgX29yZGVyIGJ5XyBjbGF1c2VzIGluIGJvdGggbGFuZ3VhZ2VzIGFyZSBzaW1pbGFyLgorCitFbm91Z2ggdGFsaworTGV0J3MgZ28gYWhlYWQgYW5kIHRyeSB3cml0aW5nIHNvbWUgcXVlcmllcyBhbmQgc2VlIGFib3V0IGxlYXJuaW5nIEFRTCBieSBleGFtcGxlLgorCisjIyMgUXVlcnkgMC1BIC0gRXhhY3QtTWF0Y2ggTG9va3VwICMjIworRm9yIG91ciBmaXJzdCBxdWVyeSwgbGV0J3MgZmluZCBhIEZhY2Vib29rIHVzZXIgYmFzZWQgb24gaGlzIG9yIGhlciB1c2VyIGlkLgorU3VwcG9zZSB0aGUgdXNlciB3ZSB3YW50IGlzIHRoZSB1c2VyIHdob3NlIGlkIGlzIDg6CisKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCBGYWNlYm9va1VzZXJzCisgICAgICAgIHdoZXJlICR1c2VyLmlkID0gOAorICAgICAgICByZXR1cm4gJHVzZXI7CisKK1RoZSBxdWVyeSdzIF9mb3JfIGNsYXVzZSAgYmluZHMgdGhlIHZhcmlhYmxlIGAkdXNlcmAgaW5jcmVtZW50YWxseSB0byB0aGUgZGF0YSBpbnN0YW5jZXMgcmVzaWRpbmcgaW4KK3RoZSBkYXRhc2V0IG5hbWVkIEZhY2Vib29rVXNlcnMuCitJdHMgX3doZXJlXyBjbGF1c2Ugc2VsZWN0cyBvbmx5IHRob3NlIGJpbmRpbmdzIGhhdmluZyBhIHVzZXIgaWQgb2YgaW50ZXJlc3QsIGZpbHRlcmluZyBvdXQgdGhlIHJlc3QuCitUaGUgX3JldHVybl8gY2xhdXNlIHJldHVybnMgdGhlIChlbnRpcmUpIGRhdGEgaW5zdGFuY2UgZm9yIGVhY2ggYmluZGluZyB0aGF0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlLgorU2luY2UgdGhpcyBkYXRhc2V0IGlzIGluZGV4ZWQgb24gdXNlciBpZCAoaXRzIHByaW1hcnkga2V5KSwgdGhpcyBxdWVyeSB3aWxsIGJlIGRvbmUgdmlhIGEgcXVpY2sgaW5kZXggbG9va3VwLgorCitUaGUgZXhwZWN0ZWQgcmVzdWx0IGZvciBvdXIgc2FtcGxlIGRhdGEgaXMgYXMgZm9sbG93czoKKworICAgICAgICB7ICJpZCI6IDgsICJhbGlhcyI6ICJOaWxhIiwgIm5hbWUiOiAiTmlsYU1pbGxpcm9uIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAwOC0wMS0wMVQxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMyB9fSwgImVtcGxveW1lbnQiOiBbIHsgIm9yZ2FuaXphdGlvbi1uYW1lIjogIlBsZXhsYW5lIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTAyLTI4IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKworCisjIyMgUXVlcnkgMC1CIC0gUmFuZ2UgU2NhbiAjIyMKK0FRTCwgbGlrZSBTUUwsIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgcHJlZGljYXRlcy4KK0ZvciBleGFtcGxlLCBmb3Igb3VyIG5leHQgcXVlcnksIGxldCdzIGZpbmQgdGhlIEZhY2Vib29rIHVzZXJzIHdob3NlIGlkcyBhcmUgaW4gdGhlIHJhbmdlIGJldHdlZW4gMiBhbmQgNDoKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCBGYWNlYm9va1VzZXJzCisgICAgICAgIHdoZXJlICR1c2VyLmlkID49IDIgYW5kICR1c2VyLmlkIDw9IDQKKyAgICAgICAgcmV0dXJuICR1c2VyOworCitUaGlzIHF1ZXJ5J3MgZXhwZWN0ZWQgcmVzdWx0LCBhbHNvIGV2YWx1YWJsZSB1c2luZyB0aGUgcHJpbWFyeSBpbmRleCBvbiB1c2VyIGlkLCBpczoKKworICAgICAgICB7ICJpZCI6IDIsICJhbGlhcyI6ICJJc2JlbCIsICJuYW1lIjogIklzYmVsRHVsbCIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTEtMDEtMjJUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDQgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJIZXh2aWFmaW5kIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTA0LTI3IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKyAgICAgICAgeyAiaWQiOiAzLCAiYWxpYXMiOiAiRW1vcnkiLCAibmFtZSI6ICJFbW9yeVVuayIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTItMDctMTBUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDUsIDgsIDkgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJnZW9tZWRpYSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNi0xNyIpLCAiZW5kLWRhdGUiOiBkYXRlKCIyMDEwLTAxLTI2IikgfSBdIH0KKyAgICAgICAgeyAiaWQiOiA0LCAiYWxpYXMiOiAiTmljaG9sYXMiLCAibmFtZSI6ICJOaWNob2xhc1N0cm9oIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAxMC0xMi0yN1QxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMiB9fSwgImVtcGxveW1lbnQiOiBbIHsgIm9yZ2FuaXphdGlvbi1uYW1lIjogIlphbWNvcnBvcmF0aW9uIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTA2LTA4IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKworCisjIyMgUXVlcnkgMSAtIE90aGVyIFF1ZXJ5IEZpbHRlcnMgIyMjCitBUUwgY2FuIGRvIHJhbmdlIHF1ZXJpZXMgb24gYW55IGRhdGEgdHlwZSB0aGF0IHN1cHBvcnRzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgY29tcGFyYXRvcnMuCitBcyBhbiBleGFtcGxlLCB0aGlzIG5leHQgcXVlcnkgcmV0cmlldmVzIHRoZSBGYWNlYm9vayB1c2VycyB3aG8gam9pbmVkIGJldHdlZW4gSnVseSAyMiwgMjAxMCBhbmQgSnVseSAyOSwgMjAxMjoKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCBGYWNlYm9va1VzZXJzCisgICAgICAgIHdoZXJlICR1c2VyLnVzZXItc2luY2UgPj0gZGF0ZXRpbWUoJzIwMTAtMDctMjJUMDA6MDA6MDAnKQorICAgICAgICAgIGFuZCAkdXNlci51c2VyLXNpbmNlIDw9IGRhdGV0aW1lKCcyMDEyLTA3LTI5VDIzOjU5OjU5JykKKyAgICAgICAgcmV0dXJuICR1c2VyOworCitUaGUgZXhwZWN0ZWQgcmVzdWx0IGZvciB0aGlzIHF1ZXJ5LCBhbHNvIGFuIGluZGV4YWJsZSBxdWVyeSwgaXMgYXMgZm9sbG93czoKKworICAgICAgICB7ICJpZCI6IDIsICJhbGlhcyI6ICJJc2JlbCIsICJuYW1lIjogIklzYmVsRHVsbCIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTEtMDEtMjJUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDQgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJIZXh2aWFmaW5kIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTA0LTI3IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKyAgICAgICAgeyAiaWQiOiAzLCAiYWxpYXMiOiAiRW1vcnkiLCAibmFtZSI6ICJFbW9yeVVuayIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTItMDctMTBUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDUsIDgsIDkgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJnZW9tZWRpYSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNi0xNyIpLCAiZW5kLWRhdGUiOiBkYXRlKCIyMDEwLTAxLTI2IikgfSBdIH0KKyAgICAgICAgeyAiaWQiOiA0LCAiYWxpYXMiOiAiTmljaG9sYXMiLCAibmFtZSI6ICJOaWNob2xhc1N0cm9oIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAxMC0xMi0yN1QxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMiB9fSwgImVtcGxveW1lbnQiOiBbIHsgIm9yZ2FuaXphdGlvbi1uYW1lIjogIlphbWNvcnBvcmF0aW9uIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTA2LTA4IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKyAgICAgICAgeyAiaWQiOiAxMCwgImFsaWFzIjogIkJyYW0iLCAibmFtZSI6ICJCcmFtSGF0Y2giLCAidXNlci1zaW5jZSI6IGRhdGV0aW1lKCIyMDEwLTEwLTE2VDEwOjEwOjAwLjAwMFoiKSwgImZyaWVuZC1pZHMiOiB7eyAxLCA1LCA5IH19LCAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAicGh5c2NhbmUiLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMDctMDYtMDUiKSwgImVuZC1kYXRlIjogZGF0ZSgiMjAxMS0xMS0wNSIpIH0gXSB9CisKKworIyMjIFF1ZXJ5IDItQSAtIEVxdWlqb2luICMjIworSW4gYWRkaXRpb24gdG8gc2ltcGx5IGJpbmRpbmcgdmFyaWFibGVzIHRvIGRhdGEgaW5zdGFuY2VzIGFuZCByZXR1cm5pbmcgdGhlbSAid2hvbGUiLAorYW4gQVFMIHF1ZXJ5IGNhbiBjb25zdHJ1Y3QgbmV3IEFETSBpbnN0YW5jZXMgdG8gcmV0dXJuIGJhc2VkIG9uIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFyaWFibGUgYmluZGluZ3MuCitUaGlzIGdpdmVzIEFRTCB0aGUgcG93ZXIgdG8gZG8gam9pbnMgbXVjaCBsaWtlIHRob3NlIGRvbmUgdXNpbmcgbXVsdGktdGFibGUgX2Zyb21fIGNsYXVzZXMgaW4gU1FMLgorRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2Ugd2FudGVkIGEgbGlzdCBvZiBhbGwgRmFjZWJvb2sgdXNlcnMgcGFpcmVkIHdpdGggdGhlaXIgYXNzb2NpYXRlZCBtZXNzYWdlcywKK3dpdGggdGhlIGxpc3QgZW51bWVyYXRpbmcgdGhlIGF1dGhvciBuYW1lIGFuZCB0aGUgbWVzc2FnZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZhY2Vib29rIG1lc3NhZ2UuCitXZSBjb3VsZCBkbyB0aGlzIGFzIGZvbGxvd3MgaW4gQVFMOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdXNlciBpbiBkYXRhc2V0IEZhY2Vib29rVXNlcnMKKyAgICAgICAgZm9yICRtZXNzYWdlIGluIGRhdGFzZXQgRmFjZWJvb2tNZXNzYWdlcworICAgICAgICB3aGVyZSAkbWVzc2FnZS5hdXRob3ItaWQgPSAkdXNlci5pZAorICAgICAgICByZXR1cm4geworICAgICAgICAidW5hbWUiOiAkdXNlci5uYW1lLAorICAgICAgICAibWVzc2FnZSI6ICRtZXNzYWdlLm1lc3NhZ2UKKyAgICAgICAgfTsKKworVGhlIHJlc3VsdCBvZiB0aGlzIHF1ZXJ5IGlzIGEgc2VxdWVuY2Ugb2YgbmV3IEFETSBpbnN0YW5jZXMsIG9uZSBmb3IgZWFjaCBhdXRob3IvbWVzc2FnZSBwYWlyLgorRWFjaCBpbnN0YW5jZSBpbiB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gQURNIHJlY29yZCBjb250YWluaW5nIHR3byBmaWVsZHMsICJ1bmFtZSIgYW5kICJtZXNzYWdlIiwKK2NvbnRhaW5pbmcgdGhlIHVzZXIncyBuYW1lIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LCByZXNwZWN0aXZlbHksIGZvciBlYWNoIGF1dGhvci9tZXNzYWdlIHBhaXIuCisoTm90ZSB0aGF0ICJ1bmFtZSIgYW5kICJtZXNzYWdlIiBhcmUgYm90aCBzaW1wbGUgQVFMIGV4cHJlc3Npb25zIHRoZW1zZWx2ZXMtLS1zbyBpbiB0aGUgbW9zdAorZ2VuZXJhbCBjYXNlLCBldmVuIHRoZSByZXN1bHRpbmcgZmllbGQgbmFtZXMgY2FuIGJlIGNvbXB1dGVkIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5LCBtYWtpbmcgQVFMCithIHZlcnkgcG93ZXJmdWwgdG9vbCBmb3Igc2xpY2luZyBhbmQgZGljaW5nIHNlbWlzdHJ1Y3R1cmVkIGRhdGEuKQorCitUaGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHRoaXMgZXhhbXBsZSBBUUwgam9pbiBxdWVyeSBmb3Igb3VyIHNhbXBsZSBkYXRhIHNldCBpczoKKworICAgICAgICB7ICJ1bmFtZSI6ICJNYXJnYXJpdGFTdG9kZGFyZCIsICJtZXNzYWdlIjogIiBkaXNsaWtlIGlwaG9uZSBpdHMgdG91Y2gtc2NyZWVuIGlzIGhvcnJpYmxlIiB9CisgICAgICAgIHsgInVuYW1lIjogIk1hcmdhcml0YVN0b2RkYXJkIiwgIm1lc3NhZ2UiOiAiIGNhbid0IHN0YW5kIGF0JnQgdGhlIG5ldHdvcmsgaXMgaG9ycmlibGU6KCIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJNYXJnYXJpdGFTdG9kZGFyZCIsICJtZXNzYWdlIjogIiBsaWtlIHZlcml6b24gdGhlIDNHIGlzIGF3ZXNvbWU6KSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJNYXJnYXJpdGFTdG9kZGFyZCIsICJtZXNzYWdlIjogIiBjYW4ndCBzdGFuZCBtb3Rvcm9sYSB0aGUgdG91Y2gtc2NyZWVuIGlzIHRlcnJpYmxlIiB9CisgICAgICAgIHsgInVuYW1lIjogIk1hcmdhcml0YVN0b2RkYXJkIiwgIm1lc3NhZ2UiOiAiIGNhbid0IHN0YW5kIGF0JnQgaXRzIHBsYW4gaXMgdGVycmlibGUiIH0KKyAgICAgICAgeyAidW5hbWUiOiAiSXNiZWxEdWxsIiwgIm1lc3NhZ2UiOiAiIGxpa2Ugc2Ftc3VuZyB0aGUgcGxhbiBpcyBhbWF6aW5nIiB9CisgICAgICAgIHsgInVuYW1lIjogIklzYmVsRHVsbCIsICJtZXNzYWdlIjogIiBsaWtlIHQtbW9iaWxlIGl0cyBwbGF0Zm9ybSBpcyBtaW5kLWJsb3dpbmciIH0KKyAgICAgICAgeyAidW5hbWUiOiAiRW1vcnlVbmsiLCAibWVzc2FnZSI6ICIgbG92ZSBzcHJpbnQgaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9CisgICAgICAgIHsgInVuYW1lIjogIkVtb3J5VW5rIiwgIm1lc3NhZ2UiOiAiIGxvdmUgdmVyaXpvbiBpdHMgd2lyZWxlc3MgaXMgZ29vZCIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJWb25LZW1ibGUiLCAibWVzc2FnZSI6ICIgZGlzbGlrZSBzcHJpbnQgdGhlIHNwZWVkIGlzIGhvcnJpYmxlIiB9CisgICAgICAgIHsgInVuYW1lIjogIldpbGxpc1d5bm5lIiwgIm1lc3NhZ2UiOiAiIGxvdmUgc3ByaW50IHRoZSBjdXN0b21pemF0aW9uIGlzIG1pbmQtYmxvd2luZyIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJTdXphbm5hVGlsbHNvbiIsICJtZXNzYWdlIjogIiBsaWtlIGlwaG9uZSB0aGUgdm9pY2VtYWlsLXNlcnZpY2UgaXMgYXdlc29tZSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJXb29kcm93TmVobGluZyIsICJtZXNzYWdlIjogIiBsb3ZlIGF0JnQgaXRzIDNHIGlzIGdvb2Q6KSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJCcmFtSGF0Y2giLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgdC1tb2JpbGUgaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIE9NRzooIiB9CisgICAgICAgIHsgInVuYW1lIjogIkJyYW1IYXRjaCIsICJtZXNzYWdlIjogIiBkaXNsaWtlIGlwaG9uZSB0aGUgdm9pY2UtY29tbWFuZCBpcyBiYWQ6KCIgfQorCisKKyMjIyBRdWVyeSAyLUIgLSBJbmRleCBqb2luICMjIworQnkgZGVmYXVsdCwgQXN0ZXJpeERCIGV2YWx1YXRlcyBlcXVpam9pbiBxdWVyaWVzIHVzaW5nIGhhc2gtYmFzZWQgam9pbiBtZXRob2RzIHRoYXQgd29yaword2VsbCBmb3IgZG9pbmcgYWQgaG9jIGpvaW5zIG9mIHZlcnkgbGFyZ2UgZGF0YSBzZXRzIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfam9pbikuCitPbiBhIGNsdXN0ZXIsIGhhc2ggcGFydGl0aW9uaW5nIGlzIGVtcGxveWVkIGFzIEFzdGVyaXhEQidzIGRpdmlkZS1hbmQtY29ucXVlciBzdHJhdGVneSBmb3IKK2NvbXB1dGluZyBsYXJnZSBwYXJhbGxlbCBqb2lucy4KK0FzdGVyaXhEQiBpbmNsdWRlcyBvdGhlciBqb2luIG1ldGhvZHMsIGJ1dCBpbiB0aGUgYWJzZW5jZSBvZiBkYXRhIHN0YXRpc3RpY3MgYW5kIHNlbGVjdGl2aXR5Citlc3RpbWF0ZXMsIGl0IGRvZXNuJ3QgKHlldCkgaGF2ZSB0aGUga25vdy1ob3cgdG8gaW50ZWxsaWdlbnRseSBjaG9vc2UgYW1vbmcgaXRzIGFsdGVybmF0aXZlcy4KK1dlIHRoZXJlZm9yZSBhc2tlZCBvdXJzZWx2ZXMgdGhlIGNsYXNzaWMgcXVlc3Rpb24tLS1XV09EPy0tLVdoYXQgV291bGQgT3JhY2xlIERvPy0tLWFuZCBpbiB0aGUKK2ludGVyaW0sIEFRTCBpbmNsdWRlcyBhIGNsdW5reSAoYnV0IHVzZWZ1bCkgaGludC1iYXNlZCBtZWNoYW5pc20gZm9yIGFkZHJlc3NpbmcgdGhlIG9jY2FzaW9uYWwKK25lZWQgdG8gc3VnZ2VzdCB0byBBc3Rlcml4REIgd2hpY2ggam9pbiBtZXRob2QgaXQgc2hvdWxkIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIEFRTCBxdWVyeS4KKworVGhlIGZvbGxvd2luZyBxdWVyeSBpcyBzaW1pbGFyIHRvIFF1ZXJ5IDItQSBidXQgaW5jbHVkZXMgYSBzdWdnZXN0aW9uIHRvIEFzdGVyaXhEQiB0aGF0IGl0CitzaG91bGQgY29uc2lkZXIgZW1wbG95aW5nIGFuIGluZGV4LWJhc2VkIG5lc3RlZC1sb29wIGpvaW4gdGVjaG5pcXVlIHRvIHByb2Nlc3MgdGhlIHF1ZXJ5OgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdXNlciBpbiBkYXRhc2V0IEZhY2Vib29rVXNlcnMKKyAgICAgICAgZm9yICRtZXNzYWdlIGluIGRhdGFzZXQgRmFjZWJvb2tNZXNzYWdlcworICAgICAgICB3aGVyZSAkbWVzc2FnZS5hdXRob3ItaWQgLyorIGluZGV4bmwgKi8gID0gJHVzZXIuaWQKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgInVuYW1lIjogJHVzZXIubmFtZSwKKyAgICAgICAgIm1lc3NhZ2UiOiAkbWVzc2FnZS5tZXNzYWdlCisgICAgICAgIH07CisgICAgICAgIAorCitUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzIChvZiBjb3Vyc2UpIHRoZSBzYW1lIGFzIGJlZm9yZSwgbW9kdWxvIHRoZSBvcmRlciBvZiB0aGUgaW5zdGFuY2VzLgorUmVzdWx0IG9yZGVyaW5nIGlzIChpbnRlbnRpb25hbGx5KSB1bmRlZmluZWQgaW4gQVFMIGluIHRoZSBhYnNlbmNlIG9mIGFuIF9vcmRlciBieV8gY2xhdXNlLgorVGhlIHF1ZXJ5IHJlc3VsdCBmb3Igb3VyIHNhbXBsZSBkYXRhIGluIHRoaXMgY2FzZSBpczoKKworICAgICAgICB7ICJ1bmFtZSI6ICJFbW9yeVVuayIsICJtZXNzYWdlIjogIiBsb3ZlIHNwcmludCBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiIH0KKyAgICAgICAgeyAidW5hbWUiOiAiTWFyZ2FyaXRhU3RvZGRhcmQiLCAibWVzc2FnZSI6ICIgZGlzbGlrZSBpcGhvbmUgaXRzIHRvdWNoLXNjcmVlbiBpcyBob3JyaWJsZSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJJc2JlbER1bGwiLCAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSBwbGFuIGlzIGFtYXppbmciIH0KKyAgICAgICAgeyAidW5hbWUiOiAiTWFyZ2FyaXRhU3RvZGRhcmQiLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgYXQmdCB0aGUgbmV0d29yayBpcyBob3JyaWJsZTooIiB9CisgICAgICAgIHsgInVuYW1lIjogIldpbGxpc1d5bm5lIiwgIm1lc3NhZ2UiOiAiIGxvdmUgc3ByaW50IHRoZSBjdXN0b21pemF0aW9uIGlzIG1pbmQtYmxvd2luZyIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJJc2JlbER1bGwiLCAibWVzc2FnZSI6ICIgbGlrZSB0LW1vYmlsZSBpdHMgcGxhdGZvcm0gaXMgbWluZC1ibG93aW5nIiB9CisgICAgICAgIHsgInVuYW1lIjogIlZvbktlbWJsZSIsICJtZXNzYWdlIjogIiBkaXNsaWtlIHNwcmludCB0aGUgc3BlZWQgaXMgaG9ycmlibGUiIH0KKyAgICAgICAgeyAidW5hbWUiOiAiTWFyZ2FyaXRhU3RvZGRhcmQiLCAibWVzc2FnZSI6ICIgbGlrZSB2ZXJpem9uIHRoZSAzRyBpcyBhd2Vzb21lOikiIH0KKyAgICAgICAgeyAidW5hbWUiOiAiRW1vcnlVbmsiLCAibWVzc2FnZSI6ICIgbG92ZSB2ZXJpem9uIGl0cyB3aXJlbGVzcyBpcyBnb29kIiB9CisgICAgICAgIHsgInVuYW1lIjogIk1hcmdhcml0YVN0b2RkYXJkIiwgIm1lc3NhZ2UiOiAiIGNhbid0IHN0YW5kIG1vdG9yb2xhIHRoZSB0b3VjaC1zY3JlZW4gaXMgdGVycmlibGUiIH0KKyAgICAgICAgeyAidW5hbWUiOiAiTWFyZ2FyaXRhU3RvZGRhcmQiLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgYXQmdCBpdHMgcGxhbiBpcyB0ZXJyaWJsZSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJCcmFtSGF0Y2giLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgdC1tb2JpbGUgaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIE9NRzooIiB9CisgICAgICAgIHsgInVuYW1lIjogIkJyYW1IYXRjaCIsICJtZXNzYWdlIjogIiBkaXNsaWtlIGlwaG9uZSB0aGUgdm9pY2UtY29tbWFuZCBpcyBiYWQ6KCIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJXb29kcm93TmVobGluZyIsICJtZXNzYWdlIjogIiBsb3ZlIGF0JnQgaXRzIDNHIGlzIGdvb2Q6KSIgfQorICAgICAgICB7ICJ1bmFtZSI6ICJTdXphbm5hVGlsbHNvbiIsICJtZXNzYWdlIjogIiBsaWtlIGlwaG9uZSB0aGUgdm9pY2VtYWlsLXNlcnZpY2UgaXMgYXdlc29tZSIgfQorCisKKyhJdCBpcyB3b3J0aCBrbm93aW5nLCB3aXRoIHJlc3BlY3QgdG8gaW5mbHVlbmNpbmcgQXN0ZXJpeERCJ3MgcXVlcnkgZXZhbHVhdGlvbiwgdGhhdCBuZXN0ZWQgX2Zvcl8KK2NsYXVzZXMtLS1hLmsuYS4gam9pbnMtLS0gYXJlIGN1cnJlbnRseSBldmFsdWF0ZWQgd2l0aCB0aGUgIm91dGVyIiBjbGF1c2UgcHJvYmluZyB0aGUgZGF0YSBvZiB0aGUgImlubmVyIgorY2xhdXNlLikKKworIyMjIFF1ZXJ5IDMgLSBOZXN0ZWQgT3V0ZXIgSm9pbiAjIyMKK0luIG9yZGVyIHRvIHN1cHBvcnQgam9pbnMgYmV0d2VlbiB0YWJsZXMgd2l0aCBtaXNzaW5nL2RhbmdsaW5nIGpvaW4gdHVwbGVzLCB0aGUgZGVzaWduZXJzIG9mIFNRTCBlbmRlZAordXAgc2hvZS1ob3JuaW5nIGEgc3Vic2V0IG9mIHRoZSByZWxhdGlvbmFsIGFsZ2VicmEgaW50byBTUUwncyBfZnJvbV8gY2xhdXNlIHN5bnRheC0tLWFuZCBwcm92aWRpbmcgYQordmFyaWV0eSBvZiBqb2luIHR5cGVzIHRoZXJlIGZvciB1c2VycyB0byBjaG9vc2UgZnJvbS4KK0xlZnQgb3V0ZXIgam9pbnMgYXJlIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaW4gU1FMLCBlLmcuLCB0byBwcmludCBhIHN1bW1hcnkgb2YgY3VzdG9tZXJzIGFuZCBvcmRlcnMsCitncm91cGVkIGJ5IGN1c3RvbWVyLCB3aXRob3V0IG9taXR0aW5nIHRob3NlIGN1c3RvbWVycyB3aG8gaGF2ZW4ndCBwbGFjZWQgYW55IG9yZGVycyB5ZXQuCisKK1RoZSBBUUwgbGFuZ3VhZ2Ugc3VwcG9ydHMgbmVzdGluZywgYm90aCBvZiBxdWVyaWVzIGFuZCBvZiBxdWVyeSByZXN1bHRzLCBhbmQgdGhlIGNvbWJpbmF0aW9uIGFsbG93cyBmb3IKK2FuIGFyZ3VhYmx5IGNsZWFuZXIvbW9yZSBuYXR1cmFsIGFwcHJvYWNoIHRvIHN1Y2ggcXVlcmllcy4KK0FzIGFuIGV4YW1wbGUsIHN1cHBvc2VkIHdlIHdhbnRlZCwgZm9yIGVhY2ggRmFjZWJvb2sgdXNlciwgdG8gcHJvZHVjZSBhIHJlY29yZCB0aGF0IGhhcyBoaXMvaGVyIG5hbWUKK3BsdXMgYSBsaXN0IG9mIHRoZSBtZXNzYWdlcyB3cml0dGVuIGJ5IHRoYXQgdXNlci4KK0luIFNRTCwgdGhpcyB3b3VsZCBpbnZvbHZlIGEgbGVmdCBvdXRlciBqb2luIGJldHdlZW4gdXNlcnMgYW5kIG1lc3NhZ2VzLCBncm91cGluZyBieSB1c2VyLCBhbmQgaGF2aW5nCit0aGUgdXNlciBuYW1lIHJlcGVhdGVkIGFsb25nIHNpZGUgZWFjaCBtZXNzYWdlLgorSW4gQVFMLCB0aGlzIHNvcnQgb2YgdXNlIGNhc2UgY2FuIGJlIGhhbmRsZWQgKG1vcmUgbmF0dXJhbGx5KSBhcyBmb2xsb3dzOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdXNlciBpbiBkYXRhc2V0IEZhY2Vib29rVXNlcnMKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgInVuYW1lIjogJHVzZXIubmFtZSwKKyAgICAgICAgIm1lc3NhZ2VzIjogZm9yICRtZXNzYWdlIGluIGRhdGFzZXQgRmFjZWJvb2tNZXNzYWdlcworICAgICAgICAJCXdoZXJlICRtZXNzYWdlLmF1dGhvci1pZCA9ICR1c2VyLmlkCisgICAgICAgIAkJcmV0dXJuICRtZXNzYWdlLm1lc3NhZ2UKKyAgICAgICAgfTsKKworVGhpcyBBUUwgcXVlcnkgYmluZHMgdGhlIHZhcmlhYmxlIGAkdXNlcmAgdG8gdGhlIGRhdGEgaW5zdGFuY2VzIGluIEZhY2Vib29rVXNlcnM7Citmb3IgZWFjaCB1c2VyLCBpdCBjb25zdHJ1Y3RzIGEgcmVzdWx0IHJlY29yZCBjb250YWluaW5nIGEgInVuYW1lIiBmaWVsZCB3aXRoIHRoZSB1c2VyJ3MKK25hbWUgYW5kIGEgIm1lc3NhZ2VzIiBmaWVsZCB3aXRoIGEgbmVzdGVkIGNvbGxlY3Rpb24gb2YgYWxsIG1lc3NhZ2VzIGZvciB0aGF0IHVzZXIuCitUaGUgbmVzdGVkIGNvbGxlY3Rpb24gZm9yIGVhY2ggdXNlciBpcyBzcGVjaWZpZWQgYnkgdXNpbmcgYSBjb3JyZWxhdGVkIHN1YnF1ZXJ5LgorKE5vdGU6IFdoaWxlIGl0IGxvb2tzIGxpa2UgbmVzdGVkIGxvb3BzIGNvdWxkIGJlIGludm9sdmVkIGluIGNvbXB1dGluZyB0aGUgcmVzdWx0LAorQXN0ZXJpeERCIHJlY29naXplcyB0aGUgZXF1aXZhbGVuY2Ugb2Ygc3VjaCBhIHF1ZXJ5IHRvIGFuIG91dGVyam9pbiwgYW5kIGl0IHdpbGwKK3VzZSBhbiBlZmZpY2llbnQgaGFzaC1iYXNlZCBzdHJhdGVneSB3aGVuIGFjdHVhbGx5IGNvbXB1dGluZyB0aGUgcXVlcnkncyByZXN1bHQuKQorCitIZXJlIGlzIHRoaXMgZXhhbXBsZSBxdWVyeSdzIGV4cGVjdGVkIG91dHB1dDoKKworICAgICAgICB7ICJ1bmFtZSI6ICJNYXJnYXJpdGFTdG9kZGFyZCIsICJtZXNzYWdlcyI6IFsgIiBkaXNsaWtlIGlwaG9uZSBpdHMgdG91Y2gtc2NyZWVuIGlzIGhvcnJpYmxlIiwgIiBjYW4ndCBzdGFuZCBhdCZ0IHRoZSBuZXR3b3JrIGlzIGhvcnJpYmxlOigiLCAiIGxpa2UgdmVyaXpvbiB0aGUgM0cgaXMgYXdlc29tZTopIiwgIiBjYW4ndCBzdGFuZCBtb3Rvcm9sYSB0aGUgdG91Y2gtc2NyZWVuIGlzIHRlcnJpYmxlIiwgIiBjYW4ndCBzdGFuZCBhdCZ0IGl0cyBwbGFuIGlzIHRlcnJpYmxlIiBdIH0KKyAgICAgICAgeyAidW5hbWUiOiAiSXNiZWxEdWxsIiwgIm1lc3NhZ2VzIjogWyAiIGxpa2Ugc2Ftc3VuZyB0aGUgcGxhbiBpcyBhbWF6aW5nIiwgIiBsaWtlIHQtbW9iaWxlIGl0cyBwbGF0Zm9ybSBpcyBtaW5kLWJsb3dpbmciIF0gfQorICAgICAgICB7ICJ1bmFtZSI6ICJFbW9yeVVuayIsICJtZXNzYWdlcyI6IFsgIiBsb3ZlIHNwcmludCBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiLCAiIGxvdmUgdmVyaXpvbiBpdHMgd2lyZWxlc3MgaXMgZ29vZCIgXSB9CisgICAgICAgIHsgInVuYW1lIjogIk5pY2hvbGFzU3Ryb2giLCAibWVzc2FnZXMiOiBbICBdIH0KKyAgICAgICAgeyAidW5hbWUiOiAiVm9uS2VtYmxlIiwgIm1lc3NhZ2VzIjogWyAiIGRpc2xpa2Ugc3ByaW50IHRoZSBzcGVlZCBpcyBob3JyaWJsZSIgXSB9CisgICAgICAgIHsgInVuYW1lIjogIldpbGxpc1d5bm5lIiwgIm1lc3NhZ2VzIjogWyAiIGxvdmUgc3ByaW50IHRoZSBjdXN0b21pemF0aW9uIGlzIG1pbmQtYmxvd2luZyIgXSB9CisgICAgICAgIHsgInVuYW1lIjogIlN1emFubmFUaWxsc29uIiwgIm1lc3NhZ2VzIjogWyAiIGxpa2UgaXBob25lIHRoZSB2b2ljZW1haWwtc2VydmljZSBpcyBhd2Vzb21lIiBdIH0KKyAgICAgICAgeyAidW5hbWUiOiAiTmlsYU1pbGxpcm9uIiwgIm1lc3NhZ2VzIjogWyAgXSB9CisgICAgICAgIHsgInVuYW1lIjogIldvb2Ryb3dOZWhsaW5nIiwgIm1lc3NhZ2VzIjogWyAiIGxvdmUgYXQmdCBpdHMgM0cgaXMgZ29vZDopIiBdIH0KKyAgICAgICAgeyAidW5hbWUiOiAiQnJhbUhhdGNoIiwgIm1lc3NhZ2VzIjogWyAiIGRpc2xpa2UgaXBob25lIHRoZSB2b2ljZS1jb21tYW5kIGlzIGJhZDooIiwgIiBjYW4ndCBzdGFuZCB0LW1vYmlsZSBpdHMgdm9pY2VtYWlsLXNlcnZpY2UgaXMgT01HOigiIF0gfQorCisKKyMjIyBRdWVyeSA0IC0gVGhldGEgSm9pbiAjIyMKK05vdCBhbGwgam9pbnMgYXJlIGV4cHJlc3NpYmxlIGFzIGVxdWlqb2lucyBhbmQgY29tcHV0YWJsZSB1c2luZyBlcXVpam9pbi1vcmllbnRlZCBhbGdvcml0aG1zLgorVGhlIGpvaW4gcHJlZGljYXRlcyBmb3Igc29tZSB1c2UgY2FzZXMgaW52b2x2ZSBwcmVkaWNhdGVzIHdpdGggZnVuY3Rpb25zOyBBc3Rlcml4REIgc3VwcG9ydHMgdGhlCitleHByZXNzaW9uIG9mIHN1Y2ggcXVlcmllcyBhbmQgd2lsbCBzdGlsbCBldmFsdWF0ZSB0aGVtIGFzIGJlc3QgaXQgY2FuIHVzaW5nIG5lc3RlZCBsb29wIGJhc2VkCit0ZWNobmlxdWVzIChhbmQgYnJvYWRjYXN0IGpvaW5zIGluIHRoZSBwYXJhbGxlbCBjYXNlKS4KKworQXMgYW4gZXhhbXBsZSBvZiBzdWNoIGEgdXNlIGNhc2UsIHN1cHBvc2UgdGhhdCB3ZSB3YW50ZWQsIGZvciBlYWNoIHR3ZWV0IFQsIHRvIGZpbmQgYWxsIG9mIHRoZQorb3RoZXIgdHdlZXRzIHRoYXQgb3JpZ2luYXRlZCBmcm9tIHdpdGhpbiBhIGNpcmNsZSBvZiByYWRpdXMgb2YgMSBzdXJyb3VuZGluZyB0d2VldCBUJ3MgbG9jYXRpb24uCitJbiBBUUwsIHRoaXMgY2FuIGJlIHNwZWNpZmllZCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBxdWVyeSB1c2luZyBvbmUgb2YgdGhlIGJ1aWx0LWluCitmdW5jdGlvbnMgb24gdGhlIHNwYXRpYWwgZGF0YSB0eXBlIGluc3RlYWQgb2YgaWQgZXF1YWxpdHkgaW4gdGhlIGNvcnJlbGF0ZWQgcXVlcnkncyBfd2hlcmVfIGNsYXVzZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHQgaW4gZGF0YXNldCBUd2VldE1lc3NhZ2VzCisgICAgICAgIHJldHVybiB7CisgICAgICAgICJtZXNzYWdlIjogJHQubWVzc2FnZS10ZXh0LAorICAgICAgICAibmVhcmJ5LW1lc3NhZ2VzIjogZm9yICR0MiBpbiBkYXRhc2V0IFR3ZWV0TWVzc2FnZXMKKyAgICAgICAgCQkJd2hlcmUgc3BhdGlhbC1kaXN0YW5jZSgkdC5zZW5kZXItbG9jYXRpb24sICR0Mi5zZW5kZXItbG9jYXRpb24pIDw9IDEKKyAgICAgICAgCQkJcmV0dXJuIHsgIm1zZ3R4dCI6JHQyLm1lc3NhZ2UtdGV4dH0KKyAgICAgICAgfTsKKworSGVyZSBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0IGZvciB0aGlzIHF1ZXJ5OgorCisgICAgICAgIHsgIm1lc3NhZ2UiOiAiIGxvdmUgdC1tb2JpbGUgaXRzIGN1c3RvbWl6YXRpb24gaXMgZ29vZDopIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsb3ZlIHQtbW9iaWxlIGl0cyBjdXN0b21pemF0aW9uIGlzIGdvb2Q6KSIgfSBdIH0KKyAgICAgICAgeyAibWVzc2FnZSI6ICIgaGF0ZSB2ZXJpem9uIGl0cyB2b2ljZS1jbGFyaXR5IGlzIE9NRzooIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikiIH0sIHsgIm1zZ3R4dCI6ICIgaGF0ZSB2ZXJpem9uIGl0cyB2b2ljZS1jbGFyaXR5IGlzIE9NRzooIiB9IF0gfQorICAgICAgICB7ICJtZXNzYWdlIjogIiBjYW4ndCBzdGFuZCBpcGhvbmUgaXRzIHBsYXRmb3JtIGlzIHRlcnJpYmxlIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBjYW4ndCBzdGFuZCBpcGhvbmUgaXRzIHBsYXRmb3JtIGlzIHRlcnJpYmxlIiB9IF0gfQorICAgICAgICB7ICJtZXNzYWdlIjogIiBsaWtlIHNhbXN1bmcgdGhlIHZvaWNlLWNvbW1hbmQgaXMgYW1hemluZzopIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIHNhbXN1bmcgdGhlIHZvaWNlLWNvbW1hbmQgaXMgYW1hemluZzopIiB9IF0gfQorICAgICAgICB7ICJtZXNzYWdlIjogIiBsaWtlIHZlcml6b24gaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIHZlcml6b24gaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9IF0gfQorICAgICAgICB7ICJtZXNzYWdlIjogIiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikiLCAibmVhcmJ5LW1lc3NhZ2VzIjogWyB7ICJtc2d0eHQiOiAiIGhhdGUgdmVyaXpvbiBpdHMgdm9pY2UtY2xhcml0eSBpcyBPTUc6KCIgfSwgeyAibXNndHh0IjogIiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikiIH0gXSB9CisgICAgICAgIHsgIm1lc3NhZ2UiOiAiIGxpa2Ugc3ByaW50IHRoZSB2b2ljZS1jb21tYW5kIGlzIG1pbmQtYmxvd2luZzopIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIHNwcmludCB0aGUgdm9pY2UtY29tbWFuZCBpcyBtaW5kLWJsb3dpbmc6KSIgfSBdIH0KKyAgICAgICAgeyAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgbW90b3JvbGEgaXRzIHNwZWVkIGlzIHRlcnJpYmxlOigiLCAibmVhcmJ5LW1lc3NhZ2VzIjogWyB7ICJtc2d0eHQiOiAiIGNhbid0IHN0YW5kIG1vdG9yb2xhIGl0cyBzcGVlZCBpcyB0ZXJyaWJsZTooIiB9IF0gfQorICAgICAgICB7ICJtZXNzYWdlIjogIiBsaWtlIGlwaG9uZSB0aGUgdm9pY2UtY2xhcml0eSBpcyBnb29kOikiLCAibmVhcmJ5LW1lc3NhZ2VzIjogWyB7ICJtc2d0eHQiOiAiIGxpa2UgaXBob25lIHRoZSB2b2ljZS1jbGFyaXR5IGlzIGdvb2Q6KSIgfSBdIH0KKyAgICAgICAgeyAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSBwbGF0Zm9ybSBpcyBnb29kIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIHNhbXN1bmcgdGhlIHBsYXRmb3JtIGlzIGdvb2QiIH0gXSB9CisgICAgICAgIHsgIm1lc3NhZ2UiOiAiIGxpa2UgdC1tb2JpbGUgdGhlIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsaWtlIHQtbW9iaWxlIHRoZSBzaG9ydGN1dC1tZW51IGlzIGF3ZXNvbWU6KSIgfSBdIH0KKyAgICAgICAgeyAibWVzc2FnZSI6ICIgbG92ZSB2ZXJpem9uIGl0cyB2b2ljZW1haWwtc2VydmljZSBpcyBhd2Vzb21lIiwgIm5lYXJieS1tZXNzYWdlcyI6IFsgeyAibXNndHh0IjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0gXSB9CisKKworIyMjIFF1ZXJ5IDUgLSBGdXp6eSBKb2luICMjIworQXMgYW5vdGhlciBleGFtcGxlIG9mIGEgbm9uLWVxdWlqb2luIHVzZSBjYXNlLCB3ZSBjb3VsZCBhc2sgQXN0ZXJpeERCIHRvIGZpbmQsIGZvciBlYWNoIEZhY2Vib29rIHVzZXIsCithbGwgVHdpdHRlciB1c2VycyB3aXRoIG5hbWVzICJzaW1pbGFyIiB0byB0aGVpciBuYW1lLgorQXN0ZXJpeERCIHN1cHBvcnRzIGEgdmFyaWV0eSBvZiAiZnV6enkgbWF0Y2giIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGggdGV4dHVhbCBhbmQgc2V0LWJhc2VkIGRhdGEuCitBcyBvbmUgZXhhbXBsZSwgd2UgY291bGQgY2hvb3NlIHRvIHVzZSBlZGl0IGRpc3RhbmNlIHdpdGggYSB0aHJlc2hvbGQgb2YgMyBhcyB0aGUgZGVmaW5pdGlvbiBvZiBuYW1lCitzaW1pbGFyaXR5LCBpbiB3aGljaCBjYXNlIHdlIGNvdWxkIHdyaXRlIHRoZSBmb2xsb3dpbmcgcXVlcnkgdXNpbmcgQVFMJ3Mgb3BlcmF0b3ItYmFzZWQgc3ludGF4ICh+PSkKK2ZvciB0ZXN0aW5nIHdoZXRoZXIgb3Igbm90IHR3byB2YWx1ZXMgYXJlIHNpbWlsYXI6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgc2V0IHNpbWZ1bmN0aW9uICJlZGl0LWRpc3RhbmNlIjsKKyAgICAgICAgc2V0IHNpbXRocmVzaG9sZCAiMyI7CisgICAgICAgIAorICAgICAgICBmb3IgJGZidSBpbiBkYXRhc2V0IEZhY2Vib29rVXNlcnMKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICJpZCI6ICRmYnUuaWQsCisgICAgICAgICAgICAibmFtZSI6ICRmYnUubmFtZSwKKyAgICAgICAgICAgICJzaW1pbGFyLXVzZXJzIjogZm9yICR0IGluIGRhdGFzZXQgVHdlZXRNZXNzYWdlcworICAgICAgICAJCQlsZXQgJHR1IDo9ICR0LnVzZXIKKyAgICAgICAgCQkJd2hlcmUgJHR1Lm5hbWUgfj0gJGZidS5uYW1lCisgICAgICAgIAkJCXJldHVybiB7CisgICAgICAgIAkJCSJ0d2l0dGVyLXNjcmVlbm5hbWUiOiAkdHUuc2NyZWVuLW5hbWUsCisgICAgICAgIAkJCSJ0d2l0dGVyLW5hbWUiOiAkdHUubmFtZQorICAgICAgICAJCQl9CisgICAgICAgIH07CisKK1RoZSBleHBlY3RlZCByZXN1bHQgZm9yIHRoaXMgcXVlcnkgYWdhaW5zdCBvdXIgc2FtcGxlIGRhdGEgaXM6CisKKyAgICAgICAgeyAiaWQiOiAxLCAibmFtZSI6ICJNYXJnYXJpdGFTdG9kZGFyZCIsICJzaW1pbGFyLXVzZXJzIjogWyAgXSB9CisgICAgICAgIHsgImlkIjogMiwgIm5hbWUiOiAiSXNiZWxEdWxsIiwgInNpbWlsYXItdXNlcnMiOiBbICBdIH0KKyAgICAgICAgeyAiaWQiOiAzLCAibmFtZSI6ICJFbW9yeVVuayIsICJzaW1pbGFyLXVzZXJzIjogWyAgXSB9CisgICAgICAgIHsgImlkIjogNCwgIm5hbWUiOiAiTmljaG9sYXNTdHJvaCIsICJzaW1pbGFyLXVzZXJzIjogWyAgXSB9CisgICAgICAgIHsgImlkIjogNSwgIm5hbWUiOiAiVm9uS2VtYmxlIiwgInNpbWlsYXItdXNlcnMiOiBbICBdIH0KKyAgICAgICAgeyAiaWQiOiA2LCAibmFtZSI6ICJXaWxsaXNXeW5uZSIsICJzaW1pbGFyLXVzZXJzIjogWyAgXSB9CisgICAgICAgIHsgImlkIjogNywgIm5hbWUiOiAiU3V6YW5uYVRpbGxzb24iLCAic2ltaWxhci11c2VycyI6IFsgIF0gfQorICAgICAgICB7ICJpZCI6IDgsICJuYW1lIjogIk5pbGFNaWxsaXJvbiIsICJzaW1pbGFyLXVzZXJzIjogWyB7ICJ0d2l0dGVyLXNjcmVlbm5hbWUiOiAiTmlsYU1pbGxpcm9uX3R3IiwgInR3aXR0ZXItbmFtZSI6ICJOaWxhIE1pbGxpcm9uIiB9IF0gfQorICAgICAgICB7ICJpZCI6IDksICJuYW1lIjogIldvb2Ryb3dOZWhsaW5nIiwgInNpbWlsYXItdXNlcnMiOiBbICBdIH0KKyAgICAgICAgeyAiaWQiOiAxMCwgIm5hbWUiOiAiQnJhbUhhdGNoIiwgInNpbWlsYXItdXNlcnMiOiBbICBdIH0KKworCisjIyMgUXVlcnkgNiAtIEV4aXN0ZW50aWFsIFF1YW50aWZpY2F0aW9uICMjIworVGhlIGV4cHJlc3NpdmUgcG93ZXIgb2YgQVFMIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHF1ZXJpZXMgaW52b2x2aW5nICJzb21lIiAoZXhpc3RlbnRpYWxseSBxdWFudGlmaWVkKQorYW5kICJhbGwiICh1bml2ZXJzYWxseSBxdWFudGlmaWVkKSBxdWVyeSBzZW1hbnRpY3MuCitBcyBhbiBleGFtcGxlIG9mIGFuIGV4aXN0ZW50aWFsIEFRTCBxdWVyeSwgaGVyZSB3ZSBzaG93IGEgcXVlcnkgdG8gbGlzdCB0aGUgRmFjZWJvb2sgdXNlcnMgd2hvIGFyZSBjdXJyZW50bHkgZW1wbG95ZWQuCitTdWNoIGVtcGxveWVlcyB3aWxsIGhhdmUgYW4gZW1wbG95bWVudCBoaXN0b3J5IGNvbnRhaW5pbmcgYSByZWNvcmQgd2l0aCBhIG51bGwgZW5kLWRhdGUgdmFsdWUsIHdoaWNoIGxlYWRzIHVzIHRvIHRoZQorZm9sbG93aW5nIEFRTCBxdWVyeToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGZidSBpbiBkYXRhc2V0IEZhY2Vib29rVXNlcnMKKyAgICAgICAgd2hlcmUgKHNvbWUgJGUgaW4gJGZidS5lbXBsb3ltZW50IHNhdGlzZmllcyBpcy1udWxsKCRlLmVuZC1kYXRlKSkKKyAgICAgICAgcmV0dXJuICRmYnU7CisKK1RoZSBleHBlY3RlZCByZXN1bHQgaW4gdGhpcyBjYXNlIGlzOgorCisgICAgICAgIHsgImlkIjogMSwgImFsaWFzIjogIk1hcmdhcml0YSIsICJuYW1lIjogIk1hcmdhcml0YVN0b2RkYXJkIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAxMi0wOC0yMFQxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMiwgMywgNiwgMTAgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJDb2RldGVjaG5vIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDA2LTA4LTA2IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKyAgICAgICAgeyAiaWQiOiAyLCAiYWxpYXMiOiAiSXNiZWwiLCAibmFtZSI6ICJJc2JlbER1bGwiLCAidXNlci1zaW5jZSI6IGRhdGV0aW1lKCIyMDExLTAxLTIyVDEwOjEwOjAwLjAwMFoiKSwgImZyaWVuZC1pZHMiOiB7eyAxLCA0IH19LCAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAiSGV4dmlhZmluZCIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNC0yNyIpLCAiZW5kLWRhdGUiOiBudWxsIH0gXSB9CisgICAgICAgIHsgImlkIjogNCwgImFsaWFzIjogIk5pY2hvbGFzIiwgIm5hbWUiOiAiTmljaG9sYXNTdHJvaCIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTAtMTItMjdUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDIgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJaYW1jb3Jwb3JhdGlvbiIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNi0wOCIpLCAiZW5kLWRhdGUiOiBudWxsIH0gXSB9CisgICAgICAgIHsgImlkIjogNSwgImFsaWFzIjogIlZvbiIsICJuYW1lIjogIlZvbktlbWJsZSIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTAtMDEtMDVUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDMsIDYsIDEwIH19LCAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAiS29uZ3JlZW4iLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMTAtMTEtMjciKSwgImVuZC1kYXRlIjogbnVsbCB9IF0gfQorICAgICAgICB7ICJpZCI6IDYsICJhbGlhcyI6ICJXaWxsaXMiLCAibmFtZSI6ICJXaWxsaXNXeW5uZSIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMDUtMDEtMTdUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDMsIDcgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJqYXlkYXgiLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMDktMDUtMTUiKSwgImVuZC1kYXRlIjogbnVsbCB9IF0gfQorICAgICAgICB7ICJpZCI6IDcsICJhbGlhcyI6ICJTdXphbm5hIiwgIm5hbWUiOiAiU3V6YW5uYVRpbGxzb24iLCAidXNlci1zaW5jZSI6IGRhdGV0aW1lKCIyMDEyLTA4LTA3VDEwOjEwOjAwLjAwMFoiKSwgImZyaWVuZC1pZHMiOiB7eyA2IH19LCAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAiTGFiemF0cm9uIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDExLTA0LTE5IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdIH0KKyAgICAgICAgeyAiaWQiOiA4LCAiYWxpYXMiOiAiTmlsYSIsICJuYW1lIjogIk5pbGFNaWxsaXJvbiIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMDgtMDEtMDFUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDMgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJQbGV4bGFuZSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wMi0yOCIpLCAiZW5kLWRhdGUiOiBudWxsIH0gXSB9CisKKworIyMjIFF1ZXJ5IDcgLSBVbml2ZXJzYWwgUXVhbnRpZmljYXRpb24gIyMjCitBcyBhbiBleGFtcGxlIG9mIGEgdW5pdmVyc2FsIEFRTCBxdWVyeSwgaGVyZSB3ZSBzaG93IGEgcXVlcnkgdG8gbGlzdCB0aGUgRmFjZWJvb2sgdXNlcnMgd2hvIGFyZSBjdXJyZW50bHkgdW5lbXBsb3llZC4KK1N1Y2ggZW1wbG95ZWVzIHdpbGwgaGF2ZSBhbiBlbXBsb3ltZW50IGhpc3RvcnkgY29udGFpbmluZyBubyByZWNvcmRzIHdpdGggbnVsbCBlbmQtZGF0ZSB2YWx1ZXMsIGxlYWRpbmcgdXMgdG8gdGhlCitmb2xsb3dpbmcgQVFMIHF1ZXJ5OgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkZmJ1IGluIGRhdGFzZXQgRmFjZWJvb2tVc2VycworICAgICAgICB3aGVyZSAoZXZlcnkgJGUgaW4gJGZidS5lbXBsb3ltZW50IHNhdGlzZmllcyBub3QoaXMtbnVsbCgkZS5lbmQtZGF0ZSkpKQorICAgICAgICByZXR1cm4gJGZidTsKKworSGVyZSBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0IGZvciBvdXIgc2FtcGxlIGRhdGE6CisKKyAgICAgICAgeyAiaWQiOiAzLCAiYWxpYXMiOiAiRW1vcnkiLCAibmFtZSI6ICJFbW9yeVVuayIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTItMDctMTBUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDUsIDgsIDkgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJnZW9tZWRpYSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNi0xNyIpLCAiZW5kLWRhdGUiOiBkYXRlKCIyMDEwLTAxLTI2IikgfSBdIH0KKyAgICAgICAgeyAiaWQiOiA5LCAiYWxpYXMiOiAiV29vZHJvdyIsICJuYW1lIjogIldvb2Ryb3dOZWhsaW5nIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAwNS0wOS0yMFQxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMywgMTAgfX0sICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJadW5jYW4iLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMDMtMDQtMjIiKSwgImVuZC1kYXRlIjogZGF0ZSgiMjAwOS0xMi0xMyIpIH0gXSB9CisgICAgICAgIHsgImlkIjogMTAsICJhbGlhcyI6ICJCcmFtIiwgIm5hbWUiOiAiQnJhbUhhdGNoIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAxMC0xMC0xNlQxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMSwgNSwgOSB9fSwgImVtcGxveW1lbnQiOiBbIHsgIm9yZ2FuaXphdGlvbi1uYW1lIjogInBoeXNjYW5lIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDA3LTA2LTA1IiksICJlbmQtZGF0ZSI6IGRhdGUoIjIwMTEtMTEtMDUiKSB9IF0gfQorCisKKyMjIyBRdWVyeSA4IC0gU2ltcGxlIEFnZ3JlZ2F0aW9uICMjIworTGlrZSBTUUwsIHRoZSBBUUwgbGFuZ3VhZ2Ugb2YgQXN0ZXJpeERCIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNvbXB1dGluZyBhZ2dyZWdhdGVzIG92ZXIgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLgorQXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlLCB0aGUgZm9sbG93aW5nIEFRTCBxdWVyeSBjb21wdXRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIEZhY2Vib29rIHVzZXJzOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGNvdW50KGZvciAkZmJ1IGluIGRhdGFzZXQgRmFjZWJvb2tVc2VycyByZXR1cm4gJGZidSk7CisKK0luIEFRTCwgYWdncmVnYXRlIGZ1bmN0aW9ucyBjYW4gYmUgYXBwbGllZCB0byBhcmJpdHJhcnkgc3VicXVlcnkgcmVzdWx0czsgaW4gdGhpcyBjYXNlLCB0aGUgY291bnQgZnVuY3Rpb24KK2lzIGFwcGxpZWQgdG8gdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5IHRoYXQgZW51bWVyYXRlcyB0aGUgRmFjZWJvb2sgdXNlcnMuICBUaGUgZXhwZWN0ZWQgcmVzdWx0IGhlcmUgaXM6CisKKyAgICAgICAgMTAKKworCisKKyMjIyBRdWVyeSA5LUEgLSBHcm91cGluZyBhbmQgQWdncmVnYXRpb24gIyMjCitBbHNvIGxpa2UgU1FMLCBBUUwgc3VwcG9ydHMgZ3JvdXBlZCBhZ2dyZWdhdGlvbi4KK0ZvciBldmVyeSBUd2l0dGVyIHVzZXIsIHRoZSBmb2xsb3dpbmcgZ3JvdXAtYnkvYWdncmVnYXRlIHF1ZXJ5IGNvdW50cyB0aGUgbnVtYmVyIG9mIHR3ZWV0cyBzZW50IGJ5IHRoYXQgdXNlcjoKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHQgaW4gZGF0YXNldCBUd2VldE1lc3NhZ2VzCisgICAgICAgIGdyb3VwIGJ5ICR1aWQgOj0gJHQudXNlci5zY3JlZW4tbmFtZSB3aXRoICR0CisgICAgICAgIHJldHVybiB7CisgICAgICAgICJ1c2VyIjogJHVpZCwKKyAgICAgICAgImNvdW50IjogY291bnQoJHQpCisgICAgICAgIH07CisKK1RoZSBfZm9yXyBjbGF1c2UgaW5jcmVtZW50YWxseSBiaW5kcyAkdCB0byB0d2VldHMsIGFuZCB0aGUgX2dyb3VwIGJ5XyBjbGF1c2UgZ3JvdXBzIHRoZSB0d2VldHMgYnkgaXRzCitpc3N1ZXIncyBUd2l0dGVyIHNjcmVlbi1uYW1lLgorVW5saWtlIFNRTCwgd2hlcmUgZGF0YSBpcyB0YWJ1bGFyLS0tZmxhdC0tLXRoZSBkYXRhIG1vZGVsIHVuZGVybHlpbmcgQVFMIGFsbG93cyBmb3IgbmVzdGluZy4KK1RodXMsIGZvbGxvd2luZyB0aGUgX2dyb3VwIGJ5XyBjbGF1c2UsIHRoZSBfcmV0dXJuXyBjbGF1c2UgaW4gdGhpcyBxdWVyeSBzZWVzIGEgc2VxdWVuY2Ugb2YgJHQgZ3JvdXBzLAord2l0aCBlYWNoIHN1Y2ggZ3JvdXAgaGF2aW5nIGFuIGFzc29jaWF0ZWQgJHVpZCB2YXJpYWJsZSB2YWx1ZSAoaS5lLiwgdGhlIHR3ZWV0aW5nIHVzZXIncyBzY3JlZW4gbmFtZSkuCitJbiB0aGUgY29udGV4dCBvZiB0aGUgcmV0dXJuIGNsYXVzZSwgZHVlIHRvICIuLi4gd2l0aCAkdCAuLi4iLCAkdWlkIGlzIGJvdW5kIHRvIHRoZSB0d2VldGVyJ3MgaWQgYW5kICR0CitpcyBib3VuZCB0byB0aGUgX3NldF8gb2YgdHdlZXRzIGlzc3VlZCBieSB0aGF0IHR3ZWV0ZXIuCitUaGUgcmV0dXJuIGNsYXVzZSBjb25zdHJ1Y3RzIGEgcmVzdWx0IHJlY29yZCBjb250YWluaW5nIHRoZSB0d2VldGVyJ3MgdXNlciBpZCBhbmQgdGhlIGNvdW50IG9mIHRoZSBpdGVtcworaW4gdGhlIGFzc29jaWF0ZWQgdHdlZXQgc2V0LgorVGhlIHF1ZXJ5IHJlc3VsdCB3aWxsIGNvbnRhaW4gb25lIHN1Y2ggcmVjb3JkIHBlciBzY3JlZW4gbmFtZS4KK1RoaXMgcXVlcnkgYWxzbyBpbGx1c3RyYXRlcyBhbm90aGVyIGZlYXR1cmUgb2YgQVFMOyBub3RpY2UgdGhhdCBlYWNoIHVzZXIncyBzY3JlZW4gbmFtZSBpcyBhY2Nlc3NlZCB2aWEgYQorcGF0aCBzeW50YXggdGhhdCB0cmF2ZXJzZXMgZWFjaCB0d2VldCdzIG5lc3RlZCByZWNvcmQgc3RydWN0dXJlLgorCitIZXJlIGlzIHRoZSBleHBlY3RlZCByZXN1bHQgZm9yIHRoaXMgcXVlcnkgb3ZlciB0aGUgc2FtcGxlIGRhdGE6CisKKyAgICAgICAgeyAidXNlciI6ICJDaGFuZ0V3aW5nXzU3MyIsICJjb3VudCI6IDEgfQorICAgICAgICB7ICJ1c2VyIjogIkNvbGluZUdleWVyQDYzIiwgImNvdW50IjogMyB9CisgICAgICAgIHsgInVzZXIiOiAiTmF0aGFuR2llc2VuQDIxMSIsICJjb3VudCI6IDYgfQorICAgICAgICB7ICJ1c2VyIjogIk5pbGFNaWxsaXJvbl90dyIsICJjb3VudCI6IDEgfQorICAgICAgICB7ICJ1c2VyIjogIk9saUphY2tzb25fNTEyIiwgImNvdW50IjogMSB9CisKKworCisjIyMgUXVlcnkgOS1CIC0gKEhhc2gtQmFzZWQpIEdyb3VwaW5nIGFuZCBBZ2dyZWdhdGlvbiAjIyMKK0FzIGZvciBqb2lucywgQXN0ZXJpeERCIGhhcyBtdWx0aXBsZSBldmFsdWF0aW9uIHN0cmF0ZWdpZXMgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nIGdyb3VwZWQgYWdncmVnYXRlIHF1ZXJpZXMuCitGb3IgZ3JvdXBlZCBhZ2dyZWdhdGlvbiwgdGhlIHN5c3RlbSBrbm93cyBob3cgdG8gZW1wbG95IGJvdGggc29ydC1iYXNlZCBhbmQgaGFzaC1iYXNlZCBhZ2dyZWdhdGlvbiBtZXRob2RzLAord2l0aCBzb3J0LWJhc2VkIG1ldGhvZHMgYmVpbmcgdXNlZCBieSBkZWZhdWx0IGFuZCBhIGhpbnQgYmVpbmcgYXZhaWxhYmxlIHRvIHN1Z2dlc3QgdGhhdCBhIGRpZmZlcmVudCBhcHByb2FjaAorYmUgdXNlZCBpbiBwcm9jZXNzaW5nIGEgcGFydGljdWxhciBBUUwgcXVlcnkuCisKK1RoZSBmb2xsb3dpbmcgcXVlcnkgaXMgc2ltaWxhciB0byBRdWVyeSA5LUEsIGJ1dCBhZGRzIGEgaGFzaC1iYXNlZCBhZ2dyZWdhdGlvbiBoaW50OgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdCBpbiBkYXRhc2V0IFR3ZWV0TWVzc2FnZXMKKyAgICAgICAgLyorIGhhc2gqLworICAgICAgICBncm91cCBieSAkdWlkIDo9ICR0LnVzZXIuc2NyZWVuLW5hbWUgd2l0aCAkdAorICAgICAgICByZXR1cm4geworICAgICAgICAidXNlciI6ICR1aWQsCisgICAgICAgICJjb3VudCI6IGNvdW50KCR0KQorICAgICAgICB9OworCitIZXJlIGlzIHRoZSBleHBlY3RlZCByZXN1bHQ6CisKKyAgICAgICAgeyAidXNlciI6ICJPbGlKYWNrc29uXzUxMiIsICJjb3VudCI6IDEgfQorICAgICAgICB7ICJ1c2VyIjogIkNvbGluZUdleWVyQDYzIiwgImNvdW50IjogMyB9CisgICAgICAgIHsgInVzZXIiOiAiTmF0aGFuR2llc2VuQDIxMSIsICJjb3VudCI6IDYgfQorICAgICAgICB7ICJ1c2VyIjogIk5pbGFNaWxsaXJvbl90dyIsICJjb3VudCI6IDEgfQorICAgICAgICB7ICJ1c2VyIjogIkNoYW5nRXdpbmdfNTczIiwgImNvdW50IjogMSB9CisKKworCisjIyMgUXVlcnkgMTAgLSBHcm91cGluZyBhbmQgTGltaXRzICMjIworSW4gc29tZSB1c2UgY2FzZXMgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wdXRlIHRoZSBlbnRpcmUgYW5zd2VyIHRvIGEgcXVlcnkuCitJbiBzb21lIGNhc2VzLCBqdXN0IGhhdmluZyB0aGUgZmlyc3QgX05fIG9yIHRvcCBfTl8gcmVzdWx0cyBpcyBzdWZmaWNpZW50LgorVGhpcyBpcyBleHByZXNzaWJsZSBpbiBBUUwgdXNpbmcgdGhlIF9saW1pdF8gY2xhdXNlIGNvbWJpbmVkIHdpdGggdGhlIF9vcmRlciBieV8gY2xhdXNlLgorCitUaGUgZm9sbG93aW5nIEFRTCAgcXVlcnkgcmV0dXJucyB0aGUgdG9wIDMgVHdpdHRlciB1c2VycyBiYXNlZCBvbiB3aG8gaGFzIGlzc3VlZCB0aGUgbW9zdCB0d2VldHM6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQgVHdlZXRNZXNzYWdlcworICAgICAgICBncm91cCBieSAkdWlkIDo9ICR0LnVzZXIuc2NyZWVuLW5hbWUgd2l0aCAkdAorICAgICAgICBsZXQgJGMgOj0gY291bnQoJHQpCisgICAgICAgIG9yZGVyIGJ5ICRjIGRlc2MKKyAgICAgICAgbGltaXQgMworICAgICAgICByZXR1cm4geworICAgICAgICAJInVzZXIiOiAkdWlkLAorICAgICAgICAJImNvdW50IjogJGMKKyAgICAgICAgfTsKKworVGhlIGV4cGVjdGVkIHJlc3VsdCBmb3IgdGhpcyBxdWVyeSBpczoKKworICAgICAgICB7ICJ1c2VyIjogIk5hdGhhbkdpZXNlbkAyMTEiLCAiY291bnQiOiA2IH0KKyAgICAgICAgeyAidXNlciI6ICJDb2xpbmVHZXllckA2MyIsICJjb3VudCI6IDMgfQorICAgICAgICB7ICJ1c2VyIjogIk5pbGFNaWxsaXJvbl90dyIsICJjb3VudCI6IDEgfQorCisKKyMjIyBRdWVyeSAxMSAtIExlZnQgT3V0ZXIgRnV6enkgSm9pbiAjIyMKK0FzIGEgbGFzdCBleGFtcGxlIG9mIEFRTCBhbmQgaXRzIHF1ZXJ5IHBvd2VyLCB0aGUgZm9sbG93aW5nIHF1ZXJ5LCBmb3IgZWFjaCB0d2VldCwKK2ZpbmRzIGFsbCBvZiB0aGUgdHdlZXRzIHRoYXQgYXJlIHNpbWlsYXIgYmFzZWQgb24gdGhlIHRvcGljcyB0aGF0IHRoZXkgcmVmZXIgdG86CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgc2V0IHNpbWZ1bmN0aW9uICJqYWNjYXJkIjsKKyAgICAgICAgc2V0IHNpbXRocmVzaG9sZCAiMC4zIjsKKyAgICAgICAgCisgICAgICAgIGZvciAkdCBpbiBkYXRhc2V0IFR3ZWV0TWVzc2FnZXMKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICJ0d2VldCI6ICR0LAorICAgICAgICAgICAgInNpbWlsYXItdHdlZXRzIjogZm9yICR0MiBpbiBkYXRhc2V0IFR3ZWV0TWVzc2FnZXMKKyAgICAgICAgCQkJd2hlcmUgICR0Mi5yZWZlcnJlZC10b3BpY3Mgfj0gJHQucmVmZXJyZWQtdG9waWNzCisgICAgICAgIAkJCWFuZCAkdDIudHdlZXRpZCAhPSAkdC50d2VldGlkCisgICAgICAgIAkJCXJldHVybiAkdDIucmVmZXJyZWQtdG9waWNzCisgICAgICAgIH07CisKK1RoaXMgcXVlcnkgaWxsdXN0cmF0ZXMgc2V2ZXJhbCB0aGluZ3Mgd29ydGgga25vd2luZyBpbiBvcmRlciB0byB3cml0ZSBmdXp6eSBxdWVyaWVzIGluIEFRTC4KK0ZpcnN0LCBhcyBtZW50aW9uZWQgZWFybGllciwgQVFMIG9mZmVycyBhbiBvcGVyYXRvci1iYXNlZCBzeW50YXggZm9yIHNlZWluZyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlICJzaW1pbGFyIiB0byBvbmUgYW5vdGhlciBvciBub3QuCitTZWNvbmQsIHJlY2FsbCB0aGF0IHRoZSByZWZlcnJlZC10b3BpY3MgZmllbGQgb2YgcmVjb3JkcyBvZiBkYXRhdHlwZSBUd2VldE1lc3NhZ2VUeXBlIGlzIGEgYmFnIG9mIHN0cmluZ3MuCitUaGlzIHF1ZXJ5IHNldHMgdGhlIGNvbnRleHQgZm9yIGl0cyBzaW1pbGFyaXR5IGpvaW4gYnkgcmVxdWVzdGluZyB0aGF0IEphY2NhcmQtYmFzZWQgc2ltaWxhcml0eSBzZW1hbnRpY3MKKyhodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phY2NhcmRfaW5kZXgpIGJlIHVzZWQgZm9yIHRoZSBxdWVyeSdzIHNpbWlsYXJpdHkgb3BlcmF0b3IgYW5kIHRoYXQgYSBzaW1pbGFyaXR5CitpbmRleCBvZiAwLjMgYmUgdXNlZCBhcyBpdHMgc2ltaWxhcml0eSB0aHJlc2hvbGQuCisKK1RoZSBleHBlY3RlZCByZXN1bHQgZm9yIHRoaXMgZnV6enkgam9pbiBxdWVyeSBpczoKKworICAgICAgICB7ICJ0d2VldCI6IHsgInR3ZWV0aWQiOiAiMSIsICJ1c2VyIjogeyAic2NyZWVuLW5hbWUiOiAiTmF0aGFuR2llc2VuQDIxMSIsICJsYW5nIjogImVuIiwgImZyaWVuZHNfY291bnQiOiAzOTMzOSwgInN0YXR1c2VzX2NvdW50IjogNDczLCAibmFtZSI6ICJOYXRoYW4gR2llc2VuIiwgImZvbGxvd2Vyc19jb3VudCI6IDQ5NDE2IH0sICJzZW5kZXItbG9jYXRpb24iOiBwb2ludCgiNDcuNDQsODAuNjUiKSwgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDA4LTA0LTI2VDEwOjEwOjAwLjAwMFoiKSwgInJlZmVycmVkLXRvcGljcyI6IHt7ICJ0LW1vYmlsZSIsICJjdXN0b21pemF0aW9uIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbG92ZSB0LW1vYmlsZSBpdHMgY3VzdG9taXphdGlvbiBpcyBnb29kOikiIH0sICJzaW1pbGFyLXR3ZWV0cyI6IFsge3sgInQtbW9iaWxlIiwgInNob3J0Y3V0LW1lbnUiIH19IF0gfQorICAgICAgICB7ICJ0d2VldCI6IHsgInR3ZWV0aWQiOiAiMTAiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIkNvbGluZUdleWVyQDYzIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDEyMSwgInN0YXR1c2VzX2NvdW50IjogMzYyLCAibmFtZSI6ICJDb2xpbmUgR2V5ZXIiLCAiZm9sbG93ZXJzX2NvdW50IjogMTcxNTkgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIyOS4xNSw3Ni41MyIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMDgtMDEtMjZUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgInZlcml6b24iLCAidm9pY2UtY2xhcml0eSIgfX0sICJtZXNzYWdlLXRleHQiOiAiIGhhdGUgdmVyaXpvbiBpdHMgdm9pY2UtY2xhcml0eSBpcyBPTUc6KCIgfSwgInNpbWlsYXItdHdlZXRzIjogWyB7eyAiaXBob25lIiwgInZvaWNlLWNsYXJpdHkiIH19LCB7eyAidmVyaXpvbiIsICJ2b2ljZW1haWwtc2VydmljZSIgfX0sIHt7ICJ2ZXJpem9uIiwgInNob3J0Y3V0LW1lbnUiIH19IF0gfQorICAgICAgICB7ICJ0d2VldCI6IHsgInR3ZWV0aWQiOiAiMTEiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIk5pbGFNaWxsaXJvbl90dyIsICJsYW5nIjogImVuIiwgImZyaWVuZHNfY291bnQiOiA0NDUsICJzdGF0dXNlc19jb3VudCI6IDE2NCwgIm5hbWUiOiAiTmlsYSBNaWxsaXJvbiIsICJmb2xsb3dlcnNfY291bnQiOiAyMjY0OSB9LCAic2VuZGVyLWxvY2F0aW9uIjogcG9pbnQoIjM3LjU5LDY4LjQyIiksICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAwOC0wMy0wOVQxMDoxMDowMC4wMDBaIiksICJyZWZlcnJlZC10b3BpY3MiOiB7eyAiaXBob25lIiwgInBsYXRmb3JtIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgY2FuJ3Qgc3RhbmQgaXBob25lIGl0cyBwbGF0Zm9ybSBpcyB0ZXJyaWJsZSIgfSwgInNpbWlsYXItdHdlZXRzIjogWyB7eyAiaXBob25lIiwgInZvaWNlLWNsYXJpdHkiIH19LCB7eyAic2Ftc3VuZyIsICJwbGF0Zm9ybSIgfX0gXSB9CisgICAgICAgIHsgInR3ZWV0IjogeyAidHdlZXRpZCI6ICIxMiIsICJ1c2VyIjogeyAic2NyZWVuLW5hbWUiOiAiT2xpSmFja3Nvbl81MTIiLCAibGFuZyI6ICJlbiIsICJmcmllbmRzX2NvdW50IjogNDQ1LCAic3RhdHVzZXNfY291bnQiOiAxNjQsICJuYW1lIjogIk9saSBKYWNrc29uIiwgImZvbGxvd2Vyc19jb3VudCI6IDIyNjQ5IH0sICJzZW5kZXItbG9jYXRpb24iOiBwb2ludCgiMjQuODIsOTQuNjMiKSwgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDEwLTAyLTEzVDEwOjEwOjAwLjAwMFoiKSwgInJlZmVycmVkLXRvcGljcyI6IHt7ICJzYW1zdW5nIiwgInZvaWNlLWNvbW1hbmQiIH19LCAibWVzc2FnZS10ZXh0IjogIiBsaWtlIHNhbXN1bmcgdGhlIHZvaWNlLWNvbW1hbmQgaXMgYW1hemluZzopIiB9LCAic2ltaWxhci10d2VldHMiOiBbIHt7ICJzYW1zdW5nIiwgInBsYXRmb3JtIiB9fSwge3sgInNwcmludCIsICJ2b2ljZS1jb21tYW5kIiB9fSBdIH0KKyAgICAgICAgeyAidHdlZXQiOiB7ICJ0d2VldGlkIjogIjIiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIkNvbGluZUdleWVyQDYzIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDEyMSwgInN0YXR1c2VzX2NvdW50IjogMzYyLCAibmFtZSI6ICJDb2xpbmUgR2V5ZXIiLCAiZm9sbG93ZXJzX2NvdW50IjogMTcxNTkgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIzMi44NCw2Ny4xNCIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTAtMDUtMTNUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgInZlcml6b24iLCAic2hvcnRjdXQtbWVudSIgfX0sICJtZXNzYWdlLXRleHQiOiAiIGxpa2UgdmVyaXpvbiBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiIH0sICJzaW1pbGFyLXR3ZWV0cyI6IFsge3sgInZlcml6b24iLCAidm9pY2VtYWlsLXNlcnZpY2UiIH19LCB7eyAidmVyaXpvbiIsICJ2b2ljZS1jbGFyaXR5IiB9fSwge3sgInQtbW9iaWxlIiwgInNob3J0Y3V0LW1lbnUiIH19IF0gfQorICAgICAgICB7ICJ0d2VldCI6IHsgInR3ZWV0aWQiOiAiMyIsICJ1c2VyIjogeyAic2NyZWVuLW5hbWUiOiAiTmF0aGFuR2llc2VuQDIxMSIsICJsYW5nIjogImVuIiwgImZyaWVuZHNfY291bnQiOiAzOTMzOSwgInN0YXR1c2VzX2NvdW50IjogNDczLCAibmFtZSI6ICJOYXRoYW4gR2llc2VuIiwgImZvbGxvd2Vyc19jb3VudCI6IDQ5NDE2IH0sICJzZW5kZXItbG9jYXRpb24iOiBwb2ludCgiMjkuNzIsNzUuOCIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMDYtMTEtMDRUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgIm1vdG9yb2xhIiwgInNwZWVkIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbGlrZSBtb3Rvcm9sYSB0aGUgc3BlZWQgaXMgZ29vZDopIiB9LCAic2ltaWxhci10d2VldHMiOiBbIHt7ICJtb3Rvcm9sYSIsICJzcGVlZCIgfX0gXSB9CisgICAgICAgIHsgInR3ZWV0IjogeyAidHdlZXRpZCI6ICI0IiwgInVzZXIiOiB7ICJzY3JlZW4tbmFtZSI6ICJOYXRoYW5HaWVzZW5AMjExIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDM5MzM5LCAic3RhdHVzZXNfY291bnQiOiA0NzMsICJuYW1lIjogIk5hdGhhbiBHaWVzZW4iLCAiZm9sbG93ZXJzX2NvdW50IjogNDk0MTYgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIzOS4yOCw3MC40OCIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTEtMTItMjZUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgInNwcmludCIsICJ2b2ljZS1jb21tYW5kIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbGlrZSBzcHJpbnQgdGhlIHZvaWNlLWNvbW1hbmQgaXMgbWluZC1ibG93aW5nOikiIH0sICJzaW1pbGFyLXR3ZWV0cyI6IFsge3sgInNhbXN1bmciLCAidm9pY2UtY29tbWFuZCIgfX0gXSB9CisgICAgICAgIHsgInR3ZWV0IjogeyAidHdlZXRpZCI6ICI1IiwgInVzZXIiOiB7ICJzY3JlZW4tbmFtZSI6ICJOYXRoYW5HaWVzZW5AMjExIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDM5MzM5LCAic3RhdHVzZXNfY291bnQiOiA0NzMsICJuYW1lIjogIk5hdGhhbiBHaWVzZW4iLCAiZm9sbG93ZXJzX2NvdW50IjogNDk0MTYgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCI0MC4wOSw5Mi42OSIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMDYtMDgtMDRUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgIm1vdG9yb2xhIiwgInNwZWVkIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgY2FuJ3Qgc3RhbmQgbW90b3JvbGEgaXRzIHNwZWVkIGlzIHRlcnJpYmxlOigiIH0sICJzaW1pbGFyLXR3ZWV0cyI6IFsge3sgIm1vdG9yb2xhIiwgInNwZWVkIiB9fSBdIH0KKyAgICAgICAgeyAidHdlZXQiOiB7ICJ0d2VldGlkIjogIjYiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIkNvbGluZUdleWVyQDYzIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDEyMSwgInN0YXR1c2VzX2NvdW50IjogMzYyLCAibmFtZSI6ICJDb2xpbmUgR2V5ZXIiLCAiZm9sbG93ZXJzX2NvdW50IjogMTcxNTkgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCI0Ny41MSw4My45OSIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTAtMDUtMDdUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgImlwaG9uZSIsICJ2b2ljZS1jbGFyaXR5IiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbGlrZSBpcGhvbmUgdGhlIHZvaWNlLWNsYXJpdHkgaXMgZ29vZDopIiB9LCAic2ltaWxhci10d2VldHMiOiBbIHt7ICJ2ZXJpem9uIiwgInZvaWNlLWNsYXJpdHkiIH19LCB7eyAiaXBob25lIiwgInBsYXRmb3JtIiB9fSBdIH0KKyAgICAgICAgeyAidHdlZXQiOiB7ICJ0d2VldGlkIjogIjciLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIkNoYW5nRXdpbmdfNTczIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDE4MiwgInN0YXR1c2VzX2NvdW50IjogMzk0LCAibmFtZSI6ICJDaGFuZyBFd2luZyIsICJmb2xsb3dlcnNfY291bnQiOiAzMjEzNiB9LCAic2VuZGVyLWxvY2F0aW9uIjogcG9pbnQoIjM2LjIxLDcyLjYiKSwgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDExLTA4LTI1VDEwOjEwOjAwLjAwMFoiKSwgInJlZmVycmVkLXRvcGljcyI6IHt7ICJzYW1zdW5nIiwgInBsYXRmb3JtIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbGlrZSBzYW1zdW5nIHRoZSBwbGF0Zm9ybSBpcyBnb29kIiB9LCAic2ltaWxhci10d2VldHMiOiBbIHt7ICJpcGhvbmUiLCAicGxhdGZvcm0iIH19LCB7eyAic2Ftc3VuZyIsICJ2b2ljZS1jb21tYW5kIiB9fSBdIH0KKyAgICAgICAgeyAidHdlZXQiOiB7ICJ0d2VldGlkIjogIjgiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIk5hdGhhbkdpZXNlbkAyMTEiLCAibGFuZyI6ICJlbiIsICJmcmllbmRzX2NvdW50IjogMzkzMzksICJzdGF0dXNlc19jb3VudCI6IDQ3MywgIm5hbWUiOiAiTmF0aGFuIEdpZXNlbiIsICJmb2xsb3dlcnNfY291bnQiOiA0OTQxNiB9LCAic2VuZGVyLWxvY2F0aW9uIjogcG9pbnQoIjQ2LjA1LDkzLjM0IiksICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAwNS0xMC0xNFQxMDoxMDowMC4wMDBaIiksICJyZWZlcnJlZC10b3BpY3MiOiB7eyAidC1tb2JpbGUiLCAic2hvcnRjdXQtbWVudSIgfX0sICJtZXNzYWdlLXRleHQiOiAiIGxpa2UgdC1tb2JpbGUgdGhlIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9LCAic2ltaWxhci10d2VldHMiOiBbIHt7ICJ0LW1vYmlsZSIsICJjdXN0b21pemF0aW9uIiB9fSwge3sgInZlcml6b24iLCAic2hvcnRjdXQtbWVudSIgfX0gXSB9CisgICAgICAgIHsgInR3ZWV0IjogeyAidHdlZXRpZCI6ICI5IiwgInVzZXIiOiB7ICJzY3JlZW4tbmFtZSI6ICJOYXRoYW5HaWVzZW5AMjExIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDM5MzM5LCAic3RhdHVzZXNfY291bnQiOiA0NzMsICJuYW1lIjogIk5hdGhhbiBHaWVzZW4iLCAiZm9sbG93ZXJzX2NvdW50IjogNDk0MTYgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIzNi44Niw3NC42MiIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTItMDctMjFUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgInZlcml6b24iLCAidm9pY2VtYWlsLXNlcnZpY2UiIH19LCAibWVzc2FnZS10ZXh0IjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0sICJzaW1pbGFyLXR3ZWV0cyI6IFsge3sgInZlcml6b24iLCAidm9pY2UtY2xhcml0eSIgfX0sIHt7ICJ2ZXJpem9uIiwgInNob3J0Y3V0LW1lbnUiIH19IF0gfQorCisKKyMjIyBJbnNlcnRpbmcgTmV3IERhdGEgICMjIworSW4gYWRkaXRpb24gdG8gbG9hZGluZyBhbmQgcXVlcnlpbmcgZGF0YSwgQXN0ZXJpeERCIHN1cHBvcnRzIGluY3JlbWVudGFsIGFkZGl0aW9ucyB0byBkYXRhc2V0cyB2aWEgdGhlIEFRTCBfaW5zZXJ0XyBzdGF0ZW1lbnQuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBhZGRzIGEgbmV3IHR3ZWV0IGJ5IHVzZXIgIk5hdGhhbkdpZXNlbkAyMTEiIHRvIHRoZSBUd2VldE1lc3NhZ2VzIGRhdGFzZXQuCisoQW4gYXN0dXRlIHJlYWRlciBtYXkgbm90aWNlIHRoYXQgdGhpcyB0d2VldCB3YXMgaXNzdWVkIGEgaGFsZiBhbiBob3VyIGFmdGVyIGhpcyBsYXN0IHR3ZWV0LCBzbyBoaXMgY291bnRzCitoYXZlIGFsbCBnb25lIHVwIGluIHRoZSBpbnRlcmltLCBhbHRob3VnaCBoZSBhcHBlYXJzIG5vdCB0byBoYXZlIG1vdmVkIGluIHRoZSBsYXN0IGhhbGYgaG91ci4pCisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgaW5zZXJ0IGludG8gZGF0YXNldCBUd2VldE1lc3NhZ2VzCisgICAgICAgICgKKyAgICAgICAgICAgeyJ0d2VldGlkIjoiMTMiLAorICAgICAgICAgICAgInVzZXIiOgorICAgICAgICAgICAgICAgIHsic2NyZWVuLW5hbWUiOiJOYXRoYW5HaWVzZW5AMjExIiwKKyAgICAgICAgICAgICAgICAgImxhbmciOiJlbiIsCisgICAgICAgICAgICAgICAgICJmcmllbmRzX2NvdW50IjozOTM0NSwKKyAgICAgICAgICAgICAgICAgInN0YXR1c2VzX2NvdW50Ijo0NzksCisgICAgICAgICAgICAgICAgICJuYW1lIjoiTmF0aGFuIEdpZXNlbiIsCisgICAgICAgICAgICAgICAgICJmb2xsb3dlcnNfY291bnQiOjQ5NDIwCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJzZW5kZXItbG9jYXRpb24iOnBvaW50KCI0Ny40NCw4MC42NSIpLAorICAgICAgICAgICAgInNlbmQtdGltZSI6ZGF0ZXRpbWUoIjIwMDgtMDQtMjZUMTA6MTA6MzUiKSwKKyAgICAgICAgICAgICJyZWZlcnJlZC10b3BpY3MiOnt7InR3ZWV0aW5nIn19LAorICAgICAgICAgICAgIm1lc3NhZ2UtdGV4dCI6InR3ZWV0eSB0d2VldCwgbXkgZmVsbG93IHR3ZWV0ZXJzISIKKyAgICAgICAgICAgfQorICAgICAgICApOworCitJbiBnZW5lcmFsLCB0aGUgZGF0YSB0byBiZSBpbnNlcnRlZCBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIGFueSB2YWxpZCBBUUwgcXVlcnkgZXhwcmVzc2lvbi4KK1RoZSBpbnNlcnRpb24gb2YgYSBzaW5nbGUgb2JqZWN0IGluc3RhbmNlLCBhcyBpbiB0aGlzIGV4YW1wbGUsIGlzIGp1c3QgYSBzcGVjaWFsIGNhc2Ugd2hlcmUKK3RoZSBxdWVyeSBleHByZXNzaW9uIGhhcHBlbnMgdG8gYmUgYSByZWNvcmQgY29uc3RydWN0b3IgaW52b2x2aW5nIG9ubHkgY29uc3RhbnRzLgorCisjIyMgRGVsZXRpbmcgRXhpc3RpbmcgRGF0YSAgIyMjCitJbiBhZGRpdGlvbiB0byBpbnNlcnRpbmcgbmV3IGRhdGEsIEFzdGVyaXhEQiBzdXBwb3J0cyBkZWxldGlvbiBmcm9tIGRhdGFzZXRzIHZpYSB0aGUgQVFMIF9kZWxldGVfIHN0YXRlbWVudC4KK1RoZSBzdGF0ZW1lbnQgc3VwcG9ydHMgInNlYXJjaGVkIGRlbGV0ZSIgc2VtYW50aWNzLCBhbmQgaXRzCitfd2hlcmVfIGNsYXVzZSBjYW4gaW52b2x2ZSBhbnkgdmFsaWQgWFF1ZXJ5IGV4cHJlc3Npb24uCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWxldGVzIHRoZSB0d2VldCB0aGF0IHdlIGp1c3QgYWRkZWQgZnJvbSB1c2VyICJOYXRoYW5HaWVzZW5AMjExIi4gIChFYXN5IGNvbWUsIGVhc3kgZ28uIDotKSkKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBkZWxldGUgJHRtIGZyb20gZGF0YXNldCBUd2VldE1lc3NhZ2VzIHdoZXJlICR0bS50d2VldGlkID0gIjEzIjsKKworSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgb25lIGZvcm0gb2YgZGF0YSBjaGFuZ2Ugbm90IHlldCBzdXBwb3J0ZWQgYnkgQXN0ZXJpeERCIGlzIGluLXBsYWNlIGRhdGEgbW9kaWZpY2F0aW9uIChfdXBkYXRlXykuCitDdXJyZW50bHksIG9ubHkgaW5zZXJ0IGFuZCBkZWxldGUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkOyB1cGRhdGUgaXMgbm90LgorVG8gYWNoaWV2ZSB0aGUgZWZmZWN0IG9mIGFuIHVwZGF0ZSwgdHdvIHN0YXRlbWVudHMgYXJlIGN1cnJlbnRseSBuZWVkZWQtLS1vbmUgdG8gZGVsZXRlIHRoZSBvbGQgcmVjb3JkIGZyb20gdGhlCitkYXRhc2V0IHdoZXJlIGl0IHJlc2lkZXMsIGFuZCBhbm90aGVyIHRvIGluc2VydCB0aGUgbmV3IHJlcGxhY2VtZW50IHJlY29yZCAod2l0aCB0aGUgc2FtZSBwcmltYXJ5IGtleSBidXQgd2l0aAorZGlmZmVyZW50IGZpZWxkIHZhbHVlcyBmb3Igc29tZSBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhIGNvbnRlbnQpLgorCisjIyBGdXJ0aGVyIEhlbHAgIyMKK1RoYXQncyBpdCAgWW91IGFyZSBub3cgYXJtZWQgYW5kIGRhbmdlcm91cyB3aXRoIHJlc3BlY3QgdG8gc2VtaXN0cnVjdHVyZWQgZGF0YSBtYW5hZ2VtZW50IHVzaW5nIEFzdGVyaXhEQi4KKworQXN0ZXJpeERCIGlzIGEgcG93ZXJmdWwgbmV3IEJETVMtLS1CaWcgRGF0YSBNYW5hZ2VtZW50IFN5c3RlbS0tLXRoYXQgd2UgaG9wZSBtYXkgdXNoZXIgaW4gYSBuZXcgZXJhIG9mIG11Y2gKK21vcmUgZGVjbGFyYXRpdmUgQmlnIERhdGEgbWFuYWdlbWVudC4KK0FzdGVyaXhEQiBpcyBwb3dlcmZ1bCwgc28gdXNlIGl0IHdpc2VseSwgYW5kIHJlbWVtYmVyOiAiV2l0aCBncmVhdCBwb3dlciBjb21lcyBncmVhdCByZXNwb25zaWJpbGl0eS4uLiIgOi0pCisKK1BsZWFzZSBlLW1haWwgdGhlIEFzdGVyaXhEQiB1c2VyIGdyb3VwCisoYXN0ZXJpeGRiLXVzZXJzIChhdCkgZ29vZ2xlZ3JvdXBzLmNvbSkKK2lmIHlvdSBydW4gaW50byBhbnkgcHJvYmxlbXMgb3Igc2ltcGx5IGhhdmUgZnVydGhlciBxdWVzdGlvbnMgYWJvdXQgdGhlIEFzdGVyaXhEQiBzeXN0ZW0sIGl0cyBmZWF0dXJlcywgb3IgdGhlaXIgcHJvcGVyIHVzZS4KZGlmZiAtLWdpdCBhL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhBbHBoYVJlbGVhc2UubWQgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4QWxwaGFSZWxlYXNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2Y0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4QWxwaGFSZWxlYXNlLm1kCkBAIC0wLDAgKzEsNTkgQEAKKyMgQXN0ZXJpeERCOiBBIEJpZyBEYXRhIE1hbmFnZW1lbnQgU3lzdGVtIF8oQWxwaGEgUmVsZWFzZSlfICMKKworIyMgV2hhdCBJcyBBc3Rlcml4REI/ICMjCisKK1dlbGNvbWUgdG8gdGhlIG5ldyBob21lIG9mIHRoZSBBc3Rlcml4REIgQmlnIERhdGEgTWFuYWdlbWVudCBTeXN0ZW0gKEJETVMpLgorVGhlIEFzdGVyaXhEQiBCRE1TIGlzIHRoZSByZXN1bHQgb2YgYWJvdXQgMy41IHllYXJzIG9mIFImRCBpbnZvbHZpbmcgcmVzZWFyY2hlcnMgYXQgVUMgSXJ2aW5lLCBVQyBSaXZlcnNpZGUsIGFuZCBVQyBTYW4gRGllZ28uCitUaGUgQXN0ZXJpeERCIGNvZGUgYmFzZSBub3cgY29uc2lzdHMgb2Ygcm91Z2hseSAyNTBLIGxpbmVzIG9mIEphdmEgY29kZSB0aGF0IGhhcyBiZWVuIGNvLWRldmVsb3BlZCBhdCBVQyBJcnZpbmUgYW5kIFVDIFJpdmVyc2lkZS4KKworSW5pdGlhdGVkIGluIDIwMDksIHRoZSBOU0Ytc3BvbnNvcmVkIEFTVEVSSVggcHJvamVjdCBoYXMgYmVlbiBkZXZlbG9waW5nIG5ldyB0ZWNobm9sb2dpZXMgZm9yIGluZ2VzdGluZywgc3RvcmluZywgbWFuYWdpbmcsIGluZGV4aW5nLCBxdWVyeWluZywgYW5kIGFuYWx5emluZyB2YXN0IHF1YW50aXRpZXMgb2Ygc2VtaS1zdHJ1Y3R1cmVkIGluZm9ybWF0aW9uLgorVGhlIHByb2plY3QgaGFzIGJlZW4gY29tYmluaW5nIGlkZWFzIGZyb20gdGhyZWUgZGlzdGluY3QgYXJlYXMtLS1zZW1pLXN0cnVjdHVyZWQgZGF0YSwgcGFyYWxsZWwgZGF0YWJhc2VzLCBhbmQgZGF0YS1pbnRlbnNpdmUgY29tcHV0aW5nIChhLmsuYS4gdG9kYXkncyBCaWcgRGF0YSBwbGF0Zm9ybXMpLS0taW4gb3JkZXIgdG8gY3JlYXRlIGEgbmV4dC1nZW5lcmF0aW9uLCBvcGVuLXNvdXJjZSBzb2Z0d2FyZSBwbGF0Zm9ybSB0aGF0IHNjYWxlcyBieSBydW5uaW5nIG9uIGxhcmdlLCBzaGFyZWQtbm90aGluZyBjb21tb2RpdHkgY29tcHV0aW5nIGNsdXN0ZXJzLgorVGhlIEFTVEVSSVggZWZmb3J0IGhhcyBiZWVuIHRhcmdldGluZyBhIHdpZGUgcmFuZ2Ugb2Ygc2VtaS1zdHJ1Y3R1cmVkIGluZm9ybWF0aW9uLCByYW5naW5nIGZyb20gImRhdGEiIHVzZSBjYXNlcy0tLXdoZXJlIGluZm9ybWF0aW9uIGlzIHdlbGwtdHlwZWQgYW5kIGhpZ2hseSByZWd1bGFyLS0tdG8gImNvbnRlbnQiIHVzZSBjYXNlcy0tLXdoZXJlIGRhdGEgdGVuZHMgdG8gYmUgaXJyZWd1bGFyLCBtdWNoIG9mIGVhY2ggZGF0dW0gbWF5IGJlIHRleHR1YWwsIGFuZCB0aGUgdWx0aW1hdGUgc2NoZW1hIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzIGludm9sdmVkIG1heSBiZSBoYXJkIHRvIGFudGljaXBhdGUgdXAgZnJvbnQuCitUaGUgQVNURVJJWCBwcm9qZWN0IGhhcyBiZWVuIGFkZHJlc3NpbmcgdGVjaG5pY2FsIGlzc3VlcyBpbmNsdWRpbmcgaGlnaGx5IHNjYWxhYmxlIGRhdGEgc3RvcmFnZSBhbmQgaW5kZXhpbmcsIHNlbWktc3RydWN0dXJlZCBxdWVyeSBwcm9jZXNzaW5nIG9uIHZlcnkgbGFyZ2UgY2x1c3RlcnMsIGFuZCBtZXJnaW5nIHRpbWUtdGVzdGVkIHBhcmFsbGVsIGRhdGFiYXNlIHRlY2huaXF1ZXMgd2l0aCBtb2Rlcm4gZGF0YS1pbnRlbnNpdmUgY29tcHV0aW5nIHRlY2huaXF1ZXMgdG8gc3VwcG9ydCBwZXJmb3JtYW50IHlldCBkZWNsYXJhdGl2ZSBzb2x1dGlvbnMgdG8gdGhlIHByb2JsZW0gb2Ygc3RvcmluZyBhbmQgYW5hbHl6aW5nIHNlbWktc3RydWN0dXJlZCBpbmZvcm1hdGlvbiBlZmZlY3RpdmVseS4KK1RoZSBmaXJzdCBmcnVpdHMgb2YgdGhpcyBsYWJvciBoYXZlIGJlZW4gY2FwdHVyZWQgaW4gdGhlIEFzdGVyaXhEQiBzeXN0ZW0gdGhhdCBpcyBub3cgYmVpbmcgcmVsZWFzZWQgaW4gcHJlbGltaW5hcnkgb3IgIkFscGhhIiByZWxlYXNlIGZvcm0uCitXZSBhcmUgaG9waW5nIHRoYXQgdGhlIGFycml2YWwgb2YgQXN0ZXJpeERCIHdpbGwgbWFyayB0aGUgYmVnaW5uaW5nIG9mIHRoZSAiQkRNUyBlcmEiLCBhbmQgd2UgaG9wZSB0aGF0IGJvdGggdGhlIEJpZyBEYXRhIGNvbW11bml0eSBhbmQgdGhlIGRhdGFiYXNlIGNvbW11bml0eSB3aWxsIGZpbmQgdGhlIEFzdGVyaXhEQiBzeXN0ZW0gdG8gYmUgaW50ZXJlc3RpbmcgYW5kIHVzZWZ1bCBmb3IgYSBtdWNoIGJyb2FkZXIgY2xhc3Mgb2YgcHJvYmxlbXMgdGhhbiBjYW4gYmUgYWRkcmVzc2VkIHdpdGggYW55IG9uZSBvZiB0b2RheSdzIGN1cnJlbnQgQmlnIERhdGEgcGxhdGZvcm1zIGFuZCByZWxhdGVkIHRlY2hub2xvZ2llcyAoZS5nLiwgSGFkb29wLCBQaWcsIEhpdmUsIEhCYXNlLCBDYXNzYW5kcmEsIGFuZCBzbyBvbikuICBPbmUgb2Ygb3VyIHByb2plY3QgbW90dG9zIGhhcyBiZWVuICJvbmUgc2l6ZSBmaXRzIGEgYnVuY2giLS0tYXQgbGVhc3QgdGhhdCBoYXMgYmVlbiBvdXIgYWltLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc2VhcmNoIGVmZm9ydCB0aGF0IGxlZCB0byB0aGUgYmlydGggb2YgQXN0ZXJpeERCLCBwbGVhc2UgcmVmZXIgdG8gb3VyIE5TRiBwcm9qZWN0IHdlYiBzaXRlOiBodHRwOi8vYXN0ZXJpeC5pY3MudWNpLmVkdS8uCisKK0luIGEgbnV0c2hlbGwsIEFzdGVyaXhEQiBpcyBhIGZ1bGwtZnVuY3Rpb24gQkRNUyB3aXRoIGEgcmljaCBmZWF0dXJlIHNldCB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSBwcmV0dHkgbXVjaCBhbnkgb3RoZXIgQmlnIERhdGEgcGxhdGZvcm0gdGhhdCdzIG91dCBhbmQgYXZhaWxhYmxlIHRvZGF5LiAgV2UgYmVsaWV2ZSB0aGF0IGl0cyBmZWF0dXJlIHNldCBtYWtlcyBpdCB3ZWxsLXN1aXRlZCB0byBtb2Rlcm4gbmVlZHMgc3VjaCBhcyB3ZWIgZGF0YSB3YXJlaG91c2luZyBhbmQgc29jaWFsIGRhdGEgc3RvcmFnZSBhbmQgYW5hbHlzaXMuICBBc3Rlcml4REIgaGFzOgorCisgKiBBIHNlbWlzdHJ1Y3R1cmVkIE5vU1FMIHN0eWxlIGRhdGEgbW9kZWwgKEFETSkgcmVzdWx0aW5nIGZyb20gZXh0ZW5kaW5nIEpTT04gd2l0aCBvYmplY3QgZGF0YWJhc2UgaWRlYXMKKyAqIEFuIGV4cHJlc3NpdmUgYW5kIGRlY2xhcmF0aXZlIHF1ZXJ5IGxhbmd1YWdlIChBUUwpIHRoYXQgc3VwcG9ydHMgYSBicm9hZCByYW5nZSBvZiBxdWVyaWVzIGFuZCBhbmFseXNpcyBvdmVyIHNlbWlzdHJ1Y3R1cmVkIGRhdGEKKyAqIEEgcGFyYWxsZWwgcnVudGltZSBxdWVyeSBleGVjdXRpb24gZW5naW5lLCBIeXJhY2tzLCB0aGF0IGhhcyBiZWVuIHNjYWxlLXRlc3RlZCBvbiB1cCB0byAxMDAwKyBjb3JlcyBhbmQgNTAwKyBkaXNrcworICogUGFydGl0aW9uZWQgTFNNLWJhc2VkIGRhdGEgc3RvcmFnZSBhbmQgaW5kZXhpbmcgdG8gc3VwcG9ydCBlZmZpY2llbnQgaW5nZXN0aW9uIGFuZCBtYW5hZ2VtZW50IG9mIHNlbWlzdHJ1Y3R1cmVkIGRhdGEKKyAqIFN1cHBvcnQgZm9yIHF1ZXJ5IGFjY2VzcyB0byBleHRlcm5hbGx5IHN0b3JlZCBkYXRhIChlLmcuLCBkYXRhIGluIEhERlMpIGFzIHdlbGwgYXMgdG8gZGF0YSBzdG9yZWQgbmF0aXZlbHkgYnkgQXN0ZXJpeERCCisgKiBBIHJpY2ggc2V0IG9mIHByaW1pdGl2ZSBkYXRhIHR5cGVzLCBpbmNsdWRpbmcgc3BhdGlhbCBhbmQgdGVtcG9yYWwgZGF0YSBpbiBhZGRpdGlvbiB0byBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCwgYW5kIHRleHR1YWwgZGF0YQorICogU2Vjb25kYXJ5IGluZGV4aW5nIG9wdGlvbnMgdGhhdCBpbmNsdWRlIEIrIHRyZWVzLCBSIHRyZWVzLCBhbmQgaW52ZXJ0ZWQga2V5d29yZCAoZXhhY3QgYW5kIGZ1enp5KSBpbmRleCB0eXBlcworICogU3VwcG9ydCBmb3IgZnV6enkgYW5kIHNwYXRpYWwgcXVlcmllcyBhcyB3ZWxsIGFzIGZvciBtb3JlIHRyYWRpdGlvbmFsIHBhcmFtZXRyaWMgcXVlcmllcworICogQmFzaWMgdHJhbnNhY3Rpb25hbCAoY29uY3VycmVuY3kgYW5kIHJlY292ZXJ5KSBjYXBhYmlsaXRpZXMgYWtpbiB0byB0aG9zZSBvZiBhIE5vU1FMIHN0b3JlCisKKyMjIEdldHRpbmcgYW5kIFVzaW5nIEFzdGVyaXhEQiAjIworCitZb3UgYXJlIG1vc3QgbGlrZWx5IGhlcmUgYmVjYXVzZSB5b3UgYXJlIGludGVyZXN0ZWQgaW4gZ2V0dGluZyB5b3VyIGhhbmRzIG9uIEFzdGVyaXhEQi0tLXNvIHlvdSB3b3VsZCBsaWtlIHRvIGtub3cgaG93IHRvIGdldCBpdCwgaG93IHRvIHNldCBpdCB1cCwgYW5kIGhvdyB0byB1c2UgaXQuCitTb21lZGF5IG91ciBwbGFuIGlzIHRvIGhhdmUgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGZvciBBc3Rlcml4REIgYW5kIGl0cyBkYXRhIG1vZGVsIChBRE0pIGFuZCBxdWVyeSBsYW5ndWFnZSAoQVFMKSBoZXJlIG9uIHRoaXMgd2lraS4KK0ZvciB0aGUgQWxwaGEgcmVsZWFzZSwgd2UndmUgZ290IGEgc3RhcnQ7IGZvciB0aGUgQmV0YSByZWxlYXNlIGEgbW9udGggb3Igc28gZnJvbSBub3csIHdlIHdpbGwgaG9wZWZ1bGx5IGhhdmUgbXVjaCBtb3JlLgorVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIHdpa2kgcGFnZXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIHRoYXQgd2UgaGF2ZSBhdmFpbGFibGUgdG9kYXk6CisKKzEuIEluc3RhbGxpbmdBc3Rlcml4VXNpbmdNYW5hZ2l4IDoKK1RoaXMgaXMgb3VyIGluc3RhbGxhdGlvbiBndWlkZSwgYW5kIGl0IGlzIHdoZXJlIHlvdSBzaG91bGQgc3RhcnQuCitUaGlzIGRvY3VtZW50IHdpbGwgdGVsbCB5b3UgaG93IHRvIG9idGFpbiwgaW5zdGFsbCwgYW5kIG1hbmFnZSBpbnN0YW5jZXMgb2YgW2h0dHBzOi8vYXN0ZXJpeGRiLmdvb2dsZWNvZGUuY29tL2ZpbGVzL2FzdGVyaXgtaW5zdGFsbGVyLTAuMC40LWJpbmFyeS1hc3NlbWJseS56aXAgQXN0ZXJpeERCXSwgaW5jbHVkaW5nIGJvdGggc2luZ2xlLW1hY2hpbmUgc2V0dXAgKGZvciBkZXZlbG9wZXJzKSBhcyB3ZWxsIGFzIGNsdXN0ZXIgaW5zdGFsbGF0aW9ucyAoZm9yIGRlcGxveW1lbnQgaW4gaXRzIGludGVuZGVkIGZvcm0pLgorCisyLiBBZG1BcWwxMDEgOgorVGhpcyBpcyBhIGZpcnN0LXRpbWVycyBpbnRyb2R1Y3Rpb24gdG8gdGhlIHVzZXIgbW9kZWwgb2YgdGhlIEFzdGVyaXhEQiBCRE1TLCBieSB3aGljaCB3ZSBtZWFuIHRoZSB2aWV3IG9mIEFzdGVyaXhEQiBhcyBzZWVuIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGFuICJhdmVyYWdlIHVzZXIiIG9yIEJpZyBEYXRhIGFwcGxpY2F0aW9uIGRldmVsb3Blci4KK1RoZSBBc3Rlcml4REIgdXNlciBtb2RlbCBjb25zaXN0cyBvZiBpdHMgZGF0YSBtb2RlbGluZyBmZWF0dXJlcyAoQURNKSBhbmQgaXRzIHF1ZXJ5IGNhcGFiaWxpdGllcyAoQVFMKS4KK1RoaXMgZG9jdW1lbnQgcHJlc2VudHMgYSB0aW55ICJzb2NpYWwgZGF0YSB3YXJlaG91c2luZyIgZXhhbXBsZSBhbmQgdXNlcyBpdCBhcyBhIGJhY2tkcm9wIGZvciBkZXNjcmliaW5nLCBieSBleGFtcGxlLCB0aGUga2V5IGZlYXR1cmVzIG9mIEFzdGVyaXhEQi4KK0J5IHdvcmtpbmcgdGhyb3VnaCB0aGlzIGRvY3VtZW50LCB5b3Ugd2lsbCBsZWFybiBob3cgdG8gZGVmaW5lIHRoZSBhcnRpZmFjdHMgbmVlZGVkIHRvIG1hbmFnZSBkYXRhIGluIEFzdGVyaXhEQiwgaG93IHRvIGxvYWQgZGF0YSBpbnRvIHRoZSBzeXN0ZW0sIGhvdyB0byB1c2UgbW9zdCBvZiB0aGUgYmFzaWMgZmVhdHVyZXMgb2YgaXRzIHF1ZXJ5IGxhbmd1YWdlLCBhbmQgaG93IHRvIGluc2VydCBhbmQgZGVsZXRlIGRhdGEgZHluYW1pY2FsbHkuCisKKzMuIEFzdGVyaXhEYXRhVHlwZXNBbmRGdW5jdGlvbnMgOgorVGhpcyBpcyBhIHJlZmVyZW5jZSBkb2N1bWVudCB0aGF0IGNhdGFsb2dzIHRoZSBwcmltaXRpdmUgZGF0YSB0eXBlcyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3IgdXNlIGluIEFzdGVyaXhEQiBzY2hlbWFzIChpbiBBRE0pIGFuZCBxdWVyaWVzIChpbiBBUUwpLgorCis0LiBbaHR0cHM6Ly9hc3Rlcml4ZGIuZ29vZ2xlY29kZS5jb20vZmlsZXMvQVFMX1N5bnRheC5odG1sIEFRTCBHcmFtbWFyXSA6CitUaGlzIGlzIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyIGZvciBhIGZ1dHVyZSBBUUwgbGFuZ3VhZ2UgcmVmZXJlbmNlIG1hbnVhbC4KK0l0IG9mZmVycyBhIGh5cGVybGlua2VkLCBhdXRvLWdlbmVyYXRlZCBCTkYgc3BlY2lmaWNhdGlvbiBvZiB0aGUgQVFMIGxhbmd1YWdlIHN5bnRheC4KK091ciBob3BlIGlzIHRoYXQgdGhlIGNvbWJpbmF0aW9uIG9mIGRvY3VtZW50cyAyLTQgd2lsbCBzdWZmaWNlIHRvIGVuYWJsZSBvdXIgYWR2ZW50dXJvdXMgQWxwaGEgdXNlcnMgdG8gbGVhcm4gYW5kIG1ha2UgdXNlIG9mIEFRTC4KKworNS4gW2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYXN0ZXJpeGRiL3dpa2kvQXN0ZXJpeERCUmVzdEFQSSBBc3Rlcml4REJSZXN0QVBJXSA6CitBY2Nlc3MgdG8gZGF0YSBpbiBhbiBBc3Rlcml4REIgaW5zdGFuY2UgaXMgcHJvdmlkZWQgdmlhIGEgUkVTVC1iYXNlZCBBUEkuCitUaGlzIGlzIGEgc2hvcnQgZG9jdW1lbnQgdGhhdCBkZXNjcmliZXMgdGhlIFJFU1QgQVBJIGVudHJ5IHBvaW50cyBhbmQgdGhlaXIgVVJMIHN5bnRheC4KKworVG8gYWxsIHdobyBoYXZlIG5vdyBjb21lIHRoaXMgZmFyOiBUaGFua3MgZm9yIHlvdXIgaW50ZXJlc3QgaW4gQXN0ZXJpeERCLCBhbmQgZm9yIGtpY2tpbmcgaXRzIHRpcmVzIGluIGl0cyBBbHBoYSBmb3JtCitJbiBhZGRpdGlvbiB0byBnZXR0aW5nIHRoZSBzeXN0ZW0gYW5kIHRyeWluZyBpdCBvdXQsIHBsZWFzZSBzaWduIHVwIGFzIGEgbWVtYmVyIG9mIHRoZSBBc3Rlcml4REIgdXNlciBtYWlsaW5nIGxpc3QgKGFzdGVyaXhkYi11c2VycyAoYXQpIGdvb2dsZWdyb3Vwcy5jb20pIHNvIHRoYXQgeW91IGNhbiBjb250YWN0IHVzIGVhc2lseSB3aXRoIHlvdXIgcXVlc3Rpb25zLCBpc3N1ZXMsIGFuZCBvdGhlciBmZWVkYmFjay4KK1dlIHdhbnQgQXN0ZXJpeERCIHRvIGJlIGEgImJpZyBoaXQiIHNvbWUgZGF5LCBhbmQgd2UgYXJlIGFueGlvdXMgdG8gc2VlIHdoYXQgdXNlcnMgZG8gd2l0aCBpdCBhbmQgdG8gbGVhcm4gZnJvbSB0aGF0IGZlZWRiYWNrIHdoYXQgd2Ugc2hvdWxkIGJlIHdvcmtpbmcgb24gbW9zdCB1cmdlbnRseSBpbiB0aGUgbmV4dCBwaGFzZSBvZiB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhEQlJlc3RBUEkubWQgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4REJSZXN0QVBJLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmY4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4REJSZXN0QVBJLm1kCkBAIC0wLDAgKzEsMjE5IEBACisjc3VtbWFyeSBSRVNUIEFQSSB0byBBc3Rlcml4REIKKworYDx3aWtpOnRvYyBtYXhfZGVwdGg9IjIiIC8+YAorCisjIyBEREwgQVBJICMjCisKKypFbmQgcG9pbnQgZm9yIHRoZSBkYXRhIGRlZmluaXRpb24gc3RhdGVtZW50cyoKKworRW5kcG9pbnQ6IF8vZGRsXworCitQYXJhbWV0ZXJzOgorCit8fCBQYXJhbWV0ZXIgfHwgRGVzY3JpcHRpb24gfHwgUmVxdWlyZWQ/IHx8Cit8fCBkZGwgfHwgU3RyaW5nIGNvbnRhaW5pbmcgRERMIHN0YXRlbWVudHMgdG8gbW9kaWZ5IE1ldGFkYXRhIHx8IFllcyB8fAorCitUaGlzIGNhbGwgZG9lcyBub3QgcmV0dXJuIGFueSByZXN1bHQuIElmIHRoZSBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bCwgSFRUUCBPSyBzdGF0dXMgY29kZSBpcyByZXR1cm5lZC4KKworIyMjIEV4YW1wbGUgIyMjCisKKyMjIyMgRERMIFN0YXRlbWVudHMgIyMjIworCisKKyAgICAgICAgZHJvcCBkYXRhdmVyc2UgY29tcGFueSBpZiBleGlzdHM7CisgICAgICAgIGNyZWF0ZSBkYXRhdmVyc2UgY29tcGFueTsKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBjb21wYW55OworICAgICAgICAKKyAgICAgICAgY3JlYXRlIHR5cGUgRW1wIGFzIG9wZW4geworICAgICAgICAgIGlkIDogaW50MzIsCisgICAgICAgICAgbmFtZSA6IHN0cmluZworICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgY3JlYXRlIGRhdGFzZXQgRW1wbG95ZWUoRW1wKSBwcmltYXJ5IGtleSBpZDsKKworCitBUEkgY2FsbCBmb3IgdGhlIGFib3ZlIERETCBzdGF0ZW1lbnRzIGluIHRoZSBVUkwtZW5jb2RlZCBmb3JtLgorCitbaHR0cDovL2xvY2FsaG9zdDoxOTEwMS9kZGw/ZGRsPWRyb3AlMjBkYXRhdmVyc2UlMjBjb21wYW55JTIwaWYlMjBleGlzdHM7Y3JlYXRlJTIwZGF0YXZlcnNlJTIwY29tcGFueTt1c2UlMjBkYXRhdmVyc2UlMjBjb21wYW55O2NyZWF0ZSUyMHR5cGUlMjBFbXAlMjBhcyUyMG9wZW4lMjB7aWQlMjA6JTIwaW50MzIsbmFtZSUyMDolMjBzdHJpbmd9O2NyZWF0ZSUyMGRhdGFzZXQlMjBFbXBsb3llZShFbXApJTIwcHJpbWFyeSUyMGtleSUyMGlkO10KKworIyMjIyBSZXNwb25zZSAjIyMjCisqSFRUUCBPSyAyMDAqIGA8YnIgLz5gCitgPE5PIFBBWUxPQUQ+YAorCisjIyBVcGRhdGUgQVBJICMjCisKKypFbmQgcG9pbnQgZm9yIHVwZGF0ZSBzdGF0ZW1lbnRzIChJTlNFUlQsIERFTEVURSBhbmQgTE9BRCkqCisKK0VuZHBvaW50OiBfL3VwZGF0ZV8KKworUGFyYW1ldGVyczoKKworfHwgUGFyYW1ldGVyIHx8IERlc2NyaXB0aW9uIHx8IFJlcXVpcmVkPyB8fAorfHwgc3RhdGVtZW50cyB8fCBTdHJpbmcgY29udGFpbmluZyB1cGRhdGUgKGluc2VydC9kZWxldGUpIHN0YXRlbWVudHMgdG8gZXhlY3V0ZSB8fCBZZXMgfHwKKworVGhpcyBjYWxsIGRvZXMgbm90IHJldHVybiBhbnkgcmVzdWx0LiBJZiB0aGUgb3BlcmF0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWwsIEhUVFAgT0sgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQuCisKKyMjIyBFeGFtcGxlICMjIworCisjIyMjIFVwZGF0ZSBTdGF0ZW1lbnRzICMjIyMKKworCisgICAgICAgIHVzZSBkYXRhdmVyc2UgY29tcGFueTsKKyAgICAgICAgCisgICAgICAgIGluc2VydCBpbnRvIGRhdGFzZXQgRW1wbG95ZWUoeyAiaWQiOjEyMywibmFtZSI6IkpvaG4gRG9lIn0pOworCisKK0FQSSBjYWxsIGZvciB0aGUgYWJvdmUgdXBkYXRlIHN0YXRlbWVudCBpbiB0aGUgVVJMLWVuY29kZWQgZm9ybS4KKworW2h0dHA6Ly9sb2NhbGhvc3Q6MTkxMDEvdXBkYXRlP3N0YXRlbWVudHM9dXNlJTIwZGF0YXZlcnNlJTIwY29tcGFueTtpbnNlcnQlMjBpbnRvJTIwZGF0YXNldCUyMEVtcGxveWVlKHslMjAlMjJpZCUyMjoxMjMsJTIybmFtZSUyMjolMjJKb2huJTIwRG9lJTIyfSk7XQorCisjIyMjIFJlc3BvbnNlICMjIyMKKypIVFRQIE9LIDIwMCogYDxiciAvPmAKK2A8Tk8gUEFZTE9BRD5gIGA8YnIgLz5gCisKKyMjIFF1ZXJ5IEFQSSAjIworCisqRW5kIHBvaW50IGZvciBxdWVyeSBzdGF0ZW1lbnRzKgorCitFbmRwb2ludDogXy9xdWVyeV8KKworUGFyYW1ldGVyczoKKworfHwgUGFyYW1ldGVyIHx8IERlc2NyaXB0aW9uIHx8IFJlcXVpcmVkPyB8fAorfHwgcXVlcnkgICAgIHx8IFF1ZXJ5IHN0cmluZyB0byBwYXNzIHRvIEFTVEVSSVggZm9yIGV4ZWN1dGlvbiB8fCBZZXMgfHwKK3x8IG1vZGUgICAgICB8fCBJbmRpY2F0ZSBpZiBjYWxsIHNob3VsZCBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuIG1vZGUgPSBzeW5jaHJvbm91cyBibG9ja3MgdGhlIGNhbGwgdW50aWwgcmVzdWx0cyBhcmUgYXZhaWxhYmxlOyBtb2RlID0gYXN5bmNocm9ub3VzIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIGNoZWNrIHRoZSBxdWVyeeKAmXMgc3RhdHVzIGFuZCB0byBmZXRjaCByZXN1bHRzIHdoZW4gYXZhaWxhYmxlIHx8IE5vLiBkZWZhdWx0IG1vZGUgPSBzeW5jaHJvbm91cyB8fAorCitSZXN1bHQ6IFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSBKU09OIG9iamVjdCBhcyBmb2xsb3dzCisKKworICAgICAgICB7CisgICAgICAgICAgIHJlc3VsdHM6IDxyZXN1bHQgYXMgYSBzdHJpbmcsIGlmIG1vZGUgPSBzeW5jaHJvbm91cz4KKyAgICAgICAgICAgZXJyb3ItY29kZTogWzxjb2RlPiwgPG1lc3NhZ2U+XSAoaWYgYW4gZXJyb3Igb2NjdXJzKQorICAgICAgICAgICBoYW5kbGU6IDxvcGFxdWUgcmVzdWx0IGhhbmRsZSwgaWYgbW9kZSA9IGFzeW5jaHJvbm91cz4KKyAgICAgICAgfQorCisKKyMjIyBFeGFtcGxlICMjIworCisjIyMjIFNlbGVjdCBxdWVyeSB3aXRoIHN5bmNocm9ub3VzIHJlc3VsdCBkZWxpdmVyeSAjIyMjCisKKworICAgICAgICB1c2UgZGF0YXZlcnNlIGNvbXBhbnk7CisgICAgICAgIAorICAgICAgICBmb3IgJGwgaW4gZGF0YXNldCgnRW1wbG95ZWUnKSByZXR1cm4gJGw7CisKKworQVBJIGNhbGwgZm9yIHRoZSBhYm92ZSBxdWVyeSBzdGF0ZW1lbnQgaW4gdGhlIFVSTC1lbmNvZGVkIGZvcm0uCisKK1todHRwOi8vbG9jYWxob3N0OjE5MTAxL3F1ZXJ5P3F1ZXJ5PXVzZSUyMGRhdGF2ZXJzZSUyMGNvbXBhbnk7Zm9yJTIwJGwlMjBpbiUyMGRhdGFzZXQoJ0VtcGxveWVlJyklMjByZXR1cm4lMjAkbDtdCisKKyMjIyMgUmVzcG9uc2UgIyMjIworKkhUVFAgT0sgMjAwKiBgPGJyIC8+YAorUGF5bG9hZAorCisKKyAgICAgICAgeworICAgICAgICAgICJyZXN1bHRzIjogWworICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAieyAiaWQiOiAxMjMsICJuYW1lIjogIkpvaG4gRG9lIiB9IgorICAgICAgICAgICAgICBdCisgICAgICAgICAgXQorICAgICAgICB9CisKKworIyMjIyBTYW1lIHNlbGVjdCBxdWVyeSB3aXRoIGFzeW5jaHJvbm91cyByZXN1bHQgZGVsaXZlcnkgIyMjIworCitBUEkgY2FsbCBmb3IgdGhlIGFib3ZlIHF1ZXJ5IHN0YXRlbWVudCBpbiB0aGUgVVJMLWVuY29kZWQgZm9ybSB3aXRoIG1vZGU9YXN5bmNocm9ub3VzCisKK1todHRwOi8vbG9jYWxob3N0OjE5MTAxL3F1ZXJ5P3F1ZXJ5PXVzZStkYXRhdmVyc2UrY29tcGFueSUzQiUwQSUwQWZvcislMjRsK2luK2RhdGFzZXQlMjglMjdFbXBsb3llZSUyNyUyOStyZXR1cm4rJTI0bCUzQiUwQSZtb2RlPWFzeW5jaHJvbm91c10KKworIyMjIyBSZXNwb25zZSAjIyMjCisqSFRUUCBPSyAyMDAqIGA8YnIgLz5gCitQYXlsb2FkCisKKworICAgICAgICB7CisgICAgICAgICAgICAiaGFuZGxlIjogWzQ1LDBdCisgICAgICAgIH0KKworCisjIyBBc3luY2hyb25vdXMgUmVzdWx0IEFQSSAjIworCisqRW5kIHBvaW50IHRvIGZldGNoIHRoZSByZXN1bHRzIG9mIGFuIGFzeW5jaHJvbm91cyBxdWVyeSoKKworRW5kcG9pbnQ6IF8vcXVlcnkvcmVzdWx0XworCitQYXJhbWV0ZXJzOgorCit8fCBQYXJhbWV0ZXIgfHwgRGVzY3JpcHRpb24gfHwgUmVxdWlyZWQ/IHx8Cit8fCBoYW5kbGUgfHwgUmVzdWx0IGhhbmRsZSB0aGF0IHdhcyByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gYSAvcXVlcnkgY2FsbCB3aXRoIG1vZGUgPSBhc3luY2hyb25vdXMgfHwgWWVzIHx8CisKK1Jlc3VsdDogVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIEpTT04gb2JqZWN0IGFzIGZvbGxvd3M6CisKKworICAgICAgICB7CisgICAgICAgICAgIHJlc3VsdHM6IDxyZXN1bHQgYXMgYSBzdHJpbmcsIGlmIG1vZGUgPSBzeW5jaHJvbm91cywgb3IgbW9kZSA9IGFzeW5jaHJvbm91cyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlPgorICAgICAgICAgICBlcnJvci1jb2RlOiBbPGNvZGU+LCA8bWVzc2FnZT5dIChpZiBhbiBlcnJvciBvY2N1cnMpCisgICAgICAgIH0KKworCitJZiBtb2RlID0gYXN5bmNocm9ub3VzIGFuZCByZXN1bHRzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgcmV0dXJuZWQgSlNPTiBvYmplY3QgaXMgZW1wdHk6IHsgfQorCisjIyMgRXhhbXBsZSAjIyMKKworIyMjIyBGZXRjaGluZyByZXN1bHRzIGZvciBhc3luY2hyb25vdXMgcXVlcnkgIyMjIworCitXZSB1c2UgdGhlIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIHF1ZXJ5IHRvIGdldCB0aGUgcmVzdWx0cyBmb3IgdGhlIHF1ZXJ5LiBUaGUgaGFuZGxlIHJldHVybmVkIHdhczoKKworCisgICAgICAgIHsKKyAgICAgICAgICAgICJoYW5kbGUiOiBbNDUsMF0KKyAgICAgICAgfQorCisKK0FQSSBjYWxsIGZvciByZWFkaW5nIHJlc3VsdHMgZnJvbSB0aGUgcHJldmlvdXMgYXN5bmNocm9ub3VzIHF1ZXJ5IGluIHRoZSBVUkwtZW5jb2RlZCBmb3JtLgorCitbaHR0cDovL2xvY2FsaG9zdDoxOTEwMS9xdWVyeS9yZXN1bHQ/aGFuZGxlPSU3QiUyMmhhbmRsZSUyMiUzQSslNUI0NSUyQyswJTVEJTdEXQorCisjIyMjIFJlc3BvbnNlICMjIyMKKypIVFRQIE9LIDIwMCogYDxiciAvPmAKK1BheWxvYWQKKworCisgICAgICAgIHsKKyAgICAgICAgICAicmVzdWx0cyI6IFsKKyAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgInsgImlkIjogMTIzLCAibmFtZSI6ICJKb2huIERvZSIgfSIKKyAgICAgICAgICAgICAgXQorICAgICAgICAgIF0KKyAgICAgICAgfQorCisKKyMjIFF1ZXJ5IFN0YXR1cyBBUEkgIyMKKworKkVuZCBwb2ludCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBxdWVyeSBhc3luY2hyb25vdXMqCisKK0VuZHBvaW50OiBfL3F1ZXJ5L3N0YXR1c18KKworUGFyYW1ldGVyczoKKworfHwgUGFyYW1ldGVyIHx8IERlc2NyaXB0aW9uIHx8IFJlcXVpcmVkPyB8fAorfHwgaGFuZGxlIHx8IFJlc3VsdCBoYW5kbGUgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIGEgL3F1ZXJ5IGNhbGwgd2l0aCBtb2RlID0gYXN5bmNocm9ub3VzIHx8IFllcyB8fAorCitSZXN1bHQ6IFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSBKU09OIG9iamVjdCBhcyBmb2xsb3dzOgorCisKKyAgICAgICAgeworICAgICAgICAgICBzdGF0dXM6ICgiUlVOTklORyIgfCAiU1VDQ0VTUyIgfCAiRVJST1IiKQorICAgICAgICB9CisKKworCisjIyBFcnJvciBDb2RlcyAjIworCitUYWJsZSBvZiBlcnJvciBjb2RlcyBhbmQgdGhlaXIgdHlwZXM6CisKK3x8IENvZGUgfHwgVHlwZSB8fAorfHwgMSB8fCBJbnZhbGlkIHN0YXRlbWVudCB8fAorfHwgMiB8fCBQYXJzZSBmYWlsdXJlcyB8fAorfHwgOTkgfHwgVW5jYXRlZ29yaXplZCBlcnJvciB8fApkaWZmIC0tZ2l0IGEvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vQXN0ZXJpeERhdGFUeXBlcy5tZCBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhEYXRhVHlwZXMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkMGY3NQotLS0gL2Rldi9udWxsCisrKyBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhEYXRhVHlwZXMubWQKQEAgLTAsMCArMSwzMDkgQEAKKyNzdW1tYXJ5IEFzdGVyaXggRGF0YSBUeXBlcworCitgPHdpa2k6dG9jIG1heF9kZXB0aD0iNCIgLz5gCisKKyMgQXN0ZXJpeCBEYXRhIE1vZGVsIChBRE0pICMKKworIyBCYXNpYyBkYXRhIHR5cGVzICMKKworQW4gaW5zdGFuY2Ugb2YgQXN0ZXJpeCBkYXRhIG1vZGVsIChBRE0pIGNhbiBiZSBhIF9wcmltaXRpdmUgdHlwZV8gKGBJbnQzMmAsIGBJbnQ2NGAsIGBTdHJpbmdgLCBgRmxvYXRgLCBgRG91YmxlYCwgYERhdGVgLCBgVGltZWAsIGBEYXRldGltZWAsIGV0Yy4gb3IgYE5VTExgKSBvciBhIF9kZXJpdmVkIHR5cGVfLgorCisjIyBQcmltaXRpdmUgVHlwZXMgIyMKKworIyMjIEJvb2xlYW4gIyMjCitgQm9vbGVhbmAgZGF0YSB0eXBlIGNhbiBoYXZlIG9uZSBvZiB0aGUgdHdvIHZhbHVlczogXyp0cnVlKl8gb3IgXypmYWxzZSpfLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdCA6PSB0cnVlCisgICAgICAgIGxldCAkZiA6PSBmYWxzZQorICAgICAgICByZXR1cm4geyAidHJ1ZSI6ICR0LCAiZmFsc2UiOiAkZiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ0cnVlIjogdHJ1ZSwgImZhbHNlIjogZmFsc2UgfQorCisKKworIyMjIEludDggLyBJbnQxNiAvIEludDMyIC8gSW50NjQgIyMjCitJbnRlZ2VyIHR5cGVzIHVzaW5nIDgsIDE2LCAzMiwgb3IgNjQgYml0cy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHY4IDo9IGludDgoIjEyNSIpCisgICAgICAgIGxldCAkdjE2IDo9IGludDE2KCIzMjc2NSIpCisgICAgICAgIGxldCAkdjMyIDo9IDI5NDk2NzI5NQorICAgICAgICBsZXQgJHY2NCA6PSBpbnQ2NCgiMTcwMDAwMDAwMDAwMDAwMDAwMCIpCisgICAgICAgIHJldHVybiB7ICJpbnQ4IjogJHY4LCAiaW50MTYiOiAkdjE2LCAiaW50MzIiOiAkdjMyLCAiaW50NjQiOiAkdjY0fQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiaW50OCI6IDEyNWk4LCAiaW50MTYiOiAzMjc2NWkxNiwgImludDMyIjogMjk0OTY3Mjk1LCAiaW50NjQiOiAxNzAwMDAwMDAwMDAwMDAwMDAwaTY0IH0KKworCitgPHdpa2k6Y29tbWVudD5gCisjIyMgVUludDggLyBVSW50MTYgLyBVSW50MzIgLyBVSW50NjQgIyMjCitVbnNpZ25lZCBpbnRlZ2VyIHR5cGVzIHVzaW5nIDgsIDE2LCAzMiwgb3IgNjQgYml0cy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHY4IDo9IHVpbnQ4KCIxMjUiKQorICAgICAgICBsZXQgJHYxNiA6PSB1aW50MTYoIjMyNzY1IikKKyAgICAgICAgbGV0ICR2MzIgOj0gdWludDMyKCI0Mjk0OTY3Mjk1IikKKyAgICAgICAgbGV0ICR2NjQgOj0gdWludDY0KCIxNzAwMDAwMDAwMDAwMDAwMDAwIikKKyAgICAgICAgcmV0dXJuIHsgImludDgiOiAkdjgsICJpbnQxNiI6ICR2MTYsICJpbnQzMiI6ICR2MzIsICJpbnQ2NCI6ICR2NjR9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJpbnQ4IjogMTI1aTgsICJpbnQxNiI6IDMyNzY1aTE2LCAiaW50MzIiOiA0Mjk0OTY3Mjk1aTY0LCAiaW50NjQiOiAxNzAwMDAwMDAwMDAwMDAwMDAwaTY0IH0KKworYDwvd2lraTpjb21tZW50PmAKKworIyMjIEZsb2F0ICMjIworYEZsb2F0YCByZXByZXNlbnRzIGFwcHJveGltYXRlIG51bWVyaWMgZGF0YSB2YWx1ZXMgdXNpbmcgNCBieXRlcy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGZsb2F0KCJOYU4iKQorICAgICAgICBsZXQgJHYyIDo9IGZsb2F0KCJJTkYiKQorICAgICAgICBsZXQgJHYzIDo9IGZsb2F0KCItSU5GIikKKyAgICAgICAgbGV0ICR2NCA6PSBmbG9hdCgiLTIwMTMuNSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMsICJ2NCI6ICR2NCB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IE5hTmYsICJ2MiI6IEluZmluaXR5ZiwgInYzIjogLUluZmluaXR5ZiwgInY0IjogLTIwMTMuNWYgfQorCisKKyMjIyBEb3VibGUgIyMjCitgRG91YmxlYCByZXByZXNlbnRzIGFwcHJveGltYXRlIG51bWVyaWMgZGF0YSB2YWx1ZXMgdXNpbmcgOCBieXRlcy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGRvdWJsZSgiTmFOIikKKyAgICAgICAgbGV0ICR2MiA6PSBkb3VibGUoIklORiIpCisgICAgICAgIGxldCAkdjMgOj0gZG91YmxlKCItSU5GIikKKyAgICAgICAgbGV0ICR2NCA6PSBkb3VibGUoIi0yMDEzLjU5MzgyMzc0ODMyNzI4NCIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMsICJ2NCI6ICR2NCB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IE5hTmQsICJ2MiI6IEluZmluaXR5ZCwgInYzIjogLUluZmluaXR5ZCwgInY0IjogLTIwMTMuNTkzODIzNzQ4MzI3NGQgfQorCisKKyMjIyBTdHJpbmcgIyMjCitgU3RyaW5nYCByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHN0cmluZygiVGhpcyBpcyBhIHN0cmluZy4iKQorICAgICAgICBsZXQgJHYyIDo9IHN0cmluZygiXCJUaGlzIGlzIGEgcXVvdGVkIHN0cmluZ1wiIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiAiVGhpcyBpcyBhIHN0cmluZy4iLCAidjIiOiAiXCJUaGlzIGlzIGEgcXVvdGVkIHN0cmluZ1wiIiB9CisKKworIyMjIFBvaW50ICMjIworYFBvaW50YCBpcyB0aGUgZnVuZGFtZW50YWwgdHdvLWRpbWVuc2lvbmFsIGJ1aWxkaW5nIGJsb2NrIGZvciBzcGF0aWFsIHR5cGVzLiBJdCBjb25zaXN0cyBvZiB0d28gYGRvdWJsZWAgY29vcmRpbmF0ZXMgeCBhbmQgeS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHBvaW50KCI4MC4xMGQsIC0xMEU1IikKKyAgICAgICAgbGV0ICR2MiA6PSBwb2ludCgiNS4xMEUtMTBkLCAtMTBFNSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogcG9pbnQoIjgwLjEsLTEwMDAwMDAuMCIpLCAidjIiOiBwb2ludCgiNS4xRS0xMCwtMTAwMDAwMC4wIikgfQorCisKKyMjIyBMaW5lICMjIworYExpbmVgIGNvbnNpc3RzIG9mIHR3byBwb2ludHMgdGhhdCByZXByZXNlbnQgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHBvaW50cyBvZiBhIGxpbmUgc2VnbWVudC4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGxpbmUoIjEwLjEyMzQsMTEuMWUtMSArMTAuMkUtMiwtMTEuMjIiKQorICAgICAgICBsZXQgJHYyIDo9IGxpbmUoIjAuMTIzNCwtMS4wMGUtMTAgKzEwLjVFLTIsLTAxLjAyIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBsaW5lKCIxMC4xMjM0LDEuMTEgMC4xMDIsLTExLjIyIiksICJ2MiI6IGxpbmUoIjAuMTIzNCwtMS4wRS0xMCAwLjEwNSwtMS4wMiIpIH0KKworCisjIyMgUmVjdGFuZ2xlICMjIworYFJlY3RhbmdsZWAgY29uc2lzdHMgb2YgdHdvIHBvaW50cyB0aGF0IHJlcHJlc2VudCB0aGUgXypib3R0b20gbGVmdCpfIGFuZCBfKnVwcGVyIHJpZ2h0Kl8gY29ybmVycyBvZiBhIHJlY3RhbmdsZS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHJlY3RhbmdsZSgiNS4xLDExLjggODcuNiwxNS42NTQ4IikKKyAgICAgICAgbGV0ICR2MiA6PSByZWN0YW5nbGUoIjAuMTIzNCwtMS4wMGUtMTAgNS41NDg3LDAuNDg3NjUiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IHJlY3RhbmdsZSgiNS4xLDExLjggODcuNiwxNS42NTQ4IiksICJ2MiI6IHJlY3RhbmdsZSgiMC4xMjM0LC0xLjBFLTEwIDUuNTQ4NywwLjQ4NzY1IikgfQorCisKKyMjIyBDaXJjbGUgIyMjCitgQ2lyY2xlYCBjb25zaXN0cyBvZiBvbmUgYHBvaW50YCB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIGFuZCBhIHJhZGl1cyBvZiB0eXBlIGBkb3VibGVgLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdjEgOj0gY2lyY2xlKCIxMC4xMjM0LDExLjFlLTEgKzEwLjJFLTIiKQorICAgICAgICBsZXQgJHYyIDo9IGNpcmNsZSgiMC4xMjM0LC0xLjAwZS0xMCArMTAuNUUtMiIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogY2lyY2xlKCIxMC4xMjM0LDEuMTEgMC4xMDIiKSwgInYyIjogY2lyY2xlKCIwLjEyMzQsLTEuMEUtMTAgMC4xMDUiKSB9CisKKworIyMjIFBvbHlnb24gIyMjCitgUG9seWdvbmAgY29uc2lzdHMgb2YgXypuKl8gcG9pbnRzIHRoYXQgcmVwcmVzZW50IHRoZSB2ZXJ0aWNlcyBvZiBhIF8qc2ltcGxlIGNsb3NlZCpfIHBvbHlnb24uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBwb2x5Z29uKCItMS4yLCsxLjNlMiAtMi4xNEUrNSwyLjE1IC0zLjVlKzIsMDMuNiAtNC42RS0zLCs0LjgxIikKKyAgICAgICAgbGV0ICR2MiA6PSBwb2x5Z29uKCItMS4wLCsxMC41ZTIgLTAyLjE1RSs1MCwyLjUgLTEuMCwrMy4zZTMgLTIuNTBFKzA1LDIwLjE1ICszLjVlKzIsMDMuNiAtNC42MEUtMywrNC43NSAtMiwrMS4wZTIgLTIuMDBFKzUsMjAuMTAgMzAuNSwwMy4yNSAtNC4zM0UtMywrNC43NSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogcG9seWdvbigiLTEuMiwxMzAuMCAtMjE0MDAwLjAsMi4xNSAtMzUwLjAsMy42IC0wLjAwNDYsNC44MSIpLCAidjIiOiBwb2x5Z29uKCItMS4wLDEwNTAuMCAtMi4xNUU1MCwyLjUgLTEuMCwzMzAwLjAgLTI1MDAwMC4wLDIwLjE1IDM1MC4wLDMuNiAtMC4wMDQ2LDQuNzUgLTIuMCwxMDAuMCAtMjAwMDAwLjAsMjAuMSAzMC41LDMuMjUgLTAuMDA0MzMsNC43NSIpIH0KKworCisjIyMgRGF0ZSAjIyMKK2BEYXRlYCByZXByZXNlbnRzIGEgdGltZSBwb2ludCBhbG9uZyB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHN5c3RlbSBzcGVjaWZpZWQgYnkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkuIEFTVEVSSVggc3VwcG9ydHMgdGhlIGRhdGUgZnJvbSBgLTk5OTktMDEtMDFgIHRvIGA5OTk5LTEyLTMxYC4KKworQSBkYXRlIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCBpbiB0d28gZm9ybWF0cywgZXh0ZW5kZWQgZm9ybWF0IGFuZCBiYXNpYyBmb3JtYXQuCisKKyAqIEV4dGVuZGVkIGZvcm1hdCBpcyByZXByZXNlbnRlZCBhcyBgWy1deXl5eS1tbS1kZGAgZm9yIGB5ZWFyLW1vbnRoLWRheWAuIEVhY2ggZmllbGQgc2hvdWxkIGJlIHBhZGRlZCBpZiB0aGVyZSBhcmUgbGVzcyBkaWdpdHMgdGhhbiB0aGUgZm9ybWF0IHNwZWNpZmllZC4KKyAqIEJhc2ljIGZvcm1hdCBpcyBpbiB0aGUgZm9ybWF0IG9mIGBbLV15eXl5bW1kZGAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBkYXRlKCIyMDEzLTAxLTAxIikKKyAgICAgICAgbGV0ICR2MiA6PSBkYXRlKCItMTk3MDAxMDEiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IGRhdGUoIjIwMTMtMDEtMDEiKSwgInYyIjogZGF0ZSgiLTE5NzAtMDEtMDEiKSB9CisKKworIyMjIFRpbWUgIyMjCitgVGltZWAgdHlwZSBkZXNjcmliZXMgdGhlIHRpbWUgd2l0aGluIHRoZSByYW5nZSBvZiBhIGRheS4gSXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhyZWUgZmllbGRzOiBob3VyLCBtaW51dGUgYW5kIHNlY29uZC4gTWlsbGlzZWNvbmQgZmllbGQgaXMgb3B0aW9uYWwgYXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBzZWNvbmQgZmllbGQuIEl0cyBleHRlbmRlZCBmb3JtYXQgaXMgYXMgYGhoOm1tOnNzWy5tbW1dYCBhbmQgdGhlIGJhc2ljIGZvcm1hdCBpcyBgaGhtbXNzW21tbV1gLiBUaGUgdmFsdWUgZG9tYWluIGlzIGZyb20gYDAwOjAwOjAwLjAwMGAgdG8gYDIzOjU5OjU5Ljk5OWAuCisKK1RpbWV6b25lIGZpZWxkIGlzIG9wdGlvbmFsIGZvciBhIHRpbWUgdmFsdWUuIFRpbWV6b25lIGlzIHJlcHJlc2VudGVkIGFzIGBbK3wtXWhoOm1tYCBmb3IgZXh0ZW5kZWQgZm9ybWF0IG9yIGBbK3wtXWhobW1gIGZvciBiYXNpYyBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgc2lnbiBkZXNpZ25hdG9ycyBjYW5ub3QgYmUgb21pdHRlZC4gYFpgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBVVEMgbG9jYWwgdGltZS4gSWYgbm8gdGltZXpvbmUgaW5mb3JtYXRpb24gaXMgZ2l2ZW4sIGl0IGlzIFVUQyBieSBkZWZhdWx0LgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdjEgOj0gdGltZSgiMTI6MTI6MTIuMDM5WiIpCisgICAgICAgIGxldCAkdjIgOj0gdGltZSgiMDAwMDAwMDAwLTA4MDAiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IHRpbWUoIjEyOjEyOjEyLjAzOVoiKSwgInYyIjogdGltZSgiMDg6MDA6MDAuMDAwWiIpIH0KKworCisjIyMgRGF0ZXRpbWUgIyMjCitBIGBEYXRldGltZWAgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBgRGF0ZWAgYW5kIGBUaW1lYCwgcmVwcmVzZW50aW5nIGEgZml4ZWQgdGltZSBwb2ludCBhbG9uZyB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHN5c3RlbS4gVGhlIHZhbHVlIGlzIGFtb25nIGAtOTk5OS0wMS0wMSAwMDowMDowMC4wMDBgIGFuZCBgOTk5OS0xMi0zMSAyMzo1OTo1OS45OTlgLgorCitBIGBEYXRldGltZWAgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgaXRzIGBEYXRlYCBwYXJ0IGFuZCBgVGltZWAgcGFydCwgc2VwYXJhdGVkIGJ5IGEgc2VwYXJhdG9yIGBUYC4gRWl0aGVyIGV4dGVuZGVkIG9yIGJhc2ljIGZvcm1hdCBjYW4gYmUgdXNlZCwgYW5kIHRoZSB0d28gcGFydHMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvcm1hdC4KKworTWlsbGlzZWNvbmQgZmllbGQgYW5kIHRpbWV6b25lIGZpZWxkIGFyZSBvcHRpb25hbCwgYXMgc3BlY2lmaWVkIGluIHRoZSBgVGltZWAgdHlwZS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGRhdGV0aW1lKCIyMDEzLTAxLTAxVDEyOjEyOjEyLjAzOVoiKQorICAgICAgICBsZXQgJHYyIDo9IGRhdGV0aW1lKCItMTk3MDAxMDFUMDAwMDAwMDAwLTA4MDAiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IGRhdGV0aW1lKCIyMDEzLTAxLTAxVDEyOjEyOjEyLjAzOVoiKSwgInYyIjogZGF0ZXRpbWUoIi0xOTcwLTAxLTAxVDA4OjAwOjAwLjAwMFoiKSB9CisKKworIyMjIER1cmF0aW9uICMjIworYER1cmF0aW9uYCByZXByZXNlbnRzIGEgZHVyYXRpb24gb2YgdGltZS4gQSBkdXJhdGlvbiB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgaW50ZWdlcnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgYW5kIG1pbGxpc2Vjb25kLgorCitBIGR1cmF0aW9uIHZhbHVlIGlzIGluIHRoZSBmb3JtYXQgb2YgYFstXVBuWW5NbkRUbkhuTW4ubW1tU2AuIFRoZSBtaWxsaXNlY29uZCBwYXJ0IChhcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHNlY29uZCBmaWVsZCkgaXMgb3B0aW9uYWwsIGFuZCB3aGVuIG5vIG1pbGxpc2Vjb25kIGZpZWxkIGlzIHVzZWQsIHRoZSBkZWNpbWFsIHBvaW50IHNob3VsZCBhbHNvIGJlIGFic2VudC4KKworTmVnYXRpdmUgZHVyYXRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZCBmb3IgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBiZXR3ZWVuIHRpbWUgaW5zdGFuY2UgdHlwZXMgKGBEYXRlYCwgYFRpbWVgIGFuZCBgRGF0ZXRpbWVgKSwgYW5kIGlzIHVzZWQgdG8gcm9sbCB0aGUgdGltZSBiYWNrIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb24uIEZvciBleGFtcGxlIGBkYXRlKCIyMDEyLTAxLTAxIikgKyBkdXJhdGlvbigiLVAzRCIpYCB3aWxsIHJldHVybiBgZGF0ZSgiMjAxMS0xMi0yOSIpYC4KKworTm90ZSB0aGF0IGEgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkdXJhdGlvbiBpcyBhbHdheXMgcmV0dXJuZWQsIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgZHVyYXRpb24gaXMgaW4gdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvciBub3QgZnJvbSB0aGUgdXNlcidzIGlucHV0LiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBjYW4gYmUgZm91bmQgZnJvbSBbaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgtZnVuY3Rpb25zLyNjYW5vbmljYWwtZGF5VGltZUR1cmF0aW9uIFhQYXRoIGRheVRpbWVEdXJhdGlvbiBDYW5vbmljYWwgUmVwcmVzZW50YXRpb25dIGFuZCBbaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgtZnVuY3Rpb25zLyNjYW5vbmljYWwteWVhck1vbnRoRHVyYXRpb24geWVhck1vbnRoRHVyYXRpb24gQ2Fub25pY2FsIFJlcHJlc2VudGF0aW9uXS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGR1cmF0aW9uKCJQMTAwWTEyTVQxMk0iKQorICAgICAgICBsZXQgJHYyIDo9IGR1cmF0aW9uKCItUFQyMC45NDNTIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBkdXJhdGlvbigiUDEwMVlUMTJNIiksICJ2MiI6IGR1cmF0aW9uKCItUFQyMC45NDNTIikgfQorCisKKyMjIyBJbnRlcnZhbCAjIyMKK2BJbnRlcnZhbGAgcmVwcmVzZW50cyBpbmNsdXNpdmUtZXhjbHVzaXZlIHJhbmdlcyBvZiB0aW1lLiBJdCBpcyBkZWZpbmVkIGJ5IHR3byB0aW1lIHBvaW50IHZhbHVlcyB3aXRoIHRoZSBzYW1lIHRlbXBvcmFsIHR5cGUoYERhdGVgLCBgVGltZWAgb3IgYERhdGV0aW1lYCkuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBpbnRlcnZhbC1mcm9tLWRhdGUoZGF0ZSgiMjAxMy0wMS0wMSIpLCBkYXRlKCIyMDEzMDUwNSIpKQorICAgICAgICBsZXQgJHYyIDo9IGludGVydmFsLWZyb20tdGltZSh0aW1lKCIwMDowMTowMSIpLCB0aW1lKCIyMTM5MDEwNDkrMDgwMCIpKQorICAgICAgICBsZXQgJHYzIDo9IGludGVydmFsLWZyb20tZGF0ZXRpbWUoZGF0ZXRpbWUoIjIwMTMtMDEtMDFUMDA6MDE6MDEiKSwgZGF0ZXRpbWUoIjIwMTMwNTA1VDIxMzkwMTA0OSswODAwIikpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBpbnRlcnZhbC1kYXRlKCIyMDEzLTAxLTAxLCAyMDEzLTA1LTA1IiksICJ2MiI6IGludGVydmFsLXRpbWUoIjAwOjAxOjAxLjAwMFosIDEzOjM5OjAxLjA0OVoiKSwgInYzIjogaW50ZXJ2YWwtZGF0ZXRpbWUoIjIwMTMtMDEtMDFUMDA6MDE6MDEuMDAwWiwgMjAxMy0wNS0wNVQxMzozOTowMS4wNDlaIikgfQorCisKKyMjIERlcml2ZWQgVHlwZXMgIyMKKworIyMjIFJlY29yZCAjIyMKK0EgYFJlY29yZGAgY29udGFpbnMgYSBzZXQgb2Yg76yBZWxkcywgd2hlcmUgZWFjaCDvrIFlbGQgaXMgZGVzY3JpYmVkIGJ5IGl0cyBuYW1lIGFuZCB0eXBlLiBBIHJlY29yZCB0eXBlIGlzIGVpdGhlciBvcGVuIG9yIGNsb3NlZC4gT3BlbiByZWNvcmRzIGNhbiBjb250YWluIO+sgWVsZHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHR5cGUgZGXvrIFuaXRpb24sIHdoaWxlIGNsb3NlZCByZWNvcmRzIGNhbm5vdC4gU3ludGFjdGljYWxseSwgcmVjb3JkIGNvbnN0cnVjdG9ycyBhcmUgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMgInsuLi59Ii4KKworQW4gZXhhbXBsZSB3b3VsZCBiZQorCisKKyAgICAgICAgeyAiaWQiOiAyMTM1MDgsICJuYW1lIjogIkFsaWNlIEJvYiIgfQorCisKKyMjIyAhT3JkZXJlZExpc3QgIyMjCitBbiBgT3JkZXJlZExpc3RgIGlzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIGZvciB3aGljaCB0aGUgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieSBjcmVhdGlvbiBvciBpbnNlcnRpb24uIE9yZGVyZWRMaXN0IGNvbnN0cnVjdG9ycyBhcmUgZGVub3RlZCBieSBicmFja2V0czogIlsuLi5dIi4KKworQW4gZXhhbXBsZSB3b3VsZCBiZQorCisKKyAgICAgICAgWyJhbGljZSIsIDEyMywgImJvYiIsIG51bGxdCisKKworIyMjICFVbm9yZGVyZWRMaXN0ICMjIworQW4gYFVub3JkZXJlZExpc3RgIGlzIGFuIHVub3JkZXJlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMsIHNpbWlsYXIgdG8gYmFncyBpbiBTUUwuIFVub3JkZXJlZExpc3QgY29uc3RydWN0b3JzIGFyZSBkZW5vdGVkIGJ5IHR3byBvcGVuaW5nIGZsb3dlciBicmFjZXMgZm9sbG93ZWQgYnkgZGF0YSBhbmQgdHdvIGNsb3NpbmcgZmxvd2VyIGJyYWNlcywgbGlrZSAie3suLi59fSIuCisKK0FuIGV4YW1wbGUgd291bGQgYmUKKworCisgICAgICAgIHt7ImhlbGxvIiwgOTMyOCwgIndvcmxkIiwgWzEsIDIsIG51bGxdfX0KKwpkaWZmIC0tZ2l0IGEvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vQXN0ZXJpeERhdGFUeXBlc0FuZEZ1bmN0aW9ucy5tZCBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhEYXRhVHlwZXNBbmRGdW5jdGlvbnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkNGRkNgotLS0gL2Rldi9udWxsCisrKyBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhEYXRhVHlwZXNBbmRGdW5jdGlvbnMubWQKQEAgLTAsMCArMSwyMjIwIEBACisjc3VtbWFyeSBBc3Rlcml4IERhdGEgVHlwZXMgYW5kIEZ1bmN0aW9ucworCitgPHdpa2k6dG9jIG1heF9kZXB0aD0iNCIgLz5gCisKKyMgQXN0ZXJpeCBEYXRhIE1vZGVsIChBRE0pICMKKworIyBCYXNpYyBkYXRhIHR5cGVzICMKKworQW4gaW5zdGFuY2Ugb2YgQXN0ZXJpeCBkYXRhIG1vZGVsIChBRE0pIGNhbiBiZSBhIF9wcmltaXRpdmUgdHlwZV8gKGBJbnQzMmAsIGBJbnQ2NGAsIGBTdHJpbmdgLCBgRmxvYXRgLCBgRG91YmxlYCwgYERhdGVgLCBgVGltZWAsIGBEYXRldGltZWAsIGV0Yy4gb3IgYE5VTExgKSBvciBhIF9kZXJpdmVkIHR5cGVfLgorCisjIyBQcmltaXRpdmUgVHlwZXMgIyMKKworIyMjIEJvb2xlYW4gIyMjCitgQm9vbGVhbmAgZGF0YSB0eXBlIGNhbiBoYXZlIG9uZSBvZiB0aGUgdHdvIHZhbHVlczogXyp0cnVlKl8gb3IgXypmYWxzZSpfLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdCA6PSB0cnVlCisgICAgICAgIGxldCAkZiA6PSBmYWxzZQorICAgICAgICByZXR1cm4geyAidHJ1ZSI6ICR0LCAiZmFsc2UiOiAkZiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ0cnVlIjogdHJ1ZSwgImZhbHNlIjogZmFsc2UgfQorCisKKworIyMjIEludDggLyBJbnQxNiAvIEludDMyIC8gSW50NjQgIyMjCitJbnRlZ2VyIHR5cGVzIHVzaW5nIDgsIDE2LCAzMiwgb3IgNjQgYml0cy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHY4IDo9IGludDgoIjEyNSIpCisgICAgICAgIGxldCAkdjE2IDo9IGludDE2KCIzMjc2NSIpCisgICAgICAgIGxldCAkdjMyIDo9IDI5NDk2NzI5NQorICAgICAgICBsZXQgJHY2NCA6PSBpbnQ2NCgiMTcwMDAwMDAwMDAwMDAwMDAwMCIpCisgICAgICAgIHJldHVybiB7ICJpbnQ4IjogJHY4LCAiaW50MTYiOiAkdjE2LCAiaW50MzIiOiAkdjMyLCAiaW50NjQiOiAkdjY0fQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiaW50OCI6IDEyNWk4LCAiaW50MTYiOiAzMjc2NWkxNiwgImludDMyIjogMjk0OTY3Mjk1LCAiaW50NjQiOiAxNzAwMDAwMDAwMDAwMDAwMDAwaTY0IH0KKworCitgPHdpa2k6Y29tbWVudD5gCisjIyMgVUludDggLyBVSW50MTYgLyBVSW50MzIgLyBVSW50NjQgIyMjCitVbnNpZ25lZCBpbnRlZ2VyIHR5cGVzIHVzaW5nIDgsIDE2LCAzMiwgb3IgNjQgYml0cy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHY4IDo9IHVpbnQ4KCIxMjUiKQorICAgICAgICBsZXQgJHYxNiA6PSB1aW50MTYoIjMyNzY1IikKKyAgICAgICAgbGV0ICR2MzIgOj0gdWludDMyKCI0Mjk0OTY3Mjk1IikKKyAgICAgICAgbGV0ICR2NjQgOj0gdWludDY0KCIxNzAwMDAwMDAwMDAwMDAwMDAwIikKKyAgICAgICAgcmV0dXJuIHsgImludDgiOiAkdjgsICJpbnQxNiI6ICR2MTYsICJpbnQzMiI6ICR2MzIsICJpbnQ2NCI6ICR2NjR9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJpbnQ4IjogMTI1aTgsICJpbnQxNiI6IDMyNzY1aTE2LCAiaW50MzIiOiA0Mjk0OTY3Mjk1aTY0LCAiaW50NjQiOiAxNzAwMDAwMDAwMDAwMDAwMDAwaTY0IH0KKworYDwvd2lraTpjb21tZW50PmAKKworIyMjIEZsb2F0ICMjIworYEZsb2F0YCByZXByZXNlbnRzIGFwcHJveGltYXRlIG51bWVyaWMgZGF0YSB2YWx1ZXMgdXNpbmcgNCBieXRlcy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGZsb2F0KCJOYU4iKQorICAgICAgICBsZXQgJHYyIDo9IGZsb2F0KCJJTkYiKQorICAgICAgICBsZXQgJHYzIDo9IGZsb2F0KCItSU5GIikKKyAgICAgICAgbGV0ICR2NCA6PSBmbG9hdCgiLTIwMTMuNSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMsICJ2NCI6ICR2NCB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IE5hTmYsICJ2MiI6IEluZmluaXR5ZiwgInYzIjogLUluZmluaXR5ZiwgInY0IjogLTIwMTMuNWYgfQorCisKKyMjIyBEb3VibGUgIyMjCitgRG91YmxlYCByZXByZXNlbnRzIGFwcHJveGltYXRlIG51bWVyaWMgZGF0YSB2YWx1ZXMgdXNpbmcgOCBieXRlcy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGRvdWJsZSgiTmFOIikKKyAgICAgICAgbGV0ICR2MiA6PSBkb3VibGUoIklORiIpCisgICAgICAgIGxldCAkdjMgOj0gZG91YmxlKCItSU5GIikKKyAgICAgICAgbGV0ICR2NCA6PSBkb3VibGUoIi0yMDEzLjU5MzgyMzc0ODMyNzI4NCIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMsICJ2NCI6ICR2NCB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IE5hTmQsICJ2MiI6IEluZmluaXR5ZCwgInYzIjogLUluZmluaXR5ZCwgInY0IjogLTIwMTMuNTkzODIzNzQ4MzI3NGQgfQorCisKKyMjIyBTdHJpbmcgIyMjCitgU3RyaW5nYCByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHN0cmluZygiVGhpcyBpcyBhIHN0cmluZy4iKQorICAgICAgICBsZXQgJHYyIDo9IHN0cmluZygiXCJUaGlzIGlzIGEgcXVvdGVkIHN0cmluZ1wiIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiAiVGhpcyBpcyBhIHN0cmluZy4iLCAidjIiOiAiXCJUaGlzIGlzIGEgcXVvdGVkIHN0cmluZ1wiIiB9CisKKworIyMjIFBvaW50ICMjIworYFBvaW50YCBpcyB0aGUgZnVuZGFtZW50YWwgdHdvLWRpbWVuc2lvbmFsIGJ1aWxkaW5nIGJsb2NrIGZvciBzcGF0aWFsIHR5cGVzLiBJdCBjb25zaXN0cyBvZiB0d28gYGRvdWJsZWAgY29vcmRpbmF0ZXMgeCBhbmQgeS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHBvaW50KCI4MC4xMGQsIC0xMEU1IikKKyAgICAgICAgbGV0ICR2MiA6PSBwb2ludCgiNS4xMEUtMTBkLCAtMTBFNSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogcG9pbnQoIjgwLjEsLTEwMDAwMDAuMCIpLCAidjIiOiBwb2ludCgiNS4xRS0xMCwtMTAwMDAwMC4wIikgfQorCisKKyMjIyBMaW5lICMjIworYExpbmVgIGNvbnNpc3RzIG9mIHR3byBwb2ludHMgdGhhdCByZXByZXNlbnQgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHBvaW50cyBvZiBhIGxpbmUgc2VnbWVudC4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGxpbmUoIjEwLjEyMzQsMTEuMWUtMSArMTAuMkUtMiwtMTEuMjIiKQorICAgICAgICBsZXQgJHYyIDo9IGxpbmUoIjAuMTIzNCwtMS4wMGUtMTAgKzEwLjVFLTIsLTAxLjAyIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBsaW5lKCIxMC4xMjM0LDEuMTEgMC4xMDIsLTExLjIyIiksICJ2MiI6IGxpbmUoIjAuMTIzNCwtMS4wRS0xMCAwLjEwNSwtMS4wMiIpIH0KKworCisjIyMgUmVjdGFuZ2xlICMjIworYFJlY3RhbmdsZWAgY29uc2lzdHMgb2YgdHdvIHBvaW50cyB0aGF0IHJlcHJlc2VudCB0aGUgXypib3R0b20gbGVmdCpfIGFuZCBfKnVwcGVyIHJpZ2h0Kl8gY29ybmVycyBvZiBhIHJlY3RhbmdsZS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IHJlY3RhbmdsZSgiNS4xLDExLjggODcuNiwxNS42NTQ4IikKKyAgICAgICAgbGV0ICR2MiA6PSByZWN0YW5nbGUoIjAuMTIzNCwtMS4wMGUtMTAgNS41NDg3LDAuNDg3NjUiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IHJlY3RhbmdsZSgiNS4xLDExLjggODcuNiwxNS42NTQ4IiksICJ2MiI6IHJlY3RhbmdsZSgiMC4xMjM0LC0xLjBFLTEwIDUuNTQ4NywwLjQ4NzY1IikgfQorCisKKyMjIyBDaXJjbGUgIyMjCitgQ2lyY2xlYCBjb25zaXN0cyBvZiBvbmUgYHBvaW50YCB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIGFuZCBhIHJhZGl1cyBvZiB0eXBlIGBkb3VibGVgLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdjEgOj0gY2lyY2xlKCIxMC4xMjM0LDExLjFlLTEgKzEwLjJFLTIiKQorICAgICAgICBsZXQgJHYyIDo9IGNpcmNsZSgiMC4xMjM0LC0xLjAwZS0xMCArMTAuNUUtMiIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogY2lyY2xlKCIxMC4xMjM0LDEuMTEgMC4xMDIiKSwgInYyIjogY2lyY2xlKCIwLjEyMzQsLTEuMEUtMTAgMC4xMDUiKSB9CisKKworIyMjIFBvbHlnb24gIyMjCitgUG9seWdvbmAgY29uc2lzdHMgb2YgXypuKl8gcG9pbnRzIHRoYXQgcmVwcmVzZW50IHRoZSB2ZXJ0aWNlcyBvZiBhIF8qc2ltcGxlIGNsb3NlZCpfIHBvbHlnb24uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBwb2x5Z29uKCItMS4yLCsxLjNlMiAtMi4xNEUrNSwyLjE1IC0zLjVlKzIsMDMuNiAtNC42RS0zLCs0LjgxIikKKyAgICAgICAgbGV0ICR2MiA6PSBwb2x5Z29uKCItMS4wLCsxMC41ZTIgLTAyLjE1RSs1MCwyLjUgLTEuMCwrMy4zZTMgLTIuNTBFKzA1LDIwLjE1ICszLjVlKzIsMDMuNiAtNC42MEUtMywrNC43NSAtMiwrMS4wZTIgLTIuMDBFKzUsMjAuMTAgMzAuNSwwMy4yNSAtNC4zM0UtMywrNC43NSIpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInYxIjogcG9seWdvbigiLTEuMiwxMzAuMCAtMjE0MDAwLjAsMi4xNSAtMzUwLjAsMy42IC0wLjAwNDYsNC44MSIpLCAidjIiOiBwb2x5Z29uKCItMS4wLDEwNTAuMCAtMi4xNUU1MCwyLjUgLTEuMCwzMzAwLjAgLTI1MDAwMC4wLDIwLjE1IDM1MC4wLDMuNiAtMC4wMDQ2LDQuNzUgLTIuMCwxMDAuMCAtMjAwMDAwLjAsMjAuMSAzMC41LDMuMjUgLTAuMDA0MzMsNC43NSIpIH0KKworCisjIyMgRGF0ZSAjIyMKK2BEYXRlYCByZXByZXNlbnRzIGEgdGltZSBwb2ludCBhbG9uZyB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHN5c3RlbSBzcGVjaWZpZWQgYnkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkuIEFTVEVSSVggc3VwcG9ydHMgdGhlIGRhdGUgZnJvbSBgLTk5OTktMDEtMDFgIHRvIGA5OTk5LTEyLTMxYC4KKworQSBkYXRlIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCBpbiB0d28gZm9ybWF0cywgZXh0ZW5kZWQgZm9ybWF0IGFuZCBiYXNpYyBmb3JtYXQuCisKKyAqIEV4dGVuZGVkIGZvcm1hdCBpcyByZXByZXNlbnRlZCBhcyBgWy1deXl5eS1tbS1kZGAgZm9yIGB5ZWFyLW1vbnRoLWRheWAuIEVhY2ggZmllbGQgc2hvdWxkIGJlIHBhZGRlZCBpZiB0aGVyZSBhcmUgbGVzcyBkaWdpdHMgdGhhbiB0aGUgZm9ybWF0IHNwZWNpZmllZC4KKyAqIEJhc2ljIGZvcm1hdCBpcyBpbiB0aGUgZm9ybWF0IG9mIGBbLV15eXl5bW1kZGAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBkYXRlKCIyMDEzLTAxLTAxIikKKyAgICAgICAgbGV0ICR2MiA6PSBkYXRlKCItMTk3MDAxMDEiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IGRhdGUoIjIwMTMtMDEtMDEiKSwgInYyIjogZGF0ZSgiLTE5NzAtMDEtMDEiKSB9CisKKworIyMjIFRpbWUgIyMjCitgVGltZWAgdHlwZSBkZXNjcmliZXMgdGhlIHRpbWUgd2l0aGluIHRoZSByYW5nZSBvZiBhIGRheS4gSXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhyZWUgZmllbGRzOiBob3VyLCBtaW51dGUgYW5kIHNlY29uZC4gTWlsbGlzZWNvbmQgZmllbGQgaXMgb3B0aW9uYWwgYXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBzZWNvbmQgZmllbGQuIEl0cyBleHRlbmRlZCBmb3JtYXQgaXMgYXMgYGhoOm1tOnNzWy5tbW1dYCBhbmQgdGhlIGJhc2ljIGZvcm1hdCBpcyBgaGhtbXNzW21tbV1gLiBUaGUgdmFsdWUgZG9tYWluIGlzIGZyb20gYDAwOjAwOjAwLjAwMGAgdG8gYDIzOjU5OjU5Ljk5OWAuCisKK1RpbWV6b25lIGZpZWxkIGlzIG9wdGlvbmFsIGZvciBhIHRpbWUgdmFsdWUuIFRpbWV6b25lIGlzIHJlcHJlc2VudGVkIGFzIGBbK3wtXWhoOm1tYCBmb3IgZXh0ZW5kZWQgZm9ybWF0IG9yIGBbK3wtXWhobW1gIGZvciBiYXNpYyBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgc2lnbiBkZXNpZ25hdG9ycyBjYW5ub3QgYmUgb21pdHRlZC4gYFpgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBVVEMgbG9jYWwgdGltZS4gSWYgbm8gdGltZXpvbmUgaW5mb3JtYXRpb24gaXMgZ2l2ZW4sIGl0IGlzIFVUQyBieSBkZWZhdWx0LgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIGxldCAkdjEgOj0gdGltZSgiMTI6MTI6MTIuMDM5WiIpCisgICAgICAgIGxldCAkdjIgOj0gdGltZSgiMDAwMDAwMDAwLTA4MDAiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IHRpbWUoIjEyOjEyOjEyLjAzOVoiKSwgInYyIjogdGltZSgiMDg6MDA6MDAuMDAwWiIpIH0KKworCisjIyMgRGF0ZXRpbWUgIyMjCitBIGBEYXRldGltZWAgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBgRGF0ZWAgYW5kIGBUaW1lYCwgcmVwcmVzZW50aW5nIGEgZml4ZWQgdGltZSBwb2ludCBhbG9uZyB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHN5c3RlbS4gVGhlIHZhbHVlIGlzIGFtb25nIGAtOTk5OS0wMS0wMSAwMDowMDowMC4wMDBgIGFuZCBgOTk5OS0xMi0zMSAyMzo1OTo1OS45OTlgLgorCitBIGBEYXRldGltZWAgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgaXRzIGBEYXRlYCBwYXJ0IGFuZCBgVGltZWAgcGFydCwgc2VwYXJhdGVkIGJ5IGEgc2VwYXJhdG9yIGBUYC4gRWl0aGVyIGV4dGVuZGVkIG9yIGJhc2ljIGZvcm1hdCBjYW4gYmUgdXNlZCwgYW5kIHRoZSB0d28gcGFydHMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvcm1hdC4KKworTWlsbGlzZWNvbmQgZmllbGQgYW5kIHRpbWV6b25lIGZpZWxkIGFyZSBvcHRpb25hbCwgYXMgc3BlY2lmaWVkIGluIHRoZSBgVGltZWAgdHlwZS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGRhdGV0aW1lKCIyMDEzLTAxLTAxVDEyOjEyOjEyLjAzOVoiKQorICAgICAgICBsZXQgJHYyIDo9IGRhdGV0aW1lKCItMTk3MDAxMDFUMDAwMDAwMDAwLTA4MDAiKQorICAgICAgICByZXR1cm4geyAidjEiOiAkdjEsICJ2MiI6ICR2MiB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ2MSI6IGRhdGV0aW1lKCIyMDEzLTAxLTAxVDEyOjEyOjEyLjAzOVoiKSwgInYyIjogZGF0ZXRpbWUoIi0xOTcwLTAxLTAxVDA4OjAwOjAwLjAwMFoiKSB9CisKKworIyMjIER1cmF0aW9uICMjIworYER1cmF0aW9uYCByZXByZXNlbnRzIGEgZHVyYXRpb24gb2YgdGltZS4gQSBkdXJhdGlvbiB2YWx1ZSBpcyBzcGVjaWZpZWQgYnkgaW50ZWdlcnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgYW5kIG1pbGxpc2Vjb25kLgorCitBIGR1cmF0aW9uIHZhbHVlIGlzIGluIHRoZSBmb3JtYXQgb2YgYFstXVBuWW5NbkRUbkhuTW4ubW1tU2AuIFRoZSBtaWxsaXNlY29uZCBwYXJ0IChhcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHNlY29uZCBmaWVsZCkgaXMgb3B0aW9uYWwsIGFuZCB3aGVuIG5vIG1pbGxpc2Vjb25kIGZpZWxkIGlzIHVzZWQsIHRoZSBkZWNpbWFsIHBvaW50IHNob3VsZCBhbHNvIGJlIGFic2VudC4KKworTmVnYXRpdmUgZHVyYXRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZCBmb3IgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBiZXR3ZWVuIHRpbWUgaW5zdGFuY2UgdHlwZXMgKGBEYXRlYCwgYFRpbWVgIGFuZCBgRGF0ZXRpbWVgKSwgYW5kIGlzIHVzZWQgdG8gcm9sbCB0aGUgdGltZSBiYWNrIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb24uIEZvciBleGFtcGxlIGBkYXRlKCIyMDEyLTAxLTAxIikgKyBkdXJhdGlvbigiLVAzRCIpYCB3aWxsIHJldHVybiBgZGF0ZSgiMjAxMS0xMi0yOSIpYC4KKworTm90ZSB0aGF0IGEgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkdXJhdGlvbiBpcyBhbHdheXMgcmV0dXJuZWQsIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgZHVyYXRpb24gaXMgaW4gdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvciBub3QgZnJvbSB0aGUgdXNlcidzIGlucHV0LiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBjYW4gYmUgZm91bmQgZnJvbSBbaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgtZnVuY3Rpb25zLyNjYW5vbmljYWwtZGF5VGltZUR1cmF0aW9uIFhQYXRoIGRheVRpbWVEdXJhdGlvbiBDYW5vbmljYWwgUmVwcmVzZW50YXRpb25dIGFuZCBbaHR0cDovL3d3dy53My5vcmcvVFIveHBhdGgtZnVuY3Rpb25zLyNjYW5vbmljYWwteWVhck1vbnRoRHVyYXRpb24geWVhck1vbnRoRHVyYXRpb24gQ2Fub25pY2FsIFJlcHJlc2VudGF0aW9uXS4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJHYxIDo9IGR1cmF0aW9uKCJQMTAwWTEyTVQxMk0iKQorICAgICAgICBsZXQgJHYyIDo9IGR1cmF0aW9uKCItUFQyMC45NDNTIikKKyAgICAgICAgcmV0dXJuIHsgInYxIjogJHYxLCAidjIiOiAkdjIgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBkdXJhdGlvbigiUDEwMVlUMTJNIiksICJ2MiI6IGR1cmF0aW9uKCItUFQyMC45NDNTIikgfQorCisKKyMjIyBJbnRlcnZhbCAjIyMKK2BJbnRlcnZhbGAgcmVwcmVzZW50cyBpbmNsdXNpdmUtZXhjbHVzaXZlIHJhbmdlcyBvZiB0aW1lLiBJdCBpcyBkZWZpbmVkIGJ5IHR3byB0aW1lIHBvaW50IHZhbHVlcyB3aXRoIHRoZSBzYW1lIHRlbXBvcmFsIHR5cGUoYERhdGVgLCBgVGltZWAgb3IgYERhdGV0aW1lYCkuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICR2MSA6PSBpbnRlcnZhbC1mcm9tLWRhdGUoZGF0ZSgiMjAxMy0wMS0wMSIpLCBkYXRlKCIyMDEzMDUwNSIpKQorICAgICAgICBsZXQgJHYyIDo9IGludGVydmFsLWZyb20tdGltZSh0aW1lKCIwMDowMTowMSIpLCB0aW1lKCIyMTM5MDEwNDkrMDgwMCIpKQorICAgICAgICBsZXQgJHYzIDo9IGludGVydmFsLWZyb20tZGF0ZXRpbWUoZGF0ZXRpbWUoIjIwMTMtMDEtMDFUMDA6MDE6MDEiKSwgZGF0ZXRpbWUoIjIwMTMwNTA1VDIxMzkwMTA0OSswODAwIikpCisgICAgICAgIHJldHVybiB7ICJ2MSI6ICR2MSwgInYyIjogJHYyLCAidjMiOiAkdjMgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidjEiOiBpbnRlcnZhbC1kYXRlKCIyMDEzLTAxLTAxLCAyMDEzLTA1LTA1IiksICJ2MiI6IGludGVydmFsLXRpbWUoIjAwOjAxOjAxLjAwMFosIDEzOjM5OjAxLjA0OVoiKSwgInYzIjogaW50ZXJ2YWwtZGF0ZXRpbWUoIjIwMTMtMDEtMDFUMDA6MDE6MDEuMDAwWiwgMjAxMy0wNS0wNVQxMzozOTowMS4wNDlaIikgfQorCisKKyMjIERlcml2ZWQgVHlwZXMgIyMKKworIyMjIFJlY29yZCAjIyMKK0EgYFJlY29yZGAgY29udGFpbnMgYSBzZXQgb2Yg76yBZWxkcywgd2hlcmUgZWFjaCDvrIFlbGQgaXMgZGVzY3JpYmVkIGJ5IGl0cyBuYW1lIGFuZCB0eXBlLiBBIHJlY29yZCB0eXBlIGlzIGVpdGhlciBvcGVuIG9yIGNsb3NlZC4gT3BlbiByZWNvcmRzIGNhbiBjb250YWluIO+sgWVsZHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHR5cGUgZGXvrIFuaXRpb24sIHdoaWxlIGNsb3NlZCByZWNvcmRzIGNhbm5vdC4gU3ludGFjdGljYWxseSwgcmVjb3JkIGNvbnN0cnVjdG9ycyBhcmUgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMgInsuLi59Ii4KKworQW4gZXhhbXBsZSB3b3VsZCBiZQorCisKKyAgICAgICAgeyAiaWQiOiAyMTM1MDgsICJuYW1lIjogIkFsaWNlIEJvYiIgfQorCisKKyMjIyAhT3JkZXJlZExpc3QgIyMjCitBbiBgT3JkZXJlZExpc3RgIGlzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIGZvciB3aGljaCB0aGUgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieSBjcmVhdGlvbiBvciBpbnNlcnRpb24uIE9yZGVyZWRMaXN0IGNvbnN0cnVjdG9ycyBhcmUgZGVub3RlZCBieSBicmFja2V0czogIlsuLi5dIi4KKworQW4gZXhhbXBsZSB3b3VsZCBiZQorCisKKyAgICAgICAgWyJhbGljZSIsIDEyMywgImJvYiIsIG51bGxdCisKKworIyMjICFVbm9yZGVyZWRMaXN0ICMjIworQW4gYFVub3JkZXJlZExpc3RgIGlzIGFuIHVub3JkZXJlZCBzZXF1ZW5jZSBvZiB2YWx1ZXMsIHNpbWlsYXIgdG8gYmFncyBpbiBTUUwuIFVub3JkZXJlZExpc3QgY29uc3RydWN0b3JzIGFyZSBkZW5vdGVkIGJ5IHR3byBvcGVuaW5nIGZsb3dlciBicmFjZXMgZm9sbG93ZWQgYnkgZGF0YSBhbmQgdHdvIGNsb3NpbmcgZmxvd2VyIGJyYWNlcywgbGlrZSAie3suLi59fSIuCisKK0FuIGV4YW1wbGUgd291bGQgYmUKKworCisgICAgICAgIHt7ImhlbGxvIiwgOTMyOCwgIndvcmxkIiwgWzEsIDIsIG51bGxdfX0KKworCisjIEFzdGVyaXg6IFVzaW5nIEZ1bmN0aW9ucyAjCitBc3Rlcml4IHByb3ZpZGVzIHJpY2ggc3VwcG9ydCBvZiB2YXJpb3VzIGNsYXNzZXMgb2YgZnVuY3Rpb25zIHRvIHN1cHBvcnQgb3BlcmF0aW9ucyBvbiBzdHJpbmcsIHNwYXRpYWwsIGFuZCB0ZW1wb3JhbCBkYXRhLiAgVGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucy4KKworIyMgU3RyaW5nIEZ1bmN0aW9ucyAjIworIyMjIHN0cmluZy10by1jb2RlcG9pbnQgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3RyaW5nLXRvLWNvZGVwb2ludChzdHJpbmdfZXhwcmVzc2lvbikKKworICogQ29udmVydHMgdGhlIHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gIHRvIGl0cyBjb2RlLWJhc2VkIHJlcHJlc2VudGF0aW9uLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCB0aGF0IHdpbGwgYmUgY29udmVydGVkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBbiBgT3JkZXJlZExpc3RgIG9mIHRoZSBjb2RlIHBvaW50cyBmb3IgdGhlIHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gLgorCisjIyMgY29kZXBvaW50LXRvLXN0cmluZyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBjb2RlcG9pbnQtdG8tc3RyaW5nKGxpc3RfZXhwcmVzc2lvbikKKworICogQ29udmVydHMgdGhlIG9yZGVyZWQgY29kZS1iYXNlZCByZXByZXNlbnRhdGlvbiBgbGlzdF9leHByZXNzaW9uYCB0byB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuCisgKiBBcmd1bWVudHM6CisgICAqIGBsaXN0X2V4cHJlc3Npb25gIDogQW4gYE9yZGVyZWRMaXN0YCBvZiBjb2RlLXBvaW50cy4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgU3RyaW5nYCByZXByZXNlbnRhdGlvbiBvZiBgbGlzdF9leHByZXNzaW9uYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJHMgOj0gIkhlbGxvIEFTVEVSSVghIgorICAgICAgICBsZXQgJGwgOj0gc3RyaW5nLXRvLWNvZGVwb2ludCgkcykKKyAgICAgICAgbGV0ICRzcyA6PSBjb2RlcG9pbnQtdG8tc3RyaW5nKCRsKQorICAgICAgICByZXR1cm4geyJjb2RlcyI6ICRsLCAic3RyaW5nIjogJHNzfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiY29kZXMiOiBbIDcyLCAxMDEsIDEwOCwgMTA4LCAxMTEsIDMyLCA2NSwgODMsIDg0LCA2OSwgODIsIDczLCA4OCwgMzMgXSwgInN0cmluZyI6ICJIZWxsbyBBU1RFUklYISIgfQorCisKKyMjIyBjb250YWlucyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBjb250YWlucyhzdHJpbmdfZXhwcmVzc2lvbiwgc3RyaW5nX3BhdHRlcm4pCisKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYCBjb250YWlucyB0aGUgc3RyaW5nIGBzdHJpbmdfcGF0dGVybmAKKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCBtaWdodCBjb250YWluIHRoZSBwYXR0ZXJuLgorICAgKiBgc3RyaW5nX3BhdHRlcm5gIDogQSB0YXJnZXQgYFN0cmluZ2AgdGhhdCBtaWdodCBiZSBjb250YWluZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYEJvb2xlYW5gLCByZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nX2V4cHJlc3Npb25gIGNvbnRhaW5zIGBzdHJpbmdfcGF0dGVybmAsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ0ZhY2Vib29rTWVzc2FnZXMnKQorICAgICAgICB3aGVyZSBjb250YWlucygkaS5tZXNzYWdlLCAicGhvbmUiKQorICAgICAgICByZXR1cm4geyJtaWQiOiAkaS5tZXNzYWdlLWlkLCAibWVzc2FnZSI6ICRpLm1lc3NhZ2V9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJtaWQiOiAyLCAibWVzc2FnZSI6ICIgZGlzbGlrZSBpcGhvbmUgaXRzIHRvdWNoLXNjcmVlbiBpcyBob3JyaWJsZSIgfQorICAgICAgICB7ICJtaWQiOiAxMywgIm1lc3NhZ2UiOiAiIGRpc2xpa2UgaXBob25lIHRoZSB2b2ljZS1jb21tYW5kIGlzIGJhZDooIiB9CisgICAgICAgIHsgIm1pZCI6IDE1LCAibWVzc2FnZSI6ICIgbGlrZSBpcGhvbmUgdGhlIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0KKworCisjIyMgbGVuICMjIworICogU3ludGF4OgorCisgICAgICAgIGxlbihsaXN0X2V4cHJlc3Npb24pCisKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBgbGlzdF9leHByZXNzaW9uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYGxpc3RfZXhwcmVzc2lvbmAgOiBBbiBgT3JkZXJlZExpc3RgLCBgVW5vcmRlcmVkTGlzdGAgb3IgYE5VTExgLCByZXByZXNlbnRzIHRoZSBsaXN0IG5lZWQgdG8gYmUgY2hlY2tlZC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYEludDMyYCB0aGF0IHJlcHJlc2VudHMgdGhlIGxlbmd0aCBvZiBgbGlzdF9leHByZXNzaW9uYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGwgOj0gWyJBU1RFUklYIiwgIkh5cmFja3MiXQorICAgICAgICByZXR1cm4gbGVuKCRsKQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgMgorCisKKyMjIyBsaWtlICMjIworICogU3ludGF4OgorCisgICAgICAgIGxpa2Uoc3RyaW5nX2V4cHJlc3Npb24sIHN0cmluZ19wYXR0ZXJuKQorCisgKiBDaGVja3Mgd2hldGhlciB0aGUgc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAgY29udGFpbnMgdGhlIHN0cmluZyBgc3RyaW5nX3BhdHRlcm5gLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCB0aGF0IG1pZ2h0IGNvbnRhaW4gdGhlIHBhdHRlcm4gb3IgYE5VTExgLgorICAgKiBgc3RyaW5nX3BhdHRlcm5gIDogQSBwYXR0ZXJuIGBTdHJpbmdgIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIG9yIGBOVUxMYC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgQm9vbGVhbmAsIHJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdfZXhwcmVzc2lvbmAgY29udGFpbnMgdGhlIHBhdHRlcm4gYHN0cmluZ19wYXR0ZXJuYCwgb3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tNZXNzYWdlcycpCisgICAgICAgIHdoZXJlIGxpa2UoJGkubWVzc2FnZSwgIiVhdCZ0JSIpCisgICAgICAgIHJldHVybiAkaS5tZXNzYWdlCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICAiIGNhbid0IHN0YW5kIGF0JnQgdGhlIG5ldHdvcmsgaXMgaG9ycmlibGU6KCIKKyAgICAgICAgIiBjYW4ndCBzdGFuZCBhdCZ0IGl0cyBwbGFuIGlzIHRlcnJpYmxlIgorICAgICAgICAiIGxvdmUgYXQmdCBpdHMgM0cgaXMgZ29vZDopIgorCisKKyMjIyBzdGFydHMtd2l0aCAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzdGFydHMtd2l0aChzdHJpbmdfZXhwcmVzc2lvbiwgc3RyaW5nX3BhdHRlcm4pCisKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nIGBzdHJpbmdfcGF0dGVybmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIHRoYXQgbWlnaHQgc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgKiBgc3RyaW5nX3BhdHRlcm5gIDogQSBgU3RyaW5nYCB0aGF0IG1pZ2h0IGJlIGNvbnRhaW5lZCBhcyB0aGUgc3RhcnRpbmcgc3Vic3RyaW5nLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBCb29sZWFuYCwgcmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ19leHByZXNzaW9uYCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nIGBzdHJpbmdfcGF0dGVybmAsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ0ZhY2Vib29rTWVzc2FnZXMnKQorICAgICAgICB3aGVyZSBzdGFydHMtd2l0aCgkaS5tZXNzYWdlLCAiIGxpa2UiKQorICAgICAgICByZXR1cm4gJGkubWVzc2FnZQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgIiBsaWtlIHNhbXN1bmcgdGhlIHBsYW4gaXMgYW1hemluZyIKKyAgICAgICAgIiBsaWtlIHQtbW9iaWxlIGl0cyBwbGF0Zm9ybSBpcyBtaW5kLWJsb3dpbmciCisgICAgICAgICIgbGlrZSB2ZXJpem9uIHRoZSAzRyBpcyBhd2Vzb21lOikiCisgICAgICAgICIgbGlrZSBpcGhvbmUgdGhlIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiCisKKworIyMjIGVuZHMtd2l0aCAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBlbmRzLXdpdGgoc3RyaW5nX2V4cHJlc3Npb24sIHN0cmluZ19wYXR0ZXJuKQorCisgKiBDaGVja3Mgd2hldGhlciB0aGUgc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAgZW5kcyB3aXRoIHRoZSBzdHJpbmcgYHN0cmluZ19wYXR0ZXJuYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCBtaWdodCBlbmQgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgKiBgc3RyaW5nX3BhdHRlcm5gIDogQSBgU3RyaW5nYCB0aGF0IG1pZ2h0IGJlIGNvbnRhaW5lZCBhcyB0aGUgZW5kaW5nIHN1YnN0cmluZy4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgQm9vbGVhbmAsIHJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdfZXhwcmVzc2lvbmAgZW5kcyB3aXRoIHRoZSBzdHJpbmcgYHN0cmluZ19wYXR0ZXJuYCwgb3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tNZXNzYWdlcycpCisgICAgICAgIHdoZXJlIGVuZHMtd2l0aCgkaS5tZXNzYWdlLCAiOikiKQorICAgICAgICByZXR1cm4gJGkubWVzc2FnZQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgIiBsb3ZlIHNwcmludCBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiCisgICAgICAgICIgbGlrZSB2ZXJpem9uIHRoZSAzRyBpcyBhd2Vzb21lOikiCisgICAgICAgICIgbG92ZSBhdCZ0IGl0cyAzRyBpcyBnb29kOikiCisKKworIyMjIHN0cmluZy1jb25jYXQgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3RyaW5nLWNvbmNhdChsaXN0X2V4cHJlc3Npb24pCisKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2Ygc3RyaW5ncyBgbGlzdF9leHByZXNzaW9uYCBpbnRvIGEgc2luZ2xlIHN0cmluZy4KKyAqIEFyZ3VtZW50czoKKyAgICogYGxpc3RfZXhwcmVzc2lvbmAgOiBBbiBgT3JkZXJlZExpc3RgIG9yIGBVbm9yZGVyZWRMaXN0YCBvZiBgU3RyaW5nYHMgKGNvdWxkIGJlIGBOVUxMYCkgdG8gYmUgY29uY2F0ZW5hdGVkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgYFN0cmluZ2AgdmFsdWUuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgbGV0ICRpIDo9ICJBU1RFUklYIgorICAgICAgICBsZXQgJGogOj0gIiAiCisgICAgICAgIGxldCAkayA6PSAiUk9DS1MhIgorICAgICAgICByZXR1cm4gc3RyaW5nLWNvbmNhdChbJGksICRqLCAka10pCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICAiQVNURVJJWCBST0NLUyEiCisKKworIyMjIHN0cmluZy1lcXVhbCAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzdHJpbmctZXF1YWwoc3RyaW5nX2V4cHJlc3Npb24xLCBzdHJpbmdfZXhwcmVzc2lvbjIpCisKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmdzIGBzdHJpbmdfZXhwcmVzc2lvbjFgIGFuZCBgc3RyaW5nX2V4cHJlc3Npb24yYCBhcmUgZXF1YWwuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbjFgIDogQSBgU3RyaW5nYCB0byBiZSBjb21wYXJlZC4KKyAgICogYHN0cmluZ19leHByZXNzaW9uMmAgOiBBIGBTdHJpbmdgIHRvIGJlIGNvbXBhcmVkIHdpdGguCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYEJvb2xlYW5gLCByZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nX2V4cHJlc3Npb24xYCBhbmQgYHN0cmluZ19leHByZXNzaW9uMmAgYXJlIGVxdWFsLCBvdGhlcndpc2UgcmV0dXJucyBgZmFsc2VgLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkaSA6PSAiQW5kcm9pZCIKKyAgICAgICAgcmV0dXJuIHsiRXF1YWwiOiBzdHJpbmctZXF1YWwoJGksICJBbmRyb2lkIiksICJOb3RFcXVhbCI6IHN0cmluZy1lcXVhbCgkaSwgImlwaG9uZSIpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiRXF1YWwiOiB0cnVlLCAiTm90RXF1YWwiOiBmYWxzZSB9CisKKworIyMjIHN0cmluZy1qb2luICMjIworICogU3ludGF4OgorCisgICAgICAgIHN0cmluZy1qb2luKGxpc3RfZXhwcmVzc2lvbiwgc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIEpvaW5zIGEgbGlzdCBvZiBzdHJpbmdzIGBsaXN0X2V4cHJlc3Npb25gIHdpdGggdGhlIGdpdmVuIHNlcGFyYXRvciBgc3RyaW5nX2V4cHJlc3Npb25gIGludG8gYSBzaW5nbGUgc3RyaW5nLgorICogQXJndW1lbnRzOgorICAgKiBgbGlzdF9leHByZXNzaW9uYCA6IEFuIGBPcmRlcmVkTGlzdGAgb3IgYFVub3JkZXJlZExpc3RgIG9mIGBTdHJpbmdgcyAoY291bGQgYmUgTlVMTCkgdG8gYmUgam9pbmVkLgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBzZXBhcmF0b3IgYFN0cmluZ2AgdmFsdWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIFJldHVybnMgdGhlIGpvaW5lZCBgU3RyaW5nYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGkgOj0gWyJBU1RFUklYIiwgIlJPQ0tTfiJdCisgICAgICAgIHJldHVybiBzdHJpbmctam9pbigkaSwgIiEhICIpCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICAiQVNURVJJWCEhIFJPQ0tTfiIKKworCisjIyMgbG93ZXJjYXNlICMjIworICogU3ludGF4OgorCisgICAgICAgIGxvd2VyY2FzZShzdHJpbmdfZXhwcmVzc2lvbikKKworICogUmV0dXJucyB0aGUgbG93ZXJjYXNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIHRvIGJlIGxvd2VyY2FzZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIFJldHVybnMgdGhlIGxvd2VyY2FzZWQgYFN0cmluZ2AuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgbGV0ICRpIDo9ICJBU1RFUklYIgorICAgICAgICByZXR1cm4gbG93ZXJjYXNlKCRpKQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgYXN0ZXJpeAorCisKKyMjIyBtYXRjaGVzICMjIworICogU3ludGF4OgorCisgICAgICAgIG1hdGNoZXMoc3RyaW5nX2V4cHJlc3Npb24sIHN0cmluZ19wYXR0ZXJuKQorCisgKiBDaGVja3Mgd2hldGhlciB0aGUgc3RyaW5ncyBgc3RyaW5nX2V4cHJlc3Npb25gIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4gYHN0cmluZ19wYXR0ZXJuYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCBtaWdodCBjb250YWluIHRoZSBwYXR0ZXJuLgorICAgKiBgc3RyaW5nX3BhdHRlcm5gIDogQSBwYXR0ZXJuIGBTdHJpbmdgIHRvIGJlIG1hdGNoZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYEJvb2xlYW5gLCByZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nX2V4cHJlc3Npb25gIG1hdGNoZXMgdGhlIHBhdHRlcm4gYHN0cmluZ19wYXR0ZXJuYCwgb3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tNZXNzYWdlcycpCisgICAgICAgIHdoZXJlIG1hdGNoZXMoJGkubWVzc2FnZSwgImRpc2xpa2UgaXBob25lIikKKyAgICAgICAgcmV0dXJuICRpLm1lc3NhZ2UKKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgICIgZGlzbGlrZSBpcGhvbmUgaXRzIHRvdWNoLXNjcmVlbiBpcyBob3JyaWJsZSIKKyAgICAgICAgIiBkaXNsaWtlIGlwaG9uZSB0aGUgdm9pY2UtY29tbWFuZCBpcyBiYWQ6KCIKKworCisjIyMgcmVwbGFjZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICByZXBsYWNlKHN0cmluZ19leHByZXNzaW9uLCBzdHJpbmdfcGF0dGVybiwgc3RyaW5nX3JlcGxhY2VtZW50KQorCisgKiBDaGVja3Mgd2hldGhlciB0aGUgc3RyaW5ncyBgc3RyaW5nX2V4cHJlc3Npb25gIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4gYHN0cmluZ19wYXR0ZXJuYCwgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgcGF0dGVybiBgc3RyaW5nX3BhdHRlcm5gIHdpdGggdGhlIG5ldyBwYXR0ZXJuIGBzdHJpbmdfcmVwbGFjZW1lbnRgLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCB0aGF0IG1pZ2h0IGNvbnRhaW4gdGhlIHBhdHRlcm4uCisgICAqIGBzdHJpbmdfcGF0dGVybmAgOiBBIHBhdHRlcm4gYFN0cmluZ2AgdG8gYmUgbWF0Y2hlZC4KKyAgICogYHN0cmluZ19yZXBsYWNlbWVudGAgOiBBIHBhdHRlcm4gYFN0cmluZ2AgdG8gYmUgdXNlZCBhcyB0aGUgcmVwbGFjZW1lbnQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIFJldHVybnMgYSBgU3RyaW5nYCB0aGF0IGlzIG9idGFpbmVkIGFmdGVyIHRoZSByZXBsYWNlbWVudHMuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ0ZhY2Vib29rTWVzc2FnZXMnKQorICAgICAgICB3aGVyZSBtYXRjaGVzKCRpLm1lc3NhZ2UsICIgbGlrZSBpcGhvbmUiKQorICAgICAgICByZXR1cm4gcmVwbGFjZSgkaS5tZXNzYWdlLCAiIGxpa2UgaXBob25lIiwgImxpa2UgYW5kcm9pZCIpCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICAibGlrZSBhbmRyb2lkIHRoZSB2b2ljZW1haWwtc2VydmljZSBpcyBhd2Vzb21lIgorCisKKyMjIyBzdHJpbmctbGVuZ3RoICMjIworICogU3ludGF4OgorCisgICAgICAgIHN0cmluZy1sZW5ndGgoc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIG9yIGBOVUxMYCwgcmVwcmVzZW50cyB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEFuIGBJbnQzMmAgdGhhdCByZXByZXNlbnRzIHRoZSBsZW5ndGggb2YgYHN0cmluZ19leHByZXNzaW9uYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tNZXNzYWdlcycpCisgICAgICAgIHJldHVybiB7Im1pZCI6ICRpLm1lc3NhZ2UtaWQsICJtZXNzYWdlLWxlbiI6IHN0cmluZy1sZW5ndGgoJGkubWVzc2FnZSl9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJtaWQiOiAxLCAibWVzc2FnZS1sZW4iOiA0MyB9CisgICAgICAgIHsgIm1pZCI6IDIsICJtZXNzYWdlLWxlbiI6IDQ0IH0KKyAgICAgICAgeyAibWlkIjogMywgIm1lc3NhZ2UtbGVuIjogMzMgfQorICAgICAgICB7ICJtaWQiOiA0LCAibWVzc2FnZS1sZW4iOiA0MyB9CisgICAgICAgIHsgIm1pZCI6IDUsICJtZXNzYWdlLWxlbiI6IDQ2IH0KKyAgICAgICAgeyAibWlkIjogNiwgIm1lc3NhZ2UtbGVuIjogNDMgfQorICAgICAgICB7ICJtaWQiOiA3LCAibWVzc2FnZS1sZW4iOiAzNyB9CisgICAgICAgIHsgIm1pZCI6IDgsICJtZXNzYWdlLWxlbiI6IDMzIH0KKyAgICAgICAgeyAibWlkIjogOSwgIm1lc3NhZ2UtbGVuIjogMzQgfQorICAgICAgICB7ICJtaWQiOiAxMCwgIm1lc3NhZ2UtbGVuIjogNTAgfQorICAgICAgICB7ICJtaWQiOiAxMSwgIm1lc3NhZ2UtbGVuIjogMzggfQorICAgICAgICB7ICJtaWQiOiAxMiwgIm1lc3NhZ2UtbGVuIjogNTIgfQorICAgICAgICB7ICJtaWQiOiAxMywgIm1lc3NhZ2UtbGVuIjogNDIgfQorICAgICAgICB7ICJtaWQiOiAxNCwgIm1lc3NhZ2UtbGVuIjogMjcgfQorICAgICAgICB7ICJtaWQiOiAxNSwgIm1lc3NhZ2UtbGVuIjogNDUgfQorCisKKyMjIyBzdWJzdHJpbmcgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3Vic3RyaW5nKHN0cmluZ19leHByZXNzaW9uLCBvZmZzZXQsIGxlbmd0aCkKKworICogUmV0dXJucyB0aGUgc3Vic3RyaW5nIGZyb20gdGhlIGdpdmVuIHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gIGJhc2VkIG9uIHRoZSBnaXZlbiBzdGFydCBvZmZzZXQgYG9mZnNldGAuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIGFzIHRoZSBzdHJpbmcgdG8gYmUgZXh0cmFjdGVkLgorICAgKiBgb2Zmc2V0YCA6IEFuIGBJbnQzMmAgYXMgdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgc3Vic3RyaW5nIGluIGBzdHJpbmdfZXhwcmVzc2lvbmAuCisgICAqIGBsZW5ndGhgIDogKE9wdGlvbmFsKSBBbiBgSW50MzJgIGFzIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZy4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgU3RyaW5nYCB0aGF0IHJlcHJlc2VudHMgdGhlIHN1YnN0cmluZy4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tNZXNzYWdlcycpCisgICAgICAgIHdoZXJlIHN0cmluZy1sZW5ndGgoJGkubWVzc2FnZSkgPiA1MAorICAgICAgICByZXR1cm4gc3Vic3RyaW5nKCRpLm1lc3NhZ2UsIDUwKQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgIkc6KCIKKworCisjIyMgc3Vic3RyaW5nLWJlZm9yZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzdWJzdHJpbmctYmVmb3JlKHN0cmluZ19leHByZXNzaW9uLCBzdHJpbmdfcGF0dGVybikKKworICogUmV0dXJucyB0aGUgc3Vic3RyaW5nIGZyb20gdGhlIGdpdmVuIHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gIGJlZm9yZSB0aGUgZ2l2ZW4gcGF0dGVybiBgc3RyaW5nX3BhdHRlcm5gLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCBhcyB0aGUgc3RyaW5nIHRvIGJlIGV4dHJhY3RlZC4KKyAgICogYHN0cmluZ19wYXR0ZXJuYCA6IEEgYFN0cmluZ2AgYXMgdGhlIHN0cmluZyBwYXR0ZXJuIHRvIGJlIHNlYXJjaGVkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBTdHJpbmdgIHRoYXQgcmVwcmVzZW50cyB0aGUgc3Vic3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdGYWNlYm9va01lc3NhZ2VzJykKKyAgICAgICAgd2hlcmUgY29udGFpbnMoJGkubWVzc2FnZSwgImlwaG9uZSIpCisgICAgICAgIHJldHVybiBzdWJzdHJpbmctYmVmb3JlKCRpLm1lc3NhZ2UsICJpcGhvbmUiKQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgIiBkaXNsaWtlICIKKyAgICAgICAgIiBkaXNsaWtlICIKKyAgICAgICAgIiBsaWtlICIKKworCisjIyMgc3Vic3RyaW5nLWFmdGVyICMjIworICogU3ludGF4OgorCisgICAgICAgIHN1YnN0cmluZy1hZnRlcihzdHJpbmdfZXhwcmVzc2lvbiwgc3RyaW5nX3BhdHRlcm4pCisKKyAqIFJldHVybnMgdGhlIHN1YnN0cmluZyBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYCBhZnRlciB0aGUgZ2l2ZW4gcGF0dGVybiBgc3RyaW5nX3BhdHRlcm5gLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCBhcyB0aGUgc3RyaW5nIHRvIGJlIGV4dHJhY3RlZC4KKyAgICogYHN0cmluZ19wYXR0ZXJuYCA6IEEgYFN0cmluZ2AgYXMgdGhlIHN0cmluZyBwYXR0ZXJuIHRvIGJlIHNlYXJjaGVkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBTdHJpbmdgIHRoYXQgcmVwcmVzZW50cyB0aGUgc3Vic3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdGYWNlYm9va01lc3NhZ2VzJykKKyAgICAgICAgd2hlcmUgY29udGFpbnMoJGkubWVzc2FnZSwgImlwaG9uZSIpCisgICAgICAgIHJldHVybiBzdWJzdHJpbmctYWZ0ZXIoJGkubWVzc2FnZSwgImlwaG9uZSIpCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICAiIGl0cyB0b3VjaC1zY3JlZW4gaXMgaG9ycmlibGUiCisgICAgICAgICIgdGhlIHZvaWNlLWNvbW1hbmQgaXMgYmFkOigiCisgICAgICAgICIgdGhlIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiCisKKworIyMgU3BhdGlhbCBGdW5jdGlvbnMgIyMKKyMjIyBjcmVhdGUtcG9pbnQgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgY3JlYXRlLXBvaW50KGxhdGl0dWRlLCBsb25naXR1ZGUpCisKKyAqIENyZWF0ZXMgdGhlIHByaW1pdGl2ZSB0eXBlIGBQb2ludGAgdXNpbmcgYGxhdGl0dWRlYCBhbmQgYGxvbmdpdHVkZWAuCisgKiBBcmd1bWVudHM6CisgICAqIGBsYXRpdHVkZWAgOiBBIGBEb3VibGVgIHRoYXQgcmVwcmVzZW50cyB0aGUgbGF0aXR1ZGUuCisgICAqIGBsb25naXR1ZGVgIDogQSBgRG91YmxlYCB0aGF0IHJlcHJlc2VudHMgdGhlIGxvbmdpdHVkZS4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgUG9pbnRgLCByZXByZXNlbnRzIGEgc3BhdGlhbCBwb2ludCBjcmVhdGVkIHVzaW5nIHRoZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHByb3ZpZGVkIGluIGBsYXRpdHVkZWAgYW5kIGBsb25naXR1ZGVgLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkYyA6PSAgY3JlYXRlLXBvaW50KDMwLjAsNzAuMCkKKyAgICAgICAgcmV0dXJuIHsicG9pbnQiOiAkY30KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInBvaW50IjogcG9pbnQoIjMwLjAsNzAuMCIpIH0KKworCisjIyMgY3JlYXRlLWxpbmUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgY3JlYXRlLWxpbmUocG9pbnRfZXhwcmVzc2lvbjEsIHBvaW50X2V4cHJlc3Npb24yKQorCisgKiBDcmVhdGVzIHRoZSBwcmltaXRpdmUgdHlwZSBgTGluZWAgdXNpbmcgYHBvaW50X2V4cHJlc3Npb24xYCBhbmQgYHBvaW50X2V4cHJlc3Npb24yYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHBvaW50X2V4cHJlc3Npb24xYCA6IEEgYFBvaW50YCB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lLgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbjJgIDogQSBgUG9pbnRgIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBMaW5lYCwgcmVwcmVzZW50cyBhIHNwYXRpYWwgbGluZSBjcmVhdGVkIHVzaW5nIHRoZSBwb2ludHMgcHJvdmlkZWQgaW4gYHBvaW50X2V4cHJlc3Npb24xYCBhbmQgYHBvaW50X2V4cHJlc3Npb24yYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gIGNyZWF0ZS1saW5lKGNyZWF0ZS1wb2ludCgzMC4wLDcwLjApLCBjcmVhdGUtcG9pbnQoNTAuMCw5MC4wKSkKKyAgICAgICAgcmV0dXJuIHsibGluZSI6ICRjfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAibGluZSI6IGxpbmUoIjMwLjAsNzAuMCA1MC4wLDkwLjAiKSB9CisKKworIyMjIGNyZWF0ZS1yZWN0YW5nbGUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgY3JlYXRlLXJlY3RhbmdsZShwb2ludF9leHByZXNzaW9uMSwgcG9pbnRfZXhwcmVzc2lvbjIpCisKKyAqIENyZWF0ZXMgdGhlIHByaW1pdGl2ZSB0eXBlIFJlY3RhbmdsZSB1c2luZyBgcG9pbnRfZXhwcmVzc2lvbjFgIGFuZCBgcG9pbnRfZXhwcmVzc2lvbjJgLgorICogQXJndW1lbnRzOgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbjFgIDogQSBgUG9pbnRgIHRoYXQgcmVwcmVzZW50cyB0aGUgbG93ZXItbGVmdCBwb2ludCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbjJgIDogQSBgUG9pbnRgIHRoYXQgcmVwcmVzZW50cyB0aGUgdXBwZXItcmlnaHQgcG9pbnQgb2YgdGhlIHJlY3RhbmdsZS4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgUmVjdGFuZ2xlYCwgcmVwcmVzZW50cyBhIHNwYXRpYWwgcmVjdGFuZ2xlIGNyZWF0ZWQgdXNpbmcgdGhlIHBvaW50cyBwcm92aWRlZCBpbiBgcG9pbnRfZXhwcmVzc2lvbjFgIGFuZCBgcG9pbnRfZXhwcmVzc2lvbjJgLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkYyA6PSAgY3JlYXRlLXJlY3RhbmdsZShjcmVhdGUtcG9pbnQoMzAuMCw3MC4wKSwgY3JlYXRlLXBvaW50KDUwLjAsOTAuMCkpCisgICAgICAgIHJldHVybiB7InJlY3RhbmdsZSI6ICRjfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAicmVjdGFuZ2xlIjogcmVjdGFuZ2xlKCIzMC4wLDcwLjAgNTAuMCw5MC4wIikgfQorCisKKyMjIyBjcmVhdGUtY2lyY2xlICMjIworICogU3ludGF4OgorCisgICAgICAgIGNyZWF0ZS1jaXJjbGUocG9pbnRfZXhwcmVzc2lvbiwgcmFkaXVzKQorCisgKiBDcmVhdGVzIHRoZSBwcmltaXRpdmUgdHlwZSBgQ2lyY2xlYCB1c2luZyBgcG9pbnRfZXhwcmVzc2lvbmAgYW5kIGByYWRpdXNgLgorICogQXJndW1lbnRzOgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbmAgOiBBIGBQb2ludGAgdGhhdCByZXByZXNlbnRzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICogYHJhZGl1c2AgOiBBIGBEb3VibGVgIHRoYXQgcmVwcmVzZW50cyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYENpcmNsZWAsIHJlcHJlc2VudHMgYSBzcGF0aWFsIGNpcmNsZSBjcmVhdGVkIHVzaW5nIHRoZSBjZW50ZXIgcG9pbnQgYW5kIHRoZSByYWRpdXMgcHJvdmlkZWQgaW4gYHBvaW50X2V4cHJlc3Npb25gIGFuZCBgcmFkaXVzYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gIGNyZWF0ZS1jaXJjbGUoY3JlYXRlLXBvaW50KDMwLjAsNzAuMCksIDUuMCkKKyAgICAgICAgcmV0dXJuIHsiY2lyY2xlIjogJGN9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJjaXJjbGUiOiBjaXJjbGUoIjMwLjAsNzAuMCA1LjAiKSB9CisKKworIyMjIGNyZWF0ZS1wb2x5Z29uICMjIworICogU3ludGF4OgorCisgICAgICAgIGNyZWF0ZS1wb2x5Z29uKHBvaW50X2V4cHJlc3Npb24xLCBwb2ludF9leHByZXNzaW9uMiwgLi4uLCBwb2ludF9leHByZXNzaW9ubikKKworICogQ3JlYXRlcyB0aGUgcHJpbWl0aXZlIHR5cGUgYFBvbHlnb25gIHVzaW5nIHVubGltaXRlZCBudW1iZXIgb2YgYXJndW1lbnRzIGBwb2ludF9leHByZXNzaW9uMWAsIGBwb2ludF9leHByZXNzaW9uMmAsIC4uLiwgYHBvaW50X2V4cHJlc3Npb25uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHBvaW50X2V4cHJlc3Npb24xYC8uLi4vYHBvaW50X2V4cHJlc3Npb25uYCA6IEEgYFBvaW50YCB0aGF0IHJlcHJlc2VudHMgYSB2ZXJ0ZXggb2YgdGhlIHBvbHlnb24uCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFBvbHlnb25gLCByZXByZXNlbnRzIGEgc3BhdGlhbCBzaW1wbGUgcG9seWdvbiBjcmVhdGVkIHVzaW5nIHRoZSBwb2ludHMgcHJvdmlkZWQgaW4gYHBvaW50X2V4cHJlc3Npb24xYCwgYHBvaW50X2V4cHJlc3Npb24yYCwgLi4uLCBgcG9pbnRfZXhwcmVzc2lvbm5gLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkYyA6PSAgY3JlYXRlLXBvbHlnb24oY3JlYXRlLXBvaW50KDEuMCwxLjApLCBjcmVhdGUtcG9pbnQoMi4wLDIuMCksIGNyZWF0ZS1wb2ludCgzLjAsMy4wKSwgY3JlYXRlLXBvaW50KDQuMCw0LjApKQorICAgICAgICByZXR1cm4geyJwb2x5Z29uIjogJGN9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJwb2x5Z29uIjogcG9seWdvbigiMS4wLDEuMCAyLjAsMi4wIDMuMCwzLjAgNC4wLDQuMCIpIH0KKworCisjIyMgcG9pbnQgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgcG9pbnQoc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBgUG9pbnRgIHR5cGUgYnkgcGFyc2luZyBhIHBvaW50IHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBUaGUgYFN0cmluZ2AgdmFsdWUgcmVwcmVzZW50aW5nIGEgcG9pbnQgdmFsdWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFBvaW50YCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIAorICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gcG9pbnQoIjU1LjA1LC0xMzguMDQiKQorICAgICAgICByZXR1cm4geyJwb2ludCI6ICRjfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAicG9pbnQiOiBwb2ludCgiNTUuMDUsLTEzOC4wNCIpIH0KKworCisjIyMgbGluZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBsaW5lKHN0cmluZ19leHByZXNzaW9uKQorCisgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYExpbmVgIHR5cGUgYnkgcGFyc2luZyBhIGxpbmUgc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAKKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgYSBsaW5lIHZhbHVlLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBMaW5lYCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIAorICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gbGluZSgiNTUuMDUsLTEzOC4wNCAxMy41NCwtMTM4LjA0IikKKyAgICAgICAgcmV0dXJuIHsibGluZSI6ICRjfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAibGluZSI6IGxpbmUoIjU1LjA1LC0xMzguMDQgMTMuNTQsLTEzOC4wNCIpIH0KKworCisjIyMgcmVjdGFuZ2xlICMjIworICogU3ludGF4OgorCisgICAgICAgIHJlY3RhbmdsZShzdHJpbmdfZXhwcmVzc2lvbikKKworICogQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGBSZWN0YW5nbGVgIHR5cGUgYnkgcGFyc2luZyBhIHJlY3RhbmdsZSBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogVGhlIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudGluZyBhIHJlY3RhbmdsZSB2YWx1ZS4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgUmVjdGFuZ2xlYCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIAorICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gcmVjdGFuZ2xlKCIyMC4wNSwtMTI1LjAgNDAuNjcsLTEwMC44NyIpCisgICAgICAgIHJldHVybiB7InJlY3RhbmdsZSI6ICRjfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAicmVjdGFuZ2xlIjogcmVjdGFuZ2xlKCIyMC4wNSwtMTI1LjAgNDAuNjcsLTEwMC44NyIpIH0KKworCisjIyMgY2lyY2xlICMjIworICogU3ludGF4OgorCisgICAgICAgIGNpcmNsZShzdHJpbmdfZXhwcmVzc2lvbikKKworICogQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGBDaXJjbGVgIHR5cGUgYnkgcGFyc2luZyBhIGNpcmNsZSBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogVGhlIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudGluZyBhIGNpcmNsZSB2YWx1ZS4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgQ2lyY2xlYCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIAorICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGMgOj0gY2lyY2xlKCI1NS4wNSwtMTM4LjA0IDEwLjAiKQorICAgICAgICByZXR1cm4geyJjaXJjbGUiOiAkY30KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgImNpcmNsZSI6IGNpcmNsZSgiNTUuMDUsLTEzOC4wNCAxMC4wIikgfQorCisKKyMjIyBwb2x5Z29uICMjIworICogU3ludGF4OgorCisgICAgICAgIHBvbHlnb24oc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBgUG9seWdvbmAgdHlwZSBieSBwYXJzaW5nIGEgcG9seWdvbiBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogVGhlIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudGluZyBhIHBvbHlnb24gdmFsdWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFBvbHlnb25gIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkYyA6PSBwb2x5Z29uKCI1NS4wNSwtMTM4LjA0IDEzLjU0LC0xMzguMDQgMTMuNTQsLTUzLjMxIDU1LjA1LC01My4zMSIpCisgICAgICAgIHJldHVybiB7InBvbHlnb24iOiAkY30KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInBvbHlnb24iOiBwb2x5Z29uKCI1NS4wNSwtMTM4LjA0IDEzLjU0LC0xMzguMDQgMTMuNTQsLTUzLjMxIDU1LjA1LC01My4zMSIpIH0KKworCisjIyMgZ2V0LXgvZ2V0LXkgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgZ2V0LXgocG9pbnRfZXhwcmVzc2lvbikgb3IgZ2V0LXkocG9pbnRfZXhwcmVzc2lvbikKKworICogUmV0dXJucyB0aGUgeCBvciB5IGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgYHBvaW50X2V4cHJlc3Npb25gLgorICogQXJndW1lbnRzOgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbmAgOiBBIGBQb2ludGAuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERvdWJsZWAsIHJlcHJlc2VudHMgdGhlIHggb3IgeSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgYHBvaW50X2V4cHJlc3Npb25gLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkcG9pbnQgOj0gY3JlYXRlLXBvaW50KDIuMyw1LjApCisgICAgICAgIHJldHVybiB7IngtY29vcmRpbmF0ZSI6IGdldC14KCRwb2ludCksICJ5LWNvb3JkaW5hdGUiOiBnZXQteSgkcG9pbnQpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAieC1jb29yZGluYXRlIjogMi4zZCwgInktY29vcmRpbmF0ZSI6IDUuMGQgfQorCisKKyMjIyBnZXQtcG9pbnRzICMjIworICogU3ludGF4OgorCisgICAgICAgIGdldC1wb2ludHMoc3BhdGlhbF9leHByZXNzaW9uKQorCisgKiBSZXR1cm5zIGFuIG9yZGVyZWQgbGlzdCBvZiB0aGUgcG9pbnRzIGZvcm1pbmcgdGhlIHNwYXRpYWwgb2JqZWN0IGBzcGF0aWFsX2V4cHJlc3Npb25gLgorICogQXJndW1lbnRzOgorICAgKiBgc3BhdGlhbF9leHByZXNzaW9uYCA6IEEgYFBvaW50YCwgYExpbmVgLCBgUmVjdGFuZ2xlYCwgYENpcmNsZWAsIG9yIGBQb2x5Z29uYC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYE9yZGVyZWRMaXN0YCBvZiB0aGUgcG9pbnRzIGZvcm1pbmcgdGhlIHNwYXRpYWwgb2JqZWN0IGBzcGF0aWFsX2V4cHJlc3Npb25gLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkbGluZSA6PSBjcmVhdGUtbGluZShjcmVhdGUtcG9pbnQoMTAwLjYsOTkuNCksIGNyZWF0ZS1wb2ludCgtNzIuMCwtNzYuOSkpCisgICAgICAgIGxldCAkcmVjdGFuZ2xlIDo9IGNyZWF0ZS1yZWN0YW5nbGUoY3JlYXRlLXBvaW50KDkuMiw0OS4wKSwgY3JlYXRlLXBvaW50KDc3LjgsMTExLjEpKQorICAgICAgICBsZXQgJHBvbHlnb24gOj0gY3JlYXRlLXBvbHlnb24oY3JlYXRlLXBvaW50KDEuMCwxLjApLCBjcmVhdGUtcG9pbnQoMi4wLDIuMCksIGNyZWF0ZS1wb2ludCgzLjAsMy4wKSwgY3JlYXRlLXBvaW50KDQuMCw0LjApKQorICAgICAgICBsZXQgJGxpbmVfbGlzdCA6PSBnZXQtcG9pbnRzKCRsaW5lKQorICAgICAgICBsZXQgJHJlY3RhbmdsZV9saXN0IDo9IGdldC1wb2ludHMoJHJlY3RhbmdsZSkKKyAgICAgICAgbGV0ICRwb2x5Z29uX2xpc3QgOj0gZ2V0LXBvaW50cygkcG9seWdvbikKKyAgICAgICAgcmV0dXJuIHsibGluZS1maXJzdC1wb2ludCI6ICRsaW5lX2xpc3RbMF0sICJsaW5lLXNlY29uZC1wb2ludCI6ICRsaW5lX2xpc3RbMV0sICJyZWN0YW5nbGUtbGVmdC1ib3R0b20tcG9pbnQiOiAkcmVjdGFuZ2xlX2xpc3RbMF0sICJyZWN0YW5nbGUtdG9wLXVwcGVyLXBvaW50IjogJHJlY3RhbmdsZV9saXN0WzFdLCAicG9seWdvbi1maXJzdC1wb2ludCI6ICRwb2x5Z29uX2xpc3RbMF0sICJwb2x5Z29uLXNlY29uZC1wb2ludCI6ICRwb2x5Z29uX2xpc3RbMV0sICJwb2x5Z29uLXRoaXJkLXBvaW50IjogJHBvbHlnb25fbGlzdFsyXSwgInBvbHlnb24tZm9ydGgtcG9pbnQiOiAkcG9seWdvbl9saXN0WzNdfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAibGluZS1maXJzdC1wb2ludCI6IHBvaW50KCIxMDAuNiw5OS40IiksICJsaW5lLXNlY29uZC1wb2ludCI6IHBvaW50KCItNzIuMCwtNzYuOSIpLCAicmVjdGFuZ2xlLWxlZnQtYm90dG9tLXBvaW50IjogcG9pbnQoIjkuMiw0OS4wIiksICJyZWN0YW5nbGUtdG9wLXVwcGVyLXBvaW50IjogcG9pbnQoIjc3LjgsMTExLjEiKSwgInBvbHlnb24tZmlyc3QtcG9pbnQiOiBwb2ludCgiMS4wLDEuMCIpLCAicG9seWdvbi1zZWNvbmQtcG9pbnQiOiBwb2ludCgiMi4wLDIuMCIpLCAicG9seWdvbi10aGlyZC1wb2ludCI6IHBvaW50KCIzLjAsMy4wIiksICJwb2x5Z29uLWZvcnRoLXBvaW50IjogcG9pbnQoIjQuMCw0LjAiKSB9CisKKworIyMjIGdldC1jZW50ZXIvZ2V0LXJhZGl1cyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBnZXQtY2VudGVyKGNpcmNsZV9leHByZXNzaW9uKSBvciBnZXQtcmFkaXVzKGNpcmNsZV9leHByZXNzaW9uKQorCisgKiBSZXR1cm5zIHRoZSBjZW50ZXIgYW5kIHRoZSByYWRpdXMgb2YgYSBjaXJjbGUgYGNpcmNsZV9leHByZXNzaW9uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYGNpcmNsZV9leHByZXNzaW9uYCA6IEEgYENpcmNsZWAuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFBvaW50YCBvciBgRG91YmxlYCwgcmVwcmVzZW50IHRoZSBjZW50ZXIgb3IgcmFkaXVzIG9mIHRoZSBjaXJjbGUgYGNpcmNsZV9leHByZXNzaW9uYC4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBsZXQgJGNpcmNsZSA6PSBjcmVhdGUtY2lyY2xlKGNyZWF0ZS1wb2ludCg2LjAsMy4wKSwgMS4wKQorICAgICAgICByZXR1cm4geyJjaXJjbGUtcmFkaXVzIjogZ2V0LXJhZGl1cygkY2lyY2xlKSwgImNpcmNsZS1jZW50ZXIiOiBnZXQtY2VudGVyKCRjaXJjbGUpfQorICAgICAgICAKKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgImNpcmNsZS1yYWRpdXMiOiAxLjBkLCAiY2lyY2xlLWNlbnRlciI6IHBvaW50KCI2LjAsMy4wIikgfQorCisKKworIyMjIHNwYXRpYWwtZGlzdGFuY2UgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3BhdGlhbC1kaXN0YW5jZShwb2ludF9leHByZXNzaW9uMSwgcG9pbnRfZXhwcmVzc2lvbjIpCisKKyAqIFJldHVybnMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIGBwb2ludF9leHByZXNzaW9uMWAgYW5kIGBwb2ludF9leHByZXNzaW9uMmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBwb2ludF9leHByZXNzaW9uMWAgOiBBIGBQb2ludGAuCisgICAqIGBwb2ludF9leHByZXNzaW9uMmAgOiBBIGBQb2ludGAuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERvdWJsZWAsIHJlcHJlc2VudHMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIGBwb2ludF9leHByZXNzaW9uMWAgYW5kIGBwb2ludF9leHByZXNzaW9uMmAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZXMnKQorICAgICAgICBsZXQgJGQgOj0gIHNwYXRpYWwtZGlzdGFuY2UoJHQuc2VuZGVyLWxvY2F0aW9uLCBjcmVhdGUtcG9pbnQoMzAuMCw3MC4wKSkKKyAgICAgICAgcmV0dXJuIHsicG9pbnQiOiAkdC5zZW5kZXItbG9jYXRpb24sICJkaXN0YW5jZSI6ICRkfQorICAgICAgICAKKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInBvaW50IjogcG9pbnQoIjQ3LjQ0LDgwLjY1IiksICJkaXN0YW5jZSI6IDIwLjQzNDY3ODg1NzI3NTkzNGQgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCIyOS4xNSw3Ni41MyIpLCAiZGlzdGFuY2UiOiA2LjU4NTA4OTIxNzMxNTEzMmQgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCIzNy41OSw2OC40MiIpLCAiZGlzdGFuY2UiOiA3Ljc1MjcwOTIwMzg4NDc5N2QgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCIyNC44Miw5NC42MyIpLCAiZGlzdGFuY2UiOiAyNS4xNjg4MTYwMjMwMDc1MTJkIH0KKyAgICAgICAgeyAicG9pbnQiOiBwb2ludCgiMzIuODQsNjcuMTQiKSwgImRpc3RhbmNlIjogNC4wMzA1MzM0NjM0NTEyMTJkIH0KKyAgICAgICAgeyAicG9pbnQiOiBwb2ludCgiMjkuNzIsNzUuOCIpLCAiZGlzdGFuY2UiOiA1LjgwNjc1NDY4NzQzMDgzNWQgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCIzOS4yOCw3MC40OCIpLCAiZGlzdGFuY2UiOiA5LjI5MjQwNTUwMTI2ODIyN2QgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCI0MC4wOSw5Mi42OSIpLCAiZGlzdGFuY2UiOiAyNC44MzIzMjE2Nzk2MTc0NzJkIH0KKyAgICAgICAgeyAicG9pbnQiOiBwb2ludCgiNDcuNTEsODMuOTkiKSwgImRpc3RhbmNlIjogMjIuNDEyNTAwOTc2MDE3ODJkIH0KKyAgICAgICAgeyAicG9pbnQiOiBwb2ludCgiMzYuMjEsNzIuNiIpLCAiZGlzdGFuY2UiOiA2LjczMjMxNzU4MDE1MDI0ZCB9CisgICAgICAgIHsgInBvaW50IjogcG9pbnQoIjQ2LjA1LDkzLjM0IiksICJkaXN0YW5jZSI6IDI4LjMyNTkyNjI4NjcwNzczNGQgfQorICAgICAgICB7ICJwb2ludCI6IHBvaW50KCIzNi44Niw3NC42MiIpLCAiZGlzdGFuY2UiOiA4LjI3MDY3MTA3MzEzNTQ4MmQgfQorCisKKyMjIyBzcGF0aWFsLWFyZWEgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3BhdGlhbC1kaXN0YW5jZShzcGF0aWFsXzJkX2V4cHJlc3Npb24pCisKKyAqIFJldHVybnMgdGhlIHNwYXRpYWwgYXJlYSBvZiBgc3BhdGlhbF8yZF9leHByZXNzaW9uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHNwYXRpYWxfMmRfZXhwcmVzc2lvbmAgOiBBIGBSZWN0YW5nbGVgLCBgQ2lyY2xlYCwgb3IgYFBvbHlnb25gLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBEb3VibGVgLCByZXByZXNlbnRzIHRoZSBhcmVhIG9mIGBzcGF0aWFsXzJkX2V4cHJlc3Npb25gLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkY2lyY2xlQXJlYSA6PSBzcGF0aWFsLWFyZWEoY3JlYXRlLWNpcmNsZShjcmVhdGUtcG9pbnQoMC4wLDAuMCksIDUuMCkpCisgICAgICAgIHJldHVybiB7IkFyZWEiOiRjaXJjbGVBcmVhfQorICAgICAgICAKKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgIkFyZWEiOiA3OC41Mzk4MTYyNWQgfQorCisKKyMjIyBzcGF0aWFsLWludGVyc2VjdCAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzcGF0aWFsLWludGVyc2VjdChzcGF0aWFsX2V4cHJlc3Npb24xLCBzcGF0aWFsX2V4cHJlc3Npb24yKQorCisgKiBDaGVja3Mgd2hldGhlciBgQGFyZzFgIGFuZCBgQGFyZzJgIHNwYXRpYWxseSBpbnRlcnNlY3QgZWFjaCBvdGhlci4KKyAqIEFyZ3VtZW50czoKKyAgICogYHNwYXRpYWxfZXhwcmVzc2lvbjFgIDogQSBgUG9pbnRgLCBgTGluZWAsIGBSZWN0YW5nbGVgLCBgQ2lyY2xlYCwgb3IgYFBvbHlnb25gLgorICAgKiBgc3BhdGlhbF9leHByZXNzaW9uMmAgOiBBIGBQb2ludGAsIGBMaW5lYCwgYFJlY3RhbmdsZWAsIGBDaXJjbGVgLCBvciBgUG9seWdvbmAuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYEJvb2xlYW5gLCByZXByZXNlbnRzIHdoZXRoZXIgYHNwYXRpYWxfZXhwcmVzc2lvbjFgIGFuZCBgc3BhdGlhbF9leHByZXNzaW9uMmAgc3BhdGlhbGx5IGludGVyc2VjdCBlYWNoIG90aGVyLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdCBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2VzJykKKyAgICAgICAgd2hlcmUgc3BhdGlhbC1pbnRlcnNlY3QoJHQuc2VuZGVyLWxvY2F0aW9uLCBjcmVhdGUtcmVjdGFuZ2xlKGNyZWF0ZS1wb2ludCgzMC4wLDcwLjApLCBjcmVhdGUtcG9pbnQoNDAuMCw4MC4wKSkpCisgICAgICAgIHJldHVybiAkdAorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidHdlZXRpZCI6ICI0IiwgInVzZXIiOiB7ICJzY3JlZW4tbmFtZSI6ICJOYXRoYW5HaWVzZW5AMjExIiwgImxhbmciOiAiZW4iLCAiZnJpZW5kc19jb3VudCI6IDM5MzM5LCAic3RhdHVzZXNfY291bnQiOiA0NzMsICJuYW1lIjogIk5hdGhhbiBHaWVzZW4iLCAiZm9sbG93ZXJzX2NvdW50IjogNDk0MTYgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIzOS4yOCw3MC40OCIpLCAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTEtMTItMjZUMTA6MTA6MDAuMDAwWiIpLCAicmVmZXJyZWQtdG9waWNzIjoge3sgInNwcmludCIsICJ2b2ljZS1jb21tYW5kIiB9fSwgIm1lc3NhZ2UtdGV4dCI6ICIgbGlrZSBzcHJpbnQgdGhlIHZvaWNlLWNvbW1hbmQgaXMgbWluZC1ibG93aW5nOikiIH0KKyAgICAgICAgeyAidHdlZXRpZCI6ICI3IiwgInVzZXIiOiB7ICJzY3JlZW4tbmFtZSI6ICJDaGFuZ0V3aW5nXzU3MyIsICJsYW5nIjogImVuIiwgImZyaWVuZHNfY291bnQiOiAxODIsICJzdGF0dXNlc19jb3VudCI6IDM5NCwgIm5hbWUiOiAiQ2hhbmcgRXdpbmciLCAiZm9sbG93ZXJzX2NvdW50IjogMzIxMzYgfSwgInNlbmRlci1sb2NhdGlvbiI6IHBvaW50KCIzNi4yMSw3Mi42IiksICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMS0wOC0yNVQxMDoxMDowMC4wMDBaIiksICJyZWZlcnJlZC10b3BpY3MiOiB7eyAic2Ftc3VuZyIsICJwbGF0Zm9ybSIgfX0sICJtZXNzYWdlLXRleHQiOiAiIGxpa2Ugc2Ftc3VuZyB0aGUgcGxhdGZvcm0gaXMgZ29vZCIgfQorICAgICAgICB7ICJ0d2VldGlkIjogIjkiLCAidXNlciI6IHsgInNjcmVlbi1uYW1lIjogIk5hdGhhbkdpZXNlbkAyMTEiLCAibGFuZyI6ICJlbiIsICJmcmllbmRzX2NvdW50IjogMzkzMzksICJzdGF0dXNlc19jb3VudCI6IDQ3MywgIm5hbWUiOiAiTmF0aGFuIEdpZXNlbiIsICJmb2xsb3dlcnNfY291bnQiOiA0OTQxNiB9LCAic2VuZGVyLWxvY2F0aW9uIjogcG9pbnQoIjM2Ljg2LDc0LjYyIiksICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMi0wNy0yMVQxMDoxMDowMC4wMDBaIiksICJyZWZlcnJlZC10b3BpY3MiOiB7eyAidmVyaXpvbiIsICJ2b2ljZW1haWwtc2VydmljZSIgfX0sICJtZXNzYWdlLXRleHQiOiAiIGxvdmUgdmVyaXpvbiBpdHMgdm9pY2VtYWlsLXNlcnZpY2UgaXMgYXdlc29tZSIgfQorCisKKyMjIyBzcGF0aWFsLWNlbGwgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3BhdGlhbC1jZWxsKHBvaW50X2V4cHJlc3Npb24xLCBwb2ludF9leHByZXNzaW9uMiwgeF9pbmNyZW1lbnQsIHlfaW5jcmVtZW50KQorCisgKiBSZXR1cm5zIHRoZSBncmlkIGNlbGwgdGhhdCBgcG9pbnRfZXhwcmVzc2lvbjFgIGJlbG9uZ3MgdG8uCisgKiBBcmd1bWVudHM6CisgICAqIGBwb2ludF9leHByZXNzaW9uMWAgOiBBIGBQb2ludGAsIHJlcHJlc2VudHMgdGhlIHBvaW50IG9mIGludGVyZXN0IHRoYXQgaXRzIGdyaWQgY2VsbCB3aWxsIGJlIHJldHVybmVkLgorICAgKiBgcG9pbnRfZXhwcmVzc2lvbjJgIDogQSBgUG9pbnRgLCByZXByZXNlbnRzIHRoZSBvcmlnaW4gb2YgdGhlIGdyaWQuCisgICAqIGB4X2luY3JlbWVudGAgOiBBIGBEb3VibGVgLCByZXByZXNlbnRzIFggaW5jcmVtZW50cy4KKyAgICogYHlfaW5jcmVtZW50YCA6IEEgYERvdWJsZWAsIHJlcHJlc2VudHMgWSBpbmNyZW1lbnRzLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBSZWN0YW5nbGVgLCByZXByZXNlbnRzIHRoZSBncmlkIGNlbGwgdGhhdCBgcG9pbnRfZXhwcmVzc2lvbjFgIGJlbG9uZ3MgdG8uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZXMnKQorICAgICAgICBncm91cCBieSAkYyA6PSAgc3BhdGlhbC1jZWxsKCR0LnNlbmRlci1sb2NhdGlvbiwgY3JlYXRlLXBvaW50KDIwLjAsNTAuMCksIDUuNSwgNi4wKSB3aXRoICR0CisgICAgICAgIGxldCAkbnVtIDo9ICBjb3VudCgkdCkKKyAgICAgICAgcmV0dXJuIHsgImNlbGwiOiAkYywgImNvdW50IjogJG51bX0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjIwLjAsOTIuMCAyNS41LDk4LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjI1LjUsNzQuMCAzMS4wLDgwLjAiKSwgImNvdW50IjogMiB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjMxLjAsNjIuMCAzNi41LDY4LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjMxLjAsNjguMCAzNi41LDc0LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjM2LjUsNjguMCA0Mi4wLDc0LjAiKSwgImNvdW50IjogMiB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjM2LjUsNzQuMCA0Mi4wLDgwLjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjM2LjUsOTIuMCA0Mi4wLDk4LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjQyLjAsODAuMCA0Ny41LDg2LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjQyLjAsOTIuMCA0Ny41LDk4LjAiKSwgImNvdW50IjogMSB9CisgICAgICAgIHsgImNlbGwiOiByZWN0YW5nbGUoIjQ3LjUsODAuMCA1My4wLDg2LjAiKSwgImNvdW50IjogMSB9CisKKworCisKKyMjIFNpbWlsYXJpdHkgRnVuY3Rpb25zICMjCisKK0FzdGVyaXhEQiBzdXBwb3J0cyBxdWVyaWVzIHdpdGggZGlmZmVyZW50IHNpbWlsYXJpdHkgZnVuY3Rpb25zLCBpbmNsdWRpbmcgZWRpdCBkaXN0YW5jZSBhbmQgSmFjY2FyZC4KKworIyMjIGVkaXQtZGlzdGFuY2UgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgZWRpdC1kaXN0YW5jZShleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIpCisKKyAqIFJldHVybnMgdGhlIFtodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldmVuc2h0ZWluX2Rpc3RhbmNlIGVkaXQgZGlzdGFuY2VdIG9mIGBleHByZXNzaW9uMWAgYW5kIGBleHByZXNzaW9uMmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBleHByZXNzaW9uMWAgOiBBIGBTdHJpbmdgIG9yIGEgaG9tb2dlbmVvdXMgYE9yZGVyZWRMaXN0YCBvZiBhIGNvbXBhcmFibGUgaXRlbSB0eXBlLgorICAgKiBgZXhwcmVzc2lvbjJgIDogVGhlIHNhbWUgdHlwZSBhcyBgZXhwcmVzc2lvbjFgLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBbiBgSW50MzJgIHRoYXQgcmVwcmVzZW50cyB0aGUgZWRpdC1kaXN0YW5jZSBzaW1pbGFyaXR5IG9mIGBleHByZXNzaW9uMWAgYW5kIGBleHByZXNzaW9uMmAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR1c2VyIGluIGRhdGFzZXQoJ0ZhY2Vib29rVXNlcnMnKQorICAgICAgICBsZXQgJGVkIDo9IGVkaXQtZGlzdGFuY2UoJHVzZXIubmFtZSwgIlN1emFubmEgVGlsc29uIikKKyAgICAgICAgd2hlcmUgJGVkIDw9IDIKKyAgICAgICAgcmV0dXJuICR1c2VyCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7CisgICAgICAgICJpZCI6IDcsICJhbGlhcyI6ICJTdXphbm5hIiwgIm5hbWUiOiAiU3V6YW5uYVRpbGxzb24iLCAidXNlci1zaW5jZSI6IGRhdGV0aW1lKCIyMDEyLTA4LTA3VDEwOjEwOjAwLjAwMFoiKSwgImZyaWVuZC1pZHMiOiB7eyA2IH19LAorICAgICAgICAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAiTGFiemF0cm9uIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDExLTA0LTE5IiksICJlbmQtZGF0ZSI6IG51bGwgfSBdCisgICAgICAgIH0KKworCisjIyMgZWRpdC1kaXN0YW5jZS1jaGVjayAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBlZGl0LWRpc3RhbmNlLWNoZWNrKGV4cHJlc3Npb24xLCBleHByZXNzaW9uMiwgdGhyZXNob2xkKQorCisgKiBDaGVja3Mgd2hldGhlciBgZXhwcmVzc2lvbjFgIGFuZCBgZXhwcmVzc2lvbjJgIGhhdmUgYSBbaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZSBlZGl0IGRpc3RhbmNlXSBgPD0gYHRocmVzaG9sZGAuICBUaGUg4oCcY2hlY2vigJ0gdmVyc2lvbiBvZiBlZGl0IGRpc3RhbmNlIGlzIGZhc3RlciB0aGFuIHRoZSAibm9uLWNoZWNrIiB2ZXJzaW9uIGJlY2F1c2UgdGhlIGZvcm1lciBjYW4gZGV0ZWN0IHdoZXRoZXIgdHdvIGl0ZW1zIHNhdGlzZnkgYSBnaXZlbiBzaW1pbGFyaXR5IHRocmVzaG9sZCB1c2luZyBlYXJseS10ZXJtaW5hdGlvbiB0ZWNobmlxdWVzLCBhcyBvcHBvc2VkIHRvIGNvbXB1dGluZyB0aGVpciByZWFsIGRpc3RhbmNlLiBBbHRob3VnaCBwb3NzaWJsZSwgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIHVzZXIgdG8gd3JpdGUgcXVlcmllcyB1c2luZyB0aGUg4oCcY2hlY2vigJ0gdmVyc2lvbnMgZXhwbGljaXRseSwgc2luY2UgYSByZXdyaXRlIHJ1bGUgY2FuIHBlcmZvcm0gYW4gYXBwcm9wcmlhdGUgdHJhbnNmb3JtYXRpb24gZnJvbSBhIOKAnG5vbi1jaGVja+KAnSB2ZXJzaW9uIHRvIGEg4oCcY2hlY2vigJ0gdmVyc2lvbi4KKworICogQXJndW1lbnRzOgorICAgKiBgZXhwcmVzc2lvbjFgIDogQSBgU3RyaW5nYCBvciBhIGhvbW9nZW5lb3VzIGBPcmRlcmVkTGlzdGAgb2YgYSBjb21wYXJhYmxlIGl0ZW0gdHlwZS4KKyAgICogYGV4cHJlc3Npb24yYCA6IFRoZSBzYW1lIHR5cGUgYXMgYGV4cHJlc3Npb24xYC4KKyAgICogYHRocmVzaG9sZGAgOiBBbiBgSW50MzJgIHRoYXQgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgdGhyZXNob2xkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBbiBgT3JkZXJlZExpc3RgIHdpdGggdHdvIGl0ZW1zOgorICAgICAqIFRoZSBmaXJzdCBpdGVtIGNvbnRhaW5zIGEgYEJvb2xlYW5gIHZhbHVlIHJlcHJlc2VudGluZyB3aGV0aGVyIGBleHByZXNzaW9uMWAgYW5kIGBleHByZXNzaW9uMmAgYXJlIHNpbWlsYXIuCisgICAgICogVGhlIHNlY29uZCBpdGVtIGNvbnRhaW5zIGFuIGBJbnQzMmAgdGhhdCByZXByZXNlbnRzIHRoZSBlZGl0IGRpc3RhbmNlIG9mIGBleHByZXNzaW9uMWAgYW5kIGBleHByZXNzaW9uMmAgaWYgaXQgaXMgYDw9IGB0aHJlc2hvbGRgLCBvciAwIG90aGVyd2lzZS4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VycycpCisgICAgICAgIGxldCAkZWQgOj0gZWRpdC1kaXN0YW5jZS1jaGVjaygkdXNlci5uYW1lLCAiU3V6YW5uYSBUaWxzb24iLCAyKQorICAgICAgICB3aGVyZSAkZWRbMF0KKyAgICAgICAgcmV0dXJuICRlZFsxXQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgMgorCisKKyMjIyBzaW1pbGFyaXR5LWphY2NhcmQgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc2ltaWxhcml0eS1qYWNjYXJkKGxpc3RfZXhwcmVzc2lvbjEsIGxpc3RfZXhwcmVzc2lvbjIpCisKKyAqIFJldHVybnMgdGhlIFtodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phY2NhcmRfaW5kZXggSmFjY2FyZCBzaW1pbGFyaXR5XSBvZiBgbGlzdF9leHByZXNzaW9uMWAgYW5kIGBsaXN0X2V4cHJlc3Npb24yYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYGxpc3RfZXhwcmVzc2lvbjFgIDogQW4gYFVub3JkZXJlZExpc3RgIG9yIGBPcmRlcmVkTGlzdGAuCisgICAqIGBsaXN0X2V4cHJlc3Npb24yYCA6IEFuIGBVbm9yZGVyZWRMaXN0YCBvciBgT3JkZXJlZExpc3RgLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBGbG9hdGAgdGhhdCByZXByZXNlbnRzIHRoZSBKYWNjYXJkIHNpbWlsYXJpdHkgb2YgYGxpc3RfZXhwcmVzc2lvbjFgIGFuZCBgbGlzdF9leHByZXNzaW9uMmAuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR1c2VyIGluIGRhdGFzZXQoJ0ZhY2Vib29rVXNlcnMnKQorICAgICAgICBsZXQgJHNpbSA6PSBzaW1pbGFyaXR5LWphY2NhcmQoJHVzZXIuZnJpZW5kLWlkcywgWzEsNSw5XSkKKyAgICAgICAgd2hlcmUgJHNpbSA+PSAwLjZmCisgICAgICAgIHJldHVybiAkdXNlcgorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeworICAgICAgICAiaWQiOiAzLCAiYWxpYXMiOiAiRW1vcnkiLCAibmFtZSI6ICJFbW9yeVVuayIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTItMDctMTBUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDUsIDgsIDkgfX0sCisgICAgICAgICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJnZW9tZWRpYSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAxMC0wNi0xNyIpLCAiZW5kLWRhdGUiOiBkYXRlKCIyMDEwLTAxLTI2IikgfSBdCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAiaWQiOiAxMCwgImFsaWFzIjogIkJyYW0iLCAibmFtZSI6ICJCcmFtSGF0Y2giLCAidXNlci1zaW5jZSI6IGRhdGV0aW1lKCIyMDEwLTEwLTE2VDEwOjEwOjAwLjAwMFoiKSwgImZyaWVuZC1pZHMiOiB7eyAxLCA1LCA5IH19LAorICAgICAgICAiZW1wbG95bWVudCI6IFsgeyAib3JnYW5pemF0aW9uLW5hbWUiOiAicGh5c2NhbmUiLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMDctMDYtMDUiKSwgImVuZC1kYXRlIjogZGF0ZSgiMjAxMS0xMS0wNSIpIH0gXQorICAgICAgICB9CisKKworIyMjIHNpbWlsYXJpdHktamFjY2FyZC1jaGVjayAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzaW1pbGFyaXR5LWphY2NhcmQtY2hlY2sobGlzdF9leHByZXNzaW9uMSwgbGlzdF9leHByZXNzaW9uMiwgdGhyZXNob2xkKQorCisgKiBDaGVja3Mgd2hldGhlciBgbGlzdF9leHByZXNzaW9uMWAgYW5kIGBsaXN0X2V4cHJlc3Npb24yYCBoYXZlIGEgW2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmFjY2FyZF9pbmRleCBKYWNjYXJkIHNpbWlsYXJpdHldID5gPSBgdGhyZXNob2xkYC4gIEFnYWluLCB0aGUg4oCcY2hlY2vigJ0gdmVyc2lvbiBvZiBKYWNjYXJkIGlzIGZhc3RlciB0aGFuIHRoZSAibm9uLWNoZWNrIiB2ZXJzaW9uLgorCisgKiBBcmd1bWVudHM6CisgICAqIGBsaXN0X2V4cHJlc3Npb24xYCA6IEFuIGBVbm9yZGVyZWRMaXN0YCBvciBgT3JkZXJlZExpc3RgLgorICAgKiBgbGlzdF9leHByZXNzaW9uMmAgOiBBbiBgVW5vcmRlcmVkTGlzdGAgb3IgYE9yZGVyZWRMaXN0YC4KKyAgICogYHRocmVzaG9sZGAgOiBBIEZsb2F0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2ltaWxhcml0eSB0aHJlc2hvbGQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEFuIGBPcmRlcmVkTGlzdGAgd2l0aCB0d28gaXRlbXM6CisgICAgICogVGhlIGZpcnN0IGl0ZW0gY29udGFpbnMgYSBgQm9vbGVhbmAgdmFsdWUgcmVwcmVzZW50aW5nIHdoZXRoZXIgYGxpc3RfZXhwcmVzc2lvbjFgIGFuZCBgbGlzdF9leHByZXNzaW9uMmAgYXJlIHNpbWlsYXIuCisgICAgICogVGhlIHNlY29uZCBpdGVtIGNvbnRhaW5zIGEgYEZsb2F0YCB0aGF0IHJlcHJlc2VudHMgdGhlIEphY2NhcmQgc2ltaWxhcml0eSBvZiBgbGlzdF9leHByZXNzaW9uMWAgYW5kIGBsaXN0X2V4cHJlc3Npb24yYCBpZiBpdCBpcyA+YD0gYHRocmVzaG9sZGAsIG9yIDAgb3RoZXJ3aXNlLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdXNlciBpbiBkYXRhc2V0KCdGYWNlYm9va1VzZXJzJykKKyAgICAgICAgbGV0ICRzaW0gOj0gc2ltaWxhcml0eS1qYWNjYXJkLWNoZWNrKCR1c2VyLmZyaWVuZC1pZHMsIFsxLDUsOV0sIDAuNmYpCisgICAgICAgIHdoZXJlICRzaW1bMF0KKyAgICAgICAgcmV0dXJuICRzaW1bMV0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIDAuNzVmCisgICAgICAgIDEuMGYKKworCisjIyMgU2ltaWxhcml0eSBPcGVyYXRvciB+IyAjIyMKKyAqICJgfj1gIiBpcyBzeW50YWN0aWMgc3VnYXIgZm9yIGV4cHJlc3NpbmcgYSBzaW1pbGFyaXR5IGNvbmRpdGlvbiB3aXRoIGEgZ2l2ZW4gc2ltaWxhcml0eSB0aHJlc2hvbGQuCisgKiBUaGUgc2ltaWxhcml0eSBmdW5jdGlvbiBhbmQgdGhyZXNob2xkIGZvciAiYH49YCIgYXJlIGNvbnRyb2xsZWQgdmlhICJzZXQiIGRpcmVjdGl2ZXMuCisgKiBUaGUgImB+PWAiIG9wZXJhdG9yIHJldHVybnMgYSBCb29sZWFuIHRoYXQgcmVwcmVzZW50cyB3aGV0aGVyIHRoZSBvcGVyYW5kcyBhcmUgc2ltaWxhci4KKworICogRXhhbXBsZSBmb3IgSmFjY2FyZCBzaW1pbGFyaXR5OgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIHNldCBzaW1mdW5jdGlvbiAiamFjY2FyZCI7CisgICAgICAgIHNldCBzaW10aHJlc2hvbGQgIjAuNmYiOworICAgICAgICAKKyAgICAgICAgZm9yICR1c2VyIGluIGRhdGFzZXQoJ0ZhY2Vib29rVXNlcnMnKQorICAgICAgICB3aGVyZSAkdXNlci5mcmllbmQtaWRzIH49IFsxLDUsOV0KKyAgICAgICAgcmV0dXJuICR1c2VyCisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7CisgICAgICAgICJpZCI6IDMsICJhbGlhcyI6ICJFbW9yeSIsICJuYW1lIjogIkVtb3J5VW5rIiwgInVzZXItc2luY2UiOiBkYXRldGltZSgiMjAxMi0wNy0xMFQxMDoxMDowMC4wMDBaIiksICJmcmllbmQtaWRzIjoge3sgMSwgNSwgOCwgOSB9fSwKKyAgICAgICAgImVtcGxveW1lbnQiOiBbIHsgIm9yZ2FuaXphdGlvbi1uYW1lIjogImdlb21lZGlhIiwgInN0YXJ0LWRhdGUiOiBkYXRlKCIyMDEwLTA2LTE3IiksICJlbmQtZGF0ZSI6IGRhdGUoIjIwMTAtMDEtMjYiKSB9IF0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICJpZCI6IDEwLCAiYWxpYXMiOiAiQnJhbSIsICJuYW1lIjogIkJyYW1IYXRjaCIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTAtMTAtMTZUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDEsIDUsIDkgfX0sCisgICAgICAgICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJwaHlzY2FuZSIsICJzdGFydC1kYXRlIjogZGF0ZSgiMjAwNy0wNi0wNSIpLCAiZW5kLWRhdGUiOiBkYXRlKCIyMDExLTExLTA1IikgfSBdCisgICAgICAgIH0KKworCisgKiBFeGFtcGxlIGZvciBlZGl0LWRpc3RhbmNlIHNpbWlsYXJpdHk6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgc2V0IHNpbWZ1bmN0aW9uICJlZGl0LWRpc3RhbmNlIjsKKyAgICAgICAgc2V0IHNpbXRocmVzaG9sZCAiMiI7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VycycpCisgICAgICAgIHdoZXJlICR1c2VyLm5hbWUgfj0gIlN1emFubmEgVGlsc29uIgorICAgICAgICByZXR1cm4gJHVzZXIKKworCisgKiBUaGUgZXhwZWN0ZWQgb3V0cHV0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgImlkIjogNywgImFsaWFzIjogIlN1emFubmEiLCAibmFtZSI6ICJTdXphbm5hVGlsbHNvbiIsICJ1c2VyLXNpbmNlIjogZGF0ZXRpbWUoIjIwMTItMDgtMDdUMTA6MTA6MDAuMDAwWiIpLCAiZnJpZW5kLWlkcyI6IHt7IDYgfX0sCisgICAgICAgICJlbXBsb3ltZW50IjogWyB7ICJvcmdhbml6YXRpb24tbmFtZSI6ICJMYWJ6YXRyb24iLCAic3RhcnQtZGF0ZSI6IGRhdGUoIjIwMTEtMDQtMTkiKSwgImVuZC1kYXRlIjogbnVsbCB9IF0KKyAgICAgICAgfQorCisKKyMjIFRva2VuaXppbmcgRnVuY3Rpb25zICMjCisjIyMgd29yZC10b2tlbnMgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgd29yZC10b2tlbnMoc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIFJldHVybnMgYSBsaXN0IG9mIHdvcmQgdG9rZW5zIG9mIGBzdHJpbmdfZXhwcmVzc2lvbmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIHRoYXQgd2lsbCBiZSB0b2tlbml6ZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEFuIGBPcmRlcmVkTGlzdGAgb2YgYFN0cmluZ2Agd29yZCB0b2tlbnMuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZXMnKQorICAgICAgICBsZXQgJHRva2VucyA6PSB3b3JkLXRva2VucygkdC5tZXNzYWdlLXRleHQpCisgICAgICAgIHdoZXJlICR0LnNlbmQtdGltZSA+PSBkYXRldGltZSgnMjAxMi0wMS0wMVQwMDowMDowMCcpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICJ0d2VldGlkIjogJHQudHdlZXRpZCwKKyAgICAgICAgIndvcmQtdG9rZW5zIjogJHRva2VucworICAgICAgICB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ0d2VldGlkIjogIjkiLCAid29yZC10b2tlbnMiOiBbICJsb3ZlIiwgInZlcml6b24iLCAiaXRzIiwgInZvaWNlbWFpbCIsICJzZXJ2aWNlIiwgImlzIiwgImF3ZXNvbWUiIF0gfQorCisKKyMjIyBoYXNoZWQtd29yZC10b2tlbnMgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgaGFzaGVkLXdvcmQtdG9rZW5zKHN0cmluZ19leHByZXNzaW9uKQorCisgKiBSZXR1cm5zIGEgbGlzdCBvZiBoYXNoZWQgd29yZCB0b2tlbnMgb2YgYHN0cmluZ19leHByZXNzaW9uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCB3aWxsIGJlIHRva2VuaXplZC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYE9yZGVyZWRMaXN0YCBvZiBJbnQzMiBoYXNoZWQgdG9rZW5zLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdCBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2VzJykKKyAgICAgICAgbGV0ICR0b2tlbnMgOj0gaGFzaGVkLXdvcmQtdG9rZW5zKCR0Lm1lc3NhZ2UtdGV4dCkKKyAgICAgICAgd2hlcmUgJHQuc2VuZC10aW1lID49IGRhdGV0aW1lKCcyMDEyLTAxLTAxVDAwOjAwOjAwJykKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgInR3ZWV0aWQiOiAkdC50d2VldGlkLAorICAgICAgICAiaGFzaGVkLXdvcmQtdG9rZW5zIjogJHRva2VucworICAgICAgICB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ0d2VldGlkIjogIjkiLCAiaGFzaGVkLXdvcmQtdG9rZW5zIjogWyAtMTIxNzcxOTYyMiwgLTQ0Nzg1NzQ2OSwgLTE4ODQ3MjI2ODgsIC0zMjUxNzg2NDksIDIxMDk3Njk0OSwgMjg1MDQ5Njc2LCAxOTE2NzQzOTU5IF0gfQorCisKKyMjIyBjb3VudGhhc2hlZC13b3JkLXRva2VucyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBjb3VudGhhc2hlZC13b3JkLXRva2VucyhzdHJpbmdfZXhwcmVzc2lvbikKKworICogUmV0dXJucyBhIGxpc3Qgb2YgaGFzaGVkIHdvcmQgdG9rZW5zIG9mIGBzdHJpbmdfZXhwcmVzc2lvbmAuIFRoZSBoYXNoaW5nIG1lY2hhbmlzbSBnaXZlcyBkdXBsaWNhdGUgdG9rZW5zIGRpZmZlcmVudCBoYXNoIHZhbHVlcywgYmFzZWQgb24gdGhlIG9jY3VycmVuY2UgY291bnQgb2YgdGhhdCB0b2tlbi4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCB3aWxsIGJlIHRva2VuaXplZC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYE9yZGVyZWRMaXN0YCBvZiBgSW50MzJgIGhhc2hlZCB0b2tlbnMuCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdCBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2VzJykKKyAgICAgICAgbGV0ICR0b2tlbnMgOj0gY291bnRoYXNoZWQtd29yZC10b2tlbnMoJHQubWVzc2FnZS10ZXh0KQorICAgICAgICB3aGVyZSAkdC5zZW5kLXRpbWUgPj0gZGF0ZXRpbWUoJzIwMTItMDEtMDFUMDA6MDA6MDAnKQorICAgICAgICByZXR1cm4geworICAgICAgICAidHdlZXRpZCI6ICR0LnR3ZWV0aWQsCisgICAgICAgICJjb3VudGhhc2hlZC13b3JkLXRva2VucyI6ICR0b2tlbnMKKyAgICAgICAgfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidHdlZXRpZCI6ICI5IiwgImNvdW50aGFzaGVkLXdvcmQtdG9rZW5zIjogWyAtMTIxNzcxOTYyMiwgLTQ0Nzg1NzQ2OSwgLTE4ODQ3MjI2ODgsIC0zMjUxNzg2NDksIDIxMDk3Njk0OSwgMjg1MDQ5Njc2LCAxOTE2NzQzOTU5IF0gfQorCisKKyMjIyBncmFtLXRva2VucyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBncmFtLXRva2VucyhzdHJpbmdfZXhwcmVzc2lvbiwgZ3JhbV9sZW5ndGgsIGJvb2xlYW5fZXhwcmVzc2lvbikKKworICogUmV0dXJucyBhIGxpc3Qgb2YgZ3JhbSB0b2tlbnMgb2YgYHN0cmluZ19leHByZXNzaW9uYCwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5IHNjYW5uaW5nIHRoZSBjaGFyYWN0ZXJzIHVzaW5nIGEgc2xpZGluZyB3aW5kb3cgb2YgYSBmaXhlZCBsZW5ndGguCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBBIGBTdHJpbmdgIHRoYXQgd2lsbCBiZSB0b2tlbml6ZWQuCisgICAqIGBncmFtX2xlbmd0aGAgOiBBbiBgSW50MzJgIGFzIHRoZSBsZW5ndGggb2YgZ3JhbXMuCisgICAqIGBib29sZWFuX2V4cHJlc3Npb25gIDogQSBgQm9vbGVhbmAgdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIGdyYW1zIGJ5IHByZS0gYW5kIHBvc3RmaXhpbmcgYHN0cmluZ19leHByZXNzaW9uYCB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYE9yZGVyZWRMaXN0YCBvZiBTdHJpbmcgZ3JhbSB0b2tlbnMuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZXMnKQorICAgICAgICBsZXQgJHRva2VucyA6PSBncmFtLXRva2VucygkdC5tZXNzYWdlLXRleHQsIDMsIHRydWUpCisgICAgICAgIHdoZXJlICR0LnNlbmQtdGltZSA+PSBkYXRldGltZSgnMjAxMi0wMS0wMVQwMDowMDowMCcpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICJ0d2VldGlkIjogJHQudHdlZXRpZCwKKyAgICAgICAgImdyYW0tdG9rZW5zIjogJHRva2VucworICAgICAgICB9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7CisgICAgICAgICJ0d2VldGlkIjogIjkiLAorICAgICAgICAiZ3JhbS10b2tlbnMiOiBbICIjIyAiLCAiIyBsIiwgIiBsbyIsICJsb3YiLCAib3ZlIiwgInZlICIsICJlIHYiLCAiIHZlIiwgInZlciIsICJlcmkiLCAicml6IiwgIml6byIsICJ6b24iLCAib24gIiwgIm4gaSIsICIgaXQiLCAiaXRzIiwgInRzICIsICJzIHYiLCAiIHZvIiwgInZvaSIsICJvaWMiLCAiaWNlIiwKKyAgICAgICAgImNlbSIsICJlbWEiLCAibWFpIiwgImFpbCIsICJpbC0iLCAibC1zIiwgIi1zZSIsICJzZXIiLCAiZXJ2IiwgInJ2aSIsICJ2aWMiLCAiaWNlIiwgImNlICIsICJlIGkiLCAiIGlzIiwgImlzICIsICJzIGEiLCAiIGF3IiwgImF3ZSIsICJ3ZXMiLCAiZXNvIiwgInNvbSIsICJvbWUiLCAibWUkIiwgImUkJCIgXQorICAgICAgICB9CisKKworIyMjIGhhc2hlZC1ncmFtLXRva2VucyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBoYXNoZWQtZ3JhbS10b2tlbnMoc3RyaW5nX2V4cHJlc3Npb24sIGdyYW1fbGVuZ3RoLCBib29sZWFuX2V4cHJlc3Npb24pCisKKyAqIFJldHVybnMgYSBsaXN0IG9mIGhhc2hlZCBncmFtIHRva2VucyBvZiBgc3RyaW5nX2V4cHJlc3Npb25gLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCB0aGF0IHdpbGwgYmUgdG9rZW5pemVkLgorICAgKiBgZ3JhbV9sZW5ndGhgIDogQW4gYEludDMyYCBhcyB0aGUgbGVuZ3RoIG9mIGdyYW1zLgorICAgKiBgYm9vbGVhbl9leHByZXNzaW9uYCA6IEEgYEJvb2xlYW5gIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBncmFtcyBieSBwcmUtIGFuZCBwb3N0Zml4aW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEFuIGBPcmRlcmVkTGlzdGAgb2YgYEludDMyYCBoYXNoZWQgZ3JhbSB0b2tlbnMuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICR0IGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZXMnKQorICAgICAgICBsZXQgJHRva2VucyA6PSBoYXNoZWQtZ3JhbS10b2tlbnMoJHQubWVzc2FnZS10ZXh0LCAzLCB0cnVlKQorICAgICAgICB3aGVyZSAkdC5zZW5kLXRpbWUgPj0gZGF0ZXRpbWUoJzIwMTItMDEtMDFUMDA6MDA6MDAnKQorICAgICAgICByZXR1cm4geworICAgICAgICAidHdlZXRpZCI6ICR0LnR3ZWV0aWQsCisgICAgICAgICJoYXNoZWQtZ3JhbS10b2tlbnMiOiAkdG9rZW5zCisgICAgICAgIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgInR3ZWV0aWQiOiAiOSIsCisgICAgICAgICJoYXNoZWQtZ3JhbS10b2tlbnMiOiBbIDQwNTU3MTc4LCAtMjAwMjI0MTU5MywgMTYxNjY1ODk5LCAtODU2MTA0NjAzLCAtNTAwNTQ0OTQ2LCA2OTM0MTA2MTEsIDM5NTY3NDI5OSwgLTEwMTUyMzU5MDksIDExMTU2MDgzMzcsIDExODc5OTk4NzIsIC0zMTAwNjA5NSwgLTIxOTE4MDQ2NiwgLTE2NzYwNjE2MzcsCisgICAgICAgIDEwNDAxOTQxNTMsIC0xMzM5MzA3ODQxLCAtMTUyNzExMDE2MywgLTE4ODQ3MjI2ODgsIC0xNzkxNDg3MTMsIC00MzEwMTQ2MjcsIC0xNzg5Nzg5ODIzLCAtMTIwOTcxOTkyNiwgNjg0NTE5NzY1LCAtNDg2NzM0NTEzLCAxNzM0NzQwNjE5LCAtMTk3MTY3Mzc1MSwgLTkzMjQyMTkxNSwgLTIwNjQ2NjgwNjYsCisgICAgICAgIC05MzcxMzU5NTgsIC03OTA5NDY0NjgsIC02OTA3MDMwOSwgMTU2MTYwMTQ1NCwgMjYxNjkwMDEsIC0xNjA3MzQ1NzEsIDEzMzAwNDM0NjIsIC00ODY3MzQ1MTMsIC0xODc5Njc2OCwgLTQ3MDMwMzMxNCwgMTEzNDIxMzY0LCAxNjE1NzYwMjEyLCAxNjg4MjE3NTU2LCAxMjIzNzE5MTg0LCA1MzY1NjgxMzEsCisgICAgICAgIDE2ODI2MDk4NzMsIDI5MzUxNjEsIC00MTQ3Njk0NzEsIC0xMDI3NDkwMTM3LCAxNjAyMjc2MTAyLCAxMDUwNDkwNDYxIF0KKyAgICAgICAgfQorCisKKyMjIyBjb3VudGhhc2hlZC1ncmFtLXRva2VucyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBjb3VudGhhc2hlZC1ncmFtLXRva2VucyhzdHJpbmdfZXhwcmVzc2lvbiwgZ3JhbV9sZW5ndGgsIGJvb2xlYW5fZXhwcmVzc2lvbikKKworICogUmV0dXJucyBhIGxpc3Qgb2YgaGFzaGVkIGdyYW0gdG9rZW5zIG9mIGBzdHJpbmdfZXhwcmVzc2lvbmAuIFRoZSBoYXNoaW5nIG1lY2hhbmlzbSBnaXZlcyBkdXBsaWNhdGUgdG9rZW5zIGRpZmZlcmVudCBoYXNoIHZhbHVlcywgYmFzZWQgb24gdGhlIG9jY3VycmVuY2UgY291bnQgb2YgdGhhdCB0b2tlbi4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IEEgYFN0cmluZ2AgdGhhdCB3aWxsIGJlIHRva2VuaXplZC4KKyAgICogYGdyYW1fbGVuZ3RoYCA6IEFuIGBJbnQzMmAsIGxlbmd0aCBvZiBncmFtcyB0byBnZW5lcmF0ZS4KKyAgICogYGJvb2xlYW5fZXhwcmVzc2lvbmAgOiBBIGBCb29sZWFuYCwgd2hldGhlciB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIGdyYW1zIGJ5IHByZS0gYW5kIHBvc3RmaXhpbmcgYHN0cmluZ19leHByZXNzaW9uYCB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYE9yZGVyZWRMaXN0YCBvZiBgSW50MzJgIGhhc2hlZCBncmFtIHRva2Vucy4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHQgaW4gZGF0YXNldCgnVHdlZXRNZXNzYWdlcycpCisgICAgICAgIGxldCAkdG9rZW5zIDo9IGNvdW50aGFzaGVkLWdyYW0tdG9rZW5zKCR0Lm1lc3NhZ2UtdGV4dCwgMywgdHJ1ZSkKKyAgICAgICAgd2hlcmUgJHQuc2VuZC10aW1lID49IGRhdGV0aW1lKCcyMDEyLTAxLTAxVDAwOjAwOjAwJykKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgInR3ZWV0aWQiOiAkdC50d2VldGlkLAorICAgICAgICAiY291bnRoYXNoZWQtZ3JhbS10b2tlbnMiOiAkdG9rZW5zCisgICAgICAgIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgInR3ZWV0aWQiOiAiOSIsCisgICAgICAgICJjb3VudGhhc2hlZC1ncmFtLXRva2VucyI6IFsgNDA1NTcxNzgsIC0yMDAyMjQxNTkzLCAxNjE2NjU4OTksIC04NTYxMDQ2MDMsIC01MDA1NDQ5NDYsIDY5MzQxMDYxMSwgMzk1Njc0Mjk5LCAtMTAxNTIzNTkwOSwgMTExNTYwODMzNywgMTE4Nzk5OTg3MiwgLTMxMDA2MDk1LCAtMjE5MTgwNDY2LCAtMTY3NjA2MTYzNywKKyAgICAgICAgMTA0MDE5NDE1MywgLTEzMzkzMDc4NDEsIC0xNTI3MTEwMTYzLCAtMTg4NDcyMjY4OCwgLTE3OTE0ODcxMywgLTQzMTAxNDYyNywgLTE3ODk3ODk4MjMsIC0xMjA5NzE5OTI2LCA2ODQ1MTk3NjUsIC00ODY3MzQ1MTMsIDE3MzQ3NDA2MTksIC0xOTcxNjczNzUxLCAtOTMyNDIxOTE1LCAtMjA2NDY2ODA2NiwgLTkzNzEzNTk1OCwKKyAgICAgICAgLTc5MDk0NjQ2OCwgLTY5MDcwMzA5LCAxNTYxNjAxNDU0LCAyNjE2OTAwMSwgLTE2MDczNDU3MSwgMTMzMDA0MzQ2MiwgLTQ4NjczNDUxMiwgLTE4Nzk2NzY4LCAtNDcwMzAzMzE0LCAxMTM0MjEzNjQsIDE2MTU3NjAyMTIsIDE2ODgyMTc1NTYsIDEyMjM3MTkxODQsIDUzNjU2ODEzMSwgMTY4MjYwOTg3MywgMjkzNTE2MSwKKyAgICAgICAgLTQxNDc2OTQ3MSwgLTEwMjc0OTAxMzcsIDE2MDIyNzYxMDIsIDEwNTA0OTA0NjEgXQorICAgICAgICB9CisKKworIyMgVGVtcG9yYWwgRnVuY3Rpb25zICMjCisKKyMjIyBkYXRlICMjIworICogU3ludGF4OgorCisgICAgICAgIGRhdGUoc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBgRGF0ZWAgdHlwZSBieSBwYXJzaW5nIGEgZGF0ZSBzdHJpbmcgYHN0cmluZ19leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogVGhlIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudGluZyBhIGRhdGUgdmFsdWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERhdGVgIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBzdHJpbmcuCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgeworICAgICAgICAiZGF0ZS1leHRlbmRlZCI6IGRhdGUoIjIwMTMtMDQtMDEiKSwKKyAgICAgICAgImRhdGUtYmFzaWMiOiBkYXRlKCIyMDEzMDQwMSIpCisgICAgICAgIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgImRhdGUtZXh0ZW5kZWQiOiBkYXRlKCIyMDEzLTA0LTAxIiksCisgICAgICAgICJkYXRlLWJhc2ljIjogZGF0ZSgiMjAxMy0wNC0wMSIpCisgICAgICAgIH0KKworCisjIyMgdGltZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICB0aW1lKHN0cmluZ19leHByZXNzaW9uKQorCisgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYFRpbWVgIHR5cGUgYnkgcGFyc2luZyBhIHRpbWUgc3RyaW5nIGBzdHJpbmdfZXhwcmVzc2lvbmAKKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgYSB0aW1lIHZhbHVlLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBUaW1lYCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHsKKyAgICAgICAgInRpbWUtZXh0ZW5kZWQiOiB0aW1lKCIxMjozMDo0NS42NzgrMDg6MDAiKSwKKyAgICAgICAgInRpbWUtYmFzaWMiOiB0aW1lKCIxMjMwNDU2NzgrMDgwMCIpCisgICAgICAgIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgInRpbWUtZXh0ZW5kZWQiOiB0aW1lKCIwNDozMDo0NS42NzhaIiksCisgICAgICAgICJ0aW1lLWJhc2ljIjogdGltZSgiMDQ6MzA6NDUuNjc4WiIpCisgICAgICAgIH0KKworCisjIyMgZGF0ZXRpbWUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgZGF0ZXRpbWUoc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBgRGF0ZXRpbWVgIHR5cGUgYnkgcGFyc2luZyBhIGRhdGV0aW1lIHN0cmluZyBgc3RyaW5nX2V4cHJlc3Npb25gCisgKiBBcmd1bWVudHM6CisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbmAgOiBUaGUgYFN0cmluZ2AgdmFsdWUgcmVwcmVzZW50aW5nIGEgZGF0ZXRpbWUgdmFsdWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERhdGV0aW1lYCB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHsKKyAgICAgICAgImRhdGV0aW1lLWV4dGVuZGVkIjogZGF0ZXRpbWUoIjIwMTMtMDQtMDFUMTI6MzA6NDUuNjc4KzA4OjAwIiksCisgICAgICAgICJkYXRldGltZS1iYXNpYyI6IGRhdGV0aW1lKCIyMDEzMDQwMVQxMjMwNDU2NzgrMDgwMCIpCisgICAgICAgIH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsKKyAgICAgICAgImRhdGV0aW1lLWV4dGVuZGVkIjogZGF0ZXRpbWUoIjIwMTMtMDQtMDFUMDQ6MzA6NDUuNjc4WiIpLAorICAgICAgICAiZGF0ZXRpbWUtYmFzaWMiOiBkYXRldGltZSgiMjAxMy0wNC0wMVQwNDozMDo0NS42NzhaIikKKyAgICAgICAgfQorCisKKyMjIyBpbnRlcnZhbC1mcm9tLWRhdGUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgaW50ZXJ2YWwtZnJvbS1kYXRlKHN0cmluZ19leHByZXNzaW9uMSwgc3RyaW5nX2V4cHJlc3Npb24yKQorCisgKiBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYEludGVydmFsYCB0eXBlIGJ5IHBhcnNpbmcgdHdvIGRhdGUgc3RyaW5ncy4KKyAqIEFyZ3VtZW50czoKKyAgICogYHN0cmluZ19leHByZXNzaW9uMWAgOiBUaGUgYFN0cmluZ2AgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzdGFydGluZyBkYXRlLgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb24yYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVuZGluZyBkYXRlLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBbiBgSW50ZXJ2YWxgIHZhbHVlIGJldHdlZW4gdGhlIHR3byBkYXRlcy4KKworICogRXhhbXBsZToKKworICAgICAgICB7ImRhdGUtaW50ZXJ2YWwiOiBpbnRlcnZhbC1mcm9tLWRhdGUoIjIwMTItMDEtMDEiLCAiMjAxMy0wNC0wMSIpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiZGF0ZS1pbnRlcnZhbCI6IGludGVydmFsLWRhdGUoIjIwMTItMDEtMDEsIDIwMTMtMDQtMDEiKSB9CisKKworIyMjIGludGVydmFsLWZyb20tdGltZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBpbnRlcnZhbC1mcm9tLXRpbWUoc3RyaW5nX2V4cHJlc3Npb24xLCBzdHJpbmdfZXhwcmVzc2lvbjIpCisKKyAqIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBgSW50ZXJ2YWxgIHR5cGUgYnkgcGFyc2luZyB0d28gdGltZSBzdHJpbmdzLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb24xYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHN0YXJ0aW5nIHRpbWUuCisgICAqIGBzdHJpbmdfZXhwcmVzc2lvbjJgIDogVGhlIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZW5kaW5nIHRpbWUuCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEFuIGBJbnRlcnZhbGAgdmFsdWUgYmV0d2VlbiB0aGUgdHdvIHRpbWVzLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHsidGltZS1pbnRlcnZhbCI6IGludGVydmFsLWZyb20tdGltZSgiMTI6MjM6MzQuNDU2WiIsICIyMzM0NDU1NjcrMDgwMCIpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAidGltZS1pbnRlcnZhbCI6IGludGVydmFsLXRpbWUoIjEyOjIzOjM0LjQ1NlosIDE1OjM0OjQ1LjU2N1oiKSB9CisKKworIyMjIGludGVydmFsLWZyb20tZGF0ZXRpbWUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgaW50ZXJ2YWwtZnJvbS1kYXRldGltZShzdHJpbmdfZXhwcmVzc2lvbjEsIHN0cmluZ19leHByZXNzaW9uMikKKworICogQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGBJbnRlcnZhbGAgdHlwZSBieSBwYXJzaW5nIHR3byBkYXRldGltZSBzdHJpbmdzLgorICogQXJndW1lbnRzOgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb24xYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHN0YXJ0aW5nIGRhdGV0aW1lLgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb24yYCA6IFRoZSBgU3RyaW5nYCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVuZGluZyBkYXRldGltZS4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYEludGVydmFsYCB2YWx1ZSBiZXR3ZWVuIHRoZSB0d28gZGF0ZXRpbWVzLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHsiZGF0ZXRpbWUtaW50ZXJ2YWwiOiBpbnRlcnZhbC1mcm9tLWRhdGV0aW1lKCIyMDEyLTAxLTAxVDEyOjIzOjM0LjQ1NiswODowMCIsICIyMDEzMDQwMVQxNTM0NDU1NjdaIil9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJkYXRldGltZS1pbnRlcnZhbCI6IGludGVydmFsLWRhdGV0aW1lKCIyMDEyLTAxLTAxVDA0OjIzOjM0LjQ1NlosIDIwMTMtMDQtMDFUMTU6MzQ6NDUuNTY3WiIpIH0KKworCisjIyMgeWVhci9tb250aC9kYXkvaG91ci9taW51dGUvc2Vjb25kL21pbGxpc2Vjb25kICMjIworICogU3ludGF4OgorCisgICAgICAgIHllYXIvbW9udGgvZGF5L2hvdXIvbWludXRlL3NlY29uZC9taWxsaXNlY29uZCh0ZW1wb3JhbF9leHByZXNzaW9uKQorCisgKiBBY2Nlc3NvcnMgZm9yIGFjY2Vzc2luZyBmaWVsZHMgaW4gYSB0ZW1wb3JhbCB2YWx1ZQorICogQXJndW1lbnRzOgorICAgKiBgdGVtcG9yYWxfZXhwcmVzc2lvbmAgOiBhIHRlbXBvcmFsIHZhbHVlIHJlcHJlc2VudGVkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiBgRGF0ZWAsIGBEYXRldGltZWAsIGBUaW1lYCwgYER1cmF0aW9uYC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQW4gYEludDMyYCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC4KKworICogRXhhbXBsZToKKworICAgICAgICBsZXQgJGMxIDo9IGRhdGUoIjIwMTAtMTAtMzAiKQorICAgICAgICBsZXQgJGMyIDo9IGRhdGV0aW1lKCIxOTg3LTExLTE5VDIzOjQ5OjIzLjkzOCIpCisgICAgICAgIGxldCAkYzMgOj0gdGltZSgiMTI6MjM6MzQuOTMwKzA3OjAwIikKKyAgICAgICAgbGV0ICRjNCA6PSBkdXJhdGlvbigiUDNZNzNNNjMyRFQ0OUg3NDNNMzk0OC45NFMiKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHsieWVhciI6IHllYXIoJGMxKSwgIm1vbnRoIjogbW9udGgoJGMyKSwgImRheSI6IGRheSgkYzEpLCAiaG91ciI6IGhvdXIoJGMzKSwgIm1pbiI6IG1pbnV0ZSgkYzQpLCAic2Vjb25kIjogc2Vjb25kKCRjMiksICJtcyI6IG1pbGxpc2Vjb25kKCRjNCl9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJ5ZWFyIjogMjAxMCwgIm1vbnRoIjogMTEsICJkYXkiOiAzMCwgImhvdXIiOiA1LCAibWluIjogMjgsICJzZWNvbmQiOiAyMywgIm1zIjogOTQgfQorCisKKworIyMjIGFkZC1kYXRlLWR1cmF0aW9uICMjIworICogU3ludGF4OgorCisgICAgICAgIGFkZC1kYXRlLWR1cmF0aW9uKGRhdGVfZXhwcmVzc2lvbiwgZHVyYXRpb25fZXhwcmVzc2lvbikKKworICogQ3JlYXRlIGEgbmV3IGRhdGUgYnkgYWRkaW5nIHRoZSBkdXJhdGlvbiBgZHVyYXRpb25fZXhwcmVzc2lvbmAgdG8gdGhlIGdpdmVuIGRhdGUgYGRhdGVfZXhwcmVzc2lvbmAuCisgKiBBcmd1bWVudHM6CisgICAqIGBkYXRlX2V4cHJlc3Npb25gIDogVGhlIGBEYXRlYCB2YWx1ZSB0byBiZSBhZGRlZCBvbnRvLgorICAgKiBgZHVyYXRpb25fZXhwcmVzc2lvbmAgOiBUaGUgYER1cmF0aW9uYCB0byBiZSBhZGRlZC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRGF0ZWAgdmFsdWUgcmVwcmVzZW50cyB0aGUgbmV3IGRhdGUgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgYnkgdGhlIGR1cmF0aW9uLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGxldCAkc3RhcnRkYXRlIDo9IGRhdGUoJzIwMTEtMDMtMDEnKQorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnVHdlZXRNZXNzYWdlJykKKyAgICAgICAgd2hlcmUgZGF0ZS1mcm9tLWRhdGV0aW1lKCRpLnNlbmQtdGltZSkgPiAkc3RhcnRkYXRlCisgICAgICAgIGFuZCBkYXRlLWZyb20tZGF0ZXRpbWUoJGkuc2VuZC10aW1lKSA8IGFkZC1kYXRlLWR1cmF0aW9uKCRzdGFydGRhdGUsIGR1cmF0aW9uKCdQMlknKSkKKyAgICAgICAgcmV0dXJuIHsic2VuZC10aW1lIjogJGkuc2VuZC10aW1lLCAibWVzc2FnZSI6ICRpLm1lc3NhZ2UtdGV4dH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDExLTEyLTI2VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2Ugc3ByaW50IHRoZSB2b2ljZS1jb21tYW5kIGlzIG1pbmQtYmxvd2luZzopIiB9CisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDExLTA4LTI1VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2Ugc2Ftc3VuZyB0aGUgcGxhdGZvcm0gaXMgZ29vZCIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMi0wNy0yMVQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0KKworCisjIyMgYWRkLWRhdGV0aW1lLWR1cmF0aW9uICMjIworICogU3ludGF4OgorCisgICAgICAgIGFkZC1kYXRlLWR1cmF0aW9uKGRhdGV0aW1lX2V4cHJlc3Npb24sIGR1cmF0aW9uX2V4cHJlc3Npb24pCisKKyAqIENyZWF0ZSBhIG5ldyBkYXRldGltZSBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIGBkdXJhdGlvbl9leHByZXNzaW9uYCB0byB0aGUgZ2l2ZW4gZGF0ZXRpbWUgYGRhdGV0aW1lX2V4cHJlc3Npb25gLgorICogQXJndW1lbnRzOgorICAgKiBgZGF0ZXRpbWVfZXhwcmVzc2lvbmAgOiBUaGUgYERhdGV0aW1lYCB2YWx1ZSB0byBiZSBhZGRlZCBvbnRvLgorICAgKiBgZHVyYXRpb25fZXhwcmVzc2lvbmAgOiBUaGUgYER1cmF0aW9uYCB0byBiZSBhZGRlZC4KKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRGF0ZXRpbWVgIHZhbHVlIHJlcHJlc2VudHMgdGhlIG5ldyBkYXRldGltZSBhZnRlciBiZWluZyBhZGp1c3RlZCBieSB0aGUgZHVyYXRpb24uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgbGV0ICRzdGFydGR0IDo9IGRhdGV0aW1lKCcyMDExLTAzLTAxVDAwOjAwOjAwJykKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZScpCisgICAgICAgIHdoZXJlICRpLnNlbmQtdGltZSA+ICRzdGFydGR0IGFuZCAkaS5zZW5kLXRpbWUgPCBhZGQtZGF0ZXRpbWUtZHVyYXRpb24oJHN0YXJ0ZHQsIGR1cmF0aW9uKCdQMlknKSkKKyAgICAgICAgcmV0dXJuIHsic2VuZC10aW1lIjogJGkuc2VuZC10aW1lLCAibWVzc2FnZSI6ICRpLm1lc3NhZ2UtdGV4dH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDExLTEyLTI2VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2Ugc3ByaW50IHRoZSB2b2ljZS1jb21tYW5kIGlzIG1pbmQtYmxvd2luZzopIiB9CisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDExLTA4LTI1VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2Ugc2Ftc3VuZyB0aGUgcGxhdGZvcm0gaXMgZ29vZCIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMi0wNy0yMVQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0KKworCisjIyMgYWRkLXRpbWUtZHVyYXRpb24gIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgYWRkLXRpbWUtZHVyYXRpb24odGltZV9leHByZXNzaW9uLCBkdXJhdGlvbl9leHByZXNzaW9uKQorCisgKiBDcmVhdGUgYSBuZXcgdGltZSBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIGBkdXJhdGlvbl9leHByZXNzaW9uYCB0byB0aGUgZ2l2ZW4gdGltZSBgdGltZV9leHByZXNzaW9uYC4KKyAqIEFyZ3VtZW50czoKKyAgICogYHRpbWVfZXhwcmVzc2lvbmAgOiBUaGUgYFRpbWVgIHZhbHVlIHRvIGJlIGFkZGVkIG9udG8uCisgICAqIGBkdXJhdGlvbl9leHByZXNzaW9uYCA6IFRoZSBgRHVyYXRpb25gIHRvIGJlIGFkZGVkLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBUaW1lYCB2YWx1ZSByZXByZXNlbnRzIHRoZSBuZXcgdGltZSBhZnRlciBiZWluZyBhZGp1c3RlZCBieSB0aGUgZHVyYXRpb24uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgbGV0ICRzdGFydHRpbWUgOj0gdGltZSgnMDg6MDA6MDAnKQorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnVHdlZXRNZXNzYWdlJykKKyAgICAgICAgd2hlcmUgdGltZS1mcm9tLWRhdGV0aW1lKCRpLnNlbmQtdGltZSkgPiAkc3RhcnR0aW1lIGFuZCB0aW1lLWZyb20tZGF0ZXRpbWUoJGkuc2VuZC10aW1lKSA8IGFkZC10aW1lLWR1cmF0aW9uKCRzdGFydHRpbWUsIGR1cmF0aW9uKCdQVDVIJykpCisgICAgICAgIHJldHVybiB7InNlbmQtdGltZSI6ICRpLnNlbmQtdGltZSwgIm1lc3NhZ2UiOiAkaS5tZXNzYWdlLXRleHR9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAwOC0wNC0yNlQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsb3ZlIHQtbW9iaWxlIGl0cyBjdXN0b21pemF0aW9uIGlzIGdvb2Q6KSIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMC0wNS0xM1QxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsaWtlIHZlcml6b24gaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9CisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDA2LTExLTA0VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2UgbW90b3JvbGEgdGhlIHNwZWVkIGlzIGdvb2Q6KSIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMS0xMi0yNlQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsaWtlIHNwcmludCB0aGUgdm9pY2UtY29tbWFuZCBpcyBtaW5kLWJsb3dpbmc6KSIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAwNi0wOC0wNFQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBjYW4ndCBzdGFuZCBtb3Rvcm9sYSBpdHMgc3BlZWQgaXMgdGVycmlibGU6KCIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMC0wNS0wN1QxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsaWtlIGlwaG9uZSB0aGUgdm9pY2UtY2xhcml0eSBpcyBnb29kOikiIH0KKyAgICAgICAgeyAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMTEtMDgtMjVUMTA6MTA6MDAuMDAwWiIpLCAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSBwbGF0Zm9ybSBpcyBnb29kIiB9CisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDA1LTEwLTE0VDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxpa2UgdC1tb2JpbGUgdGhlIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9CisgICAgICAgIHsgInNlbmQtdGltZSI6IGRhdGV0aW1lKCIyMDEyLTA3LTIxVDEwOjEwOjAwLjAwMFoiKSwgIm1lc3NhZ2UiOiAiIGxvdmUgdmVyaXpvbiBpdHMgdm9pY2VtYWlsLXNlcnZpY2UgaXMgYXdlc29tZSIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAwOC0wMS0yNlQxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBoYXRlIHZlcml6b24gaXRzIHZvaWNlLWNsYXJpdHkgaXMgT01HOigiIH0KKyAgICAgICAgeyAic2VuZC10aW1lIjogZGF0ZXRpbWUoIjIwMDgtMDMtMDlUMTA6MTA6MDAuMDAwWiIpLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgaXBob25lIGl0cyBwbGF0Zm9ybSBpcyB0ZXJyaWJsZSIgfQorICAgICAgICB7ICJzZW5kLXRpbWUiOiBkYXRldGltZSgiMjAxMC0wMi0xM1QxMDoxMDowMC4wMDBaIiksICJtZXNzYWdlIjogIiBsaWtlIHNhbXN1bmcgdGhlIHZvaWNlLWNvbW1hbmQgaXMgYW1hemluZzopIiB9CisKKworIyMjIGFkanVzdC1kYXRldGltZS1mb3ItdGltZXpvbmUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgYWRqdXN0LWRhdGV0aW1lLWZvci10aW1lem9uZShkYXRldGltZV9leHByZXNzaW9uLCBzdHJpbmdfZXhwcmVzc2lvbikKKworICogQWRqdXN0IHRoZSBnaXZlbiBkYXRldGltZSBgZGF0ZXRpbWVfZXhwcmVzc2lvbmAgYnkgYXBwbHlpbmcgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uIGBzdHJpbmdfZXhwcmVzc2lvbmAKKyAqIEFyZ3VtZW50czoKKyAgICogYGRhdGV0aW1lX2V4cHJlc3Npb25gIDogQSBgRGF0ZXRpbWVgIHZhbHVlIHRvIGJlIGFkanVzdGVkLgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCByZXByZXNlbnRpbmcgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudHMgdGhlIG5ldyBkYXRldGltZSBhZnRlciBiZWluZyBhZGp1c3RlZCBieSB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ1R3ZWV0TWVzc2FnZScpCisgICAgICAgIHJldHVybiB7ImFkanVzdGVkLXNlbmQtdGltZSI6IGFkanVzdC1kYXRldGltZS1mb3ItdGltZXpvbmUoJGkuc2VuZC10aW1lLCAiKzA4OjAwIiksICJtZXNzYWdlIjogJGkubWVzc2FnZS10ZXh0fQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjIwMDgtMDQtMjZUMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGxvdmUgdC1tb2JpbGUgaXRzIGN1c3RvbWl6YXRpb24gaXMgZ29vZDopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIyMDEwLTA1LTEzVDE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsaWtlIHZlcml6b24gaXRzIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIyMDA2LTExLTA0VDE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjIwMTEtMTItMjZUMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGxpa2Ugc3ByaW50IHRoZSB2b2ljZS1jb21tYW5kIGlzIG1pbmQtYmxvd2luZzopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIyMDA2LTA4LTA0VDE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBjYW4ndCBzdGFuZCBtb3Rvcm9sYSBpdHMgc3BlZWQgaXMgdGVycmlibGU6KCIgfQorICAgICAgICB7ICJhZGp1c3RlZC1zZW5kLXRpbWUiOiAiMjAxMC0wNS0wN1QxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSBpcGhvbmUgdGhlIHZvaWNlLWNsYXJpdHkgaXMgZ29vZDopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIyMDExLTA4LTI1VDE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsaWtlIHNhbXN1bmcgdGhlIHBsYXRmb3JtIGlzIGdvb2QiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjIwMDUtMTAtMTRUMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGxpa2UgdC1tb2JpbGUgdGhlIHNob3J0Y3V0LW1lbnUgaXMgYXdlc29tZTopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIyMDEyLTA3LTIxVDE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjIwMDgtMDEtMjZUMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGhhdGUgdmVyaXpvbiBpdHMgdm9pY2UtY2xhcml0eSBpcyBPTUc6KCIgfQorICAgICAgICB7ICJhZGp1c3RlZC1zZW5kLXRpbWUiOiAiMjAwOC0wMy0wOVQxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgY2FuJ3Qgc3RhbmQgaXBob25lIGl0cyBwbGF0Zm9ybSBpcyB0ZXJyaWJsZSIgfQorICAgICAgICB7ICJhZGp1c3RlZC1zZW5kLXRpbWUiOiAiMjAxMC0wMi0xM1QxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSB2b2ljZS1jb21tYW5kIGlzIGFtYXppbmc6KSIgfQorCisKKyMjIyBhZGp1c3QtdGltZS1mb3ItdGltZXpvbmUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgYWRqdXN0LXRpbWUtZm9yLXRpbWV6b25lKHRpbWVfZXhwcmVzc2lvbiwgc3RyaW5nX2V4cHJlc3Npb24pCisKKyAqIEFkanVzdCB0aGUgZ2l2ZW4gdGltZSBgdGltZV9leHByZXNzaW9uYCBieSBhcHBseWluZyB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24gYHN0cmluZ19leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgdGltZV9leHByZXNzaW9uYCA6IEEgYFRpbWVgIHZhbHVlIHRvIGJlIGFkanVzdGVkLgorICAgKiBgc3RyaW5nX2V4cHJlc3Npb25gIDogQSBgU3RyaW5nYCByZXByZXNlbnRpbmcgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uLgorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBTdHJpbmdgIHZhbHVlIHJlcHJlc2VudHMgdGhlIG5ldyB0aW1lIGFmdGVyIGJlaW5nIGFkanVzdGVkIGJ5IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4KKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnVHdlZXRNZXNzYWdlJykKKyAgICAgICAgcmV0dXJuIHsiYWRqdXN0ZWQtc2VuZC10aW1lIjogYWRqdXN0LXRpbWUtZm9yLXRpbWV6b25lKHRpbWUtZnJvbS1kYXRldGltZSgkaS5zZW5kLXRpbWUpLCAiKzA4OjAwIiksICJtZXNzYWdlIjogJGkubWVzc2FnZS10ZXh0fQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsb3ZlIHQtbW9iaWxlIGl0cyBjdXN0b21pemF0aW9uIGlzIGdvb2Q6KSIgfQorICAgICAgICB7ICJhZGp1c3RlZC1zZW5kLXRpbWUiOiAiMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGxpa2UgdmVyaXpvbiBpdHMgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsaWtlIG1vdG9yb2xhIHRoZSBzcGVlZCBpcyBnb29kOikiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsaWtlIHNwcmludCB0aGUgdm9pY2UtY29tbWFuZCBpcyBtaW5kLWJsb3dpbmc6KSIgfQorICAgICAgICB7ICJhZGp1c3RlZC1zZW5kLXRpbWUiOiAiMTg6MTA6MDAuMDAwKzA4OjAwIiwgIm1lc3NhZ2UiOiAiIGNhbid0IHN0YW5kIG1vdG9yb2xhIGl0cyBzcGVlZCBpcyB0ZXJyaWJsZTooIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSBpcGhvbmUgdGhlIHZvaWNlLWNsYXJpdHkgaXMgZ29vZDopIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSBwbGF0Zm9ybSBpcyBnb29kIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSB0LW1vYmlsZSB0aGUgc2hvcnRjdXQtbWVudSBpcyBhd2Vzb21lOikiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBsb3ZlIHZlcml6b24gaXRzIHZvaWNlbWFpbC1zZXJ2aWNlIGlzIGF3ZXNvbWUiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBoYXRlIHZlcml6b24gaXRzIHZvaWNlLWNsYXJpdHkgaXMgT01HOigiIH0KKyAgICAgICAgeyAiYWRqdXN0ZWQtc2VuZC10aW1lIjogIjE4OjEwOjAwLjAwMCswODowMCIsICJtZXNzYWdlIjogIiBjYW4ndCBzdGFuZCBpcGhvbmUgaXRzIHBsYXRmb3JtIGlzIHRlcnJpYmxlIiB9CisgICAgICAgIHsgImFkanVzdGVkLXNlbmQtdGltZSI6ICIxODoxMDowMC4wMDArMDg6MDAiLCAibWVzc2FnZSI6ICIgbGlrZSBzYW1zdW5nIHRoZSB2b2ljZS1jb21tYW5kIGlzIGFtYXppbmc6KSIgfQorCisKKyMjIyBjYWxlbmRhci1kdXJhdGlvbi1mcm9tLWRhdGV0aW1lICMjIworICogU3ludGF4OgorCisgICAgICAgIGNhbGVuZGFyLWR1cmF0aW9uLWZyb20tZGF0ZXRpbWUoZGF0ZXRpbWVfZXhwcmVzc2lvbiwgZHVyYXRpb25fZXhwcmVzc2lvbikKKworICogR2V0IGEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVyYXRpb24gYGR1cmF0aW9uX2V4cHJlc3Npb25gIGJhc2VkIG9uIHRoZSBnaXZlbiBkYXRldGltZSBgZGF0ZXRpbWVfZXhwcmVzc2lvbmAKKyAqIEFyZ3VtZW50czoKKyAgICogYGRhdGV0aW1lX2V4cHJlc3Npb25gIDogQSBgRGF0ZXRpbWVgIHZhbHVlIHRvIGJlIHVzZWQgYXMgdGhlIHJlZmVyZW5jZSB0aW1lIHBvaW50LgorICAgKiBgZHVyYXRpb25fZXhwcmVzc2lvbmAgOiBBIGBEdXJhdGlvbmAgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYER1cmF0aW9uYCB2YWx1ZSB3aXRoIHRoZSBkdXJhdGlvbiBhcyBgZHVyYXRpb25fZXhwcmVzc2lvbmAgYnV0IHdpdGggYSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2UnKQorICAgICAgICB3aGVyZSAkaS5zZW5kLXRpbWUgPiBkYXRldGltZSgiMjAxMS0wMS0wMVQwMDowMDowMCIpCisgICAgICAgIHJldHVybiB7InNpbmNlLTIwMTEiOiBzdWJ0cmFjdC1kYXRldGltZSgkaS5zZW5kLXRpbWUsIGRhdGV0aW1lKCIyMDExLTAxLTAxVDAwOjAwOjAwIikpLCAic2luY2UtMjAxMS11c2VyLWZyaWVuZGx5IjogY2FsZW5kYXItZHVyYXRpb24tZnJvbS1kYXRldGltZSgkaS5zZW5kLXRpbWUsIHN1YnRyYWN0LWRhdGV0aW1lKCRpLnNlbmQtdGltZSwgZGF0ZXRpbWUoIjIwMTEtMDEtMDFUMDA6MDA6MDAiKSkpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAic2luY2UtMjAxMSI6IGR1cmF0aW9uKCJQMzU5RFQxMEgxME0iKSwgInNpbmNlLTIwMTEtdXNlci1mcmllbmRseSI6IGR1cmF0aW9uKCJQMTFNMjNEVDEwSDEwTSIpIH0KKyAgICAgICAgeyAic2luY2UtMjAxMSI6IGR1cmF0aW9uKCJQMjM2RFQxMEgxME0iKSwgInNpbmNlLTIwMTEtdXNlci1mcmllbmRseSI6IGR1cmF0aW9uKCJQN00yM0RUMTBIMTBNIikgfQorICAgICAgICB7ICJzaW5jZS0yMDExIjogZHVyYXRpb24oIlA1NjdEVDEwSDEwTSIpLCAic2luY2UtMjAxMS11c2VyLWZyaWVuZGx5IjogZHVyYXRpb24oIlAxWTZNMThEVDEwSDEwTSIpIH0KKworCisjIyMgY2FsZW5kYXItZHVyYXRpb24tZnJvbS1kYXRlICMjIworICogU3ludGF4OgorCisgICAgICAgIGNhbGVuZGFyLWR1cmF0aW9uLWZyb20tZGF0ZShkYXRlX2V4cHJlc3Npb24sIGR1cmF0aW9uX2V4cHJlc3Npb24pCisKKyAqIEdldCBhIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1cmF0aW9uIGBkdXJhdGlvbl9leHByZXNzaW9uYCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0ZSBgZGF0ZV9leHByZXNzaW9uYAorICogQXJndW1lbnRzOgorICAgKiBgZGF0ZV9leHByZXNzaW9uYCA6IEEgYERhdGVgIHZhbHVlIHRvIGJlIHVzZWQgYXMgdGhlIHJlZmVyZW5jZSB0aW1lIHBvaW50LgorICAgKiBgZHVyYXRpb25fZXhwcmVzc2lvbmAgOiBBIGBEdXJhdGlvbmAgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYER1cmF0aW9uYCB2YWx1ZSB3aXRoIHRoZSBkdXJhdGlvbiBhcyBgZHVyYXRpb25fZXhwcmVzc2lvbmAgYnV0IHdpdGggYSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2UnKQorICAgICAgICB3aGVyZSAkaS5zZW5kLXRpbWUgPiBkYXRldGltZSgiMjAxMS0wMS0wMVQwMDowMDowMCIpCisgICAgICAgIHJldHVybiB7InNpbmNlLTIwMTEiOiBzdWJ0cmFjdC1kYXRldGltZSgkaS5zZW5kLXRpbWUsIGRhdGV0aW1lKCIyMDExLTAxLTAxVDAwOjAwOjAwIikpLAorICAgICAgICAic2luY2UtMjAxMS11c2VyLWZyaWVuZGx5IjogY2FsZW5kYXItZHVyYXRpb24tZnJvbS1kYXRlKGRhdGUtZnJvbS1kYXRldGltZSgkaS5zZW5kLXRpbWUpLCBzdWJ0cmFjdC1kYXRldGltZSgkaS5zZW5kLXRpbWUsIGRhdGV0aW1lKCIyMDExLTAxLTAxVDAwOjAwOjAwIikpKX0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgInNpbmNlLTIwMTEiOiBkdXJhdGlvbigiUDM1OURUMTBIMTBNIiksICJzaW5jZS0yMDExLXVzZXItZnJpZW5kbHkiOiBkdXJhdGlvbigiUDExTTIzRFQxMEgxME0iKSB9CisgICAgICAgIHsgInNpbmNlLTIwMTEiOiBkdXJhdGlvbigiUDIzNkRUMTBIMTBNIiksICJzaW5jZS0yMDExLXVzZXItZnJpZW5kbHkiOiBkdXJhdGlvbigiUDdNMjNEVDEwSDEwTSIpIH0KKyAgICAgICAgeyAic2luY2UtMjAxMSI6IGR1cmF0aW9uKCJQNTY3RFQxMEgxME0iKSwgInNpbmNlLTIwMTEtdXNlci1mcmllbmRseSI6IGR1cmF0aW9uKCJQMVk2TTE4RFQxMEgxME0iKSB9CisKKworIyMjIGN1cnJlbnQtZGF0ZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBjdXJyZW50LWRhdGUoKQorCisgKiBHZXQgdGhlIGN1cnJlbnQgZGF0ZQorICogQXJndW1lbnRzOk5vbmUKKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRGF0ZWAgdmFsdWUgb2YgdGhlIGRhdGUgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorCisjIyMgY3VycmVudC10aW1lICMjIworICogU3ludGF4OgorCisgICAgICAgIGN1cnJlbnQtdGltZSgpCisKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lCisgKiBBcmd1bWVudHM6Tm9uZQorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBUaW1lYCB2YWx1ZSBvZiB0aGUgdGltZSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCisKKyMjIyBjdXJyZW50LWRhdGV0aW1lICMjIworICogU3ludGF4OgorCisgICAgICAgIGN1cnJlbnQtZGF0ZXRpbWUoKQorCisgKiBHZXQgdGhlIGN1cnJlbnQgZGF0ZXRpbWUKKyAqIEFyZ3VtZW50czpOb25lCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERhdGV0aW1lYCB2YWx1ZSBvZiB0aGUgZGF0ZXRpbWUgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIHsiY3VycmVudC1kYXRlIjogY3VycmVudC1kYXRlKCksCisgICAgICAgICJjdXJyZW50LXRpbWUiOiBjdXJyZW50LXRpbWUoKSwKKyAgICAgICAgImN1cnJlbnQtZGF0ZXRpbWUiOiBjdXJyZW50LWRhdGV0aW1lKCl9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJjdXJyZW50LWRhdGUiOiBkYXRlKCIyMDEzLTA0LTA2IiksCisgICAgICAgICJjdXJyZW50LXRpbWUiOiB0aW1lKCIwMDo0ODo0NC4wOTNaIiksCisgICAgICAgICJjdXJyZW50LWRhdGV0aW1lIjogZGF0ZXRpbWUoIjIwMTMtMDQtMDZUMDA6NDg6NDQuMDkzWiIpIH0KKworCisjIyMgZGF0ZS1mcm9tLWRhdGV0aW1lICMjIworICogU3ludGF4OgorCisgICAgICAgIGRhdGUtZnJvbS1kYXRldGltZShkYXRldGltZV9leHByZXNzaW9uKQorCisgKiBHZXQgdGhlIGRhdGUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZGF0ZXRpbWUgdmFsdWUgYGRhdGV0aW1lX2V4cHJlc3Npb25gCisgKiBBcmd1bWVudHM6CisgICAqIGBkYXRldGltZV9leHByZXNzaW9uYDogQSBgRGF0ZXRpbWVgIHZhbHVlIHRvIGJlIGV4dHJhY3RlZCBmcm9tCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYERhdGVgIHZhbHVlIGZyb20gdGhlIGRhdGV0aW1lLgorCisjIyMgdGltZS1mcm9tLWRhdGV0aW1lICMjIworICogU3ludGF4OgorCisgICAgICAgIHRpbWUtZnJvbS1kYXRldGltZShkYXRldGltZV9leHByZXNzaW9uKQorCisgKiBHZXQgdGhlIHRpbWUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZGF0ZXRpbWUgdmFsdWUgYGRhdGV0aW1lX2V4cHJlc3Npb25gCisgKiBBcmd1bWVudHM6CisgICAqIGBkYXRldGltZV9leHByZXNzaW9uYDogQSBgRGF0ZXRpbWVgIHZhbHVlIHRvIGJlIGV4dHJhY3RlZCBmcm9tCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFRpbWVgIHZhbHVlIGZyb20gdGhlIGRhdGV0aW1lLgorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdUd2VldE1lc3NhZ2UnKQorICAgICAgICB3aGVyZSAkaS5zZW5kLXRpbWUgPiBkYXRldGltZSgiMjAxMS0wMS0wMVQwMDowMDowMCIpCisgICAgICAgIHJldHVybiB7InNlbmQtZGF0ZSI6IGRhdGUtZnJvbS1kYXRldGltZSgkaS5zZW5kLXRpbWUpLCAic2VuZC10aW1lIjogdGltZS1mcm9tLWRhdGV0aW1lKCRpLnNlbmQtdGltZSl9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJzZW5kLWRhdGUiOiBkYXRlKCIyMDExLTEyLTI2IiksICJzZW5kLXRpbWUiOiB0aW1lKCIxMDoxMDowMC4wMDBaIikgfQorICAgICAgICB7ICJzZW5kLWRhdGUiOiBkYXRlKCIyMDExLTA4LTI1IiksICJzZW5kLXRpbWUiOiB0aW1lKCIxMDoxMDowMC4wMDBaIikgfQorICAgICAgICB7ICJzZW5kLWRhdGUiOiBkYXRlKCIyMDEyLTA3LTIxIiksICJzZW5kLXRpbWUiOiB0aW1lKCIxMDoxMDowMC4wMDBaIikgfQorCisKKyMjIyBkYXRlLWZyb20tdW5peC10aW1lLWluLWRheXMgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgZGF0ZS1mcm9tLXVuaXgtdGltZS1pbi1kYXlzKG51bWVyaWNfZXhwcmVzc2lvbikKKworICogR2V0IGRhdGUgcmVwcmVzZW50aW5nIHRoZSB0aW1lIGFmdGVyIGBudW1lcmljX2V4cHJlc3Npb25gIGRheXMgc2luY2UgMTk3MC0wMS0wMQorICogQXJndW1lbnRzOgorICAgKiBgbnVtZXJpY19leHByZXNzaW9uYDogQSBgSW50OGAvYEludDE2YC9gSW50MzJgIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGRheXMKKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRGF0ZWAgdmFsdWUgYXMgdGhlIHRpbWUgYWZ0ZXIgYG51bWVyaWNfZXhwcmVzc2lvbmAgZGF5cyBzaW5jZSAxOTcwLTAxLTAxCisKKyMjIyBkYXRldGltZS1mcm9tLXVuaXgtdGltZS1pbi1tcyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBkYXRldGltZS1mcm9tLXVuaXgtdGltZS1pbi1tcyhudW1lcmljX2V4cHJlc3Npb24pCisKKyAqIEdldCBkYXRldGltZSByZXByZXNlbnRpbmcgdGhlIHRpbWUgYWZ0ZXIgYG51bWVyaWNfZXhwcmVzc2lvbmAgbWlsbGlzZWNvbmRzIHNpbmNlIDE5NzAtMDEtMDFUMDA6MDA6MDBaCisgKiBBcmd1bWVudHM6CisgICAqIGBudW1lcmljX2V4cHJlc3Npb25gOiBBIGBJbnQ4YC9gSW50MTZgL2BJbnQzMmAvYEludDY0YCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRGF0ZXRpbWVgIHZhbHVlIGFzIHRoZSB0aW1lIGFmdGVyIGBudW1lcmljX2V4cHJlc3Npb25gIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxVDAwOjAwOjAwWgorCisjIyMgdGltZS1mcm9tLXVuaXgtdGltZS1pbi1tcyAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICB0aW1lLWZyb20tdW5peC10aW1lLWluLW1zKG51bWVyaWNfZXhwcmVzc2lvbikKKworICogR2V0IHRpbWUgcmVwcmVzZW50aW5nIHRoZSB0aW1lIGFmdGVyIGBudW1lcmljX2V4cHJlc3Npb25gIG1pbGxpc2Vjb25kcyBzaW5jZSAwMDowMDowMC4wMDBaCisgKiBBcmd1bWVudHM6CisgICAqIGBudW1lcmljX2V4cHJlc3Npb25gOiBBIGBJbnQ4YC9gSW50MTZgL2BJbnQzMmAgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKiBSZXR1cm4gVmFsdWU6CisgICAqIEEgYFRpbWVgIHZhbHVlIGFzIHRoZSB0aW1lIGFmdGVyIGBudW1lcmljX2V4cHJlc3Npb25gIG1pbGxpc2Vjb25kcyBzaW5jZSAwMDowMDowMC4wMDBaCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgbGV0ICRkIDo9IGRhdGUtZnJvbS11bml4LXRpbWUtaW4tZGF5cygxNTgwMCkKKyAgICAgICAgbGV0ICRkdCA6PSBkYXRldGltZS1mcm9tLXVuaXgtdGltZS1pbi1tcygxMzY1MTM5NzAwMDAwKQorICAgICAgICBsZXQgJHQgOj0gdGltZS1mcm9tLXVuaXgtdGltZS1pbi1tcygzNzQ4KQorICAgICAgICByZXR1cm4geyJkYXRlIjogJGQsICJkYXRldGltZSI6ICRkdCwgInRpbWUiOiAkdH0KKworCisgKiBUaGUgZXhwZWN0ZWQgcmVzdWx0IGlzOgorCisgICAgICAgIHsgImRhdGUiOiBkYXRlKCIyMDEzLTA0LTA1IiksICJkYXRldGltZSI6IGRhdGV0aW1lKCIyMDEzLTA0LTA1VDA1OjI4OjIwLjAwMFoiKSwgInRpbWUiOiB0aW1lKCIwMDowMDowMy43NDhaIikgfQorCisKKyMjIyBzdWJ0cmFjdC1kYXRlICMjIworICogU3ludGF4OgorCisgICAgICAgIHN1YnRyYWN0LWRhdGUoZGF0ZV9zdGFydCwgZGF0ZV9lbmQpCisKKyAqIEdldCB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gZGF0ZXMgYGRhdGVfc3RhcnRgIGFuZCBgZGF0ZV9lbmRgCisgKiBBcmd1bWVudHM6CisgICAqIGBkYXRlX3N0YXJ0YDogdGhlIHN0YXJ0aW5nIGBEYXRlYAorICAgKiBgZGF0ZV9lbmRgOiB0aGUgZW5kaW5nIGBEYXRlYAorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBEdXJhdGlvbmAgdmFsdWUgYmV0d2VlbiBgZGF0ZV9zdGFydGAgYW5kIGBkYXRlX2VuZGAKKworICogRXhhbXBsZToKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJGkgaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VyJykKKyAgICAgICAgZm9yICRqIGluIGRhdGFzZXQoJ0ZhY2Vib29rVXNlcicpCisgICAgICAgIHdoZXJlICRpLnVzZXItc2luY2UgPCAkai51c2VyLXNpbmNlIGFuZCAkaS51c2VyLXNpbmNlID4gZGF0ZXRpbWUoIjIwMTItMDEtMDFUMDA6MDA6MDAiKQorICAgICAgICByZXR1cm4geyJpZDEiOiAkaS5pZCwgImlkMiI6ICRqLmlkLCAiZGlmZiI6IHN1YnRyYWN0LWRhdGUoZGF0ZS1mcm9tLWRhdGV0aW1lKCRqLnVzZXItc2luY2UpLCBkYXRlLWZyb20tZGF0ZXRpbWUoJGkudXNlci1zaW5jZSkpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiaWQxIjogMywgImlkMiI6IDEsICJkaWZmIjogZHVyYXRpb24oIlA0MUQiKSB9CisgICAgICAgIHsgImlkMSI6IDMsICJpZDIiOiA3LCAiZGlmZiI6IGR1cmF0aW9uKCJQMjhEIikgfQorICAgICAgICB7ICJpZDEiOiA3LCAiaWQyIjogMSwgImRpZmYiOiBkdXJhdGlvbigiUDEzRCIpIH0KKworCisjIyMgc3VidHJhY3QtdGltZSAjIyMKKyAqIFN5bnRheDoKKworICAgICAgICBzdWJ0cmFjdC10aW1lKHRpbWVfc3RhcnQsIHRpbWVfZW5kKQorCisgKiBHZXQgdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIHRpbWVzIGB0aW1lX3N0YXJ0YCBhbmQgYHRpbWVfZW5kYAorICogQXJndW1lbnRzOgorICAgKiBgdGltZV9zdGFydGA6IHRoZSBzdGFydGluZyBgVGltZWAKKyAgICogYHRpbWVfZW5kYDogdGhlIGVuZGluZyBgVGltZWAKKyAqIFJldHVybiBWYWx1ZToKKyAgICogQSBgRHVyYXRpb25gIHZhbHVlIGJldHdlZW4gYHRpbWVfc3RhcnRgIGFuZCBgdGltZV9lbmRgCisKKyAqIEV4YW1wbGU6CisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgZm9yICRpIGluIGRhdGFzZXQoJ0ZhY2Vib29rVXNlcicpCisgICAgICAgIGZvciAkaiBpbiBkYXRhc2V0KCdGYWNlYm9va1VzZXInKQorICAgICAgICB3aGVyZSAkaS51c2VyLXNpbmNlIDwgJGoudXNlci1zaW5jZSBhbmQgJGkudXNlci1zaW5jZSA+IGRhdGV0aW1lKCIyMDEyLTAxLTAxVDAwOjAwOjAwIikKKyAgICAgICAgcmV0dXJuIHsiaWQxIjogJGkuaWQsICJpZDIiOiAkai5pZCwgImRpZmYiOiBzdWJ0cmFjdC10aW1lKHRpbWUtZnJvbS1kYXRldGltZSgkai51c2VyLXNpbmNlKSwgdGltZSgiMDI6NTA6NDguOTM4IikpfQorCisKKyAqIFRoZSBleHBlY3RlZCByZXN1bHQgaXM6CisKKyAgICAgICAgeyAiaWQxIjogMywgImlkMiI6IDEsICJkaWZmIjogZHVyYXRpb24oIlBUN0gxOU0xMS42MlMiKSB9CisgICAgICAgIHsgImlkMSI6IDMsICJpZDIiOiA3LCAiZGlmZiI6IGR1cmF0aW9uKCJQVDdIMTlNMTEuNjJTIikgfQorICAgICAgICB7ICJpZDEiOiA3LCAiaWQyIjogMSwgImRpZmYiOiBkdXJhdGlvbigiUFQ3SDE5TTExLjYyUyIpIH0KKworCisjIyMgc3VidHJhY3QtZGF0ZXRpbWUgIyMjCisgKiBTeW50YXg6CisKKyAgICAgICAgc3VidHJhY3QtZGF0ZXRpbWUoZGF0ZXRpbWVfc3RhcnQsIGRhdGV0aW1lX2VuZCkKKworICogR2V0IHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBkYXRldGltZXMgYGRhdGV0aW1lX3N0YXJ0YCBhbmQgYGRhdGV0aW1lX2VuZGAKKyAqIEFyZ3VtZW50czoKKyAgICogYGRhdGV0aW1lX3N0YXJ0YDogdGhlIHN0YXJ0aW5nIGBEYXRldGltZWAKKyAgICogYGRhdGV0aW1lX2VuZGA6IHRoZSBlbmRpbmcgYERhdGV0aW1lYAorICogUmV0dXJuIFZhbHVlOgorICAgKiBBIGBEdXJhdGlvbmAgdmFsdWUgYmV0d2VlbiBgZGF0ZXRpbWVfc3RhcnRgIGFuZCBgZGF0ZXRpbWVfZW5kYAorCisgKiBFeGFtcGxlOgorCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkaSBpbiBkYXRhc2V0KCdGYWNlYm9va1VzZXInKQorICAgICAgICBmb3IgJGogaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VyJykKKyAgICAgICAgd2hlcmUgJGkudXNlci1zaW5jZSA8ICRqLnVzZXItc2luY2UgYW5kICRpLnVzZXItc2luY2UgPiBkYXRldGltZSgiMjAxMS0wMS0wMVQwMDowMDowMCIpCisgICAgICAgIHJldHVybiB7ImlkMSI6ICRpLmlkLCAiaWQyIjogJGouaWQsICJkaWZmIjogc3VidHJhY3QtZGF0ZXRpbWUoJGoudXNlci1zaW5jZSwgJGkudXNlci1zaW5jZSl9CisKKworICogVGhlIGV4cGVjdGVkIHJlc3VsdCBpczoKKworICAgICAgICB7ICJpZDEiOiAyLCAiaWQyIjogMSwgImRpZmYiOiBkdXJhdGlvbigiUDU3NkQiKSB9CisgICAgICAgIHsgImlkMSI6IDIsICJpZDIiOiAzLCAiZGlmZiI6IGR1cmF0aW9uKCJQNTM1RCIpIH0KKyAgICAgICAgeyAiaWQxIjogMiwgImlkMiI6IDcsICJkaWZmIjogZHVyYXRpb24oIlA1NjNEIikgfQorICAgICAgICB7ICJpZDEiOiAzLCAiaWQyIjogMSwgImRpZmYiOiBkdXJhdGlvbigiUDQxRCIpIH0KKyAgICAgICAgeyAiaWQxIjogMywgImlkMiI6IDcsICJkaWZmIjogZHVyYXRpb24oIlAyOEQiKSB9CisgICAgICAgIHsgImlkMSI6IDcsICJpZDIiOiAxLCAiZGlmZiI6IGR1cmF0aW9uKCJQMTNEIikgfQorCmRpZmYgLS1naXQgYS9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4UXVlcnlMYW5ndWFnZS5tZCBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhRdWVyeUxhbmd1YWdlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9Bc3Rlcml4UXVlcnlMYW5ndWFnZS5tZApAQCAtMCwwICsxLDE5NSBAQAorYDx3aWtpOnRvYyBtYXhfZGVwdGg9IjIiIC8+YAorCisjIFRoZSBBc3Rlcml4IFF1ZXJ5IExhbmd1YWdlLCBWZXJzaW9uIDEuMCAjCisKKyMgSW50cm9kdWN0aW9uICMKKworVGhpcyB3aWtpIHBhZ2UgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFzdGVyaXggUXVlcnkgbGFuZ3VhZ2UgYW5kIHRoZSBBc3Rlcml4IERhdGEgbW9kZWwuCisKKypXQVJOSU5HOiogX1RISVMgSVMgQU4gSU5DT01QTEVURSBTVVNQRU5ERUQgV09SSyBJTiBQUk9HUkVTUy4uLgorXyAgSXQgd2lsbCBob3BlZnVsbHkgYmUgcmVzdW1lZCBzaG9ydGx5IGluIG9yZGVyIHRvIHByb2R1Y2UgYSBsZWdpdCBBUUwgc3BlYyB0byBnbyBvdXQgd2l0aCB0aGUgQmV0YSBSZWxlYXNlIG9mIEFzdGVyaXhEQi4gIFdoYXQncyBoZXJlIGlzIHZlcnkgbGlrZWx5IGluY29uc2lzdGVudCB3aXRoIHdoYXQncyBpbiB0aGUgc3lzdGVtIGFzIG9mIHRvZGF5LCBhcyB0aGlzIHdhcyBmcm9tIGFuIG9sZGVyIHNuYXBzaG90IG9mIHRoZSB3b3JsZC4KKworIyBBc3Rlcml4IERhdGEgTW9kZWwgIworCitEYXRhIGluIEFzdGVyaXggaXMgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIEFzdGVyaXggRGF0YSBNb2RlbCAoQURNKS4gVGhlIEFETSBkZXJpdmVzIGluc3BpcmF0aW9uIGZyb20gcHJpb3Igc3RhbmRhcmRzIHN1Y2ggYXMgSlNPTiwgWFF1ZXJ5LCBhbmQgdGhlIE9iamVjdCBEYXRhIE1vZGVsIGZyb20gT0RNRy4KKworIyMgQXN0ZXJpeCBUeXBlcyAjIworCisjIyMgUHJpbWl0aXZlIFR5cGVzICMjCisKK3x8ICpQcmltaXRpdmUgVHlwZSogfHwgKkRlc2NyaXB0aW9uKiB8fAorfHwgaW50OCAgIHx8IFNpZ25lZCA4LWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAtMTI4IHRocnUgMTI3IHx8Cit8fCBpbnQxNiAgfHwgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAtMzI3NjggdGhydSAzMjc2NyB8fAorfHwgaW50MzIgIHx8IFNpZ25lZCAzMi1iaXQgaW50ZWdlci4gVmFsaWQgcmFuZ2UgLTIxNDc0ODM2NDggdGhydSAyMTQ3NDgzNjQ3IHx8Cit8fCBpbnQ2NCAgfHwgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAtOTIyMzM3MjAzNjg1NDc3NTgwNyB0aHJ1IDkyMjMzNzIwMzY4NTQ3NzU4MDggfHwKK3x8IHVpbnQ4ICB8fCBVbnNpZ25lZCA4LWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAwIHRocnUgMjU1IHx8Cit8fCB1aW50MTYgfHwgVW5zaWduZWQgMTYtYml0IGludGVnZXIuIFZhbGlkIHJhbmdlIDAgdGhydSA2NTUzNSB8fAorfHwgdWludDMyIHx8IFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAwIHRocnUgNDI5NDk2NzI5NSB8fAorfHwgdWludDY0IHx8IFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLiBWYWxpZCByYW5nZSAwIHRocnUgMTg0NDY3NDQwNzM3MDk1NTE2MTUgfHwKK3x8IHN0cmluZyB8fCBTdHJpbmcgb2YgY2hhcmFjdGVycyB8fAorfHwgbnVsbCAgIHx8IG51bGwgdHlwZSAoVHlwZSBvZiB0aGUgbnVsbCB2YWx1ZSkgfHwKK3x8IGRhdGUgICB8fCBEYXRlIHx8Cit8fCB0aW1lICAgfHwgVGltZSBvZiBkYXkgfHwKK3x8IGJvb2xlYW4gfHwgQm9vbGVhbiB8fAorfHwgZGF0ZXRpbWUgfHwgRGF0ZSBhbmQgdGltZSB8fAorfHwgcG9pbnQyZCB8fCBBIHBvaW50IGluIDItRCBzcGFjZSB8fAorfHwgcG9pbnQzZCB8fCBBIHBvaW50IGluIDMtRCBzcGFjZSB8fAorfHwgYmluYXJ5IHx8IEJpbmFyeSBkYXRhIHx8Cit8fCB5bWludGVydmFsIHx8IFllYXItTW9udGggaW50ZXJ2YWwgfHwKK3x8IGR0aW50ZXJ2YWwgfHwgRGF5LVRpbWUgaW50ZXJ2YWwgfHwKK3x8IGludGVydmFsIHx8IFllYXItTW9udGggYW5kIERheS1UaW1lIGludGVydmFsIHx8CisKKyMjIyBDb2xsZWN0aW9uIFR5cGVzICMjIworCit8fCAqQ29sbGVjdGlvbiBUeXBlKiB8fCAqRGVzY3JpcHRpb24qIHx8Cit8fCBSZWNvcmQgfHwgQSByZWNvcmQgdHlwZSBkZXNjcmliZXMgdGhlIHJlY29yZCBkYXRhIGl0ZW0uIEEgcmVjb3JkIGNvbnRhaW5zIGEgc2V0IG9mIGZpZWxkcyB3aGljaCBjYW4gaGF2ZSB2YWx1ZXMgb2YgYW55IEFETSB0eXBlLiBGaWVsZHMgb2YgYSByZWNvcmQgbXVzdCBiZSB1bmlxdWUuIHx8Cit8fCBVbmlvbiB8fCBBIHVuaW9uIHR5cGUgaXMgYW4gYWJzdHJhY3QgdHlwZSAoQSB2YWx1ZSBuZXZlciBoYXMgYSB1bmlvbiB0eXBlKSB0aGF0IGRlc2NyaWJlcyBhIHNldCBvZiB0eXBlIGNob2ljZXMuIHx8Cit8fCBPcmRlcmVkIExpc3QgfHwgQW4gb3JkZXJlZGxpc3QgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB3aGVyZSB0aGUgb3JkZXIgb2YgdGhlIGluc3RhbmNlcyBpcyBkZXRlcm1pbmVkIGJ5IGNyZWF0aW9uL2luc2VydGlvbiB8fAorfHwgVW5vcmRlcmVkTGlzdCB8fCBBbiB1bm9yZGVyZWRsaXN0IGluc3RhbmNlIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcyB3aGVyZSB0aGUgb3JkZXIgb2YgdGhlIGluc3RhbmNlcyB3aGVyZSB0aGUgb3JkZXIgaXMgaXJyZWxldmFudCB8fAorfHwgRW51bWVyYXRpb24gfHwgQW4gZW51bWVyYXRpb24gdHlwZSByZXByZXNlbnRzIGEgY2hvaWNlIG9mIHN0cmluZyB2YWx1ZXMgfHwKKworIyBBUUwgRXhwcmVzc2lvbnMgIworCisjIyBQcmltYXJ5IEV4cHJlc3Npb25zICMjCisKK1ByaW1hcnkgZXhwcmVzc2lvbnMgYXJlIHRoZSBiYXNpYyBleHByZXNzaW9ucyB0aGF0IGZvcm0gdGhlIGNvcmUgb2YgQVFMLgorCisjIyMgTGl0ZXJhbHMgIyMjCisKK0EgTGl0ZXJhbCBpcyBhIHN5bnRhY3RpYyByZXByZXNlbnRhdGlvbiBvZiBhIGNvbnN0YW50IHZhbHVlLiBUaGUgdmFyaW91cyBsaXRlcmFscyBhbGxvd2VkIGluIEFRTCBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdy4KKworfHwgKkxpdGVyYWwgdHlwZSogfHwgKlN5bnRheCogfHwKK3x8IFN0cmluZ0xpdGVyYWwgfHwgYCBTVFJJTkdfTElURVJBTCA6ICgiXCIiICgiXFxcIiIgfCB+WyJcIiJdKSogIlwiIikgfCAoIlwnIigiXFxcJyIgfCB+WyJcJyJdKSogIlwnIikgYCB8fAorfHwgSW50ZWdlckxpdGVyYWwgfHwgYCBJTlRFR0VSX0xJVEVSQUwgOiAoWyIwIiAtICI5Il0pKyBgIHx8Cit8fCBGbG9hdExpdGVyYWwgfHwgYCBGTE9BVF9MSVRFUkFMOiAoKFsiMCIgLSAiOSJdKSogIi4iIChbIjAiIC0gIjkiXSkrICgiZiIgfCAiRiIpKSBgIHx8Cit8fCBEb3VibGVMaXRlcmFsIHx8IGAgRE9VQkxFX0xJVEVSQUw6ICgoWyIwIiAtICI5Il0pKiAiLiIgKFsiMCIgLSAiOSJdKSspIGAgfHwKK3x8IE51bGxMaXRlcmFsIHx8IGAgTlVMTF9MSVRFUkFMOiAibnVsbCIgYCB8fAorfHwgQm9vbGVhbkxpdGVyYWwgfHwgYCBCT09MRUFOX0xJVEVSQUw6ICJ0cnVlIiB8ICJmYWxzZSIgYCB8fAorCisjIyMgRnVuY3Rpb24gQ2FsbCAjIyMKKworRnVuY3Rpb24gQ2FsbHMgaW4gQVFMIGNhbiBiZSB1c2VkIHRvIGludm9rZSBidWlsdGluIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMuCitGdW5jdGlvbiBDYWxscyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4LgorCisKKyAgICAgICAgICAgIElERU5USUZJRVIgIigiICggRXhwcmVzc2lvbiAoICIsIiBFeHByZXNzaW9uICkqICk/ICIpIgorCisKKyMjIyBWYXJpYWJsZSBSZWZlcmVuY2UgIyMjCisKK1ZhcmlhYmxlcyBpbiBBUUwgYXJlIHVzZWQgdG8gYmluZCB0byB2YWx1ZXMuIFZhcmlhYmxlcyBjYW4gYmUgYm91bmQgdG8gdmFsdWVzIGJ5IHRoZSBGb3IsIExldCwgR3JvdXAgYnkgY2xhdXNlcyBvZiB0aGUgRkxXT1IgZXhwcmVzc2lvbnMuIFZhcmlhYmxlcyBjYW4gYWxzbyBiZSBib3VuZCBieQordGhlIFF1YW50aWZpZWQgRXhwcmVzc2lvbnMuCisKKyMjIyBPcmRlcmVkIExpc3QgQ29uc3RydWN0b3IgIyMjCisKK0NvbnN0cnVjdHMgYW4gb3JkZXJlZCBsaXN0LiBBbiBvcmRlcmVkIGxpc3QgcmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLiBUaGUgb3JkZXIgb2YgdmFsdWVzIGlzIHJlbGV2YW50LiBUaGUgY29sbGVjdGlvbiBtYXkgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzLgorCisjIyMgVW5vcmRlcmVkIExpc3QgQ29uc3RydWN0b3IgIyMjCisKK0NvbnN0cnVjdHMgYW4gdW5vcmRlcmVkIGxpc3QuIEFuIHVub3JkZXJlZCBsaXN0IHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy4gVGhlIG9yZGVyIG9mIHZhbHVlcyBpcyBub3QgcmVsZXZhbnQuIFRoZSBjb2xsZWN0aW9uIG1heSBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXMuCisKKyMjIyBSZWNvcmQgQ29uc3RydWN0b3IgIyMjCisKK0NvbnN0cnVjdHMgYW4gQVFMIFJlY29yZC4gQSByZWNvcmQgY29udGFpbnMgZmllbGRzLiBFYWNoIGZpZWxkIGhhcyBhIG5hbWUgYW5kIGEgdmFsdWUuIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpcyBvZiB0eXBlIHN0cmluZy4gVGhlIHZhbHVlIG9mIGEgZmllbGQgbWF5IGJlIGFueSBsZWdhbCBBRE0gZGF0YSB0eXBlLiBBIHJlY29yZCBtYXkgbm90IGNvbnRhaW4gZHVwbGljYXRlIGZpZWxkcy4KKworIyMgQXJpdGhtZXRpYyBFeHByZXNzaW9ucyAjIworCitBUUwgYWxsb3dzIGFsbCB0aGUgc3RhbmRhcmQgYXJpdGhtZXRpYyBvcGVyYXRvcnMgb24gbnVtZXJpYyBkYXRhIHR5cGVzLiBUaGUgc3BlY2lmaWMgb3BlcmF0b3JzIGFsbG93ZWQgYXJlOgorCit8fCAqT3BlcmF0b3IqIHx8ICpEZXNjcmlwdGlvbiogfHwKK3x8ICsgfHwgQWRkIHx8Cit8fCAtIHx8IFN1YnRyYWN0IHx8Cit8fCAqIHx8IE11bHRpcGx5IHx8Cit8fCAvIHx8IERpdmlkZSB8fAorfHwgbW9kIHx8IE1vZHVsbyB8fAorCisjIyBDb21wYXJpc29uIEV4cHJlc3Npb25zICMjCisKK0FRTCBwcm92aWRlcyB0aGUgc2l4IHN0YW5kYXJkIGNvbXBhcmlzb24gZXhwcmVzc2lvbnMgbGlzdGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgQVFMIHN1cHBvcnRzIGZ1enp5IGNvbXBhcmlzb25zLgorCit8fCAqT3BlcmF0b3IqIHx8ICpEZXNjcmlwdGlvbiogfHwKK3x8ID0gfHwgRXF1YWwgfHwKK3x8ID0gfHwgTm90IEVxdWFsIHx8Cit8fCBgPCB8fCBMZXNzIFRoYW4gfHwKK3x8IGA8PSB8fCBMZXNzIFRoYW4gb3IgRXF1YWwgfHwKK3x8ID5gIHx8IEdyZWF0ZXIgVGhhbiB8fAorfHwgPmA9IHx8IEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB8fAorfHwgPmA9IHx8IEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB8fAorfHwgfj0gfHwgRnV6enkgRXF1YWxzIHx8CisKKyMjIExvZ2ljYWwgRXhwcmVzc2lvbnMgIyMKKworQVFMIHByb3ZpZGVzIHR3byBsb2dpY2FsIGNvbm5lY3RvcnM6CisKK3x8ICpPcGVyYXRvciogfHwgKkRlc2NyaXB0aW9uKiB8fAorfHwgYW5kIHx8IExvZ2ljYWwgQU5EIHx8Cit8fCBvciB8fCBMb2dpY2FsIE9SIHx8CisKKyMjIEZpZWxkIEFjY2VzcyBFeHByZXNzaW9ucyAjIworCitUaGUgIi4iIG9wZXJhdG9yIGlzIHVzZWQgdG8gYWNjZXNzIGZpZWxkcyBvZiBhIHJlY29yZC4gRm9yIGV4YW1wbGUsCisKKworICAgICAgICAgICAgJHgubmFtZQorCisKK2FjY2Vzc2VzIHRoZSBuYW1lIGZpZWxkIG9mIHRoZSByZWNvcmQgYm91bmQgdG8gJHguCisKKyMjIEluZGV4ZWQgRXhwcmVzc2lvbnMgIyMKKworSW5kZXhlZCBleHByZXNzaW9ucyBhcmUgdXNlZCB0byBhY2Nlc3MgdmFsdWVzIGluIGFuIG9yZGVyZWQgbGlzdC4gRm9yIGV4YW1wbGUsCisKKworICAgICAgICAgICAgJHhbNV0KKworCithY2Nlc3NlcyB0aGUgNnRoIGl0ZW0gaW4gdGhlIGxpc3QgYm91bmQgdG8gJHguIEluZGV4ZXMgc3RhcnQgYXQgMC4KKworIyMgRkxXT1IgRXhwcmVzc2lvbiAjIworCitUaGUgRkxXT1IgZXhwcmVzc2lvbiBpcyB0aGUgbW9zdCBlbGFib3JhdGUgZXhwcmVzc2lvbiBpbiBBUUwuIEl0IGlzIG1hZGUgdXAgb2YgdHdvIHBhcnRzIC0tIENsYXVzZXMgYW5kIHRoZSBSZXR1cm4gRXhwcmVzc2lvbi4KKworVGhlIHN5bnRheCBvZiB0aGUgRkxXT1IgZXhwcmVzc2lvbiBpczoKKworCisgICAgICAgIAorICAgICAgICAoIEZvckNsYXVzZSB8IExldENsYXVzZSApCisgICAgICAgICggRm9yQ2xhdXNlIHwgTGV0Q2xhdXNlIHwgV2hlcmVDbGF1c2UgfCBPcmRlckNsYXVzZSB8IEdyb3VwQ2xhdXNlIHwgTGltaXRDbGF1c2UgfCBEaXN0aW5jdENsYXVzZSApKgorICAgICAgICAicmV0dXJuIiBSZXR1cm5FeHByZXNzaW9uCisgICAgICAgIAorCisKKyogRm9yIENsYXVzZQorCisgICAgICAgICJmb3IiIFZhcmlhYmxlICJpbiIgRXhwcmVzc2lvbgorCisqIExldCBDbGF1c2UKKworICAgICAgICAibGV0IiBWYXJpYWJsZSAiOj0iIEV4cHJlc3Npb24KKworKiBXaGVyZSBDbGF1c2UKKworICAgICAgICAid2hlcmUiIEV4cHJlc3Npb24KKworKiBPcmRlciBDbGF1c2UKKworICAgICAgICAib3JkZXIiICJieSIgRXhwcmVzc2lvbiAoImFzYyIgfCAiZGVzYyIpICgiLCIgRXhwcmVzc2lvbiAoImFzYyIgfCAiZGVzYyIpKSoKKworKiBHcm91cCBDbGF1c2UKKworICAgICAgICAiZ3JvdXAiICJieSIgKChWYXJpYWJsZSAiOj0iKT8gRXhwcmVzc2lvbikgKCIsIiAoKFZhcmlhYmxlICI6PSIpPyBFeHByZXNzaW9uKSkqICJ3aXRoIiBWYXJpYWJsZQorCisqIExpbWl0IENsYXVzZQorCisgICAgICAgICJsaW1pdCIgRXhwcmVzc2lvbiAoIiwiIEV4cHJlc3Npb24pPworCisKKyogSWYgVGhlbiBFbHNlIEV4cHJlc3Npb25zICoKKworICAgICAgICAiaWYiICIoIiBFeHByZXNzaW9uICIpIiAidGhlbiIgRXhwcmVzc2lvbiAiZWxzZSIgRXhwcmVzc2lvbgorCisKKyogUXVhbnRpZmllZCBFeHByZXNzaW9ucyAqCisKKyAgICAgICAgKCJzb21lIiB8ICJldmVyeSIpIFZhcmlhYmxlICJpbiIgRXhwcmVzc2lvbiAic2F0aXNmaWVzIiBFeHByZXNzaW9uCisKZGlmZiAtLWdpdCBhL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhTaW1pbGFyaXR5UXVlcmllcy5tZCBiL2FzdGVyaXgtZG9jL3NyYy9zaXRlL21hcmtkb3duL0FzdGVyaXhTaW1pbGFyaXR5UXVlcmllcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk4ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vQXN0ZXJpeFNpbWlsYXJpdHlRdWVyaWVzLm1kCkBAIC0wLDAgKzEsODcgQEAKKyNzdW1tYXJ5IFNpbWlsYXJpdHkgUXVlcmllcyBhbmQgS2V5d29yZCBRdWVyaWVzCisKK2A8d2lraTp0b2MgbWF4X2RlcHRoPSIzIiAvPmAKKworIyBBc3Rlcml4REIgIFN1cHBvcnQgb2YgU2ltaWxhcml0eSBRdWVyaWVzICMKKworIyMgTW90aXZhdGlvbiAjIworCitTaW1pbGFyaXR5IHF1ZXJpZXMgYXJlIHdpZGVseSB1c2VkIGluIGFwcGxpY2F0aW9ucyB3aGVyZSB1c2VycyBuZWVkIHRvIGZpbmQgcmVjb3JkcyB0aGF0IHNhdGlzZnkgYSBzaW1pbGFyaXR5IHByZWRpY2F0ZSwgd2hpbGUgZXhhY3QgbWF0Y2hpbmcgaXMgbm90IHN1ZmZpY2llbnQuIFRoZXNlIHF1ZXJpZXMgYXJlIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBzb2NpYWwgYW5kIFdlYiBhcHBsaWNhdGlvbnMsIHdoZXJlIGVycm9ycywgYWJicmV2aWF0aW9ucywgYW5kIGluY29uc2lzdGVuY2llcyBhcmUgY29tbW9uLiAgQXMgYW4gZXhhbXBsZSwgd2UgbWF5IHdhbnQgdG8gZmluZCBhbGwgdGhlIG1vdmllcyBzdGFycmluZyBTY2h3YXJ6ZW5lZ2dlciwgd2hpbGUgd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3Qgc3BlbGxpbmcgb2YgaGlzIGxhc3QgbmFtZSAoZGVzcGl0ZSBoaXMgcG9wdWxhcml0eSBpbiBib3RoIHRoZSBtb3ZpZSBpbmR1c3RyeSBhbmQgcG9saXRpY3MgOi0pKS4gQXMgYW5vdGhlciBleGFtcGxlLCB3ZSB3YW50IHRvIGZpbmQgYWxsIHRoZSBGYWNlYm9vayB1c2VycyB3aG8gaGF2ZSBzaW1pbGFyIGZyaWVuZHMuIFRvIG1lZXQgdGhpcyB0eXBlIG9mIG5lZWRzLCBBc3Rlcml4REIgc3VwcG9ydHMgc2ltaWxhcml0eSBxdWVyaWVzIHVzaW5nIGVmZmljaWVudCBpbmRleGVzIGFuZCBhbGdvcml0aG1zLgorCisjIyBEYXRhIFR5cGVzIGFuZCBTaW1pbGFyaXR5IEZ1bmN0aW9ucyAjIworCitBc3Rlcml4REIgc3VwcG9ydHMgdmFyaW91cyBzaW1pbGFyaXR5IGZ1bmN0aW9ucywgaW5jbHVkaW5nIFtodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldmVuc2h0ZWluX2Rpc3RhbmNlIGVkaXQgZGlzdGFuY2VdIChvbiBzdHJpbmdzKSBhbmQgW2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmFjY2FyZF9pbmRleCBKYWNjYXJkXSAob24gc2V0cykuIEZvciBpbnN0YW5jZSwgaW4gb3VyIFtodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FzdGVyaXhkYi93aWtpL0FkbUFxbDEwMSNBRE06X01vZGVsaW5nX1NlbWlzdHJ1Y3RlZF9EYXRhX2luX0FzdGVyaXhEQiBUaW55U29jaWFsXSBleGFtcGxlLCB0aGUgYGZyaWVuZC1pZHNgIG9mIGEgRmFjZWJvb2sgdXNlciBmb3JtcyBhIHNldCBvZiBmcmllbmRzLCBhbmQgd2UgY2FuIGRlZmluZSBhIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gc2V0cy4gV2UgY2FuIGFsc28gY29udmVydCBhIHN0cmluZyB0byBhIHNldCBvZiAicS1ncmFtcyIgYW5kIGRlZmluZSB0aGUgSmFjY2FyZCBzaW1pbGFyaXR5IGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIHR3byBzdHJpbmdzLiBUaGUgInEtZ3JhbXMiIG9mIGEgc3RyaW5nIGFyZSBpdHMgc3Vic3RyaW5ncyBvZiBsZW5ndGggInEiLiBGb3IgaW5zdGFuY2UsIHRoZSAzLWdyYW1zIG9mIHRoZSBzdHJpbmcgYHNjaHdhcnplbmVnZ2VyYCBhcmUgYHNjaGAsIGBjaHdgLCBgaHdhYCwgLi4uLCBgZ2VyYC4KKworQXN0ZXJpeERCIHByb3ZpZGVzIFtodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FzdGVyaXhkYi93aWtpL0FzdGVyaXhEYXRhVHlwZXNBbmRGdW5jdGlvbnMjVG9rZW5pemluZ19GdW5jdGlvbnMgdG9rZW5pemF0aW9uIGZ1bmN0aW9uc10gdG8gY29udmVydCBzdHJpbmdzIHRvIHNldHMsIGFuZCB0aGUgW2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYXN0ZXJpeGRiL3dpa2kvQXN0ZXJpeERhdGFUeXBlc0FuZEZ1bmN0aW9ucyNTaW1pbGFyaXR5X0Z1bmN0aW9ucyBzaW1pbGFyaXR5IGZ1bmN0aW9uc10uCisKKyMjIFNlbGVjdGlvbiBRdWVyaWVzICMjCisKK1RoZSBmb2xsb3dpbmcgW2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYXN0ZXJpeGRiL3dpa2kvQXN0ZXJpeERhdGFUeXBlc0FuZEZ1bmN0aW9ucyNlZGl0LWRpc3RhbmNlIHF1ZXJ5XSBhc2tzIGZvciBhbGwgdGhlIEZhY2Vib29rIHVzZXJzIHdob3NlIG5hbWUgaXMgc2ltaWxhciB0byBgU3V6YW5uYSBUaWxzb25gLCBpLmUuLCB0aGVpciBlZGl0IGRpc3RhbmNlIGlzIGF0IG1vc3QgMi4KKworCisgICAgICAgIHVzZSBkYXRhdmVyc2UgVGlueVNvY2lhbDsKKyAgICAgICAgCisgICAgICAgIGZvciAkdXNlciBpbiBkYXRhc2V0KCdGYWNlYm9va1VzZXJzJykKKyAgICAgICAgbGV0ICRlZCA6PSBlZGl0LWRpc3RhbmNlKCR1c2VyLm5hbWUsICJTdXphbm5hIFRpbHNvbiIpCisgICAgICAgIHdoZXJlICRlZCA8PSAyCisgICAgICAgIHJldHVybiAkdXNlcgorCisKK1RoZSBmb2xsb3dpbmcgW2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYXN0ZXJpeGRiL3dpa2kvQXN0ZXJpeERhdGFUeXBlc0FuZEZ1bmN0aW9ucyNzaW1pbGFyaXR5LWphY2NhcmQgcXVlcnldIGFza3MgZm9yIGFsbCB0aGUgRmFjZWJvb2sgdXNlcnMgd2hvc2Ugc2V0IG9mIGZyaWVuZCBpZHMgaXMgc2ltaWxhciB0byBgWzEsNSw5XWAsIGkuZS4sIHRoZWlyIEphY2NhcmQgc2ltaWxhcml0eSBpcyBhdCBsZWFzdCAwLjYuCisKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VycycpCisgICAgICAgIGxldCAkc2ltIDo9IHNpbWlsYXJpdHktamFjY2FyZCgkdXNlci5mcmllbmQtaWRzLCBbMSw1LDldKQorICAgICAgICB3aGVyZSAkc2ltID49IDAuNmYKKyAgICAgICAgcmV0dXJuICR1c2VyCisKKworQXN0ZXJpeERCIGFsbG93cyBhIHVzZXIgdG8gdXNlIGEgc2ltaWxhcml0eSBvcGVyYXRvciBgfj1gIHRvIGV4cHJlc3MgYSBzaW1pbGFyaXR5IGNvbmRpdGlvbiBieSBkZWZpbmluZyB0aGUgc2ltaWxpYXJ0eSBmdW5jdGlvbiBhbmQgdGhyZXNob2xkIHVzaW5nICJzZXQiIHN0YXRlbWVudHMgZWFybGllci4gRm9yIGluc3RhbmNlLCB0aGUgYWJvdmUgcXVlcnkgY2FuIGJlIGVxdWl2YWxlbnRseSB3cml0dGVuIGFzOgorCisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgc2V0IHNpbWZ1bmN0aW9uICJqYWNjYXJkIjsKKyAgICAgICAgc2V0IHNpbXRocmVzaG9sZCAiMC42ZiI7CisgICAgICAgIAorICAgICAgICBmb3IgJHVzZXIgaW4gZGF0YXNldCgnRmFjZWJvb2tVc2VycycpCisgICAgICAgIHdoZXJlICR1c2VyLmZyaWVuZC1pZHMgfj0gWzEsNSw5XQorICAgICAgICByZXR1cm4gJHVzZXIKKworCisKKyMjIEZ1enp5IEpvaW4gUXVlcmllcyAjIworCitBc3Rlcml4REIgc3VwcG9ydHMgZnV6enkgam9pbnMgYmV0d2VlbiB0d28gZGF0YSBzZXRzLiBUaGUgZm9sbG93aW5nIFtodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FzdGVyaXhkYi93aWtpL0FkbUFxbDEwMSNRdWVyeV81Xy1fRnV6enlfSm9pbiBxdWVyeV0gZmluZHMsIGZvciBlYWNoIEZhY2Vib29rIHVzZXIsIGFsbCBUd2l0dGVyIHVzZXJzIHdpdGggbmFtZXMgInNpbWlsYXIiIHRvIHRoZWlyIG5hbWUgYmFzZWQgb24gdGhlIGVkaXQgZGlzdGFuY2UuCisKKworICAgICAgICB1c2UgZGF0YXZlcnNlIFRpbnlTb2NpYWw7CisgICAgICAgIAorICAgICAgICBzZXQgc2ltZnVuY3Rpb24gImVkaXQtZGlzdGFuY2UiOworICAgICAgICBzZXQgc2ltdGhyZXNob2xkICIzIjsKKyAgICAgICAgCisgICAgICAgIGZvciAkZmJ1IGluIGRhdGFzZXQgRmFjZWJvb2tVc2VycworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgImlkIjogJGZidS5pZCwKKyAgICAgICAgICAgICJuYW1lIjogJGZidS5uYW1lLAorICAgICAgICAgICAgInNpbWlsYXItdXNlcnMiOiBmb3IgJHQgaW4gZGF0YXNldCBUd2VldE1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkdHUgOj0gJHQudXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSAkdHUubmFtZSB+PSAkZmJ1Lm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR3aXR0ZXItc2NyZWVubmFtZSI6ICR0dS5zY3JlZW4tbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR3aXR0ZXItbmFtZSI6ICR0dS5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCisjIyBVc2luZyBJbmRleGVzICMjCisKK0FzdGVyaXhEQiB1c2VzIGludmVydGVkIGluZGV4IHRvIHN1cHBvcnQgc2ltaWxhcml0eSBxdWVyaWVzIGVmZmljaWVudGx5LiBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcXVlcnkgY3JlYXRlcyBzdWNoIGFuIGluZGV4IG9uIHRoZSBgRmFjZWJvb2tVc2VyLm5hbWVgIGF0dHJpYnV0ZSB1c2luZyBhbiBpbnZlcnRlZCBpbmRleCBvZiAzLWdyYW1zLiAgQWZ0ZXIgdGhlIGluZGV4IGlzIGNyZWF0ZWQsIHNpbWlsYXJpdHkgcXVlcmllcyB3aXRoIGFuIGVkaXQgZGlzdGFuY2UgY29uZGl0aW9uIG9uIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBhbnN3ZXJlZCBtb3JlIGVmZmljaWVudGx5LgorCisKKyAgICAgICAgdXNlIGRhdGF2ZXJzZSBUaW55U29jaWFsOworICAgICAgICAKKyAgICAgICAgY3JlYXRlIGluZGV4IGZiVXNlckZ1enp5SWR4IG9uIEZhY2Vib29rVXNlcnMobmFtZSkgdHlwZSBuZ3JhbSgzKTsKKwpkaWZmIC0tZ2l0IGEvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vSW5zdGFsbGluZ0FzdGVyaXhVc2luZ01hbmFnaXgubWQgYi9hc3Rlcml4LWRvYy9zcmMvc2l0ZS9tYXJrZG93bi9JbnN0YWxsaW5nQXN0ZXJpeFVzaW5nTWFuYWdpeC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU1ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXN0ZXJpeC1kb2Mvc3JjL3NpdGUvbWFya2Rvd24vSW5zdGFsbGluZ0FzdGVyaXhVc2luZ01hbmFnaXgubWQKQEAgLTAsMCArMSw3NzUgQEAKKyNzdW1tYXJ5IEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKKworYDx3aWtpOnRvYyBtYXhfZGVwdGg9IjQiIC8+YAorCisjIEludHJvZHVjdGlvbiAjCitUaGlzIGlzIGEgcXVpY2tzdGFydCBndWlkZSBmb3IgZ2V0dGluZyBBU1RFUklYIHJ1bm5pbmcgaW4gYSBkaXN0cmlidXRlZCBlbnZpcm9ubWVudC4gVGhpcyBndWlkZSBhbHNvIGludHJvZHVjZXMgdGhlIEFTVEVSSVggaW5zdGFsbGVyIChuaWNrbmFtZWQgXypNYW5hZ2l4Kl8pIGFuZCBkZXNjcmliZXMgaG93IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZS9tYW5hZ2UgYW4gQVNURVJJWCBpbnN0YW5jZS4gQnkgZm9sbG93aW5nIHRoZSBzaW1wbGUgc3RlcHMgZGVzY3JpYmVkIGluIHRoaXMgZ3VpZGUsIHlvdSB3aWxsIGdldCBhIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgQVNURVJJWC4gWW91IHNoYWxsIGJlIGFibGUgdG8gdXNlIEFTVEVSSVggZnJvbSBpdHMgV2ViIGludGVyZmFjZSBhbmQgbWFuYWdlIGl0cyBsaWZlY3ljbGUgdXNpbmcgTWFuYWdpeC4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFyZSBydW5uaW5nIHNvbWUgdmVyc2lvbiBvZiBfKkxpbnV4Kl8gb3IgXypNYWNPUyBYKl8uCisKKyMjIFByZXJlcXVpc2l0ZXMgZm9yIEluc3RhbGxpbmcgQVNURVJJWCAjIworUHJlcmVxdWlzaXRlOgorCisgKiBbaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5odG1sIEpESzddIChPdGhlcndpc2Uga25vd24gYXMgSkRLIDEuNykuCisKK1RvIGtub3cgdGhlIHZlcnNpb24gb2YgSmF2YSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0sIGV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKKworICAgICAgICAkIGphdmEgLXZlcnNpb24KKworSWYgeW91IGhhdmUgdmVyc2lvbiBhcyAxLjcuMF94LCBzaW1pbGFyIHRvIHRoZSBvdXRwdXQgc2hvd24gYmVsb3csIHlvdSBhcmUgZ29vZCB0byBwcm9jZWVkLgorCisKKyAgICAgICAgamF2YSB2ZXJzaW9uICIxLjcuMF8xMyIKKyAgICAgICAgSmF2YShUTSkgU0UgUnVudGltZSBFbnZpcm9ubWVudCAoYnVpbGQgMS43LjBfMTMtYjIwKQorICAgICAgICBKYXZhIEhvdFNwb3QoVE0pIDY0LUJpdCBTZXJ2ZXIgVk0gKGJ1aWxkIDIzLjctYjAxLCBtaXhlZCBtb2RlKQorCitJZiB5b3UgbmVlZCB0byB1cGdyYWRlIG9yIGluc3RhbGwgamF2YSwgcGxlYXNlIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93LgorCisgKiBGb3IgTGludXg6IFtodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3Mvd2Vibm90ZXMvaW5zdGFsbC9saW51eC9saW51eC1qZGsuaHRtbCBKREsgNyBMaW51eCBJbnN0YWxsXQorSkRLIHdvdWxkIGJlIGluc3RhbGxlZCBhdCBhIHBhdGggdW5kZXIgL3Vzci9saWIvanZtL2pkay12ZXJzaW9uIC4KKworICogRm9yIE1hYzogW2h0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy93ZWJub3Rlcy9pbnN0YWxsL21hYy9tYWMtamRrLmh0bWwgSkRLIDcgTWFjIEluc3RhbGxdCitKREsgd291bGQgYmUgaW5zdGFsbGVkIGF0IC9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstdmVyc2lvbi9Db250ZW50cy9Ib21lIC4KKworVGhlIGphdmEgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyByZWZlcnJlZCBhcyBKQVZBX0hPTUUuIFNpbmNlIHdlIHVwZ3JhZGVkL2luc3RhbGxlZCBKYXZhLCB3ZSBuZWVkIHRvIGVuc3VyZSBKQVZBX0hPTUUgcG9pbnRzIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEpESyA3LiBNb2RpZnkgeW91ciB+Ly5iYXNoX3Byb2ZpbGUgKG9yIH4vLmJhc2hyYykgYW5kIGRlZmluZSBKQVZBX0hPTUUgYWNjb3JkaW5nbHkuICBBZnRlciBtb2RpZnlpbmcsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKKworCisgICAgICAgICQgamF2YSAtdmVyc2lvbgorCitJZiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB5b3Ugb2J0YWluIGRvZXMgbm90IHNob3cgMS43LCB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIFBBVEggdmFyaWFibGUuIFRvIGRvIHNvLCBleGVjdXRlIHRoZSBmb2xsb3dpbmc6CisKKworICAgICAgICAkIGVjaG8gIlBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZSAob3Igfi8uYmFzaHJjKQorICAgICAgICAkIHNvdXJjZSB+Ly5iYXNoX3Byb2ZpbGUgKG9yIH4vLmJhc2hyYykKKworV2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0ICRKQVZBX0hPTUUvYmluIGlzIGluIHRoZSBQQVRILiAkSkFWQV9IT01FL2JpbiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIFBBVEggdmFsdWUuIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSAgaWYgJEpBVkFfSE9NRS9iaW4gaXMgYWxyZWFkeSBpbiB0aGUgUEFUSCwgd2Ugc2hhbGwgc2ltcGx5IGV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKKworCisgICAgICAgICQgamF2YQorCitJZiB5b3UgZ2V0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSwgeW91IG5lZWQgdG8gYWx0ZXIgdGhlIFBBVEggdmFyaWFibGUgaW4geW91ciB+Ly5iYXNoX3Byb2ZpbGUgb3Igfi8uYmFzaHJjICh3aGljaGV2ZXIgeW91IHVzZSkuCisKKworICAgICAgICAtYmFzaDogamF2YTogY29tbWFuZCBub3QgZm91bmQKKworIyMgU2VjdGlvbiAxOiBTaW5nbGUtTWFjaGluZSBBU1RFUklYIGluc3RhbGxhdGlvbiAjIworV2UgYXNzdW1lIGEgdXNlciBKb2Ugd2l0aCBhIGhvbWUgZGlyZWN0b3J5IGFzIC9ob21lL2pvZS4gUGxlYXNlIG5vdGUgdGhhdCBvbiBNYWMsIHRoZSBob21lIGRpcmVjdG9yeSBmb3IgdXNlciBKb2Ugd291bGQgYmUgL1VzZXJzL2pvZS4KKworIyMjIENvbmZpZ3VyaW5nIEVudmlyb25tZW50ICMjIworRW5zdXJlIHRoYXQgSkFWQV9IT01FICB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBwb2ludHMgdG8gdGhlIHRoZSBqYXZhIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb24geW91ciBtYWNoaW5lLiAgVG8gdmVyaWZ5LCBleGVjdXRlIHRoZSBmb2xsb3dpbmcuCisKKworICAgICAgICAkIGVjaG8gJEpBVkFfSE9NRQorCitJZiB5b3UgZG8gbm90IHNlZSBhbnkgb3V0cHV0LCBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQuIFdlIG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIHByb2ZpbGUgbG9jYXRlZCBhdCAgL2hvbWUvam9lLy5iYXNoX3Byb2ZpbGUgb3IgL2hvbWUvam9lLy5iYXNocmMsIHdoaWNoZXZlciB5b3UgYXJlIHVzaW5nLiBJZiB5b3UgZG8gbm90IGFueSBvZiB0aGVzZSBmaWxlcywgY3JlYXRlIGEgfi8uYmFzaF9wcm9maWxlLgorCisKKyAgICAgICAgZXhwb3J0IEpBVkFfSE9NRT08UGF0aCB0byBKYXZhIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk+CisKK0FmdGVyIHlvdSBoYXZlIGVkaXRlZCB+Ly5iYXNoX3Byb2ZpbGUgKG9yIH4vLmJhc2hyYyksIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyB0byBtYWtlIHRoZSBjaGFuZ2VzIGVmZmVjdGl2ZSBpbiBjdXJyZW50IHNoZWxsLgorCisKKyAgICAgICAgJCBzb3VyY2UgL2hvbWUvam9lLy5iYXNoX3Byb2ZpbGUgKG9yIC9ob21lL2pvZS8uYmFzaHJjKQorCitCZWZvcmUgcHJvY2VlZGluZywgdmVyaWZ5IHRoYXQgSkFWQV9IT01FIGlzIGRlZmluZWQgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcuCisKKworICAgICAgICAkIGVjaG8gJEpBVkFfSE9NRQorCisjIyMgQ29uZmlndXJpbmcgU1NIICMjIworSWYgU1NIIGlzIG5vdCBlbmFibGVkIG9uIHlvdXIgc3lzdGVtLCBwbGVhc2UgZm9sbG93IHRoZSBpbnN0cnVjdGlvbiBiZWxvdyB0byBlbmFibGUvaW5zdGFsbCBpdCBvciBlbHNlIHNraXAgdG8gdGhlIHNlY3Rpb24gWyNDb25maWd1cmluZ19QYXNzd29yZC1sZXNzX1NTSCBDb25maWd1cmluZyBQYXNzd29yZC1sZXNzIFNTSF0uCisKKyMjIyMgRW5hYmxpbmcgU1NIIG9uIE1hYyAjIyMjCitUaGUgQXBwbGUgTWFjIE9TIFggb3BlcmF0aW5nIHN5c3RlbSBoYXMgU1NIIGluc3RhbGxlZCBieSBkZWZhdWx0IGJ1dCB0aGUgU1NIIGRhZW1vbiBpcyBub3QgZW5hYmxlZC4gVGhpcyBtZWFucyB5b3UgY2Fu4oCZdCBsb2dpbiByZW1vdGVseSBvciBkbyByZW1vdGUgY29waWVzIHVudGlsIHlvdSBlbmFibGUgaXQuIFRvIGVuYWJsZSBpdCwgZ28gdG8g4oCYU3lzdGVtIFByZWZlcmVuY2Vz4oCZLiBVbmRlciDigJhJbnRlcm5ldCAmIE5ldHdvcmtpbmfigJkgdGhlcmUgaXMgYSDigJhTaGFyaW5n4oCZIGljb24uIFJ1biB0aGF0LiBJbiB0aGUgbGlzdCB0aGF0IGFwcGVhcnMsIGNoZWNrIHRoZSDigJhSZW1vdGUgTG9naW7igJkgb3B0aW9uLiBBbHNvIGNoZWNrIHRoZSAiQWxsIHVzZXJzIiByYWRpbyBidXR0b24gZm9yICJBbGxvdyBhY2Nlc3MgZm9yIi4gIFRoaXMgc3RhcnRzIHRoZSBTU0ggZGFlbW9uIGltbWVkaWF0ZWx5IGFuZCB5b3UgY2FuIHJlbW90ZWx5IGxvZ2luIHVzaW5nIHlvdXIgdXNlcm5hbWUuIFRoZSDigJhTaGFyaW5n4oCZIHdpbmRvdyBzaG93cyBhdCB0aGUgYm90dG9tIHRoZSBuYW1lIGFuZCBJUCBhZGRyZXNzIHRvIHVzZS4gWW91IGNhbiBhbHNvIGZpbmQgdGhpcyBvdXQgdXNpbmcg4oCYd2hvYW1p4oCZIGFuZCDigJhpZmNvbmZpZ+KAmSBmcm9tIHRoZSBUZXJtaW5hbCBhcHBsaWNhdGlvbi4KKworIyMjIyBFbmFibGluZyBTU0ggb24gTGludXggIyMjIworCisgICAgICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIG9wZW5zc2gtc2VydmVyCisKK0Fzc3VtbWluZyB0aGF0IHlvdSBoYXZlIGVuYWJsZWQgU1NIIG9uIHlvdXIgc3lzdGVtLCBsZXQgdXMgcHJvY2VlZC4KKworIyMjIyBDb25maWd1cmluZyBQYXNzd29yZC1sZXNzIFNTSCAjIyMjCisKK0ZvciBvdXIgc2luZ2xlLW1hY2hpbmUgc2V0dXAgb2YgQVNURVJJWCwgd2UgbmVlZCB0byBjb25maWd1cmUgcGFzc3dvcmQtbGVzcyBTU0ggYWNjZXNzIHRvIGxvY2FsaG9zdC4gV2UgYXNzdW1lIHRoYXQgeW91IGFyZSBvbiB0aGUgbWFjaGluZSB3aGVyZSB5b3Ugd2FudCB0byBpbnN0YWxsIEFTVEVSSVguIFRvIHZlcmlmeSBpZiB5b3UgYWxyZWFkeSBoYXZlIHBhc3N3b3JkLWxlc3MgU1NIIGNvbmZpZ3VyZWQsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZy4KKworCisgICAgICAgICAkIHNzaCAxMjcuMC4wLjEKKworSWYgeW91IGdldCBhbiBvdXRwdXQgc2ltaWxhciB0byBvbmUgc2hvd24gYmVsb3csIHR5cGUgInllcyIgYW5kIHByZXNzIGVudGVyLgorCisKKyAgICAgICAgVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICcxMjcuMC4wLjEgKDEyNy4wLjAuMSknIGNhbid0IGJlIGVzdGFibGlzaGVkLgorICAgICAgICBSU0Ega2V5IGZpbmdlcnByaW50IGlzIGFhOjdiOjUxOjkwOjc0OjM5OmM0OmY2OjI4OmEyOjlkOjQ3OmMyOjhkOjMzOjMxLgorICAgICAgICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgY29ubmVjdGluZyAoeWVzL25vKT8KKworSWYgeW91IGFyZSBub3QgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQsIHRoYXQgaXMgaWYgeW91IGdldCBhbiBvdXRwdXQgc2ltaWxhciB0byBvbmUgc2hvd24gYmVsb3csIHNraXAgdG8gdGhlIG5leHQgc2VjdGlvbiBbI0NvbmZpZ3VyaW5nX01hbmFnaXggQ29uZmlndXJpbmcgTWFuYWdpeF0uCisKKworICAgICAgICAkIHNzaCAxMjcuMC4wLjEKKyAgICAgICAgTGFzdCBsb2dpbjogU2F0IE1hciAyMyAyMjo1Mjo0OSAyMDEzCisKK1lvdSBhcmUgaGVyZSBiZWNhdXNlIHlvdSB3ZXJlIHByb21wdGVkIGZvciBhIHBhc3N3b3JkLiAgWW91IG5lZWQgdG8gY29uZmlndXJlIHBhc3N3b3JkIGxlc3MgU1NILiAgIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93LgorCisKKyAgICAgICAgICQgc3NoLWtleWdlbiAtdCByc2EgLVAgIiIKKyAgICAgICAgR2VuZXJhdGluZyBwdWJsaWMvcHJpdmF0ZSByc2Ega2V5IHBhaXIuCisgICAgICAgIEVudGVyIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUga2V5ICgvaG9tZS9qb2UvLnNzaC9pZF9yc2EpOiAgIFtXZSBzaGFsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUsIHNvIHNpbXBseSBwcmVzcyBlbnRlcl0KKworSWYgYSBrZXkgYWxyZWFkeSBleGlzdHMsIHlvdSBzaG91bGQgZ2V0IGFuIG91dHB1dCBzaW1pbGFyIHRvIHdoYXQgaXMgc2hvd24gYmVsb3cuICBQcmVzcyAneScgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBrZXkuCisKKworICAgICAgICAvaG9tZS9qb2UvLnNzaC9pZF9yc2EgYWxyZWFkeSBleGlzdHMuCisgICAgICAgIE92ZXJ3cml0ZSAoeS9uKT8KKworWW91IHNob3VsZCBzZWUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gb25lIHNob3duIGJlbG93LgorCisKKyAgICAgICAgVGhlIGtleSBmaW5nZXJwcmludCBpczoKKyAgICAgICAgNGQ6YjA6MzA6MTQ6NDU6Y2M6OTk6ODY6MTU6NDg6MTc6MGI6Mzk6YTA6MDU6Y2Egam9lQGpvZS1tYWNoaW5lCisgICAgICAgIFRoZSBrZXkncyByYW5kb21hcnQgaW1hZ2UgaXM6CisgICAgICAgICstLVsgUlNBIDIwNDhdLS0tLSsKKyAgICAgICAgfCAgLi5vK0JATz0gICAgICAgfAorICAgICAgICB8Li4gbyAgPT0qKyAgICAgICB8CisgICAgICAgIHwuRS4gICAgb28gLiAgICAgIHwKKyAgICAgICAgfCAgICAgICAgIG8gICAgICAgfAorICAgICAgICB8ICAgICAgICBTIC4gICAgICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworCitOb3RlOiBmb3IgTGludXggdXNlcnMsIHlvdSBtYXkgbm90IGdldCBhbiBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5LCBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3IuICBOZXh0LCBleGVjdXRlIHRoZSBmb2xsb3dpbmc6CisKKworICAgICAgICAgICQgY2F0ICRIT01FLy5zc2gvaWRfcnNhLnB1YiA+PiAkSE9NRS8uc3NoL2F1dGhvcml6ZWRfa2V5cworCitXZSBzaGFsbCBub3cgcmV0cnkgU1NIIHdpdGhvdXQgcGFzc3dvcmQuCisKKworICAgICAgICAkIHNzaCAxMjcuMC4wLjEKKworWW91IG1heSBzZWUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gb25lIHNob3duIGJlbG93LgorCisKKyAgICAgICAgVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICcxMjcuMC4wLjEgKDEyNy4wLjAuMSknIGNhbid0IGJlIGVzdGFibGlzaGVkLgorICAgICAgICBSU0Ega2V5IGZpbmdlcnByaW50IGlzwqBhYTo3Yjo1MTo5MDo3NDozOTpjNDpmNjoyODphMjo5ZDo0NzpjMjo4ZDozMzozMS4KKyAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/wgorCitUeXBlICd5ZXMnIGFuZCBwcmVzcyB0aGUgZW50ZXIga2V5LiBZb3Ugc2hvdWxkIHNlZSBhbiBvdXRwdXQgc2ltaWxhciB0byBvbmUgc2hvd24gYmVsb3cuCisKKworICAgICAgICBXYXJuaW5nOiBQZXJtYW5lbnRseSBhZGRlZCAnMTI3LjAuMC4xJyAoUlNBKSB0byB0aGUgbGlzdCBvZiBrbm93biBob3N0cy4KKyAgICAgICAgTGFzdCBsb2dpbjogVGh1IE1hciAyOCAxMjoyNzoxMCAyMDEzCisKK1lvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gbG9nIGluIHdpdGhvdXQgYmVpbmcgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQgb3IgYSByZXNwb25zZS4KKworCisgICAgICAgIHNzaCAxMjcuMC4wLjEKKyAgICAgICAgTGFzdCBsb2dpbjogU2F0IE1hciAyMyAyMjo1NDo0MCAyMDEzCisKK0V4ZWN1dGUgJ2V4aXQnIHRvIGNsb3NlIHRoZSBzZXNzaW9uLgorCisKKyAgICAgICAgJCBleGl0CisgICAgICAgIGxvZ291dAorICAgICAgICBDb25uZWN0aW9uIHRvIDEyNy4wLjAuMSBjbG9zZWQuCisKKyMjIyBDb25maWd1cmluZyBNYW5hZ2l4ICMjIworWW91IHdpbGwgbmVlZCB0aGUgQVNURVJJWCBpbnN0YWxsZXIgKGEuay5hIE1hbmFnaXgpLiBEb3dubG9hZCBNYW5hZ2l4IGZyb20gW2h0dHBzOi8vYXN0ZXJpeGRiLmdvb2dsZWNvZGUuY29tL2ZpbGVzL2FzdGVyaXgtaW5zdGFsbGVyLTAuMC41LWJpbmFyeS1hc3NlbWJseS56aXAgaGVyZV07IHRoaXMgaW5jbHVkZXMgdGhlIGJpdHMgZm9yIE1hbmFnaXggYXMgd2VsbCBhcyBBU1RFUklYLgorCitVbnppcCB0aGUgTWFuYWdpeCB6aXAgYnVuZGxlIHRvIGFuIGFwcHJvcHJpYXRlIGxvY2F0aW9uLiBZb3UgbWF5IGNyZWF0ZSBhIHN1Yi1kaXJlY3Rvcnk6ICBhc3Rlcml4LW1nbXQgKHNob3J0IGZvciBhc3Rlcml4LW1hbmFnZW1lbnQpIHVuZGVyIHlvdXIgaG9tZSBkaXJlY3RvcnkuIFdlIHNoYWxsIHJlZmVyIHRvIHRoaXMgbG9jYXRpb24gYXMgTUFOQUdJWF9IT01FLgorCisKKyAgICAgICAgICAkIGNkIH4KKyAgICAgICAgICAvaG9tZS9qb2U+ICQgbWtkaXIgYXN0ZXJpeC1tZ210CisgICAgICAgICAgL2hvbWUvam9lPiAkIGNkIGFzdGVyaXgtbWdtdAorICAgICAgICAgIC9ob21lL2pvZS9hc3Rlcml4LW1nbXQ+ICQgdW56aXAgIDxwYXRoIHRvIHRoZSBNYW5hZ2l4IHppcCBidW5kbGU+CisgICAgICAgICAgL2hvbWUvam9lL2FzdGVyaXgtbWdtdD4gJCBleHBvcnQgTUFOQUdJWF9IT01FPWBwd2RgCisgICAgICAgICAgL2hvbWUvam9lL2FzdGVyaXgtbWdtdD4gJCBleHBvcnQgUEFUSD0kUEFUSDokTUFOQUdJWF9IT01FL2JpbgorCitJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBhZGQgJE1BTkFHSVhfSE9NRS9iaW4gdG8geW91ciBQQVRIIHZhcmlhYmxlIGluIHlvdXIgYmFzaCBwcm9maWxlIC4gVGhpcyBjYW4gYmUgZG9uZSBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZy4KKworCisgICAgICAgIGN1cnJlbnREaXI9YHB3ZGAKKyAgICAgICAgZWNobyAiZXhwb3J0IE1BTkFHSVhfSE9NRT0kY3VycmVudERpciIgPj4gfi8uYmFzaF9wcm9maWxlCisgICAgICAgIGVjaG8gImV4cG9ydCBQQVRIPSRQQVRIOiRNQU5BR0lYX0hPTUUvYmluIiA+PiB+Ly5iYXNoX3Byb2ZpbGUKKworQWJvdmUsIHVzZSB+Ly5iYXNocmMgaW5zdGVhZCBvZiB+Ly5iYXNoX3Byb2ZpbGUgaWYgeW91IGFyZSB1c2luZyB+Ly5iYXNocmMgLgorCitUbyBiZSBhYmxlIHRvIGNyZWF0ZSBhbiBBU1RFUklYIGluc3RhbmNlIGFuZCBtYW5hZ2UgaXRzIGxpZmVjeWNsZSwgdGhlIE1hbmFnaXggcmVxdWlyZXMgeW91IHRvIGNvbmZpZ3VyZSBhIHNldCBvZiBjb25maWd1cmF0aW9uIGZpbGVzIG5hbWVseToKKworICogYGNvbmYvbWFuYWdpeC1jb25mLnhtbGA6ICBBIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgdGhhdCBjb250YWlucyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBNYW5hZ2l4LgorICogQSBjb25maWd1cmF0aW9uIFhNTCBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBub2RlcyBpbiB0aGUgY2x1c3RlciwgZS5nLiwgYCRNQU5BR0lYX0hPTUUvY2x1c3RlcnMvbG9jYWwvbG9jYWwueG1sYC4KKworU2luY2Ugd2UgaW50ZW5kIHRvIHJ1biBBU1RFUklYIG9uIGEgc2luZ2xlIG5vZGUsIE1hbmFnaXggY2FuIGF1dG8tY29uZmlndXJlIGl0c2VsZiBhbmQgcG9wdWxhdGUgdGhlIGFib3ZlIG1lbnRpb25lZCBjb25maWd1cmF0aW9uIGZpbGVzLiAgVG8gYXV0by1jb25maWd1cmUgTWFuYWdpeCwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBNQU5BR0lYX0hPTUUgZGlyZWN0b3J5OgorCisKKyAgICAgICAgIC9ob21lL2pvZS9hc3Rlcml4LW1nbXQ+ICQgbWFuYWdpeCBjb25maWd1cmUKKworTGV0IHVzIGRvIGEgc2FtcGxlIHJ1biB0byB2YWxpZGF0ZSB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXV0by1nZW5lcmF0ZWQgYnkgTWFuYWdpeC4KKworCisgICAgICAgIC9ob21lL2pvZS9hc3Rlcml4LW1nbXQ+ICQgbWFuYWdpeCB2YWxpZGF0ZQorICAgICAgICAgIElORk86IEVudmlyb25tZW50IFtPS10KKyAgICAgICAgICBJTkZPOiBNYW5hZ2l4IENvbmZpZ3VyYXRpb24gW09LXQorCisKKyAgICAgICAgL2hvbWUvam9lL2FzdGVyaXgtbWdtdD4gJCBtYW5hZ2l4IHZhbGlkYXRlIC1jICRNQU5BR0lYX0hPTUUvY2x1c3RlcnMvbG9jYWwvbG9jYWwueG1sCisgICAgICAgICAgSU5GTzogRW52aXJvbm1lbnQgW09LXQorICAgICAgICAgIElORk86IENsdXN0ZXIgY29uZmlndXJhdGlvbiBbT0tdCisKKyMjIyBDcmVhdGluZyBhbiBBU1RFUklYIGluc3RhbmNlICMjIworTm93IHRoYXQgd2UgaGF2ZSBjb25maWd1cmVkIE1hbmFnaXgsIHdlIHNoYWxsIG5leHQgY3JlYXRlIGFuIEFTVEVSSVggaW5zdGFuY2UuIEFuIEFTVEVSSVggaW5zdGFuY2UgaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBuYW1lIGFuZCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBgY3JlYXRlYCBjb21tYW5kLiBUaGUgdXNhZ2UgZGVzY3JpcHRpb24gZm9yIHRoZSBgY3JlYXRlYCBjb21tYW5kIGNhbiBiZSBvYnRhaW5lZCBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZy4KKworCisgICAgICAgICAkIG1hbmFnaXggaGVscCAtY21kIGNyZWF0ZQorICAgICAgICAgQ3JlYXRlcyBhbiBBU1RFUklYIGluc3RhbmNlIHdpdGggYSBzcGVjaWZpZWQgbmFtZS4gUG9zdCBjcmVhdGlvbiwgdGhlIGluc3RhbmNlIGlzIGluIEFDVElWRSBzdGF0ZSwKKyAgICAgICAgIGluZGljYXRpbmcgaXRzIGF2YWlsYWJpbGl0eSBmb3IgZXhlY3V0aW5nIHN0YXRlbWVudHMvcXVlcmllcy4KKyAgICAgICAgIFVzYWdlIGFyZ3VtZW50cy9vcHRpb25zOgorICAgICAgICAgLW4gTmFtZSBvZiB0aGUgQVNURVJJWCBpbnN0YW5jZS4KKyAgICAgICAgIC1jIFBhdGggdG8gdGhlIGNsdXN0ZXIgY29uZmlndXJhdGlvbiBmaWxlCisKK1dlIHNoYWxsIG5vdyB1c2UgdGhlIGNyZWF0ZSBjb21tYW5kIHRvIGNyZWF0ZSBhbiBBU1RFUklYIGluc3RhbmNlIGJ5IHRoZSBuYW1lICJteV9hc3Rlcml4Ii4gSW4gZG9pbmcgc28sIHdlIHNoYWxsIHVzZSB0aGUgY2x1c3RlciBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB3YXMgYXV0by1nZW5lcmF0ZWQgYnkgbWFuYWdpeC4KKworCisgICAgICAgICAkIG1hbmFnaXggY3JlYXRlIC1uIG15X2FzdGVyaXggLWMgJE1BTkFHSVhfSE9NRS9jbHVzdGVycy9sb2NhbC9sb2NhbC54bWwKKworQSBzYW1wbGUgb3V0cHV0IG9mIHRoZSBhYm92ZSBjb21tYW5kIGlzIHNob3duIGJlbG93OgorCisKKyAgICAgICAgSU5GTzogTmFtZTpteV9hc3Rlcml4CisgICAgICAgIENyZWF0ZWQ6VGh1IE1hciAwNyAxMToxNDoxMyBQU1QgMjAxMworICAgICAgICBXZWItVXJsOmh0dHA6Ly8xMjcuMC4wLjE6MTkwMDEKKyAgICAgICAgU3RhdGU6QUNUSVZFCisKK1RoZSB0aGlyZCBsaW5lIGFib3ZlIHNob3dzIHRoZSB3ZWItdXJsIGh0dHA6Ly8xMjcuMC4wLjE6MTkwMDEgZm9yIEFTVEVSSVgncyB3ZWItaW50ZXJmYWNlLiBUaGUgQVNURVJJWCBpbnN0YW5jZSBpcyBpbiB0aGUgJ0FDVElWRScgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHlvdSBtYXkgYWNjZXNzIHRoZSB3ZWItaW50ZXJmYWNlIGJ5IG5hdmlnYXRpbmcgdG8gdGhlIHdlYi11cmwuCisKK1R5cGUgaW4gdGhlIGZvbGxvd2luZyAiSGVsbG8gV29ybGQiIHF1ZXJ5IGluIHRoZSBib3g6CisKKworICAgICAgICBsZXQgJG1lc3NhZ2UgOj0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgcmV0dXJuICRtZXNzYWdlCisKK1ByZXNzIHRoZSAiRXhlY3V0ZSIgYnV0dG9uLiAgSWYgdGhlIHF1ZXJ5IHJlc3VsdCBzaG93cyBvbiB0aGUgb3V0cHV0IGJveCwgdGhlbiBDb25ncmF0dWxhdGlvbnMgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gQVNURVJJWCBpbnN0YW5jZQorCisjIyBTZWN0aW9uIDI6IFNpbmdsZS1NYWNoaW5lIEFTVEVSSVggaW5zdGFsbGF0aW9uIChBZHZhbmNlZCkgIyMKK1dlIGFzc3VtZSB0aGF0IHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhlIHNpbmdsZS1tYWNoaW5lIEFTVEVSSVggaW5zdGFsbGF0aW9uIGJ5IGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlIGluIHNlY3Rpb24gIFsjU2VjdGlvbl8xOl9TaW5nbGUtTWFjaGluZV9BU1RFUklYX2luc3RhbGxhdGlvbiBTaW5nbGUgTWFjaGluZSBBU1RFUklYIGluc3RhbGxhdGlvbl0uICBJbiB0aGlzIHNlY3Rpb24sIHdlIHNoYWxsIGNvdmVyIGFkdmFuY2VkIHRvcGljcyByZWxhdGVkIHRvIEFTVEVSSVggY29uZmlndXJhdGlvbi4gQmVmb3JlIHdlIHByb2NlZWQsIGl0IGlzIGltcGVyYXRpdmUgdG8gZ28gdGhyb3VnaCBzb21lIHByZWxpbWluYXJ5IGNvbmNlcHRzIHJlbGF0ZWQgdG8gQVNURVJJWCBydW50aW1lLgorCisjIyMgQVNURVJJWCBSdW50aW1lICMjIworQW4gQVNURVJJWCBydW50aW1lIGNvbXByaXNlcyBvZiBhICcnbWFzdGVyIG5vZGUnJyBhbmQgYSBzZXQgb2YgJyd3b3JrZXIgbm9kZXMnJywgZWFjaCBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIGlkLiBUaGUgbWFzdGVyIG5vZGUgcnVucyBhICcnQ2x1c3RlciBDb250cm9sbGVyJycgc2VydmljZSAoYS5rLmEuICcnQ0MnJyksICB3aGlsZSBlYWNoIHdvcmtlciBub2RlIHJ1bnMgYSAnJ05vZGUgQ29udHJvbGxlcicnIHNlcnZpY2UgKGEuay5hLiAnJ05DJycpLiBQbGVhc2Ugbm90ZSB0aGF0IGEgbm9kZSBpbiBhbiBBU1RFUklYIGNsdXN0ZXIgaXMgYSBsb2dpY2FsIGNvbmNlcHQgaW4gdGhlIHNlbnNlIHRoYXQgbXVsdGlwbGUgbm9kZXMgbWF5IG1hcCB0byBhIHNpbmdsZSBwaHlzaWNhbCBtYWNoaW5lLCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgYSBzaW5nbGUtbWFjaGluZSBBU1RFUklYIGluc3RhbGxhdGlvbi4gVGhpcyBhc3NvY2lhdGlvbiBvciBtYXBwaW5nIGJldHdlZW4gYW4gQVNURVJJWCBub2RlIGFuZCBhIHBoeXNpY2FsIG1hY2hpbmUgaXMgY2FwdHVyZWQgaW4gYSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUuIEluIGFkZGl0aW9uLCB0aGUgWE1MIGZpbGUgY29udGFpbnMgcHJvcGVydGllcyBhbmQgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggZWFjaCBub2RlLgorCisjIyMjIEFTVEVSSVggUnVudGltZSBDb25maWd1cmF0aW9uICMjIyMKK0FzIG9ic2VydmVkIGVhcmxpZXIsIE1hbmFnaXggY2FuIGF1dG8tY29uZmlndXJlIGl0c2VsZiBmb3IgYSBzaW5nbGUtbWFjaGluZSBzZXR1cC4gQXMgcGFydCBvZiBhdXRvLWNvbmZpZ3VyYXRpb24sIE1hbmFnaXggZ2VuZXJhdGVkIHRoZSBjbHVzdGVyIFhNTCBmaWxlLiBMZXQgdXMgdW5kZXJzdGFuZCB0aGUgY29tcG9uZW50cyBvZiB0aGUgZ2VuZXJhdGVkIGNsdXN0ZXIgWE1MIGZpbGUuIElmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgTWFuYWdpeCAodmlhIHRoZSAiY29uZmlndXJlIiBjb21tYW5kKSwgeW91IGNhbiBmaW5kIGEgc2ltaWxhciBjbHVzdGVyIFhNTCBmaWxlIGFzICRNQU5BR0lYX0hPTUUvY2x1c3RlcnMvbG9jYWwvbG9jYWwueG1sLiBUaGUgZm9sbG93aW5nIGlzIGEgc2FtcGxlIFhNTCBmaWxlIGdlbmVyYXRlZCBvbiBhIFVidW50dSAoTGludXgpIHNldHVwOgorCisKKyAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorICAgICAgICA8Y2x1c3RlciB4bWxucz0iY2x1c3RlciI+CisgICAgICAgICAgICA8bmFtZT5sb2NhbDwvbmFtZT4KKyAgICAgICAgICAgIDxqYXZhX2hvbWU+L3Vzci9saWIvanZtL2pkazEuNy4wPC9qYXZhX2hvbWU+CisgICAgICAgICAgICA8amF2YV9vcHRzPi1YbXgxMDQ4bTwvamF2YV9vcHRzPgorICAgICAgICAgICAgPGxvZ2Rpcj4vaG9tZS9qb2UvYXN0ZXJpeC1tZ210L2NsdXN0ZXJzL2xvY2FsL3dvcmtpbmdfZGlyL2xvZ3M8L2xvZ2Rpcj4KKyAgICAgICAgICAgIDxpb2RldmljZXM+L2hvbWUvam9lL2FzdGVyaXgtbWdtdC9jbHVzdGVycy9sb2NhbC93b3JraW5nX2RpcjwvaW9kZXZpY2VzPgorICAgICAgICAgICAgPHN0b3JlPnN0b3JhZ2U8L3N0b3JlPgorICAgICAgICAgICAgPHdvcmtpbmdEaXI+CisgICAgICAgICAgICAgICAgPGRpcj4vaG9tZS9qb2UvYXN0ZXJpeC1tZ210L2NsdXN0ZXJzL2xvY2FsL3dvcmtpbmdfZGlyPC9kaXI+CisgICAgICAgICAgICAgICAgPE5GUz50cnVlPC9ORlM+CisgICAgICAgICAgICA8L3dvcmtpbmdEaXI+CisgICAgICAgICAgICA8bWFzdGVyLW5vZGU+CisgICAgICAgICAgICAgICAgPGlkPm1hc3RlcjwvaWQ+CisgICAgICAgICAgICAgICAgPGNsaWVudC1pcD4xMjcuMC4wLjE8L2NsaWVudC1pcD4KKyAgICAgICAgICAgICAgICA8Y2x1c3Rlci1pcD4xMjcuMC4wLjE8L2NsdXN0ZXItaXA+CisgICAgICAgICAgICA8L21hc3Rlci1ub2RlPgorICAgICAgICAgICAgPG5vZGU+CisgICAgICAgICAgICAgICAgPGlkPm5vZGUxPC9pZD4KKyAgICAgICAgICAgICAgICA8Y2x1c3Rlci1pcD4xMjcuMC4wLjE8L2NsdXN0ZXItaXA+CisgICAgICAgICAgICA8L25vZGU+CisgICAgICAgIDwvY2x1c3Rlcj4KKworV2Ugc2hhbGwgbmV4dCBleHBsYWluIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUuCisKKyMjIyMgKDEpIERlZmluaW5nIG5vZGVzIGluIEFTVEVSSVggcnVudGltZSAjIyMjCitUaGUgc2luZ2xlLW1hY2hpbmUgQVNURVJJWCBpbnN0YW5jZSBjb25maWd1cmF0aW9uIHRoYXQgaXMgYXV0by1nZW5lcmF0ZWQgYnkgTWFuYWdpeCAodXNpbmcgdGhlICJjb25maWd1cmUiIGNvbW1hbmQpIGludm9sdmVzIGEgbWFzdGVyIG5vZGUgKENDKSBhbmQgYSB3b3JrZXIgbm9kZSAoTkMpLiAgRWFjaCBub2RlIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGlkIGFuZCBwcm92aWRlZCB3aXRoIGFuIGlwIGFkZHJlc3MgKGNhbGxlZCAnJ2NsdXN0ZXItaXAnJykgdGhhdCBtYXBzIGEgbm9kZSB0byBhIHBoeXNpY2FsIG1hY2hpbmUuIFRoZSBmb2xsb3dpbmcgc25pcHBldCBmcm9tIHRoZSBhYm92ZSBYTUwgZmlsZSBjYXB0dXJlcyB0aGUgbWFzdGVyL3dvcmtlciBub2RlcyBpbiBvdXIgQVNURVJJWCBpbnN0YWxsYXRpb24uCisKKworICAgICAgICAgICAgPG1hc3Rlci1ub2RlPgorICAgICAgICAgICAgICAgIDxpZD5tYXN0ZXI8L2lkPgorICAgICAgICAgICAgICAgIDxjbGllbnQtaXA+MTI3LjAuMC4xPC9jbGllbnQtaXA+CisgICAgICAgICAgICAgICAgPGNsdXN0ZXItaXA+MTI3LjAuMC4xPC9jbHVzdGVyLWlwPgorICAgICAgICAgICAgPC9tYXN0ZXItbm9kZT4KKyAgICAgICAgICAgIDxub2RlPgorICAgICAgICAgICAgICAgIDxpZD5ub2RlMTwvaWQ+CisgICAgICAgICAgICAgICAgPGNsdXN0ZXItaXA+MTI3LjAuMC4xPC9jbHVzdGVyLWlwPgorICAgICAgICAgICAgPC9ub2RlPgorCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24geG1sIGZpbGUuCisKK3x8IF9fUHJvcGVydHlfXyB8fCAgX19EZXNjcmlwdGlvbl9fICB8fAorfHwgaWQgfHwgQSB1bmlxdWUgaWQgZm9yIGEgbm9kZS4gfHwKK3x8IGNsdXN0ZXItaXAgfHwgSVAgYWRkcmVzcyBvZiB0aGUgbWFjaGluZSB0byB3aGljaCBhIG5vZGUgbWFwcyB0by4gVGhpcyBhZGRyZXNzIGlzIHVzZWQgZm9yIGFsbCBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIG5vZGVzLiB8fAorfHwgY2xpZW50LWlwIHx8IFByb3ZpZGVkIGZvciB0aGUgbWFzdGVyIG5vZGUuIFRoaXMgSVAgc2hvdWxkIGJlIHJlYWNoYWJsZSBmcm9tIGNsaWVudHMgdGhhdCB3YW50IHRvIGNvbm5lY3Qgd2l0aCBBU1RFUklYIHZpYSBpdHMgd2ViIGludGVyZmFjZS4gfHwKKworIyMjIyAoMikgUHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggYSB3b3JrZXIgbm9kZSAoTkMpIGluIEFTVEVSSVggIyMjIworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCB3b3JrZXIgbm9kZSBpbiBhbiBBU1RFUklYIGNvbmZpZ3VyYXRpb24uCisKK3x8IF9fUHJvcGVydHlfXyB8fCBfX0Rlc2NyaXB0aW9uX18gfHwKK3x8IGphdmFfaG9tZSB8fCBKYXZhIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgYXQgZWFjaCBub2RlLiB8fAorfHwgamF2YV9vcHRzIHx8IEpWTSBhcmd1bWVudHMgcGFzc2VkIG9uIHRvIHRoZSBKVk0gdGhhdCByZXByZXNlbnRzIGEgbm9kZS4gfHwKK3x8IGxvZ2RpciB8fCBBIGRpcmVjdG9yeSB3aGVyZSB3b3JrZXIgbm9kZSBtYXkgd3JpdGUgbG9ncy4gfHwKK3x8IGlvX2RldmljZXMgfHwgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgSU8gRGV2aWNlIG1vdW50IHBvaW50cy4gfHwKK3x8IHN0b3JlIHx8IEEgZGF0YSBkaXJlY3RvcnkgdGhhdCBBU1RFUklYIHVzZXMgdG8gc3RvcmUgZGF0YSBiZWxvbmdpbmcgdG8gZGF0YXNldChzKS4gfHwKKworQWxsIHRoZSBhYm92ZSBwcm9wZXJ0aWVzIGNhbiBiZSBkZWZpbmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgb3IgYSBsb2NhbCBsZXZlbC4gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGVzZSBwcm9wZXJ0aWVzIGFwcGx5IHRvIGFsbCB0aGUgbm9kZXMgaW4gYW4gQVNURVJJWCBjb25maWd1cmF0aW9uLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZXNlIHByb3BlcnRpZXMgYXBwbHkgb25seSB0byB0aGUgbm9kZShzKSB1bmRlciB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLiBBIHByb3BlcnR5IGRlZmluZWQgYXQgdGhlIGxvY2FsIGxldmVsIG92ZXJyaWRlcyB0aGUgZGVmaW5pdGlvbiBhdCB0aGUgZ2xvYmFsIGxldmVsLgorCisjIyMjICgzKSBXb3JraW5nIGRpcmVjdG9yeSBvZiBhbiBBU1RFUklYIGluc3RhbmNlICMjIyMKKworTmV4dCB3ZSBleHBsYWluIHRoZSBmb2xsb3dpbmcgc2V0dGluZyBpbiB0aGUgZmlsZSAkTUFOQUdJWF9IT01FL2NsdXN0ZXJzL2xvY2FsL2xvY2FsLnhtbC4KKworICAgICAgICAgICAgPHdvcmtpbmdEaXI+CisgICAgICAgICAgICAgICAgPGRpcj4vVXNlcnMvam9lL2FzdGVyaXgtbWdtdC9jbHVzdGVycy9sb2NhbC93b3JraW5nX2RpcjwvZGlyPgorICAgICAgICAgICAgICAgIDxORlM+dHJ1ZTwvTkZTPgorICAgICAgICAgICAgPC93b3JraW5nRGlyPgorCisKK01hbmFnaXggYXNzb2NpYXRlcyBhIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGggYW4gQVNURVJJWCBpbnN0YW5jZSBhbmQgdXNlcyB0aGlzIGRpcmVjdG9yeSBmb3IgdHJhbnNmZXJyaW5nIGJpbmFyaWVzIHRvIGVhY2ggbm9kZS4gSWYgdGhlcmUgZXhpc3RzIGEgZGlyZWN0b3J5IHRoYXQgaXMgcmVhZGFibGUgYnkgZWFjaCBub2RlLCBNYW5hZ2l4IGNhbiB1c2UgaXQgdG8gcGxhY2UgYmluYXJpZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgYW5kIHVzZWQgYnkgYWxsIHRoZSBub2RlcyBpbiB0aGUgQVNURVJJWCBzZXQgdXAuIEEgbmV0d29yayBmaWxlIHN5c3RlbSAoTkZTKSBwcm92aWRlcyBzdWNoIGEgZnVuY3Rpb25hbGl0eSBmb3IgYSBjbHVzdGVyIG9mIHBoeXNpY2FsIG1hY2hpbmVzIHN1Y2ggdGhhdCBhIHBhdGggb24gTkZTIGlzIGFjY2Vzc2libGUgZnJvbSBlYWNoIG1hY2hpbmUgaW4gdGhlIGNsdXN0ZXIuICBJbiB0aGUgc2luZ2xlLW1hY2hpbmUgc2V0IHVwIGRlc2NyaWJlZCBhYm92ZSwgYWxsIG5vZGVzIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgcGh5c2ljYWwgbWFjaGluZS4gRWFjaCBwYXRoIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBpcyBhY2Nlc3NpYmxlIHRvIGFsbCB0aGUgbm9kZXMgaW4gdGhlIEFTVEVSSVggc2V0dXAgYW5kIHRoZSBib29sZWFuIHZhbHVlIGZvciBORlMgYWJvdmUgaXMgdGh1cyBzZXQgdG8gYHRydWVgLgorCisjIyMgTWFuYWdpeCBDb25maWd1cmF0aW9uICMjIworTWFuYWdpeCBhbGxvd3MgY3JlYXRpb24gYW5kIG1hbmFnZW1lbnQgb2YgbXVsdGlwbGUgQVNURVJJWCBpbnN0YW5jZXMgYW5kIHVzZXMgWm9va2VlcGVyIGFzIGl0cyBiYWNrLWVuZCBkYXRhYmFzZSB0byBrZWVwIHRyYWNrIG9mIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZWFjaCBpbnN0YW5jZS4gV2UgbmVlZCB0byBwcm92aWRlIGEgc2V0IG9mIG9uZSBvciBtb3JlIGhvc3RzIHRoYXQgTWFuYWdpeCBjYW4gdXNlIHRvIHJ1biBhIFpvb2tlZXBlciBpbnN0YW5jZS4gWm9va2VlcGVyIHJ1bnMgYXMgYSBkYWVtb24gcHJvY2VzcyBvbiBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgaG9zdHMuIEF0IGVhY2ggaG9zdCwgWm9va2VlcGVyIHN0b3JlcyBkYXRhIHVuZGVyIHRoZSBab29rZWVwZXIgaG9tZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBjb25maWd1cmF0aW9uIGAkTUFOQUdJWF9IT01FL2NvbmYvbWFuYWdpeC1jb25mLnhtbGAgdGhhdCBoYXMgWm9va2VlcGVyIHJ1bm5pbmcgb24gdGhlIGxvY2FsaG9zdCAoMTI3LjAuMC4xKSA6CisKKworICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+CisgICAgICAgIDxjb25maWd1cmF0aW9uIHhtbG5zPSJpbnN0YWxsZXIiPgorICAgICAgICAgICAgPHpvb2tlZXBlcj4KKyAgICAgICAgICAgICAgICA8aG9tZURpcj4vaG9tZS9qb2UvYXN0ZXJpeC8uaW5zdGFsbGVyL3pvb2tlZXBlcjwvaG9tZURpcj4KKyAgICAgICAgICAgICAgICA8Y2xpZW50UG9ydD4yOTAwPC9jbGllbnRQb3J0PgorICAgICAgICAgICAgICAgIDxzZXJ2ZXJzPgorICAgICAgICAgICAgICAgICAgICA8c2VydmVyPjEyNy4wLjAuMTwvc2VydmVyPgorICAgICAgICAgICAgICAgIDwvc2VydmVycz4KKyAgICAgICAgICAgIDwvem9va2VlcGVyPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisKK0l0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzaW5nbGUgaG9zdCBmb3IgWm9va2VlcGVyLiBBIGxhcmdlciBudW1iZXIgb2YgaG9zdHMgd291bGQgdXNlIFpvb2tlZXBlcidzIHJlcGxpY2F0aW9uIGFuZCBmYXVsdC10b2xlcmFuY2UgZmVhdHVyZSBzdWNoIHRoYXQgYSBmYWlsdXJlIG9mIGEgaG9zdCBydW5uaW5nIFpvb2tlZXBlciB3b3VsZCBub3QgcmVzdWx0IGluIGxvc3Mgb2YgaW5mb3JtYXRpb24gYWJvdXQgZXhpc3RpbmcgQVNURVJJWCBpbnN0YW5jZXMuCisKKyMjIFNlY3Rpb24gMzogSW5zdGFsbGluZyBBU1RFUklYIG9uIGEgQ2x1c3RlciBvZiBNdWx0aXBsZSBNYWNoaW5lcyAjIworV2UgYXNzdW1lIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgdHdvIHNlY3Rpb25zIGFib3ZlIG9uIHNpbmdsZS1tYWNoaW5lIEFTVEVSSVggc2V0dXAuIE5leHQgd2UgZXhwbGFpbiBob3cgdG8gaW5zdGFsbCBBU1RFUklYIGluIGEgY2x1c3RlciBvZiBtdWx0aXBsZSBtYWNoaW5lcy4gIEFzIGFuIGV4YW1wbGUsIHdlIGFzc3VtZSB3ZSB3YW50IHRvIHNldHVwIEFTVEVSSVggb24gYSBjbHVzdGVyIG9mIHRocmVlIG1hY2hpbmVzLCBpbiB3aGljaCB3ZSB1c2Ugb25lIG1hY2hpbmUgKGNhbGxlZCBtYWNoaW5lIEEpIGFzIHRoZSBtYXN0ZXIgbm9kZSBhbmQgdHdvIG90aGVyIG1hY2hpbmVzIChjYWxsZWQgbWFjaGluZSBCIGFuZCBtYWNoaW5lIEMpIGFzIHRoZSB3b3JrZXIgbm9kZXMsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbToKKworW2h0dHBzOi8vYXN0ZXJpeGRiLmdvb2dsZWNvZGUuY29tL2ZpbGVzL0FzdGVyaXhDbHVzdGVyLnBuZ10KKworTm90aWNlIHRoYXQgZWFjaCBtYWNoaW5lIGhhcyBhICcnY2x1c3Rlci1pcCcnIGFkZHJlc3MsIHdoaWNoIGlzIHVzZWQgYnkgdGhlc2UgbWFjaGluZXMgZm9yIHRoZWlyIGludHJhLWNsdXN0ZXIgY29tbXVuaWNhdGlvbi4gTWVhbndoaWxlLCB0aGUgbWFzdGVyIG1hY2hpbmUgYWxzbyBoYXMgYSAnJ2NsaWVudC1pcCcnIGFkZHJlc3MsIHVzaW5nIHdoaWNoIGFuIGVuZC11c2VyIG91dHNpZGUgdGhlIGNsdXN0ZXIgY2FuIGNvbW11bmljYXRlIHdpdGggdGhpcyBtYWNoaW5lLiAgVGhlIHJlYXNvbiB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlc2UgdHdvIHR5cGVzIG9mIElQIGFkZHJlc3NlcyBpcyB0aGF0IHdlIGNhbiBoYXZlIGEgY2x1c3RlciBvZiBtYWNoaW5lcyB1c2luZyBhIHByaXZhdGUgbmV0d29yay4gSW4gdGhpcyBjYXNlIHRoZXkgaGF2ZSBpbnRlcm5hbCBpcCBhZGRyZXNzZXMgdGhhdCBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIHRoZSBuZXR3b3JrLiAgSW4gdGhlIGNhc2UgYWxsIHRoZSBtYWNoaW5lcyBhcmUgb24gYSBwdWJsaWMgbmV0d29yaywgdGhlICJjbGllbnQtaXAiIGFuZCAiY2x1c3Rlci1pcCIgb2YgdGhlIG1hc3RlciBtYWNoaW5lIGNhbiBzaGFyZSB0aGUgc2FtZSBhZGRyZXNzLgorCitOZXh0IHdlIGRlc2NyaWJlIGhvdyB0byBzZXQgdXAgQVNURVJJWCBpbiB0aGlzIGNsdXN0ZXIsIGFzc3VtaW5nIG5vIE1hbmFnaXggaGFzIGJlZW4gaW5zdGFsbGVkIG9uIHRoZXNlIG1hY2hpbmVzLgorCisjIyMgU3RlcCAoMSk6IERlZmluZSB0aGUgQVNURVJJWCBjbHVzdGVyICMjIworCitXZSBmaXJzdCBsb2cgaW50byB0aGUgbWFzdGVyIG1hY2hpbmUgYXMgdGhlIHVzZXIgImpvZSIuIE9uIHRoaXMgbWFjaGluZSwgZG93bmxvYWQgTWFuYWdpeCBmcm9tIFtodHRwczovL2FzdGVyaXhkYi5nb29nbGVjb2RlLmNvbS9maWxlcy9hc3Rlcml4LWluc3RhbGxlci0wLjAuNS1iaW5hcnktYXNzZW1ibHkuemlwIGhlcmVdIChzYXZlIGFzIGFib3ZlKSwgdGhlbiBkbyB0aGUgZm9sbG93aW5nIHN0ZXBzIHNpbWlsYXIgdG8gdGhlIHNpbmdsZS1tYWNoaW5lIGNhc2UgZGVzY3JpYmVkIGFib3ZlOgorCisKKyAgICAgICAgbWFjaGluZUE+IGNkIH4KKyAgICAgICAgbWFjaGluZUE+IG1rZGlyIGFzdGVyaXgtbWdtdAorICAgICAgICBtYWNoaW5lQT4gY2QgYXN0ZXJpeC1tZ210CisgICAgICAgIG1hY2hpbmVBPiB1bnppcCAgPHBhdGggdG8gdGhlIE1hbmFnaXggemlwIGJ1bmRsZT4KKyAgICAgICAgbWFjaGluZUE+IGV4cG9ydCBNQU5BR0lYX0hPTUU9YHB3ZGAKKyAgICAgICAgbWFjaGluZUE+IGV4cG9ydCBQQVRIPSRQQVRIOiRNQU5BR0lYX0hPTUUvYmluCisKKworV2UgYWxzbyBuZWVkIGFuIEFTVEVSSVggY29uZmlndXJhdGlvbiBYTUwgZmlsZSBmb3IgdGhlIGNsdXN0ZXIuICBXZSBnaXZlIHRoZSBuYW1lIHRvIHRoZSBjbHVzdGVyLCBzYXksICJyYWluYm93Ii4gIFdlIGNyZWF0ZSBhIGZvbGRlciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBjbHVzdGVyOgorCisKKyAgICAgICAgbWFjaGluZUE+IG1rZGlyICRNQU5BR0lYX0hPTUUvcmFpbmJvd19jbHVzdGVyCisKKworRm9yIHRoaXMgY2x1c3RlciB3ZSBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGZpbGUgYCRNQU5BR0lYX0hPTUUvcmFpbmJvd19jbHVzdGVyL3JhaW5ib3cueG1sYC4gIFRoZSBmb2xsb3dpbmcgaXMgYSBzYW1wbGUgZmlsZSB3aXRoIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzOgorCisgICAgICAgIDxjbHVzdGVyIHhtbG5zPSJjbHVzdGVyIj4KKyAgICAgICAgCisgICAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBjbHVzdGVyIC0tPgorICAgICAgICAgIDxuYW1lPnJhaW5ib3c8L25hbWU+CisgICAgICAgIAorICAgICAgICAgIDwhLS0gdXNlcm5hbWUsIHdoaWNoIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIHRoZSB0aHJlZSBtYWNoaW5lcyAtLT4KKyAgICAgICAgICA8dXNlcm5hbWU+am9lPC91c2VybmFtZT4KKyAgICAgICAgCisgICAgICAgICAgPCEtLSBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgTWFuYWdpeC4gSXQgc2hvdWxkIGJlIG9uIGEgbmV0d29yayBmaWxlIHN5c3RlbSAoTkZTKSB0aGF0CisgICAgICAgICAgICBjYW4gYWNjZXNzZWQgYnkgYWxsIHRoZSBtYWNoaW5lLiBOZWVkIHRvIGNyZWF0ZSBpdCBiZWZvcmUgcnVubmluZyBNYW5hZ2l4LiAtLT4KKyAgICAgICAgICA8d29ya2luZ0Rpcj4KKyAgICAgICAgICAgIDxkaXI+L2hvbWUvam9lL21hbmFnaXgtd29ya2luZ0RpcjwvZGlyPgorICAgICAgICAgICAgPE5GUz50cnVlPC9ORlM+CisgICAgICAgICAgPC93b3JraW5nRGlyPgorICAgICAgICAKKyAgICAgICAgICA8IS0tIERpcmVjdG9yeSBmb3IgQXN0ZXJpeCB0byBzdG9yZSBsb2cgaW5mb3JtYXRpb24gZm9yIGVhY2ggbWFjaGluZS4gTmVlZHMKKyAgICAgICAgICAgdG8gYmUgYSBsb2NhbCBmaWxlIHN5c3RlbS4gTmVlZHMgdG8gY3JlYXRlIGl0IGJlZm9yZSBydW5uaW5nIE1hbmFnaXguIC0tPgorICAgICAgICAgIDxsb2dkaXI+L21udC9qb2UvbG9nczwvbG9nZGlyPgorICAgICAgICAKKyAgICAgICAgICA8IS0tIERpcmVjdG9yeSB1c2VkIGJ5IGVhY2ggd29ya2VyIG5vZGUgdG8gc3RvcmUgZGF0YSBmaWxlcy4gTmVlZHMKKyAgICAgICAgICAgdG8gYmUgYSBsb2NhbCBmaWxlIHN5c3RlbS4gTmVlZHMgdG8gY3JlYXRlIGl0IGJlZm9yZSBydW5uaW5nIE1hbmFnaXguIC0tPgorICAgICAgICAgIDxpb2RldmljZXM+L21udC9qb2U8L2lvZGV2aWNlcz4KKyAgICAgICAgICA8c3RvcmU+c3RvcmFnZTwvc3RvcmU+CisgICAgICAgIAorICAgICAgICAgIDwhLS0gSmF2YSBob21lIGZvciBlYWNoIG1hY2hpbmUgd2l0aCBpdHMgSlZNIG9wdGlvbnMgLS0+CisgICAgICAgICAgPGphdmFfaG9tZT4vdXNyL2xpYi9qdm0vamRrMS43LjA8L2phdmFfaG9tZT4KKyAgICAgICAgICA8amF2YV9vcHRzPi1YbXgxMDI0bTwvamF2YV9vcHRzPgorICAgICAgICAKKyAgICAgICAgICAgPCEtLSBJUCBhZGRyZXNzZXMgb2YgdGhlIG1hc3RlciBtYWNoaW5lIEEgLS0+CisgICAgICAgICAgPG1hc3Rlci1ub2RlPgorICAgICAgICAgICAgPGlkPm1hc3RlcjwvaWQ+CisgICAgICAgICAgICA8Y2xpZW50LWlwPjEyOC4xOTUuNTIuMTc3PC9jbGllbnQtaXA+CisgICAgICAgICAgICA8Y2x1c3Rlci1pcD4xOTIuMTY4LjEwMC4wPC9jbHVzdGVyLWlwPgorICAgICAgICAgIDwvbWFzdGVyLW5vZGU+CisgICAgICAgIAorICAgICAgICAgICA8IS0tIElQIGFkZHJlc3MoZXMpIG9mIG1hY2hpbmUgQiAtLT4KKyAgICAgICAgICA8bm9kZT4KKyAgICAgICAgICAgIDxpZD5ub2RlQjwvaWQ+CisgICAgICAgICAgICA8Y2x1c3Rlci1pcD4xOTIuMTY4LjEwMC4xPC9jbHVzdGVyLWlwPgorICAgICAgICAgIDwvbm9kZT4KKyAgICAgICAgCisgICAgICAgICAgIDwhLS0gSVAgYWRkcmVzcyhlcykgb2YgbWFjaGluZSBDIC0tPgorICAgICAgICAgIDxub2RlPgorICAgICAgICAgICAgPGlkPm5vZGVDPC9pZD4KKyAgICAgICAgICAgIDxjbHVzdGVyLWlwPjE5Mi4xNjguMTAwLjI8L2NsdXN0ZXItaXA+CisgICAgICAgICAgPC9ub2RlPgorICAgICAgICA8L2NsdXN0ZXI+CisKKworQXMgc3RhdGVkIGJlZm9yZSwgZWFjaCBvZiB0aGUgYWJvdmUgcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBhdCB0aGUgY2x1c3RlciBsZXZlbCwgaW4gd2hpY2ggY2FzZSBpdCBhcHBsaWVzIHRvIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHN5c3RlbS4gIEVhY2ggcHJvcGVydHkgY2FuIGFsc28gYmUgZGVmaW5lZCBhdCBhIG5vZGUgbGV2ZWwuCisKK09uY2Ugd2UgaGF2ZSBmb3JtZWQgdGhlIGNsdXN0ZXIgWE1MIGZpbGUsIHdlIGNhbiB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBieSBkb2luZyB0aGUgZm9sbG93aW5nOgorCisgICAgICAgIG1hbmFnaXggdmFsaWRhdGUgLWMgJE1BTkFHSVhfSE9NRS9yYWluYm93X2NsdXN0ZXIvcmFpbmJvdy54bWwKKworCitJZiB0aGUgcmV0dXJuIG1lc3NhZ2Ugc2F5cyAiT0siLCBpdCBtZWFucyB0aGF0IHRoZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlIGlzIHNldCBwcm9wZXJseS4KKworIyMjIFN0ZXAgKDIpOiBDb25maWd1cmUgU1NIICMjIworCitUaGUgbmV4dCBzdGVwcyBvZiBzZXR0aW5nIHVwIFNTSCBhcmUgc2ltaWxhciB0byB0aG9zZSBpbiB0aGUgc2luZ2xlLW1hY2hpbmUgc2V0dXAgY2FzZS4gIFdlIGFzc3VtZSB3ZSBoYXZlIGEgY29tbW9uIHVzZXIgYWNjb3VudCBjYWxsZWQgImpvZSIgb24gZWFjaCBtYWNoaW5lIGluIHRoZSBjbHVzdGVyLgorCitPbiB0aGUgbWFzdGVyIG1hY2hpbmUsIGRvIHRoZSBmb2xsb3dpbmc6CisKKworICAgICAgICBtYWNoaW5lQT4gc3NoIGxvY2FsaG9zdAorCisKK0lmIHlvdSBhcmUgcHJvbXB0ZWQgZm9yIGEgcGFzc3dvcmQsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZworCisKKyAgICAgICAgbWFjaGluZUE+IHNzaC1rZXlnZW4gLXQgcnNhIC1QICIiCisgICAgICAgIG1hY2hpbmVBPiBjYXQgJEhPTUUvLnNzaC9pZF9yc2EucHViID4+ICRIT01FLy5zc2gvYXV0aG9yaXplZF9rZXlzCisKKworSWYgJEhPTUUgaXMgbm90IG9uIHRoZSBORlMsIGNvcHkgdGhlIGlkX3JzYS5wdWIgdG8gdGhlIGRpcmVjdG9yeSB+Ly5zc2ggKGxvZ2luIHdpdGggdGhlIHNhbWUgYWNjb3VudCkgb24gZWFjaCBtYWNoaW5lLCBhbmQgdGhlbiBkbyB0aGUgZm9sbG93aW5nIG9uIGVhY2ggbWFjaGluZS4gKE5vdGljZSB0aGF0IHRoaXMgc3RlcCBpcyBub3QgbmVlZGVkIGlmIHRoZSBmb2xkZXIgIi5zc2giIGlzIG9uIHRoZSBORlMgYW5kIGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdGhlIG5vZGVzLikKKworCisgICAgICAgIGNkIH4vLnNzaAorICAgICAgICBjYXQgaWRfcnNhLnB1YiA+PiBhdXRob3JpemVkX2tleXMKKworCitUaGVuIHJ1biB0aGUgZm9sbG93aW5nIHN0ZXAgYWdhaW4gYW5kIHR5cGUgIlllcyIgaWYgcHJvbW90ZWQ6CisKKworICAgICAgICBtYWNoaW5lQT4gc3NoIGxvY2FsaG9zdAorCisjIyMgU3RlcCAoMyk6IENvbmZpZ3VyaW5nIE1hbmFnaXggIyMjCisKK01hbmFnaXggaXMgdXNpbmcgYSBjb25maWd1cmF0aW9uIFhNTCBmaWxlIGF0IGAkTUFOQUdJWF9IT01FL2NvbmYvbWFuYWdpeC1jb25mLnhtbGAgdG8gY29uZmlndXJlIGl0cyBvd24gcHJvcGVydGllcywgc3VjaCBhcyBpdHMgWm9va2VlcGVyIHNlcnZpY2UuICBXZSBjYW4gdXNlIHRoZSBgY29uZmlndXJlYCBjb21tYW5kIHRvIGF1dG8tZ2VuZXJhdGUgdGhpcyBjb25maWd1cmF0aW9uIGZpbGU6CisKKworICAgICAgICBtYWNoaW5lQT4gbWFuYWdpeCBjb25maWd1cmUKKworCitXZSB1c2UgdGhlIHZhbGlkYXRlIGNvbW1hbmQgdG8gdmFsaWRhdGUgbWFuYWdpeCBjb25maWd1cmF0aW9uLiBUbyBkbyBzbywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nLgorCisgICAgICAgIG1hY2hpbmVBPiBtYW5hZ2l4IHZhbGlkYXRlCisgICAgICAgIElORk86IEVudmlyb25tZW50IFtPS10KKyAgICAgICAgSU5GTzogTWFuYWdpeCBDb25maWd1cmF0aW9uIFtPS10KKworCitOb3RlIHRoYXQgdGhlIGBjb25maWd1cmVgIGNvbW1hbmQgYWxzbyBnZW5lcmF0ZXMgYSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgYXQgJE1BTkFHSVhfSE9NRS9jb25mL2NsdXN0ZXJzL2xvY2FsLnhtbC4gVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgaW4gdGhlIGNhc2Ugb2YgYSBjbHVzdGVyIG9mIG1hY2hpbmVzLgorCisjIyMgU3RlcCAoNCk6IENyZWF0aW5nIGFuIEFTVEVSSVggaW5zdGFuY2UgIyMjCisKK05vdyB0aGF0IHdlIGhhdmUgY29uZmlndXJlZCBNYW5hZ2l4LCB3ZSBzaGFsbCBuZXh0IGNyZWF0ZSBhbiBBU1RFUklYIGluc3RhbmNlLiBBbiBBU1RFUklYIGluc3RhbmNlIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgbmFtZSBhbmQgaXMgY3JlYXRlZCB1c2luZyB0aGUgY3JlYXRlIGNvbW1hbmQuIFRoZSB1c2FnZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNyZWF0ZSBjb21tYW5kIGNhbiBiZSBvYnRhaW5lZCBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZzoKKworCisgICAgICAgIG1hY2hpbmVBPiBtYW5hZ2l4IGhlbHAgLWNtZCBjcmVhdGUKKyAgICAgICAgCisgICAgICAgICBDcmVhdGVzIGFuIEFTVEVSSVggaW5zdGFuY2Ugd2l0aCBhIHNwZWNpZmllZCBuYW1lLiBQb3N0IGNyZWF0aW9uLCB0aGUgaW5zdGFuY2UgaXMgaW4gQUNUSVZFIHN0YXRlLAorICAgICAgICAgaW5kaWNhdGluZyBpdHMgYXZhaWxhYmlsaXR5IGZvciBleGVjdXRpbmcgc3RhdGVtZW50cy9xdWVyaWVzLgorICAgICAgICAgVXNhZ2UgYXJndW1lbnRzL29wdGlvbnM6CisgICAgICAgICAtbiBOYW1lIG9mIHRoZSBBU1RFUklYIGluc3RhbmNlLgorICAgICAgICAgLWMgUGF0aCB0byB0aGUgY2x1c3RlciBjb25maWd1cmF0aW9uIGZpbGUKKworCitXZSBzaGFsbCBub3cgdXNlIHRoZSBgY3JlYXRlYCBjb21tYW5kIHRvIGNyZWF0ZSBhbiBBU1RFUklYIGluc3RhbmNlIGNhbGxlZCAicmFpbmJvd19hc3Rlcml4Ii4gSW4gZG9pbmcgc28sIHdlIHNoYWxsIHVzZSB0aGUgY2x1c3RlciBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB3YXMgYXV0by1nZW5lcmF0ZWQgYnkgTWFuYWdpeC4KKworCisgICAgICAgIG1hY2hpbmVBPiBtYW5hZ2l4IGNyZWF0ZSAtbiByYWluYm93X2FzdGVyaXggLWMgJE1BTkFHSVhfSE9NRS9jbHVzdGVycy9yYWluYm93L3JhaW5ib3cueG1sCisKKworSWYgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgZG9lcyBub3QgaGF2ZSB3YXJuaW5nLCB0aGVuIENvbmdyYXR1bGF0aW9ucyAgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBBc3Rlcml4IG9uIHRoaXMgY2x1c3RlciBvZiBtYWNoaW5lcworCitQbGVhc2UgcmVmZXIgdG8gdGhlIHNlY3Rpb24gWyNTZWN0aW9uXzQ6X01hbmFnaW5nX2FuX0FTVEVSSVhfSW5zdGFuY2UgTWFuYWdpbmcgYW4gQVNURVJJWCBpbnN0YW5jZV0gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb24gdGhlIHNldCBvZiBhdmFpbGFibGUgY29tbWFuZHMvb3BlcmF0aW9ucyB0aGF0IGxldCB5b3UgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgYW4gQVNURVJJWCBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmRzIHZhcmllcyB3aXRoIHRoZSBjbHVzdGVyIGRlZmluaXRpb24gYW5kIG1heSBub3QgYXBwbHkgdG8gdGhlIGNsdXN0ZXIgc3BlY2lmaWNhdGlvbiB5b3UgYnVpbHQgYWJvdmUuCisKKyMjIFNlY3Rpb24gNDogTWFuYWdpbmcgdGhlIExpZmVjeWNsZSBvZiBhbiBBU1RFUklYIEluc3RhbmNlICMjCisKK05vdyB0aGF0IHdlIGhhdmUgYW4gQVNURVJJWCBpbnN0YW5jZSBydW5uaW5nLCBsZXQgdXMgdXNlIE1hbmFnaXggdG8gbWFuYWdlIHRoZSBpbnN0YW5jZSdzIGxpZmVjeWNsZS4gTWFuYWdpeCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHNldCBvZiBjb21tYW5kcy9vcGVyYXRpb25zOgorCisjIyMjIE1hbmFnaXggQ29tbWFuZHMgIyMjIworfHwgKkNvbW1hbmQqIHx8ICpEZXNjcmlwdGlvbiogfHwKK3x8IFsjQ3JlYXRpbmdfYW5fQVNURVJJWF9pbnN0YW5jZSBjcmVhdGVdIHx8IENyZWF0ZXMgYSBuZXcgYXN0ZXJpeCBpbnN0YW5jZS4gfHwKK3x8IFsjRGVzY3JpYmVfQ29tbWFuZCBkZXNjcmliZV0gfHwgRGVzY3JpYmVzIGFuIGV4aXN0aW5nIGFzdGVyaXggaW5zdGFuY2UuIHx8Cit8fCBbI1N0b3BfQ29tbWFuZCBzdG9wXSB8fCBTdG9wcyBhbiBhc3Rlcml4IGluc3RhbmNlIHRoYXQgaXMgaW4gdGhlIEFDVElWRSBzdGF0ZS4gfHwKK3x8IFsjU3RhcnRfQ29tbWFuZCBzdGFydF0gfHwgU3RhcnRzIGFuIEFzdGVyaXggaW5zdGFuY2UuIHx8Cit8fCBbI0JhY2t1cF9Db21tYW5kIGJhY2t1cF0gfHwgQ3JlYXRlcyBhIGJhY2t1cCBmb3IgYW4gZXhpc3RpbmcgQXN0ZXJpeCBpbnN0YW5jZS4gfHwKK3x8IFsjUmVzdG9yZV9Db21tYW5kIHJlc3RvcmVdIHx8IFJlc3RvcmVzIGFuIEFzdGVyaXggaW5zdGFuY2UuIHx8Cit8fCBbI0RlbGV0ZV9Db21tYW5kIGRlbGV0ZV0gfHwgRGVsZXRlcyBhbiBBc3Rlcml4IGluc3RhbmNlLiB8fAorfHwgWyNDb25maWd1cmluZ19NYW5hZ2l4IHZhbGlkYXRlXSB8fCBWYWxpZGF0ZXMgdGhlIGluc3RhbGxlci9jbHVzdGVyIGNvbmZpZ3VyYXRpb24uIHx8Cit8fCBbI0NvbmZpZ3VyaW5nX01hbmFnaXggY29uZmlndXJlXSB8fCBBdXRvIGdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIEFzdGVyaXggaW5zdGFuY2UuIHx8Cit8fCBbI1NodXRkb3duX0NvbW1hbmQgc2h1dGRvd25dIHx8IFNodXRkb3duIHRoZSBpbnN0YWxsZXIgc2VydmljZS4gfHwKKworWW91IG1heSBvYnRhaW4gdGhlIGFib3ZlIGxpc3RpbmcgYnkgc2ltcGx5IGV4ZWN1dGluZyAnbWFuYWdpeCcgOgorCisKKyAgICAgICAgJCBtYW5hZ2l4CisKK1dlIGFscmVhZHkgdGFsa2VkIGFib3V0IGNyZWF0ZSBhbmQgdmFsaWRhdGUgY29tbWFuZHMuIFdlIHNoYWxsIG5leHQgZXhwbGFpbiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZHMgbGlzdGVkIGFib3ZlLiAgV2UgYWxzbyBwcm92aWRlIHNhbXBsZSBvdXRwdXQgbWVzc2FnZXMgb2YgdGhlc2UgY29tbWFuZHMgYXNzdW1pbmcgd2UgYXJlIHJ1bm5pbmcgYW4gQVNURVJJWCBpbnN0YW5jZSBvbiBhIHNpbmdsZSBtYWNoaW5lLgorCisjIyMjIyBEZXNjcmliZSBDb21tYW5kICMjIyMjCitUaGUgYGRlc2NyaWJlYCBjb21tYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGFuIEFTVEVSSVggaW5zdGFuY2UuIFRoZSB1c2FnZSBjYW4gYmUgbG9va2VkIHVwIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nOgorCisKKyAgICAgICAgICQgbWFuYWdpeCBoZWxwIC1jbWQgZGVzY3JpYmUKKyAgICAgICAgCisgICAgICAgICAgICBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBBU1RFUklYIGluc3RhbmNlLgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6CisgICAgICAgICAgICBbLW5dICAgICAgTmFtZSBvZiB0aGUgQVNURVJJWCBpbnN0YW5jZS4KKyAgICAgICAgICAgIFstYWRtaW5dICBQcm92aWRlcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCisKK1RoZSBicmFja2V0cyBpbmRpY2F0ZSBvcHRpb25hbCBmbGFncy4KKworVGhlIG91dHB1dCBvZiB0aGUgYGRlc2NyaWJlYCBjb21tYW5kIHdoZW4gdXNlZCB3aXRob3V0IHRoZSBgYWRtaW5gIGZsYWcgY29udGFpbnMgbWluaW1hbCBpbmZvcm1hdGlvbiBhbmQgaXMgc2ltaWxhciB0byB0aGUgb3V0cHV0IG9mIHRoZSBjcmVhdGUgY29tbWFuZC4gIExldCB1cyB0cnkgcnVubmluZyB0aGUgZGVzY3JpYmUgY29tbWFuZCBpbiAiYWRtaW4iIG1vZGUuCisKKworICAgICAgICAgJCBtYW5hZ2l4IGRlc2NyaWJlIC1uIG15X2FzdGVyaXggLWFkbWluCisgICAgICAgICBJTkZPOiBOYW1lOm15X2FzdGVyaXgKKyAgICAgICAgIENyZWF0ZWQ6VGh1IE1hciAwNyAxOTowNzowMCBQU1QgMjAxMworICAgICAgICAgV2ViLVVybDpodHRwOi8vMTI3LjAuMC4xOjE5MDAxCisgICAgICAgICBTdGF0ZTpBQ1RJVkUKKyAgICAgICAgIE1hc3RlciBub2RlOm1hc3RlcjoxMjcuMC4wLjEKKyAgICAgICAgIG5vZGUxOjEyNy4wLjAuMQorICAgICAgICAKKyAgICAgICAgIEFzdGVyaXggdmVyc2lvbjowLjAuNQorICAgICAgICAgQXN0ZXJpeCBDb25maWd1cmF0aW9uCisgICAgICAgICBvdXRwdXRfZGlyID0gL3RtcC9hc3Rlcml4X291dHB1dC8KKyAgICAgICAgIE1ldGFkYXRhIE5vZGU6bm9kZTEKKyAgICAgICAgIFByb2Nlc3NlcworICAgICAgICAgTkMgYXQgMTI3LjAuMC4xIFsgMjIxOTUgXQorICAgICAgICAgQ0MgYXQgMTI3LjAuMC4xIFsgMjIxNjEgXQorCitBcyBzZWVuIGFib3ZlLCB0aGUgaW5zdGFuY2UgJ215X2FzdGVyaXgnIGlzIGNvbmZpZ3VyZWQgc3VjaCB0aGF0ICBhbGwgcHJvY2Vzc2VzIHJ1bm5pbmcgYXQgdGhlIGxvY2FsaG9zdCAoMTI3LjAuMC4xKS4gVGhlIHByb2Nlc3MgaWQgZm9yIGVhY2ggcHJvY2VzcyAoSlZNKSBpcyBzaG93biBuZXh0IHRvIGl0LgorCisjIyMjIyBTdG9wIENvbW1hbmQgIyMjIyMKK1RoZSBgc3RvcGAgY29tbWFuZCBjYW4gYmUgdXNlZCBmb3Igc2h1dHRpbmcgZG93biBhbiBBU1RFUklYIGluc3RhbmNlLiBBZnRlciB0aGF0LCB0aGUgaW5zdGFuY2UgaXMgdW5hdmFpbGFibGUgZm9yIGV4ZWN1dGluZyBxdWVyaWVzLiBUaGUgdXNhZ2UgY2FuIGJlIGxvb2tlZCB1cCBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZzoKKworCisgICAgICAgICAkIG1hbmFnaXggaGVscCAtY21kIHN0b3AKKyAgICAgICAgCisgICAgICAgICBTaHV0cyBhbiBBU1RFUklYIGluc3RhbmNlIHRoYXQgaXMgaW4gQUNUSVZFIHN0YXRlLiBBZnRlciBleGVjdXRpbmcgdGhlIHN0b3AgY29tbWFuZCwgdGhlIEFTVEVSSVggaW5zdGFuY2UgdHJhbnNpdHMKKyAgICAgICAgIHRvIHRoZSBJTkFDVElWRSBzdGF0ZSwgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yIGV4ZWN1dGluZyBxdWVyaWVzLgorICAgICAgICAKKyAgICAgICAgIEF2YWlsYWJsZSBhcmd1bWVudHMvb3B0aW9ucworICAgICAgICAgLW4gbmFtZSBvZiB0aGUgQVNURVJJWCBpbnN0YW5jZS4KKworVG8gc3RvcCB0aGUgQVNURVJJWCBpbnN0YW5jZS4KKworCisgICAgICAgICAkIG1hbmFnaXggc3RvcCAtbiBteV9hc3Rlcml4CisgICAgICAgICAgIElORk86IFN0b3BwZWQgQXN0ZXJpeCBpbnN0YW5jZTogbXlfYXN0ZXJpeAorCisKKyAgICAgICAgICQgbWFuYWdpeCBkZXNjcmliZSAtbiBteV9hc3Rlcml4CisgICAgICAgICAgIElORk86IE5hbWU6IG15X2FzdGVyaXgKKyAgICAgICAgICAgQ3JlYXRlZDpUaHUgTWFyIDA3IDE5OjA3OjAwIFBTVCAyMDEzCisgICAgICAgICAgIFdlYi1Vcmw6aHR0cDovLzEyNy4wLjAuMToxOTAwMQorICAgICAgICAgICBTdGF0ZTpJTkFDVElWRSAoRnJpIE1hciAwOCAwOTo0OTowMCBQU1QgMjAxMykKKworCisjIyMjIyBTdGFydCBDb21tYW5kICMjIyMjCitUaGUgYHN0YXJ0YCBjb21tYW5kIHN0YXJ0cyBhbiBBU1RFUklYIGluc3RhbmNlIHRoYXQgaXMgaW4gdGhlIElOQUNUSVZFIHN0YXRlLiBUaGUgdXNhZ2UgY2FuIGJlIGxvb2tlZCB1cCBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZzoKKworCisgICAgICAgICAkIG1hbmFnaXggaGVscCAtY21kIHN0YXJ0CisgICAgICAgIAorICAgICAgICAgU3RhcnRzIGFuIEFTVEVSSVggaW5zdGFuY2UgdGhhdCBpcyBpbiBJTkFDVElWRSBzdGF0ZS4gQWZ0ZXIgZXhlY3V0aW5nIHRoZSBzdGFydCBjb21tYW5kLCB0aGUgQVNURVJJWCBpbnN0YW5jZSB0cmFuc2l0cyB0byB0aGUgQUNUSVZFIHN0YXRlLCAgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdyBhdmFpbGFibGUgZm9yIGV4ZWN1dGluZyBzdGF0ZW1lbnRzL3F1ZXJpZXMuCisgICAgICAgIAorICAgICAgICAgQXZhaWxhYmxlIGFyZ3VtZW50cy9vcHRpb25zCisgICAgICAgICAtbiBuYW1lIG9mIHRoZSBBU1RFUklYIGluc3RhbmNlLgorCitMZXQgdXMgbm93IHN0YXJ0IHRoZSBBU1RFUklYIGluc3RhbmNlLgorCisKKyAgICAgICAgICQgbWFuYWdpeCBzdGFydCAtbiBteV9hc3Rlcml4CisgICAgICAgICAgIElORk86IE5hbWU6bXlfYXN0ZXJpeAorICAgICAgICAgICBDcmVhdGVkOlRodSBNYXIgMDcgMTk6MDc6MDAgUFNUIDIwMTMKKyAgICAgICAgICAgV2ViLVVybDpodHRwOi8vMTI3LjAuMC4xOjE5MDAxCisgICAgICAgICAgIFN0YXRlOkFDVElWRSAoRnJpIE1hciAwOCAwOTo0OTowMCBQU1QgMjAxMykKKworCisjIyMjIyBCYWNrdXAgQ29tbWFuZCAjIyMjIworCitJbiBhbiB1bmRlc2lyYWJsZSBldmVudCBvZiBkYXRhIGxvc3MgZWl0aGVyIGR1ZSB0byBhIGRpc2svc3lzdGVtIGZhaWx1cmUgb3IgYWNjaWRlbnRhbCBleGVjdXRpb24gb2YgYSBEREwgc3RhdGVtZW50IChkcm9wIGRhdGF2ZXJzZS9kYXRhc2V0KSwgeW91IG1heSBuZWVkIHRvIHJlY292ZXIgdGhlIGxvc3QgZGF0YS4gVGhlIGJhY2t1cCBjb21tYW5kIGFsbG93cyB5b3UgdG8gdGFrZSBhIGJhY2t1cCBvZiB0aGUgZGF0YSBzdG9yZWQgd2l0aCBhbiBBU1RFUklYIGluc3RhbmNlLiBUaGUgYmFja3VwIGNhbiBiZSB0YWtlbiBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb3Igb24gYW4gSERGUyBpbnN0YW5jZS4gSW4gZWl0aGVyIGNhc2UsIHRoZSBzbmFwc2hvdHMgYXJlIHN0b3JlZCB1bmRlciBhIGJhY2t1cCBkaXJlY3RvcnkuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYmFja3VwIGRpcmVjdG9yeSBoYXMgYXBwcm9wcmlhdGUgcmVhZC93cml0ZSBwZXJtaXNzaW9ucy4gQ29uZmlndXJpbmcgc2V0dGluZ3MgZm9yIGJhY2t1cCBjYW4gYmUgZm91bmQgaW5zaWRlIHRoZSBNYW5hZ2l4J3MgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0ZWQgYXQgYCRNQU5BR0lYX0hPTUUvY29uZi9tYW5hZ2l4LWNvbmYueG1sYC4KKworKkNvbmZpZ3VyaW5nIGJhY2t1cCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0qCisKK1dlIG5lZWQgdG8gcHJvdmlkZSBwYXRoIHRvIGEgYmFja3VwIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uIFRoZSBiYWNrdXAgZGlyZWN0b3J5IGNhbiBiZSBjb25maWd1cmVkIGJlIGVkaXRpbmcgdGhlIE1hbmFnaXggY29uZmlndXJhdGlvbiBYTUwsIGZvdW5kIGF0IGAkTUFOQUdJWF9IT01FL2NvbmYvbWFuYWdpeC1jb25mLnhtbGAuCisKKworICAgICAgICA8YmFja3VwPgorICAgICAgICAgIDxiYWNrdXBEaXI+UHJvdmlkZSBwYXRoIHRvIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGhlcmU8L2JhY2t1cERpcj4KKyAgICAgICAgPC9iYWNrdXA+CisKK1ByaW9yIHRvIHRha2luZyBhIGJhY2t1cCBvZiBhbiBBU1RFUklYIGluc3RhbmNlLCBpdCBpcyByZXF1aXJlZCBmb3IgdGhlIGluc3RhbmNlIHRvIGJlIGluIHRoZSBJTkFDVElWRSBzdGF0ZS4gV2UgZG8gc28gYnkgdXNpbmcgdGhlIGBzdG9wYCBjb21tYW5kLCBhcyBzaG93biBiZWxvdzoKKworCisgICAgICAgICQgbWFuYWdpeCBzdG9wIC1uIG15X2FzdGVyaXgKKyAgICAgICAgICBJTkZPOiBTdG9wcGVkIEFzdGVyaXggaW5zdGFuY2U6IG15X2FzdGVyaXgKKworV2UgY2FuIG5vdyB0YWtlIHRoZSBiYWNrdXAgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmc6CisKKworICAgICAgICAkIG1hbmFnaXggYmFja3VwIC1uIG15X2FzdGVyaXgKKyAgICAgICAgICBJTkZPOiBteV9hc3Rlcml4IGJhY2tlZCB1cCAwX0ZyaSBNYXIgMDggMTY6MTY6MzQgUFNUIDIwMTMgKExPQ0FMKQorCisKKypDb25maWd1cmluZyBiYWNrdXAgb24gYW4gSERGUyBpbnN0YW5jZSoKKworVG8gY29uZmlndXJlIGEgYmFja3VwcyB0byBiZSB0YWtlbiBvbiBhbiBIREZTIGluc3RhbmNlLCB3ZSBuZWVkIHRvIHByb3ZpZGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJ1bm5pbmcgSERGUyBpbnN0YW5jZS4gIFRoaXMgaW5mb3JtYXRpb24gaW5jbHVkZXMgdGhlIEhERlMgdmVyc2lvbiBhbmQgdGhlIEhERlMgdXJsLiAgU2ltcGx5IGVkaXQgdGhlIE1hbmFnaXggY29uZmlndXJhdGlvbiBmaWxlIGFuZCBwcm92aWRlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KKworCisgICAgICAgIDxiYWNrdXA+CisgICAgICAgICAgIDxiYWNrdXBEaXI+UHJvdmlkZSBwYXRoIHRvIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGhlcmU8L2JhY2t1cERpcj4KKyAgICAgICAgICAgPGhkZnM+CisgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjIwLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICA8dXJsPjwvdXJsPgorICAgICAgICAgICA8L2hkZnM+CisgICAgICAgIDwvYmFja3VwPgorCitBIHNhbXBsZSBvdXRwdXQgd2hlbiBhIGJhY2t1cCBpcyB0YWtlbiBvbiBhbiBIREZTIGlzIHNob3duIGJlbG93OgorCisKKyAgICAgICAgJCBtYW5hZ2l4IGJhY2t1cCAtbiBteV9hc3Rlcml4CisgICAgICAgICAgSU5GTzogbXlfYXN0ZXJpeCBiYWNrZWQgdXAgMV9GcmkgTWFyIDA4IDE3OjEwOjM4IFBTVCAyMDEzIChIREZTKQorCisKK0VhY2ggdGltZSB3ZSB0YWtlIGEgYmFja3VwLCAgd2UgYXJlIHByb3ZpZGVkIHdpdGggYSB1bmlxdWUgaWQgIChhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB2YWx1ZSBzdGFydGluZyB3aXRoIDApLiAgVGhpcyBpZCBpcyByZXF1aXJlZCB3aGVuIHdlIG5lZWQgdG8gcmVzdG9yZSBmcm9tIGEgcHJldmlvdXNseSB0YWtlbiBiYWNrdXAuIEluZm9ybWF0aW9uIGFib3V0IGFsbCBhdmFpbGFibGUgYmFja3VwIHNuYXBzaG90cyBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIGBkZXNjcmliZWAgY29tbWFuZCBpbiB0aGUgYWRtaW4gbW9kZSwgYXMgc2hvd24gYmVsb3c6CisKKworICAgICAgICAgJCBtYW5hZ2l4IGRlc2NyaWJlIC1uIG15X2FzdGVyaXggLWFkbWluCisgICAgICAgICBJTkZPOiBOYW1lOm15X2FzdGVyaXgKKyAgICAgICAgIENyZWF0ZWQ6RnJpIE1hciAwOCAxNToxMToxMiBQU1QgMjAxMworICAgICAgICAgV2ViLVVybDpodHRwOi8vMTI3LjAuMC4xOjE5MDAxCisgICAgICAgICBTdGF0ZTpJTkFDVElWRSAoRnJpIE1hciAwOCAxNjoxNDoyMCBQU1QgMjAxMykKKyAgICAgICAgIE1hc3RlciBub2RlOm1hc3RlcjoxMjcuMC4wLjEKKyAgICAgICAgIG5vZGUxOjEyNy4wLjAuMQorICAgICAgICAKKyAgICAgICAgIEJhY2t1cDowIGNyZWF0ZWQgYXQgRnJpIE1hciAwOCAxNjoxNjozNCBQU1QgMjAxMyAoTE9DQUwpCisgICAgICAgICBCYWNrdXA6MSBjcmVhdGVkIGF0IEZyaSBNYXIgMDggMTc6MTA6MzggUFNUIDIwMTMgKEhERlMpCisgICAgICAgIAorICAgICAgICAgQXN0ZXJpeCB2ZXJzaW9uOjAuMC41CisgICAgICAgICBBc3Rlcml4IENvbmZpZ3VyYXRpb24KKyAgICAgICAgIE1ldGFkYXRhIE5vZGU6bm9kZTEKKyAgICAgICAgIFByb2Nlc3NlcworCisKK1RoZSBhYm92ZSBvdXRwdXQgc2hvd3MgdGhlIGF2YWlsYWJsZSBiYWNrdXAgaWRlbnRpZmllZCBieSBpdCdzIGlkICgwKS4gV2Ugc2hhbGwgbmV4dCBkZXNjcmliZSB0aGUgbWV0aG9kIGZvciByZXN0b3JpbmcgYW4gQVNURVJJWCBpbnN0YW5jZSBmcm9tIGEgYmFja3VwIHNuYXBzaG90LgorCisjIyMjIyBSZXN0b3JlIENvbW1hbmQgIyMjIyMKKworVGhlIGByZXN0b3JlYCBjb21tYW5kIGFsbG93cyB5b3UgdG8gcmVzdG9yZSBhbiBBU1RFUklYIGluc3RhbmNlJ3MgZGF0YSBmcm9tIGEgcHJldmlvdXNseSB0YWtlbiBiYWNrdXAuIFRoZSB1c2FnZSBkZXNjcmlwdGlvbiBjYW4gYmUgb2J0YWluZWQgYXMgZm9sbG93czoKKworCisgICAgICAgICAgJCBtYW5hZ2l4IGhlbHAgLWNtZCByZXN0b3JlCisgICAgICAgIAorICAgICAgICAgIFJlc3RvcmVzIGFuIEFTVEVSSVggaW5zdGFuY2UncyBkYXRhIGZyb20gYSBwcmV2aW91c2x5IHRha2VuIGJhY2t1cC4KKyAgICAgICAgICBBdmFpbGFibGUgYXJndW1lbnRzL29wdGlvbnMKKyAgICAgICAgCisgICAgICAgICAgLW4gbmFtZSBvZiB0aGUgQVNURVJJWCBpbnN0YW5jZQorICAgICAgICAgIC1iIGlkIG9mIHRoZSBiYWNrdXAgc25hcHNob3QKKworCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgcmVzdG9yZXMgb3VyIEFTVEVSSVggaW5zdGFuY2UgZnJvbSB0aGUgYmFja3VwIHNuYXBzaG90IGlkZW50aWZpZWQgYnkgdGhlIGlkICgwKS4gUHJpb3IgdG8gcmVzdG9yaW5nIGFuIGluc3RhbmNlIGZyb20gYSBiYWNrdXAsIGl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIGluc3RhbmNlIGlzIGluIHRoZSBJTkFDVElWRSBzdGF0ZS4KKworCisgICAgICAgICAkIG1hbmFnaXggcmVzdG9yZSAtbiBteV9hc3Rlcml4IC1iIDAKKyAgICAgICAgIElORk86IEFzdGVyaXggaW5zdGFuY2U6IG15X2FzdGVyaXggaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBiYWNrdXAKKworWW91IGNhbiBzdGFydCB0aGUgQVNURVJJWCBpbnN0YW5jZSBieSB1c2luZyB0aGUgc3RhcnQgY29tbWFuZC4KKworIyMjIyMgRGVsZXRlIENvbW1hbmQgIyMjIyMKK0FzIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGUgYGRlbGV0ZWAgY29tbWFuZCBwZXJtYW5lbnRseSByZW1vdmVzIGFuIEFTVEVSSVggaW5zdGFuY2UgYnkgY2xlYW5pbmcgdXAgYWxsIGFzc29jaWF0ZWQgZGF0YS9hcnRpZmFjdHMuIFRoZSB1c2FnZSBjYW4gYmUgbG9va2VkIHVwIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nOgorCisKKyAgICAgICAgICAkIG1hbmFnaXggaGVscCAtY21kIGRlbGV0ZQorICAgICAgICAgIFBlcm1hbmVudGx5IGRlbGV0ZXMgYW4gQVNURVJJWCBpbnN0YW5jZS4gVGhlIGluc3RhbmNlIG11c3QgYmUgaW4gdGhlIElOQUNUSVZFIHN0YXRlLgorICAgICAgICAKKyAgICAgICAgICBBdmFpbGFibGUgYXJndW1lbnRzL29wdGlvbnMKKyAgICAgICAgICAtbiBuYW1lIG9mIHRoZSBBU1RFUklYIGluc3RhbmNlLgorCisKKyAgICAgICAgICAkIG1hbmFnaXggZGVsZXRlIC1uIG15X2FzdGVyaXgKKyAgICAgICAgICAgSU5GTzogQXN0ZXJpeCBpbnN0YW5jZSBteV9hc3Rlcml4IGRlbGV0ZWQuCisKKworIyMjIyMgU2h1dGRvd24gQ29tbWFuZCAjIyMjIworTWFuYWdpeCB1c2VzIFpvb2tlZXBlciBzZXJ2aWNlIGZvciBzdG9yaW5nIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGVkIEFTVEVSSVggaW5zdGFuY2VzLiBUaGUgWm9va2VlcGVyIHNlcnZpY2UgcnVucyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgY2FuIGJlIHNodXQgZG93biB1c2luZyB0aGUgYHNodXRkb3duYCBjb21tYW5kLgorCisKKyAgICAgICAgICAkIG1hbmFnaXggc2h1dGRvd24KKworCisjIyMjIyBIZWxwIENvbW1hbmQgIyMjIyMKK1RoZSBgaGVscGAgY29tbWFuZCBwcm92aWRlcyBhIHVzYWdlIGRlc2NyaXB0aW9uIG9mIGEgTWFuYWdpeCBjb21tYW5kLgorCisKKyAgICAgICAgJCBtYW5hZ2l4IGhlbHAgLWNtZCA8Y29tbWFuZCBuYW1lPgorCitBcyBhbiBleGFtcGxlLCBmb3IgbG9va2luZyB1cCB0aGUgaGVscCBmb3IgdGhlIGBjb25maWd1cmVgIGNvbW1hbmQsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZworCisKKyAgICAgICAgJCBtYW5hZ2l4IGhlbHAgLWNtZCBjb25maWd1cmUKKyAgICAgICAgCisgICAgICAgIEF1dG8tZ2VuZXJhdGVzIHRoZSBBU1RFUklYIGluc3RhbGxlciBjb25maWdydWF0aW9uIHNldHRpbmdzIGFuZCBBU1RFUklYIGNsdXN0ZXIKKyAgICAgICAgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYSBzaW5nbGUgbm9kZSBzZXR1cC4KKworCisjIyBTZWN0aW9uIDU6IEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zICMjCisKKworKlF1ZXN0aW9uKgorV2hhdCBpcyBtZWFudCBieSB0aGUgIlVOVVNBQkxFIiBzdGF0ZSBpbiB0aGUgbGlmZWN5Y2xlIG9mICBhbiBBU1RFUklYIGluc3RhbmNlID8KKworCisqQW5zd2VyKgorV2hlbiBNYW5hZ2l4IGZhaWxzIHRvIHN0YXJ0IGEgcmVxdWlyZWQgcHJvY2VzcyAoQ0MvTkMpLCB0aGUgaW5zdGFuY2UgdHJhbnNpdHMgdG8gYW4gVU5VU0FCTEUgc3RhdGUuCitUaGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBuZWVkcyB0byBiZSBsb29rZWQgdXAgaW4gdGhlIGxvZ3MuCitCZWZvcmUgd2UgYXR0ZW1wdCB0byBzdGFydCB0aGUgaW5zdGFuY2UgYWdhaW4sIGFueSBwcm9jZXNzZXMgdGhhdCBnb3QgbGF1bmNoZWQKK2FzIHBhcnQgb2YgZmFpbGVkIGF0dGVtcHQgbXVzdCBiZSBzdG9wcGVkLiBObyBvdGhlciBvcGVyYXRpb24gZXhjZXB0ICJzdG9wIiBpcyBzdXBwb3J0ZWQgaW4gdGhlIFVOVVNBQkxFIHN0YXRlLgorCitHZXQgcmlkIG9mIHRoZSBzdGFydGVkIHByb2Nlc3NlczotCisKKyAgICAgICAgJE1BTkFHSVhfSE9NRS9iaW4vbWFuYWdpeCBzdG9wIC1uIG15X2FzdGVyaXgKKworCitBbnkgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGFuY2UgYXJlIGtpbGxlZCBhbmQgdGhlIGluc3RhbmNlIG1vdmVzIHRvIHRoZSBJTkFDVElWRSBzdGF0ZS4KK1lvdSBtYXkgbm93IGRlbGV0ZSB0aGUgaW5zdGFuY2UgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcKKworCisgICAgICAgICRNQU5BR0lYX0hPTUUvYmluL21hbmFnaXggZGVsZXRlIC1uIDxuYW1lIG9mIHlvdXIgQVNURVJJWCBpbnN0YW5jZT4KKworCitOb3RlIHRoYXQgYWJvdmUgd291bGQgcmVtb3ZlIGFsbCB0cmFjZXMgb2YgdGhlIGluc3RhbmNlIGluY2x1ZGluZyB0aGUgbG9ncyBhbmQgdGh1cyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbGVkIGF0dGVtcHQuCisKK09SCisKK21ha2UgYSBzdWJzZXF1ZW50IGF0dGVtcHQgdG8gc3RhcnQgdGhlIGluc3RhbmNlIGlmIHlvdSByZWFsaXplZCBhIG1pc3Rha2UgaW4gdGhlIGNsdXN0ZXIgY29uZmlndXJhdGlvbiBYTUwgYW5kIGhhdmUgY29ycmVjdGVkIGl0LiBUbyBzdGFydCB0aGUgaW5zdGFuY2UsIHdlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZy4KKworCisgICAgICAgICRNQU5BR0lYX0hPTUUvYmluL21hbmFnaXggc3RhcnQgLW4gPG5hbWUgb2YgeW91ciBBU1RFUklYIGluc3RhbmNlPgorCg==