ZGlmZiAtLWdpdCBhL3Rlc3RzL0FuZHJvaWQubWsgYi90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTdhOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBzaGFyZWQKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCisjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IExhdGluSU1FVGVzdHMKKworTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBMYXRpbklNRQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4udGVzdHMiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPCEtLSBtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5jb250YWN0cy5pY29uc2V0IiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2ljb25zZXQiIC8tLT4KKyAgICAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbiIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF0aW5JTUUgdGVzdHMiPgorICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvd29yZGxpc3QueG1sIGIvdGVzdHMvZGF0YS93b3JkbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMGNhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvd29yZGxpc3QueG1sCkBAIC0wLDAgKzEsMjQzIEBACis8d29yZGxpc3Q+CisgPHcgZj0iMjU1Ij50aGU8L3c+CisgPHcgZj0iMjQ2Ij5hbmQ8L3c+CisgPHcgZj0iMjQ1Ij5vZjwvdz4KKyA8dyBmPSIyNDIiPnRvPC93PgorIDx3IGY9IjIzMSI+aW48L3c+CisgPHcgZj0iMjMwIj50aGF0PC93PgorIDx3IGY9IjIyOSI+Zm9yPC93PgorIDx3IGY9IjIyNCI+d2l0aDwvdz4KKyA8dyBmPSIyMjQiPm9uPC93PgorIDx3IGY9IjIyNCI+aXQ8L3c+CisgPHcgZj0iMjIzIj50aGlzPC93PgorIDx3IGY9IjIyMiI+eW91PC93PgorIDx3IGY9IjIxOSI+aXM8L3c+CisgPHcgZj0iMjE5Ij53YXM8L3c+CisgPHcgZj0iMjE5Ij5ieTwvdz4KKyA8dyBmPSIyMTkiPm9yPC93PgorIDx3IGY9IjIxOCI+ZnJvbTwvdz4KKyA8dyBmPSIyMTciPmJ1dDwvdz4KKyA8dyBmPSIyMTYiPmJlPC93PgorIDx3IGY9IjIxNiI+U3VuZGF5PC93PgorIDx3IGY9IjIxNSI+YXJlPC93PgorIDx3IGY9IjIxNSI+aGU8L3c+CisgPHcgZj0iMjE0Ij5zbzwvdz4KKyA8dyBmPSIyMTQiPm5vdDwvdz4KKyA8dyBmPSIyMTMiPmhhdmU8L3c+CisgPHcgZj0iMjEzIj5hczwvdz4KKyA8dyBmPSIyMTEiPmFsbDwvdz4KKyA8dyBmPSIyMTEiPmhpczwvdz4KKyA8dyBmPSIyMTAiPm15PC93PgorIDx3IGY9IjIxMCI+aWY8L3c+CisgPHcgZj0iMjEwIj53aGljaDwvdz4KKyA8dyBmPSIyMTAiPnRoZXk8L3c+CisgPHcgZj0iMjA5Ij5hdDwvdz4KKyA8dyBmPSIyMDciPml0J3M8L3c+CisgPHcgZj0iMjA3Ij5hbjwvdz4KKyA8dyBmPSIyMDciPnlvdXI8L3c+CisgPHcgZj0iMjA2Ij53aWxsPC93PgorIDx3IGY9IjIwNiI+YWJvdXQ8L3c+CisgPHcgZj0iMjA2Ij5JJ208L3c+CisgPHcgZj0iMjA1Ij50aGVyZTwvdz4KKyA8dyBmPSIyMDUiPmhhZDwvdz4KKyA8dyBmPSIyMDUiPmhhczwvdz4KKyA8dyBmPSIyMDQiPndoZW48L3c+CisgPHcgZj0iMjAzIj5ubzwvdz4KKyA8dyBmPSIyMDMiPndlcmU8L3c+CisgPHcgZj0iMjAzIj53aGF0PC93PgorIDx3IGY9IjIwMyI+bW9yZTwvdz4KKyA8dyBmPSIyMDMiPm91dDwvdz4KKyA8dyBmPSIyMDMiPmp1c3Q8L3c+CisgPHcgZj0iMjAyIj50aGVpcjwvdz4KKyA8dyBmPSIyMDIiPnVwPC93PgorIDx3IGY9IjIwMiI+d291bGQ8L3c+CisgPHcgZj0iMjAyIj5oZXJlPC93PgorIDx3IGY9IjIwMiI+Y2FuPC93PgorIDx3IGY9IjIwMSI+d2hvPC93PgorIDx3IGY9IjIwMCI+aGVyPC93PgorIDx3IGY9IjIwMCI+bWU8L3c+CisgPHcgZj0iMjAwIj5ub3c8L3c+CisgPHcgZj0iMjAwIj5vdXI8L3c+CisgPHcgZj0iMjAwIj5kbzwvdz4KKyA8dyBmPSIyMDAiPnNvbWU8L3c+CisgPHcgZj0iMTk5Ij5iZWVuPC93PgorIDx3IGY9IjE5OSI+dHdvPC93PgorIDx3IGY9IjE5OSI+bGlrZTwvdz4KKyA8dyBmPSIxOTkiPnRoZW08L3c+CisgPHcgZj0iMTk5Ij5uZXc8L3c+CisgPHcgZj0iMTk4Ij50aW1lPC93PgorIDx3IGY9IjE5OCI+d2U8L3c+CisgPHcgZj0iMTk4Ij5zaGU8L3c+CisgPHcgZj0iMTk3Ij5vbmU8L3c+CisgPHcgZj0iMTk3Ij5vdmVyPC93PgorIDx3IGY9IjE5NyI+bWF5PC93PgorIDx3IGY9IjE5NyI+YW55PC93PgorIDx3IGY9IjE5NyI+aGltPC93PgorIDx3IGY9IjE5NyI+Y2FsbGluZzwvdz4KKyA8dyBmPSIxOTYiPm90aGVyPC93PgorIDx3IGY9IjE5NiI+aG93PC93PgorIDx3IGY9IjE5NiI+c2VlPC93PgorIDx3IGY9IjE5NSI+YmVjYXVzZTwvdz4KKyA8dyBmPSIxOTUiPnRoZW48L3c+CisgPHcgZj0iMTk1Ij5yaWdodDwvdz4KKyA8dyBmPSIxOTUiPmludG88L3c+CisgPHcgZj0iMTk1Ij53ZWxsPC93PgorIDx3IGY9IjE5NSI+dmVyeTwvdz4KKyA8dyBmPSIxOTUiPnNhaWQ8L3c+CisgPHcgZj0iMTk1Ij5wZW9wbGU8L3c+CisgPHcgZj0iMTk0Ij50aGVzZTwvdz4KKyA8dyBmPSIxOTQiPnRoYW48L3c+CisgPHcgZj0iMTkzIj5vbmx5PC93PgorIDx3IGY9IjE5MyI+YmFjazwvdz4KKyA8dyBmPSIxOTMiPmZpcnN0PC93PgorIDx3IGY9IjE5MyI+ZG90PC93PgorIDx3IGY9IjE5MyI+YWZ0ZXI8L3c+CisgPHcgZj0iMTkzIj53aGVyZTwvdz4KKyA8dyBmPSIxOTIiPnBsZWFzZTwvdz4KKyA8dyBmPSIxOTIiPmNvdWxkPC93PgorIDx3IGY9IjE5MiI+aXRzPC93PgorIDx3IGY9IjE5MiI+YmVmb3JlPC93PgorIDx3IGY9IjE5MiI+dXM8L3c+CisgPHcgZj0iMTkyIj5hZ2Fpbjwvdz4KKyA8dyBmPSIxOTIiPmhvbWU8L3c+CisgPHcgZj0iMTkxIj5hbHNvPC93PgorIDx3IGY9IjE5MSI+dGhhdCdzPC93PgorIDx3IGY9IjE5MSI+dGhpbms8L3c+CisgPHcgZj0iMTkxIj50aHJlZTwvdz4KKyA8dyBmPSIxOTEiPmdvb2Q8L3c+CisgPHcgZj0iMTkxIj5nZXQ8L3c+CisgPHcgZj0iMTkwIj5rbm93PC93PgorIDx3IGY9IjE5MCI+dGhhbms8L3c+CisgPHcgZj0iMTkwIj5zaG91bGQ8L3c+CisgPHcgZj0iMTkwIj5nb2luZzwvdz4KKyA8dyBmPSIxOTAiPmRvd248L3c+CisgPHcgZj0iMTg5Ij5sYXN0PC93PgorIDx3IGY9IjE4OSI+dG9kYXk8L3c+CisgPHcgZj0iMTg5Ij50aG9zZTwvdz4KKyA8dyBmPSIxODkiPmdvPC93PgorIDx3IGY9IjE4OSI+dGhyb3VnaDwvdz4KKyA8dyBmPSIxODkiPnN1Y2g8L3c+CisgPHcgZj0iMTg5Ij5kb24ndDwvdz4KKyA8dyBmPSIxODkiPmRpZDwvdz4KKyA8dyBmPSIxODgiPm1vc3Q8L3c+CisgPHcgZj0iMTg4Ij5kYXk8L3c+CisgPHcgZj0iMTg4Ij5tYW48L3c+CisgPHcgZj0iMTg4Ij5udW1iZXI8L3c+CisgPHcgZj0iMTg4Ij53b3JrPC93PgorIDx3IGY9IjE4NyI+dG9vPC93PgorIDx3IGY9IjE4NyI+c2hvdzwvdz4KKyA8dyBmPSIxODciPm1hZGU8L3c+CisgPHcgZj0iMTg3Ij5ldmVuPC93PgorIDx3IGY9IjE4NyI+YmVpbmc8L3c+CisgPHcgZj0iMTg3Ij5tYWtlPC93PgorIDx3IGY9IjE4NyI+Z2l2ZTwvdz4KKyA8dyBmPSIxODYiPm9mZjwvdz4KKyA8dyBmPSIxODYiPmNvbTwvdz4KKyA8dyBmPSIxODYiPm11Y2g8L3c+CisgPHcgZj0iMTg2Ij5ncmVhdDwvdz4KKyA8dyBmPSIxODYiPnRha2U8L3c+CisgPHcgZj0iMTg2Ij5jYWxsPC93PgorIDx3IGY9IjE4NiI+d2F5PC93PgorIDx3IGY9IjE4NiI+Zm91cjwvdz4KKyA8dyBmPSIxODYiPnNheTwvdz4KKyA8dyBmPSIxODUiPmluZm9ybWF0aW9uPC93PgorIDx3IGY9IjE4NSI+dW5kZXI8L3c+CisgPHcgZj0iMTg1Ij5wYWdlPC93PgorIDx3IGY9IjE4NSI+bWFueTwvdz4KKyA8dyBmPSIxODUiPmxpdHRsZTwvdz4KKyA8dyBmPSIxODUiPnRoYW5rczwvdz4KKyA8dyBmPSIxODUiPm9rYXk8L3c+CisgPHcgZj0iMTg1Ij5maXZlPC93PgorIDx3IGY9IjE4NSI+d2UncmU8L3c+CisgPHcgZj0iMTg1Ij5iZXR3ZWVuPC93PgorIDx3IGY9IjE4NCI+dXNlPC93PgorIDx3IGY9IjE4NCI+Y29tZTwvdz4KKyA8dyBmPSIxODQiPnllYXJzPC93PgorIDx3IGY9IjE4NCI+b2ZmaWNlPC93PgorIDx3IGY9IjE4NCI+aG91c2U8L3c+CisgPHcgZj0iMTg0Ij5zZWFyY2g8L3c+CisgPHcgZj0iMTg0Ij5mcmVlPC93PgorIDx3IGY9IjE4MyI+bmV4dDwvdz4KKyA8dyBmPSIxODMiPndpdGhvdXQ8L3c+CisgPHcgZj0iMTgzIj5zdGlsbDwvdz4KKyA8dyBmPSIxODMiPmFyb3VuZDwvdz4KKyA8dyBmPSIxODMiPkkndmU8L3c+CisgPHcgZj0iMTgzIj5idXNpbmVzczwvdz4KKyA8dyBmPSIxODMiPnBhcnQ8L3c+CisgPHcgZj0iMTgzIj5ldmVyeTwvdz4KKyA8dyBmPSIxODMiPmJ5ZTwvdz4KKyA8dyBmPSIxODMiPnVwb248L3c+CisgPHcgZj0iMTgzIj55b3UncmU8L3c+CisgPHcgZj0iMTgzIj5zdGF0ZTwvdz4KKyA8dyBmPSIxODMiPmxpZmU8L3c+CisgPHcgZj0iMTgzIj55ZWFyPC93PgorIDx3IGY9IjE4MiI+dGhpbmc8L3c+CisgPHcgZj0iMTgyIj5zaW5jZTwvdz4KKyA8dyBmPSIxODIiPnRoaW5nczwvdz4KKyA8dyBmPSIxODIiPnNvbWV0aGluZzwvdz4KKyA8dyBmPSIxODIiPmxvbmc8L3c+CisgPHcgZj0iMTgyIj5nb3Q8L3c+CisgPHcgZj0iMTgyIj53aGlsZTwvdz4KKyA8dyBmPSIxODIiPkknbGw8L3c+CisgPHcgZj0iMTgyIj5oZWxwPC93PgorIDx3IGY9IjE4MiI+c2VydmljZTwvdz4KKyA8dyBmPSIxODIiPnJlYWxseTwvdz4KKyA8dyBmPSIxODIiPm11c3Q8L3c+CisgPHcgZj0iMTgyIj5kb2VzPC93PgorIDx3IGY9IjE4MiI+bmFtZTwvdz4KKyA8dyBmPSIxODEiPmJvdGg8L3c+CisgPHcgZj0iMTgxIj5zaXg8L3c+CisgPHcgZj0iMTgxIj53YW50PC93PgorIDx3IGY9IjE4MSI+c2FtZTwvdz4KKyA8dyBmPSIxODEiPmVhY2g8L3c+CisgPHcgZj0iMTgxIj55ZXQ8L3c+CisgPHcgZj0iMTgxIj5sZXQ8L3c+CisgPHcgZj0iMTgxIj52aWV3PC93PgorIDx3IGY9IjE4MSI+cGxhY2U8L3c+CisgPHcgZj0iMTgxIj5hbm90aGVyPC93PgorIDx3IGY9IjE4MSI+Y29tcGFueTwvdz4KKyA8dyBmPSIxODEiPnRhbGs8L3c+CisgPHcgZj0iMTgxIj5taWdodDwvdz4KKyA8dyBmPSIxODEiPmFtPC93PgorIDx3IGY9IjE4MSI+dGhvdWdoPC93PgorIDx3IGY9IjE4MSI+ZmluZDwvdz4KKyA8dyBmPSIxODAiPmRldGFpbHM8L3c+CisgPHcgZj0iMTgwIj5sb29rPC93PgorIDx3IGY9IjE4MCI+d29ybGQ8L3c+CisgPHcgZj0iMTgwIj5vbGQ8L3c+CisgPHcgZj0iMTgwIj5jYWxsZWQ8L3c+CisgPHcgZj0iMTgwIj5jYXNlPC93PgorIDx3IGY9IjE4MCI+c3lzdGVtPC93PgorIDx3IGY9IjE4MCI+bmV3czwvdz4KKyA8dyBmPSIxNzkiPnVzZWQ8L3c+CisgPHcgZj0iMTc5Ij5jb250YWN0PC93PgorIDx3IGY9IjE3OSI+bmV2ZXI8L3c+CisgPHcgZj0iMTc5Ij5zZXZlbjwvdz4KKyA8dyBmPSIxNzkiPmNpdHk8L3c+CisgPHcgZj0iMTc5Ij51bnRpbDwvdz4KKyA8dyBmPSIxNzkiPmR1cmluZzwvdz4KKyA8dyBmPSIxNzkiPnNldDwvdz4KKyA8dyBmPSIxNzkiPndoeTwvdz4KKyA8dyBmPSIxNzkiPnBvaW50PC93PgorIDx3IGY9IjE3OSI+dHdlbnR5PC93PgorIDx3IGY9IjE3OSI+aGlnaDwvdz4KKyA8dyBmPSIxNzkiPmxvdmU8L3c+CisgPHcgZj0iMTc5Ij5zZXJ2aWNlczwvdz4KKyA8dyBmPSIxNzAiPm5pw7FvPC93PgorIDx3IGY9IjE3MCI+TWFyw61hPC93PgorIDx3IGY9IjAiPmhtbW08L3c+CisgPHcgZj0iMCI+aG9uPC93PgorIDx3IGY9IjAiPnR0eTwvdz4KKyA8dyBmPSIwIj50dHlsPC93PgorIDx3IGY9IjAiPnR4dDwvdz4KKyA8dyBmPSIwIj51cjwvdz4KKyA8dyBmPSIwIj53YWg8L3c+CisgPHcgZj0iMCI+d2hhdGNoYTwvdz4KKyA8dyBmPSIwIj53b2FoPC93PgorIDx3IGY9IjAiPnlhPC93PgorIDx3IGY9IjAiPnllYTwvdz4KKyA8dyBmPSIwIj55ZWg8L3c+CisgPHcgZj0iMCI+eWVzc2lyPC93PgorIDx3IGY9IjAiPnlpa2VzPC93PgorIDx3IGY9IjAiPnlyczwvdz4KKzwvd29yZGxpc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9yZXMvcmF3L3Rlc3QuZGljdCBiL3Rlc3RzL3Jlcy9yYXcvdGVzdC5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODlhYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZXMvcmF3L3Rlc3QuZGljdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vdGVzdHMvU3VnZ2VzdFRlc3RzLmphdmEgYi90ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vdGVzdHMvU3VnZ2VzdFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi90ZXN0cy9TdWdnZXN0VGVzdHMuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi50ZXN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3VnZ2VzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5Xb3JkQ29tcG9zZXI7CisKK3B1YmxpYyBjbGFzcyBTdWdnZXN0VGVzdHMgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VnZ2VzdFRlc3RzIjsKKworICAgIHByaXZhdGUgU3VnZ2VzdCBtU3VnZ2VzdDsKKworICAgIGludFtdW10gYWRqYWNlbnRzID0geworICAgICAgICB7J2EnLCdzJywndycsJ3EnLC0xfSwKKyAgICAgICAgeydiJywnaCcsJ3YnLCduJywnZycsJ2onLC0xfSwKKyAgICAgICAgeydjJywndicsJ2YnLCd4JywnZycsfSwKKyAgICAgICAgeydkJywnZicsJ3InLCdlJywncycsJ3gnLC0xfSwKKyAgICAgICAgeydlJywndycsJ3InLCdzJywnZCcsLTF9LAorICAgICAgICB7J2YnLCdnJywnZCcsJ2MnLCd0JywncicsLTF9LAorICAgICAgICB7J2cnLCdoJywnZicsJ3knLCd0JywndicsLTF9LAorICAgICAgICB7J2gnLCdqJywndScsJ2cnLCdiJywneScsLTF9LAorICAgICAgICB7J2knLCdvJywndScsJ2snLC0xfSwKKyAgICAgICAgeydqJywnaycsJ2knLCdoJywndScsJ24nLC0xfSwKKyAgICAgICAgeydrJywnbCcsJ28nLCdqJywnaScsJ20nLC0xfSwKKyAgICAgICAgeydsJywnaycsJ28nLCdwJywtMX0sCisgICAgICAgIHsnbScsJ2snLCduJywnbCcsLTF9LAorICAgICAgICB7J24nLCdtJywnaicsJ2snLCdiJywtMX0sCisgICAgICAgIHsnbycsJ3AnLCdpJywnbCcsLTF9LAorICAgICAgICB7J3AnLCdvJywtMX0sCisgICAgICAgIHsncScsJ3cnLC0xfSwKKyAgICAgICAgeydyJywndCcsJ2UnLCdmJywtMX0sCisgICAgICAgIHsncycsJ2QnLCdlJywndycsJ2EnLCd6JywtMX0sCisgICAgICAgIHsndCcsJ3knLCdyJywtMX0sCisgICAgICAgIHsndScsJ3knLCdpJywnaCcsJ2onLC0xfSwKKyAgICAgICAgeyd2JywnYicsJ2cnLCdjJywnaCcsLTF9LAorICAgICAgICB7J3cnLCdlJywncScsLTF9LAorICAgICAgICB7J3gnLCdjJywnZCcsJ3onLCdmJywtMX0sCisgICAgICAgIHsneScsJ3UnLCd0JywnaCcsJ2cnLC0xfSwKKyAgICAgICAgeyd6JywncycsJ3gnLCdhJywnZCcsLTF9LAorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShSLnJhdy50ZXN0KTsKKyAgICAgICAgTG9nLmkoVEFHLCAiU3RyZWFtIHR5cGUgaXMgIiArIGlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBhdmFpbCA9IGlzLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoYXZhaWwpLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gQ2hhbm5lbHMubmV3Q2hhbm5lbChpcykucmVhZChieXRlQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ICE9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlYWQgIiArIGdvdCArICIgYnl0ZXMsIGV4cGVjdGVkICIgKyBhdmFpbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1Z2dlc3QgPSBuZXcgU3VnZ2VzdChjb250ZXh0LCBieXRlQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ3JlYXRlZCBtU3VnZ2VzdCAiICsgYXZhaWwgKyAiIGJ5dGVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIk5vIGF2YWlsYWJsZSBzaXplIGZvciBiaW5hcnkgZGljdGlvbmFyeSIpOworICAgICAgICB9CisgICAgICAgIG1TdWdnZXN0LnNldEF1dG9UZXh0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1TdWdnZXN0LnNldENvcnJlY3Rpb25Nb2RlKFN1Z2dlc3QuQ09SUkVDVElPTl9GVUxMKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVscGVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBwcml2YXRlIFdvcmRDb21wb3NlciBjcmVhdGVXb3JkQ29tcG9zZXIoQ2hhclNlcXVlbmNlIHMpIHsKKyAgICAgICAgV29yZENvbXBvc2VyIHdvcmQgPSBuZXcgV29yZENvbXBvc2VyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGludFtdIGNvZGVzOworICAgICAgICAgICAgLy8gSWYgaXQncyBub3QgYSBsb3dlcmNhc2UgbGV0dGVyLCBkb24ndCBmaW5kIGFkamFjZW50IGxldHRlcnMKKyAgICAgICAgICAgIGlmIChjIDwgJ2EnIHx8IGMgPiAneicpIHsKKyAgICAgICAgICAgICAgICBjb2RlcyA9IG5ldyBpbnRbXSB7IGMgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29kZXMgPSBhZGphY2VudHNbYyAtICdhJ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JkLmFkZChjLCBjb2Rlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdvcmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dMaXN0KFN0cmluZyB0aXRsZSwgTGlzdDxDaGFyU2VxdWVuY2U+IHN1Z2dlc3Rpb25zKSB7CisgICAgICAgIExvZy5pKFRBRywgdGl0bGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBMb2cuaSh0aXRsZSwgc3VnZ2VzdGlvbnMuZ2V0KGkpICsgIiwgIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0U3VnZ2VzdGlvbihMaXN0PENoYXJTZXF1ZW5jZT4gc3VnZ2VzdGlvbnMsIENoYXJTZXF1ZW5jZSB3b3JkKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGVpdGhlciB0aGUgd29yZCBpcyB3aGF0IHlvdSB0eXBlZCBvciB0aGUgZmlyc3QgYWx0ZXJuYXRpdmUKKyAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zLnNpemUoKSA+IDAgJiYKKyAgICAgICAgICAgICAgICAoLypUZXh0VXRpbHMuZXF1YWxzKHN1Z2dlc3Rpb25zLmdldCgwKSwgd29yZCkgfHwgKi8KKyAgICAgICAgICAgICAgICAgIChzdWdnZXN0aW9ucy5zaXplKCkgPiAxICYmIFRleHRVdGlscy5lcXVhbHMoc3VnZ2VzdGlvbnMuZ2V0KDEpLCB3b3JkKSkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRTdWdnZXN0aW9uKENoYXJTZXF1ZW5jZSB0eXBlZCwgQ2hhclNlcXVlbmNlIGV4cGVjdGVkKSB7CisgICAgICAgIFdvcmRDb21wb3NlciB3b3JkID0gY3JlYXRlV29yZENvbXBvc2VyKHR5cGVkKTsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IHN1Z2dlc3Rpb25zID0gbVN1Z2dlc3QuZ2V0U3VnZ2VzdGlvbnMobnVsbCwgd29yZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gaXNEZWZhdWx0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucywgZXhwZWN0ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRDb3JyZWN0aW9uKENoYXJTZXF1ZW5jZSB0eXBlZCwgQ2hhclNlcXVlbmNlIGV4cGVjdGVkKSB7CisgICAgICAgIFdvcmRDb21wb3NlciB3b3JkID0gY3JlYXRlV29yZENvbXBvc2VyKHR5cGVkKTsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IHN1Z2dlc3Rpb25zID0gbVN1Z2dlc3QuZ2V0U3VnZ2VzdGlvbnMobnVsbCwgd29yZCwgZmFsc2UpOworICAgICAgICByZXR1cm4gaXNEZWZhdWx0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucywgZXhwZWN0ZWQpICYmIG1TdWdnZXN0Lmhhc01pbmltYWxDb3JyZWN0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQVN1Z2dlc3Rpb24oQ2hhclNlcXVlbmNlIHR5cGVkLCBDaGFyU2VxdWVuY2UgZXhwZWN0ZWQpIHsKKyAgICAgICAgV29yZENvbXBvc2VyIHdvcmQgPSBjcmVhdGVXb3JkQ29tcG9zZXIodHlwZWQpOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gc3VnZ2VzdGlvbnMgPSBtU3VnZ2VzdC5nZXRTdWdnZXN0aW9ucyhudWxsLCB3b3JkLCBmYWxzZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3VnZ2VzdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHN1Z2dlc3Rpb25zLmdldChpKSwgZXhwZWN0ZWQpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoQ2hhclNlcXVlbmNlIHR5cGVkKSB7CisgICAgICAgIHJldHVybiBtU3VnZ2VzdC5pc1ZhbGlkV29yZCh0eXBlZCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRlc3RzICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKgorICAgICAqIFRlc3RzIGZvciBzaW1wbGUgY29tcGxldGlvbnMgb2Ygb25lIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbjFjaGFyKCkgeworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oInBlb3BsIiwgInBlb3BsZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0RlZmF1bHRTdWdnZXN0aW9uKCJhYm91IiwgImFib3V0IikpOworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oInRoZWkiLCAidGhlaXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZm9yIHNpbXBsZSBjb21wbGV0aW9ucyBvZiB0d28gY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbjJjaGFyKCkgeworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oInBlb3AiLCAicGVvcGxlIikpOworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oImNhbGxpIiwgImNhbGxpbmciKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNEZWZhdWx0U3VnZ2VzdGlvbigiYnVzaW5lIiwgImJ1c2luZXNzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGZvciBwcm94aW1pdHkgZXJyb3JzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94aW1pdHlQb3NpdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0RlZmF1bHRTdWdnZXN0aW9uKCJwZWlwbGUiLCAicGVvcGxlIikpOworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oInBlb29sZSIsICJwZW9wbGUiKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNEZWZhdWx0U3VnZ2VzdGlvbigicHdwcGxlIiwgInBlb3BsZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBmb3IgcHJveGltaXR5IGVycm9ycyAtIG5lZ2F0aXZlLCB3aGVuIHRoZSBlcnJvciBrZXkgaXMgbm90IG5lYXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb3hpbWl0eU5lZ2F0aXZlKCkgeworICAgICAgICBhc3NlcnRGYWxzZShpc0RlZmF1bHRTdWdnZXN0aW9uKCJhcm91dCIsICJhYm91dCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNEZWZhdWx0U3VnZ2VzdGlvbigiaXJlIiwgImFyZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBmb3IgY2hlY2tpbmcgaWYgYXBvc3Ryb3BoZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFwb3N0cm9waGVJbnNlcnRpb24oKSB7CisgICAgICAgIGFzc2VydFRydWUoaXNEZWZhdWx0U3VnZ2VzdGlvbigiaW0iLCAiSSdtIikpOworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oImRvbnQiLCAiZG9uJ3QiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBtYWtlIHN1cmUgYXBvc3Ryb3BoZWQgd29yZCBpcyBub3Qgc3VnZ2VzdGVkIGZvciBhbiBhcG9zdHJvcGhlZCB3b3JkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBcG9zdHJvcGhlKCkgeworICAgICAgICBhc3NlcnRGYWxzZShpc0RlZmF1bHRTdWdnZXN0aW9uKCJkb24ndCIsICJkb24ndCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBmb3Igc3VnZ2VzdGlvbiBvZiBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIGEgd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6YXRpb24oKSB7CisgICAgICAgIGFzc2VydFRydWUoaXNEZWZhdWx0U3VnZ2VzdGlvbigiaSdtIiwgIkknbSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0RlZmF1bHRTdWdnZXN0aW9uKCJzdW5kYXkiLCAiU3VuZGF5IikpOworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdFN1Z2dlc3Rpb24oInN1bmRhdCIsICJTdW5kYXkiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gc2VlIGlmIG1vcmUgdGhhbiBvbmUgY29tcGxldGlvbiBpcyBwcm92aWRlZCBmb3IgY2VydGFpbiBwcmVmaXhlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDb21wbGV0aW9ucygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FTdWdnZXN0aW9uKCJjb20iLCAiY29tZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FTdWdnZXN0aW9uKCJjb20iLCAiY29tcGFueSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FTdWdnZXN0aW9uKCJ0aCIsICJ0aGUiKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNBU3VnZ2VzdGlvbigidGgiLCAidGhhdCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0FTdWdnZXN0aW9uKCJ0aCIsICJ0aGlzIikpOworICAgICAgICBhc3NlcnRUcnVlKGlzQVN1Z2dlc3Rpb24oInRoIiwgInRoZXkiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgc3VnZ2VzdGlvbiBlbmdpbmUgcmVjb2duaXplIHplcm8gZnJlcXVlbmN5IHdvcmRzIGFzIHZhbGlkIHdvcmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvRnJlcXVlbmN5QWNjZXB0ZWQoKSB7CisgICAgICAgIGFzc2VydFRydWUoaXNWYWxpZCgieWlrZXMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzVmFsaWQoInlpa2UiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgemVybyBmcmVxdWVuY3kgd29yZHMgYXJlIG5vdCBzdWdnZXN0ZWQgYXMgY29tcGxldGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFplcm9GcmVxdWVuY3lTdWdnZXN0aW9uc05lZ2F0aXZlKCkgeworICAgICAgICBhc3NlcnRGYWxzZShpc0FTdWdnZXN0aW9uKCJ5aWtlIiwgInlpa2VzIikpOworICAgICAgICBhc3NlcnRGYWxzZShpc0FTdWdnZXN0aW9uKCJ3aGF0IiwgIndoYXRjaGEiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gZW5zdXJlIHRoYXQgd29yZHMgd2l0aCBsYXJnZSBlZGl0IGRpc3RhbmNlcyBhcmUgbm90IHN1Z2dlc3RlZCwgaW4gc29tZSBjYXNlcworICAgICAqIGFuZCBub3QgY29uc2lkZXJlZCBjb3JyZWN0aW9ucywgaW4gc29tZSBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9vTGFyZ2VFZGl0RGlzdGFuY2UoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKGlzQVN1Z2dlc3Rpb24oInNuaXlyIiwgImFib3V0IikpOworICAgICAgICBhc3NlcnRGYWxzZShpc0RlZmF1bHRDb3JyZWN0aW9uKCJyanciLCAidGhlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Ugc3VyZSBpc1ZhbGlkIGlzIGNhc2Utc2Vuc2l0aXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGl0eUNhc2VTZW5zaXRpdml0eSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1ZhbGlkKCJTdW5kYXkiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzVmFsaWQoInN1bmRheSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcmUgYWNjZW50ZWQgZm9ybXMgb2Ygd29yZHMgc3VnZ2VzdGVkIGFzIGNvcnJlY3Rpb25zPworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlbnRzKCkgeworICAgICAgICBhc3NlcnRUcnVlKGlzRGVmYXVsdENvcnJlY3Rpb24oIm5pbm8iLCAibmlcdTAwRjFvIikpOyAvLyBuaZZvCisgICAgICAgIGFzc2VydFRydWUoaXNEZWZhdWx0Q29ycmVjdGlvbigibmltbyIsICJuaVx1MDBGMW8iKSk7IC8vIG5plm8KKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0RlZmF1bHRDb3JyZWN0aW9uKCJtYXJpYSIsICJNYXJcdTAwRURhIikpOyAvLyBNYXKSYQorICAgIH0KK30K