IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgR0hBU0ggZm9yIGZvciBQb3dlcklTQSB2Mi4wNy4KIwojIEp1bHkgMjAxNAojCiMgQWNjdXJhdGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIGFyZSBwcm9ibGVtYXRpYywgYmVjYXVzZSBpdCdzCiMgYWx3YXlzIHZpcnR1YWxpemVkIHNldHVwIHdpdGggcG9zc2libHkgdGhyb3R0bGVkIHByb2Nlc3Nvci4KIyBSZWxhdGl2ZSBjb21wYXJpc29uIGlzIHRoZXJlZm9yZSBtb3JlIGluZm9ybWF0aXZlLiBUaGlzIGluaXRpYWwKIyB2ZXJzaW9uIGlzIH4yLjF4IHNsb3dlciB0aGFuIGhhcmR3YXJlLWFzc2lzdGVkIEFFUy0xMjgtQ1RSLCB+MTJ4CiMgZmFzdGVyIHRoYW4gIjQtYml0IiBpbnRlZ2VyLW9ubHkgY29tcGlsZXItZ2VuZXJhdGVkIDY0LWJpdCBjb2RlLgojICJJbml0aWFsIHZlcnNpb24iIG1lYW5zIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgZnV0aGVyIGltcHJvdmVtZW50LgoKJGZsYXZvdXI9c2hpZnQ7CiRvdXRwdXQgPXNoaWZ0OwoKaWYgKCRmbGF2b3VyID1+IC82NC8pIHsKCSRTSVpFX1Q9ODsKCSRMUlNBVkU9MiokU0laRV9UOwoJJFNUVT0ic3RkdSI7CgkkUE9QPSJsZCI7CgkkUFVTSD0ic3RkIjsKfSBlbHNpZiAoJGZsYXZvdXIgPX4gLzMyLykgewoJJFNJWkVfVD00OwoJJExSU0FWRT0kU0laRV9UOwoJJFNUVT0ic3R3dSI7CgkkUE9QPSJsd3oiOwoJJFBVU0g9InN0dyI7Cn0gZWxzZSB7IGRpZSAibm9uc2Vuc2UgJGZsYXZvdXIiOyB9CgokMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwooICR4bGF0ZT0iJHtkaXJ9cHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20vcHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgpkaWUgImNhbid0IGxvY2F0ZSBwcGMteGxhdGUucGwiOwoKb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IiB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CgpteSAoJFhpcCwkSHRibCwkaW5wLCRsZW4pPW1hcCgiciRfIiwoMy4uNikpOwkjIGFyZ3VtZW50IGJsb2NrCgpteSAoJFhsLCRYbSwkWGgsJElOKT1tYXAoInYkXyIsKDAuLjMpKTsKbXkgKCR6ZXJvLCR0MCwkdDEsJHQyLCR4QzIsJEgsJEhoLCRIbCwkbGVtYXNrKT1tYXAoInYkXyIsKDQuLjEyKSk7Cm15ICR2cnNhdmU9InIxMiI7CgokY29kZT08PF9fXzsKLm1hY2hpbmUJImFueSIKCi50ZXh0CgouZ2xvYmwJLmdjbV9pbml0X3A4CglsaXMJCXIwLDB4ZmZmMAoJbGkJCXI4LDB4MTAKCW1mc3ByCQkkdnJzYXZlLDI1NgoJbGkJCXI5LDB4MjAKCW10c3ByCQkyNTYscjAKCWxpCQlyMTAsMHgzMAoJbHZ4X3UJCSRILDAscjQJCQkjIGxvYWQgSAoJbGU/eG9yCQlyNyxyNyxyNwoJbGU/YWRkaQkJcjcscjcsMHg4CQkjIG5lZWQgYSB2cGVybSBzdGFydCB3aXRoIDA4CglsZT9sdnNyCQk1LDAscjcKCWxlP3ZzcGx0aXNiCTYsMHgwZgoJbGU/dnhvcgkJNSw1LDYJCQkjIHNldCBhIGItZW5kaWFuIG1hc2sKCWxlP3ZwZXJtCSRILCRILCRILDUKCgl2c3BsdGlzYgkkeEMyLC0xNgkJIyAweGYwCgl2c3BsdGlzYgkkdDAsMQkJCSMgb25lCgl2YWRkdWJtCQkkeEMyLCR4QzIsJHhDMgkJIyAweGUwCgl2eG9yCQkkemVybywkemVybywkemVybwoJdm9yCQkkeEMyLCR4QzIsJHQwCQkjIDB4ZTEKCXZzbGRvaQkJJHhDMiwkeEMyLCR6ZXJvLDE1CSMgMHhlMS4uLgoJdnNsZG9pCQkkdDEsJHplcm8sJHQwLDEJCSMgLi4uMQoJdmFkZHVibQkJJHhDMiwkeEMyLCR4QzIJCSMgMHhjMi4uLgoJdnNwbHRpc2IJJHQyLDcKCXZvcgkJJHhDMiwkeEMyLCR0MQkJIyAweGMyLi4uLjAxCgl2c3BsdGIJCSR0MSwkSCwwCQkjIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQoJdnNsCQkkSCwkSCwkdDAJCSMgSDw8PTEKCXZzcmFiCQkkdDEsJHQxLCR0MgkJIyBicm9hZGNhc3QgY2FycnkgYml0Cgl2YW5kCQkkdDEsJHQxLCR4QzIKCXZ4b3IJCSRILCRILCR0MQkJIyB0d2lzdGVkIEgKCgl2c2xkb2kJCSRILCRILCRILDgJCSMgdHdpc3QgZXZlbiBtb3JlIC4uLgoJdnNsZG9pCQkkeEMyLCR6ZXJvLCR4QzIsOAkjIDB4YzIuMAoJdnNsZG9pCQkkSGwsJHplcm8sJEgsOAkJIyAuLi4gYW5kIHNwbGl0Cgl2c2xkb2kJCSRIaCwkSCwkemVybyw4CgoJc3R2eF91CQkkeEMyLDAscjMJCSMgc2F2ZSBwcmUtY29tcHV0ZWQgdGFibGUKCXN0dnhfdQkJJEhsLHI4LHIzCglzdHZ4X3UJCSRILCByOSxyMwoJc3R2eF91CQkkSGgscjEwLHIzCgoJbXRzcHIJCTI1NiwkdnJzYXZlCglibHIKCS5sb25nCQkwCgkuYnl0ZQkJMCwxMiwweDE0LDAsMCwwLDIsMAoJLmxvbmcJCTAKLnNpemUJLmdjbV9pbml0X3A4LC4tLmdjbV9pbml0X3A4CgouZ2xvYmwJLmdjbV9nbXVsdF9wOAoJbGlzCQlyMCwweGZmZjgKCWxpCQlyOCwweDEwCgltZnNwcgkJJHZyc2F2ZSwyNTYKCWxpCQlyOSwweDIwCgltdHNwcgkJMjU2LHIwCglsaQkJcjEwLDB4MzAKCWx2eF91CQkkSU4sMCwkWGlwCQkjIGxvYWQgWGkKCglsdnhfdQkJJEhsLHI4LCRIdGJsCQkjIGxvYWQgcHJlLWNvbXB1dGVkIHRhYmxlCgkgbGU/bHZzbAkkbGVtYXNrLHIwLHIwCglsdnhfdQkJJEgsIHI5LCRIdGJsCgkgbGU/dnNwbHRpc2IJJHQwLDB4MDcKCWx2eF91CQkkSGgscjEwLCRIdGJsCgkgbGU/dnhvcgkkbGVtYXNrLCRsZW1hc2ssJHQwCglsdnhfdQkJJHhDMiwwLCRIdGJsCgkgbGU/dnBlcm0JJElOLCRJTiwkSU4sJGxlbWFzawoJdnhvcgkJJHplcm8sJHplcm8sJHplcm8KCgl2cG1zdW1kCQkkWGwsJElOLCRIbAkJIyBILmxvt1hpLmxvCgl2cG1zdW1kCQkkWG0sJElOLCRICQkjIEguaGm3WGkubG8rSC5sb7dYaS5oaQoJdnBtc3VtZAkJJFhoLCRJTiwkSGgJCSMgSC5oabdYaS5oaQoKCXZwbXN1bWQJCSR0MiwkWGwsJHhDMgkJIyAxc3QgcGhhc2UKCgl2c2xkb2kJCSR0MCwkWG0sJHplcm8sOAoJdnNsZG9pCQkkdDEsJHplcm8sJFhtLDgKCXZ4b3IJCSRYbCwkWGwsJHQwCgl2eG9yCQkkWGgsJFhoLCR0MQoKCXZzbGRvaQkJJFhsLCRYbCwkWGwsOAoJdnhvcgkJJFhsLCRYbCwkdDIKCgl2c2xkb2kJCSR0MSwkWGwsJFhsLDgJCSMgMm5kIHBoYXNlCgl2cG1zdW1kCQkkWGwsJFhsLCR4QzIKCXZ4b3IJCSR0MSwkdDEsJFhoCgl2eG9yCQkkWGwsJFhsLCR0MQoKCWxlP3ZwZXJtCSRYbCwkWGwsJFhsLCRsZW1hc2sKCXN0dnhfdQkJJFhsLDAsJFhpcAkJIyB3cml0ZSBvdXQgWGkKCgltdHNwcgkJMjU2LCR2cnNhdmUKCWJscgoJLmxvbmcJCTAKCS5ieXRlCQkwLDEyLDB4MTQsMCwwLDAsMiwwCgkubG9uZwkJMAouc2l6ZQkuZ2NtX2dtdWx0X3A4LC4tLmdjbV9nbXVsdF9wOAoKLmdsb2JsCS5nY21fZ2hhc2hfcDgKCWxpcwkJcjAsMHhmZmY4CglsaQkJcjgsMHgxMAoJbWZzcHIJCSR2cnNhdmUsMjU2CglsaQkJcjksMHgyMAoJbXRzcHIJCTI1NixyMAoJbGkJCXIxMCwweDMwCglsdnhfdQkJJFhsLDAsJFhpcAkJIyBsb2FkIFhpCgoJbHZ4X3UJCSRIbCxyOCwkSHRibAkJIyBsb2FkIHByZS1jb21wdXRlZCB0YWJsZQoJIGxlP2x2c2wJJGxlbWFzayxyMCxyMAoJbHZ4X3UJCSRILCByOSwkSHRibAoJIGxlP3ZzcGx0aXNiCSR0MCwweDA3CglsdnhfdQkJJEhoLHIxMCwkSHRibAoJIGxlP3Z4b3IJJGxlbWFzaywkbGVtYXNrLCR0MAoJbHZ4X3UJCSR4QzIsMCwkSHRibAoJIGxlP3ZwZXJtCSRYbCwkWGwsJFhsLCRsZW1hc2sKCXZ4b3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCgoJbHZ4X3UJCSRJTiwwLCRpbnAKCWFkZGkJCSRpbnAsJGlucCwxNgoJc3ViaQkJJGxlbiwkbGVuLDE2CgkgbGU/dnBlcm0JJElOLCRJTiwkSU4sJGxlbWFzawoJdnhvcgkJJElOLCRJTiwkWGwKCWIJCUxvb3AKCi5hbGlnbgk1Ckxvb3A6Cgkgc3ViaWMJCSRsZW4sJGxlbiwxNgoJdnBtc3VtZAkJJFhsLCRJTiwkSGwJCSMgSC5sb7dYaS5sbwoJIHN1YmZlLgkJcjAscjAscjAJCSMgYm9ycm93Py0xOjAKCXZwbXN1bWQJCSRYbSwkSU4sJEgJCSMgSC5oabdYaS5sbytILmxvt1hpLmhpCgkgYW5kCQlyMCxyMCwkbGVuCgl2cG1zdW1kCQkkWGgsJElOLCRIaAkJIyBILmhpt1hpLmhpCgkgYWRkCQkkaW5wLCRpbnAscjAKCgl2cG1zdW1kCQkkdDIsJFhsLCR4QzIJCSMgMXN0IHBoYXNlCgoJdnNsZG9pCQkkdDAsJFhtLCR6ZXJvLDgKCXZzbGRvaQkJJHQxLCR6ZXJvLCRYbSw4Cgl2eG9yCQkkWGwsJFhsLCR0MAoJdnhvcgkJJFhoLCRYaCwkdDEKCgl2c2xkb2kJCSRYbCwkWGwsJFhsLDgKCXZ4b3IJCSRYbCwkWGwsJHQyCgkgbHZ4X3UJCSRJTiwwLCRpbnAKCSBhZGRpCQkkaW5wLCRpbnAsMTYKCgl2c2xkb2kJCSR0MSwkWGwsJFhsLDgJCSMgMm5kIHBoYXNlCgl2cG1zdW1kCQkkWGwsJFhsLCR4QzIKCSBsZT92cGVybQkkSU4sJElOLCRJTiwkbGVtYXNrCgl2eG9yCQkkdDEsJHQxLCRYaAoJdnhvcgkJJElOLCRJTiwkdDEKCXZ4b3IJCSRJTiwkSU4sJFhsCgliZXEJCUxvb3AJCQkjIGRpZCAkbGVuLT0xNiBib3Jyb3c/CgoJdnhvcgkJJFhsLCRYbCwkdDEKCWxlP3ZwZXJtCSRYbCwkWGwsJFhsLCRsZW1hc2sKCXN0dnhfdQkJJFhsLDAsJFhpcAkJIyB3cml0ZSBvdXQgWGkKCgltdHNwcgkJMjU2LCR2cnNhdmUKCWJscgoJLmxvbmcJCTAKCS5ieXRlCQkwLDEyLDB4MTQsMCwwLDAsNCwwCgkubG9uZwkJMAouc2l6ZQkuZ2NtX2doYXNoX3A4LC4tLmdjbV9naGFzaF9wOAoKLmFzY2l6ICAiR0hBU0ggZm9yIFBvd2VySVNBIDIuMDcsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCi5hbGlnbiAgMgpfX18KCmZvcmVhY2ggKHNwbGl0KCJcbiIsJGNvZGUpKSB7CglpZiAoJGZsYXZvdXIgPX4gL2xlJC9vKSB7CSMgbGl0dGxlLWVuZGlhbgoJICAgIHMvbGVcPy8vbwkJb3IKCSAgICBzL2JlXD8vI2JlIy9vOwoJfSBlbHNlIHsKCSAgICBzL2xlXD8vI2xlIy9vCW9yCgkgICAgcy9iZVw/Ly9vOwoJfQoJcHJpbnQgJF8sIlxuIjsKfQoKY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gK