ZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYWVjdGVzdCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYWVjdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTg4OTRlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9hZWN0ZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYXVkZGVtbyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYXVkZGVtbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzBmNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9hdWRkZW1vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYXZpcGxheSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvYXZpcGxheQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWUzNTkyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9hdmlwbGF5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvY2xpZGVtbyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvY2xpZGVtbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzBkNDZkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9jbGlkZW1vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvY29uZnNhbXBsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvY29uZnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZGU4ZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9jb25mc2FtcGxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvZW5jZGVjIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9lbmNkZWMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODI1YzYwMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvZW5jZGVjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvaHR0cGRlbW8gYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2h0dHBkZW1vCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNDIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2h0dHBkZW1vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvaWNlZGVtbyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvaWNlZGVtbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjRlMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9pY2VkZW1vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvamJzaW0gYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2pic2ltCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxZWQ5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2pic2ltCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvbGF0ZW5jeSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvbGF0ZW5jeQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzY2MTQzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9sYXRlbmN5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvbGV2ZWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2xldmVsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5ZTRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL2xldmVsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvbWl4IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9taXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTBhY2VmOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvbWl4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGNhcHV0aWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BjYXB1dGlsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3NDdlODEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BjYXB1dGlsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzaXAtcGVyZiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzaXAtcGVyZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYmExOWNmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9wanNpcC1wZXJmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzdWEyX2RlbW8gYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3Bqc3VhMl9kZW1vCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQzNDhmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3Bqc3VhMl9kZW1vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGxheWZpbGUgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BsYXlmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ODI5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BsYXlmaWxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGxheXNpbmUgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BsYXlzaW5lCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmZGRjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3BsYXlzaW5lCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcmVjZmlsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcmVjZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTNhNjZmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9yZWNmaWxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcmVzYW1wbGVwbGF5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9yZXNhbXBsZXBsYXkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJjNGQyMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcmVzYW1wbGVwbGF5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2ltcGxlX3Bqc3VhIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zaW1wbGVfcGpzdWEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZiMzMxNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2ltcGxlX3Bqc3VhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2ltcGxldWEgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3NpbXBsZXVhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhZmMxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3NpbXBsZXVhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwZWNobyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwZWNobwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTRhMDRiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zaXBlY2hvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwcnRwIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zaXBydHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzg0NzI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwcnRwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwc3RhdGVsZXNzIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zaXBzdGF0ZWxlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmVjOGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc2lwc3RhdGVsZXNzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RhdGVmdWxfcHJveHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3N0YXRlZnVsX3Byb3h5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5NjhmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3N0YXRlZnVsX3Byb3h5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RhdGVsZXNzX3Byb3h5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zdGF0ZWxlc3NfcHJveHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmVjYzA0NgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RhdGVsZXNzX3Byb3h5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RlcmVvdGVzdCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RlcmVvdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjZlODBlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zdGVyZW90ZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RyZWFtdXRpbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RyZWFtdXRpbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDljOGNhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zdHJlYW11dGlsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvc3RyZXJyb3IgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3N0cmVycm9yCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyMDFjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3N0cmVycm9yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvdG9uZWdlbiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvdG9uZWdlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTlmZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9iaW4vc2FtcGxlcy9hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS90b25lZ2VuCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYmluL3NhbXBsZXMvYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvdmlkX3N0cmVhbXV0aWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3ZpZF9zdHJlYW11dGlsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5NmVkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2Jpbi9zYW1wbGVzL2FybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3ZpZF9zdHJlYW11dGlsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvLnBqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmRlcGVuZCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvLnBqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmRlcGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTAxOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC8ucGpzdWEtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuZGVwZW5kCkBAIC0wLDAgKzEsMTUzMSBAQAorb3V0cHV0L3Bqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL21haW4ubzogLi4vc3JjL3Bqc3VhL21haW4uYyAuLi9zcmMvcGpzdWEvcGpzdWFfYXBwLmggXAorIC4uL3NyYy9wanN1YS9wanN1YV9hcHBfY29tbW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc3VhLWxpYi9wanN1YS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2NjX2djYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvb3NfYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvbV9hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zaXplX3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRkZWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnX3NpdGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dG9jb25mLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRhcmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3VyaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9saXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyX2Npc19iaXR3aXNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90ZWxfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX211bHRpcGFydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfcGFyc2VyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90aW1lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tb2R1bGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2VuZHBvaW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3Jlc29sdmUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3Jlc29sdmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9kbnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pb3F1ZXVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3RjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrX3Fvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3Rscy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9wb29sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NzbF9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzX2VsZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbmRyb2lkL2FwaS1sZXZlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWxsb2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zdGRpby5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRpbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL193Y2hhcl9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9rZXJuZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdGRsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYWxsb2NhLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZ3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWVtb3J5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9ha2EuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zYWN0aW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91YV9sYXllci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZGlhbG9nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2F2aV9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZm9ybWF0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mcmFtZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9vcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2lyY2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbnZlcnRlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG9fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tZW1fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbnVsbF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wbGMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Jlc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwX3hyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvaW50ZXJuYWxfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcGFnZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHBfbmVnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWxlbmNlZGV0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvYXVkaW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NwbGl0Y29tYi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RlcmVvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtX2NvbW1vbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdG9uZWdlbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfaWNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvaWNlX3N0cmFucy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2ljZV9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3NydHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF91ZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3RlZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BsYXlsaXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd3NvbGEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3Bhc3N0aHJvdWdoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9sMTYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2ZmbXBlZ192aWRfY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nc20uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NwZWV4LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9pbGJjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaXBwX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvb3BlbmNvcmVfYW1yLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zaWxrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYV92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXZfaW1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9hdmlfZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwX3VhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9pbnYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlZ2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlcGxhY2VzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF94ZmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwXzEwMHJlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXBfc2ltcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yl9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2lzY29tcG9zaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC94bWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL213aS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcHJlc2VuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3BpZGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3hwaWRmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ycGlkLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9wdWJsaXNoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9uYXRfZGV0ZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2dldG9wdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvYmFzZTY0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jcmMzMi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19tZDUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL21kNS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zcnZfcmVzb2x2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Ruc19zZXJ2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvanNvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3R1bl9zaW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3BjYXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2h0dHBfY2xpZW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FjdGl2ZXNvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX2NvbnNvbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV90ZWxuZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGpsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWRkcl9yZXNvbHYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXJyYXkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2V4Y2VwdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlmb2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2FjY2Vzcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2lvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2d1aWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaGFzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pcF9oZWxwZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbF9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmFuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9yYnRyZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19zZWxlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdW5pY29kZS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zaWduYWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3NpZ25hbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3NpZ2luZm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oCitvdXRwdXQvcGpzdWEtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzdWFfYXBwLm86IC4uL3NyYy9wanN1YS9wanN1YV9hcHAuYyAuLi9zcmMvcGpzdWEvcGpzdWFfYXBwLmggXAorIC4uL3NyYy9wanN1YS9wanN1YV9hcHBfY29tbW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc3VhLWxpYi9wanN1YS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2NjX2djYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvb3NfYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvbV9hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zaXplX3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRkZWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnX3NpdGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dG9jb25mLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRhcmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3VyaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9saXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyX2Npc19iaXR3aXNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90ZWxfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX211bHRpcGFydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfcGFyc2VyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90aW1lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tb2R1bGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2VuZHBvaW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3Jlc29sdmUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3Jlc29sdmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9kbnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pb3F1ZXVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3RjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrX3Fvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3Rscy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9wb29sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NzbF9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzX2VsZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbmRyb2lkL2FwaS1sZXZlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWxsb2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zdGRpby5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRpbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL193Y2hhcl9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9rZXJuZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdGRsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYWxsb2NhLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZ3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWVtb3J5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9ha2EuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zYWN0aW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91YV9sYXllci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZGlhbG9nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2F2aV9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZm9ybWF0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mcmFtZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9vcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2lyY2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbnZlcnRlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG9fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tZW1fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbnVsbF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wbGMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Jlc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwX3hyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvaW50ZXJuYWxfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcGFnZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHBfbmVnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWxlbmNlZGV0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvYXVkaW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NwbGl0Y29tYi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RlcmVvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtX2NvbW1vbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdG9uZWdlbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfaWNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvaWNlX3N0cmFucy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2ljZV9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3NydHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF91ZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3RlZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BsYXlsaXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd3NvbGEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3Bhc3N0aHJvdWdoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9sMTYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2ZmbXBlZ192aWRfY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nc20uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NwZWV4LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9pbGJjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaXBwX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvb3BlbmNvcmVfYW1yLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zaWxrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYV92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXZfaW1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9hdmlfZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwX3VhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9pbnYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlZ2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlcGxhY2VzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF94ZmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwXzEwMHJlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXBfc2ltcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yl9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2lzY29tcG9zaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC94bWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL213aS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcHJlc2VuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3BpZGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3hwaWRmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ycGlkLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9wdWJsaXNoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9uYXRfZGV0ZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2dldG9wdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvYmFzZTY0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jcmMzMi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19tZDUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL21kNS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zcnZfcmVzb2x2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Ruc19zZXJ2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvanNvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3R1bl9zaW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3BjYXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2h0dHBfY2xpZW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FjdGl2ZXNvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX2NvbnNvbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV90ZWxuZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGpsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWRkcl9yZXNvbHYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXJyYXkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2V4Y2VwdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlmb2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2FjY2Vzcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2lvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2d1aWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaGFzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pcF9oZWxwZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbF9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmFuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9yYnRyZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19zZWxlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdW5pY29kZS5oCitvdXRwdXQvcGpzdWEtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzdWFfYXBwX2NsaS5vOiAuLi9zcmMvcGpzdWEvcGpzdWFfYXBwX2NsaS5jIFwKKyAuLi9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbW1vbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanN1YS1saWIvcGpzdWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jY19nY2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L29zX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L21fYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2l6ZV90LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbmZpZ19zaXRlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRvY29uZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkYXJnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91cmkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbGlzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2Nhbm5lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2Nhbm5lcl9jaXNfYml0d2lzZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdGVsX3VyaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tdWx0aXBhcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3BhcnNlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZXZlbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbG9jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbW9kdWxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lbmRwb2ludC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9yZXNvbHZlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9yZXNvbHZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZG5zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaW9xdWV1ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdXRpbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3VkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X2xvb3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF90Y3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19xb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF90bHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zc2xfc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9jZGVmc19lbGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYW5kcm9pZC9hcGktbGV2ZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFsbG9jLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvc3RkaW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0ZGludC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fd2NoYXJfbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9jb21waWxlci5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUva2VybmVsLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkbGliLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FsbG9jYS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmdzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21lbW9yeS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dGhfYWthLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdWFfbGF5ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2RpYWxvZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hbGF3X3VsYXcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZ19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hdmlfc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jbG9jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXZlbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Zvcm1hdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2lnbmF0dXJlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZnJhbWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2JpZGlyZWN0aW9uYWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NpcmNidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25mZXJlbmNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb252ZXJ0ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2RlbGF5YnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VuZHBvaW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2c3MTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9qYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tYXN0ZXJfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbWVtX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL251bGxfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcGxjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9yZXNhbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRjcF94ci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9tYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9oaWdoX3ByZWNpc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2ludGVybmFsX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3BhZ2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0cC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2RwX25lZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2lsZW5jZWRldC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zcGxpdGNvbWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0ZXJlby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbV9jb21tb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RvbmVnZW4uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9hZGFwdGVyX3NhbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2ljZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2ljZV9zdHJhbnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9pY2Vfc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX2F1dGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fdHJhbnNhY3Rpb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R1cm5fc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R1cm5fc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2xvb3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9zcnRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF90ZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wbGF5bGlzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdmUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dzb2xhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvYXVkaW9fY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9wYXNzdGhyb3VnaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvbDE2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9mZm1wZWdfdmlkX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZ3NtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zcGVleC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaWxiYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMjEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lwcF9jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL29wZW5jb3JlX2Ftci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvc2lsay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWFfdmlkZW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2X2ltcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvYXZpX2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcF91YS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfaW52LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9yZWdjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9yZXBsYWNlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfeGZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvZXZzdWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF8xMDByZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3RpbWVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwX3NpbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvZXZzdWJfbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9pc2NvbXBvc2luZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwveG1sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9td2kuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3ByZXNlbmNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9waWRmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS94cGlkZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcnBpZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcHVibGlzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvbmF0X2RldGVjdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9nZXRvcHQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Jhc2U2NC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY3JjMzIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2htYWNfbWQ1LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9tZDUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2htYWNfc2hhMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2hhMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3J2X3Jlc29sdmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9kbnNfc2VydmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2pzb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3N0dW5fc2ltcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9wY2FwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9odHRwX2NsaWVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hY3RpdmVzb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9jb25zb2xlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGlfaW1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGlfdGVsbmV0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqbGliLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FkZHJfcmVzb2x2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FycmF5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9leGNlcHQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbG9nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpZm9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlsZV9hY2Nlc3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlsZV9pby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9ndWlkLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2hhc2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaXBfaGVscGVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3Bvb2xfYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3JhbmQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmJ0cmVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2tfc2VsZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3VuaWNvZGUuaAorb3V0cHV0L3Bqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL3Bqc3VhX2FwcF9jb21tb24ubzogLi4vc3JjL3Bqc3VhL3Bqc3VhX2FwcF9jb21tb24uYyBcCisgLi4vc3JjL3Bqc3VhL3Bqc3VhX2FwcF9jb21tb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzdWEtbGliL3Bqc3VhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvY2NfZ2NjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9vc19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9tX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3NpemVfdC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlL3N0ZGRlZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb25maWdfc2l0ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0b2NvbmYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlL3N0ZGFyZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2xpc3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3NjYW5uZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3NjYW5uZXJfY2lzX2JpdHdpc2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RlbF91cmkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbXVsdGlwYXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9wYXJzZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2V2ZW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3RpbWVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2xvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX21vZHVsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZW5kcG9pbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfcmVzb2x2ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvcmVzb2x2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Rucy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2lvcXVldWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3V0aWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF91ZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF9sb29wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdGNwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2tfcW9zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdGxzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3Bvb2wuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc3NsX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnNfZWxmLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FuZHJvaWQvYXBpLWxldmVsLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hbGxvYy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL3N0ZGlvLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlL3N0ZGludC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdGRpbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL190eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL190eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvX3djaGFyX2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2tlcm5lbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbGxvY2EuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RyaW5ncy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tZW1vcnkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dGhfbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoX2FrYS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNhY3Rpb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3VhX2xheWVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9kaWFsb2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYWxhd191bGF3LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWdfYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYXZpX3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2xvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2V2ZW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mb3JtYXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpZ25hdHVyZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2ZyYW1lLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL29zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9iaWRpcmVjdGlvbmFsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jaXJjYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmVyZW5jZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29udmVydGVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9kZWxheWJ1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZWNoby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZWNob19wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lbmRwb2ludC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2RwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9nNzExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9jb25maWdfYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvamJ1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbWFzdGVyX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21lbV9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9udWxsX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BsYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcmVzYW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0Y3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0Y3BfeHIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbWF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvaGlnaF9wcmVjaXNpb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9pbnRlcm5hbF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvc3lzbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS9wYWdlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcF9uZWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpbGVuY2VkZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmRfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3BsaXRjb21iLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdGVyZW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX2NvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdHJlYW1fY29tbW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90b25lZ2VuLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfYWRhcHRlcl9zYW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9pY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9pY2Vfc3RyYW5zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvaWNlX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9hdXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3RyYW5zYWN0aW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90dXJuX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90dXJuX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9sb29wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfc3J0cC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3VkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfdGVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcGxheWxpc3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93c29sYS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2F1ZGlvX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvcGFzc3Rocm91Z2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2wxNi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZmZtcGVnX3ZpZF9jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2dzbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvc3BlZXguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lsYmMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIxLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9pcHBfY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9vcGVuY29yZV9hbXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NpbGsuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhX3ZpZGVvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldl9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2F2aV9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXBfdWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX2ludi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfcmVnYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfcmVwbGFjZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3hmZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2V2c3ViLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfMTAwcmVsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF90aW1lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcF9zaW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2V2c3ViX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvaXNjb21wb3NpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3htbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvbXdpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9wcmVzZW5jZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcGlkZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUveHBpZGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3JwaWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3B1Ymxpc2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL25hdF9kZXRlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZ2V0b3B0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9iYXNlNjQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NyYzMyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9obWFjX21kNS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvbWQ1LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9obWFjX3NoYTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3NoYTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3Nydl9yZXNvbHZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZG5zX3NlcnZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9qc29uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zdHVuX3NpbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvcGNhcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaHR0cF9jbGllbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWN0aXZlc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGlfY29uc29sZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX2ltcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX3RlbG5ldC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wamxpYi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hZGRyX3Jlc29sdi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hcnJheS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZXhjZXB0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2xvZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWZvYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpbGVfYWNjZXNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpbGVfaW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZ3VpZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9oYXNoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2lwX2hlbHBlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9wb29sX2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9yYW5kLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3JidHJlZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrX3NlbGVjdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai91bmljb2RlLmgKK291dHB1dC9wanN1YS1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9wanN1YV9hcHBfY29uZmlnLm86IC4uL3NyYy9wanN1YS9wanN1YV9hcHBfY29uZmlnLmMgXAorIC4uL3NyYy9wanN1YS9wanN1YV9hcHBfY29tbW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc3VhLWxpYi9wanN1YS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2NjX2djYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvb3NfYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvbV9hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zaXplX3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRkZWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnX3NpdGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dG9jb25mLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRhcmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3VyaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9saXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyX2Npc19iaXR3aXNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90ZWxfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX211bHRpcGFydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfcGFyc2VyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai90aW1lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tb2R1bGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2VuZHBvaW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3Jlc29sdmUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3Jlc29sdmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9kbnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pb3F1ZXVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3RjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrX3Fvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3Rscy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9wb29sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NzbF9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzX2VsZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbmRyb2lkL2FwaS1sZXZlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWxsb2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zdGRpby5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRpbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9fdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL193Y2hhcl9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9rZXJuZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdGRsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYWxsb2NhLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0cmluZ3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWVtb3J5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRoX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9ha2EuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zYWN0aW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91YV9sYXllci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZGlhbG9nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2F2aV9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZm9ybWF0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mcmFtZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9vcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2lyY2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbnZlcnRlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG9fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tZW1fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbnVsbF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wbGMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Jlc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwX3hyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvaW50ZXJuYWxfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcGFnZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHBfbmVnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWxlbmNlZGV0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvYXVkaW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NwbGl0Y29tYi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RlcmVvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtX2NvbW1vbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdG9uZWdlbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfaWNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvaWNlX3N0cmFucy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2ljZV9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvdHVybl9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3NydHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF91ZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3RlZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BsYXlsaXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd3NvbGEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3Bhc3N0aHJvdWdoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9sMTYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2ZmbXBlZ192aWRfY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nc20uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NwZWV4LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9pbGJjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaXBwX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvb3BlbmNvcmVfYW1yLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zaWxrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYV92aWRlb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXZfaW1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9hdmlfZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwX3VhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9pbnYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlZ2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3JlcGxhY2VzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF94ZmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwXzEwMHJlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXBfc2ltcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ldnN1Yl9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2lzY29tcG9zaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC94bWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL213aS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcHJlc2VuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3BpZGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3hwaWRmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9ycGlkLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9wdWJsaXNoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9uYXRfZGV0ZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2dldG9wdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvYmFzZTY0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jcmMzMi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19tZDUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL21kNS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaG1hY19zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zaGExLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zcnZfcmVzb2x2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Ruc19zZXJ2ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvanNvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3R1bl9zaW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3BjYXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2h0dHBfY2xpZW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FjdGl2ZXNvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX2NvbnNvbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV90ZWxuZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGpsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWRkcl9yZXNvbHYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXJyYXkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2V4Y2VwdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlmb2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2FjY2Vzcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2lvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2d1aWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaGFzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pcF9oZWxwZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbF9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmFuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9yYnRyZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19zZWxlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdW5pY29kZS5oCitvdXRwdXQvcGpzdWEtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkvcGpzdWFfYXBwX2xlZ2FjeS5vOiAuLi9zcmMvcGpzdWEvcGpzdWFfYXBwX2xlZ2FjeS5jIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanN1YS1saWIvcGpzdWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jY19nY2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L29zX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L21fYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2l6ZV90LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbmZpZ19zaXRlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9hdXRvY29uZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkYXJnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91cmkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbGlzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2Nhbm5lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2Nhbm5lcl9jaXNfYml0d2lzZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdGVsX3VyaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tdWx0aXBhcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3BhcnNlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfZXZlbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbG9jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbW9kdWxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lbmRwb2ludC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9yZXNvbHZlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9yZXNvbHZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZG5zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaW9xdWV1ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdXRpbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3VkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X2xvb3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF90Y3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19xb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3RyYW5zcG9ydF90bHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zc2xfc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9jZGVmc19lbGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYW5kcm9pZC9hcGktbGV2ZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFsbG9jLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvc3RkaW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0ZGludC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fd2NoYXJfbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9jb21waWxlci5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUva2VybmVsLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkbGliLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FsbG9jYS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmdzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21lbW9yeS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dGhfYWthLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdWFfbGF5ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2RpYWxvZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hbGF3X3VsYXcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZ19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hdmlfc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jbG9jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXZlbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Zvcm1hdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2lnbmF0dXJlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZnJhbWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2JpZGlyZWN0aW9uYWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NpcmNidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25mZXJlbmNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb252ZXJ0ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2RlbGF5YnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VuZHBvaW50LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2c3MTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9qYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tYXN0ZXJfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbWVtX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL251bGxfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcGxjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9yZXNhbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRjcF94ci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9tYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9oaWdoX3ByZWNpc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2ludGVybmFsX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3BhZ2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0cC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2RwX25lZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2lsZW5jZWRldC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zcGxpdGNvbWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0ZXJlby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbV9jb21tb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RvbmVnZW4uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9hZGFwdGVyX3NhbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2ljZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2ljZV9zdHJhbnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9pY2Vfc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9zZXNzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX2F1dGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fdHJhbnNhY3Rpb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R1cm5fc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3R1cm5fc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2xvb3AuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9zcnRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF90ZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wbGF5bGlzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdmUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dzb2xhLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvYXVkaW9fY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9wYXNzdGhyb3VnaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvbDE2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9mZm1wZWdfdmlkX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZ3NtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zcGVleC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaWxiYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMjEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lwcF9jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL29wZW5jb3JlX2Ftci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvc2lsay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWFfdmlkZW9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2X2ltcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvYXZpX2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcF91YS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfaW52LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9yZWdjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF9yZXBsYWNlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfeGZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvZXZzdWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF8xMDByZWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3RpbWVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwX3NpbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvZXZzdWJfbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9pc2NvbXBvc2luZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwveG1sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9td2kuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3ByZXNlbmNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9waWRmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS94cGlkZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcnBpZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcHVibGlzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvbmF0X2RldGVjdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9nZXRvcHQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2Jhc2U2NC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY3JjMzIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2htYWNfbWQ1LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9tZDUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2htYWNfc2hhMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc2hhMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3J2X3Jlc29sdmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9kbnNfc2VydmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2pzb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3N0dW5fc2ltcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9wY2FwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9odHRwX2NsaWVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hY3RpdmVzb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9jb25zb2xlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGlfaW1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9jbGlfdGVsbmV0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqbGliLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FkZHJfcmVzb2x2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FycmF5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9leGNlcHQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbG9nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpZm9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlsZV9hY2Nlc3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlsZV9pby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9ndWlkLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2hhc2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaXBfaGVscGVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3Bvb2xfYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3JhbmQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmJ0cmVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2tfc2VsZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3VuaWNvZGUuaCBcCisgLi4vc3JjL3Bqc3VhL3Bqc3VhX2FwcF9jb21tb24uaAorLi4vYmluL3Bqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpOiAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvbGliL2xpYnBqc3VhMi1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9saWIvbGlicGpzdWEtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvbGliL2xpYnBqc2lwLXVhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2xpYi9saWJwanNpcC1zaW1wbGUtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvbGliL2xpYnBqc2lwLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtY29kZWMtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9saWIvbGlicGptZWRpYS12aWRlb2Rldi1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2xpYi9saWJwam1lZGlhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2xpYi9saWJwam5hdGgtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9saWIvbGlicGpsaWItdXRpbC1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC90aGlyZF9wYXJ0eS9saWIvbGlibWlsZW5hZ2UtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvdGhpcmRfcGFydHkvbGliL2xpYnNydHAtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvdGhpcmRfcGFydHkvbGliL2xpYnJlc2FtcGxlLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2xpYi9saWJwai1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkLy5wanN5c3Rlc3QtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuZGVwZW5kIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC8ucGpzeXN0ZXN0LWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmRlcGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdlNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC8ucGpzeXN0ZXN0LWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmRlcGVuZApAQCAtMCwwICsxLDM0NSBAQAorb3V0cHV0L3Bqc3lzdGVzdC1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS9zeXN0ZXN0Lm86IC4uL3NyYy9wanN5c3Rlc3Qvc3lzdGVzdC5jIC4uL3NyYy9wanN5c3Rlc3Qvc3lzdGVzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wamxpYi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9hY3RpdmVzb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2lvcXVldWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jY19nY2MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L29zX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L21fYXV0by5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2l6ZV90LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkZGVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbmZpZ19zaXRlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWRkcl9yZXNvbHYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXJyYXkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9hc3NlcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnNfZWxmLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FuZHJvaWQvYXBpLWxldmVsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2N0eXBlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS9zdGRhcmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZXhjZXB0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zZXRqbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2xvZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWZvYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpbGVfYWNjZXNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2ZpbGVfaW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZ3VpZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9oYXNoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2lwX2hlbHBlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9saXN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2xvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbWF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3N0cmluZy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFsbG9jLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUtZml4ZWQvc3RkaW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkaW50LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0ZGludC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9fd2NoYXJfbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9jb21waWxlci5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUva2VybmVsLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RkbGliLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FsbG9jYS5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdHJpbmdzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21lbW9yeS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvaGlnaF9wcmVjaXNpb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9pbnRlcm5hbF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvc3lzbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS9wYWdlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL29zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3Bvb2wuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcG9vbF9idWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmFuZC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9yYnRyZWUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19xb3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc29ja19zZWxlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc3NsX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdGltZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovdW5pY29kZS5oIFwKKyAuLi9zcmMvcGpzeXN0ZXN0L2d1aS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanN1YS1saWIvcGpzdWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dG9jb25mLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zY2FubmVyX2Npc19iaXR3aXNlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90ZWxfdXJpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX211bHRpcGFydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfcGFyc2VyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfbW9kdWxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9lbmRwb2ludC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF9yZXNvbHZlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9yZXNvbHZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZG5zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF91dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfdWRwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc3BvcnRfbG9vcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3RjcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdHJhbnNwb3J0X3Rscy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfYXV0aF9tc2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2F1dGhfYWthLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwL3NpcF90cmFuc2FjdGlvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC9zaXBfdWFfbGF5ZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAvc2lwX2RpYWxvZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2F2aV9zdHJlYW0uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ldmVudC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZm9ybWF0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mcmFtZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2lyY2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbnZlcnRlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG9fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9tZW1fcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbnVsbF9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wbGMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Jlc2FtcGxlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwX3hyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydHAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcF9uZWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpbGVuY2VkZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvY29uZmlnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmRfcG9ydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3BsaXRjb21iLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdGVyZW8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX2NvZGVjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdHJlYW1fY29tbW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90b25lZ2VuLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfYWRhcHRlcl9zYW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9pY2UuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9pY2Vfc3RyYW5zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvaWNlX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fc2Vzc2lvbi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL3N0dW5fbXNnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9hdXRoLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvc3R1bl9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3RyYW5zYWN0aW9uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam5hdGgvaW5jbHVkZS9wam5hdGgvZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC9zdHVuX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90dXJuX3NvY2suaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC90dXJuX3Nlc3Npb24uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9sb29wLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfc3J0cC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3VkcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3BvcnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9jb25maWcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfc3RyZWFtLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfdGVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcGxheWxpc3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wb3J0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93c29sYS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2F1ZGlvX2NvZGVjcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvcGFzc3Rocm91Z2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2wxNi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZmZtcGVnX3ZpZF9jb2RlY3MuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2dzbS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvc3BlZXguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lsYmMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIxLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9pcHBfY29kZWNzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9vcGVuY29yZV9hbXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NpbGsuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhX3ZpZGVvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldl9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2F2aV9kZXYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXBfdWEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX2ludi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfcmVnYy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfcmVwbGFjZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtdWEvc2lwX3hmZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2V2c3ViLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC11YS9zaXBfMTAwcmVsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXVhL3NpcF90aW1lci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcF9zaW1wbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL2V2c3ViX21zZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvaXNjb21wb3NpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3htbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvbXdpLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9pbmNsdWRlL3Bqc2lwLXNpbXBsZS9wcmVzZW5jZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUvcGlkZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvaW5jbHVkZS9wanNpcC1zaW1wbGUveHBpZGYuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3JwaWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2luY2x1ZGUvcGpzaXAtc2ltcGxlL3B1Ymxpc2guaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9pbmNsdWRlL3BqbmF0aC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpuYXRoL2luY2x1ZGUvcGpuYXRoL25hdF9kZXRlY3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9lcnJuby5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZ2V0b3B0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9iYXNlNjQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NyYzMyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9obWFjX21kNS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvbWQ1LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9obWFjX3NoYTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3NoYTEuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL3Nydl9yZXNvbHZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvZG5zX3NlcnZlci5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9qc29uLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi11dGlsL2luY2x1ZGUvcGpsaWItdXRpbC9zdHVuX3NpbXBsZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvcGNhcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvaHR0cF9jbGllbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWItdXRpbC9pbmNsdWRlL3BqbGliLXV0aWwvY2xpX2NvbnNvbGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvaW5jbHVkZS9wamxpYi11dGlsL2NsaV90ZWxuZXQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhX2F1ZGlvZGV2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldl9pbXAuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvdGVzdC5oCitvdXRwdXQvcGpzeXN0ZXN0LWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpL21haW5fY29uc29sZS5vOiAuLi9zcmMvcGpzeXN0ZXN0L21haW5fY29uc29sZS5jIFwKKyAuLi9zcmMvcGpzeXN0ZXN0L3N5c3Rlc3QuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGpsaWIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovYWN0aXZlc29jay5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pb3F1ZXVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbmZpZy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvY2NfZ2NjLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9vc19hdXRvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9tX2F1dG8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L3NpemVfdC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlL3N0ZGRlZi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb25maWdfc2l0ZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FkZHJfcmVzb2x2LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2FycmF5LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvYXNzZXJ0LmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2Fzc2VydC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvY2RlZnMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL2NkZWZzX2VsZi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbmRyb2lkL2FwaS1sZXZlbC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jdHlwZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvY3R5cGUuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZXJybm8uaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2Vycm5vLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3Rvb2xjaGFpbnMvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLTQuOC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL2djYy9hcm0tbGludXgtYW5kcm9pZGVhYmkvNC44L2luY2x1ZGUvc3RkYXJnLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2V4Y2VwdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9jb21wYXQvc2V0am1wLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL3NldGptcC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2cuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovZmlmb2J1Zi5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2FjY2Vzcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9maWxlX2lvLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2d1aWQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovaGFzaC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9pcF9oZWxwZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovbGlzdC5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9sb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL2NvbXBhdC9zdHJpbmcuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RyaW5nLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hbGxvYy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlLWZpeGVkL3N0ZGlvLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay90b29sY2hhaW5zL2FybS1saW51eC1hbmRyb2lkZWFiaS00LjgvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9nY2MvYXJtLWxpbnV4LWFuZHJvaWRlYWJpLzQuOC9pbmNsdWRlL3N0ZGludC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zdGRpbnQuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL190eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL190eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvX3djaGFyX2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL2FzbS90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tYWNoaW5lL2tlcm5lbC5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hbGxvY2EuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3RyaW5ncy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9tZW1vcnkuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hdGguaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvdG9vbGNoYWlucy9hcm0tbGludXgtYW5kcm9pZGVhYmktNC44L3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvZ2NjL2FybS1saW51eC1hbmRyb2lkZWFiaS80LjgvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL3N5cy9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggXAorIC9ob21lL2xpc2lvbmFsL0Rldi9BRFQvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTE5L2FyY2gtYXJtL3Vzci9pbmNsdWRlL21hY2hpbmUvaW50ZXJuYWxfdHlwZXMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvbWFjaGluZS9saW1pdHMuaCBcCisgL2hvbWUvbGlzaW9uYWwvRGV2L0FEVC9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTkvYXJjaC1hcm0vdXNyL2luY2x1ZGUvc3lzL3N5c2xpbWl0cy5oIFwKKyAvaG9tZS9saXNpb25hbC9EZXYvQURUL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xOS9hcmNoLWFybS91c3IvaW5jbHVkZS9hc20vcGFnZS5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9vcy5oIFwKKyAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvaW5jbHVkZS9wai9wb29sLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3Bvb2xfYnVmLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3JhbmQuaCBcCisgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL2luY2x1ZGUvcGovcmJ0cmVlLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2tfcW9zLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NvY2tfc2VsZWN0LmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3NzbF9zb2NrLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3RpbWVyLmggXAorIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9pbmNsdWRlL3BqL3VuaWNvZGUuaCBcCisgLi4vc3JjL3Bqc3lzdGVzdC9ndWkuaAorLi4vYmluL3Bqc3lzdGVzdC1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaTogL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2xpYi9saWJwanN1YTItYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpzaXAvbGliL2xpYnBqc3VhLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2xpYi9saWJwanNpcC11YS1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wanNpcC9saWIvbGlicGpzaXAtc2ltcGxlLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3Bqc2lwL2xpYi9saWJwanNpcC1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2xpYi9saWJwam1lZGlhLWNvZGVjLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtdmlkZW9kZXYtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGptZWRpYS9saWIvbGlicGptZWRpYS1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wam1lZGlhL2xpYi9saWJwam1lZGlhLWF1ZGlvZGV2LWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbmF0aC9saWIvbGlicGpuYXRoLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliLXV0aWwvbGliL2xpYnBqbGliLXV0aWwtYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYSAvaG9tZS9saXNpb25hbC9naXQvc2ZscGhvbmUtYW5kcm9pZC9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvdGhpcmRfcGFydHkvbGliL2xpYm1pbGVuYWdlLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYi9saWJzcnRwLWFybS11bmtub3duLWxpbnV4LWFuZHJvaWRlYWJpLmEgL2hvbWUvbGlzaW9uYWwvZ2l0L3NmbHBob25lLWFuZHJvaWQvam5pL3BqcHJvamVjdC1hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYi9saWJyZXNhbXBsZS1hcm0tdW5rbm93bi1saW51eC1hbmRyb2lkZWFiaS5hIC9ob21lL2xpc2lvbmFsL2dpdC9zZmxwaG9uZS1hbmRyb2lkL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9saWIvbGlicGotYXJtLXVua25vd24tbGludXgtYW5kcm9pZGVhYmkuYQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9Gb290cHJpbnQubWFrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9Gb290cHJpbnQubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL0Zvb3RwcmludC5tYWsKQEAgLTAsMCArMSwyOCBAQAorIworIyBUaGlzIGZpbGUgaXMgdXNlZCBieSBnZXQtZm9vdHByaW50LnB5IHNjcmlwdCB0byBidWlsZCBzYW1wbGVzL2Zvb3RwcmludC5jCisjIHRvIGdldCB0aGUgZm9vdHByaW50IHJlcG9ydCBmb3IgUEpTSVAvUEpNRURJQS4KKyMKK2luY2x1ZGUgLi4vLi4vYnVpbGQubWFrCitpbmNsdWRlIC4uLy4uL2J1aWxkL2NvbW1vbi5tYWsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdhdGhlciBhbGwgZmxhZ3MuCisjCitleHBvcnQgX0NGTEFHUyAJOj0gJChBUFBfQ0ZMQUdTKSAkKENGTEFHUykKK2V4cG9ydCBfQ1hYRkxBR1M6PSAkKF9DRkxBR1MpCisKK2V4cG9ydCBfTERGTEFHUyA6PSAkKEFQUF9MREZMQUdTKSAkKEFQUF9MRExJQlMpICQoTERGTEFHUykKKworRVhFIDo9IGZvb3RwcmludC5leGUKKworYWxsOiAKKwkkKEFQUF9DQykgLW8gJChFWEUpIC4uL3NyYy9zYW1wbGVzL2Zvb3RwcmludC5jICQoRkNGTEFHUykgJChfQ0ZMQUdTKSAkKF9MREZMQUdTKQorCSQoQ1JPU1NfQ09NUElMRSlzdHJpcCAtLXN0cmlwLWFsbCAkKEVYRSkKKworY2xlYW46CisJcm0gLWYgJChFWEUpCisKK3ByaW50X25hbWU6CisJQGVjaG8gJChNQUNISU5FX05BTUUpICQoT1NfTkFNRSkgJChDUk9TU19DT01QSUxFKSQoQ0NfTkFNRSkgYCQoQ1JPU1NfQ09NUElMRSkkKENDX05BTUUpIC1kdW1wdmVyc2lvbmAKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9NYWtlZmlsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3NmRlMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTEgQEAKK2luY2x1ZGUgLi4vLi4vYnVpbGQubWFrCitpbmNsdWRlICQoUEpESVIpL2J1aWxkL2NvbW1vbi5tYWsKKworZXhwb3J0IExJQkRJUiA6PSAuLi9saWIKK2V4cG9ydCBCSU5ESVIgOj0gLi4vYmluCisKK1JVTEVTX01BSyA6PSAkKFBKRElSKS9idWlsZC9ydWxlcy5tYWsKKworUEpMSUJfTElCOj0uLi8uLi9wamxpYi9saWIvbGlicGotJChUQVJHRVRfTkFNRSkkKExJQkVYVCkKK1BKTElCX1VUSUxfTElCOj0uLi8uLi9wamxpYi11dGlsL2xpYi9saWJwamxpYi11dGlsLSQoVEFSR0VUX05BTUUpJChMSUJFWFQpCitQSk5BVEhfTElCOj0uLi8uLi9wam5hdGgvbGliL2xpYnBqbmF0aC0kKFRBUkdFVF9OQU1FKSQoTElCRVhUKQorUEpNRURJQV9MSUI6PS4uLy4uL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtJChUQVJHRVRfTkFNRSkkKExJQkVYVCkKK1BKTUVESUFfQVVESU9ERVZfTElCOj0uLi8uLi9wam1lZGlhL2xpYi9saWJwam1lZGlhLWF1ZGlvZGV2LSQoVEFSR0VUX05BTUUpJChMSUJFWFQpCitQSk1FRElBX0NPREVDX0xJQjo9Li4vLi4vcGptZWRpYS9saWIvbGlicGptZWRpYS1jb2RlYy0kKFRBUkdFVF9OQU1FKSQoTElCRVhUKQorUEpTSVBfTElCOj0uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtJChUQVJHRVRfTkFNRSkkKExJQkVYVCkKK1BKU0lQX1VBX0xJQjo9Li4vLi4vcGpzaXAvbGliL2xpYnBqc2lwLXVhLSQoVEFSR0VUX05BTUUpJChMSUJFWFQpCitQSlNJUF9TSU1QTEVfTElCOj0uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtc2ltcGxlLSQoVEFSR0VUX05BTUUpJChMSUJFWFQpCitQSlNVQV9MSUJfTElCPS4uLy4uL3Bqc2lwL2xpYi9saWJwanN1YS0kKFRBUkdFVF9OQU1FKSQoTElCRVhUKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2F0aGVyIGFsbCBmbGFncy4KKyMKK2V4cG9ydCBfQ0ZMQUdTIAk6PSAkKENDX0NGTEFHUykgJChPU19DRkxBR1MpICQoSE9TVF9DRkxBR1MpICQoTV9DRkxBR1MpIFwKKwkJICAgJChQSl9DRkxBR1MpICQoQ0ZMQUdTKSAkKENDX0lOQykuLi8uLi9wanNpcC9pbmNsdWRlIFwKKwkJICAgJChDQ19JTkMpLi4vLi4vcGpsaWIvaW5jbHVkZSBcCisJCSAgICQoQ0NfSU5DKS4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSBcCisJCSAgICQoQ0NfSU5DKS4uLy4uL3BqbmF0aC9pbmNsdWRlIFwKKwkJICAgJChDQ19JTkMpLi4vLi4vcGptZWRpYS9pbmNsdWRlCitleHBvcnQgX0NYWEZMQUdTOj0gJChfQ0ZMQUdTKSAkKENDX0NYWEZMQUdTKSAkKE9TX0NYWEZMQUdTKSAkKE1fQ1hYRkxBR1MpIFwKKwkJICAgJChIT1NUX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorZXhwb3J0IF9MREZMQUdTIDo9ICQoQ0NfTERGTEFHUykgJChPU19MREZMQUdTKSAkKE1fTERGTEFHUykgJChIT1NUX0xERkxBR1MpIFwKKwkJICAgJChBUFBfTERGTEFHUykgJChBUFBfTERMSUJTKSAkKExERkxBR1MpIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZXMgZm9yIGJ1aWxkaW5nIFBKU1VBCisjCitleHBvcnQgUEpTVUFfU1JDRElSID0gLi4vc3JjL3Bqc3VhCitleHBvcnQgUEpTVUFfT0JKUyArPSAkKE9TX09CSlMpICQoTV9PQkpTKSAkKENDX09CSlMpICQoSE9TVF9PQkpTKSBcCisgICAgICAgICAgICBtYWluLm8gcGpzdWFfYXBwLm8gcGpzdWFfYXBwX2NsaS5vIHBqc3VhX2FwcF9jb21tb24ubyBcCisgICAgICAgICAgICBwanN1YV9hcHBfY29uZmlnLm8gcGpzdWFfYXBwX2xlZ2FjeS5vCitleHBvcnQgUEpTVUFfQ0ZMQUdTICs9ICQoX0NGTEFHUykKK2V4cG9ydCBQSlNVQV9DWFhGTEFHUyArPSAkKF9DWFhGTEFHUykKK2V4cG9ydCBQSlNVQV9MREZMQUdTICs9ICQoX0xERkxBR1MpCitleHBvcnQgUEpTVUFfRVhFOj1wanN1YS0kKFRBUkdFVF9OQU1FKSQoSE9TVF9FWEUpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWZpbmVzIGZvciBidWlsZGluZyBwanN5c3Rlc3QKKyMKK2V4cG9ydCBQSlNZU1RFU1RfU1JDRElSID0gLi4vc3JjL3Bqc3lzdGVzdAorZXhwb3J0IFBKU1lTVEVTVF9PQkpTICs9ICQoT1NfT0JKUykgJChNX09CSlMpICQoQ0NfT0JKUykgJChIT1NUX09CSlMpIFwKKwkJCXN5c3Rlc3QubyBtYWluX2NvbnNvbGUubworZXhwb3J0IFBKU1lTVEVTVF9DRkxBR1MgKz0gJChfQ0ZMQUdTKQorZXhwb3J0IFBKU1lTVEVTVF9DWFhGTEFHUyArPSAkKF9DWFhGTEFHUykKK2V4cG9ydCBQSlNZU1RFU1RfTERGTEFHUyArPSAkKF9MREZMQUdTKQorZXhwb3J0IFBKU1lTVEVTVF9FWEU6PXBqc3lzdGVzdC0kKFRBUkdFVF9OQU1FKSQoSE9TVF9FWEUpCisKKworZXhwb3J0IENDX09VVCBDQyBBUiBSQU5MSUIgSE9TVF9NViBIT1NUX1JNIEhPU1RfUk1ESVIgSE9TVF9NS0RJUiBPQkpFWFQgTEQgTERPVVQgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1haW4gZW50cnkKKyMKKyMKKyMgIHggICB4ICB4ICB4ICB4ICB4ICB4ICAgeCAgeCAgeCAgeCAgeCAgeCAgIHggIHggIHggIHggIHggIHggICB4ICB4ICB4ICB4ICB4CisjCisjICAgICAgICAgICAgICAgIEZJWCBUSElTCisjCisjICB4ICAgeCAgeCAgeCAgeCAgeCAgeCAgIHggIHggIHggIHggIHggIHggICB4ICB4ICB4ICB4ICB4ICB4ICAgeCAgeCAgeCAgeCAgeAorVEFSR0VUUyA6PSAkKEJJTkRJUikvJChQSlNVQV9FWEUpICQoQklORElSKS8kKFBKU1lTVEVTVF9FWEUpIHNhbXBsZXMKKworYWxsOiAkKFRBUkdFVFMpCisKK3N3aWc6CisJJChNQUtFKSAtQyAuLi9zcmMvc3dpZworCQorZG9jOgorCitkZXA6IGRlcGVuZAorZGlzdGNsZWFuOiByZWFsY2xlYW4KKworLlBIT05ZOiBhbGwgZGVwIGRlcGVuZCBjbGVhbiByZWFsY2xlYW4gZGlzdGNsZWFuCisuUEhPTlk6ICQoVEFSR0VUUykKKy5QSE9OWTogJChQSlNVQV9FWEUpICQoUEpTWVNURVNUX0VYRSkKKworcGpzdWE6ICQoUEpTVUFfRVhFKQorJChQSlNVQV9FWEUpOgorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSlNVQSBhcHA9cGpzdWEgJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwkKEJJTkRJUikvJEApCisKK3Bqc3lzdGVzdDogJChQSlNZU1RFU1RfRVhFKQorJChQSlNZU1RFU1RfRVhFKToKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpTWVNURVNUIGFwcD1wanN5c3Rlc3QgJChzdWJzdCAvLCQoSE9TVF9QU0VQKSwkKEJJTkRJUikvJEApCisKK3NhbXBsZXM6CisJJChNQUtFKSAtZiBTYW1wbGVzLm1haworCisuUEhPTlk6IHBqc3VhLmtvCitwanN1YS5rbzoKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpTVUEgYXBwPXBqc3VhICQoc3Vic3QgLywkKEhPU1RfUFNFUCksJChMSUJESVIpLyRAKQorCitjbGVhbiBkZXBlbmQgcmVhbGNsZWFuOgorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1QSlNVQSBhcHA9cGpzdWEgJEAKKwkkKE1BS0UpIC1mICQoUlVMRVNfTUFLKSBBUFA9UEpTWVNURVNUIGFwcD1wanN5c3Rlc3QgJEAKKwkkKE1BS0UpIC1mIFNhbXBsZXMubWFrICRACisJQGlmIHRlc3QgIiRAIiA9ICJkZXBlbmQiOyB0aGVuIFwKKwkgIGVjaG8gJyQoQklORElSKS8kKFBKU1VBX0VYRSk6ICQoQVBQX0xJQl9GSUxFUyknID4+IC5wanN1YS0kKFRBUkdFVF9OQU1FKS5kZXBlbmQ7IFwKKwkgIGVjaG8gJyQoQklORElSKS8kKFBKU1lTVEVTVF9FWEUpOiAkKEFQUF9MSUJfRklMRVMpJyA+PiAucGpzeXN0ZXN0LSQoVEFSR0VUX05BTUUpLmRlcGVuZDsgXAorCWZpCisKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL1NhbXBsZXMtdmMubWFrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9TYW1wbGVzLXZjLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ5NzBmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9TYW1wbGVzLXZjLm1hawpAQCAtMCwwICsxLDEyNCBAQAorCitMSUJFWFQgPSAubGliCisKKyFpZiAiJChBUkNIKSIgPT0gIndpbjY0IgorVEFSR0VUID0geDg2XzY0LXg2NC12YyQoVkNfVkVSKS0kKEJVSUxEX01PREUpCitUQVJHRVRfRkxBR1MgPSAvRFBKX1dJTjY0PTEgL0RQSl9NX1g4Nl82ND0xIAorIWVsc2UKKworVEFSR0VUID0gaTM4Ni13aW4zMi12YyQoVkNfVkVSKS0kKEJVSUxEX01PREUpCitUQVJHRVRfRkxBR1MgPSAvRFBKX1dJTjMyPTEgL0RQSl9NX0kzODY9MSAKKyFlbmRpZgorCishaWYgIiQoQlVJTERfTU9ERSkiID09ICJkZWJ1ZyIKK0JVSUxEX0ZMQUdTID0gL01UZCAvT2QgL1ppIC9XNAorIWVsc2VpZiAiJChCVUlMRF9NT0RFKSIgPT0gImRlYnVnLXN0YXRpYyIKK0JVSUxEX0ZMQUdTID0gL01UZCAvT2QgL1ppIC9XNAorIWVsc2VpZiAiJChCVUlMRF9NT0RFKSIgPT0gImRlYnVnLWR5bmFtaWMiCitCVUlMRF9GTEFHUyA9IC9NRGQgL09kIC9aaSAvVzQKKyFlbHNlaWYgIiQoQlVJTERfTU9ERSkiID09ICJyZWxlYXNlLXN0YXRpYyIKK0JVSUxEX0ZMQUdTID0gL094IC9NVCAvRE5ERUJVRyAvVzQKKyFlbHNlCitCVUlMRF9GTEFHUyA9IC9PeCAvTUQgL0ROREVCVUcgL1c0CishZW5kaWYKKworUEpMSUJfTElCID0gLi5cLi5ccGpsaWJcbGliXHBqbGliLSQoVEFSR0VUKSQoTElCRVhUKQorUEpMSUJfVVRJTF9MSUIgPSAuLlwuLlxwamxpYi11dGlsXGxpYlxwamxpYi11dGlsLSQoVEFSR0VUKSQoTElCRVhUKQorUEpOQVRIX0xJQiA9IC4uXC4uXHBqbmF0aFxsaWJccGpuYXRoLSQoVEFSR0VUKSQoTElCRVhUKQorUEpNRURJQV9MSUIgPSAuLlwuLlxwam1lZGlhXGxpYlxwam1lZGlhLSQoVEFSR0VUKSQoTElCRVhUKQorUEpNRURJQV9DT0RFQ19MSUIgPSAuLlwuLlxwam1lZGlhXGxpYlxwam1lZGlhLWNvZGVjLSQoVEFSR0VUKSQoTElCRVhUKQorUEpNRURJQV9BVURJT0RFVl9MSUIgPSAuLlwuLlxwam1lZGlhXGxpYlxwam1lZGlhLWF1ZGlvZGV2LSQoVEFSR0VUKSQoTElCRVhUKQorUEpNRURJQV9WSURFT0RFVl9MSUIgPSAuLlwuLlxwam1lZGlhXGxpYlxwam1lZGlhLXZpZGVvZGV2LSQoVEFSR0VUKSQoTElCRVhUKQorUEpTSVBfTElCID0gLi5cLi5ccGpzaXBcbGliXHBqc2lwLWNvcmUtJChUQVJHRVQpJChMSUJFWFQpCitQSlNJUF9VQV9MSUIgPSAuLlwuLlxwanNpcFxsaWJccGpzaXAtdWEtJChUQVJHRVQpJChMSUJFWFQpCitQSlNJUF9TSU1QTEVfTElCID0gLi5cLi5ccGpzaXBcbGliXHBqc2lwLXNpbXBsZS0kKFRBUkdFVCkkKExJQkVYVCkKK1BKU1VBX0xJQl9MSUIgPSAuLlwuLlxwanNpcFxsaWJccGpzdWEtbGliLSQoVEFSR0VUKSQoTElCRVhUKQorCitHU01fTElCID0gLi5cLi5cdGhpcmRfcGFydHlcbGliXGxpYmdzbWNvZGVjLSQoVEFSR0VUKSQoTElCRVhUKQorSUxCQ19MSUIgPSAuLlwuLlx0aGlyZF9wYXJ0eVxsaWJcbGliaWxiY2NvZGVjLSQoVEFSR0VUKSQoTElCRVhUKQorUE9SVEFVRElPX0xJQiA9IC4uXC4uXHRoaXJkX3BhcnR5XGxpYlxsaWJwb3J0YXVkaW8tJChUQVJHRVQpJChMSUJFWFQpCitSRVNBTVBMRV9MSUIgPSAuLlwuLlx0aGlyZF9wYXJ0eVxsaWJcbGlicmVzYW1wbGUtJChUQVJHRVQpJChMSUJFWFQpCitTUEVFWF9MSUIgPSAuLlwuLlx0aGlyZF9wYXJ0eVxsaWJcbGlic3BlZXgtJChUQVJHRVQpJChMSUJFWFQpCitTUlRQX0xJQiA9IC4uXC4uXHRoaXJkX3BhcnR5XGxpYlxsaWJzcnRwLSQoVEFSR0VUKSQoTElCRVhUKQorRzcyMjFfTElCID0gLi5cLi5cdGhpcmRfcGFydHlcbGliXGxpYmc3MjIxY29kZWMtJChUQVJHRVQpJChMSUJFWFQpCitCQVNFQ0xBU1NFU19MSUIgPSAuLlwuLlx0aGlyZF9wYXJ0eVxsaWJcbGliYmFzZWNsYXNzZXMtJChUQVJHRVQpJChMSUJFWFQpCisKK1RISVJEX1BBUlRZX0xJQlMgPSAkKEdTTV9MSUIpICQoSUxCQ19MSUIpICQoUE9SVEFVRElPX0xJQikgJChSRVNBTVBMRV9MSUIpIFwKKwkJCQkgICAkKFNQRUVYX0xJQikgJChTUlRQX0xJQikgJChHNzIyMV9MSUIpICQoQkFTRUNMQVNTRVNfTElCKQorCitMSUJTID0gJChQSlNVQV9MSUJfTElCKSAkKFBKU0lQX1VBX0xJQikgJChQSlNJUF9TSU1QTEVfTElCKSBcCisJICAkKFBKU0lQX0xJQikgJChQSk1FRElBX0NPREVDX0xJQikgJChQSk1FRElBX0FVRElPREVWX0xJQikgXAorCSAgJChQSk1FRElBX1ZJREVPREVWX0xJQikgXAorCSAgJChQSk1FRElBX0xJQikgJChQSk5BVEhfTElCKSAkKFBKTElCX1VUSUxfTElCKSAkKFBKTElCX0xJQikgXAorCSAgJChUSElSRF9QQVJUWV9MSUJTKQorCitDRkxBR1MgCT0gJChUQVJHRVRfRkxBR1MpIFwKKwkgICQoQlVJTERfRkxBR1MpIFwKKwkgIC1JLi5cLi5ccGpzaXBcaW5jbHVkZSBcCisJICAtSS4uXC4uXHBqbGliXGluY2x1ZGUgXAorCSAgLUkuLlwuLlxwamxpYi11dGlsXGluY2x1ZGUgXAorCSAgLUkuLlwuLlxwam1lZGlhXGluY2x1ZGUgXAorCSAgLUkuLlwuLlxwam5hdGgvaW5jbHVkZQorTERGTEFHUyA9ICQoQlVJTERfRkxBR1MpICQoTElCUykgXAorCSAgSXBobHBhcGkubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgXAorCSAgbXN3c29jay5saWIgd3MyXzMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIG9sZWF1dDMyLmxpYgorCitTUkNESVIgPSAuLlxzcmNcc2FtcGxlcworT0JKRElSID0gLlxvdXRwdXRcc2FtcGxlcy0kKFRBUkdFVCkKK0JJTkRJUiA9IC4uXGJpblxzYW1wbGVzXCQoVEFSR0VUKQorCisKK1NBTVBMRVMgPSAkKEJJTkRJUilcYXVkZGVtby5leGUgXAorCSAgJChCSU5ESVIpXGFlY3Rlc3QuZXhlIFwKKwkgICQoQklORElSKVxhdmlwbGF5LmV4ZSBcCisJICAkKEJJTkRJUilcY2xpZGVtby5leGUgXAorCSAgJChCSU5ESVIpXGNvbmZzYW1wbGUuZXhlIFwKKwkgICQoQklORElSKVxjb25mYmVuY2guZXhlIFwKKwkgICQoQklORElSKVxlbmNkZWMuZXhlIFwKKwkgICQoQklORElSKVxodHRwZGVtby5leGUgXAorCSAgJChCSU5ESVIpXGljZWRlbW8uZXhlIFwKKwkgICQoQklORElSKVxqYnNpbS5leGUgXAorCSAgJChCSU5ESVIpXGxhdGVuY3kuZXhlIFwKKwkgICQoQklORElSKVxsZXZlbC5leGUgXAorCSAgJChCSU5ESVIpXG1peC5leGUgXAorCSAgJChCSU5ESVIpXHBjYXB1dGlsLmV4ZVwKKwkgICQoQklORElSKVxwanNpcC1wZXJmLmV4ZSBcCisJICAkKEJJTkRJUilccGxheWZpbGUuZXhlIFwKKwkgICQoQklORElSKVxwbGF5c2luZS5leGVcCisJICAkKEJJTkRJUilccmVjZmlsZS5leGUgIFwKKwkgICQoQklORElSKVxyZXNhbXBsZXBsYXkuZXhlIFwKKwkgICQoQklORElSKVxzaW1wbGV1YS5leGUgXAorCSAgJChCSU5ESVIpXHNpbXBsZV9wanN1YS5leGUgXAorCSAgJChCSU5ESVIpXHNpcGVjaG8uZXhlIFwKKwkgICQoQklORElSKVxzaXBydHAuZXhlIFwKKwkgICQoQklORElSKVxzaXBzdGF0ZWxlc3MuZXhlIFwKKwkgICQoQklORElSKVxzdGF0ZWZ1bF9wcm94eS5leGUgXAorCSAgJChCSU5ESVIpXHN0YXRlbGVzc19wcm94eS5leGUgXAorCSAgJChCSU5ESVIpXHN0ZXJlb3Rlc3QuZXhlIFwKKwkgICQoQklORElSKVxzdHJlYW11dGlsLmV4ZSBcCisJICAkKEJJTkRJUilcc3RyZXJyb3IuZXhlIFwKKwkgICQoQklORElSKVx0b25lZ2VuLmV4ZSBcCisJICAkKEJJTkRJUilcdmlkX3N0cmVhbXV0aWwuZXhlCisKKworYWxsOiAkKEJJTkRJUikgJChPQkpESVIpICQoU0FNUExFUykKKworJChTQU1QTEVTKTogJChTUkNESVIpXCQoQEIpLmMgJChMSUJTKSAkKFNSQ0RJUilcdXRpbC5oIFNhbXBsZXMtdmMubWFrCisJY2wgLW5vbG9nbyAtYyAkKFNSQ0RJUilcJChAQikuYyAvRm8kKE9CSkRJUilcJChAQikub2JqICQoQ0ZMQUdTKSAKKwljbCAvbm9sb2dvICQoT0JKRElSKVwkKEBCKS5vYmogL0ZlJEAgL0ZtJChPQkpESVIpXCQoQEIpLm1hcCAkKExERkxBR1MpCisJQHJlbSB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyBpcyBqdXN0IGZvciBjbGVhbmluZyB1cCB0aGUgJ2JpbicgZGlyZWN0b3J5CisJaWYgZXhpc3QgJChCSU5ESVIpXCouaWxrIGRlbCAvUSAkKEJJTkRJUilcKi5pbGsKKwlpZiBleGlzdCAkKEJJTkRJUilcKi5wZGIgZGVsIC9RICQoQklORElSKVwqLnBkYgorCiskKEJJTkRJUik6CisJaWYgbm90IGV4aXN0ICQoQklORElSKSBta2RpciAkKEJJTkRJUikKKworJChPQkpESVIpOgorCWlmIG5vdCBleGlzdCAkKE9CSkRJUikgbWtkaXIgJChPQkpESVIpCisKK2NsZWFuOgorCWVjaG8gQ2xlYW5pbmcgdXAgc2FtcGxlcy4uLgorCWlmIGV4aXN0ICQoQklORElSKSBkZWwgL1EgJChCSU5ESVIpXCoKKwlpZiBleGlzdCAkKEJJTkRJUikgcm1kaXIgJChCSU5ESVIpCisJaWYgZXhpc3QgJChPQkpESVIpIGRlbCAvUSAkKE9CSkRJUilcKi4qCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvU2FtcGxlcy5tYWsgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL1NhbXBsZXMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDI1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL1NhbXBsZXMubWFrCkBAIC0wLDAgKzEsNjggQEAKK2luY2x1ZGUgLi4vLi4vYnVpbGQubWFrCitpbmNsdWRlIC4uLy4uL3ZlcnNpb24ubWFrCitpbmNsdWRlIC4uLy4uL2J1aWxkL2NvbW1vbi5tYWsKKworUlVMRVNfTUFLIDo9ICQoUEpESVIpL2J1aWxkL3J1bGVzLm1haworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdhdGhlciBhbGwgZmxhZ3MuCisjCitleHBvcnQgX0NGTEFHUyAJOj0gJChQSl9DRkxBR1MpICQoQ0ZMQUdTKQorZXhwb3J0IF9DWFhGTEFHUzo9ICQoUEpfQ1hYRkxBR1MpCitleHBvcnQgX0xERkxBR1MgOj0gJChQSl9MREZMQUdTKSAkKFBKX0xETElCUykgJChMREZMQUdTKQorCitTUkNESVIgOj0gLi4vc3JjL3NhbXBsZXMKK09CSkRJUiA6PSAuL291dHB1dC9zYW1wbGVzLSQoVEFSR0VUX05BTUUpCitCSU5ESVIgOj0gLi4vYmluL3NhbXBsZXMvJChUQVJHRVRfTkFNRSkKKworU0FNUExFUyA6PSBhdWRkZW1vIFwKKwkgICBhdmlwbGF5IFwKKwkgICBhZWN0ZXN0IFwKKwkgICBjbGlkZW1vIFwKKwkgICBjb25mc2FtcGxlIFwKKwkgICBlbmNkZWMgXAorCSAgIGh0dHBkZW1vIFwKKwkgICBpY2VkZW1vIFwKKwkgICBqYnNpbSBcCisJICAgbGF0ZW5jeSBcCisJICAgbGV2ZWwgXAorCSAgIG1peCBcCisJICAgcGpzaXAtcGVyZiBcCisJICAgcGNhcHV0aWwgXAorCSAgIHBqc3VhMl9kZW1vIFwKKwkgICBwbGF5ZmlsZSBcCisJICAgcGxheXNpbmUgXAorCSAgIHJlY2ZpbGUgXAorCSAgIHJlc2FtcGxlcGxheSBcCisJICAgc2ltcGxldWEgXAorCSAgIHNpbXBsZV9wanN1YSBcCisJICAgc2lwZWNobyBcCisJICAgc2lwcnRwIFwKKwkgICBzaXBzdGF0ZWxlc3MgXAorCSAgIHN0YXRlZnVsX3Byb3h5IFwKKwkgICBzdGF0ZWxlc3NfcHJveHkgXAorCSAgIHN0ZXJlb3Rlc3QgXAorCSAgIHN0cmVhbXV0aWwgXAorCSAgIHN0cmVycm9yIFwKKwkgICB0b25lZ2VuIFwKKwkgICB2aWRfc3RyZWFtdXRpbAorCitFWEVTIDo9ICQoZm9yZWFjaCBmaWxlLCAkKFNBTVBMRVMpLCAkKGZpbGUpJChIT1NUX0VYRSkpCisKKy5QSE9OWTogJChFWEVTKQorCithbGw6ICQoRVhFUykKKworJChFWEVTKToKKwkkKE1BS0UpIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mICQoUlVMRVNfTUFLKSBTQU1QTEVfU1JDRElSPSQoU1JDRElSKSBTQU1QTEVfT0JKUz0kQC5vIFNBTVBMRV9DRkxBR1M9IiQoX0NGTEFHUykiIFNBTVBMRV9DWFhGTEFHUz0iJChfQ1hYRkxBR1MpIiBTQU1QTEVfTERGTEFHUz0iJChfTERGTEFHUykgLWxzdGRjKysiIFNBTVBMRV9FWEU9JEAgQVBQPVNBTVBMRSBhcHA9c2FtcGxlICQoc3Vic3QgLywkKEhPU1RfUFNFUCksJChCSU5ESVIpLyRAKQorCitkZXBlbmQ6CisKK2NsZWFuOgorCSQoTUFLRSkgLWYgJChSVUxFU19NQUspIEFQUD1TQU1QTEUgYXBwPXNhbXBsZSAkQAorCSQoc3Vic3QgQEAsJChFWEVTKSwkKEhPU1RfUk0pKQorCSQoc3Vic3QgQEAsJChCSU5ESVIpLCQoSE9TVF9STURJUikpCisKK2Rpc3RjbGVhbiByZWFsY2xlYW46IGNsZWFuCisJJChNQUtFKSAtZiAkKFJVTEVTX01BSykgQVBQPVNBTVBMRSBhcHA9c2FtcGxlICRACisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvZHVtbXkuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2I5YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9kdW1teS5jCkBAIC0wLDAgKzEsOSBAQAorLyogJElkOiBkdW1teS5jIDI2NjAgMjAwOS0wNC0yOCAxOTozODo0M1ogbmFuYW5nICQgKi8KKworLyoqCisgKiBUaGlzIGlzIGFuIGVtcHR5IEMgZmlsZSBmb3IgaGVscGluZyBsaWJwanByb2plY3Qgc28gaXQgZ2V0cyBidWlsdCBwcm9wZXJseS4KKyAqLworCisjaWZkZWYgX01TQ19WRVIKKyMgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MjA2KSAgICAvLyB0cmFuc2xhdGlvbiB1bml0IGlzIGVtcHR5CisjZW5kaWYKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvZ2V0LWZvb3RwcmludC5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvZ2V0LWZvb3RwcmludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM2YzBjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9nZXQtZm9vdHByaW50LnB5CkBAIC0wLDAgKzEsMzM4IEBACisjICRJZDogZ2V0LWZvb3RwcmludC5weSAxMzUyIDIwMDctMDYtMDggMDE6NDE6MjVaIGJlbm55bHAgJAorIyAKKyMgVGhpcyBmaWxlIGlzIHVzZWQgdG8gZ2VuZXJhdGUgUEpTSVAvUEpNRURJQSBmb290cHJpbnQgcmVwb3J0LgorIyBUbyB1c2UgdGhpcyBmaWxlLCBqdXN0IHJ1biBpdCBpbiBwanNpcC1hcHBzL2J1aWxkIGRpcmVjdG9yeSwgdG8KKyMgcHJvZHVjZSBmb290cHJpbnQudHh0IGFuZCBmb290cHJpbnQuaHRtIHJlcG9ydCBmaWxlcy4KKyMKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IHRpbWUKKworY29tcGlsZV9mbGFnczEgPSBbCisgICAgIyBCYXNlCisgICAgWydCQVNFJywJCQknRW1wdHkgYXBwbGljYXRpb24gc2l6ZSddLAorICAgIFsnJywJCQknU3VidG90YWw6IEVtcHR5IGFwcGxpY2F0aW9uIHNpemUnXSwKKworICAgIFsnSEFTX1BKTElCJywgCQknTWluaW11bSBQSkxJQiBvbmx5J10sCisKKyAgICAjIFN1YnRvdGFsCisgICAgWycnLAkJCSdTdWJ0b3RhbCddLAorCisgICAgIyBQSkxJQi1VVElMCisgICAgWydIQVNfUEpMSUJfU1RVTicsCQknU1RVTiBjbGllbnQnXSwKKyAgICBbJ0hBU19QSkxJQl9HRVRPUFQnLAknZ2V0b3B0KCkgZnVuY3Rpb25hbGl0eSddLAorICAgIAorICAgICMgU3VidG90YWwKKyAgICBbJycsCQkJJ1RPVEFMJ10KK10KKworY29tcGlsZV9mbGFncyA9IFsKKyAgICAjIEJhc2UKKyAgICBbJ0JBU0UnLAkJCSdFbXB0eSBhcHBsaWNhdGlvbiBzaXplJ10sCisgICAgWycnLCAJCQknU3VidG90YWw6IGVtcHR5IGFwcGxpY2F0aW9uIHNpemUgb24gdGhpcyBwbGF0Zm9ybSddLAorCisgICAgWydIQVNfUEpMSUInLCAJCSdQSkxJQiAocG9vbCwgZGF0YSBzdHJ1Y3R1cmVzLCBoYXNoIHRhYmxlcywgaW9xdWV1ZSwgc29ja2V0LCB0aW1lciBoZWFwLCBldGMuKS4gJyArCisJCQkgICAgICAgICdGb3IgdGFyZ2V0cyB0aGF0IHN0YXRpY2FsbHkgbGluayBhcHBsaWNhdGlvbiB3aXRoIExJQkMsIHRoZSBzaXplIGluY2x1ZGVzICcgKworCQkJICAgICAgICAndmFyaW91cyBMSUJDIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IFBKTElCLiddLAorICAgIFsnJywgCQkJJ1N1YnRvdGFsOiBBcHBsaWNhdGlvbiBsaW5rZWQgd2l0aCBQSkxJQiddLAorCisgICAgIyBQSkxJQi1VVElMCisgICAgWydIQVNfUEpMSUJfU1RVTicsCQknUEpMSUItVVRJTCBTVFVOIGNsaWVudCddLAorICAgIFsnSEFTX1BKTElCX0dFVE9QVCcsCSdQSkxJQi1VVElMIGdldG9wdCgpIGZ1bmN0aW9uYWxpdHknXSwKKyAgICBbJ0hBU19QSkxJQl9TQ0FOTkVSJywJJ1BKTElCLVVUSUwgdGV4dCBzY2FubmVyIChuZWVkZWQgYnkgU0lQIHBhcnNlciknXSwKKyAgICBbJ0hBU19QSkxJQl9YTUwnLAkJJ1BKTElCLVVUSUwgdGlueSBYTUwgKHBhcnNpbmcgYW5kIEFQSSkgKG5lZWRzIHRleHQgc2Nhbm5lciknXSwKKyAgICBbJ0hBU19QSkxJQl9ETlMnLAkJJ1BKTElCLVVUSUwgRE5TIHBhY2tldCBhbmQgcGFyc2luZyddLAorICAgIFsnSEFTX1BKTElCX1JFU09MVkVSJywJJ1BKTElCLVVUSUwgQXN5bmNocm9ub3VzIEROUyByZXNvbHZlci9jYWNoaW5nIGVuZ2luZSddLAorICAgIFsnSEFTX1BKTElCX0NSQzMyJywJCSdQSkxJQi1VVElMIENSQzMyIGFsZ29yaXRobSddLAorICAgIFsnSEFTX1BKTElCX0hNQUNfTUQ1JywJJ1BKTElCLVVUSUwgSE1BQy1NRDUgYWxnb3JpdGhtJ10sCisgICAgWydIQVNfUEpMSUJfSE1BQ19TSEExJywJJ1BKTElCLVVUSUwgSE1BQy1TSEExIGFsZ29yaXRobSddLAorCisgICAgIyBQSlNJUAorICAgIFsnSEFTX1BKU0lQX0NPUkVfTVNHX0VMRU0nLAknUEpTSVAgQ29yZSAtIE1lc3NhZ2luZyBFbGVtZW50cyBhbmQgUGFyc2luZyAobWVzc2FnZSwgaGVhZGVycywgU0lQIFVSSSwgVEVMIFVSSS9SRkMgMzk2NiwgZXRjLiknXSwKKyAgICBbJ0hBU19QSlNJUF9DT1JFJywJCSdQSlNJUCBDb3JlIC0gRW5kcG9pbnQgKHRyYW5zcG9ydCBtYW5hZ2VtZW50LCBtb2R1bGUgbWFuYWdlbWVudCwgZXZlbnQgZGlzdHJpYnV0aW9uLCBldGMuKSddLAorICAgIFsnSEFTX1BKU0lQX0NPUkVfTVNHX1VUSUwnLAknUEpTSVAgQ29yZSAtIFN0YXRlbGVzcyBvcGVyYXRpb25zLCBTSVAgU1JWLCBzZXJ2ZXIgcmVzb2x1dGlvbiBhbmQgZmFpbC1vdmVyJ10sCisgICAgWydIQVNfUEpTSVBfVURQX1RSQU5TUE9SVCcsCSdQSlNJUCBVRFAgdHJhbnNwb3J0J10sCisgICAgWycnLAkJCSdTdWJ0b3RhbDogQSBtaW5pbWFsaXN0aWMgU0lQIGFwcGxpY2F0aW9uIChwYXJzaW5nLCBVRFAgdHJhbnNwb3J0K1NUVU4sIG5vIHRyYW5zYWN0aW9uKSddLAorICAgCisgICAgWydIQVNfUEpTSVBfVENQX1RSQU5TUE9SVCcsCSdQSlNJUCBUQ1AgdHJhbnNwb3J0J10sCisgICAgWydIQVNfUEpTSVBfVExTX1RSQU5TUE9SVCcsCSdQSlNJUCBUTFMgdHJhbnNwb3J0J10sCisgICAgWydIQVNfUEpTSVBfSU5GTycsCQknUEpTSVAgSU5GTyBzdXBwb3J0IChSRkMgMjk3NikgKG5vIHNwZWNpYWwgdHJlYXRtZW50LCB0aHVzIHRoZSB6ZXJvIHNpemUpJ10sCisgICAgWydIQVNfUEpTSVBfVFJBTlNBQ1RJT04nLAknUEpTSVAgdHJhbnNhY3Rpb24gYW5kIHN0YXRlZnVsIEFQSSddLAorICAgIFsnSEFTX1BKU0lQX0FVVEhfQ0xJRU5UJywJJ1BKU0lQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBjbGllbnQnXSwKKyAgICBbJ0hBU19QSlNJUF9VQV9MQVlFUicsCSdQSlNJUCBVc2VyIGFnZW50IGxheWVyIGFuZCBiYXNlIGRpYWxvZyBhbmQgdXNhZ2UgbWFuYWdlbWVudCAoZHJhZnQtaWV0Zi1zaXBwaW5nLWRpYWxvZ3VzYWdlLTAxKSddLAorICAgIFsnSEFTX1BKTUVESUFfU0RQJywJCSdQSk1FRElBIFNEUCBQYXJzaW5nIGFuZCBBUEkgKFJGQyAyMzI3KSwgbmVlZGVkIGJ5IFNEUCBuZWdvdGlhdG9yJ10sCisgICAgWydIQVNfUEpNRURJQV9TRFBfTkVHT1RJQVRPUicsJ1BKTUVESUEgU0RQIG5lZ290aWF0b3IgKFJGQyAzMjY0KSwgbmVlZGVkIGJ5IElOVklURSBzZXNzaW9uJ10sCisgICAgWydIQVNfUEpTSVBfSU5WX1NFU1NJT04nLAknUEpTSVAgSU5WSVRFIHNlc3Npb24gQVBJJ10sCisgICAgWydIQVNfUEpTSVBfUkVHQycsCQknUEpTSVAgY2xpZW50IHJlZ2lzdHJhdGlvbiBBUEknXSwKKyAgICBbJycsCQkJJ1N1YnRvdGFsOiBNaW5pbWFsIFNJUCBhcHBsaWNhdGlvbiB3aXRoIHJlZ2lzdHJhdGlvbiAoaW5jbHVkaW5nIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiknXSwKKyAgICAKKyAgICBbJ0hBU19QSlNJUF9FVkVOVF9GUkFNRVdPUksnLCdQSlNJUCBFdmVudC9TVUJTQ1JJQkUgZnJhbWV3b3JrLCBSRkMgMzI2NSAobmVlZGVkIGJ5IGNhbGwgdHJhbnNmZXIsIGFuZCBwcmVzZW5jZSknXSwKKyAgICBbJ0hBU19QSlNJUF9DQUxMX1RSQU5TRkVSJywJJ1BKU0lQIENhbGwgVHJhbnNmZXIvUkVGRVIgc3VwcG9ydCAoUkZDIDM1MTUpJ10sCisgICAgWycnLAkJCSdTdWJ0b3RhbDogTWluaW1hbCBTSVAgYXBwbGljYXRpb24gd2l0aCBjYWxsIHRyYW5zZmVyJ10sCisKKworICAgIFsnSEFTX1BKU0lQX1BSRVNFTkNFJywJJ1BKU0lQIFByZXNlbmNlIHN1YnNjcmlwdGlvbiwgaW5jbHVkaW5nIFBJREYvWC1QSURGIHN1cHBvcnQgKFJGQyAzODU2LCBSRkMgMzg2MywgZXRjKSAobmVlZHMgWE1MKSddLAorICAgIFsnSEFTX1BKU0lQX01FU1NBR0UnLAknUEpTSVAgSW5zdGFudCBNZXNzYWdpbmcvTUVTU0FHRSBzdXBwb3J0IChSRkMgMzQyOCkgKG5vIHNwZWNpYWwgdHJlYXRtZW50LCB0aHVzIHRoZSB6ZXJvIHNpemUpJ10sCisgICAgWydIQVNfUEpTSVBfSVNfQ09NUE9TSU5HJywJJ1BKU0lQIE1lc3NhZ2UgQ29tcG9zaXRpb24gaW5kaWNhdGlvbiAoUkZDIDM5OTQpJ10sCisKKyAgICAjIFN1YnRvdGFsCisgICAgWycnLAkJCSdTdWJ0b3RhbDogQ29tcGxldGUgUEpTSVAgcGFja2FnZSAoY2FsbCwgcmVnaXN0cmF0aW9uLCBwcmVzZW5jZSwgSU0pICtTVFVOICtHRVRPUFQgKCtQSkxJQiksIG5vIG1lZGlhJ10sCisgICAgCisgICAgIyBQSk5BVEgKKyAgICBbJ0hBU19QSk5BVEhfU1RVTicsCQknUEpOQVRIIFNUVU4nXSwKKyAgICBbJ0hBU19QSk5BVEhfSUNFJywJCSdQSk5BVEggSUNFJ10sCisKKyAgICAjIFBKTUVESUEKKyAgICBbJ0hBU19QSk1FRElBX0VDJywJCSdQSk1FRElBIGFjY291c3RpYyBlY2hvIGNhbmNlbGxhdGlvbiddLAorICAgIFsnSEFTX1BKTUVESUFfU05EX0RFVicsCSdQSk1FRElBIHNvdW5kIGRldmljZSBiYWNrZW5kIChwbGF0Zm9ybSBzcGVjaWZpYyknXSwKKyAgICBbJ0hBU19QSk1FRElBX1NJTEVOQ0VfREVUJywJJ1BKTUVESUEgQWRhcHRpdmUgc2lsZW5jZSBkZXRlY3RvciddLAorICAgIFsnSEFTX1BKTUVESUEnLAkJJ1BKTUVESUEgZW5kcG9pbnQnXSwKKyAgICBbJ0hBU19QSk1FRElBX1BMQycsCQknUEpNRURJQSBQYWNrZXQgTG9zdCBDb25jZWFsbWVudCBpbXBsZW1lbnRhdGlvbiAobmVlZGVkIGJ5IEcuNzExLCBHU00sIGFuZCBzb3VuZCBkZXZpY2UgcG9ydCknXSwKKyAgICBbJ0hBU19QSk1FRElBX1NORF9QT1JUJywJJ1BKTUVESUEgc291bmQgZGV2aWNlIG1lZGlhIHBvcnQnXSwKKyAgICBbJ0hBU19QSk1FRElBX1JFU0FNUExFJywJJ1BKTUVESUEgcmVzYW1wbGluZyBhbGdvcml0aG0gKGxhcmdlIGZpbHRlciBkaXNhYmxlZCknXSwKKyAgICBbJ0hBU19QSk1FRElBX0c3MTFfQ09ERUMnLAknUEpNRURJQSBHLjcxMSBjb2RlYyAoUENNQS9QQ01VLCBpbmNsdWRpbmcgUExDKSAobWF5IGhhdmUgYWxyZWFkeSBiZWVuIGxpbmtlZCBieSBvdGhlciBtb2R1bGUpJ10sCisgICAgWydIQVNfUEpNRURJQV9DT05GRVJFTkNFJywJJ1BKTUVESUEgY29uZmVyZW5jZSBicmlkZ2UgKG5lZWRzIHJlc2FtcGxpbmcgYW5kIHNpbGVuY2UgZGV0ZWN0b3IpJ10sCisgICAgWydIQVNfUEpNRURJQV9NQVNURVJfUE9SVCcsCSdQSk1FRElBIG1hc3RlciBwb3J0J10sCisgICAgWydIQVNfUEpNRURJQV9SVFAnLAkJJ1BKTUVESUEgc3RhbmQtYWxvbmUgUlRQJ10sCisgICAgWydIQVNfUEpNRURJQV9SVENQJywJJ1BKTUVESUEgc3RhbmQtYWxvbmUgUlRDUCBhbmQgbWVkaWEgcXVhbGl0eSBjYWxjdWxhdGlvbiddLAorICAgIFsnSEFTX1BKTUVESUFfSkJVRicsCSdQSk1FRElBIHN0YW5kLWFsb25lIGFkYXB0aXZlIGppdHRlciBidWZmZXInXSwKKyAgICBbJ0hBU19QSk1FRElBX1NUUkVBTScsCSdQSk1FRElBIHN0cmVhbSBmb3IgcmVtb3RlIG1lZGlhIGNvbW11bmljYXRpb24gKG5lZWRzIFJUUCwgUlRDUCwgYW5kIGppdHRlciBidWZmZXIpJ10sCisgICAgWydIQVNfUEpNRURJQV9UT05FR0VOJywJJ1BKTUVESUEgdG9uZSBnZW5lcmF0b3InXSwKKyAgICBbJ0hBU19QSk1FRElBX1VEUF9UUkFOU1BPUlQnLCdQSk1FRElBIFVEUCBtZWRpYSB0cmFuc3BvcnQnXSwKKyAgICBbJ0hBU19QSk1FRElBX0ZJTEVfUExBWUVSJywJJ1BKTUVESUEgV0FWIGZpbGUgcGxheWVyJ10sCisgICAgWydIQVNfUEpNRURJQV9GSUxFX0NBUFRVUkUnLAknUEpNRURJQSBXQVYgZmlsZSB3cml0ZXInXSwKKyAgICBbJ0hBU19QSk1FRElBX01FTV9QTEFZRVInLAknUEpNRURJQSBmaXhlZCBidWZmZXIgcGxheWVyJ10sCisgICAgWydIQVNfUEpNRURJQV9NRU1fQ0FQVFVSRScsCSdQSk1FRElBIGZpeGVkIGJ1ZmZlciB3cml0ZXInXSwKKyAgICBbJ0hBU19QSk1FRElBX0lDRScsCQknUEpNRURJQSBJQ0UgdHJhbnNwb3J0J10sCisKKyAgICAjIFN1YnRvdGFsCisgICAgWycnLAkJCSdTdWJ0b3RhbDogQ29tcGxldGUgU0lQIGFuZCBhbGwgUEpNRURJQSBmZWF0dXJlcyAoRy43MTEgY29kZWMgb25seSknXSwKKyAgICAKKyAgICAjIENvZGVjcworICAgIFsnSEFTX1BKTUVESUFfR1NNX0NPREVDJywJJ1BKTUVESUEgR1NNIGNvZGVjIChpbmNsdWRpbmcgUExDKSddLAorICAgIFsnSEFTX1BKTUVESUFfU1BFRVhfQ09ERUMnLAknUEpNRURJQSBTcGVleCBjb2RlYyAobmFycm93YmFuZCwgd2lkZWJhbmQsIHVsdHJhLXdpZGViYW5kKSddLAorICAgIFsnSEFTX1BKTUVESUFfSUxCQ19DT0RFQycsCSdQSk1FRElBIGlMQkMgY29kZWMnXSwKKworICAgICMgVG90YWwKKyAgICBbJycsCQkJJ1RPVEFMOiBjb21wbGV0ZSBsaWJyYXJpZXMgKCthbGwgY29kZWNzKSddLAorXQorCisjIEV4ZWN1dGFibGUgc2l6ZSByZXBvcnQsIHR1cGxlIG9mOgorIyAgIDxhbGwgZmxhZ3M+LCA8ZmxhZ3MgYWRkZWQ+LCA8dGV4dCBzaXplPiwgPGRhdGE+LCA8YnNzPiwgPGRlc2NyaXB0aW9uPgorZXhlX3NpemUgPSBbXQorCisjCisjIFdyaXRlIHRoZSByZXBvcnQgdG8gdGV4dCBmaWxlCisjCitkZWYgcHJpbnRfdGV4dF9yZXBvcnQoZmlsZW5hbWUpOgorICAgIG91dHB1dCA9IG9wZW4oZmlsZW5hbWUsICd3JykKKworICAgIG91dHB1dC53cml0ZSgnUEpTSVAgYW5kIFBKTUVESUEgZm9vdHByaW50IHJlcG9ydFxuJykKKyAgICBvdXRwdXQud3JpdGUoJ0F1dG8tZ2VuZXJhdGVkIGJ5IHBqc2lwLWFwcHMvYnVpbGQvZ2V0LWZvb3RwcmludC5weVxuJykKKyAgICBvdXRwdXQud3JpdGUoJ1xuJykKKworICAgICMgV3JpdGUgUmV2aXNpb24gaW5mby4KKyAgICBmID0gb3MucG9wZW4oJ3N2biBpbmZvIHwgZ3JlcCBSZXZpc2lvbicpCisgICAgb3V0cHV0LndyaXRlKGYucmVhZGxpbmUoKSkKKworICAgIG91dHB1dC53cml0ZSgnRGF0ZTogJykKKyAgICBvdXRwdXQud3JpdGUodGltZS5hc2N0aW1lKCkpCisgICAgb3V0cHV0LndyaXRlKCdcbicpCisgICAgb3V0cHV0LndyaXRlKCdcbicpCisKKyAgICAjIFdyaXRlIGluZGl2aWR1YWwgbW9kdWxlIHNpemUKKyAgICBvdXRwdXQud3JpdGUoJ0Zvb3RwcmludCAoaW4gYnl0ZXMpOlxuJykKKyAgICBvdXRwdXQud3JpdGUoJyAgIC50ZXh0ICAgLmRhdGEgICAgLmJzcyAgICBNb2R1bGUgRGVzY3JpcHRpb25cbicpCisgICAgb3V0cHV0LndyaXRlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nKQorCQorICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihleGVfc2l6ZSkpOgorCWUgPSBleGVfc2l6ZVtpXQorCXByZXYgPSBleGVfc2l6ZVtpLTFdCisJCisJaWYgZVsxXTw+Jyc6CisJICAgIG91dHB1dC53cml0ZSgnICcpCisJICAgIG91dHB1dC53cml0ZSggIHN0cmluZy5yanVzdChgc3RyaW5nLmF0b2koZVsyXSkgLSBzdHJpbmcuYXRvaShwcmV2WzJdKWAsIDgpICkKKwkgICAgb3V0cHV0LndyaXRlKCAgc3RyaW5nLnJqdXN0KGBzdHJpbmcuYXRvaShlWzNdKSAtIHN0cmluZy5hdG9pKHByZXZbM10pYCwgOCkgKQorCSAgICBvdXRwdXQud3JpdGUoICBzdHJpbmcucmp1c3QoYHN0cmluZy5hdG9pKGVbNF0pIC0gc3RyaW5nLmF0b2kocHJldls0XSlgLCA4KSApCisJICAgIG91dHB1dC53cml0ZSgnICAgJyArIGVbNV0gKyAnXG4nKQorCWVsc2U6CisJICAgIG91dHB1dC53cml0ZSgnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJykJCisJICAgIG91dHB1dC53cml0ZSgnICcpCisJICAgIG91dHB1dC53cml0ZSggc3RyaW5nLnJqdXN0KGVbMl0sIDgpICkKKwkgICAgb3V0cHV0LndyaXRlKCBzdHJpbmcucmp1c3QoZVszXSwgOCkgKQorCSAgICBvdXRwdXQud3JpdGUoIHN0cmluZy5yanVzdChlWzRdLCA4KSApCisJICAgIG91dHB1dC53cml0ZSgnICAgJyArIGVbNV0gKyAnXG4nKQorCSAgICBvdXRwdXQud3JpdGUoJ1xuJykJCisKKwkKKyAgICAjIERvbmUgICAgCisgICAgb3V0cHV0LmNsb3NlKCkKKworCisjCisjIFdyaXRlIHRoZSByZXBvcnQgdG8gSFRNTCBmaWxlCisjCitkZWYgcHJpbnRfaHRtbF9yZXBvcnQoKToKKworICAgICMgR2V0IFJldmlzaW9uIGluZm8uCisgICAgZiA9IG9zLnBvcGVuKCdzdm4gaW5mbyB8IGdyZXAgUmV2aXNpb24nKQorICAgIHJldmlzaW9uID0gZi5yZWFkbGluZSgpLnNwbGl0KClbMV0KKworICAgICMgR2V0IE1hY2hpbmUsIE9TLCBhbmQgQ0MgbmFtZQorICAgIGYgPSBvcy5wb3BlbignbWFrZSAtZiBGb290cHJpbnQubWFrIHByaW50X25hbWUnKQorICAgIG5hbWVzID0gZi5yZWFkbGluZSgpLnNwbGl0KCkKKyAgICBtID0gbmFtZXNbMF0KKyAgICBvID0gbmFtZXNbMV0KKyAgICBjYyA9IG5hbWVzWzJdCisgICAgY2NfdmVyID0gbmFtZXNbM10KKworICAgICMgT3BlbiBIVE1MIGZpbGUKKyAgICBmaWxlbmFtZSA9ICdmb290cHJpbnQtJyArIG0gKyAnLScgKyBvICsgJy5odG0nCisgICAgb3V0cHV0ID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorCisgICAgdGl0bGUgPSAnUEpTSVAgYW5kIFBKTUVESUEgZm9vdHByaW50IHJlcG9ydCBmb3IgJyArIG0gKyAnLScgKyBvICsgJyB0YXJnZXQnCisgICAgb3V0cHV0LndyaXRlKCc8SFRNTD48SEVBRD5cbicpOworICAgIG91dHB1dC53cml0ZSgnIDxUSVRMRT4nICsgdGl0bGUgKyAnPC9USVRMRT5cbicpCisgICAgb3V0cHV0LndyaXRlKCcgPExJTksgaHJlZj0iL3N0eWxlL3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCI+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPC9IRUFEPlxuJyk7CisgICAgb3V0cHV0LndyaXRlKCc8Qk9EWSBiZ2NvbG9yPSJ3aGl0ZSI+XG4nKTsKKyAgICBvdXRwdXQud3JpdGUoJzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvaGVhZGVyLmh0bWwiIC0tPicpCisKKyAgICBvdXRwdXQud3JpdGUoJyA8SDE+JyArIHRpdGxlICsgJzwvSDE+XG4nKQorICAgIG91dHB1dC53cml0ZSgnQXV0by1nZW5lcmF0ZWQgYnkgcGpzaXAtYXBwcy9idWlsZC9nZXQtZm9vdHByaW50LnB5IHNjcmlwdFxuJykKKyAgICBvdXRwdXQud3JpdGUoJzxwPkRhdGU6ICcgKyB0aW1lLmFzY3RpbWUoKSArICc8QlI+XG4nKQorICAgIG91dHB1dC53cml0ZSgnUmV2aXNpb246IHInICsgcmV2aXNpb24gKyAnPC9wPlxuXG4nKQorICAgIG91dHB1dC53cml0ZSgnPEhSPlxuJykKKyAgICBvdXRwdXQud3JpdGUoJ1xuJykKKworICAgICMgSW5mbworICAgIG91dHB1dC53cml0ZSgnPEgyPkJ1aWxkIENvbmZpZ3VyYXRpb248L0gyPlxuJykKKworICAgICMgYnVpbGQubWFrCisgICAgb3V0cHV0LndyaXRlKCdcbjxIMz5idWlsZC5tYWs8L0gzPlxuJykKKyAgICBvdXRwdXQud3JpdGUoJzx0dD5cbicpCisgICAgZiA9IG9wZW4oJy4uLy4uL2J1aWxkLm1haycsICdyJykKKyAgICBzID0gZi5yZWFkbGluZXMoKQorICAgIGZvciBsIGluIHM6CisJb3V0cHV0LndyaXRlKGwgKyAnPEJSPlxuJykKKyAgICBvdXRwdXQud3JpdGUoJzwvdHQ+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPHA+VXNpbmcgJyArIGNjICsgJyB2ZXJzaW9uICcgKyBjY192ZXIgKyc8L3A+XG4nKQorCisgICAgIyB1c2VyLm1haworICAgIG91dHB1dC53cml0ZSgnXG48SDM+dXNlci5tYWs8L0gzPlxuJykKKyAgICBvdXRwdXQud3JpdGUoJzx0dD5cbicpCisgICAgZiA9IG9wZW4oJy4uLy4uL3VzZXIubWFrJywgJ3InKQorICAgIHMgPSBmLnJlYWRsaW5lcygpCisgICAgZm9yIGwgaW4gczoKKwlvdXRwdXQud3JpdGUobCArICc8QlI+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPC90dD5cbicpCisKKyAgICAjIGNvbmZpZ19zaXRlLmgKKyAgICBvdXRwdXQud3JpdGUoJ1xuPEgzPiZsdDtwai9jb25maWcuc2l0ZS5oJmd0OzwvSDM+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPHR0PlxuJykKKyAgICBmID0gb3MucG9wZW4oJ2NwcCAtZE0gLUkuLi8uLi9wamxpYi9pbmNsdWRlIC4uLy4uL3BqbGliL2luY2x1ZGUvcGovY29uZmlnX3NpdGUuaCB8IGdyZXAgUEonKQorICAgIHMgPSBmLnJlYWRsaW5lcygpCisgICAgZm9yIGwgaW4gczoKKwlvdXRwdXQud3JpdGUobCArICc8QlI+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPC90dD5cbicpCisKKworCisgICAgIyBXcml0ZSBpbmRpdmlkdWFsIG1vZHVsZSBzaXplCisgICAgb3V0cHV0LndyaXRlKCc8SDI+Rm9vdHByaW50IFJlcG9ydDwvSDI+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPHA+VGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBmb290cHJpbnQgb2YgaW5kaXZpZHVhbCBmZWF0dXJlLCBpbiBieXRlcy48L3A+JykKKyAgICBvdXRwdXQud3JpdGUoJzxUQUJMRSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+XG4nICsgCisJCSAgJzxUUiBiZ2NvbG9yPSIjZThlOGZmIj5cbicgKyAKKwkJICAnICA8VEQgYWxpZ249ImNlbnRlciI+PHN0cm9uZz4udGV4dDwvc3Ryb25nPjwvVEQ+XG4nICsKKwkJICAnICA8VEQgYWxpZ249ImNlbnRlciI+PHN0cm9uZz4uZGF0YTwvc3Ryb25nPjwvVEQ+XG4nICsKKwkJICAnICA8VEQgYWxpZ249ImNlbnRlciI+PHN0cm9uZz4uYnNzPC9zdHJvbmc+PC9URD5cbicgKworCQkgICcgIDxURCBhbGlnbj0iY2VudGVyIj48c3Ryb25nPkZlYXR1cmVzL01vZHVsZSBEZXNjcmlwdGlvbjwvc3Ryb25nPjwvVEQ+XG4nICsKKwkJICAnPC9UUj5cbicpCisJCisJCisgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGV4ZV9zaXplKSk6CisJZSA9IGV4ZV9zaXplW2ldCisJcHJldiA9IGV4ZV9zaXplW2ktMV0KKwkKKwlvdXRwdXQud3JpdGUoJzxUUj5cbicpCisJaWYgZVsxXTw+Jyc6CisJICAgIG91dHB1dC53cml0ZSggJyAgPFREIGFsaWduPSJyaWdodCI+JyArIGBzdHJpbmcuYXRvaShlWzJdKSAtIHN0cmluZy5hdG9pKHByZXZbMl0pYCArICc8L1REPlxuJykKKwkgICAgb3V0cHV0LndyaXRlKCAnICA8VEQgYWxpZ249InJpZ2h0Ij4nICsgYHN0cmluZy5hdG9pKGVbM10pIC0gc3RyaW5nLmF0b2kocHJldlszXSlgICsgJzwvVEQ+XG4nKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURCBhbGlnbj0icmlnaHQiPicgKyBgc3RyaW5nLmF0b2koZVs0XSkgLSBzdHJpbmcuYXRvaShwcmV2WzRdKWAgKyAnPC9URD5cbicgKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURD4nICsgZVs1XSArICc8L1REPlxuJykKKwllbHNlOgorCSAgICBlbXB0eV9zaXplID0gZXhlX3NpemVbMV0KKwkgICAgb3V0cHV0LndyaXRlKCc8VFIgYmdjb2xvcj0iI2U4ZThmZiI+XG4nKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURCBhbGlnbj0icmlnaHQiPiZuYnNwOzwvVEQ+XG4nKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURCBhbGlnbj0icmlnaHQiPiZuYnNwOzwvVEQ+XG4nKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURCBhbGlnbj0icmlnaHQiPiZuYnNwOzwvVEQ+XG4nKQorCSAgICBvdXRwdXQud3JpdGUoICcgIDxURD48c3Ryb25nPicgKyBlWzVdICsgJzogLnRleHQ9JyArIGVbMl0rICcsIC5kYXRhPScgKyBlWzNdICsgJywgLmJzcz0nICsgZVs0XSApCisJICAgIG91dHB1dC53cml0ZSggJ1xuIDwvc3Ryb25nPiA8QlI+KFNpemUgbWludXMgZW1wdHkgYXBwbGljYXRpb24gc2l6ZTogJyArIFwKKwkJCSAgICAnLnRleHQ9JyArIGBzdHJpbmcuYXRvaShlWzJdKSAtIHN0cmluZy5hdG9pKGVtcHR5X3NpemVbMl0pYCArIFwKKwkJCSAgICAnLCAuZGF0YT0nICsgYHN0cmluZy5hdG9pKGVbM10pIC0gc3RyaW5nLmF0b2koZW1wdHlfc2l6ZVszXSlgICsgXAorCQkJICAgICcsIC5kYXRhPScgKyBgc3RyaW5nLmF0b2koZVs0XSkgLSBzdHJpbmcuYXRvaShlbXB0eV9zaXplWzRdKWAgKyBcCisJCQkgICAgJylcbicgKQorCSAgICBvdXRwdXQud3JpdGUoICcgPC9URD5cbicpCisKKwlvdXRwdXQud3JpdGUoJzwvVFI+XG4nKQorCisgICAgb3V0cHV0LndyaXRlKCc8L1RBQkxFPlxuJykKKyAgICBvdXRwdXQud3JpdGUoJzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvZm9vdGVyLmh0bWwiIC0tPicpCisgICAgb3V0cHV0LndyaXRlKCc8L0JPRFk+XG4nKQorICAgIG91dHB1dC53cml0ZSgnPC9IVE1MPlxuJykKKwkKKyAgICAjIERvbmUgICAgCisgICAgb3V0cHV0LmNsb3NlKCkKKworCisKKworIworIyBHZXQgdGhlIHNpemUgb2YgaW5kaXZpZHVhbCBmZWF0dXJlCisjCitkZWYgZ2V0X3NpemUoYWxsX2ZsYWdzLCBmbGFncywgZGVzYyk6CisJZmlsZSA9ICdmb290cHJpbnQuZXhlJworCSMgUmVtb3ZlIGZpbGUKKwlyYyA9IG9zLnN5c3RlbSgibWFrZSAtZiBGb290cHJpbnQubWFrIEZDRkxBR1M9JyIgKyBhbGxfZmxhZ3MgKyAiJyBjbGVhbiIpCisJIyBNYWtlIHRoZSBleGVjdXRhYmxlCisJY21kID0gIm1ha2UgLWYgRm9vdHByaW50Lm1hayBGQ0ZMQUdTPSciICsgYWxsX2ZsYWdzICsgIicgYWxsIgorCSNwcmludCBjbWQKKwlyYyA9IG9zLnN5c3RlbShjbWQpCisJaWYgcmMgPD4gMDoKKwkJc3lzLmV4aXQoMSkKKworCSMgUnVuICdzaXplJyBhZ2FpbnN0IHRoZSBleGVjdXRhYmxlCisJZiA9IG9zLnBvcGVuKCdzaXplICcgKyBmaWxlKQorCSMgU2tpcCBoZWFkZXIgb2YgdGhlICdzaXplJyBvdXRwdXQKKwlmLnJlYWRsaW5lKCkKKwkjIEdldCB0aGUgc2l6ZXMKKwlzaXplID0gZi5yZWFkbGluZSgpCisJZi5jbG9zZSgpCisJIyBTcGxpdCBpbnRvIHRva2VucworCXRva2VucyA9IHNpemUuc3BsaXQoKQorCSMgQnVpbGQgdGhlIHNpemUgdHVwbGUgYW5kIGFkZCB0byBleGVfc2l6ZQorCWVsZW0gPSBhbGxfZmxhZ3MsIGZsYWdzLCB0b2tlbnNbMF0sIHRva2Vuc1sxXSwgdG9rZW5zWzJdLCBkZXNjCisJZXhlX3NpemUuYXBwZW5kKGVsZW0pCisJIyBSZW1vdmUgZmlsZQorCXJjID0gb3Muc3lzdGVtKCJtYWtlIC1mIEZvb3RwcmludC5tYWsgRkNGTEFHUz0nIiArIGFsbF9mbGFncyArICInIGNsZWFuIikKKwkKKyMgTWFpbgorZWxlbSA9ICcnLCAnJywgICcwJywgJzAnLCAnMCcsICcnCitleGVfc2l6ZS5hcHBlbmQoZWxlbSkKKworYWxsX2ZsYWdzID0gJycKK2ZvciBlbGVtIGluIGNvbXBpbGVfZmxhZ3M6CisgICAgaWYgZWxlbVswXSA8PiAnJzoKKwlmbGFncyA9ICctRCcgKyBlbGVtWzBdCisJYWxsX2ZsYWdzICs9IGZsYWdzICsgJyAnCisJZ2V0X3NpemUoYWxsX2ZsYWdzLCBlbGVtWzBdLCBlbGVtWzFdKQorICAgIGVsc2U6CisJZSA9IGV4ZV9zaXplW2xlbihleGVfc2l6ZSktMV0KKwluID0gYWxsX2ZsYWdzLCAnJywgZVsyXSwgZVszXSwgZVs0XSwgZWxlbVsxXQorCWV4ZV9zaXplLmFwcGVuZChuKQorCQorCisjcHJpbnRfdGV4dF9yZXBvcnQoJ2Zvb3RwcmludC50eHQnKQkKK3ByaW50X2h0bWxfcmVwb3J0KCkKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9saWJwanByb2plY3QudmNwcm9qIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9saWJwanByb2plY3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL2xpYnBqcHJvamVjdC52Y3Byb2oKQEAgLTAsMCArMSwzMTMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0ibGlicGpwcm9qZWN0Ig0KKwlQcm9qZWN0R1VJRD0iezIzRDc2NzlDLTc2NEMtNEUwMi04QjI5LUJCODgyQ0VFRUZFMn0iDQorCVJvb3ROYW1lc3BhY2U9ImxpYnBqcHJvamVjdCINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzcHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3NwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzc3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3x4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzc3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3x4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZwcm8tdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZwcm8tdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJCUVuYWJsZUZsb2F0aW5nUG9pbnRFbXVsYXRpb249ImZhbHNlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZwcm8tdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJTGlua0xpYnJhcnlEZXBlbmRlbmNpZXM9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXGxpYlwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlMaW5rTGlicmFyeURlcGVuZGVuY2llcz0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cbGliXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUxpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlxsaWJcJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii5cZHVtbXkuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvb3Mtd2luMzIubWFrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9vcy13aW4zMi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNDIyZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvb3Mtd2luMzIubWFrCkBAIC0wLDAgKzEsMiBAQAorCitleHBvcnQgTERGTEFHUyArPSAtbHdpbm1tCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3Bqc3VhLnZjcHJvaiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvcGpzdWEudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3Bqc3VhLnZjcHJvagpAQCAtMCwwICsxLDQzMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJwanN1YSINCisJUHJvamVjdEdVSUQ9Ins4MzEwNjQ5RS1BMjVFLTRBRjAtOTFFOC05RTNDQzY1OUJCODl9Ig0KKwlSb290TmFtZXNwYWNlPSJwanN1YSINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzcHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJtc3ZjcnQubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzc3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ibXN2Y3J0LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzcHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3NwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtMjAwM3NwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd20yMDAzcHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJvbGRuYW1lcy5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202cHJvLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJvbGRuYW1lcy5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJvbGRuYW1lcy5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9InBqc3VhLmJtcHwkKFByb2plY3REaXIpXC4uXHNyY1xwanN1YVx3bVx8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0icGpzdWEuYm1wfCQoUHJvamVjdERpcilcLi5cc3JjXHBqc3VhXHdtXHwlQ1NJRExfUFJPR1JBTV9GSUxFUyVcJChQcm9qZWN0TmFtZSl8MDsiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImF5Z3NoZWxsLmxpYiBjb3JlZGxsLmxpYiB3aW5zb2NrLmxpYiB3czIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJwanN1YS5ibXB8JChQcm9qZWN0RGlyKVwuLlxzcmNccGpzdWFcd21cfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwOyINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlVc2VPZk1GQz0iMCINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXCQoUHJvamVjdE5hbWUpLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlVc2VPZk1GQz0iMCINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cJChQcm9qZWN0TmFtZSktJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblwkKFByb2plY3ROYW1lKS0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccGpzdWFcbWFpbi5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3x4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHBqc3VhXHdtXG1haW5fd20uYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8eDY0Ig0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8eDY0Ig0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3x4NjQiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8eDY0Ig0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xwanN1YVxwanN1YV9hcHAuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3x4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3x4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xwanN1YVxwanN1YV9hcHBfY2xpLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccGpzdWFccGpzdWFfYXBwX2NvbW1vbi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHBqc3VhXHBqc3VhX2FwcF9jb25maWcuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xwanN1YVxwanN1YV9hcHBfbGVnYWN5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xwanN1YVxwanN1YV9hcHAuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xwanN1YVxwanN1YV9hcHBfY29tbW9uLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9wanN5c3Rlc3QudmNwcm9qIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9wanN5c3Rlc3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3Bqc3lzdGVzdC52Y3Byb2oKQEAgLTAsMCArMSw4MzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJwanN5c3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7NUU1MDdFQTItQ0IzOS00N0NBLUJEMzktNDlFQjU4RDdBMEJCfSINCisJUm9vdE5hbWVzcGFjZT0icGpzeXN0ZXN0Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IlBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0ieDY0Ig0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KVwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IklwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9IlBvY2tldCBQQyAyMDAzIChBUk1WNClcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpXCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJJcGhscGFwaS5saWIgIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3Bqc2lwL2luY2x1ZGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvc3Vic3lzdGVtOndpbmRvd3NjZSw1LjAyIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCQlEZWxheUxvYWRETExzPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9ImlucHV0Ljgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7dG9jazgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3Bqc2lwL2luY2x1ZGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7X1dJTjMyX1dDRT0kKENFVkVSKTtVTkRFUl9DRTskKFBMQVRGT1JNREVGSU5FUykiDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSW50RGlyKSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvc3Vic3lzdGVtOndpbmRvd3NjZSw1LjAyIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJheWdzaGVsbC5saWIgY29yZWRsbC5saWIgd2luc29jay5saWIgd3MyLmxpYiINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ib2xkbmFtZXMubGliIg0KKwkJCQlEZWxheUxvYWRETExzPSIkKE5PSU5IRVJJVCkiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9ImlucHV0Ljgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7dG9jazgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wanNpcC9pbmNsdWRlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL3N1YnN5c3RlbTp3aW5kb3dzY2UsNS4wMiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkJRGVsYXlMb2FkRExMcz0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJtc3ZjcjgwLmRsbHwkKEJJTkRJUilcJChJTlNUUlVDVElPTlNFVClcfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwO2lucHV0Ljgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7dG9jazgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3Bqc2lwL2luY2x1ZGUiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO19XSU4zMl9XQ0U9JChDRVZFUik7VU5ERVJfQ0U7JChQTEFURk9STURFRklORVMpIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKEludERpcikmcXVvdDsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL3N1YnN5c3RlbTp3aW5kb3dzY2UsNS4wMiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iYXlnc2hlbGwubGliIGNvcmVkbGwubGliIHdpbnNvY2subGliIHdzMi5saWIiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Im9sZG5hbWVzLmxpYiINCisJCQkJRGVsYXlMb2FkRExMcz0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSJtc3ZjcjgwLmRsbHwkKEJJTkRJUilcJChJTlNUUlVDVElPTlNFVClcfCVDU0lETF9QUk9HUkFNX0ZJTEVTJVwkKFByb2plY3ROYW1lKXwwO2lucHV0Ljgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7dG9jazgud2F2fCQoUHJvamVjdERpcilcLi5cLi5cdGVzdHNccGpzdWFcd2F2c1x8JUNTSURMX1BST0dSQU1fRklMRVMlXCQoUHJvamVjdE5hbWUpfDA7Ig0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccGpzeXN0ZXN0XG1haW5fY29uc29sZS5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHBqc3lzdGVzdFxtYWluX3dtLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccGpzeXN0ZXN0XHN5c3Rlc3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccGpzeXN0ZXN0XGd1aS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHBqc3lzdGVzdFxzeXN0ZXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXYiDQorCQkJVW5pcXVlSWRlbnRpZmllcj0iezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX0iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHBqc3lzdGVzdFxwanN5c3Rlc3Rfd2luY2UucmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3B5X3Bqc3VhLnZjcHJvaiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvcHlfcGpzdWEudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwM2EyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3B5X3Bqc3VhLnZjcHJvagpAQCAtMCwwICsxLDQzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjguMDAiCisJTmFtZT0icHlfcGpzdWEiCisJUHJvamVjdEdVSUQ9IntDNDRGQzAzMC1ENDZBLTQ3RkYtQjczMS1CNDdFQ0E1QjJCMTB9IgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9Ing2NCIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxwamxpYlxpbmNsdWRlLC4uXC4uXHBqbGliLXV0aWxcaW5jbHVkZSwuLlwuLlxwam1lZGlhXGluY2x1ZGUsLi5cLi5ccGpzaXBcaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0xJQjsiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0icHl0aG9uMjQubGliIG9sZTMyLmxpYiBzaGVsbDMyLmxpYiB1c2VyMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBpcGhscGFwaS5saWIiCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHB5LXBqc3VhLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHBqbGliXGluY2x1ZGUsLi5cLi5ccGpsaWItdXRpbFxpbmNsdWRlLC4uXC4uXHBqbWVkaWFcaW5jbHVkZSwuLlwuLlxwanNpcFxpbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfTElCOyIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJweXRob24yNF9kLmxpYiBvbGUzMi5saWIgc2hlbGwzMi5saWIgdXNlcjMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgaXBobHBhcGkubGliIgorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxweS1wanN1YS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8eDY0IgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5ccGpsaWJcaW5jbHVkZSwuLlwuLlxwamxpYi11dGlsXGluY2x1ZGUsLi5cLi5ccGptZWRpYVxpbmNsdWRlLC4uXC4uXHBqc2lwXGluY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7IgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InB5dGhvbjI0LmxpYiBvbGUzMi5saWIgc2hlbGwzMi5saWIgdXNlcjMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgaXBobHBhcGkubGliIgorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxweS1wanN1YS0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1jb21tb24tZGVmYXVsdHMudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5ccGpsaWJcaW5jbHVkZSwuLlwuLlxwamxpYi11dGlsXGluY2x1ZGUsLi5cLi5ccGptZWRpYVxpbmNsdWRlLC4uXC4uXHBqc2lwXGluY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9MSUI7IgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0icHl0aG9uMjRfZC5saWIgb2xlMzIubGliIHNoZWxsMzIubGliIHVzZXIzMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIGlwaGxwYXBpLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5ccHktcGpzdWEtJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHB5X3Bqc3VhXHBqc3VhLnB5IgorCQkJCT4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3x4NjQiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xweV9wanN1YVxwanN1YV9hcHAucHkiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfHg2NCIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHB5X3Bqc3VhXHB5X3Bqc3VhLmMiCisJCQkJPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJCQk+CisJCQkJCTxUb29sCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIgorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiIKKwkJCQkJLz4KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgorCQkJCTxGaWxlQ29uZmlndXJhdGlvbgorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQkJCT4KKwkJCQkJPFRvb2wKKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIgorCQkJCQkvPgorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+CisJCQkJPEZpbGVDb25maWd1cmF0aW9uCisJCQkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCQkJPgorCQkJCQk8VG9vbAorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiIKKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiCisJCQkJCS8+CisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccHlfcGpzdWFccHlfcGpzdWEuZGVmIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccHlfcGpzdWFccHlfcGpzdWEuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvcHl0aG9uX3Bqc3VhLnZjcHJvaiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvcHl0aG9uX3Bqc3VhLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUzMjJhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9weXRob25fcGpzdWEudmNwcm9qCkBAIC0wLDAgKzEsMjY4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0icHl0aG9uX3Bqc3VhIg0KKwlQcm9qZWN0R1VJRD0iezBDOTE4MzhCLTMzNzItNDBCNC1BNzY0LURFMDc1QTRCQzk0Qn0iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRccHl0aG9uX3Bqc3VhLWkzODYtd2luMzItdmM4LWRlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIxIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cb3V0cHV0XHB5dGhvbl9wanN1YS1pMzg2LXdpbjMyLXZjNi1kZWJ1Zy9weXRob25fcGpzdWEudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxwamxpYlxpbmNsdWRlLC4uXC4uXHBqbGliLXV0aWxcaW5jbHVkZSwuLlwuLlxwam1lZGlhXGluY2x1ZGUsLi5cLi5ccGpzaXBcaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO1BZX1BKU1VBX0VYUE9SVFMiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoT3V0RGlyKS9weXRob25fcGpzdWEucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoT3V0RGlyKS8iDQorCQkJCU9iamVjdEZpbGU9IiQoT3V0RGlyKS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcikvIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSINCisJCQkJV2FybmluZ0xldmVsPSI0Ig0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwNTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InB5dGhvbjI0X2QubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBpcGhscGFwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGxpYlxfcGpzdWFfZC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLi8uLi9wamxpYi9saWIsLi4vLi4vcGpsaWItdXRpbC9saWIsLi4vLi4vcGptZWRpYS9saWIsLi4vLi4vcGpzaXAvbGliLEY6XGluY29taW5nXHByb2plY3RzXGRpdnVzaVxQeXRob24tMi40XFB5dGhvbi0yLjRcUENidWlsZCxGOlxpbmNvbWluZ1xwcm9qZWN0c1xkaXZ1c2lcUHl0aG9uLTIuNFxQeXRob24tMi40XFBDXFZDNiINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXHNyY1xweXRob25cX3Bqc3VhLmRlZiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvX3Bqc3VhX2QucGRiIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvX3Bqc3VhX2QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii5cb3V0cHV0XHB5dGhvbl9wanN1YS1pMzg2LXdpbjMyLXZjNi1kZWJ1Zy9weXRob25fcGpzdWEuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRccHl0aG9uX3Bqc3VhLWkzODYtd2luMzItdmM4LXJlbGVhc2UiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxvdXRwdXRccHl0aG9uX3Bqc3VhLWkzODYtd2luMzItdmM2LXJlbGVhc2UvcHl0aG9uX3Bqc3VhLnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHBqbGliXGluY2x1ZGUsLi5cLi5ccGpsaWItdXRpbFxpbmNsdWRlLC4uXC4uXHBqbWVkaWFcaW5jbHVkZSwuLlwuLlxwanNpcFxpbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7UFlfUEpTVUFfRVhQT1JUUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoT3V0RGlyKS9weXRob25fcGpzdWEucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoT3V0RGlyKS8iDQorCQkJCU9iamVjdEZpbGU9IiQoT3V0RGlyKS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcikvIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwNTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9InB5dGhvbjI0LmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgaXBobHBhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxsaWJcX3Bqc3VhLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9Ii4uLy4uL3BqbGliL2xpYiwuLi8uLi9wamxpYi11dGlsL2xpYiwuLi8uLi9wam1lZGlhL2xpYiwuLi8uLi9wanNpcC9saWIiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmNtdC5saWIiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlxzcmNccHl0aG9uXF9wanN1YS5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9fcGpzdWEucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9InRydWUiDQorCQkJCU1hcEZpbGVOYW1lPSIkKE91dERpcikvX3Bqc3VhLm1hcCINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL19wanN1YS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxvdXRwdXRccHl0aG9uX3Bqc3VhLWkzODYtd2luMzItdmM2LXJlbGVhc2UvcHl0aG9uX3Bqc3VhLmJzYyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHB5dGhvblxfcGpzdWEuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNccHl0aG9uXF9wanN1YS5kZWYiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xweXRob25cX3Bqc3VhLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9zYW1wbGVfZGVidWcudmNwcm9qIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC9zYW1wbGVfZGVidWcudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODIxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3NhbXBsZV9kZWJ1Zy52Y3Byb2oKQEAgLTAsMCArMSwzNzUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0ic2FtcGxlX2RlYnVnIg0KKwlQcm9qZWN0R1VJRD0ie0EwRjFBQTYyLTBGNkYtNDIwRC1CMDlBLUFDMDRCNjg2MjgyMX0iDQorCVJvb3ROYW1lc3BhY2U9InNhbXBsZV9kZWJ1ZyINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iUG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjMyLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJNU1ZDUlQuTElCIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd20yMDAzc3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3x4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Ik1TVkNSVC5MSUIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTZwcm8tdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNnN0ZC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd202cHJvLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Ik1TVkNSVC5MSUIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTIwMDNwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtMjAwM3NwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iTVNWQ1JULkxJQiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd202cHJvLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktJChQbGF0Zm9ybU5hbWUpLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd20yMDAzcHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd20yMDAzc3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd202c3RkLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luMzIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luMzItY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Ik1TVkNSVC5MSUIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd20yMDAzLWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8eDY0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdpbjY0LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iTVNWQ1JULkxJQiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd202LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbjMyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DT05TT0xFOyINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS0kKFBsYXRmb3JtTmFtZSktdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9Ik1TVkNSVC5MSUIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtMjAwMy1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtMjAwM3BwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTIwMDMtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTIwMDNzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfHg2NCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd2luNjQtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLSQoUGxhdGZvcm1OYW1lKS12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iTVNWQ1JULkxJQiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTYtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTZzdGQtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtcmVsZWFzZS1zdGF0aWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNi1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNnByby12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LWNvbW1vbi1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTVwcGMtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2UtZHluYW1pYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1yZWxlYXNlLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXNwLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1kZWJ1Zy1keW5hbWljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtY29tbW9uLWRlZmF1bHRzLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaXBobHBhcGkubGliIGRzb3VuZC5saWIgZHhndWlkLmxpYiBuZXRhcGkzMi5saWIgbXN3c29jay5saWIgd3MyXzMyLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2xlMzIubGliIHVzZXIzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXGJpblxzYW1wbGUtZGVidWctJChUYXJnZXRDUFUpLXdtNXBwYy12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LWRlYnVnLWR5bmFtaWMtZGVmYXVsdHMudnNwcm9wczsuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXdtNS1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd201c3AtdmMkKFZTVmVyKS0kKENvbmZpZ3VyYXRpb25OYW1lKS5leGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC1yZWxlYXNlLXN0YXRpYy1kZWZhdWx0cy52c3Byb3BzOy4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtd201LXJlbGVhc2UtZGVmYXVsdHMudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpcGhscGFwaS5saWIgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cYmluXHNhbXBsZS1kZWJ1Zy0kKFRhcmdldENQVSktd201cHBjLXZjJChWU1ZlciktJChDb25maWd1cmF0aW9uTmFtZSkuZXhlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwuLlxidWlsZFx2c1xwanByb2plY3QtdnM4LXJlbGVhc2Utc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13bTUtcmVsZWFzZS1kZWZhdWx0cy52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLi8uLi9wanNpcC9pbmNsdWRlLC4uLy4uL3BqbGliL2luY2x1ZGUsLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlLC4uLy4uL3BqbWVkaWEvaW5jbHVkZSwuLi8uLi9wam5hdGgvaW5jbHVkZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlwaGxwYXBpLmxpYiBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlxiaW5cc2FtcGxlLWRlYnVnLSQoVGFyZ2V0Q1BVKS13bTVzcC12YyQoVlNWZXIpLSQoQ29uZmlndXJhdGlvbk5hbWUpLmV4ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXGRlYnVnLmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctU3RhdGljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBTdGFuZGFyZCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfHg2NCINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgUHJvZmVzc2lvbmFsIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3x4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDUuMCBTbWFydHBob25lIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgUG9ja2V0IFBDIFNESyAoQVJNVjRJKSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvc2FtcGxlcy52Y3Byb2ogYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3NhbXBsZXMudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTI5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3NhbXBsZXMudmNwcm9qCkBAIC0wLDAgKzEsMTkwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9InNhbXBsZXMiDQorCVByb2plY3RHVUlEPSJ7RTM3OEExRkMtMEM5Qy00NDYyLTg2MEYtN0U2MEJDMUJGODRFfSINCisJUm9vdE5hbWVzcGFjZT0ic2FtcGxlcyINCisJS2V5d29yZD0iTWFrZUZpbGVQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IlNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS1pMzg2LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZSBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd20yMDAzcHBjLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZSBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd20yMDAzc3AtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSkteDg2XzY0LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IEFSQ0g9d2luNjQiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggQVJDSD13aW42NCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggQVJDSD13aW42NCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS1pMzg2LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBBUkNIPXdpbjMyIg0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBBUkNIPXdpbjMyIC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggQVJDSD13aW4zMiBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXdtMjAwM3BwYy0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTIwMDNzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSkteDg2XzY0LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBBUkNIPXdpbjY0Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBBUkNIPXdpbjY0IC9hICINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04IEFSQ0g9d2luNjQgY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLWkzODYtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCBBUkNIPXdpbjMycyINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IEFSQ0g9d2luMzIgL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTggQVJDSD13aW4zMiBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFBvY2tldCBQQyAyMDAzIChBUk1WNCkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTIwMDNwcGMtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xTbWFydHBob25lIDIwMDMgKEFSTVY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXdtMjAwM3NwLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSkteDg2XzY0LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTggQVJDSD13aW42NCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IEFSQ0g9d2luNjQgL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTggQVJDSD13aW42NCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktaTM4Ni0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luMzIiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCBBUkNIPXdpbjMyIC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luMzIgY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd20yMDAzcHBjLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTIwMDNzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXg4Nl82NC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luNjQiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCBBUkNIPXdpbjY0IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luNjQgY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS1pMzg2LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luMzIiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggQVJDSD13aW4zMiAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggQVJDSD13aW4zMiBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xQb2NrZXQgUEMgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd20yMDAzcHBjLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctZHluYW1pYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1EeW5hbWljfFNtYXJ0cGhvbmUgMjAwMyAoQVJNVjQpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd20yMDAzc3AtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSkteDg2XzY0LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IEFSQ0g9d2luNjQiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggQVJDSD13aW42NCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggQVJDSD13aW42NCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS1pMzg2LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBBUkNIPXdpbjMyIg0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBBUkNIPXdpbjMyIC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggQVJDSD13aW4zMiBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8UG9ja2V0IFBDIDIwMDMgKEFSTVY0KSINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXdtMjAwM3BwYy0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2Utc3RhdGljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8U21hcnRwaG9uZSAyMDAzIChBUk1WNCkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTIwMDNzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2Utc3RhdGljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1TdGF0aWN8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSkteDg2XzY0LSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBBUkNIPXdpbjY0Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBBUkNIPXdpbjY0IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggQVJDSD13aW42NCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXdtNnN0ZC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZSBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZSBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTZwcm8tJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVwcGMtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd201c3AtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202c3RkLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTZwcm8tJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd201cHBjLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1ZyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWcgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202c3RkLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202cHJvLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Zy1TdGF0aWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVwcGMtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLXN0YXRpYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctc3RhdGljIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1zdGF0aWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZS1EeW5hbWljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202c3RkLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNiBQcm9mZXNzaW9uYWwgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202cHJvLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVwcGMtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2UtZHluYW1pYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1keW5hbWljIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLWR5bmFtaWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFN0YW5kYXJkIFNESyAoQVJNVjRJKSINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cb3V0cHV0XCQoUHJvamVjdE5hbWUpLXdtNnN0ZC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctZHluYW1pYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9ZGVidWctZHluYW1pYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWctRHluYW1pY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTZwcm8tJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFBvY2tldCBQQyBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVwcGMtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnLUR5bmFtaWN8V2luZG93cyBNb2JpbGUgNS4wIFNtYXJ0cGhvbmUgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd201c3AtJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPWRlYnVnLWR5bmFtaWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1kZWJ1Zy1keW5hbWljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDYgU3RhbmRhcmQgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd202c3RkLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA2IFByb2Zlc3Npb25hbCBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTZwcm8tJChQbGF0Zm9ybU5hbWUpLXZzOC0kKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoT3V0RGlyKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUJ1aWxkTG9nRmlsZT0iIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2Utc3RhdGljIFZDX1ZFUj04Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCAvYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2Utc3RhdGljIFZDX1ZFUj04IGNsZWFuIg0KKwkJCQlPdXRwdXQ9IkFsbCBzYW1wbGVzIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUV4ZWN1dGlvbkJ1Y2tldD0iNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ29kZVNpZ25Ub29sIg0KKwkJCS8+DQorCQkJPERlcGxveW1lbnRUb29sDQorCQkJCUZvcmNlRGlydHk9Ii0xIg0KKwkJCQlSZW1vdGVEaXJlY3Rvcnk9IiINCisJCQkJUmVnaXN0ZXJPdXRwdXQ9IjAiDQorCQkJCUFkZGl0aW9uYWxGaWxlcz0iIg0KKwkJCS8+DQorCQkJPERlYnVnZ2VyVG9vbA0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2UtU3RhdGljfFdpbmRvd3MgTW9iaWxlIDUuMCBQb2NrZXQgUEMgU0RLIChBUk1WNEkpIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxvdXRwdXRcJChQcm9qZWN0TmFtZSktd201cHBjLSQoUGxhdGZvcm1OYW1lKS12czgtJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKE91dERpcikiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlCdWlsZExvZ0ZpbGU9IiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCINCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggL2EiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9Im5tYWtlIC9OT0xPR08gL1MgL2YgU2FtcGxlcy12Yy5tYWsgQlVJTERfTU9ERT1yZWxlYXNlLXN0YXRpYyBWQ19WRVI9OCBjbGVhbiINCisJCQkJT3V0cHV0PSJBbGwgc2FtcGxlcyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlFeGVjdXRpb25CdWNrZXQ9IjciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NvZGVTaWduVG9vbCINCisJCQkvPg0KKwkJCTxEZXBsb3ltZW50VG9vbA0KKwkJCQlGb3JjZURpcnR5PSItMSINCisJCQkJUmVtb3RlRGlyZWN0b3J5PSIiDQorCQkJCVJlZ2lzdGVyT3V0cHV0PSIwIg0KKwkJCQlBZGRpdGlvbmFsRmlsZXM9IiINCisJCQkvPg0KKwkJCTxEZWJ1Z2dlclRvb2wNCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlLVN0YXRpY3xXaW5kb3dzIE1vYmlsZSA1LjAgU21hcnRwaG9uZSBTREsgKEFSTVY0SSkiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXG91dHB1dFwkKFByb2plY3ROYW1lKS13bTVzcC0kKFBsYXRmb3JtTmFtZSktdnM4LSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChPdXREaXIpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQnVpbGRMb2dGaWxlPSIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTgiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0ibm1ha2UgL05PTE9HTyAvUyAvZiBTYW1wbGVzLXZjLm1hayBCVUlMRF9NT0RFPXJlbGVhc2Utc3RhdGljIFZDX1ZFUj04IC9hIg0KKwkJCQlDbGVhbkNvbW1hbmRMaW5lPSJubWFrZSAvTk9MT0dPIC9TIC9mIFNhbXBsZXMtdmMubWFrIEJVSUxEX01PREU9cmVsZWFzZS1zdGF0aWMgVkNfVkVSPTggY2xlYW4iDQorCQkJCU91dHB1dD0iQWxsIHNhbXBsZXMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJRXhlY3V0aW9uQnVja2V0PSI3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDb2RlU2lnblRvb2wiDQorCQkJLz4NCisJCQk8RGVwbG95bWVudFRvb2wNCisJCQkJRm9yY2VEaXJ0eT0iLTEiDQorCQkJCVJlbW90ZURpcmVjdG9yeT0iIg0KKwkJCQlSZWdpc3Rlck91dHB1dD0iMCINCisJCQkJQWRkaXRpb25hbEZpbGVzPSIiDQorCQkJLz4NCisJCQk8RGVidWdnZXJUb29sDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcYWVjdGVzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcYXVkZGVtby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcYXZpcGxheS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcY2xpZGVtby5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcY29uZmJlbmNoLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xjb25mc2FtcGxlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xlbmNkZWMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXGZvb3RwcmludC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcaHR0cGRlbW8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXGljZWRlbW8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXGpic2ltLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xsYXRlbmN5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xsZXZlbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcbWl4LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xwY2FwdXRpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNccGpzaXAtcGVyZi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNccGxheWZpbGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXHBsYXlzaW5lLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xyZWNmaWxlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xyZXNhbXBsZXBsYXkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXHNpbXBsZV9wanN1YS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcc2ltcGxldWEuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXHNpcGVjaG8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXHNpcHJ0cC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcc2lwcnRwX3JlcG9ydC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcc2lwc3RhdGVsZXNzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xzbmRpbmZvLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xzbmR0ZXN0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xzdGF0ZWZ1bF9wcm94eS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcc3RhdGVsZXNzX3Byb3h5LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xzdHJlYW11dGlsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcc2FtcGxlc1xzdHJlcnJvci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcdG9uZWdlbi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNcdmlkX3N0cmVhbXV0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHNhbXBsZXNccHJveHkuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1xzYW1wbGVzXHV0aWwuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9IlNhbXBsZXMtdmMubWFrIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJTYW1wbGVzLm1hayINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvdmlkZ3VpLnZjcHJvaiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvYnVpbGQvdmlkZ3VpLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC92aWRndWkudmNwcm9qCkBAIC0wLDAgKzEsMzU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0idmlkZ3VpIg0KKwlQcm9qZWN0R1VJRD0ie0E4RUZBNkY3LTU0NDMtNDZGQS05RDM1LTJBRjI2NjgyMzJFQX0iDQorCVJvb3ROYW1lc3BhY2U9InZpZGd1aSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW4zMi1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi4vLi4vcGpzaXAvaW5jbHVkZSwuLi8uLi9wamxpYi9pbmNsdWRlLC4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSwuLi8uLi9wam1lZGlhL2luY2x1ZGUsLi4vLi4vcGpuYXRoL2luY2x1ZGUiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ09OU09MRTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IlF0R3VpNC5saWIgUXRDb3JlNC5saWIgSXBobHBhcGkubGliICBkc291bmQubGliIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgb2xlMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3x4NjQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXGJ1aWxkXHZzXHBqcHJvamVjdC12czgtZGVidWctc3RhdGljLWRlZmF1bHRzLnZzcHJvcHM7Li5cLi5cYnVpbGRcdnNccGpwcm9qZWN0LXZzOC13aW42NC1jb21tb24tZGVmYXVsdHMudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uLy4uL3Bqc2lwL2luY2x1ZGUsLi4vLi4vcGpsaWIvaW5jbHVkZSwuLi8uLi9wamxpYi11dGlsL2luY2x1ZGUsLi4vLi4vcGptZWRpYS9pbmNsdWRlLC4uLy4uL3BqbmF0aC9pbmNsdWRlIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NPTlNPTEU7Ig0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJRdEd1aTQubGliIFF0Q29yZTQubGliIElwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBkeGd1aWQubGliIG5ldGFwaTMyLmxpYiBtc3dzb2NrLmxpYiB3czJfMzIubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIG9sZTMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1x2aWRndWlcbW9jX3ZpZGd1aS5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcdmlkZ3VpXG1vY192aWR3aW4uY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHZpZGd1aVx2aWRndWkuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cc3JjXHZpZGd1aVx2aWR3aW4uY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHNyY1x2aWRndWlcdmlkZ3VpLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxzcmNcdmlkZ3VpXHZpZHdpbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9Ig0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL2J1aWxkL3dpbmNlLWV2YzQvd2luY2VfZGVtb3MudmN3IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC93aW5jZS1ldmM0L3dpbmNlX2RlbW9zLnZjdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFmNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9idWlsZC93aW5jZS1ldmM0L3dpbmNlX2RlbW9zLnZjdwpAQCAtMCwwICsxLDMwNSBAQAorTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBUb29scyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsaWJnc21jb2RlYyI9Ii4uXC4uXC4uXFRISVJEX1BBUlRZXEJVSUxEXEdTTVxsaWJnc21jb2RlYy52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsaWJpbGJjY29kZWMiPSIuLlwuLlwuLlxUSElSRF9QQVJUWVxCVUlMRFxJTEJDXGxpYmlsYmNjb2RlYy52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsaWJtaWxlbmFnZSI9Ii4uXC4uXC4uXHRoaXJkX3BhcnR5XGJ1aWxkXG1pbGVuYWdlXGxpYm1pbGVuYWdlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxpYnBvcnRhdWRpbyI9Ii4uXC4uXC4uXFRISVJEX1BBUlRZXEJVSUxEXFBPUlRBVURJT1xsaWJwb3J0YXVkaW8udmNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAibGlicmVzYW1wbGUiPSIuLlwuLlwuLlxUSElSRF9QQVJUWVxCVUlMRFxSRVNBTVBMRVxsaWJyZXNhbXBsZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJsaWJzcGVleCI9Ii4uXC4uXC4uXFRISVJEX1BBUlRZXEJVSUxEXFNQRUVYXGxpYnNwZWV4LnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImxpYnNydHAiPSIuLlwuLlwuLlx0aGlyZF9wYXJ0eVxidWlsZFxzcnRwXGxpYnNydHAudmNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAicGpsaWJfdXRpbF93aW5jZSI9Ii4uXC4uXC4uXHBqbGliLXV0aWxcYnVpbGRcd2luY2UtZXZjNFxwamxpYl91dGlsX3dpbmNlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInBqbGliX3dpbmNlIj0iLi5cLi5cLi5ccGpsaWJcYnVpbGRcd2luY2UtZXZjNFxwamxpYl93aW5jZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJwam1lZGlhX2F1ZGRldl93aW5jZSI9Ii4uXC4uXC4uXHBqbWVkaWFcYnVpbGRcd2luY2UtZXZjNFxwam1lZGlhX2F1ZGRldl93aW5jZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJwam1lZGlhX2NvZGVjX3dpbmNlIj0iLi5cLi5cLi5ccGptZWRpYVxidWlsZFx3aW5jZS1ldmM0XHBqbWVkaWFfY29kZWNfd2luY2UudmNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAicGptZWRpYV93aW5jZSI9Ii4uXC4uXC4uXHBqbWVkaWFcYnVpbGRcd2luY2UtZXZjNFxwam1lZGlhX3dpbmNlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInBqbmF0aF93aW5jZSI9Ii4uXC4uXC4uXHBqbmF0aFxidWlsZFx3aW5jZS1ldmM0XHBqbmF0aF93aW5jZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJwanNpcF9jb3JlX3dpbmNlIj0iLi5cLi5cLi5ccGpzaXBcYnVpbGRcd2luY2UtZXZjNFxwanNpcF9jb3JlX3dpbmNlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInBqc2lwX3NpbXBsZV93aW5jZSI9Ii4uXC4uXC4uXHBqc2lwXGJ1aWxkXHdpbmNlLWV2YzRccGpzaXBfc2ltcGxlX3dpbmNlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInBqc2lwX3VhX3dpbmNlIj0iLi5cLi5cLi5ccGpzaXBcYnVpbGRcd2luY2UtZXZjNFxwanNpcF91YV93aW5jZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJwanN1YV9saWJfd2luY2UiPSIuLlwuLlwuLlxwanNpcFxidWlsZFx3aW5jZS1ldmM0XHBqc3VhX2xpYl93aW5jZS52Y3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqbGliX3V0aWxfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwamxpYl93aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqbWVkaWFfY29kZWNfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwam1lZGlhX3dpbmNlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcGpzaXBfY29yZV93aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqc2lwX3NpbXBsZV93aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqc2lwX3VhX3dpbmNlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogInBqc3VhX3dpbmNlIj0iLi5cLi5cc3JjXHBqc3VhX3dpbmNlXHBqc3VhX3dpbmNlLnZjcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcGpsaWJfdXRpbF93aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqbGliX3dpbmNlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcGptZWRpYV9jb2RlY193aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIHBqbWVkaWFfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwanNpcF9jb3JlX3dpbmNlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcGpzaXBfc2ltcGxlX3dpbmNlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgcGpzaXBfdWFfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwanN1YV9saWJfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwam5hdGhfd2luY2UNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJnc21jb2RlYw0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYmlsYmNjb2RlYw0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYnBvcnRhdWRpbw0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYnJlc2FtcGxlDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgbGlic3BlZXgNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBsaWJtaWxlbmFnZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGxpYnNydHANCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBwam1lZGlhX2F1ZGRldl93aW5jZQ0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjLzNyZHBhcnR5X21lZGlhX3NhbXBsZS9NYWtlZmlsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjLzNyZHBhcnR5X21lZGlhX3NhbXBsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU1NmZkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvM3JkcGFydHlfbWVkaWFfc2FtcGxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMzQgQEAKKworaW5jbHVkZSAuLi8uLi8uLi9idWlsZC5tYWsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdhdGhlciBhbGwgZmxhZ3MuCisjCitleHBvcnQgX0NGTEFHUyAJOj0gJChQSl9DRkxBR1MpICQoQ0ZMQUdTKQorZXhwb3J0IF9DWFhGTEFHUzo9ICQoUEpfQ1hYRkxBR1MpCitleHBvcnQgX0xERkxBR1MgOj0gJChQSl9MREZMQUdTKSAkKFBKX0xETElCUykgJChMREZMQUdTKQorCitPQkpTID0gYWx0X3Bqc3VhX2F1ZC5vIGFsdF9wanN1YV92aWQubyBwanN1YV9hcHAubyBtYWluLm8KKworYWxsOiBhbHRfcGpzdWEKKworYWx0X3Bqc3VhOiAkKE9CSlMpCisJJChQSl9DQykgLW8gJEAgJChPQkpTKSAkKF9DRkxBR1MpICQoX0xERkxBR1MpCisKK3Bqc3VhX2FwcC5vOiAuLi9wanN1YS9wanN1YV9hcHAuYworCSQoUEpfQ0MpICQoX0NGTEFHUykgLWMgLW8gJEAgJDwKKworbWFpbi5vOiAuLi9wanN1YS9tYWluLmMKKwkkKFBKX0NDKSAkKF9DRkxBR1MpIC1jIC1vICRAICQ8CisKKyUubzogJS5jCisJJChQSl9DQykgJChfQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCitkZXBlbmQ6CisKK2NsZWFuOgorCXJtIC1mICoubyBhbHRfcGpzdWEgCisKK2Rpc3RjbGVhbiByZWFsY2xlYW46IGNsZWFuCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjLzNyZHBhcnR5X21lZGlhX3NhbXBsZS9hbHRfcGpzdWFfYXVkLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy8zcmRwYXJ0eV9tZWRpYV9zYW1wbGUvYWx0X3Bqc3VhX2F1ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMmJmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy8zcmRwYXJ0eV9tZWRpYV9zYW1wbGUvYWx0X3Bqc3VhX2F1ZC5jCkBAIC0wLDAgKzEsNjMxIEBACisvKiAkSWQ6IGFsdF9wanN1YV9hdWQuYyA0MTc0IDIwMTItMDYtMjEgMDg6MDk6NTNaIGJlbm55bHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YS5oPgorI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YV9pbnRlcm5hbC5oPgorCisjaWYgZGVmaW5lZChQSlNVQV9NRURJQV9IQVNfUEpNRURJQSkgJiYgUEpTVUFfTUVESUFfSEFTX1BKTUVESUEgIT0gMAorIyAgZXJyb3IgVGhlIFBKU1VBX01FRElBX0hBU19QSk1FRElBIHNob3VsZCBiZSBkZWNsYXJlZCBhcyB6ZXJvCisjZW5kaWYKKworCisjZGVmaW5lIFRISVNfRklMRQkJImFsdF9wanN1YV9hdWQuYyIKKyNkZWZpbmUgVU5JTVBMRU1FTlRFRChmdW5jKQlQSl9MT0coMiwoVEhJU19GSUxFLCAiKioqIENhbGwgdG8gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiAlcyAqKioiLCAjZnVuYykpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3VyIGR1bW15IGNvZGVjcy4gU2luY2Ugd2Ugd29uJ3QgdXNlIGFueSBQSk1FRElBIGNvZGVjcywgd2UgbmVlZCB0byBkZWNsYXJlCisgKiBvdXIgb3duIGNvZGVjcyBhbmQgcmVnaXN0ZXIgdGhlbSB0byBQSk1FRElBJ3MgY29kZWMgbWFuYWdlci4gV2UganVzdCBuZWVkCisgKiB0aGUgaW5mbyBzbyB0aGF0IHRoZXkgY2FuIGJlIGxpc3RlZCBpbiBTRFAuIFRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgd2lsbAorICogaGFwcGVuIGluIHlvdXIgdGhpcmQgcGFydHkgbWVkaWEgc3RyZWFtIGFuZCB3aWxsIG5vdCB1c2UgdGhlc2UgY29kZWNzLAorICogaGVuY2UgdGhlICJkdW1teSIgbmFtZS4KKyAqLworc3RhdGljIHN0cnVjdCBhbHRfY29kZWMKK3sKKyAgICBwal9zdHJfdAllbmNvZGluZ19uYW1lOworICAgIHBqX3VpbnQ4X3QJcGF5bG9hZF90eXBlOworICAgIHVuc2lnbmVkCWNsb2NrX3JhdGU7CisgICAgdW5zaWduZWQJY2hhbm5lbF9jbnQ7CisgICAgdW5zaWduZWQJZnJtX3B0aW1lOworICAgIHVuc2lnbmVkCWF2Z19icHM7CisgICAgdW5zaWduZWQJbWF4X2JwczsKK30gY29kZWNfbGlzdFtdID0KK3sKKyAgICAvKiBHLjcyOSAqLworICAgIHsgeyAiRzcyOSIsIDQgfSwgMTgsIDgwMDAsIDEsIDEwLCA4MDAwLCA4MDAwIH0sCisgICAgLyogUENNVSAqLworICAgIHsgeyAiUENNVSIsIDQgfSwgMCwgODAwMCwgMSwgMTAsIDY0MDAwLCA2NDAwMCB9LAorICAgIC8qIE91ciBwcm9wcmlldGFyeSBoaWdoIGVuZCBsb3cgYml0IHJhdGUgKDVrYnBzKSBjb2RlYywgaWYgeW91IHdpc2ggKi8KKyAgICB7IHsgIkZPTyIsIDMgfSwgUEpNRURJQV9SVFBfUFRfU1RBUlQrMCwgMTYwMDAsIDEsIDIwLCA1MDAwLCA1MDAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGFsdF9jb2RlY19mYWN0b3J5Cit7CisgICAgcGptZWRpYV9jb2RlY19mYWN0b3J5CWJhc2U7Cit9IGFsdF9jb2RlY19mYWN0b3J5OworCitzdGF0aWMgcGpfc3RhdHVzX3QgYWx0X2NvZGVjX3Rlc3RfYWxsb2MoIHBqbWVkaWFfY29kZWNfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9jb2RlY19pbmZvICppZCApCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGNvZGVjX2xpc3QpOyArK2kpIHsKKwlpZiAocGpfc3RyaWNtcCgmaWQtPmVuY29kaW5nX25hbWUsICZjb2RlY19saXN0W2ldLmVuY29kaW5nX25hbWUpPT0wKQorCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhbHRfY29kZWNfZGVmYXVsdF9hdHRyKCBwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9jb2RlY19pbmZvICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2NvZGVjX3BhcmFtICphdHRyICkKK3sKKyAgICBzdHJ1Y3QgYWx0X2NvZGVjICphYzsKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhmYWN0b3J5KTsKKworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoY29kZWNfbGlzdCk7ICsraSkgeworCWlmIChwal9zdHJpY21wKCZpZC0+ZW5jb2RpbmdfbmFtZSwgJmNvZGVjX2xpc3RbaV0uZW5jb2RpbmdfbmFtZSk9PTApCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBQSl9BUlJBWV9TSVpFKGNvZGVjX2xpc3QpKQorCXJldHVybiBQSl9FTk9URk9VTkQ7CisKKyAgICBhYyA9ICZjb2RlY19saXN0W2ldOworCisgICAgcGpfYnplcm8oYXR0ciwgc2l6ZW9mKHBqbWVkaWFfY29kZWNfcGFyYW0pKTsKKyAgICBhdHRyLT5pbmZvLmNsb2NrX3JhdGUgPSBhYy0+Y2xvY2tfcmF0ZTsKKyAgICBhdHRyLT5pbmZvLmNoYW5uZWxfY250ID0gYWMtPmNoYW5uZWxfY250OworICAgIGF0dHItPmluZm8uYXZnX2JwcyA9IGFjLT5hdmdfYnBzOworICAgIGF0dHItPmluZm8ubWF4X2JwcyA9IGFjLT5tYXhfYnBzOworICAgIGF0dHItPmluZm8ucGNtX2JpdHNfcGVyX3NhbXBsZSA9IDE2OworICAgIGF0dHItPmluZm8uZnJtX3B0aW1lID0gYWMtPmZybV9wdGltZTsKKyAgICBhdHRyLT5pbmZvLnB0ID0gYWMtPnBheWxvYWRfdHlwZTsKKworICAgIGF0dHItPnNldHRpbmcuZnJtX3Blcl9wa3QgPSAxOworICAgIGF0dHItPnNldHRpbmcudmFkID0gMTsKKyAgICBhdHRyLT5zZXR0aW5nLnBsYyA9IDE7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFsdF9jb2RlY19lbnVtX2NvZGVjcyhwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisJCQkJCSB1bnNpZ25lZCAqY291bnQsCisJCQkJCSBwam1lZGlhX2NvZGVjX2luZm8gY29kZWNzW10pCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaT0wOyBpPCpjb3VudCAmJiBpPFBKX0FSUkFZX1NJWkUoY29kZWNfbGlzdCk7ICsraSkgeworCXN0cnVjdCBhbHRfY29kZWMgKmFjID0gJmNvZGVjX2xpc3RbaV07CisJcGpfYnplcm8oJmNvZGVjc1tpXSwgc2l6ZW9mKHBqbWVkaWFfY29kZWNfaW5mbykpOworCWNvZGVjc1tpXS5lbmNvZGluZ19uYW1lID0gYWMtPmVuY29kaW5nX25hbWU7CisJY29kZWNzW2ldLnB0ID0gYWMtPnBheWxvYWRfdHlwZTsKKwljb2RlY3NbaV0udHlwZSA9IFBKTUVESUFfVFlQRV9BVURJTzsKKwljb2RlY3NbaV0uY2xvY2tfcmF0ZSA9IGFjLT5jbG9ja19yYXRlOworCWNvZGVjc1tpXS5jaGFubmVsX2NudCA9IGFjLT5jaGFubmVsX2NudDsKKyAgICB9CisKKyAgICAqY291bnQgPSBpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhbHRfY29kZWNfYWxsb2NfY29kZWMocGptZWRpYV9jb2RlY19mYWN0b3J5ICpmYWN0b3J5LAorCQkJCQkgY29uc3QgcGptZWRpYV9jb2RlY19pbmZvICppZCwKKwkJCQkJIHBqbWVkaWFfY29kZWMgKipwX2NvZGVjKQoreworICAgIC8qIFRoaXMgd2lsbCBuZXZlciBnZXQgY2FsbGVkIHNpbmNlIHdlIHdvbid0IGJlIHVzaW5nIHRoaXMgY29kZWMgKi8KKyAgICBVTklNUExFTUVOVEVEKGFsdF9jb2RlY19hbGxvY19jb2RlYykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFsdF9jb2RlY19kZWFsbG9jX2NvZGVjKCBwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfY29kZWMgKmNvZGVjICkKK3sKKyAgICAvKiBUaGlzIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZCAqLworICAgIFVOSU1QTEVNRU5URUQoYWx0X2NvZGVjX2RlYWxsb2NfY29kZWMpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhbHRfY29kZWNfZGVpbml0KHZvaWQpCit7CisgICAgcGptZWRpYV9jb2RlY19tZ3IgKmNvZGVjX21ncjsKKyAgICBjb2RlY19tZ3IgPSBwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IocGpzdWFfdmFyLm1lZF9lbmRwdCk7CisgICAgcmV0dXJuIHBqbWVkaWFfY29kZWNfbWdyX3VucmVnaXN0ZXJfZmFjdG9yeShjb2RlY19tZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWx0X2NvZGVjX2ZhY3RvcnkuYmFzZSk7CisKK30KKworc3RhdGljIHBqbWVkaWFfY29kZWNfZmFjdG9yeV9vcCBhbHRfY29kZWNfZmFjdG9yeV9vcCA9Cit7CisgICAgJmFsdF9jb2RlY190ZXN0X2FsbG9jLAorICAgICZhbHRfY29kZWNfZGVmYXVsdF9hdHRyLAorICAgICZhbHRfY29kZWNfZW51bV9jb2RlY3MsCisgICAgJmFsdF9jb2RlY19hbGxvY19jb2RlYywKKyAgICAmYWx0X2NvZGVjX2RlYWxsb2NfY29kZWMsCisgICAgJmFsdF9jb2RlY19kZWluaXQKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBUEkKKyAqLworCisvKiBJbml0aWFsaXplIHRoaXJkIHBhcnR5IG1lZGlhIGxpYnJhcnkuICovCitwal9zdGF0dXNfdCBwanN1YV9hdWRfc3Vic3lzX2luaXQoKQoreworICAgIHBqbWVkaWFfY29kZWNfbWdyICpjb2RlY19tZ3I7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogUmVnaXN0ZXIgb3VyICJkdW1teSIgY29kZWNzICovCisgICAgYWx0X2NvZGVjX2ZhY3RvcnkuYmFzZS5vcCA9ICZhbHRfY29kZWNfZmFjdG9yeV9vcDsKKyAgICBjb2RlY19tZ3IgPSBwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IocGpzdWFfdmFyLm1lZF9lbmRwdCk7CisgICAgc3RhdHVzID0gcGptZWRpYV9jb2RlY19tZ3JfcmVnaXN0ZXJfZmFjdG9yeShjb2RlY19tZ3IsCisJCQkJCQkmYWx0X2NvZGVjX2ZhY3RvcnkuYmFzZSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBUT0RPOiBpbml0aWFsaXplIHlvdXIgZXZpbCBsaWJyYXJ5IGhlcmUgKi8KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU3RhcnQgKGF1ZGlvKSBtZWRpYSBsaWJyYXJ5LiAqLworcGpfc3RhdHVzX3QgcGpzdWFfYXVkX3N1YnN5c19zdGFydCh2b2lkKQoreworICAgIC8qIFRPRE86ICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIENsZWFudXAgYW5kIGRlaW5pdGlhbGl6ZSB0aGlyZCBwYXJ0eSBtZWRpYSBsaWJyYXJ5LiAqLworcGpfc3RhdHVzX3QgcGpzdWFfYXVkX3N1YnN5c19kZXN0cm95KCkKK3sKKyAgICAvKiBUT0RPOiAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBPdXIgY2FsbGJhY2sgdG8gcmVjZWl2ZSBpbmNvbWluZyBSVFAgcGFja2V0cyAqLworc3RhdGljIHZvaWQgYXVkX3J0cF9jYih2b2lkICp1c2VyX2RhdGEsIHZvaWQgKnBrdCwgcGpfc3NpemVfdCBzaXplKQoreworICAgIHBqc3VhX2NhbGxfbWVkaWEgKmNhbGxfbWVkID0gKHBqc3VhX2NhbGxfbWVkaWEqKSB1c2VyX2RhdGE7CisKKyAgICAvKiBUT0RPOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgcGFja2V0ICovCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlJYICVkIGJ5dGVzIGF1ZGlvIFJUUCBwYWNrZXQiLCAoaW50KXNpemUpKTsKK30KKworLyogT3VyIGNhbGxiYWNrIHRvIHJlY2VpdmUgUlRDUCBwYWNrZXRzICovCitzdGF0aWMgdm9pZCBhdWRfcnRjcF9jYih2b2lkICp1c2VyX2RhdGEsIHZvaWQgKnBrdCwgcGpfc3NpemVfdCBzaXplKQoreworICAgIHBqc3VhX2NhbGxfbWVkaWEgKmNhbGxfbWVkID0gKHBqc3VhX2NhbGxfbWVkaWEqKSB1c2VyX2RhdGE7CisKKyAgICAvKiBUT0RPOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgcGFja2V0IGhlcmUgKi8KKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiUlggJWQgYnl0ZXMgYXVkaW8gUlRDUCBwYWNrZXQiLCAoaW50KXNpemUpKTsKK30KKworLyogQSBkZW1vIGZ1bmN0aW9uIHRvIHNlbmQgZHVtbXkgIlJUUCIgcGFja2V0cyBwZXJpb2RpY2FsbHkuIFlvdSB3b3VsZCBub3QKKyAqIG5lZWQgdG8gaGF2ZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSByZWFsIGFwcCEKKyAqLworc3RhdGljIHZvaWQgdGltZXJfdG9fc2VuZF9hdWRfcnRwKHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBwanN1YV9jYWxsX21lZGlhICpjYWxsX21lZCA9IChwanN1YV9jYWxsX21lZGlhKikgdXNlcl9kYXRhOworICAgIGNvbnN0IGNoYXIgKnBrdCA9ICJOb3QgUlRQIHBhY2tldCI7CisKKyAgICBpZiAoIWNhbGxfbWVkLT5jYWxsIHx8ICFjYWxsX21lZC0+Y2FsbC0+aW52IHx8ICFjYWxsX21lZC0+dHApIHsKKwkvKiBDYWxsIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZC4gVGhlcmUgaXMgcmFjZSBjb25kaXRpb24gaGVyZSBhcworCSAqIHRoaXMgY2IgbWF5IGJlIGNhbGxlZCBzb21ldGltZSBhZnRlciBjYWxsIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCAqLworCXJldHVybjsKKyAgICB9CisKKyAgICBwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0cChjYWxsX21lZC0+dHAsIHBrdCwgc3RybGVuKHBrdCkpOworCisgICAgcGpzdWFfc2NoZWR1bGVfdGltZXIyKCZ0aW1lcl90b19zZW5kX2F1ZF9ydHAsIGNhbGxfbWVkLCAyMDAwKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfdG9fc2VuZF9hdWRfcnRjcCh2b2lkICp1c2VyX2RhdGEpCit7CisgICAgcGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQgPSAocGpzdWFfY2FsbF9tZWRpYSopIHVzZXJfZGF0YTsKKyAgICBjb25zdCBjaGFyICpwa3QgPSAiTm90IFJUQ1AgcGFja2V0IjsKKworICAgIGlmICghY2FsbF9tZWQtPmNhbGwgfHwgIWNhbGxfbWVkLT5jYWxsLT5pbnYgfHwgIWNhbGxfbWVkLT50cCkgeworCS8qIENhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkLiBUaGVyZSBpcyByYWNlIGNvbmRpdGlvbiBoZXJlIGFzCisJICogdGhpcyBjYiBtYXkgYmUgY2FsbGVkIHNvbWV0aW1lIGFmdGVyIGNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJcmV0dXJuOworICAgIH0KKworICAgIHBqbWVkaWFfdHJhbnNwb3J0X3NlbmRfcnRjcChjYWxsX21lZC0+dHAsIHBrdCwgc3RybGVuKHBrdCkpOworCisgICAgcGpzdWFfc2NoZWR1bGVfdGltZXIyKCZ0aW1lcl90b19zZW5kX2F1ZF9ydGNwLCBjYWxsX21lZCwgNTAwMCk7Cit9CisKKy8qIFN0b3AgdGhlIGF1ZGlvIHN0cmVhbSBvZiBhIGNhbGwuICovCit2b2lkIHBqc3VhX2F1ZF9zdG9wX3N0cmVhbShwanN1YV9jYWxsX21lZGlhICpjYWxsX21lZCkKK3sKKyAgICAvKiBEZXRhY2ggb3VyIFJUUC9SVENQIGNhbGxiYWNrcyBmcm9tIHRyYW5zcG9ydCAqLworICAgIHBqbWVkaWFfdHJhbnNwb3J0X2RldGFjaChjYWxsX21lZC0+dHAsIGNhbGxfbWVkKTsKKworICAgIC8qIFRPRE86IGRlc3Ryb3kgeW91ciBhdWRpbyBzdHJlYW0gaGVyZSAqLworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgU0RQIG5lZ290aWF0aW9uIGhhcyBjb21wbGV0ZWQKKyAqIHN1Y2Nlc3NmdWxseS4gSGVyZSB5b3UnZCB3YW50IHRvIHN0YXJ0IHlvdXIgYXVkaW8gc3RyZWFtCisgKiBiYXNlZCBvbiB0aGUgaW5mbyBpbiB0aGUgU0RQcy4KKyAqLworcGpfc3RhdHVzX3QgcGpzdWFfYXVkX2NoYW5uZWxfdXBkYXRlKHBqc3VhX2NhbGxfbWVkaWEgKmNhbGxfbWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3Bvb2xfdCAqdG1wX3Bvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9zdHJlYW1faW5mbyAqc2ksCisJCQkJICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbF9zZHAsCisJCQkJICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpyZW1vdGVfc2RwKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCJBbHQgYXVkaW8gY2hhbm5lbCB1cGRhdGUuLiIpKTsKKyAgICBwal9sb2dfcHVzaF9pbmRlbnQoKTsKKworICAgIC8qIENoZWNrIGlmIG5vIG1lZGlhIGlzIGFjdGl2ZSAqLworICAgIGlmIChzaS0+ZGlyICE9IFBKTUVESUFfRElSX05PTkUpIHsKKwkvKiBBdHRhY2ggb3VyIFJUUCBhbmQgUlRDUCBjYWxsYmFja3MgdG8gdGhlIG1lZGlhIHRyYW5zcG9ydCAqLworCXN0YXR1cyA9IHBqbWVkaWFfdHJhbnNwb3J0X2F0dGFjaChjYWxsX21lZC0+dHAsIGNhbGxfbWVkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ktPnJlbV9hZGRyLCAmc2ktPnJlbV9ydGNwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zb2NrYWRkcl9nZXRfbGVuKCZzaS0+cmVtX2FkZHIpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkX3J0cF9jYiwgJmF1ZF9ydGNwX2NiKTsKKworCS8qIEZvciBhIGRlbW9uc3RyYXRpb24sIGxldCdzIHVzZSBhIHRpbWVyIHRvIHNlbmQgIlJUUCIgcGFja2V0CisJICogcGVyaW9kaWNhbGx5LgorCSAqLworCXBqc3VhX3NjaGVkdWxlX3RpbWVyMigmdGltZXJfdG9fc2VuZF9hdWRfcnRwLCBjYWxsX21lZCwgMCk7CisJcGpzdWFfc2NoZWR1bGVfdGltZXIyKCZ0aW1lcl90b19zZW5kX2F1ZF9ydGNwLCBjYWxsX21lZCwgMjUwMCk7CisKKwkvKiBUT0RPOgorCSAqICAgLSBDcmVhdGUgYW5kIHN0YXJ0IHlvdXIgbWVkaWEgc3RyZWFtIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXJzCisJICogICAgIGluIHNpCisJICovCisgICAgfQorCitvbl9yZXR1cm46CisgICAgcGpfbG9nX3BvcF9pbmRlbnQoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHBqc3VhX2NoZWNrX3NuZF9kZXZfaWRsZSgpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENhbGwgQVBJIHdoaWNoIE1BWSBuZWVkIHRvIGJlIHJlLWltcGxlbWVudGVkIGlmIGRpZmZlcmVudCBiYWNrZW5kIGlzIHVzZWQuCisgKi8KKworLyogQ2hlY2sgaWYgY2FsbCBoYXMgYW4gYWN0aXZlIG1lZGlhIHNlc3Npb24uICovCitQSl9ERUYocGpfYm9vbF90KSBwanN1YV9jYWxsX2hhc19tZWRpYShwanN1YV9jYWxsX2lkIGNhbGxfaWQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9jYWxsX2hhc19tZWRpYSkKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisvKiBHZXQgdGhlIGNvbmZlcmVuY2UgcG9ydCBpZGVudGlmaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGwuICovCitQSl9ERUYocGpzdWFfY29uZl9wb3J0X2lkKSBwanN1YV9jYWxsX2dldF9jb25mX3BvcnQocGpzdWFfY2FsbF9pZCBjYWxsX2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY2FsbF9nZXRfY29uZl9wb3J0KQorICAgIHJldHVybiBQSlNVQV9JTlZBTElEX0lEOworfQorCisvKiBHZXQgbWVkaWEgc3RyZWFtIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgbWVkaWEgaW5kZXguICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX2NhbGxfZ2V0X3N0cmVhbV9pbmZvKCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZWRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzdWFfc3RyZWFtX2luZm8gKnBzaSkKK3sKKyAgICBwal9iemVybyhwc2ksIHNpemVvZigqcHNpKSk7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9jYWxsX2dldF9zdHJlYW1faW5mbykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogR2V0IG1lZGlhIHN0cmVhbSBzdGF0aXN0aWMgZm9yIHRoZSBzcGVjaWZpZWQgbWVkaWEgaW5kZXguICAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jYWxsX2dldF9zdHJlYW1fc3RhdCggcGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWVkX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqc3VhX3N0cmVhbV9zdGF0ICpzdGF0KQoreworICAgIHBqX2J6ZXJvKHN0YXQsIHNpemVvZigqc3RhdCkpOworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY2FsbF9nZXRfc3RyZWFtX3N0YXQpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qCisgKiBTZW5kIERUTUYgZGlnaXRzIHRvIHJlbW90ZSB1c2luZyBSRkMgMjgzMyBwYXlsb2FkIGZvcm1hdHMuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfY2FsbF9kaWFsX2R0bWYoIHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwKKwkJCQkJICBjb25zdCBwal9zdHJfdCAqZGlnaXRzKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY2FsbF9kaWFsX2R0bWYpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmVsb3cgYXJlIGF1eGlsaWFyeSBBUEkgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IChmZWVsIGZyZWUgdG8gaW1wbGVtZW50IHRoZW0KKyAqIHdpdGggdGhlIG90aGVyIG1lZGlhIHN0YWNrKQorICovCisKKy8qIEdldCBtYXhpbXVtIG51bWJlciBvZiBjb25mZXJlbmNlIHBvcnRzLiAqLworUEpfREVGKHVuc2lnbmVkKSBwanN1YV9jb25mX2dldF9tYXhfcG9ydHModm9pZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NvbmZfZ2V0X21heF9wb3J0cykKKyAgICByZXR1cm4gMHhGRjsKK30KKworLyogR2V0IGN1cnJlbnQgbnVtYmVyIG9mIGFjdGl2ZSBwb3J0cyBpbiB0aGUgYnJpZGdlLiAqLworUEpfREVGKHVuc2lnbmVkKSBwanN1YV9jb25mX2dldF9hY3RpdmVfcG9ydHModm9pZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0cykKKyAgICByZXR1cm4gMDsKK30KKworLyogRW51bWVyYXRlIGFsbCBjb25mZXJlbmNlIHBvcnRzLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9lbnVtX2NvbmZfcG9ydHMocGpzdWFfY29uZl9wb3J0X2lkIGlkW10sCisJCQkJCSAgdW5zaWduZWQgKmNvdW50KQoreworICAgICpjb3VudCA9IDA7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9lbnVtX2NvbmZfcG9ydHMpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGNvbmZlcmVuY2UgcG9ydCAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX2dldF9wb3J0X2luZm8oIHBqc3VhX2NvbmZfcG9ydF9pZCBpZCwKKwkJCQkJICAgICAgcGpzdWFfY29uZl9wb3J0X2luZm8gKmluZm8pCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9jb25mX2dldF9wb3J0X2luZm8pCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIEFkZCBhcmJpdHJhcnkgbWVkaWEgcG9ydCB0byBQSlNVQSdzIGNvbmZlcmVuY2UgYnJpZGdlLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX2FkZF9wb3J0KCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSBwam1lZGlhX3BvcnQgKnBvcnQsCisJCQkJCSBwanN1YV9jb25mX3BvcnRfaWQgKnBfaWQpCit7CisgICAgKnBfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY29uZl9hZGRfcG9ydCkKKyAgICAvKiBXZSBzaG91bGQgcmV0dXJuIFBKX0VOT1RTVVAgaGVyZSwgYnV0IHRoaXMgQVBJIGlzIG5lZWRlZCBieSBwanN1YQorICAgICAqIGFwcGxpY2F0aW9uIG9yIG90aGVyd2lzZSBpdCB3aWxsIHJlZnVzZSB0byBzdGFydC4KKyAgICAgKi8KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUmVtb3ZlIGFyYml0cmFyeSBzbG90IGZyb20gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX3JlbW92ZV9wb3J0KHBqc3VhX2NvbmZfcG9ydF9pZCBpZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NvbmZfcmVtb3ZlX3BvcnQpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIEVzdGFibGlzaCB1bmlkaXJlY3Rpb25hbCBtZWRpYSBmbG93IGZyb20gc291Y2UgdG8gc2luay4gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfY29uZl9jb25uZWN0KCBwanN1YV9jb25mX3BvcnRfaWQgc291cmNlLAorCQkJCQlwanN1YV9jb25mX3BvcnRfaWQgc2luaykKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NvbmZfY29ubmVjdCkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogRGlzY29ubmVjdCBtZWRpYSBmbG93IGZyb20gdGhlIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBwb3J0LiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX2Rpc2Nvbm5lY3QoIHBqc3VhX2NvbmZfcG9ydF9pZCBzb3VyY2UsCisJCQkJCSAgIHBqc3VhX2NvbmZfcG9ydF9pZCBzaW5rKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY29uZl9kaXNjb25uZWN0KQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBBZGp1c3QgdGhlIHNpZ25hbCBsZXZlbCB0byBiZSB0cmFuc21pdHRlZCBmcm9tIHRoZSBicmlkZ2UgdG8gdGhlCisgKiBzcGVjaWZpZWQgcG9ydCBieSBtYWtpbmcgaXQgbG91ZGVyIG9yIHF1aWV0ZXIuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfY29uZl9hZGp1c3RfdHhfbGV2ZWwocGpzdWFfY29uZl9wb3J0X2lkIHNsb3QsCisJCQkJCSAgICAgICBmbG9hdCBsZXZlbCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NvbmZfYWRqdXN0X3R4X2xldmVsKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBBZGp1c3QgdGhlIHNpZ25hbCBsZXZlbCB0byBiZSByZWNlaXZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydCAodG8KKyAqIHRoZSBicmlkZ2UpIGJ5IG1ha2luZyBpdCBsb3VkZXIgb3IgcXVpZXRlci4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX2FkanVzdF9yeF9sZXZlbChwanN1YV9jb25mX3BvcnRfaWQgc2xvdCwKKwkJCQkJICAgICAgIGZsb2F0IGxldmVsKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY29uZl9hZGp1c3RfcnhfbGV2ZWwpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKworLyogR2V0IGxhc3Qgc2lnbmFsIGxldmVsIHRyYW5zbWl0dGVkIHRvIG9yIHJlY2VpdmVkIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0LiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9jb25mX2dldF9zaWduYWxfbGV2ZWwocGpzdWFfY29uZl9wb3J0X2lkIHNsb3QsCisJCQkJCQl1bnNpZ25lZCAqdHhfbGV2ZWwsCisJCQkJCQl1bnNpZ25lZCAqcnhfbGV2ZWwpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9jb25mX2dldF9zaWduYWxfbGV2ZWwpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIENyZWF0ZSBhIGZpbGUgcGxheWVyLCBhbmQgYXV0b21hdGljYWxseSBjb25uZWN0IHRoaXMgcGxheWVyIHRvCisgKiB0aGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfcGxheWVyX2NyZWF0ZSggY29uc3QgcGpfc3RyX3QgKmZpbGVuYW1lLAorCQkJCQkgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJIHBqc3VhX3BsYXllcl9pZCAqcF9pZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3BsYXllcl9jcmVhdGUpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIENyZWF0ZSBhIGZpbGUgcGxheWxpc3QgbWVkaWEgcG9ydCwgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBwb3J0CisgKiB0byB0aGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfcGxheWxpc3RfY3JlYXRlKCBjb25zdCBwal9zdHJfdCBmaWxlX25hbWVzW10sCisJCQkJCSAgIHVuc2lnbmVkIGZpbGVfY291bnQsCisJCQkJCSAgIGNvbnN0IHBqX3N0cl90ICpsYWJlbCwKKwkJCQkJICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICAgcGpzdWFfcGxheWVyX2lkICpwX2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfcGxheWxpc3RfY3JlYXRlKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBHZXQgY29uZmVyZW5jZSBwb3J0IElEIGFzc29jaWF0ZWQgd2l0aCBwbGF5ZXIuICovCitQSl9ERUYocGpzdWFfY29uZl9wb3J0X2lkKSBwanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydChwanN1YV9wbGF5ZXJfaWQgaWQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydCkKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIEdldCB0aGUgbWVkaWEgcG9ydCBmb3IgdGhlIHBsYXllci4gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfcGxheWVyX2dldF9wb3J0KCBwanN1YV9wbGF5ZXJfaWQgaWQsCisJCQkJCSAgIHBqbWVkaWFfcG9ydCAqKnBfcG9ydCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3BsYXllcl9nZXRfcG9ydCkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogU2V0IHBsYXliYWNrIHBvc2l0aW9uLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9wbGF5ZXJfc2V0X3BvcyggcGpzdWFfcGxheWVyX2lkIGlkLAorCQkJCQkgIHBqX3VpbnQzMl90IHNhbXBsZXMpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9wbGF5ZXJfc2V0X3BvcykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogQ2xvc2UgdGhlIGZpbGUsIHJlbW92ZSB0aGUgcGxheWVyIGZyb20gdGhlIGJyaWRnZSwgYW5kIGZyZWUKKyAqIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgcGxheWVyLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3BsYXllcl9kZXN0cm95KHBqc3VhX3BsYXllcl9pZCBpZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3BsYXllcl9kZXN0cm95KQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBDcmVhdGUgYSBmaWxlIHJlY29yZGVyLCBhbmQgYXV0b21hdGljYWxseSBjb25uZWN0IHRoaXMgcmVjb3JkZXIgdG8KKyAqIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9yZWNvcmRlcl9jcmVhdGUoIGNvbnN0IHBqX3N0cl90ICpmaWxlbmFtZSwKKwkJCQkJICAgdW5zaWduZWQgZW5jX3R5cGUsCisJCQkJCSAgIHZvaWQgKmVuY19wYXJhbSwKKwkJCQkJICAgcGpfc3NpemVfdCBtYXhfc2l6ZSwKKwkJCQkJICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICAgcGpzdWFfcmVjb3JkZXJfaWQgKnBfaWQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9yZWNvcmRlcl9jcmVhdGUpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKworLyogR2V0IGNvbmZlcmVuY2UgcG9ydCBhc3NvY2lhdGVkIHdpdGggcmVjb3JkZXIuICovCitQSl9ERUYocGpzdWFfY29uZl9wb3J0X2lkKSBwanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0KHBqc3VhX3JlY29yZGVyX2lkIGlkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydCkKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIEdldCB0aGUgbWVkaWEgcG9ydCBmb3IgdGhlIHJlY29yZGVyLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9yZWNvcmRlcl9nZXRfcG9ydCggcGpzdWFfcmVjb3JkZXJfaWQgaWQsCisJCQkJCSAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0KQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfcmVjb3JkZXJfZ2V0X3BvcnQpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIERlc3Ryb3kgcmVjb3JkZXIgKHRoaXMgd2lsbCBjb21wbGV0ZSByZWNvcmRpbmcpLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9yZWNvcmRlcl9kZXN0cm95KHBqc3VhX3JlY29yZGVyX2lkIGlkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfcmVjb3JkZXJfZGVzdHJveSkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogRW51bSBzb3VuZCBkZXZpY2VzLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9lbnVtX2F1ZF9kZXZzKCBwam1lZGlhX2F1ZF9kZXZfaW5mbyBpbmZvW10sCisJCQkJCSB1bnNpZ25lZCAqY291bnQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9lbnVtX2F1ZF9kZXZzKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX2VudW1fc25kX2RldnMoIHBqbWVkaWFfc25kX2Rldl9pbmZvIGluZm9bXSwKKwkJCQkJIHVuc2lnbmVkICpjb3VudCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2VudW1fc25kX2RldnMpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIFNlbGVjdCBvciBjaGFuZ2Ugc291bmQgZGV2aWNlLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9zZXRfc25kX2RldiggaW50IGNhcHR1cmVfZGV2LCBpbnQgcGxheWJhY2tfZGV2KQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfc2V0X3NuZF9kZXYpCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEdldCBjdXJyZW50bHkgYWN0aXZlIHNvdW5kIGRldmljZXMuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX2dldF9zbmRfZGV2KGludCAqY2FwdHVyZV9kZXYsIGludCAqcGxheWJhY2tfZGV2KQoreworICAgICpjYXB0dXJlX2RldiA9ICpwbGF5YmFja19kZXYgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfZ2V0X3NuZF9kZXYpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIFVzZSBudWxsIHNvdW5kIGRldmljZS4gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfc2V0X251bGxfc25kX2Rldih2b2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfc2V0X251bGxfc25kX2RldikKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogVXNlIG5vIGRldmljZSEgKi8KK1BKX0RFRihwam1lZGlhX3BvcnQqKSBwanN1YV9zZXRfbm9fc25kX2Rldih2b2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfc2V0X25vX3NuZF9kZXYpCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENvbmZpZ3VyZSB0aGUgQUVDIHNldHRpbmdzIG9mIHRoZSBzb3VuZCBwb3J0LiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9zZXRfZWModW5zaWduZWQgdGFpbF9tcywgdW5zaWduZWQgb3B0aW9ucykKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3NldF9lYykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogR2V0IGN1cnJlbnQgQUVDIHRhaWwgbGVuZ3RoLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9nZXRfZWNfdGFpbCh1bnNpZ25lZCAqcF90YWlsX21zKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfZ2V0X2VjX3RhaWwpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgdGhlIHNvdW5kIGRldmljZSBpcyBjdXJyZW50bHkgYWN0aXZlLiAqLworUEpfREVGKHBqX2Jvb2xfdCkgcGpzdWFfc25kX2lzX2FjdGl2ZSh2b2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfc25kX2lzX2FjdGl2ZSkKKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKy8qIENvbmZpZ3VyZSBzb3VuZCBkZXZpY2Ugc2V0dGluZyB0byB0aGUgc291bmQgZGV2aWNlIGJlaW5nIHVzZWQuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3NuZF9zZXRfc2V0dGluZyggcGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisJCQkJCSAgIGNvbnN0IHZvaWQgKnB2YWwsIHBqX2Jvb2xfdCBrZWVwKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfc25kX3NldF9zZXR0aW5nKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBSZXRyaWV2ZSBhIHNvdW5kIGRldmljZSBzZXR0aW5nLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV9zbmRfZ2V0X3NldHRpbmcocGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsIHZvaWQgKnB2YWwpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV9zbmRfZ2V0X3NldHRpbmcpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy8zcmRwYXJ0eV9tZWRpYV9zYW1wbGUvYWx0X3Bqc3VhX3ZpZC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvM3JkcGFydHlfbWVkaWFfc2FtcGxlL2FsdF9wanN1YV92aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY3YWZmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvM3JkcGFydHlfbWVkaWFfc2FtcGxlL2FsdF9wanN1YV92aWQuYwpAQCAtMCwwICsxLDYwMiBAQAorLyogJElkOiBhbHRfcGpzdWFfdmlkLmMgNDE3NCAyMDEyLTA2LTIxIDA4OjA5OjUzWiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YS5oPgorI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YV9pbnRlcm5hbC5oPgorCisjaWYgZGVmaW5lZChQSlNVQV9NRURJQV9IQVNfUEpNRURJQSkgJiYgUEpTVUFfTUVESUFfSEFTX1BKTUVESUEgIT0gMAorIyAgZXJyb3IgVGhlIFBKU1VBX01FRElBX0hBU19QSk1FRElBIHNob3VsZCBiZSBkZWNsYXJlZCBhcyB6ZXJvCisjZW5kaWYKKworI2lmIFBKU1VBX0hBU19WSURFTworCisjZGVmaW5lIFRISVNfRklMRQkJImFsdF9wanN1YV92aWQuYyIKKyNkZWZpbmUgVU5JTVBMRU1FTlRFRChmdW5jKQlQSl9MT0coMiwoVEhJU19GSUxFLCAiKioqIENhbGwgdG8gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiAlcyAqKioiLCAjZnVuYykpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE91ciB2aWRlbyBjb2RlYyBkZXNjcmlwdG9ycworICovCitzdHJ1Y3QgYWx0X2NvZGVjX2Rlc2MKK3sKKyAgICAvKiBQcmVkZWZpbmVkIGluZm8gKi8KKyAgICBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICAgICAgIGluZm87CisgICAgcGptZWRpYV9mb3JtYXRfaWQJCSBiYXNlX2ZtdF9pZDsKKyAgICBwal91aW50MzJfdAkJCSBhdmdfYnBzOworICAgIHBqX3VpbnQzMl90CQkJIG1heF9icHM7CisgICAgcGptZWRpYV9jb2RlY19mbXRwCQkgZGVjX2ZtdHA7Cit9IGFsdF92aWRfY29kZWNzW10gPQoreworICAgIC8qIEguMjYzKyAqLworICAgIHsKKwl7UEpNRURJQV9GT1JNQVRfSDI2M1AsIFBKTUVESUFfUlRQX1BUX0gyNjNQLCB7IkgyNjMtMTk5OCIsOX0sCisJIHsiSC4yNjMgY29kZWMiLCAxMX0sIDkwMDAwLCBQSk1FRElBX0RJUl9FTkNPRElOR19ERUNPRElORywKKwkgMCwge1BKTUVESUFfRk9STUFUX1JHQjI0fSwgUEpNRURJQV9WSURfUEFDS0lOR19QQUNLRVRTCisJfSwKKwlQSk1FRElBX0ZPUk1BVF9IMjYzLAkyNTYwMDAsICAgIDUxMjAwMCwKKwl7MiwgeyB7eyJDSUYiLDN9LCAgIHsiMSIsMX19LAorCSAgICAgIHt7IlFDSUYiLDR9LCAgeyIxIiwxfX0sIH0gfSwKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsdF9jb2RlY19kZXNjKiBmaW5kX2NvZGVjX2Rlc2NfYnlfaW5mbyhjb25zdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICppbmZvKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShhbHRfdmlkX2NvZGVjcyk7ICsraSkgeworCXN0cnVjdCBhbHRfY29kZWNfZGVzYyAqZGVzYyA9ICZhbHRfdmlkX2NvZGVjc1tpXTsKKwlpZiAoKGRlc2MtPmluZm8uZm10X2lkID09IGluZm8tPmZtdF9pZCkgJiYKKyAgICAgICAgICAgICgoZGVzYy0+aW5mby5kaXIgJiBpbmZvLT5kaXIpID09IGluZm8tPmRpcikgJiYKKwkgICAgKGRlc2MtPmluZm8ucHQgPT0gaW5mby0+cHQpICYmCisJICAgIChkZXNjLT5pbmZvLnBhY2tpbmdzICYgaW5mby0+cGFja2luZ3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVzYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgYWx0X3ZpZF9jb2RlY190ZXN0X2FsbG9jKCBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqaWQgKQoreworICAgIGNvbnN0IHN0cnVjdCBhbHRfY29kZWNfZGVzYyAqZGVzYyA9IGZpbmRfY29kZWNfZGVzY19ieV9pbmZvKGlkKTsKKyAgICByZXR1cm4gZGVzYz8gUEpfU1VDQ0VTUyA6IFBKTUVESUFfQ09ERUNfRVVOU1VQOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgYWx0X3ZpZF9jb2RlY19kZWZhdWx0X2F0dHIoIHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICphdHRyICkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYWx0X2NvZGVjX2Rlc2MgKmRlc2MgPSBmaW5kX2NvZGVjX2Rlc2NfYnlfaW5mbyhpbmZvKTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gUEpNRURJQV9DT0RFQ19FVU5TVVA7CisKKyAgICBwal9iemVybyhhdHRyLCBzaXplb2YocGptZWRpYV92aWRfY29kZWNfcGFyYW0pKTsKKworICAgIC8qIFNjYW4gdGhlIHJlcXVlc3RlZCBwYWNraW5ncyBhbmQgdXNlIHRoZSBsb3dlc3QgbnVtYmVyICovCisgICAgYXR0ci0+cGFja2luZyA9IDA7CisgICAgZm9yIChpPTA7IGk8MTU7ICsraSkgeworCXVuc2lnbmVkIHBhY2tpbmcgPSAoMSA8PCBpKTsKKwlpZiAoKGRlc2MtPmluZm8ucGFja2luZ3MgJiBpbmZvLT5wYWNraW5ncykgJiBwYWNraW5nKSB7CisJICAgIGF0dHItPnBhY2tpbmcgPSAocGptZWRpYV92aWRfcGFja2luZylwYWNraW5nOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChhdHRyLT5wYWNraW5nID09IDApIHsKKwkvKiBObyBzdXBwb3J0ZWQgcGFja2luZyBpbiBpbmZvICovCisJcmV0dXJuIFBKTUVESUFfQ09ERUNfRVVOU1VQOworICAgIH0KKworICAgIC8qIERpcmVjdGlvbiAqLworICAgIGF0dHItPmRpciA9IGRlc2MtPmluZm8uZGlyOworCisgICAgLyogRW5jb2RlZCBmb3JtYXQgKi8KKyAgICBwam1lZGlhX2Zvcm1hdF9pbml0X3ZpZGVvKCZhdHRyLT5lbmNfZm10LCBkZXNjLT5pbmZvLmZtdF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMCwgNDgwLCAzMDAwMCwgMTAwMSk7CisKKyAgICAvKiBEZWNvZGVkIGZvcm1hdCAqLworICAgIHBqbWVkaWFfZm9ybWF0X2luaXRfdmlkZW8oJmF0dHItPmRlY19mbXQsIGRlc2MtPmluZm8uZGVjX2ZtdF9pZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMzUyLCAyODgsIDMwMDAwLCAxMDAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMCwgNTc2LCAzMDAwMCwgMTAwMSk7CisKKyAgICAvKiBEZWNvZGluZyBmbXRwICovCisgICAgYXR0ci0+ZGVjX2ZtdHAgPSBkZXNjLT5kZWNfZm10cDsKKworICAgIC8qIEJpdHJhdGUgKi8KKyAgICBhdHRyLT5lbmNfZm10LmRldC52aWQuYXZnX2JwcyA9IGRlc2MtPmF2Z19icHM7CisgICAgYXR0ci0+ZW5jX2ZtdC5kZXQudmlkLm1heF9icHMgPSBkZXNjLT5tYXhfYnBzOworCisgICAgLyogTVRVICovCisgICAgYXR0ci0+ZW5jX210dSA9IFBKTUVESUFfTUFYX01UVTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCBhbHRfdmlkX2NvZGVjX2VudW1fY29kZWNzKCBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5ICpmYWN0b3J5LAorCQkJCQkgICAgICB1bnNpZ25lZCAqY291bnQsCisJCQkJCSAgICAgIHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gY29kZWNzW10pCit7CisgICAgdW5zaWduZWQgaSwgbWF4X2NudDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oY29kZWNzICYmICpjb3VudCA+IDAsIFBKX0VJTlZBTCk7CisKKyAgICBtYXhfY250ID0gUEpfTUlOKCpjb3VudCwgUEpfQVJSQVlfU0laRShhbHRfdmlkX2NvZGVjcykpOworICAgICpjb3VudCA9IDA7CisKKyAgICBmb3IgKGk9MDsgaTxtYXhfY250OyArK2kpIHsKKwlwal9tZW1jcHkoJmNvZGVjc1sqY291bnRdLCAmYWx0X3ZpZF9jb2RlY3NbaV0uaW5mbywKKwkJICBzaXplb2YocGptZWRpYV92aWRfY29kZWNfaW5mbykpOworCSgqY291bnQpKys7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHBqX3N0YXR1c190IGFsdF92aWRfY29kZWNfYWxsb2NfY29kZWMoIHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisJCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKmluZm8sCisJCQkJCSAgICAgIHBqbWVkaWFfdmlkX2NvZGVjICoqcF9jb2RlYykKK3sKKyAgICAvKiBUaGlzIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZCBzaW5jZSB3ZSB3b24ndCBiZSB1c2luZyB0aGlzIGNvZGVjICovCisgICAgVU5JTVBMRU1FTlRFRChhbHRfdmlkX2NvZGVjX2FsbG9jX2NvZGVjKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCBhbHRfdmlkX2NvZGVjX2RlYWxsb2NfY29kZWMoIHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMgKQoreworICAgIC8qIFRoaXMgd2lsbCBuZXZlciBnZXQgY2FsbGVkIHNpbmNlIHdlIHdvbid0IGJlIHVzaW5nIHRoaXMgY29kZWMgKi8KKyAgICBVTklNUExFTUVOVEVEKGFsdF92aWRfY29kZWNfZGVhbGxvY19jb2RlYykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworc3RhdGljIHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3Rvcnlfb3AgYWx0X3ZpZF9jb2RlY19mYWN0b3J5X29wID0KK3sKKyAgICAmYWx0X3ZpZF9jb2RlY190ZXN0X2FsbG9jLAorICAgICZhbHRfdmlkX2NvZGVjX2RlZmF1bHRfYXR0ciwKKyAgICAmYWx0X3ZpZF9jb2RlY19lbnVtX2NvZGVjcywKKyAgICAmYWx0X3ZpZF9jb2RlY19hbGxvY19jb2RlYywKKyAgICAmYWx0X3ZpZF9jb2RlY19kZWFsbG9jX2NvZGVjCit9OworCitzdGF0aWMgc3RydWN0IGFsdF92aWRfY29kZWNfZmFjdG9yeSB7CisgICAgcGptZWRpYV92aWRfY29kZWNfZmFjdG9yeSAgICBiYXNlOworfSBhbHRfdmlkX2NvZGVjX2ZhY3Rvcnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW8gQVBJIGltcGxlbWVudGF0aW9uCisgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gbGlicmFyeSAqLworcGpfc3RhdHVzX3QgcGpzdWFfdmlkX3N1YnN5c19pbml0KHZvaWQpCit7CisgICAgcGptZWRpYV92aWRfY29kZWNfbWdyICptZ3I7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogRm9ybWF0IG1hbmFnZXIgc2luZ2xldG9uIGlzIG5lZWRlZCAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9jcmVhdGUocGpzdWFfdmFyLnBvb2wsIDY0LCAwLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsCisJCSAgICAgIkVycm9yIGNyZWF0aW5nIFBKTUVESUEgdmlkZW8gZm9ybWF0IG1hbmFnZXIiKSk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdmlkZW8gY29kZWMgbWFuYWdlciBzaW5nbGV0b24gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19tZ3JfY3JlYXRlKHBqc3VhX3Zhci5wb29sLCAmbWdyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsCisJCSAgICAgIkVycm9yIGNyZWF0aW5nIFBKTUVESUEgdmlkZW8gY29kZWMgbWFuYWdlciIpKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIG91ciBjb2RlY3MgKi8KKyAgICBhbHRfdmlkX2NvZGVjX2ZhY3RvcnkuYmFzZS5vcCA9ICZhbHRfdmlkX2NvZGVjX2ZhY3Rvcnlfb3A7CisgICAgYWx0X3ZpZF9jb2RlY19mYWN0b3J5LmJhc2UuZmFjdG9yeV9kYXRhID0gTlVMTDsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2NvZGVjX21ncl9yZWdpc3Rlcl9mYWN0b3J5KG1nciwgJmFsdF92aWRfY29kZWNfZmFjdG9yeS5iYXNlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIC8qCisgICAgICogVE9ETzogcHV0IHlvdXIgM3JkIHBhcnR5IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gcm91dGluZSBoZXJlCisgICAgICovCisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU3RhcnQgdGhlIHZpZGVvIGxpYnJhcnkgKi8KK3BqX3N0YXR1c190IHBqc3VhX3ZpZF9zdWJzeXNfc3RhcnQodm9pZCkKK3sKKyAgICAvKgorICAgICAqIFRPRE86IHB1dCB5b3VyIDNyZCBwYXJ0eSBsaWJyYXJ5IHN0YXJ0dXAgcm91dGluZSBoZXJlCisgICAgICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIENsZWFudXAgYW5kIGRlaW5pdGlhbGl6ZSB0aGUgdmlkZW8gbGlicmFyeSAqLworcGpfc3RhdHVzX3QgcGpzdWFfdmlkX3N1YnN5c19kZXN0cm95KHZvaWQpCit7CisgICAgaWYgKHBqbWVkaWFfdmlkX2NvZGVjX21ncl9pbnN0YW5jZSgpKQorCXBqbWVkaWFfdmlkX2NvZGVjX21ncl9kZXN0cm95KE5VTEwpOworCisgICAgaWYgKHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9pbnN0YW5jZSgpKQorCXBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9kZXN0cm95KE5VTEwpOworCisgICAgLyoKKyAgICAgKiBUT0RPOiBwdXQgeW91ciAzcmQgcGFydHkgbGlicmFyeSBjbGVhbnVwIHJvdXRpbmUgaGVyZQorICAgICAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBJbml0aWFsaXplIHZpZGVvIGNhbGwgbWVkaWEgKi8KK3BqX3N0YXR1c190IHBqc3VhX3ZpZF9jaGFubmVsX2luaXQocGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQpCit7CisgICAgLyoKKyAgICAgKiBUT0RPOiBwdXQgY2FsbCBtZWRpYSBpbml0aWFsaXphdGlvbgorICAgICAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBzdG9wIHZpZGVvIHN0cmVhbSAqLwordm9pZCBwanN1YV92aWRfc3RvcF9zdHJlYW0ocGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQpCit7CisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlN0b3BwaW5nIHZpZGVvIHN0cmVhbS4uIikpOworCisgICAgaWYgKGNhbGxfbWVkLT50cCkgeworCXBqbWVkaWFfdHJhbnNwb3J0X2RldGFjaChjYWxsX21lZC0+dHAsIGNhbGxfbWVkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRPRE86CisgICAgICogICAtIHN0b3AgeW91ciB2aWRlbyBzdHJlYW0gaGVyZQorICAgICAqLworCit9CisKKy8qIE91ciBjYWxsYmFjayB0byByZWNlaXZlIGluY29taW5nIFJUUCBwYWNrZXRzICovCitzdGF0aWMgdm9pZCB2aWRfcnRwX2NiKHZvaWQgKnVzZXJfZGF0YSwgdm9pZCAqcGt0LCBwal9zc2l6ZV90IHNpemUpCit7CisgICAgcGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQgPSAocGpzdWFfY2FsbF9tZWRpYSopIHVzZXJfZGF0YTsKKworICAgIC8qIFRPRE86IERvIHNvbWV0aGluZyB3aXRoIHRoZSBwYWNrZXQgKi8KKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiUlggJWQgYnl0ZXMgdmlkZW8gUlRQIHBhY2tldCIsIChpbnQpc2l6ZSkpOworfQorCisvKiBPdXIgY2FsbGJhY2sgdG8gcmVjZWl2ZSBSVENQIHBhY2tldHMgKi8KK3N0YXRpYyB2b2lkIHZpZF9ydGNwX2NiKHZvaWQgKnVzZXJfZGF0YSwgdm9pZCAqcGt0LCBwal9zc2l6ZV90IHNpemUpCit7CisgICAgcGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQgPSAocGpzdWFfY2FsbF9tZWRpYSopIHVzZXJfZGF0YTsKKworICAgIC8qIFRPRE86IERvIHNvbWV0aGluZyB3aXRoIHRoZSBwYWNrZXQgaGVyZSAqLworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJSWCAlZCBieXRlcyB2aWRlbyBSVENQIHBhY2tldCIsIChpbnQpc2l6ZSkpOworfQorCisvKiBBIGRlbW8gZnVuY3Rpb24gdG8gc2VuZCBkdW1teSAiUlRQIiBwYWNrZXRzIHBlcmlvZGljYWxseS4gWW91IHdvdWxkIG5vdAorICogbmVlZCB0byBoYXZlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIHJlYWwgYXBwIQorICovCitzdGF0aWMgdm9pZCB0aW1lcl90b19zZW5kX3ZpZF9ydHAodm9pZCAqdXNlcl9kYXRhKQoreworICAgIHBqc3VhX2NhbGxfbWVkaWEgKmNhbGxfbWVkID0gKHBqc3VhX2NhbGxfbWVkaWEqKSB1c2VyX2RhdGE7CisgICAgY29uc3QgY2hhciAqcGt0ID0gIk5vdCBSVFAgcGFja2V0IjsKKworICAgIGlmICghY2FsbF9tZWQtPmNhbGwgfHwgIWNhbGxfbWVkLT5jYWxsLT5pbnYgfHwgIWNhbGxfbWVkLT50cCkgeworCS8qIENhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkLiBUaGVyZSBpcyByYWNlIGNvbmRpdGlvbiBoZXJlIGFzCisJICogdGhpcyBjYiBtYXkgYmUgY2FsbGVkIHNvbWV0aW1lIGFmdGVyIGNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJcmV0dXJuOworICAgIH0KKworICAgIHBqbWVkaWFfdHJhbnNwb3J0X3NlbmRfcnRwKGNhbGxfbWVkLT50cCwgcGt0LCBzdHJsZW4ocGt0KSk7CisKKyAgICBwanN1YV9zY2hlZHVsZV90aW1lcjIoJnRpbWVyX3RvX3NlbmRfdmlkX3J0cCwgY2FsbF9tZWQsIDIwMDApOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl90b19zZW5kX3ZpZF9ydGNwKHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBwanN1YV9jYWxsX21lZGlhICpjYWxsX21lZCA9IChwanN1YV9jYWxsX21lZGlhKikgdXNlcl9kYXRhOworICAgIGNvbnN0IGNoYXIgKnBrdCA9ICJOb3QgUlRDUCBwYWNrZXQiOworCisgICAgaWYgKCFjYWxsX21lZC0+Y2FsbCB8fCAhY2FsbF9tZWQtPmNhbGwtPmludiB8fCAhY2FsbF9tZWQtPnRwKSB7CisJLyogQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuIFRoZXJlIGlzIHJhY2UgY29uZGl0aW9uIGhlcmUgYXMKKwkgKiB0aGlzIGNiIG1heSBiZSBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgY2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KKwlyZXR1cm47CisgICAgfQorCisgICAgcGptZWRpYV90cmFuc3BvcnRfc2VuZF9ydGNwKGNhbGxfbWVkLT50cCwgcGt0LCBzdHJsZW4ocGt0KSk7CisKKyAgICBwanN1YV9zY2hlZHVsZV90aW1lcjIoJnRpbWVyX3RvX3NlbmRfdmlkX3J0Y3AsIGNhbGxfbWVkLCA1MDAwKTsKK30KKworLyogdXBkYXRlIHZpZGVvIGNoYW5uZWwgYWZ0ZXIgU0RQIG5lZ290aWF0aW9uICovCitwal9zdGF0dXNfdCBwanN1YV92aWRfY2hhbm5lbF91cGRhdGUocGpzdWFfY2FsbF9tZWRpYSAqY2FsbF9tZWQsCisJCQkJICAgICBwal9wb29sX3QgKnRtcF9wb29sLAorCQkJCSAgICAgcGptZWRpYV92aWRfc3RyZWFtX2luZm8gKnNpLAorCQkJCSAgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqbG9jYWxfc2RwLAorCQkJCSAgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqcmVtb3RlX3NkcCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlZpZGVvIGNoYW5uZWwgdXBkYXRlLi4iKSk7CisgICAgcGpfbG9nX3B1c2hfaW5kZW50KCk7CisKKyAgICAvKiBDaGVjayBpZiBubyBtZWRpYSBpcyBhY3RpdmUgKi8KKyAgICBpZiAoc2ktPmRpciAhPSBQSk1FRElBX0RJUl9OT05FKSB7CisJLyogQXR0YWNoIG91ciBSVFAgYW5kIFJUQ1AgY2FsbGJhY2tzIHRvIHRoZSBtZWRpYSB0cmFuc3BvcnQgKi8KKwlzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9hdHRhY2goY2FsbF9tZWQtPnRwLCBjYWxsX21lZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpLT5yZW1fYWRkciwgJnNpLT5yZW1fcnRjcCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc29ja2FkZHJfZ2V0X2xlbigmc2ktPnJlbV9hZGRyKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZF9ydHBfY2IsICZ2aWRfcnRjcF9jYik7CisJLyoKKwkgKiBUT0RPOgorCSAqICAgLSBDcmVhdGUgYW5kIHN0YXJ0IHlvdXIgdmlkZW8gc3RyZWFtIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXJzCisJICogICAgIGluIHNpCisJICovCisKKwkvKiBGb3IgYSBkZW1vbnN0cmF0aW9uLCBsZXQncyB1c2UgYSB0aW1lciB0byBzZW5kICJSVFAiIHBhY2tldAorCSAqIHBlcmlvZGljYWxseS4KKwkgKi8KKwlwanN1YV9zY2hlZHVsZV90aW1lcjIoJnRpbWVyX3RvX3NlbmRfdmlkX3J0cCwgY2FsbF9tZWQsIDEwMDApOworCXBqc3VhX3NjaGVkdWxlX3RpbWVyMigmdGltZXJfdG9fc2VuZF92aWRfcnRjcCwgY2FsbF9tZWQsIDM1MDApOworICAgIH0KKworICAgIHBqX2xvZ19wb3BfaW5kZW50KCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmV2aWV3CisgKi8KKworUEpfREVGKHZvaWQpCitwanN1YV9jYWxsX3ZpZF9zdHJtX29wX3BhcmFtX2RlZmF1bHQocGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbSAqcGFyYW0pCit7CisgICAgcGpfYnplcm8ocGFyYW0sIHNpemVvZigqcGFyYW0pKTsKKyAgICBwYXJhbS0+bWVkX2lkeCA9IC0xOworICAgIHBhcmFtLT5kaXIgPSBQSk1FRElBX0RJUl9FTkNPRElOR19ERUNPRElORzsKKyAgICBwYXJhbS0+Y2FwX2RldiA9IFBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVY7Cit9CisKK1BKX0RFRih2b2lkKSBwanN1YV92aWRfcHJldmlld19wYXJhbV9kZWZhdWx0KHBqc3VhX3ZpZF9wcmV2aWV3X3BhcmFtICpwKQoreworICAgIHAtPnJlbmRfaWQgPSBQSk1FRElBX1ZJRF9ERUZBVUxUX1JFTkRFUl9ERVY7CisgICAgcC0+c2hvdyA9IFBKX1RSVUU7Cit9CisKK1BKX0RFRihwanN1YV92aWRfd2luX2lkKSBwanN1YV92aWRfcHJldmlld19nZXRfd2luKHBqbWVkaWFfdmlkX2Rldl9pbmRleCBpZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF9wcmV2aWV3X2dldF93aW4pCisgICAgcmV0dXJuIFBKU1VBX0lOVkFMSURfSUQ7Cit9CisKKy8qIFJlc2V0IGludGVybmFsIHdpbmRvdyBzdHJ1Y3R1cmUuIE5vdCBzdXJlIGlmIHRoaXMgaXMgbmVlZGVkPy4gKi8KK1BKX0RFRih2b2lkKSBwanN1YV92aWRfd2luX3Jlc2V0KHBqc3VhX3ZpZF93aW5faWQgd2lkKQoreworICAgIHBqc3VhX3ZpZF93aW4gKncgPSAmcGpzdWFfdmFyLndpblt3aWRdOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IHctPnBvb2w7CisKKyAgICBwal9iemVybyh3LCBzaXplb2YoKncpKTsKKyAgICBpZiAocG9vbCkgcGpfcG9vbF9yZXNldChwb29sKTsKKyAgICB3LT5yZWZfY250ID0gMDsKKyAgICB3LT5wb29sID0gcG9vbDsKKyAgICB3LT5wcmV2aWV3X2NhcF9pZCA9IFBKTUVESUFfVklEX0lOVkFMSURfREVWOworfQorCisvKiBEb2VzIGl0IGhhdmUgYnVpbHQtaW4gcHJldmlldyBzdXBwb3J0LiAqLworUEpfREVGKHBqX2Jvb2xfdCkgcGpzdWFfdmlkX3ByZXZpZXdfaGFzX25hdGl2ZShwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV92aWRfcHJldmlld19oYXNfbmF0aXZlKQorICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworLyogU3RhcnQgdmlkZW8gcHJldmlldyB3aW5kb3cgZm9yIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBkZXZpY2UuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9wcmV2aWV3X3N0YXJ0KHBqbWVkaWFfdmlkX2Rldl9pbmRleCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpzdWFfdmlkX3ByZXZpZXdfcGFyYW0gKnBybSkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF9wcmV2aWV3X3N0YXJ0KQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBTdG9wIHZpZGVvIHByZXZpZXcuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9wcmV2aWV3X3N0b3AocGptZWRpYV92aWRfZGV2X2luZGV4IGlkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX3ByZXZpZXdfc3RvcCkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZXMuCisgKi8KKworLyogR2V0IHRoZSBudW1iZXIgb2YgdmlkZW8gZGV2aWNlcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4gKi8KK1BKX0RFRih1bnNpZ25lZCkgcGpzdWFfdmlkX2Rldl9jb3VudCh2b2lkKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX2Rldl9jb3VudCkKKyAgICByZXR1cm4gMDsKK30KKworLyogUmV0cmlldmUgdGhlIHZpZGVvIGRldmljZSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSBpbmRleC4gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfdmlkX2Rldl9nZXRfaW5mbyhwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2luZm8gKnZkaSkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF9kZXZfZ2V0X2luZm8pCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIEVudW0gYWxsIHZpZGVvIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9lbnVtX2RldnMocGptZWRpYV92aWRfZGV2X2luZm8gaW5mb1tdLAorCQkJCQl1bnNpZ25lZCAqY291bnQpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV92aWRfZW51bV9kZXZzKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29kZWNzLgorICovCisKKy8qIEVudW0gYWxsIHN1cHBvcnRlZCB2aWRlbyBjb2RlY3MgaW4gdGhlIHN5c3RlbS4gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpzdWFfdmlkX2VudW1fY29kZWNzKCBwanN1YV9jb2RlY19pbmZvIGlkW10sCisJCQkJCSAgIHVuc2lnbmVkICpwX2NvdW50ICkKK3sKKyAgICBwam1lZGlhX3ZpZF9jb2RlY19pbmZvIGluZm9bMzJdOworICAgIHVuc2lnbmVkIGksIGosIGNvdW50LCBwcmlvWzMyXTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBjb3VudCA9IFBKX0FSUkFZX1NJWkUoaW5mbyk7CisgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2VudW1fY29kZWNzKE5VTEwsICZjb3VudCwgaW5mbywgcHJpbyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJKnBfY291bnQgPSAwOworCXJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGZvciAoaT0wLCBqPTA7IGk8Y291bnQgJiYgajwqcF9jb3VudDsgKytpKSB7CisJaWYgKGluZm9baV0ucGFja2luZ3MgJiBQSk1FRElBX1ZJRF9QQUNLSU5HX1BBQ0tFVFMpIHsKKwkgICAgcGpfYnplcm8oJmlkW2pdLCBzaXplb2YocGpzdWFfY29kZWNfaW5mbykpOworCisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX2luZm9fdG9faWQoJmluZm9baV0sIGlkW2pdLmJ1Zl8sIHNpemVvZihpZFtqXS5idWZfKSk7CisJICAgIGlkW2pdLmNvZGVjX2lkID0gcGpfc3RyKGlkW2pdLmJ1Zl8pOworCSAgICBpZFtqXS5wcmlvcml0eSA9IChwal91aW50OF90KSBwcmlvW2ldOworCisJICAgIGlmIChpZFtqXS5jb2RlY19pZC5zbGVuIDwgc2l6ZW9mKGlkW2pdLmJ1Zl8pKSB7CisJCWlkW2pdLmRlc2MucHRyID0gaWRbal0uY29kZWNfaWQucHRyICsgaWRbal0uY29kZWNfaWQuc2xlbiArIDE7CisJCXBqX3N0cm5jcHkoJmlkW2pdLmRlc2MsICZpbmZvW2ldLmVuY29kaW5nX2Rlc2MsCisJCQkgICBzaXplb2YoaWRbal0uYnVmXykgLSBpZFtqXS5jb2RlY19pZC5zbGVuIC0gMSk7CisJICAgIH0KKworCSAgICArK2o7CisJfQorICAgIH0KKworICAgICpwX2NvdW50ID0gajsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQ2hhbmdlIHZpZGVvIGNvZGVjIHByaW9yaXR5LiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV92aWRfY29kZWNfc2V0X3ByaW9yaXR5KCBjb25zdCBwal9zdHJfdCAqY29kZWNfaWQsCisJCQkJCQkgIHBqX3VpbnQ4X3QgcHJpb3JpdHkgKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX2NvZGVjX3NldF9wcmlvcml0eSkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogR2V0IHZpZGVvIGNvZGVjIHBhcmFtZXRlcnMuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9jb2RlY19nZXRfcGFyYW0oCisJCQkJCWNvbnN0IHBqX3N0cl90ICpjb2RlY19pZCwKKwkJCQkJcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX2NvZGVjX2dldF9wYXJhbSkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogU2V0IHZpZGVvIGNvZGVjIHBhcmFtZXRlcnMuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9jb2RlY19zZXRfcGFyYW0oCisJCQkJCWNvbnN0IHBqX3N0cl90ICpjb2RlY19pZCwKKwkJCQkJY29uc3QgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX2NvZGVjX3NldF9wYXJhbSkKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdpbmRvdworICovCisKKy8qIEVudW1lcmF0ZXMgYWxsIHZpZGVvIHdpbmRvd3MuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF9lbnVtX3dpbnMoIHBqc3VhX3ZpZF93aW5faWQgd2lkc1tdLAorCQkJCQkgdW5zaWduZWQgKmNvdW50KQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX2VudW1fd2lucykKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyogR2V0IHdpbmRvdyBpbmZvLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV92aWRfd2luX2dldF9pbmZvKCBwanN1YV92aWRfd2luX2lkIHdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzdWFfdmlkX3dpbl9pbmZvICp3aSkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF93aW5fZ2V0X2luZm8pCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIFNob3cgb3IgaGlkZSB3aW5kb3cuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF93aW5fc2V0X3Nob3coIHBqc3VhX3ZpZF93aW5faWQgd2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3Qgc2hvdykKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF93aW5fc2V0X3Nob3cpCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qIFNldCB2aWRlbyB3aW5kb3cgcG9zaXRpb24uICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF93aW5fc2V0X3BvcyggcGpzdWFfdmlkX3dpbl9pZCB3aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9jb29yZCAqcG9zKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfdmlkX3dpbl9zZXRfcG9zKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBSZXNpemUgd2luZG93LiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwanN1YV92aWRfd2luX3NldF9zaXplKCBwanN1YV92aWRfd2luX2lkIHdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9yZWN0X3NpemUgKnNpemUpCit7CisgICAgVU5JTVBMRU1FTlRFRChwanN1YV92aWRfd2luX3NldF9zaXplKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBTZXQgdmlkZW8gb3JpZW50YXRpb24uICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX3ZpZF93aW5fcm90YXRlKCBwanN1YV92aWRfd2luX2lkIHdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmdsZSkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX3ZpZF93aW5fcm90YXRlKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBTdGFydCwgc3RvcCwgYW5kL29yIG1hbmlwdWxhdGUgdmlkZW8gdHJhbnNtaXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIGNhbGwuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqc3VhX2NhbGxfc2V0X3ZpZF9zdHJtICgKKwkJCQlwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkJcGpzdWFfY2FsbF92aWRfc3RybV9vcCBvcCwKKwkJCQljb25zdCBwanN1YV9jYWxsX3ZpZF9zdHJtX29wX3BhcmFtICpwYXJhbSkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NhbGxfc2V0X3ZpZF9zdHJtKQorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisKKy8qIEdldCB0aGUgbWVkaWEgc3RyZWFtIGluZGV4IG9mIHRoZSBkZWZhdWx0IHZpZGVvIHN0cmVhbSBpbiB0aGUgY2FsbC4gKi8KK1BKX0RFRihpbnQpIHBqc3VhX2NhbGxfZ2V0X3ZpZF9zdHJlYW1faWR4KHBqc3VhX2NhbGxfaWQgY2FsbF9pZCkKK3sKKyAgICBVTklNUExFTUVOVEVEKHBqc3VhX2NhbGxfZ2V0X3ZpZF9zdHJlYW1faWR4KQorICAgIHJldHVybiAtMTsKK30KKworLyogRGV0ZXJtaW5lIGlmIHZpZGVvIHN0cmVhbSBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIGlzIGN1cnJlbnRseSBydW5uaW5nCisgKiBmb3IgdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24uCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqc3VhX2NhbGxfdmlkX3N0cmVhbV9pc19ydW5uaW5nKCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lZF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9kaXIgZGlyKQoreworICAgIFVOSU1QTEVNRU5URUQocGpzdWFfY2FsbF92aWRfc3RyZWFtX2lzX3J1bm5pbmcpCisgICAgcmV0dXJuIFBKX0ZBTFNFOworfQorCisjZW5kaWYJLyogUEpTVUFfSEFTX1ZJREVPICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjLzNyZHBhcnR5X21lZGlhX3NhbXBsZS9jb25maWdfc2l0ZS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvM3JkcGFydHlfbWVkaWFfc2FtcGxlL2NvbmZpZ19zaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4M2NlYwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjLzNyZHBhcnR5X21lZGlhX3NhbXBsZS9jb25maWdfc2l0ZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBQdXQgdGhpcyBmaWxlIGluIHBqbGliL2luY2x1ZGUvcGoKKyAqLworCisvKiBzYW1wbGUgY29uZmlndXJlIGNvbW1hbmQ6CisgICBDRkxBR1M9Ii1nIC1Xbm8tdW51c2VkLWxhYmVsIiAuL2Fjb25maWd1cmUgLS1lbmFibGUtZXh0LXNvdW5kIC0tZGlzYWJsZS1zcGVleC1hZWMgLS1kaXNhYmxlLWc3MTEtY29kZWMgLS1kaXNhYmxlLWwxNi1jb2RlYyAtLWRpc2FibGUtZ3NtLWNvZGVjIC0tZGlzYWJsZS1nNzIyLWNvZGVjIC0tZGlzYWJsZS1nNzIyMS1jb2RlYyAtLWRpc2FibGUtc3BlZXgtY29kZWMgLS1kaXNhYmxlLWlsYmMtY29kZWMgLS1kaXNhYmxlLW9wZW5jb3JlLWFtcm5iIC0tZGlzYWJsZS1zZGwgLS1kaXNhYmxlLWZmbXBlZyAtLWRpc2FibGUtdjRsMgorICovCisKKyNkZWZpbmUgVEhJUkRfUEFSVFlfTUVESUEJCQkxCisKKyNpZiBUSElSRF9QQVJUWV9NRURJQQorLyoKKyAqIFNhbXBsZSBzZXR0aW5ncyBmb3IgdXNpbmcgdGhpcmQgcGFydHkgbWVkaWEgd2l0aCBwanN1YS1saWIKKyAqLworIwlkZWZpbmUgUEpTVUFfTUVESUFfSEFTX1BKTUVESUEJCTAKKyMJZGVmaW5lIFBKTUVESUFfSEFTX0c3MTFfQ09ERUMJCTAKKyMJZGVmaW5lIFBKTUVESUFfSEFTX0FMQVdfVUxBV19UQUJMRQkwCisjCWRlZmluZSBQSk1FRElBX1JFU0FNUExFX0lNUAkJUEpNRURJQV9SRVNBTVBMRV9OT05FCisjCWRlZmluZSBQSk1FRElBX0hBU19TUEVFWF9BRUMJCTAKKworIwlkZWZpbmUgUEpNRURJQV9IQVNfTDE2X0NPREVDCQkwCisjCWRlZmluZSBQSk1FRElBX0hBU19HU01fQ09ERUMJCTAKKyMJZGVmaW5lIFBKTUVESUFfSEFTX1NQRUVYX0NPREVDCQkwCisjCWRlZmluZSBQSk1FRElBX0hBU19JTEJDX0NPREVDCQkwCisjCWRlZmluZSBQSk1FRElBX0hBU19HNzIyX0NPREVDCQkwCisjCWRlZmluZSBQSk1FRElBX0hBU19HNzIyMV9DT0RFQwkJMAorIwlkZWZpbmUgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkJfQ09ERUMJMAorCisjCWRlZmluZSBQSk1FRElBX0hBU19WSURFTwkJMQorIwlkZWZpbmUgUEpNRURJQV9IQVNfRkZNUEVHCQkwCisKKyMJdW5kZWYgUEpNRURJQV9WSURFT19ERVZfSEFTX1NETAorIwlkZWZpbmUgUEpNRURJQV9WSURFT19ERVZfSEFTX1NETAkwCisjCWRlZmluZSBQSk1FRElBX1ZJREVPX0RFVl9IQVNfUVQJCTAKKyMJZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19JT1MJMAorIwlkZWZpbmUgUEpNRURJQV9WSURFT19ERVZfSEFTX0RTSE9XCTAKKyMJZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19DQkFSX1NSQwkwCisjCWRlZmluZSBQSk1FRElBX1ZJREVPX0RFVl9IQVNfRkZNUEVHCTAKKyMJdW5kZWYgUEpNRURJQV9WSURFT19ERVZfSEFTX1Y0TDIKKyMJZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19WNEwyCTAKKyNlbmRpZgkvKiBUSElSRF9QQVJUWV9NRURJQSAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9jb25mYm90L2NvbmZib3QucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9jb25mYm90L2NvbmZib3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyYzUwYwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2NvbmZib3QvY29uZmJvdC5weQpAQCAtMCwwICsxLDU3NSBAQAorIyAkSWQ6IGNvbmZib3QucHkgMjkxMiAyMDA5LTA4LTI0IDExOjU2OjEzWiBiZW5ueWxwICQKKyMKKyMgU0lQIENvbmZlcmVuY2UgQm90CisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorIworaW1wb3J0IHBqc3VhIGFzIHBqCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCisKK0NGR19GSUxFID0gImNvbmZpZyIKKworSU5GTyA9IDEKK1RSQUNFID0gMgorCQorIyBDYWxsIGNhbGxiYWNrLiBUaGlzIHdvdWxkIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQgdG8gdGhlIE1lbWJlciBjbGFzcworY2xhc3MgQ2FsbENiKHBqLkNhbGxDYWxsYmFjayk6CisJZGVmIF9faW5pdF9fKHNlbGYsIG1lbWJlciwgY2FsbD1Ob25lKToKKwkJcGouQ2FsbENhbGxiYWNrLl9faW5pdF9fKHNlbGYsIGNhbGwpCisJCXNlbGYubWVtYmVyID0gbWVtYmVyCisJCisJZGVmIG9uX3N0YXRlKHNlbGYpOgorCQlzZWxmLm1lbWJlci5vbl9jYWxsX3N0YXRlKHNlbGYuY2FsbCkKKwkKKwlkZWYgb25fbWVkaWFfc3RhdGUoc2VsZik6CisJCXNlbGYubWVtYmVyLm9uX2NhbGxfbWVkaWFfc3RhdGUoc2VsZi5jYWxsKQorCisJZGVmIG9uX2R0bWZfZGlnaXQoc2VsZiwgZGlnaXRzKToKKwkJc2VsZi5tZW1iZXIub25fY2FsbF9kdG1mX2RpZ2l0KHNlbGYuY2FsbCwgZGlnaXRzKQorCisJZGVmIG9uX3RyYW5zZmVyX3JlcXVlc3Qoc2VsZiwgZHN0LCBjb2RlKToKKwkJcmV0dXJuIHNlbGYubWVtYmVyLm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdChzZWxmLmNhbGwsIGRzdCwgY29kZSkKKwkKKwlkZWYgb25fdHJhbnNmZXJfc3RhdHVzKHNlbGYsIGNvZGUsIHJlYXNvbiwgZmluYWwsIGNvbnQpOgorCQlyZXR1cm4gc2VsZi5tZW1iZXIub25fY2FsbF90cmFuc2Zlcl9zdGF0dXMoc2VsZi5jYWxsLCBjb2RlLCByZWFzb24sIGZpbmFsLCBjb250KQorCisJZGVmIG9uX3JlcGxhY2VfcmVxdWVzdChzZWxmLCBjb2RlLCByZWFzb24pOgorCQlyZXR1cm4gc2VsZi5tZW1iZXIub25fY2FsbF9yZXBsYWNlX3JlcXVlc3Qoc2VsZi5jYWxsLCBjb2RlLCByZWFzb24pCisJCQorCWRlZiBvbl9yZXBsYWNlZChzZWxmLCBuZXdfY2FsbCk6CisJCXNlbGYubWVtYmVyLm9uX2NhbGxfcmVwbGFjZWQoc2VsZi5jYWxsLCBuZXdfY2FsbCkKKworCWRlZiBvbl90eXBpbmcoc2VsZiwgaXNfdHlwaW5nKToKKwkJc2VsZi5tZW1iZXIub25fdHlwaW5nKGlzX3R5cGluZywgY2FsbD1zZWxmLmNhbGwpCisKKwlkZWYgb25fcGFnZXIoc2VsZiwgbWltZV90eXBlLCBib2R5KToKKwkJc2VsZi5tZW1iZXIub25fcGFnZXIobWltZV90eXBlLCBib2R5LCBjYWxsPXNlbGYuY2FsbCkKKwkKKwlkZWYgb25fcGFnZXJfc3RhdHVzKHNlbGYsIGJvZHksIGltX2lkLCBjb2RlLCByZWFzb24pOgorCQlzZWxmLm1lbWJlci5vbl9wYWdlcl9zdGF0dXMoYm9keSwgaW1faWQsIGNvZGUsIHJlYXNvbiwgY2FsbD1zZWxmLmNhbGwpCisKKyMgQnVkZHkgY2FsbGJhY2suIFRoaXMgd291bGQganVzdCBmb3J3YXJkIHRoZSBldmVudCB0byBNZW1iZXIgY2xhc3MKK2NsYXNzIEJ1ZGR5Q2IocGouQnVkZHlDYWxsYmFjayk6CisJZGVmIF9faW5pdF9fKHNlbGYsIG1lbWJlciwgYnVkZHk9Tm9uZSk6CisJCXBqLkJ1ZGR5Q2FsbGJhY2suX19pbml0X18oc2VsZiwgYnVkZHkpCisJCXNlbGYubWVtYmVyID0gbWVtYmVyCisJCisJZGVmIG9uX3BhZ2VyKHNlbGYsIG1pbWVfdHlwZSwgYm9keSk6CisJCXNlbGYubWVtYmVyLm9uX3BhZ2VyKG1pbWVfdHlwZSwgYm9keSwgYnVkZHk9c2VsZi5idWRkeSkKKworCWRlZiBvbl9wYWdlcl9zdGF0dXMoc2VsZiwgYm9keSwgaW1faWQsIGNvZGUsIHJlYXNvbik6CisJCXNlbGYubWVtYmVyLm9uX3BhZ2VyX3N0YXR1cyhib2R5LCBpbV9pZCwgY29kZSwgcmVhc29uLCBidWRkeT1zZWxmLmJ1ZGR5KQorCisJZGVmIG9uX3N0YXRlKHNlbGYpOgorCQlzZWxmLm1lbWJlci5vbl9wcmVzX3N0YXRlKHNlbGYuYnVkZHkpCisKKwlkZWYgb25fdHlwaW5nKHNlbGYsIGlzX3R5cGluZyk6CisJCXNlbGYubWVtYmVyLm9uX3R5cGluZyhpc190eXBpbmcsIGJ1ZGR5PXNlbGYuYnVkZHkpCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIworIyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgaW5kaXZpZHVhbCByb29tIG1lbWJlciAoZWl0aGVyL2JvdGggY2hhdCBhbmQgdm9pY2UgY29uZikKKyMKKyMKK2NsYXNzIE1lbWJlcjoKKwlkZWYgX19pbml0X18oc2VsZiwgYm90LCB1cmkpOgorCQlzZWxmLnVyaSA9IHVyaQorCQlzZWxmLmJvdCA9IGJvdAorCQlzZWxmLmNhbGwgPSBOb25lCisJCXNlbGYuYnVkZHkgPSBOb25lCisJCXNlbGYuYmkgPSBwai5CdWRkeUluZm8oKQorCQlzZWxmLmluX2NoYXQgPSBGYWxzZQorCQlzZWxmLmluX3ZvaWNlID0gRmFsc2UKKwkJc2VsZi5pbV9lcnJvciA9IEZhbHNlCisJCXNlbGYuaHRtbCA9IEZhbHNlCisJCisJZGVmIF9fc3RyX18oc2VsZik6CisJCXN0ciA9IHN0cmluZy5sanVzdChzZWxmLnVyaSwgMzApICsgIiAtLSAiIAorCQlpZiBzZWxmLmJ1ZGR5OgorCQkJYmkgPSBzZWxmLmJ1ZGR5LmluZm8oKQorCQkJc3RyID0gc3RyICsgYmkub25saW5lX3RleHQKKwkJZWxzZToKKwkJCXN0ciA9IHN0ciArICJPZmZsaW5lIgorCQlzdHIgPSBzdHIgKyAiIFsiCisJCWlmIChzZWxmLmluX3ZvaWNlKToKKwkJCXN0ciA9IHN0ciArICIgdm9pY2UiCisJCWlmIChzZWxmLmluX2NoYXQpOgorCQkJc3RyID0gc3RyICsgIiBjaGF0IgorCQkJaWYgKHNlbGYuaHRtbCk6CisJCQkJc3RyID0gc3RyICsgIiBodG1sIgorCQkJZWxzZToKKwkJCQlzdHIgPSBzdHIgKyAiIHBsYWluIgorCisJCWlmIChzZWxmLmltX2Vycm9yKToKKwkJCXN0ciA9IHN0ciArICIgaW1fZXJyb3IiCisJCXN0ciA9IHN0ciArICJdIgorCQlyZXR1cm4gc3RyCisJCQorCWRlZiBqb2luX2NhbGwoc2VsZiwgY2FsbCk6CisJCWlmIHNlbGYuY2FsbDoKKwkJCXNlbGYuY2FsbC5oYW5ndXAoNjAzLCAiWW91IGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQgZm9yIG1ha2luZyBhbm90aGVyIGNhbGwiKQorCQlzZWxmLmNhbGwgPSBjYWxsCisJCWNhbGwuc2V0X2NhbGxiYWNrKENhbGxDYihzZWxmLCBjYWxsKSkKKwkJbXNnID0gIiUodXJpKXMgaXMgYXR0ZW1wdGluZyB0byBqb2luIHRoZSB2b2ljZSBjb25mZXJlbmNlIiAlIFwKKwkJCSAgeyd1cmknOiBzZWxmLnVyaX0KKwkJc2VsZi5ib3QuREVCVUcobXNnICsgIlxuIiwgSU5GTykKKwkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKE5vbmUsIG1zZykKKwkKKwlkZWYgam9pbl9jaGF0KHNlbGYpOgorCQlpZiBub3Qgc2VsZi5idWRkeToKKwkJCXNlbGYuYm90LkRFQlVHKHNlbGYudXJpICsgIiBqb2luaW5nIGNoYXRyb29tLi4uXG4iLCBJTkZPKQorCQkJc2VsZi5idWRkeSA9IHNlbGYuYm90LmFjYy5hZGRfYnVkZHkoc2VsZi51cmkpCisJCQlzZWxmLmJ1ZGR5LnNldF9jYWxsYmFjayhCdWRkeUNiKHNlbGYsIHNlbGYuYnVkZHkpKQorCQkJc2VsZi5idWRkeS5zdWJzY3JpYmUoKQorCQllbHNlOgorCQkJc2VsZi5ib3QuREVCVUcoc2VsZi51cmkgKyAiIGFscmVhZHkgaW4gY2hhdHJvb20sIHJlc3Vic2NyaWJpbmcuLlxuIiwgSU5GTykKKwkJCXNlbGYuYnVkZHkuc3Vic2NyaWJlKCkKKworCWRlZiBzZW5kX3BhZ2VyKHNlbGYsIGJvZHksIG1pbWU9InRleHQvcGxhaW4iKToKKwkJc2VsZi5ib3QuREVCVUcoInNlbmRfcGFnZXIoKSB0byAiICsgc2VsZi51cmkpCisJCWlmIHNlbGYuaW5fY2hhdCBhbmQgbm90IHNlbGYuaW1fZXJyb3IgYW5kIHNlbGYuYnVkZHk6CisJCQlpZiBzZWxmLmh0bWw6CisJCQkJI1RoaXMgd2lsbCBtYWtlIHVzIHJlY2VpdmUgaHRtbCEKKwkJCQkjbWltZSA9ICJ0ZXh0L2h0bWwiCisJCQkJYm9keSA9IGJvZHkucmVwbGFjZSgiPCIsICImbHQ7IikKKwkJCQlib2R5ID0gYm9keS5yZXBsYWNlKCI+IiwgIiZndDsiKQorCQkJCWJvZHkgPSBib2R5LnJlcGxhY2UoJyInLCAiJnF1b3Q7IikKKwkJCQlib2R5ID0gYm9keS5yZXBsYWNlKCJcbiIsICI8QlI+XG4iKQorCQkJc2VsZi5idWRkeS5zZW5kX3BhZ2VyKGJvZHksIGNvbnRlbnRfdHlwZT1taW1lKQorCQkJc2VsZi5ib3QuREVCVUcoIi4uc2VudFxuIikKKwkJZWxzZToKKwkJCXNlbGYuYm90LkRFQlVHKCIuLm5vdCBzZW50IVxuIikKKwkJCisJZGVmIG9uX2NhbGxfc3RhdGUoc2VsZiwgY2FsbCk6CisJCWNpID0gY2FsbC5pbmZvKCkKKwkJaWYgY2kuc3RhdGU9PXBqLkNhbGxTdGF0ZS5ESVNDT05ORUNURUQ6CisJCQlpZiBzZWxmLmluX3ZvaWNlOgorCQkJCW1zZyA9ICIlKHVyaSlzIGhhcyBsZWZ0IHRoZSB2b2ljZSBjb25mZXJlbmNlICglKDEpZC8lKDIpcykiICUgXAorCQkJCQkgIHsndXJpJzogc2VsZi51cmksICcxJzogY2kubGFzdF9jb2RlLCAnMic6IGNpLmxhc3RfcmVhc29ufQorCQkJCXNlbGYuYm90LkRFQlVHKG1zZyArICJcbiIsIElORk8pCisJCQkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKE5vbmUsIG1zZykKKwkJCXNlbGYuaW5fdm9pY2UgPSBGYWxzZQorCQkJc2VsZi5jYWxsID0gTm9uZQorCQkJc2VsZi5ib3Qub25fbWVtYmVyX2xlZnQoc2VsZikKKwkJZWxpZiBjaS5zdGF0ZT09cGouQ2FsbFN0YXRlLkNPTkZJUk1FRDoKKwkJCW1zZyA9ICIlKHVyaSlzIGhhcyBqb2luZWQgdGhlIHZvaWNlIGNvbmZlcmVuY2UiICUgXAorCQkJCSAgeyd1cmknOiBzZWxmLnVyaX0KKwkJCXNlbGYuYm90LkRFQlVHKG1zZyArICJcbiIsIElORk8pCisJCQlzZWxmLmJvdC5icm9hZGNhc3RfcGFnZXIoTm9uZSwgbXNnKQorCQorCWRlZiBvbl9jYWxsX21lZGlhX3N0YXRlKHNlbGYsIGNhbGwpOgorCQlzZWxmLmJvdC5ERUJVRygiTWVtYmVyLm9uX2NhbGxfbWVkaWFfc3RhdGVcbiIpCisJCWNpID0gY2FsbC5pbmZvKCkKKwkJaWYgY2kuY29uZl9zbG90IT0tMToKKwkJCWlmIG5vdCBzZWxmLmluX3ZvaWNlOgorCQkJCW1zZyA9IHNlbGYudXJpICsgIiBjYWxsIG1lZGlhIGlzIGFjdGl2ZSIKKwkJCQlzZWxmLmJvdC5icm9hZGNhc3RfcGFnZXIoTm9uZSwgbXNnKQorCQkJc2VsZi5pbl92b2ljZSA9IFRydWUKKwkJCXNlbGYuYm90LmFkZF90b192b2ljZV9jb25mKHNlbGYpCisJCWVsc2U6CisJCQlpZiBzZWxmLmluX3ZvaWNlOgorCQkJCW1zZyA9IHNlbGYudXJpICsgIiBjYWxsIG1lZGlhIGlzIGluYWN0aXZlIgorCQkJCXNlbGYuYm90LmJyb2FkY2FzdF9wYWdlcihOb25lLCBtc2cpCisJCQlzZWxmLmluX3ZvaWNlID0gRmFsc2UKKworCWRlZiBvbl9jYWxsX2R0bWZfZGlnaXQoc2VsZiwgY2FsbCwgZGlnaXRzKToKKwkJbXNnID0gIiUodXJpKXMgc2VudCBEVE1GIGRpZ2l0cyAlKGRpZylzIiAlIFwKKwkJCSAgeyd1cmknOiBzZWxmLnVyaSwgJ2RpZyc6IGRpZ2l0c30KKwkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKE5vbmUsIG1zZykKKworCWRlZiBvbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3Qoc2VsZiwgY2FsbCwgZHN0LCBjb2RlKToKKwkJbXNnID0gIiUodXJpKXMgaXMgdHJhbnNmZXJpbmcgdGhlIGNhbGwgdG8gJShkc3QpcyIgJSBcCisJCQkgIHsndXJpJzogc2VsZi51cmksICdkc3QnOiBkc3R9CisJCXNlbGYuYm90LmJyb2FkY2FzdF9wYWdlcihOb25lLCBtc2cpCisJCXJldHVybiAyMDIKKwkKKwlkZWYgb25fY2FsbF90cmFuc2Zlcl9zdGF0dXMoc2VsZiwgY2FsbCwgY29kZSwgcmVhc29uLCBmaW5hbCwgY29udCk6CisJCW1zZyA9ICIlKHVyaSlzIGNhbGwgdHJhbnNmZXIgc3RhdHVzIGlzICUoY29kZSlkLyUocmVzKXMiICUgXAorCQkJICB7J3VyaSc6IHNlbGYudXJpLCAnY29kZSc6IGNvZGUsICdyZXMnOiByZWFzb259CisJCXNlbGYuYm90LmJyb2FkY2FzdF9wYWdlcihOb25lLCBtc2cpCisJCXJldHVybiBUcnVlCisKKwlkZWYgb25fY2FsbF9yZXBsYWNlX3JlcXVlc3Qoc2VsZiwgY2FsbCwgY29kZSwgcmVhc29uKToKKwkJbXNnID0gIiUodXJpKXMgaXMgcmVxdWVzdGluZyBjYWxsIHJlcGxhY2UiICUgXAorCQkJICB7J3VyaSc6IHNlbGYudXJpfQorCQlzZWxmLmJvdC5icm9hZGNhc3RfcGFnZXIoTm9uZSwgbXNnKQorCQlyZXR1cm4gKGNvZGUsIHJlYXNvbikKKwkJCisJZGVmIG9uX2NhbGxfcmVwbGFjZWQoc2VsZiwgY2FsbCwgbmV3X2NhbGwpOgorCQltc2cgPSAiJSh1cmkpcyBjYWxsIGlzIHJlcGxhY2VkIiAlIFwKKwkJCSAgeyd1cmknOiBzZWxmLnVyaX0KKwkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKE5vbmUsIG1zZykKKworCWRlZiBvbl9wcmVzX3N0YXRlKHNlbGYsIGJ1ZGR5KToKKwkJb2xkX2JpID0gc2VsZi5iaQorCQlzZWxmLmJpID0gYnVkZHkuaW5mbygpCisJCW1zZyA9ICIlKHVyaSlzIHN0YXR1cyBpcyAlKHN0KXMiICUgXAorCQkgIHsndXJpJzogc2VsZi51cmksICdzdCc6IHNlbGYuYmkub25saW5lX3RleHR9CisJCXNlbGYuYm90LkRFQlVHKG1zZyArICJcbiIsIElORk8pCisJCXNlbGYuYm90LmJyb2FkY2FzdF9wYWdlcihzZWxmLCBtc2cpCisKKwkJaWYgc2VsZi5iaS5zdWJfc3RhdGU9PXBqLlN1YnNjcmlwdGlvblN0YXRlLkFDVElWRToKKwkJCWlmIG5vdCBzZWxmLmluX2NoYXQ6CisJCQkJc2VsZi5pbl9jaGF0ID0gVHJ1ZQorCQkJCWJ1ZGR5LnNlbmRfcGFnZXIoIldlbGNvbWUgdG8gY2hhdHJvb20iKQorCQkJCXNlbGYuYm90LmJyb2FkY2FzdF9wYWdlcihzZWxmLCBzZWxmLnVyaSArICIgaGFzIGpvaW5lZCB0aGUgY2hhdCByb29tIikKKwkJCWVsc2U6CisJCQkJc2VsZi5pbl9jaGF0ID0gVHJ1ZQorCQllbGlmIHNlbGYuYmkuc3ViX3N0YXRlPT1wai5TdWJzY3JpcHRpb25TdGF0ZS5OVUxMIG9yIFwKKwkJCSBzZWxmLmJpLnN1Yl9zdGF0ZT09cGouU3Vic2NyaXB0aW9uU3RhdGUuVEVSTUlOQVRFRCBvciBcCisJCQkgc2VsZi5iaS5zdWJfc3RhdGU9PXBqLlN1YnNjcmlwdGlvblN0YXRlLlVOS05PV046CisJCQlzZWxmLmJ1ZGR5LmRlbGV0ZSgpCisJCQlzZWxmLmJ1ZGR5ID0gTm9uZQorCQkJaWYgc2VsZi5pbl9jaGF0OgorCQkJCXNlbGYuaW5fY2hhdCA9IEZhbHNlCisJCQkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKHNlbGYsIHNlbGYudXJpICsgIiBoYXMgbGVmdCB0aGUgY2hhdCByb29tIikKKwkJCWVsc2U6CisJCQkJc2VsZi5pbl9jaGF0ID0gRmFsc2UKKwkJCXNlbGYuYm90Lm9uX21lbWJlcl9sZWZ0KHNlbGYpCisJCQorCWRlZiBvbl90eXBpbmcoc2VsZiwgaXNfdHlwaW5nLCBjYWxsPU5vbmUsIGJ1ZGR5PU5vbmUpOgorCQlpZiBpc190eXBpbmc6CisJCQltc2cgPSBzZWxmLnVyaSArICIgaXMgdHlwaW5nLi4uIgorCQllbHNlOgorCQkJbXNnID0gc2VsZi51cmkgKyAiIGhhcyBzdG9wcGVkIHR5cGluZyIKKwkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKHNlbGYsIG1zZykKKworCWRlZiBvbl9wYWdlcihzZWxmLCBtaW1lX3R5cGUsIGJvZHksIGNhbGw9Tm9uZSwgYnVkZHk9Tm9uZSk6CisJCWlmIG5vdCBzZWxmLmJvdC5oYW5kbGVfY21kKHNlbGYsIE5vbmUsIGJvZHkpOgorCQkJbXNnID0gc2VsZi51cmkgKyAiOiAiICsgYm9keQorCQkJc2VsZi5ib3QuYnJvYWRjYXN0X3BhZ2VyKHNlbGYsIG1zZywgbWltZV90eXBlKQorCQorCWRlZiBvbl9wYWdlcl9zdGF0dXMoc2VsZiwgYm9keSwgaW1faWQsIGNvZGUsIHJlYXNvbiwgY2FsbD1Ob25lLCBidWRkeT1Ob25lKToKKwkJc2VsZi5pbV9lcnJvciA9IChjb2RlLzEwMCAhPSAyKQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCisjIFRoZSBCb3QgaW5zdGFuY2UgKHNpbmdsZXRvbikKKyMKKyMKK2NsYXNzIEJvdChwai5BY2NvdW50Q2FsbGJhY2spOgorCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJcGouQWNjb3VudENhbGxiYWNrLl9faW5pdF9fKHNlbGYsIE5vbmUpCisJCXNlbGYubGliID0gcGouTGliKCkKKwkJc2VsZi5hY2MgPSBOb25lCisJCXNlbGYuY2FsbHMgPSBbXQorCQlzZWxmLm1lbWJlcnMgPSB7fQorCQlzZWxmLmNmZyA9IE5vbmUKKworCWRlZiBERUJVRyhzZWxmLCBtc2csIGxldmVsPVRSQUNFKToKKwkJcHJpbnQgbXNnLAorCQkKKwlkZWYgaGVscHN0cmluZyhzZWxmKToKKwkJcmV0dXJuICIiIgorLS1oW2VscF0gICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCBzY3JlZW4KKy0taltvaW5dICAgICAgICAgICAgSm9pbiB0aGUgY2hhdCByb29tCistLWh0bWwgb258b2ZmICAgICAgIFNldCB0byByZWNlaXZlIEhUTUwgb3IgcGxhaW4gdGV4dAorCitQYXJ0aWNpcGFudCBjb21tYW5kczoKKy0tc1tob3ddICAgICAgICAgICAgU2hvdyBjb25mYm90IHNldHRpbmdzCistLWxlYXZlICAgICAgICAgICAgIExlYXZlIHRoZSBjaGF0cm9vbQorLS1sW2lzdF0gICAgICAgICAgICBMaXN0IGFsbCBtZW1iZXJzCisKK0FkbWluIGNvbW1hbmRzOgorLS1hW2RtaW5dIDxDTUQ+IFdoZXJlIDxDTUQ+IGFyZToKKyAgICBsaXN0ICAgICAgICAgICAgTGlzdCB0aGUgYWRtaW5zCisgICAgYWRkIDxVUkk+ICAgICAgIEFkZCBVUkkgYXMgYWRtaW4KKyAgICBkZWwgPFVSST4gICAgICAgUmVtb3ZlIFVSSSBhcyBhZG1pbgorICAgIHJyICAgICAgICAgICAgICBSZXJlZ2lzdGVyIGFjY291bnQgdG8gc2VydmVyCisgICAgY2FsbCA8VVJJPiAgICAgIE1ha2UgY2FsbCB0byB0aGUgVVJJIGFuZCBhZGQgdG8gdm9pY2UgY29uZgorICAgIGRjIDxVUkk+ICAgICAgICBEaXNjb25uZWN0IGNhbGwgdG8gVVJJCisgICAgaG9sZCA8VVJJPiAgICAgIEhvbGQgY2FsbCB3aXRoIHRoYXQgVVJJCisgICAgdXBkYXRlIDxVUkk+ICAgIFNlbmQgVVBEQVRFIHRvIGNhbGwgd2l0aCB0aGF0IFVSSQorICAgIHJlaW52aXRlIDxVUkk+ICBTZW5kIHJlLUlOVklURSB0byBjYWxsIHdpdGggdGhhdCBVUkkKKyIiIgorCisJZGVmIGxpc3RtZW1iZXJzKHNlbGYpOgorCQltc2cgPSAiIgorCQlmb3IgdXJpLCBtIGluIHNlbGYubWVtYmVycy5pdGVyaXRlbXMoKToKKwkJCW1zZyA9IG1zZyArIHN0cihtKSArICJcbiIKKwkJcmV0dXJuIG1zZworCQorCWRlZiBzaG93c2V0dGluZ3Moc2VsZik6CisJCWFpID0gc2VsZi5hY2MuaW5mbygpCisJCW1zZyA9ICIiIgorQ29uZkJvdCBzdGF0dXMgYW5kIHNldHRpbmdzOgorICBVUkk6ICAgICAgICAlKHVyaSlzCisgIFN0YXR1czogICAgICUocHJlcylzCisgIFJlZyBTdGF0dXM6ICUocmVnX3N0KWQKKyAgUmVnIFJlYXNvbjogJShyZWdfcmVzKXMKKyIiIiAlIHsndXJpJzogYWkudXJpLCAncHJlcyc6IGFpLm9ubGluZV90ZXh0LCBcCisJICAgJ3JlZ19zdCc6IGFpLnJlZ19zdGF0dXMsICdyZWdfcmVzJzogYWkucmVnX3JlYXNvbn0KKwkJcmV0dXJuIG1zZworICAKKwlkZWYgbWFpbihzZWxmLCBjZmdfZmlsZSk6CisJCXRyeToKKwkJCWNmZyA9IHNlbGYuY2ZnID0gX19pbXBvcnRfXyhjZmdfZmlsZSkKKwkJCQorCQkJc2VsZi5saWIuaW5pdCh1YV9jZmc9Y2ZnLnVhX2NmZywgbG9nX2NmZz1jZmcubG9nX2NmZywgbWVkaWFfY2ZnPWNmZy5tZWRpYV9jZmcpCisJCQlzZWxmLmxpYi5zZXRfbnVsbF9zbmRfZGV2KCkKKwkJCQorCQkJdHJhbnNwb3J0ID0gTm9uZQorCQkJaWYgY2ZnLnVkcF9jZmc6CisJCQkJdHJhbnNwb3J0ID0gc2VsZi5saWIuY3JlYXRlX3RyYW5zcG9ydChwai5UcmFuc3BvcnRUeXBlLlVEUCwgY2ZnLnVkcF9jZmcpCisJCQlpZiBjZmcudGNwX2NmZzoKKwkJCQl0ID0gc2VsZi5saWIuY3JlYXRlX3RyYW5zcG9ydChwai5UcmFuc3BvcnRUeXBlLlRDUCwgY2ZnLnRjcF9jZmcpCisJCQkJaWYgbm90IHRyYW5zcG9ydDoKKwkJCQkJdHJhbnNwb3J0ID0gdAorCQkJCQorCQkJc2VsZi5saWIuc3RhcnQoKQorCQkJCisJCQlpZiBjZmcuYWNjX2NmZzoKKwkJCQlzZWxmLkRFQlVHKCJDcmVhdGluZyBhY2NvdW50ICUodXJpKXMuLlxuIiAlIHsndXJpJzogY2ZnLmFjY19jZmcuaWR9LCBJTkZPKQorCQkJCXNlbGYuYWNjID0gc2VsZi5saWIuY3JlYXRlX2FjY291bnQoY2ZnLmFjY19jZmcsIGNiPXNlbGYpCisJCQllbHNlOgorCQkJCXNlbGYuREVCVUcoIkNyZWF0aW5nIGFjY291bnQgZm9yICUodClzLi5cbiIgJSBcCisJCQkJCQkJeyd0JzogdHJhbnNwb3J0LmluZm8oKS5kZXNjcmlwdGlvbn0sIElORk8pCisJCQkJc2VsZi5hY2MgPSBzZWxmLmxpYi5jcmVhdGVfYWNjb3VudF9mb3JfdHJhbnNwb3J0KHRyYW5zcG9ydCwgY2I9c2VsZikKKwkJCQorCQkJc2VsZi5hY2Muc2V0X2Jhc2ljX3N0YXR1cyhUcnVlKQorCQkJCisJCQkjIFdhaXQgZm9yIEVOVEVSIGJlZm9yZSBxdWl0dGluZworCQkJcHJpbnQgIlByZXNzIHEgdG8gcXVpdCBvciAtLWhlbHAvLS1oIGZvciBoZWxwIgorCQkJd2hpbGUgVHJ1ZToKKwkJCQlpbnB1dCA9IHN5cy5zdGRpbi5yZWFkbGluZSgpLnN0cmlwKCIgXHRcclxuIikKKwkJCQlpZiBub3Qgc2VsZi5oYW5kbGVfY21kKE5vbmUsIE5vbmUsIGlucHV0KToKKwkJCQkJaWYgaW5wdXQ9PSJxIjoKKwkJCQkJCWJyZWFrCisJCQkKKwkJCXNlbGYubGliLmRlc3Ryb3koKQorCQkJc2VsZi5saWIgPSBOb25lCisKKwkJZXhjZXB0IHBqLkVycm9yLCBlOgorCQkJcHJpbnQgIkV4Y2VwdGlvbjogIiArIHN0cihlKQorCQkJaWYgc2VsZi5saWI6CisJCQkJc2VsZi5saWIuZGVzdHJveSgpCisJCQkJc2VsZi5saWIgPSBOb25lCisJCisJZGVmIGJyb2FkY2FzdF9wYWdlcihzZWxmLCBleGNsdWRlX21lbWJlciwgYm9keSwgbWltZV90eXBlPSJ0ZXh0L3BsYWluIik6CisJCXNlbGYuREVCVUcoIkJyb2FkY2FzdDogIiArIGJvZHkgKyAiXG4iKQorCQlmb3IgdXJpLCBtIGluIHNlbGYubWVtYmVycy5pdGVyaXRlbXMoKToKKwkJCWlmIG0gIT0gZXhjbHVkZV9tZW1iZXI6CisJCQkJbS5zZW5kX3BhZ2VyKGJvZHksIG1pbWVfdHlwZSkKKworCWRlZiBhZGRfdG9fdm9pY2VfY29uZihzZWxmLCBtZW1iZXIpOgorCQlpZiBub3QgbWVtYmVyLmNhbGw6CisJCQlyZXR1cm4KKwkJc3JjX2NpID0gbWVtYmVyLmNhbGwuaW5mbygpCisJCXNlbGYuREVCVUcoImJvdC5hZGRfdG9fdm9pY2VfY29uZlxuIikKKwkJZm9yIHVyaSwgbSBpbiBzZWxmLm1lbWJlcnMuaXRlcml0ZW1zKCk6CisJCQlpZiBtPT1tZW1iZXI6CisJCQkJY29udGludWUKKwkJCWlmIG5vdCBtLmNhbGw6CisJCQkJY29udGludWUKKwkJCWRzdF9jaSA9IG0uY2FsbC5pbmZvKCkKKwkJCWlmIGRzdF9jaS5tZWRpYV9zdGF0ZT09cGouTWVkaWFTdGF0ZS5BQ1RJVkUgYW5kIGRzdF9jaS5jb25mX3Nsb3QhPS0xOgorCQkJCXNlbGYubGliLmNvbmZfY29ubmVjdChzcmNfY2kuY29uZl9zbG90LCBkc3RfY2kuY29uZl9zbG90KQorCQkJCXNlbGYubGliLmNvbmZfY29ubmVjdChkc3RfY2kuY29uZl9zbG90LCBzcmNfY2kuY29uZl9zbG90KQorCQorCWRlZiBvbl9tZW1iZXJfbGVmdChzZWxmLCBtZW1iZXIpOgorCQlpZiBub3QgbWVtYmVyLmNhbGwgYW5kIG5vdCBtZW1iZXIuYnVkZHk6CisJCQlkZWwgc2VsZi5tZW1iZXJzW21lbWJlci51cmldCisJCQlkZWwgbWVtYmVyCisJCQkKKwlkZWYgaGFuZGxlX2FkbWluX2NtZChzZWxmLCBtZW1iZXIsIGJvZHkpOgorCQlpZiBtZW1iZXIgYW5kIHNlbGYuY2ZnLmFkbWlucyBhbmQgbm90IG1lbWJlci51cmkgaW4gc2VsZi5jZmcuYWRtaW5zOgorCQkJbWVtYmVyLnNlbmRfcGFnZXIoIllvdSBhcmUgbm90IGFkbWluIikKKwkJCXJldHVybgorCQlhcmdzID0gYm9keS5zcGxpdCgpCisJCW1zZyA9ICIiCisKKwkJaWYgbGVuKGFyZ3MpPT0xOgorCQkJYXJncy5hcHBlbmQoIiAiKQorCisJCWlmIGFyZ3NbMV09PSJsaXN0IjoKKwkJCWlmIG5vdCBzZWxmLmNmZy5hZG1pbnM6CisJCQkJbXNnID0gIkV2ZXJ5b25lIGlzIGFkbWluISIKKwkJCWVsc2U6CisJCQkJbXNnID0gc3RyKHNlbGYuY2ZnLmFkbWlucykKKwkJZWxpZiBhcmdzWzFdPT0iYWRkIjoKKwkJCWlmIGxlbihhcmdzKSE9MzoKKwkJCQltc2cgPSAiVXNhZ2U6IGFkZCA8VVJJPiIKKwkJCWVsc2U6CisJCQkJc2VsZi5jZmcuYWRtaW5zLmFwcGVuZChhcmdzWzJdKQorCQkJCW1zZyA9IGFyZ3NbMl0gKyAiIGFkZGVkIGFzIGFkbWluIgorCQllbGlmIGFyZ3NbMV09PSJkZWwiOgorCQkJaWYgbGVuKGFyZ3MpIT0zOgorCQkJCW1zZyA9ICJVc2FnZTogZGVsIDxVUkk+IgorCQkJZWxpZiBhcmdzWzJdIG5vdCBpbiBzZWxmLmNmZy5hZG1pbnM6CisJCQkJbXNnID0gYXJnc1syXSArICIgaXMgbm90IGFkbWluIgorCQkJZWxzZToKKwkJCQlzZWxmLmNmZy5hZG1pbnMucmVtb3ZlKGFyZ3NbMl0pCisJCQkJbXNnID0gYXJnc1syXSArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGFkbWlucyIKKwkJZWxpZiBhcmdzWzFdPT0icnIiOgorCQkJbXNnID0gIlJlcmVnaXN0ZXJpbmcuLiIKKwkJCXNlbGYuYWNjLnNldF9yZWdpc3RyYXRpb24oVHJ1ZSkKKwkJZWxpZiBhcmdzWzFdPT0iY2FsbCI6CisJCQlpZiBsZW4oYXJncykhPTM6CisJCQkJbXNnID0gIlVzYWdlOiBjYWxsIDxVUkk+IgorCQkJZWxzZToKKwkJCQl1cmkgPSBhcmdzWzJdCisJCQkJdHJ5OgorCQkJCQljYWxsID0gc2VsZi5hY2MubWFrZV9jYWxsKHVyaSkKKwkJCQlleGNlcHQgcGouRXJyb3IsIGU6CisJCQkJCW1zZyA9ICJFcnJvcjogIiArIHN0cihlKQorCQkJCQljYWxsID0gTm9uZQorCisJCQkJaWYgY2FsbDoKKwkJCQkJaWYgbm90IHVyaSBpbiBzZWxmLm1lbWJlcnM6CisJCQkJCQltID0gTWVtYmVyKHNlbGYsIHVyaSkKKwkJCQkJCXNlbGYubWVtYmVyc1ttLnVyaV0gPSBtCisJCQkJCWVsc2U6CisJCQkJCQltID0gc2VsZi5tZW1iZXJzW3VyaV0KKwkJCQkJbXNnID0gIkFkZGluZyAiICsgbS51cmkgKyAiIHRvIHZvaWNlIGNvbmZlcmVuY2UuLiIKKwkJCQkJbS5qb2luX2NhbGwoY2FsbCkKKwkJZWxpZiBhcmdzWzFdPT0iZGMiIG9yIGFyZ3NbMV09PSJob2xkIiBvciBhcmdzWzFdPT0idXBkYXRlIiBvciBhcmdzWzFdPT0icmVpbnZpdGUiOgorCQkJaWYgbGVuKGFyZ3MpIT0zOgorCQkJCW1zZyA9ICJVc2FnZTogIiArIGFyZ3NbMV0gKyAiIDxVUkk+IgorCQkJZWxzZToKKwkJCQl1cmkgPSBhcmdzWzJdCisJCQkJaWYgbm90IHVyaSBpbiBzZWxmLm1lbWJlcnM6CisJCQkJCW1zZyA9ICJNZW1iZXIgbm90IGZvdW5kL1VSSSBkb2Vzbid0IG1hdGNoIChub3RlOiBjYXNlIG1hdHRlcnMhKSIKKwkJCQllbHNlOgorCQkJCQltID0gc2VsZi5tZW1iZXJzW3VyaV0KKwkJCQkJaWYgbS5jYWxsOgorCQkJCQkJaWYgYXJnc1sxXT09ImRjIjoKKwkJCQkJCQltc2cgPSAiRGlzY29ubmVjdGluZy4uIgorCQkJCQkJCW0uY2FsbC5oYW5ndXAoNjAzLCAiWW91J3JlIGRpc2Nvbm5lY3RlZCBieSBhZG1pbiIpCisJCQkJCQllbGlmIGFyZ3NbMV09PSJob2xkIjoKKwkJCQkJCQltc2cgPSAiSG9sZGluZyB0aGUgY2FsbCIKKwkJCQkJCQltLmNhbGwuaG9sZCgpCisJCQkJCQllbGlmIGFyZ3NbMV09PSJ1cGRhdGUiOgorCQkJCQkJCW1zZyA9ICJTZW5kaW5nIFVQREFURSIKKwkJCQkJCQltLmNhbGwudXBkYXRlKCkKKwkJCQkJCWVsaWYgYXJnc1sxXT09InJlaW52aXRlIjoKKwkJCQkJCQltc2cgPSAiU2VuZGluZyByZS1JTlZJVEUiCisJCQkJCQkJbS5jYWxsLnJlaW52aXRlKCkKKwkJCQkJZWxzZToKKwkJCQkJCW1zZyA9ICJIZSBpcyBub3QgaW4gY2FsbCIKKwkJZWxzZToKKwkJCW1zZyA9ICJVbmtub3duIGFkbWluIGNvbW1hbmQgIiArIGJvZHkKKworCQkjcHJpbnQgIm1zZyBpcyAnJShtc2cpcyciICUgeydtc2cnOiBtc2d9CisKKwkJaWYgVHJ1ZToKKwkJCWlmIG1lbWJlcjoKKwkJCQltZW1iZXIuc2VuZF9wYWdlcihtc2cpCisJCQllbHNlOgorCQkJCXByaW50IG1zZworCisJZGVmIGhhbmRsZV9jbWQoc2VsZiwgbWVtYmVyLCBmcm9tX3VyaSwgYm9keSk6CisJCWJvZHkgPSBib2R5LnN0cmlwKCIgXHRcclxuIikKKwkJbXNnID0gIiIKKwkJaGFuZGxlZCA9IFRydWUKKwkJaWYgYm9keT09Ii0tbCIgb3IgYm9keT09Ii0tbGlzdCI6CisJCQltc2cgPSBzZWxmLmxpc3RtZW1iZXJzKCkKKwkJCWlmIG1zZz09IiI6CisJCQkJbXNnID0gIk5vYm9keSBpcyBoZXJlIgorCQllbGlmIGJvZHlbMDozXT09Ii0tcyI6CisJCQltc2cgPSBzZWxmLnNob3dzZXR0aW5ncygpCisJCWVsaWYgYm9keVswOjZdPT0iLS1odG1sIiBhbmQgbWVtYmVyOgorCQkJaWYgYm9keVs4OjExXT09Im9mZiI6CisJCQkJbWVtYmVyLmh0bWwgPSBGYWxzZQorCQkJZWxzZToKKwkJCQltZW1iZXIuaHRtbCA9IFRydWUKKwkJZWxpZiBib2R5PT0iLS1oIiBvciBib2R5PT0iLS1oZWxwIjoKKwkJCW1zZyA9IHNlbGYuaGVscHN0cmluZygpCisJCWVsaWYgYm9keT09Ii0tbGVhdmUiOgorCQkJaWYgbm90IG1lbWJlciBvciBub3QgbWVtYmVyLmJ1ZGR5OgorCQkJCW1zZyA9ICJZb3UgYXJlIG5vdCBpbiBjaGF0cm9vbSIKKwkJCWVsc2U6CisJCQkJbWVtYmVyLmJ1ZGR5LnVuc3Vic2NyaWJlKCkKKwkJZWxpZiBib2R5WzA6M109PSItLWoiOgorCQkJaWYgbm90IGZyb21fdXJpIGluIHNlbGYubWVtYmVyczoKKwkJCQltID0gTWVtYmVyKHNlbGYsIGZyb21fdXJpKQorCQkJCXNlbGYubWVtYmVyc1ttLnVyaV0gPSBtCisJCQkJc2VsZi5ERUJVRygiQWRkaW5nICIgKyBtLnVyaSArICIgdG8gY2hhdHJvb21cbiIpCisJCQkJbS5qb2luX2NoYXQoKQorCQkJZWxzZToKKwkJCQltID0gc2VsZi5tZW1iZXJzW2Zyb21fdXJpXQorCQkJCXNlbGYuREVCVUcoIkFkZGluZyAiICsgbS51cmkgKyAiIHRvIGNoYXRyb29tXG4iKQorCQkJCW0uam9pbl9jaGF0KCkKKwkJZWxpZiBib2R5WzA6M109PSItLWEiOgorCQkJc2VsZi5oYW5kbGVfYWRtaW5fY21kKG1lbWJlciwgYm9keSkKKwkJCWhhbmRsZWQgPSBUcnVlCisJCWVsc2U6CisJCQloYW5kbGVkID0gRmFsc2UKKworCQlpZiBtc2c6CisJCQlpZiBtZW1iZXI6CisJCQkJbWVtYmVyLnNlbmRfcGFnZXIobXNnKQorCQkJZWxpZiBmcm9tX3VyaToKKwkJCQlzZWxmLmFjYy5zZW5kX3BhZ2VyKGZyb21fdXJpLCBtc2cpOworCQkJZWxzZToKKwkJCQlwcmludCBtc2cKKwkJcmV0dXJuIGhhbmRsZWQKKwkKKwlkZWYgb25faW5jb21pbmdfY2FsbChzZWxmLCBjYWxsKToKKwkJc2VsZi5ERUJVRygib25faW5jb21pbmdfY2FsbCBmcm9tICUodXJpKXNcbiIgJSB7J3VyaSc6IGNhbGwuaW5mbygpLnJlbW90ZV91cml9LCBJTkZPKQorCQljaSA9IGNhbGwuaW5mbygpCisJCWlmIG5vdCBjaS5yZW1vdGVfdXJpIGluIHNlbGYubWVtYmVyczoKKwkJCW0gPSBNZW1iZXIoc2VsZiwgY2kucmVtb3RlX3VyaSkKKwkJCXNlbGYubWVtYmVyc1ttLnVyaV0gPSBtCisJCQltLmpvaW5fY2FsbChjYWxsKQorCQllbHNlOgorCQkJbSA9IHNlbGYubWVtYmVyc1tjaS5yZW1vdGVfdXJpXQorCQkJbS5qb2luX2NhbGwoY2FsbCkKKwkJY2FsbC5hbnN3ZXIoMjAwKQorCQorCWRlZiBvbl9pbmNvbWluZ19zdWJzY3JpYmUoc2VsZiwgYnVkZHksIGZyb21fdXJpLCBjb250YWN0X3VyaSwgcHJlc19vYmopOgorCQlzZWxmLkRFQlVHKCJvbl9pbmNvbWluZ19zdWJzY3JpYmUgZnJvbSAlKHVyaSlzXG4iICUgZnJvbV91cmksIElORk8pCisJCXJldHVybiAoMjAwLCAnT0snKQorCisJZGVmIG9uX3JlZ19zdGF0ZShzZWxmKToKKwkJYWkgPSBzZWxmLmFjYy5pbmZvKCkKKwkJc2VsZi5ERUJVRygiUmVnaXN0cmF0aW9uIHN0YXRlOiAlKGNvZGUpZC8lKHJlYXNvbilzXG4iICUgXAorCQkJCQl7J2NvZGUnOiBhaS5yZWdfc3RhdHVzLCAncmVhc29uJzogYWkucmVnX3JlYXNvbn0sIElORk8pCisJCWlmIGFpLnJlZ19zdGF0dXMvMTAwPT0yIGFuZCBhaS5yZWdfZXhwaXJlcyA+IDA6CisJCQlzZWxmLmFjYy5zZXRfYmFzaWNfc3RhdHVzKFRydWUpCisKKwlkZWYgb25fcGFnZXIoc2VsZiwgZnJvbV91cmksIGNvbnRhY3QsIG1pbWVfdHlwZSwgYm9keSk6CisJCWJvZHkgPSBib2R5LnN0cmlwKCIgXHRcclxuIikKKwkJaWYgbm90IHNlbGYuaGFuZGxlX2NtZChOb25lLCBmcm9tX3VyaSwgYm9keSk6CisJCQlzZWxmLmFjYy5zZW5kX3BhZ2VyKGZyb21fdXJpLCAiWW91IGhhdmUgbm90IGpvaW5lZCB0aGUgY2hhdCByb29tLiBUeXBlICctLWpvaW4nIHRvIGpvaW4gb3IgJy0taGVscCcgZm9yIHRoZSBoZWxwIikKKworCWRlZiBvbl9wYWdlcl9zdGF0dXMoc2VsZiwgdG9fdXJpLCBib2R5LCBpbV9pZCwgY29kZSwgcmVhc29uKToKKwkJcGFzcworCisJZGVmIG9uX3R5cGluZyhzZWxmLCBmcm9tX3VyaSwgY29udGFjdCwgaXNfdHlwaW5nKToKKwkJcGFzcworCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMKKyMgbWFpbigpCisjCisjCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCWJvdCA9IEJvdCgpCisJYm90Lm1haW4oQ0ZHX0ZJTEUpCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2NvbmZib3QvY29uZmlnLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvY29uZmJvdC9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkMzFiNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2NvbmZib3QvY29uZmlnLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyMgJElkOiBjb25maWcucHkgMjkxMiAyMDA5LTA4LTI0IDExOjU2OjEzWiBiZW5ueWxwICQKKyMKKyMgQ29uZmJvdCBzZXR0aW5ncworIworaW1wb3J0IHBqc3VhIGFzIHBqCisKKyMgU2V0IG9mIGFkbWlucy4gSWYgZW1wdHkgdGhlbiBldmVyeW9uZSBpcyBhZG1pbiEKK2FkbWlucyA9IHNldChbXSkKKworIyBhY2NfY2ZnIGhvbGRzIHRoZSBhY2NvdW50IGNvbmZpZyAoc2V0IGl0IHRvIE5vbmUgdG8gZGlzYWJsZSBhY2NvdW50KQorYWNjX2NmZyA9IE5vbmUKK2FjY19jZmcgPSBwai5BY2NvdW50Q29uZmlnKCkKK2lmIGFjY19jZmc6CisJYWNjX2NmZy5pZCA9ICJzaXA6Ym90QHBqc2lwLm9yZyIKKwlhY2NfY2ZnLnJlZ191cmkgPSAic2lwOnBqc2lwLm9yZyIKKwlhY2NfY2ZnLnByb3h5ID0gWyAic2lwOnBqc2lwLm9yZztscjt0cmFuc3BvcnQ9dGNwIiBdCisJYWNjX2NmZy5hdXRoX2NyZWQgPSBbIHBqLkF1dGhDcmVkKCIqIiwgImJvdCIsICJzZWNyZXRwYXNzIikgXQorCWFjY19jZmcucHVibGlzaF9lbmFibGVkID0gVHJ1ZQorCSNhY2NfY2ZnLnJlcXVpcmVfdGltZXIgPSBUcnVlCisKKyMgVHJhbnNwb3J0IGNvbmZpZ3MgKHNldCB0aGVtIHRvIE5vbmUgdG8gZGlzYWJsZSB0aGUgdHJhbnNwb3J0KQordWRwX2NmZyA9IHBqLlRyYW5zcG9ydENvbmZpZyg1MDgwKQordGNwX2NmZyA9IHBqLlRyYW5zcG9ydENvbmZpZygwKQorI3RjcF9jZmcgPSBOb25lCisKKyMgTG9nZ2luZyBDb25maWcgKHlvdSBjYW4gYWxzbyBzZXQgaXQgdG8gTm9uZSB0byB1c2UgZGVmYXVsdCB2YWx1ZXMpCitkZWYgbG9nX2NiKGxldmVsLCBzdHIsIGxlbik6CisJcHJpbnQgc3RyLAorCQorbG9nX2NmZyA9IHBqLkxvZ0NvbmZpZygpCisjbG9nX2NmZy5jYWxsYmFjayA9IGxvZ19jYgorCisjIFVBIENvbmZpZyAoeW91IGNhbiBhbHNvIHNldCBpdCB0byBOb25lIHRvIHVzZSBkZWZhdWx0IHZhbHVlcykKK3VhX2NmZyA9IHBqLlVBQ29uZmlnKCkKK3VhX2NmZy51c2VyX2FnZW50ID0gIlBKU0lQIENvbmZCb3QiCit1YV9jZmcuc3R1bl9ob3N0ID0gInN0dW4ucGpzaXAub3JnIgorCisjIE1lZGlhIGNvbmZpZyAoeW91IGNhbiBhbHNvIHNldCBpdCB0byBOb25lIHRvIHVzZSBkZWZhdWx0IHZhbHVlcykKK21lZGlhX2NmZyA9IHBqLk1lZGlhQ29uZmlnKCkKK21lZGlhX2NmZy5lbmFibGVfaWNlID0gVHJ1ZQorbWVkaWFfY2ZnLm1heF9jYWxscyA9IDIwCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L0NsYXNzZXMvUm9vdFZpZXdDb250cm9sbGVyLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L0NsYXNzZXMvUm9vdFZpZXdDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2MjdkMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9Sb290Vmlld0NvbnRyb2xsZXIuaApAQCAtMCwwICsxLDMyIEBACisvKiAkSWQ6IFJvb3RWaWV3Q29udHJvbGxlci5oIDM1NTIgMjAxMS0wNS0wNSAwNTo1MDo0OFogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2ltcG9ydCAiVGVzdFZpZXdDb250cm9sbGVyLmgiCisKK0BpbnRlcmZhY2UgUm9vdFZpZXdDb250cm9sbGVyIDogVUlUYWJsZVZpZXdDb250cm9sbGVyIHsKKyAgICBOU011dGFibGVBcnJheSAqdGl0bGVzOworICAgIE5TTXV0YWJsZUFycmF5ICptZW51czsKKyAgICAKKyAgICBUZXN0Vmlld0NvbnRyb2xsZXIgKnRlc3RWaWV3OworfQorCitAcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBOU011dGFibGVBcnJheSAqdGl0bGVzOworQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNNdXRhYmxlQXJyYXkgKm1lbnVzOworQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgVGVzdFZpZXdDb250cm9sbGVyICp0ZXN0VmlldzsKKworQGVuZApkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL1Jvb3RWaWV3Q29udHJvbGxlci5tIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL1Jvb3RWaWV3Q29udHJvbGxlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2ZhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L0NsYXNzZXMvUm9vdFZpZXdDb250cm9sbGVyLm0KQEAgLTAsMCArMSwzMzUgQEAKKy8qICRJZDogUm9vdFZpZXdDb250cm9sbGVyLm0gMzU1MiAyMDExLTA1LTA1IDA1OjUwOjQ4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW1wb3J0ICJSb290Vmlld0NvbnRyb2xsZXIuaCIKKyNpbXBvcnQgImd1aS5oIgorI2ltcG9ydCAic3lzdGVzdC5oIgorCisvKiBTbGVlcCBpbnRlcnZhbCBkdXJhdGlvbiwgY2hhbmdlIHRvIHNob3J0ZXIgZHVyYXRpb24gZm9yIGJldHRlcgorICogaW50ZXJhY3Rpb24gYnV0IG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggdGltZSBmb3IgdGhlIG90aGVyCisgKiB0aHJlYWQgdG8gZG8gd2hhdCBpdCdzIHN1cHBvc2VkIHRvIGRvCisgKi8KKyNkZWZpbmUgU0xFRVBfSU5URVJWQUwgMC41CisKK0BpbXBsZW1lbnRhdGlvbiBSb290Vmlld0NvbnRyb2xsZXIKK0BzeW50aGVzaXplIHRpdGxlczsKK0BzeW50aGVzaXplIG1lbnVzOworQHN5bnRoZXNpemUgdGVzdFZpZXc7CisKK1Jvb3RWaWV3Q29udHJvbGxlcgkqdmlldzsKKworYm9vbAkJCXN5c3Rlc3RfaW5pdGlhbGl6ZWQ7Citib29sCQkJdGhyZWFkX3F1aXQ7CitndWlfbWVudQkJKmdtZW51OworaW50CQkJc2VjdGlvbjsKK2ludAkJCXJvdzsKK2NvbnN0IGNoYXIJCSpjdGl0bGU7Citjb25zdCBjaGFyCQkqY21zZzsgCitlbnVtIGd1aV9mbGFnCQljZmxhZzsKKworcGpfc3RhdHVzX3QgZ3VpX2luaXQoZ3VpX21lbnUgKm1lbnUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhtZW51KTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUnVuIEdVSSBtYWluIGxvb3AgKi8KK3BqX3N0YXR1c190IGd1aV9zdGFydChndWlfbWVudSAqbWVudSkKK3sKKyAgICB2aWV3LnRpdGxlcyA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTptZW51LT5zdWJtZW51X2NudF07CisgICAgdmlldy5tZW51cyA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTptZW51LT5zdWJtZW51X2NudF07CisgICAgTlNNdXRhYmxlQXJyYXkgKnNtZW51OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVudS0+c3VibWVudV9jbnQ7IGkrKykgeworCU5TU3RyaW5nICpzdHIgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiAsIG1lbnUtPnN1Ym1lbnVzW2ldLT50aXRsZV07CisJW3ZpZXcudGl0bGVzIGFkZE9iamVjdDogc3RyXTsKKwlzbWVudSA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTptZW51LT5zdWJtZW51c1tpXS0+c3VibWVudV9jbnRdOworCS8qIFdlIGRvIG5vdCBuZWVkIHRoZSBsYXN0IHR3byBtZW51cyBvZiB0aGUgIlRlc3RzIiBtZW51IChOVUxMIGFuZCAiRXhpdCIpLAorCSAqIHNvIHN1YnRyYWN0IGJ5IDIKKwkgKi8KKwlmb3IgKGludCBqID0gMDsgaiA8IG1lbnUtPnN1Ym1lbnVzW2ldLT5zdWJtZW51X2NudCAtIChpPT0wPyAyOiAwKTsgaisrKSB7CisJICAgIHN0ciA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXMiICwgbWVudS0+c3VibWVudXNbaV0tPnN1Ym1lbnVzW2pdLT50aXRsZV07CisJICAgIFtzbWVudSBhZGRPYmplY3Q6c3RyXTsKKwl9CisJW3ZpZXcubWVudXMgYWRkT2JqZWN0OnNtZW51XTsKKyAgICB9CisgICAgZ21lbnUgPSBtZW51OworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTaWduYWwgR1VJIG1haW5sb29wIHRvIHN0b3AgKi8KK3ZvaWQgZ3VpX2Rlc3Ryb3kodm9pZCkKK3sKK30KKworLyogQVVYOiBkaXNwbGF5IG1lc3NhZ2Vib3ggKi8KK2VudW0gZ3VpX2tleSBndWlfbXNnYm94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICptZXNzYWdlLCBlbnVtIGd1aV9mbGFnIGZsYWcpCit7CisgICAgY3RpdGxlID0gdGl0bGU7CisgICAgY21zZyA9IG1lc3NhZ2U7CisgICAgY2ZsYWcgPSBmbGFnOworICAgIFt2aWV3IHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDpAc2VsZWN0b3Ioc2hvd01zZykgd2l0aE9iamVjdDpuaWwgd2FpdFVudGlsRG9uZTpZRVNdOworICAgIAorICAgIHZpZXcudGVzdFZpZXcua2V5ID0gMDsKKyAgICB3aGlsZSh2aWV3LnRlc3RWaWV3LmtleSA9PSAwKSB7CisJLyogTGV0IHRoZSBtYWluIHRocmVhZCBkbyBpdHMgam9iIChyZWZyZXNoIHRoZSB2aWV3KSB3aGlsZSB3ZSB3YWl0IGZvciAKKwkgKiB1c2VyIGludGVyYWN0aW9uIChidXR0b24gY2xpY2spCisJICovCisJW05TVGhyZWFkIHNsZWVwRm9yVGltZUludGVydmFsOlNMRUVQX0lOVEVSVkFMXTsKKyAgICB9CisgICAgCisgICAgaWYgKHZpZXcudGVzdFZpZXcua2V5ID09IDEpCisJcmV0dXJuIEtFWV9PSzsKKyAgICBlbHNlCisJcmV0dXJuIChmbGFnID09IFdJVEhfWUVTTk8/IEtFWV9OTzogS0VZX0NBTkNFTCk7Cit9CisKKy8qIEFVWDogc2xlZXAgKi8KK3ZvaWQgZ3VpX3NsZWVwKHVuc2lnbmVkIHNlYykKK3sKKyAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6c2VjXTsKK30KKworLSAodm9pZCl2aWV3RGlkTG9hZCB7CisgICAgW3N1cGVyIHZpZXdEaWRMb2FkXTsKKyAgICAKKyAgICB2aWV3ID0gc2VsZjsKKyAgICAKKyAgICAvKiBHZXQgYSB3cml0YWJsZSBwYXRoIGZvciBvdXRwdXQgZmlsZXMgKi8KKyAgICBOU0FycmF5ICpwYXRocyA9IE5TU2VhcmNoUGF0aEZvckRpcmVjdG9yaWVzSW5Eb21haW5zKE5TRG9jdW1lbnREaXJlY3RvcnksIE5TVXNlckRvbWFpbk1hc2ssIFlFUyk7CisgICAgTlNTdHJpbmcgKmRvY3VtZW50c0RpcmVjdG9yeSA9IFtwYXRocyBvYmplY3RBdEluZGV4OjBdOworICAgIFtkb2N1bWVudHNEaXJlY3RvcnkgZ2V0Q1N0cmluZzpkb2NfcGF0aCBtYXhMZW5ndGg6UEFUSF9MRU5HVEggZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyAgICBzdHJuY2F0KGRvY19wYXRoLCAiLyIsIFBBVEhfTEVOR1RIKTsKKworICAgIC8qIEdldCBwYXRoIGZvciBvdXIgdGVzdCByZXNvdXJjZXMgKHRoZSB3YXYgZmlsZXMpICovCisgICAgTlNTdHJpbmcgKnJlc1BhdGggPSBbW05TQnVuZGxlIG1haW5CdW5kbGVdIHJlc291cmNlUGF0aF07CisgICAgW3Jlc1BhdGggZ2V0Q1N0cmluZzpyZXNfcGF0aCBtYXhMZW5ndGg6UEFUSF9MRU5HVEggZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyAgICBzdHJuY2F0KHJlc19wYXRoLCAiLyIsIFBBVEhfTEVOR1RIKTsKKyAgICAKKyAgICBzeXN0ZXN0X2luaXRpYWxpemVkID0gZmFsc2U7CisgICAgdGhyZWFkX3F1aXQgPSBmYWxzZTsKKyAgICBbTlNUaHJlYWQgZGV0YWNoTmV3VGhyZWFkU2VsZWN0b3I6QHNlbGVjdG9yKHN0YXJ0VGVzdCkgdG9UYXJnZXQ6c2VsZiB3aXRoT2JqZWN0Om5pbF07CisgICAgLyogTGV0IG91ciBuZXcgdGhyZWFkIGluaXRpYWxpemUgKi8KKyAgICB3aGlsZSAoIXN5c3Rlc3RfaW5pdGlhbGl6ZWQpIHsKKwlbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6U0xFRVBfSU5URVJWQUxdOworICAgIH0KKworICAgIC8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzcGxheSBhbiBFZGl0IGJ1dHRvbiBpbiB0aGUgbmF2aWdhdGlvbiBiYXIgZm9yIHRoaXMgdmlldyBjb250cm9sbGVyLgorICAgIC8vIHNlbGYubmF2aWdhdGlvbkl0ZW0ucmlnaHRCYXJCdXR0b25JdGVtID0gc2VsZi5lZGl0QnV0dG9uSXRlbTsKK30KKworLyoKKyAtICh2b2lkKXZpZXdXaWxsQXBwZWFyOihCT09MKWFuaW1hdGVkIHsKKyAgICBbc3VwZXIgdmlld1dpbGxBcHBlYXI6YW5pbWF0ZWRdOworIH0KKyAqLworLyoKKyAtICh2b2lkKXZpZXdEaWRBcHBlYXI6KEJPT0wpYW5pbWF0ZWQgeworICAgIFtzdXBlciB2aWV3RGlkQXBwZWFyOmFuaW1hdGVkXTsKKyB9CisgKi8KKy8qCisgLSAodm9pZCl2aWV3V2lsbERpc2FwcGVhcjooQk9PTClhbmltYXRlZCB7CisgICAgW3N1cGVyIHZpZXdXaWxsRGlzYXBwZWFyOmFuaW1hdGVkXTsKKyB9CisgKi8KKy8qCisgLSAodm9pZCl2aWV3RGlkRGlzYXBwZWFyOihCT09MKWFuaW1hdGVkIHsKKyAgICBbc3VwZXIgdmlld0RpZERpc2FwcGVhcjphbmltYXRlZF07CisgfQorICovCisKKy8qCisgLy8gT3ZlcnJpZGUgdG8gYWxsb3cgb3JpZW50YXRpb25zIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgcG9ydHJhaXQgb3JpZW50YXRpb24uCisgLSAoQk9PTClzaG91bGRBdXRvcm90YXRlVG9JbnRlcmZhY2VPcmllbnRhdGlvbjooVUlJbnRlcmZhY2VPcmllbnRhdGlvbilpbnRlcmZhY2VPcmllbnRhdGlvbiB7CisgICAgLy8gUmV0dXJuIFlFUyBmb3Igc3VwcG9ydGVkIG9yaWVudGF0aW9ucy4KKyAgICByZXR1cm4gKGludGVyZmFjZU9yaWVudGF0aW9uID09IFVJSW50ZXJmYWNlT3JpZW50YXRpb25Qb3J0cmFpdCk7CisgfQorICovCisKKy0gKHZvaWQpZGlkUmVjZWl2ZU1lbW9yeVdhcm5pbmcgeworICAgIC8vIFJlbGVhc2VzIHRoZSB2aWV3IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIHN1cGVydmlldy4KKyAgICBbc3VwZXIgZGlkUmVjZWl2ZU1lbW9yeVdhcm5pbmddOworICAgIAorICAgIC8vIFJlbGVhc2UgYW55IGNhY2hlZCBkYXRhLCBpbWFnZXMsIGV0YyB0aGF0IGFyZW4ndCBpbiB1c2UuCit9CisKKy0gKHZvaWQpdmlld0RpZFVubG9hZCB7CisgICAgLy8gUmVsZWFzZSBhbnl0aGluZyB0aGF0IGNhbiBiZSByZWNyZWF0ZWQgaW4gdmlld0RpZExvYWQgb3Igb24gZGVtYW5kLgorICAgIC8vIGUuZy4gc2VsZi5teU91dGxldCA9IG5pbDsKKyAgICBzZWxmLnRpdGxlcyA9IG5pbDsKKyAgICBzZWxmLm1lbnVzID0gbmlsOworICAgIAorICAgIHRocmVhZF9xdWl0ID0gdHJ1ZTsKKyAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6U0xFRVBfSU5URVJWQUxdOworfQorCisKKyNwcmFnbWEgbWFyayBUYWJsZSB2aWV3IG1ldGhvZHMKKworCistIChOU0ludGVnZXIpbnVtYmVyT2ZTZWN0aW9uc0luVGFibGVWaWV3OihVSVRhYmxlVmlldyAqKXRhYmxlVmlldyB7CisgICAgcmV0dXJuIFt0aXRsZXMgY291bnRdOworfQorCisKKy8vIEN1c3RvbWl6ZSB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlIHZpZXcuCistIChOU0ludGVnZXIpdGFibGVWaWV3OihVSVRhYmxlVmlldyAqKXRhYmxlVmlldyBudW1iZXJPZlJvd3NJblNlY3Rpb246KE5TSW50ZWdlcilzZWN0aW9uIHsKKyAgICByZXR1cm4gW1ttZW51cyBvYmplY3RBdEluZGV4OnNlY3Rpb25dIGNvdW50XTsKK30KKworCistIChOU1N0cmluZyAqKXRhYmxlVmlldzooVUlUYWJsZVZpZXcgKil0YWJsZVZpZXcgdGl0bGVGb3JIZWFkZXJJblNlY3Rpb246KE5TSW50ZWdlcilzZWN0aW9uIHsKKyAgICAvLyBUaGUgaGVhZGVyIGZvciB0aGUgc2VjdGlvbiBpcyB0aGUgcmVnaW9uIG5hbWUgLS0gZ2V0IHRoaXMgZnJvbSB0aGUgcmVnaW9uIGF0IHRoZSBzZWN0aW9uIGluZGV4LgorICAgIHJldHVybiBbdGl0bGVzIG9iamVjdEF0SW5kZXg6c2VjdGlvbl07Cit9CisKKy8vIEN1c3RvbWl6ZSB0aGUgYXBwZWFyYW5jZSBvZiB0YWJsZSB2aWV3IGNlbGxzLgorLSAoVUlUYWJsZVZpZXdDZWxsICopdGFibGVWaWV3OihVSVRhYmxlVmlldyAqKXRhYmxlVmlldyBjZWxsRm9yUm93QXRJbmRleFBhdGg6KE5TSW5kZXhQYXRoICopaW5kZXhQYXRoIHsKKyAgICAKKyAgICBzdGF0aWMgTlNTdHJpbmcgKkNlbGxJZGVudGlmaWVyID0gQCJDZWxsIjsKKyAgICAKKyAgICBVSVRhYmxlVmlld0NlbGwgKmNlbGwgPSBbdGFibGVWaWV3IGRlcXVldWVSZXVzYWJsZUNlbGxXaXRoSWRlbnRpZmllcjpDZWxsSWRlbnRpZmllcl07CisgICAgaWYgKGNlbGwgPT0gbmlsKSB7CisgICAgICAgIGNlbGwgPSBbW1tVSVRhYmxlVmlld0NlbGwgYWxsb2NdIGluaXRXaXRoU3R5bGU6VUlUYWJsZVZpZXdDZWxsU3R5bGVEZWZhdWx0IHJldXNlSWRlbnRpZmllcjpDZWxsSWRlbnRpZmllcl0gYXV0b3JlbGVhc2VdOworICAgIH0KKyAgICAKKyAgICAvLyBDb25maWd1cmUgdGhlIGNlbGwuCisgICAgY2VsbC50ZXh0TGFiZWwudGV4dCA9IFtbbWVudXMgb2JqZWN0QXRJbmRleDppbmRleFBhdGguc2VjdGlvbl0gb2JqZWN0QXRJbmRleDppbmRleFBhdGgucm93XTsKKyAgICAKKyAgICByZXR1cm4gY2VsbDsKK30KKworLSAodm9pZClzdGFydFRlc3QgeworICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisgICAgaWYgKHN5c3Rlc3RfaW5pdCgpICE9IFBKX1NVQ0NFU1MpIHsKKwlbcG9vbCByZWxlYXNlXTsKKwlyZXR1cm47CisgICAgfQorICAgIAorICAgIHN5c3Rlc3RfcnVuKCk7CisgICAgCisgICAgc3lzdGVzdF9pbml0aWFsaXplZCA9IDE7CisgICAgd2hpbGUoIXRocmVhZF9xdWl0KSB7CisJc2VjdGlvbiA9IC0xOworCXdoaWxlIChzZWN0aW9uID09IC0xKSB7CisJICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDpTTEVFUF9JTlRFUlZBTF07CisJfQorCSgqZ21lbnUtPnN1Ym1lbnVzW3NlY3Rpb25dLT5zdWJtZW51c1tyb3ddLT5oYW5kbGVyKSgpOworCWNtc2cgPSBOVUxMOworCVt2aWV3IHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDpAc2VsZWN0b3Ioc2hvd01zZykgd2l0aE9iamVjdDpuaWwgd2FpdFVudGlsRG9uZTpZRVNdOworICAgIH0KKyAgICAKKyAgICBzeXN0ZXN0X2RlaW5pdCgpOworICAgIFtwb29sIHJlbGVhc2VdOworfQorCistICh2b2lkKXNob3dNc2cgeworICAgIGlmIChjbXNnID09IE5VTEwpIHsKKwlzZWxmLnRlc3RWaWV3LnRlc3REZXNjLnRleHQgPSBbc2VsZi50ZXN0Vmlldy50ZXN0RGVzYy50ZXh0IHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOiBAIkZpbmlzaGVkIl07CisJW3NlbGYudGVzdFZpZXcudGVzdERlc2Mgc2Nyb2xsUmFuZ2VUb1Zpc2libGU6TlNNYWtlUmFuZ2UoW3NlbGYudGVzdFZpZXcudGVzdERlc2MudGV4dCBsZW5ndGhdIC0gMSwgMSldOworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjEgc2V0SGlkZGVuOnRydWVdOworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjIgc2V0SGlkZGVuOnRydWVdOworCXJldHVybjsKKyAgICB9CisgICAgc2VsZi50ZXN0Vmlldy50aXRsZSA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXMiLCBjdGl0bGVdOworICAgIHNlbGYudGVzdFZpZXcudGVzdERlc2MudGV4dCA9IFtzZWxmLnRlc3RWaWV3LnRlc3REZXNjLnRleHQgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXNcblxuIiwgY21zZ11dOworICAgIFtzZWxmLnRlc3RWaWV3LnRlc3REZXNjIHNjcm9sbFJhbmdlVG9WaXNpYmxlOk5TTWFrZVJhbmdlKFtzZWxmLnRlc3RWaWV3LnRlc3REZXNjLnRleHQgbGVuZ3RoXSAtIDEsIDEpXTsKKyAgICAKKyAgICBbc2VsZi50ZXN0Vmlldy5idXR0b24xIHNldEhpZGRlbjpmYWxzZV07CisgICAgW3NlbGYudGVzdFZpZXcuYnV0dG9uMiBzZXRIaWRkZW46ZmFsc2VdOworICAgIGlmIChjZmxhZyA9PSBXSVRIX1lFU05PKSB7CisJW3NlbGYudGVzdFZpZXcuYnV0dG9uMSBzZXRUaXRsZTpAIlllcyIgZm9yU3RhdGU6VUlDb250cm9sU3RhdGVOb3JtYWxdOworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjIgc2V0VGl0bGU6QCJObyIgZm9yU3RhdGU6VUlDb250cm9sU3RhdGVOb3JtYWxdOworICAgIH0gZWxzZSBpZiAoY2ZsYWcgPT0gV0lUSF9PSykgeworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjEgc2V0VGl0bGU6QCJPSyIgZm9yU3RhdGU6VUlDb250cm9sU3RhdGVOb3JtYWxdOworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjIgc2V0SGlkZGVuOnRydWVdOworICAgIH0gZWxzZSBpZiAoY2ZsYWcgPT0gV0lUSF9PS0NBTkNFTCkgeworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjEgc2V0VGl0bGU6QCJPSyIgZm9yU3RhdGU6VUlDb250cm9sU3RhdGVOb3JtYWxdOworCVtzZWxmLnRlc3RWaWV3LmJ1dHRvbjIgc2V0VGl0bGU6QCJDYW5jZWwiIGZvclN0YXRlOlVJQ29udHJvbFN0YXRlTm9ybWFsXTsKKyAgICB9Cit9CisKKworLy8gT3ZlcnJpZGUgdG8gc3VwcG9ydCByb3cgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSB2aWV3LgorLSAodm9pZCl0YWJsZVZpZXc6KFVJVGFibGVWaWV3ICopdGFibGVWaWV3IGRpZFNlbGVjdFJvd0F0SW5kZXhQYXRoOihOU0luZGV4UGF0aCAqKWluZGV4UGF0aCB7CisgICAgCisgICAgLy8gTmF2aWdhdGlvbiBsb2dpYyBtYXkgZ28gaGVyZSAtLSBmb3IgZXhhbXBsZSwgY3JlYXRlIGFuZCBwdXNoIGFub3RoZXIgdmlldyBjb250cm9sbGVyLgorICAgIC8vIEFub3RoZXJWaWV3Q29udHJvbGxlciAqYW5vdGhlclZpZXdDb250cm9sbGVyID0gW1tBbm90aGVyVmlld0NvbnRyb2xsZXIgYWxsb2NdIGluaXRXaXRoTmliTmFtZTpAIkFub3RoZXJWaWV3IiBidW5kbGU6bmlsXTsKKyAgICAvLyBbc2VsZi5uYXZpZ2F0aW9uQ29udHJvbGxlciBwdXNoVmlld0NvbnRyb2xsZXI6YW5vdGhlclZpZXdDb250cm9sbGVyIGFuaW1hdGVkOllFU107CisgICAgLy8gW2Fub3RoZXJWaWV3Q29udHJvbGxlciByZWxlYXNlXTsKKyAgICAKKyAgICBpZiAoc2VsZi50ZXN0VmlldyA9PSBuaWwpIHsKKwlzZWxmLnRlc3RWaWV3ID0gW1tUZXN0Vmlld0NvbnRyb2xsZXIgYWxsb2NdIGluaXRXaXRoTmliTmFtZTpAIlRlc3RWaWV3Q29udHJvbGxlciIgYnVuZGxlOltOU0J1bmRsZSBtYWluQnVuZGxlXV07CisgICAgfQorICAgIAorICAgIFtzZWxmLm5hdmlnYXRpb25Db250cm9sbGVyIHB1c2hWaWV3Q29udHJvbGxlcjpzZWxmLnRlc3RWaWV3IGFuaW1hdGVkOllFU107CisgICAgc2VsZi50ZXN0Vmlldy50aXRsZSA9IFtbbWVudXMgb2JqZWN0QXRJbmRleDppbmRleFBhdGguc2VjdGlvbl0gb2JqZWN0QXRJbmRleDppbmRleFBhdGgucm93XTsKKyAgICBzZWxmLnRlc3RWaWV3LnRlc3REZXNjLnRleHQgPSBAIiI7CisgICAgc2VjdGlvbiA9IGluZGV4UGF0aC5zZWN0aW9uOworICAgIHJvdyA9IGluZGV4UGF0aC5yb3c7Cit9CisKKworLyoKKyAvLyBPdmVycmlkZSB0byBzdXBwb3J0IGNvbmRpdGlvbmFsIGVkaXRpbmcgb2YgdGhlIHRhYmxlIHZpZXcuCisgLSAoQk9PTCl0YWJsZVZpZXc6KFVJVGFibGVWaWV3ICopdGFibGVWaWV3IGNhbkVkaXRSb3dBdEluZGV4UGF0aDooTlNJbmRleFBhdGggKilpbmRleFBhdGggeworICAgIC8vIFJldHVybiBOTyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGJlIGVkaXRhYmxlLgorICAgIHJldHVybiBZRVM7CisgfQorICovCisKKworLyoKKyAvLyBPdmVycmlkZSB0byBzdXBwb3J0IGVkaXRpbmcgdGhlIHRhYmxlIHZpZXcuCisgLSAodm9pZCl0YWJsZVZpZXc6KFVJVGFibGVWaWV3ICopdGFibGVWaWV3IGNvbW1pdEVkaXRpbmdTdHlsZTooVUlUYWJsZVZpZXdDZWxsRWRpdGluZ1N0eWxlKWVkaXRpbmdTdHlsZSBmb3JSb3dBdEluZGV4UGF0aDooTlNJbmRleFBhdGggKilpbmRleFBhdGggeworIAorICAgIGlmIChlZGl0aW5nU3R5bGUgPT0gVUlUYWJsZVZpZXdDZWxsRWRpdGluZ1N0eWxlRGVsZXRlKSB7CisJLy8gRGVsZXRlIHRoZSByb3cgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCisJW3RhYmxlVmlldyBkZWxldGVSb3dzQXRJbmRleFBhdGhzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDppbmRleFBhdGhdIHdpdGhSb3dBbmltYXRpb246VUlUYWJsZVZpZXdSb3dBbmltYXRpb25GYWRlXTsKKyAgICB9ICAgCisgICAgZWxzZSBpZiAoZWRpdGluZ1N0eWxlID09IFVJVGFibGVWaWV3Q2VsbEVkaXRpbmdTdHlsZUluc2VydCkgeworCS8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgY2xhc3MsIGluc2VydCBpdCBpbnRvIHRoZSBhcnJheSwgYW5kIGFkZCBhIG5ldyByb3cgdG8gdGhlIHRhYmxlIHZpZXcuCisgICAgfSAgIAorIH0KKyAqLworCisKKy8qCisgLy8gT3ZlcnJpZGUgdG8gc3VwcG9ydCByZWFycmFuZ2luZyB0aGUgdGFibGUgdmlldy4KKyAtICh2b2lkKXRhYmxlVmlldzooVUlUYWJsZVZpZXcgKil0YWJsZVZpZXcgbW92ZVJvd0F0SW5kZXhQYXRoOihOU0luZGV4UGF0aCAqKWZyb21JbmRleFBhdGggdG9JbmRleFBhdGg6KE5TSW5kZXhQYXRoICopdG9JbmRleFBhdGggeworIH0KKyAqLworCisKKy8qCisgLy8gT3ZlcnJpZGUgdG8gc3VwcG9ydCBjb25kaXRpb25hbCByZWFycmFuZ2luZyBvZiB0aGUgdGFibGUgdmlldy4KKyAtIChCT09MKXRhYmxlVmlldzooVUlUYWJsZVZpZXcgKil0YWJsZVZpZXcgY2FuTW92ZVJvd0F0SW5kZXhQYXRoOihOU0luZGV4UGF0aCAqKWluZGV4UGF0aCB7CisgICAgLy8gUmV0dXJuIE5PIGlmIHlvdSBkbyBub3Qgd2FudCB0aGUgaXRlbSB0byBiZSByZS1vcmRlcmFibGUuCisgICAgcmV0dXJuIFlFUzsKKyB9CisgKi8KKworCistICh2b2lkKWRlYWxsb2MgeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCitAZW5kCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9UZXN0Vmlld0NvbnRyb2xsZXIuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9UZXN0Vmlld0NvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JjMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL1Rlc3RWaWV3Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qICRJZDogVGVzdFZpZXdDb250cm9sbGVyLmggMzU1MiAyMDExLTA1LTA1IDA1OjUwOjQ4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW1wb3J0IDxVSUtpdC9VSUtpdC5oPgorCisKK0BpbnRlcmZhY2UgVGVzdFZpZXdDb250cm9sbGVyIDogVUlWaWV3Q29udHJvbGxlciB7CisgICAgSUJPdXRsZXQgVUlUZXh0VmlldyAqdGVzdERlc2M7CisgICAgSUJPdXRsZXQgVUlCdXR0b24JKmJ1dHRvbjE7CisgICAgSUJPdXRsZXQgVUlCdXR0b24JKmJ1dHRvbjI7CisgICAgCisgICAgTlNJbnRlZ2VyIGtleTsKK30KKworQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgSUJPdXRsZXQgVUlUZXh0VmlldyAqdGVzdERlc2M7CitAcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBJQk91dGxldCBVSUJ1dHRvbiAqYnV0dG9uMTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZXRhaW4pIElCT3V0bGV0IFVJQnV0dG9uICpidXR0b24yOworQHByb3BlcnR5IChub25hdG9taWMpIE5TSW50ZWdlciBrZXk7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9UZXN0Vmlld0NvbnRyb2xsZXIubSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9UZXN0Vmlld0NvbnRyb2xsZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDRhMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL1Rlc3RWaWV3Q29udHJvbGxlci5tCkBAIC0wLDAgKzEsOTEgQEAKKy8qICRJZDogVGVzdFZpZXdDb250cm9sbGVyLm0gMzU1MiAyMDExLTA1LTA1IDA1OjUwOjQ4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW1wb3J0ICJUZXN0Vmlld0NvbnRyb2xsZXIuaCIKKworQGltcGxlbWVudGF0aW9uIFRlc3RWaWV3Q29udHJvbGxlcgorQHN5bnRoZXNpemUgdGVzdERlc2M7CitAc3ludGhlc2l6ZSBidXR0b24xOworQHN5bnRoZXNpemUgYnV0dG9uMjsKK0BzeW50aGVzaXplIGtleTsKKworLSAodm9pZClidXR0b24xUHJlc3NlZDooaWQpc2VuZGVyIHsKKyAgICBzZWxmLmtleSA9IDE7CisgICAgW3NlbGYuYnV0dG9uMSBzZXRIaWRkZW46dHJ1ZV07CisgICAgW3NlbGYuYnV0dG9uMiBzZXRIaWRkZW46dHJ1ZV07Cit9CisKKy0gKHZvaWQpYnV0dG9uMlByZXNzZWQ6KGlkKXNlbmRlciB7CisgICAgc2VsZi5rZXkgPSAyOworICAgIFtzZWxmLmJ1dHRvbjEgc2V0SGlkZGVuOnRydWVdOworICAgIFtzZWxmLmJ1dHRvbjIgc2V0SGlkZGVuOnRydWVdOworfQorCisvKgorIC8vIFRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLiAgT3ZlcnJpZGUgaWYgeW91IGNyZWF0ZSB0aGUgY29udHJvbGxlciBwcm9ncmFtbWF0aWNhbGx5IGFuZCB3YW50IHRvIHBlcmZvcm0gY3VzdG9taXphdGlvbiB0aGF0IGlzIG5vdCBhcHByb3ByaWF0ZSBmb3Igdmlld0RpZExvYWQuCisgLSAoaWQpaW5pdFdpdGhOaWJOYW1lOihOU1N0cmluZyAqKW5pYk5hbWVPck5pbCBidW5kbGU6KE5TQnVuZGxlICopbmliQnVuZGxlT3JOaWwgeworICAgIGlmIChzZWxmID0gW3N1cGVyIGluaXRXaXRoTmliTmFtZTpuaWJOYW1lT3JOaWwgYnVuZGxlOm5pYkJ1bmRsZU9yTmlsXSkgeworICAgIC8vIEN1c3RvbSBpbml0aWFsaXphdGlvbgorIH0KKyByZXR1cm4gc2VsZjsKKyB9CisgKi8KKworLyoKKyAvLyBJbXBsZW1lbnQgbG9hZFZpZXcgdG8gY3JlYXRlIGEgdmlldyBoaWVyYXJjaHkgcHJvZ3JhbW1hdGljYWxseSwgd2l0aG91dCB1c2luZyBhIG5pYi4KKyAtICh2b2lkKWxvYWRWaWV3IHsKKyB9CisgKi8KKworCisvLyBJbXBsZW1lbnQgdmlld0RpZExvYWQgdG8gZG8gYWRkaXRpb25hbCBzZXR1cCBhZnRlciBsb2FkaW5nIHRoZSB2aWV3LCB0eXBpY2FsbHkgZnJvbSBhIG5pYi4KKy0gKHZvaWQpdmlld0RpZExvYWQgeworICAgIFtzdXBlciB2aWV3RGlkTG9hZF07CisgICAgCisgICAgW2J1dHRvbjEgYWRkVGFyZ2V0OnNlbGYgYWN0aW9uOkBzZWxlY3RvcihidXR0b24xUHJlc3NlZDopIGZvckNvbnRyb2xFdmVudHM6KFVJQ29udHJvbEV2ZW50cylVSUNvbnRyb2xFdmVudFRvdWNoRG93bl07CisgICAgW2J1dHRvbjIgYWRkVGFyZ2V0OnNlbGYgYWN0aW9uOkBzZWxlY3RvcihidXR0b24yUHJlc3NlZDopIGZvckNvbnRyb2xFdmVudHM6KFVJQ29udHJvbEV2ZW50cylVSUNvbnRyb2xFdmVudFRvdWNoRG93bl07CisgICAgW3Rlc3REZXNjIHNldEVkaXRhYmxlOmZhbHNlXTsKK30KKworLyoKKyAvLyBPdmVycmlkZSB0byBhbGxvdyBvcmllbnRhdGlvbnMgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBwb3J0cmFpdCBvcmllbnRhdGlvbi4KKyAtIChCT09MKXNob3VsZEF1dG9yb3RhdGVUb0ludGVyZmFjZU9yaWVudGF0aW9uOihVSUludGVyZmFjZU9yaWVudGF0aW9uKWludGVyZmFjZU9yaWVudGF0aW9uIHsKKyAgICAvLyBSZXR1cm4gWUVTIGZvciBzdXBwb3J0ZWQgb3JpZW50YXRpb25zCisgICAgcmV0dXJuIChpbnRlcmZhY2VPcmllbnRhdGlvbiA9PSBVSUludGVyZmFjZU9yaWVudGF0aW9uUG9ydHJhaXQpOworIH0KKyAqLworCistICh2b2lkKWRpZFJlY2VpdmVNZW1vcnlXYXJuaW5nIHsKKyAgICAvLyBSZWxlYXNlcyB0aGUgdmlldyBpZiBpdCBkb2Vzbid0IGhhdmUgYSBzdXBlcnZpZXcuCisgICAgW3N1cGVyIGRpZFJlY2VpdmVNZW1vcnlXYXJuaW5nXTsKKyAgICAKKyAgICAvLyBSZWxlYXNlIGFueSBjYWNoZWQgZGF0YSwgaW1hZ2VzLCBldGMgdGhhdCBhcmVuJ3QgaW4gdXNlLgorfQorCistICh2b2lkKXZpZXdEaWRVbmxvYWQgeworICAgIC8vIFJlbGVhc2UgYW55IHJldGFpbmVkIHN1YnZpZXdzIG9mIHRoZSBtYWluIHZpZXcuCisgICAgLy8gZS5nLiBzZWxmLm15T3V0bGV0ID0gbmlsOworfQorCisKKy0gKHZvaWQpZGVhbGxvYyB7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9pcGpzeXN0ZXN0QXBwRGVsZWdhdGUuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvQ2xhc3Nlcy9pcGpzeXN0ZXN0QXBwRGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNlMDVjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL2lwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qICRJZDogaXBqc3lzdGVzdEFwcERlbGVnYXRlLmggMzU1MiAyMDExLTA1LTA1IDA1OjUwOjQ4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCitAaW50ZXJmYWNlIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZSA6IE5TT2JqZWN0IDxVSUFwcGxpY2F0aW9uRGVsZWdhdGU+IHsKKyAgICAKKyAgICBVSVdpbmRvdwkJICAgICp3aW5kb3c7CisgICAgVUlOYXZpZ2F0aW9uQ29udHJvbGxlciAgKm5hdmlnYXRpb25Db250cm9sbGVyOworfQorCitAcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBJQk91dGxldCBVSVdpbmRvdyAqd2luZG93OworQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgSUJPdXRsZXQgVUlOYXZpZ2F0aW9uQ29udHJvbGxlciAqbmF2aWdhdGlvbkNvbnRyb2xsZXI7CisKK0BlbmQKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL2lwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5tIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9DbGFzc2VzL2lwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDYzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L0NsYXNzZXMvaXBqc3lzdGVzdEFwcERlbGVnYXRlLm0KQEAgLTAsMCArMSw1NSBAQAorLyogJElkOiBpcGpzeXN0ZXN0QXBwRGVsZWdhdGUubSAzNTUyIDIwMTEtMDUtMDUgMDU6NTA6NDhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbXBvcnQgImlwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5oIgorI2ltcG9ydCAiUm9vdFZpZXdDb250cm9sbGVyLmgiCisKKworQGltcGxlbWVudGF0aW9uIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZQorCitAc3ludGhlc2l6ZSB3aW5kb3c7CitAc3ludGhlc2l6ZSBuYXZpZ2F0aW9uQ29udHJvbGxlcjsKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBBcHBsaWNhdGlvbiBsaWZlY3ljbGUKKworLSAodm9pZClhcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzooVUlBcHBsaWNhdGlvbiAqKWFwcGxpY2F0aW9uIHsgICAgCisgICAgCisgICAgLy8gT3ZlcnJpZGUgcG9pbnQgZm9yIGN1c3RvbWl6YXRpb24gYWZ0ZXIgYXBwIGxhdW5jaAorICAgIFt3aW5kb3cgYWRkU3VidmlldzpbbmF2aWdhdGlvbkNvbnRyb2xsZXIgdmlld11dOworICAgIFt3aW5kb3cgbWFrZUtleUFuZFZpc2libGVdOworfQorCisKKy0gKHZvaWQpYXBwbGljYXRpb25XaWxsVGVybWluYXRlOihVSUFwcGxpY2F0aW9uICopYXBwbGljYXRpb24geworICAgIC8vIFNhdmUgZGF0YSBpZiBhcHByb3ByaWF0ZQorfQorCisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTWVtb3J5IG1hbmFnZW1lbnQKKworLSAodm9pZClkZWFsbG9jIHsKKyAgICBbbmF2aWdhdGlvbkNvbnRyb2xsZXIgcmVsZWFzZV07CisgICAgW3dpbmRvdyByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworQGVuZAorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L01haW5XaW5kb3cueGliIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9NYWluV2luZG93LnhpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA4OTIyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9NYWluV2luZG93LnhpYgpAQCAtMCwwICsxLDUwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxhcmNoaXZlIHR5cGU9ImNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyMy5Db2NvYVRvdWNoLlhJQiIgdmVyc2lvbj0iNy4xMCI+CisJPGRhdGE+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LlN5c3RlbVRhcmdldCI+Nzg0PC9pbnQ+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LlN5c3RlbVZlcnNpb24iPjEwQzU0MDwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5JbnRlcmZhY2VCdWlsZGVyVmVyc2lvbiI+NzQwPC9zdHJpbmc+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LkFwcEtpdFZlcnNpb24iPjEwMzguMjU8L3N0cmluZz4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuSElUb29sYm94VmVyc2lvbiI+NDU4LjAwPC9zdHJpbmc+CisJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iSUJEb2N1bWVudC5QbHVnaW5WZXJzaW9ucyI+CisJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJPHN0cmluZyBrZXk9Ik5TLm9iamVjdC4wIj42Mjwvc3RyaW5nPgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iSUJEb2N1bWVudC5FZGl0ZWRPYmplY3RJRHMiPgorCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQk8aW50ZWdlciB2YWx1ZT0iMTMiLz4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9Ik5TQXJyYXkiIGtleT0iSUJEb2N1bWVudC5QbHVnaW5EZXBlbmRlbmNpZXMiPgorCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQk8c3RyaW5nPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50Lk1ldGFkYXRhIj4KKwkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPG9iamVjdCBjbGFzcz0iTlNBcnJheSIga2V5PSJkaWN0LnNvcnRlZEtleXMiIGlkPSIwIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPC9vYmplY3Q+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJJQkRvY3VtZW50LlJvb3RPYmplY3RzIiBpZD0iMTAwMCI+CisJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTxvYmplY3QgY2xhc3M9IklCUHJveHlPYmplY3QiIGlkPSI4NDEzNTE4NTYiPgorCQkJCTxzdHJpbmcga2V5PSJJQlByb3hpZWRPYmplY3RJZGVudGlmaWVyIj5JQkZpbGVzT3duZXI8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJQcm94eU9iamVjdCIgaWQ9IjMwMjAxNjMyOCI+CisJCQkJPHN0cmluZyBrZXk9IklCUHJveGllZE9iamVjdElkZW50aWZpZXIiPklCRmlyc3RSZXNwb25kZXI8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJVSUN1c3RvbU9iamVjdCIgaWQ9IjY2NDY2MTUyNCIvPgorCQkJPG9iamVjdCBjbGFzcz0iSUJVSVdpbmRvdyIgaWQ9IjM4MDAyNjAwNSI+CisJCQkJPG5pbCBrZXk9Ik5TTmV4dFJlc3BvbmRlciIvPgorCQkJCTxpbnQga2V5PSJOU3ZGbGFncyI+MTMxNjwvaW50PgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TUFNNYXRyaXgiIGtleT0iTlNGcmFtZU1hdHJpeCIvPgorCQkJCTxzdHJpbmcga2V5PSJOU0ZyYW1lU2l6ZSI+ezMyMCwgNDgwfTwvc3RyaW5nPgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3IiIGtleT0iSUJVSUJhY2tncm91bmRDb2xvciI+CisJCQkJCTxpbnQga2V5PSJOU0NvbG9yU3BhY2UiPjE8L2ludD4KKwkJCQkJPGJ5dGVzIGtleT0iTlNSR0IiPk1TQXhJREVBQTwvYnl0ZXM+CisJCQkJPC9vYmplY3Q+CisJCQkJPGJvb2wga2V5PSJJQlVJT3BhcXVlIj5OTzwvYm9vbD4KKwkJCQk8Ym9vbCBrZXk9IklCVUlDbGVhcnNDb250ZXh0QmVmb3JlRHJhd2luZyI+Tk88L2Jvb2w+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiIGtleT0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiLz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJVSU5hdmlnYXRpb25Db250cm9sbGVyIiBpZD0iNzAxMDAxOTI2Ij4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlVJU2ltdWxhdGVkU3RhdHVzQmFyTWV0cmljcyIga2V5PSJJQlVJU2ltdWxhdGVkU3RhdHVzQmFyTWV0cmljcyIvPgorCQkJCTxvYmplY3QgY2xhc3M9IklCVUlOYXZpZ2F0aW9uQmFyIiBrZXk9IklCVUlOYXZpZ2F0aW9uQmFyIiBpZD0iMjA3ODUwNjUzIj4KKwkJCQkJPG5pbCBrZXk9Ik5TTmV4dFJlc3BvbmRlciIvPgorCQkJCQk8aW50IGtleT0iTlN2RmxhZ3MiPjI1NjwvaW50PgorCQkJCQk8c3RyaW5nIGtleT0iTlNGcmFtZVNpemUiPnswLCAwfTwvc3RyaW5nPgorCQkJCQk8Ym9vbCBrZXk9IklCVUlPcGFxdWUiPk5PPC9ib29sPgorCQkJCQk8Ym9vbCBrZXk9IklCVUlDbGlwc1N1YnZpZXdzIj5ZRVM8L2Jvb2w+CisJCQkJCTxib29sIGtleT0iSUJVSU11bHRpcGxlVG91Y2hFbmFibGVkIj5ZRVM8L2Jvb2w+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNBcnJheSIga2V5PSJJQlVJVmlld0NvbnRyb2xsZXJzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCVUlWaWV3Q29udHJvbGxlciIgaWQ9IjYxOTIyNjAyOCI+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJJQlVJTmF2aWdhdGlvbkl0ZW0iIGtleT0iSUJVSU5hdmlnYXRpb25JdGVtIiBpZD0iMzk0NjY3NzE1Ij4KKwkJCQkJCQk8cmVmZXJlbmNlIGtleT0iSUJVSU5hdmlnYXRpb25CYXIiLz4KKwkJCQkJCQk8c3RyaW5nIGtleT0iSUJVSVRpdGxlIj5pcGpzeXN0ZXN0PC9zdHJpbmc+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJJQlVJUGFyZW50Vmlld0NvbnRyb2xsZXIiIHJlZj0iNzAxMDAxOTI2Ii8+CisJCQkJCQk8c3RyaW5nIGtleT0iSUJVSU5pYk5hbWUiPlJvb3RWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiIGtleT0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0Q29udGFpbmVyIiBrZXk9IklCRG9jdW1lbnQuT2JqZWN0cyI+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJjb25uZWN0aW9uUmVjb3JkcyI+CisJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJDb25uZWN0aW9uUmVjb3JkIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDb2NvYVRvdWNoT3V0bGV0Q29ubmVjdGlvbiIga2V5PSJjb25uZWN0aW9uIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJsYWJlbCI+ZGVsZWdhdGU8L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJzb3VyY2UiIHJlZj0iODQxMzUxODU2Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iZGVzdGluYXRpb24iIHJlZj0iNjY0NjYxNTI0Ii8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8aW50IGtleT0iY29ubmVjdGlvbklEIj40PC9pbnQ+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJDb25uZWN0aW9uUmVjb3JkIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDb2NvYVRvdWNoT3V0bGV0Q29ubmVjdGlvbiIga2V5PSJjb25uZWN0aW9uIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJsYWJlbCI+d2luZG93PC9zdHJpbmc+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlIiByZWY9IjY2NDY2MTUyNCIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImRlc3RpbmF0aW9uIiByZWY9IjM4MDAyNjAwNSIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPGludCBrZXk9ImNvbm5lY3Rpb25JRCI+NTwvaW50PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCQ29ubmVjdGlvblJlY29yZCI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ29jb2FUb3VjaE91dGxldENvbm5lY3Rpb24iIGtleT0iY29ubmVjdGlvbiI+CisJCQkJCQk8c3RyaW5nIGtleT0ibGFiZWwiPm5hdmlnYXRpb25Db250cm9sbGVyPC9zdHJpbmc+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlIiByZWY9IjY2NDY2MTUyNCIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImRlc3RpbmF0aW9uIiByZWY9IjcwMTAwMTkyNiIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPGludCBrZXk9ImNvbm5lY3Rpb25JRCI+MTU8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJNdXRhYmxlT3JkZXJlZFNldCIga2V5PSJvYmplY3RSZWNvcmRzIj4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9Im9yZGVyZWRPYmplY3RzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MDwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIwIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iY2hpbGRyZW4iIHJlZj0iMTAwMCIvPgorCQkJCQkJPG5pbCBrZXk9InBhcmVudCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4yPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjM4MDAyNjAwNSIvPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY2hpbGRyZW4iPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+LTE8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iODQxMzUxODU2Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJCTxzdHJpbmcga2V5PSJvYmplY3ROYW1lIj5GaWxlJ3MgT3duZXI8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MzwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI2NjQ2NjE1MjQiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4tMjwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIzMDIwMTYzMjgiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj45PC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjcwMTAwMTkyNiIvPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY2hpbGRyZW4iPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJCTxyZWZlcmVuY2UgcmVmPSIyMDc4NTA2NTMiLz4KKwkJCQkJCQk8cmVmZXJlbmNlIHJlZj0iNjE5MjI2MDI4Ii8+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4xMTwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIyMDc4NTA2NTMiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iNzAxMDAxOTI2Ii8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdFJlY29yZCI+CisJCQkJCQk8aW50IGtleT0ib2JqZWN0SUQiPjEzPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjYxOTIyNjAyOCIvPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY2hpbGRyZW4iPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJCTxyZWZlcmVuY2UgcmVmPSIzOTQ2Njc3MTUiLz4KKwkJCQkJCTwvb2JqZWN0PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSI3MDEwMDE5MjYiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MTQ8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iMzk0NjY3NzE1Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjYxOTIyNjAyOCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJmbGF0dGVuZWRQcm9wZXJ0aWVzIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9ImRpY3Quc29ydGVkS2V5cyI+CisJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQk8c3RyaW5nPi0xLkN1c3RvbUNsYXNzTmFtZTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPi0yLkN1c3RvbUNsYXNzTmFtZTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjExLklCUGx1Z2luRGVwZW5kZW5jeTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjEzLkN1c3RvbUNsYXNzTmFtZTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjEzLklCUGx1Z2luRGVwZW5kZW5jeTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjIuSUJBdHRyaWJ1dGVQbGFjZWhvbGRlcnNLZXk8L3N0cmluZz4KKwkJCQkJPHN0cmluZz4yLklCRWRpdG9yV2luZG93TGFzdENvbnRlbnRSZWN0PC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Mi5JQlBsdWdpbkRlcGVuZGVuY3k8L3N0cmluZz4KKwkJCQkJPHN0cmluZz4zLkN1c3RvbUNsYXNzTmFtZTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjMuSUJQbHVnaW5EZXBlbmRlbmN5PC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+OS5JQkVkaXRvcldpbmRvd0xhc3RDb250ZW50UmVjdDwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjkuSUJQbHVnaW5EZXBlbmRlbmN5PC9zdHJpbmc+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQkJPHN0cmluZz5VSUFwcGxpY2F0aW9uPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZz5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQkJPHN0cmluZz5Sb290Vmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZz5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSI+CisJCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkaWN0LnNvcnRlZEtleXMiIHJlZj0iMCIvPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8c3RyaW5nPnt7NjczLCAzNzZ9LCB7MzIwLCA0ODB9fTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPmlwanN5c3Rlc3RBcHBEZWxlZ2F0ZTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPnt7NTAwLCAzNDN9LCB7MzIwLCA0ODB9fTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTwvb2JqZWN0PgorCQkJPC9vYmplY3Q+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9InVubG9jYWxpemVkUHJvcGVydGllcyI+CisJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPHJlZmVyZW5jZSBrZXk9ImRpY3Quc29ydGVkS2V5cyIgcmVmPSIwIi8+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG5pbCBrZXk9ImFjdGl2ZUxvY2FsaXphdGlvbiIvPgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJsb2NhbGl6YXRpb25zIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8cmVmZXJlbmNlIGtleT0iZGljdC5zb3J0ZWRLZXlzIiByZWY9IjAiLz4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJkaWN0LnZhbHVlcyI+CisJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTwvb2JqZWN0PgorCQkJPC9vYmplY3Q+CisJCQk8bmlsIGtleT0ic291cmNlSUQiLz4KKwkJCTxpbnQga2V5PSJtYXhJRCI+MjA8L2ludD4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmliZXIiIGtleT0iSUJEb2N1bWVudC5DbGFzc2VzIj4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9InJlZmVyZW5jZWRQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbnMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5Sb290Vmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5VSVRhYmxlVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQlByb2plY3RTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Q2xhc3Nlcy9Sb290Vmlld0NvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+aXBqc3lzdGVzdEFwcERlbGVnYXRlPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJvdXRsZXRzIj4KKwkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNBcnJheSIga2V5PSJkaWN0LnNvcnRlZEtleXMiPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJCTxzdHJpbmc+bmF2aWdhdGlvbkNvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPndpbmRvdzwvc3RyaW5nPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJkaWN0LnZhbHVlcyI+CisJCQkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCQkJPHN0cmluZz5VSU5hdmlnYXRpb25Db250cm9sbGVyPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz5VSVdpbmRvdzwvc3RyaW5nPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCUHJvamVjdFNvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5DbGFzc2VzL2lwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJPC9vYmplY3Q+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJyZWZlcmVuY2VkUGFydGlhbENsYXNzRGVzY3JpcHRpb25zVjMuMisiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNFcnJvci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNGaWxlTWFuYWdlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNLZXlWYWx1ZUNvZGluZy5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNLZXlWYWx1ZU9ic2VydmluZy5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNLZXllZEFyY2hpdmVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU05ldFNlcnZpY2VzLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU09iamVjdC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNQb3J0Lmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1J1bkxvb3AuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TU3RyZWFtLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1RocmVhZC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNVUkwuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TVVJMQ29ubmVjdGlvbi5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNYTUxQYXJzZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSUFjY2Vzc2liaWxpdHkuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSU5pYkxvYWRpbmcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiIGlkPSI0NTc1NDc2MjciPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVJlc3BvbmRlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSUFwcGxpY2F0aW9uPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSUFwcGxpY2F0aW9uLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJQmFyQnV0dG9uSXRlbTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJQmFySXRlbTwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJQmFyQnV0dG9uSXRlbS5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSUJhckl0ZW08L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJQmFySXRlbS5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSU5hdmlnYXRpb25CYXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5VSVZpZXc8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiIGlkPSI3MTk5NjY1NjYiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSU5hdmlnYXRpb25CYXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlOYXZpZ2F0aW9uQ29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiIGlkPSI3Mzc2MTkwMTAiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSU5hdmlnYXRpb25Db250cm9sbGVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJTmF2aWdhdGlvbkl0ZW08L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlSWRlbnRpZmllciIgcmVmPSI3MTk5NjY1NjYiLz4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlSWRlbnRpZmllciIgcmVmPSI0NTc1NDc2MjciLz4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlTZWFyY2hCYXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5VSVZpZXc8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVNlYXJjaEJhci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVNlYXJjaERpc3BsYXlDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVNlYXJjaERpc3BsYXlDb250cm9sbGVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJVGFibGVWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVRhYmxlVmlld0NvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlUZXh0RmllbGQuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlSWRlbnRpZmllciIgcmVmPSI3Mzc2MTkwMTAiLz4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJVGFiQmFyQ29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXdDb250cm9sbGVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJV2luZG93PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlXaW5kb3cuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQk8L29iamVjdD4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQubG9jYWxpemF0aW9uTW9kZSI+MDwvaW50PgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVjbGFyZWREZXZlbG9wbWVudERlcGVuZGVuY2llcyI+CisJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLkNvY29hVG91Y2hQbHVnaW4uSW50ZXJmYWNlQnVpbGRlcjM8L3N0cmluZz4KKwkJCTxpbnRlZ2VyIHZhbHVlPSIzMTAwIiBrZXk9Ik5TLm9iamVjdC4wIi8+CisJCTwvb2JqZWN0PgorCQk8Ym9vbCBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVjbGFyZWREZXBlbmRlbmNpZXNUcmFja1N5c3RlbVRhcmdldFZlcnNpb24iPllFUzwvYm9vbD4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuTGFzdEtub3duUmVsYXRpdmVQcm9qZWN0UGF0aCI+aXBqc3lzdGVzdC54Y29kZXByb2o8L3N0cmluZz4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQuZGVmYXVsdFByb3BlcnR5QWNjZXNzQ29udHJvbCI+MzwvaW50PgorCQk8c3RyaW5nIGtleT0iSUJDb2NvYVRvdWNoUGx1Z2luVmVyc2lvbiI+My4xPC9zdHJpbmc+CisJPC9kYXRhPgorPC9hcmNoaXZlPgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9Sb290Vmlld0NvbnRyb2xsZXIueGliIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9Sb290Vmlld0NvbnRyb2xsZXIueGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L1Jvb3RWaWV3Q29udHJvbGxlci54aWIKQEAgLTAsMCArMSwzODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YXJjaGl2ZSB0eXBlPSJjb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlcjMuQ29jb2FUb3VjaC5YSUIiIHZlcnNpb249IjcuMTAiPgorCTxkYXRhPgorCQk8aW50IGtleT0iSUJEb2N1bWVudC5TeXN0ZW1UYXJnZXQiPjc4NDwvaW50PgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5TeXN0ZW1WZXJzaW9uIj4xMEE0MDU8L3N0cmluZz4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuSW50ZXJmYWNlQnVpbGRlclZlcnNpb24iPjczMjwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5BcHBLaXRWZXJzaW9uIj4xMDMxPC9zdHJpbmc+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LkhJVG9vbGJveFZlcnNpb24iPjQzMi4wMDwvc3RyaW5nPgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9IklCRG9jdW1lbnQuUGx1Z2luVmVyc2lvbnMiPgorCQkJPHN0cmluZyBrZXk9Ik5TLmtleS4wIj5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCTxzdHJpbmcga2V5PSJOUy5vYmplY3QuMCI+NjI8L3N0cmluZz4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9IklCRG9jdW1lbnQuRWRpdGVkT2JqZWN0SURzIj4KKwkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPGludGVnZXIgdmFsdWU9IjIiLz4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9Ik5TQXJyYXkiIGtleT0iSUJEb2N1bWVudC5QbHVnaW5EZXBlbmRlbmNpZXMiPgorCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQk8c3RyaW5nPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50Lk1ldGFkYXRhIj4KKwkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPG9iamVjdCBjbGFzcz0iTlNBcnJheSIga2V5PSJkaWN0LnNvcnRlZEtleXMiIGlkPSIwIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPC9vYmplY3Q+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJJQkRvY3VtZW50LlJvb3RPYmplY3RzIiBpZD0iMTAwMCI+CisJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTxvYmplY3QgY2xhc3M9IklCUHJveHlPYmplY3QiIGlkPSI4NDEzNTE4NTYiPgorCQkJCTxzdHJpbmcga2V5PSJJQlByb3hpZWRPYmplY3RJZGVudGlmaWVyIj5JQkZpbGVzT3duZXI8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJQcm94eU9iamVjdCIgaWQ9IjM3MTM0OTY2MSI+CisJCQkJPHN0cmluZyBrZXk9IklCUHJveGllZE9iamVjdElkZW50aWZpZXIiPklCRmlyc3RSZXNwb25kZXI8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJVSVRhYmxlVmlldyIgaWQ9IjcwOTYxODUwNyI+CisJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TTmV4dFJlc3BvbmRlciIvPgorCQkJCTxpbnQga2V5PSJOU3ZGbGFncyI+Mjc0PC9pbnQ+CisJCQkJPHN0cmluZyBrZXk9Ik5TRnJhbWVTaXplIj57MzIwLCAyNDd9PC9zdHJpbmc+CisJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TU3VwZXJ2aWV3Ii8+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNDb2xvciIga2V5PSJJQlVJQmFja2dyb3VuZENvbG9yIj4KKwkJCQkJPGludCBrZXk9Ik5TQ29sb3JTcGFjZSI+MzwvaW50PgorCQkJCQk8Ynl0ZXMga2V5PSJOU1doaXRlIj5NUUE8L2J5dGVzPgorCQkJCTwvb2JqZWN0PgorCQkJCTxib29sIGtleT0iSUJVSU9wYXF1ZSI+Tk88L2Jvb2w+CisJCQkJPGJvb2wga2V5PSJJQlVJQ2xpcHNTdWJ2aWV3cyI+WUVTPC9ib29sPgorCQkJCTxib29sIGtleT0iSUJVSUNsZWFyc0NvbnRleHRCZWZvcmVEcmF3aW5nIj5OTzwvYm9vbD4KKwkJCQk8Ym9vbCBrZXk9IklCVUlCb3VuY2VzWm9vbSI+Tk88L2Jvb2w+CisJCQkJPGludCBrZXk9IklCVUlTZXBhcmF0b3JTdHlsZSI+MTwvaW50PgorCQkJCTxpbnQga2V5PSJJQlVJU2VjdGlvbkluZGV4TWluaW11bURpc3BsYXlSb3dDb3VudCI+MDwvaW50PgorCQkJCTxib29sIGtleT0iSUJVSVNob3dzU2VsZWN0aW9uSW1tZWRpYXRlbHlPblRvdWNoQmVnaW4iPllFUzwvYm9vbD4KKwkJCQk8ZmxvYXQga2V5PSJJQlVJUm93SGVpZ2h0Ij40NDwvZmxvYXQ+CisJCQkJPGZsb2F0IGtleT0iSUJVSVNlY3Rpb25IZWFkZXJIZWlnaHQiPjIyPC9mbG9hdD4KKwkJCQk8ZmxvYXQga2V5PSJJQlVJU2VjdGlvbkZvb3RlckhlaWdodCI+MjI8L2Zsb2F0PgorCQkJPC9vYmplY3Q+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdENvbnRhaW5lciIga2V5PSJJQkRvY3VtZW50Lk9iamVjdHMiPgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY29ubmVjdGlvblJlY29yZHMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9IklCQ29ubmVjdGlvblJlY29yZCI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ29jb2FUb3VjaE91dGxldENvbm5lY3Rpb24iIGtleT0iY29ubmVjdGlvbiI+CisJCQkJCQk8c3RyaW5nIGtleT0ibGFiZWwiPnZpZXc8L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJzb3VyY2UiIHJlZj0iODQxMzUxODU2Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iZGVzdGluYXRpb24iIHJlZj0iNzA5NjE4NTA3Ii8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8aW50IGtleT0iY29ubmVjdGlvbklEIj4zPC9pbnQ+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJDb25uZWN0aW9uUmVjb3JkIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDb2NvYVRvdWNoT3V0bGV0Q29ubmVjdGlvbiIga2V5PSJjb25uZWN0aW9uIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJsYWJlbCI+ZGF0YVNvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSI3MDk2MTg1MDciLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI4NDEzNTE4NTYiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjQ8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvbm5lY3Rpb25SZWNvcmQiPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvY29hVG91Y2hPdXRsZXRDb25uZWN0aW9uIiBrZXk9ImNvbm5lY3Rpb24iPgorCQkJCQkJPHN0cmluZyBrZXk9ImxhYmVsIj5kZWxlZ2F0ZTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSI3MDk2MTg1MDciLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI4NDEzNTE4NTYiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjU8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJNdXRhYmxlT3JkZXJlZFNldCIga2V5PSJvYmplY3RSZWNvcmRzIj4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9Im9yZGVyZWRPYmplY3RzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MDwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIwIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iY2hpbGRyZW4iIHJlZj0iMTAwMCIvPgorCQkJCQkJPG5pbCBrZXk9InBhcmVudCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4tMTwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI4NDEzNTE4NTYiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQkJPHN0cmluZyBrZXk9Im9iamVjdE5hbWUiPkZpbGUncyBPd25lcjwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4tMjwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIzNzEzNDk2NjEiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4yPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjcwOTYxODUwNyIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSIwIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJPC9vYmplY3Q+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9ImZsYXR0ZW5lZFByb3BlcnRpZXMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TQXJyYXkiIGtleT0iZGljdC5zb3J0ZWRLZXlzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxzdHJpbmc+LTEuQ3VzdG9tQ2xhc3NOYW1lPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+LTIuQ3VzdG9tQ2xhc3NOYW1lPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Mi5JQkVkaXRvcldpbmRvd0xhc3RDb250ZW50UmVjdDwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjIuSUJQbHVnaW5EZXBlbmRlbmN5PC9zdHJpbmc+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQkJPHN0cmluZz5Sb290Vmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZz5VSVJlc3BvbmRlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPnt7MCwgNTk4fSwgezMyMCwgMjQ3fX08L3N0cmluZz4KKwkJCQkJPHN0cmluZz5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJ1bmxvY2FsaXplZFByb3BlcnRpZXMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJkaWN0LnNvcnRlZEtleXMiIHJlZj0iMCIvPgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImRpY3QudmFsdWVzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJCTxuaWwga2V5PSJhY3RpdmVMb2NhbGl6YXRpb24iLz4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0ibG9jYWxpemF0aW9ucyI+CisJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPHJlZmVyZW5jZSBrZXk9ImRpY3Quc29ydGVkS2V5cyIgcmVmPSIwIi8+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG5pbCBrZXk9InNvdXJjZUlEIi8+CisJCQk8aW50IGtleT0ibWF4SUQiPjU8L2ludD4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmliZXIiIGtleT0iSUJEb2N1bWVudC5DbGFzc2VzIj4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9InJlZmVyZW5jZWRQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbnMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5Sb290Vmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5VSVRhYmxlVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQlByb2plY3RTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Q2xhc3Nlcy9Sb290Vmlld0NvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0icmVmZXJlbmNlZFBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uc1YzLjIrIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TRXJyb3IuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TRmlsZU1hbmFnZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5VmFsdWVDb2RpbmcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5VmFsdWVPYnNlcnZpbmcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5ZWRBcmNoaXZlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNOZXRTZXJ2aWNlcy5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNPYmplY3QuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TUG9ydC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNSdW5Mb29wLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1N0cmVhbS5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNUaHJlYWQuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TVVJMLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1VSTENvbm5lY3Rpb24uaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TWE1MUGFyc2VyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlBY2Nlc3NpYmlsaXR5Lmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlOaWJMb2FkaW5nLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIiBpZD0iNjU0NDIwMDI3Ij4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlSZXNwb25kZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlSWRlbnRpZmllciIgcmVmPSI2NTQ0MjAwMjciLz4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlTY3JvbGxWaWV3PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlTY3JvbGxWaWV3Lmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJU2VhcmNoQmFyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlTZWFyY2hCYXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlTZWFyY2hEaXNwbGF5Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlTZWFyY2hEaXNwbGF5Q29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVRhYmxlVmlldzwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJU2Nyb2xsVmlldzwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJVGFibGVWaWV3Lmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJVGFibGVWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVRhYmxlVmlld0NvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlUZXh0RmllbGQuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJTmF2aWdhdGlvbkNvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJVGFiQmFyQ29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXdDb250cm9sbGVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJPC9vYmplY3Q+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmxvY2FsaXphdGlvbk1vZGUiPjA8L2ludD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50LlBsdWdpbkRlY2xhcmVkRGVwZW5kZW5jeURlZmF1bHRzIj4KKwkJCTxzdHJpbmcga2V5PSJOUy5rZXkuMCI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuQ29jb2FUb3VjaFBsdWdpbi5pUGhvbmVPUzwvc3RyaW5nPgorCQkJPGludGVnZXIgdmFsdWU9Ijc4NCIga2V5PSJOUy5vYmplY3QuMCIvPgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50LlBsdWdpbkRlY2xhcmVkRGV2ZWxvcG1lbnREZXBlbmRlbmNpZXMiPgorCQkJPHN0cmluZyBrZXk9Ik5TLmtleS4wIj5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5Db2NvYVRvdWNoUGx1Z2luLkludGVyZmFjZUJ1aWxkZXIzPC9zdHJpbmc+CisJCQk8aW50ZWdlciB2YWx1ZT0iMzEwMCIga2V5PSJOUy5vYmplY3QuMCIvPgorCQk8L29iamVjdD4KKwkJPGJvb2wga2V5PSJJQkRvY3VtZW50LlBsdWdpbkRlY2xhcmVkRGVwZW5kZW5jaWVzVHJhY2tTeXN0ZW1UYXJnZXRWZXJzaW9uIj5ZRVM8L2Jvb2w+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50Lkxhc3RLbm93blJlbGF0aXZlUHJvamVjdFBhdGgiPmlwanN5c3Rlc3QueGNvZGVwcm9qPC9zdHJpbmc+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmRlZmF1bHRQcm9wZXJ0eUFjY2Vzc0NvbnRyb2wiPjM8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCQ29jb2FUb3VjaFBsdWdpblZlcnNpb24iPjMuMTwvc3RyaW5nPgorCTwvZGF0YT4KKzwvYXJjaGl2ZT4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvVGVzdFZpZXdDb250cm9sbGVyLnhpYiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvVGVzdFZpZXdDb250cm9sbGVyLnhpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTY2YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9UZXN0Vmlld0NvbnRyb2xsZXIueGliCkBAIC0wLDAgKzEsNDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGFyY2hpdmUgdHlwZT0iY29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIzLkNvY29hVG91Y2guWElCIiB2ZXJzaW9uPSI3LjEwIj4KKwk8ZGF0YT4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQuU3lzdGVtVGFyZ2V0Ij43ODQ8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuU3lzdGVtVmVyc2lvbiI+MTBDNTQwPC9zdHJpbmc+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LkludGVyZmFjZUJ1aWxkZXJWZXJzaW9uIj43NDA8L3N0cmluZz4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuQXBwS2l0VmVyc2lvbiI+MTAzOC4yNTwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5ISVRvb2xib3hWZXJzaW9uIj40NTguMDA8L3N0cmluZz4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50LlBsdWdpblZlcnNpb25zIj4KKwkJCTxzdHJpbmcga2V5PSJOUy5rZXkuMCI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQk8c3RyaW5nIGtleT0iTlMub2JqZWN0LjAiPjYyPC9zdHJpbmc+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJJQkRvY3VtZW50LkVkaXRlZE9iamVjdElEcyI+CisJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTxpbnRlZ2VyIHZhbHVlPSIxIi8+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVwZW5kZW5jaWVzIj4KKwkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJPHN0cmluZz5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJPC9vYmplY3Q+CisJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iSUJEb2N1bWVudC5NZXRhZGF0YSI+CisJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TQXJyYXkiIGtleT0iZGljdC5zb3J0ZWRLZXlzIiBpZD0iMCI+CisJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImRpY3QudmFsdWVzIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCTwvb2JqZWN0PgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iSUJEb2N1bWVudC5Sb290T2JqZWN0cyIgaWQ9IjEwMDAiPgorCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQk8b2JqZWN0IGNsYXNzPSJJQlByb3h5T2JqZWN0IiBpZD0iMzcyNDkwNTMxIj4KKwkJCQk8c3RyaW5nIGtleT0iSUJQcm94aWVkT2JqZWN0SWRlbnRpZmllciI+SUJGaWxlc093bmVyPC9zdHJpbmc+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9IklCUHJveHlPYmplY3QiIGlkPSI3MTE3NjIzNjciPgorCQkJCTxzdHJpbmcga2V5PSJJQlByb3hpZWRPYmplY3RJZGVudGlmaWVyIj5JQkZpcnN0UmVzcG9uZGVyPC9zdHJpbmc+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9IklCVUlWaWV3IiBpZD0iMTkxMzczMjExIj4KKwkJCQk8cmVmZXJlbmNlIGtleT0iTlNOZXh0UmVzcG9uZGVyIi8+CisJCQkJPGludCBrZXk9Ik5TdkZsYWdzIj4yOTI8L2ludD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJOU1N1YnZpZXdzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCVUlUZXh0VmlldyIgaWQ9IjYxMzg2OTU0MyI+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iTlNOZXh0UmVzcG9uZGVyIiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQkJPGludCBrZXk9Ik5TdkZsYWdzIj4yNzQ8L2ludD4KKwkJCQkJCTxzdHJpbmcga2V5PSJOU0ZyYW1lU2l6ZSI+ezMyMCwgMzU4fTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TU3VwZXJ2aWV3IiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJT3BhcXVlIj5OTzwvYm9vbD4KKwkJCQkJCTxib29sIGtleT0iSUJVSUNsaXBzU3Vidmlld3MiPllFUzwvYm9vbD4KKwkJCQkJCTxib29sIGtleT0iSUJVSU11bHRpcGxlVG91Y2hFbmFibGVkIj5ZRVM8L2Jvb2w+CisJCQkJCQk8Ym9vbCBrZXk9IklCVUlTaG93c0hvcml6b250YWxTY3JvbGxJbmRpY2F0b3IiPk5PPC9ib29sPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJRGVsYXlzQ29udGVudFRvdWNoZXMiPk5PPC9ib29sPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJQ2FuQ2FuY2VsQ29udGVudFRvdWNoZXMiPk5PPC9ib29sPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJQm91bmNlc1pvb20iPk5PPC9ib29sPgorCQkJCQkJPHN0cmluZyBrZXk9IklCVUlUZXh0Ij5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgZXIgZWxpdCBsYW1ldCwgY29uc2VjdGV0YXVyIGNpbGxpdW0gYWRpcGlzaWNpbmcgcGVjdSwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBOYW0gbGliZXIgdGUgY29uc2NpZW50IHRvIGZhY3RvciB0dW0gcG9lbiBsZWd1bSBvZGlvcXVlIGNpdml1ZGEuPC9zdHJpbmc+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJJQlVJVGV4dElucHV0VHJhaXRzIiBrZXk9IklCVUlUZXh0SW5wdXRUcmFpdHMiPgorCQkJCQkJCTxpbnQga2V5PSJJQlVJQXV0b2NhcGl0YWxpemF0aW9uVHlwZSI+MjwvaW50PgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQlVJQnV0dG9uIiBpZD0iNjY5NzY0MDEyIj4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJOU05leHRSZXNwb25kZXIiIHJlZj0iMTkxMzczMjExIi8+CisJCQkJCQk8aW50IGtleT0iTlN2RmxhZ3MiPjI5MjwvaW50PgorCQkJCQkJPHN0cmluZyBrZXk9Ik5TRnJhbWUiPnt7MjI4LCAzNjZ9LCB7NzIsIDM3fX08L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJOU1N1cGVydmlldyIgcmVmPSIxOTEzNzMyMTEiLz4KKwkJCQkJCTxib29sIGtleT0iSUJVSU9wYXF1ZSI+Tk88L2Jvb2w+CisJCQkJCQk8Ym9vbCBrZXk9IklCVUlDbGVhcnNDb250ZXh0QmVmb3JlRHJhd2luZyI+Tk88L2Jvb2w+CisJCQkJCQk8aW50IGtleT0iSUJVSUNvbnRlbnRIb3Jpem9udGFsQWxpZ25tZW50Ij4wPC9pbnQ+CisJCQkJCQk8aW50IGtleT0iSUJVSUNvbnRlbnRWZXJ0aWNhbEFsaWdubWVudCI+MDwvaW50PgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNGb250IiBrZXk9IklCVUlGb250IiBpZD0iODkyMDQwNzM2Ij4KKwkJCQkJCQk8c3RyaW5nIGtleT0iTlNOYW1lIj5IZWx2ZXRpY2EtQm9sZDwvc3RyaW5nPgorCQkJCQkJCTxkb3VibGUga2V5PSJOU1NpemUiPjE1PC9kb3VibGU+CisJCQkJCQkJPGludCBrZXk9Ik5TZkZsYWdzIj4xNjwvaW50PgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8aW50IGtleT0iSUJVSUJ1dHRvblR5cGUiPjE8L2ludD4KKwkJCQkJCTxzdHJpbmcga2V5PSJJQlVJTm9ybWFsVGl0bGUiPk9LPC9zdHJpbmc+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlIaWdobGlnaHRlZFRpdGxlQ29sb3IiIGlkPSI1MDE0MjYzMTUiPgorCQkJCQkJCTxpbnQga2V5PSJOU0NvbG9yU3BhY2UiPjM8L2ludD4KKwkJCQkJCQk8Ynl0ZXMga2V5PSJOU1doaXRlIj5NUUE8L2J5dGVzPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlOb3JtYWxUaXRsZUNvbG9yIj4KKwkJCQkJCQk8aW50IGtleT0iTlNDb2xvclNwYWNlIj4xPC9pbnQ+CisJCQkJCQkJPGJ5dGVzIGtleT0iTlNSR0IiPk1DNHhPVFl3TnpnME15QXdMak13T1Rnd016a3pJREF1TlRJeE5UWTROallBQTwvYnl0ZXM+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3IiIGtleT0iSUJVSU5vcm1hbFRpdGxlU2hhZG93Q29sb3IiIGlkPSI4ODU4MDMxOCI+CisJCQkJCQkJPGludCBrZXk9Ik5TQ29sb3JTcGFjZSI+MzwvaW50PgorCQkJCQkJCTxieXRlcyBrZXk9Ik5TV2hpdGUiPk1DNDFBQTwvYnl0ZXM+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCVUlCdXR0b24iIGlkPSI5NzA4MTY0MzAiPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TTmV4dFJlc3BvbmRlciIgcmVmPSIxOTEzNzMyMTEiLz4KKwkJCQkJCTxpbnQga2V5PSJOU3ZGbGFncyI+MjkyPC9pbnQ+CisJCQkJCQk8c3RyaW5nIGtleT0iTlNGcmFtZSI+e3sxNDEsIDM2Nn0sIHs3MiwgMzd9fTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TU3VwZXJ2aWV3IiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJT3BhcXVlIj5OTzwvYm9vbD4KKwkJCQkJCTxib29sIGtleT0iSUJVSUNsZWFyc0NvbnRleHRCZWZvcmVEcmF3aW5nIj5OTzwvYm9vbD4KKwkJCQkJCTxpbnQga2V5PSJJQlVJQ29udGVudEhvcml6b250YWxBbGlnbm1lbnQiPjA8L2ludD4KKwkJCQkJCTxpbnQga2V5PSJJQlVJQ29udGVudFZlcnRpY2FsQWxpZ25tZW50Ij4wPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iSUJVSUZvbnQiIHJlZj0iODkyMDQwNzM2Ii8+CisJCQkJCQk8aW50IGtleT0iSUJVSUJ1dHRvblR5cGUiPjE8L2ludD4KKwkJCQkJCTxzdHJpbmcga2V5PSJJQlVJTm9ybWFsVGl0bGUiPkNhbmNlbDwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9IklCVUlIaWdobGlnaHRlZFRpdGxlQ29sb3IiIHJlZj0iNTAxNDI2MzE1Ii8+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlOb3JtYWxUaXRsZUNvbG9yIj4KKwkJCQkJCQk8aW50IGtleT0iTlNDb2xvclNwYWNlIj4xPC9pbnQ+CisJCQkJCQkJPGJ5dGVzIGtleT0iTlNSR0IiPk1DNHhPVFl3TnpnME15QXdMak13T1Rnd016a3pJREF1TlRJeE5UWTROallBQTwvYnl0ZXM+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJJQlVJTm9ybWFsVGl0bGVTaGFkb3dDb2xvciIgcmVmPSI4ODU4MDMxOCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8c3RyaW5nIGtleT0iTlNGcmFtZVNpemUiPnszMjAsIDQ2MH08L3N0cmluZz4KKwkJCQk8cmVmZXJlbmNlIGtleT0iTlNTdXBlcnZpZXciLz4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlCYWNrZ3JvdW5kQ29sb3IiPgorCQkJCQk8aW50IGtleT0iTlNDb2xvclNwYWNlIj4zPC9pbnQ+CisJCQkJCTxieXRlcyBrZXk9Ik5TV2hpdGUiPk1RQTwvYnl0ZXM+CisJCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3JTcGFjZSIga2V5PSJOU0N1c3RvbUNvbG9yU3BhY2UiPgorCQkJCQkJPGludCBrZXk9Ik5TSUQiPjI8L2ludD4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiIGtleT0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiLz4KKwkJCTwvb2JqZWN0PgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RDb250YWluZXIiIGtleT0iSUJEb2N1bWVudC5PYmplY3RzIj4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImNvbm5lY3Rpb25SZWNvcmRzIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvbm5lY3Rpb25SZWNvcmQiPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvY29hVG91Y2hPdXRsZXRDb25uZWN0aW9uIiBrZXk9ImNvbm5lY3Rpb24iPgorCQkJCQkJPHN0cmluZyBrZXk9ImxhYmVsIj50ZXN0RGVzYzwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSIzNzI0OTA1MzEiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI2MTM4Njk1NDMiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjQ8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvbm5lY3Rpb25SZWNvcmQiPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNvY29hVG91Y2hPdXRsZXRDb25uZWN0aW9uIiBrZXk9ImNvbm5lY3Rpb24iPgorCQkJCQkJPHN0cmluZyBrZXk9ImxhYmVsIj52aWV3PC9zdHJpbmc+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ic291cmNlIiByZWY9IjM3MjQ5MDUzMSIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImRlc3RpbmF0aW9uIiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPGludCBrZXk9ImNvbm5lY3Rpb25JRCI+NTwvaW50PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCQ29ubmVjdGlvblJlY29yZCI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ29jb2FUb3VjaE91dGxldENvbm5lY3Rpb24iIGtleT0iY29ubmVjdGlvbiI+CisJCQkJCQk8c3RyaW5nIGtleT0ibGFiZWwiPmJ1dHRvbjE8L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJzb3VyY2UiIHJlZj0iMzcyNDkwNTMxIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iZGVzdGluYXRpb24iIHJlZj0iNjY5NzY0MDEyIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8aW50IGtleT0iY29ubmVjdGlvbklEIj44PC9pbnQ+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJDb25uZWN0aW9uUmVjb3JkIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDb2NvYVRvdWNoT3V0bGV0Q29ubmVjdGlvbiIga2V5PSJjb25uZWN0aW9uIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJsYWJlbCI+YnV0dG9uMjwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSIzNzI0OTA1MzEiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI5NzA4MTY0MzAiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjk8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJNdXRhYmxlT3JkZXJlZFNldCIga2V5PSJvYmplY3RSZWNvcmRzIj4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9Im9yZGVyZWRPYmplY3RzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MDwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSIwIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iY2hpbGRyZW4iIHJlZj0iMTAwMCIvPgorCQkJCQkJPG5pbCBrZXk9InBhcmVudCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4xPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY2hpbGRyZW4iPgorCQkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJCTxyZWZlcmVuY2UgcmVmPSI2MTM4Njk1NDMiLz4KKwkJCQkJCQk8cmVmZXJlbmNlIHJlZj0iNjY5NzY0MDEyIi8+CisJCQkJCQkJPHJlZmVyZW5jZSByZWY9Ijk3MDgxNjQzMCIvPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+LTE8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iMzcyNDkwNTMxIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJCTxzdHJpbmcga2V5PSJvYmplY3ROYW1lIj5GaWxlJ3MgT3duZXI8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+LTI8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iNzExNzYyMzY3Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MzwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI2MTM4Njk1NDMiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMTkxMzczMjExIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdFJlY29yZCI+CisJCQkJCQk8aW50IGtleT0ib2JqZWN0SUQiPjY8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iNjY5NzY0MDEyIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjE5MTM3MzIxMSIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj43PC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9Ijk3MDgxNjQzMCIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSIxOTEzNzMyMTEiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iZmxhdHRlbmVkUHJvcGVydGllcyI+CisJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPG9iamVjdCBjbGFzcz0iTlNBcnJheSIga2V5PSJkaWN0LnNvcnRlZEtleXMiPgorCQkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQkJPHN0cmluZz4tMS5DdXN0b21DbGFzc05hbWU8L3N0cmluZz4KKwkJCQkJPHN0cmluZz4tMi5DdXN0b21DbGFzc05hbWU8L3N0cmluZz4KKwkJCQkJPHN0cmluZz4xLklCRWRpdG9yV2luZG93TGFzdENvbnRlbnRSZWN0PC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+MS5JQlBsdWdpbkRlcGVuZGVuY3k8L3N0cmluZz4KKwkJCQkJPHN0cmluZz4zLklCUGx1Z2luRGVwZW5kZW5jeTwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPjYuSUJQbHVnaW5EZXBlbmRlbmN5PC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Ny5JQlBsdWdpbkRlcGVuZGVuY3k8L3N0cmluZz4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJkaWN0LnZhbHVlcyI+CisJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQk8c3RyaW5nPlRlc3RWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nPlVJUmVzcG9uZGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+e3s0NjEsIDMyN30sIHszMjAsIDQ4MH19PC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0idW5sb2NhbGl6ZWRQcm9wZXJ0aWVzIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8cmVmZXJlbmNlIGtleT0iZGljdC5zb3J0ZWRLZXlzIiByZWY9IjAiLz4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJkaWN0LnZhbHVlcyI+CisJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTwvb2JqZWN0PgorCQkJPC9vYmplY3Q+CisJCQk8bmlsIGtleT0iYWN0aXZlTG9jYWxpemF0aW9uIi8+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9ImxvY2FsaXphdGlvbnMiPgorCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJkaWN0LnNvcnRlZEtleXMiIHJlZj0iMCIvPgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImRpY3QudmFsdWVzIj4KKwkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJCTxuaWwga2V5PSJzb3VyY2VJRCIvPgorCQkJPGludCBrZXk9Im1heElEIj45PC9pbnQ+CisJCTwvb2JqZWN0PgorCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpYmVyIiBrZXk9IklCRG9jdW1lbnQuQ2xhc3NlcyI+CisJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJyZWZlcmVuY2VkUGFydGlhbENsYXNzRGVzY3JpcHRpb25zIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VGVzdFZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9Im91dGxldHMiPgorCQkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0FycmF5IiBrZXk9ImRpY3Quc29ydGVkS2V5cyI+CisJCQkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCQkJPHN0cmluZz5idXR0b24xPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz5idXR0b24yPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz50ZXN0RGVzYzwvc3RyaW5nPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJkaWN0LnZhbHVlcyI+CisJCQkJCQkJPGJvb2wga2V5PSJFbmNvZGVkV2l0aFhNTENvZGVyIj5ZRVM8L2Jvb2w+CisJCQkJCQkJPHN0cmluZz5VSUJ1dHRvbjwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+VUlCdXR0b248L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPlVJVGV4dFZpZXc8L3N0cmluZz4KKwkJCQkJCTwvb2JqZWN0PgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQlByb2plY3RTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Q2xhc3Nlcy9UZXN0Vmlld0NvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0icmVmZXJlbmNlZFBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uc1YzLjIrIj4KKwkJCQk8Ym9vbCBrZXk9IkVuY29kZWRXaXRoWE1MQ29kZXIiPllFUzwvYm9vbD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TRXJyb3IuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TRmlsZU1hbmFnZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5VmFsdWVDb2RpbmcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5VmFsdWVPYnNlcnZpbmcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TS2V5ZWRBcmNoaXZlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNOZXRTZXJ2aWNlcy5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNPYmplY3QuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TUG9ydC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNSdW5Mb29wLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1N0cmVhbS5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPkZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvTlNUaHJlYWQuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TVVJMLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Rm91bmRhdGlvbi5mcmFtZXdvcmsvSGVhZGVycy9OU1VSTENvbm5lY3Rpb24uaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5Gb3VuZGF0aW9uLmZyYW1ld29yay9IZWFkZXJzL05TWE1MUGFyc2VyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlBY2Nlc3NpYmlsaXR5Lmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlOaWJMb2FkaW5nLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIiBpZD0iMjc0MzI2NzUiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVJlc3BvbmRlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSUJ1dHRvbjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJQ29udHJvbDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJQnV0dG9uLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJQ29udHJvbDwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlldzwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJQ29udHJvbC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVJlc3BvbmRlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPk5TT2JqZWN0PC9zdHJpbmc+CisJCQkJCTxyZWZlcmVuY2Uga2V5PSJzb3VyY2VJZGVudGlmaWVyIiByZWY9IjI3NDMyNjc1Ii8+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJU2Nyb2xsVmlldzwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlldzwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJU2Nyb2xsVmlldy5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVNlYXJjaEJhcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlldzwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJU2VhcmNoQmFyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJQYXJ0aWFsQ2xhc3NEZXNjcmlwdGlvbiI+CisJCQkJCTxzdHJpbmcga2V5PSJjbGFzc05hbWUiPlVJU2VhcmNoRGlzcGxheUNvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5OU09iamVjdDwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJU2VhcmNoRGlzcGxheUNvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlUZXh0Vmlldzwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJU2Nyb2xsVmlldzwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJVGV4dFZpZXcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJGcmFtZXdvcmtTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+VUlLaXQuZnJhbWV3b3JrL0hlYWRlcnMvVUlUZXh0RmllbGQuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXcuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJTmF2aWdhdGlvbkNvbnRyb2xsZXIuaDwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQk8L29iamVjdD4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+VUlWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQkNsYXNzRGVzY3JpcHRpb25Tb3VyY2UiIGtleT0ic291cmNlSWRlbnRpZmllciI+CisJCQkJCQk8c3RyaW5nIGtleT0ibWFqb3JLZXkiPklCRnJhbWV3b3JrU291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPlVJS2l0LmZyYW1ld29yay9IZWFkZXJzL1VJVGFiQmFyQ29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5VSVZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQkZyYW1ld29ya1NvdXJjZTwvc3RyaW5nPgorCQkJCQkJPHN0cmluZyBrZXk9Im1pbm9yS2V5Ij5VSUtpdC5mcmFtZXdvcmsvSGVhZGVycy9VSVZpZXdDb250cm9sbGVyLmg8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQk8L29iamVjdD4KKwkJPC9vYmplY3Q+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmxvY2FsaXphdGlvbk1vZGUiPjA8L2ludD4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50LlBsdWdpbkRlY2xhcmVkRGV2ZWxvcG1lbnREZXBlbmRlbmNpZXMiPgorCQkJPHN0cmluZyBrZXk9Ik5TLmtleS4wIj5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5Db2NvYVRvdWNoUGx1Z2luLkludGVyZmFjZUJ1aWxkZXIzPC9zdHJpbmc+CisJCQk8aW50ZWdlciB2YWx1ZT0iMzEwMCIga2V5PSJOUy5vYmplY3QuMCIvPgorCQk8L29iamVjdD4KKwkJPGJvb2wga2V5PSJJQkRvY3VtZW50LlBsdWdpbkRlY2xhcmVkRGVwZW5kZW5jaWVzVHJhY2tTeXN0ZW1UYXJnZXRWZXJzaW9uIj5ZRVM8L2Jvb2w+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50Lkxhc3RLbm93blJlbGF0aXZlUHJvamVjdFBhdGgiPmlwanN5c3Rlc3QueGNvZGVwcm9qPC9zdHJpbmc+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmRlZmF1bHRQcm9wZXJ0eUFjY2Vzc0NvbnRyb2wiPjM8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCQ29jb2FUb3VjaFBsdWdpblZlcnNpb24iPjMuMTwvc3RyaW5nPgorCTwvZGF0YT4KKzwvYXJjaGl2ZT4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdC1JbmZvLnBsaXN0IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9pcGpzeXN0ZXN0LUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1YTkwYgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdC1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZURpc3BsYXlOYW1lPC9rZXk+CisJPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz48L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnRlbHV1LiR7UFJPRFVDVF9OQU1FOnJmYzEwMzRpZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+TFNSZXF1aXJlc0lQaG9uZU9TPC9rZXk+CisJPHRydWUvPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+TWFpbldpbmRvdzwvc3RyaW5nPgorCTxrZXk+VUlCYWNrZ3JvdW5kTW9kZXM8L2tleT4KKwk8YXJyYXk+CisJCTxzdHJpbmc+YXVkaW88L3N0cmluZz4KKwk8L2FycmF5PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9pcGpzeXN0ZXN0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjcwOWQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsNDM0IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDU7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJMUQzNjIzMjYwRDBGNjg0NTAwOTgxRTUxIC8qIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUQzNjIzMjUwRDBGNjg0NTAwOTgxRTUxIC8qIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5tICovOyB9OworCQkxRDYwNTg5QjBEMDVERDU2MDA2QkZCNTQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjlCOTczMTZGRENGQTM5NDExQ0EyQ0VBIC8qIG1haW4ubSAqLzsgfTsKKwkJMUQ2MDU4OUYwRDA1REQ1QTAwNkJGQjU0IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUQzMEFCMTEwRDA1RDAwRDAwNjcxNDk3IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxREY1RjRFMDBEMDhDMzgzMDBCN0E3MzcgLyogVUlLaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMURGNUY0REYwRDA4QzM4MzAwQjdBNzM3IC8qIFVJS2l0LmZyYW1ld29yayAqLzsgfTsKKwkJMjg5MkU0MTAwREM5NENCQTAwQTY0RDBGIC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyODkyRTQwRjBEQzk0Q0JBMDBBNjREMEYgLyogQ29yZUdyYXBoaWNzLmZyYW1ld29yayAqLzsgfTsKKwkJMjhBRDczNjAwRDlEOTU5OTAwMkU1MTg4IC8qIE1haW5XaW5kb3cueGliIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyOEFENzM1RjBEOUQ5NTk5MDAyRTUxODggLyogTWFpbldpbmRvdy54aWIgKi87IH07CisJCTI4QzI4NkUxMEQ5NERGN0QwMDM0RTg4OCAvKiBSb290Vmlld0NvbnRyb2xsZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI4QzI4NkUwMEQ5NERGN0QwMDM0RTg4OCAvKiBSb290Vmlld0NvbnRyb2xsZXIubSAqLzsgfTsKKwkJMjhGMzM1RjExMDA3QjM2MjAwNDI0REUyIC8qIFJvb3RWaWV3Q29udHJvbGxlci54aWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI4RjMzNUYwMTAwN0IzNjIwMDQyNERFMiAvKiBSb290Vmlld0NvbnRyb2xsZXIueGliICovOyB9OworCQkzQTM0NzhBQTExNTRCRjhFMDBENTE4ODAgLyogVGVzdFZpZXdDb250cm9sbGVyLnhpYiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0EzNDc4QTkxMTU0QkY4RTAwRDUxODgwIC8qIFRlc3RWaWV3Q29udHJvbGxlci54aWIgKi87IH07CisJCTNBMzQ3OEFGMTE1NEJGRDcwMEQ1MTg4MCAvKiBUZXN0Vmlld0NvbnRyb2xsZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OEFFMTE1NEJGRDcwMEQ1MTg4MCAvKiBUZXN0Vmlld0NvbnRyb2xsZXIubSAqLzsgfTsKKwkJM0EzNDc5MjIxMTU0REIwODAwRDUxODgwIC8qIHN5c3Rlc3QuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTIxMTE1NERCMDgwMEQ1MTg4MCAvKiBzeXN0ZXN0LmMgKi87IH07CisJCTNBMzQ3OTRCMTE1NEUzOTkwMEQ1MTg4MCAvKiBsaWJwam1lZGlhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTM0Nzk0QTExNTRFMzk5MDBENTE4ODAgLyogbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQTM0Nzk0RDExNTRFMzk5MDBENTE4ODAgLyogbGlicGptZWRpYS1hdWRpb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0EzNDc5NEMxMTU0RTM5OTAwRDUxODgwIC8qIGxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0EzNDc5NEYxMTU0RTNGMDAwRDUxODgwIC8qIGxpYnBqc2lwLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTM0Nzk0RTExNTRFM0YwMDBENTE4ODAgLyogbGlicGpzaXAtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0EzNDc5NTExMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc2lwLXNpbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0EzNDc5NTAxMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc2lwLXNpbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQTM0Nzk1MzExNTRFNDI0MDBENTE4ODAgLyogbGlicGpzaXAtdWEtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTUyMTE1NEU0MjQwMEQ1MTg4MCAvKiBsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQTM0Nzk1NTExNTRFNDI0MDBENTE4ODAgLyogbGlicGpzdWEtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTU0MTE1NEU0MjQwMEQ1MTg4MCAvKiBsaWJwanN1YS1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQTM0Nzk1QjExNTRFNDVBMDBENTE4ODAgLyogbGlicGotYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTVBMTE1NEU0NUEwMEQ1MTg4MCAvKiBsaWJwai1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQTM0Nzk1RDExNTRFNDg3MDBENTE4ODAgLyogbGlicGpsaWItdXRpbC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0EzNDc5NUMxMTU0RTQ4NzAwRDUxODgwIC8qIGxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0EzNDc5NzkxMTU0RUJERTAwRDUxODgwIC8qIGxpYnBqbWVkaWEtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTc4MTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBMzQ3OTdCMTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBMzQ3OTdBMTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0EzNDc5ODcxMTU0RUM0RTAwRDUxODgwIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTM0Nzk4NjExNTRFQzRFMDBENTE4ODAgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayAqLzsgfTsKKwkJM0EzNDc5OUExMTU0RUNBMzAwRDUxODgwIC8qIGxpYmdzbWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTM0Nzk5OTExNTRFQ0EzMDBENTE4ODAgLyogbGliZ3NtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0EzNDc5OUMxMTU0RUNCMTAwRDUxODgwIC8qIGxpYnJlc2FtcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTM0Nzk5QjExNTRFQ0IxMDBENTE4ODAgLyogbGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FCRTA1MDcxNDdDQTAwQjAwQTU3QTYyIC8qIENGTmV0d29yay5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUJFMDUwNjE0N0NBMDBCMDBBNTdBNjIgLyogQ0ZOZXR3b3JrLmZyYW1ld29yayAqLzsgfTsKKwkJM0FDNjQzNUUxMTYyMTkyOTAwQjdBNzUxIC8qIHRvY2s4LndhdiBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FDNjQzNUQxMTYyMTkyOTAwQjdBNzUxIC8qIHRvY2s4LndhdiAqLzsgfTsKKwkJM0FEQTRBQjkxMTU3MjMwMDAwOEQ5NUZFIC8qIGlucHV0Ljgud2F2IGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQURBNEFCODExNTcyMzAwMDA4RDk1RkUgLyogaW5wdXQuOC53YXYgKi87IH07CisJCTNBRTkwRTlCMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJnNzIyMWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUU5MEU5NTExNUY3QTRFMDBGQUVBQTUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQUU5MEU5QzExNUY3QTRGMDBGQUVBQTUgLyogbGliaWxiY2NvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUU5MEU5NjExNUY3QTRGMDBGQUVBQTUgLyogbGliaWxiY2NvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRTkwRTlEMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJtaWxlbmFnZS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FFOTBFOTcxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYm1pbGVuYWdlLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRTkwRTlFMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJwanNkcC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FFOTBFOTgxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYnBqc2RwLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRTkwRTlGMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJzcGVleC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FFOTBFOTkxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYnNwZWV4LWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRTkwRUEwMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJzcnRwLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUU5MEU5QTExNUY3QTRGMDBGQUVBQTUgLyogbGlic3J0cC1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworLyogRW5kIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkxRDMwQUIxMTBEMDVEMDBEMDA2NzE0OTcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNES1JPT1Q7IH07CisJCTFEMzYyMzI0MEQwRjY4NDUwMDk4MUU1MSAvKiBpcGpzeXN0ZXN0QXBwRGVsZWdhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gaXBqc3lzdGVzdEFwcERlbGVnYXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFEMzYyMzI1MEQwRjY4NDUwMDk4MUU1MSAvKiBpcGpzeXN0ZXN0QXBwRGVsZWdhdGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gaXBqc3lzdGVzdEFwcERlbGVnYXRlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFENjA1ODkxMEQwNUREM0QwMDZCRkI1NCAvKiBpcGpzeXN0ZXN0LmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gaXBqc3lzdGVzdC5hcHA7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFERjVGNERGMEQwOEMzODMwMEI3QTczNyAvKiBVSUtpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IFVJS2l0LmZyYW1ld29yazsgcGF0aCA9IFN5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvVUlLaXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJMjg5MkU0MEYwREM5NENCQTAwQTY0RDBGIC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvcmVHcmFwaGljcy5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVHcmFwaGljcy5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkyOEEwQUFFNTBEOUIwQ0NGMDA1QkU5NzQgLyogaXBqc3lzdGVzdF9QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBpcGpzeXN0ZXN0X1ByZWZpeC5wY2g7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI4QUQ3MzVGMEQ5RDk1OTkwMDJFNTE4OCAvKiBNYWluV2luZG93LnhpYiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGZpbGUueGliOyBwYXRoID0gTWFpbldpbmRvdy54aWI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI4QzI4NkRGMEQ5NERGN0QwMDM0RTg4OCAvKiBSb290Vmlld0NvbnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUm9vdFZpZXdDb250cm9sbGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI4QzI4NkUwMEQ5NERGN0QwMDM0RTg4OCAvKiBSb290Vmlld0NvbnRyb2xsZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gUm9vdFZpZXdDb250cm9sbGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTI4RjMzNUYwMTAwN0IzNjIwMDQyNERFMiAvKiBSb290Vmlld0NvbnRyb2xsZXIueGliICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZS54aWI7IHBhdGggPSBSb290Vmlld0NvbnRyb2xsZXIueGliOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyOUI5NzMxNkZEQ0ZBMzk0MTFDQTJDRUEgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBMzQ3OEE5MTE1NEJGOEUwMEQ1MTg4MCAvKiBUZXN0Vmlld0NvbnRyb2xsZXIueGliICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZS54aWI7IHBhdGggPSBUZXN0Vmlld0NvbnRyb2xsZXIueGliOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQTM0NzhBRDExNTRCRkQ3MDBENTE4ODAgLyogVGVzdFZpZXdDb250cm9sbGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRlc3RWaWV3Q29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQTM0NzhBRTExNTRCRkQ3MDBENTE4ODAgLyogVGVzdFZpZXdDb250cm9sbGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFRlc3RWaWV3Q29udHJvbGxlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQTM0NzkyMTExNTREQjA4MDBENTE4ODAgLyogc3lzdGVzdC5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBzeXN0ZXN0LmM7IHBhdGggPSAuLi9wanN5c3Rlc3Qvc3lzdGVzdC5jOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTRBMTE1NEUzOTkwMEQ1MTg4MCAvKiBsaWJwam1lZGlhLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqbWVkaWEtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vcGptZWRpYS9saWIvbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQTM0Nzk0QzExNTRFMzk5MDBENTE4ODAgLyogbGlicGptZWRpYS1hdWRpb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwam1lZGlhLWF1ZGlvZGV2LWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJM0EzNDc5NEUxMTU0RTNGMDAwRDUxODgwIC8qIGxpYnBqc2lwLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqc2lwLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3Bqc2lwL2xpYi9saWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQTM0Nzk1MDExNTRFNDI0MDBENTE4ODAgLyogbGlicGpzaXAtc2ltcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqc2lwLXNpbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtc2ltcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTUyMTE1NEU0MjQwMEQ1MTg4MCAvKiBsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtdWEtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJM0EzNDc5NTQxMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc3VhLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqc3VhLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3Bqc2lwL2xpYi9saWJwanN1YS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQTM0Nzk1QTExNTRFNDVBMDBENTE4ODAgLyogbGlicGotYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGotYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vcGpsaWIvbGliL2xpYnBqLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTVDMTE1NEU0ODcwMEQ1MTg4MCAvKiBsaWJwamxpYi11dGlsLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vcGpsaWItdXRpbC9saWIvbGlicGpsaWItdXRpbC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQTM0Nzk3MjExNTRFQjVCMDBENTE4ODAgLyogZ3VpLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IGd1aS5oOyBwYXRoID0gLi4vcGpzeXN0ZXN0L2d1aS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTczMTE1NEVCNkIwMEQ1MTg4MCAvKiBzeXN0ZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IHN5c3Rlc3QuaDsgcGF0aCA9IC4uL3Bqc3lzdGVzdC9zeXN0ZXN0Lmg7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJM0EzNDc5NzgxMTU0RUJERTAwRDUxODgwIC8qIGxpYnBqbWVkaWEtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGptZWRpYS1jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi9wam1lZGlhL2xpYi9saWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTdBMTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3BqbmF0aC9saWIvbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBMzQ3OTg2MTE1NEVDNEUwMEQ1MTg4MCAvKiBBdWRpb1Rvb2xib3guZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBBdWRpb1Rvb2xib3guZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BdWRpb1Rvb2xib3guZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJM0EzNDc5OTkxMTU0RUNBMzAwRDUxODgwIC8qIGxpYmdzbWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYmdzbWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQTM0Nzk5QjExNTRFQ0IxMDBENTE4ODAgLyogbGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliL2xpYnJlc2FtcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBQkUwNTA2MTQ3Q0EwMEIwMEE1N0E2MiAvKiBDRk5ldHdvcmsuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDRk5ldHdvcmsuZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9DRk5ldHdvcmsuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJM0FDNjQzNUQxMTYyMTkyOTAwQjdBNzUxIC8qIHRvY2s4LndhdiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGF1ZGlvLndhdjsgbmFtZSA9IHRvY2s4LndhdjsgcGF0aCA9IC4uLy4uLy4uL3Rlc3RzL3Bqc3VhL3dhdnMvdG9jazgud2F2OyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBREE0QUI4MTE1NzIzMDAwMDhEOTVGRSAvKiBpbnB1dC44LndhdiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGF1ZGlvLndhdjsgbmFtZSA9IGlucHV0Ljgud2F2OyBwYXRoID0gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RlbHV1L3BqcHJvamVjdC1uZXctaXBob25lL3Rlc3RzL3Bqc3VhL3dhdnMvaW5wdXQuOC53YXYiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkzQUU5MEU5NTExNUY3QTRFMDBGQUVBQTUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJnNzIyMWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJnNzIyMWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTNBRTkwRTk2MTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGliaWxiY2NvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJM0FFOTBFOTcxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYm1pbGVuYWdlLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYm1pbGVuYWdlLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJtaWxlbmFnZS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQUU5MEU5ODExNUY3QTRGMDBGQUVBQTUgLyogbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vcGptZWRpYS9saWIvbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJM0FFOTBFOTkxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYnNwZWV4LWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnNwZWV4LWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJzcGVleC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkzQUU5MEU5QTExNUY3QTRGMDBGQUVBQTUgLyogbGlic3J0cC1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJzcnRwLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJzcnRwLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCThEMTEwNzMxMDQ4NkNFQjgwMEU0NzA5MCAvKiBpcGpzeXN0ZXN0LUluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9ICJpcGpzeXN0ZXN0LUluZm8ucGxpc3QiOyBwbGlzdFN0cnVjdHVyZURlZmluaXRpb25JZGVudGlmaWVyID0gImNvbS5hcHBsZS54Y29kZS5wbGlzdC5zdHJ1Y3R1cmUtZGVmaW5pdGlvbi5pcGhvbmUuaW5mby1wbGlzdCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUQ2MDU4OEYwRDA1REQzRDAwNkJGQjU0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxRDYwNTg5RjBEMDVERDVBMDA2QkZCNTQgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxREY1RjRFMDBEMDhDMzgzMDBCN0E3MzcgLyogVUlLaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMjg5MkU0MTAwREM5NENCQTAwQTY0RDBGIC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQTM0Nzk0QjExNTRFMzk5MDBENTE4ODAgLyogbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0EzNDc5NEQxMTU0RTM5OTAwRDUxODgwIC8qIGxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBMzQ3OTRGMTE1NEUzRjAwMEQ1MTg4MCAvKiBsaWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0EzNDc5NTExMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc2lwLXNpbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0EzNDc5NTMxMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc2lwLXVhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQTM0Nzk1NTExNTRFNDI0MDBENTE4ODAgLyogbGlicGpzdWEtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBMzQ3OTVCMTE1NEU0NUEwMEQ1MTg4MCAvKiBsaWJwai1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0EzNDc5NUQxMTU0RTQ4NzAwRDUxODgwIC8qIGxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBMzQ3OTc5MTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQTM0Nzk3QjExNTRFQkRFMDBENTE4ODAgLyogbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQTM0Nzk4NzExNTRFQzRFMDBENTE4ODAgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBMzQ3OTlBMTE1NEVDQTMwMEQ1MTg4MCAvKiBsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0EzNDc5OUMxMTU0RUNCMTAwRDUxODgwIC8qIGxpYnJlc2FtcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUU5MEU5QjExNUY3QTRGMDBGQUVBQTUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FFOTBFOUMxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYmlsYmNjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FFOTBFOUQxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYm1pbGVuYWdlLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUU5MEU5RTExNUY3QTRGMDBGQUVBQTUgLyogbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRTkwRTlGMTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJzcGVleC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FFOTBFQTAxMTVGN0E0RjAwRkFFQUE1IC8qIGxpYnNydHAtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBQkUwNTA3MTQ3Q0EwMEIwMEE1N0E2MiAvKiBDRk5ldHdvcmsuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTA4MEU5NkRERkUyMDFENkQ3RjAwMDAwMSAvKiBDbGFzc2VzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQTM0NzhBRDExNTRCRkQ3MDBENTE4ODAgLyogVGVzdFZpZXdDb250cm9sbGVyLmggKi8sCisJCQkJM0EzNDc4QUUxMTU0QkZENzAwRDUxODgwIC8qIFRlc3RWaWV3Q29udHJvbGxlci5tICovLAorCQkJCTI4QzI4NkRGMEQ5NERGN0QwMDM0RTg4OCAvKiBSb290Vmlld0NvbnRyb2xsZXIuaCAqLywKKwkJCQkyOEMyODZFMDBEOTRERjdEMDAzNEU4ODggLyogUm9vdFZpZXdDb250cm9sbGVyLm0gKi8sCisJCQkJMUQzNjIzMjQwRDBGNjg0NTAwOTgxRTUxIC8qIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5oICovLAorCQkJCTFEMzYyMzI1MEQwRjY4NDUwMDk4MUU1MSAvKiBpcGpzeXN0ZXN0QXBwRGVsZWdhdGUubSAqLywKKwkJCSk7CisJCQlwYXRoID0gQ2xhc3NlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUQ2MDU4OTEwRDA1REQzRDAwNkJGQjU0IC8qIGlwanN5c3Rlc3QuYXBwICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE0RkRDRkEzOTQxMUNBMkNFQSAvKiBDdXN0b21UZW1wbGF0ZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMDgwRTk2RERGRTIwMUQ2RDdGMDAwMDAxIC8qIENsYXNzZXMgKi8sCisJCQkJMjlCOTczMTVGRENGQTM5NDExQ0EyQ0VBIC8qIE90aGVyIFNvdXJjZXMgKi8sCisJCQkJMjlCOTczMTdGRENGQTM5NDExQ0EyQ0VBIC8qIFJlc291cmNlcyAqLywKKwkJCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkzQTM0Nzk5NDExNTRFQzZCMDBENTE4ODAgLyogTGlicmFyaWVzICovLAorCQkJCTE5QzI4RkFDRkU5RDUyMEQxMUNBMkNCQiAvKiBQcm9kdWN0cyAqLywKKwkJCSk7CisJCQluYW1lID0gQ3VzdG9tVGVtcGxhdGU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMxNUZEQ0ZBMzk0MTFDQTJDRUEgLyogT3RoZXIgU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0EzNDc5MjAxMTU0REFFNjAwRDUxODgwIC8qIHBqc3lzdGVzdCAqLywKKwkJCQkyOEEwQUFFNTBEOUIwQ0NGMDA1QkU5NzQgLyogaXBqc3lzdGVzdF9QcmVmaXgucGNoICovLAorCQkJCTI5Qjk3MzE2RkRDRkEzOTQxMUNBMkNFQSAvKiBtYWluLm0gKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTI5Qjk3MzE3RkRDRkEzOTQxMUNBMkNFQSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNBQzY0MzVEMTE2MjE5MjkwMEI3QTc1MSAvKiB0b2NrOC53YXYgKi8sCisJCQkJM0FEQTRBQjgxMTU3MjMwMDAwOEQ5NUZFIC8qIGlucHV0Ljgud2F2ICovLAorCQkJCTNBMzQ3OEE5MTE1NEJGOEUwMEQ1MTg4MCAvKiBUZXN0Vmlld0NvbnRyb2xsZXIueGliICovLAorCQkJCTI4RjMzNUYwMTAwN0IzNjIwMDQyNERFMiAvKiBSb290Vmlld0NvbnRyb2xsZXIueGliICovLAorCQkJCTI4QUQ3MzVGMEQ5RDk1OTkwMDJFNTE4OCAvKiBNYWluV2luZG93LnhpYiAqLywKKwkJCQk4RDExMDczMTA0ODZDRUI4MDBFNDcwOTAgLyogaXBqc3lzdGVzdC1JbmZvLnBsaXN0ICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZXNvdXJjZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkyOUI5NzMyM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0FCRTA1MDYxNDdDQTAwQjAwQTU3QTYyIC8qIENGTmV0d29yay5mcmFtZXdvcmsgKi8sCisJCQkJM0EzNDc5ODYxMTU0RUM0RTAwRDUxODgwIC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgKi8sCisJCQkJMURGNUY0REYwRDA4QzM4MzAwQjdBNzM3IC8qIFVJS2l0LmZyYW1ld29yayAqLywKKwkJCQkxRDMwQUIxMTBEMDVEMDBEMDA2NzE0OTcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkJMjg5MkU0MEYwREM5NENCQTAwQTY0RDBGIC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9IEZyYW1ld29ya3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQTM0NzkyMDExNTREQUU2MDBENTE4ODAgLyogcGpzeXN0ZXN0ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQTM0Nzk3MzExNTRFQjZCMDBENTE4ODAgLyogc3lzdGVzdC5oICovLAorCQkJCTNBMzQ3OTcyMTE1NEVCNUIwMEQ1MTg4MCAvKiBndWkuaCAqLywKKwkJCQkzQTM0NzkyMTExNTREQjA4MDBENTE4ODAgLyogc3lzdGVzdC5jICovLAorCQkJKTsKKwkJCW5hbWUgPSBwanN5c3Rlc3Q7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQTM0Nzk5NDExNTRFQzZCMDBENTE4ODAgLyogTGlicmFyaWVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUU5MEU5NTExNUY3QTRFMDBGQUVBQTUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRTkwRTk2MTE1RjdBNEYwMEZBRUFBNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUU5MEU5NzExNUY3QTRGMDBGQUVBQTUgLyogbGlibWlsZW5hZ2UtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUU5MEU5ODExNUY3QTRGMDBGQUVBQTUgLyogbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUU5MEU5OTExNUY3QTRGMDBGQUVBQTUgLyogbGlic3BlZXgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUU5MEU5QTExNUY3QTRGMDBGQUVBQTUgLyogbGlic3J0cC1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBMzQ3OTk5MTE1NEVDQTMwMEQ1MTg4MCAvKiBsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBMzQ3OTlCMTE1NEVDQjEwMEQ1MTg4MCAvKiBsaWJyZXNhbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBMzQ3OTRBMTE1NEUzOTkwMEQ1MTg4MCAvKiBsaWJwam1lZGlhLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0EzNDc5NEMxMTU0RTM5OTAwRDUxODgwIC8qIGxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQTM0Nzk0RTExNTRFM0YwMDBENTE4ODAgLyogbGlicGpzaXAtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQTM0Nzk1MDExNTRFNDI0MDBENTE4ODAgLyogbGlicGpzaXAtc2ltcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0EzNDc5NTIxMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc2lwLXVhLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0EzNDc5NTQxMTU0RTQyNDAwRDUxODgwIC8qIGxpYnBqc3VhLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0EzNDc5NUExMTU0RTQ1QTAwRDUxODgwIC8qIGxpYnBqLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0EzNDc5NUMxMTU0RTQ4NzAwRDUxODgwIC8qIGxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQTM0Nzk3ODExNTRFQkRFMDBENTE4ODAgLyogbGlicGptZWRpYS1jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBMzQ3OTdBMTE1NEVCREUwMEQ1MTg4MCAvKiBsaWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCSk7CisJCQluYW1lID0gTGlicmFyaWVzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCTFENjA1ODkwMEQwNUREM0QwMDZCRkI1NCAvKiBpcGpzeXN0ZXN0ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFENjA1ODk2MEQwNUREM0UwMDZCRkI1NCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiaXBqc3lzdGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkxRDYwNTg4RDBEMDVERDNEMDA2QkZCNTQgLyogUmVzb3VyY2VzICovLAorCQkJCTFENjA1ODhFMEQwNUREM0QwMDZCRkI1NCAvKiBTb3VyY2VzICovLAorCQkJCTFENjA1ODhGMEQwNUREM0QwMDZCRkI1NCAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBpcGpzeXN0ZXN0OworCQkJcHJvZHVjdE5hbWUgPSBpcGpzeXN0ZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFENjA1ODkxMEQwNUREM0QwMDZCRkI1NCAvKiBpcGpzeXN0ZXN0LmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkyOUI5NzMxM0ZEQ0ZBMzk0MTFDQTJDRUEgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYXR0cmlidXRlcyA9IHsKKwkJCQlPUkdBTklaQVRJT05OQU1FID0gVGVsdXU7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEMwMUZDRjRFMDhBOTU0NTQwMDU0MjQ3QiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImlwanN5c3Rlc3QiICovOworCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMy4xIjsKKwkJCWRldmVsb3BtZW50UmVnaW9uID0gRW5nbGlzaDsKKwkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOworCQkJa25vd25SZWdpb25zID0gKAorCQkJCUVuZ2xpc2gsCisJCQkJSmFwYW5lc2UsCisJCQkJRnJlbmNoLAorCQkJCUdlcm1hbiwKKwkJCQllbiwKKwkJCSk7CisJCQltYWluR3JvdXAgPSAyOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUEgLyogQ3VzdG9tVGVtcGxhdGUgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJMUQ2MDU4OTAwRDA1REQzRDAwNkJGQjU0IC8qIGlwanN5c3Rlc3QgKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUQ2MDU4OEQwRDA1REQzRDAwNkJGQjU0IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMjhBRDczNjAwRDlEOTU5OTAwMkU1MTg4IC8qIE1haW5XaW5kb3cueGliIGluIFJlc291cmNlcyAqLywKKwkJCQkyOEYzMzVGMTEwMDdCMzYyMDA0MjRERTIgLyogUm9vdFZpZXdDb250cm9sbGVyLnhpYiBpbiBSZXNvdXJjZXMgKi8sCisJCQkJM0EzNDc4QUExMTU0QkY4RTAwRDUxODgwIC8qIFRlc3RWaWV3Q29udHJvbGxlci54aWIgaW4gUmVzb3VyY2VzICovLAorCQkJCTNBREE0QUI5MTE1NzIzMDAwMDhEOTVGRSAvKiBpbnB1dC44LndhdiBpbiBSZXNvdXJjZXMgKi8sCisJCQkJM0FDNjQzNUUxMTYyMTkyOTAwQjdBNzUxIC8qIHRvY2s4LndhdiBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUQ2MDU4OEUwRDA1REQzRDAwNkJGQjU0IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxRDYwNTg5QjBEMDVERDU2MDA2QkZCNTQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUQzNjIzMjYwRDBGNjg0NTAwOTgxRTUxIC8qIGlwanN5c3Rlc3RBcHBEZWxlZ2F0ZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMjhDMjg2RTEwRDk0REY3RDAwMzRFODg4IC8qIFJvb3RWaWV3Q29udHJvbGxlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJM0EzNDc4QUYxMTU0QkZENzAwRDUxODgwIC8qIFRlc3RWaWV3Q29udHJvbGxlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJM0EzNDc5MjIxMTU0REIwODAwRDUxODgwIC8qIHN5c3Rlc3QuYyBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCQkxRDYwNTg5NDBEMDVERDNFMDA2QkZCNTQgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSBpcGpzeXN0ZXN0X1ByZWZpeC5wY2g7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICJQSl9BVVRPQ09ORj0xIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJpcGpzeXN0ZXN0LUluZm8ucGxpc3QiOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi9wam1lZGlhL2xpYlwiIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi9wanNpcC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vcGpsaWIvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uL3BqbGliLXV0aWwvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uL3BqbmF0aC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliXCIiLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gaXBqc3lzdGVzdDsKKwkJCQlTREtST09UID0gaXBob25lb3M7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxRDYwNTg5NTBEMDVERDNFMDA2QkZCNTQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSBpcGpzeXN0ZXN0X1ByZWZpeC5wY2g7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICJQSl9BVVRPQ09ORj0xIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJpcGpzeXN0ZXN0LUluZm8ucGxpc3QiOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi9wam1lZGlhL2xpYlwiIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi9wanNpcC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vcGpsaWIvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uL3BqbGliLXV0aWwvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uL3BqbmF0aC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliXCIiLAorCQkJCSk7CisJCQkJUFJPRFVDVF9OQU1FID0gaXBqc3lzdGVzdDsKKwkJCQlTREtST09UID0gaXBob25lb3M7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVCkiOworCQkJCSJDT0RFX1NJR05fSURFTlRJVFlbc2RrPWlwaG9uZW9zKl0iID0gImlQaG9uZSBEZXZlbG9wZXIiOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gYzk5OworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi8uLi9wanNpcC9pbmNsdWRlLAorCQkJCQkuLi8uLi8uLi9wamxpYi9pbmNsdWRlLAorCQkJCQkiLi4vLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlIiwKKwkJCQkJLi4vLi4vLi4vcGpuYXRoL2luY2x1ZGUsCisJCQkJCS4uLy4uLy4uL3BqbWVkaWEvaW5jbHVkZSwKKwkJCQkpOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi8uLi9wamxpYi9saWIsCisJCQkJCSIuLi8uLi8uLi9wamxpYi11dGlsL2xpYiIsCisJCQkJCS4uLy4uLy4uL3BqbmF0aC9saWIsCisJCQkJCS4uLy4uLy4uL3BqbWVkaWEvbGliLAorCQkJCQkuLi8uLi8uLi9wanNpcC9saWIsCisJCQkJCS4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gaXBob25lb3M0LjA7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVCkiOworCQkJCSJDT0RFX1NJR05fSURFTlRJVFlbc2RrPWlwaG9uZW9zKl0iID0gImlQaG9uZSBEZXZlbG9wZXIiOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gYzk5OworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi8uLi9wanNpcC9pbmNsdWRlLAorCQkJCQkuLi8uLi8uLi9wamxpYi9pbmNsdWRlLAorCQkJCQkiLi4vLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlIiwKKwkJCQkJLi4vLi4vLi4vcGpuYXRoL2luY2x1ZGUsCisJCQkJCS4uLy4uLy4uL3BqbWVkaWEvaW5jbHVkZSwKKwkJCQkpOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi8uLi9wamxpYi9saWIsCisJCQkJCSIuLi8uLi8uLi9wamxpYi11dGlsL2xpYiIsCisJCQkJCS4uLy4uLy4uL3BqbmF0aC9saWIsCisJCQkJCS4uLy4uLy4uL3BqbWVkaWEvbGliLAorCQkJCQkuLi8uLi8uLi9wanNpcC9saWIsCisJCQkJCS4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYiwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gaXBob25lb3M0LjA7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENCdWlsZENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwkJMUQ2MDU4OTYwRDA1REQzRTAwNkJGQjU0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJpcGpzeXN0ZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFENjA1ODk0MEQwNUREM0UwMDZCRkI1NCAvKiBEZWJ1ZyAqLywKKwkJCQkxRDYwNTg5NTBEMDVERDNFMDA2QkZCNTQgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQlDMDFGQ0Y0RTA4QTk1NDU0MDA1NDI0N0IgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJpcGpzeXN0ZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUMwMUZDRjRGMDhBOTU0NTQwMDU0MjQ3QiAvKiBEZWJ1ZyAqLywKKwkJCQlDMDFGQ0Y1MDA4QTk1NDU0MDA1NDI0N0IgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCX07CisJcm9vdE9iamVjdCA9IDI5Qjk3MzEzRkRDRkEzOTQxMUNBMkNFQSAvKiBQcm9qZWN0IG9iamVjdCAqLzsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdF9QcmVmaXgucGNoIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvaXBqc3lzdGVzdC9pcGpzeXN0ZXN0X1ByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3Yjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvaXBqc3lzdGVzdF9QcmVmaXgucGNoCkBAIC0wLDAgKzEsMTQgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnaXBqc3lzdGVzdCcgdGFyZ2V0IGluIHRoZSAnaXBqc3lzdGVzdCcgcHJvamVjdAorLy8KKyNpbXBvcnQgPEF2YWlsYWJpbGl0eS5oPgorCisjaWZuZGVmIF9fSVBIT05FXzNfMAorI3dhcm5pbmcgIlRoaXMgcHJvamVjdCB1c2VzIGZlYXR1cmVzIG9ubHkgYXZhaWxhYmxlIGluIGlQaG9uZSBTREsgMy4wIGFuZCBsYXRlci4iCisjZW5kaWYKKworCisjaWZkZWYgX19PQkpDX18KKyAgICAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyAgICAjaW1wb3J0IDxVSUtpdC9VSUtpdC5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L21haW4ubSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL2lwanN5c3Rlc3QvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NmZlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9pcGpzeXN0ZXN0L21haW4ubQpAQCAtMCwwICsxLDI3IEBACisvKiAkSWQ6IG1haW4ubSAzNTUyIDIwMTEtMDUtMDUgMDU6NTA6NDhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbXBvcnQgPFVJS2l0L1VJS2l0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICAKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICBpbnQgcmV0VmFsID0gVUlBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndiwgbmlsLCBuaWwpOworICAgIFtwb29sIHJlbGVhc2VdOworICAgIHJldHVybiByZXRWYWw7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhMDA4OAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQ1IEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9Im9yZy5wanNpcC5wanN1YSIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgorCisgICAgPHVzZXMtc2RrCisgICAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTUiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMTUiIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUFJPQ0VTU19PVVRHT0lOR19DQUxMUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFVFRJTkdTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19XSUZJX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5WSUJSQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9MT0dTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVVNFX1NJUCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiIC8+CisKKyAgICA8dXNlcy1mZWF0dXJlCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5taWNyb3Bob25lIgorICAgICAgICBhbmRyb2lkOnJlcXVpcmVkPSJ0cnVlIiAvPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL21haW5faW1hZ2UiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkRldmljZURlZmF1bHQuTm9BY3Rpb25CYXIiID4KKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlSGlkZGVuIgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorCisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL2puaS9BbmRyb2lkLm1rIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY5OWFmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACisjICRJZCQKKworTE9DQUxfUEFUSAk6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgR2V0IFBKIGJ1aWxkIHNldHRpbmdzCitpbmNsdWRlIC4uLy4uLy4uLy4uL2J1aWxkLm1haworaW5jbHVkZSAkKFBKRElSKS9idWlsZC9jb21tb24ubWFrCisKKyMgUGF0aCB0byBTV0lHCitNWV9TV0lHCQk6PSBzd2lnCisKK01ZX01PRFVMRV9QQVRIICA6PSAkKFBKRElSKS9wanNpcC1hcHBzL2J1aWxkL291dHB1dC9wanN1YS0kKFRBUkdFVF9OQU1FKQorTVlfTU9EVUxFUyAgICAgIDo9ICQoTVlfTU9EVUxFX1BBVEgpL3Bqc3VhX2FwcC5vIFwKKwkJICAgJChNWV9NT0RVTEVfUEFUSCkvcGpzdWFfYXBwX2NsaS5vIFwKKwkJICAgJChNWV9NT0RVTEVfUEFUSCkvcGpzdWFfYXBwX2NvbW1vbi5vIFwKKwkJICAgJChNWV9NT0RVTEVfUEFUSCkvcGpzdWFfYXBwX2NvbmZpZy5vIFwKKwkJICAgJChNWV9NT0RVTEVfUEFUSCkvcGpzdWFfYXBwX2xlZ2FjeS5vCisKKyMgQ29uc3RhbnRzCitNWV9KTklfV1JBUAk6PSBwanN1YV93cmFwLmNwcAorTVlfSk5JX0RJUgk6PSBqbmkKKworIyBBbmRyb2lkIGJ1aWxkIHNldHRpbmdzCitMT0NBTF9NT0RVTEUgICAgOj0gbGlicGpzdWEKK0xPQ0FMX0NGTEFHUyAgICA6PSAtV2Vycm9yICQoQVBQX0NGTEFHUykgLWZydHRpCitMT0NBTF9MREZMQUdTICAgOj0gJChBUFBfTERGTEFHUykKK0xPQ0FMX0xETElCUyAgICA6PSAkKE1ZX01PRFVMRVMpICQoQVBQX0xETElCUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKE1ZX0pOSV9XUkFQKSBwanN1YV9hcHBfY2FsbGJhY2suY3BwCisKKyMgSW52b2tlIFNXSUcKKyQoTVlfSk5JX0RJUikvJChNWV9KTklfV1JBUCk6CisJQGVjaG8gIkludm9raW5nIFNXSUcuLi4iCisJJChNWV9TV0lHKSAtYysrIC1vICQoTVlfSk5JX0RJUikvJChNWV9KTklfV1JBUCkgLXBhY2thZ2Ugb3JnLnBqc2lwLnBqc3VhIC1vdXRkaXIgc3JjL29yZy9wanNpcC9wanN1YSAtamF2YSAkKE1ZX0pOSV9ESVIpL3Bqc3VhLmkKKworLlBIT05ZOiAkKE1ZX0pOSV9ESVIpLyQoTVlfSk5JX1dSQVApCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvam5pL3Bqc3VhLmkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL2puaS9wanN1YS5pCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5NDQzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL2puaS9wanN1YS5pCkBAIC0wLDAgKzEsMjkgQEAKKyVtb2R1bGUgKGRpcmVjdG9ycz0iMSIpIHBqc3VhCisKKyV7CisjaW5jbHVkZSAicGpzdWFfYXBwX2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwlpbnQgcGpzdWFTdGFydCgpOworCXZvaWQgcGpzdWFEZXN0cm95KCk7CisJaW50IHBqc3VhUmVzdGFydCgpOworCXZvaWQgc2V0Q2FsbGJhY2tPYmplY3QoUGpzdWFBcHBDYWxsYmFjayogY2FsbGJhY2spOwkKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCislfQorCitpbnQgcGpzdWFTdGFydCgpOwordm9pZCBwanN1YURlc3Ryb3koKTsKK2ludCBwanN1YVJlc3RhcnQoKTsKKworLyogdHVybiBvbiBkaXJlY3RvciB3cmFwcGluZyBQanN1YUFwcENhbGxiYWNrICovCislZmVhdHVyZSgiZGlyZWN0b3IiKSBQanN1YUFwcENhbGxiYWNrOworCislaW5jbHVkZSAicGpzdWFfYXBwX2NhbGxiYWNrLmgiCisKK3ZvaWQgc2V0Q2FsbGJhY2tPYmplY3QoUGpzdWFBcHBDYWxsYmFjayogY2FsbGJhY2spOworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL2puaS9wanN1YV9hcHBfY2FsbGJhY2suY3BwIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvcGpzdWFfYXBwX2NhbGxiYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY4YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvcGpzdWFfYXBwX2NhbGxiYWNrLmNwcApAQCAtMCwwICsxLDExMyBAQAorLyogJElkOiBwanN1YV9hcHBfY2FsbGJhY2suY3BwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTIgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaW5jbHVkZSAicGpzdWFfYXBwX2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwLmgiCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChQSl9BTkRST0lEKSAmJiBQSl9BTkRST0lEICE9IDAKKworc3RhdGljIFBqc3VhQXBwQ2FsbGJhY2sqIHJlZ2lzdGVyZWRDYWxsYmFja09iamVjdCA9IE5VTEw7CitzdGF0aWMgcGpzdWFfYXBwX2NmZ190IGFuZHJvaWRfYXBwX2NvbmZpZzsKK3N0YXRpYyBpbnQgcmVzdGFydF9hcmdjOworc3RhdGljIGNoYXIgKipyZXN0YXJ0X2FyZ3Y7CisKK2V4dGVybiBjb25zdCBjaGFyICpwanN1YV9hcHBfZGVmX2FyZ3ZbXTsKKworI2RlZmluZSBUSElTX0ZJTEUJInBqc3VhX2FwcF9jYWxsYmFjay5jcHAiCisKKy8qKiBDYWxsYmFjayB3cmFwcGVyICoqLwordm9pZCBvbl9jbGlfc3RhcnRlZChwal9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworICAgIGlmIChyZWdpc3RlcmVkQ2FsbGJhY2tPYmplY3QpIHsKKwlpZiAoKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSAmJiAoIW1zZyB8fCAhKm1zZykpIHsKKwkgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwkgICAgbXNnID0gZXJybXNnOworCX0KKwlyZWdpc3RlcmVkQ2FsbGJhY2tPYmplY3QtPm9uU3RhcnRlZChtc2cpOworICAgIH0KK30KKwordm9pZCBvbl9jbGlfc3RvcHBlZChwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGlmIChyZXN0YXJ0KSB7CisJcmVzdGFydF9hcmdjID0gYXJnYzsKKwlyZXN0YXJ0X2FyZ3YgPSBhcmd2OworICAgIH0KKworICAgIGlmIChyZWdpc3RlcmVkQ2FsbGJhY2tPYmplY3QpIHsKKwlyZWdpc3RlcmVkQ2FsbGJhY2tPYmplY3QtPm9uU3RvcHBlZChyZXN0YXJ0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW5pdE1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBhbmRyb2lkX2FwcF9jb25maWcuYXJnYyA9IGFyZ2M7CisgICAgYW5kcm9pZF9hcHBfY29uZmlnLmFyZ3YgPSBhcmd2OworCisgICAgc3RhdHVzID0gcGpzdWFfYXBwX2luaXQoJmFuZHJvaWRfYXBwX2NvbmZpZyk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzID0gcGpzdWFfYXBwX3J1bihQSl9GQUxTRSk7CisgICAgfSBlbHNlIHsKKwlwanN1YV9hcHBfZGVzdHJveSgpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBwanN1YVN0YXJ0KCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBjb25zdCBjaGFyICoqYXJndiA9IHBqc3VhX2FwcF9kZWZfYXJndjsKKyAgICBpbnQgYXJnYyA9IHBqc3VhX2FwcF9kZWZfYXJnYzsKKworICAgIHBqX2J6ZXJvKCZhbmRyb2lkX2FwcF9jb25maWcsIHNpemVvZihhbmRyb2lkX2FwcF9jb25maWcpKTsKKworICAgIGFuZHJvaWRfYXBwX2NvbmZpZy5vbl9zdGFydGVkID0gJm9uX2NsaV9zdGFydGVkOworICAgIGFuZHJvaWRfYXBwX2NvbmZpZy5vbl9zdG9wcGVkID0gJm9uX2NsaV9zdG9wcGVkOworCisgICAgcmV0dXJuIGluaXRNYWluKGFyZ2MsIChjaGFyKiopYXJndik7Cit9CisKK3ZvaWQgcGpzdWFEZXN0cm95KCkKK3sKKyAgICBwanN1YV9hcHBfZGVzdHJveSgpOworCisgICAgLyoqIFRoaXMgaXMgb24gcHVycG9zZSAqKi8KKyAgICBwanN1YV9hcHBfZGVzdHJveSgpOworfQorCitpbnQgcGpzdWFSZXN0YXJ0KCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwanN1YURlc3Ryb3koKTsKKworICAgIHJldHVybiBpbml0TWFpbihyZXN0YXJ0X2FyZ2MsIHJlc3RhcnRfYXJndik7Cit9CisKK3ZvaWQgc2V0Q2FsbGJhY2tPYmplY3QoUGpzdWFBcHBDYWxsYmFjayogY2FsbGJhY2spCit7CisgICAgcmVnaXN0ZXJlZENhbGxiYWNrT2JqZWN0ID0gY2FsbGJhY2s7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvcGpzdWFfYXBwX2NhbGxiYWNrLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL2puaS9wanN1YV9hcHBfY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjFiNWNlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9qbmkvcGpzdWFfYXBwX2NhbGxiYWNrLmgKQEAgLTAsMCArMSwzNiBAQAorLyogJElkOiBwanN1YV9hcHBfY2FsbGJhY2suaCAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fUEpTVUFfQVBQX0NBTExCQUNLX0hfXworI2RlZmluZSBfX1BKU1VBX0FQUF9DQUxMQkFDS19IX18KKworY2xhc3MgUGpzdWFBcHBDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UGpzdWFBcHBDYWxsYmFjaygpIHt9CisgICAgdmlydHVhbCB2b2lkIG9uU3RhcnRlZChjb25zdCBjaGFyICptc2cpIHt9CisgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChpbnQgcmVzdGFydCkge30KK307CisKK2V4dGVybiAiQyIgeworaW50IHBqc3VhU3RhcnQoKTsKK3ZvaWQgcGpzdWFEZXN0cm95KCk7CitpbnQgcGpzdWFSZXN0YXJ0KCk7Cit2b2lkIHNldENhbGxiYWNrT2JqZWN0KFBqc3VhQXBwQ2FsbGJhY2sqIGNhbGxiYWNrKTsKK30KKworI2VuZGlmIC8qIF9fUEpTVUFfQVBQX0NBTExCQUNLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9saW50LnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvbGludC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwZWVhZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvbGludC54bWwKQEAgLTAsMCArMSwzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGxpbnQ+Cis8L2xpbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9wcm9ndWFyZC1wcm9qZWN0LnR4dCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcHJvZ3VhcmQtcHJvamVjdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmZTE1NQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcHJvZ3VhcmQtcHJvamVjdC50eHQKQEAgLTAsMCArMSwyMCBAQAorIyBUbyBlbmFibGUgUHJvR3VhcmQgaW4geW91ciBwcm9qZWN0LCBlZGl0IHByb2plY3QucHJvcGVydGllcworIyB0byBkZWZpbmUgdGhlIHByb2d1YXJkLmNvbmZpZyBwcm9wZXJ0eSBhcyBkZXNjcmliZWQgaW4gdGhhdCBmaWxlLgorIworIyBBZGQgcHJvamVjdCBzcGVjaWZpYyBQcm9HdWFyZCBydWxlcyBoZXJlLgorIyBCeSBkZWZhdWx0LCB0aGUgZmxhZ3MgaW4gdGhpcyBmaWxlIGFyZSBhcHBlbmRlZCB0byBmbGFncyBzcGVjaWZpZWQKKyMgaW4gJHtzZGsuZGlyfS90b29scy9wcm9ndWFyZC9wcm9ndWFyZC1hbmRyb2lkLnR4dAorIyBZb3UgY2FuIGVkaXQgdGhlIGluY2x1ZGUgcGF0aCBhbmQgb3JkZXIgYnkgY2hhbmdpbmcgdGhlIFByb0d1YXJkCisjIGluY2x1ZGUgcHJvcGVydHkgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgorIworIyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKyMgICBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvcHJvZ3VhcmQuaHRtbAorCisjIEFkZCBhbnkgcHJvamVjdCBzcGVjaWZpYyBrZWVwIG9wdGlvbnMgaGVyZToKKworIyBJZiB5b3VyIHByb2plY3QgdXNlcyBXZWJWaWV3IHdpdGggSlMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nCisjIGFuZCBzcGVjaWZ5IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB0aGUgSmF2YVNjcmlwdCBpbnRlcmZhY2UKKyMgY2xhc3M6CisjLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgZnFjbi5vZi5qYXZhc2NyaXB0LmludGVyZmFjZS5mb3Iud2VidmlldyB7CisjICAgcHVibGljICo7CisjfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9wcm9qZWN0LnByb3BlcnRpZXMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Byb2plY3QucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0YTZiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9wcm9qZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgQW5kcm9pZCBUb29scy4KKyMgRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUgLS0gWU9VUiBDSEFOR0VTIFdJTEwgQkUgRVJBU0VEIQorIworIyBUaGlzIGZpbGUgbXVzdCBiZSBjaGVja2VkIGluIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zLgorIworIyBUbyBjdXN0b21pemUgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBBbnQgYnVpbGQgc3lzdGVtIGVkaXQKKyMgImFudC5wcm9wZXJ0aWVzIiwgYW5kIG92ZXJyaWRlIHZhbHVlcyB0byBhZGFwdCB0aGUgc2NyaXB0IHRvIHlvdXIKKyMgcHJvamVjdCBzdHJ1Y3R1cmUuCisjCisjIFRvIGVuYWJsZSBQcm9HdWFyZCB0byBzaHJpbmsgYW5kIG9iZnVzY2F0ZSB5b3VyIGNvZGUsIHVuY29tbWVudCB0aGlzIChhdmFpbGFibGUgcHJvcGVydGllczogc2RrLmRpciwgdXNlci5ob21lKToKKyNwcm9ndWFyZC5jb25maWc9JHtzZGsuZGlyfS90b29scy9wcm9ndWFyZC9wcm9ndWFyZC1hbmRyb2lkLnR4dDpwcm9ndWFyZC1wcm9qZWN0LnR4dAorCisjIFByb2plY3QgdGFyZ2V0LgordGFyZ2V0PWFuZHJvaWQtMTYKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLWhkcGkvbWFpbl9pbWFnZS5wbmcgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1oZHBpL21haW5faW1hZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5YzUzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1oZHBpL21haW5faW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLWxkcGkvbWFpbl9pbWFnZS5wbmcgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1sZHBpL21haW5faW1hZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2OTk3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1sZHBpL21haW5faW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLW1kcGkvbWFpbl9pbWFnZS5wbmcgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1tZHBpL21haW5faW1hZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMTJmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1tZHBpL21haW5faW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLXhoZHBpL21haW5faW1hZ2UucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvZHJhd2FibGUteGhkcGkvbWFpbl9pbWFnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTk3OGIwYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLXhoZHBpL21haW5faW1hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI1OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvbGF5b3V0L2FjdGl2aXR5X21haW4ueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW1hZ2VBcHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQCtpZC90ZXh0QXBwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9tYWluX2ltYWdlIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dEFwcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjQwc3AiCisgICAgICAgIGFuZHJvaWQ6dHlwZWZhY2U9InNlcmlmIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFN0YXR1cyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0SXNTZWxlY3RhYmxlPSJmYWxzZSIvPgorCis8L1JlbGF0aXZlTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTEvc3R5bGVzLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTEvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDA4Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvdmFsdWVzLXYxMS9zdHlsZXMueG1sCkBAIC0wLDAgKzEsNSBAQAorPHJlc291cmNlcz4KKworICAgIDxzdHlsZSBuYW1lPSJBcHBUaGVtZSIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLkhvbG8uTGlnaHQiIC8+CisKKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTQvc3R5bGVzLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTQvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA4OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvdmFsdWVzLXYxNC9zdHlsZXMueG1sCkBAIC0wLDAgKzEsNSBAQAorPHJlc291cmNlcz4KKworICAgIDxzdHlsZSBuYW1lPSJBcHBUaGVtZSIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLkhvbG8uTGlnaHQuRGFya0FjdGlvbkJhciIgLz4KKworPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWVlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw2IEBACis8cmVzb3VyY2VzPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+cGpzdWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2FjdGl2aXR5X21haW4iPk1haW5BY3Rpdml0eTwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2FuZHJvaWQvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmEwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDUgQEAKKzxyZXNvdXJjZXM+CisKKyAgICA8c3R5bGUgbmFtZT0iQXBwVGhlbWUiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5MaWdodCIgLz4KKworPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9zcmMvb3JnL3Bqc2lwL3Bqc3VhL01haW5BY3Rpdml0eS5qYXZhIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYW5kcm9pZC9zcmMvb3JnL3Bqc2lwL3Bqc3VhL01haW5BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9hbmRyb2lkL3NyYy9vcmcvcGpzaXAvcGpzdWEvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qICRJZDogTWFpbkFjdGl2aXR5LmphdmEgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCitwYWNrYWdlIG9yZy5wanNpcC5wanN1YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitjbGFzcyBDT05TVCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCX0ZJTEVOQU1FID0gInBqc3VhIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAicGpzdWEiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBBVVRPS0lMTF9PTl9GSU5JU0ggPSB0cnVlOworCXB1YmxpYyBlbnVtIE1TR19UWVBFIHsKKwkJU1RSX0RFQlVHLAorCQlTVFJfSU5GTywKKwkJU1RSX0VSUk9SLAorCQlDTElfU1RPUCwKKwkJQ0xJX1JFU1RBUlQsCisJCVFVSVQKKwl9OwkKK30KKworY2xhc3MgTE9HIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgREVCVUcoSGFuZGxlciBoLCBTdHJpbmcgc3RyKSB7CisJCU1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oaCwgQ09OU1QuTVNHX1RZUEUuU1RSX0RFQlVHLm9yZGluYWwoKSwgCisJCQkJCQkJCQkgc3RyKTsKKwkJbXNnLnNlbmRUb1RhcmdldCgpOworCX0JCisJcHVibGljIHN0YXRpYyB2b2lkIElORk8oSGFuZGxlciBoLCBTdHJpbmcgc3RyKSB7CisJCU1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oaCwgQ09OU1QuTVNHX1RZUEUuU1RSX0lORk8ub3JkaW5hbCgpLCAKKwkJCQkJCQkJCSBzdHIpOworCQltc2cuc2VuZFRvVGFyZ2V0KCk7CisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCBFUlJPUihIYW5kbGVyIGgsIFN0cmluZyBzdHIpIHsKKwkJTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbihoLCBDT05TVC5NU0dfVFlQRS5TVFJfRVJST1Iub3JkaW5hbCgpLCAKKwkJCQkJCQkJCSBzdHIpOworCQltc2cuc2VuZFRvVGFyZ2V0KCk7CisJfQorfQorCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCXByaXZhdGUgTXlIYW5kbGVyIHVpX2hhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHRoaXMpOworCXByaXZhdGUgc3RhdGljIE15Q2FsbGJhY2sgY2FsbGJhY2s7CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisJCXByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNYWluQWN0aXZpdHk+IG1UYXJnZXQ7CisJCQorCQlwdWJsaWMgTXlIYW5kbGVyKE1haW5BY3Rpdml0eSB0YXJnZXQpIHsKKwkJCW1UYXJnZXQgPSBuZXcgV2Vha1JlZmVyZW5jZTxNYWluQWN0aXZpdHk+KHRhcmdldCk7IAorCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKwkJCU1haW5BY3Rpdml0eSB0YXJnZXQgPSBtVGFyZ2V0LmdldCgpOworCQkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKG0ud2hhdCA9PSBDT05TVC5NU0dfVFlQRS5TVFJfREVCVUcub3JkaW5hbCgpKSB7CisJCQkJTG9nLmQoQ09OU1QuVEFHLCAoU3RyaW5nKW0ub2JqKTsJCisJCQl9IGVsc2UgaWYgKG0ud2hhdCA9PSBDT05TVC5NU0dfVFlQRS5TVFJfSU5GTy5vcmRpbmFsKCkpIHsKKwkJCQl0YXJnZXQudXBkYXRlU3RhdHVzKChTdHJpbmcpbS5vYmopOworCQkJCUxvZy5pKENPTlNULlRBRywgKFN0cmluZyltLm9iaik7CQkJCQorCQkJfSBlbHNlIGlmIChtLndoYXQgPT0gQ09OU1QuTVNHX1RZUEUuU1RSX0VSUk9SLm9yZGluYWwoKSkgeworCQkJCXRhcmdldC51cGRhdGVTdGF0dXMoKFN0cmluZyltLm9iaik7CisJCQkJTG9nLmUoQ09OU1QuVEFHLCAoU3RyaW5nKW0ub2JqKTsKKwkJCX0gZWxzZSBpZiAobS53aGF0ID09IENPTlNULk1TR19UWVBFLkNMSV9TVE9QLm9yZGluYWwoKSkgeworCQkJCXBqc3VhLnBqc3VhRGVzdHJveSgpOworCQkJCUxPRy5JTkZPKHRoaXMsICJUZWxuZXQgVW5hdmFpbGFibGUiKTsKKwkJCX0gZWxzZSBpZiAobS53aGF0ID09IENPTlNULk1TR19UWVBFLkNMSV9SRVNUQVJULm9yZGluYWwoKSkgeworCQkJCWludCBzdGF0dXMgPSBwanN1YS5wanN1YVJlc3RhcnQoKTsKKwkJCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCQkJTE9HLklORk8odGhpcywgIkZhaWxlZCByZXN0YXJ0aW5nIHRlbG5ldCIpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobS53aGF0ID09IENPTlNULk1TR19UWVBFLlFVSVQub3JkaW5hbCgpKSB7CisJCQkJdGFyZ2V0LmZpbmlzaCgpOworCQkJCVN5c3RlbS5nYygpOworCQkJCWFuZHJvaWQub3MuUHJvY2Vzcy5raWxsUHJvY2VzcyhhbmRyb2lkLm9zLlByb2Nlc3MubXlQaWQoKSk7CisJCQl9CisJCX0KKyAgICB9CisJCisJLyoqIENhbGxiYWNrIG9iamVjdCAqKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUNhbGxiYWNrIGV4dGVuZHMgUGpzdWFBcHBDYWxsYmFjayB7CisJCXByaXZhdGUgV2Vha1JlZmVyZW5jZTxIYW5kbGVyPiB1aV9oYW5kbGVyOworCQkKKwkJcHVibGljIE15Q2FsbGJhY2soSGFuZGxlciBpbl91aV9oYW5kbGVyKSB7CisJCQlzZXRfdWlfaGFuZGxlcihpbl91aV9oYW5kbGVyKTsJCQkKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgc2V0X3VpX2hhbmRsZXIoSGFuZGxlciBpbl91aV9oYW5kbGVyKSB7CisJCQl1aV9oYW5kbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8SGFuZGxlcj4oaW5fdWlfaGFuZGxlcik7CisJCX0JCQorCQkKKwkJQE92ZXJyaWRlCisJICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRlZChTdHJpbmcgbXNnKSB7CisJCQlIYW5kbGVyIHVpID0gdWlfaGFuZGxlci5nZXQoKTsKKwkJCUxPRy5JTkZPKHVpLCBtc2cpOwkJCQorCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkgICAgcHVibGljIHZvaWQgb25TdG9wcGVkKGludCByZXN0YXJ0KSB7CisJCQlIYW5kbGVyIHVpID0gdWlfaGFuZGxlci5nZXQoKTsKKwkJCS8qKiBVc2UgdGltZXIgdG8gc3RvcHBlZC9yZXN0YXJ0ICoqLworCQkJaWYgKHJlc3RhcnQgIT0gMCkgeworCQkJCUxPRy5JTkZPKHVpLCAiVGVsbmV0IFJlc3RhcnRpbmciKTsKKwkJCQlNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKHVpLCAKKwkJCQkJCQkJCQkgIENPTlNULk1TR19UWVBFLkNMSV9SRVNUQVJULm9yZGluYWwoKSk7CisJCQkJdWkuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgMTAwKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HLklORk8odWksICJUZWxuZXQgU3RvcHBpbmciKTsKKwkJCQlNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKHVpLCAKKwkJCQkJCQkJCQkJIENPTlNULk1TR19UWVBFLkNMSV9TVE9QLm9yZGluYWwoKSk7CisJCQkJdWkuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgMTAwKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgVGV4dFZpZXcgdFN0YXR1cyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQudGV4dFN0YXR1cyk7CisgICAgICAgIHRTdGF0dXMuc2V0VGV4dChvdXRwdXQpOyAgICAgICAgCisJfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAJTE9HLkRFQlVHKHVpX2hhbmRsZXIsICI9PT0gQWN0aXZpdHk6Om9uQ3JlYXRlKCkgPT09Iik7CisgICAgCXN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgCQorICAgIAlpbml0X3ZpZXcoKTsKKworICAgIAlpbml0X2xpYigpOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7CisgICAgCUxPRy5ERUJVRyh1aV9oYW5kbGVyLCAiPT09IEFjdGl2aXR5OjpvblN0YXJ0KCkgPT09Iik7CisgICAgCXN1cGVyLm9uU3RhcnQoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0YXJ0KCkgeworICAgIAlMT0cuREVCVUcodWlfaGFuZGxlciwgIj09PSBBY3Rpdml0eTo6b25SZXN0YXJ0KCkgPT09Iik7CisgICAgCXN1cGVyLm9uUmVzdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgIAlMT0cuREVCVUcodWlfaGFuZGxlciwgIj09PSBBY3Rpdml0eTo6b25SZXN1bWUoKSA9PT0iKTsKKyAgICAJc3VwZXIub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgIAlMT0cuREVCVUcodWlfaGFuZGxlciwgIj09PSBBY3Rpdml0eTo6b25QYXVzZSgpID09PSIpOworICAgIAlzdXBlci5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgIAlMT0cuREVCVUcodWlfaGFuZGxlciwgIj09PSBBY3Rpdml0eTo6b25TdG9wKCkgPT09Iik7CisgICAgCXN1cGVyLm9uU3RvcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAJTE9HLkRFQlVHKHVpX2hhbmRsZXIsICI9PT0gQWN0aXZpdHk6Om9uRGVzdHJveSgpID09PSIpOworICAgIAlzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKwkJc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisJCXN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisgICAgCisJcHJpdmF0ZSB2b2lkIGluaXRfdmlldygpIHsKKyAgICAJc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWN0aXZpdHlfbWFpbik7CisJfQorCQorCXByaXZhdGUgaW50IGluaXRfbGliKCkgeyAgICAgICAgCisJCUxPRy5JTkZPKHVpX2hhbmRsZXIsICJMb2FkaW5nIG1vZHVsZS4uLiIpOworCQl0cnkgeworCQkJU3lzdGVtLmxvYWRMaWJyYXJ5KENPTlNULkxJQl9GSUxFTkFNRSk7CisJCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsKKwkJCUxPRy5FUlJPUih1aV9oYW5kbGVyLCAiVW5zYXRpc2ZpZWRMaW5rRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJCisJCS8vIFdhaXQgZm9yIEdEQiB0byBpbml0CisJCWlmICgoZ2V0QXBwbGljYXRpb25JbmZvKCkuZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19ERUJVR0dBQkxFKSAhPSAwKSAKKwkJeworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7CisJICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJICAgICAgICAJTE9HLkVSUk9SKHVpX2hhbmRsZXIsICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIAorCSAgICAgICAgCQkJICBlLmdldE1lc3NhZ2UoKSk7CisJICAgICAgICB9CisJCX0KKwkJCisJCS8vIFNldCBjYWxsYmFjayBvYmplY3QKKwkJaWYgKGNhbGxiYWNrID09IG51bGwpCisJCQljYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKHVpX2hhbmRsZXIpOworCQkKKwkJcGpzdWEuc2V0Q2FsbGJhY2tPYmplY3QoY2FsbGJhY2spOworCisJCUxPRy5JTkZPKHVpX2hhbmRsZXIsICJTdGFydGluZyBtb2R1bGUuLiIpOworCisJCWludCByYyA9IHBqc3VhLnBqc3VhU3RhcnQoKTsKKyAgICAgICAgCisJCWlmIChyYyAhPSAwKSB7CisJCQlMT0cuSU5GTyh1aV9oYW5kbGVyLCAiRmFpbGVkIHN0YXJ0aW5nIHRlbG5ldCIpOworCQl9CisJCQorCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwLy5jcHJvamVjdCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvLmNwcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTYxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwLy5jcHJvamVjdApAQCAtMCwwICsxLDE4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8P2ZpbGVWZXJzaW9uIDQuMC4wPz4KKworPGNwcm9qZWN0IHN0b3JhZ2VfdHlwZV9pZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuWG1sUHJvamVjdERlc2NyaXB0aW9uU3RvcmFnZSI+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIj4KKwkJPGNjb25maWd1cmF0aW9uIGlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMTM5NzI5MDA5OSI+CisJCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzOTcyOTAwOTkiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iRGV2aWNlLURlYnVnIj4KKwkJCQk8ZXh0ZXJuYWxTZXR0aW5ncy8+CisJCQkJPGV4dGVuc2lvbnM+CisJCQkJCTxleHRlbnNpb24gaWQ9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5jb3JlLlFERUJ5bmFyeVBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HbWFrZUVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQk8L2V4dGVuc2lvbnM+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJCQk8Y29uZmlndXJhdGlvbiBhcnRpZmFjdE5hbWU9IiR7UHJvak5hbWV9IiBidWlsZFByb3BlcnRpZXM9IiIgZGVzY3JpcHRpb249IiIgaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi4xMzk3MjkwMDk5IiBuYW1lPSJEZXZpY2UtRGVidWciIHBhcmVudD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuZW1wdHljZmciPgorCQkJCQk8Zm9sZGVySW5mbyBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzOTcyOTAwOTkuMTY1OTY0ODI5MyIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgorCQkJCQkJPHRvb2xDaGFpbiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjc5MDc4MDY5NCIgbmFtZT0iY29tLnFueC5xY2MudG9vbENoYWluIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sQ2hhaW4iPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5vcy4xMDczNTk2MzkyIiBuYW1lPSJUYXJnZXQgT1M6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24ub3MiLz4KKwkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24uY3B1LjQ0NTY1MjAzMyIgbmFtZT0iVGFyZ2V0IENQVToiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLm9wdGlvbi5jcHUiIHZhbHVlPSJjb20ucW54LnFjYy5vcHRpb24uZ2VuLmNwdS5hcm1sZS12NyIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLjI3ODAyMzEyOSIgbmFtZT0iQ29tcGlsZXI6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIiLz4KKwkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24ucnVudGltZS4xNjA0OTc4NDgiIG5hbWU9IlJ1bnRpbWU6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24ucnVudGltZSIvPgorCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBhcmNoTGlzdD0iYWxsIiBiaW5hcnlQYXJzZXI9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5jb3JlLlFERUJ5bmFyeVBhcnNlciIgaWQ9ImNvbS5xbngucWNjLnRhcmdldFBsYXRmb3JtLjE1NTUyOTkyMDAiIG9zTGlzdD0iYWxsIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50YXJnZXRQbGF0Zm9ybSIvPgorCQkJCQkJCTxidWlsZGVyIGF1dG9CdWlsZFRhcmdldD0iRGV2aWNlLURlYnVnIiBlbmFibGVBdXRvQnVpbGQ9ImZhbHNlIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzOTcyOTAwOTkuMjkwNDgxODg2IiBpbmNyZW1lbnRhbEJ1aWxkVGFyZ2V0PSJEZXZpY2UtRGVidWciIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbWFuYWdlZEJ1aWxkT249ImZhbHNlIiBuYW1lPSJHbnUgTWFrZSBCdWlsZGVyIiBwYXJhbGxlbEJ1aWxkT249InRydWUiIHBhcmFsbGVsaXphdGlvbk51bWJlcj0ib3B0aW1hbCIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuZGVmYXVsdC5idWlsZGVyIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNvbS5xbngucWNjLnRvb2wuY29tcGlsZXIuMjA3MDE2NzI0NSIgbmFtZT0iUUNDIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmNvbXBpbGVyIj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLm9wdGxldmVsLjI3MDA0MTUyMyIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwiIHZhbHVlPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwuMCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNvbS5xbngucWNjLmlucHV0VHlwZS5jb21waWxlci4yMDYxMTUyOTc5IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuY29tcGlsZXIiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgaWQ9ImNvbS5xbngucWNjLnRvb2wuYXNzZW1ibGVyLjc4ODg4NDQwMSIgbmFtZT0iUUNDIEFzc2VtYmxlciIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbC5hc3NlbWJsZXIiPgorCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuYXNzZW1ibGVyLjM2MTk4NTUzOSIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MuaW5wdXRUeXBlLmFzc2VtYmxlciIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCQk8dG9vbCBpZD0iY29tLnFueC5xY2MudG9vbC5saW5rZXIuMzY3Njc3MjgwIiBuYW1lPSJRQ0MgTGlua2VyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmxpbmtlciIvPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmFyY2hpdmVyLjQ0ODYxMzM4IiBuYW1lPSJRQ0MgQXJjaGl2ZXIiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRvb2wuYXJjaGl2ZXIiLz4KKwkJCQkJCTwvdG9vbENoYWluPgorCQkJCQk8L2ZvbGRlckluZm8+CisJCQkJCTxzb3VyY2VFbnRyaWVzPgorCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0ic3JjIi8+CisJCQkJCTwvc291cmNlRW50cmllcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgorCQk8L2Njb25maWd1cmF0aW9uPgorCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi4yMDc5NDAxMTA4Ij4KKwkJCTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMjA3OTQwMTEwOCIgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIiBuYW1lPSJEZXZpY2UtUmVsZWFzZSI+CisJCQkJPGV4dGVybmFsU2V0dGluZ3MvPgorCQkJCTxleHRlbnNpb25zPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJjb20ucW54LnRvb2xzLmlkZS5xZGUuY29yZS5RREVCeW5hcnlQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR21ha2VFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNXRExvY2F0b3IiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJPC9leHRlbnNpb25zPgorCQkJPC9zdG9yYWdlTW9kdWxlPgorCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+CisJCQkJPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3ROYW1lPSIke1Byb2pOYW1lfSIgYnVpbGRQcm9wZXJ0aWVzPSIiIGRlc2NyaXB0aW9uPSIiIGlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMjA3OTQwMTEwOCIgbmFtZT0iRGV2aWNlLVJlbGVhc2UiIHBhcmVudD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuZW1wdHljZmciPgorCQkJCQk8Zm9sZGVySW5mbyBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjIwNzk0MDExMDguMTAyNjEzMzY4NCIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgorCQkJCQkJPHRvb2xDaGFpbiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEyNDA1MzcxNTAiIG5hbWU9ImNvbS5xbngucWNjLnRvb2xDaGFpbiIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbENoYWluIj4KKwkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24ub3MuMTc1NjkzOTIxMSIgbmFtZT0iVGFyZ2V0IE9TOiIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2Mub3B0aW9uLm9zIi8+CisJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNwdS43NTE5MDQwMzQiIG5hbWU9IlRhcmdldCBDUFU6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY3B1IiB2YWx1ZT0iY29tLnFueC5xY2Mub3B0aW9uLmdlbi5jcHUuYXJtbGUtdjciIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5jb21waWxlci4xMTExNDA3OTIxIiBuYW1lPSJDb21waWxlcjoiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLm9wdGlvbi5jb21waWxlciIvPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5ydW50aW1lLjEyNDcwNzM5MDQiIG5hbWU9IlJ1bnRpbWU6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24ucnVudGltZSIvPgorCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBhcmNoTGlzdD0iYWxsIiBiaW5hcnlQYXJzZXI9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5jb3JlLlFERUJ5bmFyeVBhcnNlciIgaWQ9ImNvbS5xbngucWNjLnRhcmdldFBsYXRmb3JtLjEzMDAxMjY5OTEiIG9zTGlzdD0iYWxsIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50YXJnZXRQbGF0Zm9ybSIvPgorCQkJCQkJCTxidWlsZGVyIGF1dG9CdWlsZFRhcmdldD0iRGV2aWNlLVJlbGVhc2UiIGVuYWJsZUF1dG9CdWlsZD0idHJ1ZSIgaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi4yMDc5NDAxMTA4LjQ2NzQyNjU2NCIgaW5jcmVtZW50YWxCdWlsZFRhcmdldD0iRGV2aWNlLVJlbGVhc2UiIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbWFuYWdlZEJ1aWxkT249ImZhbHNlIiBuYW1lPSJHbnUgTWFrZSBCdWlsZGVyIiBwYXJhbGxlbEJ1aWxkT249InRydWUiIHBhcmFsbGVsaXphdGlvbk51bWJlcj0ib3B0aW1hbCIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuZGVmYXVsdC5idWlsZGVyIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNvbS5xbngucWNjLnRvb2wuY29tcGlsZXIuMTE1MzIwNDUyIiBuYW1lPSJRQ0MgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRvb2wuY29tcGlsZXIiPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwuNzc4NDA2OTIiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLm9wdGxldmVsIiB2YWx1ZT0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLm9wdGxldmVsLjAiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuY29tcGlsZXIuMTUzNTExNTE0IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuY29tcGlsZXIiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgaWQ9ImNvbS5xbngucWNjLnRvb2wuYXNzZW1ibGVyLjI1NjExNTM5OCIgbmFtZT0iUUNDIEFzc2VtYmxlciIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbC5hc3NlbWJsZXIiPgorCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuYXNzZW1ibGVyLjE2MjExMjU1MCIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MuaW5wdXRUeXBlLmFzc2VtYmxlciIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCQk8dG9vbCBpZD0iY29tLnFueC5xY2MudG9vbC5saW5rZXIuMTQ1OTc4MTk1OSIgbmFtZT0iUUNDIExpbmtlciIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbC5saW5rZXIiLz4KKwkJCQkJCQk8dG9vbCBpZD0iY29tLnFueC5xY2MudG9vbC5hcmNoaXZlci4xNDU4MTIxNTQ5IiBuYW1lPSJRQ0MgQXJjaGl2ZXIiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRvb2wuYXJjaGl2ZXIiLz4KKwkJCQkJCTwvdG9vbENoYWluPgorCQkJCQk8L2ZvbGRlckluZm8+CisJCQkJCTxzb3VyY2VFbnRyaWVzPgorCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0ic3JjIi8+CisJCQkJCTwvc291cmNlRW50cmllcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgorCQk8L2Njb25maWd1cmF0aW9uPgorCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi41MzY0MTc4MyI+CisJCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjUzNjQxNzgzIiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9IkRldmljZS1Qcm9maWxlIj4KKwkJCQk8ZXh0ZXJuYWxTZXR0aW5ncy8+CisJCQkJPGV4dGVuc2lvbnM+CisJCQkJCTxleHRlbnNpb24gaWQ9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5jb3JlLlFERUJ5bmFyeVBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HbWFrZUVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQk8L2V4dGVuc2lvbnM+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJCQk8Y29uZmlndXJhdGlvbiBhcnRpZmFjdE5hbWU9IiR7UHJvak5hbWV9IiBidWlsZFByb3BlcnRpZXM9IiIgaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi41MzY0MTc4MyIgbmFtZT0iRGV2aWNlLVByb2ZpbGUiIHBhcmVudD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuZW1wdHljZmciPgorCQkJCQk8Zm9sZGVySW5mbyBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjUzNjQxNzgzLjQ5NTE2OTU4OCIgbmFtZT0iLyIgcmVzb3VyY2VQYXRoPSIiPgorCQkJCQkJPHRvb2xDaGFpbiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjE5NjAwNjkxMzgiIG5hbWU9ImNvbS5xbngucWNjLnRvb2xDaGFpbiIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbENoYWluIj4KKwkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24ub3MuMTU3NjEyNTA3OSIgbmFtZT0iVGFyZ2V0IE9TOiIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2Mub3B0aW9uLm9zIi8+CisJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNwdS42NjA3MjU2MjciIG5hbWU9IlRhcmdldCBDUFU6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY3B1IiB2YWx1ZT0iY29tLnFueC5xY2Mub3B0aW9uLmdlbi5jcHUuYXJtbGUtdjciIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5jb21waWxlci4yMDg4MjU3MTg5IiBuYW1lPSJDb21waWxlcjoiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLm9wdGlvbi5jb21waWxlciIvPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5ydW50aW1lLjMxMzc3MjQ0NiIgbmFtZT0iUnVudGltZToiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLm9wdGlvbi5ydW50aW1lIi8+CisJCQkJCQkJPHRhcmdldFBsYXRmb3JtIGFyY2hMaXN0PSJhbGwiIGJpbmFyeVBhcnNlcj0iY29tLnFueC50b29scy5pZGUucWRlLmNvcmUuUURFQnluYXJ5UGFyc2VyIiBpZD0iY29tLnFueC5xY2MudGFyZ2V0UGxhdGZvcm0uMTMyMTY4Njc5OCIgb3NMaXN0PSJhbGwiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRhcmdldFBsYXRmb3JtIi8+CisJCQkJCQkJPGJ1aWxkZXIgYXV0b0J1aWxkVGFyZ2V0PSJEZXZpY2UtUHJvZmlsZSIgZW5hYmxlQXV0b0J1aWxkPSJ0cnVlIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjUzNjQxNzgzLjY1Njk4NDU2MCIgaW5jcmVtZW50YWxCdWlsZFRhcmdldD0iRGV2aWNlLVByb2ZpbGUiIG1hbmFnZWRCdWlsZE9uPSJmYWxzZSIgbmFtZT0iR251IE1ha2UgQnVpbGRlciIgcGFyYWxsZWxCdWlsZE9uPSJ0cnVlIiBwYXJhbGxlbGl6YXRpb25OdW1iZXI9Im9wdGltYWwiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmRlZmF1bHQuYnVpbGRlciIvPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmNvbXBpbGVyLjg4MDg4MjczOSIgbmFtZT0iUUNDIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmNvbXBpbGVyIj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLm9wdGxldmVsLjkyMTMyNzUyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwiIHZhbHVlPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwuMCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNvbS5xbngucWNjLmlucHV0VHlwZS5jb21waWxlci41NTYwMTg4MjEiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLmlucHV0VHlwZS5jb21waWxlciIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCQk8dG9vbCBpZD0iY29tLnFueC5xY2MudG9vbC5hc3NlbWJsZXIuNTE3OTczMTkxIiBuYW1lPSJRQ0MgQXNzZW1ibGVyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmFzc2VtYmxlciI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNvbS5xbngucWNjLmlucHV0VHlwZS5hc3NlbWJsZXIuNTIxNTk2MjgzIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuYXNzZW1ibGVyIi8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmxpbmtlci4xNDk3ODU3ODczIiBuYW1lPSJRQ0MgTGlua2VyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmxpbmtlciIvPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmFyY2hpdmVyLjg3NzYxMzI2NiIgbmFtZT0iUUNDIEFyY2hpdmVyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmFyY2hpdmVyIi8+CisJCQkJCQk8L3Rvb2xDaGFpbj4KKwkJCQkJPC9mb2xkZXJJbmZvPgorCQkJCQk8c291cmNlRW50cmllcz4KKwkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEh8UkVTT0xWRUQiIGtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9InNyYyIvPgorCQkJCQk8L3NvdXJjZUVudHJpZXM+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9zdG9yYWdlTW9kdWxlPgorCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KKwkJPC9jY29uZmlndXJhdGlvbj4KKwkJPGNjb25maWd1cmF0aW9uIGlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMTM4MTM1MjczNCI+CisJCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzODEzNTI3MzQiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iU2ltdWxhdG9yLURlYnVnIj4KKwkJCQk8ZXh0ZXJuYWxTZXR0aW5ncy8+CisJCQkJPGV4dGVuc2lvbnM+CisJCQkJCTxleHRlbnNpb24gaWQ9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5jb3JlLlFERUJ5bmFyeVBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HbWFrZUVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQk8L2V4dGVuc2lvbnM+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJCQk8Y29uZmlndXJhdGlvbiBhcnRpZmFjdE5hbWU9IiR7UHJvak5hbWV9IiBidWlsZFByb3BlcnRpZXM9IiIgaWQ9ImNvbS5xbngucWNjLnRvb2xDaGFpbi4xMzgxMzUyNzM0IiBuYW1lPSJTaW11bGF0b3ItRGVidWciIHBhcmVudD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuZW1wdHljZmciPgorCQkJCQk8Zm9sZGVySW5mbyBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzODEzNTI3MzQuNDkzNDIxMTI1IiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+CisJCQkJCQk8dG9vbENoYWluIGlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMTEzNzU0NzI3NCIgbmFtZT0iY29tLnFueC5xY2MudG9vbENoYWluIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sQ2hhaW4iPgorCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5vcy4xOTY1NDk5Njc3IiBuYW1lPSJUYXJnZXQgT1M6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24ub3MiLz4KKwkJCQkJCQk8b3B0aW9uIGlkPSJjb20ucW54LnFjYy5vcHRpb24uY3B1LjE3NjYwMjA2MjEiIG5hbWU9IlRhcmdldCBDUFU6IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY3B1Ii8+CisJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyLjE0MjY4ODEzMDMiIG5hbWU9IkNvbXBpbGVyOiIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2Mub3B0aW9uLmNvbXBpbGVyIi8+CisJCQkJCQkJPG9wdGlvbiBpZD0iY29tLnFueC5xY2Mub3B0aW9uLnJ1bnRpbWUuMTU1MDQ4MTI4NCIgbmFtZT0iUnVudGltZToiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLm9wdGlvbi5ydW50aW1lIi8+CisJCQkJCQkJPHRhcmdldFBsYXRmb3JtIGFyY2hMaXN0PSJhbGwiIGJpbmFyeVBhcnNlcj0iY29tLnFueC50b29scy5pZGUucWRlLmNvcmUuUURFQnluYXJ5UGFyc2VyIiBpZD0iY29tLnFueC5xY2MudGFyZ2V0UGxhdGZvcm0uNTc0NDQzNTgxIiBvc0xpc3Q9ImFsbCIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudGFyZ2V0UGxhdGZvcm0iLz4KKwkJCQkJCQk8YnVpbGRlciBhdXRvQnVpbGRUYXJnZXQ9IlNpbXVsYXRvci1EZWJ1ZyIgZW5hYmxlQXV0b0J1aWxkPSJ0cnVlIiBpZD0iY29tLnFueC5xY2MudG9vbENoYWluLjEzODEzNTI3MzQuNTQ0NTA5OTkxIiBpbmNyZW1lbnRhbEJ1aWxkVGFyZ2V0PSJTaW11bGF0b3ItRGVidWciIG1hbmFnZWRCdWlsZE9uPSJmYWxzZSIgbmFtZT0iR251IE1ha2UgQnVpbGRlciIgcGFyYWxsZWxCdWlsZE9uPSJ0cnVlIiBwYXJhbGxlbGl6YXRpb25OdW1iZXI9Im9wdGltYWwiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmRlZmF1bHQuYnVpbGRlciIvPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmNvbXBpbGVyLjE5NDg3NDQ5ODkiIG5hbWU9IlFDQyBDb21waWxlciIgc3VwZXJDbGFzcz0iY29tLnFueC5xY2MudG9vbC5jb21waWxlciI+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImNvbS5xbngucWNjLm9wdGlvbi5jb21waWxlci5vcHRsZXZlbC4xNzA2MjIxMDc1IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwiIHZhbHVlPSJjb20ucW54LnFjYy5vcHRpb24uY29tcGlsZXIub3B0bGV2ZWwuMCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNvbS5xbngucWNjLmlucHV0VHlwZS5jb21waWxlci44MDQ2MDc1ODkiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLmlucHV0VHlwZS5jb21waWxlciIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCQk8dG9vbCBpZD0iY29tLnFueC5xY2MudG9vbC5hc3NlbWJsZXIuMTI5NDY4NTcwIiBuYW1lPSJRQ0MgQXNzZW1ibGVyIiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy50b29sLmFzc2VtYmxlciI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNvbS5xbngucWNjLmlucHV0VHlwZS5hc3NlbWJsZXIuNzIxNjkzOTg5IiBzdXBlckNsYXNzPSJjb20ucW54LnFjYy5pbnB1dFR5cGUuYXNzZW1ibGVyIi8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGlkPSJjb20ucW54LnFjYy50b29sLmxpbmtlci40MTczMTgyNDEiIG5hbWU9IlFDQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRvb2wubGlua2VyIi8+CisJCQkJCQkJPHRvb2wgaWQ9ImNvbS5xbngucWNjLnRvb2wuYXJjaGl2ZXIuMTg5NTM1MjA4IiBuYW1lPSJRQ0MgQXJjaGl2ZXIiIHN1cGVyQ2xhc3M9ImNvbS5xbngucWNjLnRvb2wuYXJjaGl2ZXIiLz4KKwkJCQkJCTwvdG9vbENoYWluPgorCQkJCQk8L2ZvbGRlckluZm8+CisJCQkJCTxzb3VyY2VFbnRyaWVzPgorCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0ic3JjIi8+CisJCQkJCTwvc291cmNlRW50cmllcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3N0b3JhZ2VNb2R1bGU+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIvPgorCQk8L2Njb25maWd1cmF0aW9uPgorCTwvc3RvcmFnZU1vZHVsZT4KKwk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KKwkJPHByb2plY3QgaWQ9IlBqc3VhQkIubnVsbC45Mjk4ODI3ODIiIG5hbWU9IlBqc3VhQkIiLz4KKwk8L3N0b3JhZ2VNb2R1bGU+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KKwkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJjb20ucW54LnRvb2xzLmlkZS5xZGUubWFuYWdlZGJ1aWxkZXIuY29yZS5xY2NTY2FubmVySW5mbyIvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMTM4MTM1MjczNCI+CisJCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5tYW5hZ2VkYnVpbGRlci5jb3JlLnFjY1NjYW5uZXJJbmZvIi8+CisJCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY29tLnFueC5xY2MudG9vbENoYWluLjUzNjQxNzgzIj4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0iY29tLnFueC50b29scy5pZGUucWRlLm1hbmFnZWRidWlsZGVyLmNvcmUucWNjU2Nhbm5lckluZm8iLz4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjb20ucW54LnFjYy50b29sQ2hhaW4uMTM5NzI5MDA5OSI+CisJCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9ImNvbS5xbngudG9vbHMuaWRlLnFkZS5tYW5hZ2VkYnVpbGRlci5jb3JlLnFjY1NjYW5uZXJJbmZvIi8+CisJCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY29tLnFueC5xY2MudG9vbENoYWluLjIwNzk0MDExMDgiPgorCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJjb20ucW54LnRvb2xzLmlkZS5xZGUubWFuYWdlZGJ1aWxkZXIuY29yZS5xY2NTY2FubmVySW5mbyIvPgorCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+CisJPC9zdG9yYWdlTW9kdWxlPgorCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJyZWZyZXNoU2NvcGUiIHZlcnNpb25OdW1iZXI9IjEiPgorCQk8cmVzb3VyY2UgcmVzb3VyY2VUeXBlPSJQUk9KRUNUIiB3b3Jrc3BhY2VQYXRoPSIvUGpzdWFCQiIvPgorCTwvc3RvcmFnZU1vZHVsZT4KKwk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmludGVybmFsLnVpLnRleHQuY29tbWVudE93bmVyUHJvamVjdE1hcHBpbmdzIi8+Cis8L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9NYWtlZmlsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MjIzOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitRTUFLRV9UQVJHRVQgID0gUGpzdWFCQgorUFJPSkVDVF9ESVIJICA6PSAkKGRpciAkKHdvcmQgJCh3b3JkcyAkKE1BS0VGSUxFX0xJU1QpKSwkKE1BS0VGSUxFX0xJU1QpKSkKK0kxOE5fRElSCSAgOj0gJChQUk9KRUNUX0RJUikvdHJhbnNsYXRpb25zCisKK2luY2x1ZGUgbWsvY3MtYmFzZS5taworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL1Bqc3VhQkIucHJvIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9QanN1YUJCLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc2OThmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9QanN1YUJCLnBybwpAQCAtMCwwICsxLDMxIEBACitBUFBfTkFNRSA9IFBqc3VhQkIKKworQ09ORklHICs9IHF0IHdhcm5fb24gY2FzY2FkZXMxMAorCitpbmNsdWRlKGNvbmZpZy5wcmkpCisKK1NPVVJDRVMgKz0gIC4uLy4uL3Bqc3VhX2FwcC5jIFwKKyAgICAgICAgICAgIC4uLy4uL3Bqc3VhX2FwcF9jbGkuYyBcCisgICAgICAgICAgICAuLi8uLi9wanN1YV9hcHBfY29tbW9uLmMgXAorICAgICAgICAgICAgLi4vLi4vcGpzdWFfYXBwX2NvbmZpZy5jIFwKKyAgICAgICAgICAgIC4uLy4uL3Bqc3VhX2FwcF9sZWdhY3kuYworCitkZXZpY2UgeworICAgIENPTkZJRyhkZWJ1ZywgZGVidWd8cmVsZWFzZSkgeworICAgICAgICAjIERldmljZS1EZWJ1ZyBjdXN0b20gY29uZmlndXJhdGlvbgorICAgICAgICBpbmNsdWRlKC4uLy4uLy4uLy4uL3Bqc2lwLnByaSkKKyAgICAgICAgTElCUyArPSAtbGJiCisgICAgfQorCisgICAgQ09ORklHKHJlbGVhc2UsIGRlYnVnfHJlbGVhc2UpIHsKKyAgICAgICAgIyBEZXZpY2UtUmVsZWFzZSBjdXN0b20gY29uZmlndXJhdGlvbgorICAgICAgICBpbmNsdWRlKC4uLy4uLy4uLy4uL3Bqc2lwLnByaSkKKyAgICAgICAgTElCUyArPSAtbGJiCisgICAgfQorfQorCitzaW11bGF0b3IgeworICAgIENPTkZJRyhkZWJ1ZywgZGVidWd8cmVsZWFzZSkgeworICAgICAgICAjIFNpbXVsYXRvci1EZWJ1ZyBjdXN0b20gY29uZmlndXJhdGlvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvYXNzZXRzLy5hc3NldHMuaW5kZXggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2Fzc2V0cy8uYXNzZXRzLmluZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODRkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2Fzc2V0cy8uYXNzZXRzLmluZGV4CkBAIC0wLDAgKzEsNCBAQAorMQorMgorbWFpbi5xbWwKK2ltYWdlcy90ZWx1dS1sb2dvLnBuZwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9hc3NldHMvaW1hZ2VzL3RlbHV1LWxvZ28ucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9hc3NldHMvaW1hZ2VzL3RlbHV1LWxvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmFkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2Fzc2V0cy9pbWFnZXMvdGVsdXUtbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9hc3NldHMvbWFpbi5xbWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2Fzc2V0cy9tYWluLnFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzNmN2YzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9hc3NldHMvbWFpbi5xbWwKQEAgLTAsMCArMSw0MSBAQAorLy8gRGVmYXVsdCBlbXB0eSBwcm9qZWN0IHRlbXBsYXRlCitpbXBvcnQgYmIuY2FzY2FkZXMgMS4wCisKKy8vIGNyZWF0ZXMgb25lIHBhZ2Ugd2l0aCBhIGxhYmVsCitQYWdlIHsKKyAgICBDb250YWluZXIgeworICAgICAgICBsYXlvdXQ6IFN0YWNrTGF5b3V0IHsKKyAgICAgICAgfQorICAgICAgICBiYWNrZ3JvdW5kOiBDb2xvci5CbGFjaworICAgICAgICBMYWJlbCB7CisgICAgICAgICAgICB0ZXh0OiBxc1RyKCIiKQorICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIKKyAgICAgICAgfQorICAgICAgICBJbWFnZVZpZXcgeworICAgICAgICAgICAgaW1hZ2VTb3VyY2U6ICJhc3NldDovLy9pbWFnZXMvdGVsdXUtbG9nby5wbmciCisgICAgICAgICAgICB0b3BNYXJnaW46IDIwMAorICAgICAgICAgICAgcHJlZmVycmVkV2lkdGg6IDUwMAorICAgICAgICAgICAgcHJlZmVycmVkSGVpZ2h0OiA1MDAKKyAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiBWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXIKKyAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyCisgICAgICAgIH0KKyAgICAgICAgTGFiZWwgeworICAgICAgICAgICAgdGV4dDogcXNUcigicGpzdWEgQkIxMCIpCisgICAgICAgICAgICB0ZXh0U3R5bGUuYmFzZTogU3lzdGVtRGVmYXVsdHMuVGV4dFN0eWxlcy5CaWdUZXh0CisgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcgorICAgICAgICAgICAgdGV4dFN0eWxlIHsKKyAgICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuV2hpdGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMYWJlbCB7CisgICAgICAgICAgICBvYmplY3ROYW1lOiAidGVsbmV0TXNnIgorICAgICAgICAgICAgdGV4dDogcXNUcigiU3RhcnRpbmcuLiIpCisgICAgICAgICAgICB0b3BNYXJnaW46IDIwMAorICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIKKyAgICAgICAgICAgIHRleHRTdHlsZSB7CisgICAgICAgICAgICAgICAgY29sb3I6IENvbG9yLldoaXRlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvYmFyLWRlc2NyaXB0b3IueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9iYXItZGVzY3JpcHRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvYmFyLWRlc2NyaXB0b3IueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhLS0KKyAgCisgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIDIwMTMgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuCisgIAorICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgCistLT4KKzxxbnggeG1sbnM9Imh0dHA6Ly93d3cucW54LmNvbS9zY2hlbWFzL2FwcGxpY2F0aW9uLzEuMCI+CisKKzwhLS0gQmxhY2tCZXJyeSBUYWJsZXQgT1MgYXBwbGljYXRpb24gZGVzY3JpcHRvciBmaWxlLgorCisgICAgU3BlY2lmaWVzIHBhcmFtZXRlcnMgZm9yIGlkZW50aWZ5aW5nLCBpbnN0YWxsaW5nLCBhbmQgbGF1bmNoaW5nIG5hdGl2ZSBhcHBsaWNhdGlvbnMgb24gQmxhY2tCZXJyeSBUYWJsZXQgT1MuCisKKy0tPgorCisgICAgPCEtLSBBIHVuaXZlcnNhbGx5IHVuaXF1ZSBhcHBsaWNhdGlvbiBpZGVudGlmaWVyLiBNdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIEJsYWNrQmVycnkgVGFibGV0IE9TIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgIFVzaW5nIGEgcmV2ZXJzZSBETlMtc3R5bGUgbmFtZSBhcyB0aGUgaWQgaXMgcmVjb21tZW5kZWQuIChFZy4gY29tLmV4YW1wbGUuRXhhbXBsZUFwcGxpY2F0aW9uLikgUmVxdWlyZWQuIC0tPgorICAgIDxpZD5jb20uZXhhbXBsZS5QanN1YUJCPC9pZD4KKworICAgIDwhLS0gVGhlIG5hbWUgdGhhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIEJsYWNrQmVycnkgVGFibGV0IE9TIGFwcGxpY2F0aW9uIGluc3RhbGxlci4gCisgICAgICAgICBNYXkgaGF2ZSBtdWx0aXBsZSB2YWx1ZXMgZm9yIGVhY2ggbGFuZ3VhZ2UuIFNlZSBzYW1wbGVzIG9yIHhzZCBzY2hlbWEgZmlsZS4gT3B0aW9uYWwuIC0tPgorICAgIDxuYW1lPlBqc3VhQkI8L25hbWU+CisgICAgCisgICAgPCEtLSBBIHN0cmluZyB2YWx1ZSBvZiB0aGUgZm9ybWF0IDwwLTk5OT4uPDAtOTk5Pi48MC05OTk+IHRoYXQgcmVwcmVzZW50cyBhcHBsaWNhdGlvbiB2ZXJzaW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciBhcHBsaWNhdGlvbiB1cGdyYWRlLiAKKyAgICAgICAgIFZhbHVlcyBjYW4gYWxzbyBiZSAxLXBhcnQgb3IgMi1wYXJ0LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgYSAzLXBhcnQgdmFsdWUuCisgICAgICAgICBBbiB1cGRhdGVkIHZlcnNpb24gb2YgYXBwbGljYXRpb24gbXVzdCBoYXZlIGEgdmVyc2lvbk51bWJlciB2YWx1ZSBoaWdoZXIgdGhhbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4gUmVxdWlyZWQuIC0tPgorICAgIDx2ZXJzaW9uTnVtYmVyPjEuMC4wPC92ZXJzaW9uTnVtYmVyPgorCisgICAgPCEtLSBGb3VydGggZGlnaXQgc2VnbWVudCBvZiB0aGUgcGFja2FnZSB2ZXJzaW9uLiBGaXJzdCB0aHJlZSBzZWdtZW50cyBhcmUgdGFrZW4gZnJvbSB0aGUgCisgICAgICAgICA8dmVyc2lvbk51bWJlcj4gZWxlbWVudC4gIE11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDAgdG8gMl4xNi0xIC0tPgorICAgIDxidWlsZElkPjE8L2J1aWxkSWQ+CisgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gQSBzdHJpbmcgdmFsdWUgKHN1Y2ggYXMgInYxIiwgIjIuNSIsIG9yICJBbHBoYSAxIikgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiwgYXMgaXQgc2hvdWxkIGJlIHNob3duIHRvIHVzZXJzLiBPcHRpb25hbC4gLS0+CisgICAgPCEtLSA8dmVyc2lvbkxhYmVsPjwvdmVyc2lvbkxhYmVsPiAtLT4KKworICAgIDwhLS0gRGVzY3JpcHRpb24sIGRpc3BsYXllZCBpbiB0aGUgQmxhY2tCZXJyeSBUYWJsZXQgT1MgYXBwbGljYXRpb24gaW5zdGFsbGVyLgorICAgICAgICAgTWF5IGhhdmUgbXVsdGlwbGUgdmFsdWVzIGZvciBlYWNoIGxhbmd1YWdlLiBTZWUgc2FtcGxlcyBvciB4c2Qgc2NoZW1hIGZpbGUuIE9wdGlvbmFsLiAtLT4KKyAgICA8ZGVzY3JpcHRpb24+VGVsdXUgTHRkLiBwanN1YSBEZW1vIEFwcDwvZGVzY3JpcHRpb24+CisKKyAgICA8IS0tIENvcHlyaWdodCBpbmZvcm1hdGlvbi4gT3B0aW9uYWwuIC0tPgorICAgIDwhLS0gPGNvcHlyaWdodD48L2NvcHlyaWdodD4gLS0+CisKKyAgICA8IS0tICBOYW1lIG9mIGF1dGhvciB3aGljaCBpcyB1c2VkIGZvciBzaWduaW5nLiBNdXN0IG1hdGNoIHRoZSBkZXZlbG9wZXIgbmFtZSBvZiB5b3VyIGRldmVsb3BtZW50IGNlcnRpZmljYXRlLiAtLT4KKyAgICA8YXV0aG9yPlRlbHV1IEx0ZC48L2F1dGhvcj4KKyAgICAKKyAgICA8IS0tICBVbmlxdWUgYXV0aG9yIElEIGFzc2lnbmVkIGJ5IHNpZ25pbmcgYXV0aG9yaXR5LiBSZXF1aXJlZCBpZiB1c2luZyBkZWJ1ZyB0b2tlbnMuIC0tPgorICAgIDwhLS0gPGF1dGhvcklkPkFCQzEyMzRZanNuVWsyMzVoPC9hdXRob3JJZD4gLS0+CisgICAKKyAgICA8aW5pdGlhbFdpbmRvdz4KKyAgICAgICAgPGF1dG9PcmllbnRzPnRydWU8L2F1dG9PcmllbnRzPgorICAgICAgICA8c3lzdGVtQ2hyb21lPm5vbmU8L3N5c3RlbUNocm9tZT4KKyAgICAgICAgPHRyYW5zcGFyZW50PmZhbHNlPC90cmFuc3BhcmVudD4KKyAgICA8L2luaXRpYWxXaW5kb3c+CisgICAgCisgICAgPCEtLSAgVGhlIGNhdGVnb3J5IHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzLiBFaXRoZXIgY29yZS5nYW1lcyBvciBjb3JlLm1lZGlhLiAtLT4KKyAgICA8Y2F0ZWdvcnk+Y29yZS5tZWRpYTwvY2F0ZWdvcnk+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iRGV2aWNlLURlYnVnIj4KKyAgICAgICA8cGxhdGZvcm1BcmNoaXRlY3R1cmU+YXJtbGUtdjc8L3BsYXRmb3JtQXJjaGl0ZWN0dXJlPgorICAgICAgIDxhc3NldCBwYXRoPSJhcm0vby5sZS12Ny1nL1Bqc3VhQkIiIGVudHJ5PSJ0cnVlIiB0eXBlPSJRbngvRWxmIj5QanN1YUJCPC9hc3NldD4KKyAgICAgICA8YXNzZXQgcGF0aD0iL2hvbWUvYmVubnlscC9EZXNrdG9wL29wdC9iYjEwL2xpYi9saWJvcGVuY29yZS1hbXJuYi5zby4wIiB0eXBlPSJRbngvRWxmIj5saWIvbGlib3BlbmNvcmUtYW1ybmIuc28uMDwvYXNzZXQ+CisgICAgICAgPGFzc2V0IHBhdGg9Ii9ob21lL2Jlbm55bHAvRGVza3RvcC9vcHQvYmIxMC9saWIvbGlib3BlbmNvcmUtYW1yd2Iuc28uMCIgdHlwZT0iUW54L0VsZiI+bGliL2xpYm9wZW5jb3JlLWFtcndiLnNvLjA8L2Fzc2V0PgorICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8Y29uZmlndXJhdGlvbiBuYW1lPSJEZXZpY2UtUmVsZWFzZSI+CisgICAgICAgPGVudHJ5UG9pbnRUeXBlPlFueC9DYXNjYWRlczwvZW50cnlQb2ludFR5cGU+CisgICAgICAgPHBsYXRmb3JtQXJjaGl0ZWN0dXJlPmFybWxlLXY3PC9wbGF0Zm9ybUFyY2hpdGVjdHVyZT4KKyAgICAgICA8YXNzZXQgcGF0aD0iYXJtL28ubGUtdjcvUGpzdWFCQi5zbyIgZW50cnk9InRydWUiIHR5cGU9IlFueC9FbGYiPlBqc3VhQkIuc288L2Fzc2V0PgorICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8Y29uZmlndXJhdGlvbiBuYW1lPSJEZXZpY2UtUHJvZmlsZSI+CisgICAgICAgPHBsYXRmb3JtQXJjaGl0ZWN0dXJlPmFybWxlLXY3PC9wbGF0Zm9ybUFyY2hpdGVjdHVyZT4KKyAgICAgICA8YXNzZXQgcGF0aD0iYXJtLXAvby5sZS12Ny1nL1Bqc3VhQkIiIGVudHJ5PSJ0cnVlIiB0eXBlPSJRbngvRWxmIj5QanN1YUJCPC9hc3NldD4KKyAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgPGNvbmZpZ3VyYXRpb24gbmFtZT0iU2ltdWxhdG9yLURlYnVnIj4KKyAgICAgICA8cGxhdGZvcm1BcmNoaXRlY3R1cmU+eDg2PC9wbGF0Zm9ybUFyY2hpdGVjdHVyZT4KKyAgICAgICA8YXNzZXQgcGF0aD0ieDg2L28tZy9QanN1YUJCIiBlbnRyeT0idHJ1ZSIgdHlwZT0iUW54L0VsZiI+UGpzdWFCQjwvYXNzZXQ+CisgICAgPC9jb25maWd1cmF0aW9uPgorICAgIAorICAgIDwhLS0gIFRoZSBpY29uIGZvciB0aGUgYXBwbGljYXRpb24gLS0+CisgICAgPGljb24+CisgICAgICAgIDxpbWFnZT5pY29uLnBuZzwvaW1hZ2U+CisgICAgPC9pY29uPgorCisgICAgPGFzc2V0IHBhdGg9Imljb24ucG5nIj5pY29uLnBuZzwvYXNzZXQ+CisgICAgPGFzc2V0IHBhdGg9ImFzc2V0cyI+YXNzZXRzPC9hc3NldD4KKyAgICAKKyAgICA8IS0tIExvY2FsZSBzdXBwb3J0IC0tPgorICAgIAorICAgIDwhLS0gUmVxdWVzdCBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgbmF0aXZlIGNvZGUuICBSZXF1aXJlZCBmb3IgbmF0aXZlIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPHBlcm1pc3Npb24gc3lzdGVtPSJ0cnVlIj5ydW5fbmF0aXZlPC9wZXJtaXNzaW9uPgorICAgIDxwZXJtaXNzaW9uPmFjY2Vzc19pbnRlcm5ldDwvcGVybWlzc2lvbj4KKyAgICA8cGVybWlzc2lvbj5yZWNvcmRfYXVkaW88L3Blcm1pc3Npb24+CisgICAgPHBlcm1pc3Npb24+cnVuX3doZW5fYmFja2dyb3VuZGVkPC9wZXJtaXNzaW9uPgorICAgIDxlbnYgdmFyPSJMRF9MSUJSQVJZX1BBVEgiIHZhbHVlPSJhcHAvbmF0aXZlL2xpYjovdXNyL2xpYi9xdDQvbGliIi8+CisKKzwvcW54PgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9jb25maWcucHJpIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9jb25maWcucHJpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODBhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2NvbmZpZy5wcmkKQEAgLTAsMCArMSw1MiBAQAorIyBBdXRvLWdlbmVyYXRlZCBieSBJREUuIEFueSBjaGFuZ2VzIG1hZGUgYnkgdXNlciB3aWxsIGJlIGxvc3QhCitCQVNFRElSID0gICQkcXVvdGUoJCRfUFJPX0ZJTEVfUFdEXykKKworZGV2aWNlIHsKKyAgICBDT05GSUcoZGVidWcsIGRlYnVnfHJlbGVhc2UpIHsKKyAgICAgICAgU09VUkNFUyArPSAgJCRxdW90ZSgkJEJBU0VESVIvc3JjL2FwcGxpY2F0aW9udWkuY3BwKSBcCisgICAgICAgICAgICAgICAgICQkcXVvdGUoJCRCQVNFRElSL3NyYy9tYWluLmNwcCkKKworICAgICAgICBIRUFERVJTICs9ICAkJHF1b3RlKCQkQkFTRURJUi9zcmMvYXBwbGljYXRpb251aS5oKQorICAgIH0KKworICAgIENPTkZJRyhyZWxlYXNlLCBkZWJ1Z3xyZWxlYXNlKSB7CisgICAgICAgIFNPVVJDRVMgKz0gICQkcXVvdGUoJCRCQVNFRElSL3NyYy9hcHBsaWNhdGlvbnVpLmNwcCkgXAorICAgICAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi9zcmMvbWFpbi5jcHApCisKKyAgICAgICAgSEVBREVSUyArPSAgJCRxdW90ZSgkJEJBU0VESVIvc3JjL2FwcGxpY2F0aW9udWkuaCkKKyAgICB9Cit9CisKK3NpbXVsYXRvciB7CisgICAgQ09ORklHKGRlYnVnLCBkZWJ1Z3xyZWxlYXNlKSB7CisgICAgICAgIFNPVVJDRVMgKz0gICQkcXVvdGUoJCRCQVNFRElSL3NyYy9hcHBsaWNhdGlvbnVpLmNwcCkgXAorICAgICAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi9zcmMvbWFpbi5jcHApCisKKyAgICAgICAgSEVBREVSUyArPSAgJCRxdW90ZSgkJEJBU0VESVIvc3JjL2FwcGxpY2F0aW9udWkuaCkKKyAgICB9Cit9CisKK0lOQ0xVREVQQVRIICs9ICAkJHF1b3RlKCQkQkFTRURJUi9zcmMpCisKK0NPTkZJRyArPSBwcmVjb21waWxlX2hlYWRlcgorCitQUkVDT01QSUxFRF9IRUFERVIgPSAgJCRxdW90ZSgkJEJBU0VESVIvcHJlY29tcGlsZWQuaCkKKworbHVwZGF0ZV9pbmNsdXNpb24geworICAgIFNPVVJDRVMgKz0gICQkcXVvdGUoJCRCQVNFRElSLy4uL3NyYy8qLmMpIFwKKyAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi8uLi9zcmMvKi5jKyspIFwKKyAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi8uLi9zcmMvKi5jYykgXAorICAgICAgICAgICAgICQkcXVvdGUoJCRCQVNFRElSLy4uL3NyYy8qLmNwcCkgXAorICAgICAgICAgICAgICQkcXVvdGUoJCRCQVNFRElSLy4uL3NyYy8qLmN4eCkgXAorICAgICAgICAgICAgICQkcXVvdGUoJCRCQVNFRElSLy4uL2Fzc2V0cy8qLnFtbCkgXAorICAgICAgICAgICAgICQkcXVvdGUoJCRCQVNFRElSLy4uL2Fzc2V0cy8qLmpzKSBcCisgICAgICAgICAgICAgJCRxdW90ZSgkJEJBU0VESVIvLi4vYXNzZXRzLyoucXMpCisKKyAgICBIRUFERVJTICs9ICAkJHF1b3RlKCQkQkFTRURJUi8uLi9zcmMvKi5oKSBcCisgICAgICAgICAgICAgJCRxdW90ZSgkJEJBU0VESVIvLi4vc3JjLyouaCsrKSBcCisgICAgICAgICAgICAgJCRxdW90ZSgkJEJBU0VESVIvLi4vc3JjLyouaGgpIFwKKyAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi8uLi9zcmMvKi5ocHApIFwKKyAgICAgICAgICAgICAkJHF1b3RlKCQkQkFTRURJUi8uLi9zcmMvKi5oeHgpCit9CisKK1RSQU5TTEFUSU9OUyA9ICAkJHF1b3RlKCQke1RBUkdFVH0udHMpCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL2ljb24ucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI2ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3ByZWNvbXBpbGVkLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3ByZWNvbXBpbGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxM2RjNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvcHJlY29tcGlsZWQuaApAQCAtMCwwICsxLDIgQEAKKy8vIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHN0b3JlIHByZWNvbXBpbGVkIGhlYWRlcnMuCisvLyBJdCBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuIEl0IGlzIHVwIHRvIHlvdSB0byBkZWNpZGUgd2hpY2ggaGVhZGVycyBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZS4gCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3NyYy9hcHBsaWNhdGlvbnVpLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvc3JjL2FwcGxpY2F0aW9udWkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzBkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3NyYy9hcHBsaWNhdGlvbnVpLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLy8gRGVmYXVsdCBlbXB0eSBwcm9qZWN0IHRlbXBsYXRlCisjaW5jbHVkZSAiYXBwbGljYXRpb251aS5oIgorCisjaW5jbHVkZSA8YmIvY2FzY2FkZXMvQXBwbGljYXRpb24+CisjaW5jbHVkZSA8YmIvY2FzY2FkZXMvUW1sRG9jdW1lbnQ+CisjaW5jbHVkZSA8YmIvY2FzY2FkZXMvQWJzdHJhY3RQYW5lPgorI2luY2x1ZGUgPGJiL2Nhc2NhZGVzL0xhYmVsPgorCisjZGVmaW5lIFRISVNfRklMRQkiYXBwbGljYXRpb251aS5jcHAiCisKK3VzaW5nIG5hbWVzcGFjZSBiYjo6Y2FzY2FkZXM7CisKKy8qIGFwcFVJIHNpbmdsZXRvbiAqLworQXBwbGljYXRpb25VSSAqQXBwbGljYXRpb25VSTo6aW5zdGFuY2VfOworCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwX2NvbmZpZy5oIgorCit2b2lkIEFwcGxpY2F0aW9uVUk6OmV4dERpc3BsYXlNc2coY29uc3QgY2hhciAqbXNnKQoreworICAgIC8qIFF0J3Mgd2F5IHRvIGludm9rZSBtZXRob2QgZnJvbSAiZm9yZWlnbiIgdGhyZWFkICovCisgICAgUU1ldGFPYmplY3Q6Omludm9rZU1ldGhvZCgoUU9iamVjdCopQXBwbGljYXRpb25VSTo6aW5zdGFuY2UoKSwKKwkJCSAgICAgICJkaXNwbGF5TXNnIiwgUXQ6OkF1dG9Db25uZWN0aW9uLAorCQkJICAgICAgUV9BUkcoUVN0cmluZyxtc2cpKTsKK30KKworCit2b2lkIEFwcGxpY2F0aW9uVUk6OnBqc3VhT25TdGFydGVkQ2IocGpfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiAoIW1zZyB8fCAhKm1zZykpIHsKKwlwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCVBKX0xPRygzLChUSElTX0ZJTEUsICJFcnJvcjogJXMiLCBlcnJtc2cpKTsKKwltc2cgPSBlcnJtc2c7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiU3RhcnRlZDogJXMiLCBtc2cpKTsKKyAgICB9CisKKyAgICBBcHBsaWNhdGlvblVJOjpleHREaXNwbGF5TXNnKG1zZyk7Cit9CisKKwordm9pZCBBcHBsaWNhdGlvblVJOjpwanN1YU9uU3RvcHBlZENiKHBqX2Jvb2xfdCByZXN0YXJ0LAorCQkJCSAgICAgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIFBKX0xPRygzLCgiaXBqc3VhIiwgIkNMSSAlcyByZXF1ZXN0IiwgKHJlc3RhcnQ/ICJyZXN0YXJ0IiA6ICJzaHV0ZG93biIpKSk7CisgICAgaWYgKHJlc3RhcnQpIHsKKwlBcHBsaWNhdGlvblVJOjpleHREaXNwbGF5TXNnKCJSZXN0YXJ0aW5nLi4iKTsKKwlwal90aHJlYWRfc2xlZXAoMTAwKTsKKwlBcHBsaWNhdGlvblVJOjppbnN0YW5jZSgpLT5leHRSZXN0YXJ0UmVxdWVzdChhcmdjLCBhcmd2KTsKKyAgICB9IGVsc2UgeworCUFwcGxpY2F0aW9uVUk6OmV4dERpc3BsYXlNc2coIlNodXR0aW5nIGRvd24uLiIpOworCXBqX3RocmVhZF9zbGVlcCgxMDApOworCUFwcGxpY2F0aW9uVUk6Omluc3RhbmNlKCktPmlzU2h1dHRpbmdEb3duID0gdHJ1ZTsKKworCWJiOjpjYXNjYWRlczo6QXBwbGljYXRpb24gKmFwcCA9IGJiOjpjYXNjYWRlczo6QXBwbGljYXRpb246Omluc3RhbmNlKCk7CisJYXBwLT5xdWl0KCk7CisgICAgfQorfQorCisKK3ZvaWQgQXBwbGljYXRpb25VSTo6cGpzdWFPbkFwcENvbmZpZ0NiKHBqc3VhX2FwcF9jb25maWcgKmNmZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGNmZyk7Cit9CisKKwordm9pZCBBcHBsaWNhdGlvblVJOjpleHRSZXN0YXJ0UmVxdWVzdChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgcmVzdGFydEFyZ2MgPSBhcmdjOworICAgIHJlc3RhcnRBcmd2ID0gYXJndjsKKyAgICBRTWV0YU9iamVjdDo6aW52b2tlTWV0aG9kKChRT2JqZWN0Kil0aGlzLCAicmVzdGFydFBqc3VhIiwKKwkJCSAgICAgIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKK30KKworCit2b2lkIEFwcGxpY2F0aW9uVUk6OnBqc3VhU3RhcnQoKQoreworICAgIC8vIFRPRE86IHJlYWQgZnJvbSBjb25maWc/CisgICAgY29uc3QgY2hhciAqKmFyZ3YgPSBwanN1YV9hcHBfZGVmX2FyZ3Y7CisgICAgaW50IGFyZ2MgPSBQSl9BUlJBWV9TSVpFKHBqc3VhX2FwcF9kZWZfYXJndikgLTE7CisgICAgcGpzdWFfYXBwX2NmZ190IGFwcF9jZmc7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaXNTaHV0dGluZ0Rvd24gPSBmYWxzZTsKKyAgICBkaXNwbGF5TXNnKCJTdGFydGluZy4uIik7CisKKyAgICBwal9iemVybygmYXBwX2NmZywgc2l6ZW9mKGFwcF9jZmcpKTsKKyAgICBpZiAocmVzdGFydEFyZ2MpIHsKKwlhcHBfY2ZnLmFyZ2MgPSByZXN0YXJ0QXJnYzsKKwlhcHBfY2ZnLmFyZ3YgPSByZXN0YXJ0QXJndjsKKyAgICB9IGVsc2UgeworCWFwcF9jZmcuYXJnYyA9IGFyZ2M7CisJYXBwX2NmZy5hcmd2ID0gKGNoYXIqKilhcmd2OworICAgIH0KKyAgICBhcHBfY2ZnLm9uX3N0YXJ0ZWQgPSAmcGpzdWFPblN0YXJ0ZWRDYjsKKyAgICBhcHBfY2ZnLm9uX3N0b3BwZWQgPSAmcGpzdWFPblN0b3BwZWRDYjsKKyAgICBhcHBfY2ZnLm9uX2NvbmZpZ19pbml0ID0gJnBqc3VhT25BcHBDb25maWdDYjsKKworICAgIHN0YXR1cyA9IHBqc3VhX2FwcF9pbml0KCZhcHBfY2ZnKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwljaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCXBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisJZGlzcGxheU1zZyhRU3RyaW5nKCJJbml0IGVycm9yOiIpICsgZXJybXNnKTsKKwlwanN1YV9hcHBfZGVzdHJveSgpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9hcHBfcnVuKFBKX0ZBTFNFKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwljaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCXBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisJZGlzcGxheU1zZyhRU3RyaW5nKCJFcnJvcjoiKSArIGVycm1zZyk7CisJcGpzdWFfYXBwX2Rlc3Ryb3koKTsKKyAgICB9CisKKyAgICByZXN0YXJ0QXJndiA9IE5VTEw7CisgICAgcmVzdGFydEFyZ2MgPSAwOworfQorCit2b2lkIEFwcGxpY2F0aW9uVUk6OnBqc3VhRGVzdHJveSgpCit7CisgICAgcGpzdWFfYXBwX2Rlc3Ryb3koKTsKK30KKworCitBcHBsaWNhdGlvblVJOjpBcHBsaWNhdGlvblVJKGJiOjpjYXNjYWRlczo6QXBwbGljYXRpb24gKmFwcCkKKzogUU9iamVjdChhcHApLCBpc1NodXR0aW5nRG93bihmYWxzZSksIHJlc3RhcnRBcmd2KE5VTEwpLCByZXN0YXJ0QXJnYygwKQoreworICAgIGluc3RhbmNlXyA9IHRoaXM7CisKKyAgICBRbWxEb2N1bWVudCAqcW1sID0gUW1sRG9jdW1lbnQ6OmNyZWF0ZSgiYXNzZXQ6Ly8vbWFpbi5xbWwiKS5wYXJlbnQodGhpcyk7CisgICAgQWJzdHJhY3RQYW5lICpyb290ID0gcW1sLT5jcmVhdGVSb290T2JqZWN0PEFic3RyYWN0UGFuZT4oKTsKKyAgICBhcHAtPnNldFNjZW5lKHJvb3QpOworCisgICAgYXBwLT5zZXRBdXRvRXhpdCh0cnVlKTsKKyAgICBjb25uZWN0KGFwcCwgU0lHTkFMKGFib3V0VG9RdWl0KCkpLCB0aGlzLCBTTE9UKGFib3V0VG9RdWl0KCkpKTsKKworICAgIHBqc3VhU3RhcnQoKTsKK30KKworCitBcHBsaWNhdGlvblVJOjp+QXBwbGljYXRpb25VSSgpCit7CisgICAgaW5zdGFuY2VfID0gTlVMTDsKK30KKworCitBcHBsaWNhdGlvblVJKiBBcHBsaWNhdGlvblVJOjppbnN0YW5jZSgpCit7CisgICAgcmV0dXJuIGluc3RhbmNlXzsKK30KKworCit2b2lkIEFwcGxpY2F0aW9uVUk6OmFib3V0VG9RdWl0KCkKK3sKKyAgICBpZiAoIWlzU2h1dHRpbmdEb3duKSB7CisJaXNTaHV0dGluZ0Rvd24gPSB0cnVlOworCVBKX0xPRygzLChUSElTX0ZJTEUsICJRdWl0IHNpZ25hbCBmcm9tIEdVSSwgc2h1dHRpbmcgZG93biBwanN1YS4uIikpOworCXBqc3VhRGVzdHJveSgpOworICAgIH0KK30KKworCit2b2lkIEFwcGxpY2F0aW9uVUk6OmRpc3BsYXlNc2coY29uc3QgUVN0cmluZyAmbXNnKQoreworICAgIGJiOjpjYXNjYWRlczo6QXBwbGljYXRpb24gKmFwcCA9IGJiOjpjYXNjYWRlczo6QXBwbGljYXRpb246Omluc3RhbmNlKCk7CisgICAgTGFiZWwgKnRlbG5ldE1zZyA9IGFwcC0+c2NlbmUoKS0+ZmluZENoaWxkPExhYmVsKj4oInRlbG5ldE1zZyIpOworICAgIGlmICh0ZWxuZXRNc2cpIHsKKwl0ZWxuZXRNc2ctPnNldFRleHQobXNnKTsKKyAgICB9Cit9CisKKwordm9pZCBBcHBsaWNhdGlvblVJOjpyZXN0YXJ0UGpzdWEoKQoreworICAgIHBqc3VhRGVzdHJveSgpOworICAgIHBqc3VhU3RhcnQoKTsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvc3JjL2FwcGxpY2F0aW9udWkuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvc3JjL2FwcGxpY2F0aW9udWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBhMjVlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9zcmMvYXBwbGljYXRpb251aS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIERlZmF1bHQgZW1wdHkgcHJvamVjdCB0ZW1wbGF0ZQorI2lmbmRlZiBBcHBsaWNhdGlvblVJX0hQUF8KKyNkZWZpbmUgQXBwbGljYXRpb25VSV9IUFBfCisKKyNpbmNsdWRlIDxRT2JqZWN0PgorCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwLmgiCisKK25hbWVzcGFjZSBiYiB7IG5hbWVzcGFjZSBjYXNjYWRlcyB7IGNsYXNzIEFwcGxpY2F0aW9uOyB9fQorCisvKiEKKyAqIEBicmllZiBBcHBsaWNhdGlvbiBwYW5lIG9iamVjdAorICoKKyAqVXNlIHRoaXMgb2JqZWN0IHRvIGNyZWF0ZSBhbmQgaW5pdCBhcHAgVUksIHRvIGNyZWF0ZSBjb250ZXh0IG9iamVjdHMsIHRvIHJlZ2lzdGVyIHRoZSBuZXcgbWV0YSB0eXBlcyBldGMuCisgKi8KK2NsYXNzIEFwcGxpY2F0aW9uVUkgOiBwdWJsaWMgUU9iamVjdAoreworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgQXBwbGljYXRpb25VSShiYjo6Y2FzY2FkZXM6OkFwcGxpY2F0aW9uICphcHApOworICAgIHZpcnR1YWwgfkFwcGxpY2F0aW9uVUkoKTsKKworICAgIGJvb2wgaXNTaHV0dGluZ0Rvd247CisgICAgc3RhdGljIEFwcGxpY2F0aW9uVUkgKmluc3RhbmNlKCk7CisKKyAgICAvKiBXcml0ZSBtc2cgdG8gbGFiZWwgKGZyb20gZGlmZmVyZW50IHRocmVhZCkgKi8KKyAgICBzdGF0aWMgdm9pZCBleHREaXNwbGF5TXNnKGNvbnN0IGNoYXIgKm1zZyk7CisKKyAgICAvKiBSZXN0YXJ0IHJlcXVlc3QgKGZyb20gZGlmZmVyZW50IHRocmVhZCkgKi8KKyAgICB2b2lkIGV4dFJlc3RhcnRSZXF1ZXN0KGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK3B1YmxpYyBzbG90czoKKyAgICB2b2lkIGFib3V0VG9RdWl0KCk7CisKKyAgICBRX0lOVk9LQUJMRSB2b2lkIHJlc3RhcnRQanN1YSgpOworICAgIFFfSU5WT0tBQkxFIHZvaWQgZGlzcGxheU1zZyhjb25zdCBRU3RyaW5nICZtc2cpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBBcHBsaWNhdGlvblVJICppbnN0YW5jZV87CisgICAgY2hhciAqKnJlc3RhcnRBcmd2OworICAgIGludCByZXN0YXJ0QXJnYzsKKworICAgIC8qIHBqc3VhIG1haW4gb3BlcmF0aW9ucyAqLworICAgIHZvaWQgcGpzdWFTdGFydCgpOworICAgIHZvaWQgcGpzdWFEZXN0cm95KCk7CisKKyAgICAvKiBwanN1YSBhcHAgY2FsbGJhY2tzICovCisgICAgc3RhdGljIHZvaWQgcGpzdWFPblN0YXJ0ZWRDYihwal9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CisgICAgc3RhdGljIHZvaWQgcGpzdWFPblN0b3BwZWRDYihwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKKyAgICBzdGF0aWMgdm9pZCBwanN1YU9uQXBwQ29uZmlnQ2IocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKTsKK307CisKKworI2VuZGlmIC8qIEFwcGxpY2F0aW9uVUlfSFBQXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9zcmMvbWFpbi5jcHAgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3NyYy9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJhNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC9zcmMvbWFpbi5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gRGVmYXVsdCBlbXB0eSBwcm9qZWN0IHRlbXBsYXRlCisjaW5jbHVkZSA8YmIvY2FzY2FkZXMvQXBwbGljYXRpb24+CisKKyNpbmNsdWRlIDxRTG9jYWxlPgorI2luY2x1ZGUgPFFUcmFuc2xhdG9yPgorI2luY2x1ZGUgImFwcGxpY2F0aW9udWkuaCIKKworLy8gaW5jbHVkZSBKUyBEZWJ1Z2dlciAvIENTIFByb2ZpbGVyIGVuYWJsZXIKKy8vIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gdGhlIGRlYnVnIGJ1aWxkIG9ubHkKKyNpbmNsdWRlIDxRdC9xZGVjbGFyYXRpdmVkZWJ1Zy5oPgorCit1c2luZyBuYW1lc3BhY2UgYmI6OmNhc2NhZGVzOworCitRX0RFQ0xfRVhQT1JUIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAvLyB0aGlzIGlzIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBldGMKKyAgICBBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisKKyAgICAvLyBsb2NhbGl6YXRpb24gc3VwcG9ydAorICAgIFFUcmFuc2xhdG9yIHRyYW5zbGF0b3I7CisgICAgUVN0cmluZyBsb2NhbGVfc3RyaW5nID0gUUxvY2FsZSgpLm5hbWUoKTsKKyAgICBRU3RyaW5nIGZpbGVuYW1lID0gUVN0cmluZyggIlBqc3VhQkJfJTEiICkuYXJnKCBsb2NhbGVfc3RyaW5nICk7CisgICAgaWYgKHRyYW5zbGF0b3IubG9hZChmaWxlbmFtZSwgImFwcC9uYXRpdmUvcW0iKSkgeworICAgICAgICBhcHAuaW5zdGFsbFRyYW5zbGF0b3IoICZ0cmFuc2xhdG9yICk7CisgICAgfQorCisgICAgbmV3IEFwcGxpY2F0aW9uVUkoJmFwcCk7CisKKyAgICAvLyB3ZSBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gc3RhcnRlZCBpbiB0aGUgYXBwIGNvbnN0cnVjdG9yIGFuZCBzdGFydCB0aGUgY2xpZW50IGV2ZW50IGxvb3AgaGVyZQorICAgIHJldHVybiBBcHBsaWNhdGlvbjo6ZXhlYygpOworICAgIC8vIHdoZW4gbG9vcCBpcyBleGl0ZWQgdGhlIEFwcGxpY2F0aW9uIGRlbGV0ZXMgdGhlIHNjZW5lIHdoaWNoIGRlbGV0ZXMgYWxsIGl0cyBjaGlsZHJlbiAocGVyIHF0IHJ1bGVzIGZvciBjaGlsZHJlbikKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvdHJhbnNsYXRpb25zL01ha2VmaWxlIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvYmIxMC90cmFuc2xhdGlvbnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmZDk3YwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvdHJhbnNsYXRpb25zL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKK1FNQUtFX1RBUkdFVCAgPSBQanN1YUJCCitMVVBEQVRFICAgICAgID0gJChRTlhfSE9TVCkvdXNyL2Jpbi9sdXBkYXRlCitMUkVMRUFTRSAgICAgID0gJChRTlhfSE9TVCkvdXNyL2Jpbi9scmVsZWFzZQorCit1cGRhdGU6ICQoUU1BS0VfVEFSR0VUKS5wcm8gRk9SQ0UKKwkkKExVUERBVEUpICQoUU1BS0VfVEFSR0VUKS5wcm8KKworcmVsZWFzZTogJChRTUFLRV9UQVJHRVQpLnBybyAkKFFNQUtFX1RBUkdFVCkudHMKKwkkKExSRUxFQVNFKSAkKFFNQUtFX1RBUkdFVCkucHJvCisKK0ZPUkNFOgorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3RyYW5zbGF0aW9ucy9QanN1YUJCLnBybyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvdHJhbnNsYXRpb25zL1Bqc3VhQkIucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmN2M2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3RyYW5zbGF0aW9ucy9QanN1YUJCLnBybwpAQCAtMCwwICsxIEBACitpbmNsdWRlICguLi9QanN1YUJCLnBybykKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2JiMTAvdHJhbnNsYXRpb25zL1Bqc3VhQkIudHMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3RyYW5zbGF0aW9ucy9QanN1YUJCLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzUzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9iYjEwL3RyYW5zbGF0aW9ucy9QanN1YUJCLnRzCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgVFM+Cis8VFMgdmVyc2lvbj0iMi4wIj4KKzxjb250ZXh0PgorICAgIDxuYW1lPm1haW48L25hbWU+CisgICAgPG1lc3NhZ2U+CisgICAgICAgIDxsb2NhdGlvbiBmaWxlbmFtZT0iLi4vYXNzZXRzL21haW4ucW1sIiBsaW5lPSIxMSIvPgorICAgICAgICA8c291cmNlPjwvc291cmNlPgorICAgICAgICA8dHJhbnNsYXRpb24+PC90cmFuc2xhdGlvbj4KKyAgICA8L21lc3NhZ2U+CisgICAgPG1lc3NhZ2U+CisgICAgICAgIDxsb2NhdGlvbiBmaWxlbmFtZT0iLi4vYXNzZXRzL21haW4ucW1sIiBsaW5lPSIyMyIvPgorICAgICAgICA8c291cmNlPnBqc3VhIEJCMTA8L3NvdXJjZT4KKyAgICAgICAgPHRyYW5zbGF0aW9uIHR5cGU9InVuZmluaXNoZWQiPjwvdHJhbnNsYXRpb24+CisgICAgPC9tZXNzYWdlPgorICAgIDxtZXNzYWdlPgorICAgICAgICA8bG9jYXRpb24gZmlsZW5hbWU9Ii4uL2Fzc2V0cy9tYWluLnFtbCIgbGluZT0iMzIiLz4KKyAgICAgICAgPHNvdXJjZT5TdGFydGluZy4uPC9zb3VyY2U+CisgICAgICAgIDx0cmFuc2xhdGlvbiB0eXBlPSJ1bmZpbmlzaGVkIj48L3RyYW5zbGF0aW9uPgorICAgIDwvbWVzc2FnZT4KKzwvY29udGV4dD4KKzwvVFM+CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9ndWkuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2d1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWQxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9ndWkuaApAQCAtMCwwICsxLDM5IEBACisvKiAkSWQ6IGd1aS5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX0dVSV9IX18KKyNkZWZpbmUgX19HVUlfSF9fCisKK1BKX0JFR0lOX0RFQ0wKKworI2lmZGVmIFVTRV9HVUkKKworI2RlZmluZSBwcmludGYgc2hvd01zZworI2RlZmluZSBwdXRzKHN0cikgc2hvd01zZygiJXNcbiIsIHN0cikKKyNkZWZpbmUgZmdldHMgZ2V0SW5wdXQKKwordm9pZCBzaG93TXNnKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2NoYXIgKiBnZXRJbnB1dChjaGFyICpzLCBpbnQgbiwgRklMRSAqc3RyZWFtKTsKK3BqX2Jvb2xfdCBzaG93Tm90aWZpY2F0aW9uKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCk7CisKKyNlbmRpZgorCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX0dVSV9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZiMGJkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsNDkxIEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gNDY7CisJb2JqZWN0cyA9IHsKKworLyogQmVnaW4gUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKwkJM0E5MjA2OEYxNkYxREU3MTAwRDQ5Rjk2IC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTkyMDY4RTE2RjFERTcxMDBENDlGOTYgLyogQXVkaW9Ub29sYm94LmZyYW1ld29yayAqLzsgfTsKKwkJM0E5MjA2OTMxNkYxREVBNTAwRDQ5Rjk2IC8qIENGTmV0d29yay5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQTkyMDY5MjE2RjFERUE1MDBENDlGOTYgLyogQ0ZOZXR3b3JrLmZyYW1ld29yayAqLzsgfTsKKwkJM0FEQ0NEMTcxNzE1MzM4RDAwMDdCRThFIC8qIHBqc3VhLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FEQ0NEMTYxNzE1MzM4RDAwMDdCRThFIC8qIHBqc3VhLnBuZyAqLzsgfTsKKwkJM0FEQ0NEMkQxNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9jbGkuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRENDRDI4MTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfY2xpLmMgKi87IH07CisJCTNBRENDRDJFMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfY29tbW9uLmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQURDQ0QyOTE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2NvbW1vbi5jICovOyB9OworCQkzQURDQ0QyRjE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2NvbmZpZy5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FEQ0NEMkExNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9jb25maWcuYyAqLzsgfTsKKwkJM0FEQ0NEMzAxNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9sZWdhY3kuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRENDRDJCMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfbGVnYWN5LmMgKi87IH07CisJCTNBRENDRDMxMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHAuYyBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRENDRDJDMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHAuYyAqLzsgfTsKKwkJM0FERkNDRkQxODAzQjAwNjAwQjBBMDk3IC8qIEFWRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQURGQ0NGQzE4MDNCMDA2MDBCMEEwOTcgLyogQVZGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJM0FGMDU4MDkxNkYwNTA3NzAwNDZCODM1IC8qIFVJS2l0LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODA4MTZGMDUwNzcwMDQ2QjgzNSAvKiBVSUtpdC5mcmFtZXdvcmsgKi87IH07CisJCTNBRjA1ODBCMTZGMDUwNzcwMDQ2QjgzNSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODBBMTZGMDUwNzcwMDQ2QjgzNSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJM0FGMDU4MEQxNkYwNTA3NzAwNDZCODM1IC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgwQzE2RjA1MDc3MDA0NkI4MzUgLyogQ29yZUdyYXBoaWNzLmZyYW1ld29yayAqLzsgfTsKKwkJM0FGMDU4MTMxNkYwNTA3ODAwNDZCODM1IC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgxMTE2RjA1MDc4MDA0NkI4MzUgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi87IH07CisJCTNBRjA1ODE1MTZGMDUwNzgwMDQ2QjgzNSAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgxNDE2RjA1MDc4MDA0NkI4MzUgLyogbWFpbi5tICovOyB9OworCQkzQUYwNTgxOTE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhQXBwRGVsZWdhdGUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODE4MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFBcHBEZWxlZ2F0ZS5tICovOyB9OworCQkzQUYwNTgxQjE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdC5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODFBMTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWZhdWx0LnBuZyAqLzsgfTsKKwkJM0FGMDU4MUQxNkYwNTA3ODAwNDZCODM1IC8qIERlZmF1bHRAMngucG5nIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgxQzE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdEAyeC5wbmcgKi87IH07CisJCTNBRjA1ODFGMTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWZhdWx0LTU2OGhAMngucG5nIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgxRTE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdC01NjhoQDJ4LnBuZyAqLzsgfTsKKwkJM0FGMDU4MjIxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YVZpZXdDb250cm9sbGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgyMTE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhVmlld0NvbnRyb2xsZXIubSAqLzsgfTsKKwkJM0FGMDU4MjUxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YVZpZXdDb250cm9sbGVyX2lQaG9uZS54aWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODIzMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlcl9pUGhvbmUueGliICovOyB9OworCQkzQUYwNTgyODE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBhZC54aWIgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODI2MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlcl9pUGFkLnhpYiAqLzsgfTsKKwkJM0FGMDU4MzcxNkYwNTc3NDAwNDZCODM1IC8qIGxpYnBqLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgzNjE2RjA1Nzc0MDA0NkI4MzUgLyogbGlicGotYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4MzkxNkYwNTc4OTAwNDZCODM1IC8qIGxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODM4MTZGMDU3ODkwMDQ2QjgzNSAvKiBsaWJwamxpYi11dGlsLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODNGMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgzQTE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQUYwNTg0MDE2RjA1N0IzMDA0NkI4MzUgLyogbGlicGptZWRpYS1hdWRpb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FGMDU4M0IxNkYwNTdCMjAwNDZCODM1IC8qIGxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NDExNkYwNTdCMzAwNDZCODM1IC8qIGxpYnBqbWVkaWEtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODNDMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODQyMTZGMDU3QjMwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLXZpZGVvZGV2LWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTgzRDE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS12aWRlb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQUYwNTg0MzE2RjA1N0IzMDA0NkI4MzUgLyogbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODNFMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwanNkcC1hcm0tYXBwbGUtZGFyd2luOS5hICovOyB9OworCQkzQUYwNTg0NTE2RjA1N0QzMDA0NkI4MzUgLyogbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg0NDE2RjA1N0QzMDA0NkI4MzUgLyogbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODRBMTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FGMDU4NDYxNkYwNTdGNzAwNDZCODM1IC8qIGxpYnBqc2lwLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODRCMTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODQ3MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NEMxNkYwNTdGNzAwNDZCODM1IC8qIGxpYnBqc2lwLXVhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg0ODE2RjA1N0Y3MDA0NkI4MzUgLyogbGlicGpzaXAtdWEtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NEQxNkYwNTdGNzAwNDZCODM1IC8qIGxpYnBqc3VhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg0OTE2RjA1N0Y3MDA0NkI4MzUgLyogbGlicGpzdWEtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NTUxNkYwNTgyOTAwNDZCODM1IC8qIGxpYmc3MjIxY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODRFMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJnNzIyMWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODU2MTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gM0FGMDU4NEYxNkYwNTgyOTAwNDZCODM1IC8qIGxpYmdzbWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisJCTNBRjA1ODU3MTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODUwMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NTgxNkYwNTgyOTAwNDZCODM1IC8qIGxpYm1pbGVuYWdlLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg1MTE2RjA1ODI5MDA0NkI4MzUgLyogbGlibWlsZW5hZ2UtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NTkxNkYwNTgyOTAwNDZCODM1IC8qIGxpYnJlc2FtcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg1MjE2RjA1ODI5MDA0NkI4MzUgLyogbGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NUExNkYwNTgyOTAwNDZCODM1IC8qIGxpYnNwZWV4LWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzQUYwNTg1MzE2RjA1ODI5MDA0NkI4MzUgLyogbGlic3BlZXgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLzsgfTsKKwkJM0FGMDU4NUIxNkYwNTgyOTAwNDZCODM1IC8qIGxpYnNydHAtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDNBRjA1ODU0MTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJzcnRwLWFybS1hcHBsZS1kYXJ3aW45LmEgKi87IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTNBOTIwNjhFMTZGMURFNzEwMEQ0OUY5NiAvKiBBdWRpb1Rvb2xib3guZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBBdWRpb1Rvb2xib3guZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BdWRpb1Rvb2xib3guZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJM0E5MjA2OTIxNkYxREVBNTAwRDQ5Rjk2IC8qIENGTmV0d29yay5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENGTmV0d29yay5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NGTmV0d29yay5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkzQURDQ0QxNjE3MTUzMzhEMDAwN0JFOEUgLyogcGpzdWEucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5nOyBwYXRoID0gcGpzdWEucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQURDQ0QyODE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2NsaS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwanN1YV9hcHBfY2xpLmM7IHBhdGggPSAuLi8uLi9wanN1YV9hcHBfY2xpLmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRENDRDI5MTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfY29tbW9uLmMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuYzsgbmFtZSA9IHBqc3VhX2FwcF9jb21tb24uYzsgcGF0aCA9IC4uLy4uL3Bqc3VhX2FwcF9jb21tb24uYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FEQ0NEMkExNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9jb25maWcuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcGpzdWFfYXBwX2NvbmZpZy5jOyBwYXRoID0gLi4vLi4vcGpzdWFfYXBwX2NvbmZpZy5jOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQURDQ0QyQjE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2xlZ2FjeS5jICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmM7IG5hbWUgPSBwanN1YV9hcHBfbGVnYWN5LmM7IHBhdGggPSAuLi8uLi9wanN1YV9hcHBfbGVnYWN5LmM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRENDRDJDMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHAuYyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5jOyBuYW1lID0gcGpzdWFfYXBwLmM7IHBhdGggPSAuLi8uLi9wanN1YV9hcHAuYzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FERkNDRkMxODAzQjAwNjAwQjBBMDk3IC8qIEFWRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFWRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FWRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkzQUYwNTgwNDE2RjA1MDc3MDA0NkI4MzUgLyogaXBqc3VhLmFwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5hcHBsaWNhdGlvbjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gaXBqc3VhLmFwcDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJM0FGMDU4MDgxNkYwNTA3NzAwNDZCODM1IC8qIFVJS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gVUlLaXQuZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9VSUtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkzQUYwNTgwQTE2RjA1MDc3MDA0NkI4MzUgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNES1JPT1Q7IH07CisJCTNBRjA1ODBDMTZGMDUwNzcwMDQ2QjgzNSAvKiBDb3JlR3JhcGhpY3MuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb3JlR3JhcGhpY3MuZnJhbWV3b3JrOyBwYXRoID0gU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db3JlR3JhcGhpY3MuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJM0FGMDU4MTAxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YS1JbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSAiaXBqc3VhLUluZm8ucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgxMjE2RjA1MDc4MDA0NkI4MzUgLyogZW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBlbjsgcGF0aCA9IGVuLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgxNDE2RjA1MDc4MDA0NkI4MzUgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODE2MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWEtUHJlZml4LnBjaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gImlwanN1YS1QcmVmaXgucGNoIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MTcxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YUFwcERlbGVnYXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGlwanN1YUFwcERlbGVnYXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODE4MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFBcHBEZWxlZ2F0ZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBpcGpzdWFBcHBEZWxlZ2F0ZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgxQTE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdC5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBEZWZhdWx0LnBuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MUMxNkYwNTA3ODAwNDZCODM1IC8qIERlZmF1bHRAMngucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5nOyBwYXRoID0gIkRlZmF1bHRAMngucG5nIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MUUxNkYwNTA3ODAwNDZCODM1IC8qIERlZmF1bHQtNTY4aEAyeC5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSAiRGVmYXVsdC01NjhoQDJ4LnBuZyI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODIwMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBpcGpzdWFWaWV3Q29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgyMTE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhVmlld0NvbnRyb2xsZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gaXBqc3VhVmlld0NvbnRyb2xsZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MjQxNkYwNTA3ODAwNDZCODM1IC8qIGVuICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gZmlsZS54aWI7IG5hbWUgPSBlbjsgcGF0aCA9IGVuLmxwcm9qL2lwanN1YVZpZXdDb250cm9sbGVyX2lQaG9uZS54aWI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODI3MTZGMDUwNzgwMDQ2QjgzNSAvKiBlbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGZpbGUueGliOyBuYW1lID0gZW47IHBhdGggPSBlbi5scHJvai9pcGpzdWFWaWV3Q29udHJvbGxlcl9pUGFkLnhpYjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MzYxNkYwNTc3NDAwNDZCODM1IC8qIGxpYnBqLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uLy4uL3BqbGliL2xpYi9saWJwai1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4MzgxNkYwNTc4OTAwNDZCODM1IC8qIGxpYnBqbGliLXV0aWwtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGpsaWItdXRpbC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wamxpYi11dGlsL2xpYi9saWJwamxpYi11dGlsLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgzQTE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwam1lZGlhLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uLy4uL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODNCMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLWF1ZGlvZGV2LWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vLi4vcGptZWRpYS9saWIvbGlicGptZWRpYS1hdWRpb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4M0MxNkYwNTdCMjAwNDZCODM1IC8qIGxpYnBqbWVkaWEtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGptZWRpYS1jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wam1lZGlhL2xpYi9saWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkzQUYwNTgzRDE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS12aWRlb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwam1lZGlhLXZpZGVvZGV2LWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uLy4uL3BqbWVkaWEvbGliL2xpYnBqbWVkaWEtdmlkZW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODNFMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwanNkcC1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwanNkcC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wam1lZGlhL2xpYi9saWJwanNkcC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJM0FGMDU4NDQxNkYwNTdEMzAwNDZCODM1IC8qIGxpYnBqbmF0aC1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vLi4vcGpuYXRoL2xpYi9saWJwam5hdGgtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODQ2MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODQ3MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGlicGpzaXAtc2ltcGxlLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uLy4uL3Bqc2lwL2xpYi9saWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODQ4MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wanNpcC9saWIvbGlicGpzaXAtdWEtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODQ5MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanN1YS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJwanN1YS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi9wanNpcC9saWIvbGlicGpzdWEtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODRFMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJnNzIyMWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYmc3MjIxY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliL2xpYmc3MjIxY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODRGMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9saWIvbGliZ3NtY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODUwMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGFyY2hpdmUuYXI7IG5hbWUgPSAibGliaWxiY2NvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEiOyBwYXRoID0gIi4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYi9saWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODUxMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJtaWxlbmFnZS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJtaWxlbmFnZS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9saWIvbGlibWlsZW5hZ2UtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODUyMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJyZXNhbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJyZXNhbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9saWIvbGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODUzMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJzcGVleC1hcm0tYXBwbGUtZGFyd2luOS5hICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gYXJjaGl2ZS5hcjsgbmFtZSA9ICJsaWJzcGVleC1hcm0tYXBwbGUtZGFyd2luOS5hIjsgcGF0aCA9ICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9saWIvbGlic3BlZXgtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTNBRjA1ODU0MTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJzcnRwLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBhcmNoaXZlLmFyOyBuYW1lID0gImxpYnNydHAtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHBhdGggPSAiLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliL2xpYnNydHAtYXJtLWFwcGxlLWRhcndpbjkuYSI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0FGMDU4MDExNkYwNTA3NzAwNDZCODM1IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkzQURGQ0NGRDE4MDNCMDA2MDBCMEEwOTcgLyogQVZGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBOTIwNjkzMTZGMURFQTUwMEQ0OUY5NiAvKiBDRk5ldHdvcmsuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0E5MjA2OEYxNkYxREU3MTAwRDQ5Rjk2IC8qIEF1ZGlvVG9vbGJveC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTgwOTE2RjA1MDc3MDA0NkI4MzUgLyogVUlLaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4MEIxNkYwNTA3NzAwNDZCODM1IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4MEQxNkYwNTA3NzAwNDZCODM1IC8qIENvcmVHcmFwaGljcy5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTgzNzE2RjA1Nzc0MDA0NkI4MzUgLyogbGlicGotYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODM5MTZGMDU3ODkwMDQ2QjgzNSAvKiBsaWJwamxpYi11dGlsLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTgzRjE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4NDAxNkYwNTdCMzAwNDZCODM1IC8qIGxpYnBqbWVkaWEtYXVkaW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODQxMTZGMDU3QjMwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg0MjE2RjA1N0IzMDA0NkI4MzUgLyogbGlicGptZWRpYS12aWRlb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4NDMxNkYwNTdCMzAwNDZCODM1IC8qIGxpYnBqc2RwLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg0NTE2RjA1N0QzMDA0NkI4MzUgLyogbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg0QTE2RjA1N0Y3MDA0NkI4MzUgLyogbGlicGpzaXAtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODRCMTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODRDMTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC11YS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4NEQxNkYwNTdGNzAwNDZCODM1IC8qIGxpYnBqc3VhLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg1NTE2RjA1ODI5MDA0NkI4MzUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4NTYxNkYwNTgyOTAwNDZCODM1IC8qIGxpYmdzbWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg1NzE2RjA1ODI5MDA0NkI4MzUgLyogbGliaWxiY2NvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg1ODE2RjA1ODI5MDA0NkI4MzUgLyogbGlibWlsZW5hZ2UtYXJtLWFwcGxlLWRhcndpbjkuYSBpbiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODU5MTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJyZXNhbXBsZS1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkJM0FGMDU4NUExNkYwNTgyOTAwNDZCODM1IC8qIGxpYnNwZWV4LWFybS1hcHBsZS1kYXJ3aW45LmEgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTg1QjE2RjA1ODI5MDA0NkI4MzUgLyogbGlic3J0cC1hcm0tYXBwbGUtZGFyd2luOS5hIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhHcm91cCBzZWN0aW9uICovCisJCTNBOTIwNjhEMTZGMUQxQTEwMEQ0OUY5NiAvKiBwanN1YSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0FEQ0NEMjgxNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9jbGkuYyAqLywKKwkJCQkzQURDQ0QyOTE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2NvbW1vbi5jICovLAorCQkJCTNBRENDRDJBMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfY29uZmlnLmMgKi8sCisJCQkJM0FEQ0NEMkIxNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9sZWdhY3kuYyAqLywKKwkJCQkzQURDQ0QyQzE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwLmMgKi8sCisJCQkpOworCQkJbmFtZSA9IHBqc3VhOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJM0FGMDU3RjkxNkYwNTA3NzAwNDZCODM1ID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUYwNTgwRTE2RjA1MDc3MDA0NkI4MzUgLyogaXBqc3VhICovLAorCQkJCTNBRjA1ODA3MTZGMDUwNzcwMDQ2QjgzNSAvKiBGcmFtZXdvcmtzICovLAorCQkJCTNBRjA1ODA1MTZGMDUwNzcwMDQ2QjgzNSAvKiBQcm9kdWN0cyAqLywKKwkJCQkzQUYwNTgzNTE2RjA1NkNDMDA0NkI4MzUgLyogTGlicmFyaWVzICovLAorCQkJKTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTNBRjA1ODA1MTZGMDUwNzcwMDQ2QjgzNSAvKiBQcm9kdWN0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0FGMDU4MDQxNkYwNTA3NzAwNDZCODM1IC8qIGlwanN1YS5hcHAgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJM0FGMDU4MDcxNkYwNTA3NzAwNDZCODM1IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNBREZDQ0ZDMTgwM0IwMDYwMEIwQTA5NyAvKiBBVkZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJCTNBOTIwNjkyMTZGMURFQTUwMEQ0OUY5NiAvKiBDRk5ldHdvcmsuZnJhbWV3b3JrICovLAorCQkJCTNBOTIwNjhFMTZGMURFNzEwMEQ0OUY5NiAvKiBBdWRpb1Rvb2xib3guZnJhbWV3b3JrICovLAorCQkJCTNBRjA1ODA4MTZGMDUwNzcwMDQ2QjgzNSAvKiBVSUtpdC5mcmFtZXdvcmsgKi8sCisJCQkJM0FGMDU4MEExNkYwNTA3NzAwNDZCODM1IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJCTNBRjA1ODBDMTZGMDUwNzcwMDQ2QjgzNSAvKiBDb3JlR3JhcGhpY3MuZnJhbWV3b3JrICovLAorCQkJKTsKKwkJCW5hbWUgPSBGcmFtZXdvcmtzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJM0FGMDU4MEUxNkYwNTA3NzAwNDZCODM1IC8qIGlwanN1YSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJM0E5MjA2OEQxNkYxRDFBMTAwRDQ5Rjk2IC8qIHBqc3VhICovLAorCQkJCTNBRjA1ODE3MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFBcHBEZWxlZ2F0ZS5oICovLAorCQkJCTNBRjA1ODE4MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFBcHBEZWxlZ2F0ZS5tICovLAorCQkJCTNBRjA1ODIwMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlci5oICovLAorCQkJCTNBRjA1ODIxMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlci5tICovLAorCQkJCTNBRjA1ODIzMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlcl9pUGhvbmUueGliICovLAorCQkJCTNBRjA1ODI2MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlcl9pUGFkLnhpYiAqLywKKwkJCQkzQUYwNTgwRjE2RjA1MDc4MDA0NkI4MzUgLyogU3VwcG9ydGluZyBGaWxlcyAqLywKKwkJCSk7CisJCQlwYXRoID0gaXBqc3VhOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJM0FGMDU4MEYxNkYwNTA3ODAwNDZCODM1IC8qIFN1cHBvcnRpbmcgRmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTNBRjA1ODEwMTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWEtSW5mby5wbGlzdCAqLywKKwkJCQkzQUYwNTgxMTE2RjA1MDc4MDA0NkI4MzUgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8sCisJCQkJM0FGMDU4MTQxNkYwNTA3ODAwNDZCODM1IC8qIG1haW4ubSAqLywKKwkJCQkzQUYwNTgxNjE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhLVByZWZpeC5wY2ggKi8sCisJCQkJM0FEQ0NEMTYxNzE1MzM4RDAwMDdCRThFIC8qIHBqc3VhLnBuZyAqLywKKwkJCQkzQUYwNTgxQTE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdC5wbmcgKi8sCisJCQkJM0FGMDU4MUMxNkYwNTA3ODAwNDZCODM1IC8qIERlZmF1bHRAMngucG5nICovLAorCQkJCTNBRjA1ODFFMTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWZhdWx0LTU2OGhAMngucG5nICovLAorCQkJKTsKKwkJCW5hbWUgPSAiU3VwcG9ydGluZyBGaWxlcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQUYwNTgzNTE2RjA1NkNDMDA0NkI4MzUgLyogTGlicmFyaWVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUYwNTg0RTE2RjA1ODI5MDA0NkI4MzUgLyogbGliZzcyMjFjb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODRGMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJnc21jb2RlYy1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODUwMTZGMDU4MjkwMDQ2QjgzNSAvKiBsaWJpbGJjY29kZWMtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg1MTE2RjA1ODI5MDA0NkI4MzUgLyogbGlibWlsZW5hZ2UtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg1MjE2RjA1ODI5MDA0NkI4MzUgLyogbGlicmVzYW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg1MzE2RjA1ODI5MDA0NkI4MzUgLyogbGlic3BlZXgtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg1NDE2RjA1ODI5MDA0NkI4MzUgLyogbGlic3J0cC1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODQ2MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODQ3MTZGMDU3RjcwMDQ2QjgzNSAvKiBsaWJwanNpcC1zaW1wbGUtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg0ODE2RjA1N0Y3MDA0NkI4MzUgLyogbGlicGpzaXAtdWEtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg0OTE2RjA1N0Y3MDA0NkI4MzUgLyogbGlicGpzdWEtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTg0NDE2RjA1N0QzMDA0NkI4MzUgLyogbGlicGpuYXRoLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0FGMDU4M0ExNkYwNTdCMjAwNDZCODM1IC8qIGxpYnBqbWVkaWEtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTgzQjE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGptZWRpYS1hdWRpb2Rldi1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODNDMTZGMDU3QjIwMDQ2QjgzNSAvKiBsaWJwam1lZGlhLWNvZGVjLWFybS1hcHBsZS1kYXJ3aW45LmEgKi8sCisJCQkJM0FGMDU4M0QxNkYwNTdCMjAwNDZCODM1IC8qIGxpYnBqbWVkaWEtdmlkZW9kZXYtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTgzRTE2RjA1N0IyMDA0NkI4MzUgLyogbGlicGpzZHAtYXJtLWFwcGxlLWRhcndpbjkuYSAqLywKKwkJCQkzQUYwNTgzODE2RjA1Nzg5MDA0NkI4MzUgLyogbGlicGpsaWItdXRpbC1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJCTNBRjA1ODM2MTZGMDU3NzQwMDQ2QjgzNSAvKiBsaWJwai1hcm0tYXBwbGUtZGFyd2luOS5hICovLAorCQkJKTsKKwkJCW5hbWUgPSBMaWJyYXJpZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKwkJM0FGMDU4MDMxNkYwNTA3NzAwNDZCODM1IC8qIGlwanN1YSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAzQUYwNTgyQjE2RjA1MDc4MDA0NkI4MzUgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImlwanN1YSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkzQUYwNTgwMDE2RjA1MDc3MDA0NkI4MzUgLyogU291cmNlcyAqLywKKwkJCQkzQUYwNTgwMTE2RjA1MDc3MDA0NkI4MzUgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkzQUYwNTgwMjE2RjA1MDc3MDA0NkI4MzUgLyogUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBpcGpzdWE7CisJCQlwcm9kdWN0TmFtZSA9IGlwanN1YTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAzQUYwNTgwNDE2RjA1MDc3MDA0NkI4MzUgLyogaXBqc3VhLmFwcCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYXBwbGljYXRpb24iOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkzQUYwNTdGQjE2RjA1MDc3MDA0NkI4MzUgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYXR0cmlidXRlcyA9IHsKKwkJCQlDTEFTU1BSRUZJWCA9IGlwanN1YTsKKwkJCQlMYXN0VXBncmFkZUNoZWNrID0gMDQ1MDsKKwkJCQlPUkdBTklaQVRJT05OQU1FID0gVGVsdXU7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDNBRjA1N0ZFMTZGMDUwNzcwMDQ2QjgzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImlwanN1YSIgKi87CisJCQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAzLjIiOworCQkJZGV2ZWxvcG1lbnRSZWdpb24gPSBFbmdsaXNoOworCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDA7CisJCQlrbm93blJlZ2lvbnMgPSAoCisJCQkJZW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gM0FGMDU3RjkxNkYwNTA3NzAwNDZCODM1OworCQkJcHJvZHVjdFJlZkdyb3VwID0gM0FGMDU4MDUxNkYwNTA3NzAwNDZCODM1IC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCTNBRjA1ODAzMTZGMDUwNzcwMDQ2QjgzNSAvKiBpcGpzdWEgKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJM0FGMDU4MDIxNkYwNTA3NzAwNDZCODM1IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJM0FGMDU4MTMxNkYwNTA3ODAwNDZCODM1IC8qIEluZm9QbGlzdC5zdHJpbmdzIGluIFJlc291cmNlcyAqLywKKwkJCQkzQUYwNTgxQjE2RjA1MDc4MDA0NkI4MzUgLyogRGVmYXVsdC5wbmcgaW4gUmVzb3VyY2VzICovLAorCQkJCTNBRjA1ODFEMTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWZhdWx0QDJ4LnBuZyBpbiBSZXNvdXJjZXMgKi8sCisJCQkJM0FGMDU4MUYxNkYwNTA3ODAwNDZCODM1IC8qIERlZmF1bHQtNTY4aEAyeC5wbmcgaW4gUmVzb3VyY2VzICovLAorCQkJCTNBRjA1ODI1MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFWaWV3Q29udHJvbGxlcl9pUGhvbmUueGliIGluIFJlc291cmNlcyAqLywKKwkJCQkzQUYwNTgyODE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBhZC54aWIgaW4gUmVzb3VyY2VzICovLAorCQkJCTNBRENDRDE3MTcxNTMzOEQwMDA3QkU4RSAvKiBwanN1YS5wbmcgaW4gUmVzb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTNBRjA1ODAwMTZGMDUwNzcwMDQ2QjgzNSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJM0FGMDU4MTUxNkYwNTA3ODAwNDZCODM1IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTNBRjA1ODE5MTZGMDUwNzgwMDQ2QjgzNSAvKiBpcGpzdWFBcHBEZWxlZ2F0ZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJM0FGMDU4MjIxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YVZpZXdDb250cm9sbGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkzQURDQ0QyRDE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2NsaS5jIGluIFNvdXJjZXMgKi8sCisJCQkJM0FEQ0NEMkUxNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcF9jb21tb24uYyBpbiBTb3VyY2VzICovLAorCQkJCTNBRENDRDJGMTcyRTQwMTIwMDA3QkU4RSAvKiBwanN1YV9hcHBfY29uZmlnLmMgaW4gU291cmNlcyAqLywKKwkJCQkzQURDQ0QzMDE3MkU0MDEyMDAwN0JFOEUgLyogcGpzdWFfYXBwX2xlZ2FjeS5jIGluIFNvdXJjZXMgKi8sCisJCQkJM0FEQ0NEMzExNzJFNDAxMjAwMDdCRThFIC8qIHBqc3VhX2FwcC5jIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCQkzQUYwNTgxMTE2RjA1MDc4MDA0NkI4MzUgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUYwNTgxMjE2RjA1MDc4MDA0NkI4MzUgLyogZW4gKi8sCisJCQkpOworCQkJbmFtZSA9IEluZm9QbGlzdC5zdHJpbmdzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJM0FGMDU4MjMxNkYwNTA3ODAwNDZCODM1IC8qIGlwanN1YVZpZXdDb250cm9sbGVyX2lQaG9uZS54aWIgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUYwNTgyNDE2RjA1MDc4MDA0NkI4MzUgLyogZW4gKi8sCisJCQkpOworCQkJbmFtZSA9IGlwanN1YVZpZXdDb250cm9sbGVyX2lQaG9uZS54aWI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkzQUYwNTgyNjE2RjA1MDc4MDA0NkI4MzUgLyogaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBhZC54aWIgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkzQUYwNTgyNzE2RjA1MDc4MDA0NkI4MzUgLyogZW4gKi8sCisJCQkpOworCQkJbmFtZSA9IGlwanN1YVZpZXdDb250cm9sbGVyX2lQYWQueGliOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTNBRjA1ODI5MTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDTEFOR19DWFhfTEFOR1VBR0VfU1RBTkRBUkQgPSAiZ251KysweCI7CisJCQkJQ0xBTkdfQ1hYX0xJQlJBUlkgPSAibGliYysrIjsKKwkJCQlDTEFOR19FTkFCTEVfT0JKQ19BUkMgPSBZRVM7CisJCQkJQ0xBTkdfV0FSTl9FTVBUWV9CT0RZID0gWUVTOworCQkJCUNMQU5HX1dBUk5fX0RVUExJQ0FURV9NRVRIT0RfTUFUQ0ggPSBZRVM7CisJCQkJIkNPREVfU0lHTl9JREVOVElUWVtzZGs9aXBob25lb3MqXSIgPSAiaVBob25lIERldmVsb3BlciI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICgKKwkJCQkJIkRFQlVHPTEiLAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkpOworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSVBIT05FT1NfREVQTE9ZTUVOVF9UQVJHRVQgPSA2LjA7CisJCQkJU0RLUk9PVCA9IGlwaG9uZW9zOworCQkJCVRBUkdFVEVEX0RFVklDRV9GQU1JTFkgPSAiMSwyIjsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTNBRjA1ODJBMTZGMDUwNzgwMDQ2QjgzNSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNMQU5HX0NYWF9MQU5HVUFHRV9TVEFOREFSRCA9ICJnbnUrKzB4IjsKKwkJCQlDTEFOR19DWFhfTElCUkFSWSA9ICJsaWJjKysiOworCQkJCUNMQU5HX0VOQUJMRV9PQkpDX0FSQyA9IFlFUzsKKwkJCQlDTEFOR19XQVJOX0VNUFRZX0JPRFkgPSBZRVM7CisJCQkJQ0xBTkdfV0FSTl9fRFVQTElDQVRFX01FVEhPRF9NQVRDSCA9IFlFUzsKKwkJCQkiQ09ERV9TSUdOX0lERU5USVRZW3Nkaz1pcGhvbmVvcypdIiA9ICJpUGhvbmUgRGV2ZWxvcGVyIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSVBIT05FT1NfREVQTE9ZTUVOVF9UQVJHRVQgPSA2LjA7CisJCQkJT1RIRVJfQ0ZMQUdTID0gIi1ETlNfQkxPQ0tfQVNTRVJUSU9OUz0xIjsKKwkJCQlTREtST09UID0gaXBob25lb3M7CisJCQkJVEFSR0VURURfREVWSUNFX0ZBTUlMWSA9ICIxLDIiOworCQkJCVZBTElEQVRFX1BST0RVQ1QgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTNBRjA1ODJDMTZGMDUwNzgwMDQ2QjgzNSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gImlwanN1YS9pcGpzdWEtUHJlZml4LnBjaCI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICgKKwkJCQkJIkRFQlVHPTEiLAorCQkJCQkiUEpfQVVUT0NPTkY9MSIsCisJCQkJCVVTRV9HVUksCisJCQkJKTsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkuLi8uLi8uLi8uLi9wanNpcC9pbmNsdWRlLAorCQkJCQkuLi8uLi8uLi8uLi9wamxpYi9pbmNsdWRlLAorCQkJCQkiLi4vLi4vLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlIiwKKwkJCQkJLi4vLi4vLi4vLi4vcGpuYXRoL2luY2x1ZGUsCisJCQkJCS4uLy4uLy4uLy4uL3BqbWVkaWEvaW5jbHVkZSwKKwkJCQkJLi4sCisJCQkJKTsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJpcGpzdWEvaXBqc3VhLUluZm8ucGxpc3QiOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gKAorCQkJCQkiJChpbmhlcml0ZWQpIiwKKwkJCQkJIlwiJChTUkNST09UKVwiIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi8uLi9wamxpYi9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vcGpsaWItdXRpbC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vcGptZWRpYS9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vcGpuYXRoL2xpYlwiIiwKKwkJCQkJIlwiJChTUkNST09UKS8uLi8uLi8uLi8uLi9wanNpcC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvbGliXCIiLAorCQkJCSk7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVZBTElEX0FSQ0hTID0gYXJtdjc7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkzQUYwNTgyRDE2RjA1MDc4MDA0NkI4MzUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gImlwanN1YS9pcGpzdWEtUHJlZml4LnBjaCI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICgKKwkJCQkJIlBKX0FVVE9DT05GPTEiLAorCQkJCQlVU0VfR1VJLAorCQkJCSk7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJLi4vLi4vLi4vLi4vcGpzaXAvaW5jbHVkZSwKKwkJCQkJLi4vLi4vLi4vLi4vcGpsaWIvaW5jbHVkZSwKKwkJCQkJIi4uLy4uLy4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSIsCisJCQkJCS4uLy4uLy4uLy4uL3BqbmF0aC9pbmNsdWRlLAorCQkJCQkuLi8uLi8uLi8uLi9wam1lZGlhL2luY2x1ZGUsCisJCQkJCS4uLAorCQkJCSk7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiaXBqc3VhL2lwanN1YS1JbmZvLnBsaXN0IjsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICgKKwkJCQkJIiQoaW5oZXJpdGVkKSIsCisJCQkJCSJcIiQoU1JDUk9PVClcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vcGpsaWIvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uLy4uL3BqbGliLXV0aWwvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uLy4uL3BqbWVkaWEvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uLy4uL3BqbmF0aC9saWJcIiIsCisJCQkJCSJcIiQoU1JDUk9PVCkvLi4vLi4vLi4vLi4vcGpzaXAvbGliXCIiLAorCQkJCQkiXCIkKFNSQ1JPT1QpLy4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2xpYlwiIiwKKwkJCQkpOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlWQUxJRF9BUkNIUyA9IGFybXY3OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gYXBwOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTNBRjA1N0ZFMTZGMDUwNzcwMDQ2QjgzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgImlwanN1YSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkzQUYwNTgyOTE2RjA1MDc4MDA0NkI4MzUgLyogRGVidWcgKi8sCisJCQkJM0FGMDU4MkExNkYwNTA3ODAwNDZCODM1IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJM0FGMDU4MkIxNkYwNTA3ODAwNDZCODM1IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJpcGpzdWEiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJM0FGMDU4MkMxNkYwNTA3ODAwNDZCODM1IC8qIERlYnVnICovLAorCQkJCTNBRjA1ODJEMTZGMDUwNzgwMDQ2QjgzNSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisvKiBFbmQgWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJfTsKKwlyb290T2JqZWN0ID0gM0FGMDU3RkIxNkYwNTA3NzAwNDZCODM1IC8qIFByb2plY3Qgb2JqZWN0ICovOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9EZWZhdWx0LTU2OGhAMngucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9EZWZhdWx0LTU2OGhAMngucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTFiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL0RlZmF1bHQtNTY4aEAyeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9EZWZhdWx0LnBuZyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvRGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4Y2E2ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvRGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9EZWZhdWx0QDJ4LnBuZyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvRGVmYXVsdEAyeC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViODRjZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvRGVmYXVsdEAyeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3YjI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQEAgLTAsMCArMSwyIEBACisvKiBMb2NhbGl6ZWQgdmVyc2lvbnMgb2YgSW5mby5wbGlzdCBrZXlzICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvZW4ubHByb2ovaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBhZC54aWIgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2VuLmxwcm9qL2lwanN1YVZpZXdDb250cm9sbGVyX2lQYWQueGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTc0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2VuLmxwcm9qL2lwanN1YVZpZXdDb250cm9sbGVyX2lQYWQueGliCkBAIC0wLDAgKzEsMTIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGFyY2hpdmUgdHlwZT0iY29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIzLkNvY29hVG91Y2guaVBhZC5YSUIiIHZlcnNpb249IjguMDAiPgorCTxkYXRhPgorCQk8aW50IGtleT0iSUJEb2N1bWVudC5TeXN0ZW1UYXJnZXQiPjE1MzY8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuU3lzdGVtVmVyc2lvbiI+MTJBMjA2ajwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5JbnRlcmZhY2VCdWlsZGVyVmVyc2lvbiI+MjUxOTwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5BcHBLaXRWZXJzaW9uIj4xMTcyLjE8L3N0cmluZz4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuSElUb29sYm94VmVyc2lvbiI+NjEzLjAwPC9zdHJpbmc+CisJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iSUJEb2N1bWVudC5QbHVnaW5WZXJzaW9ucyI+CisJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJPHN0cmluZyBrZXk9Ik5TLm9iamVjdC4wIj4xODU2PC9zdHJpbmc+CisJCTwvb2JqZWN0PgorCQk8YXJyYXkga2V5PSJJQkRvY3VtZW50LkludGVncmF0ZWRDbGFzc0RlcGVuZGVuY2llcyI+CisJCQk8c3RyaW5nPklCUHJveHlPYmplY3Q8L3N0cmluZz4KKwkJCTxzdHJpbmc+SUJVSVZpZXc8L3N0cmluZz4KKwkJPC9hcnJheT4KKwkJPGFycmF5IGtleT0iSUJEb2N1bWVudC5QbHVnaW5EZXBlbmRlbmNpZXMiPgorCQkJPHN0cmluZz5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJPC9hcnJheT4KKwkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQkRvY3VtZW50Lk1ldGFkYXRhIj4KKwkJCTxzdHJpbmcga2V5PSJOUy5rZXkuMCI+UGx1Z2luRGVwZW5kZW5jeVJlY2FsY3VsYXRpb25WZXJzaW9uPC9zdHJpbmc+CisJCQk8aW50ZWdlciB2YWx1ZT0iMSIga2V5PSJOUy5vYmplY3QuMCIvPgorCQk8L29iamVjdD4KKwkJPGFycmF5IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJJQkRvY3VtZW50LlJvb3RPYmplY3RzIiBpZD0iMTAwMCI+CisJCQk8b2JqZWN0IGNsYXNzPSJJQlByb3h5T2JqZWN0IiBpZD0iODQxMzUxODU2Ij4KKwkJCQk8c3RyaW5nIGtleT0iSUJQcm94aWVkT2JqZWN0SWRlbnRpZmllciI+SUJGaWxlc093bmVyPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9InRhcmdldFJ1bnRpbWVJZGVudGlmaWVyIj5JQklQYWRGcmFtZXdvcms8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJQcm94eU9iamVjdCIgaWQ9IjYwNjcxNDAwMyI+CisJCQkJPHN0cmluZyBrZXk9IklCUHJveGllZE9iamVjdElkZW50aWZpZXIiPklCRmlyc3RSZXNwb25kZXI8L3N0cmluZz4KKwkJCQk8c3RyaW5nIGtleT0idGFyZ2V0UnVudGltZUlkZW50aWZpZXIiPklCSVBhZEZyYW1ld29yazwvc3RyaW5nPgorCQkJPC9vYmplY3Q+CisJCQk8b2JqZWN0IGNsYXNzPSJJQlVJVmlldyIgaWQ9Ijc2NjcyMTkyMyI+CisJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TTmV4dFJlc3BvbmRlciIvPgorCQkJCTxpbnQga2V5PSJOU3ZGbGFncyI+Mjc0PC9pbnQ+CisJCQkJPHN0cmluZyBrZXk9Ik5TRnJhbWUiPnt7MCwgMjB9LCB7NzY4LCAxMDA0fX08L3N0cmluZz4KKwkJCQk8cmVmZXJlbmNlIGtleT0iTlNTdXBlcnZpZXciLz4KKwkJCQk8cmVmZXJlbmNlIGtleT0iTlNXaW5kb3ciLz4KKwkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlCYWNrZ3JvdW5kQ29sb3IiPgorCQkJCQk8aW50IGtleT0iTlNDb2xvclNwYWNlIj4zPC9pbnQ+CisJCQkJCTxieXRlcyBrZXk9Ik5TV2hpdGUiPk1RQTwvYnl0ZXM+CisJCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3JTcGFjZSIga2V5PSJOU0N1c3RvbUNvbG9yU3BhY2UiPgorCQkJCQkJPGludCBrZXk9Ik5TSUQiPjI8L2ludD4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiIGtleT0iSUJVSVNpbXVsYXRlZFN0YXR1c0Jhck1ldHJpY3MiPgorCQkJCQk8aW50IGtleT0iSUJVSVN0YXR1c0JhclN0eWxlIj4yPC9pbnQ+CisJCQkJPC9vYmplY3Q+CisJCQkJPHN0cmluZyBrZXk9InRhcmdldFJ1bnRpbWVJZGVudGlmaWVyIj5JQklQYWRGcmFtZXdvcms8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQk8L2FycmF5PgorCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdENvbnRhaW5lciIga2V5PSJJQkRvY3VtZW50Lk9iamVjdHMiPgorCQkJPGFycmF5IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJjb25uZWN0aW9uUmVjb3JkcyI+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJDb25uZWN0aW9uUmVjb3JkIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDb2NvYVRvdWNoT3V0bGV0Q29ubmVjdGlvbiIga2V5PSJjb25uZWN0aW9uIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJsYWJlbCI+dmlldzwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSI4NDEzNTE4NTYiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI3NjY3MjE5MjMiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjM8L2ludD4KKwkJCQk8L29iamVjdD4KKwkJCTwvYXJyYXk+CisJCQk8b2JqZWN0IGNsYXNzPSJJQk11dGFibGVPcmRlcmVkU2V0IiBrZXk9Im9iamVjdFJlY29yZHMiPgorCQkJCTxhcnJheSBrZXk9Im9yZGVyZWRPYmplY3RzIj4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4wPC9pbnQ+CisJCQkJCQk8YXJyYXkga2V5PSJvYmplY3QiIGlkPSIwIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iY2hpbGRyZW4iIHJlZj0iMTAwMCIvPgorCQkJCQkJPG5pbCBrZXk9InBhcmVudCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4tMTwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI4NDEzNTE4NTYiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQkJPHN0cmluZyBrZXk9Im9iamVjdE5hbWUiPkZpbGUncyBPd25lcjwvc3RyaW5nPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4tMjwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI2MDY3MTQwMDMiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iMCIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4yPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9Ijc2NjcyMTkyMyIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSIwIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvYXJyYXk+CisJCQk8L29iamVjdD4KKwkJCTxkaWN0aW9uYXJ5IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9ImZsYXR0ZW5lZFByb3BlcnRpZXMiPgorCQkJCTxzdHJpbmcga2V5PSItMS5DdXN0b21DbGFzc05hbWUiPmlwanN1YVZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9Ii0xLklCUGx1Z2luRGVwZW5kZW5jeSI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9Ii0yLkN1c3RvbUNsYXNzTmFtZSI+VUlSZXNwb25kZXI8L3N0cmluZz4KKwkJCQk8c3RyaW5nIGtleT0iLTIuSUJQbHVnaW5EZXBlbmRlbmN5Ij5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQk8c3RyaW5nIGtleT0iMi5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJPC9kaWN0aW9uYXJ5PgorCQkJPGRpY3Rpb25hcnkgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0idW5sb2NhbGl6ZWRQcm9wZXJ0aWVzIi8+CisJCQk8bmlsIGtleT0iYWN0aXZlTG9jYWxpemF0aW9uIi8+CisJCQk8ZGljdGlvbmFyeSBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJsb2NhbGl6YXRpb25zIi8+CisJCQk8bmlsIGtleT0ic291cmNlSUQiLz4KKwkJCTxpbnQga2V5PSJtYXhJRCI+MzwvaW50PgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaWJlciIga2V5PSJJQkRvY3VtZW50LkNsYXNzZXMiPgorCQkJPGFycmF5IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJyZWZlcmVuY2VkUGFydGlhbENsYXNzRGVzY3JpcHRpb25zIj4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+aXBqc3VhVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPHN0cmluZyBrZXk9InN1cGVyY2xhc3NOYW1lIj5VSVZpZXdDb250cm9sbGVyPC9zdHJpbmc+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJQcm9qZWN0U291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPi4vQ2xhc3Nlcy9pcGpzdWFWaWV3Q29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJPC9hcnJheT4KKwkJPC9vYmplY3Q+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmxvY2FsaXphdGlvbk1vZGUiPjA8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuVGFyZ2V0UnVudGltZUlkZW50aWZpZXIiPklCSVBhZEZyYW1ld29yazwvc3RyaW5nPgorCQk8Ym9vbCBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVjbGFyZWREZXBlbmRlbmNpZXNUcmFja1N5c3RlbVRhcmdldFZlcnNpb24iPllFUzwvYm9vbD4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQuZGVmYXVsdFByb3BlcnR5QWNjZXNzQ29udHJvbCI+MzwvaW50PgorCQk8Ym9vbCBrZXk9IklCRG9jdW1lbnQuVXNlQXV0b2xheW91dCI+WUVTPC9ib29sPgorCQk8c3RyaW5nIGtleT0iSUJDb2NvYVRvdWNoUGx1Z2luVmVyc2lvbiI+MTg1Njwvc3RyaW5nPgorCTwvZGF0YT4KKzwvYXJjaGl2ZT4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvZW4ubHByb2ovaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBob25lLnhpYiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvZW4ubHByb2ovaXBqc3VhVmlld0NvbnRyb2xsZXJfaVBob25lLnhpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JmMjBkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9lbi5scHJvai9pcGpzdWFWaWV3Q29udHJvbGxlcl9pUGhvbmUueGliCkBAIC0wLDAgKzEsMzY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGFyY2hpdmUgdHlwZT0iY29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIzLkNvY29hVG91Y2guWElCIiB2ZXJzaW9uPSI4LjAwIj4KKwk8ZGF0YT4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQuU3lzdGVtVGFyZ2V0Ij4xNTM2PC9pbnQ+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LlN5c3RlbVZlcnNpb24iPjExRzYzYjwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5JbnRlcmZhY2VCdWlsZGVyVmVyc2lvbiI+Mjg0MDwvc3RyaW5nPgorCQk8c3RyaW5nIGtleT0iSUJEb2N1bWVudC5BcHBLaXRWZXJzaW9uIj4xMTM4LjUxPC9zdHJpbmc+CisJCTxzdHJpbmcga2V5PSJJQkRvY3VtZW50LkhJVG9vbGJveFZlcnNpb24iPjU2OS4wMDwvc3RyaW5nPgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9IklCRG9jdW1lbnQuUGx1Z2luVmVyc2lvbnMiPgorCQkJPHN0cmluZyBrZXk9Ik5TLmtleS4wIj5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCTxzdHJpbmcga2V5PSJOUy5vYmplY3QuMCI+MTkyNjwvc3RyaW5nPgorCQk8L29iamVjdD4KKwkJPGFycmF5IGtleT0iSUJEb2N1bWVudC5JbnRlZ3JhdGVkQ2xhc3NEZXBlbmRlbmNpZXMiPgorCQkJPHN0cmluZz5JQk5TTGF5b3V0Q29uc3RyYWludDwvc3RyaW5nPgorCQkJPHN0cmluZz5JQlByb3h5T2JqZWN0PC9zdHJpbmc+CisJCQk8c3RyaW5nPklCVUlJbWFnZVZpZXc8L3N0cmluZz4KKwkJCTxzdHJpbmc+SUJVSUxhYmVsPC9zdHJpbmc+CisJCQk8c3RyaW5nPklCVUlWaWV3PC9zdHJpbmc+CisJCTwvYXJyYXk+CisJCTxhcnJheSBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVwZW5kZW5jaWVzIj4KKwkJCTxzdHJpbmc+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCTwvYXJyYXk+CisJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iSUJEb2N1bWVudC5NZXRhZGF0YSI+CisJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPlBsdWdpbkRlcGVuZGVuY3lSZWNhbGN1bGF0aW9uVmVyc2lvbjwvc3RyaW5nPgorCQkJPGludGVnZXIgdmFsdWU9IjEiIGtleT0iTlMub2JqZWN0LjAiLz4KKwkJPC9vYmplY3Q+CisJCTxhcnJheSBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iSUJEb2N1bWVudC5Sb290T2JqZWN0cyIgaWQ9IjEwMDAiPgorCQkJPG9iamVjdCBjbGFzcz0iSUJQcm94eU9iamVjdCIgaWQ9IjM3MjQ5MDUzMSI+CisJCQkJPHN0cmluZyBrZXk9IklCUHJveGllZE9iamVjdElkZW50aWZpZXIiPklCRmlsZXNPd25lcjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSJ0YXJnZXRSdW50aW1lSWRlbnRpZmllciI+SUJDb2NvYVRvdWNoRnJhbWV3b3JrPC9zdHJpbmc+CisJCQk8L29iamVjdD4KKwkJCTxvYmplY3QgY2xhc3M9IklCUHJveHlPYmplY3QiIGlkPSI4NDM3NzkxMTciPgorCQkJCTxzdHJpbmcga2V5PSJJQlByb3hpZWRPYmplY3RJZGVudGlmaWVyIj5JQkZpcnN0UmVzcG9uZGVyPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9InRhcmdldFJ1bnRpbWVJZGVudGlmaWVyIj5JQkNvY29hVG91Y2hGcmFtZXdvcms8L3N0cmluZz4KKwkJCTwvb2JqZWN0PgorCQkJPG9iamVjdCBjbGFzcz0iSUJVSVZpZXciIGlkPSI3NzQ1ODU5MzMiPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJOU05leHRSZXNwb25kZXIiLz4KKwkJCQk8aW50IGtleT0iTlN2RmxhZ3MiPjI3NDwvaW50PgorCQkJCTxhcnJheSBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iTlNTdWJ2aWV3cyI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCVUlJbWFnZVZpZXciIGlkPSI0ODE5NzUxMTciPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TTmV4dFJlc3BvbmRlciIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCTxpbnQga2V5PSJOU3ZGbGFncyI+MjkyPC9pbnQ+CisJCQkJCQk8c3RyaW5nIGtleT0iTlNGcmFtZVNpemUiPnszMjAsIDUyOH08L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJOU1N1cGVydmlldyIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJOU1dpbmRvdyIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TTmV4dEtleVZpZXciIHJlZj0iNzc0NjUyODM1Ii8+CisJCQkJCQk8c3RyaW5nIGtleT0iTlNSZXVzZUlkZW50aWZpZXJLZXkiPl9OUzo5PC9zdHJpbmc+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0NvbG9yIiBrZXk9IklCVUlCYWNrZ3JvdW5kQ29sb3IiIGlkPSI1NDgzMzg0MDciPgorCQkJCQkJCTxpbnQga2V5PSJOU0NvbG9yU3BhY2UiPjM8L2ludD4KKwkJCQkJCQk8Ynl0ZXMga2V5PSJOU1doaXRlIj5NQUE8L2J5dGVzPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8aW50IGtleT0iSUJVSUNvbnRlbnRNb2RlIj41PC9pbnQ+CisJCQkJCQk8Ym9vbCBrZXk9IklCVUlVc2VySW50ZXJhY3Rpb25FbmFibGVkIj5OTzwvYm9vbD4KKwkJCQkJCTxzdHJpbmcga2V5PSJ0YXJnZXRSdW50aW1lSWRlbnRpZmllciI+SUJDb2NvYVRvdWNoRnJhbWV3b3JrPC9zdHJpbmc+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0N1c3RvbVJlc291cmNlIiBrZXk9IklCVUlJbWFnZSI+CisJCQkJCQkJPHN0cmluZyBrZXk9Ik5TQ2xhc3NOYW1lIj5OU0ltYWdlPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZyBrZXk9Ik5TUmVzb3VyY2VOYW1lIj5wanN1YS5wbmc8L3N0cmluZz4KKwkJCQkJCTwvb2JqZWN0PgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJVSUxhYmVsIiBpZD0iNzc0NjUyODM1Ij4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJOU05leHRSZXNwb25kZXIiIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCQk8aW50IGtleT0iTlN2RmxhZ3MiPjI5MjwvaW50PgorCQkJCQkJPHN0cmluZyBrZXk9Ik5TRnJhbWUiPnt7MCwgNTI3fSwgezMyOCwgMjF9fTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TU3VwZXJ2aWV3IiByZWY9Ijc3NDU4NTkzMyIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Ik5TV2luZG93Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iTlNOZXh0S2V5VmlldyIvPgorCQkJCQkJPHN0cmluZyBrZXk9Ik5TUmV1c2VJZGVudGlmaWVyS2V5Ij5fTlM6OTwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9IklCVUlCYWNrZ3JvdW5kQ29sb3IiIHJlZj0iNTQ4MzM4NDA3Ii8+CisJCQkJCQk8Ym9vbCBrZXk9IklCVUlPcGFxdWUiPk5PPC9ib29sPgorCQkJCQkJPGJvb2wga2V5PSJJQlVJQ2xpcHNTdWJ2aWV3cyI+WUVTPC9ib29sPgorCQkJCQkJPGludCBrZXk9IklCVUlDb250ZW50TW9kZSI+NzwvaW50PgorCQkJCQkJPGJvb2wga2V5PSJJQlVJVXNlckludGVyYWN0aW9uRW5hYmxlZCI+Tk88L2Jvb2w+CisJCQkJCQk8c3RyaW5nIGtleT0iSUJVSVJlc3RvcmF0aW9uSWRlbnRpZmllciIvPgorCQkJCQkJPHN0cmluZyBrZXk9InRhcmdldFJ1bnRpbWVJZGVudGlmaWVyIj5JQkNvY29hVG91Y2hGcmFtZXdvcms8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJJQlVJVGV4dCI+VGVsbmV0IHRvIElQOlBPUlQ8L3N0cmluZz4KKwkJCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3IiIGtleT0iSUJVSVRleHRDb2xvciI+CisJCQkJCQkJPGludCBrZXk9Ik5TQ29sb3JTcGFjZSI+MTwvaW50PgorCQkJCQkJCTxieXRlcyBrZXk9Ik5TUkdCIj5NU0F4SURFZ01DNDJBQTwvYnl0ZXM+CisJCQkJCQkJPHN0cmluZyBrZXk9IklCVUlDb2xvckNvY29hVG91Y2hLZXlQYXRoIj5saWdodFRleHRDb2xvcjwvc3RyaW5nPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8bmlsIGtleT0iSUJVSUhpZ2hsaWdodGVkQ29sb3IiLz4KKwkJCQkJCTxpbnQga2V5PSJJQlVJQmFzZWxpbmVBZGp1c3RtZW50Ij4wPC9pbnQ+CisJCQkJCQk8aW50IGtleT0iSUJVSVRleHRBbGlnbm1lbnQiPjE8L2ludD4KKwkJCQkJCTxvYmplY3QgY2xhc3M9IklCVUlGb250RGVzY3JpcHRpb24iIGtleT0iSUJVSUZvbnREZXNjcmlwdGlvbiI+CisJCQkJCQkJPGludCBrZXk9InR5cGUiPjE8L2ludD4KKwkJCQkJCQk8ZG91YmxlIGtleT0icG9pbnRTaXplIj4xNzwvZG91YmxlPgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8b2JqZWN0IGNsYXNzPSJOU0ZvbnQiIGtleT0iSUJVSUZvbnQiPgorCQkJCQkJCTxzdHJpbmcga2V5PSJOU05hbWUiPkhlbHZldGljYTwvc3RyaW5nPgorCQkJCQkJCTxkb3VibGUga2V5PSJOU1NpemUiPjE3PC9kb3VibGU+CisJCQkJCQkJPGludCBrZXk9Ik5TZkZsYWdzIj4xNjwvaW50PgorCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8Ym9vbCBrZXk9IklCVUlBZGp1c3RzRm9udFNpemVUb0ZpdCI+Tk88L2Jvb2w+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvYXJyYXk+CisJCQkJPHN0cmluZyBrZXk9Ik5TRnJhbWUiPnt7MCwgMjB9LCB7MzIwLCA1NDh9fTwvc3RyaW5nPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJOU1N1cGVydmlldyIvPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJOU1dpbmRvdyIvPgorCQkJCTxyZWZlcmVuY2Uga2V5PSJOU05leHRLZXlWaWV3IiByZWY9IjQ4MTk3NTExNyIvPgorCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3IiIGtleT0iSUJVSUJhY2tncm91bmRDb2xvciI+CisJCQkJCTxpbnQga2V5PSJOU0NvbG9yU3BhY2UiPjM8L2ludD4KKwkJCQkJPGJ5dGVzIGtleT0iTlNXaGl0ZSI+TUM0M05RQTwvYnl0ZXM+CisJCQkJCTxvYmplY3QgY2xhc3M9Ik5TQ29sb3JTcGFjZSIga2V5PSJOU0N1c3RvbUNvbG9yU3BhY2UiPgorCQkJCQkJPGludCBrZXk9Ik5TSUQiPjI8L2ludD4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9vYmplY3Q+CisJCQkJPGJvb2wga2V5PSJJQlVJQ2xlYXJzQ29udGV4dEJlZm9yZURyYXdpbmciPk5PPC9ib29sPgorCQkJCTxvYmplY3QgY2xhc3M9IklCVUlTaW11bGF0ZWRTdGF0dXNCYXJNZXRyaWNzIiBrZXk9IklCVUlTaW11bGF0ZWRTdGF0dXNCYXJNZXRyaWNzIi8+CisJCQkJPG9iamVjdCBjbGFzcz0iSUJVSVNjcmVlbk1ldHJpY3MiIGtleT0iSUJVSVNpbXVsYXRlZERlc3RpbmF0aW9uTWV0cmljcyI+CisJCQkJCTxzdHJpbmcga2V5PSJJQlVJU2ltdWxhdGVkU2l6ZU1ldHJpY3NDbGFzcyI+SUJVSVNjcmVlbk1ldHJpY3M8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJJQlVJTm9ybWFsaXplZE9yaWVudGF0aW9uVG9TaXplTWFwIj4KKwkJCQkJCTxib29sIGtleT0iRW5jb2RlZFdpdGhYTUxDb2RlciI+WUVTPC9ib29sPgorCQkJCQkJPGFycmF5IGtleT0iZGljdC5zb3J0ZWRLZXlzIj4KKwkJCQkJCQk8aW50ZWdlciB2YWx1ZT0iMSIvPgorCQkJCQkJCTxpbnRlZ2VyIHZhbHVlPSIzIi8+CisJCQkJCQk8L2FycmF5PgorCQkJCQkJPGFycmF5IGtleT0iZGljdC52YWx1ZXMiPgorCQkJCQkJCTxzdHJpbmc+ezMyMCwgNTY4fTwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+ezU2OCwgMzIwfTwvc3RyaW5nPgorCQkJCQkJPC9hcnJheT4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxzdHJpbmcga2V5PSJJQlVJVGFyZ2V0UnVudGltZSI+SUJDb2NvYVRvdWNoRnJhbWV3b3JrPC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJJQlVJRGlzcGxheU5hbWUiPlJldGluYSA0IEZ1bGwgU2NyZWVuPC9zdHJpbmc+CisJCQkJCTxpbnQga2V5PSJJQlVJVHlwZSI+MjwvaW50PgorCQkJCTwvb2JqZWN0PgorCQkJCTxzdHJpbmcga2V5PSJ0YXJnZXRSdW50aW1lSWRlbnRpZmllciI+SUJDb2NvYVRvdWNoRnJhbWV3b3JrPC9zdHJpbmc+CisJCQk8L29iamVjdD4KKwkJPC9hcnJheT4KKwkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RDb250YWluZXIiIGtleT0iSUJEb2N1bWVudC5PYmplY3RzIj4KKwkJCTxhcnJheSBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY29ubmVjdGlvblJlY29yZHMiPgorCQkJCTxvYmplY3QgY2xhc3M9IklCQ29ubmVjdGlvblJlY29yZCI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ29jb2FUb3VjaE91dGxldENvbm5lY3Rpb24iIGtleT0iY29ubmVjdGlvbiI+CisJCQkJCQk8c3RyaW5nIGtleT0ibGFiZWwiPnZpZXc8L3N0cmluZz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJzb3VyY2UiIHJlZj0iMzcyNDkwNTMxIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0iZGVzdGluYXRpb24iIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8aW50IGtleT0iY29ubmVjdGlvbklEIj4zNzwvaW50PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCQ29ubmVjdGlvblJlY29yZCI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ29jb2FUb3VjaE91dGxldENvbm5lY3Rpb24iIGtleT0iY29ubmVjdGlvbiI+CisJCQkJCQk8c3RyaW5nIGtleT0ibGFiZWwiPnRleHRMYWJlbDwvc3RyaW5nPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InNvdXJjZSIgcmVmPSIzNzI0OTA1MzEiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJkZXN0aW5hdGlvbiIgcmVmPSI3NzQ2NTI4MzUiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxpbnQga2V5PSJjb25uZWN0aW9uSUQiPjM4PC9pbnQ+CisJCQkJPC9vYmplY3Q+CisJCQk8L2FycmF5PgorCQkJPG9iamVjdCBjbGFzcz0iSUJNdXRhYmxlT3JkZXJlZFNldCIga2V5PSJvYmplY3RSZWNvcmRzIj4KKwkJCQk8YXJyYXkga2V5PSJvcmRlcmVkT2JqZWN0cyI+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MDwvaW50PgorCQkJCQkJPGFycmF5IGtleT0ib2JqZWN0IiBpZD0iMCIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImNoaWxkcmVuIiByZWY9IjEwMDAiLz4KKwkJCQkJCTxuaWwga2V5PSJwYXJlbnQiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+LTE8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iMzcyNDkwNTMxIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJCTxzdHJpbmcga2V5PSJvYmplY3ROYW1lIj5GaWxlJ3MgT3duZXI8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+LTI8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iODQzNzc5MTE3Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9IjAiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+NjwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCTxhcnJheSBjbGFzcz0iTlNNdXRhYmxlQXJyYXkiIGtleT0iY2hpbGRyZW4iPgorCQkJCQkJCTxvYmplY3QgY2xhc3M9IklCTlNMYXlvdXRDb25zdHJhaW50IiBpZD0iNDc1MzE5OTU1Ij4KKwkJCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImZpcnN0SXRlbSIgcmVmPSI3NzQ2NTI4MzUiLz4KKwkJCQkJCQkJPGludCBrZXk9ImZpcnN0QXR0cmlidXRlIj41PC9pbnQ+CisJCQkJCQkJCTxpbnQga2V5PSJyZWxhdGlvbiI+MDwvaW50PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0ic2Vjb25kSXRlbSIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCQkJPGludCBrZXk9InNlY29uZEF0dHJpYnV0ZSI+NTwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJtdWx0aXBsaWVyIj4xPC9mbG9hdD4KKwkJCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJMYXlvdXRDb25zdGFudCIga2V5PSJjb25zdGFudCI+CisJCQkJCQkJCQk8ZG91YmxlIGtleT0idmFsdWUiPjAuMDwvZG91YmxlPgorCQkJCQkJCQk8L29iamVjdD4KKwkJCQkJCQkJPGZsb2F0IGtleT0icHJpb3JpdHkiPjEwMDA8L2Zsb2F0PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0iY29udGFpbmluZ1ZpZXciIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCQkJCTxpbnQga2V5PSJzY29yaW5nVHlwZSI+ODwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJzY29yaW5nVHlwZUZsb2F0Ij4yOTwvZmxvYXQ+CisJCQkJCQkJCTxpbnQga2V5PSJjb250ZW50VHlwZSI+MzwvaW50PgorCQkJCQkJCTwvb2JqZWN0PgorCQkJCQkJCTxvYmplY3QgY2xhc3M9IklCTlNMYXlvdXRDb25zdHJhaW50IiBpZD0iODUzMzgwMjM2Ij4KKwkJCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImZpcnN0SXRlbSIgcmVmPSI3NzQ2NTI4MzUiLz4KKwkJCQkJCQkJPGludCBrZXk9ImZpcnN0QXR0cmlidXRlIj40PC9pbnQ+CisJCQkJCQkJCTxpbnQga2V5PSJyZWxhdGlvbiI+MDwvaW50PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0ic2Vjb25kSXRlbSIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCQkJPGludCBrZXk9InNlY29uZEF0dHJpYnV0ZSI+NDwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJtdWx0aXBsaWVyIj4xPC9mbG9hdD4KKwkJCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJMYXlvdXRDb25zdGFudCIga2V5PSJjb25zdGFudCI+CisJCQkJCQkJCQk8ZG91YmxlIGtleT0idmFsdWUiPjAuMDwvZG91YmxlPgorCQkJCQkJCQk8L29iamVjdD4KKwkJCQkJCQkJPGZsb2F0IGtleT0icHJpb3JpdHkiPjEwMDA8L2Zsb2F0PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0iY29udGFpbmluZ1ZpZXciIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCQkJCTxpbnQga2V5PSJzY29yaW5nVHlwZSI+ODwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJzY29yaW5nVHlwZUZsb2F0Ij4yOTwvZmxvYXQ+CisJCQkJCQkJCTxpbnQga2V5PSJjb250ZW50VHlwZSI+MzwvaW50PgorCQkJCQkJCTwvb2JqZWN0PgorCQkJCQkJCTxvYmplY3QgY2xhc3M9IklCTlNMYXlvdXRDb25zdHJhaW50IiBpZD0iNTQwMjI3MTU5Ij4KKwkJCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImZpcnN0SXRlbSIgcmVmPSI0ODE5NzUxMTciLz4KKwkJCQkJCQkJPGludCBrZXk9ImZpcnN0QXR0cmlidXRlIj4zPC9pbnQ+CisJCQkJCQkJCTxpbnQga2V5PSJyZWxhdGlvbiI+MDwvaW50PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0ic2Vjb25kSXRlbSIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCQkJPGludCBrZXk9InNlY29uZEF0dHJpYnV0ZSI+MzwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJtdWx0aXBsaWVyIj4xPC9mbG9hdD4KKwkJCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJMYXlvdXRDb25zdGFudCIga2V5PSJjb25zdGFudCI+CisJCQkJCQkJCQk8ZG91YmxlIGtleT0idmFsdWUiPjAuMDwvZG91YmxlPgorCQkJCQkJCQk8L29iamVjdD4KKwkJCQkJCQkJPGZsb2F0IGtleT0icHJpb3JpdHkiPjEwMDA8L2Zsb2F0PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0iY29udGFpbmluZ1ZpZXciIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCQkJCTxpbnQga2V5PSJzY29yaW5nVHlwZSI+ODwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJzY29yaW5nVHlwZUZsb2F0Ij4yOTwvZmxvYXQ+CisJCQkJCQkJCTxpbnQga2V5PSJjb250ZW50VHlwZSI+MzwvaW50PgorCQkJCQkJCTwvb2JqZWN0PgorCQkJCQkJCTxvYmplY3QgY2xhc3M9IklCTlNMYXlvdXRDb25zdHJhaW50IiBpZD0iNTkxODY1MDkxIj4KKwkJCQkJCQkJPHJlZmVyZW5jZSBrZXk9ImZpcnN0SXRlbSIgcmVmPSI0ODE5NzUxMTciLz4KKwkJCQkJCQkJPGludCBrZXk9ImZpcnN0QXR0cmlidXRlIj41PC9pbnQ+CisJCQkJCQkJCTxpbnQga2V5PSJyZWxhdGlvbiI+MDwvaW50PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0ic2Vjb25kSXRlbSIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJCQkJPGludCBrZXk9InNlY29uZEF0dHJpYnV0ZSI+NTwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJtdWx0aXBsaWVyIj4xPC9mbG9hdD4KKwkJCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJMYXlvdXRDb25zdGFudCIga2V5PSJjb25zdGFudCI+CisJCQkJCQkJCQk8ZG91YmxlIGtleT0idmFsdWUiPjAuMDwvZG91YmxlPgorCQkJCQkJCQk8L29iamVjdD4KKwkJCQkJCQkJPGZsb2F0IGtleT0icHJpb3JpdHkiPjEwMDA8L2Zsb2F0PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0iY29udGFpbmluZ1ZpZXciIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCQkJCTxpbnQga2V5PSJzY29yaW5nVHlwZSI+ODwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJzY29yaW5nVHlwZUZsb2F0Ij4yOTwvZmxvYXQ+CisJCQkJCQkJCTxpbnQga2V5PSJjb250ZW50VHlwZSI+MzwvaW50PgorCQkJCQkJCTwvb2JqZWN0PgorCQkJCQkJCTxyZWZlcmVuY2UgcmVmPSI3NzQ2NTI4MzUiLz4KKwkJCQkJCQk8cmVmZXJlbmNlIHJlZj0iNDgxOTc1MTE3Ii8+CisJCQkJCQk8L2FycmF5PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSIwIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdFJlY29yZCI+CisJCQkJCQk8aW50IGtleT0ib2JqZWN0SUQiPjg8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iNzc0NjUyODM1Ii8+CisJCQkJCQk8YXJyYXkgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImNoaWxkcmVuIj4KKwkJCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk5TTGF5b3V0Q29uc3RyYWludCIgaWQ9IjgzMDIwNDI3NCI+CisJCQkJCQkJCTxyZWZlcmVuY2Uga2V5PSJmaXJzdEl0ZW0iIHJlZj0iNzc0NjUyODM1Ii8+CisJCQkJCQkJCTxpbnQga2V5PSJmaXJzdEF0dHJpYnV0ZSI+NzwvaW50PgorCQkJCQkJCQk8aW50IGtleT0icmVsYXRpb24iPjA8L2ludD4KKwkJCQkJCQkJPG5pbCBrZXk9InNlY29uZEl0ZW0iLz4KKwkJCQkJCQkJPGludCBrZXk9InNlY29uZEF0dHJpYnV0ZSI+MDwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJtdWx0aXBsaWVyIj4xPC9mbG9hdD4KKwkJCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJMYXlvdXRDb25zdGFudCIga2V5PSJjb25zdGFudCI+CisJCQkJCQkJCQk8ZG91YmxlIGtleT0idmFsdWUiPjMyODwvZG91YmxlPgorCQkJCQkJCQk8L29iamVjdD4KKwkJCQkJCQkJPGZsb2F0IGtleT0icHJpb3JpdHkiPjEwMDA8L2Zsb2F0PgorCQkJCQkJCQk8cmVmZXJlbmNlIGtleT0iY29udGFpbmluZ1ZpZXciIHJlZj0iNzc0NjUyODM1Ii8+CisJCQkJCQkJCTxpbnQga2V5PSJzY29yaW5nVHlwZSI+MzwvaW50PgorCQkJCQkJCQk8ZmxvYXQga2V5PSJzY29yaW5nVHlwZUZsb2F0Ij45PC9mbG9hdD4KKwkJCQkJCQkJPGludCBrZXk9ImNvbnRlbnRUeXBlIj4xPC9pbnQ+CisJCQkJCQkJPC9vYmplY3Q+CisJCQkJCQk8L2FycmF5PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MTU8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iODMwMjA0Mjc0Ii8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9Ijc3NDY1MjgzNSIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4xOTwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI4NTMzODAyMzYiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdFJlY29yZCI+CisJCQkJCQk8aW50IGtleT0ib2JqZWN0SUQiPjIwPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjQ3NTMxOTk1NSIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCT2JqZWN0UmVjb3JkIj4KKwkJCQkJCTxpbnQga2V5PSJvYmplY3RJRCI+MjE8L2ludD4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJvYmplY3QiIHJlZj0iNDgxOTc1MTE3Ii8+CisJCQkJCQk8YXJyYXkgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9ImNoaWxkcmVuIi8+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0icGFyZW50IiByZWY9Ijc3NDU4NTkzMyIvPgorCQkJCQk8L29iamVjdD4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJPYmplY3RSZWNvcmQiPgorCQkJCQkJPGludCBrZXk9Im9iamVjdElEIj4zMTwvaW50PgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9Im9iamVjdCIgcmVmPSI1NDAyMjcxNTkiLz4KKwkJCQkJCTxyZWZlcmVuY2Uga2V5PSJwYXJlbnQiIHJlZj0iNzc0NTg1OTMzIi8+CisJCQkJCTwvb2JqZWN0PgorCQkJCQk8b2JqZWN0IGNsYXNzPSJJQk9iamVjdFJlY29yZCI+CisJCQkJCQk8aW50IGtleT0ib2JqZWN0SUQiPjMwPC9pbnQ+CisJCQkJCQk8cmVmZXJlbmNlIGtleT0ib2JqZWN0IiByZWY9IjU5MTg2NTA5MSIvPgorCQkJCQkJPHJlZmVyZW5jZSBrZXk9InBhcmVudCIgcmVmPSI3NzQ1ODU5MzMiLz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJPC9hcnJheT4KKwkJCTwvb2JqZWN0PgorCQkJPGRpY3Rpb25hcnkgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0iZmxhdHRlbmVkUHJvcGVydGllcyI+CisJCQkJPHN0cmluZyBrZXk9Ii0xLkN1c3RvbUNsYXNzTmFtZSI+aXBqc3VhVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQk8c3RyaW5nIGtleT0iLTEuSUJQbHVnaW5EZXBlbmRlbmN5Ij5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQk8c3RyaW5nIGtleT0iLTIuQ3VzdG9tQ2xhc3NOYW1lIj5VSVJlc3BvbmRlcjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSItMi5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSIxNS5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSIxOS5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSIyMC5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTxzdHJpbmcga2V5PSIyMS5JQlBsdWdpbkRlcGVuZGVuY3kiPmNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbjwvc3RyaW5nPgorCQkJCTxib29sZWFuIHZhbHVlPSJOTyIga2V5PSIyMS5JQlZpZXdNZXRhZGF0YVRyYW5zbGF0ZXNBdXRvcmVzaXppbmdNYXNrSW50b0NvbnN0cmFpbnRzIi8+CisJCQkJPHN0cmluZyBrZXk9IjMwLklCUGx1Z2luRGVwZW5kZW5jeSI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9IjMxLklCUGx1Z2luRGVwZW5kZW5jeSI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJPHN0cmluZyBrZXk9IjYuSUJQbHVnaW5EZXBlbmRlbmN5Ij5jb20uYXBwbGUuSW50ZXJmYWNlQnVpbGRlci5JQkNvY29hVG91Y2hQbHVnaW48L3N0cmluZz4KKwkJCQk8YXJyYXkgY2xhc3M9Ik5TTXV0YWJsZUFycmF5IiBrZXk9IjYuSUJWaWV3TWV0YWRhdGFDb25zdHJhaW50cyI+CisJCQkJCTxyZWZlcmVuY2UgcmVmPSI1OTE4NjUwOTEiLz4KKwkJCQkJPHJlZmVyZW5jZSByZWY9IjU0MDIyNzE1OSIvPgorCQkJCQk8cmVmZXJlbmNlIHJlZj0iODUzMzgwMjM2Ii8+CisJCQkJCTxyZWZlcmVuY2UgcmVmPSI0NzUzMTk5NTUiLz4KKwkJCQk8L2FycmF5PgorCQkJCTxzdHJpbmcga2V5PSI4LklCUGx1Z2luRGVwZW5kZW5jeSI+Y29tLmFwcGxlLkludGVyZmFjZUJ1aWxkZXIuSUJDb2NvYVRvdWNoUGx1Z2luPC9zdHJpbmc+CisJCQkJPGFycmF5IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSI4LklCVmlld01ldGFkYXRhQ29uc3RyYWludHMiPgorCQkJCQk8cmVmZXJlbmNlIHJlZj0iODMwMjA0Mjc0Ii8+CisJCQkJPC9hcnJheT4KKwkJCQk8Ym9vbGVhbiB2YWx1ZT0iTk8iIGtleT0iOC5JQlZpZXdNZXRhZGF0YVRyYW5zbGF0ZXNBdXRvcmVzaXppbmdNYXNrSW50b0NvbnN0cmFpbnRzIi8+CisJCQk8L2RpY3Rpb25hcnk+CisJCQk8ZGljdGlvbmFyeSBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJ1bmxvY2FsaXplZFByb3BlcnRpZXMiLz4KKwkJCTxuaWwga2V5PSJhY3RpdmVMb2NhbGl6YXRpb24iLz4KKwkJCTxkaWN0aW9uYXJ5IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9ImxvY2FsaXphdGlvbnMiLz4KKwkJCTxuaWwga2V5PSJzb3VyY2VJRCIvPgorCQkJPGludCBrZXk9Im1heElEIj40NTwvaW50PgorCQk8L29iamVjdD4KKwkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaWJlciIga2V5PSJJQkRvY3VtZW50LkNsYXNzZXMiPgorCQkJPGFycmF5IGNsYXNzPSJOU011dGFibGVBcnJheSIga2V5PSJyZWZlcmVuY2VkUGFydGlhbENsYXNzRGVzY3JpcHRpb25zIj4KKwkJCQk8b2JqZWN0IGNsYXNzPSJJQlBhcnRpYWxDbGFzc0Rlc2NyaXB0aW9uIj4KKwkJCQkJPHN0cmluZyBrZXk9ImNsYXNzTmFtZSI+TlNMYXlvdXRDb25zdHJhaW50PC9zdHJpbmc+CisJCQkJCTxzdHJpbmcga2V5PSJzdXBlcmNsYXNzTmFtZSI+TlNPYmplY3Q8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iSUJDbGFzc0Rlc2NyaXB0aW9uU291cmNlIiBrZXk9InNvdXJjZUlkZW50aWZpZXIiPgorCQkJCQkJPHN0cmluZyBrZXk9Im1ham9yS2V5Ij5JQlByb2plY3RTb3VyY2U8L3N0cmluZz4KKwkJCQkJCTxzdHJpbmcga2V5PSJtaW5vcktleSI+Li9DbGFzc2VzL05TTGF5b3V0Q29uc3RyYWludC5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJCTxvYmplY3QgY2xhc3M9IklCUGFydGlhbENsYXNzRGVzY3JpcHRpb24iPgorCQkJCQk8c3RyaW5nIGtleT0iY2xhc3NOYW1lIj5pcGpzdWFWaWV3Q29udHJvbGxlcjwvc3RyaW5nPgorCQkJCQk8c3RyaW5nIGtleT0ic3VwZXJjbGFzc05hbWUiPlVJVmlld0NvbnRyb2xsZXI8L3N0cmluZz4KKwkJCQkJPG9iamVjdCBjbGFzcz0iTlNNdXRhYmxlRGljdGlvbmFyeSIga2V5PSJvdXRsZXRzIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJOUy5rZXkuMCI+dGV4dExhYmVsPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0iTlMub2JqZWN0LjAiPlVJTGFiZWw8L3N0cmluZz4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9Ik5TTXV0YWJsZURpY3Rpb25hcnkiIGtleT0idG9PbmVPdXRsZXRJbmZvc0J5TmFtZSI+CisJCQkJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPnRleHRMYWJlbDwvc3RyaW5nPgorCQkJCQkJPG9iamVjdCBjbGFzcz0iSUJUb09uZU91dGxldEluZm8iIGtleT0iTlMub2JqZWN0LjAiPgorCQkJCQkJCTxzdHJpbmcga2V5PSJuYW1lIj50ZXh0TGFiZWw8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nIGtleT0iY2FuZGlkYXRlQ2xhc3NOYW1lIj5VSUxhYmVsPC9zdHJpbmc+CisJCQkJCQk8L29iamVjdD4KKwkJCQkJPC9vYmplY3Q+CisJCQkJCTxvYmplY3QgY2xhc3M9IklCQ2xhc3NEZXNjcmlwdGlvblNvdXJjZSIga2V5PSJzb3VyY2VJZGVudGlmaWVyIj4KKwkJCQkJCTxzdHJpbmcga2V5PSJtYWpvcktleSI+SUJQcm9qZWN0U291cmNlPC9zdHJpbmc+CisJCQkJCQk8c3RyaW5nIGtleT0ibWlub3JLZXkiPi4vQ2xhc3Nlcy9pcGpzdWFWaWV3Q29udHJvbGxlci5oPC9zdHJpbmc+CisJCQkJCTwvb2JqZWN0PgorCQkJCTwvb2JqZWN0PgorCQkJPC9hcnJheT4KKwkJPC9vYmplY3Q+CisJCTxpbnQga2V5PSJJQkRvY3VtZW50LmxvY2FsaXphdGlvbk1vZGUiPjA8L2ludD4KKwkJPHN0cmluZyBrZXk9IklCRG9jdW1lbnQuVGFyZ2V0UnVudGltZUlkZW50aWZpZXIiPklCQ29jb2FUb3VjaEZyYW1ld29yazwvc3RyaW5nPgorCQk8Ym9vbCBrZXk9IklCRG9jdW1lbnQuUGx1Z2luRGVjbGFyZWREZXBlbmRlbmNpZXNUcmFja1N5c3RlbVRhcmdldFZlcnNpb24iPllFUzwvYm9vbD4KKwkJPGludCBrZXk9IklCRG9jdW1lbnQuZGVmYXVsdFByb3BlcnR5QWNjZXNzQ29udHJvbCI+MzwvaW50PgorCQk8b2JqZWN0IGNsYXNzPSJOU011dGFibGVEaWN0aW9uYXJ5IiBrZXk9IklCRG9jdW1lbnQuTGFzdEtub3duSW1hZ2VTaXplcyI+CisJCQk8c3RyaW5nIGtleT0iTlMua2V5LjAiPnBqc3VhLnBuZzwvc3RyaW5nPgorCQkJPHN0cmluZyBrZXk9Ik5TLm9iamVjdC4wIj57MzIwLCA1Mjh9PC9zdHJpbmc+CisJCTwvb2JqZWN0PgorCQk8Ym9vbCBrZXk9IklCRG9jdW1lbnQuVXNlQXV0b2xheW91dCI+WUVTPC9ib29sPgorCQk8c3RyaW5nIGtleT0iSUJDb2NvYVRvdWNoUGx1Z2luVmVyc2lvbiI+MTkyNjwvc3RyaW5nPgorCTwvZGF0YT4KKzwvYXJjaGl2ZT4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvaXBqc3VhLUluZm8ucGxpc3QgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YS1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTFhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YS1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5lbjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVEaXNwbGF5TmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20udGVsdXUuJHtQUk9EVUNUX05BTUU6cmZjMTAzNGlkZW50aWZpZXJ9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+QVBQTDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5MU1JlcXVpcmVzSVBob25lT1M8L2tleT4KKwk8dHJ1ZS8+CisJPGtleT5VSUJhY2tncm91bmRNb2Rlczwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5hdWRpbzwvc3RyaW5nPgorCQk8c3RyaW5nPnZvaXA8L3N0cmluZz4KKwk8L2FycmF5PgorCTxrZXk+VUlSZXF1aXJlZERldmljZUNhcGFiaWxpdGllczwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5hcm12Nzwvc3RyaW5nPgorCTwvYXJyYXk+CisJPGtleT5VSVN1cHBvcnRlZEludGVyZmFjZU9yaWVudGF0aW9uczwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5VSUludGVyZmFjZU9yaWVudGF0aW9uUG9ydHJhaXQ8L3N0cmluZz4KKwk8L2FycmF5PgorCTxrZXk+VUlTdXBwb3J0ZWRJbnRlcmZhY2VPcmllbnRhdGlvbnN+aXBhZDwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz5VSUludGVyZmFjZU9yaWVudGF0aW9uUG9ydHJhaXQ8L3N0cmluZz4KKwkJPHN0cmluZz5VSUludGVyZmFjZU9yaWVudGF0aW9uUG9ydHJhaXRVcHNpZGVEb3duPC9zdHJpbmc+CisJPC9hcnJheT4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YS1QcmVmaXgucGNoIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9pcGpzdWEtUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJlNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9pcGpzdWEtUHJlZml4LnBjaApAQCAtMCwwICsxLDE0IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ2lwanN1YScgdGFyZ2V0IGluIHRoZSAnaXBqc3VhJyBwcm9qZWN0CisvLworCisjaW1wb3J0IDxBdmFpbGFiaWxpdHkuaD4KKworI2lmbmRlZiBfX0lQSE9ORV80XzAKKyN3YXJuaW5nICJUaGlzIHByb2plY3QgdXNlcyBmZWF0dXJlcyBvbmx5IGF2YWlsYWJsZSBpbiBpT1MgU0RLIDQuMCBhbmQgbGF0ZXIuIgorI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgICNpbXBvcnQgPFVJS2l0L1VJS2l0Lmg+CisgICAgI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvaXBqc3VhQXBwRGVsZWdhdGUuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvaXBqc3VhQXBwRGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmU2ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9pcGpzdWFBcHBEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vCisvLyAgaXBqc3VhQXBwRGVsZWdhdGUuaAorLy8gIGlwanN1YQorLy8KKy8vICBDcmVhdGVkIGJ5IExpb25nIFNhdXcgTWluZyBvbiAxMy8zLzEzLgorLy8gIENvcHlyaWdodCAoYykgMjAxMyBUZWx1dS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFVJS2l0L1VJS2l0Lmg+CisKK0BjbGFzcyBpcGpzdWFWaWV3Q29udHJvbGxlcjsKKworQGludGVyZmFjZSBpcGpzdWFBcHBEZWxlZ2F0ZSA6IFVJUmVzcG9uZGVyIDxVSUFwcGxpY2F0aW9uRGVsZWdhdGU+CisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIFVJV2luZG93ICp3aW5kb3c7CisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIGlwanN1YVZpZXdDb250cm9sbGVyICp2aWV3Q29udHJvbGxlcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9pcGpzdWFBcHBEZWxlZ2F0ZS5tIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9pcGpzdWFBcHBEZWxlZ2F0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2YyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YUFwcERlbGVnYXRlLm0KQEAgLTAsMCArMSwyMTggQEAKKy8vCisvLyAgaXBqc3VhQXBwRGVsZWdhdGUubQorLy8gIGlwanN1YQorLy8KKy8vICBDcmVhdGVkIGJ5IExpb25nIFNhdXcgTWluZyBvbiAxMy8zLzEzLgorLy8gIENvcHlyaWdodCAoYykgMjAxMyBUZWx1dS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgImlwanN1YUFwcERlbGVnYXRlLmgiCisjaW1wb3J0IDxwamxpYi5oPgorI2ltcG9ydCA8cGpzdWEuaD4KKyNpbXBvcnQgPHBqL2xvZy5oPgorCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwLmgiCisjaW5jbHVkZSAiLi4vLi4vcGpzdWFfYXBwX2NvbmZpZy5oIgorCisjaW1wb3J0ICJpcGpzdWFWaWV3Q29udHJvbGxlci5oIgorCitAaW1wbGVtZW50YXRpb24gaXBqc3VhQXBwRGVsZWdhdGUKKworI2RlZmluZSBUSElTX0ZJTEUJImlwanN1YUFwcERlbGVnYXRlLm0iCisKKyNkZWZpbmUgS0VFUF9BTElWRV9JTlRFUlZBTCA2MDAKKworaXBqc3VhQXBwRGVsZWdhdGUgICAgICAqYXBwOworc3RhdGljIHBqc3VhX2FwcF9jZmdfdCAgYXBwX2NmZzsKK3N0YXRpYyBib29sICAgICAgICAgICAgIGlzU2h1dHRpbmdEb3duOworc3RhdGljIGNoYXIgICAgICAgICAgICoqcmVzdGFydEFyZ3Y7CitzdGF0aWMgaW50ICAgICAgICAgICAgICByZXN0YXJ0QXJnYzsKK3N0YXRpYyBwal90aHJlYWRfZGVzYyAgIGFfdGhyZWFkX2Rlc2M7CitzdGF0aWMgcGpfdGhyZWFkX3QgICAgICphX3RocmVhZDsKKworc3RhdGljIHZvaWQgZGlzcGxheU1zZyhjb25zdCBjaGFyICptc2cpCit7CisgICAgTlNTdHJpbmcgKnN0ciA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXMiLCBtc2ddOworICAgIFthcHAgcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOkBzZWxlY3RvcihkaXNwbGF5TXNnOikgd2l0aE9iamVjdDpzdHIKKyAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsRG9uZTpOT107Cit9CisKK3N0YXRpYyB2b2lkIHBqc3VhT25TdGFydGVkQ2IocGpfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKyAgICAKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgKCFtc2cgfHwgISptc2cpKSB7CisJcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiRXJyb3I6ICVzIiwgZXJybXNnKSk7CisJbXNnID0gZXJybXNnOworICAgIH0gZWxzZSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIlN0YXJ0ZWQ6ICVzIiwgbXNnKSk7CisgICAgfQorCisgICAgZGlzcGxheU1zZyhtc2cpOworfQorCitzdGF0aWMgdm9pZCBwanN1YU9uU3RvcHBlZENiKHBqX2Jvb2xfdCByZXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgUEpfTE9HKDMsKCJpcGpzdWEiLCAiQ0xJICVzIHJlcXVlc3QiLCAocmVzdGFydD8gInJlc3RhcnQiIDogInNodXRkb3duIikpKTsKKyAgICBpZiAocmVzdGFydCkgeworICAgICAgICBkaXNwbGF5TXNnKCJSZXN0YXJ0aW5nLi4iKTsKKwlwal90aHJlYWRfc2xlZXAoMTAwKTsKKyAgICAgICAgYXBwX2NmZy5hcmdjID0gYXJnYzsKKyAgICAgICAgYXBwX2NmZy5hcmd2ID0gYXJndjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwbGF5TXNnKCJTaHV0dGluZyBkb3duLi4iKTsKKwlwal90aHJlYWRfc2xlZXAoMTAwKTsKKyAgICAgICAgaXNTaHV0dGluZ0Rvd24gPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGpzdWFPbkFwcENvbmZpZ0NiKHBqc3VhX2FwcF9jb25maWcgKmNmZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGNmZyk7Cit9CisKKy0gKHZvaWQpZGlzcGxheU1zZzooTlNTdHJpbmcgKilzdHIKK3sKKyAgICBhcHAudmlld0NvbnRyb2xsZXIudGV4dExhYmVsLnRleHQgPSBzdHI7Cit9CisKKy0gKHZvaWQpcGpzdWFTdGFydAoreworICAgIC8vIFRPRE86IHJlYWQgZnJvbSBjb25maWc/CisgICAgY29uc3QgY2hhciAqKmFyZ3YgPSBwanN1YV9hcHBfZGVmX2FyZ3Y7CisgICAgaW50IGFyZ2MgPSBQSl9BUlJBWV9TSVpFKHBqc3VhX2FwcF9kZWZfYXJndikgLTE7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIGlzU2h1dHRpbmdEb3duID0gZmFsc2U7CisgICAgZGlzcGxheU1zZygiU3RhcnRpbmcuLiIpOworICAgIAorICAgIHBqX2J6ZXJvKCZhcHBfY2ZnLCBzaXplb2YoYXBwX2NmZykpOworICAgIGlmIChyZXN0YXJ0QXJnYykgeworCWFwcF9jZmcuYXJnYyA9IHJlc3RhcnRBcmdjOworCWFwcF9jZmcuYXJndiA9IHJlc3RhcnRBcmd2OworICAgIH0gZWxzZSB7CisJYXBwX2NmZy5hcmdjID0gYXJnYzsKKwlhcHBfY2ZnLmFyZ3YgPSAoY2hhcioqKWFyZ3Y7CisgICAgfQorICAgIGFwcF9jZmcub25fc3RhcnRlZCA9ICZwanN1YU9uU3RhcnRlZENiOworICAgIGFwcF9jZmcub25fc3RvcHBlZCA9ICZwanN1YU9uU3RvcHBlZENiOworICAgIGFwcF9jZmcub25fY29uZmlnX2luaXQgPSAmcGpzdWFPbkFwcENvbmZpZ0NiOworICAgIAorICAgIHdoaWxlICghaXNTaHV0dGluZ0Rvd24pIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfYXBwX2luaXQoJmFwcF9jZmcpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisgICAgICAgICAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgICAgICAgICAgZGlzcGxheU1zZyhlcnJtc2cpOworICAgICAgICAgICAgcGpzdWFfYXBwX2Rlc3Ryb3koKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIAorICAgICAgICBzdGF0dXMgPSBwanN1YV9hcHBfcnVuKFBKX1RSVUUpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisgICAgICAgICAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgICAgICAgICAgZGlzcGxheU1zZyhlcnJtc2cpOworICAgICAgICB9CisgICAgCisgICAgICAgIHBqc3VhX2FwcF9kZXN0cm95KCk7CisgICAgfQorICAgIAorICAgIHJlc3RhcnRBcmd2ID0gTlVMTDsKKyAgICByZXN0YXJ0QXJnYyA9IDA7Cit9CisKKy0gKEJPT0wpYXBwbGljYXRpb246KFVJQXBwbGljYXRpb24gKilhcHBsaWNhdGlvbiBkaWRGaW5pc2hMYXVuY2hpbmdXaXRoT3B0aW9uczooTlNEaWN0aW9uYXJ5ICopbGF1bmNoT3B0aW9ucworeworICAgIHNlbGYud2luZG93ID0gW1tVSVdpbmRvdyBhbGxvY10gaW5pdFdpdGhGcmFtZTpbW1VJU2NyZWVuIG1haW5TY3JlZW5dIGJvdW5kc11dOworICAgIC8vIE92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemF0aW9uIGFmdGVyIGFwcGxpY2F0aW9uIGxhdW5jaC4KKyAgICBpZiAoW1tVSURldmljZSBjdXJyZW50RGV2aWNlXSB1c2VySW50ZXJmYWNlSWRpb21dID09IFVJVXNlckludGVyZmFjZUlkaW9tUGhvbmUpIHsKKyAgICAgICAgc2VsZi52aWV3Q29udHJvbGxlciA9IFtbaXBqc3VhVmlld0NvbnRyb2xsZXIgYWxsb2NdIGluaXRXaXRoTmliTmFtZTpAImlwanN1YVZpZXdDb250cm9sbGVyX2lQaG9uZSIgYnVuZGxlOm5pbF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi52aWV3Q29udHJvbGxlciA9IFtbaXBqc3VhVmlld0NvbnRyb2xsZXIgYWxsb2NdIGluaXRXaXRoTmliTmFtZTpAImlwanN1YVZpZXdDb250cm9sbGVyX2lQYWQiIGJ1bmRsZTpuaWxdOworICAgIH0KKyAgICBzZWxmLndpbmRvdy5yb290Vmlld0NvbnRyb2xsZXIgPSBzZWxmLnZpZXdDb250cm9sbGVyOworICAgIFtzZWxmLndpbmRvdyBtYWtlS2V5QW5kVmlzaWJsZV07CisgICAgCisgICAgYXBwID0gc2VsZjsKKyAgICAKKyAgICAvKiBTdGFydCBwanN1YSBhcHAgdGhyZWFkICovCisgICAgW05TVGhyZWFkIGRldGFjaE5ld1RocmVhZFNlbGVjdG9yOkBzZWxlY3RvcihwanN1YVN0YXJ0KSB0b1RhcmdldDpzZWxmIHdpdGhPYmplY3Q6bmlsXTsKKworICAgIHJldHVybiBZRVM7Cit9CisKKy0gKHZvaWQpYXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOihVSUFwcGxpY2F0aW9uICopYXBwbGljYXRpb24KK3sKKyAgICAvLyBTZW50IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGFib3V0IHRvIG1vdmUgZnJvbSBhY3RpdmUgdG8gaW5hY3RpdmUgc3RhdGUuIFRoaXMgY2FuIG9jY3VyIGZvciBjZXJ0YWluIHR5cGVzIG9mIHRlbXBvcmFyeSBpbnRlcnJ1cHRpb25zIChzdWNoIGFzIGFuIGluY29taW5nIHBob25lIGNhbGwgb3IgU01TIG1lc3NhZ2UpIG9yIHdoZW4gdGhlIHVzZXIgcXVpdHMgdGhlIGFwcGxpY2F0aW9uIGFuZCBpdCBiZWdpbnMgdGhlIHRyYW5zaXRpb24gdG8gdGhlIGJhY2tncm91bmQgc3RhdGUuCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIHRvIHBhdXNlIG9uZ29pbmcgdGFza3MsIGRpc2FibGUgdGltZXJzLCBhbmQgdGhyb3R0bGUgZG93biBPcGVuR0wgRVMgZnJhbWUgcmF0ZXMuIEdhbWVzIHNob3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gcGF1c2UgdGhlIGdhbWUuCit9CisKKy0gKHZvaWQpa2VlcEFsaXZlIHsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBpZiAoIXBqX3RocmVhZF9pc19yZWdpc3RlcmVkKCkpCisgICAgeworCXBqX3RocmVhZF9yZWdpc3RlcigiaXBqc3VhIiwgYV90aHJlYWRfZGVzYywgJmFfdGhyZWFkKTsKKyAgICB9CisgICAgCisgICAgLyogU2luY2UgaU9TIHJlcXVpcmVzIHRoYXQgdGhlIG1pbmltdW0ga2VlcCBhbGl2ZSBpbnRlcnZhbCBpcyA2MDBzLAorICAgICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhY2NvdW50J3MgcmVnaXN0cmF0aW9uCisgICAgICogdGltZW91dCBpcyBsb25nIGVub3VnaC4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludClwanN1YV9hY2NfZ2V0X2NvdW50KCk7ICsraSkgeworICAgICAgICBpZiAocGpzdWFfYWNjX2lzX3ZhbGlkKGkpKSB7CisgICAgICAgICAgICBwanN1YV9hY2Nfc2V0X3JlZ2lzdHJhdGlvbihpLCBQSl9UUlVFKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAodm9pZClhcHBsaWNhdGlvbkRpZEVudGVyQmFja2dyb3VuZDooVUlBcHBsaWNhdGlvbiAqKWFwcGxpY2F0aW9uCit7CisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIHRvIHJlbGVhc2Ugc2hhcmVkIHJlc291cmNlcywgc2F2ZSB1c2VyIGRhdGEsIGludmFsaWRhdGUgdGltZXJzLCBhbmQgc3RvcmUgZW5vdWdoIGFwcGxpY2F0aW9uIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlc3RvcmUgeW91ciBhcHBsaWNhdGlvbiB0byBpdHMgY3VycmVudCBzdGF0ZSBpbiBjYXNlIGl0IGlzIHRlcm1pbmF0ZWQgbGF0ZXIuIAorICAgIC8vIElmIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgYmFja2dyb3VuZCBleGVjdXRpb24sIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIGFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZTogd2hlbiB0aGUgdXNlciBxdWl0cy4KKyAgICBbc2VsZiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6QHNlbGVjdG9yKGtlZXBBbGl2ZSkgd2l0aE9iamVjdDpuaWwgd2FpdFVudGlsRG9uZTpZRVNdOworICAgIFthcHBsaWNhdGlvbiBzZXRLZWVwQWxpdmVUaW1lb3V0OktFRVBfQUxJVkVfSU5URVJWQUwgaGFuZGxlcjogXnsKKwlbc2VsZiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6QHNlbGVjdG9yKGtlZXBBbGl2ZSkgd2l0aE9iamVjdDpuaWwgd2FpdFVudGlsRG9uZTpZRVNdOworICAgIH1dOworfQorCistICh2b2lkKWFwcGxpY2F0aW9uV2lsbEVudGVyRm9yZWdyb3VuZDooVUlBcHBsaWNhdGlvbiAqKWFwcGxpY2F0aW9uCit7CisgICAgLy8gQ2FsbGVkIGFzIHBhcnQgb2YgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgYmFja2dyb3VuZCB0byB0aGUgaW5hY3RpdmUgc3RhdGU7IGhlcmUgeW91IGNhbiB1bmRvIG1hbnkgb2YgdGhlIGNoYW5nZXMgbWFkZSBvbiBlbnRlcmluZyB0aGUgYmFja2dyb3VuZC4KK30KKworLSAodm9pZClhcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTooVUlBcHBsaWNhdGlvbiAqKWFwcGxpY2F0aW9uCit7CisgICAgLy8gUmVzdGFydCBhbnkgdGFza3MgdGhhdCB3ZXJlIHBhdXNlZCAob3Igbm90IHlldCBzdGFydGVkKSB3aGlsZSB0aGUgYXBwbGljYXRpb24gd2FzIGluYWN0aXZlLiBJZiB0aGUgYXBwbGljYXRpb24gd2FzIHByZXZpb3VzbHkgaW4gdGhlIGJhY2tncm91bmQsIG9wdGlvbmFsbHkgcmVmcmVzaCB0aGUgdXNlciBpbnRlcmZhY2UuCit9CisKKy0gKHZvaWQpYXBwbGljYXRpb25XaWxsVGVybWluYXRlOihVSUFwcGxpY2F0aW9uICopYXBwbGljYXRpb24KK3sKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gdGVybWluYXRlLiBTYXZlIGRhdGEgaWYgYXBwcm9wcmlhdGUuIFNlZSBhbHNvIGFwcGxpY2F0aW9uRGlkRW50ZXJCYWNrZ3JvdW5kOi4KK30KKworCitwal9ib29sX3Qgc2hvd05vdGlmaWNhdGlvbihwanN1YV9jYWxsX2lkIGNhbGxfaWQpCit7CisgICAgLy8gQ3JlYXRlIGEgbmV3IG5vdGlmaWNhdGlvbgorICAgIFVJTG9jYWxOb3RpZmljYXRpb24qIGFsZXJ0ID0gW1tVSUxvY2FsTm90aWZpY2F0aW9uIGFsbG9jXSBpbml0XTsKKyAgICBpZiAoYWxlcnQpCisgICAgeworCWFsZXJ0LnJlcGVhdEludGVydmFsID0gMDsKKwlhbGVydC5hbGVydEJvZHkgPSBAIkluY29taW5nIGNhbGwgcmVjZWl2ZWQuLi4iOworICAgICAgICAvKiBUaGlzIGFjdGlvbiBqdXN0IGJyaW5ncyB0aGUgYXBwIHRvIHRoZSBGRywgaXQgZG9lc24ndAorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGFuc3dlciB0aGUgY2FsbCAodW5sZXNzIHlvdSBzcGVjaWZ5IHRoZQorICAgICAgICAgKiAtLWF1dG8tYW5zd2VyIG9wdGlvbikuCisgICAgICAgICAqLworCWFsZXJ0LmFsZXJ0QWN0aW9uID0gQCJBY3RpdmF0ZSBhcHAiOworCQorCVtbVUlBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl0gcHJlc2VudExvY2FsTm90aWZpY2F0aW9uTm93OmFsZXJ0XTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFBKX0ZBTFNFOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YVZpZXdDb250cm9sbGVyLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YVZpZXdDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4OTI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YVZpZXdDb250cm9sbGVyLmgKQEAgLTAsMCArMSwxNSBAQAorLy8KKy8vICBpcGpzdWFWaWV3Q29udHJvbGxlci5oCisvLyAgaXBqc3VhCisvLworLy8gIENyZWF0ZWQgYnkgTGlvbmcgU2F1dyBNaW5nIG9uIDEzLzMvMTMuCisvLyAgQ29weXJpZ2h0IChjKSAyMDEzIFRlbHV1LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8VUlLaXQvVUlLaXQuaD4KKworQGludGVyZmFjZSBpcGpzdWFWaWV3Q29udHJvbGxlciA6IFVJVmlld0NvbnRyb2xsZXIKKworQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgSUJPdXRsZXQgVUlMYWJlbCAqdGV4dExhYmVsOworCitAZW5kCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YVZpZXdDb250cm9sbGVyLm0gYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9pb3MvaXBqc3VhL2lwanN1YVZpZXdDb250cm9sbGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiMzM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvaXBqc3VhVmlld0NvbnRyb2xsZXIubQpAQCAtMCwwICsxLDMzIEBACisvLworLy8gIGlwanN1YVZpZXdDb250cm9sbGVyLm0KKy8vICBpcGpzdWEKKy8vCisvLyAgQ3JlYXRlZCBieSBMaW9uZyBTYXV3IE1pbmcgb24gMTMvMy8xMy4KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTMgVGVsdXUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0ICJpcGpzdWFWaWV3Q29udHJvbGxlci5oIgorCitAaW50ZXJmYWNlIGlwanN1YVZpZXdDb250cm9sbGVyICgpCisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIGlwanN1YVZpZXdDb250cm9sbGVyCisKK0BzeW50aGVzaXplIHRleHRMYWJlbDsKKworLSAodm9pZCl2aWV3RGlkTG9hZAoreworICAgIFtzdXBlciB2aWV3RGlkTG9hZF07CisgICAgLy8gRG8gYW55IGFkZGl0aW9uYWwgc2V0dXAgYWZ0ZXIgbG9hZGluZyB0aGUgdmlldywgdHlwaWNhbGx5IGZyb20gYSBuaWIuCisKKyAgICBbW1VJQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dIGJlZ2luUmVjZWl2aW5nUmVtb3RlQ29udHJvbEV2ZW50c107Cit9CisKKy0gKHZvaWQpZGlkUmVjZWl2ZU1lbW9yeVdhcm5pbmcKK3sKKyAgICBbc3VwZXIgZGlkUmVjZWl2ZU1lbW9yeVdhcm5pbmddOworICAgIC8vIERpc3Bvc2Ugb2YgYW55IHJlc291cmNlcyB0aGF0IGNhbiBiZSByZWNyZWF0ZWQuCit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvbWFpbi5tIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9tYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvbWFpbi5tCkBAIC0wLDAgKzEsMTggQEAKKy8vCisvLyAgbWFpbi5tCisvLyAgaXBqc3VhCisvLworLy8gIENyZWF0ZWQgYnkgTGlvbmcgU2F1dyBNaW5nIG9uIDEzLzMvMTMuCisvLyAgQ29weXJpZ2h0IChjKSAyMDEzIFRlbHV1LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8VUlLaXQvVUlLaXQuaD4KKworI2ltcG9ydCAiaXBqc3VhQXBwRGVsZWdhdGUuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBAYXV0b3JlbGVhc2Vwb29sIHsKKyAgICAgICAgcmV0dXJuIFVJQXBwbGljYXRpb25NYWluKGFyZ2MsIGFyZ3YsIG5pbCwgTlNTdHJpbmdGcm9tQ2xhc3MoW2lwanN1YUFwcERlbGVnYXRlIGNsYXNzXSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvcGpzdWEucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvaW9zL2lwanN1YS9wanN1YS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlNDAxMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL2lvcy9pcGpzdWEvcGpzdWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL21haW4uYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc4NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvbWFpbi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiAkSWQ6IG1haW4uYyA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJwanN1YV9hcHAuaCIKKworI2RlZmluZSBUSElTX0ZJTEUJIm1haW4uYyIKKworc3RhdGljIHBqX2Jvb2xfdAkgICAgcnVubmluZyA9IFBKX1RSVUU7CitzdGF0aWMgcGpfc3RhdHVzX3QJICAgIHJlY2VpdmVfZW5kX3NpZzsKK3N0YXRpYyBwal90aHJlYWRfdAkgICAgKnNpZ190aHJlYWQ7CitzdGF0aWMgcGpzdWFfYXBwX2NmZ190CSAgICBjZmc7CisKKy8qIENhbGxlZCB3aGVuIENMSSAocmUpc3RhcnRlZCAqLwordm9pZCBvbl9hcHBfc3RhcnRlZChwal9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBwal9wZXJyb3IoMywgVEhJU19GSUxFLCBzdGF0dXMsIChtc2cpP21zZzoiIik7Cit9CisKK3ZvaWQgb25fYXBwX3N0b3BwZWQocGpfYm9vbF90IHJlc3RhcnQsIGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoYXJndikgeworCWNmZy5hcmdjID0gYXJnYzsKKwljZmcuYXJndiA9IGFyZ3Y7CisgICAgfQorCisgICAgcnVubmluZyA9IHJlc3RhcnQ7Cit9CisKKyNpZiBkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiE9MAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIHBqX3RocmVhZF9kZXNjIGhhbmRsZXJfZGVzYzsKKworc3RhdGljIEJPT0wgV0lOQVBJIEN0cmxIYW5kbGVyKERXT1JEIGZkd0N0cmxUeXBlKQoreyAgIAorICAgIHN3aXRjaCAoZmR3Q3RybFR5cGUpIAorICAgIHsgCisgICAgICAgIC8vIEhhbmRsZSB0aGUgQ1RSTCtDIHNpZ25hbC4gCisgCisgICAgICAgIGNhc2UgQ1RSTF9DX0VWRU5UOiAKKyAgICAgICAgY2FzZSBDVFJMX0NMT1NFX0VWRU5UOiAKKyAgICAgICAgY2FzZSBDVFJMX0JSRUFLX0VWRU5UOiAKKyAgICAgICAgY2FzZSBDVFJMX0xPR09GRl9FVkVOVDogCisgICAgICAgIGNhc2UgQ1RSTF9TSFVURE9XTl9FVkVOVDogCisJICAgIHBqX3RocmVhZF9yZWdpc3RlcigiY3RybGhhbmRsZXIiLCBoYW5kbGVyX2Rlc2MsICZzaWdfdGhyZWFkKTsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkN0cmwtQyBkZXRlY3RlZCwgcXVpdHRpbmcuLiIpKTsKKwkgICAgcmVjZWl2ZV9lbmRfc2lnID0gUEpfVFJVRTsKKyAgICAgICAgICAgIHBqc3VhX2FwcF9kZXN0cm95KCk7CSAgICAKKwkgICAgRXhpdFByb2Nlc3MoMSk7CisgICAgICAgICAgICBQSl9VTlJFQUNIRUQocmV0dXJuIFRSVUU7KQorIAorICAgICAgICBkZWZhdWx0OiAKKyAKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgCisgICAgfSAKK30KKworc3RhdGljIHZvaWQgc2V0dXBfc29ja2V0X3NpZ25hbCgpCit7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3NpZ25hbF9oYW5kbGVyKHZvaWQpCit7CisgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKCZDdHJsSGFuZGxlciwgVFJVRSk7Cit9CisKKyNlbHNlCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkIHNldHVwX3NvY2tldF9zaWduYWwoKQoreworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfc2lnbmFsX2hhbmRsZXIodm9pZCkge30KKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1RSVUU7CisKKyAgICBwal9iemVybygmY2ZnLCBzaXplb2YoY2ZnKSk7CisgICAgY2ZnLm9uX3N0YXJ0ZWQgPSAmb25fYXBwX3N0YXJ0ZWQ7CisgICAgY2ZnLm9uX3N0b3BwZWQgPSAmb25fYXBwX3N0b3BwZWQ7CisgICAgY2ZnLmFyZ2MgPSBhcmdjOworICAgIGNmZy5hcmd2ID0gYXJndjsKKworICAgIHNldHVwX3NpZ25hbF9oYW5kbGVyKCk7CisgICAgc2V0dXBfc29ja2V0X3NpZ25hbCgpOworCisgICAgd2hpbGUgKHJ1bm5pbmcpIHsgICAgICAgIAorCXN0YXR1cyA9IHBqc3VhX2FwcF9pbml0KCZjZmcpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCSAgICBzdGF0dXMgPSBwanN1YV9hcHBfcnVuKFBKX1RSVUUpOworCX0gZWxzZSB7CisJICAgIHJ1bm5pbmcgPSBQSl9GQUxTRTsKKwl9CisKKwlpZiAoIXJlY2VpdmVfZW5kX3NpZykgeworCSAgICBwanN1YV9hcHBfZGVzdHJveSgpOworCisJICAgIC8qIFRoaXMgaXMgb24gcHVycG9zZSAqLworCSAgICBwanN1YV9hcHBfZGVzdHJveSgpOworCX0gZWxzZSB7CisJICAgIHBqX3RocmVhZF9qb2luKHNpZ190aHJlYWQpOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9tYWluX3J0ZW1zLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9tYWluX3J0ZW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL21haW5fcnRlbXMuYwpAQCAtMCwwICsxLDEyIEBACisKKy8qIAorICogICEhIE9JWSBPSVkgISEKKyAqCisgKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIG9ubHkgdG8gZ2V0IHRoZSBleGVjdXRhYmxlIGxpbmtlZC4gSSBoYXZlbid0CisgKiAgYWN0dWFsbHkgdHJpZWQgdG8gcnVuIHRoaXMgb24gUlRFTVMhIQorICoKKyAqLworCisjaW5jbHVkZSAiLi4vLi4vcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl9ydGVtcy5jIgorCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3Bqc3VhX2FwcC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiNjZmZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3Bqc3VhX2FwcC5jCkBAIC0wLDAgKzEsMjExNiBAQAorLyogJElkOiBwanN1YV9hcHAuYyA0NjM0IDIwMTMtMTAtMjMgMDk6Mjk6MzVaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJwanN1YV9hcHAuaCIKKworI2RlZmluZSBUSElTX0ZJTEUJInBqc3VhX2FwcC5jIgorCisvLyNkZWZpbmUgU1RFUkVPX0RFTU8KKy8vI2RlZmluZSBUUkFOU1BPUlRfQURBUFRFUl9TQU1QTEUKKy8vI2RlZmluZSBIQVZFX01VTFRJUEFSVF9URVNUCisKKy8qIFJpbmd0b25lcwkJICAgIFVTCSAgICAgICBVSyAgKi8KKyNkZWZpbmUgUklOR0JBQ0tfRlJFUTEJICAgIDQ0MAkgICAgLyogNDAwICovCisjZGVmaW5lIFJJTkdCQUNLX0ZSRVEyCSAgICA0ODAJICAgIC8qIDQ1MCAqLworI2RlZmluZSBSSU5HQkFDS19PTgkgICAgMjAwMCAgICAvKiA0MDAgKi8KKyNkZWZpbmUgUklOR0JBQ0tfT0ZGCSAgICA0MDAwICAgIC8qIDIwMCAqLworI2RlZmluZSBSSU5HQkFDS19DTlQJICAgIDEJICAgIC8qIDIgICAqLworI2RlZmluZSBSSU5HQkFDS19JTlRFUlZBTCAgIDQwMDAgICAgLyogMjAwMCAqLworCisjZGVmaW5lIFJJTkdfRlJFUTEJICAgIDgwMAorI2RlZmluZSBSSU5HX0ZSRVEyCSAgICA2NDAKKyNkZWZpbmUgUklOR19PTgkJICAgIDIwMAorI2RlZmluZSBSSU5HX09GRgkgICAgMTAwCisjZGVmaW5lIFJJTkdfQ05UCSAgICAzCisjZGVmaW5lIFJJTkdfSU5URVJWQUwJICAgIDMwMDAKKworI2RlZmluZSBjdXJyZW50X2FjYwlwanN1YV9hY2NfZ2V0X2RlZmF1bHQoKQorCisjaWZkZWYgU1RFUkVPX0RFTU8KK3N0YXRpYyB2b2lkIHN0ZXJlb19kZW1vKCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmluZ2JhY2tfc3RhcnQocGpzdWFfY2FsbF9pZCBjYWxsX2lkKTsKK3N0YXRpYyB2b2lkIHJpbmdfc3RhcnQocGpzdWFfY2FsbF9pZCBjYWxsX2lkKTsKK3N0YXRpYyB2b2lkIHJpbmdfc3RvcChwanN1YV9jYWxsX2lkIGNhbGxfaWQpOworc3RhdGljIHBqX3N0YXR1c190IGFwcF9pbml0KCk7CitzdGF0aWMgcGpfc3RhdHVzX3QgYXBwX2Rlc3Ryb3koKTsKKworc3RhdGljIHBqc3VhX2FwcF9jZmdfdCBhcHBfY2ZnOworcGpfc3RyX3QJCSAgICB1cmlfYXJnOworcGpfYm9vbF90CQkgICAgYXBwX3J1bm5pbmcJPSBQSl9GQUxTRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25maWd1cmF0aW9uIG1hbmlwdWxhdGlvbgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FsbGJhY2sgCisgKi8KK3N0YXRpYyB2b2lkIHJpbmdiYWNrX3N0YXJ0KHBqc3VhX2NhbGxfaWQgY2FsbF9pZCkKK3sKKyAgICBpZiAoYXBwX2NvbmZpZy5ub190b25lcykKKwlyZXR1cm47CisKKyAgICBpZiAoYXBwX2NvbmZpZy5jYWxsX2RhdGFbY2FsbF9pZF0ucmluZ2JhY2tfb24pCisJcmV0dXJuOworCisgICAgYXBwX2NvbmZpZy5jYWxsX2RhdGFbY2FsbF9pZF0ucmluZ2JhY2tfb24gPSBQSl9UUlVFOworCisgICAgaWYgKCsrYXBwX2NvbmZpZy5yaW5nYmFja19jbnQ9PTEgJiYgCisJYXBwX2NvbmZpZy5yaW5nYmFja19zbG90IT1QSlNVQV9JTlZBTElEX0lEKSAKKyAgICB7CisJcGpzdWFfY29uZl9jb25uZWN0KGFwcF9jb25maWcucmluZ2JhY2tfc2xvdCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByaW5nX3N0b3AocGpzdWFfY2FsbF9pZCBjYWxsX2lkKQoreworICAgIGlmIChhcHBfY29uZmlnLm5vX3RvbmVzKQorCXJldHVybjsKKworICAgIGlmIChhcHBfY29uZmlnLmNhbGxfZGF0YVtjYWxsX2lkXS5yaW5nYmFja19vbikgeworCWFwcF9jb25maWcuY2FsbF9kYXRhW2NhbGxfaWRdLnJpbmdiYWNrX29uID0gUEpfRkFMU0U7CisKKwlwal9hc3NlcnQoYXBwX2NvbmZpZy5yaW5nYmFja19jbnQ+MCk7CisJaWYgKC0tYXBwX2NvbmZpZy5yaW5nYmFja19jbnQgPT0gMCAmJiAKKwkgICAgYXBwX2NvbmZpZy5yaW5nYmFja19zbG90IT1QSlNVQV9JTlZBTElEX0lEKSAKKwl7CisJICAgIHBqc3VhX2NvbmZfZGlzY29ubmVjdChhcHBfY29uZmlnLnJpbmdiYWNrX3Nsb3QsIDApOworCSAgICBwam1lZGlhX3RvbmVnZW5fcmV3aW5kKGFwcF9jb25maWcucmluZ2JhY2tfcG9ydCk7CisJfQorICAgIH0KKworICAgIGlmIChhcHBfY29uZmlnLmNhbGxfZGF0YVtjYWxsX2lkXS5yaW5nX29uKSB7CisJYXBwX2NvbmZpZy5jYWxsX2RhdGFbY2FsbF9pZF0ucmluZ19vbiA9IFBKX0ZBTFNFOworCisJcGpfYXNzZXJ0KGFwcF9jb25maWcucmluZ19jbnQ+MCk7CisJaWYgKC0tYXBwX2NvbmZpZy5yaW5nX2NudCA9PSAwICYmIAorCSAgICBhcHBfY29uZmlnLnJpbmdfc2xvdCE9UEpTVUFfSU5WQUxJRF9JRCkgCisJeworCSAgICBwanN1YV9jb25mX2Rpc2Nvbm5lY3QoYXBwX2NvbmZpZy5yaW5nX3Nsb3QsIDApOworCSAgICBwam1lZGlhX3RvbmVnZW5fcmV3aW5kKGFwcF9jb25maWcucmluZ19wb3J0KTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByaW5nX3N0YXJ0KHBqc3VhX2NhbGxfaWQgY2FsbF9pZCkKK3sKKyAgICBpZiAoYXBwX2NvbmZpZy5ub190b25lcykKKwlyZXR1cm47CisKKyAgICBpZiAoYXBwX2NvbmZpZy5jYWxsX2RhdGFbY2FsbF9pZF0ucmluZ19vbikKKwlyZXR1cm47CisKKyAgICBhcHBfY29uZmlnLmNhbGxfZGF0YVtjYWxsX2lkXS5yaW5nX29uID0gUEpfVFJVRTsKKworICAgIGlmICgrK2FwcF9jb25maWcucmluZ19jbnQ9PTEgJiYgCisJYXBwX2NvbmZpZy5yaW5nX3Nsb3QhPVBKU1VBX0lOVkFMSURfSUQpIAorICAgIHsKKwlwanN1YV9jb25mX2Nvbm5lY3QoYXBwX2NvbmZpZy5yaW5nX3Nsb3QsIDApOworICAgIH0KK30KKworLyogQ2FsbGJhY2sgZnJvbSB0aW1lciB3aGVuIHRoZSBtYXhpbXVtIGNhbGwgZHVyYXRpb24gaGFzIGJlZW4KKyAqIGV4Y2VlZGVkLgorICovCitzdGF0aWMgdm9pZCBjYWxsX3RpbWVvdXRfY2FsbGJhY2socGpfdGltZXJfaGVhcF90ICp0aW1lcl9oZWFwLAorCQkJCSAgc3RydWN0IHBqX3RpbWVyX2VudHJ5ICplbnRyeSkKK3sKKyAgICBwanN1YV9jYWxsX2lkIGNhbGxfaWQgPSBlbnRyeS0+aWQ7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyIHdhcm47CisgICAgcGpfc3RyX3QgaG5hbWUgPSBwal9zdHIoIldhcm5pbmciKTsKKyAgICBwal9zdHJfdCBodmFsdWUgPSBwal9zdHIoIjM5OSBwanN1YSBcIkNhbGwgZHVyYXRpb24gZXhjZWVkZWRcIiIpOworCisgICAgUEpfVU5VU0VEX0FSRyh0aW1lcl9oZWFwKTsKKworICAgIGlmIChjYWxsX2lkID09IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiSW52YWxpZCBjYWxsIElEIGluIHRpbWVyIGNhbGxiYWNrIikpOworCXJldHVybjsKKyAgICB9CisgICAgCisgICAgLyogQWRkIHdhcm5pbmcgaGVhZGVyICovCisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworICAgIHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkcl9pbml0Migmd2FybiwgJmhuYW1lLCAmaHZhbHVlKTsKKyAgICBwal9saXN0X3B1c2hfYmFjaygmbXNnX2RhdGEuaGRyX2xpc3QsICZ3YXJuKTsKKworICAgIC8qIENhbGwgZHVyYXRpb24gaGFzIGJlZW4gZXhjZWVkZWQ7IGRpc2Nvbm5lY3QgdGhlIGNhbGwgKi8KKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiRHVyYXRpb24gKCVkIHNlY29uZHMpIGhhcyBiZWVuIGV4Y2VlZGVkICIKKwkJCSAiZm9yIGNhbGwgJWQsIGRpc2Nvbm5lY3RpbmcgdGhlIGNhbGwiLAorCQkJIGFwcF9jb25maWcuZHVyYXRpb24sIGNhbGxfaWQpKTsKKyAgICBlbnRyeS0+aWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqc3VhX2NhbGxfaGFuZ3VwKGNhbGxfaWQsIDIwMCwgTlVMTCwgJm1zZ19kYXRhKTsKK30KKworLyoKKyAqIEhhbmRsZXIgd2hlbiBpbnZpdGUgc3RhdGUgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIG9uX2NhbGxfc3RhdGUocGpzdWFfY2FsbF9pZCBjYWxsX2lkLCBwanNpcF9ldmVudCAqZSkKK3sKKyAgICBwanN1YV9jYWxsX2luZm8gY2FsbF9pbmZvOworCisgICAgUEpfVU5VU0VEX0FSRyhlKTsKKworICAgIHBqc3VhX2NhbGxfZ2V0X2luZm8oY2FsbF9pZCwgJmNhbGxfaW5mbyk7CisKKyAgICBpZiAoY2FsbF9pbmZvLnN0YXRlID09IFBKU0lQX0lOVl9TVEFURV9ESVNDT05ORUNURUQpIHsKKworCS8qIFN0b3AgYWxsIHJpbmdiYWNrIGZvciB0aGlzIGNhbGwgKi8KKwlyaW5nX3N0b3AoY2FsbF9pZCk7CisKKwkvKiBDYW5jZWwgZHVyYXRpb24gdGltZXIsIGlmIGFueSAqLworCWlmIChhcHBfY29uZmlnLmNhbGxfZGF0YVtjYWxsX2lkXS50aW1lci5pZCAhPSBQSlNVQV9JTlZBTElEX0lEKSB7CisJICAgIGFwcF9jYWxsX2RhdGEgKmNkID0gJmFwcF9jb25maWcuY2FsbF9kYXRhW2NhbGxfaWRdOworCSAgICBwanNpcF9lbmRwb2ludCAqZW5kcHQgPSBwanN1YV9nZXRfcGpzaXBfZW5kcHQoKTsKKworCSAgICBjZC0+dGltZXIuaWQgPSBQSlNVQV9JTlZBTElEX0lEOworCSAgICBwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIoZW5kcHQsICZjZC0+dGltZXIpOworCX0KKworCS8qIFJld2luZCBwbGF5IGZpbGUgd2hlbiBoYW5ndXAgYXV0b21hdGljYWxseSwgCisJICogc2luY2UgZmlsZSBpcyBub3QgbG9vcGVkCisJICovCisJaWYgKGFwcF9jb25maWcuYXV0b19wbGF5X2hhbmd1cCkKKwkgICAgcGpzdWFfcGxheWVyX3NldF9wb3MoYXBwX2NvbmZpZy53YXZfaWQsIDApOworCisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZCBpcyBESVNDT05ORUNURUQgW3JlYXNvbj0lZCAoJXMpXSIsIAorCQkgIGNhbGxfaWQsCisJCSAgY2FsbF9pbmZvLmxhc3Rfc3RhdHVzLAorCQkgIGNhbGxfaW5mby5sYXN0X3N0YXR1c190ZXh0LnB0cikpOworCisJaWYgKGNhbGxfaWQgPT0gY3VycmVudF9jYWxsKSB7CisJICAgIGZpbmRfbmV4dF9jYWxsKCk7CisJfQorCisJLyogRHVtcCBtZWRpYSBzdGF0ZSB1cG9uIGRpc2Nvbm5lY3RlZCAqLworCWlmICgxKSB7CisJICAgIFBKX0xPRyg1LChUSElTX0ZJTEUsIAorCQkgICAgICAiQ2FsbCAlZCBkaXNjb25uZWN0ZWQsIGR1bXBpbmcgbWVkaWEgc3RhdHMuLiIsIAorCQkgICAgICBjYWxsX2lkKSk7CisJICAgIGxvZ19jYWxsX2R1bXAoY2FsbF9pZCk7CisJfQorCisgICAgfSBlbHNlIHsKKworCWlmIChhcHBfY29uZmlnLmR1cmF0aW9uICE9IFBKU1VBX0FQUF9OT19MSU1JVF9EVVJBVElPTiAmJiAKKwkgICAgY2FsbF9pbmZvLnN0YXRlID09IFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQpIAorCXsKKwkgICAgLyogU2NoZWR1bGUgdGltZXIgdG8gaGFuZ3VwIGNhbGwgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiAqLworCSAgICBhcHBfY2FsbF9kYXRhICpjZCA9ICZhcHBfY29uZmlnLmNhbGxfZGF0YVtjYWxsX2lkXTsKKwkgICAgcGpzaXBfZW5kcG9pbnQgKmVuZHB0ID0gcGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCk7CisJICAgIHBqX3RpbWVfdmFsIGRlbGF5OworCisJICAgIGNkLT50aW1lci5pZCA9IGNhbGxfaWQ7CisJICAgIGRlbGF5LnNlYyA9IGFwcF9jb25maWcuZHVyYXRpb247CisJICAgIGRlbGF5Lm1zZWMgPSAwOworCSAgICBwanNpcF9lbmRwdF9zY2hlZHVsZV90aW1lcihlbmRwdCwgJmNkLT50aW1lciwgJmRlbGF5KTsKKwl9CisKKwlpZiAoY2FsbF9pbmZvLnN0YXRlID09IFBKU0lQX0lOVl9TVEFURV9FQVJMWSkgeworCSAgICBpbnQgY29kZTsKKwkgICAgcGpfc3RyX3QgcmVhc29uOworCSAgICBwanNpcF9tc2cgKm1zZzsKKworCSAgICAvKiBUaGlzIGNhbiBvbmx5IG9jY3VyIGJlY2F1c2Ugb2YgVFggb3IgUlggbWVzc2FnZSAqLworCSAgICBwal9hc3NlcnQoZS0+dHlwZSA9PSBQSlNJUF9FVkVOVF9UU1hfU1RBVEUpOworCisJICAgIGlmIChlLT5ib2R5LnRzeF9zdGF0ZS50eXBlID09IFBKU0lQX0VWRU5UX1JYX01TRykgeworCQltc2cgPSBlLT5ib2R5LnRzeF9zdGF0ZS5zcmMucmRhdGEtPm1zZ19pbmZvLm1zZzsKKwkgICAgfSBlbHNlIHsKKwkJbXNnID0gZS0+Ym9keS50c3hfc3RhdGUuc3JjLnRkYXRhLT5tc2c7CisJICAgIH0KKworCSAgICBjb2RlID0gbXNnLT5saW5lLnN0YXR1cy5jb2RlOworCSAgICByZWFzb24gPSBtc2ctPmxpbmUuc3RhdHVzLnJlYXNvbjsKKworCSAgICAvKiBTdGFydCByaW5nYmFjayBmb3IgMTgwIGZvciBVQUMgdW5sZXNzIHRoZXJlJ3MgU0RQIGluIDE4MCAqLworCSAgICBpZiAoY2FsbF9pbmZvLnJvbGU9PVBKU0lQX1JPTEVfVUFDICYmIGNvZGU9PTE4MCAmJiAKKwkJbXNnLT5ib2R5ID09IE5VTEwgJiYgCisJCWNhbGxfaW5mby5tZWRpYV9zdGF0dXM9PVBKU1VBX0NBTExfTUVESUFfTk9ORSkgCisJICAgIHsKKwkJcmluZ2JhY2tfc3RhcnQoY2FsbF9pZCk7CisJICAgIH0KKworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZCBzdGF0ZSBjaGFuZ2VkIHRvICVzICglZCAlLipzKSIsIAorCQkgICAgICBjYWxsX2lkLCBjYWxsX2luZm8uc3RhdGVfdGV4dC5wdHIsCisJCSAgICAgIGNvZGUsIChpbnQpcmVhc29uLnNsZW4sIHJlYXNvbi5wdHIpKTsKKwl9IGVsc2UgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZCBzdGF0ZSBjaGFuZ2VkIHRvICVzIiwgCisJCSAgICAgIGNhbGxfaWQsCisJCSAgICAgIGNhbGxfaW5mby5zdGF0ZV90ZXh0LnB0cikpOworCX0KKworCWlmIChjdXJyZW50X2NhbGw9PVBKU1VBX0lOVkFMSURfSUQpCisJICAgIGN1cnJlbnRfY2FsbCA9IGNhbGxfaWQ7CisKKyAgICB9Cit9CisKKy8qKgorICogSGFuZGxlciB3aGVuIHRoZXJlIGlzIGluY29taW5nIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIG9uX2luY29taW5nX2NhbGwocGpzdWFfYWNjX2lkIGFjY19pZCwgcGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorCQkJICAgICBwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBwanN1YV9jYWxsX2luZm8gY2FsbF9pbmZvOworCisgICAgUEpfVU5VU0VEX0FSRyhhY2NfaWQpOworICAgIFBKX1VOVVNFRF9BUkcocmRhdGEpOworCisgICAgcGpzdWFfY2FsbF9nZXRfaW5mbyhjYWxsX2lkLCAmY2FsbF9pbmZvKTsKKworICAgIGlmIChjdXJyZW50X2NhbGw9PVBKU1VBX0lOVkFMSURfSUQpCisJY3VycmVudF9jYWxsID0gY2FsbF9pZDsKKworI2lmZGVmIFVTRV9HVUkKKyAgICBpZiAoIXNob3dOb3RpZmljYXRpb24oY2FsbF9pZCkpCisJcmV0dXJuOworI2VuZGlmCisKKyAgICAvKiBTdGFydCByaW5nYmFjayAqLworICAgIHJpbmdfc3RhcnQoY2FsbF9pZCk7CisgICAgCisgICAgaWYgKGFwcF9jb25maWcuYXV0b19hbnN3ZXIgPiAwKSB7CisJcGpzdWFfY2FsbF9zZXR0aW5nIGNhbGxfb3B0OworCisJcGpzdWFfY2FsbF9zZXR0aW5nX2RlZmF1bHQoJmNhbGxfb3B0KTsKKwljYWxsX29wdC5hdWRfY250ID0gYXBwX2NvbmZpZy5hdWRfY250OworCWNhbGxfb3B0LnZpZF9jbnQgPSBhcHBfY29uZmlnLnZpZC52aWRfY250OworCisJcGpzdWFfY2FsbF9hbnN3ZXIyKGNhbGxfaWQsICZjYWxsX29wdCwgYXBwX2NvbmZpZy5hdXRvX2Fuc3dlciwgTlVMTCwKKwkJCSAgIE5VTEwpOworICAgIH0KKyAgICAKKyAgICBpZiAoYXBwX2NvbmZpZy5hdXRvX2Fuc3dlciA8IDIwMCkgeworCWNoYXIgbm90aWZfc3RbODBdID0gezB9OworCisjaWYgUEpTVUFfSEFTX1ZJREVPCisJaWYgKGNhbGxfaW5mby5yZW1fb2ZmZXJlciAmJiBjYWxsX2luZm8ucmVtX3ZpZF9jbnQpIHsKKwkgICAgc25wcmludGYobm90aWZfc3QsIHNpemVvZihub3RpZl9zdCksIAorCQkgICAgICJUbyAlcyB0aGUgdmlkZW8sIHR5cGUgXCJ2aWQgJXNcIiBmaXJzdCwgIgorCQkgICAgICJiZWZvcmUgYW5zd2VyaW5nIHRoZSBjYWxsIVxuIiwKKwkJICAgICAoYXBwX2NvbmZpZy52aWQudmlkX2NudD8gInJlamVjdCI6ImFjY2VwdCIpLAorCQkgICAgIChhcHBfY29uZmlnLnZpZC52aWRfY250PyAiZGlzYWJsZSI6ImVuYWJsZSIpKTsKKwl9CisjZW5kaWYKKworCVBKX0xPRygzLChUSElTX0ZJTEUsCisJCSAgIkluY29taW5nIGNhbGwgZm9yIGFjY291bnQgJWQhXG4iCisJCSAgIk1lZGlhIGNvdW50OiAlZCBhdWRpbyAmICVkIHZpZGVvXG4iCisJCSAgIiVzIgorCQkgICJGcm9tOiAlc1xuIgorCQkgICJUbzogJXNcbiIKKwkJICAiUHJlc3MgJXMgdG8gYW5zd2VyIG9yICVzIHRvIHJlamVjdCBjYWxsIiwKKwkJICBhY2NfaWQsCisJCSAgY2FsbF9pbmZvLnJlbV9hdWRfY250LAorCQkgIGNhbGxfaW5mby5yZW1fdmlkX2NudCwKKwkJICBub3RpZl9zdCwKKwkJICBjYWxsX2luZm8ucmVtb3RlX2luZm8ucHRyLAorCQkgIGNhbGxfaW5mby5sb2NhbF9pbmZvLnB0ciwKKwkJICAoYXBwX2NvbmZpZy51c2VfY2xpPyJjYSBhIjoiYSIpLAorCQkgIChhcHBfY29uZmlnLnVzZV9jbGk/ImciOiJoIikpKTsKKyAgICB9Cit9CisKKy8qCisgKiBIYW5kbGVyIHdoZW4gYSB0cmFuc2FjdGlvbiB3aXRoaW4gYSBjYWxsIGhhcyBjaGFuZ2VkIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBvbl9jYWxsX3RzeF9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkgICAgICBwanNpcF90cmFuc2FjdGlvbiAqdHN4LAorCQkJICAgICAgcGpzaXBfZXZlbnQgKmUpCit7CisgICAgY29uc3QgcGpzaXBfbWV0aG9kIGluZm9fbWV0aG9kID0gCisgICAgeworCVBKU0lQX09USEVSX01FVEhPRCwKKwl7ICJJTkZPIiwgNCB9CisgICAgfTsKKworICAgIGlmIChwanNpcF9tZXRob2RfY21wKCZ0c3gtPm1ldGhvZCwgJmluZm9fbWV0aG9kKT09MCkgeworCS8qCisJICogSGFuZGxlIElORk8gbWV0aG9kLgorCSAqLworCWNvbnN0IHBqX3N0cl90IFNUUl9BUFBMSUNBVElPTiA9IHsgImFwcGxpY2F0aW9uIiwgMTF9OworCWNvbnN0IHBqX3N0cl90IFNUUl9EVE1GX1JFTEFZICA9IHsgImR0bWYtcmVsYXkiLCAxMCB9OworCXBqc2lwX21zZ19ib2R5ICpib2R5ID0gTlVMTDsKKwlwal9ib29sX3QgZHRtZl9pbmZvID0gUEpfRkFMU0U7CisJCisJaWYgKHRzeC0+cm9sZSA9PSBQSlNJUF9ST0xFX1VBQykgeworCSAgICBpZiAoZS0+Ym9keS50c3hfc3RhdGUudHlwZSA9PSBQSlNJUF9FVkVOVF9UWF9NU0cpCisJCWJvZHkgPSBlLT5ib2R5LnRzeF9zdGF0ZS5zcmMudGRhdGEtPm1zZy0+Ym9keTsKKwkgICAgZWxzZQorCQlib2R5ID0gZS0+Ym9keS50c3hfc3RhdGUudHN4LT5sYXN0X3R4LT5tc2ctPmJvZHk7CisJfSBlbHNlIHsKKwkgICAgaWYgKGUtPmJvZHkudHN4X3N0YXRlLnR5cGUgPT0gUEpTSVBfRVZFTlRfUlhfTVNHKQorCQlib2R5ID0gZS0+Ym9keS50c3hfc3RhdGUuc3JjLnJkYXRhLT5tc2dfaW5mby5tc2ctPmJvZHk7CisJfQorCQorCS8qIENoZWNrIERUTUYgY29udGVudCBpbiB0aGUgSU5GTyBtZXNzYWdlICovCisJaWYgKGJvZHkgJiYgYm9keS0+bGVuICYmCisJICAgIHBqX3N0cmljbXAoJmJvZHktPmNvbnRlbnRfdHlwZS50eXBlLCAmU1RSX0FQUExJQ0FUSU9OKT09MCAmJgorCSAgICBwal9zdHJpY21wKCZib2R5LT5jb250ZW50X3R5cGUuc3VidHlwZSwgJlNUUl9EVE1GX1JFTEFZKT09MCkKKwl7CisJICAgIGR0bWZfaW5mbyA9IFBKX1RSVUU7CisJfQorCisJaWYgKGR0bWZfaW5mbyAmJiB0c3gtPnJvbGUgPT0gUEpTSVBfUk9MRV9VQUMgJiYgCisJICAgICh0c3gtPnN0YXRlID09IFBKU0lQX1RTWF9TVEFURV9DT01QTEVURUQgfHwKKwkgICAgICAgKHRzeC0+c3RhdGUgPT0gUEpTSVBfVFNYX1NUQVRFX1RFUk1JTkFURUQgJiYKKwkgICAgICAgIGUtPmJvZHkudHN4X3N0YXRlLnByZXZfc3RhdGUgIT0gUEpTSVBfVFNYX1NUQVRFX0NPTVBMRVRFRCkpKSAKKwl7CisJICAgIC8qIFN0YXR1cyBvZiBvdXRnb2luZyBJTkZPIHJlcXVlc3QgKi8KKwkgICAgaWYgKHRzeC0+c3RhdHVzX2NvZGUgPj0gMjAwICYmIHRzeC0+c3RhdHVzX2NvZGUgPCAzMDApIHsKKwkJUEpfTE9HKDQsKFRISVNfRklMRSwgCisJCQkgICJDYWxsICVkOiBEVE1GIHNlbnQgc3VjY2Vzc2Z1bGx5IHdpdGggSU5GTyIsCisJCQkgIGNhbGxfaWQpKTsKKwkgICAgfSBlbHNlIGlmICh0c3gtPnN0YXR1c19jb2RlID49IDMwMCkgeworCQlQSl9MT0coNCwoVEhJU19GSUxFLCAKKwkJCSAgIkNhbGwgJWQ6IEZhaWxlZCB0byBzZW5kIERUTUYgd2l0aCBJTkZPOiAlZC8lLipzIiwKKwkJCSAgY2FsbF9pZCwKKwkJICAgICAgICAgIHRzeC0+c3RhdHVzX2NvZGUsCisJCQkgIChpbnQpdHN4LT5zdGF0dXNfdGV4dC5zbGVuLAorCQkJICB0c3gtPnN0YXR1c190ZXh0LnB0cikpOworCSAgICB9CisJfSBlbHNlIGlmIChkdG1mX2luZm8gJiYgdHN4LT5yb2xlID09IFBKU0lQX1JPTEVfVUFTICYmCisJCSAgIHRzeC0+c3RhdGUgPT0gUEpTSVBfVFNYX1NUQVRFX1RSWUlORykKKwl7CisJICAgIC8qIEFuc3dlciBpbmNvbWluZyBJTkZPIHdpdGggMjAwL09LICovCisJICAgIHBqc2lwX3J4X2RhdGEgKnJkYXRhOworCSAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKwkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJICAgIHJkYXRhID0gZS0+Ym9keS50c3hfc3RhdGUuc3JjLnJkYXRhOworCisJICAgIGlmIChyZGF0YS0+bXNnX2luZm8ubXNnLT5ib2R5KSB7CisJCXN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZSh0c3gtPmVuZHB0LCByZGF0YSwKKwkJCQkJCSAgICAgMjAwLCBOVUxMLCAmdGRhdGEpOworCQlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJCSAgICBzdGF0dXMgPSBwanNpcF90c3hfc2VuZF9tc2codHN4LCB0ZGF0YSk7CisKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhbGwgJWQ6IGluY29taW5nIElORk86XG4lLipzIiwgCisJCQkgIGNhbGxfaWQsCisJCQkgIChpbnQpcmRhdGEtPm1zZ19pbmZvLm1zZy0+Ym9keS0+bGVuLAorCQkJICByZGF0YS0+bXNnX2luZm8ubXNnLT5ib2R5LT5kYXRhKSk7CisJICAgIH0gZWxzZSB7CisJCXN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZSh0c3gtPmVuZHB0LCByZGF0YSwKKwkJCQkJCSAgICAgNDAwLCBOVUxMLCAmdGRhdGEpOworCQlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJCSAgICBzdGF0dXMgPSBwanNpcF90c3hfc2VuZF9tc2codHN4LCB0ZGF0YSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBHZW5lcmFsIHByb2Nlc3NpbmcgZm9yIG1lZGlhIHN0YXRlLiAibWkiIGlzIHRoZSBtZWRpYSBpbmRleCAqLworc3RhdGljIHZvaWQgb25fY2FsbF9nZW5lcmljX21lZGlhX3N0YXRlKHBqc3VhX2NhbGxfaW5mbyAqY2ksIHVuc2lnbmVkIG1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2Jvb2xfdCAqaGFzX2Vycm9yKQoreworICAgIGNvbnN0IGNoYXIgKnN0YXR1c19uYW1lW10gPSB7CisgICAgICAgICJOb25lIiwKKyAgICAgICAgIkFjdGl2ZSIsCisgICAgICAgICJMb2NhbCBob2xkIiwKKyAgICAgICAgIlJlbW90ZSBob2xkIiwKKyAgICAgICAgIkVycm9yIgorICAgIH07CisKKyAgICBQSl9VTlVTRURfQVJHKGhhc19lcnJvcik7CisKKyAgICBwal9hc3NlcnQoY2ktPm1lZGlhW21pXS5zdGF0dXMgPD0gUEpfQVJSQVlfU0laRShzdGF0dXNfbmFtZSkpOworICAgIHBqX2Fzc2VydChQSlNVQV9DQUxMX01FRElBX0VSUk9SID09IDQpOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIkNhbGwgJWQgbWVkaWEgJWQgW3R5cGU9JXNdLCBzdGF0dXMgaXMgJXMiLAorCSAgICAgIGNpLT5pZCwgbWksIHBqbWVkaWFfdHlwZV9uYW1lKGNpLT5tZWRpYVttaV0udHlwZSksCisJICAgICAgc3RhdHVzX25hbWVbY2ktPm1lZGlhW21pXS5zdGF0dXNdKSk7Cit9CisKKy8qIFByb2Nlc3MgYXVkaW8gbWVkaWEgc3RhdGUuICJtaSIgaXMgdGhlIG1lZGlhIGluZGV4LiAqLworc3RhdGljIHZvaWQgb25fY2FsbF9hdWRpb19zdGF0ZShwanN1YV9jYWxsX2luZm8gKmNpLCB1bnNpZ25lZCBtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYm9vbF90ICpoYXNfZXJyb3IpCit7CisgICAgUEpfVU5VU0VEX0FSRyhoYXNfZXJyb3IpOworCisgICAgLyogU3RvcCByaW5nYmFjayAqLworICAgIHJpbmdfc3RvcChjaS0+aWQpOworCisgICAgLyogQ29ubmVjdCBwb3J0cyBhcHByb3ByaWF0ZWx5IHdoZW4gbWVkaWEgc3RhdHVzIGlzIEFDVElWRSBvciBSRU1PVEUgSE9MRCwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugc2hvdWxkIE5PVCBjb25uZWN0IHRoZSBwb3J0cy4KKyAgICAgKi8KKyAgICBpZiAoY2ktPm1lZGlhW21pXS5zdGF0dXMgPT0gUEpTVUFfQ0FMTF9NRURJQV9BQ1RJVkUgfHwKKwljaS0+bWVkaWFbbWldLnN0YXR1cyA9PSBQSlNVQV9DQUxMX01FRElBX1JFTU9URV9IT0xEKQorICAgIHsKKwlwal9ib29sX3QgY29ubmVjdF9zb3VuZCA9IFBKX1RSVUU7CisJcGpfYm9vbF90IGRpc2Nvbm5lY3RfbWljID0gUEpfRkFMU0U7CisJcGpzdWFfY29uZl9wb3J0X2lkIGNhbGxfY29uZl9zbG90OworCisJY2FsbF9jb25mX3Nsb3QgPSBjaS0+bWVkaWFbbWldLnN0cmVhbS5hdWQuY29uZl9zbG90OworCisJLyogTG9vcGJhY2sgc291bmQsIGlmIGRlc2lyZWQgKi8KKwlpZiAoYXBwX2NvbmZpZy5hdXRvX2xvb3ApIHsKKwkgICAgcGpzdWFfY29uZl9jb25uZWN0KGNhbGxfY29uZl9zbG90LCBjYWxsX2NvbmZfc2xvdCk7CisJICAgIGNvbm5lY3Rfc291bmQgPSBQSl9GQUxTRTsKKwl9CisKKwkvKiBBdXRvbWF0aWNhbGx5IHJlY29yZCBjb252ZXJzYXRpb24sIGlmIGRlc2lyZWQgKi8KKwlpZiAoYXBwX2NvbmZpZy5hdXRvX3JlYyAmJiBhcHBfY29uZmlnLnJlY19wb3J0ICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwkgICAgcGpzdWFfY29uZl9jb25uZWN0KGNhbGxfY29uZl9zbG90LCBhcHBfY29uZmlnLnJlY19wb3J0KTsKKwl9CisKKwkvKiBTdHJlYW0gYSBmaWxlLCBpZiBkZXNpcmVkICovCisJaWYgKChhcHBfY29uZmlnLmF1dG9fcGxheSB8fCBhcHBfY29uZmlnLmF1dG9fcGxheV9oYW5ndXApICYmIAorCSAgICBhcHBfY29uZmlnLndhdl9wb3J0ICE9IFBKU1VBX0lOVkFMSURfSUQpCisJeworCSAgICBwanN1YV9jb25mX2Nvbm5lY3QoYXBwX2NvbmZpZy53YXZfcG9ydCwgY2FsbF9jb25mX3Nsb3QpOworCSAgICBjb25uZWN0X3NvdW5kID0gUEpfRkFMU0U7CisJfQorCisJLyogU3RyZWFtIEFWSSwgaWYgZGVzaXJlZCAqLworCWlmIChhcHBfY29uZmlnLmF2aV9hdXRvX3BsYXkgJiYKKwkgICAgYXBwX2NvbmZpZy5hdmlfZGVmX2lkeCAhPSBQSlNVQV9JTlZBTElEX0lEICYmCisJICAgIGFwcF9jb25maWcuYXZpW2FwcF9jb25maWcuYXZpX2RlZl9pZHhdLnNsb3QgIT0gUEpTVUFfSU5WQUxJRF9JRCkKKwl7CisJICAgIHBqc3VhX2NvbmZfY29ubmVjdChhcHBfY29uZmlnLmF2aVthcHBfY29uZmlnLmF2aV9kZWZfaWR4XS5zbG90LAorCQkJICAgICAgIGNhbGxfY29uZl9zbG90KTsKKwkgICAgZGlzY29ubmVjdF9taWMgPSBQSl9UUlVFOworCX0KKworCS8qIFB1dCBjYWxsIGluIGNvbmZlcmVuY2Ugd2l0aCBvdGhlciBjYWxscywgaWYgZGVzaXJlZCAqLworCWlmIChhcHBfY29uZmlnLmF1dG9fY29uZikgeworCSAgICBwanN1YV9jYWxsX2lkIGNhbGxfaWRzW1BKU1VBX01BWF9DQUxMU107CisJICAgIHVuc2lnbmVkIGNhbGxfY250PVBKX0FSUkFZX1NJWkUoY2FsbF9pZHMpOworCSAgICB1bnNpZ25lZCBpOworCisJICAgIC8qIEdldCBhbGwgY2FsbHMsIGFuZCBlc3RhYmxpc2ggbWVkaWEgY29ubmVjdGlvbiBiZXR3ZWVuCisJICAgICAqIHRoaXMgY2FsbCBhbmQgb3RoZXIgY2FsbHMuCisJICAgICAqLworCSAgICBwanN1YV9lbnVtX2NhbGxzKGNhbGxfaWRzLCAmY2FsbF9jbnQpOworCisJICAgIGZvciAoaT0wOyBpPGNhbGxfY250OyArK2kpIHsKKwkJaWYgKGNhbGxfaWRzW2ldID09IGNpLT5pZCkKKwkJICAgIGNvbnRpbnVlOworCQkKKwkJaWYgKCFwanN1YV9jYWxsX2hhc19tZWRpYShjYWxsX2lkc1tpXSkpCisJCSAgICBjb250aW51ZTsKKworCQlwanN1YV9jb25mX2Nvbm5lY3QoY2FsbF9jb25mX3Nsb3QsCisJCQkJICAgcGpzdWFfY2FsbF9nZXRfY29uZl9wb3J0KGNhbGxfaWRzW2ldKSk7CisJCXBqc3VhX2NvbmZfY29ubmVjdChwanN1YV9jYWxsX2dldF9jb25mX3BvcnQoY2FsbF9pZHNbaV0pLAorCQkgICAgICAgICAgICAgICAgICAgY2FsbF9jb25mX3Nsb3QpOworCisJCS8qIEF1dG9tYXRpY2FsbHkgcmVjb3JkIGNvbnZlcnNhdGlvbiwgaWYgZGVzaXJlZCAqLworCQlpZiAoYXBwX2NvbmZpZy5hdXRvX3JlYyAmJiBhcHBfY29uZmlnLnJlY19wb3J0ICE9CisJCQkJCSAgIFBKU1VBX0lOVkFMSURfSUQpCisJCXsKKwkJICAgIHBqc3VhX2NvbmZfY29ubmVjdChwanN1YV9jYWxsX2dldF9jb25mX3BvcnQoY2FsbF9pZHNbaV0pLCAKKwkJCQkgICAgICAgYXBwX2NvbmZpZy5yZWNfcG9ydCk7CisJCX0KKworCSAgICB9CisKKwkgICAgLyogQWxzbyBjb25uZWN0IGNhbGwgdG8gbG9jYWwgc291bmQgZGV2aWNlICovCisJICAgIGNvbm5lY3Rfc291bmQgPSBQSl9UUlVFOworCX0KKworCS8qIE90aGVyd2lzZSBjb25uZWN0IHRvIHNvdW5kIGRldmljZSAqLworCWlmIChjb25uZWN0X3NvdW5kKSB7CisJICAgIHBqc3VhX2NvbmZfY29ubmVjdChjYWxsX2NvbmZfc2xvdCwgMCk7CisJICAgIGlmICghZGlzY29ubmVjdF9taWMpCisJCXBqc3VhX2NvbmZfY29ubmVjdCgwLCBjYWxsX2NvbmZfc2xvdCk7CisKKwkgICAgLyogQXV0b21hdGljYWxseSByZWNvcmQgY29udmVyc2F0aW9uLCBpZiBkZXNpcmVkICovCisJICAgIGlmIChhcHBfY29uZmlnLmF1dG9fcmVjICYmIGFwcF9jb25maWcucmVjX3BvcnQgIT0gUEpTVUFfSU5WQUxJRF9JRCkKKwkgICAgeworCQlwanN1YV9jb25mX2Nvbm5lY3QoY2FsbF9jb25mX3Nsb3QsIGFwcF9jb25maWcucmVjX3BvcnQpOworCQlwanN1YV9jb25mX2Nvbm5lY3QoMCwgYXBwX2NvbmZpZy5yZWNfcG9ydCk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBQcm9jZXNzIHZpZGVvIG1lZGlhIHN0YXRlLiAibWkiIGlzIHRoZSBtZWRpYSBpbmRleC4gKi8KK3N0YXRpYyB2b2lkIG9uX2NhbGxfdmlkZW9fc3RhdGUocGpzdWFfY2FsbF9pbmZvICpjaSwgdW5zaWduZWQgbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2Jvb2xfdCAqaGFzX2Vycm9yKQoreworICAgIGlmIChjaS0+bWVkaWFfc3RhdHVzICE9IFBKU1VBX0NBTExfTUVESUFfQUNUSVZFKQorCXJldHVybjsKKworICAgIGFycmFuZ2Vfd2luZG93KGNpLT5tZWRpYVttaV0uc3RyZWFtLnZpZC53aW5faW4pOworCisgICAgUEpfVU5VU0VEX0FSRyhoYXNfZXJyb3IpOworfQorCisvKgorICogQ2FsbGJhY2sgb24gbWVkaWEgc3RhdGUgY2hhbmdlZCBldmVudC4KKyAqIFRoZSBhY3Rpb24gbWF5IGNvbm5lY3QgdGhlIGNhbGwgdG8gc291bmQgZGV2aWNlLCB0byBmaWxlLCBvcgorICogdG8gbG9vcCB0aGUgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgb25fY2FsbF9tZWRpYV9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQpCit7CisgICAgcGpzdWFfY2FsbF9pbmZvIGNhbGxfaW5mbzsKKyAgICB1bnNpZ25lZCBtaTsKKyAgICBwal9ib29sX3QgaGFzX2Vycm9yID0gUEpfRkFMU0U7CisKKyAgICBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjYWxsX2luZm8pOworCisgICAgZm9yIChtaT0wOyBtaTxjYWxsX2luZm8ubWVkaWFfY250OyArK21pKSB7CisJb25fY2FsbF9nZW5lcmljX21lZGlhX3N0YXRlKCZjYWxsX2luZm8sIG1pLCAmaGFzX2Vycm9yKTsKKworCXN3aXRjaCAoY2FsbF9pbmZvLm1lZGlhW21pXS50eXBlKSB7CisJY2FzZSBQSk1FRElBX1RZUEVfQVVESU86CisJICAgIG9uX2NhbGxfYXVkaW9fc3RhdGUoJmNhbGxfaW5mbywgbWksICZoYXNfZXJyb3IpOworCSAgICBicmVhazsKKwljYXNlIFBKTUVESUFfVFlQRV9WSURFTzoKKwkgICAgb25fY2FsbF92aWRlb19zdGF0ZSgmY2FsbF9pbmZvLCBtaSwgJmhhc19lcnJvcik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIC8qIE1ha2UgZ2NjIGhhcHB5IGFib3V0IGVudW0gbm90IGhhbmRsZWQgYnkgc3dpdGNoL2Nhc2UgKi8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChoYXNfZXJyb3IpIHsKKwlwal9zdHJfdCByZWFzb24gPSBwal9zdHIoIk1lZGlhIGZhaWxlZCIpOworCXBqc3VhX2NhbGxfaGFuZ3VwKGNhbGxfaWQsIDUwMCwgJnJlYXNvbiwgTlVMTCk7CisgICAgfQorCisjaWYgUEpTVUFfSEFTX1ZJREVPCisgICAgLyogQ2hlY2sgaWYgcmVtb3RlIGhhcyBqdXN0IHRyaWVkIHRvIGVuYWJsZSB2aWRlbyAqLworICAgIGlmIChjYWxsX2luZm8ucmVtX29mZmVyZXIgJiYgY2FsbF9pbmZvLnJlbV92aWRfY250KQorICAgIHsKKwlpbnQgdmlkX2lkeDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFjdGl2ZSB2aWRlbyAqLworCXZpZF9pZHggPSBwanN1YV9jYWxsX2dldF92aWRfc3RyZWFtX2lkeChjYWxsX2lkKTsKKwlpZiAodmlkX2lkeCA9PSAtMSB8fCBjYWxsX2luZm8ubWVkaWFbdmlkX2lkeF0uZGlyID09IFBKTUVESUFfRElSX05PTkUpIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwKKwkJICAgICAgIkp1c3QgcmVqZWN0ZWQgaW5jb21pbmcgdmlkZW8gb2ZmZXIgb24gY2FsbCAlZCwgIgorCQkgICAgICAidXNlIFwidmlkIGNhbGwgZW5hYmxlICVkXCIgb3IgXCJ2aWQgY2FsbCBhZGRcIiB0byAiCisJCSAgICAgICJlbmFibGUgdmlkZW8hIiwgY2FsbF9pZCwgdmlkX2lkeCkpOworCX0KKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIERUTUYgY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fZHRtZl9jYWxsYmFjayhwanN1YV9jYWxsX2lkIGNhbGxfaWQsIGludCBkdG1mKQoreworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJJbmNvbWluZyBEVE1GIG9uIGNhbGwgJWQ6ICVjIiwgY2FsbF9pZCwgZHRtZikpOworfQorCisvKgorICogUmVkaXJlY3Rpb24gaGFuZGxlci4KKyAqLworc3RhdGljIHBqc2lwX3JlZGlyZWN0X29wIGNhbGxfb25fcmVkaXJlY3RlZChwanN1YV9jYWxsX2lkIGNhbGxfaWQsIAorCQkJCQkgICAgY29uc3QgcGpzaXBfdXJpICp0YXJnZXQsCisJCQkJCSAgICBjb25zdCBwanNpcF9ldmVudCAqZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGUpOworCisgICAgaWYgKGFwcF9jb25maWcucmVkaXJfb3AgPT0gUEpTSVBfUkVESVJFQ1RfUEVORElORykgeworCWNoYXIgdXJpc3RyW1BKU0lQX01BWF9VUkxfU0laRV07CisJaW50IGxlbjsKKworCWxlbiA9IHBqc2lwX3VyaV9wcmludChQSlNJUF9VUklfSU5fRlJPTVRPX0hEUiwgdGFyZ2V0LCB1cmlzdHIsIAorCQkJICAgICAgc2l6ZW9mKHVyaXN0cikpOworCWlmIChsZW4gPCAxKSB7CisJICAgIHBqX2Fuc2lfc3RyY3B5KHVyaXN0ciwgIi0tVVJJIHRvbyBsb25nLS0iKTsKKwl9CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZCBpcyBiZWluZyByZWRpcmVjdGVkIHRvICUuKnMuICIKKwkJICAiUHJlc3MgJ1JhJyB0byBhY2NlcHQrcmVwbGFjZSBUbyBoZWFkZXIsICdSQScgdG8gYWNjZXB0LCAiCisJCSAgIidScicgdG8gcmVqZWN0LCBvciAnUmQnIHRvIGRpc2Nvbm5lY3QuIiwKKwkJICBjYWxsX2lkLCBsZW4sIHVyaXN0cikpOworICAgIH0KKworICAgIHJldHVybiBhcHBfY29uZmlnLnJlZGlyX29wOworfQorCisvKgorICogSGFuZGxlciByZWdpc3RyYXRpb24gc3RhdHVzIGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBvbl9yZWdfc3RhdGUocGpzdWFfYWNjX2lkIGFjY19pZCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFjY19pZCk7CisKKyAgICAvLyBMb2cgYWxyZWFkeSB3cml0dGVuLgorfQorCisvKgorICogSGFuZGxlciBmb3IgaW5jb21pbmcgcHJlc2VuY2Ugc3Vic2NyaXB0aW9uIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgb25faW5jb21pbmdfc3Vic2NyaWJlKHBqc3VhX2FjY19pZCBhY2NfaWQsCisJCQkJICBwanN1YV9zcnZfcHJlcyAqc3J2X3ByZXMsCisJCQkJICBwanN1YV9idWRkeV9pZCBidWRkeV9pZCwKKwkJCQkgIGNvbnN0IHBqX3N0cl90ICpmcm9tLAorCQkJCSAgcGpzaXBfcnhfZGF0YSAqcmRhdGEsCisJCQkJICBwanNpcF9zdGF0dXNfY29kZSAqY29kZSwKKwkJCQkgIHBqX3N0cl90ICpyZWFzb24sCisJCQkJICBwanN1YV9tc2dfZGF0YSAqbXNnX2RhdGEpCit7CisgICAgLyogSnVzdCBhY2NlcHQgdGhlIHJlcXVlc3QgKHRoZSBkZWZhdWx0IGJlaGF2aW9yKSAqLworICAgIFBKX1VOVVNFRF9BUkcoYWNjX2lkKTsKKyAgICBQSl9VTlVTRURfQVJHKHNydl9wcmVzKTsKKyAgICBQSl9VTlVTRURfQVJHKGJ1ZGR5X2lkKTsKKyAgICBQSl9VTlVTRURfQVJHKGZyb20pOworICAgIFBKX1VOVVNFRF9BUkcocmRhdGEpOworICAgIFBKX1VOVVNFRF9BUkcoY29kZSk7CisgICAgUEpfVU5VU0VEX0FSRyhyZWFzb24pOworICAgIFBKX1VOVVNFRF9BUkcobXNnX2RhdGEpOworfQorCisKKy8qCisgKiBIYW5kbGVyIG9uIGJ1ZGR5IHN0YXRlIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIG9uX2J1ZGR5X3N0YXRlKHBqc3VhX2J1ZGR5X2lkIGJ1ZGR5X2lkKQoreworICAgIHBqc3VhX2J1ZGR5X2luZm8gaW5mbzsKKyAgICBwanN1YV9idWRkeV9nZXRfaW5mbyhidWRkeV9pZCwgJmluZm8pOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiUuKnMgc3RhdHVzIGlzICUuKnMsIHN1YnNjcmlwdGlvbiBzdGF0ZSBpcyAlcyAiCisJCQkgIihsYXN0IHRlcm1pbmF0aW9uIHJlYXNvbiBjb2RlPSVkICUuKnMpIiwKKwkgICAgICAoaW50KWluZm8udXJpLnNsZW4sCisJICAgICAgaW5mby51cmkucHRyLAorCSAgICAgIChpbnQpaW5mby5zdGF0dXNfdGV4dC5zbGVuLAorCSAgICAgIGluZm8uc3RhdHVzX3RleHQucHRyLAorCSAgICAgIGluZm8uc3ViX3N0YXRlX25hbWUsCisJICAgICAgaW5mby5zdWJfdGVybV9jb2RlLAorCSAgICAgIChpbnQpaW5mby5zdWJfdGVybV9yZWFzb24uc2xlbiwKKwkgICAgICBpbmZvLnN1Yl90ZXJtX3JlYXNvbi5wdHIpKTsKK30KKworCisvKgorICogU3Vic2NyaXB0aW9uIHN0YXRlIGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBvbl9idWRkeV9ldnN1Yl9zdGF0ZShwanN1YV9idWRkeV9pZCBidWRkeV9pZCwKKwkJCQkgcGpzaXBfZXZzdWIgKnN1YiwKKwkJCQkgcGpzaXBfZXZlbnQgKmV2ZW50KQoreworICAgIGNoYXIgZXZlbnRfaW5mb1s4MF07CisKKyAgICBQSl9VTlVTRURfQVJHKHN1Yik7CisKKyAgICBldmVudF9pbmZvWzBdID0gJ1wwJzsKKworICAgIGlmIChldmVudC0+dHlwZSA9PSBQSlNJUF9FVkVOVF9UU1hfU1RBVEUgJiYKKwkgICAgZXZlbnQtPmJvZHkudHN4X3N0YXRlLnR5cGUgPT0gUEpTSVBfRVZFTlRfUlhfTVNHKQorICAgIHsKKwlwanNpcF9yeF9kYXRhICpyZGF0YSA9IGV2ZW50LT5ib2R5LnRzeF9zdGF0ZS5zcmMucmRhdGE7CisJc25wcmludGYoZXZlbnRfaW5mbywgc2l6ZW9mKGV2ZW50X2luZm8pLAorCQkgIiAoUlggJXMpIiwKKwkJIHBqc2lwX3J4X2RhdGFfZ2V0X2luZm8ocmRhdGEpKTsKKyAgICB9CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLAorCSAgICAgICJCdWRkeSAlZDogc3Vic2NyaXB0aW9uIHN0YXRlOiAlcyAoZXZlbnQ6ICVzJXMpIiwKKwkgICAgICBidWRkeV9pZCwgcGpzaXBfZXZzdWJfZ2V0X3N0YXRlX25hbWUoc3ViKSwKKwkgICAgICBwanNpcF9ldmVudF9zdHIoZXZlbnQtPnR5cGUpLAorCSAgICAgIGV2ZW50X2luZm8pKTsKKworfQorCisKKy8qKgorICogSW5jb21pbmcgSU0gbWVzc2FnZSAoaS5lLiBNRVNTQUdFIHJlcXVlc3QpIQorICovCitzdGF0aWMgdm9pZCBvbl9wYWdlcihwanN1YV9jYWxsX2lkIGNhbGxfaWQsIGNvbnN0IHBqX3N0cl90ICpmcm9tLCAKKwkJICAgICBjb25zdCBwal9zdHJfdCAqdG8sIGNvbnN0IHBqX3N0cl90ICpjb250YWN0LAorCQkgICAgIGNvbnN0IHBqX3N0cl90ICptaW1lX3R5cGUsIGNvbnN0IHBqX3N0cl90ICp0ZXh0KQoreworICAgIC8qIE5vdGU6IGNhbGwgaW5kZXggbWF5IGJlIC0xICovCisgICAgUEpfVU5VU0VEX0FSRyhjYWxsX2lkKTsKKyAgICBQSl9VTlVTRURfQVJHKHRvKTsKKyAgICBQSl9VTlVTRURfQVJHKGNvbnRhY3QpOworICAgIFBKX1VOVVNFRF9BUkcobWltZV90eXBlKTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIk1FU1NBR0UgZnJvbSAlLipzOiAlLipzICglLipzKSIsCisJICAgICAgKGludClmcm9tLT5zbGVuLCBmcm9tLT5wdHIsCisJICAgICAgKGludCl0ZXh0LT5zbGVuLCB0ZXh0LT5wdHIsCisJICAgICAgKGludCltaW1lX3R5cGUtPnNsZW4sIG1pbWVfdHlwZS0+cHRyKSk7Cit9CisKKworLyoqCisgKiBSZWNlaXZlZCB0eXBpbmcgaW5kaWNhdGlvbgorICovCitzdGF0aWMgdm9pZCBvbl90eXBpbmcocGpzdWFfY2FsbF9pZCBjYWxsX2lkLCBjb25zdCBwal9zdHJfdCAqZnJvbSwKKwkJICAgICAgY29uc3QgcGpfc3RyX3QgKnRvLCBjb25zdCBwal9zdHJfdCAqY29udGFjdCwKKwkJICAgICAgcGpfYm9vbF90IGlzX3R5cGluZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGNhbGxfaWQpOworICAgIFBKX1VOVVNFRF9BUkcodG8pOworICAgIFBKX1VOVVNFRF9BUkcoY29udGFjdCk7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiSU0gaW5kaWNhdGlvbjogJS4qcyAlcyIsCisJICAgICAgKGludClmcm9tLT5zbGVuLCBmcm9tLT5wdHIsCisJICAgICAgKGlzX3R5cGluZz8iaXMgdHlwaW5nLi4iOiJoYXMgc3RvcHBlZCB0eXBpbmciKSkpOworfQorCisKKy8qKgorICogQ2FsbCB0cmFuc2ZlciByZXF1ZXN0IHN0YXR1cy4KKyAqLworc3RhdGljIHZvaWQgb25fY2FsbF90cmFuc2Zlcl9zdGF0dXMocGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorCQkJCSAgICBpbnQgc3RhdHVzX2NvZGUsCisJCQkJICAgIGNvbnN0IHBqX3N0cl90ICpzdGF0dXNfdGV4dCwKKwkJCQkgICAgcGpfYm9vbF90IGZpbmFsLAorCQkJCSAgICBwal9ib29sX3QgKnBfY29udCkKK3sKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZDogdHJhbnNmZXIgc3RhdHVzPSVkICglLipzKSAlcyIsCisJICAgICAgY2FsbF9pZCwgc3RhdHVzX2NvZGUsCisJICAgICAgKGludClzdGF0dXNfdGV4dC0+c2xlbiwgc3RhdHVzX3RleHQtPnB0ciwKKwkgICAgICAoZmluYWwgPyAiW2ZpbmFsXSIgOiAiIikpKTsKKworICAgIGlmIChzdGF0dXNfY29kZS8xMDAgPT0gMikgeworCVBKX0xPRygzLChUSElTX0ZJTEUsIAorCSAgICAgICAgICAiQ2FsbCAlZDogY2FsbCB0cmFuc2ZlcmVkIHN1Y2Nlc3NmdWxseSwgZGlzY29ubmVjdGluZyBjYWxsIiwKKwkJICBjYWxsX2lkKSk7CisJcGpzdWFfY2FsbF9oYW5ndXAoY2FsbF9pZCwgUEpTSVBfU0NfR09ORSwgTlVMTCwgTlVMTCk7CisJKnBfY29udCA9IFBKX0ZBTFNFOworICAgIH0KK30KKworCisvKgorICogTm90aWZpY2F0aW9uIHRoYXQgY2FsbCBpcyBiZWluZyByZXBsYWNlZC4KKyAqLworc3RhdGljIHZvaWQgb25fY2FsbF9yZXBsYWNlZChwanN1YV9jYWxsX2lkIG9sZF9jYWxsX2lkLAorCQkJICAgICBwanN1YV9jYWxsX2lkIG5ld19jYWxsX2lkKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBvbGRfY2ksIG5ld19jaTsKKworICAgIHBqc3VhX2NhbGxfZ2V0X2luZm8ob2xkX2NhbGxfaWQsICZvbGRfY2kpOworICAgIHBqc3VhX2NhbGxfZ2V0X2luZm8obmV3X2NhbGxfaWQsICZuZXdfY2kpOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhbGwgJWQgd2l0aCAlLipzIGlzIGJlaW5nIHJlcGxhY2VkIGJ5ICIKKwkJCSAiY2FsbCAlZCB3aXRoICUuKnMiLAorCQkJIG9sZF9jYWxsX2lkLCAKKwkJCSAoaW50KW9sZF9jaS5yZW1vdGVfaW5mby5zbGVuLCBvbGRfY2kucmVtb3RlX2luZm8ucHRyLAorCQkJIG5ld19jYWxsX2lkLAorCQkJIChpbnQpbmV3X2NpLnJlbW90ZV9pbmZvLnNsZW4sIG5ld19jaS5yZW1vdGVfaW5mby5wdHIpKTsKK30KKworCisvKgorICogTkFUIHR5cGUgZGV0ZWN0aW9uIGNhbGxiYWNrLgorICovCitzdGF0aWMgdm9pZCBvbl9uYXRfZGV0ZWN0KGNvbnN0IHBqX3N0dW5fbmF0X2RldGVjdF9yZXN1bHQgKnJlcykKK3sKKyAgICBpZiAocmVzLT5zdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc3VhX3BlcnJvcihUSElTX0ZJTEUsICJOQVQgZGV0ZWN0aW9uIGZhaWxlZCIsIHJlcy0+c3RhdHVzKTsKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAiTkFUIGRldGVjdGVkIGFzICVzIiwgcmVzLT5uYXRfdHlwZV9uYW1lKSk7CisgICAgfQorfQorCisKKy8qCisgKiBNV0kgaW5kaWNhdGlvbgorICovCitzdGF0aWMgdm9pZCBvbl9td2lfaW5mbyhwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9td2lfaW5mbyAqbXdpX2luZm8pCit7CisgICAgcGpfc3RyX3QgYm9keTsKKyAgICAKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUmVjZWl2ZWQgTVdJIGZvciBhY2MgJWQ6IiwgYWNjX2lkKSk7CisKKyAgICBpZiAobXdpX2luZm8tPnJkYXRhLT5tc2dfaW5mby5jdHlwZSkgeworCWNvbnN0IHBqc2lwX2N0eXBlX2hkciAqY3R5cGUgPSBtd2lfaW5mby0+cmRhdGEtPm1zZ19pbmZvLmN0eXBlOworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiBDb250ZW50LVR5cGU6ICUuKnMvJS4qcyIsCisJICAgICAgICAgIChpbnQpY3R5cGUtPm1lZGlhLnR5cGUuc2xlbiwKKwkJICBjdHlwZS0+bWVkaWEudHlwZS5wdHIsCisJCSAgKGludCljdHlwZS0+bWVkaWEuc3VidHlwZS5zbGVuLAorCQkgIGN0eXBlLT5tZWRpYS5zdWJ0eXBlLnB0cikpOworICAgIH0KKworICAgIGlmICghbXdpX2luZm8tPnJkYXRhLT5tc2dfaW5mby5tc2ctPmJvZHkpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiICBubyBtZXNzYWdlIGJvZHkiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGJvZHkucHRyID0gKGNoYXIgKiltd2lfaW5mby0+cmRhdGEtPm1zZ19pbmZvLm1zZy0+Ym9keS0+ZGF0YTsKKyAgICBib2R5LnNsZW4gPSBtd2lfaW5mby0+cmRhdGEtPm1zZ19pbmZvLm1zZy0+Ym9keS0+bGVuOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiBCb2R5OlxuJS4qcyIsIChpbnQpYm9keS5zbGVuLCBib2R5LnB0cikpOworfQorCisKKy8qCisgKiBUcmFuc3BvcnQgc3RhdHVzIG5vdGlmaWNhdGlvbgorICovCitzdGF0aWMgdm9pZCBvbl90cmFuc3BvcnRfc3RhdGUocGpzaXBfdHJhbnNwb3J0ICp0cCwgCisJCQkgICAgICAgcGpzaXBfdHJhbnNwb3J0X3N0YXRlIHN0YXRlLAorCQkJICAgICAgIGNvbnN0IHBqc2lwX3RyYW5zcG9ydF9zdGF0ZV9pbmZvICppbmZvKQoreworICAgIGNoYXIgaG9zdF9wb3J0WzEyOF07CisKKyAgICBwal9hbnNpX3NucHJpbnRmKGhvc3RfcG9ydCwgc2l6ZW9mKGhvc3RfcG9ydCksICJbJS4qczolZF0iLAorCQkgICAgIChpbnQpdHAtPnJlbW90ZV9uYW1lLmhvc3Quc2xlbiwKKwkJICAgICB0cC0+cmVtb3RlX25hbWUuaG9zdC5wdHIsCisJCSAgICAgdHAtPnJlbW90ZV9uYW1lLnBvcnQpOworCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUEpTSVBfVFBfU1RBVEVfQ09OTkVDVEVEOgorCXsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlNJUCAlcyB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIHRvICVzIiwKKwkJICAgICB0cC0+dHlwZV9uYW1lLCBob3N0X3BvcnQpKTsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIFBKU0lQX1RQX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKwl7CisJICAgIGNoYXIgYnVmWzEwMF07CisKKwkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlNJUCAlcyB0cmFuc3BvcnQgaXMgZGlzY29ubmVjdGVkICIKKwkJICAgICJmcm9tICVzIiwgdHAtPnR5cGVfbmFtZSwgaG9zdF9wb3J0KTsKKwkgICAgcGpzdWFfcGVycm9yKFRISVNfRklMRSwgYnVmLCBpbmZvLT5zdGF0dXMpOworCX0KKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorCisjaWYgZGVmaW5lZChQSlNJUF9IQVNfVExTX1RSQU5TUE9SVCkgJiYgUEpTSVBfSEFTX1RMU19UUkFOU1BPUlQhPTAKKworICAgIGlmICghcGpfYW5zaV9zdHJpY21wKHRwLT50eXBlX25hbWUsICJ0bHMiKSAmJiBpbmZvLT5leHRfaW5mbyAmJgorCShzdGF0ZSA9PSBQSlNJUF9UUF9TVEFURV9DT05ORUNURUQgfHwgCisJICgocGpzaXBfdGxzX3N0YXRlX2luZm8qKWluZm8tPmV4dF9pbmZvKS0+CisJCQkgICAgICAgICBzc2xfc29ja19pbmZvLT52ZXJpZnlfc3RhdHVzICE9IFBKX1NVQ0NFU1MpKQorICAgIHsKKwlwanNpcF90bHNfc3RhdGVfaW5mbyAqdGxzX2luZm8gPSAocGpzaXBfdGxzX3N0YXRlX2luZm8qKWluZm8tPmV4dF9pbmZvOworCXBqX3NzbF9zb2NrX2luZm8gKnNzbF9zb2NrX2luZm8gPSB0bHNfaW5mby0+c3NsX3NvY2tfaW5mbzsKKwljaGFyIGJ1ZlsyMDQ4XTsKKwljb25zdCBjaGFyICp2ZXJpZl9tc2dzWzMyXTsKKwl1bnNpZ25lZCB2ZXJpZl9tc2dfY250OworCisJLyogRHVtcCBzZXJ2ZXIgVExTIGNpcGhlciAqLworCVBKX0xPRyg0LChUSElTX0ZJTEUsICJUTFMgY2lwaGVyIHVzZWQ6IDB4JTA2WC8lcyIsCisJCSAgc3NsX3NvY2tfaW5mby0+Y2lwaGVyLAorCQkgIHBqX3NzbF9jaXBoZXJfbmFtZShzc2xfc29ja19pbmZvLT5jaXBoZXIpICkpOworCisJLyogRHVtcCBzZXJ2ZXIgVExTIGNlcnRpZmljYXRlICovCisJcGpfc3NsX2NlcnRfaW5mb19kdW1wKHNzbF9zb2NrX2luZm8tPnJlbW90ZV9jZXJ0X2luZm8sICIgICIsCisJCQkgICAgICBidWYsIHNpemVvZihidWYpKTsKKwlQSl9MT0coNCwoVEhJU19GSUxFLCAiVExTIGNlcnQgaW5mbyBvZiAlczpcbiVzIiwgaG9zdF9wb3J0LCBidWYpKTsKKworCS8qIER1bXAgc2VydmVyIFRMUyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcmVzdWx0ICovCisJdmVyaWZfbXNnX2NudCA9IFBKX0FSUkFZX1NJWkUodmVyaWZfbXNncyk7CisJcGpfc3NsX2NlcnRfZ2V0X3ZlcmlmeV9zdGF0dXNfc3RyaW5ncyhzc2xfc29ja19pbmZvLT52ZXJpZnlfc3RhdHVzLAorCQkJCQkgICAgICB2ZXJpZl9tc2dzLCAmdmVyaWZfbXNnX2NudCk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIlRMUyBjZXJ0IHZlcmlmaWNhdGlvbiByZXN1bHQgb2YgJXMgOiAlcyIsCisJCQkgICAgIGhvc3RfcG9ydCwKKwkJCSAgICAgKHZlcmlmX21zZ19jbnQgPT0gMT8gdmVyaWZfbXNnc1swXToiIikpKTsKKwlpZiAodmVyaWZfbXNnX2NudCA+IDEpIHsKKwkgICAgdW5zaWduZWQgaTsKKwkgICAgZm9yIChpID0gMDsgaSA8IHZlcmlmX21zZ19jbnQ7ICsraSkKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgIi0gJXMiLCB2ZXJpZl9tc2dzW2ldKSk7CisJfQorCisJaWYgKHNzbF9zb2NrX2luZm8tPnZlcmlmeV9zdGF0dXMgJiYKKwkgICAgIWFwcF9jb25maWcudWRwX2NmZy50bHNfc2V0dGluZy52ZXJpZnlfc2VydmVyKSAKKwl7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJQSlNVQSBpcyBjb25maWd1cmVkIHRvIGlnbm9yZSBUTFMgY2VydCAiCisJCQkJICJ2ZXJpZmljYXRpb24gZXJyb3JzIikpOworCX0KKyAgICB9CisKKyNlbmRpZgorCit9CisKKy8qCisgKiBOb3RpZmljYXRpb24gb24gSUNFIGVycm9yLgorICovCitzdGF0aWMgdm9pZCBvbl9pY2VfdHJhbnNwb3J0X2Vycm9yKGludCBpbmRleCwgcGpfaWNlX3N0cmFuc19vcCBvcCwKKwkJCQkgICBwal9zdGF0dXNfdCBzdGF0dXMsIHZvaWQgKnBhcmFtKQoreworICAgIFBKX1VOVVNFRF9BUkcob3ApOworICAgIFBKX1VOVVNFRF9BUkcocGFyYW0pOworICAgIFBKX1BFUlJPUigxLChUSElTX0ZJTEUsIHN0YXR1cywKKwkgICAgICAgICAiSUNFIGtlZXAgYWxpdmUgZmFpbHVyZSBmb3IgdHJhbnNwb3J0ICVkIiwgaW5kZXgpKTsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBvbiBzb3VuZCBkZXZpY2Ugb3BlcmF0aW9uLgorICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgb25fc25kX2Rldl9vcGVyYXRpb24oaW50IG9wZXJhdGlvbikKK3sKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiVHVybmluZyBzb3VuZCBkZXZpY2UgJXMiLCAob3BlcmF0aW9uPyAiT04iOiJPRkYiKSkpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBDYWxsYmFjayBvbiBtZWRpYSBldmVudHMgKi8KK3N0YXRpYyB2b2lkIG9uX2NhbGxfbWVkaWFfZXZlbnQocGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZWRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2V2ZW50ICpldmVudCkKK3sKKyAgICBjaGFyIGV2ZW50X25hbWVbNV07CisKKyAgICBQSl9MT0coNSwoVEhJU19GSUxFLCAiRXZlbnQgJXMiLAorCSAgICAgIHBqbWVkaWFfZm91cmNjX25hbWUoZXZlbnQtPnR5cGUsIGV2ZW50X25hbWUpKSk7CisKKyNpZiBQSlNVQV9IQVNfVklERU8KKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gUEpNRURJQV9FVkVOVF9GTVRfQ0hBTkdFRCkgeworCS8qIEFkanVzdCByZW5kZXJlciB3aW5kb3cgc2l6ZSB0byBvcmlnaW5hbCB2aWRlbyBzaXplICovCisJcGpzdWFfY2FsbF9pbmZvIGNpOworCXBqc3VhX3ZpZF93aW5faWQgd2lkOworCXBqbWVkaWFfcmVjdF9zaXplIHNpemU7CisKKwlwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjaSk7CisKKwlpZiAoKGNpLm1lZGlhW21lZF9pZHhdLnR5cGUgPT0gUEpNRURJQV9UWVBFX1ZJREVPKSAmJgorCSAgICAoY2kubWVkaWFbbWVkX2lkeF0uZGlyICYgUEpNRURJQV9ESVJfREVDT0RJTkcpKQorCXsKKwkgICAgd2lkID0gY2kubWVkaWFbbWVkX2lkeF0uc3RyZWFtLnZpZC53aW5faW47CisJICAgIHNpemUgPSBldmVudC0+ZGF0YS5mbXRfY2hhbmdlZC5uZXdfZm10LmRldC52aWQuc2l6ZTsKKwkgICAgcGpzdWFfdmlkX3dpbl9zZXRfc2l6ZSh3aWQsICZzaXplKTsKKwl9CisKKwkvKiBSZS1hcnJhbmdlIHZpZGVvIHdpbmRvd3MgKi8KKwlhcnJhbmdlX3dpbmRvdyhQSlNVQV9JTlZBTElEX0lEKTsKKyAgICB9CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcoY2FsbF9pZCk7CisgICAgUEpfVU5VU0VEX0FSRyhtZWRfaWR4KTsKKyAgICBQSl9VTlVTRURfQVJHKGV2ZW50KTsKKyNlbmRpZgorfQorCisjaWZkZWYgVFJBTlNQT1JUX0FEQVBURVJfU0FNUExFCisvKgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiBtZWRpYSB0cmFuc3BvcnQgbmVlZHMgdG8gYmUgY3JlYXRlZC4KKyAqLworc3RhdGljIHBqbWVkaWFfdHJhbnNwb3J0KiBvbl9jcmVhdGVfbWVkaWFfdHJhbnNwb3J0KHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwKKwkJCQkJCSAgICB1bnNpZ25lZCBtZWRpYV9pZHgsCisJCQkJCQkgICAgcGptZWRpYV90cmFuc3BvcnQgKmJhc2VfdHAsCisJCQkJCQkgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgcGptZWRpYV90cmFuc3BvcnQgKmFkYXB0ZXI7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogQ3JlYXRlIHRoZSBhZGFwdGVyICovCisgICAgc3RhdHVzID0gcGptZWRpYV90cF9hZGFwdGVyX2NyZWF0ZShwanN1YV9nZXRfcGptZWRpYV9lbmRwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgYmFzZV90cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFBKU1VBX01FRF9UUF9DTE9TRV9NRU1CRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCVBKX1BFUlJPUigxLChUSElTX0ZJTEUsIHN0YXR1cywgIkVycm9yIGNyZWF0aW5nIGFkYXB0ZXIiKSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIk1lZGlhIHRyYW5zcG9ydCBpcyBjcmVhdGVkIGZvciBjYWxsICVkIG1lZGlhICVkIiwKKwkgICAgICBjYWxsX2lkLCBtZWRpYV9pZHgpKTsKKworICAgIHJldHVybiBhZGFwdGVyOworfQorI2VuZGlmCisKKy8qIFBsYXlmaWxlIGRvbmUgbm90aWZpY2F0aW9uLCBzZXQgdGltZXIgdG8gaGFuZ3VwIGNhbGxzICovCitwal9zdGF0dXNfdCBvbl9wbGF5ZmlsZV9kb25lKHBqbWVkaWFfcG9ydCAqcG9ydCwgdm9pZCAqdXNyX2RhdGEpCit7CisgICAgcGpfdGltZV92YWwgZGVsYXk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBvcnQpOworICAgIFBKX1VOVVNFRF9BUkcodXNyX2RhdGEpOworCisgICAgLyogSnVzdCByZXdpbmQgV0FWIHdoZW4gaXQgaXMgcGxheWVkIG91dHNpZGUgb2YgY2FsbCAqLworICAgIGlmIChwanN1YV9jYWxsX2dldF9jb3VudCgpID09IDApIHsKKwlwanN1YV9wbGF5ZXJfc2V0X3BvcyhhcHBfY29uZmlnLndhdl9pZCwgMCk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyogVGltZXIgaXMgYWxyZWFkeSBhY3RpdmUgKi8KKyAgICBpZiAoYXBwX2NvbmZpZy5hdXRvX2hhbmd1cF90aW1lci5pZCA9PSAxKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgYXBwX2NvbmZpZy5hdXRvX2hhbmd1cF90aW1lci5pZCA9IDE7CisgICAgZGVsYXkuc2VjID0gMDsKKyAgICBkZWxheS5tc2VjID0gMjAwOyAvKiBHaXZlIDIwMCBtcyBiZWZvcmUgaGFuZ3VwICovCisgICAgcGpzaXBfZW5kcHRfc2NoZWR1bGVfdGltZXIocGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCksIAorCQkJICAgICAgICZhcHBfY29uZmlnLmF1dG9faGFuZ3VwX3RpbWVyLCAKKwkJCSAgICAgICAmZGVsYXkpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEF1dG8gaGFuZ3VwIHRpbWVyIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBoYW5ndXBfdGltZW91dF9jYWxsYmFjayhwal90aW1lcl9oZWFwX3QgKnRpbWVyX2hlYXAsCisJCQkJICAgIHN0cnVjdCBwal90aW1lcl9lbnRyeSAqZW50cnkpCit7CisgICAgUEpfVU5VU0VEX0FSRyh0aW1lcl9oZWFwKTsKKyAgICBQSl9VTlVTRURfQVJHKGVudHJ5KTsKKworICAgIGFwcF9jb25maWcuYXV0b19oYW5ndXBfdGltZXIuaWQgPSAwOworICAgIHBqc3VhX2NhbGxfaGFuZ3VwX2FsbCgpOworfQorCisvKgorICogQSBzaW1wbGUgcmVnaXN0cmFyLCBpbnZva2VkIGJ5IGRlZmF1bHRfbW9kX29uX3J4X3JlcXVlc3QoKQorICovCitzdGF0aWMgdm9pZCBzaW1wbGVfcmVnaXN0cmFyKHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIGNvbnN0IHBqc2lwX2V4cGlyZXNfaGRyICpleHA7CisgICAgY29uc3QgcGpzaXBfaGRyICpoOworICAgIHVuc2lnbmVkIGNudCA9IDA7CisgICAgcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyICpzcnY7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfY3JlYXRlX3Jlc3BvbnNlKHBqc3VhX2dldF9wanNpcF9lbmRwdCgpLAorCQkJCQkgcmRhdGEsIDIwMCwgTlVMTCwgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgcmV0dXJuOworCisgICAgZXhwID0gKHBqc2lwX2V4cGlyZXNfaGRyICopcGpzaXBfbXNnX2ZpbmRfaGRyKHJkYXRhLT5tc2dfaW5mby5tc2csIAorCQkJCQkJICBQSlNJUF9IX0VYUElSRVMsIE5VTEwpOworCisgICAgaCA9IHJkYXRhLT5tc2dfaW5mby5tc2ctPmhkci5uZXh0OworICAgIHdoaWxlIChoICE9ICZyZGF0YS0+bXNnX2luZm8ubXNnLT5oZHIpIHsKKwlpZiAoaC0+dHlwZSA9PSBQSlNJUF9IX0NPTlRBQ1QpIHsKKwkgICAgY29uc3QgcGpzaXBfY29udGFjdF9oZHIgKmMgPSAoY29uc3QgcGpzaXBfY29udGFjdF9oZHIqKWg7CisJICAgIGludCBlID0gYy0+ZXhwaXJlczsKKworCSAgICBpZiAoZSA8IDApIHsKKwkJaWYgKGV4cCkKKwkJICAgIGUgPSBleHAtPml2YWx1ZTsKKwkJZWxzZQorCQkgICAgZSA9IDM2MDA7CisJICAgIH0KKworCSAgICBpZiAoZSA+IDApIHsKKwkJcGpzaXBfY29udGFjdF9oZHIgKm5jID0gKHBqc2lwX2NvbnRhY3RfaGRyICopcGpzaXBfaGRyX2Nsb25lKAorCQkJCQkJCQl0ZGF0YS0+cG9vbCwgaCk7CisJCW5jLT5leHBpcmVzID0gZTsKKwkJcGpzaXBfbXNnX2FkZF9oZHIodGRhdGEtPm1zZywgKHBqc2lwX2hkciopbmMpOworCQkrK2NudDsKKwkgICAgfQorCX0KKwloID0gaC0+bmV4dDsKKyAgICB9CisKKyAgICBzcnYgPSBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfY3JlYXRlKHRkYXRhLT5wb29sLCBOVUxMLCBOVUxMKTsKKyAgICBzcnYtPm5hbWUgPSBwal9zdHIoIlNlcnZlciIpOworICAgIHNydi0+aHZhbHVlID0gcGpfc3RyKCJwanN1YSBzaW1wbGUgcmVnaXN0cmFyIik7CisgICAgcGpzaXBfbXNnX2FkZF9oZHIodGRhdGEtPm1zZywgKHBqc2lwX2hkciopc3J2KTsKKworICAgIHBqc2lwX2VuZHB0X3NlbmRfcmVzcG9uc2UyKHBqc3VhX2dldF9wanNpcF9lbmRwdCgpLAorCQkgICAgICAgcmRhdGEsIHRkYXRhLCBOVUxMLCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHNpbXBsZSBtb2R1bGUgdG8gaGFuZGxlIG90aGVyd2lzZSB1bmhhbmRsZWQgcmVxdWVzdC4gV2Ugd2lsbCByZWdpc3RlcgorICogdGhpcyB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkuCisgKi8KKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIHJlcXVlc3QgKi8KK3N0YXRpYyBwal9ib29sX3QgZGVmYXVsdF9tb2Rfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKyAgICBwanNpcF9zdGF0dXNfY29kZSBzdGF0dXNfY29kZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBEb24ndCByZXNwb25kIHRvIEFDSyEgKi8KKyAgICBpZiAocGpzaXBfbWV0aG9kX2NtcCgmcmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLAorCQkJICZwanNpcF9hY2tfbWV0aG9kKSA9PSAwKQorCXJldHVybiBQSl9UUlVFOworCisgICAgLyogU2ltcGxlIHJlZ2lzdHJhciAqLworICAgIGlmIChwanNpcF9tZXRob2RfY21wKCZyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBqc2lwX3JlZ2lzdGVyX21ldGhvZCkgPT0gMCkKKyAgICB7CisJc2ltcGxlX3JlZ2lzdHJhcihyZGF0YSk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGJhc2ljIHJlc3BvbnNlLiAqLworICAgIGlmIChwanNpcF9tZXRob2RfY21wKCZyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QsIAorCQkJICZwanNpcF9ub3RpZnlfbWV0aG9kKSA9PSAwKQorICAgIHsKKwkvKiBVbnNvbGljaXRlZCBOT1RJRlkncywgc2VuZCB3aXRoIEJhZCBSZXF1ZXN0ICovCisJc3RhdHVzX2NvZGUgPSBQSlNJUF9TQ19CQURfUkVRVUVTVDsKKyAgICB9IGVsc2UgeworCS8qIFByb2JhYmx5IHVua25vd24gbWV0aG9kICovCisJc3RhdHVzX2NvZGUgPSBQSlNJUF9TQ19NRVRIT0RfTk9UX0FMTE9XRUQ7CisgICAgfQorICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZShwanN1YV9nZXRfcGpzaXBfZW5kcHQoKSwgCisJCQkJCSByZGF0YSwgc3RhdHVzX2NvZGUsIAorCQkJCQkgTlVMTCwgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSByZXNwb25zZSIsIHN0YXR1cyk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogQWRkIEFsbG93IGlmIHdlJ3JlIHJlc3BvbmRpbmcgd2l0aCA0MDUgKi8KKyAgICBpZiAoc3RhdHVzX2NvZGUgPT0gUEpTSVBfU0NfTUVUSE9EX05PVF9BTExPV0VEKSB7CisJY29uc3QgcGpzaXBfaGRyICpjYXBfaGRyOworCWNhcF9oZHIgPSBwanNpcF9lbmRwdF9nZXRfY2FwYWJpbGl0eShwanN1YV9nZXRfcGpzaXBfZW5kcHQoKSwgCisJCQkJCSAgICAgUEpTSVBfSF9BTExPVywgTlVMTCk7CisJaWYgKGNhcF9oZHIpIHsKKwkgICAgcGpzaXBfbXNnX2FkZF9oZHIodGRhdGEtPm1zZywgKHBqc2lwX2hkciAqKXBqc2lwX2hkcl9jbG9uZSgKKwkJCQkJCQkgdGRhdGEtPnBvb2wsIGNhcF9oZHIpKTsKKwl9CisgICAgfQorCisgICAgLyogQWRkIFVzZXItQWdlbnQgaGVhZGVyICovCisgICAgeworCXBqX3N0cl90IHVzZXJfYWdlbnQ7CisJY2hhciB0bXBbODBdOworCWNvbnN0IHBqX3N0cl90IFVTRVJfQUdFTlQgPSB7ICJVc2VyLUFnZW50IiwgMTB9OworCXBqc2lwX2hkciAqaDsKKworCXBqX2Fuc2lfc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlBKU1VBIHYlcy8lcyIsIAorCQkJIHBqX2dldF92ZXJzaW9uKCksIFBKX09TX05BTUUpOworCXBqX3N0cmR1cDJfd2l0aF9udWxsKHRkYXRhLT5wb29sLCAmdXNlcl9hZ2VudCwgdG1wKTsKKworCWggPSAocGpzaXBfaGRyKikgcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyX2NyZWF0ZSh0ZGF0YS0+cG9vbCwKKwkJCQkJCQkgJlVTRVJfQUdFTlQsCisJCQkJCQkJICZ1c2VyX2FnZW50KTsKKwlwanNpcF9tc2dfYWRkX2hkcih0ZGF0YS0+bXNnLCBoKTsKKyAgICB9CisKKyAgICBwanNpcF9lbmRwdF9zZW5kX3Jlc3BvbnNlMihwanN1YV9nZXRfcGpzaXBfZW5kcHQoKSwgcmRhdGEsIHRkYXRhLCAKKwkJCSAgICAgICBOVUxMLCBOVUxMKTsKKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisvKiBUaGUgbW9kdWxlIGluc3RhbmNlLiAqLworc3RhdGljIHBqc2lwX21vZHVsZSBtb2RfZGVmYXVsdF9oYW5kbGVyID0gCit7CisgICAgTlVMTCwgTlVMTCwJCQkJLyogcHJldiwgbmV4dC4JCSovCisgICAgeyAibW9kLWRlZmF1bHQtaGFuZGxlciIsIDE5IH0sCS8qIE5hbWUuCQkqLworICAgIC0xLAkJCQkJLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTis5OSwJLyogUHJpb3JpdHkJICAgICAgICAqLworICAgIE5VTEwsCQkJCS8qIGxvYWQoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiBzdGFydCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0b3AoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiB1bmxvYWQoKQkJKi8KKyAgICAmZGVmYXVsdF9tb2Rfb25fcnhfcmVxdWVzdCwJCS8qIG9uX3J4X3JlcXVlc3QoKQkqLworICAgIE5VTEwsCQkJCS8qIG9uX3J4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90eF9yZXF1ZXN0LgkqLworICAgIE5VTEwsCQkJCS8qIG9uX3R4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90c3hfc3RhdGUoKQkqLworCit9OworCisvKiogQ0xJIGNhbGxiYWNrICoqLworCisvKiBDYWxsZWQgb24gQ0xJIChyZSlzdGFydGVkLCBlLmc6IGluaXRpYWwgc3RhcnQsIGFmdGVyIGlPUyBiZyAqLwordm9pZCBjbGlfb25fc3RhcnRlZChwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgLyogTm90aWZ5IGFwcCAqLworICAgIGlmIChhcHBfY2ZnLm9uX3N0YXJ0ZWQpIHsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgY2hhciBpbmZvWzEyOF07CisJICAgIGNsaV9nZXRfaW5mbyhpbmZvLCBzaXplb2YoaW5mbykpOworCSAgICBpZiAoYXBwX2NmZy5vbl9zdGFydGVkKSB7CisJCSgqYXBwX2NmZy5vbl9zdGFydGVkKShzdGF0dXMsIGluZm8pOwkJCisJICAgIH0gCisJfSBlbHNlIHsKKwkgICAgaWYgKGFwcF9jZmcub25fc3RhcnRlZCkgeworCQkoKmFwcF9jZmcub25fc3RhcnRlZCkoc3RhdHVzLCBOVUxMKTsKKwkgICAgfSAJCQorCX0KKyAgICB9Cit9CisKKy8qIENhbGxlZCBvbiBDTEkgcXVpdCAqLwordm9pZCBjbGlfb25fc3RvcHBlZChwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgICAvKiBOb3RpZnkgYXBwICovCisgICAgaWYgKGFwcF9jZmcub25fc3RvcHBlZCkKKwkoKmFwcF9jZmcub25fc3RvcHBlZCkocmVzdGFydCwgYXJnYywgYXJndik7Cit9CisKKworLyogQ2FsbGVkIG9uIHBqc3VhIGxlZ2FjeSBxdWl0ICovCit2b2lkIGxlZ2FjeV9vbl9zdG9wcGVkKHBqX2Jvb2xfdCByZXN0YXJ0KQoreworICAgIC8qIE5vdGlmeSBhcHAgKi8KKyAgICBpZiAoYXBwX2NmZy5vbl9zdG9wcGVkKQorCSgqYXBwX2NmZy5vbl9zdG9wcGVkKShyZXN0YXJ0LCAxLCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdWJsaWMgQVBJCisgKi8KKworaW50IHN0ZG91dF9yZWZyZXNoX3Byb2Modm9pZCAqYXJnKQoreworICAgIGV4dGVybiBjaGFyICpzdGRvdXRfcmVmcmVzaF90ZXh0OworCisgICAgUEpfVU5VU0VEX0FSRyhhcmcpOworCisgICAgLyogU2V0IHRocmVhZCB0byBsb3dlc3QgcHJpb3JpdHkgc28gdGhhdCBpdCBkb2Vzbid0IGNsb2JiZXIKKyAgICAgKiBzdGRvdXQgb3V0cHV0CisgICAgICovCisgICAgcGpfdGhyZWFkX3NldF9wcmlvKHBqX3RocmVhZF90aGlzKCksIAorCQkgICAgICAgcGpfdGhyZWFkX2dldF9wcmlvX21pbihwal90aHJlYWRfdGhpcygpKSk7CisKKyAgICB3aGlsZSAoIXN0ZG91dF9yZWZyZXNoX3F1aXQpIHsKKwlwal90aHJlYWRfc2xlZXAoc3Rkb3V0X3JlZnJlc2ggKiAxMDAwKTsKKwlwdXRzKHN0ZG91dF9yZWZyZXNoX3RleHQpOworCWZmbHVzaChzdGRvdXQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgYXBwX2luaXQoKQoreworICAgIHBqc3VhX3RyYW5zcG9ydF9pZCB0cmFuc3BvcnRfaWQgPSAtMTsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIHRjcF9jZmc7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9wb29sX3QgKnRtcF9wb29sOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qKiBDcmVhdGUgcGpzdWEgKiovCisgICAgc3RhdHVzID0gcGpzdWFfY3JlYXRlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBDcmVhdGUgcG9vbCBmb3IgYXBwbGljYXRpb24gKi8KKyAgICBhcHBfY29uZmlnLnBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicGpzdWEtYXBwIiwgMTAwMCwgMTAwMCk7CisgICAgdG1wX3Bvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgidG1wLXBqc3VhIiwgMTAwMCwgMTAwMCk7OworCisgICAgLyogSW5pdCBDTEkgJiBpdHMgRkUgc2V0dGluZ3MgKi8KKyAgICBpZiAoIWFwcF9ydW5uaW5nKSB7CisJcGpfY2xpX2NmZ19kZWZhdWx0KCZhcHBfY29uZmlnLmNsaV9jZmcuY2ZnKTsKKwlwal9jbGlfdGVsbmV0X2NmZ19kZWZhdWx0KCZhcHBfY29uZmlnLmNsaV9jZmcudGVsbmV0X2NmZyk7CisJcGpfY2xpX2NvbnNvbGVfY2ZnX2RlZmF1bHQoJmFwcF9jb25maWcuY2xpX2NmZy5jb25zb2xlX2NmZyk7CisJYXBwX2NvbmZpZy5jbGlfY2ZnLnRlbG5ldF9jZmcub25fc3RhcnRlZCA9IGNsaV9vbl9zdGFydGVkOworICAgIH0KKworICAgIC8qKiBQYXJzZSBhcmdzICoqLworICAgIHN0YXR1cyA9IGxvYWRfY29uZmlnKGFwcF9jZmcuYXJnYywgYXBwX2NmZy5hcmd2LCAmdXJpX2FyZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfcG9vbF9yZWxlYXNlKHRtcF9wb29sKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgYXBwbGljYXRpb24gY2FsbGJhY2tzICovCisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fY2FsbF9zdGF0ZSA9ICZvbl9jYWxsX3N0YXRlOworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX2NhbGxfbWVkaWFfc3RhdGUgPSAmb25fY2FsbF9tZWRpYV9zdGF0ZTsKKyAgICBhcHBfY29uZmlnLmNmZy5jYi5vbl9pbmNvbWluZ19jYWxsID0gJm9uX2luY29taW5nX2NhbGw7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fY2FsbF90c3hfc3RhdGUgPSAmb25fY2FsbF90c3hfc3RhdGU7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fZHRtZl9kaWdpdCA9ICZjYWxsX29uX2R0bWZfY2FsbGJhY2s7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fY2FsbF9yZWRpcmVjdGVkID0gJmNhbGxfb25fcmVkaXJlY3RlZDsKKyAgICBhcHBfY29uZmlnLmNmZy5jYi5vbl9yZWdfc3RhdGUgPSAmb25fcmVnX3N0YXRlOworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX2luY29taW5nX3N1YnNjcmliZSA9ICZvbl9pbmNvbWluZ19zdWJzY3JpYmU7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fYnVkZHlfc3RhdGUgPSAmb25fYnVkZHlfc3RhdGU7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fYnVkZHlfZXZzdWJfc3RhdGUgPSAmb25fYnVkZHlfZXZzdWJfc3RhdGU7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fcGFnZXIgPSAmb25fcGFnZXI7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fdHlwaW5nID0gJm9uX3R5cGluZzsKKyAgICBhcHBfY29uZmlnLmNmZy5jYi5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyA9ICZvbl9jYWxsX3RyYW5zZmVyX3N0YXR1czsKKyAgICBhcHBfY29uZmlnLmNmZy5jYi5vbl9jYWxsX3JlcGxhY2VkID0gJm9uX2NhbGxfcmVwbGFjZWQ7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25fbmF0X2RldGVjdCA9ICZvbl9uYXRfZGV0ZWN0OworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX213aV9pbmZvID0gJm9uX213aV9pbmZvOworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX3RyYW5zcG9ydF9zdGF0ZSA9ICZvbl90cmFuc3BvcnRfc3RhdGU7CisgICAgYXBwX2NvbmZpZy5jZmcuY2Iub25faWNlX3RyYW5zcG9ydF9lcnJvciA9ICZvbl9pY2VfdHJhbnNwb3J0X2Vycm9yOworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX3NuZF9kZXZfb3BlcmF0aW9uID0gJm9uX3NuZF9kZXZfb3BlcmF0aW9uOworICAgIGFwcF9jb25maWcuY2ZnLmNiLm9uX2NhbGxfbWVkaWFfZXZlbnQgPSAmb25fY2FsbF9tZWRpYV9ldmVudDsKKyNpZmRlZiBUUkFOU1BPUlRfQURBUFRFUl9TQU1QTEUKKyAgICBhcHBfY29uZmlnLmNmZy5jYi5vbl9jcmVhdGVfbWVkaWFfdHJhbnNwb3J0ID0gJm9uX2NyZWF0ZV9tZWRpYV90cmFuc3BvcnQ7CisjZW5kaWYKKworICAgIC8qIFNldCBzb3VuZCBkZXZpY2UgbGF0ZW5jeSAqLworICAgIGlmIChhcHBfY29uZmlnLmNhcHR1cmVfbGF0ID4gMCkKKwlhcHBfY29uZmlnLm1lZGlhX2NmZy5zbmRfcmVjX2xhdGVuY3kgPSBhcHBfY29uZmlnLmNhcHR1cmVfbGF0OworICAgIGlmIChhcHBfY29uZmlnLnBsYXliYWNrX2xhdCkKKwlhcHBfY29uZmlnLm1lZGlhX2NmZy5zbmRfcGxheV9sYXRlbmN5ID0gYXBwX2NvbmZpZy5wbGF5YmFja19sYXQ7CisKKyAgICBpZiAoYXBwX2NmZy5vbl9jb25maWdfaW5pdCkKKwkoKmFwcF9jZmcub25fY29uZmlnX2luaXQpKCZhcHBfY29uZmlnKTsKKworICAgIC8qIEluaXRpYWxpemUgcGpzdWEgKi8KKyAgICBzdGF0dXMgPSBwanN1YV9pbml0KCZhcHBfY29uZmlnLmNmZywgJmFwcF9jb25maWcubG9nX2NmZywKKwkJCSZhcHBfY29uZmlnLm1lZGlhX2NmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfcG9vbF9yZWxlYXNlKHRtcF9wb29sKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgb3VyIG1vZHVsZSB0byBoYW5kbGUgb3RoZXJ3aXNlIHVuaGFuZGxlZCByZXF1ZXN0ICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKHBqc3VhX2dldF9wanNpcF9lbmRwdCgpLAorCQkJCQkgJm1vZF9kZWZhdWx0X2hhbmRsZXIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisjaWZkZWYgU1RFUkVPX0RFTU8KKyAgICBzdGVyZW9fZGVtbygpOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIGNhbGxzIGRhdGEgKi8KKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGFwcF9jb25maWcuY2FsbF9kYXRhKTsgKytpKSB7CisJYXBwX2NvbmZpZy5jYWxsX2RhdGFbaV0udGltZXIuaWQgPSBQSlNVQV9JTlZBTElEX0lEOworCWFwcF9jb25maWcuY2FsbF9kYXRhW2ldLnRpbWVyLmNiID0gJmNhbGxfdGltZW91dF9jYWxsYmFjazsKKyAgICB9CisKKyAgICAvKiBPcHRpb25hbGx5IHJlZ2lzdGVycyBXQVYgZmlsZSAqLworICAgIGZvciAoaT0wOyBpPGFwcF9jb25maWcud2F2X2NvdW50OyArK2kpIHsKKwlwanN1YV9wbGF5ZXJfaWQgd2F2X2lkOworCXVuc2lnbmVkIHBsYXlfb3B0aW9ucyA9IDA7CisKKwlpZiAoYXBwX2NvbmZpZy5hdXRvX3BsYXlfaGFuZ3VwKQorCSAgICBwbGF5X29wdGlvbnMgfD0gUEpNRURJQV9GSUxFX05PX0xPT1A7CisKKwlzdGF0dXMgPSBwanN1YV9wbGF5ZXJfY3JlYXRlKCZhcHBfY29uZmlnLndhdl9maWxlc1tpXSwgcGxheV9vcHRpb25zLCAKKwkJCQkgICAgICZ3YXZfaWQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworCWlmIChhcHBfY29uZmlnLndhdl9pZCA9PSBQSlNVQV9JTlZBTElEX0lEKSB7CisJICAgIGFwcF9jb25maWcud2F2X2lkID0gd2F2X2lkOworCSAgICBhcHBfY29uZmlnLndhdl9wb3J0ID0gcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQoYXBwX2NvbmZpZy53YXZfaWQpOworCSAgICBpZiAoYXBwX2NvbmZpZy5hdXRvX3BsYXlfaGFuZ3VwKSB7CisJCXBqbWVkaWFfcG9ydCAqcG9ydDsKKworCQlwanN1YV9wbGF5ZXJfZ2V0X3BvcnQoYXBwX2NvbmZpZy53YXZfaWQsICZwb3J0KTsKKwkJc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3NldF9lb2ZfY2IocG9ydCwgTlVMTCwgCisJCQkJCQkgICAgICAgJm9uX3BsYXlmaWxlX2RvbmUpOworCQlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCSAgICBnb3RvIG9uX2Vycm9yOworCisJCXBqX3RpbWVyX2VudHJ5X2luaXQoJmFwcF9jb25maWcuYXV0b19oYW5ndXBfdGltZXIsIDAsIE5VTEwsIAorCQkJCSAgICAmaGFuZ3VwX3RpbWVvdXRfY2FsbGJhY2spOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIE9wdGlvbmFsbHkgcmVnaXN0ZXJzIHRvbmUgcGxheWVycyAqLworICAgIGZvciAoaT0wOyBpPGFwcF9jb25maWcudG9uZV9jb3VudDsgKytpKSB7CisJcGptZWRpYV9wb3J0ICp0cG9ydDsKKwljaGFyIG5hbWVbODBdOworCXBqX3N0cl90IGxhYmVsOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCXBqX2Fuc2lfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidG9uZS0lZCwlZCIsCisJCQkgYXBwX2NvbmZpZy50b25lc1tpXS5mcmVxMSwgCisJCQkgYXBwX2NvbmZpZy50b25lc1tpXS5mcmVxMik7CisJbGFiZWwgPSBwal9zdHIobmFtZSk7CisJc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX2NyZWF0ZTIoYXBwX2NvbmZpZy5wb29sLCAmbGFiZWwsCisJCQkJCSA4MDAwLCAxLCAxNjAsIDE2LCAKKwkJCQkJIFBKTUVESUFfVE9ORUdFTl9MT09QLCAgJnRwb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpzdWFfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBjcmVhdGUgdG9uZSBnZW5lcmF0b3IiLCBzdGF0dXMpOworCSAgICBnb3RvIG9uX2Vycm9yOworCX0KKworCXN0YXR1cyA9IHBqc3VhX2NvbmZfYWRkX3BvcnQoYXBwX2NvbmZpZy5wb29sLCB0cG9ydCwgCisJCQkJICAgICAmYXBwX2NvbmZpZy50b25lX3Nsb3RzW2ldKTsKKwlwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisJc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX3BsYXkodHBvcnQsIDEsICZhcHBfY29uZmlnLnRvbmVzW2ldLCAwKTsKKwlwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworICAgIH0KKworICAgIC8qIE9wdGlvbmFsbHkgY3JlYXRlIHJlY29yZGVyIGZpbGUsIGlmIGFueS4gKi8KKyAgICBpZiAoYXBwX2NvbmZpZy5yZWNfZmlsZS5zbGVuKSB7CisJc3RhdHVzID0gcGpzdWFfcmVjb3JkZXJfY3JlYXRlKCZhcHBfY29uZmlnLnJlY19maWxlLCAwLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgICAmYXBwX2NvbmZpZy5yZWNfaWQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworCWFwcF9jb25maWcucmVjX3BvcnQgPSBwanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0KGFwcF9jb25maWcucmVjX2lkKTsKKyAgICB9CisKKyAgICBwal9tZW1jcHkoJnRjcF9jZmcsICZhcHBfY29uZmlnLnVkcF9jZmcsIHNpemVvZih0Y3BfY2ZnKSk7CisKKyAgICAvKiBDcmVhdGUgcmluZ2JhY2sgdG9uZXMgKi8KKyAgICBpZiAoYXBwX2NvbmZpZy5ub190b25lcyA9PSBQSl9GQUxTRSkgeworCXVuc2lnbmVkIGksIHNhbXBsZXNfcGVyX2ZyYW1lOworCXBqbWVkaWFfdG9uZV9kZXNjIHRvbmVbUklOR19DTlQrUklOR0JBQ0tfQ05UXTsKKwlwal9zdHJfdCBuYW1lOworCisJc2FtcGxlc19wZXJfZnJhbWUgPSBhcHBfY29uZmlnLm1lZGlhX2NmZy5hdWRpb19mcmFtZV9wdGltZSAqIAorCQkJICAgIGFwcF9jb25maWcubWVkaWFfY2ZnLmNsb2NrX3JhdGUgKgorCQkJICAgIGFwcF9jb25maWcubWVkaWFfY2ZnLmNoYW5uZWxfY291bnQgLyAxMDAwOworCisJLyogUmluZ2JhY2sgdG9uZSAoY2FsbCBpcyByaW5naW5nKSAqLworCW5hbWUgPSBwal9zdHIoInJpbmdiYWNrIik7CisJc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX2NyZWF0ZTIoYXBwX2NvbmZpZy5wb29sLCAmbmFtZSwgCisJCQkJCSBhcHBfY29uZmlnLm1lZGlhX2NmZy5jbG9ja19yYXRlLAorCQkJCQkgYXBwX2NvbmZpZy5tZWRpYV9jZmcuY2hhbm5lbF9jb3VudCwgCisJCQkJCSBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJIDE2LCBQSk1FRElBX1RPTkVHRU5fTE9PUCwgCisJCQkJCSAmYXBwX2NvbmZpZy5yaW5nYmFja19wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisKKwlwal9iemVybygmdG9uZSwgc2l6ZW9mKHRvbmUpKTsKKwlmb3IgKGk9MDsgaTxSSU5HQkFDS19DTlQ7ICsraSkgeworCSAgICB0b25lW2ldLmZyZXExID0gUklOR0JBQ0tfRlJFUTE7CisJICAgIHRvbmVbaV0uZnJlcTIgPSBSSU5HQkFDS19GUkVRMjsKKwkgICAgdG9uZVtpXS5vbl9tc2VjID0gUklOR0JBQ0tfT047CisJICAgIHRvbmVbaV0ub2ZmX21zZWMgPSBSSU5HQkFDS19PRkY7CisJfQorCXRvbmVbUklOR0JBQ0tfQ05ULTFdLm9mZl9tc2VjID0gUklOR0JBQ0tfSU5URVJWQUw7CisKKwlwam1lZGlhX3RvbmVnZW5fcGxheShhcHBfY29uZmlnLnJpbmdiYWNrX3BvcnQsIFJJTkdCQUNLX0NOVCwgdG9uZSwKKwkJCSAgICAgUEpNRURJQV9UT05FR0VOX0xPT1ApOworCisKKwlzdGF0dXMgPSBwanN1YV9jb25mX2FkZF9wb3J0KGFwcF9jb25maWcucG9vbCwgYXBwX2NvbmZpZy5yaW5nYmFja19wb3J0LAorCQkJCSAgICAgJmFwcF9jb25maWcucmluZ2JhY2tfc2xvdCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworCisJLyogUmluZyAodG8gYWxlcnQgaW5jb21pbmcgY2FsbCkgKi8KKwluYW1lID0gcGpfc3RyKCJyaW5nIik7CisJc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX2NyZWF0ZTIoYXBwX2NvbmZpZy5wb29sLCAmbmFtZSwgCisJCQkJCSBhcHBfY29uZmlnLm1lZGlhX2NmZy5jbG9ja19yYXRlLAorCQkJCQkgYXBwX2NvbmZpZy5tZWRpYV9jZmcuY2hhbm5lbF9jb3VudCwgCisJCQkJCSBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJIDE2LCBQSk1FRElBX1RPTkVHRU5fTE9PUCwgCisJCQkJCSAmYXBwX2NvbmZpZy5yaW5nX3BvcnQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworCWZvciAoaT0wOyBpPFJJTkdfQ05UOyArK2kpIHsKKwkgICAgdG9uZVtpXS5mcmVxMSA9IFJJTkdfRlJFUTE7CisJICAgIHRvbmVbaV0uZnJlcTIgPSBSSU5HX0ZSRVEyOworCSAgICB0b25lW2ldLm9uX21zZWMgPSBSSU5HX09OOworCSAgICB0b25lW2ldLm9mZl9tc2VjID0gUklOR19PRkY7CisJfQorCXRvbmVbUklOR19DTlQtMV0ub2ZmX21zZWMgPSBSSU5HX0lOVEVSVkFMOworCisJcGptZWRpYV90b25lZ2VuX3BsYXkoYXBwX2NvbmZpZy5yaW5nX3BvcnQsIFJJTkdfQ05ULCAKKwkJCSAgICAgdG9uZSwgUEpNRURJQV9UT05FR0VOX0xPT1ApOworCisJc3RhdHVzID0gcGpzdWFfY29uZl9hZGRfcG9ydChhcHBfY29uZmlnLnBvb2wsIGFwcF9jb25maWcucmluZ19wb3J0LAorCQkJCSAgICAgJmFwcF9jb25maWcucmluZ19zbG90KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgQVZJIHBsYXllciB2aXJ0dWFsIGRldmljZXMgKi8KKyAgICBpZiAoYXBwX2NvbmZpZy5hdmlfY250KSB7CisjaWYgUEpNRURJQV9IQVNfVklERU8gJiYgUEpNRURJQV9WSURFT19ERVZfSEFTX0FWSQorCXBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5ICphdmlfZmFjdG9yeTsKKworCXN0YXR1cyA9IHBqbWVkaWFfYXZpX2Rldl9jcmVhdGVfZmFjdG9yeShwanN1YV9nZXRfcG9vbF9mYWN0b3J5KCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9jb25maWcuYXZpX2NudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2aV9mYWN0b3J5KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiRXJyb3IgY3JlYXRpbmcgQVZJIGZhY3RvcnkiKSk7CisJICAgIGdvdG8gb25fZXJyb3I7CisJfQorCisJZm9yIChpPTA7IGk8YXBwX2NvbmZpZy5hdmlfY250OyArK2kpIHsKKwkgICAgcGptZWRpYV9hdmlfZGV2X3BhcmFtIGF2ZHA7CisJICAgIHBqbWVkaWFfdmlkX2Rldl9pbmRleCBhdmlkOworCSAgICB1bnNpZ25lZCBzdHJtX2lkeCwgc3RybV9jbnQ7CisKKwkgICAgYXBwX2NvbmZpZy5hdmlbaV0uZGV2X2lkID0gUEpNRURJQV9WSURfSU5WQUxJRF9ERVY7CisJICAgIGFwcF9jb25maWcuYXZpW2ldLnNsb3QgPSBQSlNVQV9JTlZBTElEX0lEOworCisJICAgIHBqbWVkaWFfYXZpX2Rldl9wYXJhbV9kZWZhdWx0KCZhdmRwKTsKKwkgICAgYXZkcC5wYXRoID0gYXBwX2NvbmZpZy5hdmlbaV0ucGF0aDsKKworCSAgICBzdGF0dXMgPSAgcGptZWRpYV9hdmlfZGV2X2FsbG9jKGF2aV9mYWN0b3J5LCAmYXZkcCwgJmF2aWQpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLAorCQkJICAgICAiRXJyb3IgY3JlYXRpbmcgQVZJIHBsYXllciBmb3IgJS4qcyIsCisJCQkgICAgIChpbnQpYXZkcC5wYXRoLnNsZW4sIGF2ZHAucGF0aC5wdHIpKTsKKwkJZ290byBvbl9lcnJvcjsKKwkgICAgfQorCisJICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJBVkkgcGxheWVyICUuKnMgY3JlYXRlZCwgZGV2X2lkPSVkIiwKKwkJICAgICAgKGludClhdmRwLnRpdGxlLnNsZW4sIGF2ZHAudGl0bGUucHRyLCBhdmlkKSk7CisKKwkgICAgYXBwX2NvbmZpZy5hdmlbaV0uZGV2X2lkID0gYXZpZDsKKwkgICAgaWYgKGFwcF9jb25maWcuYXZpX2RlZl9pZHggPT0gUEpTVUFfSU5WQUxJRF9JRCkKKwkJYXBwX2NvbmZpZy5hdmlfZGVmX2lkeCA9IGk7CisKKwkgICAgc3RybV9jbnQgPSBwam1lZGlhX2F2aV9zdHJlYW1zX2dldF9udW1fc3RyZWFtcyhhdmRwLmF2aV9zdHJlYW1zKTsKKwkgICAgZm9yIChzdHJtX2lkeD0wOyBzdHJtX2lkeDxzdHJtX2NudDsgKytzdHJtX2lkeCkgeworCQlwam1lZGlhX3BvcnQgKmF1ZDsKKwkJcGptZWRpYV9mb3JtYXQgKmZtdDsKKwkJcGpzdWFfY29uZl9wb3J0X2lkIHNsb3Q7CisJCWNoYXIgZm10X25hbWVbNV07CisKKwkJYXVkID0gcGptZWRpYV9hdmlfc3RyZWFtc19nZXRfc3RyZWFtKGF2ZHAuYXZpX3N0cmVhbXMsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtX2lkeCk7CisJCWZtdCA9ICZhdWQtPmluZm8uZm10OworCisJCXBqbWVkaWFfZm91cmNjX25hbWUoZm10LT5pZCwgZm10X25hbWUpOworCisJCWlmIChmbXQtPmlkID09IFBKTUVESUFfRk9STUFUX1BDTSkgeworCQkgICAgc3RhdHVzID0gcGpzdWFfY29uZl9hZGRfcG9ydChhcHBfY29uZmlnLnBvb2wsIGF1ZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3QpOworCQkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJCQlQSl9MT0coNCwoVEhJU19GSUxFLAorCQkJCSAgIkFWSSAlLipzOiBhdWRpbyBhZGRlZCB0byBzbG90ICVkIiwKKwkJCQkgIChpbnQpYXZkcC50aXRsZS5zbGVuLCBhdmRwLnRpdGxlLnB0ciwKKwkJCQkgIHNsb3QpKTsKKwkJCWFwcF9jb25maWcuYXZpW2ldLnNsb3QgPSBzbG90OworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgUEpfTE9HKDQsKFRISVNfRklMRSwKKwkJCSAgICAgICJBVkkgJS4qczogYXVkaW8gaWdub3JlZCwgZm9ybWF0PSVzIiwKKwkJCSAgICAgIChpbnQpYXZkcC50aXRsZS5zbGVuLCBhdmRwLnRpdGxlLnB0ciwKKwkJCSAgICAgIGZtdF9uYW1lKSk7CisJCX0KKwkgICAgfQorCX0KKyNlbHNlCisJUEpfTE9HKDIsKFRISVNfRklMRSwKKwkJICAiV2FybmluZzogLS1wbGF5LWF2aSBpcyBpZ25vcmVkIGJlY2F1c2UgQVZJIGlzIGRpc2FibGVkIikpOworI2VuZGlmCS8qIFBKTUVESUFfVklERU9fREVWX0hBU19BVkkgKi8KKyAgICB9CisKKyAgICAvKiBBZGQgVURQIHRyYW5zcG9ydCB1bmxlc3MgaXQncyBkaXNhYmxlZC4gKi8KKyAgICBpZiAoIWFwcF9jb25maWcubm9fdWRwKSB7CisJcGpzdWFfYWNjX2lkIGFpZDsKKwlwanNpcF90cmFuc3BvcnRfdHlwZV9lIHR5cGUgPSBQSlNJUF9UUkFOU1BPUlRfVURQOworCisJc3RhdHVzID0gcGpzdWFfdHJhbnNwb3J0X2NyZWF0ZSh0eXBlLAorCQkJCQkmYXBwX2NvbmZpZy51ZHBfY2ZnLAorCQkJCQkmdHJhbnNwb3J0X2lkKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisKKwkvKiBBZGQgbG9jYWwgYWNjb3VudCAqLworCXBqc3VhX2FjY19hZGRfbG9jYWwodHJhbnNwb3J0X2lkLCBQSl9UUlVFLCAmYWlkKTsKKworCS8qIEFkanVzdCBsb2NhbCBhY2NvdW50IGNvbmZpZyBiYXNlZCBvbiBwanN1YSBhcHAgY29uZmlnICovCisJeworCSAgICBwanN1YV9hY2NfY29uZmlnIGFjY19jZmc7CisJICAgIHBqc3VhX2FjY19nZXRfY29uZmlnKGFpZCwgdG1wX3Bvb2wsICZhY2NfY2ZnKTsKKworCSAgICBhcHBfY29uZmlnX2luaXRfdmlkZW8oJmFjY19jZmcpOworCSAgICBhY2NfY2ZnLnJ0cF9jZmcgPSBhcHBfY29uZmlnLnJ0cF9jZmc7CisJICAgIHBqc3VhX2FjY19tb2RpZnkoYWlkLCAmYWNjX2NmZyk7CisJfQorCisJLy9wanN1YV9hY2Nfc2V0X3RyYW5zcG9ydChhaWQsIHRyYW5zcG9ydF9pZCk7CisJcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzKGN1cnJlbnRfYWNjLCBQSl9UUlVFKTsKKworCWlmIChhcHBfY29uZmlnLnVkcF9jZmcucG9ydCA9PSAwKSB7CisJICAgIHBqc3VhX3RyYW5zcG9ydF9pbmZvIHRpOworCSAgICBwal9zb2NrYWRkcl9pbiAqYTsKKworCSAgICBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm8odHJhbnNwb3J0X2lkLCAmdGkpOworCSAgICBhID0gKHBqX3NvY2thZGRyX2luKikmdGkubG9jYWxfYWRkcjsKKworCSAgICB0Y3BfY2ZnLnBvcnQgPSBwal9udG9ocyhhLT5zaW5fcG9ydCk7CisJfQorICAgIH0KKworICAgIC8qIEFkZCBVRFAgSVB2NiB0cmFuc3BvcnQgdW5sZXNzIGl0J3MgZGlzYWJsZWQuICovCisgICAgaWYgKCFhcHBfY29uZmlnLm5vX3VkcCAmJiBhcHBfY29uZmlnLmlwdjYpIHsKKwlwanN1YV9hY2NfaWQgYWlkOworCXBqc2lwX3RyYW5zcG9ydF90eXBlX2UgdHlwZSA9IFBKU0lQX1RSQU5TUE9SVF9VRFA2OworCXBqc3VhX3RyYW5zcG9ydF9jb25maWcgdWRwX2NmZzsKKworCXVkcF9jZmcgPSBhcHBfY29uZmlnLnVkcF9jZmc7CisJaWYgKHVkcF9jZmcucG9ydCA9PSAwKQorCSAgICB1ZHBfY2ZnLnBvcnQgPSA1MDYwOworCWVsc2UKKwkgICAgdWRwX2NmZy5wb3J0ICs9IDEwOworCXN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUodHlwZSwKKwkJCQkJJnVkcF9jZmcsCisJCQkJCSZ0cmFuc3BvcnRfaWQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworCS8qIEFkZCBsb2NhbCBhY2NvdW50ICovCisJcGpzdWFfYWNjX2FkZF9sb2NhbCh0cmFuc3BvcnRfaWQsIFBKX1RSVUUsICZhaWQpOworCisJLyogQWRqdXN0IGxvY2FsIGFjY291bnQgY29uZmlnIGJhc2VkIG9uIHBqc3VhIGFwcCBjb25maWcgKi8KKwl7CisJICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKwkgICAgcGpzdWFfYWNjX2dldF9jb25maWcoYWlkLCB0bXBfcG9vbCwgJmFjY19jZmcpOworCisJICAgIGFwcF9jb25maWdfaW5pdF92aWRlbygmYWNjX2NmZyk7CisJICAgIGFjY19jZmcucnRwX2NmZyA9IGFwcF9jb25maWcucnRwX2NmZzsKKwkgICAgYWNjX2NmZy5pcHY2X21lZGlhX3VzZSA9IFBKU1VBX0lQVjZfRU5BQkxFRDsKKwkgICAgcGpzdWFfYWNjX21vZGlmeShhaWQsICZhY2NfY2ZnKTsKKwl9CisKKwkvL3Bqc3VhX2FjY19zZXRfdHJhbnNwb3J0KGFpZCwgdHJhbnNwb3J0X2lkKTsKKwlwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoY3VycmVudF9hY2MsIFBKX1RSVUUpOworCisJaWYgKGFwcF9jb25maWcudWRwX2NmZy5wb3J0ID09IDApIHsKKwkgICAgcGpzdWFfdHJhbnNwb3J0X2luZm8gdGk7CisJICAgIHBqX3NvY2thZGRyX2luICphOworCisJICAgIHBqc3VhX3RyYW5zcG9ydF9nZXRfaW5mbyh0cmFuc3BvcnRfaWQsICZ0aSk7CisJICAgIGEgPSAocGpfc29ja2FkZHJfaW4qKSZ0aS5sb2NhbF9hZGRyOworCisJICAgIHRjcF9jZmcucG9ydCA9IHBqX250b2hzKGEtPnNpbl9wb3J0KTsKKwl9CisgICAgfQorCisgICAgLyogQWRkIFRDUCB0cmFuc3BvcnQgdW5sZXNzIGl0J3MgZGlzYWJsZWQgKi8KKyAgICBpZiAoIWFwcF9jb25maWcubm9fdGNwKSB7CisJcGpzdWFfYWNjX2lkIGFpZDsKKworCXN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUoUEpTSVBfVFJBTlNQT1JUX1RDUCwKKwkJCQkJJnRjcF9jZmcsIAorCQkJCQkmdHJhbnNwb3J0X2lkKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisKKwkvKiBBZGQgbG9jYWwgYWNjb3VudCAqLworCXBqc3VhX2FjY19hZGRfbG9jYWwodHJhbnNwb3J0X2lkLCBQSl9UUlVFLCAmYWlkKTsKKworCS8qIEFkanVzdCBsb2NhbCBhY2NvdW50IGNvbmZpZyBiYXNlZCBvbiBwanN1YSBhcHAgY29uZmlnICovCisJeworCSAgICBwanN1YV9hY2NfY29uZmlnIGFjY19jZmc7CisJICAgIHBqc3VhX2FjY19nZXRfY29uZmlnKGFpZCwgdG1wX3Bvb2wsICZhY2NfY2ZnKTsKKworCSAgICBhcHBfY29uZmlnX2luaXRfdmlkZW8oJmFjY19jZmcpOworCSAgICBhY2NfY2ZnLnJ0cF9jZmcgPSBhcHBfY29uZmlnLnJ0cF9jZmc7CisJICAgIHBqc3VhX2FjY19tb2RpZnkoYWlkLCAmYWNjX2NmZyk7CisJfQorCisJcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzKGN1cnJlbnRfYWNjLCBQSl9UUlVFKTsKKworICAgIH0KKworICAgIC8qIEFkZCBUQ1AgSVB2NiB0cmFuc3BvcnQgdW5sZXNzIGl0J3MgZGlzYWJsZWQuICovCisgICAgaWYgKCFhcHBfY29uZmlnLm5vX3RjcCAmJiBhcHBfY29uZmlnLmlwdjYpIHsKKwlwanN1YV9hY2NfaWQgYWlkOworCXBqc2lwX3RyYW5zcG9ydF90eXBlX2UgdHlwZSA9IFBKU0lQX1RSQU5TUE9SVF9UQ1A2OworCisJdGNwX2NmZy5wb3J0ICs9IDEwOworCisJc3RhdHVzID0gcGpzdWFfdHJhbnNwb3J0X2NyZWF0ZSh0eXBlLAorCQkJCQkmdGNwX2NmZywKKwkJCQkJJnRyYW5zcG9ydF9pZCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworCisJLyogQWRkIGxvY2FsIGFjY291bnQgKi8KKwlwanN1YV9hY2NfYWRkX2xvY2FsKHRyYW5zcG9ydF9pZCwgUEpfVFJVRSwgJmFpZCk7CisKKwkvKiBBZGp1c3QgbG9jYWwgYWNjb3VudCBjb25maWcgYmFzZWQgb24gcGpzdWEgYXBwIGNvbmZpZyAqLworCXsKKwkgICAgcGpzdWFfYWNjX2NvbmZpZyBhY2NfY2ZnOworCSAgICBwanN1YV9hY2NfZ2V0X2NvbmZpZyhhaWQsIHRtcF9wb29sLCAmYWNjX2NmZyk7CisKKwkgICAgYXBwX2NvbmZpZ19pbml0X3ZpZGVvKCZhY2NfY2ZnKTsKKwkgICAgYWNjX2NmZy5ydHBfY2ZnID0gYXBwX2NvbmZpZy5ydHBfY2ZnOworCSAgICBhY2NfY2ZnLmlwdjZfbWVkaWFfdXNlID0gUEpTVUFfSVBWNl9FTkFCTEVEOworCSAgICBwanN1YV9hY2NfbW9kaWZ5KGFpZCwgJmFjY19jZmcpOworCX0KKworCS8vcGpzdWFfYWNjX3NldF90cmFuc3BvcnQoYWlkLCB0cmFuc3BvcnRfaWQpOworCXBqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cyhjdXJyZW50X2FjYywgUEpfVFJVRSk7CisgICAgfQorCisKKyNpZiBkZWZpbmVkKFBKU0lQX0hBU19UTFNfVFJBTlNQT1JUKSAmJiBQSlNJUF9IQVNfVExTX1RSQU5TUE9SVCE9MAorICAgIC8qIEFkZCBUTFMgdHJhbnNwb3J0IHdoZW4gYXBwbGljYXRpb24gd2FudHMgb25lICovCisgICAgaWYgKGFwcF9jb25maWcudXNlX3RscykgeworCisJcGpzdWFfYWNjX2lkIGFjY19pZDsKKworCS8qIENvcHkgdGhlIFFvUyBzZXR0aW5ncyAqLworCXRjcF9jZmcudGxzX3NldHRpbmcucW9zX3R5cGUgPSB0Y3BfY2ZnLnFvc190eXBlOworCXBqX21lbWNweSgmdGNwX2NmZy50bHNfc2V0dGluZy5xb3NfcGFyYW1zLCAmdGNwX2NmZy5xb3NfcGFyYW1zLCAKKwkJICBzaXplb2YodGNwX2NmZy5xb3NfcGFyYW1zKSk7CisKKwkvKiBTZXQgVExTIHBvcnQgYXMgVENQIHBvcnQrMSAqLworCXRjcF9jZmcucG9ydCsrOworCXN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUoUEpTSVBfVFJBTlNQT1JUX1RMUywKKwkJCQkJJnRjcF9jZmcsIAorCQkJCQkmdHJhbnNwb3J0X2lkKTsKKwl0Y3BfY2ZnLnBvcnQtLTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisJCisJLyogQWRkIGxvY2FsIGFjY291bnQgKi8KKwlwanN1YV9hY2NfYWRkX2xvY2FsKHRyYW5zcG9ydF9pZCwgUEpfRkFMU0UsICZhY2NfaWQpOworCisJLyogQWRqdXN0IGxvY2FsIGFjY291bnQgY29uZmlnIGJhc2VkIG9uIHBqc3VhIGFwcCBjb25maWcgKi8KKwl7CisJICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKwkgICAgcGpzdWFfYWNjX2dldF9jb25maWcoYWNjX2lkLCB0bXBfcG9vbCwgJmFjY19jZmcpOworCisJICAgIGFwcF9jb25maWdfaW5pdF92aWRlbygmYWNjX2NmZyk7CisJICAgIGFjY19jZmcucnRwX2NmZyA9IGFwcF9jb25maWcucnRwX2NmZzsKKwkgICAgcGpzdWFfYWNjX21vZGlmeShhY2NfaWQsICZhY2NfY2ZnKTsKKwl9CisKKwlwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoYWNjX2lkLCBQSl9UUlVFKTsKKyAgICB9CisKKyAgICAvKiBBZGQgVExTIElQdjYgdHJhbnNwb3J0IHVubGVzcyBpdCdzIGRpc2FibGVkLiAqLworICAgIGlmIChhcHBfY29uZmlnLnVzZV90bHMgJiYgYXBwX2NvbmZpZy5pcHY2KSB7CisJcGpzdWFfYWNjX2lkIGFpZDsKKwlwanNpcF90cmFuc3BvcnRfdHlwZV9lIHR5cGUgPSBQSlNJUF9UUkFOU1BPUlRfVExTNjsKKworCXRjcF9jZmcucG9ydCArPSAxMDsKKworCXN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUodHlwZSwKKwkJCQkJJnRjcF9jZmcsCisJCQkJCSZ0cmFuc3BvcnRfaWQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKworCS8qIEFkZCBsb2NhbCBhY2NvdW50ICovCisJcGpzdWFfYWNjX2FkZF9sb2NhbCh0cmFuc3BvcnRfaWQsIFBKX1RSVUUsICZhaWQpOworCisJLyogQWRqdXN0IGxvY2FsIGFjY291bnQgY29uZmlnIGJhc2VkIG9uIHBqc3VhIGFwcCBjb25maWcgKi8KKwl7CisJICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKwkgICAgcGpzdWFfYWNjX2dldF9jb25maWcoYWlkLCB0bXBfcG9vbCwgJmFjY19jZmcpOworCisJICAgIGFwcF9jb25maWdfaW5pdF92aWRlbygmYWNjX2NmZyk7CisJICAgIGFjY19jZmcucnRwX2NmZyA9IGFwcF9jb25maWcucnRwX2NmZzsKKwkgICAgYWNjX2NmZy5pcHY2X21lZGlhX3VzZSA9IFBKU1VBX0lQVjZfRU5BQkxFRDsKKwkgICAgcGpzdWFfYWNjX21vZGlmeShhaWQsICZhY2NfY2ZnKTsKKwl9CisKKwkvL3Bqc3VhX2FjY19zZXRfdHJhbnNwb3J0KGFpZCwgdHJhbnNwb3J0X2lkKTsKKwlwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoY3VycmVudF9hY2MsIFBKX1RSVUUpOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiAodHJhbnNwb3J0X2lkID09IC0xKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBubyB0cmFuc3BvcnQgaXMgY29uZmlndXJlZCIpKTsKKwlzdGF0dXMgPSAtMTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworCisgICAgLyogQWRkIGFjY291bnRzICovCisgICAgZm9yIChpPTA7IGk8YXBwX2NvbmZpZy5hY2NfY250OyArK2kpIHsKKwlhcHBfY29uZmlnLmFjY19jZmdbaV0ucnRwX2NmZyA9IGFwcF9jb25maWcucnRwX2NmZzsKKwlhcHBfY29uZmlnLmFjY19jZmdbaV0ucmVnX3JldHJ5X2ludGVydmFsID0gMzAwOworCWFwcF9jb25maWcuYWNjX2NmZ1tpXS5yZWdfZmlyc3RfcmV0cnlfaW50ZXJ2YWwgPSA2MDsKKworCWFwcF9jb25maWdfaW5pdF92aWRlbygmYXBwX2NvbmZpZy5hY2NfY2ZnW2ldKTsKKworCXN0YXR1cyA9IHBqc3VhX2FjY19hZGQoJmFwcF9jb25maWcuYWNjX2NmZ1tpXSwgUEpfVFJVRSwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworCXBqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cyhjdXJyZW50X2FjYywgUEpfVFJVRSk7CisgICAgfQorCisgICAgLyogQWRkIGJ1ZGRpZXMgKi8KKyAgICBmb3IgKGk9MDsgaTxhcHBfY29uZmlnLmJ1ZGR5X2NudDsgKytpKSB7CisJc3RhdHVzID0gcGpzdWFfYnVkZHlfYWRkKCZhcHBfY29uZmlnLmJ1ZGR5X2NmZ1tpXSwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX1BFUlJPUigxLChUSElTX0ZJTEUsIHN0YXR1cywgIkVycm9yIGFkZGluZyBidWRkeSIpKTsKKwkgICAgZ290byBvbl9lcnJvcjsKKwl9CisgICAgfQorCisgICAgLyogT3B0aW9uYWxseSBkaXNhYmxlIHNvbWUgY29kZWMgKi8KKyAgICBmb3IgKGk9MDsgaTxhcHBfY29uZmlnLmNvZGVjX2Rpc19jbnQ7ICsraSkgeworCXBqc3VhX2NvZGVjX3NldF9wcmlvcml0eSgmYXBwX2NvbmZpZy5jb2RlY19kaXNbaV0sCisJCQkJIFBKTUVESUFfQ09ERUNfUFJJT19ESVNBQkxFRCk7CisjaWYgUEpTVUFfSEFTX1ZJREVPCisJcGpzdWFfdmlkX2NvZGVjX3NldF9wcmlvcml0eSgmYXBwX2NvbmZpZy5jb2RlY19kaXNbaV0sCisJCQkJICAgICBQSk1FRElBX0NPREVDX1BSSU9fRElTQUJMRUQpOworI2VuZGlmCisgICAgfQorCisgICAgLyogT3B0aW9uYWxseSBzZXQgY29kZWMgb3JkZXJzICovCisgICAgZm9yIChpPTA7IGk8YXBwX2NvbmZpZy5jb2RlY19jbnQ7ICsraSkgeworCXBqc3VhX2NvZGVjX3NldF9wcmlvcml0eSgmYXBwX2NvbmZpZy5jb2RlY19hcmdbaV0sCisJCQkJIChwal91aW50OF90KShQSk1FRElBX0NPREVDX1BSSU9fTk9STUFMK2krOSkpOworI2lmIFBKU1VBX0hBU19WSURFTworCXBqc3VhX3ZpZF9jb2RlY19zZXRfcHJpb3JpdHkoJmFwcF9jb25maWcuY29kZWNfYXJnW2ldLAorCQkJCSAgIChwal91aW50OF90KShQSk1FRElBX0NPREVDX1BSSU9fTk9STUFMK2krOSkpOworI2VuZGlmCisgICAgfQorCisgICAgLyogVXNlIG51bGwgc291bmQgZGV2aWNlPyAqLworI2lmbmRlZiBTVEVSRU9fREVNTworICAgIGlmIChhcHBfY29uZmlnLm51bGxfYXVkaW8pIHsKKwlzdGF0dXMgPSBwanN1YV9zZXRfbnVsbF9zbmRfZGV2KCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGFwcF9jb25maWcuY2FwdHVyZV9kZXYgICE9IFBKU1VBX0lOVkFMSURfSUQgfHwKKyAgICAgICAgYXBwX2NvbmZpZy5wbGF5YmFja19kZXYgIT0gUEpTVUFfSU5WQUxJRF9JRCkgCisgICAgeworCXN0YXR1cyA9IHBqc3VhX3NldF9zbmRfZGV2KGFwcF9jb25maWcuY2FwdHVyZV9kZXYsIAorCQkJCSAgIGFwcF9jb25maWcucGxheWJhY2tfZGV2KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogSW5pdCBjYWxsIHNldHRpbmcgKi8KKyAgICBwanN1YV9jYWxsX3NldHRpbmdfZGVmYXVsdCgmY2FsbF9vcHQpOworICAgIGNhbGxfb3B0LmF1ZF9jbnQgPSBhcHBfY29uZmlnLmF1ZF9jbnQ7CisgICAgY2FsbF9vcHQudmlkX2NudCA9IGFwcF9jb25maWcudmlkLnZpZF9jbnQ7CisKKyAgICBwal9wb29sX3JlbGVhc2UodG1wX3Bvb2wpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworCitvbl9lcnJvcjoKKyAgICBwal9wb29sX3JlbGVhc2UodG1wX3Bvb2wpOworICAgIGFwcF9kZXN0cm95KCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworcGpfc3RhdHVzX3QgcGpzdWFfYXBwX2luaXQoY29uc3QgcGpzdWFfYXBwX2NmZ190ICpjZmcpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHBqX21lbWNweSgmYXBwX2NmZywgY2ZnLCBzaXplb2YoYXBwX2NmZykpOworCisgICAgc3RhdHVzID0gYXBwX2luaXQoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIC8qIEluaXQgQ0xJIGlmIGNvbmZpZ3VyZWQgKi8gICAgCisgICAgaWYgKGFwcF9jb25maWcudXNlX2NsaSkgeworCXN0YXR1cyA9IGNsaV9pbml0KCk7CisgICAgfSAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitwal9zdGF0dXNfdCBwanN1YV9hcHBfcnVuKHBqX2Jvb2xfdCB3YWl0X3RlbG5ldF9jbGkpCit7CisgICAgcGpfdGhyZWFkX3QgKnN0ZG91dF9yZWZyZXNoX3RocmVhZCA9IE5VTEw7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogU3RhcnQgY29uc29sZSByZWZyZXNoIHRocmVhZCAqLworICAgIGlmIChzdGRvdXRfcmVmcmVzaCA+IDApIHsKKwlwal90aHJlYWRfY3JlYXRlKGFwcF9jb25maWcucG9vbCwgInN0ZG91dCIsICZzdGRvdXRfcmVmcmVzaF9wcm9jLAorCQkJIE5VTEwsIDAsIDAsICZzdGRvdXRfcmVmcmVzaF90aHJlYWQpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX3N0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgaWYgKGFwcF9jb25maWcudXNlX2NsaSAmJiAoYXBwX2NvbmZpZy5jbGlfY2ZnLmNsaV9mZSAmIENMSV9GRV9URUxORVQpKSB7CisJY2hhciBpbmZvWzEyOF07CisJY2xpX2dldF9pbmZvKGluZm8sIHNpemVvZihpbmZvKSk7CisJaWYgKGFwcF9jZmcub25fc3RhcnRlZCkgeworCSAgICAoKmFwcF9jZmcub25fc3RhcnRlZCkoc3RhdHVzLCBpbmZvKTsKKwl9CisgICAgfSBlbHNlIHsKKwlpZiAoYXBwX2NmZy5vbl9zdGFydGVkKSB7CisJICAgICgqYXBwX2NmZy5vbl9zdGFydGVkKShzdGF0dXMsICJSZWFkeSIpOworCX0gICAgCisgICAgfQorCisgICAgLyogSWYgdXNlciBzcGVjaWZpZXMgVVJJIHRvIGNhbGwsIHRoZW4gY2FsbCB0aGUgVVJJICovCisgICAgaWYgKHVyaV9hcmcuc2xlbikgeworCXBqc3VhX2NhbGxfc2V0dGluZ19kZWZhdWx0KCZjYWxsX29wdCk7CisJY2FsbF9vcHQuYXVkX2NudCA9IGFwcF9jb25maWcuYXVkX2NudDsKKwljYWxsX29wdC52aWRfY250ID0gYXBwX2NvbmZpZy52aWQudmlkX2NudDsKKworCXBqc3VhX2NhbGxfbWFrZV9jYWxsKGN1cnJlbnRfYWNjLCAmdXJpX2FyZywgJmNhbGxfb3B0LCBOVUxMLCAKKwkJCSAgICAgTlVMTCwgTlVMTCk7CisgICAgfSAgIAorCisgICAgYXBwX3J1bm5pbmcgPSBQSl9UUlVFOworCisgICAgaWYgKGFwcF9jb25maWcudXNlX2NsaSkKKwljbGlfbWFpbih3YWl0X3RlbG5ldF9jbGkpOwkKKyAgICBlbHNlCisJbGVnYWN5X21haW4oKTsKKworICAgIHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisKK29uX3JldHVybjoKKyAgICBpZiAoc3Rkb3V0X3JlZnJlc2hfdGhyZWFkKSB7CisJc3Rkb3V0X3JlZnJlc2hfcXVpdCA9IFBKX1RSVUU7CisJcGpfdGhyZWFkX2pvaW4oc3Rkb3V0X3JlZnJlc2hfdGhyZWFkKTsKKwlwal90aHJlYWRfZGVzdHJveShzdGRvdXRfcmVmcmVzaF90aHJlYWQpOworCXN0ZG91dF9yZWZyZXNoX3F1aXQgPSBQSl9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFwcF9kZXN0cm95KCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfYm9vbF90IHVzZV9jbGkgPSBQSl9GQUxTRTsKKyAgICBpbnQgY2xpX2ZlID0gMDsKKyAgICBwal91aW50MTZfdCBjbGlfdGVsbmV0X3BvcnQgPSAwOworCisjaWZkZWYgU1RFUkVPX0RFTU8KKyAgICBpZiAoYXBwX2NvbmZpZy5zbmQpIHsKKwlwam1lZGlhX3NuZF9wb3J0X2Rlc3Ryb3koYXBwX2NvbmZpZy5zbmQpOworCWFwcF9jb25maWcuc25kID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGFwcF9jb25maWcuc2NfY2gxKSB7CisJcGpzdWFfY29uZl9yZW1vdmVfcG9ydChhcHBfY29uZmlnLnNjX2NoMV9zbG90KTsKKwlhcHBfY29uZmlnLnNjX2NoMV9zbG90ID0gUEpTVUFfSU5WQUxJRF9JRDsKKwlwam1lZGlhX3BvcnRfZGVzdHJveShhcHBfY29uZmlnLnNjX2NoMSk7CisJYXBwX2NvbmZpZy5zY19jaDEgPSBOVUxMOworICAgIH0KKyAgICBpZiAoYXBwX2NvbmZpZy5zYykgeworCXBqbWVkaWFfcG9ydF9kZXN0cm95KGFwcF9jb25maWcuc2MpOworCWFwcF9jb25maWcuc2MgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ2xvc2UgYXZpIGRldnMgYW5kIHBvcnRzICovCisgICAgZm9yIChpPTA7IGk8YXBwX2NvbmZpZy5hdmlfY250OyArK2kpIHsKKwlpZiAoYXBwX2NvbmZpZy5hdmlbaV0uc2xvdCAhPSBQSlNVQV9JTlZBTElEX0lEKQorCSAgICBwanN1YV9jb25mX3JlbW92ZV9wb3J0KGFwcF9jb25maWcuYXZpW2ldLnNsb3QpOworI2lmIFBKTUVESUFfSEFTX1ZJREVPICYmIFBKTUVESUFfVklERU9fREVWX0hBU19BVkkKKwlpZiAoYXBwX2NvbmZpZy5hdmlbaV0uZGV2X2lkICE9IFBKTUVESUFfVklEX0lOVkFMSURfREVWKQorCSAgICBwam1lZGlhX2F2aV9kZXZfZnJlZShhcHBfY29uZmlnLmF2aVtpXS5kZXZfaWQpOworI2VuZGlmCisgICAgfQorCisgICAgLyogQ2xvc2UgcmluZ2JhY2sgcG9ydCAqLworICAgIGlmIChhcHBfY29uZmlnLnJpbmdiYWNrX3BvcnQgJiYgCisJYXBwX2NvbmZpZy5yaW5nYmFja19zbG90ICE9IFBKU1VBX0lOVkFMSURfSUQpIAorICAgIHsKKwlwanN1YV9jb25mX3JlbW92ZV9wb3J0KGFwcF9jb25maWcucmluZ2JhY2tfc2xvdCk7CisJYXBwX2NvbmZpZy5yaW5nYmFja19zbG90ID0gUEpTVUFfSU5WQUxJRF9JRDsKKwlwam1lZGlhX3BvcnRfZGVzdHJveShhcHBfY29uZmlnLnJpbmdiYWNrX3BvcnQpOworCWFwcF9jb25maWcucmluZ2JhY2tfcG9ydCA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2xvc2UgcmluZyBwb3J0ICovCisgICAgaWYgKGFwcF9jb25maWcucmluZ19wb3J0ICYmIGFwcF9jb25maWcucmluZ19zbG90ICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlwanN1YV9jb25mX3JlbW92ZV9wb3J0KGFwcF9jb25maWcucmluZ19zbG90KTsKKwlhcHBfY29uZmlnLnJpbmdfc2xvdCA9IFBKU1VBX0lOVkFMSURfSUQ7CisJcGptZWRpYV9wb3J0X2Rlc3Ryb3koYXBwX2NvbmZpZy5yaW5nX3BvcnQpOworCWFwcF9jb25maWcucmluZ19wb3J0ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBDbG9zZSB0b25lIGdlbmVyYXRvcnMgKi8KKyAgICBmb3IgKGk9MDsgaTxhcHBfY29uZmlnLnRvbmVfY291bnQ7ICsraSkgeworCXBqc3VhX2NvbmZfcmVtb3ZlX3BvcnQoYXBwX2NvbmZpZy50b25lX3Nsb3RzW2ldKTsKKyAgICB9CisKKyAgICBpZiAoYXBwX2NvbmZpZy5wb29sKSB7CisJcGpfcG9vbF9yZWxlYXNlKGFwcF9jb25maWcucG9vbCk7CisJYXBwX2NvbmZpZy5wb29sID0gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9kZXN0cm95KCk7CisKKyAgICBpZiAoYXBwX2NvbmZpZy51c2VfY2xpKSB7CisJdXNlX2NsaSA9IGFwcF9jb25maWcudXNlX2NsaTsKKwljbGlfZmUgPSBhcHBfY29uZmlnLmNsaV9jZmcuY2xpX2ZlOworCWNsaV90ZWxuZXRfcG9ydCA9IGFwcF9jb25maWcuY2xpX2NmZy50ZWxuZXRfY2ZnLnBvcnQ7CQorICAgIH0KKworICAgIC8qIFJlc2V0IGNvbmZpZyAqLworICAgIHBqX2J6ZXJvKCZhcHBfY29uZmlnLCBzaXplb2YoYXBwX2NvbmZpZykpOworCisgICAgaWYgKHVzZV9jbGkpIHsgICAgCisJYXBwX2NvbmZpZy51c2VfY2xpID0gdXNlX2NsaTsKKwlhcHBfY29uZmlnLmNsaV9jZmcuY2xpX2ZlID0gY2xpX2ZlOworCWFwcF9jb25maWcuY2xpX2NmZy50ZWxuZXRfY2ZnLnBvcnQgPSBjbGlfdGVsbmV0X3BvcnQ7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworcGpfc3RhdHVzX3QgcGpzdWFfYXBwX2Rlc3Ryb3koKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGFwcF9kZXN0cm95KCk7CisKKyAgICBpZiAoYXBwX2NvbmZpZy51c2VfY2xpKSB7CQorCWNsaV9kZXN0cm95KCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKiA9PT09PT09PT09PT09PT09PT09PT09PSAqKi8KKworI2lmZGVmIFNURVJFT19ERU1PCisvKgorICogSW4gdGhpcyBzdGVyZW8gZGVtbywgd2Ugb3BlbiB0aGUgc291bmQgZGV2aWNlIGluIHN0ZXJlbyBtb2RlIGFuZAorICogYXJyYW5nZSB0aGUgYXR0YWNobWVudCB0byB0aGUgUEpTVUEtTElCIGNvbmZlcmVuY2UgYnJpZGdlIGFzIHN1Y2gKKyAqIHNvIHRoYXQgY2hhbm5lbDAvbGVmdCBjaGFubmVsIG9mIHRoZSBzb3VuZCBkZXZpY2UgY29ycmVzcG9uZHMgdG8KKyAqIHNsb3QgMCBpbiB0aGUgYnJpZGdlLCBhbmQgY2hhbm5lbDEvcmlnaHQgY2hhbm5lbCBvZiB0aGUgc291bmQKKyAqIGRldmljZSBjb3JyZXNwb25kcyB0byBzbG90IDEgaW4gdGhlIGJyaWRnZS4gVGhlbiB1c2VyIGNhbiBpbmRlcGVuZGVudGx5CisgKiBmZWVkIGRpZmZlcmVudCBtZWRpYSB0by9mcm9tIHRoZSBzcGVha2Vycy9taWNyb3Bob25lcyBjaGFubmVscywgYnkKKyAqIGNvbm5lY3RpbmcgdGhlbSB0byBzbG90IDAgb3IgMSByZXNwZWN0aXZlbHkuCisgKgorICogSGVyZSdzIGhvdyB0aGUgY29ubmVjdGlvbiBsb29rcyBsaWtlOgorICoKKyAgICstLS0tLS0tLS0tLSsgc3RlcmVvICstLS0tLS0tLS0tLS0tLS0tLSsgMnggbW9ubyArLS0tLS0tLS0tLS0rCisgICB8IEFVRElPIERFViB8PC0tLS0tLT58IFNQTElUQ09NQiAgIGxlZnR8PC0tLS0tLS0+fCMwICBCUklER0UgfAorICAgKy0tLS0tLS0tLS0tKyAgICAgICAgfCAgICAgICAgICAgIHJpZ2h0fDwtLS0tLS0tPnwjMSAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICArLS0tLS0tLS0tLS0rCisgKi8KK3N0YXRpYyB2b2lkIHN0ZXJlb19kZW1vKCkKK3sKKyAgICBwam1lZGlhX3BvcnQgKmNvbmY7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogRGlzYWJsZSBleGlzdGluZyBzb3VuZCBkZXZpY2UgKi8KKyAgICBjb25mID0gcGpzdWFfc2V0X25vX3NuZF9kZXYoKTsKKworICAgIC8qIENyZWF0ZSBzdGVyZW8tbW9ubyBzcGxpdHRlci9jb21iaW5lciAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc3BsaXRjb21iX2NyZWF0ZShhcHBfY29uZmlnLnBvb2wsIAorCQkJCSAgICAgIGNvbmYtPmluZm8uY2xvY2tfcmF0ZSAvKiBjbG9jayByYXRlICovLAorCQkJCSAgICAgIDIJICAgIC8qIHN0ZXJlbyAqLywKKwkJCQkgICAgICAyICogY29uZi0+aW5mby5zYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkgICAgICBjb25mLT5pbmZvLmJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgICAgICAwCSAgICAvKiBvcHRpb25zICovLAorCQkJCSAgICAgICZhcHBfY29uZmlnLnNjKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyogQ29ubmVjdCBjaGFubmVsMCAobGVmdCBjaGFubmVsPykgdG8gY29uZmVyZW5jZSBwb3J0IHNsb3QwICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zcGxpdGNvbWJfc2V0X2NoYW5uZWwoYXBwX2NvbmZpZy5zYywgMCAvKiBjaDAgKi8sIAorCQkJCQkgICAwIC8qb3B0aW9ucyovLAorCQkJCQkgICBjb25mKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyogQ3JlYXRlIHJldmVyc2UgY2hhbm5lbCBmb3IgY2hhbm5lbDEgKHJpZ2h0IGNoYW5uZWw/KS4uLiAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc3BsaXRjb21iX2NyZWF0ZV9yZXZfY2hhbm5lbChhcHBfY29uZmlnLnBvb2wsCisJCQkJCQkgIGFwcF9jb25maWcuc2MsCisJCQkJCQkgIDEgIC8qIGNoMSAqLywKKwkJCQkJCSAgMCAgLyogb3B0aW9ucyAqLywKKwkJCQkJCSAgJmFwcF9jb25maWcuc2NfY2gxKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyogLi4gYW5kIHJlZ2lzdGVyIGl0IHRvIGNvbmZlcmVuY2UgYnJpZGdlIChpdCB3b3VsZCBiZSBzbG90MQorICAgICAqIGlmIHRoZXJlJ3Mgbm8gb3RoZXIgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlIGJyaWRnZSkKKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2FkZF9wb3J0KGFwcF9jb25maWcucG9vbCwgYXBwX2NvbmZpZy5zY19jaDEsIAorCQkJCSAmYXBwX2NvbmZpZy5zY19jaDFfc2xvdCk7CisgICAgcGpfYXNzZXJ0KHN0YXR1cyA9PSBQSl9TVUNDRVNTKTsKKyAgICAKKyAgICAvKiBDcmVhdGUgc291bmQgZGV2aWNlICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9jcmVhdGUoYXBwX2NvbmZpZy5wb29sLCAtMSwgLTEsIAorCQkJCSAgICAgY29uZi0+aW5mby5jbG9ja19yYXRlLAorCQkJCSAgICAgMgkgICAgLyogc3RlcmVvICovLAorCQkJCSAgICAgMiAqIGNvbmYtPmluZm8uc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJICAgICBjb25mLT5pbmZvLmJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgICAgIDAsICZhcHBfY29uZmlnLnNuZCk7CisgICAgcGpfYXNzZXJ0KHN0YXR1cyA9PSBQSl9TVUNDRVNTKTsKKworCisgICAgLyogQ29ubmVjdCB0aGUgc3BsaXR0ZXIgdG8gdGhlIHNvdW5kIGRldmljZSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChhcHBfY29uZmlnLnNuZCwgYXBwX2NvbmZpZy5zYyk7CisgICAgcGpfYXNzZXJ0KHN0YXR1cyA9PSBQSl9TVUNDRVNTKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhmYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwLmgKQEAgLTAsMCArMSw4OCBAQAorLyogJElkOiBwanN1YV9hcHAuaCA0NDg5IDIwMTMtMDQtMjMgMDc6NTM6MjVaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKyNpZm5kZWYgX19QSlNVQV9BUFBfSF9fCisjZGVmaW5lIF9fUEpTVUFfQVBQX0hfXworCisvKioKKyAqIEludGVyZmFjZSBmb3IgdXNlciBhcHBsaWNhdGlvbiB0byB1c2UgcGpzdWEgd2l0aCBDTEkvbWVudSBiYXNlZCBVSS4gCisgKi8KKworI2luY2x1ZGUgInBqc3VhX2FwcF9jb21tb24uaCIKKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGFwcGxpY2F0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBwanN1YV9hcHBfY2ZnX3QKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHJ1bnRpbWUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgaW50ICAgICAgIGFyZ2M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgb2YgYXJndW1lbnRzIHN0cmluZyBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiAKKyAgICAgKi8KKyAgICBjaGFyICAgICoqYXJndjsKKworICAgIC8qKiAKKyAgICAgKiBUZWxsIGFwcCB0aGF0IENMSSAoYW5kIHBqc3VhKSBpcyAocmUpc3RhcnRlZC4KKyAgICAgKiBtc2cgd2lsbCBjb250YWluIHN0YXJ0IGVycm9yIG1lc3NhZ2Ugc3VjaCBhcyCTVGVsbmV0IHRvIFg6WZQsCisgICAgICogk2ZhaWxlZCB0byBzdGFydCBwanN1YSBsaWKULCCTcG9ydCBidXN5lC4uCisgICAgICovCisgICAgdm9pZCAoKm9uX3N0YXJ0ZWQpKHBqX3N0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciogdGl0bGUpOworCisgICAgLyoqCisgICAgICogVGVsbCBhcHAgdGhhdCBsaWJyYXJ5IHJlcXVlc3QgdG8gc3RvcHBlZC9yZXN0YXJ0LgorICAgICAqIEdVSSBhcHAgbmVlZHMgdG8gdXNlIGEgdGltZXIgbWVjaGFuaXNtIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIHRoZSAKKyAgICAgKiBjbGVhbnVwIHByb2NlZHVyZS4KKyAgICAgKi8KKyAgICB2b2lkICgqb25fc3RvcHBlZCkocGpfYm9vbF90IHJlc3RhcnQsIGludCBhcmdjLCBjaGFyKiogYXJndik7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdpbGwgZW5hYmxlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBjdXN0b21pemUgY29uZmlndXJhdGlvbiBvdGhlciB0aGFuCisgICAgICogdGhlIGJhc2ljIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgcGpzdWEuIAorICAgICAqLworICAgIHZvaWQgKCpvbl9jb25maWdfaW5pdCkocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKTsKK30gcGpzdWFfYXBwX2NmZ190OworCisvKioKKyAqIFRoaXMgd2lsbCBpbml0aWF0ZSB0aGUgcGpzdWEgYW5kIHRoZSB1c2VyIGludGVyZmFjZSAoQ0xJL21lbnUgVUkpIGJhc2VkIG9uIAorICogdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uCisgKi8KK3BqX3N0YXR1c190IHBqc3VhX2FwcF9pbml0KGNvbnN0IHBqc3VhX2FwcF9jZmdfdCAqYXBwX2NmZyk7CisKKy8qKgorICogVGhpcyB3aWxsIHJ1biB0aGUgQ0xJL21lbnUgYmFzZWQgVUkuCisgKiB3YWl0X3RlbG5ldF9jbGkgaXMgdXNlZCBmb3IgQ0xJIGJhc2VkIFVJLiBJdCB3aWxsIHRlbGwgdGhlIGxpYnJhcnkgdG8gYmxvY2sKKyAqIG9yIHdhaXQgdW50aWwgdXNlciBpbnZva2UgdGhlICJzaHV0ZG93biIvInJlc3RhcnQiIGNvbW1hbmQuIEdVSSBiYXNlZCBhcHAKKyAqIHNob3VsZCBkZWZpbmUgdGhpcyBwYXJhbSBhcyBQSl9GQUxTRS4KKyAqLworcGpfc3RhdHVzX3QgcGpzdWFfYXBwX3J1bihwal9ib29sX3Qgd2FpdF90ZWxuZXRfY2xpKTsKKworLyoqCisgKiBUaGlzIHdpbGwgZGVzdHJveS9jbGVhbnVwIHRoZSBhcHBsaWNhdGlvbiBsaWJyYXJ5LgorICovCitwal9zdGF0dXNfdCBwanN1YV9hcHBfZGVzdHJveSgpOworCitQSl9FTkRfREVDTAorICAgIAorI2VuZGlmCS8qIF9fUEpTVUFfQVBQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NsaS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjhhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfY2xpLmMKQEAgLTAsMCArMSwzMTI2IEBACisvKiAkSWQ6IHBqc3VhX2FwcF9jbGkuYyA0NzA5IDIwMTQtMDEtMjIgMDg6MDI6NTZaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworI2luY2x1ZGUgInBqc3VhX2FwcF9jb21tb24uaCIKKworI2RlZmluZSBUSElTX0ZJTEUJInBqc3VhX2FwcF9jbGkuYyIKKworI2RlZmluZSBDSEVDS19QSlNVQV9SVU5OSU5HKCkgaWYgKHBqc3VhX2dldF9zdGF0ZSgpIT1QSlNVQV9TVEFURV9SVU5OSU5HKSBcCisJCQkJICByZXR1cm4gUEpfRUlOVkFMSURPUAorCisvKiBDTEkgY29tbWFuZCBpZCAqLworLyogbGV2ZWwgMSBjb21tYW5kICovCisjZGVmaW5lIENNRF9DQUxMCQkgICAgMTAwCisjZGVmaW5lIENNRF9QUkVTRU5DRQkJICAgIDIwMAorI2RlZmluZSBDTURfQUNDT1VOVAkJICAgIDMwMAorI2RlZmluZSBDTURfTUVESUEJCSAgICA0MDAKKyNkZWZpbmUgQ01EX0NPTkZJRwkJICAgIDUwMAorI2RlZmluZSBDTURfVklERU8JCSAgICA2MDAKKyNkZWZpbmUgQ01EX1NMRUVQCQkgICAgNzAwCisjZGVmaW5lIENNRF9FQ0hPCQkgICAgODAwCisjZGVmaW5lIENNRF9ORVRXT1JLCQkgICAgOTAwCisjZGVmaW5lIENNRF9RVUlUCQkgICAgMTEwCisjZGVmaW5lIENNRF9SRVNUQVJUCQkgICAgMTIwCisKKy8qIGNhbGwgbGV2ZWwgMiBjb21tYW5kICovCisjZGVmaW5lIENNRF9DQUxMX05FVwkJICAgICgoQ01EX0NBTEwqMTApKzEpCisjZGVmaW5lIENNRF9DQUxMX01VTFRJCQkgICAgKChDTURfQ0FMTCoxMCkrMikKKyNkZWZpbmUgQ01EX0NBTExfQU5TV0VSCQkgICAgKChDTURfQ0FMTCoxMCkrMykKKyNkZWZpbmUgQ01EX0NBTExfSEFOR1VQCQkgICAgKChDTURfQ0FMTCoxMCkrNCkKKyNkZWZpbmUgQ01EX0NBTExfSEFOR1VQX0FMTAkgICAgKChDTURfQ0FMTCoxMCkrNSkKKyNkZWZpbmUgQ01EX0NBTExfSE9MRAkJICAgICgoQ01EX0NBTEwqMTApKzYpCisjZGVmaW5lIENNRF9DQUxMX1JFSU5WSVRFCSAgICAoKENNRF9DQUxMKjEwKSs3KQorI2RlZmluZSBDTURfQ0FMTF9VUERBVEUJCSAgICAoKENNRF9DQUxMKjEwKSs4KQorI2RlZmluZSBDTURfQ0FMTF9ORVhUCQkgICAgKChDTURfQ0FMTCoxMCkrOSkKKyNkZWZpbmUgQ01EX0NBTExfUFJFVklPVVMJICAgICgoQ01EX0NBTEwqMTApKzEwKQorI2RlZmluZSBDTURfQ0FMTF9UUkFOU0ZFUgkgICAgKChDTURfQ0FMTCoxMCkrMTEpCisjZGVmaW5lIENNRF9DQUxMX1RSQU5TRkVSX1JFUExBQ0UgICAoKENNRF9DQUxMKjEwKSsxMikKKyNkZWZpbmUgQ01EX0NBTExfUkVESVJFQ1QJICAgICgoQ01EX0NBTEwqMTApKzEzKQorI2RlZmluZSBDTURfQ0FMTF9EMjgzMwkJICAgICgoQ01EX0NBTEwqMTApKzE0KQorI2RlZmluZSBDTURfQ0FMTF9JTkZPCQkgICAgKChDTURfQ0FMTCoxMCkrMTUpCisjZGVmaW5lIENNRF9DQUxMX0RVTVBfUQkJICAgICgoQ01EX0NBTEwqMTApKzE2KQorI2RlZmluZSBDTURfQ0FMTF9TRU5EX0FSQgkgICAgKChDTURfQ0FMTCoxMCkrMTcpCisjZGVmaW5lIENNRF9DQUxMX0xJU1QJCSAgICAoKENNRF9DQUxMKjEwKSsxOCkKKworLyogaW0gJiBwcmVzZW5jZSBsZXZlbCAyIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1BSRVNFTkNFX0FERF9CVUREWQkgICAgKChDTURfUFJFU0VOQ0UqMTApKzEpCisjZGVmaW5lIENNRF9QUkVTRU5DRV9ERUxfQlVERFkJICAgICgoQ01EX1BSRVNFTkNFKjEwKSsyKQorI2RlZmluZSBDTURfUFJFU0VOQ0VfU0VORF9JTQkgICAgKChDTURfUFJFU0VOQ0UqMTApKzMpCisjZGVmaW5lIENNRF9QUkVTRU5DRV9TVUIJICAgICgoQ01EX1BSRVNFTkNFKjEwKSs0KQorI2RlZmluZSBDTURfUFJFU0VOQ0VfVU5TVUIJICAgICgoQ01EX1BSRVNFTkNFKjEwKSs1KQorI2RlZmluZSBDTURfUFJFU0VOQ0VfVE9HX1NUQVRFCSAgICAoKENNRF9QUkVTRU5DRSoxMCkrNikKKyNkZWZpbmUgQ01EX1BSRVNFTkNFX1RFWFQJICAgICgoQ01EX1BSRVNFTkNFKjEwKSs3KQorI2RlZmluZSBDTURfUFJFU0VOQ0VfTElTVAkgICAgKChDTURfUFJFU0VOQ0UqMTApKzgpCisKKy8qIGFjY291bnQgbGV2ZWwgMiBjb21tYW5kICovCisjZGVmaW5lIENNRF9BQ0NPVU5UX0FERAkJICAgICgoQ01EX0FDQ09VTlQqMTApKzEpCisjZGVmaW5lIENNRF9BQ0NPVU5UX0RFTAkJICAgICgoQ01EX0FDQ09VTlQqMTApKzIpCisjZGVmaW5lIENNRF9BQ0NPVU5UX01PRAkJICAgICgoQ01EX0FDQ09VTlQqMTApKzMpCisjZGVmaW5lIENNRF9BQ0NPVU5UX1JFRwkJICAgICgoQ01EX0FDQ09VTlQqMTApKzQpCisjZGVmaW5lIENNRF9BQ0NPVU5UX1VOUkVHCSAgICAoKENNRF9BQ0NPVU5UKjEwKSs1KQorI2RlZmluZSBDTURfQUNDT1VOVF9ORVhUCSAgICAoKENNRF9BQ0NPVU5UKjEwKSs2KQorI2RlZmluZSBDTURfQUNDT1VOVF9QUkVWCSAgICAoKENNRF9BQ0NPVU5UKjEwKSs3KQorI2RlZmluZSBDTURfQUNDT1VOVF9TSE9XCSAgICAoKENNRF9BQ0NPVU5UKjEwKSs4KQorCisvKiBjb25mZXJlbmNlICYgbWVkaWEgbGV2ZWwgMiBjb21tYW5kICovCisjZGVmaW5lIENNRF9NRURJQV9MSVNUCQkgICAgKChDTURfTUVESUEqMTApKzEpCisjZGVmaW5lIENNRF9NRURJQV9DT05GX0NPTk5FQ1QJICAgICgoQ01EX01FRElBKjEwKSsyKQorI2RlZmluZSBDTURfTUVESUFfQ09ORl9ESVNDT05ORUNUICAgKChDTURfTUVESUEqMTApKzMpCisjZGVmaW5lIENNRF9NRURJQV9BREpVU1RfVk9MCSAgICAoKENNRF9NRURJQSoxMCkrNCkKKyNkZWZpbmUgQ01EX01FRElBX0NPREVDX1BSSU8JICAgICgoQ01EX01FRElBKjEwKSs1KQorI2RlZmluZSBDTURfTUVESUFfU1BFQUtFUl9UT0dHTEUgICAgKChDTURfTUVESUEqMTApKzYpCisKKy8qIHN0YXR1cyAmIGNvbmZpZyBsZXZlbCAyIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0NPTkZJR19EVU1QX1NUQVQJICAgICgoQ01EX0NPTkZJRyoxMCkrMSkKKyNkZWZpbmUgQ01EX0NPTkZJR19EVU1QX0RFVEFJTAkgICAgKChDTURfQ09ORklHKjEwKSsyKQorI2RlZmluZSBDTURfQ09ORklHX0RVTVBfQ09ORgkgICAgKChDTURfQ09ORklHKjEwKSszKQorI2RlZmluZSBDTURfQ09ORklHX1dSSVRFX1NFVFRJTkcgICAgKChDTURfQ09ORklHKjEwKSs0KQorCisvKiB2aWRlbyBsZXZlbCAyIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1ZJREVPX0VOQUJMRQkgICAgKChDTURfVklERU8qMTApKzEpCisjZGVmaW5lIENNRF9WSURFT19ESVNBQkxFCSAgICAoKENNRF9WSURFTyoxMCkrMikKKyNkZWZpbmUgQ01EX1ZJREVPX0FDQwkJICAgICgoQ01EX1ZJREVPKjEwKSszKQorI2RlZmluZSBDTURfVklERU9fQ0FMTAkJICAgICgoQ01EX1ZJREVPKjEwKSs0KQorI2RlZmluZSBDTURfVklERU9fREVWSUNFCSAgICAoKENNRF9WSURFTyoxMCkrNSkKKyNkZWZpbmUgQ01EX1ZJREVPX0NPREVDCQkgICAgKChDTURfVklERU8qMTApKzYpCisjZGVmaW5lIENNRF9WSURFT19XSU4JCSAgICAoKENNRF9WSURFTyoxMCkrNykKKworLyogdmlkZW8gbGV2ZWwgMyBjb21tYW5kICovCisjZGVmaW5lIENNRF9WSURFT19BQ0NfU0hPVwkgICAgKChDTURfVklERU9fQUNDKjEwKSsxKQorI2RlZmluZSBDTURfVklERU9fQUNDX0FVVE9SWAkgICAgKChDTURfVklERU9fQUNDKjEwKSsyKQorI2RlZmluZSBDTURfVklERU9fQUNDX0FVVE9UWAkgICAgKChDTURfVklERU9fQUNDKjEwKSszKQorI2RlZmluZSBDTURfVklERU9fQUNDX0NBUF9JRAkgICAgKChDTURfVklERU9fQUNDKjEwKSs0KQorI2RlZmluZSBDTURfVklERU9fQUNDX1JFTl9JRAkgICAgKChDTURfVklERU9fQUNDKjEwKSs1KQorI2RlZmluZSBDTURfVklERU9fQ0FMTF9SWAkgICAgKChDTURfVklERU9fQ0FMTCoxMCkrMSkKKyNkZWZpbmUgQ01EX1ZJREVPX0NBTExfVFgJICAgICgoQ01EX1ZJREVPX0NBTEwqMTApKzIpCisjZGVmaW5lIENNRF9WSURFT19DQUxMX0FERAkgICAgKChDTURfVklERU9fQ0FMTCoxMCkrMykKKyNkZWZpbmUgQ01EX1ZJREVPX0NBTExfRU5BQkxFCSAgICAoKENNRF9WSURFT19DQUxMKjEwKSs0KQorI2RlZmluZSBDTURfVklERU9fQ0FMTF9ESVNBQkxFCSAgICAoKENNRF9WSURFT19DQUxMKjEwKSs1KQorI2RlZmluZSBDTURfVklERU9fQ0FMTF9DQVAJICAgICgoQ01EX1ZJREVPX0NBTEwqMTApKzYpCisjZGVmaW5lIENNRF9WSURFT19ERVZJQ0VfTElTVAkgICAgKChDTURfVklERU9fREVWSUNFKjEwKSsxKQorI2RlZmluZSBDTURfVklERU9fREVWSUNFX1JFRlJFU0ggICAgKChDTURfVklERU9fREVWSUNFKjEwKSsyKQorI2RlZmluZSBDTURfVklERU9fREVWSUNFX1BSRVZJRVcgICAgKChDTURfVklERU9fREVWSUNFKjEwKSszKQorI2RlZmluZSBDTURfVklERU9fQ09ERUNfTElTVAkgICAgKChDTURfVklERU9fQ09ERUMqMTApKzEpCisjZGVmaW5lIENNRF9WSURFT19DT0RFQ19QUklPCSAgICAoKENNRF9WSURFT19DT0RFQyoxMCkrMikKKyNkZWZpbmUgQ01EX1ZJREVPX0NPREVDX0ZQUwkgICAgKChDTURfVklERU9fQ09ERUMqMTApKzMpCisjZGVmaW5lIENNRF9WSURFT19DT0RFQ19CSVRSQVRFCSAgICAoKENNRF9WSURFT19DT0RFQyoxMCkrNCkKKyNkZWZpbmUgQ01EX1ZJREVPX0NPREVDX1NJWkUJICAgICgoQ01EX1ZJREVPX0NPREVDKjEwKSs1KQorI2RlZmluZSBDTURfVklERU9fV0lOX0xJU1QJICAgICgoQ01EX1ZJREVPX1dJTioxMCkrMSkKKyNkZWZpbmUgQ01EX1ZJREVPX1dJTl9BUlJBTkdFCSAgICAoKENNRF9WSURFT19XSU4qMTApKzIpCisjZGVmaW5lIENNRF9WSURFT19XSU5fU0hPVwkgICAgKChDTURfVklERU9fV0lOKjEwKSszKQorI2RlZmluZSBDTURfVklERU9fV0lOX0hJREUJICAgICgoQ01EX1ZJREVPX1dJTioxMCkrNCkKKyNkZWZpbmUgQ01EX1ZJREVPX1dJTl9NT1ZFCSAgICAoKENNRF9WSURFT19XSU4qMTApKzUpCisjZGVmaW5lIENNRF9WSURFT19XSU5fUkVTSVpFCSAgICAoKENNRF9WSURFT19XSU4qMTApKzYpCisKKy8qIGR5bmFtaWMgY2hvaWNlIGFyZ3VtZW50IGxpc3QgKi8KKyNkZWZpbmUgRFlOX0NIT0lDRV9TVEFSVAkgICAgOTkwMAorI2RlZmluZSBEWU5fQ0hPSUNFX0JVRERZX0lECSAgICAoRFlOX0NIT0lDRV9TVEFSVCkrMQorI2RlZmluZSBEWU5fQ0hPSUNFX0FDQ09VTlRfSUQJICAgIChEWU5fQ0hPSUNFX1NUQVJUKSsyCisjZGVmaW5lIERZTl9DSE9JQ0VfTUVESUFfUE9SVAkgICAgKERZTl9DSE9JQ0VfU1RBUlQpKzMKKyNkZWZpbmUgRFlOX0NIT0lDRV9BVURJT19DT0RFQ19JRCAgIChEWU5fQ0hPSUNFX1NUQVJUKSs0CisjZGVmaW5lIERZTl9DSE9JQ0VfQ0FQX0RFVl9JRAkgICAgKERZTl9DSE9JQ0VfU1RBUlQpKzUKKyNkZWZpbmUgRFlOX0NIT0lDRV9SRU5fREVWX0lECSAgICAoRFlOX0NIT0lDRV9TVEFSVCkrNgorI2RlZmluZSBEWU5fQ0hPSUNFX1ZJRF9ERVZfSUQJICAgIChEWU5fQ0hPSUNFX1NUQVJUKSs3CisjZGVmaW5lIERZTl9DSE9JQ0VfU1RSRUFNX0lECSAgICAoRFlOX0NIT0lDRV9TVEFSVCkrOAorI2RlZmluZSBEWU5fQ0hPSUNFX1ZJREVPX0NPREVDX0lEICAgKERZTl9DSE9JQ0VfU1RBUlQpKzkKKyNkZWZpbmUgRFlOX0NIT0lDRV9XSU5fSUQJICAgIChEWU5fQ0hPSUNFX1NUQVJUKSsxMAorI2RlZmluZSBEWU5fQ0hPSUNFX0NBTExfSUQJICAgIChEWU5fQ0hPSUNFX1NUQVJUKSsxMQorI2RlZmluZSBEWU5fQ0hPSUNFX0FEREVEX0JVRERZX0lEICAgKERZTl9DSE9JQ0VfU1RBUlQpKzEyCisKK3N0YXRpYyBwal9ib29sX3QJICAgcGpfaW5pdGVkID0gUEpfRkFMU0U7CitzdGF0aWMgcGpfY2FjaGluZ19wb29sCSAgIGNsaV9jcDsKK3N0YXRpYyBwal9ib29sX3QJICAgY2xpX2NwX2luaXRlZCA9IFBKX0ZBTFNFOworc3RhdGljIHBqX2NsaV90CQkgICAqY2xpID0gTlVMTDsKK3N0YXRpYyBwal9jbGlfc2VzcwkgICAqY2xpX2NvbnNfc2VzcyA9IE5VTEw7CitzdGF0aWMgcGpfY2xpX2Zyb250X2VuZAkgICAqdGVsbmV0X2Zyb250X2VuZCA9IE5VTEw7CisKKy8qKiBGb3J3YXJkIGRlY2xhcmF0aW9uICoqLworcGpfc3RhdHVzX3QgY2xpX3NldHVwX2NvbW1hbmQocGpfY2xpX3QgKmNsaSk7Cit2b2lkIGNsaV9kZXN0cm95KCk7CisKK1BKX0RFRih2b2lkKSBjbGlfZ2V0X2luZm8oY2hhciAqaW5mbywgcGpfc2l6ZV90IHNpemUpIAoreworICAgIHBqX2NsaV90ZWxuZXRfaW5mbyB0ZWxuZXRfaW5mbzsKKyAgICBwal9jbGlfdGVsbmV0X2dldF9pbmZvKHRlbG5ldF9mcm9udF9lbmQsICZ0ZWxuZXRfaW5mbyk7CisKKyAgICBwal9hbnNpX3NucHJpbnRmKGluZm8sIHNpemUsICJUZWxuZXQgdG8gJS4qczolZCIsCisJCSAgICAgKGludCl0ZWxuZXRfaW5mby5pcF9hZGRyZXNzLnNsZW4sIAorCQkgICAgIHRlbG5ldF9pbmZvLmlwX2FkZHJlc3MucHRyLCAKKwkJICAgICB0ZWxuZXRfaW5mby5wb3J0KTsKK30KKworc3RhdGljIHZvaWQgY2xpX2xvZ193cml0ZXIoaW50IGxldmVsLCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisgICAgaWYgKGNsaSkKKyAgICAgICAgcGpfY2xpX3dyaXRlX2xvZyhjbGksIGxldmVsLCBidWZmZXIsIGxlbik7Cit9CisKK3BqX3N0YXR1c190IGNsaV9pbml0KCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwal9jbGlfY2ZnICpjZmcgPSAmYXBwX2NvbmZpZy5jbGlfY2ZnLmNmZzsKKworICAgIC8qIEluaXQgUEpMSUIgKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICBwal9pbml0ZWQgPSBQSl9UUlVFOworCisgICAgLyogSW5pdCBQSkxJQi1VVElMICovCisgICAgc3RhdHVzID0gcGpsaWJfdXRpbF9pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBJbml0IENMSSAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjbGlfY3AsIE5VTEwsIDApOworICAgIGNsaV9jcF9pbml0ZWQgPSBQSl9UUlVFOworICAgIGNmZy0+cGYgPSAmY2xpX2NwLmZhY3Rvcnk7CisgICAgY2ZnLT5uYW1lID0gcGpfc3RyKCJwanN1YV9jbGkiKTsKKyAgICBjZmctPnRpdGxlID0gcGpfc3RyKCJQanN1YSBDTEkgQXBwbGljYXRpb24iKTsKKyAgICBzdGF0dXMgPSBwal9jbGlfY3JlYXRlKGNmZywgJmNsaSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICBzdGF0dXMgPSBjbGlfc2V0dXBfY29tbWFuZChjbGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogSW5pdCB0ZWxuZXQgZnJvbnRlbmQgKi8KKyAgICBpZiAoYXBwX2NvbmZpZy5jbGlfY2ZnLmNsaV9mZSAmIENMSV9GRV9URUxORVQpIHsKKwlwal9jbGlfdGVsbmV0X2NmZyAqZmVfY2ZnID0gJmFwcF9jb25maWcuY2xpX2NmZy50ZWxuZXRfY2ZnOworCXBqX3Bvb2xfdCAqcG9vbDsKKworCXBvb2wgPSBwal9wb29sX2NyZWF0ZShjZmctPnBmLCAiY2xpX2NwIiwgMTI4LCAxMjgsIE5VTEwpOworCXBqX2Fzc2VydChwb29sKTsKKworCXN0YXR1cyA9IHBqX2NsaV90ZWxuZXRfY3JlYXRlKGNsaSwgZmVfY2ZnLCAmdGVsbmV0X2Zyb250X2VuZCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8qIEluaXQgY29uc29sZSBmcm9udGVuZCAqLworICAgIGlmIChhcHBfY29uZmlnLmNsaV9jZmcuY2xpX2ZlICYgQ0xJX0ZFX0NPTlNPTEUpIHsKKwlwal9jbGlfY29uc29sZV9jZmcgKmZlX2NmZyA9ICZhcHBfY29uZmlnLmNsaV9jZmcuY29uc29sZV9jZmc7CisJCisJZmVfY2ZnLT5xdWl0X2NvbW1hbmQgPSBwal9zdHIoInNodXRkb3duIik7CisJc3RhdHVzID0gcGpfY2xpX2NvbnNvbGVfY3JlYXRlKGNsaSwgZmVfY2ZnLAorCQkJCSAgICAgICAmY2xpX2NvbnNfc2VzcywgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworCitvbl9lcnJvcjoKKyAgICBjbGlfZGVzdHJveSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3BqX3N0YXR1c190IGNsaV9tYWluKHBqX2Jvb2xfdCB3YWl0X3RlbG5ldF9jbGkpCit7CisgICAgY2hhciBjbWRsaW5lW1BKX0NMSV9NQVhfQ01EQlVGXTsKKworICAgIC8qIFJlSW5pdCBsb2dnaW5nICovCisgICAgYXBwX2NvbmZpZy5sb2dfY2ZnLmNiID0gJmNsaV9sb2dfd3JpdGVyOworICAgIHBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmcoJmFwcF9jb25maWcubG9nX2NmZyk7CisKKyAgICBpZiAoYXBwX2NvbmZpZy5jbGlfY2ZnLmNsaV9mZSAmIENMSV9GRV9DT05TT0xFKSB7CisJLyogTWFpbiBsb29wIGZvciBDTEkgRkUgY29uc29sZSAqLworCXdoaWxlICghcGpfY2xpX2lzX3F1aXR0aW5nKGNsaSkpIHsKKwkgICAgcGpfY2xpX2NvbnNvbGVfcHJvY2VzcyhjbGlfY29uc19zZXNzLCBjbWRsaW5lLCBzaXplb2YoY21kbGluZSkpOworCX0KKyAgICB9IGVsc2UgaWYgKHdhaXRfdGVsbmV0X2NsaSkgeworCS8qIEp1c3Qgd2FpdCBmb3IgQ0xJIHF1aXQgKi8KKwl3aGlsZSAoIXBqX2NsaV9pc19xdWl0dGluZyhjbGkpKSB7CisJICAgIHBqX3RocmVhZF9zbGVlcCgyMDApOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwordm9pZCBjbGlfZGVzdHJveSgpCit7CisgICAgLyogRGVzdHJveSBDTEksIGl0IHdpbGwgYXV0b21hdGljYWxseSBkZXN0cm95IGFueSBGRXMgKi8KKyAgICBpZiAoY2xpKSB7CQkKKwlwal9jbGlfZGVzdHJveShjbGkpOworCWNsaSA9IE5VTEw7CisgICAgfQorCisgICAgLyogRGVzdHJveSBDTEkgY2FjaGluZyBwb29sIGZhY3RvcnkgKi8KKyAgICBpZiAoY2xpX2NwX2luaXRlZCkgeworCXBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjbGlfY3ApOworCWNsaV9jcF9pbml0ZWQgPSBQSl9GQUxTRTsKKyAgICB9CisKKyAgICAvKiBTaHV0ZG93biBQSkxJQiAqLworICAgIGlmIChwal9pbml0ZWQpIHsKKwlwal9zaHV0ZG93bigpOworCXBqX2luaXRlZCA9IFBKX0ZBTFNFOworICAgIH0KK30KKworLyogR2V0IGlucHV0IFVSTCAqLworc3RhdGljIHZvaWQgZ2V0X2lucHV0X3VybChjaGFyICpidWYsIAorCQkJICBwal9zaXplX3QgbGVuLAorCQkJICBwal9jbGlfY21kX3ZhbCAqY3ZhbCwKKwkJCSAgc3RydWN0IGlucHV0X3Jlc3VsdCAqcmVzdWx0KQoreworICAgIHN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfaW52YWxpZF9pbnB1dCA9IHsiSW52YWxpZCBpbnB1dFxuIiwgMTV9OworICAgIHJlc3VsdC0+bmJfcmVzdWx0ID0gUEpTVUFfQVBQX05PX05COworICAgIHJlc3VsdC0+dXJpX3Jlc3VsdCA9IE5VTEw7CisKKyAgICBsZW4gPSBzdHJsZW4oYnVmKTsKKworICAgIC8qIExlZnQgdHJpbSAqLworICAgIHdoaWxlIChwal9pc3NwYWNlKCpidWYpKSB7CisJKytidWY7CisJLS1sZW47CisgICAgfQorCisgICAgLyogUmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmVzICovCisgICAgd2hpbGUgKGxlbiAmJiAoYnVmW2xlbi0xXSA9PSAnXHInIHx8IGJ1ZltsZW4tMV0gPT0gJ1xuJykpCisJYnVmWy0tbGVuXSA9ICdcMCc7CisKKyAgICBpZiAobGVuID09IDAgfHwgYnVmWzBdPT0ncScpCisJcmV0dXJuOworCisgICAgaWYgKHBqX2lzZGlnaXQoKmJ1ZikgfHwgKmJ1Zj09Jy0nKSB7CisKKwl1bnNpZ25lZCBpOworCisJaWYgKCpidWY9PSctJykKKwkgICAgaSA9IDE7CisJZWxzZQorCSAgICBpID0gMDsKKworCWZvciAoOyBpPGxlbjsgKytpKSB7CisJICAgIGlmICghcGpfaXNkaWdpdChidWZbaV0pKSB7CisJCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfaW52YWxpZF9pbnB1dC5wdHIsIAorCQkJCSAgICAgIChpbnQpZXJyX2ludmFsaWRfaW5wdXQuc2xlbik7CisJCXJldHVybjsKKwkgICAgfQorCX0KKworCXJlc3VsdC0+bmJfcmVzdWx0ID0gbXlfYXRvaShidWYpOworCisJaWYgKHJlc3VsdC0+bmJfcmVzdWx0ID49IDAgJiYgCisJICAgIHJlc3VsdC0+bmJfcmVzdWx0IDw9IChpbnQpcGpzdWFfZ2V0X2J1ZGR5X2NvdW50KCkpIAorCXsKKwkgICAgcmV0dXJuOworCX0KKwlpZiAocmVzdWx0LT5uYl9yZXN1bHQgPT0gLTEpCisJICAgIHJldHVybjsKKworCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfaW52YWxpZF9pbnB1dC5wdHIsIAorCQkJICAgICAgKGludCllcnJfaW52YWxpZF9pbnB1dC5zbGVuKTsKKwlyZXN1bHQtPm5iX3Jlc3VsdCA9IFBKU1VBX0FQUF9OT19OQjsKKwlyZXR1cm47CisKKyAgICB9IGVsc2UgeworCXBqX3N0YXR1c190IHN0YXR1czsKKworCWlmICgoc3RhdHVzPXBqc3VhX3ZlcmlmeV91cmwoYnVmKSkgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiSW52YWxpZCBVUkwiLCBzdGF0dXMpOworCSAgICByZXR1cm47CisJfQorCisJcmVzdWx0LT51cmlfcmVzdWx0ID0gYnVmOworICAgIH0KK30KKworLyogQ0xJIGR5bmFtaWMgY2hvaWNlIGhhbmRsZXIgKi8KKy8qIEdldCBidWRkeSBpZCAqLworc3RhdGljIHZvaWQgZ2V0X2J1ZGR5X2lkKHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBpZiAocGFyYW0tPmNudCA8IHBhcmFtLT5tYXhfY250KSB7CQorCXBqc3VhX2J1ZGR5X2lkIGlkc1s2NF07CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNvdW50ID0gUEpfQVJSQVlfU0laRShpZHMpOworCWNoYXIgZGF0YV9vdXRbNjRdOworCisJcGpzdWFfZW51bV9idWRkaWVzKGlkcywgJmNvdW50KTsKKwkKKwlpZiAoY291bnQgPiAwKSB7CisJICAgIGZvciAoaT0wOyBpPChpbnQpY291bnQ7ICsraSkgeworCQlwanN1YV9idWRkeV9pbmZvIGluZm87CisKKwkJaWYgKHBqc3VhX2J1ZGR5X2dldF9pbmZvKGlkc1tpXSwgJmluZm8pICE9IFBKX1NVQ0NFU1MpCisJCSAgICBjb250aW51ZTsKKworCQkvKiBGaWxsIGJ1ZGR5IGlkICovCisJCXBqX2Fuc2lfc25wcmludGYoZGF0YV9vdXQsIHNpemVvZihkYXRhX291dCksICIlZCIsIGlkc1tpXSsxKTsKKwkJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbaV0udmFsdWUsIGRhdGFfb3V0KTsKKwkJcGpfYnplcm8oZGF0YV9vdXQsIFBKX0FSUkFZX1NJWkUoZGF0YV9vdXQpKTsKKyAgICAJICAgIAorCQkvKiBGb3JtYXQgJiBmaWxsIGRlc2NyaXB0aW9uICovCisJCXBqX2Fuc2lfc25wcmludGYoZGF0YV9vdXQsIAorCQkJCXNpemVvZihkYXRhX291dCksCisJCQkJIjwlLipzPiAgJS4qcyIsIAkJICAgIAorCQkJCShpbnQpaW5mby5zdGF0dXNfdGV4dC5zbGVuLAorCQkJCWluZm8uc3RhdHVzX3RleHQucHRyLCAKKwkJCQkoaW50KWluZm8udXJpLnNsZW4sCisJCQkJaW5mby51cmkucHRyKTsKKworCQlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCBkYXRhX291dCk7CQkKKwkJaWYgKCsrcGFyYW0tPmNudCA+PSAocGFyYW0tPm1heF9jbnQtMSkpCisJCSAgICBicmVhazsJCisJICAgIH0KKwl9CisJaWYgKHBhcmFtLT5hcmdfaWQgPT0gRFlOX0NIT0lDRV9CVUREWV9JRCkgeworCSAgICAvKiBBZGQgVVJMIGlucHV0IG9wdGlvbiAqLworCSAgICBwal9hbnNpX3NucHJpbnRmKGRhdGFfb3V0LCBzaXplb2YoZGF0YV9vdXQpLCAiVVJMIik7CisJICAgIHBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW2ldLnZhbHVlLCBkYXRhX291dCk7CisJICAgIHBqX2Fuc2lfc25wcmludGYoZGF0YV9vdXQsIHNpemVvZihkYXRhX291dCksICJBbiBVUkwiKTsKKwkgICAgcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbaV0uZGVzYywgZGF0YV9vdXQpOworCSAgICArK3BhcmFtLT5jbnQ7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0X2FjY291bnRfaWQocGpfY2xpX2R5bl9jaG9pY2VfcGFyYW0gKnBhcmFtKQoreworICAgIGlmIChwYXJhbS0+Y250IDwgcGFyYW0tPm1heF9jbnQpIHsJCisJY2hhciBidWZbOF07CisJY2hhciBidWZfb3V0WzgwXTsKKwlwanN1YV9hY2NfaW5mbyBpbmZvOworCisJcGpzdWFfYWNjX2lkIGFjY19pZHNbMTZdOworCXVuc2lnbmVkIGNvdW50ID0gUEpfQVJSQVlfU0laRShhY2NfaWRzKTsKKwlpbnQgaTsgICAgCisKKwlwanN1YV9lbnVtX2FjY3MoYWNjX2lkcywgJmNvdW50KTsKKyAgICAgICAgCisJZm9yIChpPTA7IGk8KGludCljb3VudDsgKytpKSB7CQorCSAgICBwal9iemVybygmYnVmX291dFswXSwgUEpfQVJSQVlfU0laRShidWZfb3V0KSk7CisKKwkgICAgcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZHNbaV0sICZpbmZvKTsKKworCSAgICBwal9hbnNpX3NucHJpbnRmKGJ1Zl9vdXQsIAorCQkJICAgICBzaXplb2YoYnVmX291dCksCisJCQkgICAgICIlYyUuKnMiLCAKKwkJCSAgICAgKGFjY19pZHNbaV09PWN1cnJlbnRfYWNjPycqJzonICcpLAorCQkJICAgICAoaW50KWluZm8uYWNjX3VyaS5zbGVuLCAKKwkJCSAgICAgaW5mby5hY2NfdXJpLnB0cik7CisKKwkgICAgcGpfYnplcm8oYnVmLCBzaXplb2YoYnVmKSk7CisJICAgIHBqX2Fuc2lfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgYWNjX2lkc1tpXSk7CisJICAgIHBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW2ldLnZhbHVlLCBidWYpOworCSAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCBidWZfb3V0KTsKKwkgICAgaWYgKCsrcGFyYW0tPmNudCA+PSBwYXJhbS0+bWF4X2NudCkKKwkJYnJlYWs7CQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9tZWRpYV9wb3J0KHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICB1bnNpZ25lZCBpLCBjb3VudDsKKyAgICBwanN1YV9jb25mX3BvcnRfaWQgaWRbUEpTVUFfTUFYX0NPTkZfUE9SVFNdOworCisgICAgY291bnQgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICBwanN1YV9lbnVtX2NvbmZfcG9ydHMoaWQsICZjb3VudCk7CisKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJY2hhciBzbG90X2lkWzhdOworCWNoYXIgZGVzY1syNTZdOworCWNoYXIgdHhsaXN0WzI1Nl07CisJdW5zaWduZWQgajsKKwlwanN1YV9jb25mX3BvcnRfaW5mbyBpbmZvOworCisJcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvKGlkW2ldLCAmaW5mbyk7CisKKwlwal9hbnNpX3NucHJpbnRmKHNsb3RfaWQsIHNpemVvZihzbG90X2lkKSwgCisJCQkgIiVkIiwgaW5mby5zbG90X2lkKTsKKwlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS52YWx1ZSwgc2xvdF9pZCk7CisKKwl0eGxpc3RbMF0gPSAnXDAnOworCWZvciAoaj0wOyBqPGluZm8ubGlzdGVuZXJfY250OyArK2opIHsKKwkgICAgY2hhciBzWzEwXTsKKwkgICAgcGpfYW5zaV9zbnByaW50ZihzLCBzaXplb2YocyksICIjJWQgIiwgaW5mby5saXN0ZW5lcnNbal0pOworCSAgICBwal9hbnNpX3N0cmNhdCh0eGxpc3QsIHMpOworCX0JCisKKwlwal9hbnNpX3NucHJpbnRmKGRlc2MsICAKKwkgICAgICAgc2l6ZW9mKGRlc2MpLAorCSAgICAgICAiWyUyZEtIei8lZG1zLyVkXSAlMjAuKnMgIHRyYW5zbWl0dGluZyB0bzogJXMiLCAJICAgICAgIAorCSAgICAgICBpbmZvLmNsb2NrX3JhdGUvMTAwMCwKKwkgICAgICAgaW5mby5zYW1wbGVzX3Blcl9mcmFtZSoxMDAwL2luZm8uY2hhbm5lbF9jb3VudC9pbmZvLmNsb2NrX3JhdGUsCisJICAgICAgIGluZm8uY2hhbm5lbF9jb3VudCwKKwkgICAgICAgKGludClpbmZvLm5hbWUuc2xlbiwgCisJICAgICAgIGluZm8ubmFtZS5wdHIsCisJICAgICAgIHR4bGlzdCk7CisKKwlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCBkZXNjKTsJCisJaWYgKCsrcGFyYW0tPmNudCA+PSBwYXJhbS0+bWF4X2NudCkKKwkgICAgYnJlYWs7CQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0X2F1ZGlvX2NvZGVjX2lkKHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBpZiAocGFyYW0tPmNudCA8IHBhcmFtLT5tYXhfY250KSB7CQorCXBqc3VhX2NvZGVjX2luZm8gY1szMl07CisJdW5zaWduZWQgaSwgY291bnQgPSBQSl9BUlJBWV9TSVpFKGMpOworCWNoYXIgY29kZWNfaWRbNjRdOworCWNoYXIgZGVzY1sxMjhdOworICAgICAgICAKKwlwanN1YV9lbnVtX2NvZGVjcyhjLCAmY291bnQpOworCWZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsJCisJICAgIHBqX2Fuc2lfc25wcmludGYoY29kZWNfaWQsIHNpemVvZihjb2RlY19pZCksIAorCQkJICAgICAiJS4qcyIsIChpbnQpY1tpXS5jb2RlY19pZC5zbGVuLCAKKwkJCSAgICAgY1tpXS5jb2RlY19pZC5wdHIpOworCisJICAgIHBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW3BhcmFtLT5jbnRdLnZhbHVlLCBjb2RlY19pZCk7CisKKwkgICAgcGpfYW5zaV9zbnByaW50ZihkZXNjLCBzaXplb2YoZGVzYyksIAorCQkJICAgICAiQXVkaW8sIHByaW86ICVkJXMlLipzIiwgCisJCQkgICAgIGNbaV0ucHJpb3JpdHksIAorCQkJICAgICBjW2ldLmRlc2Muc2xlbj8gIiAtICI6IiIsCisJCQkgICAgIChpbnQpY1tpXS5kZXNjLnNsZW4sCisJCQkgICAgIGNbaV0uZGVzYy5wdHIpOworCisJICAgIHBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW3BhcmFtLT5jbnRdLmRlc2MsIGRlc2MpOworCSAgICBpZiAoKytwYXJhbS0+Y250ID49IHBhcmFtLT5tYXhfY250KQorCQlicmVhazsJCisJfQorICAgIH0KK30KKworI2lmIFBKU1VBX0hBU19WSURFTyAgCitzdGF0aWMgdm9pZCBnZXRfdmlkZW9fc3RyZWFtX2lkKHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBpZiAocGFyYW0tPmNudCA8IHBhcmFtLT5tYXhfY250KSB7CQorCXBqc3VhX2NhbGxfaW5mbyBjYWxsX2luZm87CisKKwlpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwkgICAgdW5zaWduZWQgaTsKKwkgICAgcGpzdWFfY2FsbF9nZXRfaW5mbyhjdXJyZW50X2NhbGwsICZjYWxsX2luZm8pOworCSAgICBmb3IgKGk9MDsgaTxjYWxsX2luZm8ubWVkaWFfY250OyArK2kpIHsKKwkJaWYgKGNhbGxfaW5mby5tZWRpYVtpXS50eXBlID09IFBKTUVESUFfVFlQRV9WSURFTykgeworCQkgICAgY2hhciBtZWRfaWR4WzhdOworCQkgICAgcGpfYW5zaV9zbnByaW50ZihtZWRfaWR4LCBzaXplb2YobWVkX2lkeCksICIlZCIsIAorCQkJCSAgICAgY2FsbF9pbmZvLm1lZGlhW2ldLmluZGV4KTsKKwkJICAgIHBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW2ldLnZhbHVlLCBtZWRfaWR4KTsKKworCQkgICAgc3dpdGNoIChjYWxsX2luZm8ubWVkaWFbaV0uc3RhdHVzKSB7CQkgICAgCisJCSAgICBjYXNlIFBKU1VBX0NBTExfTUVESUFfTk9ORToKKwkJCXBqX3N0cmR1cDIocGFyYW0tPnBvb2wsICZwYXJhbS0+Y2hvaWNlW2ldLmRlc2MsIAorCQkJCSAgICJTdGF0dXM6Tm9uZSIpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIFBKU1VBX0NBTExfTUVESUFfQUNUSVZFOgorCQkJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbaV0uZGVzYywgCisJCQkJICAgIlN0YXR1czpBY3RpdmUiKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBQSlNVQV9DQUxMX01FRElBX0xPQ0FMX0hPTEQ6CisJCQlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCAKKwkJCQkgICAiU3RhdHVzOkxvY2FsIEhvbGQiKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBQSlNVQV9DQUxMX01FRElBX1JFTU9URV9IT0xEOgorCQkJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbaV0uZGVzYywgCisJCQkJICAgIlN0YXR1czpSZW1vdGUgSG9sZCIpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIFBKU1VBX0NBTExfTUVESUFfRVJST1I6CisJCQlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCAKKwkJCQkgICAiU3RhdHVzOk1lZGlhIEVycm9yIik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGlmICgrK3BhcmFtLT5jbnQgPj0gcGFyYW0tPm1heF9jbnQpCisJCQlicmVhazsJCisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisgIAorc3RhdGljIHZvaWQgZ2V0X3ZpZGVvX2Rldl9oaW50KHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSwgCisJCQkgICAgICAgcGptZWRpYV92aWRfZGV2X2luZm8gKnZkaSwKKwkJCSAgICAgICB1bnNpZ25lZCB2aWRfZGV2X2lkKSAKK3sKKyAgICBjaGFyIGRlc2NbMTI4XTsKKyAgICBjaGFyIGRldl9pZFs4XTsKKyAgICBwal9hbnNpX3NucHJpbnRmKGRldl9pZCwgc2l6ZW9mKGRldl9pZCksCisJIiVkIiwgdmlkX2Rldl9pZCk7CisgICAgcGpfYW5zaV9zbnByaW50ZihkZXNjLCBzaXplb2YoZGVzYyksICIlcyBbJXNdIiwgCisJdmRpLT5uYW1lLCB2ZGktPmRyaXZlcik7CisKKyAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtwYXJhbS0+Y250XS52YWx1ZSwgCisJICAgICAgIGRldl9pZCk7CisgICAgcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbcGFyYW0tPmNudF0uZGVzYywgCisJICAgICAgIGRlc2MpOyAgICAKK30KKworc3RhdGljIHZvaWQgZ2V0X3ZpZGVvX2Rldl9pZChwal9jbGlfZHluX2Nob2ljZV9wYXJhbSAqcGFyYW0sIAorCQkJICAgICBwal9ib29sX3QgYWxsLAorCQkJICAgICBwal9ib29sX3QgY2FwdHVyZSkKK3sKKyAgICBpZiAocGFyYW0tPmNudCA8IHBhcmFtLT5tYXhfY250KSB7CQorCXVuc2lnbmVkIGksIGNvdW50OworCXBqbWVkaWFfdmlkX2Rldl9pbmZvIHZkaTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwljb3VudCA9IHBqc3VhX3ZpZF9kZXZfY291bnQoKTsKKwlpZiAoY291bnQgPT0gMCkgewkKKwkgICAgcmV0dXJuOworCX0gCisKKwlmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJICAgIHN0YXR1cyA9IHBqc3VhX3ZpZF9kZXZfZ2V0X2luZm8oaSwgJnZkaSk7CisJICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCQlpZiAoKGFsbCkgfHwKKwkJICAgICgoY2FwdHVyZSkgJiYgKHZkaS5kaXIgPT0gUEpNRURJQV9ESVJfQ0FQVFVSRSkpIHx8CisJCSAgICAoKCFjYXB0dXJlKSAmJiAodmRpLmRpciA9PSBQSk1FRElBX0RJUl9SRU5ERVIpKSkKKwkJewkJCisJCSAgICBnZXRfdmlkZW9fZGV2X2hpbnQocGFyYW0sICZ2ZGksIGkpOworCQkgICAgaWYgKCsrcGFyYW0tPmNudCA+PSBwYXJhbS0+bWF4X2NudCkKKwkJCWJyZWFrOwkKKwkJfSAKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdldF92aWRlb19jb2RlY19pZChwal9jbGlfZHluX2Nob2ljZV9wYXJhbSAqcGFyYW0pCit7ICAgIAorICAgIGlmIChwYXJhbS0+Y250IDwgcGFyYW0tPm1heF9jbnQpIHsJCisJcGpzdWFfY29kZWNfaW5mbyBjaVszMl07CisJdW5zaWduZWQgaSwgY291bnQgPSBQSl9BUlJBWV9TSVpFKGNpKTsKKwljaGFyIGNvZGVjX2lkWzY0XTsKKwljaGFyIGRlc2NbMTI4XTsKKworCXBqc3VhX3ZpZF9lbnVtX2NvZGVjcyhjaSwgJmNvdW50KTsKKwlmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOworCSAgICBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9kZXRhaWwgKnZmZDsKKwkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworCSAgICBzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfZ2V0X3BhcmFtKCZjaVtpXS5jb2RlY19pZCwgJmNwKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQljb250aW51ZTsKKworCSAgICB2ZmQgPSBwam1lZGlhX2Zvcm1hdF9nZXRfdmlkZW9fZm9ybWF0X2RldGFpbCgmY3AuZW5jX2ZtdCwgUEpfVFJVRSk7CisKKwkgICAgcGpfYW5zaV9zbnByaW50Zihjb2RlY19pZCwgc2l6ZW9mKGNvZGVjX2lkKSwgCisJCQkgICAgICIlLipzIiwgKGludCljaVtpXS5jb2RlY19pZC5zbGVuLCAKKwkJCSAgICAgY2lbaV0uY29kZWNfaWQucHRyKTsKKworCSAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtwYXJhbS0+Y250XS52YWx1ZSwgY29kZWNfaWQpOworCisJICAgIHBqX2Fuc2lfc25wcmludGYoZGVzYywgc2l6ZW9mKGRlc2MpLCAKKwkgICAgCQkgICAgICJWaWRlbywgcFslZF0sIGZbJS4yZl0sIGJbJWQvJWRdLCBzWyVkeCVkXSIsIAorCSAgICAJCSAgICAgY2lbaV0ucHJpb3JpdHksIAorCQkJICAgICAodmZkLT5mcHMubnVtKjEuMC92ZmQtPmZwcy5kZW51bSksCisJCQkgICAgIHZmZC0+YXZnX2Jwcy8xMDAwLCB2ZmQtPm1heF9icHMvMTAwMCwKKwkJCSAgICAgdmZkLT5zaXplLncsIHZmZC0+c2l6ZS5oKTsKKworCSAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtwYXJhbS0+Y250XS5kZXNjLCBkZXNjKTsJCisJICAgIGlmICgrK3BhcmFtLT5jbnQgPj0gcGFyYW0tPm1heF9jbnQpCisJCWJyZWFrOwkKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRfdmlkZW9fd2luZG93X2lkKHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBpZiAocGFyYW0tPmNudCA8IHBhcmFtLT5tYXhfY250KSB7CQorCXBqc3VhX3ZpZF93aW5faWQgd2lkc1tQSlNVQV9NQVhfVklEX1dJTlNdOworCXVuc2lnbmVkIGksIGNudCA9IFBKX0FSUkFZX1NJWkUod2lkcyk7CisJY2hhciB3aW5faWRbNjRdOworCWNoYXIgZGVzY1sxMjhdOworCisJcGpzdWFfdmlkX2VudW1fd2lucyh3aWRzLCAmY250KTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7ICsraSkgeworCSAgICBwanN1YV92aWRfd2luX2luZm8gd2k7CisKKwkgICAgcGpzdWFfdmlkX3dpbl9nZXRfaW5mbyh3aWRzW2ldLCAmd2kpOworCSAgICBwal9hbnNpX3NucHJpbnRmKHdpbl9pZCwgc2l6ZW9mKHdpbl9pZCksICIlZCIsIHdpZHNbaV0pOworCSAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS52YWx1ZSwgd2luX2lkKTsKKworCSAgICBwal9hbnNpX3NucHJpbnRmKGRlc2MsIHNpemVvZihkZXNjKSwgCisJCQkgICAgICJTaG93OiVjIFBvcyglZCwlZCkgIFNpemUoJWR4JWQpIiwgCisJCQkgICAgICh3aS5zaG93PydZJzonTicpLCB3aS5wb3MueCwgd2kucG9zLnksCisJCQkgICAgIHdpLnNpemUudywgd2kuc2l6ZS5oKTsKKworCSAgICBwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS5kZXNjLCBkZXNjKTsJCisJICAgIGlmICgrK3BhcmFtLT5jbnQgPj0gcGFyYW0tPm1heF9jbnQpCisJCWJyZWFrOwkKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRfY2FsbF9pZChwal9jbGlfZHluX2Nob2ljZV9wYXJhbSAqcGFyYW0pCit7CisgICAgaWYgKHBhcmFtLT5jbnQgPCBwYXJhbS0+bWF4X2NudCkgewkKKwljaGFyIGNhbGxfaWRbNjRdOworCWNoYXIgZGVzY1sxMjhdOworCXVuc2lnbmVkIGksIGNvdW50OworCXBqc3VhX2NhbGxfaWQgaWRzW1BKU1VBX01BWF9DQUxMU107CisJaW50IGNhbGwgPSBjdXJyZW50X2NhbGw7CisKKwljb3VudCA9IFBKX0FSUkFZX1NJWkUoaWRzKTsKKwlwanN1YV9lbnVtX2NhbGxzKGlkcywgJmNvdW50KTsKKworCWlmIChjb3VudCA+IDEpIHsKKwkgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCQlwanN1YV9jYWxsX2luZm8gY2FsbF9pbmZvOworCisJCWlmIChpZHNbaV0gPT0gY2FsbCkKKwkJICAgIHJldHVybjsKKworCQlwanN1YV9jYWxsX2dldF9pbmZvKGlkc1tpXSwgJmNhbGxfaW5mbyk7CisJCXBqX2Fuc2lfc25wcmludGYoY2FsbF9pZCwgc2l6ZW9mKGNhbGxfaWQpLCAiJWQiLCBpZHNbaV0pOworCQlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVtpXS52YWx1ZSwgY2FsbF9pZCk7CisJCXBqX2Fuc2lfc25wcmludGYoZGVzYywgc2l6ZW9mKGRlc2MpLCAiJS4qcyBbJS4qc10iLCAKKwkJICAgIChpbnQpY2FsbF9pbmZvLnJlbW90ZV9pbmZvLnNsZW4sCisJCSAgICBjYWxsX2luZm8ucmVtb3RlX2luZm8ucHRyLAorCQkgICAgKGludCljYWxsX2luZm8uc3RhdGVfdGV4dC5zbGVuLAorCQkgICAgY2FsbF9pbmZvLnN0YXRlX3RleHQucHRyKTsKKwkJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbaV0uZGVzYywgZGVzYyk7CisJCWlmICgrK3BhcmFtLT5jbnQgPj0gcGFyYW0tPm1heF9jbnQpCisJCSAgICBicmVhazsJCisKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfY2hvaWNlX3ZhbHVlKHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtLT5hcmdfaWQpIHsKKyAgICBjYXNlIERZTl9DSE9JQ0VfQlVERFlfSUQ6CisgICAgY2FzZSBEWU5fQ0hPSUNFX0FEREVEX0JVRERZX0lEOgorCWdldF9idWRkeV9pZChwYXJhbSk7CisJYnJlYWs7CisgICAgY2FzZSBEWU5fQ0hPSUNFX0FDQ09VTlRfSUQ6CisJZ2V0X2FjY291bnRfaWQocGFyYW0pOworCWJyZWFrOworICAgIGNhc2UgRFlOX0NIT0lDRV9NRURJQV9QT1JUOgorCWdldF9tZWRpYV9wb3J0KHBhcmFtKTsKKwlicmVhazsKKyAgICBjYXNlIERZTl9DSE9JQ0VfQVVESU9fQ09ERUNfSUQ6CisJZ2V0X2F1ZGlvX2NvZGVjX2lkKHBhcmFtKTsKKwlicmVhazsKKyNpZiBQSlNVQV9IQVNfVklERU8gICAgCisgICAgY2FzZSBEWU5fQ0hPSUNFX0NBUF9ERVZfSUQ6CQorICAgIGNhc2UgRFlOX0NIT0lDRV9SRU5fREVWX0lEOgorICAgIGNhc2UgRFlOX0NIT0lDRV9WSURfREVWX0lEOgorCWdldF92aWRlb19kZXZfaWQocGFyYW0sIAorCQkJIChwYXJhbS0+YXJnX2lkPT1EWU5fQ0hPSUNFX1ZJRF9ERVZfSUQpLAorCQkJIChwYXJhbS0+YXJnX2lkPT1EWU5fQ0hPSUNFX0NBUF9ERVZfSUQpKTsKKwlicmVhazsKKyAgICBjYXNlIERZTl9DSE9JQ0VfU1RSRUFNX0lEOgorCWdldF92aWRlb19zdHJlYW1faWQocGFyYW0pOworCWJyZWFrOworICAgIGNhc2UgRFlOX0NIT0lDRV9WSURFT19DT0RFQ19JRDoKKwlnZXRfdmlkZW9fY29kZWNfaWQocGFyYW0pOworCWJyZWFrOworICAgIGNhc2UgRFlOX0NIT0lDRV9XSU5fSUQ6CisJZ2V0X3ZpZGVvX3dpbmRvd19pZChwYXJhbSk7CisJYnJlYWs7CisgICAgY2FzZSBEWU5fQ0hPSUNFX0NBTExfSUQ6CisJZ2V0X2NhbGxfaWQocGFyYW0pOworCWJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKwlwYXJhbS0+Y250ID0gMDsKKwlicmVhazsKKyAgICB9Cit9CisKKy8qIAorICogQ0xJIGNvbW1hbmQgaGFuZGxlcgorICovCisKKy8qIEFkZCBhY2NvdW50ICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2FkZF9hY2NvdW50KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwanN1YV9hY2NfY29uZmlnX2RlZmF1bHQoJmFjY19jZmcpOworICAgIGFjY19jZmcuaWQgPSBjdmFsLT5hcmd2WzFdOworICAgIGFjY19jZmcucmVnX3VyaSA9IGN2YWwtPmFyZ3ZbMl07CisgICAgYWNjX2NmZy5jcmVkX2NvdW50ID0gMTsKKyAgICBhY2NfY2ZnLmNyZWRfaW5mb1swXS5zY2hlbWUgPSBwal9zdHIoIkRpZ2VzdCIpOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnJlYWxtID0gY3ZhbC0+YXJndlszXTsKKyAgICBhY2NfY2ZnLmNyZWRfaW5mb1swXS51c2VybmFtZSA9IGN2YWwtPmFyZ3ZbNF07CisgICAgYWNjX2NmZy5jcmVkX2luZm9bMF0uZGF0YV90eXBlID0gMDsKKyAgICBhY2NfY2ZnLmNyZWRfaW5mb1swXS5kYXRhID0gY3ZhbC0+YXJndls1XTsKKworICAgIGFjY19jZmcucnRwX2NmZyA9IGFwcF9jb25maWcucnRwX2NmZzsKKyAgICBhcHBfY29uZmlnX2luaXRfdmlkZW8oJmFjY19jZmcpOworCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX2FkZCgmYWNjX2NmZywgUEpfVFJVRSwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzdWFfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkZGluZyBuZXcgYWNjb3VudCIsIHN0YXR1cyk7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIERlbGV0ZSBhY2NvdW50ICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2RlbF9hY2NvdW50KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIGNoYXIgb3V0X3N0cls2NF07CisgICAgdW5zaWduZWQgc3RyX2xlbjsKKworICAgIGludCBpID0gbXlfYXRvaShjdmFsLT5hcmd2WzFdLnB0cik7CisKKyAgICBpZiAoIXBqc3VhX2FjY19pc192YWxpZChpKSkgeworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJICAgICAgICAiSW52YWxpZCBhY2NvdW50IGlkICVkXG4iLCBpKTsKKwlzdHJfbGVuID0gKHVuc2lnbmVkKXBqX2Fuc2lfc3RybGVuKG91dF9zdHIpOworCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBvdXRfc3RyLCBzdHJfbGVuKTsKKyAgICB9IGVsc2UgeworCXBqc3VhX2FjY19kZWwoaSk7CisJcGpfYW5zaV9zbnByaW50ZihvdXRfc3RyLCBzaXplb2Yob3V0X3N0ciksCisJCQkgIkFjY291bnQgJWQgZGVsZXRlZFxuIiwgaSk7CisJc3RyX2xlbiA9ICh1bnNpZ25lZClwal9hbnNpX3N0cmxlbihvdXRfc3RyKTsKKwlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2Vzcywgb3V0X3N0ciwgc3RyX2xlbik7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBNb2RpZnkgYWNjb3VudCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9tb2RfYWNjb3VudChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGN2YWwpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBSZWdpc3RlciBhY2NvdW50ICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3JlZ19hY2NvdW50KCkKK3sgICAgCisgICAgcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb24oY3VycmVudF9hY2MsIFBKX1RSVUUpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBVbnJlZ2lzdGVyIGFjY291bnQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdW5yZWdfYWNjb3VudCgpCit7ICAgIAorICAgIHBqc3VhX2FjY19zZXRfcmVnaXN0cmF0aW9uKGN1cnJlbnRfYWNjLCBQSl9GQUxTRSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFNlbGVjdCBhY2NvdW50IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgb3V0Z29pbmcgcmVxdWVzdCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9uZXh0X2FjY291bnQocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgaW50IGkgPSBteV9hdG9pKGN2YWwtPmFyZ3ZbMV0ucHRyKTsKKyAgICBpZiAocGpzdWFfYWNjX2lzX3ZhbGlkKGkpKSB7CisJcGpzdWFfYWNjX3NldF9kZWZhdWx0KGkpOworCVBKX0xPRygzLChUSElTX0ZJTEUsICJDdXJyZW50IGFjY291bnQgY2hhbmdlZCB0byAlZCIsIGkpKTsKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJJbnZhbGlkIGFjY291bnQgaWQgJWQiLCBpKSk7CisgICAgfSAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU2hvdyBhY2NvdW50IGxpc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2hvd19hY2NvdW50KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHBqc3VhX2FjY19pZCBhY2NfaWRzWzE2XTsKKyAgICB1bnNpZ25lZCBjb3VudCA9IFBKX0FSUkFZX1NJWkUoYWNjX2lkcyk7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGhlYWRlciA9IHsiQWNjb3VudCBsaXN0OlxuIiwgMTV9OyAgICAKKworICAgIHBqc3VhX2VudW1fYWNjcyhhY2NfaWRzLCAmY291bnQpOworCisgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGhlYWRlci5wdHIsIGhlYWRlci5zbGVuKTsKKyAgICBmb3IgKGk9MDsgaTwoaW50KWNvdW50OyArK2kpIHsKKwljaGFyIGFjY19pbmZvWzgwXTsKKwljaGFyIG91dF9zdHJbMTYwXTsKKwlwanN1YV9hY2NfaW5mbyBpbmZvOworCisJcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZHNbaV0sICZpbmZvKTsKKworCWlmICghaW5mby5oYXNfcmVnaXN0cmF0aW9uKSB7CisJICAgIHBqX2Fuc2lfc25wcmludGYoYWNjX2luZm8sIHNpemVvZihhY2NfaW5mbyksICIlLipzIiwgCisJCQkgICAgIChpbnQpaW5mby5zdGF0dXNfdGV4dC5zbGVuLAorCQkJICAgICBpbmZvLnN0YXR1c190ZXh0LnB0cik7CisKKwl9IGVsc2UgeworCSAgICBwal9hbnNpX3NucHJpbnRmKGFjY19pbmZvLCBzaXplb2YoYWNjX2luZm8pLAorCQkJICAgICAiJWQvJS4qcyAoZXhwaXJlcz0lZCkiLAorCQkJICAgICBpbmZvLnN0YXR1cywKKwkJCSAgICAgKGludClpbmZvLnN0YXR1c190ZXh0LnNsZW4sCisJCQkgICAgIGluZm8uc3RhdHVzX3RleHQucHRyLAorCQkJICAgICBpbmZvLmV4cGlyZXMpOworCisJfQorCisJcGpfYW5zaV9zbnByaW50ZihvdXRfc3RyLCBzaXplb2Yob3V0X3N0ciksIAorCQkJICIgJWNbJTJkXSAlLipzOiAlc1xuIiwgCisJCQkgKGFjY19pZHNbaV09PWN1cnJlbnRfYWNjPycqJzonICcpLCBhY2NfaWRzW2ldLCAgCisJCQkgKGludClpbmZvLmFjY191cmkuc2xlbiwgaW5mby5hY2NfdXJpLnB0ciwgCisJCQkgYWNjX2luZm8pOworCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBvdXRfc3RyLCBwal9hbnNpX3N0cmxlbihvdXRfc3RyKSk7CisKKwlwal9iemVybyhvdXRfc3RyLCBzaXplb2Yob3V0X3N0cikpOworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLAorCQkJICIgICAgICAgT25saW5lIHN0YXR1czogJS4qc1xuIiwgCisJCQkgKGludClpbmZvLm9ubGluZV9zdGF0dXNfdGV4dC5zbGVuLAorCQkJIGluZm8ub25saW5lX3N0YXR1c190ZXh0LnB0cik7CisKKwlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2Vzcywgb3V0X3N0ciwgcGpfYW5zaV9zdHJsZW4ob3V0X3N0cikpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBBY2NvdW50IGNvbW1hbmQgaGFuZGxlciAqLworcGpfc3RhdHVzX3QgY21kX2FjY291bnRfaGFuZGxlcihwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIENIRUNLX1BKU1VBX1JVTk5JTkcoKTsKKworICAgIHN3aXRjaChwal9jbGlfZ2V0X2NtZF9pZChjdmFsLT5jbWQpKSB7CisgICAgY2FzZSBDTURfQUNDT1VOVF9BREQ6CisJc3RhdHVzID0gY21kX2FkZF9hY2NvdW50KGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0FDQ09VTlRfREVMOgorCXN0YXR1cyA9IGNtZF9kZWxfYWNjb3VudChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9BQ0NPVU5UX01PRDoKKwlzdGF0dXMgPSBjbWRfbW9kX2FjY291bnQoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQUNDT1VOVF9SRUc6CisJc3RhdHVzID0gY21kX3JlZ19hY2NvdW50KCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQUNDT1VOVF9VTlJFRzoKKwlzdGF0dXMgPSBjbWRfdW5yZWdfYWNjb3VudCgpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0FDQ09VTlRfTkVYVDoJCisgICAgY2FzZSBDTURfQUNDT1VOVF9QUkVWOgorCXN0YXR1cyA9IGNtZF9uZXh0X2FjY291bnQoY3ZhbCk7CQorCWJyZWFrOworICAgIGNhc2UgQ01EX0FDQ09VTlRfU0hPVzoKKwlzdGF0dXMgPSBjbWRfc2hvd19hY2NvdW50KGN2YWwpOworCWJyZWFrOworICAgIH0gICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogQWRkIGJ1ZGR5ICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2FkZF9idWRkeShwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgY2hhciBvdXRfc3RyWzgwXTsKKyAgICBwanN1YV9idWRkeV9jb25maWcgYnVkZHlfY2ZnOworICAgIHBqc3VhX2J1ZGR5X2lkIGJ1ZGR5X2lkOworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgY3ZhbC0+YXJndlsxXS5wdHJbY3ZhbC0+YXJndlsxXS5zbGVuXSA9IDA7CisKKyAgICBpZiAocGpzdWFfdmVyaWZ5X3VybChjdmFsLT5hcmd2WzFdLnB0cikgIT0gUEpfU1VDQ0VTUykgeworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJCSAiSW52YWxpZCBVUkkgJyVzJ1xuIiwgY3ZhbC0+YXJndlsxXS5wdHIpOworICAgIH0gZWxzZSB7CisJcGpfYnplcm8oJmJ1ZGR5X2NmZywgc2l6ZW9mKHBqc3VhX2J1ZGR5X2NvbmZpZykpOworCisJYnVkZHlfY2ZnLnVyaSA9IHBqX3N0cihjdmFsLT5hcmd2WzFdLnB0cik7CisJYnVkZHlfY2ZnLnN1YnNjcmliZSA9IFBKX1RSVUU7CisKKwlzdGF0dXMgPSBwanN1YV9idWRkeV9hZGQoJmJ1ZGR5X2NmZywgJmJ1ZGR5X2lkKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpfYW5zaV9zbnByaW50ZihvdXRfc3RyLCBzaXplb2Yob3V0X3N0ciksIAorCQkJICAgICAgIk5ldyBidWRkeSAnJXMnIGFkZGVkIGF0IGluZGV4ICVkXG4iLAorCQkJICAgICAgY3ZhbC0+YXJndlsxXS5wdHIsIGJ1ZGR5X2lkKzEpOworCX0gICAKKyAgICB9CisgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIG91dF9zdHIsIHBqX2Fuc2lfc3RybGVuKG91dF9zdHIpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBEZWxldGUgYnVkZHkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfZGVsX2J1ZGR5KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAKKyAgICBpbnQgaSA9IG15X2F0b2koY3ZhbC0+YXJndlsxXS5wdHIpIC0gMTsKKyAgICBjaGFyIG91dF9zdHJbODBdOworCisgICAgaWYgKCFwanN1YV9idWRkeV9pc192YWxpZChpKSkgeworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJCSAiSW52YWxpZCBidWRkeSBpZCAlZFxuIiwgaSk7CQorICAgIH0gZWxzZSB7CisJcGpzdWFfYnVkZHlfZGVsKGkpOworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJCSAiQnVkZHkgJWQgZGVsZXRlZFxuIiwgaSk7CQkKKyAgICB9CisgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIG91dF9zdHIsIHBqX2Fuc2lfc3RybGVuKG91dF9zdHIpKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU2VuZCBJTSAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9zZW5kX2ltKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAKKyAgICBpbnQgaSA9IC0xOyAgICAKKyAgICBzdHJ1Y3QgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKyAgICBjaGFyIGRlc3RbNjRdOworICAgIHBqX3N0cl90IHRtcCA9IHBqX3N0cihkZXN0KTsgICAgCisKKyAgICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5LiAqLworICAgIGNoYXIgKnVyaSA9IE5VTEw7CisKKyAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmY3ZhbC0+YXJndlsxXSwgc2l6ZW9mKGRlc3QpKTsKKyAgICAKKyAgICAvKiBpbnB1dCBkZXN0aW5hdGlvbi4gKi8KKyAgICBnZXRfaW5wdXRfdXJsKHRtcC5wdHIsIHRtcC5zbGVuLCBjdmFsLCAmcmVzdWx0KTsKKyAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCAhPSBQSlNVQV9BUFBfTk9fTkIpIHsKKworCWlmIChyZXN1bHQubmJfcmVzdWx0ID09IC0xKSB7CSAgICAKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7InlvdSBjYW4ndCBzZW5kIGJyb2FkY2FzdCBpbSAiCisJCQkJCSAgICAgImxpa2UgdGhhdCFcbiIsIDQwIH07CSAgICAKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9IGVsc2UgaWYgKHJlc3VsdC5uYl9yZXN1bHQgPT0gMCkgeworCSAgICBpID0gY3VycmVudF9jYWxsOworCX0gZWxzZSB7CisJICAgIHBqc3VhX2J1ZGR5X2luZm8gYmluZm87CisJICAgIHBqc3VhX2J1ZGR5X2dldF9pbmZvKHJlc3VsdC5uYl9yZXN1bHQtMSwgJmJpbmZvKTsJICAgIAorCSAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmYmluZm8udXJpLCBzaXplb2YoZGVzdCkpOworCSAgICB1cmkgPSB0bXAucHRyOworCX0KKworICAgIH0gZWxzZSBpZiAocmVzdWx0LnVyaV9yZXN1bHQpIHsKKwl1cmkgPSByZXN1bHQudXJpX3Jlc3VsdDsKKyAgICB9CisKKyAgICAvKiBzZW5kIHR5cGluZyBpbmRpY2F0aW9uLiAqLworICAgIGlmIChpICE9IC0xKQorCXBqc3VhX2NhbGxfc2VuZF90eXBpbmdfaW5kKGksIFBKX1RSVUUsIE5VTEwpOworICAgIGVsc2UgeworCXBqX3N0cl90IHRtcF91cmkgPSBwal9zdHIodXJpKTsKKwlwanN1YV9pbV90eXBpbmcoY3VycmVudF9hY2MsICZ0bXBfdXJpLCBQSl9UUlVFLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoZSBpbSAqLworICAgIGlmIChpICE9IC0xKQorCXBqc3VhX2NhbGxfc2VuZF9pbShpLCBOVUxMLCAmY3ZhbC0+YXJndlsyXSwgTlVMTCwgTlVMTCk7CisgICAgZWxzZSB7CisJcGpfc3RyX3QgdG1wX3VyaSA9IHBqX3N0cih1cmkpOworCXBqc3VhX2ltX3NlbmQoY3VycmVudF9hY2MsICZ0bXBfdXJpLCBOVUxMLCAmY3ZhbC0+YXJndlsyXSwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTdWJzY3JpYmUvdW5zdWJzY3JpYmUgcHJlc2VuY2UgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc3Vic19wcmVzKHBqX2NsaV9jbWRfdmFsICpjdmFsLCBwal9ib29sX3Qgc3Vic2NyaWJlKQoreyAgIAorICAgIHN0cnVjdCBpbnB1dF9yZXN1bHQgcmVzdWx0OyAgICAKKyAgICBjaGFyIGRlc3RbNjRdID0gezB9OworICAgIHBqX3N0cl90IHRtcCA9IHBqX3N0cihkZXN0KTsKKyAgICAKKyAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmY3ZhbC0+YXJndlsxXSwgc2l6ZW9mKGRlc3QpKTsKKyAgICBnZXRfaW5wdXRfdXJsKHRtcC5wdHIsIHRtcC5zbGVuLCBjdmFsLCAmcmVzdWx0KTsgICAgCisgICAgaWYgKHJlc3VsdC5uYl9yZXN1bHQgIT0gUEpTVUFfQVBQX05PX05CKSB7CisJaWYgKHJlc3VsdC5uYl9yZXN1bHQgPT0gLTEpIHsKKwkgICAgaW50IGksIGNvdW50OworCSAgICBjb3VudCA9IHBqc3VhX2dldF9idWRkeV9jb3VudCgpOworCSAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKQorCQlwanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlcyhpLCBzdWJzY3JpYmUpOworCX0gZWxzZSBpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAwKSB7CisJICAgIHN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJTb3JyeSwgY2FuIG9ubHkgc3Vic2NyaWJlIHRvICIKKwkJCQkJICAgICAiYnVkZHkncyBwcmVzZW5jZSwgbm90IGZyb20gIgorCQkJCQkgICAgICJleGlzdGluZyBjYWxsXG4iLCA3MX07CisJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfbXNnLnB0ciwgZXJyX21zZy5zbGVuKTsKKwl9IGVsc2UgeworCSAgICBwanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlcyhyZXN1bHQubmJfcmVzdWx0LTEsIHN1YnNjcmliZSk7CisJfQorCisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJTb3JyeSwgY2FuIG9ubHkgc3Vic2NyaWJlIHRvICIKKwkJCQkJICJidWRkeSdzIHByZXNlbmNlLCBub3QgYXJiaXRyYXJ5ICIKKwkJCQkJICJVUkwgKGZvciBub3cpXG4iLCA3Nn07CisJcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogVG9nZ2xlIG9ubGluZSBzdGF0ZSAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF90b2dnbGVfc3RhdGUocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7ICAgIAorICAgIGNoYXIgb3V0X3N0clsxMjhdOworICAgIHBqc3VhX2FjY19pbmZvIGFjY19pbmZvOworCisgICAgcGpzdWFfYWNjX2dldF9pbmZvKGN1cnJlbnRfYWNjLCAmYWNjX2luZm8pOworICAgIGFjY19pbmZvLm9ubGluZV9zdGF0dXMgPSAhYWNjX2luZm8ub25saW5lX3N0YXR1czsKKyAgICBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoY3VycmVudF9hY2MsIGFjY19pbmZvLm9ubGluZV9zdGF0dXMpOworICAgIHBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJICAgICAiU2V0dGluZyAlcyBvbmxpbmUgc3RhdHVzIHRvICVzXG4iLAorCQkgICAgIGFjY19pbmZvLmFjY191cmkucHRyLAorCQkgICAgKGFjY19pbmZvLm9ubGluZV9zdGF0dXM/Im9ubGluZSI6Im9mZmxpbmUiKSk7CisgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIG91dF9zdHIsIHBqX2Fuc2lfc3RybGVuKG91dF9zdHIpKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU2V0IHByZXNlbmNlIHRleHQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2V0X3ByZXNlbmNlX3RleHQocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7ICAgIAorICAgIHBqcnBpZF9lbGVtZW50IGVsZW07CisgICAgaW50IGNob2ljZTsKKyAgICBwal9ib29sX3Qgb25saW5lX3N0YXR1czsKKworICAgIGVudW0geworCUFWQUlMQUJMRSwgQlVTWSwgT1RQLCBJRExFLCBBV0FZLCBCUkIsIE9GRkxJTkUsIE9QVF9NQVgKKyAgICB9OworCisgICAgY2hvaWNlID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzFdKSAtIDE7CisKKyAgICBwal9iemVybygmZWxlbSwgc2l6ZW9mKGVsZW0pKTsKKyAgICBlbGVtLnR5cGUgPSBQSlJQSURfRUxFTUVOVF9UWVBFX1BFUlNPTjsKKworICAgIG9ubGluZV9zdGF0dXMgPSBQSl9UUlVFOworCisgICAgc3dpdGNoIChjaG9pY2UpIHsKKyAgICBjYXNlIEFWQUlMQUJMRToKKwlicmVhazsKKyAgICBjYXNlIEJVU1k6CisJZWxlbS5hY3Rpdml0eSA9IFBKUlBJRF9BQ1RJVklUWV9CVVNZOworCWVsZW0ubm90ZSA9IHBqX3N0cigiQnVzeSIpOworCWJyZWFrOworICAgIGNhc2UgT1RQOgorCWVsZW0uYWN0aXZpdHkgPSBQSlJQSURfQUNUSVZJVFlfQlVTWTsKKwllbGVtLm5vdGUgPSBwal9zdHIoIk9uIHRoZSBwaG9uZSIpOworCWJyZWFrOworICAgIGNhc2UgSURMRToKKwllbGVtLmFjdGl2aXR5ID0gUEpSUElEX0FDVElWSVRZX1VOS05PV047CisJZWxlbS5ub3RlID0gcGpfc3RyKCJJZGxlIik7CisJYnJlYWs7CisgICAgY2FzZSBBV0FZOgorCWVsZW0uYWN0aXZpdHkgPSBQSlJQSURfQUNUSVZJVFlfQVdBWTsKKwllbGVtLm5vdGUgPSBwal9zdHIoIkF3YXkiKTsKKwlicmVhazsKKyAgICBjYXNlIEJSQjoKKwllbGVtLmFjdGl2aXR5ID0gUEpSUElEX0FDVElWSVRZX1VOS05PV047CisJZWxlbS5ub3RlID0gcGpfc3RyKCJCZSByaWdodCBiYWNrIik7CisJYnJlYWs7CisgICAgY2FzZSBPRkZMSU5FOgorCW9ubGluZV9zdGF0dXMgPSBQSl9GQUxTRTsKKwlicmVhazsKKyAgICB9CisgICAgcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzMihjdXJyZW50X2FjYywgb25saW5lX3N0YXR1cywgJmVsZW0pOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTaG93IGJ1ZGR5IGxpc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2hvd19idWRkeShwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgICAgIAorICAgIHBqc3VhX2J1ZGR5X2lkIGlkc1s2NF07CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY291bnQgPSBQSl9BUlJBWV9TSVpFKGlkcyk7CisgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGhlYWRlciA9IHsiQnVkZHkgbGlzdDpcbiIsIDEzfTsgICAgCisgICAgY2hhciBvdXRfc3RyWzY0XTsKKworICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBoZWFkZXIucHRyLCBoZWFkZXIuc2xlbik7CisKKyAgICBwanN1YV9lbnVtX2J1ZGRpZXMoaWRzLCAmY291bnQpOworCisgICAgaWYgKGNvdW50ID09IDApIHsKKwlwal9hbnNpX3NucHJpbnRmKG91dF9zdHIsIHNpemVvZihvdXRfc3RyKSwgIiAtbm9uZS1cbiIpOworCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBvdXRfc3RyLCBwal9hbnNpX3N0cmxlbihvdXRfc3RyKSk7CisgICAgfSBlbHNlIHsKKwlmb3IgKGk9MDsgaTwoaW50KWNvdW50OyArK2kpIHsJICAgIAorCSAgICBwanN1YV9idWRkeV9pbmZvIGluZm87CisJICAgIHBqX2J6ZXJvKG91dF9zdHIsIHNpemVvZihvdXRfc3RyKSk7CisKKwkgICAgaWYgKHBqc3VhX2J1ZGR5X2dldF9pbmZvKGlkc1tpXSwgJmluZm8pICE9IFBKX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJICAgIHBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgc2l6ZW9mKG91dF9zdHIpLCAKKwkJICAgICIgWyUyZF0gPCUuKnM+ICAlLipzXG4iLCAKKwkJICAgIGlkc1tpXSsxLCAKKwkJICAgIChpbnQpaW5mby5zdGF0dXNfdGV4dC5zbGVuLAorCQkgICAgaW5mby5zdGF0dXNfdGV4dC5wdHIsIAorCQkgICAgKGludClpbmZvLnVyaS5zbGVuLAorCQkgICAgaW5mby51cmkucHRyKTsKKworCSAgICBwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2Vzcywgb3V0X3N0ciwgcGpfYW5zaV9zdHJsZW4ob3V0X3N0cikpOworCX0KKyAgICB9ICAgICAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUHJlc2VuY2UvYnVkZHkgY29tbWFuZCBoYW5kbGVyICovCitwal9zdGF0dXNfdCBjbWRfcHJlc2VuY2VfaGFuZGxlcihwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIENIRUNLX1BKU1VBX1JVTk5JTkcoKTsKKworICAgIHN3aXRjaChwal9jbGlfZ2V0X2NtZF9pZChjdmFsLT5jbWQpKSB7CisgICAgY2FzZSBDTURfUFJFU0VOQ0VfQUREX0JVRERZOgorCXN0YXR1cyA9IGNtZF9hZGRfYnVkZHkoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfUFJFU0VOQ0VfREVMX0JVRERZOgorCXN0YXR1cyA9IGNtZF9kZWxfYnVkZHkoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfUFJFU0VOQ0VfU0VORF9JTToKKwlzdGF0dXMgPSBjbWRfc2VuZF9pbShjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9QUkVTRU5DRV9TVUI6CQorICAgIGNhc2UgQ01EX1BSRVNFTkNFX1VOU1VCOgorCXN0YXR1cyA9IGNtZF9zdWJzX3ByZXMoY3ZhbCwgCisJCSAgICAgICAgICAgICAgIHBqX2NsaV9nZXRfY21kX2lkKGN2YWwtPmNtZCk9PUNNRF9QUkVTRU5DRV9TVUIpOwkKKwlicmVhazsKKyAgICBjYXNlIENNRF9QUkVTRU5DRV9UT0dfU1RBVEU6CisJc3RhdHVzID0gY21kX3RvZ2dsZV9zdGF0ZShjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9QUkVTRU5DRV9URVhUOgorCXN0YXR1cyA9IGNtZF9zZXRfcHJlc2VuY2VfdGV4dChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9QUkVTRU5DRV9MSVNUOgorCXN0YXR1cyA9IGNtZF9zaG93X2J1ZGR5KGN2YWwpOworCWJyZWFrOworICAgIH0gICAgCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBTaG93IGNvbmZlcmVuY2UgbGlzdCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9tZWRpYV9saXN0KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHVuc2lnbmVkIGksIGNvdW50OworICAgIHBqc3VhX2NvbmZfcG9ydF9pZCBpZFtQSlNVQV9NQVhfQ09ORl9QT1JUU107CisgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGhlYWRlciA9IHsiQ29uZmVyZW5jZSBwb3J0czpcbiIsIDE5fTsKKworICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBoZWFkZXIucHRyLCBoZWFkZXIuc2xlbik7ICAgIAorCisgICAgY291bnQgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICBwanN1YV9lbnVtX2NvbmZfcG9ydHMoaWQsICZjb3VudCk7CisKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJY2hhciBvdXRfc3RyWzEyOF07CisJY2hhciB0eGxpc3RbMTZdOworCXVuc2lnbmVkIGo7CisJcGpzdWFfY29uZl9wb3J0X2luZm8gaW5mbzsKKworCXBqc3VhX2NvbmZfZ2V0X3BvcnRfaW5mbyhpZFtpXSwgJmluZm8pOworCisJcGpfYnplcm8odHhsaXN0LCBzaXplb2YodHhsaXN0KSk7CisJZm9yIChqPTA7IGo8aW5mby5saXN0ZW5lcl9jbnQ7ICsraikgeworCSAgICBjaGFyIHNbMTBdOworCSAgICBwal9hbnNpX3NucHJpbnRmKHMsIHNpemVvZihzKSwgIiMlZCAiLCBpbmZvLmxpc3RlbmVyc1tqXSk7CisJICAgIHBqX2Fuc2lfc3RyY2F0KHR4bGlzdCwgcyk7CisJfQorCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgCisJICAgICAgIHNpemVvZihvdXRfc3RyKSwKKwkgICAgICAgIlBvcnQgIyUwMmRbJTJkS0h6LyVkbXMvJWRdICUyMC4qcyAgdHJhbnNtaXR0aW5nIHRvOiAlc1xuIiwgCisJICAgICAgIGluZm8uc2xvdF9pZCwgCisJICAgICAgIGluZm8uY2xvY2tfcmF0ZS8xMDAwLAorCSAgICAgICBpbmZvLnNhbXBsZXNfcGVyX2ZyYW1lKjEwMDAvaW5mby5jaGFubmVsX2NvdW50L2luZm8uY2xvY2tfcmF0ZSwKKwkgICAgICAgaW5mby5jaGFubmVsX2NvdW50LAorCSAgICAgICAoaW50KWluZm8ubmFtZS5zbGVuLCAKKwkgICAgICAgaW5mby5uYW1lLnB0ciwKKwkgICAgICAgdHhsaXN0KTsKKwlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2Vzcywgb3V0X3N0ciwgcGpfYW5zaV9zdHJsZW4ob3V0X3N0cikpOyAgICAKKyAgICB9ICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBDb25mZXJlbmNlIGNvbm5lY3QvZGlzY29ubmVjdCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9tZWRpYV9jb25uZWN0KHBqX2NsaV9jbWRfdmFsICpjdmFsLCBwal9ib29sX3QgY29ubmVjdCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgaWYgKGNvbm5lY3QpCisJc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSksIAorCQkJCSAgICBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pKTsKKyAgICBlbHNlCisJc3RhdHVzID0gcGpzdWFfY29uZl9kaXNjb25uZWN0KHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSksIAorCQkJCSAgICAgICBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCXN0YXRpYyBjb25zdCBwal9zdHJfdCBzdWNjZXNzX21zZyA9IHsiU3VjY2Vzc1xuIiwgOX07CisJcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIHN1Y2Nlc3NfbXNnLnB0ciwgc3VjY2Vzc19tc2cuc2xlbik7CQorICAgIH0gZWxzZSB7CisJc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IkVSUk9SISFcbiIsIDl9OworCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfbXNnLnB0ciwgZXJyX21zZy5zbGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogQWRqdXN0IGF1ZGlvIHZvbHVtZSAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9hZGp1c3Rfdm9sKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIGNoYXIgYnVmWzgwXTsKKyAgICBmbG9hdCBvcmlnX2xldmVsOworICAgIGNoYXIgKmVycjsKKyAgICBjaGFyIGxldmVsX3ZhbFsxNl0gPSB7MH07CisgICAgcGpfc3RyX3QgdG1wID0gcGpfc3RyKGxldmVsX3ZhbCk7CisKKyAgICAvKiBBZGp1c3QgbWljIGxldmVsICovCisgICAgb3JpZ19sZXZlbCA9IGFwcF9jb25maWcubWljX2xldmVsOyAgICAKKyAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmY3ZhbC0+YXJndlsxXSwgc2l6ZW9mKGxldmVsX3ZhbCkpOworICAgIGFwcF9jb25maWcubWljX2xldmVsID0gKGZsb2F0KXN0cnRvZChsZXZlbF92YWwsICZlcnIpOworICAgIHBqc3VhX2NvbmZfYWRqdXN0X3J4X2xldmVsKDAsIGFwcF9jb25maWcubWljX2xldmVsKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICAiQWRqdXN0IG1pYyBsZXZlbDogWyU0LjFmeF0gLT4gWyU0LjFmeF1cbiIsIAorCQkgICAgIG9yaWdfbGV2ZWwsIGFwcF9jb25maWcubWljX2xldmVsKTsKKworICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBidWYsIHBqX2Fuc2lfc3RybGVuKGJ1ZikpOworCisgICAgLyogQWRqdXN0IHNwZWFrZXIgbGV2ZWwgKi8KKyAgICBvcmlnX2xldmVsID0gYXBwX2NvbmZpZy5zcGVha2VyX2xldmVsOyAgICAgICAgCisgICAgcGpfc3RybmNweV93aXRoX251bGwoJnRtcCwgJmN2YWwtPmFyZ3ZbMl0sIHNpemVvZihsZXZlbF92YWwpKTsKKyAgICBhcHBfY29uZmlnLnNwZWFrZXJfbGV2ZWwgPSAoZmxvYXQpc3RydG9kKGxldmVsX3ZhbCwgJmVycik7CisgICAgcGpzdWFfY29uZl9hZGp1c3RfdHhfbGV2ZWwoMCwgYXBwX2NvbmZpZy5zcGVha2VyX2xldmVsKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICAgIkFkanVzdCBzcGVha2VyIGxldmVsOiBbJTQuMWZ4XSAtPiBbJTQuMWZ4XVxuIiwgCisJCSAgICAgIG9yaWdfbGV2ZWwsIGFwcF9jb25maWcuc3BlYWtlcl9sZXZlbCk7CisKKyAgICBwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgYnVmLCBwal9hbnNpX3N0cmxlbihidWYpKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTZXQgY29kZWMgcHJpb3JpdHkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2V0X2NvZGVjX3ByaW8ocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7ICAgICAgICAKKyAgICBpbnQgbmV3X3ByaW87ICAgIAorICAgIHBqX3N0YXR1c190IHN0YXR1czsgICAgCisKKyAgICBuZXdfcHJpbyA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsyXSk7CisgICAgaWYgKG5ld19wcmlvIDwgMCkgCisJbmV3X3ByaW8gPSAwOworICAgIGVsc2UgaWYgKG5ld19wcmlvID4gUEpNRURJQV9DT0RFQ19QUklPX0hJR0hFU1QpIAorCW5ld19wcmlvID0gUEpNRURJQV9DT0RFQ19QUklPX0hJR0hFU1Q7CisKKyAgICBzdGF0dXMgPSBwanN1YV9jb2RlY19zZXRfcHJpb3JpdHkoJmN2YWwtPmFyZ3ZbMV0sIAorCQkJCSAgICAgIChwal91aW50OF90KW5ld19wcmlvKTsKKyNpZiBQSlNVQV9IQVNfVklERU8KKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfc2V0X3ByaW9yaXR5KCZjdmFsLT5hcmd2WzFdLCAKKwkJCQkJICAgICAgKHBqX3VpbnQ4X3QpbmV3X3ByaW8pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igc2V0dGluZyBjb2RlYyBwcmlvcml0eSIsIHN0YXR1cyk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBDb25mZXJlbmNlL21lZGlhIGNvbW1hbmQgaGFuZGxlciAqLworcGpfc3RhdHVzX3QgY21kX21lZGlhX2hhbmRsZXIocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIENIRUNLX1BKU1VBX1JVTk5JTkcoKTsKKworICAgIHN3aXRjaChwal9jbGlfZ2V0X2NtZF9pZChjdmFsLT5jbWQpKSB7CisgICAgY2FzZSBDTURfTUVESUFfTElTVDoKKwlzdGF0dXMgPSBjbWRfbWVkaWFfbGlzdChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9NRURJQV9DT05GX0NPTk5FQ1Q6CisgICAgY2FzZSBDTURfTUVESUFfQ09ORl9ESVNDT05ORUNUOgorCXN0YXR1cyA9IGNtZF9tZWRpYV9jb25uZWN0KGN2YWwsIAorCQkgICAgICAgICAgcGpfY2xpX2dldF9jbWRfaWQoY3ZhbC0+Y21kKT09Q01EX01FRElBX0NPTkZfQ09OTkVDVCk7CQorCWJyZWFrOworICAgIGNhc2UgQ01EX01FRElBX0FESlVTVF9WT0w6CQorCXN0YXR1cyA9IGNtZF9hZGp1c3Rfdm9sKGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX01FRElBX0NPREVDX1BSSU86CisJc3RhdHVzID0gY21kX3NldF9jb2RlY19wcmlvKGN2YWwpOwkKKwlicmVhazsKKyAgICBjYXNlIENNRF9NRURJQV9TUEVBS0VSX1RPR0dMRToKKwl7CisJICAgIHN0YXRpYyBpbnQgcm91dGUgPSBQSk1FRElBX0FVRF9ERVZfUk9VVEVfREVGQVVMVDsKKwkgICAgc3RhdHVzID0gcGpzdWFfc25kX2dldF9zZXR0aW5nKFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1JPVVRFLAorCQkJCQkgICAmcm91dGUpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJUEpfUEVSUk9SKDIsIChUSElTX0ZJTEUsIHN0YXR1cywKKwkJCSAgICAgICJXYXJuaW5nOiB1bmFibGUgdG8gcmV0cmlldmUgcm91dGUgc2V0dGluZyIpKTsKKwkgICAgfQorCisJICAgIGlmIChyb3V0ZSA9PSBQSk1FRElBX0FVRF9ERVZfUk9VVEVfTE9VRFNQRUFLRVIpCisJCXJvdXRlID0gUEpNRURJQV9BVURfREVWX1JPVVRFX0RFRkFVTFQ7CisJICAgIGVsc2UKKwkJcm91dGUgPSBQSk1FRElBX0FVRF9ERVZfUk9VVEVfTE9VRFNQRUFLRVI7CisKKwkgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlNldHRpbmcgb3V0cHV0IHJvdXRlIHRvICVzICVzIiwKKwkJICAgICAgKHJvdXRlPT1QSk1FRElBX0FVRF9ERVZfUk9VVEVfREVGQVVMVD8KKwkJCQkgICAgICAiZGVmYXVsdCIgOiAibG91ZHNwZWFrZXIiKSwKKwkJICAgICAgKHN0YXR1cz8gImFueXdheSIgOiAiIikpKTsKKworCSAgICBzdGF0dXMgPSBwanN1YV9zbmRfc2V0X3NldHRpbmcoUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfUk9VVEUsCisJCQkJCSAgICZyb3V0ZSwgUEpfVFJVRSk7CisJICAgIFBKX1BFUlJPUig0LChUSElTX0ZJTEUsIHN0YXR1cywgIlJlc3VsdCIpKTsKKwl9CisJYnJlYWs7CisgICAgfSAgICAKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIER1bXAgc3RhdHVzICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3N0YXRfZHVtcChwal9ib29sX3QgZGV0YWlsKQoreworICAgIHBqc3VhX2R1bXAoZGV0YWlsKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9zaG93X2NvbmZpZygpCit7CisgICAgY2hhciBzZXR0aW5nc1syMDAwXTsKKyAgICBpbnQgbGVuOworCisgICAgbGVuID0gd3JpdGVfc2V0dGluZ3MoJmFwcF9jb25maWcsIHNldHRpbmdzLCBzaXplb2Yoc2V0dGluZ3MpKTsKKyAgICBpZiAobGVuIDwgMSkKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IG5vdCBlbm91Z2ggYnVmZmVyIikpOworICAgIGVsc2UKKwlQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAiRHVtcGluZyBjb25maWd1cmF0aW9uICglZCBieXRlcyk6XG4lc1xuIiwKKwkJICBsZW4sIHNldHRpbmdzKSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF93cml0ZV9jb25maWcocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgY2hhciBzZXR0aW5nc1syMDAwXTsKKyAgICBjaGFyIGJ1ZlsxMjhdID0gezB9OworICAgIGludCBsZW47CisgICAgcGpfc3RyX3QgdG1wID0gcGpfc3RyKGJ1Zik7CisKKyAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmY3ZhbC0+YXJndlsxXSwgc2l6ZW9mKGJ1ZikpOyAgICAKKworICAgIGxlbiA9IHdyaXRlX3NldHRpbmdzKCZhcHBfY29uZmlnLCBzZXR0aW5ncywgc2l6ZW9mKHNldHRpbmdzKSk7CisgICAgaWYgKGxlbiA8IDEpCisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBub3QgZW5vdWdoIGJ1ZmZlciIpKTsKKyAgICBlbHNlIHsKKwlwal9vc2hhbmRsZV90IGZkOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCXN0YXR1cyA9IHBqX2ZpbGVfb3BlbihhcHBfY29uZmlnLnBvb2wsIGJ1ZiwgUEpfT19XUk9OTFksICZmZCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqc3VhX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gb3BlbiBmaWxlIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCSAgICBjaGFyIG91dF9zdHJbMjU2XTsKKwkgICAgcGpfc3NpemVfdCBzaXplID0gbGVuOworCSAgICBwal9maWxlX3dyaXRlKGZkLCBzZXR0aW5ncywgJnNpemUpOworCSAgICBwal9maWxlX2Nsb3NlKGZkKTsKKworCSAgICBwal9hbnNpX3NucHJpbnRmKG91dF9zdHIsIHNpemVvZihvdXRfc3RyKSwKKwkJCSAgICAgIlNldHRpbmdzIHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvICclcydcbiIsIGJ1Zik7CisKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIG91dF9zdHIsIHBqX2Fuc2lfc3RybGVuKG91dF9zdHIpKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFN0YXR1cyBhbmQgY29uZmlnIGNvbW1hbmQgaGFuZGxlciAqLworcGpfc3RhdHVzX3QgY21kX2NvbmZpZ19oYW5kbGVyKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisKKyAgICBDSEVDS19QSlNVQV9SVU5OSU5HKCk7CisKKyAgICBzd2l0Y2gocGpfY2xpX2dldF9jbWRfaWQoY3ZhbC0+Y21kKSkgeworICAgIGNhc2UgQ01EX0NPTkZJR19EVU1QX1NUQVQ6CisJc3RhdHVzID0gY21kX3N0YXRfZHVtcChQSl9GQUxTRSk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ09ORklHX0RVTVBfREVUQUlMOgorCXN0YXR1cyA9IGNtZF9zdGF0X2R1bXAoUEpfVFJVRSk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ09ORklHX0RVTVBfQ09ORjoKKwlzdGF0dXMgPSBjbWRfc2hvd19jb25maWcoKTsJCisJYnJlYWs7CisgICAgY2FzZSBDTURfQ09ORklHX1dSSVRFX1NFVFRJTkc6CQorCXN0YXR1cyA9IGNtZF93cml0ZV9jb25maWcoY3ZhbCk7CisJYnJlYWs7CisgICAgfSAgICAKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIE1ha2Ugc2luZ2xlIGNhbGwgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfbWFrZV9zaW5nbGVfY2FsbChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBzdHJ1Y3QgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKyAgICBjaGFyIGRlc3RbNjRdID0gezB9OworICAgIGNoYXIgb3V0X3N0clsxMjhdOworICAgIHBqX3N0cl90IHRtcCA9IHBqX3N0cihkZXN0KTsgICAgICAKKworICAgIHBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXAsICZjdmFsLT5hcmd2WzFdLCBzaXplb2YoZGVzdCkpOyAgICAKKworICAgIHBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgCisJCSAgICAgc2l6ZW9mKG91dF9zdHIpLCAKKwkJICAgICAiKFlvdSBjdXJyZW50bHkgaGF2ZSAlZCBjYWxscylcbiIsCisJCSAgICAgcGpzdWFfY2FsbF9nZXRfY291bnQoKSk7CisKKyAgICBwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2Vzcywgb3V0X3N0ciwgcGpfYW5zaV9zdHJsZW4ob3V0X3N0cikpOworICAgIAorICAgIC8qIGlucHV0IGRlc3RpbmF0aW9uLiAqLworICAgIGdldF9pbnB1dF91cmwodG1wLnB0ciwgdG1wLnNsZW4sIGN2YWwsICZyZXN1bHQpOyAgICAKKyAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCAhPSBQSlNVQV9BUFBfTk9fTkIpIHsKKwlwanN1YV9idWRkeV9pbmZvIGJpbmZvOworCWlmIChyZXN1bHQubmJfcmVzdWx0ID09IC0xIHx8IHJlc3VsdC5uYl9yZXN1bHQgPT0gMCkgeworCSAgICBzdGF0aWMgY29uc3QgcGpfc3RyX3QgZXJyX21zZyA9IAorCQkgICAgeyJZb3UgY2FuJ3QgZG8gdGhhdCB3aXRoIG1ha2UgY2FsbCFcbiIsIDM1fTsKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9IAkKKwlwanN1YV9idWRkeV9nZXRfaW5mbyhyZXN1bHQubmJfcmVzdWx0LTEsICZiaW5mbyk7CSAgICAKKwlwal9zdHJuY3B5KCZ0bXAsICZiaW5mby51cmksIHNpemVvZihkZXN0KSk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXRtcCA9IHBqX3N0cihyZXN1bHQudXJpX3Jlc3VsdCk7CisgICAgfSBlbHNlIHsKKwl0bXAuc2xlbiA9IDA7CisgICAgfQorCisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworICAgIFRFU1RfTVVMVElQQVJUKCZtc2dfZGF0YSk7CisgICAgcGpzdWFfY2FsbF9tYWtlX2NhbGwoY3VycmVudF9hY2MsICZ0bXAsICZjYWxsX29wdCwgTlVMTCwgCisJCQkgJm1zZ19kYXRhLCAmY3VycmVudF9jYWxsKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogTWFrZSBtdWx0aSBjYWxsICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX21ha2VfbXVsdGlfY2FsbChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBzdHJ1Y3QgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKyAgICBjaGFyIGRlc3RbNjRdID0gezB9OyAgICAKKyAgICBjaGFyIG91dF9zdHJbMTI4XTsKKyAgICBpbnQgaSwgY291bnQ7CisgICAgcGpfc3RyX3QgdG1wID0gcGpfc3RyKGRlc3QpOworCisgICAgcGpfYW5zaV9zbnByaW50ZihvdXRfc3RyLCAKKwkJICAgICBzaXplb2Yob3V0X3N0ciksIAorCQkgICAgICIoWW91IGN1cnJlbnRseSBoYXZlICVkIGNhbGxzKVxuIiwKKwkJICAgICBwanN1YV9jYWxsX2dldF9jb3VudCgpKTsKKyAgICAKKyAgICBjb3VudCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSk7CisgICAgaWYgKGNvdW50IDwgMSkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICBwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCAmY3ZhbC0+YXJndlsyXSwgc2l6ZW9mKGRlc3QpKTsKKyAgICAKKyAgICAvKiBpbnB1dCBkZXN0aW5hdGlvbi4gKi8KKyAgICBnZXRfaW5wdXRfdXJsKHRtcC5wdHIsIHRtcC5zbGVuLCBjdmFsLCAmcmVzdWx0KTsgICAgCisgICAgaWYgKHJlc3VsdC5uYl9yZXN1bHQgIT0gUEpTVUFfQVBQX05PX05CKSB7CisJcGpzdWFfYnVkZHlfaW5mbyBiaW5mbzsKKwlpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAtMSB8fCByZXN1bHQubmJfcmVzdWx0ID09IDApIHsKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSAKKwkJCSAgICB7IllvdSBjYW4ndCBkbyB0aGF0IHdpdGggbWFrZSBjYWxsIVxuIiwgMzV9OworCSAgICBwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgZXJyX21zZy5wdHIsIGVycl9tc2cuc2xlbik7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0gCQorCXBqc3VhX2J1ZGR5X2dldF9pbmZvKHJlc3VsdC5uYl9yZXN1bHQtMSwgJmJpbmZvKTsJICAgIAorCXBqX3N0cm5jcHkoJnRtcCwgJmJpbmZvLnVyaSwgc2l6ZW9mKGRlc3QpKTsJCisgICAgfSBlbHNlIHsKKwl0bXAgPSBwal9zdHIocmVzdWx0LnVyaV9yZXN1bHQpOworICAgIH0gCisKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJc3RhdHVzID0gcGpzdWFfY2FsbF9tYWtlX2NhbGwoY3VycmVudF9hY2MsICZ0bXAsICZjYWxsX29wdCwgTlVMTCwKKwkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFuc3dlciBjYWxsICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2Fuc3dlcl9jYWxsKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBjYWxsX2luZm87CisKKyAgICBpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlwanN1YV9jYWxsX2dldF9pbmZvKGN1cnJlbnRfY2FsbCwgJmNhbGxfaW5mbyk7CisgICAgfSBlbHNlIHsKKwkvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCisJY2FsbF9pbmZvLnJvbGUgPSBQSlNJUF9ST0xFX1VBQzsKKwljYWxsX2luZm8uc3RhdGUgPSBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIGlmIChjdXJyZW50X2NhbGwgPT0gUEpTVUFfSU5WQUxJRF9JRCB8fCAKKwljYWxsX2luZm8ucm9sZSAhPSBQSlNJUF9ST0xFX1VBUyB8fAorCWNhbGxfaW5mby5zdGF0ZSA+PSBQSlNJUF9JTlZfU1RBVEVfQ09OTkVDVElORykKKyAgICB7CQorCXN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJObyBwZW5kaW5nIGluY29taW5nIGNhbGxcbiIsIDI2fTsJICAKKwlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgZXJyX21zZy5wdHIsIGVycl9tc2cuc2xlbik7CisKKyAgICB9IGVsc2UgeworCWludCBzdF9jb2RlOworCWNoYXIgY29udGFjdFsxMjBdOworCXBqX3N0cl90IGhuYW1lID0geyAiQ29udGFjdCIsIDcgfTsKKwlwal9zdHJfdCBodmFsdWU7CQorCXBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkciBoY29udGFjdDsJCisKKwlzdF9jb2RlID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzFdKTsKKwlpZiAoKHN0X2NvZGUgPCAxMDApIHx8IChzdF9jb2RlID4gNjk5KSkKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKKwlwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKwlpZiAoc3RfY29kZS8xMDAgPT0gMykgeworCSAgICBpZiAoY3ZhbC0+YXJnYyA8IDMpIHsKKwkJc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IkVudGVyIFVSTCB0byBiZSBwdXQgIgorCQkJCQkJICJpbiBDb250YWN0XG4iLCAgMzJ9OworCQlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgZXJyX21zZy5wdHIsIGVycl9tc2cuc2xlbik7CQkKKwkJcmV0dXJuIFBKX1NVQ0NFU1M7CisJICAgIH0KKworCSAgICBodmFsdWUgPSBwal9zdHIoY29udGFjdCk7CisJICAgIHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkcl9pbml0MigmaGNvbnRhY3QsICZobmFtZSwgJmh2YWx1ZSk7CisKKwkgICAgcGpfbGlzdF9wdXNoX2JhY2soJm1zZ19kYXRhLmhkcl9saXN0LCAmaGNvbnRhY3QpOworCX0KKworCS8qCisJKiBNdXN0IGNoZWNrIGFnYWluIQorCSogQ2FsbCBtYXkgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCB3aGlsZSB3ZSdyZSB3YWl0aW5nIGZvciAKKwkqIGtleWJvYXJkIGlucHV0LgorCSovCisJaWYgKGN1cnJlbnRfY2FsbCA9PSBQSlNVQV9JTlZBTElEX0lEKSB7CisJICAgIHN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJDYWxsIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZFxuIiwgCisJCQkJCSAgICAgMjh9OwkgICAgCisJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfbXNnLnB0ciwgZXJyX21zZy5zbGVuKTsKKwl9CisKKwlwanN1YV9jYWxsX2Fuc3dlcjIoY3VycmVudF9jYWxsLCAmY2FsbF9vcHQsIHN0X2NvZGUsIE5VTEwsICZtc2dfZGF0YSk7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBIYW5ndXAgY2FsbCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9oYW5ndXBfY2FsbChwal9jbGlfY21kX3ZhbCAqY3ZhbCwgcGpfYm9vbF90IGFsbCkKK3sKKyAgICBpZiAoY3VycmVudF9jYWxsID09IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlzdGF0aWMgY29uc3QgcGpfc3RyX3QgZXJyX21zZyA9IHsiTm8gY3VycmVudCBjYWxsXG4iLCAxN307CisJcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworICAgIH0gZWxzZSB7CisJaWYgKGFsbCkKKwkgICAgcGpzdWFfY2FsbF9oYW5ndXBfYWxsKCk7CSAgICAKKwllbHNlCisJICAgIHBqc3VhX2NhbGxfaGFuZ3VwKGN1cnJlbnRfY2FsbCwgMCwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBIb2xkIGNhbGwgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfaG9sZF9jYWxsKCkKK3sKKyAgICBpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsJCisJcGpzdWFfY2FsbF9zZXRfaG9sZChjdXJyZW50X2NhbGwsIE5VTEwpOworCisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQ2FsbCByZWludml0ZSAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9jYWxsX3JlaW52aXRlKCkKK3sKKyAgICBpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwkvKgorCSAqIHJlLUlOVklURQorCSAqLworCWNhbGxfb3B0LmZsYWcgfD0gUEpTVUFfQ0FMTF9VTkhPTEQ7CisJcGpzdWFfY2FsbF9yZWludml0ZTIoY3VycmVudF9jYWxsLCAmY2FsbF9vcHQsIE5VTEwpOworCisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU2VuZCB1cGRhdGUgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfY2FsbF91cGRhdGUoKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgIT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCXBqc3VhX2NhbGxfdXBkYXRlMihjdXJyZW50X2NhbGwsICZjYWxsX29wdCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU2VsZWN0IG5leHQgY2FsbCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9uZXh0X2NhbGwocGpfYm9vbF90IG5leHQpCit7CisgICAgLyoKKyAgICAgKiBDeWNsZSBuZXh0L3ByZXYgZGlhbG9nLgorICAgICAqLworICAgIGlmIChuZXh0KSB7CisJZmluZF9uZXh0X2NhbGwoKTsKKyAgICB9IGVsc2UgeworCWZpbmRfcHJldl9jYWxsKCk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfY2FsbCAhPSBQSlNVQV9JTlZBTElEX0lEKSB7CQorCXBqc3VhX2NhbGxfaW5mbyBjYWxsX2luZm87CisKKwlwanN1YV9jYWxsX2dldF9pbmZvKGN1cnJlbnRfY2FsbCwgJmNhbGxfaW5mbyk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwiQ3VycmVudCBkaWFsb2c6ICUuKnMiLCAKKwkJICAoaW50KWNhbGxfaW5mby5yZW1vdGVfaW5mby5zbGVuLCAKKwkJICBjYWxsX2luZm8ucmVtb3RlX2luZm8ucHRyKSk7CisKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsIk5vIGN1cnJlbnQgZGlhbG9nIikpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogVHJhbnNmZXIgY2FsbCAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF90cmFuc2Zlcl9jYWxsKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgPT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKworICAgIH0gZWxzZSB7CisJY2hhciBvdXRfc3RyWzY0XTsKKwlpbnQgY2FsbCA9IGN1cnJlbnRfY2FsbDsKKwljaGFyIGRlc3RbNjRdID0gezB9OworCXBqX3N0cl90IHRtcCA9IHBqX3N0cihkZXN0KTsKKwlzdHJ1Y3QgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKwlwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgcmVmZXJfc3ViOworCXBqX3N0cl90IFNUUl9SRUZFUl9TVUIgPSB7ICJSZWZlci1TdWIiLCA5IH07CisJcGpfc3RyX3QgU1RSX0ZBTFNFID0geyAiZmFsc2UiLCA1IH07CisJcGpzdWFfY2FsbF9pbmZvIGNpOworCQorCXBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXAsICZjdmFsLT5hcmd2WzFdLCBzaXplb2YoZGVzdCkpOwkKKworCXBqc3VhX2NhbGxfZ2V0X2luZm8oY3VycmVudF9jYWxsLCAmY2kpOworCXBqX2Fuc2lfc25wcmludGYob3V0X3N0ciwgCisJCQkgc2l6ZW9mKG91dF9zdHIpLCAKKwkJCSAiVHJhbnNmZXJpbmcgY3VycmVudCBjYWxsIFslZF0gJS4qc1xuIiwKKwkJCSBjdXJyZW50X2NhbGwsCisJCQkgKGludCljaS5yZW1vdGVfaW5mby5zbGVuLCAKKwkJCSBjaS5yZW1vdGVfaW5mby5wdHIpOworCisJZ2V0X2lucHV0X3VybCh0bXAucHRyLCB0bXAuc2xlbiwgY3ZhbCwgJnJlc3VsdCk7CisKKwkvKiBDaGVjayBpZiBjYWxsIGlzIHN0aWxsIHRoZXJlLiAqLworCisJaWYgKGNhbGwgIT0gY3VycmVudF9jYWxsKSB7CisJICAgIHB1dHMoIkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkIik7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0KKworCXBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKwlpZiAoYXBwX2NvbmZpZy5ub19yZWZlcnN1YikgeworCSAgICAvKiBBZGQgUmVmZXItU3ViOiBmYWxzZSBpbiBvdXRnb2luZyBSRUZFUiByZXF1ZXN0ICovCisJICAgIHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkcl9pbml0MigmcmVmZXJfc3ViLCAmU1RSX1JFRkVSX1NVQiwKKwkJJlNUUl9GQUxTRSk7CisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZtc2dfZGF0YS5oZHJfbGlzdCwgJnJlZmVyX3N1Yik7CisJfQorCWlmIChyZXN1bHQubmJfcmVzdWx0ICE9IFBKU1VBX0FQUF9OT19OQikgeworCSAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAtMSB8fCByZXN1bHQubmJfcmVzdWx0ID09IDApIHsKKwkJc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IllvdSBjYW4ndCBkbyB0aGF0IHdpdGggIgorCQkJCQkJICJ0cmFuc2ZlciBjYWxsIVxuIiwgMzl9OworCisJCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfbXNnLnB0ciwgZXJyX21zZy5zbGVuKTsKKwkgICAgfSBlbHNlIHsKKwkJcGpzdWFfYnVkZHlfaW5mbyBiaW5mbzsKKwkJcGpzdWFfYnVkZHlfZ2V0X2luZm8ocmVzdWx0Lm5iX3Jlc3VsdC0xLCAmYmluZm8pOworCQlwanN1YV9jYWxsX3hmZXIoIGN1cnJlbnRfY2FsbCwgJmJpbmZvLnVyaSwgJm1zZ19kYXRhKTsKKwkgICAgfQorCX0gZWxzZSBpZiAocmVzdWx0LnVyaV9yZXN1bHQpIHsKKwkgICAgcGpfc3RyX3QgdG1wOworCSAgICB0bXAgPSBwal9zdHIocmVzdWx0LnVyaV9yZXN1bHQpOworCSAgICBwanN1YV9jYWxsX3hmZXIoIGN1cnJlbnRfY2FsbCwgJnRtcCwgJm1zZ19kYXRhKTsKKwl9CisgICAgfQkgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFRyYW5zZmVyIGNhbGwgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdHJhbnNmZXJfcmVwbGFjZV9jYWxsKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAKKyAgICBpZiAoY3VycmVudF9jYWxsID09IC0xKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKyAgICB9IGVsc2UgeworCWludCBjYWxsID0gY3VycmVudF9jYWxsOworCWludCBkc3RfY2FsbDsKKwlwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgcmVmZXJfc3ViOworCXBqX3N0cl90IFNUUl9SRUZFUl9TVUIgPSB7ICJSZWZlci1TdWIiLCA5IH07CisJcGpfc3RyX3QgU1RSX0ZBTFNFID0geyAiZmFsc2UiLCA1IH07CisJcGpzdWFfY2FsbF9pZCBpZHNbUEpTVUFfTUFYX0NBTExTXTsJCisJcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisJY2hhciBidWZbOF0gPSB7MH07CQorCXBqX3N0cl90IHRtcCA9IHBqX3N0cihidWYpOworCXVuc2lnbmVkIGNvdW50OwkKKwlzdGF0aWMgY29uc3QgcGpfc3RyX3QgZXJyX2ludmFsaWRfbnVtID0gCisJCQkJICAgIHsiSW52YWxpZCBkZXN0aW5hdGlvbiBjYWxsIG51bWJlclxuIiwgMzIgfTsKKwljb3VudCA9IFBKX0FSUkFZX1NJWkUoaWRzKTsKKwlwanN1YV9lbnVtX2NhbGxzKGlkcywgJmNvdW50KTsKKworCWlmIChjb3VudCA8PSAxKSB7CSAgICAKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9ub19vdGhlcl9jYWxsID0gCisJCQkJICAgIHsiVGhlcmUgYXJlIG5vIG90aGVyIGNhbGxzXG4iLCAyNX07CisKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9ub19vdGhlcl9jYWxsLnB0ciwgCisJCQkJICBlcnJfbm9fb3RoZXJfY2FsbC5zbGVuKTsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJcGpfc3RybmNweV93aXRoX251bGwoJnRtcCwgJmN2YWwtPmFyZ3ZbMV0sIHNpemVvZihidWYpKTsKKwlkc3RfY2FsbCA9IG15X2F0b2kodG1wLnB0cik7CisKKwkvKiBDaGVjayBpZiBjYWxsIGlzIHN0aWxsIHRoZXJlLiAqLworCWlmIChjYWxsICE9IGN1cnJlbnRfY2FsbCkgewkgICAgCisJICAgIHN0YXRpYyBwal9zdHJfdCBlcnJfY2FsbF9kYyA9IAorCQkJCSAgICB7IkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkXG4iLCAyN307CisKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9jYWxsX2RjLnB0ciwgCisJCQkJICBlcnJfY2FsbF9kYy5zbGVuKTsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJLyogQ2hlY2sgdGhhdCBkZXN0aW5hdGlvbiBjYWxsIGlzIHZhbGlkLiAqLworCWlmIChkc3RfY2FsbCA9PSBjYWxsKSB7CisJICAgIHN0YXRpYyBwal9zdHJfdCBlcnJfc2FtZV9udW0gPSAKKwkJCQkgICAgeyJEZXN0aW5hdGlvbiBjYWxsIG51bWJlciBtdXN0IG5vdCBiZSB0aGUgIgorCQkJCSAgICAgInNhbWUgYXMgdGhlIGNhbGwgYmVpbmcgdHJhbnNmZXJlZFxuIiwgNzR9OworCisJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfc2FtZV9udW0ucHRyLCAKKwkJCQkgIGVycl9zYW1lX251bS5zbGVuKTsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJaWYgKGRzdF9jYWxsID49IFBKU1VBX01BWF9DQUxMUykgeworCSAgICBwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgZXJyX2ludmFsaWRfbnVtLnB0ciwgCisJCQkJICBlcnJfaW52YWxpZF9udW0uc2xlbik7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0KKworCWlmICghcGpzdWFfY2FsbF9pc19hY3RpdmUoZHN0X2NhbGwpKSB7CisJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfaW52YWxpZF9udW0ucHRyLCAKKwkJCQkgIGVycl9pbnZhbGlkX251bS5zbGVuKTsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworCWlmIChhcHBfY29uZmlnLm5vX3JlZmVyc3ViKSB7CisJICAgIC8qIEFkZCBSZWZlci1TdWI6IGZhbHNlIGluIG91dGdvaW5nIFJFRkVSIHJlcXVlc3QgKi8KKwkgICAgcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyX2luaXQyKCZyZWZlcl9zdWIsICZTVFJfUkVGRVJfU1VCLCAKKwkJCQkJICAgJlNUUl9GQUxTRSk7CisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZtc2dfZGF0YS5oZHJfbGlzdCwgJnJlZmVyX3N1Yik7CisJfQorCisJcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzKGNhbGwsIGRzdF9jYWxsLCAKKwkJCQkgUEpTVUFfWEZFUl9OT19SRVFVSVJFX1JFUExBQ0VTLCAKKwkJCQkgJm1zZ19kYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfcmVkaXJlY3RfY2FsbChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgIAorICAgIGlmIChjdXJyZW50X2NhbGwgPT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJObyBjdXJyZW50IGNhbGwiKSk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorICAgIGlmICghcGpzdWFfY2FsbF9pc19hY3RpdmUoY3VycmVudF9jYWxsKSkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJDYWxsICVkIGhhcyBnb25lIiwgY3VycmVudF9jYWxsKSk7CisgICAgfSBlbHNlIHsJCisJZW51bSB7CisJICAgIEFDQ0VQVF9SRVBMQUNFLCBBQ0NFUFQsIFJFSkVDVCwgU1RPUAorCX07CisJaW50IGNob2ljZSA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSk7CisKKwlzd2l0Y2ggKGNob2ljZSkgeworCWNhc2UgQUNDRVBUX1JFUExBQ0U6CisJICAgIHBqc3VhX2NhbGxfcHJvY2Vzc19yZWRpcmVjdChjdXJyZW50X2NhbGwsIAorCSAgICAJCQkJUEpTSVBfUkVESVJFQ1RfQUNDRVBUX1JFUExBQ0UpOwkgICAgCisJICAgIGJyZWFrOworCWNhc2UgQUNDRVBUOgorCSAgICBwanN1YV9jYWxsX3Byb2Nlc3NfcmVkaXJlY3QoY3VycmVudF9jYWxsLCBQSlNJUF9SRURJUkVDVF9BQ0NFUFQpOworCSAgICBicmVhazsKKwljYXNlIFJFSkVDVDoKKwkgICAgcGpzdWFfY2FsbF9wcm9jZXNzX3JlZGlyZWN0KGN1cnJlbnRfY2FsbCwgUEpTSVBfUkVESVJFQ1RfUkVKRUNUKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcGpzdWFfY2FsbF9wcm9jZXNzX3JlZGlyZWN0KGN1cnJlbnRfY2FsbCwgUEpTSVBfUkVESVJFQ1RfU1RPUCk7CisJICAgIGJyZWFrOworCX0JCisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTZW5kIERUTUYgKFJGQzI4MzMpICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2R0bWZfMjgzMyhwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBpZiAoY3VycmVudF9jYWxsID09IFBKU1VBX0lOVkFMSURfSUQpIHsKKworCVBKX0xPRygzLChUSElTX0ZJTEUsICJObyBjdXJyZW50IGNhbGwiKSk7CisKKyAgICB9IGVsc2UgaWYgKCFwanN1YV9jYWxsX2hhc19tZWRpYShjdXJyZW50X2NhbGwpKSB7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTWVkaWEgaXMgbm90IGVzdGFibGlzaGVkIHlldCEiKSk7CisKKyAgICB9IGVsc2UgewkKKwlpbnQgY2FsbCA9IGN1cnJlbnRfY2FsbDsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlpZiAoY2FsbCAhPSBjdXJyZW50X2NhbGwpIHsKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkXG4iLAorCQkJCQkgICAgIDI4fTsKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzs7CisJfQorCQorCXN0YXR1cyA9IHBqc3VhX2NhbGxfZGlhbF9kdG1mKGN1cnJlbnRfY2FsbCwgJmN2YWwtPmFyZ3ZbMV0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHNlbmQgRFRNRiIsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IG1zZyA9IHsiRFRNRiBkaWdpdHMgZW5xdWV1ZWQgIgorCQkJCQkgImZvciB0cmFuc21pc3Npb25cbiIsIDM5fTsKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIG1zZy5wdHIsIG1zZy5zbGVuKTsKKwl9CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTZW5kIERUTUYgd2l0aCBTSVAgSW5mbyAqLworc3RhdGljIHBqX3N0YXR1c190IGNtZF9jYWxsX2luZm8ocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgaWYgKGN1cnJlbnRfY2FsbCA9PSBQSlNVQV9JTlZBTElEX0lEKSB7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworCisgICAgfSBlbHNlIHsKKwljb25zdCBwal9zdHJfdCBTSVBfSU5GTyA9IHBqX3N0cigiSU5GTyIpOwkKKwlpbnQgY2FsbCA9IGN1cnJlbnRfY2FsbDsKKwlpbnQgaTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlpZiAoY2FsbCAhPSBjdXJyZW50X2NhbGwpIHsKKwkgICAgc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkXG4iLAorCQkJCQkgICAgIDI4fTsKKwkgICAgcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzs7CisJfQorCQorCWZvciAoaT0wOyBpPGN2YWwtPmFyZ3ZbMV0uc2xlbjsgKytpKSB7CisJICAgIGNoYXIgYm9keVs2NF07CisKKwkgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworCSAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUgPSBwal9zdHIoImFwcGxpY2F0aW9uL2R0bWYtcmVsYXkiKTsKKworCSAgICBwal9hbnNpX3NucHJpbnRmKGJvZHksIAorCQkJICAgICBzaXplb2YoYm9keSksCisJCQkgICAgICJTaWduYWw9JWNcbiIKKwkJCSAgICAgIkR1cmF0aW9uPTE2MCIsCisJCQkgICAgIGN2YWwtPmFyZ3ZbMV0ucHRyW2ldKTsKKworCSAgICBtc2dfZGF0YS5tc2dfYm9keSA9IHBqX3N0cihib2R5KTsKKworCSAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NlbmRfcmVxdWVzdChjdXJyZW50X2NhbGwsICZTSVBfSU5GTywgCisJCSZtc2dfZGF0YSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIER1bXAgY2FsbCBxdWFsaXR5ICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2NhbGxfcXVhbGl0eSgpCit7CisgICAgaWYgKGN1cnJlbnRfY2FsbCAhPSBQSlNVQV9JTlZBTElEX0lEKSB7CisJbG9nX2NhbGxfZHVtcChjdXJyZW50X2NhbGwpOworICAgIH0gZWxzZSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFNlbmQgYXJiaXRyYXJ5IHJlcXVlc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2VuZF9hcmJpdHJhcnkocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgaWYgKHBqc3VhX2FjY19nZXRfY291bnQoKSA9PSAwKSB7CisJc3RhdGljIGNvbnN0IHBqX3N0cl90IGVycl9tc2cgPSB7IlNvcnJ5LCBuZWVkIGF0IGxlYXN0IG9uZSAiCisJCQkJCSAiYWNjb3VudCBjb25maWd1cmVkXG4iLCA0NX07CisJcGpfY2xpX3Nlc3Nfd3JpdGVfbXNnKGN2YWwtPnNlc3MsIGVycl9tc2cucHRyLCBlcnJfbXNnLnNsZW4pOwkKKyAgICB9IGVsc2UgeworCWNoYXIgKnVyaTsKKwljaGFyIGRlc3RbNjRdID0gezB9OworCXBqX3N0cl90IHRtcCA9IHBqX3N0cihkZXN0KTsJCisJc3RydWN0IGlucHV0X3Jlc3VsdCByZXN1bHQ7CisJc3RhdGljIGNvbnN0IHBqX3N0cl90IGhlYWRlciA9IHsiU2VuZCBhcmJpdHJhcnkgcmVxdWVzdCB0byAiCisJCQkJCSJyZW1vdGUgaG9zdFxuIiwgMzl9OworCQorCXBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBoZWFkZXIucHRyLCBoZWFkZXIuc2xlbik7CQorCQorCXBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXAsICZjdmFsLT5hcmd2WzJdLCBzaXplb2YoZGVzdCkpOwkKKwkvKiBJbnB1dCBkZXN0aW5hdGlvbiBVUkkgKi8KKwl1cmkgPSBOVUxMOworCWdldF9pbnB1dF91cmwodG1wLnB0ciwgdG1wLnNsZW4sIGN2YWwsICZyZXN1bHQpOworCWlmIChyZXN1bHQubmJfcmVzdWx0ICE9IFBKU1VBX0FQUF9OT19OQikgeworCSAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAtMSkgewkJCisJCXN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJTb3JyeSB5b3UgY2FuJ3QgZG8gdGhhdCFcbiIsCisJCQkJCQkgMjZ9OworCQlwal9jbGlfc2Vzc193cml0ZV9tc2coY3ZhbC0+c2VzcywgZXJyX21zZy5wdHIsIGVycl9tc2cuc2xlbik7CisJCXJldHVybiBQSl9TVUNDRVNTOworCSAgICB9IGVsc2UgaWYgKHJlc3VsdC5uYl9yZXN1bHQgPT0gMCkgeworCQl1cmkgPSBOVUxMOworCQlpZiAoY3VycmVudF9jYWxsID09IFBKU1VBX0lOVkFMSURfSUQpIHsKKwkJICAgIHN0YXRpYyBjb25zdCBwal9zdHJfdCBlcnJfbXNnID0geyJObyBjdXJyZW50IGNhbGxcbiIsCisJCQkJCQkgICAgIDE3fTsKKwkJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBlcnJfbXNnLnB0ciwKKwkJCQkgICAgICAgICAgZXJyX21zZy5zbGVuKTsKKworCQkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJcGpzdWFfYnVkZHlfaW5mbyBiaW5mbzsKKwkJcGpzdWFfYnVkZHlfZ2V0X2luZm8ocmVzdWx0Lm5iX3Jlc3VsdC0xLCAmYmluZm8pOwkJCisJCXBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXAsICZiaW5mby51cmksIHNpemVvZihkZXN0KSk7CisJCXVyaSA9IHRtcC5wdHI7CisJICAgIH0KKwl9IGVsc2UgaWYgKHJlc3VsdC51cmlfcmVzdWx0KSB7CisJICAgIHVyaSA9IHJlc3VsdC51cmlfcmVzdWx0OworCX0gZWxzZSB7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOzsKKwl9CisKKwlpZiAodXJpKSB7CisJICAgIGNoYXIgbWV0aG9kWzY0XSA9IHswfTsKKwkgICAgcGpfc3RyX3QgdG1wX21ldGhvZCA9IHBqX3N0cihtZXRob2QpOwkgICAgCisJICAgIHBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXBfbWV0aG9kLCAmY3ZhbC0+YXJndlsxXSwgc2l6ZW9mKG1ldGhvZCkpOworCSAgICB0bXAgPSBwal9zdHIodXJpKTsKKwkgICAgc2VuZF9yZXF1ZXN0KG1ldGhvZCwgJnRtcCk7CisJfSBlbHNlIHsKKwkgICAgLyogSWYgeW91IHNlbmQgY2FsbCBjb250cm9sIHJlcXVlc3QgdXNpbmcgdGhpcyBtZXRob2QKKwkgICAgKiAoc3VjaCByZXF1ZXN0cyBpbmNsdWRlcyBCWUUsIENBTkNFTCwgZXRjLiksIGl0IHdpbGwKKwkgICAgKiBub3QgZ28gd2VsbCB3aXRoIHRoZSBjYWxsIHN0YXRlLCBzbyBkb24ndCBkbyBpdAorCSAgICAqIHVubGVzcyBpdCdzIGZvciB0ZXN0aW5nLgorCSAgICAqLwkgICAgCisJICAgIHBqc3VhX2NhbGxfc2VuZF9yZXF1ZXN0KGN1cnJlbnRfY2FsbCwgJmN2YWwtPmFyZ3ZbMV0sIE5VTEwpOworCX0gICAgCisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3Nob3dfY3VycmVudF9jYWxsKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIGNoYXIgb3V0X3N0clsxMjhdOworICAgIGludCBpID0gcGpzdWFfY2FsbF9nZXRfY291bnQoKTsKKyAgICBwal9hbnNpX3NucHJpbnRmKG91dF9zdHIsIHNpemVvZihvdXRfc3RyKSwKKwkJICAgICAiWW91IGhhdmUgJWQgYWN0aXZlIGNhbGwlc1xuIiwgaSwgKGk+MT8icyI6IiIpKTsKKworICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBvdXRfc3RyLCAKKwlwal9hbnNpX3N0cmxlbihvdXRfc3RyKSk7CisKKyAgICBpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlwanN1YV9jYWxsX2luZm8gY2k7CisJaWYgKHBqc3VhX2NhbGxfZ2V0X2luZm8oY3VycmVudF9jYWxsLCAmY2kpPT1QSl9TVUNDRVNTKSB7CSAgICAKKwkgICAgcGpfYW5zaV9zbnByaW50ZihvdXRfc3RyLCBzaXplb2Yob3V0X3N0ciksIAorCQkgICAiQ3VycmVudCBjYWxsIGlkPSVkIHRvICUuKnMgWyUuKnNdXG4iLCBjdXJyZW50X2NhbGwsCisJCSAgIChpbnQpY2kucmVtb3RlX2luZm8uc2xlbiwgY2kucmVtb3RlX2luZm8ucHRyLAorCQkgICAoaW50KWNpLnN0YXRlX3RleHQuc2xlbiwgY2kuc3RhdGVfdGV4dC5wdHIpOworCisJICAgIHBqX2NsaV9zZXNzX3dyaXRlX21zZyhjdmFsLT5zZXNzLCBvdXRfc3RyLCAKKwkJCQkgIHBqX2Fuc2lfc3RybGVuKG91dF9zdHIpKTsKKwl9CisgICAgfSAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQ2FsbCBoYW5kbGVyICovCitwal9zdGF0dXNfdCBjbWRfY2FsbF9oYW5kbGVyKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIHBqX2NsaV9jbWRfaWQgY21kX2lkID0gcGpfY2xpX2dldF9jbWRfaWQoY3ZhbC0+Y21kKTsKKworICAgIENIRUNLX1BKU1VBX1JVTk5JTkcoKTsKKworICAgIHN3aXRjaChjbWRfaWQpIHsKKyAgICBjYXNlIENNRF9DQUxMX05FVzoKKwlzdGF0dXMgPSBjbWRfbWFrZV9zaW5nbGVfY2FsbChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9DQUxMX01VTFRJOgorCXN0YXR1cyA9IGNtZF9tYWtlX211bHRpX2NhbGwoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ0FMTF9BTlNXRVI6CisJc3RhdHVzID0gY21kX2Fuc3dlcl9jYWxsKGN2YWwpOwkKKwlicmVhazsKKyAgICBjYXNlIENNRF9DQUxMX0hBTkdVUDoJCisgICAgY2FzZSBDTURfQ0FMTF9IQU5HVVBfQUxMOgkKKwlzdGF0dXMgPSBjbWRfaGFuZ3VwX2NhbGwoY3ZhbCwgKGNtZF9pZD09Q01EX0NBTExfSEFOR1VQX0FMTCkpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfSE9MRDoJCisJc3RhdHVzID0gY21kX2hvbGRfY2FsbCgpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfUkVJTlZJVEU6CQorCXN0YXR1cyA9IGNtZF9jYWxsX3JlaW52aXRlKCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ0FMTF9VUERBVEU6CQorCXN0YXR1cyA9IGNtZF9jYWxsX3VwZGF0ZSgpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfTkVYVDoJCQkKKyAgICBjYXNlIENNRF9DQUxMX1BSRVZJT1VTOgkKKwlzdGF0dXMgPSBjbWRfbmV4dF9jYWxsKGNtZF9pZD09Q01EX0NBTExfTkVYVCk7CQorCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfVFJBTlNGRVI6CQorCXN0YXR1cyA9IGNtZF90cmFuc2Zlcl9jYWxsKGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfVFJBTlNGRVJfUkVQTEFDRToJCisJc3RhdHVzID0gY21kX3RyYW5zZmVyX3JlcGxhY2VfY2FsbChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9DQUxMX1JFRElSRUNUOgorCXN0YXR1cyA9IGNtZF9yZWRpcmVjdF9jYWxsKGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfRDI4MzM6CQorCXN0YXR1cyA9IGNtZF9kdG1mXzI4MzMoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ0FMTF9JTkZPOgkKKwlzdGF0dXMgPSBjbWRfY2FsbF9pbmZvKGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfRFVNUF9ROgkKKwlzdGF0dXMgPSBjbWRfY2FsbF9xdWFsaXR5KCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfQ0FMTF9TRU5EX0FSQjoJCisJc3RhdHVzID0gY21kX3NlbmRfYXJiaXRyYXJ5KGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX0NBTExfTElTVDoKKwlzdGF0dXMgPSBjbWRfc2hvd19jdXJyZW50X2NhbGwoY3ZhbCk7CisJYnJlYWs7CisgICAgfSAgICAKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZiBQSlNVQV9IQVNfVklERU8gCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3NldF92aWRlb19lbmFibGUocGpfYm9vbF90IGVuYWJsZWQpCit7ICAgIAorICAgIGFwcF9jb25maWcudmlkLnZpZF9jbnQgPSAoZW5hYmxlZCA/IDEgOiAwKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiVmlkZW8gd2lsbCBiZSAlcyBpbiBuZXh0IG9mZmVyL2Fuc3dlciIsCisJKGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IG1vZGlmeV92aWRlb19hY2NvdW50KHBqc3VhX2FjY19jb25maWcgKmFjY19jZmcpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gcGpzdWFfYWNjX21vZGlmeShjdXJyZW50X2FjYywgYWNjX2NmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCVBKX1BFUlJPUigxLChUSElTX0ZJTEUsIHN0YXR1cywgIkVycm9yIG1vZGlmeWluZyBhY2NvdW50ICVkIiwKKwkJICAgICBjdXJyZW50X2FjYykpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9zaG93X2FjY291bnRfdmlkZW8oKQoreworICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgidG1wLXBqc3VhIiwgMTAwMCwgMTAwMCk7CisgICAgCisgICAgcGpzdWFfYWNjX2dldF9jb25maWcoY3VycmVudF9hY2MsIHBvb2wsICZhY2NfY2ZnKTsKKyAgICBhcHBfY29uZmlnX3Nob3dfdmlkZW8oY3VycmVudF9hY2MsICZhY2NfY2ZnKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdmlkZW9fYWNjX2hhbmRsZXIocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpzdWFfYWNjX2NvbmZpZyBhY2NfY2ZnOworICAgIHBqX2NsaV9jbWRfaWQgY21kX2lkID0gcGpfY2xpX2dldF9jbWRfaWQoY3ZhbC0+Y21kKTsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgidG1wLXBqc3VhIiwgMTAwMCwgMTAwMCk7CisKKyAgICBDSEVDS19QSlNVQV9SVU5OSU5HKCk7CisKKyAgICBwanN1YV9hY2NfZ2V0X2NvbmZpZyhjdXJyZW50X2FjYywgcG9vbCwgJmFjY19jZmcpOworCisgICAgc3dpdGNoKGNtZF9pZCkgeworICAgIGNhc2UgQ01EX1ZJREVPX0FDQ19BVVRPUlg6CQorICAgIGNhc2UgQ01EX1ZJREVPX0FDQ19BVVRPVFg6CQorCXsKKwkgICAgaW50IG9uID0gKHBqX2Fuc2lfc3RybmljbXAoY3ZhbC0+YXJndlsxXS5wdHIsICJPbiIsIDIpPT0wKTsKKyAgICAgICAJCisJICAgIGlmIChjbWRfaWQgPT0gQ01EX1ZJREVPX0FDQ19BVVRPUlgpCisJCWFjY19jZmcudmlkX2luX2F1dG9fc2hvdyA9IG9uOworCSAgICBlbHNlCisJCWFjY19jZmcudmlkX291dF9hdXRvX3RyYW5zbWl0ID0gb247CisJfQorCWJyZWFrOworICAgIGNhc2UgQ01EX1ZJREVPX0FDQ19DQVBfSUQ6CQkKKyAgICBjYXNlIENNRF9WSURFT19BQ0NfUkVOX0lEOgorCXsKKwkgICAgaW50IGRldiA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSk7CSAgICAJICAgIAorCisJICAgIGlmIChjbWRfaWQgPT0gQ01EX1ZJREVPX0FDQ19DQVBfSUQpCisJCWFjY19jZmcudmlkX2NhcF9kZXYgPSBkZXY7CisJICAgIGVsc2UgCisJCWFjY19jZmcudmlkX3JlbmRfZGV2ID0gZGV2OwkJCisJfQkKKwlicmVhazsKKyAgICB9CisgICAgbW9kaWZ5X3ZpZGVvX2FjY291bnQoJmFjY19jZmcpOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9hZGRfdmlkX3N0cm0oKQoreworICAgIHJldHVybiBwanN1YV9jYWxsX3NldF92aWRfc3RybShjdXJyZW50X2NhbGwsCisJCQkJICAgUEpTVUFfQ0FMTF9WSURfU1RSTV9BREQsIE5VTEwpOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2VuYWJsZV92aWRfcngocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbSBwYXJhbTsgICAgCisgICAgcGpzdWFfc3RyZWFtX2luZm8gc2k7ICAgIAorICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgcGpfYm9vbF90IG9uID0gKHBqX2Fuc2lfc3RybmljbXAoY3ZhbC0+YXJndlsxXS5wdHIsICJPbiIsIDIpID09IDApOworCisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbV9kZWZhdWx0KCZwYXJhbSk7ICAgIAorCisgICAgcGFyYW0ubWVkX2lkeCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsyXSk7IAorICAgIGlmIChwanN1YV9jYWxsX2dldF9zdHJlYW1faW5mbyhjdXJyZW50X2NhbGwsIHBhcmFtLm1lZF9pZHgsICZzaSkgfHwKKwlzaS50eXBlICE9IFBKTUVESUFfVFlQRV9WSURFTykKKyAgICB7CisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgUEpfRUlOVkFMLCAiSW52YWxpZCBzdHJlYW0iKSk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAob24pIHBhcmFtLmRpciA9IChzaS5pbmZvLnZpZC5kaXIgfCBQSk1FRElBX0RJUl9ERUNPRElORyk7CisgICAgZWxzZSBwYXJhbS5kaXIgPSAoc2kuaW5mby52aWQuZGlyICYgUEpNRURJQV9ESVJfRU5DT0RJTkcpOworCisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZXRfdmlkX3N0cm0oY3VycmVudF9jYWxsLAorCQkJCSAgICAgUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfRElSLAorCQkJCSAgICAgJnBhcmFtKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2VuYWJsZV92aWRfdHgocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbSBwYXJhbTsgICAgCisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKyAgICBwal9ib29sX3Qgb24gPSAocGpfYW5zaV9zdHJuaWNtcChjdmFsLT5hcmd2WzFdLnB0ciwgIk9uIiwgMikgPT0gMCk7ICAgIAorICAgIAorICAgIHBqc3VhX2NhbGxfdmlkX3N0cm1fb3Agb3AgPSBvbj8gUEpTVUFfQ0FMTF9WSURfU1RSTV9TVEFSVF9UUkFOU01JVCA6CisJCQkJUEpTVUFfQ0FMTF9WSURfU1RSTV9TVE9QX1RSQU5TTUlUOworCisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgCisgICAgcGFyYW0ubWVkX2lkeCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsyXSk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NldF92aWRfc3RybShjdXJyZW50X2NhbGwsIG9wLCAmcGFyYW0pOyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2VuYWJsZV92aWRfc3RyZWFtKHBqX2NsaV9jbWRfdmFsICpjdmFsLCAKKwkJCQkJICAgcGpfYm9vbF90IGVuYWJsZSkKK3sgICAgCisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbSBwYXJhbTsgICAgCisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcCBvcCA9IGVuYWJsZT8gUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfRElSIDoKKwkJCQlQSlNVQV9DQUxMX1ZJRF9TVFJNX1JFTU9WRTsKKworICAgIHBqc3VhX2NhbGxfdmlkX3N0cm1fb3BfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworCisgICAgcGFyYW0ubWVkX2lkeCA9IGN2YWwtPmFyZ2MgPiAxID8gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzFdKSA6IC0xOworICAgIHBhcmFtLmRpciA9IFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HOworICAgIHJldHVybiBwanN1YV9jYWxsX3NldF92aWRfc3RybShjdXJyZW50X2NhbGwsIG9wLCAmcGFyYW0pOyAgICAKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9zZXRfY2FwX2Rldl9pZChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBwanN1YV9jYWxsX3ZpZF9zdHJtX29wX3BhcmFtIHBhcmFtOworCisgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcF9wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGFyYW0ubWVkX2lkeCA9IGN2YWwtPmFyZ2MgPiAxPyBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMV0pIDogLTE7CisgICAgcGFyYW0uY2FwX2RldiA9IGN2YWwtPmFyZ2MgPiAyPyBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pIDogCisJCQkJICAgIFBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVY7CisKKyAgICByZXR1cm4gcGpzdWFfY2FsbF9zZXRfdmlkX3N0cm0oY3VycmVudF9jYWxsLAorCQkJCSAgIFBKU1VBX0NBTExfVklEX1NUUk1fQ0hBTkdFX0NBUF9ERVYsCisJCQkJICAgJnBhcmFtKTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9saXN0X3ZpZF9kZXYoKQoreworICAgIHZpZF9saXN0X2RldnMoKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF92aWRfZGV2aWNlX3JlZnJlc2goKQoreworICAgIHBqbWVkaWFfdmlkX2Rldl9yZWZyZXNoKCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdmlkX2RldmljZV9wcmV2aWV3KHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAgICAgCisgICAgaW50IGRldl9pZCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsyXSk7ICAgIAorICAgIHBqX2Jvb2xfdCBvbiA9IChwal9hbnNpX3N0cm5pY21wKGN2YWwtPmFyZ3ZbMV0ucHRyLCAiT24iLCAyKSA9PSAwKTsgICAgICAgICAgCisKKyAgICBpZiAob24pIHsKKwlwanN1YV92aWRfcHJldmlld19wYXJhbSBwYXJhbTsKKworCXBqc3VhX3ZpZF9wcmV2aWV3X3BhcmFtX2RlZmF1bHQoJnBhcmFtKTsKKwlwYXJhbS53bmRfZmxhZ3MgPSBQSk1FRElBX1ZJRF9ERVZfV05EX0JPUkRFUiB8CisJICAgIFBKTUVESUFfVklEX0RFVl9XTkRfUkVTSVpBQkxFOworCXBqc3VhX3ZpZF9wcmV2aWV3X3N0YXJ0KGRldl9pZCwgJnBhcmFtKTsKKwlhcnJhbmdlX3dpbmRvdyhwanN1YV92aWRfcHJldmlld19nZXRfd2luKGRldl9pZCkpOworICAgIH0gZWxzZSB7CisJcGpzdWFfdmlkX3dpbl9pZCB3aWQ7CisJd2lkID0gcGpzdWFfdmlkX3ByZXZpZXdfZ2V0X3dpbihkZXZfaWQpOworCWlmICh3aWQgIT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCSAgICAvKiBQcmV2aWV3IHdpbmRvdyBoaWRpbmcgb25jZSBpdCBpcyBzdG9wcGVkIGlzCisJICAgICogcmVzcG9uc2liaWxpdHkgb2YgYXBwICovCisJICAgIHBqc3VhX3ZpZF93aW5fc2V0X3Nob3cod2lkLCBQSl9GQUxTRSk7CisJICAgIHBqc3VhX3ZpZF9wcmV2aWV3X3N0b3AoZGV2X2lkKTsKKwl9CisgICAgfSAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF92aWRfY29kZWNfbGlzdCgpCit7ICAgIAorICAgIHBqc3VhX2NvZGVjX2luZm8gY2lbUEpNRURJQV9DT0RFQ19NR1JfTUFYX0NPREVDU107CisgICAgdW5zaWduZWQgY291bnQgPSBQSl9BUlJBWV9TSVpFKGNpKTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBwanN1YV92aWRfZW51bV9jb2RlY3MoY2ksICZjb3VudCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiRXJyb3IgZW51bWVyYXRpbmcgY29kZWNzIikpOworICAgIH0gZWxzZSB7CisJdW5zaWduZWQgaTsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiRm91bmQgJWQgdmlkZW8gY29kZWNzOiIsIGNvdW50KSk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgImNvZGVjIGlkICAgICAgcHJpbyAgZnBzICAgIGJ3KGticHMpICAgc2l6ZSIpKTsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikpOworCWZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwkgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gY3A7CisJICAgIHBqbWVkaWFfdmlkZW9fZm9ybWF0X2RldGFpbCAqdmZkOworCisJICAgIHN0YXR1cyA9IHBqc3VhX3ZpZF9jb2RlY19nZXRfcGFyYW0oJmNpW2ldLmNvZGVjX2lkLCAmY3ApOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJICAgIHZmZCA9IHBqbWVkaWFfZm9ybWF0X2dldF92aWRlb19mb3JtYXRfZGV0YWlsKCZjcC5lbmNfZm10LAorCQlQSl9UUlVFKTsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiUuKnMlLipzICUzZCAlNy4yZiAgJTRkLyU0ZCAgJWR4JWQiLCAKKwkJKGludCljaVtpXS5jb2RlY19pZC5zbGVuLCBjaVtpXS5jb2RlY19pZC5wdHIsCisJCTEzLShpbnQpY2lbaV0uY29kZWNfaWQuc2xlbiwgIiAgICAgICAgICAgICAgICAiLAorCQljaVtpXS5wcmlvcml0eSwKKwkJKHZmZC0+ZnBzLm51bSoxLjAvdmZkLT5mcHMuZGVudW0pLAorCQl2ZmQtPmF2Z19icHMvMTAwMCwgdmZkLT5tYXhfYnBzLzEwMDAsCisJCXZmZC0+c2l6ZS53LCB2ZmQtPnNpemUuaCkpOworCX0KKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2V0X3ZpZF9jb2RlY19wcmlvKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreyAgICAKKyAgICBpbnQgcHJpbyA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsyXSk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAKKyAgICBzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfc2V0X3ByaW9yaXR5KCZjdmFsLT5hcmd2WzFdLCAocGpfdWludDhfdClwcmlvKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiU2V0IGNvZGVjIHByaW9yaXR5IGVycm9yIikpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2V0X3ZpZF9jb2RlY19mcHMocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7ICAgIAorICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOworICAgIGludCBNLCBOOyAgICAKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBNID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzJdKTsKKyAgICBOID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzNdKTsKKyAgICBzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfZ2V0X3BhcmFtKCZjdmFsLT5hcmd2WzFdLCAmY3ApOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCWNwLmVuY19mbXQuZGV0LnZpZC5mcHMubnVtID0gTTsKKwljcC5lbmNfZm10LmRldC52aWQuZnBzLmRlbnVtID0gTjsKKwlzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfc2V0X3BhcmFtKCZjdmFsLT5hcmd2WzFdLCAmY3ApOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiU2V0IGNvZGVjIGZyYW1lcmF0ZSBlcnJvciIpKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3NldF92aWRfY29kZWNfYml0cmF0ZShwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gY3A7ICAgIAorICAgIGludCBNLCBOOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIE0gPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pOworICAgIE4gPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbM10pOworICAgIHN0YXR1cyA9IHBqc3VhX3ZpZF9jb2RlY19nZXRfcGFyYW0oJmN2YWwtPmFyZ3ZbMV0sICZjcCk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJY3AuZW5jX2ZtdC5kZXQudmlkLmF2Z19icHMgPSBNICogMTAwMDsKKwljcC5lbmNfZm10LmRldC52aWQubWF4X2JwcyA9IE4gKiAxMDAwOworCXN0YXR1cyA9IHBqc3VhX3ZpZF9jb2RlY19zZXRfcGFyYW0oJmN2YWwtPmFyZ3ZbMV0sICZjcCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJTZXQgY29kZWMgYml0cmF0ZSBlcnJvciIpKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2V0X3ZpZF9jb2RlY19zaXplKHBqX2NsaV9jbWRfdmFsICpjdmFsKQoreworICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOyAgICAKKyAgICBpbnQgTSwgTjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBNID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzJdKTsKKyAgICBOID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzNdKTsKKyAgICBzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfZ2V0X3BhcmFtKCZjdmFsLT5hcmd2WzFdLCAmY3ApOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCWNwLmVuY19mbXQuZGV0LnZpZC5zaXplLncgPSBNOworCWNwLmVuY19mbXQuZGV0LnZpZC5zaXplLmggPSBOOworCXN0YXR1cyA9IHBqc3VhX3ZpZF9jb2RlY19zZXRfcGFyYW0oJmN2YWwtPmFyZ3ZbMV0sICZjcCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJTZXQgY29kZWMgc2l6ZSBlcnJvciIpKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdmlkX3dpbl9saXN0KCkKK3sKKyAgICBwanN1YV92aWRfd2luX2lkIHdpZHNbUEpTVUFfTUFYX1ZJRF9XSU5TXTsKKyAgICB1bnNpZ25lZCBpLCBjbnQgPSBQSl9BUlJBWV9TSVpFKHdpZHMpOworCisgICAgcGpzdWFfdmlkX2VudW1fd2lucyh3aWRzLCAmY250KTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJGb3VuZCAlZCB2aWRlbyB3aW5kb3dzOiIsIGNudCkpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJXSUQgc2hvdyAgICBwb3MgICAgICAgc2l6ZSIpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikpOworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7ICsraSkgeworCXBqc3VhX3ZpZF93aW5faW5mbyB3aTsKKwlwanN1YV92aWRfd2luX2dldF9pbmZvKHdpZHNbaV0sICZ3aSk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiUzZCAgICVjICAoJWQsJWQpICAlZHglZCIsCisJICAgIHdpZHNbaV0sICh3aS5zaG93PydZJzonTicpLCB3aS5wb3MueCwgd2kucG9zLnksCisJICAgIHdpLnNpemUudywgd2kuc2l6ZS5oKSk7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX2FycmFuZ2VfdmlkX3dpbigpCit7CisgICAgYXJyYW5nZV93aW5kb3coUEpTVUFfSU5WQUxJRF9JRCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2hvd192aWRfd2luKHBqX2NsaV9jbWRfdmFsICpjdmFsLCBwal9ib29sX3Qgc2hvdykKK3sgICAgICAgICAgICAKKyAgICBwanN1YV92aWRfd2luX2lkIHdpZCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlsxXSk7CisgICAgcmV0dXJuIHBqc3VhX3ZpZF93aW5fc2V0X3Nob3cod2lkLCBzaG93KTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9tb3ZlX3ZpZF93aW4ocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpzdWFfdmlkX3dpbl9pZCB3aWQgPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMV0pOworICAgIHBqbWVkaWFfY29vcmQgcG9zOworCisgICAgcG9zLnggPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pOworICAgIHBvcy55ID0gcGpfc3RydG9sKCZjdmFsLT5hcmd2WzNdKTsKKyAgICByZXR1cm4gcGpzdWFfdmlkX3dpbl9zZXRfcG9zKHdpZCwgJnBvcyk7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfcmVzaXplX3ZpZF93aW4ocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpzdWFfdmlkX3dpbl9pZCB3aWQgPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMV0pOworICAgIHBqbWVkaWFfcmVjdF9zaXplIHNpemU7CisKKyAgICBzaXplLncgPSBwal9zdHJ0b2woJmN2YWwtPmFyZ3ZbMl0pOworICAgIHNpemUuaCA9IHBqX3N0cnRvbCgmY3ZhbC0+YXJndlszXSk7CisgICAgcmV0dXJuIHBqc3VhX3ZpZF93aW5fc2V0X3NpemUod2lkLCAmc2l6ZSk7Cit9CisKKy8qIFZpZGVvIGhhbmRsZXIgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfdmlkZW9faGFuZGxlcihwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKyAgICBwal9jbGlfY21kX2lkIGNtZF9pZCA9IHBqX2NsaV9nZXRfY21kX2lkKGN2YWwtPmNtZCk7ICAgIAorCisgICAgQ0hFQ0tfUEpTVUFfUlVOTklORygpOworCisgICAgc3dpdGNoKGNtZF9pZCkgeworICAgIGNhc2UgQ01EX1ZJREVPX0VOQUJMRToKKwlzdGF0dXMgPSBjbWRfc2V0X3ZpZGVvX2VuYWJsZShQSl9UUlVFKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19ESVNBQkxFOgorCXN0YXR1cyA9IGNtZF9zZXRfdmlkZW9fZW5hYmxlKFBKX0ZBTFNFKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19BQ0NfU0hPVzoKKwlzdGF0dXMgPSBjbWRfc2hvd19hY2NvdW50X3ZpZGVvKCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQUNDX0FVVE9SWDoKKyAgICBjYXNlIENNRF9WSURFT19BQ0NfQVVUT1RYOgorICAgIGNhc2UgQ01EX1ZJREVPX0FDQ19DQVBfSUQ6CisgICAgY2FzZSBDTURfVklERU9fQUNDX1JFTl9JRDoKKwlzdGF0dXMgPSBjbWRfdmlkZW9fYWNjX2hhbmRsZXIoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQ0FMTF9BREQ6CisJc3RhdHVzID0gY21kX2FkZF92aWRfc3RybSgpOworCWJyZWFrOworICAgIGNhc2UgQ01EX1ZJREVPX0NBTExfUlg6CisJc3RhdHVzID0gY21kX2VuYWJsZV92aWRfcngoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQ0FMTF9UWDoKKwlzdGF0dXMgPSBjbWRfZW5hYmxlX3ZpZF90eChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19DQUxMX0VOQUJMRToKKyAgICBjYXNlIENNRF9WSURFT19DQUxMX0RJU0FCTEU6CisJc3RhdHVzID0gY21kX2VuYWJsZV92aWRfc3RyZWFtKGN2YWwsIChjbWRfaWQ9PUNNRF9WSURFT19DQUxMX0VOQUJMRSkpOworCWJyZWFrOworICAgIGNhc2UgQ01EX1ZJREVPX0NBTExfQ0FQOgorCXN0YXR1cyA9IGNtZF9zZXRfY2FwX2Rldl9pZChjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19ERVZJQ0VfTElTVDoKKwlzdGF0dXMgPSBjbWRfbGlzdF92aWRfZGV2KCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fREVWSUNFX1JFRlJFU0g6CisJc3RhdHVzID0gY21kX3ZpZF9kZXZpY2VfcmVmcmVzaCgpOworCWJyZWFrOworICAgIGNhc2UgQ01EX1ZJREVPX0RFVklDRV9QUkVWSUVXOgorCXN0YXR1cyA9IGNtZF92aWRfZGV2aWNlX3ByZXZpZXcoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQ09ERUNfTElTVDoKKwlzdGF0dXMgPSBjbWRfdmlkX2NvZGVjX2xpc3QoKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19DT0RFQ19QUklPOgorCXN0YXR1cyA9IGNtZF9zZXRfdmlkX2NvZGVjX3ByaW8oY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQ09ERUNfRlBTOgorCXN0YXR1cyA9IGNtZF9zZXRfdmlkX2NvZGVjX2ZwcyhjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19DT0RFQ19CSVRSQVRFOgorCXN0YXR1cyA9IGNtZF9zZXRfdmlkX2NvZGVjX2JpdHJhdGUoY3ZhbCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fQ09ERUNfU0laRToKKwlzdGF0dXMgPSBjbWRfc2V0X3ZpZF9jb2RlY19zaXplKGN2YWwpOworCWJyZWFrOworICAgIGNhc2UgQ01EX1ZJREVPX1dJTl9MSVNUOgorCXN0YXR1cyA9IGNtZF92aWRfd2luX2xpc3QoKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19XSU5fQVJSQU5HRToKKwlzdGF0dXMgPSBjbWRfYXJyYW5nZV92aWRfd2luKCk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fV0lOX1NIT1c6CQorICAgIGNhc2UgQ01EX1ZJREVPX1dJTl9ISURFOgorCXN0YXR1cyA9IGNtZF9zaG93X3ZpZF93aW4oY3ZhbCwgKGNtZF9pZD09Q01EX1ZJREVPX1dJTl9TSE9XKSk7CisJYnJlYWs7CisgICAgY2FzZSBDTURfVklERU9fV0lOX01PVkU6CisJc3RhdHVzID0gY21kX21vdmVfdmlkX3dpbihjdmFsKTsKKwlicmVhazsKKyAgICBjYXNlIENNRF9WSURFT19XSU5fUkVTSVpFOgorCXN0YXR1cyA9IGNtZF9yZXNpemVfdmlkX3dpbihjdmFsKTsKKwlicmVhazsKKyAgICB9ICAgIAorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKiBPdGhlciBjb21tYW5kIGhhbmRsZXIgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjbWRfc2xlZXBfaGFuZGxlcihwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sgICAgCisgICAgaW50IGRlbGF5OworCisgICAgZGVsYXkgPSBwal9zdHJ0b3VsKCZjdmFsLT5hcmd2WzFdKTsKKyAgICBpZiAoZGVsYXkgPCAwKSBkZWxheSA9IDA7CisgICAgcGpfdGhyZWFkX3NsZWVwKGRlbGF5KTsgICAgCisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9uZXR3b3JrX2hhbmRsZXIocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKyAgICBQSl9VTlVTRURfQVJHKGN2YWwpOworCisgICAgQ0hFQ0tfUEpTVUFfUlVOTklORygpOworICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX2RldGVjdF9uYXRfdHlwZSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGNtZF9xdWl0X2hhbmRsZXIocGpfY2xpX2NtZF92YWwgKmN2YWwpCit7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlF1aXR0aW5nIGFwcC4uIikpOworICAgIHBqX2NsaV9xdWl0KGN2YWwtPnNlc3MtPmZlLT5jbGksIGN2YWwtPnNlc3MsIFBKX0ZBTFNFKTsKKworICAgIC8qIEludm9rZSBDTEkgc3RvcCBjYWxsYmFjayAoZGVmaW5lZCBpbiBwanN1YV9hcHAuYykgKi8KKyAgICBjbGlfb25fc3RvcHBlZChQSl9GQUxTRSwgMCwgTlVMTCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogCisgKiBTeW50YXggZXJyb3IgaGFuZGxlciBmb3IgcGFyc2VyLiAKKyAqLworc3RhdGljIHZvaWQgb25fc3ludGF4X2Vycm9yKHBqX3NjYW5uZXIgKnNjYW5uZXIpCit7CisgICAgUEpfVU5VU0VEX0FSRyhzY2FubmVyKTsKKyAgICBQSl9USFJPVyhQSl9FSU5WQUwpOworfQorCisvKiAKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcGFyc2UgYnVmZmVyIHN0cmluZyBpbmZvIGFycmF5IG9mIGFyZ3VtZW50IHN0cmluZworICogQGFyZ2MgT24gaW5wdXQsIG1heGltdW0gYXJyYXkgc2l6ZSBvZiBhcmd1bWVudC4gT24gb3V0cHV0LCBudW1iZXIgb2YgYXJndW1lbnQgCisgKiBwYXJzZWQKKyAqIEBhcmd2IEFycmF5IG9mIGFyZ3VtZW50IHN0cmluZworICovCitzdGF0aWMgcGpfc3RhdHVzX3QgZ2V0X29wdGlvbnMocGpfc3RyX3QgKm9wdGlvbnMsIHVuc2lnbmVkICphcmdjLAorCQkJICAgICAgIHBqX3N0cl90IGFyZ3ZbXSkKK3sKKyAgICBwal9zY2FubmVyIHNjYW5uZXI7CisgICAgdW5zaWduZWQgbWF4X2FyZ2MgPSAqYXJnYzsKKyAgICAKKyAgICBQSl9VU0VfRVhDRVBUSU9OOworCisgICAgaWYgKCFvcHRpb25zKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgcGpfc2Nhbl9pbml0KCZzY2FubmVyLCBvcHRpb25zLT5wdHIsIG9wdGlvbnMtPnNsZW4sIFBKX1NDQU5fQVVUT1NLSVBfV1MsIAorCQkgJm9uX3N5bnRheF9lcnJvcik7CisgICAgUEpfVFJZIHsKKwkqYXJnYyA9IDA7CisJd2hpbGUgKCFwal9zY2FuX2lzX2VvZigmc2Nhbm5lcikgJiYgKG1heF9hcmdjID4gKmFyZ2MpKSB7CisJICAgIHBqX3N0cl90IHN0cjsKKwkgICAgCisJICAgIHBqX3NjYW5fZ2V0X3VudGlsX2Nocigmc2Nhbm5lciwgIiBcdFxyXG4iLCAmc3RyKTsKKwkgICAgYXJndlsqYXJnY10gPSBzdHI7CisJICAgICsrKCphcmdjKTsKKwl9CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJcGpfc2Nhbl9maW5pKCZzY2FubmVyKTsJCisJcmV0dXJuIFBKX0dFVF9FWENFUFRJT04oKTsKKyAgICB9CisgICAgUEpfRU5EOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY21kX3Jlc3RhcnRfaGFuZGxlcihwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBlbnVtIHsgTUFYX0FSR0MgPSA2NCB9OworICAgIGludCBpOworICAgIHVuc2lnbmVkIGFyZ2MgPSAxOworICAgIHN0YXRpYyBjaGFyIGFyZ3ZfYnVmZmVyW1BKX0NMSV9NQVhfQ01EQlVGXTsKKyAgICBzdGF0aWMgY2hhciAqYXJndltNQVhfQVJHQ10gPSB7TlVMTH07CisgICAgY2hhciAqcGJ1ZiA9IGFyZ3ZfYnVmZmVyOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJlc3RhcnRpbmcgYXBwLi4iKSk7CisgICAgcGpfY2xpX3F1aXQoY3ZhbC0+c2Vzcy0+ZmUtPmNsaSwgY3ZhbC0+c2VzcywgUEpfVFJVRSk7CisKKyAgICAvKiogR2V0IHRoZSBwanN1YSBvcHRpb24gKiovICAgICAgIAorICAgIGZvciAoaT0xOyBpIDwgY3ZhbC0+YXJnYzsgaSsrKSB7CisJcGpfc3RyX3QgYXJndnN0W01BWF9BUkdDXTsKKwl1bnNpZ25lZCBqLCBhYzsKKworCWFjID0gTUFYX0FSR0MgLSBhcmdjOworCWdldF9vcHRpb25zKCZjdmFsLT5hcmd2W2ldLCAmYWMsIGFyZ3ZzdCk7CisJZm9yIChqID0gMDsgaiA8IGFjOyBqKyspIHsKKwkgICAgcGpfYW5zaV9zdHJuY3B5KHBidWYsIGFyZ3ZzdFtqXS5wdHIsIGFyZ3ZzdFtqXS5zbGVuKTsKKwkgICAgcGJ1Zlthcmd2c3Rbal0uc2xlbl0gPSAnXDAnOworCSAgICBhcmd2W2FyZ2MgKyBqXSA9IHBidWY7CisJICAgIHBidWYgKz0gYXJndnN0W2pdLnNsZW4gKyAxOworCX0KKwlhcmdjICs9IGFjOworICAgIH0KKworICAgIC8qIEludm9rZSBDTEkgc3RvcCBjYWxsYmFjayAoZGVmaW5lZCBpbiBwanN1YV9hcHAuYykgKi8KKyAgICBjbGlfb25fc3RvcHBlZChQSl9UUlVFLCBhcmdjLCAoY2hhcioqKWFyZ3YpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhZGRfY2FsbF9jb21tYW5kKHBqX2NsaV90ICpjbGkpCit7ICAKKyAgICBjaGFyKiBjYWxsX2NvbW1hbmQgPSAKKwkiPENNRCBuYW1lPSdjYWxsJyBpZD0nMTAwJyBkZXNjPSdDYWxsIHJlbGF0ZWQgY29tbWFuZHMnPiIKKwkiICA8Q01EIG5hbWU9J25ldycgaWQ9JzEwMDEnIGRlc2M9J01ha2UgYSBuZXcgY2FsbC9JTlZJVEUnPiIKKwkiICAgIDxBUkcgbmFtZT0nYnVkZHlfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDEnIHZhbGlkYXRlPScwJyAiCisJIiAgICAgZGVzYz0nQnVkZHkgSWQnPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nLTEnIGRlc2M9J0FsbCBidWRkaWVzJy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScwJyBkZXNjPSdDdXJyZW50IGRpYWxvZycvPiIKKwkiICAgIDwvQVJHPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdtdWx0aScgaWQ9JzEwMDInIGRlc2M9J01ha2UgbXVsdGlwbGUgY2FsbHMnPiIKKwkiICAgIDxBUkcgbmFtZT0nbnVtYmVyX29mX2NhbGxzJyB0eXBlPSdpbnQnIGRlc2M9J051bWJlciBvZiBjYWxscycvPiIKKwkiICAgIDxBUkcgbmFtZT0nYnVkZHlfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDEnIHZhbGlkYXRlPScwJyAiCisJIiAgICAgZGVzYz0nQnVkZHkgSWQnPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nLTEnIGRlc2M9J0FsbCBidWRkaWVzJy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScwJyBkZXNjPSdDdXJyZW50IGRpYWxvZycvPiIKKwkiICAgIDwvQVJHPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdhbnN3ZXInIGlkPScxMDAzJyBkZXNjPSdBbnN3ZXIgY2FsbCc+IgorCSIgICAgPEFSRyBuYW1lPSdjb2RlJyB0eXBlPSdpbnQnIGRlc2M9J0Fuc3dlciBjb2RlJy8+IgorCSIgICAgPEFSRyBuYW1lPSduZXdfdXJsJyB0eXBlPSdzdHJpbmcnIG9wdGlvbmFsPScxJyAiCisJIiAgICAgZGVzYz0nTmV3IFVSTChmb3IgM3h4IHJlc3ApJy8+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J2hhbmd1cCcgaWQ9JzEwMDQnIHNjPSdnJyBkZXNjPSdIYW5ndXAgY2FsbCcvPiIKKwkiICA8Q01EIG5hbWU9J2hhbmd1cF9hbGwnIGlkPScxMDA1JyBzYz0naEEnIGRlc2M9J0hhbmd1cCBhbGwgY2FsbCcvPiIKKwkiICA8Q01EIG5hbWU9J2hvbGQnIGlkPScxMDA2JyBzYz0nSCcgZGVzYz0nSG9sZCBjYWxsJy8+IgorCSIgIDxDTUQgbmFtZT0ncmVpbnZpdGUnIGlkPScxMDA3JyBzYz0ndicgIgorCSIgICBkZXNjPSdSZS1pbnZpdGUgKHJlbGVhc2UgaG9sZCknLz4iCisJIiAgPENNRCBuYW1lPSd1cGRhdGUnIGlkPScxMDA4JyBzYz0nVScgZGVzYz0nU2VuZCBVcGRhdGUgcmVxdWVzdCcvPiIKKwkiICA8Q01EIG5hbWU9J25leHQnIGlkPScxMDA5JyBzYz0nXScgZGVzYz0nU2VsZWN0IG5leHQgY2FsbCcvPiIKKwkiICA8Q01EIG5hbWU9J3ByZXZpb3VzJyBpZD0nMTAxMCcgc2M9J1snIGRlc2M9J1NlbGVjdCBwcmV2aW91cyBjYWxsJy8+IgorCSIgIDxDTUQgbmFtZT0ndHJhbnNmZXInIGlkPScxMDExJyBzYz0neCcgZGVzYz0nVHJhbnNmZXIgY2FsbCc+IgorCSIgICAgPEFSRyBuYW1lPSdidWRkeV9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwMScgdmFsaWRhdGU9JzAnICIKKwkiICAgICBkZXNjPSdCdWRkeSBJZCc+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPSctMScgZGVzYz0nQWxsIGJ1ZGRpZXMnLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzAnIGRlc2M9J0N1cnJlbnQgZGlhbG9nJy8+IgorCSIgICAgPC9BUkc+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J3RyYW5zZmVyX3JlcGxhY2VzJyBpZD0nMTAxMicgc2M9J1gnICIKKwkiICAgZGVzYz0nVHJhbnNmZXIgcmVwbGFjZSBjYWxsJz4iCisJIiAgICA8QVJHIG5hbWU9J2NhbGxfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MTEnIGRlc2M9J0NhbGwgSWQnLz4iCQorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J3JlZGlyZWN0JyBpZD0nMTAxMycgc2M9J1InIGRlc2M9J1JlZGlyZWN0IGNhbGwnPiIKKwkiICAgIDxBUkcgbmFtZT0ncmVkaXJlY3Rfb3B0aW9uJyB0eXBlPSdjaG9pY2UnIGRlc2M9J1JlZGlyZWN0IG9wdGlvbic+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScwJyBkZXNjPSdSZWRpcmVjdCBhY2NlcHQgcmVwbGFjZScvPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nMScgZGVzYz0nUmVkaXJlY3QgYWNjZXB0Jy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScyJyBkZXNjPSdSZWRpcmVjdCByZWplY3QnLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzMnIGRlc2M9J1JlZGlyZWN0IHN0b3AnLz4iCisJIiAgICA8L0FSRz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0nZF8yODMzJyBpZD0nMTAxNCcgc2M9JyMnIGRlc2M9J1NlbmQgRFRNRiAoUkZDIDI4MzMpJz4iCisJIiAgICA8QVJHIG5hbWU9J2R0bWZfdG9fc2VuZCcgdHlwZT0nc3RyaW5nJyAiCisJIiAgICAgZGVzYz0nRFRNRiBTdHJpbmcgdG8gc2VuZCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdkX2luZm8nIGlkPScxMDE1JyBzYz0nKicgZGVzYz0nU2VuZCBEVE1GIHdpdGggU0lQIElORk8nPiIKKwkiICAgIDxBUkcgbmFtZT0nZHRtZl90b19zZW5kJyB0eXBlPSdzdHJpbmcnICIKKwkiICAgICBkZXNjPSdEVE1GIFN0cmluZyB0byBzZW5kJy8+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J2R1bXBfcScgaWQ9JzEwMTYnIHNjPSdkcScgZGVzYz0nRHVtcCAoY2FsbCkgcXVhbGl0eScvPiIKKwkiICA8Q01EIG5hbWU9J3NlbmRfYXJiJyBpZD0nMTAxNycgc2M9J1MnIGRlc2M9J1NlbmQgYXJiaXRyYXJ5IHJlcXVlc3QnPiIKKwkiICAgIDxBUkcgbmFtZT0ncmVxdWVzdF9tZXRob2QnIHR5cGU9J3N0cmluZycgZGVzYz0nUmVxdWVzdCBtZXRob2QnLz4iCisJIiAgICA8QVJHIG5hbWU9J2J1ZGR5X2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAxJyB2YWxpZGF0ZT0nMCcgIgorCSIgICAgIGRlc2M9J0J1ZGR5IElkJz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9Jy0xJyBkZXNjPSdBbGwgYnVkZGllcycvPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nMCcgZGVzYz0nQ3VycmVudCBkaWFsb2cnLz4iCisJIiAgICA8L0FSRz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0nbGlzdCcgaWQ9JzEwMTgnIGRlc2M9J1Nob3cgY3VycmVudCBjYWxsJy8+IgorCSI8L0NNRD4iOworCisgICAgcGpfc3RyX3QgeG1sID0gcGpfc3RyKGNhbGxfY29tbWFuZCk7CisgICAgcmV0dXJuIHBqX2NsaV9hZGRfY21kX2Zyb21feG1sKGNsaSwgTlVMTCwgCisJCQkJICAgJnhtbCwgY21kX2NhbGxfaGFuZGxlciwKKwkJCQkgICBOVUxMLCBnZXRfY2hvaWNlX3ZhbHVlKTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFkZF9wcmVzZW5jZV9jb21tYW5kKHBqX2NsaV90ICpjbGkpCit7CisgICAgY2hhciogcHJlc2VuY2VfY29tbWFuZCA9CisJIjxDTUQgbmFtZT0naW0nIGlkPScyMDAnIGRlc2M9J0lNIGFuZCBQcmVzZW5jZSBDb21tYW5kcyc+IgorCSIgIDxDTUQgbmFtZT0nYWRkX2InIGlkPScyMDAxJyBzYz0nK2InIGRlc2M9J0FkZCBidWRkeSc+IgorCSIgICAgPEFSRyBuYW1lPSdidWRkeV91cmknIHR5cGU9J3N0cmluZycgZGVzYz0nQnVkZHkgVVJJJy8+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J2RlbF9iJyBpZD0nMjAwMicgc2M9Jy1iJyBkZXNjPSdEZWxldGUgYnVkZHknPiIKKwkiICAgIDxBUkcgbmFtZT0nYWRkZWRfYnVkZHlfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MTInICIKKwkiICAgICBkZXNjPSdCdWRkeSBJRCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdzZW5kX2ltJyBpZD0nMjAwMycgc2M9J2knIGRlc2M9J1NlbmQgSU0nPiIKKwkiICAgIDxBUkcgbmFtZT0nYnVkZHlfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDEnIHZhbGlkYXRlPScwJyAiCisJIiAgICAgZGVzYz0nQnVkZHkgSWQnPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nLTEnIGRlc2M9J0FsbCBidWRkaWVzJy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScwJyBkZXNjPSdDdXJyZW50IGRpYWxvZycvPiIKKwkiICAgIDwvQVJHPiIKKwkiICAgIDxBUkcgbmFtZT0nbWVzc2FnZV9jb250ZW50JyB0eXBlPSdzdHJpbmcnIGRlc2M9J01lc3NhZ2UgQ29udGVudCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdzdWJfcHJlJyBpZD0nMjAwNCcgZGVzYz0nU3Vic2NyaWJlIHByZXNlbmNlJz4iCisJIiAgICA8QVJHIG5hbWU9J2J1ZGR5X2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAxJyB2YWxpZGF0ZT0nMCcgIgorCSIgICAgIGRlc2M9J0J1ZGR5IElkJz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9Jy0xJyBkZXNjPSdBbGwgYnVkZGllcycvPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nMCcgZGVzYz0nQ3VycmVudCBkaWFsb2cnLz4iCisJIiAgICA8L0FSRz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0ndW5zdWJfcHJlJyBpZD0nMjAwNScgZGVzYz0nVW5zdWJzY3JpYmUgUHJlc2VuY2UnPiIKKwkiICAgIDxBUkcgbmFtZT0nYnVkZHlfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDEnIHZhbGlkYXRlPScwJyAiCisJIiAgICAgZGVzYz0nQnVkZHkgSWQnPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nLTEnIGRlc2M9J0FsbCBidWRkaWVzJy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScwJyBkZXNjPSdDdXJyZW50IGRpYWxvZycvPiIKKwkiICAgIDwvQVJHPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSd0b2dfc3RhdGUnIGlkPScyMDA2JyBkZXNjPSdUb2dnbGUgb25saW5lIHN0YXRlJy8+IgorCSIgIDxDTUQgbmFtZT0ncHJlX3RleHQnIGlkPScyMDA3JyBzYz0nVCcgIgorCSIgICBkZXNjPSdTcGVjaWZ5IGN1c3RvbSBwcmVzZW5jZSB0ZXh0Jz4iCisJIiAgICA8QVJHIG5hbWU9J29ubGluZV9zdGF0ZScgdHlwZT0nY2hvaWNlJyBkZXNjPSdPbmxpbmUgc3RhdGUnPiIKKwkiICAgICAgPENIT0lDRSB2YWx1ZT0nMScgZGVzYz0nQXZhaWxhYmxlJy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPScyJyBkZXNjPSdCdXN5Jy8+IgorCSIgICAgICA8Q0hPSUNFIHZhbHVlPSczJyBkZXNjPSdPbiBUaGUgUGhvbmUnLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzQnIGRlc2M9J0lkbGUnLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzUnIGRlc2M9J0F3YXknLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzYnIGRlc2M9J0JlIFJpZ2h0IEJhY2snLz4iCisJIiAgICAgIDxDSE9JQ0UgdmFsdWU9JzcnIGRlc2M9J09mZmxpbmUnLz4iCisJIiAgICA8L0FSRz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0nYnVkX2xpc3QnIGlkPScyMDA4JyBzYz0nYmwnIGRlc2M9J1Nob3cgYnVkZHkgbGlzdCcvPiIKKwkiPC9DTUQ+IjsKKworICAgIHBqX3N0cl90IHhtbCA9IHBqX3N0cihwcmVzZW5jZV9jb21tYW5kKTsKKworICAgIHJldHVybiBwal9jbGlfYWRkX2NtZF9mcm9tX3htbChjbGksIE5VTEwsIAorCQkJCSAgICZ4bWwsIGNtZF9wcmVzZW5jZV9oYW5kbGVyLCAKKwkJCQkgICBOVUxMLCBnZXRfY2hvaWNlX3ZhbHVlKTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGFkZF9hY2NvdW50X2NvbW1hbmQocGpfY2xpX3QgKmNsaSkKK3sKKyAgICBjaGFyKiBhY2NvdW50X2NvbW1hbmQgPSAKKwkiPENNRCBuYW1lPSdhY2MnIGlkPSczMDAnIGRlc2M9J0FjY291bnQgY29tbWFuZHMnPiIKKwkiICA8Q01EIG5hbWU9J2FkZCcgaWQ9JzMwMDEnIHNjPScrYScgZGVzYz0nQWRkIG5ldyBhY2NvdW50Jz4iCisJIiAgICA8QVJHIG5hbWU9J3NpcF91cmwnIHR5cGU9J3N0cmluZycgZGVzYz0nWW91ciBTSVAgVVJMJy8+IgorCSIgICAgPEFSRyBuYW1lPSdyZWdpc3RyYXJfdXJsJyB0eXBlPSdzdHJpbmcnICIKKwkiICAgICBkZXNjPSdVUkwgb2YgdGhlIHJlZ2lzdHJhcicvPiIKKwkiICAgIDxBUkcgbmFtZT0nYXV0aF9yZWFsbScgdHlwZT0nc3RyaW5nJyBkZXNjPSdBdXRoIHJlYWxtJy8+IgorCSIgICAgPEFSRyBuYW1lPSdhdXRoX3VzZXJuYW1lJyB0eXBlPSdzdHJpbmcnIGRlc2M9J0F1dGggdXNlcm5hbWUnLz4iCisJIiAgICA8QVJHIG5hbWU9J2F1dGhfcGFzc3dvcmQnIHR5cGU9J3N0cmluZycgZGVzYz0nQXV0aCBwYXNzd29yZCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdkZWwnIGlkPSczMDAyJyBzYz0nLWEnIGRlc2M9J0RlbGV0ZSBhY2NvdW50Jz4iCisJIiAgICA8QVJHIG5hbWU9J2FjY291bnRfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDInIGRlc2M9J0FjY291bnQgSWQnLz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0nbW9kJyBpZD0nMzAwMycgc2M9JyFhJyBkZXNjPSdNb2RpZnkgYWNjb3VudCc+IgorCSIgICAgPEFSRyBuYW1lPSdhY2NvdW50X2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAyJyBkZXNjPSdBY2NvdW50IElkJy8+IgorCSIgICAgPEFSRyBuYW1lPSdzaXBfdXJsJyB0eXBlPSdzdHJpbmcnIGRlc2M9J1lvdXIgU0lQIFVSTCcvPiIKKwkiICAgIDxBUkcgbmFtZT0ncmVnaXN0cmFyX3VybCcgdHlwZT0nc3RyaW5nJyAiCisJIiAgICAgZGVzYz0nVVJMIG9mIHRoZSByZWdpc3RyYXInLz4iCisJIiAgICA8QVJHIG5hbWU9J2F1dGhfcmVhbG0nIHR5cGU9J3N0cmluZycgZGVzYz0nQXV0aCByZWFsbScvPiIKKwkiICAgIDxBUkcgbmFtZT0nYXV0aF91c2VybmFtZScgdHlwZT0nc3RyaW5nJyBkZXNjPSdBdXRoIHVzZXJuYW1lJy8+IgorCSIgICAgPEFSRyBuYW1lPSdhdXRoX3Bhc3N3b3JkJyB0eXBlPSdzdHJpbmcnIGRlc2M9J0F1dGggcGFzc3dvcmQnLz4iCisJIiAgPC9DTUQ+IgorCSIgIDxDTUQgbmFtZT0ncmVnJyBpZD0nMzAwNCcgc2M9J3JyJyAiCisJIiAgIGRlc2M9J1NlbmQgKFJlZnJlc2gpIFJlZ2lzdGVyIHJlcXVlc3QgdG8gcmVnaXN0ZXInLz4iCisJIiAgPENNRCBuYW1lPSd1bnJlZycgaWQ9JzMwMDUnIHNjPSdydScgIgorCSIgICBkZXNjPSdTZW5kIFJlZ2lzdGVyIHJlcXVlc3QgdG8gdW5yZWdpc3RlcicvPiIKKwkiICA8Q01EIG5hbWU9J25leHQnIGlkPSczMDA2JyBzYz0nPCcgIgorCSIgICBkZXNjPSdTZWxlY3QgdGhlIG5leHQgYWNjb3VudCBmb3Igc2VuZGluZyBvdXRnb2luZyByZXF1ZXN0cyc+IgorCSIgICAgPEFSRyBuYW1lPSdhY2NvdW50X2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAyJyBkZXNjPSdBY2NvdW50IElkJy8+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J3ByZXYnIGlkPSczMDA3JyBzYz0nPicgIgorCSIgICBkZXNjPSdTZWxlY3QgdGhlIHByZXZpb3VzIGFjY291bnQgZm9yIHNlbmRpbmcgb3V0Z29pbmcgcmVxdWVzdHMnPiIKKwkiICAgIDxBUkcgbmFtZT0nYWNjb3VudF9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwMicgZGVzYz0nQWNjb3VudCBJZCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdzaG93JyBpZD0nMzAwOCcgc2M9J2wnIGRlc2M9J1Nob3cgYWNjb3VudCBsaXN0Jy8+IgorCSI8L0NNRD4iOworCisgICAgcGpfc3RyX3QgeG1sID0gcGpfc3RyKGFjY291bnRfY29tbWFuZCk7CisgICAgcmV0dXJuIHBqX2NsaV9hZGRfY21kX2Zyb21feG1sKGNsaSwgTlVMTCwgCisJCQkJICAgJnhtbCwgY21kX2FjY291bnRfaGFuZGxlciwgCisJCQkJICAgTlVMTCwgZ2V0X2Nob2ljZV92YWx1ZSk7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhZGRfbWVkaWFfY29tbWFuZChwal9jbGlfdCAqY2xpKQoreworICAgIGNoYXIqIG1lZGlhX2NvbW1hbmQgPSAKKwkiPENNRCBuYW1lPSdhdWRpbycgaWQ9JzQwMCcgZGVzYz0nQ29uZmVyZW5jZSBhbmQgTWVkaWEgY29tbWFuZHMnPiIKKwkiICA8Q01EIG5hbWU9J2xpc3QnIGlkPSc0MDAxJyBzYz0nY2wnIGRlc2M9J1Nob3cgY29uZmVyZW5jZSBsaXN0Jy8+IgorCSIgIDxDTUQgbmFtZT0nY29uZl9jb24nIGlkPSc0MDAyJyBzYz0nY2MnIGRlc2M9J0NvbmZlcmVuY2UgY29ubmVjdCc+IgorCSIgICAgPEFSRyBuYW1lPSdzb3VyY2VfcG9ydCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwMycgIgorCSIgICAgIGRlc2M9J1NvdXJjZSBQb3J0Jy8+IgorCSIgICAgPEFSRyBuYW1lPSdkZXN0aW5hdGlvbl9wb3J0JyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAzJyAiCisJIiAgICAgZGVzYz0nRGVzdGluYXRpb24gUG9ydCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdjb25mX2RpcycgaWQ9JzQwMDMnIHNjPSdjZCcgZGVzYz0nQ29uZmVyZW5jZSBkaXNjb25uZWN0Jz4iCisJIiAgICA8QVJHIG5hbWU9J3NvdXJjZV9wb3J0JyB0eXBlPSdjaG9pY2UnIGlkPSc5OTAzJyAiCisJIiAgICAgZGVzYz0nU291cmNlIFBvcnQnLz4iCisJIiAgICA8QVJHIG5hbWU9J2Rlc3RpbmF0aW9uX3BvcnQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDMnICIKKwkiICAgICBkZXNjPSdEZXN0aW5hdGlvbiBQb3J0Jy8+IgorCSIgIDwvQ01EPiIKKwkiICA8Q01EIG5hbWU9J2FkanVzdF92b2wnIGlkPSc0MDA0JyBzYz0nVicgZGVzYz0nQWRqdXN0IHZvbHVtZSc+IgorCSIgICAgPEFSRyBuYW1lPSdtaWNfbGV2ZWwnIHR5cGU9J2ludCcgZGVzYz0nTWljIExldmVsJy8+IgorCSIgICAgPEFSRyBuYW1lPSdzcGVha2VyX3BvcnQnIHR5cGU9J2ludCcgZGVzYz0nU3BlYWtlciBMZXZlbCcvPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdzcGVha2VydG9nJyBpZD0nNDAwNicgZGVzYz0nVG9nZ2xlIGF1ZGlvIG91dHB1dCByb3V0ZScgLz4iCisJIiAgPENNRCBuYW1lPSdjb2RlY19wcmlvJyBpZD0nNDAwNScgc2M9J0NwJyAiCisJIiAgIGRlc2M9J0FycmFuZ2UgY29kZWMgcHJpb3JpdGllcyc+IgorCSIgICAgPEFSRyBuYW1lPSdjb2RlY19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwNCcgZGVzYz0nQ29kZWMgSWQnLz4iCisJIiAgICA8QVJHIG5hbWU9J3ByaW9yaXR5JyB0eXBlPSdpbnQnIGRlc2M9J0NvZGVjIFByaW9yaXR5Jy8+IgorCSIgIDwvQ01EPiIKKwkiPC9DTUQ+IjsKKworICAgIHBqX3N0cl90IHhtbCA9IHBqX3N0cihtZWRpYV9jb21tYW5kKTsKKyAgICByZXR1cm4gcGpfY2xpX2FkZF9jbWRfZnJvbV94bWwoY2xpLCBOVUxMLCAKKwkJCQkgICAmeG1sLCBjbWRfbWVkaWFfaGFuZGxlciwgCisJCQkJICAgTlVMTCwgZ2V0X2Nob2ljZV92YWx1ZSk7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhZGRfY29uZmlnX2NvbW1hbmQocGpfY2xpX3QgKmNsaSkKK3sKKyAgICBjaGFyKiBjb25maWdfY29tbWFuZCA9IAorCSI8Q01EIG5hbWU9J3N0YXQnIGlkPSc1MDAnIGRlc2M9J1N0YXR1cyBhbmQgY29uZmlnIGNvbW1hbmRzJz4iCisJIiAgPENNRCBuYW1lPSdkdW1wX3N0YXQnIGlkPSc1MDAxJyBzYz0nZHMnIGRlc2M9J0R1bXAgc3RhdHVzJy8+IgorCSIgIDxDTUQgbmFtZT0nZHVtcF9kZXRhaWwnIGlkPSc1MDAyJyBzYz0nZGQnICIKKwkiICAgZGVzYz0nRHVtcCBkZXRhaWwgc3RhdHVzJy8+IgorCSIgIDxDTUQgbmFtZT0nZHVtcF9jb25mJyBpZD0nNTAwMycgc2M9J2RjJyAiCisJIiAgIGRlc2M9J0R1bXAgY29uZmlndXJhdGlvbiB0byBzY3JlZW4nLz4iCisJIiAgPENNRCBuYW1lPSd3cml0ZV9zZXR0aW5nJyBpZD0nNTAwNCcgc2M9J2YnICIKKwkiICAgZGVzYz0nV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGZpbGUnPiIKKwkiICAgIDxBUkcgbmFtZT0nb3V0cHV0X2ZpbGUnIHR5cGU9J3N0cmluZycgZGVzYz0nT3V0cHV0IGZpbGVuYW1lJy8+IgorCSIgIDwvQ01EPiIKKwkiPC9DTUQ+IjsKKworICAgIHBqX3N0cl90IHhtbCA9IHBqX3N0cihjb25maWdfY29tbWFuZCk7CisgICAgcmV0dXJuIHBqX2NsaV9hZGRfY21kX2Zyb21feG1sKGNsaSwgTlVMTCwgCisJCQkJICAgJnhtbCwgY21kX2NvbmZpZ19oYW5kbGVyLAorCQkJCSAgIE5VTEwsIGdldF9jaG9pY2VfdmFsdWUpOworfQorCisjaWYgUEpTVUFfSEFTX1ZJREVPICAgIAorc3RhdGljIHBqX3N0YXR1c190IGFkZF92aWRlb19jb21tYW5kKHBqX2NsaV90ICpjbGkpCit7CisgICAgY2hhciogdmlkZW9fY29tbWFuZCA9CisJIjxDTUQgbmFtZT0ndmlkZW8nIGlkPSc2MDAnIGRlc2M9J1ZpZGVvIGNvbW1hbmRzJz4iCisJIiAgPENNRCBuYW1lPSdlbmFibGUnIGlkPSc2MDAxJyBkZXNjPSdFbmFibGUgdmlkZW8nLz4iCisJIiAgPENNRCBuYW1lPSdkaXNhYmxlJyBpZD0nNjAwMicgZGVzYz0nRGlzYWJsZSB2aWRlbycvPiIKKwkiICA8Q01EIG5hbWU9J2FjYycgaWQ9JzYwMDMnIGRlc2M9J1ZpZGVvIHNldHRpbmcgZm9yIGN1cnJlbnQgYWNjb3VudCc+IgorCSIgICAgPENNRCBuYW1lPSdzaG93JyBpZD0nNjAwMzEnICIKKwkiICAgICBkZXNjPSdTaG93IHZpZGVvIHNldHRpbmcgZm9yIGN1cnJlbnQgYWNjb3VudCcvPiIKKwkiICAgIDxDTUQgbmFtZT0nYXV0b3J4JyBpZD0nNjAwMzInIHNjPSdhcicgIgorCSIgICAgIGRlc2M9J0F1dG9tYXRpY2FsbHkgc2hvdyBpbmNvbWluZyB2aWRlbyc+IgorCSIgICAgICA8QVJHIG5hbWU9J2VuYWJsZV9vcHRpb24nIHR5cGU9J2Nob2ljZScgIgorCSIgICAgICAgZGVzYz0nRW5hYmxlL0Rpc2FibGUgb3B0aW9uJz4iCisJIiAgICAgICAgPENIT0lDRSB2YWx1ZT0nT24nIGRlc2M9J0VuYWJsZScvPiIKKwkiICAgICAgICA8Q0hPSUNFIHZhbHVlPSdPZmYnIGRlc2M9J0Rpc2FibGUnLz4iCisJIiAgICAgIDwvQVJHPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0nYXV0b3R4JyBpZD0nNjAwMzMnIHNjPSdhdCcgIgorCSIgICAgIGRlc2M9J0F1dG9tYXRpY2FsbHkgb2ZmZXIgdmlkZW8nPiIKKwkiICAgICAgPEFSRyBuYW1lPSdlbmFibGVfb3B0aW9uJyB0eXBlPSdjaG9pY2UnICIKKwkiICAgICAgIGRlc2M9J0VuYWJsZS9EaXNhYmxlIG9wdGlvbic+IgorCSIgICAgICAgIDxDSE9JQ0UgdmFsdWU9J09uJyBkZXNjPSdFbmFibGUnLz4iCisJIiAgICAgICAgPENIT0lDRSB2YWx1ZT0nT2ZmJyBkZXNjPSdEaXNhYmxlJy8+IgorCSIgICAgICA8L0FSRz4iCisJIiAgICA8L0NNRD4iCisJIiAgICA8Q01EIG5hbWU9J2NhcF9pZCcgaWQ9JzYwMDM0JyBzYz0nY2knICIKKwkiICAgICBkZXNjPSdTZXQgZGVmYXVsdCBjYXB0dXJlIGRldmljZSBmb3IgY3VycmVudCBhY2NvdW50Jz4iCisJIiAgICAgIDxBUkcgbmFtZT0nY2FwX2Rldl9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwNScgIgorCSIgICAgICAgZGVzYz0nQ2FwdHVyZSBkZXZpY2UgSWQnLz4iCisJIiAgICA8L0NNRD4iCisJIiAgICA8Q01EIG5hbWU9J3Jlbl9pZCcgaWQ9JzYwMDM1JyBzYz0ncmknICIKKwkiICAgICBkZXNjPSdTZXQgZGVmYXVsdCByZW5kZXJlciBkZXZpY2UgZm9yIGN1cnJlbnQgYWNjb3VudCc+IgorCSIgICAgICA8QVJHIG5hbWU9J3Jlbl9kZXZfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDYnICIKKwkiICAgICAgIGRlc2M9J1JlbmRlcmVyIGRldmljZSBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdjYWxsJyBpZD0nNjAwNCcgc2M9J3ZjbCcgIgorCSIgICBkZXNjPSdWaWRlbyBjYWxsIGNvbW1hbmRzL3NldHRpbmdzJz4iCisJIiAgICA8Q01EIG5hbWU9J3J4JyBpZD0nNjAwNDEnICIKKwkiICAgICBkZXNjPSdFbmFibGUvZGlzYWJsZSB2aWRlbyBSWCBmb3Igc3RyZWFtIGluIGN1cnIgY2FsbCc+IgorCSIgICAgICA8QVJHIG5hbWU9J2VuYWJsZV9vcHRpb24nIHR5cGU9J2Nob2ljZScgIgorCSIgICAgICAgZGVzYz0nRW5hYmxlL0Rpc2FibGUgb3B0aW9uJz4iCisJIiAgICAgICAgPENIT0lDRSB2YWx1ZT0nT24nIGRlc2M9J0VuYWJsZScvPiIKKwkiICAgICAgICA8Q0hPSUNFIHZhbHVlPSdPZmYnIGRlc2M9J0Rpc2FibGUnLz4iCisJIiAgICAgIDwvQVJHPiIKKwkiICAgICAgPEFSRyBuYW1lPSdzdHJlYW1faWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDgnIGRlc2M9J1N0cmVhbSBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0ndHgnIGlkPSc2MDA0MicgIgorCSIgICAgIGRlc2M9J0VuYWJsZS9kaXNhYmxlIHZpZGVvIFRYIGZvciBzdHJlYW0gaW4gY3VyciBjYWxsJz4iCisJIiAgICAgIDxBUkcgbmFtZT0nZW5hYmxlX29wdGlvbicgdHlwZT0nY2hvaWNlJyAiCisJIiAgICAgICBkZXNjPSdFbmFibGUvRGlzYWJsZSBvcHRpb24nPiIKKwkiICAgICAgICA8Q0hPSUNFIHZhbHVlPSdPbicgZGVzYz0nRW5hYmxlJy8+IgorCSIgICAgICAgIDxDSE9JQ0UgdmFsdWU9J09mZicgZGVzYz0nRGlzYWJsZScvPiIKKwkiICAgICAgPC9BUkc+IgorCSIgICAgICA8QVJHIG5hbWU9J3N0cmVhbV9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwOCcgZGVzYz0nU3RyZWFtIElkJy8+IgorCSIgICAgPC9DTUQ+IgorCSIgICAgPENNRCBuYW1lPSdhZGQnIGlkPSc2MDA0MycgIgorCSIgICAgIGRlc2M9J0FkZCB2aWRlbyBzdHJlYW0gZm9yIGN1cnJlbnQgY2FsbCcvPiIKKwkiICAgIDxDTUQgbmFtZT0nZW5hYmxlJyBpZD0nNjAwNDQnICIKKwkiICAgICBkZXNjPSdFbmFibGUgc3RyZWFtICNOIGluIGN1cnJlbnQgY2FsbCc+IgorCSIgICAgICA8QVJHIG5hbWU9J3N0cmVhbV9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwOCcgb3B0aW9uYWw9JzEnICIKKwkiICAgICAgIGRlc2M9J1N0cmVhbSBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0nZGlzYWJsZScgaWQ9JzYwMDQ1JyAiCisJIiAgICAgZGVzYz0nRGlzYWJsZSBzdHJlYW0gI04gaW4gY3VycmVudCBjYWxsJz4iCisJIiAgICAgIDxBUkcgbmFtZT0nc3RyZWFtX2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTA4JyBvcHRpb25hbD0nMScgIgorCSIgICAgICAgZGVzYz0nU3RyZWFtIElkJy8+IgorCSIgICAgPC9DTUQ+IgorCSIgICAgPENNRCBuYW1lPSdjYXAnIGlkPSc2MDA0NicgIgorCSIgICAgIGRlc2M9J1NldCBjYXB0dXJlIGRldiBJRCBmb3Igc3RyZWFtICNOIGluIGN1cnJlbnQgY2FsbCc+IgorCSIgICAgICA8QVJHIG5hbWU9J3N0cmVhbV9pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwOCcgZGVzYz0nU3RyZWFtIElkJy8+IgorCSIgICAgICA8QVJHIG5hbWU9J2NhcF9kZXZpY2VfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDUnICIKKwkiICAgICAgIGRlc2M9J0RldmljZSBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdkZXZpY2UnIGlkPSc2MDA1JyBzYz0ndnYnIGRlc2M9J1ZpZGVvIGRldmljZSBjb21tYW5kcyc+IgorCSIgICAgPENNRCBuYW1lPSdsaXN0JyBpZD0nNjAwNTEnIGRlc2M9J1Nob3cgYWxsIHZpZGVvIGRldmljZXMnLz4iCisJIiAgICA8Q01EIG5hbWU9J3JlZnJlc2gnIGlkPSc2MDA1MicgZGVzYz0nUmVmcmVzaCB2aWRlbyBkZXZpY2UgbGlzdCcvPiIKKwkiICAgIDxDTUQgbmFtZT0ncHJldicgaWQ9JzYwMDUzJyAiCisJIiAgICAgZGVzYz0nRW5hYmxlL2Rpc2FibGUgcHJldmlldyBmb3Igc3BlY2lmaWVkIGRldmljZSBJRCc+IgorCSIgICAgICA8QVJHIG5hbWU9J2VuYWJsZV9vcHRpb24nIHR5cGU9J2Nob2ljZScgIgorCSIgICAgICAgZGVzYz0nRW5hYmxlL0Rpc2FibGUgb3B0aW9uJz4iCisJIiAgICAgICAgPENIT0lDRSB2YWx1ZT0nT24nIGRlc2M9J0VuYWJsZScvPiIKKwkiICAgICAgICA8Q0hPSUNFIHZhbHVlPSdPZmYnIGRlc2M9J0Rpc2FibGUnLz4iCisJIiAgICAgIDwvQVJHPiIKKwkiICAgICAgPEFSRyBuYW1lPSdkZXZpY2VfaWQnIHR5cGU9J2Nob2ljZScgaWQ9Jzk5MDcnICIKKwkiICAgICAgIGRlc2M9J1ZpZGVvIERldmljZSBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSdjb2RlYycgaWQ9JzYwMDYnIGRlc2M9J1ZpZGVvIGNvZGVjIGNvbW1hbmRzJz4iCisJIiAgICA8Q01EIG5hbWU9J2xpc3QnIGlkPSc2MDA2MScgZGVzYz0nU2hvdyB2aWRlbyBjb2RlYyBsaXN0Jy8+IgorCSIgICAgPENNRCBuYW1lPSdwcmlvJyBpZD0nNjAwNjInIGRlc2M9J1NldCB2aWRlbyBjb2RlYyBwcmlvcml0eSc+IgorCSIgICAgICA8QVJHIG5hbWU9J2NvZGVjX2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTA5JyBkZXNjPSdDb2RlYyBJZCcvPiIKKwkiICAgICAgPEFSRyBuYW1lPSdwcmlvcml0eScgdHlwZT0naW50JyBkZXNjPSdQcmlvcml0eScvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0nZnBzJyBpZD0nNjAwNjMnIGRlc2M9J1NldCB2aWRlbyBjb2RlYyBmcmFtZXJhdGUnPiIKKwkiICAgICAgPEFSRyBuYW1lPSdjb2RlY19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwOScgZGVzYz0nQ29kZWMgSWQnLz4iCisJIiAgICAgIDxBUkcgbmFtZT0nbnVtJyB0eXBlPSdpbnQnIGRlc2M9J051bWVyYXRvcicvPiIKKwkiICAgICAgPEFSRyBuYW1lPSdkZW51bScgdHlwZT0naW50JyBkZXNjPSdEZW51bWVyYXRvcicvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0nYml0cmF0ZScgaWQ9JzYwMDY0JyBkZXNjPSdTZXQgdmlkZW8gY29kZWMgYml0cmF0ZSc+IgorCSIgICAgICA8QVJHIG5hbWU9J2NvZGVjX2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTA5JyBkZXNjPSdDb2RlYyBJZCcvPiIKKwkiICAgICAgPEFSRyBuYW1lPSdhdmcnIHR5cGU9J2ludCcgZGVzYz0nQXZlcmFnZSBicHMnLz4iCisJIiAgICAgIDxBUkcgbmFtZT0nbWF4JyB0eXBlPSdpbnQnIGRlc2M9J01heGltdW0gYnBzJy8+IgorCSIgICAgPC9DTUQ+IgorCSIgICAgPENNRCBuYW1lPSdzaXplJyBpZD0nNjAwNjUnIGRlc2M9J1NldCBjb2RlYyBJRCBzaXplL3Jlc29sdXRpb24nPiIKKwkiICAgICAgPEFSRyBuYW1lPSdjb2RlY19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkwOScgZGVzYz0nQ29kZWMgSWQnLz4iCisJIiAgICAgIDxBUkcgbmFtZT0nd2lkdGgnIHR5cGU9J2ludCcgZGVzYz0nV2lkdGgnLz4iCisJIiAgICAgIDxBUkcgbmFtZT0naGVpZ2h0JyB0eXBlPSdpbnQnIGRlc2M9J0hlaWdodCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICA8L0NNRD4iCisJIiAgPENNRCBuYW1lPSd3aW4nIGlkPSc2MDA3JyBkZXNjPSdWaWRlbyB3aW5kb3dzIHNldHRpbmdzL2NvbW1hbmRzJz4iCisJIiAgICA8Q01EIG5hbWU9J2xpc3QnIGlkPSc2MDA3MScgZGVzYz0nTGlzdCBhbGwgYWN0aXZlIHZpZGVvIHdpbmRvd3MnLz4iCisJIiAgICA8Q01EIG5hbWU9J2FycmFuZ2UnIGlkPSc2MDA3MicgZGVzYz0nQXV0byBhcnJhbmdlIHdpbmRvd3MnLz4iCisJIiAgICA8Q01EIG5hbWU9J3Nob3cnIGlkPSc2MDA3MycgZGVzYz0nU2hvdyBzcGVjaWZpYyB3aW5kb3dzJz4iCisJIiAgICAgIDxBUkcgbmFtZT0nd2luZG93X2lkJyB0eXBlPSdjaG9pY2UnIGlkPSc5OTEwJyAiCisJIiAgICAgICBkZXNjPSdXaW5kb3dzIElkJy8+IgorCSIgICAgPC9DTUQ+IgorCSIgICAgPENNRCBuYW1lPSdoaWRlJyBpZD0nNjAwNzQnIGRlc2M9J0hpZGUgc3BlY2lmaWMgd2luZG93cyc+IgorCSIgICAgICA8QVJHIG5hbWU9J3dpbmRvd19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkxMCcgIgorCSIgICAgICAgZGVzYz0nV2luZG93cyBJZCcvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0nbW92ZScgaWQ9JzYwMDc1JyBkZXNjPSdNb3ZlIHdpbmRvdyBwb3NpdGlvbic+IgorCSIgICAgICA8QVJHIG5hbWU9J3dpbmRvd19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkxMCcgIgorCSIgICAgICAgZGVzYz0nV2luZG93cyBJZCcvPiIKKwkiICAgICAgPEFSRyBuYW1lPSd4JyB0eXBlPSdpbnQnIGRlc2M9J0hvcml6b250YWwgcG9zaXRpb24nLz4iCisJIiAgICAgIDxBUkcgbmFtZT0neScgdHlwZT0naW50JyBkZXNjPSdWZXJ0aWNhbCBwb3NpdGlvbicvPiIKKwkiICAgIDwvQ01EPiIKKwkiICAgIDxDTUQgbmFtZT0ncmVzaXplJyBpZD0nNjAwNzYnICIKKwkiICAgICBkZXNjPSdSZXNpemUgd2luZG93IHRvIHNwZWNpZmljIHdpZHRoL2hlaWdodCc+IgorCSIgICAgICA8QVJHIG5hbWU9J3dpbmRvd19pZCcgdHlwZT0nY2hvaWNlJyBpZD0nOTkxMCcgIgorCSIgICAgICAgZGVzYz0nV2luZG93cyBJZCcvPiIKKwkiICAgICAgPEFSRyBuYW1lPSd3aWR0aCcgdHlwZT0naW50JyBkZXNjPSdXaWR0aCcvPiIKKwkiICAgICAgPEFSRyBuYW1lPSdoZWlnaHQnIHR5cGU9J2ludCcgZGVzYz0nSGVpZ2h0Jy8+IgorCSIgICAgPC9DTUQ+IgorCSIgIDwvQ01EPiIKKwkiPC9DTUQ+IjsKKworICAgIHBqX3N0cl90IHhtbCA9IHBqX3N0cih2aWRlb19jb21tYW5kKTsKKyAgICByZXR1cm4gcGpfY2xpX2FkZF9jbWRfZnJvbV94bWwoY2xpLCBOVUxMLCAKKwkJCQkgICAmeG1sLCBjbWRfdmlkZW9faGFuZGxlciwgCisJCQkJICAgTlVMTCwgZ2V0X2Nob2ljZV92YWx1ZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHBqX3N0YXR1c190IGFkZF9vdGhlcl9jb21tYW5kKHBqX2NsaV90ICpjbGkpCit7CisgICAgY2hhciogc2xlZXBfY29tbWFuZCA9CisJIjxDTUQgbmFtZT0nc2xlZXAnIGlkPSc3MDAnIGRlc2M9J1N1c3BlbmQga2V5Ym9hcmQgaW5wdXQnPiIKKwkiICA8QVJHIG5hbWU9J21zZWMnIHR5cGU9J2ludCcgZGVzYz0nTWlsbGlzZWNvbmQnLz4iCisJIjwvQ01EPiI7CisKKyAgICBjaGFyKiBuZXR3b3JrX2NvbW1hbmQgPQorCSI8Q01EIG5hbWU9J25ldHdvcmsnIGlkPSc5MDAnIGRlc2M9J0RldGVjdCBuZXR3b3JrIHR5cGUnLz4iOworCisgICAgY2hhciogc2h1dGRvd25fY29tbWFuZCA9CisJIjxDTUQgbmFtZT0nc2h1dGRvd24nIGlkPScxMTAnIGRlc2M9J1NodXRkb3duIGFwcGxpY2F0aW9uJy8+IjsKKworICAgIGNoYXIqIHJlc3RhcnRfY29tbWFuZCA9CisJIjxDTUQgbmFtZT0ncmVzdGFydCcgaWQ9JzEyMCcgZGVzYz0nUmVzdGFydCBhcHBsaWNhdGlvbic+IgorCSIgIDxBUkcgbmFtZT0nb3B0aW9uczEnIHR5cGU9J3N0cmluZycgZGVzYz0nT3B0aW9ucycgb3B0aW9uYWw9JzEnLz4iCisJIiAgPEFSRyBuYW1lPSdvcHRpb25zMicgdHlwZT0nc3RyaW5nJyBkZXNjPSdPcHRpb25zJyBvcHRpb25hbD0nMScvPiIKKwkiICA8QVJHIG5hbWU9J29wdGlvbnMzJyB0eXBlPSdzdHJpbmcnIGRlc2M9J09wdGlvbnMnIG9wdGlvbmFsPScxJy8+IgorCSIgIDxBUkcgbmFtZT0nb3B0aW9uczQnIHR5cGU9J3N0cmluZycgZGVzYz0nT3B0aW9ucycgb3B0aW9uYWw9JzEnLz4iCisJIjwvQ01EPiI7CisKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgcGpfc3RyX3Qgc2xlZXBfeG1sID0gcGpfc3RyKHNsZWVwX2NvbW1hbmQpOyAgICAKKyAgICBwal9zdHJfdCBuZXR3b3JrX3htbCA9IHBqX3N0cihuZXR3b3JrX2NvbW1hbmQpOworICAgIHBqX3N0cl90IHNodXRkb3duX3htbCA9IHBqX3N0cihzaHV0ZG93bl9jb21tYW5kKTsKKyAgICBwal9zdHJfdCByZXN0YXJ0X3htbCA9IHBqX3N0cihyZXN0YXJ0X2NvbW1hbmQpOworCisgICAgc3RhdHVzID0gcGpfY2xpX2FkZF9jbWRfZnJvbV94bWwoY2xpLCBOVUxMLCAKKwkJCQkgICAgICZzbGVlcF94bWwsIGNtZF9zbGVlcF9oYW5kbGVyLCAKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpfY2xpX2FkZF9jbWRfZnJvbV94bWwoY2xpLCBOVUxMLCAKKwkJCQkgICAgICZuZXR3b3JrX3htbCwgY21kX25ldHdvcmtfaGFuZGxlciwgCisJCQkJICAgICBOVUxMLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqX2NsaV9hZGRfY21kX2Zyb21feG1sKGNsaSwgTlVMTCwgCisJCQkJICAgICAmc2h1dGRvd25feG1sLCBjbWRfcXVpdF9oYW5kbGVyLCAKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwal9jbGlfYWRkX2NtZF9mcm9tX3htbChjbGksIE5VTEwsIAorCQkJCSAgICAgJnJlc3RhcnRfeG1sLCBjbWRfcmVzdGFydF9oYW5kbGVyLCAKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworcGpfc3RhdHVzX3QgY2xpX3NldHVwX2NvbW1hbmQocGpfY2xpX3QgKmNsaSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBhZGRfY2FsbF9jb21tYW5kKGNsaSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBhZGRfcHJlc2VuY2VfY29tbWFuZChjbGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gYWRkX2FjY291bnRfY29tbWFuZChjbGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gYWRkX21lZGlhX2NvbW1hbmQoY2xpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1cyA9IGFkZF9jb25maWdfY29tbWFuZChjbGkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisjaWYgUEpTVUFfSEFTX1ZJREVPICAgIAorICAgIHN0YXR1cyA9IGFkZF92aWRlb19jb21tYW5kKGNsaSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisjZW5kaWYKKworICAgIHN0YXR1cyA9IGFkZF9vdGhlcl9jb21tYW5kKGNsaSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbW1vbi5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NWQ3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfY29tbW9uLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qICRJZDogcGpzdWFfYXBwX2NvbW1vbi5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaW5jbHVkZSAicGpzdWFfYXBwX2NvbW1vbi5oIgorCisjZGVmaW5lIFRISVNfRklMRQkicGpzdWFfYXBwX2NvbW1vbi5jIgorCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19SVENQX1hSKSAmJiAoUEpNRURJQV9IQVNfUlRDUF9YUiAhPSAwKQorIyAgIGRlZmluZSBTT01FX0JVRl9TSVpFCSgxMDI0ICogMTApCisjZWxzZQorIyAgIGRlZmluZSBTT01FX0JVRl9TSVpFCSgxMDI0ICogMykKKyNlbmRpZgorCitzdGF0aWMgY2hhciBzb21lX2J1ZltTT01FX0JVRl9TSVpFXTsKKworLyoqIFZhcmlhYmxlIGRlZmluaXRpb24gKiovCitpbnQJCSAgICBzdGRvdXRfcmVmcmVzaCA9IC0xOworcGpfYm9vbF90CSAgICBzdGRvdXRfcmVmcmVzaF9xdWl0ID0gUEpfRkFMU0U7CitwanN1YV9jYWxsX2lkCSAgICBjdXJyZW50X2NhbGwgPSBQSlNVQV9JTlZBTElEX0lEOworcGpzdWFfYXBwX2NvbmZpZyAgICBhcHBfY29uZmlnOworcGpzdWFfY2FsbF9zZXR0aW5nICBjYWxsX29wdDsKK3Bqc3VhX21zZ19kYXRhCSAgICBtc2dfZGF0YTsKKworaW50IG15X2F0b2koY29uc3QgY2hhciAqY3MpCit7CisgICAgcGpfc3RyX3QgczsKKworICAgIHBqX2NzdHIoJnMsIGNzKTsKKyAgICBpZiAoY3NbMF0gPT0gJy0nKSB7CisJcy5wdHIrKywgcy5zbGVuLS07CisJcmV0dXJuIDAgLSAoaW50KXBqX3N0cnRvdWwoJnMpOworICAgIH0gZWxzZSBpZiAoY3NbMF0gPT0gJysnKSB7CisJcy5wdHIrKywgcy5zbGVuLS07CisJcmV0dXJuIHBqX3N0cnRvdWwoJnMpOworICAgIH0gZWxzZSB7CisJcmV0dXJuIHBqX3N0cnRvdWwoJnMpOworICAgIH0KK30KKworLyoKKyAqIEZpbmQgbmV4dCBjYWxsIHdoZW4gY3VycmVudCBjYWxsIGlzIGRpc2Nvbm5lY3RlZCBvciB3aGVuIHVzZXIKKyAqIHByZXNzICddJworICovCitwal9ib29sX3QgZmluZF9uZXh0X2NhbGwoKQoreworICAgIGludCBpLCBtYXg7CisKKyAgICBtYXggPSBwanN1YV9jYWxsX2dldF9tYXhfY291bnQoKTsKKyAgICBmb3IgKGk9Y3VycmVudF9jYWxsKzE7IGk8bWF4OyArK2kpIHsKKwlpZiAocGpzdWFfY2FsbF9pc19hY3RpdmUoaSkpIHsKKwkgICAgY3VycmVudF9jYWxsID0gaTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorICAgIH0KKworICAgIGZvciAoaT0wOyBpPGN1cnJlbnRfY2FsbDsgKytpKSB7CisJaWYgKHBqc3VhX2NhbGxfaXNfYWN0aXZlKGkpKSB7CisJICAgIGN1cnJlbnRfY2FsbCA9IGk7CisJICAgIHJldHVybiBQSl9UUlVFOworCX0KKyAgICB9CisKKyAgICBjdXJyZW50X2NhbGwgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworcGpfYm9vbF90IGZpbmRfcHJldl9jYWxsKCkKK3sKKyAgICBpbnQgaSwgbWF4OworCisgICAgbWF4ID0gcGpzdWFfY2FsbF9nZXRfbWF4X2NvdW50KCk7CisgICAgZm9yIChpPWN1cnJlbnRfY2FsbC0xOyBpPj0wOyAtLWkpIHsKKwlpZiAocGpzdWFfY2FsbF9pc19hY3RpdmUoaSkpIHsKKwkgICAgY3VycmVudF9jYWxsID0gaTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorICAgIH0KKworICAgIGZvciAoaT1tYXgtMTsgaT5jdXJyZW50X2NhbGw7IC0taSkgeworCWlmIChwanN1YV9jYWxsX2lzX2FjdGl2ZShpKSkgeworCSAgICBjdXJyZW50X2NhbGwgPSBpOworCSAgICByZXR1cm4gUEpfVFJVRTsKKwl9CisgICAgfQorCisgICAgY3VycmVudF9jYWxsID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKy8qCisgKiBTZW5kIGFyYml0cmFyeSByZXF1ZXN0IHRvIHJlbW90ZSBob3N0CisgKi8KK3ZvaWQgc2VuZF9yZXF1ZXN0KGNoYXIgKmNzdHJfbWV0aG9kLCBjb25zdCBwal9zdHJfdCAqZHN0X3VyaSkKK3sKKyAgICBwal9zdHJfdCBzdHJfbWV0aG9kOworICAgIHBqc2lwX21ldGhvZCBtZXRob2Q7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpzaXBfZW5kcG9pbnQgKmVuZHB0OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGVuZHB0ID0gcGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCk7CisKKyAgICBzdHJfbWV0aG9kID0gcGpfc3RyKGNzdHJfbWV0aG9kKTsKKyAgICBwanNpcF9tZXRob2RfaW5pdF9ucCgmbWV0aG9kLCAmc3RyX21ldGhvZCk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfY3JlYXRlX3JlcXVlc3QoY3VycmVudF9hY2MsICZtZXRob2QsIGRzdF91cmksICZ0ZGF0YSk7CisKKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9zZW5kX3JlcXVlc3QoZW5kcHQsIHRkYXRhLCAtMSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzdWFfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBzZW5kIHJlcXVlc3QiLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9Cit9CisKKy8qCisgKiBQcmludCBsb2cgb2YgY2FsbCBzdGF0ZXMuIFNpbmNlIGNhbGwgc3RhdGVzIG1heSBiZSB0b28gbG9uZyBmb3IgbG9nZ2VyLAorICogcHJpbnRpbmcgaXQgaXMgYSBiaXQgdHJpY2t5LCBpdCBzaG91bGQgYmUgcHJpbnRlZCBwYXJ0IGJ5IHBhcnQgYXMgbG9uZyAKKyAqIGFzIHRoZSBsb2dnZXIgY2FuIGFjY2VwdC4KKyAqLwordm9pZCBsb2dfY2FsbF9kdW1wKGludCBjYWxsX2lkKSAKK3sKKyAgICB1bnNpZ25lZCBjYWxsX2R1bXBfbGVuOworICAgIHVuc2lnbmVkIHBhcnRfbGVuOworICAgIHVuc2lnbmVkIHBhcnRfaWR4OworICAgIHVuc2lnbmVkIGxvZ19kZWNvcjsKKworICAgIHBqc3VhX2NhbGxfZHVtcChjYWxsX2lkLCBQSl9UUlVFLCBzb21lX2J1Ziwgc2l6ZW9mKHNvbWVfYnVmKSwgIiAgIik7CisgICAgY2FsbF9kdW1wX2xlbiA9ICh1bnNpZ25lZClzdHJsZW4oc29tZV9idWYpOworCisgICAgbG9nX2RlY29yID0gcGpfbG9nX2dldF9kZWNvcigpOworICAgIHBqX2xvZ19zZXRfZGVjb3IobG9nX2RlY29yICYgfihQSl9MT0dfSEFTX05FV0xJTkUgfCBQSl9MT0dfSEFTX0NSKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlxuIikpOworICAgIHBqX2xvZ19zZXRfZGVjb3IoMCk7CisKKyAgICBwYXJ0X2lkeCA9IDA7CisgICAgcGFydF9sZW4gPSBQSl9MT0dfTUFYX1NJWkUtODA7CisgICAgd2hpbGUgKHBhcnRfaWR4IDwgY2FsbF9kdW1wX2xlbikgeworCWNoYXIgcF9vcmlnLCAqcDsKKworCXAgPSAmc29tZV9idWZbcGFydF9pZHhdOworCWlmIChwYXJ0X2lkeCArIHBhcnRfbGVuID4gY2FsbF9kdW1wX2xlbikKKwkgICAgcGFydF9sZW4gPSBjYWxsX2R1bXBfbGVuIC0gcGFydF9pZHg7CisJcF9vcmlnID0gcFtwYXJ0X2xlbl07CisJcFtwYXJ0X2xlbl0gPSAnXDAnOworCVBKX0xPRygzLChUSElTX0ZJTEUsICIlcyIsIHApKTsKKwlwW3BhcnRfbGVuXSA9IHBfb3JpZzsKKwlwYXJ0X2lkeCArPSBwYXJ0X2xlbjsKKyAgICB9CisgICAgcGpfbG9nX3NldF9kZWNvcihsb2dfZGVjb3IpOworfQorCisjaWZkZWYgUEpTVUFfSEFTX1ZJREVPCit2b2lkIGFwcF9jb25maWdfaW5pdF92aWRlbyhwanN1YV9hY2NfY29uZmlnICphY2NfY2ZnKQoreworICAgIGFjY19jZmctPnZpZF9pbl9hdXRvX3Nob3cgPSBhcHBfY29uZmlnLnZpZC5pbl9hdXRvX3Nob3c7CisgICAgYWNjX2NmZy0+dmlkX291dF9hdXRvX3RyYW5zbWl0ID0gYXBwX2NvbmZpZy52aWQub3V0X2F1dG9fdHJhbnNtaXQ7CisgICAgLyogTm90ZSB0aGF0IG5vcm1hbGx5IEdVSSBhcHBsaWNhdGlvbiB3aWxsIHByZWZlciBhIGJvcmRlcmxlc3MKKyAgICAgKiB3aW5kb3cuCisgICAgICovCisgICAgYWNjX2NmZy0+dmlkX3duZF9mbGFncyA9IFBKTUVESUFfVklEX0RFVl9XTkRfQk9SREVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9WSURfREVWX1dORF9SRVNJWkFCTEU7CisgICAgYWNjX2NmZy0+dmlkX2NhcF9kZXYgPSBhcHBfY29uZmlnLnZpZC52Y2FwdHVyZV9kZXY7CisgICAgYWNjX2NmZy0+dmlkX3JlbmRfZGV2ID0gYXBwX2NvbmZpZy52aWQudnJlbmRlcl9kZXY7CisKKyAgICBpZiAoYXBwX2NvbmZpZy5hdmlfYXV0b19wbGF5ICYmCisJYXBwX2NvbmZpZy5hdmlfZGVmX2lkeCAhPSBQSlNVQV9JTlZBTElEX0lEICYmCisJYXBwX2NvbmZpZy5hdmlbYXBwX2NvbmZpZy5hdmlfZGVmX2lkeF0uZGV2X2lkICE9IFBKTUVESUFfVklEX0lOVkFMSURfREVWKQorICAgIHsKKwlhY2NfY2ZnLT52aWRfY2FwX2RldiA9IGFwcF9jb25maWcuYXZpW2FwcF9jb25maWcuYXZpX2RlZl9pZHhdLmRldl9pZDsKKyAgICB9Cit9CisjZWxzZQordm9pZCBhcHBfY29uZmlnX2luaXRfdmlkZW8ocGpzdWFfYWNjX2NvbmZpZyAqYWNjX2NmZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFjY19jZmcpOworfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX01VTFRJUEFSVF9URVNUCisgIC8qCisgICAqIEVuYWJsZSBtdWx0aXBhcnQgaW4gbXNnX2RhdGEgYW5kIGFkZCBhIGR1bW15IGJvZHkgaW50byB0aGUKKyAgICogbXVsdGlwYXJ0IGJvZGllcy4KKyAgICovCisgIHZvaWQgYWRkX211bHRpcGFydChwanN1YV9tc2dfZGF0YSAqbXNnX2RhdGEpCisgIHsKKyAgICAgIHN0YXRpYyBwanNpcF9tdWx0aXBhcnRfcGFydCAqYWx0X3BhcnQ7CisKKyAgICAgIGlmICghYWx0X3BhcnQpIHsKKwkgIHBqX3N0cl90IHR5cGUsIHN1YnR5cGUsIGNvbnRlbnQ7CisKKwkgIGFsdF9wYXJ0ID0gcGpzaXBfbXVsdGlwYXJ0X2NyZWF0ZV9wYXJ0KGFwcF9jb25maWcucG9vbCk7CisKKwkgIHR5cGUgPSBwal9zdHIoInRleHQiKTsKKwkgIHN1YnR5cGUgPSBwal9zdHIoInBsYWluIik7CisJICBjb250ZW50ID0gcGpfc3RyKCJTYW1wbGUgdGV4dCBib2R5IG9mIGEgbXVsdGlwYXJ0IGJvZGllcyIpOworCSAgYWx0X3BhcnQtPmJvZHkgPSBwanNpcF9tc2dfYm9keV9jcmVhdGUoYXBwX2NvbmZpZy5wb29sLCAmdHlwZSwKKwkJCQkJCSAmc3VidHlwZSwgJmNvbnRlbnQpOworICAgICAgfQorCisgICAgICBtc2dfZGF0YS0+bXVsdGlwYXJ0X2N0eXBlLnR5cGUgPSBwal9zdHIoIm11bHRpcGFydCIpOworICAgICAgbXNnX2RhdGEtPm11bHRpcGFydF9jdHlwZS5zdWJ0eXBlID0gcGpfc3RyKCJtaXhlZCIpOworICAgICAgcGpfbGlzdF9wdXNoX2JhY2soJm1zZ19kYXRhLT5tdWx0aXBhcnRfcGFydHMsIGFsdF9wYXJ0KTsKKyAgfQorI2VuZGlmCisKKy8qIGFycmFuZ2Ugd2luZG93cy4gYXJnOgorICogICAtMTogICAgYXJyYW5nZSBhbGwgd2luZG93cworICogICAhPSAtMTogYXJyYW5nZSBvbmx5IHRoaXMgd2luZG93IGlkCisgKi8KK3ZvaWQgYXJyYW5nZV93aW5kb3cocGpzdWFfdmlkX3dpbl9pZCB3aWQpCit7CisjaWYgUEpTVUFfSEFTX1ZJREVPCisgICAgcGptZWRpYV9jb29yZCBwb3M7CisgICAgaW50IGksIGxhc3Q7CisKKyAgICBwb3MueCA9IDA7CisgICAgcG9zLnkgPSAxMDsKKyAgICBsYXN0ID0gKHdpZCA9PSBQSlNVQV9JTlZBTElEX0lEKSA/IFBKU1VBX01BWF9WSURfV0lOUyA6IHdpZDsKKworICAgIGZvciAoaT0wOyBpPGxhc3Q7ICsraSkgeworCXBqc3VhX3ZpZF93aW5faW5mbyB3aTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBwanN1YV92aWRfd2luX2dldF9pbmZvKGksICZ3aSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBjb250aW51ZTsKKworCWlmICh3aWQgPT0gUEpTVUFfSU5WQUxJRF9JRCkKKwkgICAgcGpzdWFfdmlkX3dpbl9zZXRfcG9zKGksICZwb3MpOworCisJaWYgKHdpLnNob3cpCisJICAgIHBvcy55ICs9IHdpLnNpemUuaDsKKyAgICB9CisKKyAgICBpZiAod2lkICE9IFBKU1VBX0lOVkFMSURfSUQpCisJcGpzdWFfdmlkX3dpbl9zZXRfcG9zKHdpZCwgJnBvcyk7CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcod2lkKTsKKyNlbmRpZgorfQorCisKKyNpZiBQSlNVQV9IQVNfVklERU8KK3ZvaWQgdmlkX3ByaW50X2RldihpbnQgaWQsIGNvbnN0IHBqbWVkaWFfdmlkX2Rldl9pbmZvICp2ZGksIGNvbnN0IGNoYXIgKnRpdGxlKQoreworICAgIGNoYXIgY2FwbmFtZXNbMTIwXTsKKyAgICBjaGFyIGZvcm1hdHNbMTIwXTsKKyAgICBjb25zdCBjaGFyICpkaXJuYW1lOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBpZiAodmRpLT5kaXIgPT0gUEpNRURJQV9ESVJfQ0FQVFVSRV9SRU5ERVIpIHsKKwlkaXJuYW1lID0gImNhcHR1cmUsIHJlbmRlciI7CisgICAgfSBlbHNlIGlmICh2ZGktPmRpciA9PSBQSk1FRElBX0RJUl9DQVBUVVJFKSB7CisJZGlybmFtZSA9ICJjYXB0dXJlIjsKKyAgICB9IGVsc2UgeworCWRpcm5hbWUgPSAicmVuZGVyIjsKKyAgICB9CisKKworICAgIGNhcG5hbWVzWzBdID0gJ1wwJzsKKyAgICBmb3IgKGk9MDsgaTxzaXplb2YoaW50KSo4ICYmICgxIDw8IGkpIDwgUEpNRURJQV9WSURfREVWX0NBUF9NQVg7ICsraSkgeworCWlmICh2ZGktPmNhcHMgJiAoMSA8PCBpKSkgeworCSAgICBjb25zdCBjaGFyICpjYXBuYW1lID0gcGptZWRpYV92aWRfZGV2X2NhcF9uYW1lKDEgPDwgaSwgTlVMTCk7CisJICAgIGlmIChjYXBuYW1lKSB7CisJCWlmICgqY2FwbmFtZXMpCisJCSAgICBzdHJjYXQoY2FwbmFtZXMsICIsICIpOworCQlzdHJuY2F0KGNhcG5hbWVzLCBjYXBuYW1lLAorCQkgICAgICAgIHNpemVvZihjYXBuYW1lcyktc3RybGVuKGNhcG5hbWVzKS0xKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBmb3JtYXRzWzBdID0gJ1wwJzsKKyAgICBmb3IgKGk9MDsgaTx2ZGktPmZtdF9jbnQ7ICsraSkgeworCWNvbnN0IHBqbWVkaWFfdmlkZW9fZm9ybWF0X2luZm8gKnZmaSA9CisJCXBqbWVkaWFfZ2V0X3ZpZGVvX2Zvcm1hdF9pbmZvKE5VTEwsIHZkaS0+Zm10W2ldLmlkKTsKKwlpZiAodmZpKSB7CisJICAgIGlmICgqZm9ybWF0cykKKwkJc3RyY2F0KGZvcm1hdHMsICIsICIpOworCSAgICBzdHJuY2F0KGZvcm1hdHMsIHZmaS0+bmFtZSwgc2l6ZW9mKGZvcm1hdHMpLXN0cmxlbihmb3JtYXRzKS0xKTsKKwl9CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiUzZCAlcyBbJXNdWyVzXSAlcyIsIGlkLCB2ZGktPm5hbWUsIHZkaS0+ZHJpdmVyLAorCSAgICAgIGRpcm5hbWUsIHRpdGxlKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgICBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzOiAlcyIsIGNhcG5hbWVzKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgICBTdXBwb3J0ZWQgZm9ybWF0czogJXMiLCBmb3JtYXRzKSk7Cit9CisKK3ZvaWQgdmlkX2xpc3RfZGV2cygpCit7CisgICAgdW5zaWduZWQgaSwgY291bnQ7CisgICAgcGptZWRpYV92aWRfZGV2X2luZm8gdmRpOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJWaWRlbyBkZXZpY2UgbGlzdDoiKSk7CisgICAgY291bnQgPSBwanN1YV92aWRfZGV2X2NvdW50KCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiIC0gbm8gZGV2aWNlIGRldGVjdGVkIC0iKSk7CisJcmV0dXJuOworICAgIH0gZWxzZSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiVkIGRldmljZShzKSBkZXRlY3RlZDoiLCBjb3VudCkpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX3ZpZF9kZXZfZ2V0X2luZm8oUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWLCAmdmRpKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJdmlkX3ByaW50X2RldihQSk1FRElBX1ZJRF9ERUZBVUxUX1JFTkRFUl9ERVYsICZ2ZGksCisJICAgICAgICAgICAgICAiKGRlZmF1bHQgcmVuZGVyZXIgZGV2aWNlKSIpOworCisgICAgc3RhdHVzID0gcGpzdWFfdmlkX2Rldl9nZXRfaW5mbyhQSk1FRElBX1ZJRF9ERUZBVUxUX0NBUFRVUkVfREVWLCAmdmRpKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJdmlkX3ByaW50X2RldihQSk1FRElBX1ZJRF9ERUZBVUxUX0NBUFRVUkVfREVWLCAmdmRpLAorCSAgICAgICAgICAgICAgIihkZWZhdWx0IGNhcHR1cmUgZGV2aWNlKSIpOworCisgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCXN0YXR1cyA9IHBqc3VhX3ZpZF9kZXZfZ2V0X2luZm8oaSwgJnZkaSk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICB2aWRfcHJpbnRfZGV2KGksICZ2ZGksICIiKTsKKyAgICB9Cit9CisKK3ZvaWQgYXBwX2NvbmZpZ19zaG93X3ZpZGVvKGludCBhY2NfaWQsIGNvbnN0IHBqc3VhX2FjY19jb25maWcgKmFjY19jZmcpCit7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwKKwkgICAgICAiQWNjb3VudCAlZDpcbiIKKwkgICAgICAiICBSWCBhdXRvIHNob3c6ICAgICAlZFxuIgorCSAgICAgICIgIFRYIGF1dG8gdHJhbnNtaXQ6ICVkXG4iCisJICAgICAgIiAgQ2FwdHVyZSBkZXY6ICAgICAgJWRcbiIKKwkgICAgICAiICBSZW5kZXIgZGV2OiAgICAgICAlZCIsCisJICAgICAgYWNjX2lkLAorCSAgICAgIGFjY19jZmctPnZpZF9pbl9hdXRvX3Nob3csCisJICAgICAgYWNjX2NmZy0+dmlkX291dF9hdXRvX3RyYW5zbWl0LAorCSAgICAgIGFjY19jZmctPnZpZF9jYXBfZGV2LAorCSAgICAgIGFjY19jZmctPnZpZF9yZW5kX2RldikpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbW1vbi5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmVkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfY29tbW9uLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qICRJZDogcGpzdWFfYXBwX2NvbW1vbi5oIDQ0ODkgMjAxMy0wNC0yMyAwNzo1MzoyNVogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSlNVQV9BUFBfQ09NTU9OX0hfXworI2RlZmluZSBfX1BKU1VBX0FQUF9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxwanN1YS1saWIvcGpzdWEuaD4KKworUEpfQkVHSU5fREVDTAorCisjZGVmaW5lIGN1cnJlbnRfYWNjCXBqc3VhX2FjY19nZXRfZGVmYXVsdCgpCisKKyNkZWZpbmUgUEpTVUFfQVBQX05PX0xJTUlUX0RVUkFUSU9OCShpbnQpMHg3RkZGRkZGRgorI2RlZmluZSBQSlNVQV9BUFBfTUFYX0FWSQkJNAorI2RlZmluZSBQSlNVQV9BUFBfTk9fTkIJCQktMgorCit0eXBlZGVmIHN0cnVjdCBpbnB1dF9yZXN1bHQKK3sKKyAgICBpbnQJICBuYl9yZXN1bHQ7CisgICAgY2hhciAqdXJpX3Jlc3VsdDsKK30gaW5wdXRfcmVzdWx0OworCisvKiBDYWxsIHNwZWNpZmljIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IGFwcF9jYWxsX2RhdGEKK3sKKyAgICBwal90aW1lcl9lbnRyeQkgICAgdGltZXI7CisgICAgcGpfYm9vbF90CQkgICAgcmluZ2JhY2tfb247CisgICAgcGpfYm9vbF90CQkgICAgcmluZ19vbjsKK30gYXBwX2NhbGxfZGF0YTsKKworLyogVmlkZW8gc2V0dGluZ3MgKi8KK3R5cGVkZWYgc3RydWN0IGFwcF92aWQKK3sKKyAgICB1bnNpZ25lZAkJICAgIHZpZF9jbnQ7CisgICAgaW50CQkJICAgIHZjYXB0dXJlX2RldjsKKyAgICBpbnQJCQkgICAgdnJlbmRlcl9kZXY7CisgICAgcGpfYm9vbF90CQkgICAgaW5fYXV0b19zaG93OworICAgIHBqX2Jvb2xfdAkJICAgIG91dF9hdXRvX3RyYW5zbWl0OworfSBhcHBfdmlkOworCisvKiBFbnVtZXJhdGlvbiBvZiBDTEkgZnJvbnRlbmRzICovCit0eXBlZGVmIGVudW0geworICAgIENMSV9GRV9DT05TT0xFCSAgICA9IDEsCisgICAgQ0xJX0ZFX1RFTE5FVAkgICAgPSAyCit9IENMSV9GRTsKKworLyoqIENMSSBjb25maWcgKiovCit0eXBlZGVmIHN0cnVjdCBjbGlfY2ZnX3QKK3sKKyAgICAvKiogQml0bWFzayBvZiBDTElfRkUgKiovCisgICAgaW50CQkJICAgIGNsaV9mZTsKKyAgICBwal9jbGlfY2ZnCQkgICAgY2ZnOworICAgIHBqX2NsaV90ZWxuZXRfY2ZnCSAgICB0ZWxuZXRfY2ZnOworICAgIHBqX2NsaV9jb25zb2xlX2NmZwkgICAgY29uc29sZV9jZmc7Cit9IGNsaV9jZmdfdDsKKworLyogUGpzdWEgYXBwbGljYXRpb24gZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgcGpzdWFfYXBwX2NvbmZpZworeworICAgIHBqc3VhX2NvbmZpZwkgICAgY2ZnOworICAgIHBqc3VhX2xvZ2dpbmdfY29uZmlnICAgIGxvZ19jZmc7CisgICAgcGpzdWFfbWVkaWFfY29uZmlnCSAgICBtZWRpYV9jZmc7CisgICAgcGpfYm9vbF90CQkgICAgbm9fcmVmZXJzdWI7CisgICAgcGpfYm9vbF90CQkgICAgaXB2NjsKKyAgICBwal9ib29sX3QJCSAgICBlbmFibGVfcW9zOworICAgIHBqX2Jvb2xfdAkJICAgIG5vX3RjcDsKKyAgICBwal9ib29sX3QJCSAgICBub191ZHA7CisgICAgcGpfYm9vbF90CQkgICAgdXNlX3RsczsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnICB1ZHBfY2ZnOworICAgIHBqc3VhX3RyYW5zcG9ydF9jb25maWcgIHJ0cF9jZmc7CisgICAgcGpzaXBfcmVkaXJlY3Rfb3AJICAgIHJlZGlyX29wOworCisgICAgdW5zaWduZWQJCSAgICBhY2NfY250OworICAgIHBqc3VhX2FjY19jb25maWcJICAgIGFjY19jZmdbUEpTVUFfTUFYX0FDQ107CisKKyAgICB1bnNpZ25lZAkJICAgIGJ1ZGR5X2NudDsKKyAgICBwanN1YV9idWRkeV9jb25maWcJICAgIGJ1ZGR5X2NmZ1tQSlNVQV9NQVhfQlVERElFU107CisKKyAgICBhcHBfY2FsbF9kYXRhCSAgICBjYWxsX2RhdGFbUEpTVUFfTUFYX0NBTExTXTsKKworICAgIHBqX3Bvb2xfdAkJICAgKnBvb2w7CisgICAgLyogQ29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHBqc3VhICovCisKKyAgICB1bnNpZ25lZAkJICAgIGNvZGVjX2NudDsKKyAgICBwal9zdHJfdAkJICAgIGNvZGVjX2FyZ1szMl07CisgICAgdW5zaWduZWQJCSAgICBjb2RlY19kaXNfY250OworICAgIHBqX3N0cl90ICAgICAgICAgICAgICAgIGNvZGVjX2Rpc1szMl07CisgICAgcGpfYm9vbF90CQkgICAgbnVsbF9hdWRpbzsKKyAgICB1bnNpZ25lZAkJICAgIHdhdl9jb3VudDsKKyAgICBwal9zdHJfdAkJICAgIHdhdl9maWxlc1szMl07CisgICAgdW5zaWduZWQJCSAgICB0b25lX2NvdW50OworICAgIHBqbWVkaWFfdG9uZV9kZXNjCSAgICB0b25lc1szMl07CisgICAgcGpzdWFfY29uZl9wb3J0X2lkCSAgICB0b25lX3Nsb3RzWzMyXTsKKyAgICBwanN1YV9wbGF5ZXJfaWQJICAgIHdhdl9pZDsKKyAgICBwanN1YV9jb25mX3BvcnRfaWQJICAgIHdhdl9wb3J0OworICAgIHBqX2Jvb2xfdAkJICAgIGF1dG9fcGxheTsKKyAgICBwal9ib29sX3QJCSAgICBhdXRvX3BsYXlfaGFuZ3VwOworICAgIHBqX3RpbWVyX2VudHJ5CSAgICBhdXRvX2hhbmd1cF90aW1lcjsKKyAgICBwal9ib29sX3QJCSAgICBhdXRvX2xvb3A7CisgICAgcGpfYm9vbF90CQkgICAgYXV0b19jb25mOworICAgIHBqX3N0cl90CQkgICAgcmVjX2ZpbGU7CisgICAgcGpfYm9vbF90CQkgICAgYXV0b19yZWM7CisgICAgcGpzdWFfcmVjb3JkZXJfaWQJICAgIHJlY19pZDsKKyAgICBwanN1YV9jb25mX3BvcnRfaWQJICAgIHJlY19wb3J0OworICAgIHVuc2lnbmVkCQkgICAgYXV0b19hbnN3ZXI7CisgICAgdW5zaWduZWQJCSAgICBkdXJhdGlvbjsKKworI2lmZGVmIFNURVJFT19ERU1PCisgICAgcGptZWRpYV9zbmRfcG9ydAkgICAqc25kOworICAgIHBqbWVkaWFfcG9ydAkgICAqc2MsICpzY19jaDE7CisgICAgcGpzdWFfY29uZl9wb3J0X2lkCSAgICBzY19jaDFfc2xvdDsKKyNlbmRpZgorCisgICAgZmxvYXQJCSAgICBtaWNfbGV2ZWwsCisJCQkgICAgc3BlYWtlcl9sZXZlbDsKKworICAgIGludAkJCSAgICBjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2OworICAgIHVuc2lnbmVkCQkgICAgY2FwdHVyZV9sYXQsIHBsYXliYWNrX2xhdDsKKworICAgIHBqX2Jvb2xfdAkJICAgIG5vX3RvbmVzOworICAgIGludAkJCSAgICByaW5nYmFja19zbG90OworICAgIGludAkJCSAgICByaW5nYmFja19jbnQ7CisgICAgcGptZWRpYV9wb3J0CSAgICpyaW5nYmFja19wb3J0OworICAgIGludAkJCSAgICByaW5nX3Nsb3Q7CisgICAgaW50CQkJICAgIHJpbmdfY250OworICAgIHBqbWVkaWFfcG9ydAkgICAqcmluZ19wb3J0OworCisgICAgYXBwX3ZpZAkJICAgIHZpZDsKKyAgICB1bnNpZ25lZAkJICAgIGF1ZF9jbnQ7CisKKyAgICAvKiBBVkkgdG8gcGxheSAqLworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgIGF2aV9jbnQ7CisgICAgc3RydWN0IHsKKwlwal9zdHJfdAkJcGF0aDsKKwlwam1lZGlhX3ZpZF9kZXZfaW5kZXgJZGV2X2lkOworCXBqc3VhX2NvbmZfcG9ydF9pZAlzbG90OworICAgIH0gYXZpW1BKU1VBX0FQUF9NQVhfQVZJXTsKKyAgICBwal9ib29sX3QgICAgICAgICAgICAgICBhdmlfYXV0b19wbGF5OworICAgIGludAkJCSAgICBhdmlfZGVmX2lkeDsKKworICAgIC8qIENMSSBzZXR0aW5nICovCisgICAgcGpfYm9vbF90CQkgICAgdXNlX2NsaTsKKyAgICBjbGlfY2ZnX3QJCSAgICBjbGlfY2ZnOworfSBwanN1YV9hcHBfY29uZmlnOworCisvKiogRXh0ZXJuIHZhcmlhYmxlIGRlY2xhcmF0aW9uICoqLworZXh0ZXJuIHBqc3VhX2NhbGxfaWQJICAgIGN1cnJlbnRfY2FsbDsKK2V4dGVybiBwanN1YV9hcHBfY29uZmlnCSAgICBhcHBfY29uZmlnOworZXh0ZXJuIGludAkJICAgIHN0ZG91dF9yZWZyZXNoOworZXh0ZXJuIHBqX2Jvb2xfdAkgICAgc3Rkb3V0X3JlZnJlc2hfcXVpdDsKK2V4dGVybiBwanN1YV9jYWxsX3NldHRpbmcgICBjYWxsX29wdDsKK2V4dGVybiBwanN1YV9tc2dfZGF0YQkgICAgbXNnX2RhdGE7CitleHRlcm4gcGpfYm9vbF90CSAgICBhcHBfcnVubmluZzsKKworaW50IG15X2F0b2koY29uc3QgY2hhciAqY3MpOworcGpfYm9vbF90IGZpbmRfbmV4dF9jYWxsKCk7Citwal9ib29sX3QgZmluZF9wcmV2X2NhbGwoKTsKK3ZvaWQgc2VuZF9yZXF1ZXN0KGNoYXIgKmNzdHJfbWV0aG9kLCBjb25zdCBwal9zdHJfdCAqZHN0X3VyaSk7Cit2b2lkIGxvZ19jYWxsX2R1bXAoaW50IGNhbGxfaWQpOworaW50IHdyaXRlX3NldHRpbmdzKHBqc3VhX2FwcF9jb25maWcgKmNmZywgY2hhciAqYnVmLCBwal9zaXplX3QgbWF4KTsKK3ZvaWQgYXBwX2NvbmZpZ19pbml0X3ZpZGVvKHBqc3VhX2FjY19jb25maWcgKmFjY19jZmcpOwordm9pZCBhcnJhbmdlX3dpbmRvdyhwanN1YV92aWRfd2luX2lkIHdpZCk7CisKKy8qKiBEZWZpbmVkIGluIHBqc3VhX2NsaV9jbWQuYyAqKi8KK3BqX2Jvb2xfdCBpc19jbGlfaW5pdGVkKCk7CisKKy8qKiBEZWZpbmVkIGluIHBqc3VhX2NvbmZpZy5jICoqLworLyoqIFRoaXMgaXMgdG8gbG9hZCB0aGUgY29uZmlndXJhdGlvbiAqKi8KK3BqX3N0YXR1c190IGxvYWRfY29uZmlnKGludCBhcmdjLCBjaGFyICoqYXJndiwgcGpfc3RyX3QgKnVyaV9hcmcpOworCisvKiogUGpzdWEgYXBwIGNhbGxiYWNrICoqLworLyoqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gQ0xJIGlzIHN0YXJ0ZWQuICoqLwordm9pZCBjbGlfb25fc3RhcnRlZChwal9zdGF0dXNfdCBzdGF0dXMpOworCisvKiogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiAic2h1dGRvd24iLyJyZXN0YXJ0IiBjb21tYW5kIGlzIGludm9rZWQgKiovCit2b2lkIGNsaV9vbl9zdG9wcGVkKHBqX2Jvb2xfdCByZXN0YXJ0LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisvKiogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiAicXVpdCIvInJlc3RhcnQiIGNvbW1hbmQgaXMgaW52b2tlZCAqKi8KK3ZvaWQgbGVnYWN5X29uX3N0b3BwZWQocGpfYm9vbF90IHJlc3RhcnQpOworCisvKiogUGpzdWEgY2xpIG1ldGhvZCAqKi8KK3BqX3N0YXR1c190IGNsaV9pbml0KCk7Citwal9zdGF0dXNfdCBjbGlfbWFpbihwal9ib29sX3Qgd2FpdF90ZWxuZXRfY2xpKTsKK3ZvaWQgY2xpX2Rlc3Ryb3koKTsKK3ZvaWQgY2xpX2dldF9pbmZvKGNoYXIgKmluZm8sIHBqX3NpemVfdCBzaXplKTsgCisKKy8qKiBMZWdhY3kgbWV0aG9kICoqLwordm9pZCBsZWdhY3lfbWFpbigpOworCisjaWYgUEpTVUFfSEFTX1ZJREVPCit2b2lkIHZpZF9wcmludF9kZXYoaW50IGlkLCBjb25zdCBwam1lZGlhX3ZpZF9kZXZfaW5mbyAqdmRpLCBjb25zdCBjaGFyICp0aXRsZSk7Cit2b2lkIHZpZF9saXN0X2RldnMoKTsKK3ZvaWQgYXBwX2NvbmZpZ19zaG93X3ZpZGVvKGludCBhY2NfaWQsIGNvbnN0IHBqc3VhX2FjY19jb25maWcgKmFjY19jZmcpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX01VTFRJUEFSVF9URVNUCisgICAgLyoKKyAgICAqIEVuYWJsZSBtdWx0aXBhcnQgaW4gbXNnX2RhdGEgYW5kIGFkZCBhIGR1bW15IGJvZHkgaW50byB0aGUKKyAgICAqIG11bHRpcGFydCBib2RpZXMuCisgICAgKi8KKyAgICB2b2lkIGFkZF9tdWx0aXBhcnQocGpzdWFfbXNnX2RhdGEgKm1zZ19kYXRhKTsKKyMgIGRlZmluZSBURVNUX01VTFRJUEFSVChtc2dfZGF0YSkJYWRkX211bHRpcGFydChtc2dfZGF0YSkKKyNlbHNlCisjICBkZWZpbmUgVEVTVF9NVUxUSVBBUlQobXNnX2RhdGEpCisjZW5kaWYKKworCitQSl9FTkRfREVDTAorICAgIAorI2VuZGlmCS8qIF9fUEpTVUFfQVBQX0NPTU1PTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbmZpZy5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDZkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfY29uZmlnLmMKQEAgLTAsMCArMSwyMTgwIEBACisvKiAkSWQ6IHBqc3VhX2FwcF9jb25maWcuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJwanN1YV9hcHBfY29tbW9uLmgiCisKKyNkZWZpbmUgVEhJU19GSUxFCSJwanN1YV9hcHBfY29uZmlnLmMiCisKKyNkZWZpbmUgTUFYX0FQUF9PUFRJT05TIDEyOAorCitjaGFyICAgKnN0ZG91dF9yZWZyZXNoX3RleHQgPSAiU1RET1VUX1JFRlJFU0giOworCisvKiBTaG93IHVzYWdlICovCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIHB1dHMgICgiVXNhZ2U6Iik7CisgICAgcHV0cyAgKCIgIHBqc3VhIFtvcHRpb25zXSBbU0lQIFVSTCB0byBjYWxsXSIpOworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJHZW5lcmFsIG9wdGlvbnM6Iik7CisgICAgcHV0cyAgKCIgIC0tY29uZmlnLWZpbGU9ZmlsZSAgUmVhZCB0aGUgY29uZmlnL2FyZ3VtZW50cyBmcm9tIGZpbGUuIik7CisgICAgcHV0cyAgKCIgIC0taGVscCAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgc2NyZWVuIik7CisgICAgcHV0cyAgKCIgIC0tdmVyc2lvbiAgICAgICAgICAgRGlzcGxheSB2ZXJzaW9uIGluZm8iKTsKKyAgICBwdXRzICAoIiIpOworICAgIHB1dHMgICgiTG9nZ2luZyBvcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLWxvZy1maWxlPWZuYW1lICAgIExvZyB0byBmaWxlbmFtZSAoZGVmYXVsdCBzdGRlcnIpIik7CisgICAgcHV0cyAgKCIgIC0tbG9nLWxldmVsPU4gICAgICAgU2V0IGxvZyBtYXggbGV2ZWwgdG8gTiAoMChub25lKSB0byA2KHRyYWNlKSkgKGRlZmF1bHQ9NSkiKTsKKyAgICBwdXRzICAoIiAgLS1hcHAtbG9nLWxldmVsPU4gICBTZXQgbG9nIG1heCBsZXZlbCBmb3Igc3Rkb3V0IGRpc3BsYXkgKGRlZmF1bHQ9NCkiKTsKKyAgICBwdXRzICAoIiAgLS1sb2ctYXBwZW5kICAgICAgICBBcHBlbmQgaW5zdGVhZCBvZiBvdmVyd3JpdGUgZXhpc3RpbmcgbG9nIGZpbGUuXG4iKTsKKyAgICBwdXRzICAoIiAgLS1jb2xvciAgICAgICAgICAgICBVc2UgY29sb3JmdWwgbG9nZ2luZyAoZGVmYXVsdCB5ZXMgb24gV2luMzIpIik7CisgICAgcHV0cyAgKCIgIC0tbm8tY29sb3IgICAgICAgICAgRGlzYWJsZSBjb2xvcmZ1bCBsb2dnaW5nIik7CisgICAgcHV0cyAgKCIgIC0tbGlnaHQtYmcgICAgICAgICAgVXNlIGRhcmsgY29sb3JzIGZvciBsaWdodCBiYWNrZ3JvdW5kIChkZWZhdWx0IGlzIGRhcmsgYmcpIik7CisgICAgcHV0cyAgKCIgIC0tbm8tc3RkZXJyICAgICAgICAgRGlzYWJsZSBzdGRlcnIiKTsKKworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJTSVAgQWNjb3VudCBvcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLXJlZ2lzdHJhcj11cmwgICAgIFNldCB0aGUgVVJMIG9mIHJlZ2lzdHJhciBzZXJ2ZXIiKTsKKyAgICBwdXRzICAoIiAgLS1pZD11cmwgICAgICAgICAgICBTZXQgdGhlIFVSTCBvZiBsb2NhbCBJRCAodXNlZCBpbiBGcm9tIGhlYWRlcikiKTsKKyAgICBwdXRzICAoIiAgLS1yZWFsbT1zdHJpbmcgICAgICBTZXQgcmVhbG0iKTsKKyAgICBwdXRzICAoIiAgLS11c2VybmFtZT1zdHJpbmcgICBTZXQgYXV0aGVudGljYXRpb24gdXNlcm5hbWUiKTsKKyAgICBwdXRzICAoIiAgLS1wYXNzd29yZD1zdHJpbmcgICBTZXQgYXV0aGVudGljYXRpb24gcGFzc3dvcmQiKTsKKyAgICBwdXRzICAoIiAgLS1jb250YWN0PXVybCAgICAgICBPcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBDb250YWN0IGluZm9ybWF0aW9uIik7CisgICAgcHV0cyAgKCIgIC0tY29udGFjdC1wYXJhbXM9UyAgQXBwZW5kIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBTIGluIENvbnRhY3QgaGVhZGVyIik7CisgICAgcHV0cyAgKCIgIC0tY29udGFjdC11cmktcGFyYW1zPVMgIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgUyBpbiBDb250YWN0IFVSSSIpOworICAgIHB1dHMgICgiICAtLXByb3h5PXVybCAgICAgICAgIE9wdGlvbmFsIFVSTCBvZiBwcm94eSBzZXJ2ZXIgdG8gdmlzaXQiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIik7CisgICAgcHJpbnRmKCIgIC0tcmVnLXRpbWVvdXQ9U0VDICAgT3B0aW9uYWwgcmVnaXN0cmF0aW9uIGludGVydmFsIChkZWZhdWx0ICVkKVxuIiwKKwkgICAgUEpTVUFfUkVHX0lOVEVSVkFMKTsKKyAgICBwcmludGYoIiAgLS1yZXJlZy1kZWxheT1TRUMgICBPcHRpb25hbCBhdXRvIHJldHJ5IHJlZ2lzdHJhdGlvbiBpbnRlcnZhbCAoZGVmYXVsdCAlZClcbiIsCisJICAgIFBKU1VBX1JFR19SRVRSWV9JTlRFUlZBTCk7CisgICAgcHV0cyAgKCIgIC0tcmVnLXVzZS1wcm94eT1OICAgQ29udHJvbCB0aGUgdXNlIG9mIHByb3h5IHNldHRpbmdzIGluIFJFR0lTVEVSLiIpOworICAgIHB1dHMgICgiICAgICAgICAgICAgICAgICAgICAgIDA9bm8gcHJveHksIDE9b3V0Ym91bmQgb25seSwgMj1hY2Mgb25seSwgMz1hbGwgKGRlZmF1bHQpIik7CisgICAgcHV0cyAgKCIgIC0tcHVibGlzaCAgICAgICAgICAgU2VuZCBwcmVzZW5jZSBQVUJMSVNIIGZvciB0aGlzIGFjY291bnQiKTsKKyAgICBwdXRzICAoIiAgLS1td2kgICAgICAgICAgICAgICBTdWJzY3JpYmUgdG8gbWVzc2FnZSBzdW1tYXJ5L3dhaXRpbmcgaW5kaWNhdGlvbiIpOworICAgIHB1dHMgICgiICAtLXVzZS1pbXMgICAgICAgICAgIEVuYWJsZSAzR1BQL0lNUyByZWxhdGVkIHNldHRpbmdzIG9uIHRoaXMgYWNjb3VudCIpOworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAgICBwdXRzICAoIiAgLS11c2Utc3J0cD1OICAgICAgICBVc2UgU1JUUD8gIDA6ZGlzYWJsZWQsIDE6b3B0aW9uYWwsIDI6bWFuZGF0b3J5LCIpOworICAgIHB1dHMgICgiICAgICAgICAgICAgICAgICAgICAgIDM6b3B0aW9uYWwgYnkgZHVwbGljYXRpbmcgbWVkaWEgb2ZmZXIgKGRlZjowKSIpOworICAgIHB1dHMgICgiICAtLXNydHAtc2VjdXJlPU4gICAgIFNSVFAgcmVxdWlyZSBzZWN1cmUgU0lQPyAwOm5vLCAxOnRscywgMjpzaXBzIChkZWY6MSkiKTsKKyNlbmRpZgorICAgIHB1dHMgICgiICAtLXVzZS0xMDByZWwgICAgICAgIFJlcXVpcmUgcmVsaWFibGUgcHJvdmlzaW9uYWwgcmVzcG9uc2UgKDEwMHJlbCkiKTsKKyAgICBwdXRzICAoIiAgLS11c2UtdGltZXI9TiAgICAgICBVc2UgU0lQIHNlc3Npb24gdGltZXJzPyAoZGVmYXVsdD0xKSIpOworICAgIHB1dHMgICgiICAgICAgICAgICAgICAgICAgICAgIDA6aW5hY3RpdmUsIDE6b3B0aW9uYWwsIDI6bWFuZGF0b3J5LCAzOmFsd2F5cyIpOworICAgIHByaW50ZigiICAtLXRpbWVyLXNlPU4gICAgICAgIFNlc3Npb24gdGltZXJzIGV4cGlyYXRpb24gcGVyaW9kLCBpbiBzZWNzIChkZWY6JWQpXG4iLAorCSAgICBQSlNJUF9TRVNTX1RJTUVSX0RFRl9TRSk7CisgICAgcHV0cyAgKCIgIC0tdGltZXItbWluLXNlPU4gICAgU2Vzc2lvbiB0aW1lcnMgbWluaW11bSBleHBpcmF0aW9uIHBlcmlvZCwgaW4gc2VjcyAoZGVmOjkwKSIpOworICAgIHB1dHMgICgiICAtLW91dGItcmlkPXN0cmluZyAgIFNldCBTSVAgb3V0Ym91bmQgcmVnLWlkIChkZWZhdWx0OjEpIik7CisgICAgcHV0cyAgKCIgIC0tYXV0by11cGRhdGUtbmF0PU4gV2hlcmUgTiBpcyAwIG9yIDEgdG8gZW5hYmxlL2Rpc2FibGUgU0lQIHRyYXZlcnNhbCBiZWhpbmQiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWMgTkFUIChkZWZhdWx0IDEpIik7CisgICAgcHV0cyAgKCIgIC0tZGlzYWJsZS1zdHVuICAgICAgRGlzYWJsZSBTVFVOIGZvciB0aGlzIGFjY291bnQiKTsKKyAgICBwdXRzICAoIiAgLS1uZXh0LWNyZWQgICAgICAgICBBZGQgYW5vdGhlciBjcmVkZW50aWFscyIpOworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJTSVAgQWNjb3VudCBDb250cm9sOiIpOworICAgIHB1dHMgICgiICAtLW5leHQtYWNjb3VudCAgICAgIEFkZCBtb3JlIGFjY291bnQiKTsKKyAgICBwdXRzICAoIiIpOworICAgIHB1dHMgICgiVHJhbnNwb3J0IE9wdGlvbnM6Iik7CisjaWYgZGVmaW5lZChQSl9IQVNfSVBWNikgJiYgUEpfSEFTX0lQVjYKKyAgICBwdXRzICAoIiAgLS1pcHY2ICAgICAgICAgICAgICBVc2UgSVB2NiBpbnN0ZWFkIGZvciBTSVAgYW5kIG1lZGlhLiIpOworI2VuZGlmCisgICAgcHV0cyAgKCIgIC0tc2V0LXFvcyAgICAgICAgICAgRW5hYmxlIFFvUyB0YWdnaW5nIGZvciBTSVAgYW5kIG1lZGlhLiIpOworICAgIHB1dHMgICgiICAtLWxvY2FsLXBvcnQ9cG9ydCAgIFNldCBUQ1AvVURQIHBvcnQuIFRoaXMgaW1wbGljaXRseSBlbmFibGVzIGJvdGggIik7CisgICAgcHV0cyAgKCIgICAgICAgICAgICAgICAgICAgICAgVENQIGFuZCBVRFAgdHJhbnNwb3J0cyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIHVubGVzcyIpOworICAgIHB1dHMgICgiICAgICAgICAgICAgICAgICAgICAgIGlmIFRDUCBvciBVRFAgaXMgZGlzYWJsZWQuIik7CisgICAgcHV0cyAgKCIgIC0taXAtYWRkcj1JUCAgICAgICAgVXNlIHRoZSBzcGVjaWZlZCBhZGRyZXNzIGFzIFNJUCBhbmQgUlRQIGFkZHJlc3Nlcy4iKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICAoSGludDogdGhlIElQIG1heSBiZSB0aGUgcHVibGljIElQIG9mIHRoZSBOQVQvcm91dGVyKSIpOworICAgIHB1dHMgICgiICAtLWJvdW5kLWFkZHI9SVAgICAgIEJpbmQgdHJhbnNwb3J0cyB0byB0aGlzIElQIGludGVyZmFjZSIpOworICAgIHB1dHMgICgiICAtLW5vLXRjcCAgICAgICAgICAgIERpc2FibGUgVENQIHRyYW5zcG9ydC4iKTsKKyAgICBwdXRzICAoIiAgLS1uby11ZHAgICAgICAgICAgICBEaXNhYmxlIFVEUCB0cmFuc3BvcnQuIik7CisgICAgcHV0cyAgKCIgIC0tbmFtZXNlcnZlcj1OUyAgICAgQWRkIHRoZSBzcGVjaWZpZWQgbmFtZXNlcnZlciB0byBlbmFibGUgU1JWIHJlc29sdXRpb24iKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBjYW4gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiIpOworICAgIHB1dHMgICgiICAtLW91dGJvdW5kPXVybCAgICAgIFNldCB0aGUgVVJMIG9mIGdsb2JhbCBvdXRib3VuZCBwcm94eSBzZXJ2ZXIiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIik7CisgICAgcHV0cyAgKCIgIC0tc3R1bi1zcnY9Rk9STUFUICAgU2V0IFNUVU4gc2VydmVyIGhvc3Qgb3IgZG9tYWluLiBUaGlzIG9wdGlvbiBtYXkgYmUiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuIEZPUk1BVCBpcyBob3N0ZG9tWzpQT1JUXSIpOworCisjaWYgZGVmaW5lZChQSlNJUF9IQVNfVExTX1RSQU5TUE9SVCkgJiYgKFBKU0lQX0hBU19UTFNfVFJBTlNQT1JUICE9IDApCisgICAgcHV0cyAgKCIiKTsKKyAgICBwdXRzICAoIlRMUyBPcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLXVzZS10bHMgICAgICAgICAgIEVuYWJsZSBUTFMgdHJhbnNwb3J0IChkZWZhdWx0PW5vKSIpOworICAgIHB1dHMgICgiICAtLXRscy1jYS1maWxlICAgICAgIFNwZWNpZnkgVExTIENBIGZpbGUgKGRlZmF1bHQ9bm9uZSkiKTsKKyAgICBwdXRzICAoIiAgLS10bHMtY2VydC1maWxlICAgICBTcGVjaWZ5IFRMUyBjZXJ0aWZpY2F0ZSBmaWxlIChkZWZhdWx0PW5vbmUpIik7CisgICAgcHV0cyAgKCIgIC0tdGxzLXByaXZrZXktZmlsZSAgU3BlY2lmeSBUTFMgcHJpdmF0ZSBrZXkgZmlsZSAoZGVmYXVsdD1ub25lKSIpOworICAgIHB1dHMgICgiICAtLXRscy1wYXNzd29yZCAgICAgIFNwZWNpZnkgVExTIHBhc3N3b3JkIHRvIHByaXZhdGUga2V5IGZpbGUgKGRlZmF1bHQ9bm9uZSkiKTsKKyAgICBwdXRzICAoIiAgLS10bHMtdmVyaWZ5LXNlcnZlciBWZXJpZnkgc2VydmVyJ3MgY2VydGlmaWNhdGUgKGRlZmF1bHQ9bm8pIik7CisgICAgcHV0cyAgKCIgIC0tdGxzLXZlcmlmeS1jbGllbnQgVmVyaWZ5IGNsaWVudCdzIGNlcnRpZmljYXRlIChkZWZhdWx0PW5vKSIpOworICAgIHB1dHMgICgiICAtLXRscy1uZWctdGltZW91dCAgIFNwZWNpZnkgVExTIG5lZ290aWF0aW9uIHRpbWVvdXQgKGRlZmF1bHQ9bm8pIik7CisgICAgcHV0cyAgKCIgIC0tdGxzLXNydi1uYW1lICAgICAgU3BlY2lmeSBUTFMgc2VydmVyIG5hbWUgZm9yIG11bHRpaG9zdGluZyBzZXJ2ZXIiKTsKKyAgICBwdXRzICAoIiAgLS10bHMtY2lwaGVyICAgICAgICBTcGVjaWZ5IHByZWZlcmVkIFRMUyBjaXBoZXIgKG9wdGlvbmFsKS4iKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIik7CisjZW5kaWYKKworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJBdWRpbyBPcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLWFkZC1jb2RlYz1uYW1lICAgIE1hbnVhbGx5IGFkZCBjb2RlYyAoZGVmYXVsdCBpcyB0byBlbmFibGUgYWxsKSIpOworICAgIHB1dHMgICgiICAtLWRpcy1jb2RlYz1uYW1lICAgIERpc2FibGUgY29kZWMgKGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMpIik7CisgICAgcHV0cyAgKCIgIC0tY2xvY2stcmF0ZT1OICAgICAgT3ZlcnJpZGUgY29uZmVyZW5jZSBicmlkZ2UgY2xvY2sgcmF0ZSIpOworICAgIHB1dHMgICgiICAtLXNuZC1jbG9jay1yYXRlPU4gIE92ZXJyaWRlIHNvdW5kIGRldmljZSBjbG9jayByYXRlIik7CisgICAgcHV0cyAgKCIgIC0tc3RlcmVvICAgICAgICAgICAgQXVkaW8gZGV2aWNlIGFuZCBjb25mZXJlbmNlIGJyaWRnZSBvcGVuZWQgaW4gc3RlcmVvIG1vZGUiKTsKKyAgICBwdXRzICAoIiAgLS1udWxsLWF1ZGlvICAgICAgICBVc2UgTlVMTCBhdWRpbyBkZXZpY2UiKTsKKyAgICBwdXRzICAoIiAgLS1wbGF5LWZpbGU9ZmlsZSAgICBSZWdpc3RlciBXQVYgZmlsZSBpbiBjb25mZXJlbmNlIGJyaWRnZS4iKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIik7CisgICAgcHV0cyAgKCIgIC0tcGxheS10b25lPUZPUk1BVCAgUmVnaXN0ZXIgdG9uZSB0byB0aGUgY29uZmVyZW5jZSBicmlkZ2UuIik7CisgICAgcHV0cyAgKCIgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIGlzICdGMSxGMixPTixPRkYnLCB3aGVyZSBGMSxGMiBhcmUiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcywgYW5kIE9OLE9GRj1vbi9vZmYgZHVyYXRpb24gaW4gbXNlYy4iKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIik7CisgICAgcHV0cyAgKCIgIC0tYXV0by1wbGF5ICAgICAgICAgQXV0b21hdGljYWxseSBwbGF5IHRoZSBmaWxlICh0byBpbmNvbWluZyBjYWxscyBvbmx5KSIpOworICAgIHB1dHMgICgiICAtLWF1dG8tbG9vcCAgICAgICAgIEF1dG9tYXRpY2FsbHkgbG9vcCBpbmNvbWluZyBSVFAgdG8gb3V0Z29pbmcgUlRQIik7CisgICAgcHV0cyAgKCIgIC0tYXV0by1jb25mICAgICAgICAgQXV0b21hdGljYWxseSBwdXQgY2FsbHMgaW4gY29uZmVyZW5jZSB3aXRoIG90aGVycyIpOworICAgIHB1dHMgICgiICAtLXJlYy1maWxlPWZpbGUgICAgIE9wZW4gZmlsZSByZWNvcmRlciAoZXh0ZW5zaW9uIGNhbiBiZSAud2F2IG9yIC5tcDMiKTsKKyAgICBwdXRzICAoIiAgLS1hdXRvLXJlYyAgICAgICAgICBBdXRvbWF0aWNhbGx5IHJlY29yZCBjb252ZXJzYXRpb24iKTsKKyAgICBwdXRzICAoIiAgLS1xdWFsaXR5PU4gICAgICAgICBTcGVjaWZ5IG1lZGlhIHF1YWxpdHkgKDAtMTAsIGRlZmF1bHQ9NikiKTsKKyAgICBwdXRzICAoIiAgLS1wdGltZT1NU0VDICAgICAgICBPdmVycmlkZSBjb2RlYyBwdGltZSB0byBNU0VDIChkZWZhdWx0PXNwZWNpZmljKSIpOworICAgIHB1dHMgICgiICAtLW5vLXZhZCAgICAgICAgICAgIERpc2FibGUgVkFEL3NpbGVuY2UgZGV0ZWN0b3IgKGRlZmF1bHQ9dmFkIGVuYWJsZWQpIik7CisgICAgcHV0cyAgKCIgIC0tZWMtdGFpbD1NU0VDICAgICAgU2V0IGVjaG8gY2FuY2VsbGVyIHRhaWwgbGVuZ3RoIChkZWZhdWx0PTI1NikiKTsKKyAgICBwdXRzICAoIiAgLS1lYy1vcHQ9T1BUICAgICAgICBTZWxlY3QgZWNobyBjYW5jZWxsZXIgYWxnb3JpdGhtICgwPWRlZmF1bHQsICIpOworICAgIHB1dHMgICgiICAgICAgICAgICAgICAgICAgICAgICAgMT1zcGVleCwgMj1zdXBwcmVzc29yKSIpOworICAgIHB1dHMgICgiICAtLWlsYmMtbW9kZT1NT0RFICAgIFNldCBpTEJDIGNvZGVjIG1vZGUgKDIwIG9yIDMwLCBkZWZhdWx0IGlzIDMwKSIpOworICAgIHB1dHMgICgiICAtLWNhcHR1cmUtZGV2PWlkICAgIEF1ZGlvIGNhcHR1cmUgZGV2aWNlIElEIChkZWZhdWx0PS0xKSIpOworICAgIHB1dHMgICgiICAtLXBsYXliYWNrLWRldj1pZCAgIEF1ZGlvIHBsYXliYWNrIGRldmljZSBJRCAoZGVmYXVsdD0tMSkiKTsKKyAgICBwdXRzICAoIiAgLS1jYXB0dXJlLWxhdD1OICAgICBBdWRpbyBjYXB0dXJlIGxhdGVuY3ksIGluIG1zIChkZWZhdWx0PTEwMCkiKTsKKyAgICBwdXRzICAoIiAgLS1wbGF5YmFjay1sYXQ9TiAgICBBdWRpbyBwbGF5YmFjayBsYXRlbmN5LCBpbiBtcyAoZGVmYXVsdD0xMDApIik7CisgICAgcHV0cyAgKCIgIC0tc25kLWF1dG8tY2xvc2U9TiAgQXV0byBjbG9zZSBhdWRpbyBkZXZpY2Ugd2hlbiBpZGxlIGZvciBOIHNlY3MgKGRlZmF1bHQ9MSkiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IE49LTEgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuIik7CisgICAgcHV0cyAgKCIgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBOPTAgZm9yIGluc3RhbnQgY2xvc2Ugd2hlbiB1bnVzZWQuIik7CisgICAgcHV0cyAgKCIgIC0tbm8tdG9uZXMgICAgICAgICAgRGlzYWJsZSBhdWRpYmxlIHRvbmVzIik7CisgICAgcHV0cyAgKCIgIC0tamItbWF4LXNpemUgICAgICAgU3BlY2lmeSBqaXR0ZXIgYnVmZmVyIG1heGltdW0gc2l6ZSwgaW4gZnJhbWVzIChkZWZhdWx0PS0xKSIpOworICAgIHB1dHMgICgiICAtLWV4dHJhLWF1ZGlvICAgICAgIEFkZCBvbmUgbW9yZSBhdWRpbyBzdHJlYW0iKTsKKworI2lmIFBKU1VBX0hBU19WSURFTworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJWaWRlbyBPcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLXZpZGVvICAgICAgICAgICAgIEVuYWJsZSB2aWRlbyIpOworICAgIHB1dHMgICgiICAtLXZjYXB0dXJlLWRldj1pZCAgIFZpZGVvIGNhcHR1cmUgZGV2aWNlIElEIChkZWZhdWx0PS0xKSIpOworICAgIHB1dHMgICgiICAtLXZyZW5kZXItZGV2PWlkICAgIFZpZGVvIHJlbmRlciBkZXZpY2UgSUQgKGRlZmF1bHQ9LTIpIik7CisgICAgcHV0cyAgKCIgIC0tcGxheS1hdmk9RklMRSAgICAgTG9hZCB0aGlzIEFWSSBhcyB2aXJ0dWFsIGNhcHR1cmUgZGV2aWNlIik7CisgICAgcHV0cyAgKCIgIC0tYXV0by1wbGF5LWF2aSAgICAgQXV0b21hdGljYWxseSBwbGF5IHRoZSBBVkkgbWVkaWEgdG8gY2FsbCIpOworI2VuZGlmCisKKyAgICBwdXRzICAoIiIpOworICAgIHB1dHMgICgiTWVkaWEgVHJhbnNwb3J0IE9wdGlvbnM6Iik7CisgICAgcHV0cyAgKCIgIC0tdXNlLWljZSAgICAgICAgICAgRW5hYmxlIElDRSAoZGVmYXVsdDpubykiKTsKKyAgICBwdXRzICAoIiAgLS1pY2UtcmVndWxhciAgICAgICBVc2UgSUNFIHJlZ3VsYXIgbm9taW5hdGlvbiAoZGVmYXVsdDogYWdncmVzc2l2ZSkiKTsKKyAgICBwdXRzICAoIiAgLS1pY2UtbWF4LWhvc3RzPU4gICBTZXQgbWF4aW11bSBudW1iZXIgb2YgSUNFIGhvc3QgY2FuZGlkYXRlcyIpOworICAgIHB1dHMgICgiICAtLWljZS1uby1ydGNwICAgICAgIERpc2FibGUgUlRDUCBjb21wb25lbnQgaW4gSUNFIChkZWZhdWx0OiBubykiKTsKKyAgICBwdXRzICAoIiAgLS1ydHAtcG9ydD1OICAgICAgICBCYXNlIHBvcnQgdG8gdHJ5IGZvciBSVFAgKGRlZmF1bHQ9NDAwMCkiKTsKKyAgICBwdXRzICAoIiAgLS1yeC1kcm9wLXBjdD1QQ1QgICBEcm9wIFBDVCBwZXJjZW50IG9mIFJYIFJUUCAoZm9yIHBrdCBsb3N0IHNpbSwgZGVmYXVsdDogMCkiKTsKKyAgICBwdXRzICAoIiAgLS10eC1kcm9wLXBjdD1QQ1QgICBEcm9wIFBDVCBwZXJjZW50IG9mIFRYIFJUUCAoZm9yIHBrdCBsb3N0IHNpbSwgZGVmYXVsdDogMCkiKTsKKyAgICBwdXRzICAoIiAgLS11c2UtdHVybiAgICAgICAgICBFbmFibGUgVFVSTiByZWxheSB3aXRoIElDRSAoZGVmYXVsdDpubykiKTsKKyAgICBwdXRzICAoIiAgLS10dXJuLXNydiAgICAgICAgICBEb21haW4gb3IgaG9zdCBuYW1lIG9mIFRVUk4gc2VydmVyIChcIk5BTUU6UE9SVFwiIGZvcm1hdCkiKTsKKyAgICBwdXRzICAoIiAgLS10dXJuLXRjcCAgICAgICAgICBVc2UgVENQIGNvbm5lY3Rpb24gdG8gVFVSTiBzZXJ2ZXIgKGRlZmF1bHQgbm8pIik7CisgICAgcHV0cyAgKCIgIC0tdHVybi11c2VyICAgICAgICAgVFVSTiB1c2VybmFtZSIpOworICAgIHB1dHMgICgiICAtLXR1cm4tcGFzc3dkICAgICAgIFRVUk4gcGFzc3dvcmQiKTsKKworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJCdWRkeSBMaXN0IChjYW4gYmUgbW9yZSB0aGFuIG9uZSk6Iik7CisgICAgcHV0cyAgKCIgIC0tYWRkLWJ1ZGR5IHVybCAgICAgQWRkIHRoZSBzcGVjaWZpZWQgVVJMIHRvIHRoZSBidWRkeSBsaXN0LiIpOworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJVc2VyIEFnZW50IG9wdGlvbnM6Iik7CisgICAgcHV0cyAgKCIgIC0tYXV0by1hbnN3ZXI9Y29kZSAgQXV0b21hdGljYWxseSBhbnN3ZXIgaW5jb21pbmcgY2FsbHMgd2l0aCBjb2RlIChlLmcuIDIwMCkiKTsKKyAgICBwdXRzICAoIiAgLS1tYXgtY2FsbHM9TiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNhbGxzIChkZWZhdWx0OjQsIG1heDoyNTUpIik7CisgICAgcHV0cyAgKCIgIC0tdGhyZWFkLWNudD1OICAgICAgTnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIChkZWZhdWx0OjEpIik7CisgICAgcHV0cyAgKCIgIC0tZHVyYXRpb249U0VDICAgICAgU2V0IG1heGltdW0gY2FsbCBkdXJhdGlvbiAoZGVmYXVsdDpubyBsaW1pdCkiKTsKKyAgICBwdXRzICAoIiAgLS1ub3JlZmVyc3ViICAgICAgICBTdXBwcmVzcyBldmVudCBzdWJzY3JpcHRpb24gd2hlbiB0cmFuc2ZlcmluZyBjYWxscyIpOworICAgIHB1dHMgICgiICAtLXVzZS1jb21wYWN0LWZvcm0gIE1pbmltaXplIFNJUCBtZXNzYWdlIHNpemUiKTsKKyAgICBwdXRzICAoIiAgLS1uby1mb3JjZS1sciAgICAgICBBbGxvdyBzdHJpY3Qtcm91dGUgdG8gYmUgdXNlZCAoaS5lLiBkbyBub3QgZm9yY2UgbHIpIik7CisgICAgcHV0cyAgKCIgIC0tYWNjZXB0LXJlZGlyZWN0PU4gU3BlY2lmeSBob3cgdG8gaGFuZGxlIGNhbGwgcmVkaXJlY3QgKDN4eCkgcmVzcG9uc2UuIik7CisgICAgcHV0cyAgKCIgICAgICAgICAgICAgICAgICAgICAgMDogcmVqZWN0LCAxOiBmb2xsb3cgYXV0b21hdGljYWxseSwiKTsKKyAgICBwdXRzICAoIiAgICAgICAgICAgICAgICAgICAgICAyOiBmb2xsb3cgKyByZXBsYWNlIFRvIGhlYWRlciAoZGVmYXVsdCksIDM6IGFzayIpOworCisgICAgcHV0cyAgKCIiKTsKKyAgICBwdXRzICAoIkNMSSBvcHRpb25zOiIpOworICAgIHB1dHMgICgiICAtLXVzZS1jbGkgICAgICAgICAgIFVzZSBDTEkgYXMgdXNlciBpbnRlcmZhY2UiKTsKKyAgICBwdXRzICAoIiAgLS1jbGktdGVsbmV0LXBvcnQ9TiBDTEkgdGVsbmV0IHBvcnQiKTsKKyAgICBwdXRzICAoIiAgLS1uby1jbGktY29uc29sZSAgICBEaXNhYmxlIENMSSBjb25zb2xlIik7CisgICAgcHV0cyAgKCIiKTsKKworICAgIHB1dHMgICgiIik7CisgICAgcHV0cyAgKCJXaGVuIFVSTCBpcyBzcGVjaWZpZWQsIHBqc3VhIHdpbGwgaW1tZWRpYXRlbHkgaW5pdGlhdGUgY2FsbCB0byB0aGF0IFVSTCIpOworICAgIHB1dHMgICgiIik7CisKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKworLyoKKyAqIFJlYWQgY29tbWFuZCBhcmd1bWVudHMgZnJvbSBjb25maWcgZmlsZS4KKyAqLworc3RhdGljIGludCByZWFkX2NvbmZpZ19maWxlKHBqX3Bvb2xfdCAqcG9vbCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIAorCQkJICAgIGludCAqYXBwX2FyZ2MsIGNoYXIgKioqYXBwX2FyZ3YpCit7CisgICAgaW50IGk7CisgICAgRklMRSAqZmhuZDsKKyAgICBjaGFyIGxpbmVbMjAwXTsKKyAgICBpbnQgYXJnYyA9IDA7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgZW51bSB7IE1BWF9BUkdTID0gMTI4IH07CisKKyAgICAvKiBBbGxvY2F0ZSBNQVhfQVJHUysxIChhcmd2IG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQgd2l0aCBOVUxMIGFyZ3VtZW50KSAqLworICAgIGFyZ3YgPSBwal9wb29sX2NhbGxvYyhwb29sLCBNQVhfQVJHUysxLCBzaXplb2YoY2hhciopKTsKKyAgICBhcmd2W2FyZ2MrK10gPSAqYXBwX2FyZ3ZbMF07CisKKyAgICAvKiBPcGVuIGNvbmZpZyBmaWxlLiAqLworICAgIGZobmQgPSBmb3BlbihmaWxlbmFtZSwgInJ0Iik7CisgICAgaWYgKCFmaG5kKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIGNvbmZpZyBmaWxlICVzIiwgZmlsZW5hbWUpKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogU2NhbiB0b2tlbnMgaW4gdGhlIGZpbGUuICovCisgICAgd2hpbGUgKGFyZ2MgPCBNQVhfQVJHUyAmJiAhZmVvZihmaG5kKSkgeworCWNoYXIgICp0b2tlbjsKKwljaGFyICAqcDsKKwljb25zdCBjaGFyICp3aGl0ZXNwYWNlID0gIiBcdFxyXG4iOworCWNoYXIgIGNEZWxpbWl0ZXI7CisJcGpfc2l6ZV90ICAgbGVuOworCWludCB0b2tlbl9sZW47CisJCisJcGpfYnplcm8obGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlpZiAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmaG5kKSA9PSBOVUxMKSBicmVhazsKKwkKKwkvLyBUcmltIGVuZGluZyBuZXdsaW5lcworCWxlbiA9IHN0cmxlbihsaW5lKTsKKwlpZiAobGluZVtsZW4tMV09PSdcbicpCisJICAgIGxpbmVbLS1sZW5dID0gJ1wwJzsKKwlpZiAobGluZVtsZW4tMV09PSdccicpCisJICAgIGxpbmVbLS1sZW5dID0gJ1wwJzsKKworCWlmIChsZW49PTApIGNvbnRpbnVlOworCisJZm9yIChwID0gbGluZTsgKnAgIT0gJ1wwJyAmJiBhcmdjIDwgTUFYX0FSR1M7IHArKykgeworCSAgICAvLyBmaXJzdCwgc2NhbiB3aGl0ZXNwYWNlcworCSAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiBzdHJjaHIod2hpdGVzcGFjZSwgKnApICE9IE5VTEwpIHArKzsKKworCSAgICBpZiAoKnAgPT0gJ1wwJykJCSAgICAvLyBhcmUgd2UgZG9uZSB5ZXQ/CisJCWJyZWFrOworCSAgICAKKwkgICAgaWYgKCpwID09ICciJyB8fCAqcCA9PSAnXCcnKSB7ICAgIC8vIGlzIHRva2VuIGEgcXVvdGVkIHN0cmluZworCQljRGVsaW1pdGVyID0gKnArKzsJICAgIC8vIHNhdmUgcXVvdGUgZGVsaW1pdGVyCisJCXRva2VuID0gcDsKKwkJCisJCXdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9IGNEZWxpbWl0ZXIpIHArKzsKKwkJCisJCWlmICgqcCA9PSAnXDAnKQkJLy8gZm91bmQgZW5kIG9mIHRoZSBsaW5lLCBidXQsCisJCSAgICBjRGVsaW1pdGVyID0gJ1wwJzsJLy8gZGlkbid0IGZpbmQgYSBtYXRjaGluZyBxdW90ZQorCisJICAgIH0gZWxzZSB7CQkJLy8gdG9rZW4ncyBub3QgYSBxdW90ZWQgc3RyaW5nCisJCXRva2VuID0gcDsKKwkJCisJCXdoaWxlICgqcCAhPSAnXDAnICYmIHN0cmNocih3aGl0ZXNwYWNlLCAqcCkgPT0gTlVMTCkgcCsrOworCQkKKwkJY0RlbGltaXRlciA9ICpwOworCSAgICB9CisJICAgIAorCSAgICAqcCA9ICdcMCc7CisJICAgIHRva2VuX2xlbiA9IChpbnQpKHAtdG9rZW4pOworCSAgICAKKwkgICAgaWYgKHRva2VuX2xlbiA+IDApIHsKKwkJaWYgKCp0b2tlbiA9PSAnIycpCisJCSAgICBicmVhazsgIC8vIGlnbm9yZSByZW1haW5kZXIgb2YgbGluZQorCQkKKwkJYXJndlthcmdjXSA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgdG9rZW5fbGVuICsgMSk7CisJCXBqX21lbWNweShhcmd2W2FyZ2NdLCB0b2tlbiwgdG9rZW5fbGVuICsgMSk7CisJCSsrYXJnYzsKKwkgICAgfQorCSAgICAKKwkgICAgKnAgPSBjRGVsaW1pdGVyOworCX0KKyAgICB9CisKKyAgICAvKiBDb3B5IGFyZ3VtZW50cyBmcm9tIGNvbW1hbmQgbGluZSAqLworICAgIGZvciAoaT0xOyBpPCphcHBfYXJnYyAmJiBhcmdjIDwgTUFYX0FSR1M7ICsraSkKKwlhcmd2W2FyZ2MrK10gPSAoKmFwcF9hcmd2KVtpXTsKKworICAgIGlmIChhcmdjID09IE1BWF9BUkdTICYmIChpIT0qYXBwX2FyZ2MgfHwgIWZlb2YoZmhuZCkpKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCSAgIlRvbyBtYW55IGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gY21kIGxpbmUvY29uZmlnIGZpbGUiKSk7CisJZmZsdXNoKHN0ZG91dCk7CisJZmNsb3NlKGZobmQpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBmY2xvc2UoZmhuZCk7CisKKyAgICAvKiBBc3NpZ24gdGhlIG5ldyBjb21tYW5kIGxpbmUgYmFjayB0byB0aGUgb3JpZ2luYWwgY29tbWFuZCBsaW5lLiAqLworICAgICphcHBfYXJnYyA9IGFyZ2M7CisgICAgKmFwcF9hcmd2ID0gYXJndjsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgYXJndW1lbnRzLiAqLworc3RhdGljIHBqX3N0YXR1c190IHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgCQkJICAgICAgCisJCQkgICAgICBwal9zdHJfdCAqdXJpX3RvX2NhbGwpCit7CisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKyAgICBwanN1YV9hcHBfY29uZmlnICpjZmcgPSAmYXBwX2NvbmZpZzsKKyAgICBlbnVtIHsgT1BUX0NPTkZJR19GSUxFPTEyNywgT1BUX0xPR19GSUxFLCBPUFRfTE9HX0xFVkVMLCBPUFRfQVBQX0xPR19MRVZFTCwgCisJICAgT1BUX0xPR19BUFBFTkQsIE9QVF9DT0xPUiwgT1BUX05PX0NPTE9SLCBPUFRfTElHSFRfQkcsIE9QVF9OT19TVERFUlIsCisJICAgT1BUX0hFTFAsIE9QVF9WRVJTSU9OLCBPUFRfTlVMTF9BVURJTywgT1BUX1NORF9BVVRPX0NMT1NFLAorCSAgIE9QVF9MT0NBTF9QT1JULCBPUFRfSVBfQUREUiwgT1BUX1BST1hZLCBPUFRfT1VUQk9VTkRfUFJPWFksIAorCSAgIE9QVF9SRUdJU1RSQVIsIE9QVF9SRUdfVElNRU9VVCwgT1BUX1BVQkxJU0gsIE9QVF9JRCwgT1BUX0NPTlRBQ1QsCisJICAgT1BUX0JPVU5EX0FERFIsIE9QVF9DT05UQUNUX1BBUkFNUywgT1BUX0NPTlRBQ1RfVVJJX1BBUkFNUywKKwkgICBPUFRfMTAwUkVMLCBPUFRfVVNFX0lNUywgT1BUX1JFQUxNLCBPUFRfVVNFUk5BTUUsIE9QVF9QQVNTV09SRCwKKwkgICBPUFRfUkVHX1JFVFJZX0lOVEVSVkFMLCBPUFRfUkVHX1VTRV9QUk9YWSwKKwkgICBPUFRfTVdJLCBPUFRfTkFNRVNFUlZFUiwgT1BUX1NUVU5fU1JWLCBPUFRfT1VUQl9SSUQsCisJICAgT1BUX0FERF9CVUREWSwgT1BUX09GRkVSX1hfTVNfTVNHLCBPUFRfTk9fUFJFU0VOQ0UsCisJICAgT1BUX0FVVE9fQU5TV0VSLCBPUFRfQVVUT19QTEFZLCBPUFRfQVVUT19QTEFZX0hBTkdVUCwgT1BUX0FVVE9fTE9PUCwKKwkgICBPUFRfQVVUT19DT05GLCBPUFRfQ0xPQ0tfUkFURSwgT1BUX1NORF9DTE9DS19SQVRFLCBPUFRfU1RFUkVPLAorCSAgIE9QVF9VU0VfSUNFLCBPUFRfSUNFX1JFR1VMQVIsIE9QVF9VU0VfU1JUUCwgT1BUX1NSVFBfU0VDVVJFLAorCSAgIE9QVF9VU0VfVFVSTiwgT1BUX0lDRV9NQVhfSE9TVFMsIE9QVF9JQ0VfTk9fUlRDUCwgT1BUX1RVUk5fU1JWLCAKKwkgICBPUFRfVFVSTl9UQ1AsIE9QVF9UVVJOX1VTRVIsIE9QVF9UVVJOX1BBU1NXRCwKKwkgICBPUFRfUExBWV9GSUxFLCBPUFRfUExBWV9UT05FLCBPUFRfUlRQX1BPUlQsIE9QVF9BRERfQ09ERUMsIAorCSAgIE9QVF9JTEJDX01PREUsIE9QVF9SRUNfRklMRSwgT1BUX0FVVE9fUkVDLAorCSAgIE9QVF9DT01QTEVYSVRZLCBPUFRfUVVBTElUWSwgT1BUX1BUSU1FLCBPUFRfTk9fVkFELAorCSAgIE9QVF9SWF9EUk9QX1BDVCwgT1BUX1RYX0RST1BfUENULCBPUFRfRUNfVEFJTCwgT1BUX0VDX09QVCwKKwkgICBPUFRfTkVYVF9BQ0NPVU5ULCBPUFRfTkVYVF9DUkVELCBPUFRfTUFYX0NBTExTLCAKKwkgICBPUFRfRFVSQVRJT04sIE9QVF9OT19UQ1AsIE9QVF9OT19VRFAsIE9QVF9USFJFQURfQ05ULAorCSAgIE9QVF9OT1JFRkVSU1VCLCBPUFRfQUNDRVBUX1JFRElSRUNULAorCSAgIE9QVF9VU0VfVExTLCBPUFRfVExTX0NBX0ZJTEUsIE9QVF9UTFNfQ0VSVF9GSUxFLCBPUFRfVExTX1BSSVZfRklMRSwKKwkgICBPUFRfVExTX1BBU1NXT1JELCBPUFRfVExTX1ZFUklGWV9TRVJWRVIsIE9QVF9UTFNfVkVSSUZZX0NMSUVOVCwKKwkgICBPUFRfVExTX05FR19USU1FT1VULCBPUFRfVExTX0NJUEhFUiwKKwkgICBPUFRfQ0FQVFVSRV9ERVYsIE9QVF9QTEFZQkFDS19ERVYsCisJICAgT1BUX0NBUFRVUkVfTEFULCBPUFRfUExBWUJBQ0tfTEFULCBPUFRfTk9fVE9ORVMsIE9QVF9KQl9NQVhfU0laRSwKKwkgICBPUFRfU1RET1VUX1JFRlJFU0gsIE9QVF9TVERPVVRfUkVGUkVTSF9URVhULCBPUFRfSVBWNiwgT1BUX1FPUywKKyNpZmRlZiBfSU9OQkYKKwkgICBPUFRfU1RET1VUX05PX0JVRiwKKyNlbmRpZgorCSAgIE9QVF9BVVRPX1VQREFURV9OQVQsT1BUX1VTRV9DT01QQUNUX0ZPUk0sT1BUX0RJU19DT0RFQywKKwkgICBPUFRfRElTQUJMRV9TVFVOLCBPUFRfTk9fRk9SQ0VfTFIsCisJICAgT1BUX1RJTUVSLCBPUFRfVElNRVJfU0UsIE9QVF9USU1FUl9NSU5fU0UsCisJICAgT1BUX1ZJREVPLCBPUFRfRVhUUkFfQVVESU8sCisJICAgT1BUX1ZDQVBUVVJFX0RFViwgT1BUX1ZSRU5ERVJfREVWLCBPUFRfUExBWV9BVkksIE9QVF9BVVRPX1BMQVlfQVZJLAorCSAgIE9QVF9VU0VfQ0xJLCBPUFRfQ0xJX1RFTE5FVF9QT1JULCBPUFRfRElTQUJMRV9DTElfQ09OU09MRQorICAgIH07CisgICAgc3RydWN0IHBqX2dldG9wdF9vcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJeyAiY29uZmlnLWZpbGUiLDEsIDAsIE9QVF9DT05GSUdfRklMRX0sCisJeyAibG9nLWZpbGUiLAkxLCAwLCBPUFRfTE9HX0ZJTEV9LAorCXsgImxvZy1sZXZlbCIsCTEsIDAsIE9QVF9MT0dfTEVWRUx9LAorCXsgImFwcC1sb2ctbGV2ZWwiLDEsMCxPUFRfQVBQX0xPR19MRVZFTH0sCisJeyAibG9nLWFwcGVuZCIsIDAsIDAsIE9QVF9MT0dfQVBQRU5EfSwKKwl7ICJjb2xvciIsCTAsIDAsIE9QVF9DT0xPUn0sCisJeyAibm8tY29sb3IiLAkwLCAwLCBPUFRfTk9fQ09MT1J9LAorCXsgImxpZ2h0LWJnIiwJCTAsIDAsIE9QVF9MSUdIVF9CR30sCisJeyAibm8tc3RkZXJyIiwgIDAsIDAsIE9QVF9OT19TVERFUlJ9LAorCXsgImhlbHAiLAkwLCAwLCBPUFRfSEVMUH0sCisJeyAidmVyc2lvbiIsCTAsIDAsIE9QVF9WRVJTSU9OfSwKKwl7ICJjbG9jay1yYXRlIiwJMSwgMCwgT1BUX0NMT0NLX1JBVEV9LAorCXsgInNuZC1jbG9jay1yYXRlIiwJMSwgMCwgT1BUX1NORF9DTE9DS19SQVRFfSwKKwl7ICJzdGVyZW8iLAkwLCAwLCBPUFRfU1RFUkVPfSwKKwl7ICJudWxsLWF1ZGlvIiwgMCwgMCwgT1BUX05VTExfQVVESU99LAorCXsgImxvY2FsLXBvcnQiLCAxLCAwLCBPUFRfTE9DQUxfUE9SVH0sCisJeyAiaXAtYWRkciIsCTEsIDAsIE9QVF9JUF9BRERSfSwKKwl7ICJib3VuZC1hZGRyIiwgMSwgMCwgT1BUX0JPVU5EX0FERFJ9LAorCXsgIm5vLXRjcCIsICAgICAwLCAwLCBPUFRfTk9fVENQfSwKKwl7ICJuby11ZHAiLCAgICAgMCwgMCwgT1BUX05PX1VEUH0sCisJeyAibm9yZWZlcnN1YiIsIDAsIDAsIE9QVF9OT1JFRkVSU1VCfSwKKwl7ICJwcm94eSIsCTEsIDAsIE9QVF9QUk9YWX0sCisJeyAib3V0Ym91bmQiLAkxLCAwLCBPUFRfT1VUQk9VTkRfUFJPWFl9LAorCXsgInJlZ2lzdHJhciIsCTEsIDAsIE9QVF9SRUdJU1RSQVJ9LAorCXsgInJlZy10aW1lb3V0IiwxLCAwLCBPUFRfUkVHX1RJTUVPVVR9LAorCXsgInB1Ymxpc2giLCAgICAwLCAwLCBPUFRfUFVCTElTSH0sCisJeyAibXdpIiwJMCwgMCwgT1BUX01XSX0sCisJeyAidXNlLTEwMHJlbCIsIDAsIDAsIE9QVF8xMDBSRUx9LAorCXsgInVzZS1pbXMiLCAgICAwLCAwLCBPUFRfVVNFX0lNU30sCisJeyAiaWQiLAkJMSwgMCwgT1BUX0lEfSwKKwl7ICJjb250YWN0IiwJMSwgMCwgT1BUX0NPTlRBQ1R9LAorCXsgImNvbnRhY3QtcGFyYW1zIiwxLDAsIE9QVF9DT05UQUNUX1BBUkFNU30sCisJeyAiY29udGFjdC11cmktcGFyYW1zIiwxLDAsIE9QVF9DT05UQUNUX1VSSV9QQVJBTVN9LAorCXsgImF1dG8tdXBkYXRlLW5hdCIsCTEsIDAsIE9QVF9BVVRPX1VQREFURV9OQVR9LAorCXsgImRpc2FibGUtc3R1biIsMCwwLCBPUFRfRElTQUJMRV9TVFVOfSwKKyAgICAgICAgeyAidXNlLWNvbXBhY3QtZm9ybSIsCTAsIDAsIE9QVF9VU0VfQ09NUEFDVF9GT1JNfSwKKwl7ICJhY2NlcHQtcmVkaXJlY3QiLCAxLCAwLCBPUFRfQUNDRVBUX1JFRElSRUNUfSwKKwl7ICJuby1mb3JjZS1sciIsMCwgMCwgT1BUX05PX0ZPUkNFX0xSfSwKKwl7ICJyZWFsbSIsCTEsIDAsIE9QVF9SRUFMTX0sCisJeyAidXNlcm5hbWUiLAkxLCAwLCBPUFRfVVNFUk5BTUV9LAorCXsgInBhc3N3b3JkIiwJMSwgMCwgT1BUX1BBU1NXT1JEfSwKKwl7ICJyZXJlZy1kZWxheSIsMSwgMCwgT1BUX1JFR19SRVRSWV9JTlRFUlZBTH0sCisJeyAicmVnLXVzZS1wcm94eSIsIDEsIDAsIE9QVF9SRUdfVVNFX1BST1hZfSwKKwl7ICJuYW1lc2VydmVyIiwgMSwgMCwgT1BUX05BTUVTRVJWRVJ9LAorCXsgInN0dW4tc3J2IiwgICAxLCAwLCBPUFRfU1RVTl9TUlZ9LAorCXsgImFkZC1idWRkeSIsICAxLCAwLCBPUFRfQUREX0JVRERZfSwKKwl7ICJvZmZlci14LW1zLW1zZyIsMCwwLE9QVF9PRkZFUl9YX01TX01TR30sCisJeyAibm8tcHJlc2VuY2UiLCAwLCAwLCBPUFRfTk9fUFJFU0VOQ0V9LAorCXsgImF1dG8tYW5zd2VyIiwxLCAwLCBPUFRfQVVUT19BTlNXRVJ9LAorCXsgImF1dG8tcGxheSIsICAwLCAwLCBPUFRfQVVUT19QTEFZfSwKKwl7ICJhdXRvLXBsYXktaGFuZ3VwIiwwLCAwLCBPUFRfQVVUT19QTEFZX0hBTkdVUH0sCisJeyAiYXV0by1yZWMiLCAgIDAsIDAsIE9QVF9BVVRPX1JFQ30sCisJeyAiYXV0by1sb29wIiwgIDAsIDAsIE9QVF9BVVRPX0xPT1B9LAorCXsgImF1dG8tY29uZiIsICAwLCAwLCBPUFRfQVVUT19DT05GfSwKKwl7ICJwbGF5LWZpbGUiLCAgMSwgMCwgT1BUX1BMQVlfRklMRX0sCisJeyAicGxheS10b25lIiwgIDEsIDAsIE9QVF9QTEFZX1RPTkV9LAorCXsgInJlYy1maWxlIiwgICAxLCAwLCBPUFRfUkVDX0ZJTEV9LAorCXsgInJ0cC1wb3J0IiwJMSwgMCwgT1BUX1JUUF9QT1JUfSwKKworCXsgInVzZS1pY2UiLCAgICAwLCAwLCBPUFRfVVNFX0lDRX0sCisJeyAiaWNlLXJlZ3VsYXIiLDAsIDAsIE9QVF9JQ0VfUkVHVUxBUn0sCisJeyAidXNlLXR1cm4iLAkwLCAwLCBPUFRfVVNFX1RVUk59LAorCXsgImljZS1tYXgtaG9zdHMiLDEsIDAsIE9QVF9JQ0VfTUFYX0hPU1RTfSwKKwl7ICJpY2Utbm8tcnRjcCIsMCwgMCwgT1BUX0lDRV9OT19SVENQfSwKKwl7ICJ0dXJuLXNydiIsCTEsIDAsIE9QVF9UVVJOX1NSVn0sCisJeyAidHVybi10Y3AiLAkwLCAwLCBPUFRfVFVSTl9UQ1B9LAorCXsgInR1cm4tdXNlciIsCTEsIDAsIE9QVF9UVVJOX1VTRVJ9LAorCXsgInR1cm4tcGFzc3dkIiwxLCAwLCBPUFRfVFVSTl9QQVNTV0R9LAorCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorCXsgInVzZS1zcnRwIiwgICAxLCAwLCBPUFRfVVNFX1NSVFB9LAorCXsgInNydHAtc2VjdXJlIiwxLCAwLCBPUFRfU1JUUF9TRUNVUkV9LAorI2VuZGlmCisJeyAiYWRkLWNvZGVjIiwgIDEsIDAsIE9QVF9BRERfQ09ERUN9LAorCXsgImRpcy1jb2RlYyIsICAxLCAwLCBPUFRfRElTX0NPREVDfSwKKwl7ICJjb21wbGV4aXR5IiwJMSwgMCwgT1BUX0NPTVBMRVhJVFl9LAorCXsgInF1YWxpdHkiLAkxLCAwLCBPUFRfUVVBTElUWX0sCisJeyAicHRpbWUiLCAgICAgIDEsIDAsIE9QVF9QVElNRX0sCisJeyAibm8tdmFkIiwgICAgIDAsIDAsIE9QVF9OT19WQUR9LAorCXsgImVjLXRhaWwiLCAgICAxLCAwLCBPUFRfRUNfVEFJTH0sCisJeyAiZWMtb3B0IiwJMSwgMCwgT1BUX0VDX09QVH0sCisJeyAiaWxiYy1tb2RlIiwJMSwgMCwgT1BUX0lMQkNfTU9ERX0sCisJeyAicngtZHJvcC1wY3QiLDEsIDAsIE9QVF9SWF9EUk9QX1BDVH0sCisJeyAidHgtZHJvcC1wY3QiLDEsIDAsIE9QVF9UWF9EUk9QX1BDVH0sCisJeyAibmV4dC1hY2NvdW50IiwwLDAsIE9QVF9ORVhUX0FDQ09VTlR9LAorCXsgIm5leHQtY3JlZCIsCTAsIDAsIE9QVF9ORVhUX0NSRUR9LAorCXsgIm1heC1jYWxscyIsCTEsIDAsIE9QVF9NQVhfQ0FMTFN9LAorCXsgImR1cmF0aW9uIiwJMSwgMCwgT1BUX0RVUkFUSU9OfSwKKwl7ICJ0aHJlYWQtY250IiwJMSwgMCwgT1BUX1RIUkVBRF9DTlR9LAorI2lmIGRlZmluZWQoUEpTSVBfSEFTX1RMU19UUkFOU1BPUlQpICYmIChQSlNJUF9IQVNfVExTX1RSQU5TUE9SVCAhPSAwKQorCXsgInVzZS10bHMiLAkwLCAwLCBPUFRfVVNFX1RMU30sIAorCXsgInRscy1jYS1maWxlIiwxLCAwLCBPUFRfVExTX0NBX0ZJTEV9LAorCXsgInRscy1jZXJ0LWZpbGUiLDEsMCwgT1BUX1RMU19DRVJUX0ZJTEV9LCAKKwl7ICJ0bHMtcHJpdmtleS1maWxlIiwxLDAsIE9QVF9UTFNfUFJJVl9GSUxFfSwKKwl7ICJ0bHMtcGFzc3dvcmQiLDEsMCwgT1BUX1RMU19QQVNTV09SRH0sCisJeyAidGxzLXZlcmlmeS1zZXJ2ZXIiLCAwLCAwLCBPUFRfVExTX1ZFUklGWV9TRVJWRVJ9LAorCXsgInRscy12ZXJpZnktY2xpZW50IiwgMCwgMCwgT1BUX1RMU19WRVJJRllfQ0xJRU5UfSwKKwl7ICJ0bHMtbmVnLXRpbWVvdXQiLCAxLCAwLCBPUFRfVExTX05FR19USU1FT1VUfSwKKwl7ICJ0bHMtY2lwaGVyIiwgMSwgMCwgT1BUX1RMU19DSVBIRVJ9LAorI2VuZGlmCisJeyAiY2FwdHVyZS1kZXYiLCAgICAxLCAwLCBPUFRfQ0FQVFVSRV9ERVZ9LAorCXsgInBsYXliYWNrLWRldiIsICAgMSwgMCwgT1BUX1BMQVlCQUNLX0RFVn0sCisJeyAiY2FwdHVyZS1sYXQiLCAgICAxLCAwLCBPUFRfQ0FQVFVSRV9MQVR9LAorCXsgInBsYXliYWNrLWxhdCIsICAgMSwgMCwgT1BUX1BMQVlCQUNLX0xBVH0sCisJeyAic3Rkb3V0LXJlZnJlc2giLCAxLCAwLCBPUFRfU1RET1VUX1JFRlJFU0h9LAorCXsgInN0ZG91dC1yZWZyZXNoLXRleHQiLCAxLCAwLCBPUFRfU1RET1VUX1JFRlJFU0hfVEVYVH0sCisjaWZkZWYgX0lPTkJGCisJeyAic3Rkb3V0LW5vLWJ1ZiIsICAwLCAwLCBPUFRfU1RET1VUX05PX0JVRiB9LAorI2VuZGlmCisJeyAic25kLWF1dG8tY2xvc2UiLCAxLCAwLCBPUFRfU05EX0FVVE9fQ0xPU0V9LAorCXsgIm5vLXRvbmVzIiwgICAgMCwgMCwgT1BUX05PX1RPTkVTfSwKKwl7ICJqYi1tYXgtc2l6ZSIsIDEsIDAsIE9QVF9KQl9NQVhfU0laRX0sCisjaWYgZGVmaW5lZChQSl9IQVNfSVBWNikgJiYgUEpfSEFTX0lQVjYKKwl7ICJpcHY2IiwJIDAsIDAsIE9QVF9JUFY2fSwKKyNlbmRpZgorCXsgInNldC1xb3MiLAkgMCwgMCwgT1BUX1FPU30sCisJeyAidXNlLXRpbWVyIiwgIDEsIDAsIE9QVF9USU1FUn0sCisJeyAidGltZXItc2UiLCAgIDEsIDAsIE9QVF9USU1FUl9TRX0sCisJeyAidGltZXItbWluLXNlIiwgMSwgMCwgT1BUX1RJTUVSX01JTl9TRX0sCisJeyAib3V0Yi1yaWQiLAkxLCAwLCBPUFRfT1VUQl9SSUR9LAorCXsgInZpZGVvIiwJMCwgMCwgT1BUX1ZJREVPfSwKKwl7ICJleHRyYS1hdWRpbyIsMCwgMCwgT1BUX0VYVFJBX0FVRElPfSwKKwl7ICJ2Y2FwdHVyZS1kZXYiLCAxLCAwLCBPUFRfVkNBUFRVUkVfREVWfSwKKwl7ICJ2cmVuZGVyLWRldiIsICAxLCAwLCBPUFRfVlJFTkRFUl9ERVZ9LAorCXsgInBsYXktYXZpIiwJMSwgMCwgT1BUX1BMQVlfQVZJfSwKKwl7ICJhdXRvLXBsYXktYXZpIiwgMCwgMCwgT1BUX0FVVE9fUExBWV9BVkl9LAorCXsgInVzZS1jbGkiLAkwLCAwLCBPUFRfVVNFX0NMSX0sCisJeyAiY2xpLXRlbG5ldC1wb3J0IiwgMSwgMCwgT1BUX0NMSV9URUxORVRfUE9SVH0sCisJeyAibm8tY2xpLWNvbnNvbGUiLCAwLCAwLCBPUFRfRElTQUJMRV9DTElfQ09OU09MRX0sCisJeyBOVUxMLCAwLCAwLCAwfQorICAgIH07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHBqc3VhX2FjY19jb25maWcgKmN1cl9hY2M7CisgICAgY2hhciAqY29uZmlnX2ZpbGUgPSBOVUxMOworICAgIHVuc2lnbmVkIGk7CisKKyAgICAvKiBSdW4gcGpfZ2V0b3B0IG9uY2UgdG8gc2VlIGlmIHVzZXIgc3BlY2lmaWVzIGNvbmZpZyBmaWxlIHRvIHJlYWQuICovIAorICAgIHBqX29wdGluZCA9IDA7CisgICAgd2hpbGUgKChjPXBqX2dldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIiLCBsb25nX29wdGlvbnMsIAorCQkJICAgICAmb3B0aW9uX2luZGV4KSkgIT0gLTEpIAorICAgIHsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIE9QVF9DT05GSUdfRklMRToKKwkgICAgY29uZmlnX2ZpbGUgPSBwal9vcHRhcmc7CisJICAgIGJyZWFrOworCX0KKwlpZiAoY29uZmlnX2ZpbGUpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjb25maWdfZmlsZSkgeworCXN0YXR1cyA9IHJlYWRfY29uZmlnX2ZpbGUoY2ZnLT5wb29sLCBjb25maWdfZmlsZSwgJmFyZ2MsICZhcmd2KTsKKwlpZiAoc3RhdHVzICE9IDApCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgY2ZnLT5hY2NfY250ID0gMDsKKyAgICBjdXJfYWNjID0gY2ZnLT5hY2NfY2ZnOworCisKKyAgICAvKiBSZWluaXRpYWxpemUgYW5kIHJlLXJ1biBwal9nZXRvcHQgYWdhaW4sIHBvc3NpYmx5IHdpdGggbmV3IGFyZ3VtZW50cworICAgICAqIHJlYWQgZnJvbSBjb25maWcgZmlsZS4KKyAgICAgKi8KKyAgICBwal9vcHRpbmQgPSAwOworICAgIHdoaWxlKChjPXBqX2dldG9wdF9sb25nKGFyZ2MsYXJndiwgIiIsIGxvbmdfb3B0aW9ucywmb3B0aW9uX2luZGV4KSkhPS0xKSB7CisJcGpfc3RyX3QgdG1wOworCWxvbmcgbHZhbDsKKworCXN3aXRjaCAoYykgeworCisJY2FzZSBPUFRfQ09ORklHX0ZJTEU6CisJICAgIC8qIElnbm9yZSBhcyB0aGlzIGhhcyBiZWVuIHByb2Nlc3NlZCBiZWZvcmUgKi8KKwkgICAgYnJlYWs7CisJCisJY2FzZSBPUFRfTE9HX0ZJTEU6CisJICAgIGNmZy0+bG9nX2NmZy5sb2dfZmlsZW5hbWUgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9MT0dfTEVWRUw6CisJICAgIGMgPSBwal9zdHJ0b3VsKHBqX2NzdHIoJnRtcCwgcGpfb3B0YXJnKSk7CisJICAgIGlmIChjIDwgMCB8fCBjID4gNikgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBleHBlY3RpbmcgaW50ZWdlciB2YWx1ZSAwLTYgIgorCQkJICAiZm9yIC0tbG9nLWxldmVsIikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGNmZy0+bG9nX2NmZy5sZXZlbCA9IGM7CisJICAgIHBqX2xvZ19zZXRfbGV2ZWwoIGMgKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9BUFBfTE9HX0xFVkVMOgorCSAgICBjZmctPmxvZ19jZmcuY29uc29sZV9sZXZlbCA9IHBqX3N0cnRvdWwocGpfY3N0cigmdG1wLCBwal9vcHRhcmcpKTsKKwkgICAgaWYgKGNmZy0+bG9nX2NmZy5jb25zb2xlX2xldmVsIDwgMCB8fCBjZmctPmxvZ19jZmcuY29uc29sZV9sZXZlbCA+IDYpIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCQkgICJFcnJvcjogZXhwZWN0aW5nIGludGVnZXIgdmFsdWUgMC02ICIKKwkJCSAgImZvciAtLWFwcC1sb2ctbGV2ZWwiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9MT0dfQVBQRU5EOgorCSAgICBjZmctPmxvZ19jZmcubG9nX2ZpbGVfZmxhZ3MgfD0gUEpfT19BUFBFTkQ7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQ09MT1I6CisJICAgIGNmZy0+bG9nX2NmZy5kZWNvciB8PSBQSl9MT0dfSEFTX0NPTE9SOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX0NPTE9SOgorCSAgICBjZmctPmxvZ19jZmcuZGVjb3IgJj0gflBKX0xPR19IQVNfQ09MT1I7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfTElHSFRfQkc6CisJICAgIHBqX2xvZ19zZXRfY29sb3IoMSwgUEpfVEVSTV9DT0xPUl9SKTsKKwkgICAgcGpfbG9nX3NldF9jb2xvcigyLCBQSl9URVJNX0NPTE9SX1IgfCBQSl9URVJNX0NPTE9SX0cpOworCSAgICBwal9sb2dfc2V0X2NvbG9yKDMsIFBKX1RFUk1fQ09MT1JfQiB8IFBKX1RFUk1fQ09MT1JfRyk7CisJICAgIHBqX2xvZ19zZXRfY29sb3IoNCwgMCk7CisJICAgIHBqX2xvZ19zZXRfY29sb3IoNSwgMCk7CisJICAgIHBqX2xvZ19zZXRfY29sb3IoNzcsIDApOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX1NUREVSUjoKKyNpZiAhZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgfHwgUEpfV0lOMzJfV0lOQ0U9PTAKKwkgICAgZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRlcnIpOworI2VuZGlmCisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfSEVMUDoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIFBKX0VJTlZBTDsKKworCWNhc2UgT1BUX1ZFUlNJT046ICAgLyogdmVyc2lvbiAqLworCSAgICBwal9kdW1wX2NvbmZpZygpOworCSAgICByZXR1cm4gUEpfRUlOVkFMOworCisJY2FzZSBPUFRfTlVMTF9BVURJTzoKKwkgICAgY2ZnLT5udWxsX2F1ZGlvID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9DTE9DS19SQVRFOgorCSAgICBsdmFsID0gcGpfc3RydG91bChwal9jc3RyKCZ0bXAsIHBqX29wdGFyZykpOworCSAgICBpZiAobHZhbCA8IDgwMDAgfHwgbHZhbCA+IDE5MjAwMCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IGV4cGVjdGluZyB2YWx1ZSBiZXR3ZWVuICIKKwkJCQkgICAgICI4MDAwLTE5MjAwMCBmb3IgY29uZmVyZW5jZSBjbG9jayByYXRlIikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGNmZy0+bWVkaWFfY2ZnLmNsb2NrX3JhdGUgPSBsdmFsOyAKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TTkRfQ0xPQ0tfUkFURToKKwkgICAgbHZhbCA9IHBqX3N0cnRvdWwocGpfY3N0cigmdG1wLCBwal9vcHRhcmcpKTsKKwkgICAgaWYgKGx2YWwgPCA4MDAwIHx8IGx2YWwgPiAxOTIwMDApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBleHBlY3RpbmcgdmFsdWUgYmV0d2VlbiAiCisJCQkJICAgICAiODAwMC0xOTIwMDAgZm9yIHNvdW5kIGRldmljZSBjbG9jayByYXRlIikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGNmZy0+bWVkaWFfY2ZnLnNuZF9jbG9ja19yYXRlID0gbHZhbDsgCisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfU1RFUkVPOgorCSAgICBjZmctPm1lZGlhX2NmZy5jaGFubmVsX2NvdW50ID0gMjsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9MT0NBTF9QT1JUOiAgIC8qIGxvY2FsLXBvcnQgKi8KKwkgICAgbHZhbCA9IHBqX3N0cnRvdWwocGpfY3N0cigmdG1wLCBwal9vcHRhcmcpKTsKKwkgICAgaWYgKGx2YWwgPCAwIHx8IGx2YWwgPiA2NTUzNSkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBleHBlY3RpbmcgaW50ZWdlciB2YWx1ZSBmb3IgIgorCQkJICAiLS1sb2NhbC1wb3J0IikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGNmZy0+dWRwX2NmZy5wb3J0ID0gKHBqX3VpbnQxNl90KWx2YWw7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfSVBfQUREUjogLyogaXAtYWRkciAqLworCSAgICBjZmctPnVkcF9jZmcucHVibGljX2FkZHIgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgY2ZnLT5ydHBfY2ZnLnB1YmxpY19hZGRyID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQk9VTkRfQUREUjogLyogYm91bmQtYWRkciAqLworCSAgICBjZmctPnVkcF9jZmcuYm91bmRfYWRkciA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBjZmctPnJ0cF9jZmcuYm91bmRfYWRkciA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX1VEUDogLyogbm8tdWRwICovCisJICAgIGlmIChjZmctPm5vX3RjcCAmJiAhY2ZnLT51c2VfdGxzKSB7CisJICAgICAgUEpfTE9HKDEsKFRISVNfRklMRSwiRXJyb3I6IGNhbm5vdCBkaXNhYmxlIGJvdGggVENQIGFuZCBVRFAiKSk7CisJICAgICAgcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCisJICAgIGNmZy0+bm9fdWRwID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9OT1JFRkVSU1VCOiAvKiBub3JlZmVyc3ViICovCisJICAgIGNmZy0+bm9fcmVmZXJzdWIgPSBQSl9UUlVFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX1RDUDogLyogbm8tdGNwICovCisJICAgIGlmIChjZmctPm5vX3VkcCAmJiAhY2ZnLT51c2VfdGxzKSB7CisJICAgICAgUEpfTE9HKDEsKFRISVNfRklMRSwiRXJyb3I6IGNhbm5vdCBkaXNhYmxlIGJvdGggVENQIGFuZCBVRFAiKSk7CisJICAgICAgcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCisJICAgIGNmZy0+bm9fdGNwID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9QUk9YWTogICAvKiBwcm94eSAqLworCSAgICBpZiAocGpzdWFfdmVyaWZ5X3NpcF91cmwocGpfb3B0YXJnKSAhPSAwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsIAorCQkJICAiRXJyb3I6IGludmFsaWQgU0lQIFVSTCAnJXMnICIKKwkJCSAgImluIHByb3h5IGFyZ3VtZW50IiwgcGpfb3B0YXJnKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgY3VyX2FjYy0+cHJveHlbY3VyX2FjYy0+cHJveHlfY250KytdID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfT1VUQk9VTkRfUFJPWFk6ICAgLyogb3V0Ym91bmQgcHJveHkgKi8KKwkgICAgaWYgKHBqc3VhX3ZlcmlmeV9zaXBfdXJsKHBqX29wdGFyZykgIT0gMCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBpbnZhbGlkIFNJUCBVUkwgJyVzJyAiCisJCQkgICJpbiBvdXRib3VuZCBwcm94eSBhcmd1bWVudCIsIHBqX29wdGFyZykpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGNmZy0+Y2ZnLm91dGJvdW5kX3Byb3h5W2NmZy0+Y2ZnLm91dGJvdW5kX3Byb3h5X2NudCsrXSA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1JFR0lTVFJBUjogICAvKiByZWdpc3RyYXIgKi8KKwkgICAgaWYgKHBqc3VhX3ZlcmlmeV9zaXBfdXJsKHBqX29wdGFyZykgIT0gMCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBpbnZhbGlkIFNJUCBVUkwgJyVzJyBpbiAiCisJCQkgICJyZWdpc3RyYXIgYXJndW1lbnQiLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICBjdXJfYWNjLT5yZWdfdXJpID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVHX1RJTUVPVVQ6ICAgLyogcmVnLXRpbWVvdXQgKi8KKwkgICAgY3VyX2FjYy0+cmVnX3RpbWVvdXQgPSBwal9zdHJ0b3VsKHBqX2NzdHIoJnRtcCxwal9vcHRhcmcpKTsKKwkgICAgaWYgKGN1cl9hY2MtPnJlZ190aW1lb3V0IDwgMSB8fCBjdXJfYWNjLT5yZWdfdGltZW91dCA+IDM2MDApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCQkgICJFcnJvcjogaW52YWxpZCB2YWx1ZSBmb3IgLS1yZWctdGltZW91dCAiCisJCQkgICIoZXhwZWN0aW5nIDEtMzYwMCkiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9QVUJMSVNIOiAgIC8qIHB1Ymxpc2ggKi8KKwkgICAgY3VyX2FjYy0+cHVibGlzaF9lbmFibGVkID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9NV0k6CS8qIG13aSAqLworCSAgICBjdXJfYWNjLT5td2lfZW5hYmxlZCA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfMTAwUkVMOiAvKiogMTAwcmVsICovCisJICAgIGN1cl9hY2MtPnJlcXVpcmVfMTAwcmVsID0gUEpTVUFfMTAwUkVMX01BTkRBVE9SWTsKKwkgICAgY2ZnLT5jZmcucmVxdWlyZV8xMDByZWwgPSBQSlNVQV8xMDBSRUxfTUFOREFUT1JZOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RJTUVSOiAvKiogc2Vzc2lvbiB0aW1lciAqLworCSAgICBsdmFsID0gcGpfc3RydG91bChwal9jc3RyKCZ0bXAsIHBqX29wdGFyZykpOworCSAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDMpIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCQkgICJFcnJvcjogZXhwZWN0aW5nIGludGVnZXIgdmFsdWUgMC0zIGZvciAtLXVzZS10aW1lciIpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICBjdXJfYWNjLT51c2VfdGltZXIgPSBsdmFsOworCSAgICBjZmctPmNmZy51c2VfdGltZXIgPSBsdmFsOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RJTUVSX1NFOiAvKiogc2Vzc2lvbiB0aW1lciBzZXNzaW9uIGV4cGlyYXRpb24gKi8KKwkgICAgY3VyX2FjYy0+dGltZXJfc2V0dGluZy5zZXNzX2V4cGlyZXMgPSBwal9zdHJ0b3VsKHBqX2NzdHIoJnRtcCwgcGpfb3B0YXJnKSk7CisJICAgIGlmIChjdXJfYWNjLT50aW1lcl9zZXR0aW5nLnNlc3NfZXhwaXJlcyA8IDkwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsIAorCQkJICAiRXJyb3I6IGludmFsaWQgdmFsdWUgZm9yIC0tdGltZXItc2UgIgorCQkJICAiKGV4cGVjdGluZyBoaWdoZXIgdGhhbiA5MCkiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgY2ZnLT5jZmcudGltZXJfc2V0dGluZy5zZXNzX2V4cGlyZXMgPSBjdXJfYWNjLT50aW1lcl9zZXR0aW5nLnNlc3NfZXhwaXJlczsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9USU1FUl9NSU5fU0U6IC8qKiBzZXNzaW9uIHRpbWVyIG1pbmltdW0gc2Vzc2lvbiBleHBpcmF0aW9uICovCisJICAgIGN1cl9hY2MtPnRpbWVyX3NldHRpbmcubWluX3NlID0gcGpfc3RydG91bChwal9jc3RyKCZ0bXAsIHBqX29wdGFyZykpOworCSAgICBpZiAoY3VyX2FjYy0+dGltZXJfc2V0dGluZy5taW5fc2UgPCA5MCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBpbnZhbGlkIHZhbHVlIGZvciAtLXRpbWVyLW1pbi1zZSAiCisJCQkgICIoZXhwZWN0aW5nIGhpZ2hlciB0aGFuIDkwKSIpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICBjZmctPmNmZy50aW1lcl9zZXR0aW5nLm1pbl9zZSA9IGN1cl9hY2MtPnRpbWVyX3NldHRpbmcubWluX3NlOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX09VVEJfUklEOiAvKiBPdXRib3VuZCByZWctaWQgKi8KKwkgICAgY3VyX2FjYy0+cmZjNTYyNl9yZWdfaWQgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9VU0VfSU1TOiAvKiBBY3RpdmF0ZSBJTVMgc2V0dGluZ3MgKi8KKwkgICAgY3VyX2FjYy0+YXV0aF9wcmVmLmluaXRpYWxfYXV0aCA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfSUQ6ICAgLyogaWQgKi8KKwkgICAgaWYgKHBqc3VhX3ZlcmlmeV91cmwocGpfb3B0YXJnKSAhPSAwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsIAorCQkJICAiRXJyb3I6IGludmFsaWQgU0lQIFVSTCAnJXMnICIKKwkJCSAgImluIGxvY2FsIGlkIGFyZ3VtZW50IiwgcGpfb3B0YXJnKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgY3VyX2FjYy0+aWQgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9DT05UQUNUOiAgIC8qIGNvbnRhY3QgKi8KKwkgICAgaWYgKHBqc3VhX3ZlcmlmeV9zaXBfdXJsKHBqX29wdGFyZykgIT0gMCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBpbnZhbGlkIFNJUCBVUkwgJyVzJyAiCisJCQkgICJpbiBjb250YWN0IGFyZ3VtZW50IiwgcGpfb3B0YXJnKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgY3VyX2FjYy0+Zm9yY2VfY29udGFjdCA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0NPTlRBQ1RfUEFSQU1TOgorCSAgICBjdXJfYWNjLT5jb250YWN0X3BhcmFtcyA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0NPTlRBQ1RfVVJJX1BBUkFNUzoKKwkgICAgY3VyX2FjYy0+Y29udGFjdF91cmlfcGFyYW1zID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQVVUT19VUERBVEVfTkFUOiAgIC8qIE9QVF9BVVRPX1VQREFURV9OQVQgKi8KKyAgICAgICAgICAgIGN1cl9hY2MtPmFsbG93X2NvbnRhY3RfcmV3cml0ZSAgPSBwal9zdHJ0b3VsKHBqX2NzdHIoJnRtcCwgcGpfb3B0YXJnKSk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfRElTQUJMRV9TVFVOOgorCSAgICBjdXJfYWNjLT5zaXBfc3R1bl91c2UgPSBQSlNVQV9TVFVOX1VTRV9ESVNBQkxFRDsKKwkgICAgY3VyX2FjYy0+bWVkaWFfc3R1bl91c2UgPSBQSlNVQV9TVFVOX1VTRV9ESVNBQkxFRDsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9VU0VfQ09NUEFDVF9GT1JNOgorCSAgICAvKiBlbmFibGUgY29tcGFjdCBmb3JtIC0gZnJvbSBUaWNrZXQgIzM0MiAqLworICAgICAgICAgICAgeworCQlleHRlcm4gcGpfYm9vbF90IHBqc2lwX3VzZV9jb21wYWN0X2Zvcm07CisJCWV4dGVybiBwal9ib29sX3QgcGpzaXBfaW5jbHVkZV9hbGxvd19oZHJfaW5fZGxnOworCQlleHRlcm4gcGpfYm9vbF90IHBqbWVkaWFfYWRkX3J0cG1hcF9mb3Jfc3RhdGljX3B0OworCisJCXBqc2lwX3VzZV9jb21wYWN0X2Zvcm0gPSBQSl9UUlVFOworCQkvKiBkbyBub3QgdHJhbnNtaXQgQWxsb3cgaGVhZGVyICovCisJCXBqc2lwX2luY2x1ZGVfYWxsb3dfaGRyX2luX2RsZyA9IFBKX0ZBTFNFOworCQkvKiBEbyBub3QgaW5jbHVkZSBydHBtYXAgZm9yIHN0YXRpYyBwYXlsb2FkIHR5cGVzICg8OTYpICovCisJCXBqbWVkaWFfYWRkX3J0cG1hcF9mb3Jfc3RhdGljX3B0ID0gUEpfRkFMU0U7CisgICAgICAgICAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQUNDRVBUX1JFRElSRUNUOgorCSAgICBjZmctPnJlZGlyX29wID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5yZWRpcl9vcDwwIHx8IGNmZy0+cmVkaXJfb3A+UEpTSVBfUkVESVJFQ1RfU1RPUCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBhY2NlcHQtcmVkaXJlY3QgdmFsdWUgJyVzJyAiLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX0ZPUkNFX0xSOgorCSAgICBjZmctPmNmZy5mb3JjZV9sciA9IFBKX0ZBTFNFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05FWFRfQUNDT1VOVDogLyogQWRkIG1vcmUgYWNjb3VudC4gKi8KKwkgICAgY2ZnLT5hY2NfY250Kys7CisJICAgIGN1cl9hY2MgPSAmY2ZnLT5hY2NfY2ZnW2NmZy0+YWNjX2NudF07CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfVVNFUk5BTUU6ICAgLyogRGVmYXVsdCBhdXRoZW50aWNhdGlvbiB1c2VyICovCisJICAgIGN1cl9hY2MtPmNyZWRfaW5mb1tjdXJfYWNjLT5jcmVkX2NvdW50XS51c2VybmFtZSA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBjdXJfYWNjLT5jcmVkX2luZm9bY3VyX2FjYy0+Y3JlZF9jb3VudF0uc2NoZW1lID0gcGpfc3RyKCJEaWdlc3QiKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9SRUFMTToJICAgIC8qIERlZmF1bHQgYXV0aGVudGljYXRpb24gcmVhbG0uICovCisJICAgIGN1cl9hY2MtPmNyZWRfaW5mb1tjdXJfYWNjLT5jcmVkX2NvdW50XS5yZWFsbSA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BBU1NXT1JEOiAgIC8qIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkICovCisJICAgIGN1cl9hY2MtPmNyZWRfaW5mb1tjdXJfYWNjLT5jcmVkX2NvdW50XS5kYXRhX3R5cGUgPSBQSlNJUF9DUkVEX0RBVEFfUExBSU5fUEFTU1dEOworCSAgICBjdXJfYWNjLT5jcmVkX2luZm9bY3VyX2FjYy0+Y3JlZF9jb3VudF0uZGF0YSA9IHBqX3N0cihwal9vcHRhcmcpOworI2lmIFBKU0lQX0hBU19ESUdFU1RfQUtBX0FVVEgKKwkgICAgY3VyX2FjYy0+Y3JlZF9pbmZvW2N1cl9hY2MtPmNyZWRfY291bnRdLmRhdGFfdHlwZSB8PSBQSlNJUF9DUkVEX0RBVEFfRVhUX0FLQTsKKwkgICAgY3VyX2FjYy0+Y3JlZF9pbmZvW2N1cl9hY2MtPmNyZWRfY291bnRdLmV4dC5ha2EuayA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBjdXJfYWNjLT5jcmVkX2luZm9bY3VyX2FjYy0+Y3JlZF9jb3VudF0uZXh0LmFrYS5jYiA9ICZwanNpcF9hdXRoX2NyZWF0ZV9ha2FfcmVzcG9uc2U7CisjZW5kaWYKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9SRUdfUkVUUllfSU5URVJWQUw6CisJICAgIGN1cl9hY2MtPnJlZ19yZXRyeV9pbnRlcnZhbCA9IHBqX3N0cnRvdWwocGpfY3N0cigmdG1wLCBwal9vcHRhcmcpKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9SRUdfVVNFX1BST1hZOgorCSAgICBjdXJfYWNjLT5yZWdfdXNlX3Byb3h5ID0gKHVuc2lnbmVkKXBqX3N0cnRvdWwocGpfY3N0cigmdG1wLCBwal9vcHRhcmcpKTsKKwkgICAgaWYgKGN1cl9hY2MtPnJlZ191c2VfcHJveHkgPiAzKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogaW52YWxpZCAtLXJlZy11c2UtcHJveHkgdmFsdWUgJyVzJyIsCisJCQkgIHBqX29wdGFyZykpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfTkVYVF9DUkVEOiAvKiBuZXh0IGNyZWRlbnRpYWwgKi8KKwkgICAgY3VyX2FjYy0+Y3JlZF9jb3VudCsrOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05BTUVTRVJWRVI6IC8qIG5hbWVzZXJ2ZXIgKi8KKwkgICAgY2ZnLT5jZmcubmFtZXNlcnZlcltjZmctPmNmZy5uYW1lc2VydmVyX2NvdW50KytdID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGlmIChjZmctPmNmZy5uYW1lc2VydmVyX2NvdW50ID4gUEpfQVJSQVlfU0laRShjZmctPmNmZy5uYW1lc2VydmVyKSkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IHRvbyBtYW55IG5hbWVzZXJ2ZXJzIikpOworCQlyZXR1cm4gUEpfRVRPT01BTlk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TVFVOX1NSVjogICAvKiBTVFVOIHNlcnZlciAqLworCSAgICBjZmctPmNmZy5zdHVuX2hvc3QgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+Y2ZnLnN0dW5fc3J2X2NudD09UEpfQVJSQVlfU0laRShjZmctPmNmZy5zdHVuX3NydikpIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiB0b28gbWFueSBTVFVOIHNlcnZlcnMiKSk7CisJCXJldHVybiBQSl9FVE9PTUFOWTsKKwkgICAgfQorCSAgICBjZmctPmNmZy5zdHVuX3NydltjZmctPmNmZy5zdHVuX3Nydl9jbnQrK10gPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9BRERfQlVERFk6IC8qIEFkZCB0byBidWRkeSBsaXN0LiAqLworCSAgICBpZiAocGpzdWFfdmVyaWZ5X3VybChwal9vcHRhcmcpICE9IDApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCQkgICJFcnJvcjogaW52YWxpZCBVUkwgJyVzJyBpbiAiCisJCQkgICItLWFkZC1idWRkeSBvcHRpb24iLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGlmIChjZmctPmJ1ZGR5X2NudCA9PSBQSl9BUlJBWV9TSVpFKGNmZy0+YnVkZHlfY2ZnKSkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiB0b28gbWFueSBidWRkaWVzIGluIGJ1ZGR5IGxpc3QuIikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgY2ZnLT5idWRkeV9jZmdbY2ZnLT5idWRkeV9jbnRdLnVyaSA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBjZmctPmJ1ZGR5X2NudCsrOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FVVE9fUExBWToKKwkgICAgY2ZnLT5hdXRvX3BsYXkgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FVVE9fUExBWV9IQU5HVVA6CisJICAgIGNmZy0+YXV0b19wbGF5X2hhbmd1cCA9IDE7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQVVUT19SRUM6CisJICAgIGNmZy0+YXV0b19yZWMgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FVVE9fTE9PUDoKKwkgICAgY2ZnLT5hdXRvX2xvb3AgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FVVE9fQ09ORjoKKwkgICAgY2ZnLT5hdXRvX2NvbmYgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BMQVlfRklMRToKKwkgICAgY2ZnLT53YXZfZmlsZXNbY2ZnLT53YXZfY291bnQrK10gPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9QTEFZX1RPTkU6CisJICAgIHsKKwkJaW50IGYxLCBmMiwgb24sIG9mZjsKKwkJaW50IG47CisKKwkJbiA9IHNzY2FuZihwal9vcHRhcmcsICIlZCwlZCwlZCwlZCIsICZmMSwgJmYyLCAmb24sICZvZmYpOworCQlpZiAobiAhPSA0KSB7CisJCSAgICBwdXRzKCJFeHBlY3RpbmcgZjEsZjIsb24sb2ZmIGluIC0tcGxheS10b25lIik7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKworCQljZmctPnRvbmVzW2NmZy0+dG9uZV9jb3VudF0uZnJlcTEgPSAoc2hvcnQpZjE7CisJCWNmZy0+dG9uZXNbY2ZnLT50b25lX2NvdW50XS5mcmVxMiA9IChzaG9ydClmMjsKKwkJY2ZnLT50b25lc1tjZmctPnRvbmVfY291bnRdLm9uX21zZWMgPSAoc2hvcnQpb247CisJCWNmZy0+dG9uZXNbY2ZnLT50b25lX2NvdW50XS5vZmZfbXNlYyA9IChzaG9ydClvZmY7CisJCSsrY2ZnLT50b25lX2NvdW50OworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVDX0ZJTEU6CisJICAgIGNmZy0+cmVjX2ZpbGUgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9VU0VfSUNFOgorCSAgICBjZmctPm1lZGlhX2NmZy5lbmFibGVfaWNlID0KKwkJICAgIGN1cl9hY2MtPmljZV9jZmcuZW5hYmxlX2ljZSA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfSUNFX1JFR1VMQVI6CisJICAgIGNmZy0+bWVkaWFfY2ZnLmljZV9vcHQuYWdncmVzc2l2ZSA9CisJCSAgICBjdXJfYWNjLT5pY2VfY2ZnLmljZV9vcHQuYWdncmVzc2l2ZSA9IFBKX0ZBTFNFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1VTRV9UVVJOOgorCSAgICBjZmctPm1lZGlhX2NmZy5lbmFibGVfdHVybiA9CisJCSAgICBjdXJfYWNjLT50dXJuX2NmZy5lbmFibGVfdHVybiA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfSUNFX01BWF9IT1NUUzoKKwkgICAgY2ZnLT5tZWRpYV9jZmcuaWNlX21heF9ob3N0X2NhbmRzID0KKwkJICAgIGN1cl9hY2MtPmljZV9jZmcuaWNlX21heF9ob3N0X2NhbmRzID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0lDRV9OT19SVENQOgorCSAgICBjZmctPm1lZGlhX2NmZy5pY2Vfbm9fcnRjcCA9CisJCSAgICBjdXJfYWNjLT5pY2VfY2ZnLmljZV9ub19ydGNwID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9UVVJOX1NSVjoKKwkgICAgY2ZnLT5tZWRpYV9jZmcudHVybl9zZXJ2ZXIgPQorCQkgICAgY3VyX2FjYy0+dHVybl9jZmcudHVybl9zZXJ2ZXIgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9UVVJOX1RDUDoKKwkgICAgY2ZnLT5tZWRpYV9jZmcudHVybl9jb25uX3R5cGUgPQorCQkgICAgY3VyX2FjYy0+dHVybl9jZmcudHVybl9jb25uX3R5cGUgPSBQSl9UVVJOX1RQX1RDUDsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9UVVJOX1VTRVI6CisJICAgIGNmZy0+bWVkaWFfY2ZnLnR1cm5fYXV0aF9jcmVkLnR5cGUgPQorCQkgICAgY3VyX2FjYy0+dHVybl9jZmcudHVybl9hdXRoX2NyZWQudHlwZSA9IFBKX1NUVU5fQVVUSF9DUkVEX1NUQVRJQzsKKwkgICAgY2ZnLT5tZWRpYV9jZmcudHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC5yZWFsbSA9CisJCSAgICBjdXJfYWNjLT50dXJuX2NmZy50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLnJlYWxtID0gcGpfc3RyKCIqIik7CisJICAgIGNmZy0+bWVkaWFfY2ZnLnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQudXNlcm5hbWUgPQorCQkgICAgY3VyX2FjYy0+dHVybl9jZmcudHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC51c2VybmFtZSA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RVUk5fUEFTU1dEOgorCSAgICBjZmctPm1lZGlhX2NmZy50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGFfdHlwZSA9CisJCSAgICBjdXJfYWNjLT50dXJuX2NmZy50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGFfdHlwZSA9IFBKX1NUVU5fUEFTU1dEX1BMQUlOOworCSAgICBjZmctPm1lZGlhX2NmZy50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGEgPQorCQkgICAgY3VyX2FjYy0+dHVybl9jZmcudHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC5kYXRhID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorCWNhc2UgT1BUX1VTRV9TUlRQOgorCSAgICBhcHBfY29uZmlnLmNmZy51c2Vfc3J0cCA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKCFwal9pc2RpZ2l0KCpwal9vcHRhcmcpIHx8IGFwcF9jb25maWcuY2ZnLnVzZV9zcnRwID4gMykgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAiSW52YWxpZCB2YWx1ZSBmb3IgLS11c2Utc3J0cCBvcHRpb24iKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBpZiAoKGludClhcHBfY29uZmlnLmNmZy51c2Vfc3J0cCA9PSAzKSB7CisJCS8qIFNSVFAgb3B0aW9uYWwgbW9kZSB3aXRoIGR1cGxpY2F0ZWQgbWVkaWEgb2ZmZXIgKi8KKwkJYXBwX2NvbmZpZy5jZmcudXNlX3NydHAgPSBQSk1FRElBX1NSVFBfT1BUSU9OQUw7CisJCWFwcF9jb25maWcuY2ZnLnNydHBfb3B0aW9uYWxfZHVwX29mZmVyID0gUEpfVFJVRTsKKwkJY3VyX2FjYy0+c3J0cF9vcHRpb25hbF9kdXBfb2ZmZXIgPSBQSl9UUlVFOworCSAgICB9CisJICAgIGN1cl9hY2MtPnVzZV9zcnRwID0gYXBwX2NvbmZpZy5jZmcudXNlX3NydHA7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX1NSVFBfU0VDVVJFOgorCSAgICBhcHBfY29uZmlnLmNmZy5zcnRwX3NlY3VyZV9zaWduYWxpbmcgPSBteV9hdG9pKHBqX29wdGFyZyk7CisJICAgIGlmICghcGpfaXNkaWdpdCgqcGpfb3B0YXJnKSB8fCAKKwkJYXBwX2NvbmZpZy5jZmcuc3J0cF9zZWN1cmVfc2lnbmFsaW5nID4gMikgCisJICAgIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgIkludmFsaWQgdmFsdWUgZm9yIC0tc3J0cC1zZWN1cmUgb3B0aW9uIikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgY3VyX2FjYy0+c3J0cF9zZWN1cmVfc2lnbmFsaW5nID0gYXBwX2NvbmZpZy5jZmcuc3J0cF9zZWN1cmVfc2lnbmFsaW5nOworCSAgICBicmVhazsKKyNlbmRpZgorCisJY2FzZSBPUFRfUlRQX1BPUlQ6CisJICAgIGNmZy0+cnRwX2NmZy5wb3J0ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5ydHBfY2ZnLnBvcnQgPT0gMCkgeworCQllbnVtIHsgU1RBUlRfUE9SVD00MDAwIH07CisJCXVuc2lnbmVkIHJhbmdlOworCisJCXJhbmdlID0gKDY1NTM1LVNUQVJUX1BPUlQtUEpTVUFfTUFYX0NBTExTKjIpOworCQljZmctPnJ0cF9jZmcucG9ydCA9IFNUQVJUX1BPUlQgKyAKKwkJCQkgICAgKChwal9yYW5kKCkgJSByYW5nZSkgJiAweEZGRkUpOworCSAgICB9CisKKwkgICAgaWYgKGNmZy0+cnRwX2NmZy5wb3J0IDwgMSB8fCBjZmctPnJ0cF9jZmcucG9ydCA+IDY1NTM1KSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsCisJCQkgICJFcnJvcjogcnRwLXBvcnQgYXJndW1lbnQgdmFsdWUgIgorCQkJICAiKGV4cGVjdGluZyAxLTY1NTM1IikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9ESVNfQ09ERUM6CisgICAgICAgICAgICBjZmctPmNvZGVjX2Rpc1tjZmctPmNvZGVjX2Rpc19jbnQrK10gPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9BRERfQ09ERUM6CisJICAgIGNmZy0+Y29kZWNfYXJnW2NmZy0+Y29kZWNfY250KytdID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJLyogVGhlc2Ugb3B0aW9ucyB3ZXJlIG5vIGxvbmdlciB2YWxpZCBhZnRlciBuZXcgcGpzdWEgKi8KKwkvKgorCWNhc2UgT1BUX0NPTVBMRVhJVFk6CisJICAgIGNmZy0+Y29tcGxleGl0eSA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+Y29tcGxleGl0eSA8IDAgfHwgY2ZnLT5jb21wbGV4aXR5ID4gMTApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwKKwkJCSAgIkVycm9yOiBpbnZhbGlkIC0tY29tcGxleGl0eSAoZXhwZWN0aW5nIDAtMTAiKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKwkqLworCisJY2FzZSBPUFRfRFVSQVRJT046CisJICAgIGNmZy0+ZHVyYXRpb24gPSBteV9hdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfVEhSRUFEX0NOVDoKKwkgICAgY2ZnLT5jZmcudGhyZWFkX2NudCA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+Y2ZnLnRocmVhZF9jbnQgPiAxMjgpIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwKKwkJCSAgIkVycm9yOiBpbnZhbGlkIC0tdGhyZWFkLWNudCBvcHRpb24iKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BUSU1FOgorCSAgICBjZmctPm1lZGlhX2NmZy5wdGltZSA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+bWVkaWFfY2ZnLnB0aW1lIDwgMTAgfHwgY2ZnLT5tZWRpYV9jZmcucHRpbWUgPiAxMDAwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsCisJCQkgICJFcnJvcjogaW52YWxpZCAtLXB0aW1lIG9wdGlvbiIpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfTk9fVkFEOgorCSAgICBjZmctPm1lZGlhX2NmZy5ub192YWQgPSBQSl9UUlVFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0VDX1RBSUw6CisJICAgIGNmZy0+bWVkaWFfY2ZnLmVjX3RhaWxfbGVuID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5tZWRpYV9jZmcuZWNfdGFpbF9sZW4gPiAxMDAwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsICJJIHRoaW5rIHRoZSBlYy10YWlsIGxlbmd0aCBzZXR0aW5nICIKKwkJCSAgImlzIHRvbyBiaWciKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX0VDX09QVDoKKwkgICAgY2ZnLT5tZWRpYV9jZmcuZWNfb3B0aW9ucyA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9RVUFMSVRZOgorCSAgICBjZmctPm1lZGlhX2NmZy5xdWFsaXR5ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5tZWRpYV9jZmcucXVhbGl0eSA8IDAgfHwgY2ZnLT5tZWRpYV9jZmcucXVhbGl0eSA+IDEwKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsCisJCQkgICJFcnJvcjogaW52YWxpZCAtLXF1YWxpdHkgKGV4cGVjdGluZyAwLTEwIikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9JTEJDX01PREU6CisJICAgIGNmZy0+bWVkaWFfY2ZnLmlsYmNfbW9kZSA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+bWVkaWFfY2ZnLmlsYmNfbW9kZSE9MjAgJiYgY2ZnLT5tZWRpYV9jZmcuaWxiY19tb2RlIT0zMCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLAorCQkJICAiRXJyb3I6IGludmFsaWQgLS1pbGJjLW1vZGUgKGV4cGVjdGluZyAyMCBvciAzMCIpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUlhfRFJPUF9QQ1Q6CisJICAgIGNmZy0+bWVkaWFfY2ZnLnJ4X2Ryb3BfcGN0ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5tZWRpYV9jZmcucnhfZHJvcF9wY3QgPiAxMDApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwKKwkJCSAgIkVycm9yOiBpbnZhbGlkIC0tcngtZHJvcC1wY3QgKGV4cGVjdGluZyA8PSAxMDAiKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSBPUFRfVFhfRFJPUF9QQ1Q6CisJICAgIGNmZy0+bWVkaWFfY2ZnLnR4X2Ryb3BfcGN0ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5tZWRpYV9jZmcudHhfZHJvcF9wY3QgPiAxMDApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwKKwkJCSAgIkVycm9yOiBpbnZhbGlkIC0tdHgtZHJvcC1wY3QgKGV4cGVjdGluZyA8PSAxMDAiKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FVVE9fQU5TV0VSOgorCSAgICBjZmctPmF1dG9fYW5zd2VyID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoY2ZnLT5hdXRvX2Fuc3dlciA8IDEwMCB8fCBjZmctPmF1dG9fYW5zd2VyID4gNjk5KSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsCisJCQkgICJFcnJvcjogaW52YWxpZCBjb2RlIGluIC0tYXV0by1hbnN3ZXIgIgorCQkJICAiKGV4cGVjdGluZyAxMDAtNjk5IikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9NQVhfQ0FMTFM6CisJICAgIGNmZy0+Y2ZnLm1heF9jYWxscyA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGNmZy0+Y2ZnLm1heF9jYWxscyA8IDEgfHwgY2ZnLT5jZmcubWF4X2NhbGxzID4gUEpTVUFfTUFYX0NBTExTKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsIkVycm9yOiBtYXhpbXVtIGNhbGwgc2V0dGluZyBleGNlZWRzICIKKwkJCQkgICAgImNvbXBpbGUgdGltZSBsaW1pdCAoUEpTVUFfTUFYX0NBTExTPSVkKSIsCisJCQkgIFBKU1VBX01BWF9DQUxMUykpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKFBKU0lQX0hBU19UTFNfVFJBTlNQT1JUKSAmJiAoUEpTSVBfSEFTX1RMU19UUkFOU1BPUlQgIT0gMCkKKwljYXNlIE9QVF9VU0VfVExTOgorCSAgICBjZmctPnVzZV90bHMgPSBQSl9UUlVFOworCSAgICBicmVhazsKKwkgICAgCisJY2FzZSBPUFRfVExTX0NBX0ZJTEU6CisJICAgIGNmZy0+dWRwX2NmZy50bHNfc2V0dGluZy5jYV9saXN0X2ZpbGUgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgT1BUX1RMU19DRVJUX0ZJTEU6CisJICAgIGNmZy0+dWRwX2NmZy50bHNfc2V0dGluZy5jZXJ0X2ZpbGUgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgT1BUX1RMU19QUklWX0ZJTEU6CisJICAgIGNmZy0+dWRwX2NmZy50bHNfc2V0dGluZy5wcml2a2V5X2ZpbGUgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9UTFNfUEFTU1dPUkQ6CisJICAgIGNmZy0+dWRwX2NmZy50bHNfc2V0dGluZy5wYXNzd29yZCA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RMU19WRVJJRllfU0VSVkVSOgorCSAgICBjZmctPnVkcF9jZmcudGxzX3NldHRpbmcudmVyaWZ5X3NlcnZlciA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfVExTX1ZFUklGWV9DTElFTlQ6CisJICAgIGNmZy0+dWRwX2NmZy50bHNfc2V0dGluZy52ZXJpZnlfY2xpZW50ID0gUEpfVFJVRTsKKwkgICAgY2ZnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLnJlcXVpcmVfY2xpZW50X2NlcnQgPSBQSl9UUlVFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RMU19ORUdfVElNRU9VVDoKKwkgICAgY2ZnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLnRpbWVvdXQuc2VjID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RMU19DSVBIRVI6CisJICAgIHsKKwkJcGpfc3NsX2NpcGhlciBjaXBoZXI7CisKKwkJaWYgKHBqX2Fuc2lfc3RybmljbXAocGpfb3B0YXJnLCAiMHgiLCAyKSA9PSAwKSB7CisJCSAgICBwal9zdHJfdCBjaXBoZXJfc3QgPSBwal9zdHIocGpfb3B0YXJnICsgMik7CisJCSAgICBjaXBoZXIgPSBwal9zdHJ0b3VsMigmY2lwaGVyX3N0LCBOVUxMLCAxNik7CisJCX0gZWxzZSB7CisJCSAgICBjaXBoZXIgPSBhdG9pKHBqX29wdGFyZyk7CisJCX0KKworCQlpZiAocGpfc3NsX2NpcGhlcl9pc19zdXBwb3J0ZWQoY2lwaGVyKSkgeworCQkgICAgc3RhdGljIHBqX3NzbF9jaXBoZXIgdGxzX2NpcGhlcnNbMTI4XTsKKworCQkgICAgdGxzX2NpcGhlcnNbY2ZnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLmNpcGhlcnNfbnVtKytdID0gY2lwaGVyOworCQkgICAgY2ZnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLmNpcGhlcnMgPSB0bHNfY2lwaGVyczsKKwkJfSBlbHNlIHsKKwkJICAgIHBqX3NzbF9jaXBoZXIgY2lwaGVyc1sxMjhdOworCQkgICAgdW5zaWduZWQgaiwgY2lwaGVyc19jbnQ7CisKKwkJICAgIGNpcGhlcnNfY250ID0gUEpfQVJSQVlfU0laRShjaXBoZXJzKTsKKwkJICAgIHBqX3NzbF9jaXBoZXJfZ2V0X2F2YWlsYWJsZXMoY2lwaGVycywgJmNpcGhlcnNfY250KTsKKwkJICAgIAorCQkgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIkNpcGhlciBcIiVzXCIgaXMgbm90IHN1cHBvcnRlZCBieSAiCisJCQkJCSAiVExTL1NTTCBiYWNrZW5kLiIsIHBqX29wdGFyZykpOworCQkgICAgcHJpbnRmKCJBdmFpbGFibGUgVExTL1NTTCBjaXBoZXJzICglZCk6XG4iLCBjaXBoZXJzX2NudCk7CisJCSAgICBmb3IgKGo9MDsgajxjaXBoZXJzX2NudDsgKytqKQorCQkJcHJpbnRmKCItIDB4JTA2WDogJXNcbiIsIGNpcGhlcnNbal0sIHBqX3NzbF9jaXBoZXJfbmFtZShjaXBoZXJzW2pdKSk7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKwkgICAgfQorIAkgICAgYnJlYWs7CisjZW5kaWYgLyogUEpTSVBfSEFTX1RMU19UUkFOU1BPUlQgKi8KKworCWNhc2UgT1BUX0NBUFRVUkVfREVWOgorCSAgICBjZmctPmNhcHR1cmVfZGV2ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BMQVlCQUNLX0RFVjoKKwkgICAgY2ZnLT5wbGF5YmFja19kZXYgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfU1RET1VUX1JFRlJFU0g6CisJICAgIHN0ZG91dF9yZWZyZXNoID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1NURE9VVF9SRUZSRVNIX1RFWFQ6CisJICAgIHN0ZG91dF9yZWZyZXNoX3RleHQgPSBwal9vcHRhcmc7CisJICAgIGJyZWFrOworCisjaWZkZWYgX0lPTkJGCisJY2FzZSBPUFRfU1RET1VUX05PX0JVRjoKKwkgICAgc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIE9QVF9DQVBUVVJFX0xBVDoKKwkgICAgY2ZnLT5jYXB0dXJlX2xhdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9QTEFZQkFDS19MQVQ6CisJICAgIGNmZy0+cGxheWJhY2tfbGF0ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1NORF9BVVRPX0NMT1NFOgorCSAgICBjZmctPm1lZGlhX2NmZy5zbmRfYXV0b19jbG9zZV90aW1lID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX05PX1RPTkVTOgorCSAgICBjZmctPm5vX3RvbmVzID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9KQl9NQVhfU0laRToKKwkgICAgY2ZnLT5tZWRpYV9jZmcuamJfbWF4ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworI2lmIGRlZmluZWQoUEpfSEFTX0lQVjYpICYmIFBKX0hBU19JUFY2CisJY2FzZSBPUFRfSVBWNjoKKwkgICAgY2ZnLT5pcHY2ID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKwljYXNlIE9QVF9RT1M6CisJICAgIGNmZy0+ZW5hYmxlX3FvcyA9IFBKX1RSVUU7CisJICAgIC8qIFNldCBSVFAgdHJhZmZpYyB0eXBlIHRvIFZvaWNlICovCisJICAgIGNmZy0+cnRwX2NmZy5xb3NfdHlwZSA9IFBKX1FPU19UWVBFX1ZPSUNFOworCSAgICAvKiBEaXJlY3RseSBhcHBseSBEU0NQIHZhbHVlIHRvIFNJUCB0cmFmZmljLiBTYXkgbGV0cworCSAgICAgKiBzZXQgaXQgdG8gQ1MzIChEU0NQIDAxMTAwMCkuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IAorCSAgICAgKiB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMuCisJICAgICAqLworCSAgICBjZmctPnVkcF9jZmcucW9zX3BhcmFtcy5mbGFncyA9IFBKX1FPU19QQVJBTV9IQVNfRFNDUDsKKwkgICAgY2ZnLT51ZHBfY2ZnLnFvc19wYXJhbXMuZHNjcF92YWwgPSAweDE4OworCSAgICBicmVhazsKKwljYXNlIE9QVF9WSURFTzoKKwkgICAgY2ZnLT52aWQudmlkX2NudCA9IDE7CisJICAgIGNmZy0+dmlkLmluX2F1dG9fc2hvdyA9IFBKX1RSVUU7CisJICAgIGNmZy0+dmlkLm91dF9hdXRvX3RyYW5zbWl0ID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfRVhUUkFfQVVESU86CisJICAgIGNmZy0+YXVkX2NudCsrOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1ZDQVBUVVJFX0RFVjoKKwkgICAgY2ZnLT52aWQudmNhcHR1cmVfZGV2ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBjdXJfYWNjLT52aWRfY2FwX2RldiA9IGNmZy0+dmlkLnZjYXB0dXJlX2RldjsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9WUkVOREVSX0RFVjoKKwkgICAgY2ZnLT52aWQudnJlbmRlcl9kZXYgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGN1cl9hY2MtPnZpZF9yZW5kX2RldiA9IGNmZy0+dmlkLnZyZW5kZXJfZGV2OworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BMQVlfQVZJOgorCSAgICBpZiAoYXBwX2NvbmZpZy5hdmlfY250ID49IFBKU1VBX0FQUF9NQVhfQVZJKSB7CisJCVBKX0xPRygxLChUSElTX0ZJTEUsICJUb28gbWFueSBBVklzIikpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYXBwX2NvbmZpZy5hdmlbYXBwX2NvbmZpZy5hdmlfY250KytdLnBhdGggPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9BVVRPX1BMQVlfQVZJOgorCSAgICBhcHBfY29uZmlnLmF2aV9hdXRvX3BsYXkgPSBQSl9UUlVFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1VTRV9DTEk6CisJICAgIGNmZy0+dXNlX2NsaSA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfQ0xJX1RFTE5FVF9QT1JUOgorCSAgICBjZmctPmNsaV9jZmcudGVsbmV0X2NmZy5wb3J0ID0gKHBqX3VpbnQxNl90KWF0b2kocGpfb3B0YXJnKTsKKwkgICAgY2ZnLT5jbGlfY2ZnLmNsaV9mZSB8PSBDTElfRkVfVEVMTkVUOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0RJU0FCTEVfQ0xJX0NPTlNPTEU6CisJICAgIGNmZy0+Y2xpX2NmZy5jbGlfZmUgJj0gKH5DTElfRkVfQ09OU09MRSk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCSAgICAgICJBcmd1bWVudCBcIiVzXCIgaXMgbm90IHZhbGlkLiBVc2UgLS1oZWxwIHRvIHNlZSBoZWxwIiwKKwkJICAgICAgYXJndltwal9vcHRpbmQtMV0pKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICBpZiAocGpfb3B0aW5kICE9IGFyZ2MpIHsKKwlwal9zdHJfdCB1cmlfYXJnOworCisJaWYgKHBqc3VhX3ZlcmlmeV91cmwoYXJndltwal9vcHRpbmRdKSAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygxLChUSElTX0ZJTEUsICJJbnZhbGlkIFNJUCBVUkkgJXMiLCBhcmd2W3BqX29wdGluZF0pKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwl1cmlfYXJnID0gcGpfc3RyKGFyZ3ZbcGpfb3B0aW5kXSk7CisJaWYgKHVyaV90b19jYWxsKQorCSAgICAqdXJpX3RvX2NhbGwgPSB1cmlfYXJnOworCXBqX29wdGluZCsrOworCisJLyogQWRkIFVSSSB0byBjYWxsIHRvIGJ1ZGR5IGxpc3QgaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZSAqLworCWZvciAoaT0wOyBpPGNmZy0+YnVkZHlfY250OyArK2kpIHsKKwkgICAgaWYgKHBqX3N0cmljbXAoJmNmZy0+YnVkZHlfY2ZnW2ldLnVyaSwgJnVyaV9hcmcpPT0wKQorCQlicmVhazsKKwl9CisJaWYgKGkgPT0gY2ZnLT5idWRkeV9jbnQgJiYgY2ZnLT5idWRkeV9jbnQgPCBQSlNVQV9NQVhfQlVERElFUykgeworCSAgICBjZmctPmJ1ZGR5X2NmZ1tjZmctPmJ1ZGR5X2NudCsrXS51cmkgPSB1cmlfYXJnOworCX0KKworICAgIH0gZWxzZSB7CisJaWYgKHVyaV90b19jYWxsKQorCSAgICB1cmlfdG9fY2FsbC0+c2xlbiA9IDA7CisgICAgfQorCisgICAgaWYgKHBqX29wdGluZCAhPSBhcmdjKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiB1bmtub3duIG9wdGlvbnMgJXMiLCBhcmd2W3BqX29wdGluZF0pKTsKKwlyZXR1cm4gUEpfRUlOVkFMOworICAgIH0KKworICAgIGlmIChjZmctPmFjY19jZmdbY2ZnLT5hY2NfY250XS5pZC5zbGVuKQorCWNmZy0+YWNjX2NudCsrOworCisgICAgZm9yIChpPTA7IGk8Y2ZnLT5hY2NfY250OyArK2kpIHsKKwlwanN1YV9hY2NfY29uZmlnICphY2ZnID0gJmNmZy0+YWNjX2NmZ1tpXTsKKworCWlmIChhY2ZnLT5jcmVkX2luZm9bYWNmZy0+Y3JlZF9jb3VudF0udXNlcm5hbWUuc2xlbikKKwl7CisJICAgIGFjZmctPmNyZWRfY291bnQrKzsKKwl9CisKKwlpZiAoYWNmZy0+aWNlX2NmZy5lbmFibGVfaWNlKSB7CisJICAgIGFjZmctPmljZV9jZmdfdXNlID0gUEpTVUFfSUNFX0NPTkZJR19VU0VfQ1VTVE9NOworCX0KKwlpZiAoYWNmZy0+dHVybl9jZmcuZW5hYmxlX3R1cm4pIHsKKwkgICAgYWNmZy0+dHVybl9jZmdfdXNlID0gUEpTVUFfVFVSTl9DT05GSUdfVVNFX0NVU1RPTTsKKwl9CisKKwkvKiBXaGVuIElNUyBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoZSBhY2NvdW50LCB2ZXJpZnkgdGhhdCBzZXR0aW5ncworCSAqIGFyZSBva2F5LgorCSAqLworCS8qIEZvciBub3cgd2UgY2hlY2sgaWYgSU1TIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IGxvb2tpbmcgaWYKKwkgKiBpbml0aWFsX2F1dGggaXMgc2V0LgorCSAqLworCWlmIChhY2ZnLT5hdXRoX3ByZWYuaW5pdGlhbF9hdXRoICYmIGFjZmctPmNyZWRfY291bnQpIHsKKwkgICAgLyogUmVhbG0gbXVzdCBwb2ludCB0byB0aGUgcmVhbCBkb21haW4gKi8KKwkgICAgaWYgKCphY2ZnLT5jcmVkX2luZm9bMF0ucmVhbG0ucHRyPT0nKicpIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgCisJCQkgICJFcnJvcjogY2Fubm90IHVzZSAnKicgYXMgcmVhbG0gd2l0aCBJTVMiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKworCSAgICAvKiBVc2VybmFtZSBmb3IgYXV0aGVudGljYXRpb24gbXVzdCBiZSBpbiBhQGIgZm9ybWF0ICovCisJICAgIGlmIChzdHJjaHIoYWNmZy0+Y3JlZF9pbmZvWzBdLnVzZXJuYW1lLnB0ciwgJ0AnKT09MCkgeworCQlQSl9MT0coMSwoVEhJU19GSUxFLCAKKwkJCSAgIkVycm9yOiBVc2VybmFtZSBmb3IgYXV0aGVudGljYXRpb24gbXVzdCAiCisJCQkgICJiZSBpbiB1c2VyQGRvbWFpbiBmb3JtYXQgd2l0aCBJTVMiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBTZXQgZGVmYXVsdCBjb25maWcuICovCitzdGF0aWMgdm9pZCBkZWZhdWx0X2NvbmZpZygpCit7CisgICAgY2hhciB0bXBbODBdOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpzdWFfYXBwX2NvbmZpZyAqY2ZnID0gJmFwcF9jb25maWc7CisKKyAgICBwanN1YV9jb25maWdfZGVmYXVsdCgmY2ZnLT5jZmcpOworICAgIHBqX2Fuc2lfc3ByaW50Zih0bXAsICJQSlNVQSB2JXMgJXMiLCBwal9nZXRfdmVyc2lvbigpLAorCQkgICAgcGpfZ2V0X3N5c19pbmZvKCktPmluZm8ucHRyKTsKKyAgICBwal9zdHJkdXAyX3dpdGhfbnVsbChhcHBfY29uZmlnLnBvb2wsICZjZmctPmNmZy51c2VyX2FnZW50LCB0bXApOworCisgICAgcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCgmY2ZnLT5sb2dfY2ZnKTsKKyAgICBwanN1YV9tZWRpYV9jb25maWdfZGVmYXVsdCgmY2ZnLT5tZWRpYV9jZmcpOworICAgIHBqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdCgmY2ZnLT51ZHBfY2ZnKTsKKyAgICBjZmctPnVkcF9jZmcucG9ydCA9IDUwNjA7CisgICAgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCZjZmctPnJ0cF9jZmcpOworICAgIGNmZy0+cnRwX2NmZy5wb3J0ID0gNDAwMDsKKyAgICBjZmctPnJlZGlyX29wID0gUEpTSVBfUkVESVJFQ1RfQUNDRVBUX1JFUExBQ0U7CisgICAgY2ZnLT5kdXJhdGlvbiA9IFBKU1VBX0FQUF9OT19MSU1JVF9EVVJBVElPTjsKKyAgICBjZmctPndhdl9pZCA9IFBKU1VBX0lOVkFMSURfSUQ7CisgICAgY2ZnLT5yZWNfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIGNmZy0+d2F2X3BvcnQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIGNmZy0+cmVjX3BvcnQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIGNmZy0+bWljX2xldmVsID0gY2ZnLT5zcGVha2VyX2xldmVsID0gMS4wOworICAgIGNmZy0+Y2FwdHVyZV9kZXYgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIGNmZy0+cGxheWJhY2tfZGV2ID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBjZmctPmNhcHR1cmVfbGF0ID0gUEpNRURJQV9TTkRfREVGQVVMVF9SRUNfTEFURU5DWTsKKyAgICBjZmctPnBsYXliYWNrX2xhdCA9IFBKTUVESUFfU05EX0RFRkFVTFRfUExBWV9MQVRFTkNZOworICAgIGNmZy0+cmluZ2JhY2tfc2xvdCA9IFBKU1VBX0lOVkFMSURfSUQ7CisgICAgY2ZnLT5yaW5nX3Nsb3QgPSBQSlNVQV9JTlZBTElEX0lEOworCisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShjZmctPmFjY19jZmcpOyArK2kpCisJcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0KCZjZmctPmFjY19jZmdbaV0pOworCisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShjZmctPmJ1ZGR5X2NmZyk7ICsraSkKKwlwanN1YV9idWRkeV9jb25maWdfZGVmYXVsdCgmY2ZnLT5idWRkeV9jZmdbaV0pOworICAgIAorICAgIGNmZy0+dmlkLnZjYXB0dXJlX2RldiA9IFBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVY7CisgICAgY2ZnLT52aWQudnJlbmRlcl9kZXYgPSBQSk1FRElBX1ZJRF9ERUZBVUxUX1JFTkRFUl9ERVY7CisgICAgY2ZnLT5hdWRfY250ID0gMTsKKworICAgIGNmZy0+YXZpX2RlZl9pZHggPSBQSlNVQV9JTlZBTElEX0lEOworCisgICAgY2ZnLT51c2VfY2xpID0gUEpfRkFMU0U7CisgICAgY2ZnLT5jbGlfY2ZnLmNsaV9mZSA9IENMSV9GRV9DT05TT0xFOworICAgIGNmZy0+Y2xpX2NmZy50ZWxuZXRfY2ZnLnBvcnQgPSAwOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgcGFyc2VfY29uZmlnKGludCBhcmdjLCBjaGFyICphcmd2W10sIHBqX3N0cl90ICp1cmlfYXJnKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEluaXRpYWxpemUgZGVmYXVsdCBjb25maWcgKi8KKyAgICBkZWZhdWx0X2NvbmZpZygpOworCisgICAgLyogUGFyc2UgdGhlIGFyZ3VtZW50cyAqLworICAgIHN0YXR1cyA9IHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgdXJpX2FyZyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworcGpfc3RhdHVzX3QgbG9hZF9jb25maWcoaW50IGFyZ2MsCisJCQljaGFyICoqYXJndiwKKwkJCXBqX3N0cl90ICp1cmlfYXJnKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal9ib29sX3QgdXNlX2NsaSA9IFBKX0ZBTFNFOworICAgIGludCBjbGlfZmUgPSAwOworICAgIHBqX3VpbnQxNl90IGNsaV90ZWxuZXRfcG9ydCA9IDA7CisKKyAgICAvKiogQ0xJIG9wdGlvbnMgYXJlIG5vdCBjaGFuZ2FibGUgKiovCisgICAgaWYgKGFwcF9ydW5uaW5nKSB7CisJdXNlX2NsaSA9IGFwcF9jb25maWcudXNlX2NsaTsKKwljbGlfZmUgPSBhcHBfY29uZmlnLmNsaV9jZmcuY2xpX2ZlOworCWNsaV90ZWxuZXRfcG9ydCA9IGFwcF9jb25maWcuY2xpX2NmZy50ZWxuZXRfY2ZnLnBvcnQ7CisgICAgfQorCisgICAgc3RhdHVzID0gcGFyc2VfY29uZmlnKGFyZ2MsIGFyZ3YsIHVyaV9hcmcpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgaWYgKGFwcF9ydW5uaW5nKSB7ICAgIAorCWFwcF9jb25maWcudXNlX2NsaSA9IHVzZV9jbGk7CisJYXBwX2NvbmZpZy5jbGlfY2ZnLmNsaV9mZSA9IGNsaV9mZTsKKwlhcHBfY29uZmlnLmNsaV9jZmcudGVsbmV0X2NmZy5wb3J0ID0gY2xpX3RlbG5ldF9wb3J0OworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTYXZlIGFjY291bnQgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfYWNjb3VudF9zZXR0aW5ncyhpbnQgYWNjX2luZGV4LCBwal9zdHJfdCAqcmVzdWx0KQoreworICAgIHVuc2lnbmVkIGk7CisgICAgY2hhciBsaW5lWzEyOF07CisgICAgcGpzdWFfYWNjX2NvbmZpZyAqYWNjX2NmZyA9ICZhcHBfY29uZmlnLmFjY19jZmdbYWNjX2luZGV4XTsKKworCisgICAgcGpfYW5zaV9zcHJpbnRmKGxpbmUsICJcbiNcbiMgQWNjb3VudCAlZDpcbiNcbiIsIGFjY19pbmRleCk7CisgICAgcGpfc3RyY2F0MihyZXN1bHQsIGxpbmUpOworCisKKyAgICAvKiBJZGVudGl0eSAqLworICAgIGlmIChhY2NfY2ZnLT5pZC5zbGVuKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWlkICUuKnNcbiIsCisJCQkoaW50KWFjY19jZmctPmlkLnNsZW4sCisJCQlhY2NfY2ZnLT5pZC5wdHIpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RyYXIgc2VydmVyICovCisgICAgaWYgKGFjY19jZmctPnJlZ191cmkuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1yZWdpc3RyYXIgJS4qc1xuIiwKKwkJCSAgICAgIChpbnQpYWNjX2NmZy0+cmVnX3VyaS5zbGVuLAorCQkJICAgICAgYWNjX2NmZy0+cmVnX3VyaS5wdHIpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1yZWctdGltZW91dCAldVxuIiwKKwkJCSAgICAgIGFjY19jZmctPnJlZ190aW1lb3V0KTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgLyogQ29udGFjdCAqLworICAgIGlmIChhY2NfY2ZnLT5mb3JjZV9jb250YWN0LnNsZW4pIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tY29udGFjdCAlLipzXG4iLAorCQkJKGludClhY2NfY2ZnLT5mb3JjZV9jb250YWN0LnNsZW4sCisJCQlhY2NfY2ZnLT5mb3JjZV9jb250YWN0LnB0cik7CisJcGpfc3RyY2F0MihyZXN1bHQsIGxpbmUpOworICAgIH0KKworICAgIC8qIENvbnRhY3QgaGVhZGVyIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoYWNjX2NmZy0+Y29udGFjdF9wYXJhbXMuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1jb250YWN0LXBhcmFtcyAlLipzXG4iLAorCQkJKGludClhY2NfY2ZnLT5jb250YWN0X3BhcmFtcy5zbGVuLAorCQkJYWNjX2NmZy0+Y29udGFjdF9wYXJhbXMucHRyKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgLyogQ29udGFjdCBVUkkgcGFyYW1ldGVycyAqLworICAgIGlmIChhY2NfY2ZnLT5jb250YWN0X3VyaV9wYXJhbXMuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1jb250YWN0LXVyaS1wYXJhbXMgJS4qc1xuIiwKKwkJCShpbnQpYWNjX2NmZy0+Y29udGFjdF91cmlfcGFyYW1zLnNsZW4sCisJCQlhY2NfY2ZnLT5jb250YWN0X3VyaV9wYXJhbXMucHRyKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgLyogICovCisgICAgaWYgKGFjY19jZmctPmFsbG93X2NvbnRhY3RfcmV3cml0ZSE9MSkKKyAgICB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWF1dG8tdXBkYXRlLW5hdCAlaVxuIiwKKwkJCShpbnQpYWNjX2NmZy0+YWxsb3dfY29udGFjdF9yZXdyaXRlKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorICAgIC8qIFNSVFAgKi8KKyAgICBpZiAoYWNjX2NmZy0+dXNlX3NydHApIHsKKwlpbnQgdXNlX3NydHAgPSAoaW50KWFjY19jZmctPnVzZV9zcnRwOworCWlmICh1c2Vfc3J0cCA9PSBQSk1FRElBX1NSVFBfT1BUSU9OQUwgJiYKKwkgICAgYWNjX2NmZy0+c3J0cF9vcHRpb25hbF9kdXBfb2ZmZXIpCisJeworCSAgICB1c2Vfc3J0cCA9IDM7CisJfQorCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS11c2Utc3J0cCAlaVxuIiwgdXNlX3NydHApOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGFjY19jZmctPnNydHBfc2VjdXJlX3NpZ25hbGluZyAhPQorCVBKU1VBX0RFRkFVTFRfU1JUUF9TRUNVUkVfU0lHTkFMSU5HKQorICAgIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tc3J0cC1zZWN1cmUgJWRcbiIsCisJCQlhY2NfY2ZnLT5zcnRwX3NlY3VyZV9zaWduYWxpbmcpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFByb3h5ICovCisgICAgZm9yIChpPTA7IGk8YWNjX2NmZy0+cHJveHlfY250OyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tcHJveHkgJS4qc1xuIiwKKwkJCSAgICAgIChpbnQpYWNjX2NmZy0+cHJveHlbaV0uc2xlbiwKKwkJCSAgICAgIGFjY19jZmctPnByb3h5W2ldLnB0cik7CisJcGpfc3RyY2F0MihyZXN1bHQsIGxpbmUpOworICAgIH0KKworICAgIC8qIENyZWRlbnRpYWxzICovCisgICAgZm9yIChpPTA7IGk8YWNjX2NmZy0+Y3JlZF9jb3VudDsgKytpKSB7CisJaWYgKGFjY19jZmctPmNyZWRfaW5mb1tpXS5yZWFsbS5zbGVuKSB7CisJICAgIHBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1yZWFsbSAlLipzXG4iLAorCQkJCSAgKGludClhY2NfY2ZnLT5jcmVkX2luZm9baV0ucmVhbG0uc2xlbiwKKwkJCQkgIGFjY19jZmctPmNyZWRfaW5mb1tpXS5yZWFsbS5wdHIpOworCSAgICBwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisJfQorCisJaWYgKGFjY19jZmctPmNyZWRfaW5mb1tpXS51c2VybmFtZS5zbGVuKSB7CisJICAgIHBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS11c2VybmFtZSAlLipzXG4iLAorCQkJCSAgKGludClhY2NfY2ZnLT5jcmVkX2luZm9baV0udXNlcm5hbWUuc2xlbiwKKwkJCQkgIGFjY19jZmctPmNyZWRfaW5mb1tpXS51c2VybmFtZS5wdHIpOworCSAgICBwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisJfQorCisJaWYgKGFjY19jZmctPmNyZWRfaW5mb1tpXS5kYXRhLnNsZW4pIHsKKwkgICAgcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXBhc3N3b3JkICUuKnNcbiIsCisJCQkJICAoaW50KWFjY19jZmctPmNyZWRfaW5mb1tpXS5kYXRhLnNsZW4sCisJCQkJICBhY2NfY2ZnLT5jcmVkX2luZm9baV0uZGF0YS5wdHIpOworCSAgICBwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisJfQorCisJaWYgKGkgIT0gYWNjX2NmZy0+Y3JlZF9jb3VudCAtIDEpCisJICAgIHBqX3N0cmNhdDIocmVzdWx0LCAiLS1uZXh0LWNyZWRcbiIpOworICAgIH0KKworICAgIC8qIHJlZy11c2UtcHJveHkgKi8KKyAgICBpZiAoYWNjX2NmZy0+cmVnX3VzZV9wcm94eSAhPSAzKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXJlZy11c2UtcHJveHkgJWRcbiIsCisJCQkgICAgICBhY2NfY2ZnLT5yZWdfdXNlX3Byb3h5KTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgLyogcmVyZWctZGVsYXkgKi8KKyAgICBpZiAoYWNjX2NmZy0+cmVnX3JldHJ5X2ludGVydmFsICE9IFBKU1VBX1JFR19SRVRSWV9JTlRFUlZBTCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1yZXJlZy1kZWxheSAlZFxuIiwKKwkJICAgICAgICAgICAgICBhY2NfY2ZnLT5yZWdfcmV0cnlfaW50ZXJ2YWwpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiAxMDByZWwgZXh0ZW5zaW9uICovCisgICAgaWYgKGFjY19jZmctPnJlcXVpcmVfMTAwcmVsKSB7CisJcGpfc3RyY2F0MihyZXN1bHQsICItLXVzZS0xMDByZWxcbiIpOworICAgIH0KKworICAgIC8qIFNlc3Npb24gVGltZXIgZXh0ZW5zaW9uICovCisgICAgaWYgKGFjY19jZmctPnVzZV90aW1lcikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS11c2UtdGltZXIgJWRcbiIsCisJCQkgICAgICBhY2NfY2ZnLT51c2VfdGltZXIpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGFjY19jZmctPnRpbWVyX3NldHRpbmcubWluX3NlICE9IDkwKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXRpbWVyLW1pbi1zZSAlZFxuIiwKKwkJCSAgICAgIGFjY19jZmctPnRpbWVyX3NldHRpbmcubWluX3NlKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorICAgIGlmIChhY2NfY2ZnLT50aW1lcl9zZXR0aW5nLnNlc3NfZXhwaXJlcyAhPSBQSlNJUF9TRVNTX1RJTUVSX0RFRl9TRSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS10aW1lci1zZSAlZFxuIiwKKwkJCSAgICAgIGFjY19jZmctPnRpbWVyX3NldHRpbmcuc2Vzc19leHBpcmVzKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgLyogUHVibGlzaCAqLworICAgIGlmIChhY2NfY2ZnLT5wdWJsaXNoX2VuYWJsZWQpCisJcGpfc3RyY2F0MihyZXN1bHQsICItLXB1Ymxpc2hcbiIpOworCisgICAgLyogTVdJICovCisgICAgaWYgKGFjY19jZmctPm13aV9lbmFibGVkKQorCXBqX3N0cmNhdDIocmVzdWx0LCAiLS1td2lcbiIpOworCisgICAgaWYgKGFjY19jZmctPnNpcF9zdHVuX3VzZSAhPSBQSlNVQV9TVFVOX1VTRV9ERUZBVUxUIHx8CisJYWNjX2NmZy0+bWVkaWFfc3R1bl91c2UgIT0gUEpTVUFfU1RVTl9VU0VfREVGQVVMVCkKKyAgICB7CisJcGpfc3RyY2F0MihyZXN1bHQsICItLWRpc2FibGUtc3R1blxuIik7CisgICAgfQorCisgICAgLyogTWVkaWEgVHJhbnNwb3J0Ki8KKyAgICBpZiAoYWNjX2NmZy0+aWNlX2NmZy5lbmFibGVfaWNlKQorCXBqX3N0cmNhdDIocmVzdWx0LCAiLS11c2UtaWNlXG4iKTsKKworICAgIGlmIChhY2NfY2ZnLT5pY2VfY2ZnLmljZV9vcHQuYWdncmVzc2l2ZSA9PSBQSl9GQUxTRSkKKwlwal9zdHJjYXQyKHJlc3VsdCwgIi0taWNlLXJlZ3VsYXJcbiIpOworCisgICAgaWYgKGFjY19jZmctPnR1cm5fY2ZnLmVuYWJsZV90dXJuKQorCXBqX3N0cmNhdDIocmVzdWx0LCAiLS11c2UtdHVyblxuIik7CisKKyAgICBpZiAoYWNjX2NmZy0+aWNlX2NmZy5pY2VfbWF4X2hvc3RfY2FuZHMgPj0gMCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1pY2VfbWF4X2hvc3RfY2FuZHMgJWRcbiIsCisJICAgICAgICAgICAgICAgIGFjY19jZmctPmljZV9jZmcuaWNlX21heF9ob3N0X2NhbmRzKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgaWYgKGFjY19jZmctPmljZV9jZmcuaWNlX25vX3J0Y3ApCisJcGpfc3RyY2F0MihyZXN1bHQsICItLWljZS1uby1ydGNwXG4iKTsKKworICAgIGlmIChhY2NfY2ZnLT50dXJuX2NmZy50dXJuX3NlcnZlci5zbGVuKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXR1cm4tc3J2ICUuKnNcbiIsCisJCQkoaW50KWFjY19jZmctPnR1cm5fY2ZnLnR1cm5fc2VydmVyLnNsZW4sCisJCQlhY2NfY2ZnLT50dXJuX2NmZy50dXJuX3NlcnZlci5wdHIpOworCXBqX3N0cmNhdDIocmVzdWx0LCBsaW5lKTsKKyAgICB9CisKKyAgICBpZiAoYWNjX2NmZy0+dHVybl9jZmcudHVybl9jb25uX3R5cGUgPT0gUEpfVFVSTl9UUF9UQ1ApCisJcGpfc3RyY2F0MihyZXN1bHQsICItLXR1cm4tdGNwXG4iKTsKKworICAgIGlmIChhY2NfY2ZnLT50dXJuX2NmZy50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLnVzZXJuYW1lLnNsZW4pIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdHVybi11c2VyICUuKnNcbiIsCisJCQkoaW50KWFjY19jZmctPnR1cm5fY2ZnLnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQudXNlcm5hbWUuc2xlbiwKKwkJCWFjY19jZmctPnR1cm5fY2ZnLnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQudXNlcm5hbWUucHRyKTsKKwlwal9zdHJjYXQyKHJlc3VsdCwgbGluZSk7CisgICAgfQorCisgICAgaWYgKGFjY19jZmctPnR1cm5fY2ZnLnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQuZGF0YS5zbGVuKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXR1cm4tcGFzc3dkICUuKnNcbiIsCisJCQkoaW50KWFjY19jZmctPnR1cm5fY2ZnLnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQuZGF0YS5zbGVuLAorCQkJYWNjX2NmZy0+dHVybl9jZmcudHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC5kYXRhLnB0cik7CisJcGpfc3RyY2F0MihyZXN1bHQsIGxpbmUpOworICAgIH0KK30KKworLyoKKyAqIFdyaXRlIHNldHRpbmdzLgorICovCitpbnQgd3JpdGVfc2V0dGluZ3MocGpzdWFfYXBwX2NvbmZpZyAqY29uZmlnLCBjaGFyICpidWYsIHBqX3NpemVfdCBtYXgpCit7CisgICAgdW5zaWduZWQgYWNjX2luZGV4OworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfc3RyX3QgY2ZnOworICAgIGNoYXIgbGluZVsxMjhdOworICAgIGV4dGVybiBwal9ib29sX3QgcGpzaXBfdXNlX2NvbXBhY3RfZm9ybTsKKworICAgIFBKX1VOVVNFRF9BUkcobWF4KTsKKworICAgIGNmZy5wdHIgPSBidWY7CisgICAgY2ZnLnNsZW4gPSAwOworCisgICAgLyogTG9nZ2luZy4gKi8KKyAgICBwal9zdHJjYXQyKCZjZmcsICIjXG4jIExvZ2dpbmcgb3B0aW9uczpcbiNcbiIpOworICAgIHBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1sb2ctbGV2ZWwgJWRcbiIsCisJCSAgICBjb25maWctPmxvZ19jZmcubGV2ZWwpOworICAgIHBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisKKyAgICBwal9hbnNpX3NwcmludGYobGluZSwgIi0tYXBwLWxvZy1sZXZlbCAlZFxuIiwKKwkJICAgIGNvbmZpZy0+bG9nX2NmZy5jb25zb2xlX2xldmVsKTsKKyAgICBwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworCisgICAgaWYgKGNvbmZpZy0+bG9nX2NmZy5sb2dfZmlsZW5hbWUuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1sb2ctZmlsZSAlLipzXG4iLAorCQkJKGludCljb25maWctPmxvZ19jZmcubG9nX2ZpbGVuYW1lLnNsZW4sCisJCQljb25maWctPmxvZ19jZmcubG9nX2ZpbGVuYW1lLnB0cik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICBpZiAoY29uZmlnLT5sb2dfY2ZnLmxvZ19maWxlX2ZsYWdzICYgUEpfT19BUFBFTkQpIHsKKwlwal9zdHJjYXQyKCZjZmcsICItLWxvZy1hcHBlbmRcbiIpOworICAgIH0KKworICAgIC8qIFNhdmUgYWNjb3VudCBzZXR0aW5ncy4gKi8KKyAgICBmb3IgKGFjY19pbmRleD0wOyBhY2NfaW5kZXggPCBjb25maWctPmFjY19jbnQ7ICsrYWNjX2luZGV4KSB7CisKKwl3cml0ZV9hY2NvdW50X3NldHRpbmdzKGFjY19pbmRleCwgJmNmZyk7CisKKwlpZiAoYWNjX2luZGV4IDwgY29uZmlnLT5hY2NfY250LTEpCisJICAgIHBqX3N0cmNhdDIoJmNmZywgIi0tbmV4dC1hY2NvdW50XG4iKTsKKyAgICB9CisKKyAgICBwal9zdHJjYXQyKCZjZmcsICJcbiNcbiMgTmV0d29yayBzZXR0aW5nczpcbiNcbiIpOworCisgICAgLyogTmFtZXNlcnZlcnMgKi8KKyAgICBmb3IgKGk9MDsgaTxjb25maWctPmNmZy5uYW1lc2VydmVyX2NvdW50OyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tbmFtZXNlcnZlciAlLipzXG4iLAorCQkJICAgICAgKGludCljb25maWctPmNmZy5uYW1lc2VydmVyW2ldLnNsZW4sCisJCQkgICAgICBjb25maWctPmNmZy5uYW1lc2VydmVyW2ldLnB0cik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiBPdXRib3VuZCBwcm94eSAqLworICAgIGZvciAoaT0wOyBpPGNvbmZpZy0+Y2ZnLm91dGJvdW5kX3Byb3h5X2NudDsgKytpKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLW91dGJvdW5kICUuKnNcbiIsCisJCQkgICAgICAoaW50KWNvbmZpZy0+Y2ZnLm91dGJvdW5kX3Byb3h5W2ldLnNsZW4sCisJCQkgICAgICBjb25maWctPmNmZy5vdXRib3VuZF9wcm94eVtpXS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogVHJhbnNwb3J0IG9wdGlvbnMgKi8KKyAgICBpZiAoY29uZmlnLT5pcHY2KSB7CisJcGpfc3RyY2F0MigmY2ZnLCAiLS1pcHY2XG4iKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+ZW5hYmxlX3FvcykgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tc2V0LXFvc1xuIik7CisgICAgfQorCisgICAgLyogVURQIFRyYW5zcG9ydC4gKi8KKyAgICBwal9hbnNpX3NwcmludGYobGluZSwgIi0tbG9jYWwtcG9ydCAlZFxuIiwgY29uZmlnLT51ZHBfY2ZnLnBvcnQpOworICAgIHBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisKKyAgICAvKiBJUCBhZGRyZXNzLCBpZiBhbnkuICovCisgICAgaWYgKGNvbmZpZy0+dWRwX2NmZy5wdWJsaWNfYWRkci5zbGVuKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWlwLWFkZHIgJS4qc1xuIiwKKwkJCShpbnQpY29uZmlnLT51ZHBfY2ZnLnB1YmxpY19hZGRyLnNsZW4sCisJCQljb25maWctPnVkcF9jZmcucHVibGljX2FkZHIucHRyKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIC8qIEJvdW5kIElQIGFkZHJlc3MsIGlmIGFueS4gKi8KKyAgICBpZiAoY29uZmlnLT51ZHBfY2ZnLmJvdW5kX2FkZHIuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1ib3VuZC1hZGRyICUuKnNcbiIsCisJCQkoaW50KWNvbmZpZy0+dWRwX2NmZy5ib3VuZF9hZGRyLnNsZW4sCisJCQljb25maWctPnVkcF9jZmcuYm91bmRfYWRkci5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogTm8gVENQID8gKi8KKyAgICBpZiAoY29uZmlnLT5ub190Y3ApIHsKKwlwal9zdHJjYXQyKCZjZmcsICItLW5vLXRjcFxuIik7CisgICAgfQorCisgICAgLyogTm8gVURQID8gKi8KKyAgICBpZiAoY29uZmlnLT5ub191ZHApIHsKKwlwal9zdHJjYXQyKCZjZmcsICItLW5vLXVkcFxuIik7CisgICAgfQorCisgICAgLyogU1RVTiAqLworICAgIGZvciAoaT0wOyBpPGNvbmZpZy0+Y2ZnLnN0dW5fc3J2X2NudDsgKytpKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXN0dW4tc3J2ICUuKnNcbiIsCisJCQkoaW50KWNvbmZpZy0+Y2ZnLnN0dW5fc3J2W2ldLnNsZW4sCisJCQljb25maWctPmNmZy5zdHVuX3NydltpXS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisjaWYgZGVmaW5lZChQSlNJUF9IQVNfVExTX1RSQU5TUE9SVCkgJiYgKFBKU0lQX0hBU19UTFNfVFJBTlNQT1JUICE9IDApCisgICAgLyogVExTICovCisgICAgaWYgKGNvbmZpZy0+dXNlX3RscykKKwlwal9zdHJjYXQyKCZjZmcsICItLXVzZS10bHNcbiIpOworICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcuY2FfbGlzdF9maWxlLnNsZW4pIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdGxzLWNhLWZpbGUgJS4qc1xuIiwKKwkJCShpbnQpY29uZmlnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLmNhX2xpc3RfZmlsZS5zbGVuLAorCQkJY29uZmlnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLmNhX2xpc3RfZmlsZS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcuY2VydF9maWxlLnNsZW4pIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdGxzLWNlcnQtZmlsZSAlLipzXG4iLAorCQkJKGludCljb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcuY2VydF9maWxlLnNsZW4sCisJCQljb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcuY2VydF9maWxlLnB0cik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+dWRwX2NmZy50bHNfc2V0dGluZy5wcml2a2V5X2ZpbGUuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS10bHMtcHJpdmtleS1maWxlICUuKnNcbiIsCisJCQkoaW50KWNvbmZpZy0+dWRwX2NmZy50bHNfc2V0dGluZy5wcml2a2V5X2ZpbGUuc2xlbiwKKwkJCWNvbmZpZy0+dWRwX2NmZy50bHNfc2V0dGluZy5wcml2a2V5X2ZpbGUucHRyKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcucGFzc3dvcmQuc2xlbikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS10bHMtcGFzc3dvcmQgJS4qc1xuIiwKKwkJCShpbnQpY29uZmlnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLnBhc3N3b3JkLnNsZW4sCisJCQljb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcucGFzc3dvcmQucHRyKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcudmVyaWZ5X3NlcnZlcikKKwlwal9zdHJjYXQyKCZjZmcsICItLXRscy12ZXJpZnktc2VydmVyXG4iKTsKKworICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcudmVyaWZ5X2NsaWVudCkKKwlwal9zdHJjYXQyKCZjZmcsICItLXRscy12ZXJpZnktY2xpZW50XG4iKTsKKworICAgIGlmIChjb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcudGltZW91dC5zZWMpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdGxzLW5lZy10aW1lb3V0ICVkXG4iLAorCQkJKGludCljb25maWctPnVkcF9jZmcudGxzX3NldHRpbmcudGltZW91dC5zZWMpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8Y29uZmlnLT51ZHBfY2ZnLnRsc19zZXR0aW5nLmNpcGhlcnNfbnVtOyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdGxzLWNpcGhlciAweCUwNlggIyAlc1xuIiwKKwkJCWNvbmZpZy0+dWRwX2NmZy50bHNfc2V0dGluZy5jaXBoZXJzW2ldLAorCQkJcGpfc3NsX2NpcGhlcl9uYW1lKGNvbmZpZy0+dWRwX2NmZy50bHNfc2V0dGluZy5jaXBoZXJzW2ldKSk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisjZW5kaWYKKworICAgIHBqX3N0cmNhdDIoJmNmZywgIlxuI1xuIyBNZWRpYSBzZXR0aW5nczpcbiNcbiIpOworCisgICAgLyogVmlkZW8gJiBleHRyYSBhdWRpbyAqLworICAgIGZvciAoaT0wOyBpPGNvbmZpZy0+dmlkLnZpZF9jbnQ7ICsraSkgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tdmlkZW9cbiIpOworICAgIH0KKyAgICBmb3IgKGk9MTsgaTxjb25maWctPmF1ZF9jbnQ7ICsraSkgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tZXh0cmEtYXVkaW9cbiIpOworICAgIH0KKworICAgIC8qIFNSVFAgKi8KKyNpZiBQSk1FRElBX0hBU19TUlRQCisgICAgaWYgKGFwcF9jb25maWcuY2ZnLnVzZV9zcnRwICE9IFBKU1VBX0RFRkFVTFRfVVNFX1NSVFApIHsKKwlpbnQgdXNlX3NydHAgPSAoaW50KWFwcF9jb25maWcuY2ZnLnVzZV9zcnRwOworCWlmICh1c2Vfc3J0cCA9PSBQSk1FRElBX1NSVFBfT1BUSU9OQUwgJiYKKwkgICAgYXBwX2NvbmZpZy5jZmcuc3J0cF9vcHRpb25hbF9kdXBfb2ZmZXIpCisJeworCSAgICB1c2Vfc3J0cCA9IDM7CisJfQorCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS11c2Utc3J0cCAlZFxuIiwgdXNlX3NydHApOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChhcHBfY29uZmlnLmNmZy5zcnRwX3NlY3VyZV9zaWduYWxpbmcgIT0KKwlQSlNVQV9ERUZBVUxUX1NSVFBfU0VDVVJFX1NJR05BTElORykKKyAgICB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXNydHAtc2VjdXJlICVkXG4iLAorCQkJYXBwX2NvbmZpZy5jZmcuc3J0cF9zZWN1cmVfc2lnbmFsaW5nKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogTWVkaWEgKi8KKyAgICBpZiAoY29uZmlnLT5udWxsX2F1ZGlvKQorCXBqX3N0cmNhdDIoJmNmZywgIi0tbnVsbC1hdWRpb1xuIik7CisgICAgaWYgKGNvbmZpZy0+YXV0b19wbGF5KQorCXBqX3N0cmNhdDIoJmNmZywgIi0tYXV0by1wbGF5XG4iKTsKKyAgICBpZiAoY29uZmlnLT5hdXRvX2xvb3ApCisJcGpfc3RyY2F0MigmY2ZnLCAiLS1hdXRvLWxvb3BcbiIpOworICAgIGlmIChjb25maWctPmF1dG9fY29uZikKKwlwal9zdHJjYXQyKCZjZmcsICItLWF1dG8tY29uZlxuIik7CisgICAgZm9yIChpPTA7IGk8Y29uZmlnLT53YXZfY291bnQ7ICsraSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1wbGF5LWZpbGUgJXNcbiIsCisJCQljb25maWctPndhdl9maWxlc1tpXS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGZvciAoaT0wOyBpPGNvbmZpZy0+dG9uZV9jb3VudDsgKytpKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXBsYXktdG9uZSAlZCwlZCwlZCwlZFxuIiwKKwkJCWNvbmZpZy0+dG9uZXNbaV0uZnJlcTEsIGNvbmZpZy0+dG9uZXNbaV0uZnJlcTIsCisJCQljb25maWctPnRvbmVzW2ldLm9uX21zZWMsIGNvbmZpZy0+dG9uZXNbaV0ub2ZmX21zZWMpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChjb25maWctPnJlY19maWxlLnNsZW4pIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tcmVjLWZpbGUgJXNcbiIsCisJCQljb25maWctPnJlY19maWxlLnB0cik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+YXV0b19yZWMpCisJcGpfc3RyY2F0MigmY2ZnLCAiLS1hdXRvLXJlY1xuIik7CisgICAgaWYgKGNvbmZpZy0+Y2FwdHVyZV9kZXYgIT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1jYXB0dXJlLWRldiAlZFxuIiwgY29uZmlnLT5jYXB0dXJlX2Rldik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+cGxheWJhY2tfZGV2ICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tcGxheWJhY2stZGV2ICVkXG4iLCBjb25maWctPnBsYXliYWNrX2Rldik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+bWVkaWFfY2ZnLnNuZF9hdXRvX2Nsb3NlX3RpbWUgIT0gLTEpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tc25kLWF1dG8tY2xvc2UgJWRcbiIsCisJCQljb25maWctPm1lZGlhX2NmZy5zbmRfYXV0b19jbG9zZV90aW1lKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5ub190b25lcykgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tbm8tdG9uZXNcbiIpOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5tZWRpYV9jZmcuamJfbWF4ICE9IC0xKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWpiLW1heC1zaXplICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcuamJfbWF4KTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIC8qIFNvdW5kIGRldmljZSBsYXRlbmN5ICovCisgICAgaWYgKGNvbmZpZy0+Y2FwdHVyZV9sYXQgIT0gUEpNRURJQV9TTkRfREVGQVVMVF9SRUNfTEFURU5DWSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1jYXB0dXJlLWxhdCAlZFxuIiwgY29uZmlnLT5jYXB0dXJlX2xhdCk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+cGxheWJhY2tfbGF0ICE9IFBKTUVESUFfU05EX0RFRkFVTFRfUExBWV9MQVRFTkNZKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXBsYXliYWNrLWxhdCAlZFxuIiwgY29uZmlnLT5wbGF5YmFja19sYXQpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogTWVkaWEgY2xvY2sgcmF0ZS4gKi8KKyAgICBpZiAoY29uZmlnLT5tZWRpYV9jZmcuY2xvY2tfcmF0ZSAhPSBQSlNVQV9ERUZBVUxUX0NMT0NLX1JBVEUpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tY2xvY2stcmF0ZSAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLmNsb2NrX3JhdGUpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfSBlbHNlIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIiN1c2luZyBkZWZhdWx0IC0tY2xvY2stcmF0ZSAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLmNsb2NrX3JhdGUpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZy0+bWVkaWFfY2ZnLnNuZF9jbG9ja19yYXRlICYmCisJY29uZmlnLT5tZWRpYV9jZmcuc25kX2Nsb2NrX3JhdGUgIT0gY29uZmlnLT5tZWRpYV9jZmcuY2xvY2tfcmF0ZSkKKyAgICB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXNuZC1jbG9jay1yYXRlICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcuc25kX2Nsb2NrX3JhdGUpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogU3RlcmVvIG1vZGUuICovCisgICAgaWYgKGNvbmZpZy0+bWVkaWFfY2ZnLmNoYW5uZWxfY291bnQgPT0gMikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1zdGVyZW9cbiIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogcXVhbGl0eSAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5xdWFsaXR5ICE9IFBKU1VBX0RFRkFVTFRfQ09ERUNfUVVBTElUWSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1xdWFsaXR5ICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcucXVhbGl0eSk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9IGVsc2UgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiI3VzaW5nIGRlZmF1bHQgLS1xdWFsaXR5ICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcucXVhbGl0eSk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICBpZiAoY29uZmlnLT52aWQudmNhcHR1cmVfZGV2ICE9IFBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVYpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdmNhcHR1cmUtZGV2ICVkXG4iLCBjb25maWctPnZpZC52Y2FwdHVyZV9kZXYpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChjb25maWctPnZpZC52cmVuZGVyX2RldiAhPSBQSk1FRElBX1ZJRF9ERUZBVUxUX1JFTkRFUl9ERVYpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tdnJlbmRlci1kZXYgJWRcbiIsIGNvbmZpZy0+dmlkLnZyZW5kZXJfZGV2KTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTxjb25maWctPmF2aV9jbnQ7ICsraSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1wbGF5LWF2aSAlc1xuIiwgY29uZmlnLT5hdmlbaV0ucGF0aC5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChjb25maWctPmF2aV9hdXRvX3BsYXkpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tYXV0by1wbGF5LWF2aVxuIik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiBwdGltZSAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5wdGltZSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1wdGltZSAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLnB0aW1lKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIC8qIG5vLXZhZCAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5ub192YWQpIHsKKwlwal9zdHJjYXQyKCZjZmcsICItLW5vLXZhZFxuIik7CisgICAgfQorCisgICAgLyogZWMtdGFpbCAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5lY190YWlsX2xlbiAhPSBQSlNVQV9ERUZBVUxUX0VDX1RBSUxfTEVOKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWVjLXRhaWwgJWRcbiIsCisJCQljb25maWctPm1lZGlhX2NmZy5lY190YWlsX2xlbik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9IGVsc2UgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiI3VzaW5nIGRlZmF1bHQgLS1lYy10YWlsICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcuZWNfdGFpbF9sZW4pOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogZWMtb3B0ICovCisgICAgaWYgKGNvbmZpZy0+bWVkaWFfY2ZnLmVjX29wdGlvbnMgIT0gMCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1lYy1vcHQgJWRcbiIsCisJCQljb25maWctPm1lZGlhX2NmZy5lY19vcHRpb25zKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIC8qIGlsYmMtbW9kZSAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5pbGJjX21vZGUgIT0gUEpTVUFfREVGQVVMVF9JTEJDX01PREUpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0taWxiYy1tb2RlICVkXG4iLAorCQkJY29uZmlnLT5tZWRpYV9jZmcuaWxiY19tb2RlKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICIjdXNpbmcgZGVmYXVsdCAtLWlsYmMtbW9kZSAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLmlsYmNfbW9kZSk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiBSVFAgZHJvcCAqLworICAgIGlmIChjb25maWctPm1lZGlhX2NmZy50eF9kcm9wX3BjdCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS10eC1kcm9wLXBjdCAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLnR4X2Ryb3BfcGN0KTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworCisgICAgfQorICAgIGlmIChjb25maWctPm1lZGlhX2NmZy5yeF9kcm9wX3BjdCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1yeC1kcm9wLXBjdCAlZFxuIiwKKwkJCWNvbmZpZy0+bWVkaWFfY2ZnLnJ4X2Ryb3BfcGN0KTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworCisgICAgfQorCisgICAgLyogU3RhcnQgUlRQIHBvcnQuICovCisgICAgcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXJ0cC1wb3J0ICVkXG4iLAorCQkgICAgY29uZmlnLT5ydHBfY2ZnLnBvcnQpOworICAgIHBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisKKyAgICAvKiBEaXNhYmxlIGNvZGVjICovCisgICAgZm9yIChpPTA7IGk8Y29uZmlnLT5jb2RlY19kaXNfY250OyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tZGlzLWNvZGVjICVzXG4iLAorCQkgICAgY29uZmlnLT5jb2RlY19kaXNbaV0ucHRyKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKyAgICAvKiBBZGQgY29kZWMuICovCisgICAgZm9yIChpPTA7IGk8Y29uZmlnLT5jb2RlY19jbnQ7ICsraSkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1hZGQtY29kZWMgJXNcbiIsCisJCSAgICBjb25maWctPmNvZGVjX2FyZ1tpXS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgcGpfc3RyY2F0MigmY2ZnLCAiXG4jXG4jIFVzZXIgYWdlbnQ6XG4jXG4iKTsKKworICAgIC8qIEF1dG8tYW5zd2VyLiAqLworICAgIGlmIChjb25maWctPmF1dG9fYW5zd2VyICE9IDApIHsKKwlwal9hbnNpX3NwcmludGYobGluZSwgIi0tYXV0by1hbnN3ZXIgJWRcbiIsCisJCQljb25maWctPmF1dG9fYW5zd2VyKTsKKwlwal9zdHJjYXQyKCZjZmcsIGxpbmUpOworICAgIH0KKworICAgIC8qIGFjY2VwdC1yZWRpcmVjdCAqLworICAgIGlmIChjb25maWctPnJlZGlyX29wICE9IFBKU0lQX1JFRElSRUNUX0FDQ0VQVF9SRVBMQUNFKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWFjY2VwdC1yZWRpcmVjdCAlZFxuIiwKKwkJCWNvbmZpZy0+cmVkaXJfb3ApOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogTWF4IGNhbGxzLiAqLworICAgIHBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS1tYXgtY2FsbHMgJWRcbiIsCisJCSAgICBjb25maWctPmNmZy5tYXhfY2FsbHMpOworICAgIHBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisKKyAgICAvKiBVYXMtZHVyYXRpb24uICovCisgICAgaWYgKGNvbmZpZy0+ZHVyYXRpb24gIT0gUEpTVUFfQVBQX05PX0xJTUlUX0RVUkFUSU9OKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWR1cmF0aW9uICVkXG4iLAorCQkJY29uZmlnLT5kdXJhdGlvbik7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisKKyAgICAvKiBub3JlZmVyc3ViID8gKi8KKyAgICBpZiAoY29uZmlnLT5ub19yZWZlcnN1YikgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tbm9yZWZlcnN1YlxuIik7CisgICAgfQorCisgICAgaWYgKHBqc2lwX3VzZV9jb21wYWN0X2Zvcm0pCisgICAgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tdXNlLWNvbXBhY3QtZm9ybVxuIik7CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmNmZy5mb3JjZV9scikgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tbm8tZm9yY2UtbHJcbiIpOworICAgIH0KKworICAgIHBqX3N0cmNhdDIoJmNmZywgIlxuI1xuIyBCdWRkaWVzOlxuI1xuIik7CisKKyAgICAvKiBBZGQgYnVkZGllcy4gKi8KKyAgICBmb3IgKGk9MDsgaTxjb25maWctPmJ1ZGR5X2NudDsgKytpKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLWFkZC1idWRkeSAlLipzXG4iLAorCQkJICAgICAgKGludCljb25maWctPmJ1ZGR5X2NmZ1tpXS51cmkuc2xlbiwKKwkJCSAgICAgIGNvbmZpZy0+YnVkZHlfY2ZnW2ldLnVyaS5wdHIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgLyogU0lQIGV4dGVuc2lvbnMuICovCisgICAgcGpfc3RyY2F0MigmY2ZnLCAiXG4jXG4jIFNJUCBleHRlbnNpb25zOlxuI1xuIik7CisgICAgLyogMTAwcmVsIGV4dGVuc2lvbiAqLworICAgIGlmIChjb25maWctPmNmZy5yZXF1aXJlXzEwMHJlbCkgeworCXBqX3N0cmNhdDIoJmNmZywgIi0tdXNlLTEwMHJlbFxuIik7CisgICAgfQorICAgIC8qIFNlc3Npb24gVGltZXIgZXh0ZW5zaW9uICovCisgICAgaWYgKGNvbmZpZy0+Y2ZnLnVzZV90aW1lcikgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS11c2UtdGltZXIgJWRcbiIsCisJCQkgICAgICBjb25maWctPmNmZy51c2VfdGltZXIpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorICAgIGlmIChjb25maWctPmNmZy50aW1lcl9zZXR0aW5nLm1pbl9zZSAhPSA5MCkgeworCXBqX2Fuc2lfc3ByaW50ZihsaW5lLCAiLS10aW1lci1taW4tc2UgJWRcbiIsCisJCQkgICAgICBjb25maWctPmNmZy50aW1lcl9zZXR0aW5nLm1pbl9zZSk7CisJcGpfc3RyY2F0MigmY2ZnLCBsaW5lKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y2ZnLnRpbWVyX3NldHRpbmcuc2Vzc19leHBpcmVzICE9IFBKU0lQX1NFU1NfVElNRVJfREVGX1NFKSB7CisJcGpfYW5zaV9zcHJpbnRmKGxpbmUsICItLXRpbWVyLXNlICVkXG4iLAorCQkJICAgICAgY29uZmlnLT5jZmcudGltZXJfc2V0dGluZy5zZXNzX2V4cGlyZXMpOworCXBqX3N0cmNhdDIoJmNmZywgbGluZSk7CisgICAgfQorCisgICAgKihjZmcucHRyICsgY2ZnLnNsZW4pID0gJ1wwJzsKKyAgICByZXR1cm4gKGludCljZmcuc2xlbjsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3Bqc3VhX2FwcF9jb25maWcuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3Bqc3VhX2FwcF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY3NTdmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvcGpzdWFfYXBwX2NvbmZpZy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qICRJZDogcGpzdWFfYXBwX2NvbmZpZy5oIDQ0OTIgMjAxMy0wNC0yMyAxMDo1OTo1MlogbmFuYW5nICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19QSlNVQV9BUFBfQ09ORklHX0hfXworI2RlZmluZSBfX1BKU1VBX0FQUF9DT05GSUdfSF9fCisKKyNpbmNsdWRlIDxwamxpYi5oPgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHAgY29uZmlnLiBJdCdzIHVzZWQgYnkgcGpzdWEKKyAqICptb2JpbGUqIHZlcnNpb24gb25seS4gSWYgeW91J3JlIHBvcnRpbmcgcGpzdWEgdG8gbmV3IG1vYmlsZQorICogcGxhdGZvcm0sIHlvdSBzaG91bGQgb25seSBpbmNsdWRlIHRoaXMgZmlsZSBvbmNlIGluIG9uZSBvZgorICogeW91ciBzb3VyY2UgZmlsZS4KKyAqLworY29uc3QgY2hhciAqcGpzdWFfYXBwX2RlZl9hcmd2W10gPSB7ICJwanN1YSIsCisJCQkJICAgICAiLS11c2UtY2xpIiwKKwkJCQkgICAgICItLW5vLWNsaS1jb25zb2xlIiwKKyNpZiBkZWZpbmVkKFBKX1NZTUJJQU4pICYmIFBKX1NZTUJJQU4KKwkJCQkgICAgIC8qIENhbid0IHJldXNlIGFkZHJlc3Mgb24gRTUyICovCisJCQkJICAgICAiLS1jbGktdGVsbmV0LXBvcnQ9MCIsCisjZWxzZQorCQkJCSAgICAgIi0tY2xpLXRlbG5ldC1wb3J0PTIzMjMiLAorI2VuZGlmCisJCQkJICAgICAiLS1xdWFsaXR5PTQiLAorI2lmIGRlZmluZWQoUEpfQ09ORklHX0JCMTApICYmIFBKX0NPTkZJR19CQjEwCisJCQkgICAgICAgICAgICAgIi0tYWRkLWJ1ZGR5PXNpcDoxNjkuMjU0LjAuMiIsCisjZW5kaWYKKwkJCSAgICAgICAgICAgICBOVUxMIH07CisKKyNkZWZpbmUgcGpzdWFfYXBwX2RlZl9hcmdjIChQSl9BUlJBWV9TSVpFKHBqc3VhX2FwcF9kZWZfYXJndiktMSkKKworCisjZW5kaWYJLyogX19QSlNVQV9BUFBfQ09ORklHX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfbGVnYWN5LmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9wanN1YV9hcHBfbGVnYWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3ZTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3Bqc3VhX2FwcF9sZWdhY3kuYwpAQCAtMCwwICsxLDE5MzMgQEAKKy8qICRJZDogcGpzdWFfYXBwX2xlZ2FjeS5jIDQ3MTAgMjAxNC0wMS0yMiAxMDo1MTo0OVogYmVubnlscCAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaW5jbHVkZSA8cGpzdWEtbGliL3Bqc3VhLmg+CisjaW5jbHVkZSAicGpzdWFfYXBwX2NvbW1vbi5oIgorCisjZGVmaW5lIFRISVNfRklMRQkicGpzdWFfYXBwX2xlZ2FjeS5jIgorCitzdGF0aWMgcGpfYm9vbF90CWNtZF9lY2hvOworCisvKgorICogUHJpbnQgYnVkZHkgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnVkZHlfbGlzdCgpCit7CisgICAgcGpzdWFfYnVkZHlfaWQgaWRzWzY0XTsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjb3VudCA9IFBKX0FSUkFZX1NJWkUoaWRzKTsKKworICAgIHB1dHMoIkJ1ZGR5IGxpc3Q6Iik7CisKKyAgICBwanN1YV9lbnVtX2J1ZGRpZXMoaWRzLCAmY291bnQpOworCisgICAgaWYgKGNvdW50ID09IDApCisJcHV0cygiIC1ub25lLSIpOworICAgIGVsc2UgeworCWZvciAoaT0wOyBpPChpbnQpY291bnQ7ICsraSkgeworCSAgICBwanN1YV9idWRkeV9pbmZvIGluZm87CisKKwkgICAgaWYgKHBqc3VhX2J1ZGR5X2dldF9pbmZvKGlkc1tpXSwgJmluZm8pICE9IFBKX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJICAgIHByaW50ZigiIFslMmRdIDwlLipzPiAgJS4qc1xuIiwgCisJCSAgICBpZHNbaV0rMSwgCisJCSAgICAoaW50KWluZm8uc3RhdHVzX3RleHQuc2xlbiwKKwkJICAgIGluZm8uc3RhdHVzX3RleHQucHRyLCAKKwkJICAgIChpbnQpaW5mby51cmkuc2xlbiwKKwkJICAgIGluZm8udXJpLnB0cik7CisJfQorICAgIH0KKyAgICBwdXRzKCIiKTsKK30KKworLyoKKyAqIElucHV0IFVSTC4KKyAqLworc3RhdGljIHZvaWQgdWlfaW5wdXRfdXJsKGNvbnN0IGNoYXIgKnRpdGxlLCBjaGFyICpidWYsIHBqX3NpemVfdCBsZW4sIAorCQkJIGlucHV0X3Jlc3VsdCAqcmVzdWx0KQoreworICAgIHJlc3VsdC0+bmJfcmVzdWx0ID0gUEpTVUFfQVBQX05PX05COworICAgIHJlc3VsdC0+dXJpX3Jlc3VsdCA9IE5VTEw7CisKKyAgICBwcmludF9idWRkeV9saXN0KCk7CisKKyAgICBwcmludGYoIkNob2ljZXM6XG4iCisJICAgIiAgIDAgICAgICAgICBGb3IgY3VycmVudCBkaWFsb2cuXG4iCisJICAgIiAgLTEgICAgICAgICBBbGwgJWQgYnVkZGllcyBpbiBidWRkeSBsaXN0XG4iCisJICAgIiAgWzEgLSUyZF0gICAgU2VsZWN0IGZyb20gYnVkZHkgbGlzdFxuIgorCSAgICIgIFVSTCAgICAgICAgQW4gVVJMXG4iCisJICAgIiAgPEVudGVyPiAgICBFbXB0eSBpbnB1dCAob3IgJ3EnKSB0byBjYW5jZWxcbiIKKwkgICAsIHBqc3VhX2dldF9idWRkeV9jb3VudCgpLCBwanN1YV9nZXRfYnVkZHlfY291bnQoKSk7CisgICAgcHJpbnRmKCIlczogIiwgdGl0bGUpOworCisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKGZnZXRzKGJ1ZiwgKGludClsZW4sIHN0ZGluKSA9PSBOVUxMKQorCXJldHVybjsKKyAgICBsZW4gPSBzdHJsZW4oYnVmKTsKKworICAgIC8qIExlZnQgdHJpbSAqLworICAgIHdoaWxlIChwal9pc3NwYWNlKCpidWYpKSB7CisJKytidWY7CisJLS1sZW47CisgICAgfQorCisgICAgLyogUmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmVzICovCisgICAgd2hpbGUgKGxlbiAmJiAoYnVmW2xlbi0xXSA9PSAnXHInIHx8IGJ1ZltsZW4tMV0gPT0gJ1xuJykpCisJYnVmWy0tbGVuXSA9ICdcMCc7CisKKyAgICBpZiAobGVuID09IDAgfHwgYnVmWzBdPT0ncScpCisJcmV0dXJuOworCisgICAgaWYgKHBqX2lzZGlnaXQoKmJ1ZikgfHwgKmJ1Zj09Jy0nKSB7CisJCisJdW5zaWduZWQgaTsKKwkKKwlpZiAoKmJ1Zj09Jy0nKQorCSAgICBpID0gMTsKKwllbHNlCisJICAgIGkgPSAwOworCisJZm9yICg7IGk8bGVuOyArK2kpIHsKKwkgICAgaWYgKCFwal9pc2RpZ2l0KGJ1ZltpXSkpIHsKKwkJcHV0cygiSW52YWxpZCBpbnB1dCIpOworCQlyZXR1cm47CisJICAgIH0KKwl9CisKKwlyZXN1bHQtPm5iX3Jlc3VsdCA9IG15X2F0b2koYnVmKTsKKworCWlmIChyZXN1bHQtPm5iX3Jlc3VsdCA+PSAwICYmIAorCSAgICByZXN1bHQtPm5iX3Jlc3VsdCA8PSAoaW50KXBqc3VhX2dldF9idWRkeV9jb3VudCgpKSAKKwl7CisJICAgIHJldHVybjsKKwl9CisJaWYgKHJlc3VsdC0+bmJfcmVzdWx0ID09IC0xKQorCSAgICByZXR1cm47CisKKwlwdXRzKCJJbnZhbGlkIGlucHV0Iik7CisJcmVzdWx0LT5uYl9yZXN1bHQgPSBQSlNVQV9BUFBfTk9fTkI7CisJcmV0dXJuOworCisgICAgfSBlbHNlIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlpZiAoKHN0YXR1cz1wanN1YV92ZXJpZnlfdXJsKGJ1ZikpICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpzdWFfcGVycm9yKFRISVNfRklMRSwgIkludmFsaWQgVVJMIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuOworCX0KKworCXJlc3VsdC0+dXJpX3Jlc3VsdCA9IGJ1ZjsKKyAgICB9Cit9CisKK3N0YXRpYyBwal9ib29sX3Qgc2ltcGxlX2lucHV0KGNvbnN0IGNoYXIgKnRpdGxlLCBjaGFyICpidWYsIHBqX3NpemVfdCBsZW4pCit7CisgICAgY2hhciAqcDsKKworICAgIHByaW50ZigiJXMgKGVtcHR5IHRvIGNhbmNlbCk6ICIsIHRpdGxlKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKGZnZXRzKGJ1ZiwgKGludClsZW4sIHN0ZGluKSA9PSBOVUxMKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIC8qIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lcy4gKi8KKyAgICBmb3IgKHA9YnVmOyA7ICsrcCkgeworCWlmICgqcD09J1xyJyB8fCAqcD09J1xuJykgKnA9J1wwJzsKKwllbHNlIGlmICghKnApIGJyZWFrOworICAgIH0KKworICAgIGlmICghKmJ1ZikKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKy8qCisgKiBQcmludCBhY2NvdW50IHN0YXR1cy4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYWNjX3N0YXR1cyhpbnQgYWNjX2lkKQoreworICAgIGNoYXIgYnVmWzgwXTsKKyAgICBwanN1YV9hY2NfaW5mbyBpbmZvOworCisgICAgcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZCwgJmluZm8pOworCisgICAgaWYgKCFpbmZvLmhhc19yZWdpc3RyYXRpb24pIHsKKwlwal9hbnNpX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLipzIiwgCisJCQkgKGludClpbmZvLnN0YXR1c190ZXh0LnNsZW4sCisJCQkgaW5mby5zdGF0dXNfdGV4dC5wdHIpOworCisgICAgfSBlbHNlIHsKKwlwal9hbnNpX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkgIiVkLyUuKnMgKGV4cGlyZXM9JWQpIiwKKwkJCSBpbmZvLnN0YXR1cywKKwkJCSAoaW50KWluZm8uc3RhdHVzX3RleHQuc2xlbiwKKwkJCSBpbmZvLnN0YXR1c190ZXh0LnB0ciwKKwkJCSBpbmZvLmV4cGlyZXMpOworCisgICAgfQorCisgICAgcHJpbnRmKCIgJWNbJTJkXSAlLipzOiAlc1xuIiwgKGFjY19pZD09Y3VycmVudF9hY2M/JyonOicgJyksCisJICAgYWNjX2lkLCAgKGludClpbmZvLmFjY191cmkuc2xlbiwgaW5mby5hY2NfdXJpLnB0ciwgYnVmKTsKKyAgICBwcmludGYoIiAgICAgICBPbmxpbmUgc3RhdHVzOiAlLipzXG4iLCAKKwkoaW50KWluZm8ub25saW5lX3N0YXR1c190ZXh0LnNsZW4sCisJaW5mby5vbmxpbmVfc3RhdHVzX3RleHQucHRyKTsKK30KKworLyoKKyAqIFNob3cgYSBiaXQgb2YgaGVscC4KKyAqLworc3RhdGljIHZvaWQga2V5c3Ryb2tlX2hlbHAoKQoreworICAgIHBqc3VhX2FjY19pZCBhY2NfaWRzWzE2XTsKKyAgICB1bnNpZ25lZCBjb3VudCA9IFBKX0FSUkFZX1NJWkUoYWNjX2lkcyk7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIj4+Pj5cbiIpOworCisgICAgcGpzdWFfZW51bV9hY2NzKGFjY19pZHMsICZjb3VudCk7CisKKyAgICBwcmludGYoIkFjY291bnQgbGlzdDpcbiIpOworICAgIGZvciAoaT0wOyBpPChpbnQpY291bnQ7ICsraSkKKwlwcmludF9hY2Nfc3RhdHVzKGFjY19pZHNbaV0pOworCisgICAgcHJpbnRfYnVkZHlfbGlzdCgpOworICAgIAorICAgIC8vcHV0cygiQ29tbWFuZHM6Iik7CisgICAgcHV0cygiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KyIpOworICAgIHB1dHMoInwgICAgICAgQ2FsbCBDb21tYW5kczogICAgICAgICB8ICAgQnVkZHksIElNICYgUHJlc2VuY2U6ICB8ICAgICBBY2NvdW50OiAgICAgIHwiKTsKKyAgICBwdXRzKCJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCAgbSAgTWFrZSBuZXcgY2FsbCAgICAgICAgICAgIHwgK2IgIEFkZCBuZXcgYnVkZHkgICAgICAgLnwgK2EgIEFkZCBuZXcgYWNjbnQgfCIpOworICAgIHB1dHMoInwgIE0gIE1ha2UgbXVsdGlwbGUgY2FsbHMgICAgICB8IC1iICBEZWxldGUgYnVkZHkgICAgICAgICB8IC1hICBEZWxldGUgYWNjbnQuIHwiKTsKKyAgICBwdXRzKCJ8ICBhICBBbnN3ZXIgY2FsbCAgICAgICAgICAgICAgfCAgaSAgU2VuZCBJTSAgICAgICAgICAgICAgfCAhYSAgTW9kaWZ5IGFjY250LiB8Iik7CisgICAgcHV0cygifCAgaCAgSGFuZ3VwIGNhbGwgIChoYT1hbGwpICAgIHwgIHMgIFN1YnNjcmliZSBwcmVzZW5jZSAgIHwgcnIgIChSZS0pcmVnaXN0ZXIgfCIpOworICAgIHB1dHMoInwgIEggIEhvbGQgY2FsbCAgICAgICAgICAgICAgICB8ICB1ICBVbnN1YnNjcmliZSBwcmVzZW5jZSB8IHJ1ICBVbnJlZ2lzdGVyICAgIHwiKTsKKyAgICBwdXRzKCJ8ICB2ICByZS1pblZpdGUgKHJlbGVhc2UgaG9sZCkgfCAgdCAgVG9HZ2xlIE9ubGluZSBzdGF0dXMgfCAgPiAgQ3ljbGUgbmV4dCBhYy58Iik7CisgICAgcHV0cygifCAgVSAgc2VuZCBVUERBVEUgICAgICAgICAgICAgIHwgIFQgIFNldCBvbmxpbmUgc3RhdHVzICAgIHwgIDwgIEN5Y2xlIHByZXYgYWMufCIpOworICAgIHB1dHMoInwgXSxbIFNlbGVjdCBuZXh0L3ByZXYgY2FsbCAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsiKTsKKyAgICBwdXRzKCJ8ICB4ICBYZmVyIGNhbGwgICAgICAgICAgICAgICAgfCAgICAgIE1lZGlhIENvbW1hbmRzOiAgICAgfCAgU3RhdHVzICYgQ29uZmlnOiB8Iik7CisgICAgcHV0cygifCAgWCAgWGZlciB3aXRoIFJlcGxhY2VzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgICMgIFNlbmQgUkZDIDI4MzMgRFRNRiAgICAgICB8IGNsICBMaXN0IHBvcnRzICAgICAgICAgICB8ICBkICBEdW1wIHN0YXR1cyAgIHwiKTsKKyAgICBwdXRzKCJ8ICAqICBTZW5kIERUTUYgd2l0aCBJTkZPICAgICAgfCBjYyAgQ29ubmVjdCBwb3J0ICAgICAgICAgfCBkZCAgRHVtcCBkZXRhaWxlZCB8Iik7CisgICAgcHV0cygifCBkcSAgRHVtcCBjdXJyLiBjYWxsIHF1YWxpdHkgIHwgY2QgIERpc2Nvbm5lY3QgcG9ydCAgICAgIHwgZGMgIER1bXAgY29uZmlnICAgfCIpOworICAgIHB1dHMoInwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBWICBBZGp1c3QgYXVkaW8gVm9sdW1lICB8ICBmICBTYXZlIGNvbmZpZyAgIHwiKTsKKyAgICBwdXRzKCJ8ICBTICBTZW5kIGFyYml0cmFyeSBSRVFVRVNUICAgfCBDcCAgQ29kZWMgcHJpb3JpdGllcyAgICAgfCAgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOworI2lmIFBKU1VBX0hBU19WSURFTworICAgIHB1dHMoInwgVmlkZW86IFwidmlkIGhlbHBcIiBmb3IgbW9yZSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiKTsKKyNlbmRpZgorICAgIHB1dHMoInwgIHEgIFFVSVQgICBMICBSZUxvYWQgICBzbGVlcCBNUyAgIGVjaG8gWzB8MXx0eHRdICAgICBuOiBkZXRlY3QgTkFUIHR5cGUgICAgIHwiKTsKKyAgICBwdXRzKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rIik7CisKKyAgICBpID0gcGpzdWFfY2FsbF9nZXRfY291bnQoKTsKKyAgICBwcmludGYoIllvdSBoYXZlICVkIGFjdGl2ZSBjYWxsJXNcbiIsIGksIChpPjE/InMiOiIiKSk7CisKKyAgICBpZiAoY3VycmVudF9jYWxsICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwlwanN1YV9jYWxsX2luZm8gY2k7CisJaWYgKHBqc3VhX2NhbGxfZ2V0X2luZm8oY3VycmVudF9jYWxsLCAmY2kpPT1QSl9TVUNDRVNTKQorCSAgICBwcmludGYoIkN1cnJlbnQgY2FsbCBpZD0lZCB0byAlLipzIFslLipzXVxuIiwgY3VycmVudF9jYWxsLAorCQkgICAoaW50KWNpLnJlbW90ZV9pbmZvLnNsZW4sIGNpLnJlbW90ZV9pbmZvLnB0ciwKKwkJICAgKGludCljaS5zdGF0ZV90ZXh0LnNsZW4sIGNpLnN0YXRlX3RleHQucHRyKTsKKyAgICB9Cit9CisKKy8qIEhlbHAgc2NyZWVuIGZvciB2aWRlbyAqLworI2lmIFBKU1VBX0hBU19WSURFTworc3RhdGljIHZvaWQgdmlkX3Nob3dfaGVscCgpCit7CisgICAgcGpfYm9vbF90IHZpZF9lbmFibGVkID0gKGFwcF9jb25maWcudmlkLnZpZF9jbnQgPiAwKTsKKworICAgIHB1dHMoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsiKTsKKyAgICBwdXRzKCJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGNvbW1hbmRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIGhlbHAgICAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBzY3JlZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBlbmFibGV8ZGlzYWJsZSAgICAgICAgRW5hYmxlIG9yIGRpc2FibGUgdmlkZW8gaW4gbmV4dCBvZmZlci9hbnN3ZXIgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgYWNjIHNob3cgICAgICAgICAgICAgIFNob3cgY3VycmVudCBhY2NvdW50IHZpZGVvIHNldHRpbmdzICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIGFjYyBhdXRvcnggb258b2ZmICAgICBBdXRvbWF0aWNhbGx5IHNob3cgaW5jb21pbmcgdmlkZW8gb24vb2ZmICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBhY2MgYXV0b3R4IG9ufG9mZiAgICAgQXV0b21hdGljYWxseSBvZmZlciB2aWRlbyBvbi9vZmYgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgYWNjIGNhcCBJRCAgICAgICAgICAgIFNldCBkZWZhdWx0IGNhcHR1cmUgZGV2aWNlIGZvciBjdXJyZW50IGFjYyAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIGFjYyByZW5kIElEICAgICAgICAgICBTZXQgZGVmYXVsdCByZW5kZXJlciBkZXZpY2UgZm9yIGN1cnJlbnQgYWNjICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBjYWxsIHJ4IG9ufG9mZiBOICAgICAgRW5hYmxlL2Rpc2FibGUgdmlkZW8gUlggZm9yIHN0cmVhbSBOIGluIGN1cnIgY2FsbCB8Iik7CisgICAgcHV0cygifCB2aWQgY2FsbCB0eCBvbnxvZmYgTiAgICAgIEVuYWJsZS9kaXNhYmxlIHZpZGVvIFRYIGZvciBzdHJlYW0gTiBpbiBjdXJyIGNhbGwgfCIpOworICAgIHB1dHMoInwgdmlkIGNhbGwgYWRkICAgICAgICAgICAgICBBZGQgdmlkZW8gc3RyZWFtIGZvciBjdXJyZW50IGNhbGwgICAgICAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBjYWxsIGVuYWJsZXxkaXNhYmxlIE4gRW5hYmxlL2Rpc2FibGUgc3RyZWFtICNOIGluIGN1cnJlbnQgY2FsbCAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgY2FsbCBjYXAgTiBJRCAgICAgICAgIFNldCBjYXB0dXJlIGRldiBJRCBmb3Igc3RyZWFtICNOIGluIGN1cnJlbnQgY2FsbCAgfCIpOworICAgIHB1dHMoInwgdmlkIGRldiBsaXN0ICAgICAgICAgICAgICBMaXN0IGFsbCB2aWRlbyBkZXZpY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBkZXYgcmVmcmVzaCAgICAgICAgICAgUmVmcmVzaCB2aWRlbyBkZXZpY2UgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgZGV2IHByZXYgb258b2ZmIElEICAgIEVuYWJsZS9kaXNhYmxlIHByZXZpZXcgZm9yIHNwZWNpZmllZCBkZXZpY2UgSUQgICAgfCIpOworICAgIHB1dHMoInwgdmlkIGNvZGVjIGxpc3QgICAgICAgICAgICBMaXN0IHZpZGVvIGNvZGVjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBjb2RlYyBwcmlvIElEIFBSSU8gICAgU2V0IGNvZGVjIElEIHByaW9yaXR5IHRvIFBSSU8gICAgICAgICAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgY29kZWMgZnBzIElEIE5VTSBERU4gIFNldCBjb2RlYyBJRCBmcmFtZXJhdGUgdG8gKE5VTS9ERU4pIGZwcyAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIGNvZGVjIGJ3IElEIEFWRyBNQVggICBTZXQgY29kZWMgSUQgYml0cmF0ZSB0byBBVkcgJiBNQVgga2JwcyAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCBjb2RlYyBzaXplIElEIFcgSCAgICAgU2V0IGNvZGVjIElEIHNpemUvcmVzb2x1dGlvbiB0byBXIHggSCAgICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgd2luIGxpc3QgICAgICAgICAgICAgIExpc3QgYWxsIGFjdGl2ZSB2aWRlbyB3aW5kb3dzICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIHdpbiBhcnJhbmdlICAgICAgICAgICBBdXRvIGFycmFuZ2Ugd2luZG93cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiKTsKKyAgICBwdXRzKCJ8IHZpZCB3aW4gc2hvd3xoaWRlIElEICAgICAgU2hvdy9oaWRlIHRoZSBzcGVjaWZpZWQgdmlkZW8gd2luZG93IElEICAgICAgICAgICB8Iik7CisgICAgcHV0cygifCB2aWQgd2luIG1vdmUgSUQgWCBZICAgICAgIE1vdmUgd2luZG93IElEIHRvIHBvc2l0aW9uIFgsWSAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgdmlkIHdpbiByZXNpemUgSUQgdyBoICAgICBSZXNpemUgd2luZG93IElEIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCAgIHwiKTsKKyAgICBwdXRzKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rIik7CisgICAgcHJpbnRmKCJ8IFZpZGVvIHdpbGwgYmUgJXMgaW4gdGhlIG5leHQgb2ZmZXIvYW5zd2VyICVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIsCisJICAgKHZpZF9lbmFibGVkPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwgKHZpZF9lbmFibGVkPyAiICIgOiAiIikpOworICAgIHB1dHMoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsiKTsKK30KKworc3RhdGljIHZvaWQgdmlkX2hhbmRsZV9tZW51KGNoYXIgKm1lbnVpbikKK3sKKyAgICBjaGFyICphcmd2WzhdOworICAgIGludCBhcmdjID0gMDsKKworICAgIC8qIFRva2VuaXplICovCisgICAgYXJndlthcmdjXSA9IHN0cnRvayhtZW51aW4sICIgXHRcclxuIik7CisgICAgd2hpbGUgKGFyZ3ZbYXJnY10gJiYgKmFyZ3ZbYXJnY10pIHsKKwlhcmdjKys7CisJYXJndlthcmdjXSA9IHN0cnRvayhOVUxMLCAiIFx0XHJcbiIpOworICAgIH0KKworICAgIGlmIChhcmdjID09IDEgfHwgc3RyY21wKGFyZ3ZbMV0sICJoZWxwIik9PTApIHsKKwl2aWRfc2hvd19oZWxwKCk7CisgICAgfSBlbHNlIGlmIChhcmdjID09IDIgJiYgKHN0cmNtcChhcmd2WzFdLCAiZW5hYmxlIik9PTAgfHwKKwkJCSAgICAgc3RyY21wKGFyZ3ZbMV0sICJkaXNhYmxlIik9PTApKQorICAgIHsKKwlwal9ib29sX3QgZW5hYmxlZCA9IChzdHJjbXAoYXJndlsxXSwgImVuYWJsZSIpPT0wKTsKKwlhcHBfY29uZmlnLnZpZC52aWRfY250ID0gKGVuYWJsZWQgPyAxIDogMCk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIlZpZGVvIHdpbGwgYmUgJXMgaW4gbmV4dCBvZmZlci9hbnN3ZXIiLAorCQkgIChlbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKSkpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJhY2MiKT09MCkgeworCXBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKwlwal9ib29sX3QgY2hhbmdlZCA9IFBKX0ZBTFNFOworCXBqX3Bvb2xfdCAqdG1wX3Bvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgidG1wLXBqc3VhIiwgMTAwMCwgMTAwMCk7CisKKwlwanN1YV9hY2NfZ2V0X2NvbmZpZyhjdXJyZW50X2FjYywgdG1wX3Bvb2wsICZhY2NfY2ZnKTsKKworCWlmIChhcmdjID09IDMgJiYgc3RyY21wKGFyZ3ZbMl0sICJzaG93Iik9PTApIHsKKwkgICAgYXBwX2NvbmZpZ19zaG93X3ZpZGVvKGN1cnJlbnRfYWNjLCAmYWNjX2NmZyk7CisJfSBlbHNlIGlmIChhcmdjID09IDQgJiYgc3RyY21wKGFyZ3ZbMl0sICJhdXRvcngiKT09MCkgeworCSAgICBpbnQgb24gPSAoc3RyY21wKGFyZ3ZbM10sICJvbiIpPT0wKTsKKwkgICAgYWNjX2NmZy52aWRfaW5fYXV0b19zaG93ID0gb247CisJICAgIGNoYW5nZWQgPSBQSl9UUlVFOworCX0gZWxzZSBpZiAoYXJnYyA9PSA0ICYmIHN0cmNtcChhcmd2WzJdLCAiYXV0b3R4Iik9PTApIHsKKwkgICAgaW50IG9uID0gKHN0cmNtcChhcmd2WzNdLCAib24iKT09MCk7CisJICAgIGFjY19jZmcudmlkX291dF9hdXRvX3RyYW5zbWl0ID0gb247CisJICAgIGNoYW5nZWQgPSBQSl9UUlVFOworCX0gZWxzZSBpZiAoYXJnYyA9PSA0ICYmIHN0cmNtcChhcmd2WzJdLCAiY2FwIik9PTApIHsKKwkgICAgaW50IGRldiA9IGF0b2koYXJndlszXSk7CisJICAgIGFjY19jZmcudmlkX2NhcF9kZXYgPSBkZXY7CisJICAgIGNoYW5nZWQgPSBQSl9UUlVFOworCX0gZWxzZSBpZiAoYXJnYyA9PSA0ICYmIHN0cmNtcChhcmd2WzJdLCAicmVuZCIpPT0wKSB7CisJICAgIGludCBkZXYgPSBhdG9pKGFyZ3ZbM10pOworCSAgICBhY2NfY2ZnLnZpZF9yZW5kX2RldiA9IGRldjsKKwkgICAgY2hhbmdlZCA9IFBKX1RSVUU7CisJfSBlbHNlIHsKKwkgICAgcGpfcG9vbF9yZWxlYXNlKHRtcF9wb29sKTsKKwkgICAgZ290byBvbl9lcnJvcjsKKwl9CisKKwlpZiAoY2hhbmdlZCkgeworCSAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBwanN1YV9hY2NfbW9kaWZ5KGN1cnJlbnRfYWNjLCAmYWNjX2NmZyk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiRXJyb3IgbW9kaWZ5aW5nIGFjY291bnQgJWQiLAorCQkJICAgICBjdXJyZW50X2FjYykpOworCX0KKwlwal9wb29sX3JlbGVhc2UodG1wX3Bvb2wpOworCisgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNhbGwiKT09MCkgeworCXBqc3VhX2NhbGxfdmlkX3N0cm1fb3BfcGFyYW0gcGFyYW07CisJcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworCXBqc3VhX2NhbGxfdmlkX3N0cm1fb3BfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworCisJaWYgKGFyZ2MgPT0gNSAmJiBzdHJjbXAoYXJndlsyXSwgInJ4Iik9PTApIHsKKwkgICAgcGpzdWFfc3RyZWFtX2luZm8gc2k7CisJICAgIHBqX2Jvb2xfdCBvbiA9IChzdHJjbXAoYXJndlszXSwgIm9uIikgPT0gMCk7CisKKwkgICAgcGFyYW0ubWVkX2lkeCA9IGF0b2koYXJndls0XSk7CisJICAgIGlmIChwanN1YV9jYWxsX2dldF9zdHJlYW1faW5mbyhjdXJyZW50X2NhbGwsIHBhcmFtLm1lZF9pZHgsICZzaSkgfHwKKwkJc2kudHlwZSAhPSBQSk1FRElBX1RZUEVfVklERU8pCisJICAgIHsKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgUEpfRUlOVkFMLCAiSW52YWxpZCBzdHJlYW0iKSk7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIGlmIChvbikgcGFyYW0uZGlyID0gKHNpLmluZm8udmlkLmRpciB8IFBKTUVESUFfRElSX0RFQ09ESU5HKTsKKwkgICAgZWxzZSBwYXJhbS5kaXIgPSAoc2kuaW5mby52aWQuZGlyICYgUEpNRURJQV9ESVJfRU5DT0RJTkcpOworCisJICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2V0X3ZpZF9zdHJtKGN1cnJlbnRfY2FsbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfRElSLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0pOworCX0KKwllbHNlIGlmIChhcmdjID09IDUgJiYgc3RyY21wKGFyZ3ZbMl0sICJ0eCIpPT0wKSB7CisJICAgIHBqX2Jvb2xfdCBvbiA9IChzdHJjbXAoYXJndlszXSwgIm9uIikgPT0gMCk7CisJICAgIHBqc3VhX2NhbGxfdmlkX3N0cm1fb3Agb3AgPSBvbj8gUEpTVUFfQ0FMTF9WSURfU1RSTV9TVEFSVF9UUkFOU01JVCA6CisJCQkJCSAgICBQSlNVQV9DQUxMX1ZJRF9TVFJNX1NUT1BfVFJBTlNNSVQ7CisKKwkgICAgcGFyYW0ubWVkX2lkeCA9IGF0b2koYXJndls0XSk7CisKKwkgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZXRfdmlkX3N0cm0oY3VycmVudF9jYWxsLCBvcCwgJnBhcmFtKTsKKwl9CisJZWxzZSBpZiAoYXJnYyA9PSAzICYmIHN0cmNtcChhcmd2WzJdLCAiYWRkIik9PTApIHsKKwkgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZXRfdmlkX3N0cm0oY3VycmVudF9jYWxsLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSlNVQV9DQUxMX1ZJRF9TVFJNX0FERCwgTlVMTCk7CisJfQorCWVsc2UgaWYgKGFyZ2MgPj0gMyAmJiAKKwkJIChzdHJjbXAoYXJndlsyXSwgImRpc2FibGUiKT09MCB8fCBzdHJjbXAoYXJndlsyXSwgImVuYWJsZSIpPT0wKSkKKwl7CisJICAgIHBqX2Jvb2xfdCBlbmFibGUgPSAoc3RyY21wKGFyZ3ZbMl0sICJlbmFibGUiKSA9PSAwKTsKKwkgICAgcGpzdWFfY2FsbF92aWRfc3RybV9vcCBvcCA9IGVuYWJsZT8gUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfRElSIDoKKwkJCQkJCVBKU1VBX0NBTExfVklEX1NUUk1fUkVNT1ZFOworCisJICAgIHBhcmFtLm1lZF9pZHggPSBhcmdjID49IDQ/IGF0b2koYXJndlszXSkgOiAtMTsKKwkgICAgcGFyYW0uZGlyID0gUEpNRURJQV9ESVJfRU5DT0RJTkdfREVDT0RJTkc7CisJICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2V0X3ZpZF9zdHJtKGN1cnJlbnRfY2FsbCwgb3AsICZwYXJhbSk7CisJfQorCWVsc2UgaWYgKGFyZ2MgPj0gMyAmJiBzdHJjbXAoYXJndlsyXSwgImNhcCIpPT0wKSB7CisJICAgIHBhcmFtLm1lZF9pZHggPSBhcmdjID49IDQ/IGF0b2koYXJndlszXSkgOiAtMTsKKwkgICAgcGFyYW0uY2FwX2RldiA9IGFyZ2MgPj0gNT8gYXRvaShhcmd2WzRdKSA6IFBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVY7CisJICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2V0X3ZpZF9zdHJtKGN1cnJlbnRfY2FsbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfQ0FQX0RFViwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtKTsKKwl9IGVsc2UKKwkgICAgZ290byBvbl9lcnJvcjsKKworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJFcnJvciBtb2RpZnlpbmcgdmlkZW8gc3RyZWFtIikpOworCX0KKworICAgIH0gZWxzZSBpZiAoYXJnYyA+PSAzICYmIHN0cmNtcChhcmd2WzFdLCAiZGV2Iik9PTApIHsKKwlpZiAoc3RyY21wKGFyZ3ZbMl0sICJsaXN0Iik9PTApIHsKKwkgICAgdmlkX2xpc3RfZGV2cygpOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJyZWZyZXNoIik9PTApIHsKKwkgICAgcGptZWRpYV92aWRfZGV2X3JlZnJlc2goKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAicHJldiIpPT0wKSB7CisJICAgIGlmIChhcmdjICE9IDUpIHsKKwkJZ290byBvbl9lcnJvcjsKKwkgICAgfSBlbHNlIHsKKwkJcGpfYm9vbF90IG9uID0gKHN0cmNtcChhcmd2WzNdLCAib24iKSA9PSAwKTsKKwkJaW50IGRldl9pZCA9IGF0b2koYXJndls0XSk7CisJCWlmIChvbikgeworICAgICAgICAgICAgICAgICAgICBwanN1YV92aWRfcHJldmlld19wYXJhbSBwYXJhbTsKKworICAgICAgICAgICAgICAgICAgICBwanN1YV92aWRfcHJldmlld19wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnduZF9mbGFncyA9IFBKTUVESUFfVklEX0RFVl9XTkRfQk9SREVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9WSURfREVWX1dORF9SRVNJWkFCTEU7CisJCSAgICBwanN1YV92aWRfcHJldmlld19zdGFydChkZXZfaWQsICZwYXJhbSk7CisJCSAgICBhcnJhbmdlX3dpbmRvdyhwanN1YV92aWRfcHJldmlld19nZXRfd2luKGRldl9pZCkpOworCQl9IGVsc2UgeworCQkgICAgcGpzdWFfdmlkX3dpbl9pZCB3aWQ7CisJCSAgICB3aWQgPSBwanN1YV92aWRfcHJldmlld19nZXRfd2luKGRldl9pZCk7CisJCSAgICBpZiAod2lkICE9IFBKU1VBX0lOVkFMSURfSUQpIHsKKwkJCS8qIFByZXZpZXcgd2luZG93IGhpZGluZyBvbmNlIGl0IGlzIHN0b3BwZWQgaXMKKwkJCSAqIHJlc3BvbnNpYmlsaXR5IG9mIGFwcCAqLworCQkJcGpzdWFfdmlkX3dpbl9zZXRfc2hvdyh3aWQsIFBKX0ZBTFNFKTsKKwkJCXBqc3VhX3ZpZF9wcmV2aWV3X3N0b3AoZGV2X2lkKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlCisJICAgIGdvdG8gb25fZXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIndpbiIpPT0wKSB7CisJcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworCWlmIChhcmdjPT0zICYmIHN0cmNtcChhcmd2WzJdLCAibGlzdCIpPT0wKSB7CisJICAgIHBqc3VhX3ZpZF93aW5faWQgd2lkc1tQSlNVQV9NQVhfVklEX1dJTlNdOworCSAgICB1bnNpZ25lZCBpLCBjbnQgPSBQSl9BUlJBWV9TSVpFKHdpZHMpOworCisJICAgIHBqc3VhX3ZpZF9lbnVtX3dpbnMod2lkcywgJmNudCk7CisKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkZvdW5kICVkIHZpZGVvIHdpbmRvd3M6IiwgY250KSk7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJXSUQgc2hvdyAgICBwb3MgICAgICAgc2l6ZSIpKTsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IGNudDsgKytpKSB7CisJCXBqc3VhX3ZpZF93aW5faW5mbyB3aTsKKwkJcGpzdWFfdmlkX3dpbl9nZXRfaW5mbyh3aWRzW2ldLCAmd2kpOworCQlQSl9MT0coMywoVEhJU19GSUxFLCAiJTNkICAgJWMgICglZCwlZCkgICVkeCVkIiwKKwkJCSAgd2lkc1tpXSwgKHdpLnNob3c/J1knOidOJyksIHdpLnBvcy54LCB3aS5wb3MueSwKKwkJCSAgd2kuc2l6ZS53LCB3aS5zaXplLmgpKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoYXJnYz09NCAmJiAoc3RyY21wKGFyZ3ZbMl0sICJzaG93Iik9PTAgfHwKKwkJCSAgICAgICBzdHJjbXAoYXJndlsyXSwgImhpZGUiKT09MCkpCisJeworCSAgICBwal9ib29sX3Qgc2hvdyA9IChzdHJjbXAoYXJndlsyXSwgInNob3ciKT09MCk7CisJICAgIHBqc3VhX3ZpZF93aW5faWQgd2lkID0gYXRvaShhcmd2WzNdKTsKKwkgICAgc3RhdHVzID0gcGpzdWFfdmlkX3dpbl9zZXRfc2hvdyh3aWQsIHNob3cpOworCX0gZWxzZSBpZiAoYXJnYz09NiAmJiBzdHJjbXAoYXJndlsyXSwgIm1vdmUiKT09MCkgeworCSAgICBwanN1YV92aWRfd2luX2lkIHdpZCA9IGF0b2koYXJndlszXSk7CisJICAgIHBqbWVkaWFfY29vcmQgcG9zOworCisJICAgIHBvcy54ID0gYXRvaShhcmd2WzRdKTsKKwkgICAgcG9zLnkgPSBhdG9pKGFyZ3ZbNV0pOworCSAgICBzdGF0dXMgPSBwanN1YV92aWRfd2luX3NldF9wb3Mod2lkLCAmcG9zKTsKKwl9IGVsc2UgaWYgKGFyZ2M9PTYgJiYgc3RyY21wKGFyZ3ZbMl0sICJyZXNpemUiKT09MCkgeworCSAgICBwanN1YV92aWRfd2luX2lkIHdpZCA9IGF0b2koYXJndlszXSk7CisJICAgIHBqbWVkaWFfcmVjdF9zaXplIHNpemU7CisKKwkgICAgc2l6ZS53ID0gYXRvaShhcmd2WzRdKTsKKwkgICAgc2l6ZS5oID0gYXRvaShhcmd2WzVdKTsKKwkgICAgc3RhdHVzID0gcGpzdWFfdmlkX3dpbl9zZXRfc2l6ZSh3aWQsICZzaXplKTsKKwl9IGVsc2UgaWYgKGFyZ2M9PTMgJiYgc3RyY21wKGFyZ3ZbMl0sICJhcnJhbmdlIik9PTApIHsKKwkgICAgYXJyYW5nZV93aW5kb3coUEpTVUFfSU5WQUxJRF9JRCk7CisJfSBlbHNlCisJICAgIGdvdG8gb25fZXJyb3I7CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiV2luZG93IG9wZXJhdGlvbiBlcnJvciIpKTsKKwl9CisKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiY29kZWMiKT09MCkgeworCXBqc3VhX2NvZGVjX2luZm8gY2lbUEpNRURJQV9DT0RFQ19NR1JfTUFYX0NPREVDU107CisJdW5zaWduZWQgY291bnQgPSBQSl9BUlJBWV9TSVpFKGNpKTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlpZiAoYXJnYz09MyAmJiBzdHJjbXAoYXJndlsyXSwgImxpc3QiKT09MCkgeworCSAgICBzdGF0dXMgPSBwanN1YV92aWRfZW51bV9jb2RlY3MoY2ksICZjb3VudCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJFcnJvciBlbnVtZXJhdGluZyBjb2RlY3MiKSk7CisJICAgIH0gZWxzZSB7CisJCXVuc2lnbmVkIGk7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsICJGb3VuZCAlZCB2aWRlbyBjb2RlY3M6IiwgY291bnQpKTsKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgImNvZGVjIGlkICAgICAgcHJpbyAgZnBzICAgIGJ3KGticHMpICAgc2l6ZSIpKTsKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpKTsKKwkJZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCQkgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gY3A7CisJCSAgICBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9kZXRhaWwgKnZmZDsKKworCQkgICAgc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX2dldF9wYXJhbSgmY2lbaV0uY29kZWNfaWQsICZjcCk7CisJCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKworCQkgICAgdmZkID0gcGptZWRpYV9mb3JtYXRfZ2V0X3ZpZGVvX2Zvcm1hdF9kZXRhaWwoJmNwLmVuY19mbXQsCisJCQkJCQkJCSBQSl9UUlVFKTsKKwkJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIlLipzJS4qcyAlM2QgJTcuMmYgICU0ZC8lNGQgICVkeCVkIiwgCisJCQkgICAgICAoaW50KWNpW2ldLmNvZGVjX2lkLnNsZW4sIGNpW2ldLmNvZGVjX2lkLnB0ciwKKwkJCSAgICAgIDEzLShpbnQpY2lbaV0uY29kZWNfaWQuc2xlbiwgIiAgICAgICAgICAgICAgICAiLAorCQkJICAgICAgY2lbaV0ucHJpb3JpdHksCisJCQkgICAgICAodmZkLT5mcHMubnVtKjEuMC92ZmQtPmZwcy5kZW51bSksCisJCQkgICAgICB2ZmQtPmF2Z19icHMvMTAwMCwgdmZkLT5tYXhfYnBzLzEwMDAsCisJCQkgICAgICB2ZmQtPnNpemUudywgdmZkLT5zaXplLmgpKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChhcmdjPT01ICYmIHN0cmNtcChhcmd2WzJdLCAicHJpbyIpPT0wKSB7CisJICAgIHBqX3N0cl90IGNpZDsKKwkgICAgaW50IHByaW87CisJICAgIGNpZCA9IHBqX3N0cihhcmd2WzNdKTsKKwkgICAgcHJpbyA9IGF0b2koYXJndls0XSk7CisJICAgIHN0YXR1cyA9IHBqc3VhX3ZpZF9jb2RlY19zZXRfcHJpb3JpdHkoJmNpZCwgKHBqX3VpbnQ4X3QpcHJpbyk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiU2V0IGNvZGVjIHByaW9yaXR5IGVycm9yIikpOworCX0gZWxzZSBpZiAoYXJnYz09NiAmJiBzdHJjbXAoYXJndlsyXSwgImZwcyIpPT0wKSB7CisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOworCSAgICBwal9zdHJfdCBjaWQ7CisJICAgIGludCBNLCBOOworCSAgICBjaWQgPSBwal9zdHIoYXJndlszXSk7CisJICAgIE0gPSBhdG9pKGFyZ3ZbNF0pOworCSAgICBOID0gYXRvaShhcmd2WzVdKTsKKwkgICAgc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX2dldF9wYXJhbSgmY2lkLCAmY3ApOworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkJY3AuZW5jX2ZtdC5kZXQudmlkLmZwcy5udW0gPSBNOworCQljcC5lbmNfZm10LmRldC52aWQuZnBzLmRlbnVtID0gTjsKKwkJc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX3NldF9wYXJhbSgmY2lkLCAmY3ApOworCSAgICB9CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiU2V0IGNvZGVjIGZyYW1lcmF0ZSBlcnJvciIpKTsKKwl9IGVsc2UgaWYgKGFyZ2M9PTYgJiYgc3RyY21wKGFyZ3ZbMl0sICJidyIpPT0wKSB7CisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOworCSAgICBwal9zdHJfdCBjaWQ7CisJICAgIGludCBNLCBOOworCSAgICBjaWQgPSBwal9zdHIoYXJndlszXSk7CisJICAgIE0gPSBhdG9pKGFyZ3ZbNF0pOworCSAgICBOID0gYXRvaShhcmd2WzVdKTsKKwkgICAgc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX2dldF9wYXJhbSgmY2lkLCAmY3ApOworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkJY3AuZW5jX2ZtdC5kZXQudmlkLmF2Z19icHMgPSBNICogMTAwMDsKKwkJY3AuZW5jX2ZtdC5kZXQudmlkLm1heF9icHMgPSBOICogMTAwMDsKKwkJc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX3NldF9wYXJhbSgmY2lkLCAmY3ApOworCSAgICB9CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiU2V0IGNvZGVjIGJpdHJhdGUgZXJyb3IiKSk7CisJfSBlbHNlIGlmIChhcmdjPT02ICYmIHN0cmNtcChhcmd2WzJdLCAic2l6ZSIpPT0wKSB7CisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNwOworCSAgICBwal9zdHJfdCBjaWQ7CisJICAgIGludCBNLCBOOworCSAgICBjaWQgPSBwal9zdHIoYXJndlszXSk7CisJICAgIE0gPSBhdG9pKGFyZ3ZbNF0pOworCSAgICBOID0gYXRvaShhcmd2WzVdKTsKKwkgICAgc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX2dldF9wYXJhbSgmY2lkLCAmY3ApOworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkJY3AuZW5jX2ZtdC5kZXQudmlkLnNpemUudyA9IE07CisJCWNwLmVuY19mbXQuZGV0LnZpZC5zaXplLmggPSBOOworCQlzdGF0dXMgPSBwanN1YV92aWRfY29kZWNfc2V0X3BhcmFtKCZjaWQsICZjcCk7CisJICAgIH0KKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJTZXQgY29kZWMgc2l6ZSBlcnJvciIpKTsKKwl9IGVsc2UKKwkgICAgZ290byBvbl9lcnJvcjsKKyAgICB9IGVsc2UKKwlnb3RvIG9uX2Vycm9yOworCisgICAgcmV0dXJuOworCitvbl9lcnJvcjoKKyAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiSW52YWxpZCBjb21tYW5kLCB1c2UgJ3ZpZCBoZWxwJyIpKTsKK30KKworI2VuZGlmIC8qIFBKU1VBX0hBU19WSURFTyAqLworCisvKiogVUkgQ29tbWFuZCAqKi8KK3N0YXRpYyB2b2lkIHVpX21ha2VfbmV3X2NhbGwoKQoreyAgICAKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIGlucHV0X3Jlc3VsdCByZXN1bHQ7CisgICAgcGpfc3RyX3QgdG1wOworCisgICAgcHJpbnRmKCIoWW91IGN1cnJlbnRseSBoYXZlICVkIGNhbGxzKVxuIiwgcGpzdWFfY2FsbF9nZXRfY291bnQoKSk7CisgICAgCisgICAgdWlfaW5wdXRfdXJsKCJNYWtlIGNhbGwiLCBidWYsIHNpemVvZihidWYpLCAmcmVzdWx0KTsKKyAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCAhPSBQSlNVQV9BUFBfTk9fTkIpIHsKKworCWlmIChyZXN1bHQubmJfcmVzdWx0ID09IC0xIHx8IHJlc3VsdC5uYl9yZXN1bHQgPT0gMCkgeworCSAgICBwdXRzKCJZb3UgY2FuJ3QgZG8gdGhhdCB3aXRoIG1ha2UgY2FsbCEiKTsKKwkgICAgcmV0dXJuOworCX0gZWxzZSB7CisJICAgIHBqc3VhX2J1ZGR5X2luZm8gYmluZm87CisJICAgIHBqc3VhX2J1ZGR5X2dldF9pbmZvKHJlc3VsdC5uYl9yZXN1bHQtMSwgJmJpbmZvKTsKKwkgICAgdG1wLnB0ciA9IGJ1ZjsKKwkgICAgcGpfc3RybmNweSgmdG1wLCAmYmluZm8udXJpLCBzaXplb2YoYnVmKSk7CisJfQorCisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXRtcCA9IHBqX3N0cihyZXN1bHQudXJpX3Jlc3VsdCk7CisgICAgfSBlbHNlIHsKKwl0bXAuc2xlbiA9IDA7CisgICAgfQorCisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworICAgIFRFU1RfTVVMVElQQVJUKCZtc2dfZGF0YSk7CisgICAgcGpzdWFfY2FsbF9tYWtlX2NhbGwoY3VycmVudF9hY2MsICZ0bXAsICZjYWxsX29wdCwgTlVMTCwgCisJCQkgJm1zZ19kYXRhLCAmY3VycmVudF9jYWxsKTsKK30KKworc3RhdGljIHZvaWQgdWlfbWFrZV9tdWx0aV9jYWxsKCkKK3sKKyAgICBjaGFyIG1lbnVpblszMl07CisgICAgaW50IGNvdW50OworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKyAgICBwal9zdHJfdCB0bXA7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIihZb3UgY3VycmVudGx5IGhhdmUgJWQgY2FsbHMpXG4iLCBwanN1YV9jYWxsX2dldF9jb3VudCgpKTsKKworICAgIGlmICghc2ltcGxlX2lucHV0KCJOdW1iZXIgb2YgY2FsbHMiLCBtZW51aW4sIHNpemVvZihtZW51aW4pKSkKKwlyZXR1cm47CisKKyAgICBjb3VudCA9IG15X2F0b2kobWVudWluKTsKKyAgICBpZiAoY291bnQgPCAxKQorCXJldHVybjsKKworICAgIHVpX2lucHV0X3VybCgiTWFrZSBjYWxsIiwgYnVmLCBzaXplb2YoYnVmKSwgJnJlc3VsdCk7CisgICAgaWYgKHJlc3VsdC5uYl9yZXN1bHQgIT0gUEpTVUFfQVBQX05PX05CKSB7CisJcGpzdWFfYnVkZHlfaW5mbyBiaW5mbzsKKwlpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAtMSB8fCByZXN1bHQubmJfcmVzdWx0ID09IDApIHsKKwkgICAgcHV0cygiWW91IGNhbid0IGRvIHRoYXQgd2l0aCBtYWtlIGNhbGwhIik7CisJICAgIHJldHVybjsKKwl9CisJcGpzdWFfYnVkZHlfZ2V0X2luZm8ocmVzdWx0Lm5iX3Jlc3VsdC0xLCAmYmluZm8pOworCXRtcC5wdHIgPSBidWY7CisJcGpfc3RybmNweSgmdG1wLCAmYmluZm8udXJpLCBzaXplb2YoYnVmKSk7CisgICAgfSBlbHNlIHsKKwl0bXAgPSBwal9zdHIocmVzdWx0LnVyaV9yZXN1bHQpOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPG15X2F0b2kobWVudWluKTsgKytpKSB7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJc3RhdHVzID0gcGpzdWFfY2FsbF9tYWtlX2NhbGwoY3VycmVudF9hY2MsICZ0bXAsICZjYWxsX29wdCwgTlVMTCwKKwkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX2RldGVjdF9uYXRfdHlwZSgpCit7CisgICAgaW50IGkgPSBwanN1YV9kZXRlY3RfbmF0X3R5cGUoKTsKKyAgICBpZiAoaSAhPSBQSl9TVUNDRVNTKQorCXBqc3VhX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciIsIGkpOworfQorCitzdGF0aWMgdm9pZCB1aV9zZW5kX2luc3RhbnRfbWVzc2FnZSgpCit7CisgICAgY2hhciAqdXJpID0gTlVMTDsKKyAgICAvKiBpIGlzIGZvciBjYWxsIGluZGV4IHRvIHNlbmQgbWVzc2FnZSwgaWYgYW55ICovCisgICAgaW50IGkgPSAtMTsKKyAgICBpbnB1dF9yZXN1bHQgcmVzdWx0OworICAgIGNoYXIgYnVmWzEyOF07CisgICAgY2hhciB0ZXh0WzEyOF07CisgICAgcGpfc3RyX3QgdG1wOworCisgICAgLyogSW5wdXQgZGVzdGluYXRpb24uICovCisgICAgdWlfaW5wdXRfdXJsKCJTZW5kIElNIHRvIiwgYnVmLCBzaXplb2YoYnVmKSwgJnJlc3VsdCk7CisgICAgaWYgKHJlc3VsdC5uYl9yZXN1bHQgIT0gUEpTVUFfQVBQX05PX05CKSB7CisKKwlpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAtMSkgeworCSAgICBwdXRzKCJZb3UgY2FuJ3Qgc2VuZCBicm9hZGNhc3QgSU0gbGlrZSB0aGF0ISIpOworCSAgICByZXR1cm47CisKKwl9IGVsc2UgaWYgKHJlc3VsdC5uYl9yZXN1bHQgPT0gMCkgeworCSAgICBpID0gY3VycmVudF9jYWxsOworCX0gZWxzZSB7CisJICAgIHBqc3VhX2J1ZGR5X2luZm8gYmluZm87CisJICAgIHBqc3VhX2J1ZGR5X2dldF9pbmZvKHJlc3VsdC5uYl9yZXN1bHQtMSwgJmJpbmZvKTsKKwkgICAgdG1wLnB0ciA9IGJ1ZjsKKwkgICAgcGpfc3RybmNweV93aXRoX251bGwoJnRtcCwgJmJpbmZvLnVyaSwgc2l6ZW9mKGJ1ZikpOworCSAgICB1cmkgPSBidWY7CisJfQorCisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXVyaSA9IHJlc3VsdC51cmlfcmVzdWx0OworICAgIH0KKworCisgICAgLyogU2VuZCB0eXBpbmcgaW5kaWNhdGlvbi4gKi8KKyAgICBpZiAoaSAhPSAtMSkKKwlwanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZChpLCBQSl9UUlVFLCBOVUxMKTsKKyAgICBlbHNlIHsKKwlwal9zdHJfdCB0bXBfdXJpID0gcGpfc3RyKHVyaSk7CisJcGpzdWFfaW1fdHlwaW5nKGN1cnJlbnRfYWNjLCAmdG1wX3VyaSwgUEpfVFJVRSwgTlVMTCk7CisgICAgfQorCisgICAgLyogSW5wdXQgdGhlIElNIC4gKi8KKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiTWVzc2FnZSIsIHRleHQsIHNpemVvZih0ZXh0KSkpIHsKKwkvKgorCSogQ2FuY2VsbGVkLgorCSogU2VuZCB0eXBpbmcgbm90aWZpY2F0aW9uIHRvbywgc2F5aW5nIHdlJ3JlIG5vdCB0eXBpbmcuCisJKi8KKwlpZiAoaSAhPSAtMSkKKwkgICAgcGpzdWFfY2FsbF9zZW5kX3R5cGluZ19pbmQoaSwgUEpfRkFMU0UsIE5VTEwpOworCWVsc2UgeworCSAgICBwal9zdHJfdCB0bXBfdXJpID0gcGpfc3RyKHVyaSk7CisJICAgIHBqc3VhX2ltX3R5cGluZyhjdXJyZW50X2FjYywgJnRtcF91cmksIFBKX0ZBTFNFLCBOVUxMKTsKKwl9CisJcmV0dXJuOworICAgIH0KKworICAgIHRtcCA9IHBqX3N0cih0ZXh0KTsKKworICAgIC8qIFNlbmQgdGhlIElNICovCisgICAgaWYgKGkgIT0gLTEpCisJcGpzdWFfY2FsbF9zZW5kX2ltKGksIE5VTEwsICZ0bXAsIE5VTEwsIE5VTEwpOworICAgIGVsc2UgeworCXBqX3N0cl90IHRtcF91cmkgPSBwal9zdHIodXJpKTsKKwlwanN1YV9pbV9zZW5kKGN1cnJlbnRfYWNjLCAmdG1wX3VyaSwgTlVMTCwgJnRtcCwgTlVMTCwgTlVMTCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1aV9hbnN3ZXJfY2FsbCgpCit7CisgICAgcGpzdWFfY2FsbF9pbmZvIGNhbGxfaW5mbzsKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworCisgICAgaWYgKGN1cnJlbnRfY2FsbCAhPSAtMSkgeworCXBqc3VhX2NhbGxfZ2V0X2luZm8oY3VycmVudF9jYWxsLCAmY2FsbF9pbmZvKTsKKyAgICB9IGVsc2UgeworCS8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKwljYWxsX2luZm8ucm9sZSA9IFBKU0lQX1JPTEVfVUFDOworCWNhbGxfaW5mby5zdGF0ZSA9IFBKU0lQX0lOVl9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfY2FsbCA9PSAtMSB8fCAKKwljYWxsX2luZm8ucm9sZSAhPSBQSlNJUF9ST0xFX1VBUyB8fAorCWNhbGxfaW5mby5zdGF0ZSA+PSBQSlNJUF9JTlZfU1RBVEVfQ09OTkVDVElORykKKyAgICB7CisJcHV0cygiTm8gcGVuZGluZyBpbmNvbWluZyBjYWxsIik7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuOworCisgICAgfSBlbHNlIHsKKwlpbnQgc3RfY29kZTsKKwljaGFyIGNvbnRhY3RbMTIwXTsKKwlwal9zdHJfdCBobmFtZSA9IHsgIkNvbnRhY3QiLCA3IH07CisJcGpfc3RyX3QgaHZhbHVlOworCXBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkciBoY29udGFjdDsKKworCWlmICghc2ltcGxlX2lucHV0KCJBbnN3ZXIgd2l0aCBjb2RlICgxMDAtNjk5KSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCSAgICByZXR1cm47CisKKwlzdF9jb2RlID0gbXlfYXRvaShidWYpOworCWlmIChzdF9jb2RlIDwgMTAwKQorCSAgICByZXR1cm47CisKKwlwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKwlpZiAoc3RfY29kZS8xMDAgPT0gMykgeworCSAgICBpZiAoIXNpbXBsZV9pbnB1dCgiRW50ZXIgVVJMIHRvIGJlIHB1dCBpbiBDb250YWN0IiwgCisJCWNvbnRhY3QsIHNpemVvZihjb250YWN0KSkpCisJCXJldHVybjsKKwkgICAgaHZhbHVlID0gcGpfc3RyKGNvbnRhY3QpOworCSAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfaW5pdDIoJmhjb250YWN0LCAmaG5hbWUsICZodmFsdWUpOworCisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZtc2dfZGF0YS5oZHJfbGlzdCwgJmhjb250YWN0KTsKKwl9CisKKwkvKgorCSogTXVzdCBjaGVjayBhZ2FpbiEKKwkqIENhbGwgbWF5IGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQgd2hpbGUgd2UncmUgd2FpdGluZyBmb3IgCisJKiBrZXlib2FyZCBpbnB1dC4KKwkqLworCWlmIChjdXJyZW50X2NhbGwgPT0gLTEpIHsKKwkgICAgcHV0cygiQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQiKTsKKwkgICAgZmZsdXNoKHN0ZG91dCk7CisJICAgIHJldHVybjsKKwl9CisKKwlwanN1YV9jYWxsX2Fuc3dlcjIoY3VycmVudF9jYWxsLCAmY2FsbF9vcHQsIHN0X2NvZGUsIE5VTEwsICZtc2dfZGF0YSk7CisgICAgfSAgICAKK30KKworc3RhdGljIHZvaWQgdWlfaGFuZ3VwX2NhbGwoY2hhciBtZW51aW5bXSkKK3sKKyAgICBpZiAoY3VycmVudF9jYWxsID09IC0xKSB7CisJcHV0cygiTm8gY3VycmVudCBjYWxsIik7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuOworCisgICAgfSBlbHNlIGlmIChtZW51aW5bMV0gPT0gJ2EnKSB7CisJLyogSGFuZ3VwIGFsbCBjYWxscyAqLworCXBqc3VhX2NhbGxfaGFuZ3VwX2FsbCgpOworICAgIH0gZWxzZSB7CisJLyogSGFuZ3VwIGN1cnJlbnQgY2FsbHMgKi8KKwlwanN1YV9jYWxsX2hhbmd1cChjdXJyZW50X2NhbGwsIDAsIE5VTEwsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfY3ljbGVfZGlhbG9nKGNoYXIgbWVudWluW10pCit7CisgICAgaWYgKG1lbnVpblswXSA9PSAnXScpIHsKKwlmaW5kX25leHRfY2FsbCgpOworCisgICAgfSBlbHNlIHsKKwlmaW5kX3ByZXZfY2FsbCgpOworICAgIH0KKworICAgIGlmIChjdXJyZW50X2NhbGwgIT0gLTEpIHsKKwlwanN1YV9jYWxsX2luZm8gY2FsbF9pbmZvOworCisJcGpzdWFfY2FsbF9nZXRfaW5mbyhjdXJyZW50X2NhbGwsICZjYWxsX2luZm8pOworCVBKX0xPRygzLChUSElTX0ZJTEUsIkN1cnJlbnQgZGlhbG9nOiAlLipzIiwgCisJICAgIChpbnQpY2FsbF9pbmZvLnJlbW90ZV9pbmZvLnNsZW4sIAorCSAgICBjYWxsX2luZm8ucmVtb3RlX2luZm8ucHRyKSk7CisKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsIk5vIGN1cnJlbnQgZGlhbG9nIikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfY3ljbGVfYWNjb3VudCgpCit7CisgICAgaW50IGk7CisgICAgY2hhciBidWZbMTI4XTsKKworICAgIGlmICghc2ltcGxlX2lucHV0KCJFbnRlciBhY2NvdW50IElEIHRvIHNlbGVjdCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCXJldHVybjsKKworICAgIGkgPSBteV9hdG9pKGJ1Zik7CisgICAgaWYgKHBqc3VhX2FjY19pc192YWxpZChpKSkgeworCXBqc3VhX2FjY19zZXRfZGVmYXVsdChpKTsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ3VycmVudCBhY2NvdW50IGNoYW5nZWQgdG8gJWQiLCBpKSk7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiSW52YWxpZCBhY2NvdW50IGlkICVkIiwgaSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfYWRkX2J1ZGR5KCkKK3sKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIHBqc3VhX2J1ZGR5X2NvbmZpZyBidWRkeV9jZmc7CisgICAgcGpzdWFfYnVkZHlfaWQgYnVkZHlfaWQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKCFzaW1wbGVfaW5wdXQoIkVudGVyIGJ1ZGR5J3MgVVJJOiIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCXJldHVybjsKKworICAgIGlmIChwanN1YV92ZXJpZnlfdXJsKGJ1ZikgIT0gUEpfU1VDQ0VTUykgeworCXByaW50ZigiSW52YWxpZCBVUkkgJyVzJ1xuIiwgYnVmKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcGpfYnplcm8oJmJ1ZGR5X2NmZywgc2l6ZW9mKHBqc3VhX2J1ZGR5X2NvbmZpZykpOworCisgICAgYnVkZHlfY2ZnLnVyaSA9IHBqX3N0cihidWYpOworICAgIGJ1ZGR5X2NmZy5zdWJzY3JpYmUgPSBQSl9UUlVFOworCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfYWRkKCZidWRkeV9jZmcsICZidWRkeV9pZCk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJcHJpbnRmKCJOZXcgYnVkZHkgJyVzJyBhZGRlZCBhdCBpbmRleCAlZFxuIiwKKwkgICAgYnVmLCBidWRkeV9pZCsxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX2FkZF9hY2NvdW50KHBqc3VhX3RyYW5zcG9ydF9jb25maWcgKnJ0cF9jZmcpCit7CisgICAgY2hhciBpZFs4MF0sIHJlZ2lzdHJhcls4MF0sIHJlYWxtWzgwXSwgdW5hbWVbODBdLCBwYXNzd2RbMzBdOworICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiWW91ciBTSVAgVVJMOiIsIGlkLCBzaXplb2YoaWQpKSkKKwlyZXR1cm47CisgICAgaWYgKCFzaW1wbGVfaW5wdXQoIlVSTCBvZiB0aGUgcmVnaXN0cmFyOiIsIHJlZ2lzdHJhciwgc2l6ZW9mKHJlZ2lzdHJhcikpKQorCXJldHVybjsKKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiQXV0aCBSZWFsbToiLCByZWFsbSwgc2l6ZW9mKHJlYWxtKSkpCisJcmV0dXJuOworICAgIGlmICghc2ltcGxlX2lucHV0KCJBdXRoIFVzZXJuYW1lOiIsIHVuYW1lLCBzaXplb2YodW5hbWUpKSkKKwlyZXR1cm47CisgICAgaWYgKCFzaW1wbGVfaW5wdXQoIkF1dGggUGFzc3dvcmQ6IiwgcGFzc3dkLCBzaXplb2YocGFzc3dkKSkpCisJcmV0dXJuOworCisgICAgcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0KCZhY2NfY2ZnKTsKKyAgICBhY2NfY2ZnLmlkID0gcGpfc3RyKGlkKTsKKyAgICBhY2NfY2ZnLnJlZ191cmkgPSBwal9zdHIocmVnaXN0cmFyKTsKKyAgICBhY2NfY2ZnLmNyZWRfY291bnQgPSAxOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnNjaGVtZSA9IHBqX3N0cigiRGlnZXN0Iik7CisgICAgYWNjX2NmZy5jcmVkX2luZm9bMF0ucmVhbG0gPSBwal9zdHIocmVhbG0pOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnVzZXJuYW1lID0gcGpfc3RyKHVuYW1lKTsKKyAgICBhY2NfY2ZnLmNyZWRfaW5mb1swXS5kYXRhX3R5cGUgPSAwOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLmRhdGEgPSBwal9zdHIocGFzc3dkKTsKKworICAgIGFjY19jZmcucnRwX2NmZyA9ICpydHBfY2ZnOyAgICAKKyAgICBhcHBfY29uZmlnX2luaXRfdmlkZW8oJmFjY19jZmcpOworCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX2FkZCgmYWNjX2NmZywgUEpfVFJVRSwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzdWFfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkZGluZyBuZXcgYWNjb3VudCIsIHN0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1aV9kZWxldGVfYnVkZHkoKQoreworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW50IGk7CisKKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiRW50ZXIgYnVkZHkgSUQgdG8gZGVsZXRlIiwgYnVmLCBzaXplb2YoYnVmKSkpCisJcmV0dXJuOworCisgICAgaSA9IG15X2F0b2koYnVmKSAtIDE7CisKKyAgICBpZiAoIXBqc3VhX2J1ZGR5X2lzX3ZhbGlkKGkpKSB7CisJcHJpbnRmKCJJbnZhbGlkIGJ1ZGR5IGlkICVkXG4iLCBpKTsKKyAgICB9IGVsc2UgeworCXBqc3VhX2J1ZGR5X2RlbChpKTsKKwlwcmludGYoIkJ1ZGR5ICVkIGRlbGV0ZWRcbiIsIGkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfZGVsZXRlX2FjY291bnQoKQoreworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW50IGk7CisKKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiRW50ZXIgYWNjb3VudCBJRCB0byBkZWxldGUiLCBidWYsIHNpemVvZihidWYpKSkKKwlyZXR1cm47CisKKyAgICBpID0gbXlfYXRvaShidWYpOworCisgICAgaWYgKCFwanN1YV9hY2NfaXNfdmFsaWQoaSkpIHsKKwlwcmludGYoIkludmFsaWQgYWNjb3VudCBpZCAlZFxuIiwgaSk7CisgICAgfSBlbHNlIHsKKwlwanN1YV9hY2NfZGVsKGkpOworCXByaW50ZigiQWNjb3VudCAlZCBkZWxldGVkXG4iLCBpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX2NhbGxfaG9sZCgpCit7CisgICAgaWYgKGN1cnJlbnRfY2FsbCAhPSAtMSkgewkJCisJcGpzdWFfY2FsbF9zZXRfaG9sZChjdXJyZW50X2NhbGwsIE5VTEwpOworICAgIH0gZWxzZSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX2NhbGxfcmVpbnZpdGUoKQoreworICAgIGNhbGxfb3B0LmZsYWcgfD0gUEpTVUFfQ0FMTF9VTkhPTEQ7CisgICAgcGpzdWFfY2FsbF9yZWludml0ZTIoY3VycmVudF9jYWxsLCAmY2FsbF9vcHQsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB1aV9zZW5kX3VwZGF0ZSgpCit7CisgICAgaWYgKGN1cnJlbnRfY2FsbCAhPSAtMSkgewkJCisJcGpzdWFfY2FsbF91cGRhdGUyKGN1cnJlbnRfY2FsbCwgJmNhbGxfb3B0LCBOVUxMKTsKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJObyBjdXJyZW50IGNhbGwiKSk7CisgICAgfQorfQorCisvKgorICogQ2hhbmdlIGNvZGVjIHByaW9yaXRpZXMuCisgKi8KK3N0YXRpYyB2b2lkIHVpX21hbmFnZV9jb2RlY19wcmlvKCkKK3sKKyAgICBwanN1YV9jb2RlY19pbmZvIGNbMzJdOworICAgIHVuc2lnbmVkIGksIGNvdW50ID0gUEpfQVJSQVlfU0laRShjKTsKKyAgICBjaGFyIGlucHV0WzMyXTsKKyAgICBjaGFyICpjb2RlYywgKnByaW87CisgICAgcGpfc3RyX3QgaWQ7CisgICAgaW50IG5ld19wcmlvOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHByaW50ZigiTGlzdCBvZiBhdWRpbyBjb2RlY3M6XG4iKTsKKyAgICBwanN1YV9lbnVtX2NvZGVjcyhjLCAmY291bnQpOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwlwcmludGYoIiAgJWRcdCUuKnNcbiIsIGNbaV0ucHJpb3JpdHksIChpbnQpY1tpXS5jb2RlY19pZC5zbGVuLAorCQkJICAgICAgIGNbaV0uY29kZWNfaWQucHRyKTsKKyAgICB9CisKKyNpZiBQSlNVQV9IQVNfVklERU8KKyAgICBwdXRzKCIiKTsKKyAgICBwcmludGYoIkxpc3Qgb2YgdmlkZW8gY29kZWNzOlxuIik7CisgICAgcGpzdWFfdmlkX2VudW1fY29kZWNzKGMsICZjb3VudCk7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCXByaW50ZigiICAlZFx0JS4qcyVzJS4qc1xuIiwgY1tpXS5wcmlvcml0eSwKKwkJCQkgICAgIChpbnQpY1tpXS5jb2RlY19pZC5zbGVuLAorCQkJCSAgICAgY1tpXS5jb2RlY19pZC5wdHIsCisJCQkJICAgICBjW2ldLmRlc2Muc2xlbj8gIiAtICI6IiIsCisJCQkJICAgICAoaW50KWNbaV0uZGVzYy5zbGVuLAorCQkJCSAgICAgY1tpXS5kZXNjLnB0cik7CisgICAgfQorI2VuZGlmCisKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJFbnRlciBjb2RlYyBpZCBhbmQgaXRzIG5ldyBwcmlvcml0eSAoZS5nLiBcInNwZWV4LzE2MDAwIDIwMFwiLCAiCisJICIiIlwiSDI2MyAyMDBcIiksIik7CisgICAgcHV0cygib3IgZW1wdHkgdG8gY2FuY2VsLiIpOworCisgICAgcHJpbnRmKCJDb2RlYyBuYW1lIChcIipcIiBmb3IgYWxsKSBhbmQgcHJpb3JpdHk6ICIpOworICAgIGlmIChmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pID09IE5VTEwpCisJcmV0dXJuOworICAgIGlmIChpbnB1dFswXT09J1xyJyB8fCBpbnB1dFswXT09J1xuJykgeworCXB1dHMoIkRvbmUiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgY29kZWMgPSBzdHJ0b2soaW5wdXQsICIgXHRcclxuIik7CisgICAgcHJpbyA9IHN0cnRvayhOVUxMLCAiIFxyXG4iKTsKKworICAgIGlmICghY29kZWMgfHwgIXByaW8pIHsKKwlwdXRzKCJJbnZhbGlkIGlucHV0Iik7CisJcmV0dXJuOworICAgIH0KKworICAgIG5ld19wcmlvID0gYXRvaShwcmlvKTsKKyAgICBpZiAobmV3X3ByaW8gPCAwKSAKKwluZXdfcHJpbyA9IDA7CisgICAgZWxzZSBpZiAobmV3X3ByaW8gPiBQSk1FRElBX0NPREVDX1BSSU9fSElHSEVTVCkgCisJbmV3X3ByaW8gPSBQSk1FRElBX0NPREVDX1BSSU9fSElHSEVTVDsKKworICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX3NldF9wcmlvcml0eShwal9jc3RyKCZpZCwgY29kZWMpLCAKKwkJCQkgICAgICAocGpfdWludDhfdCluZXdfcHJpbyk7CisjaWYgUEpTVUFfSEFTX1ZJREVPCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzID0gcGpzdWFfdmlkX2NvZGVjX3NldF9wcmlvcml0eShwal9jc3RyKCZpZCwgY29kZWMpLCAKKwkJCQkJICAgICAgKHBqX3VpbnQ4X3QpbmV3X3ByaW8pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlwanN1YV9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igc2V0dGluZyBjb2RlYyBwcmlvcml0eSIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHVpX2NhbGxfdHJhbnNmZXIocGpfYm9vbF90IG5vX3JlZmVyc3ViKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgPT0gLTEpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0gZWxzZSB7CisJaW50IGNhbGwgPSBjdXJyZW50X2NhbGw7CisJY2hhciBidWZbMTI4XTsKKwlwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgcmVmZXJfc3ViOworCXBqX3N0cl90IFNUUl9SRUZFUl9TVUIgPSB7ICJSZWZlci1TdWIiLCA5IH07CisJcGpfc3RyX3QgU1RSX0ZBTFNFID0geyAiZmFsc2UiLCA1IH07CisJcGpzdWFfY2FsbF9pbmZvIGNpOworCWlucHV0X3Jlc3VsdCByZXN1bHQ7CisJcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisKKwlwanN1YV9jYWxsX2dldF9pbmZvKGN1cnJlbnRfY2FsbCwgJmNpKTsKKwlwcmludGYoIlRyYW5zZmVyaW5nIGN1cnJlbnQgY2FsbCBbJWRdICUuKnNcbiIsIGN1cnJlbnRfY2FsbCwKKwkgICAgICAgKGludCljaS5yZW1vdGVfaW5mby5zbGVuLCBjaS5yZW1vdGVfaW5mby5wdHIpOworCisJdWlfaW5wdXRfdXJsKCJUcmFuc2ZlciB0byBVUkwiLCBidWYsIHNpemVvZihidWYpLCAmcmVzdWx0KTsKKworCS8qIENoZWNrIGlmIGNhbGwgaXMgc3RpbGwgdGhlcmUuICovCisKKwlpZiAoY2FsbCAhPSBjdXJyZW50X2NhbGwpIHsKKwkgICAgcHV0cygiQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQiKTsKKwkgICAgcmV0dXJuOworCX0KKworCXBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKwlpZiAobm9fcmVmZXJzdWIpIHsKKwkgICAgLyogQWRkIFJlZmVyLVN1YjogZmFsc2UgaW4gb3V0Z29pbmcgUkVGRVIgcmVxdWVzdCAqLworCSAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfaW5pdDIoJnJlZmVyX3N1YiwgJlNUUl9SRUZFUl9TVUIsCisJCSZTVFJfRkFMU0UpOworCSAgICBwal9saXN0X3B1c2hfYmFjaygmbXNnX2RhdGEuaGRyX2xpc3QsICZyZWZlcl9zdWIpOworCX0KKwlpZiAocmVzdWx0Lm5iX3Jlc3VsdCAhPSBQSlNVQV9BUFBfTk9fTkIpIHsKKwkgICAgaWYgKHJlc3VsdC5uYl9yZXN1bHQgPT0gLTEgfHwgcmVzdWx0Lm5iX3Jlc3VsdCA9PSAwKQorCQlwdXRzKCJZb3UgY2FuJ3QgZG8gdGhhdCB3aXRoIHRyYW5zZmVyIGNhbGwhIik7CisJICAgIGVsc2UgeworCQlwanN1YV9idWRkeV9pbmZvIGJpbmZvOworCQlwanN1YV9idWRkeV9nZXRfaW5mbyhyZXN1bHQubmJfcmVzdWx0LTEsICZiaW5mbyk7CisJCXBqc3VhX2NhbGxfeGZlciggY3VycmVudF9jYWxsLCAmYmluZm8udXJpLCAmbXNnX2RhdGEpOworCSAgICB9CisKKwl9IGVsc2UgaWYgKHJlc3VsdC51cmlfcmVzdWx0KSB7CisJICAgIHBqX3N0cl90IHRtcDsKKwkgICAgdG1wID0gcGpfc3RyKHJlc3VsdC51cmlfcmVzdWx0KTsKKwkgICAgcGpzdWFfY2FsbF94ZmVyKCBjdXJyZW50X2NhbGwsICZ0bXAsICZtc2dfZGF0YSk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfY2FsbF90cmFuc2Zlcl9yZXBsYWNlcyhwal9ib29sX3Qgbm9fcmVmZXJzdWIpCit7ICAgICAgICAKKyAgICBpZiAoY3VycmVudF9jYWxsID09IC0xKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKyAgICB9IGVsc2UgeworCWludCBjYWxsID0gY3VycmVudF9jYWxsOworCWludCBkc3RfY2FsbDsKKwlwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgcmVmZXJfc3ViOworCXBqX3N0cl90IFNUUl9SRUZFUl9TVUIgPSB7ICJSZWZlci1TdWIiLCA5IH07CisJcGpfc3RyX3QgU1RSX0ZBTFNFID0geyAiZmFsc2UiLCA1IH07CisJcGpzdWFfY2FsbF9pZCBpZHNbUEpTVUFfTUFYX0NBTExTXTsKKwlwanN1YV9jYWxsX2luZm8gY2k7CisJcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisJY2hhciBidWZbMTI4XTsKKwl1bnNpZ25lZCBpLCBjb3VudDsKKworCWNvdW50ID0gUEpfQVJSQVlfU0laRShpZHMpOworCXBqc3VhX2VudW1fY2FsbHMoaWRzLCAmY291bnQpOworCisJaWYgKGNvdW50IDw9IDEpIHsKKwkgICAgcHV0cygiVGhlcmUgYXJlIG5vIG90aGVyIGNhbGxzIik7CisJICAgIHJldHVybjsKKwl9CisKKwlwanN1YV9jYWxsX2dldF9pbmZvKGN1cnJlbnRfY2FsbCwgJmNpKTsKKwlwcmludGYoIlRyYW5zZmVyIGNhbGwgWyVkXSAlLipzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuIiwKKwkgICAgICAgY3VycmVudF9jYWxsLAorCSAgICAgICAoaW50KWNpLnJlbW90ZV9pbmZvLnNsZW4sIGNpLnJlbW90ZV9pbmZvLnB0cik7CisKKwlmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJICAgIHBqc3VhX2NhbGxfaW5mbyBjYWxsX2luZm87CisKKwkgICAgaWYgKGlkc1tpXSA9PSBjYWxsKQorCQljb250aW51ZTsKKworCSAgICBwanN1YV9jYWxsX2dldF9pbmZvKGlkc1tpXSwgJmNhbGxfaW5mbyk7CisJICAgIHByaW50ZigiJWQgICUuKnMgWyUuKnNdXG4iLAorCQlpZHNbaV0sCisJCShpbnQpY2FsbF9pbmZvLnJlbW90ZV9pbmZvLnNsZW4sCisJCWNhbGxfaW5mby5yZW1vdGVfaW5mby5wdHIsCisJCShpbnQpY2FsbF9pbmZvLnN0YXRlX3RleHQuc2xlbiwKKwkJY2FsbF9pbmZvLnN0YXRlX3RleHQucHRyKTsKKwl9CisKKwlpZiAoIXNpbXBsZV9pbnB1dCgiRW50ZXIgY2FsbCBudW1iZXIgdG8gYmUgcmVwbGFjZWQiLCBidWYsIHNpemVvZihidWYpKSkKKwkgICAgcmV0dXJuOworCisJZHN0X2NhbGwgPSBteV9hdG9pKGJ1Zik7CisKKwkvKiBDaGVjayBpZiBjYWxsIGlzIHN0aWxsIHRoZXJlLiAqLworCisJaWYgKGNhbGwgIT0gY3VycmVudF9jYWxsKSB7CisJICAgIHB1dHMoIkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkIik7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBDaGVjayB0aGF0IGRlc3RpbmF0aW9uIGNhbGwgaXMgdmFsaWQuICovCisJaWYgKGRzdF9jYWxsID09IGNhbGwpIHsKKwkgICAgcHV0cygiRGVzdGluYXRpb24gY2FsbCBudW1iZXIgbXVzdCBub3QgYmUgdGhlIHNhbWUgIgorCQkiYXMgdGhlIGNhbGwgYmVpbmcgdHJhbnNmZXJlZCIpOworCSAgICByZXR1cm47CisJfQorCWlmIChkc3RfY2FsbCA+PSBQSlNVQV9NQVhfQ0FMTFMpIHsKKwkgICAgcHV0cygiSW52YWxpZCBkZXN0aW5hdGlvbiBjYWxsIG51bWJlciIpOworCSAgICByZXR1cm47CisJfQorCWlmICghcGpzdWFfY2FsbF9pc19hY3RpdmUoZHN0X2NhbGwpKSB7CisJICAgIHB1dHMoIkludmFsaWQgZGVzdGluYXRpb24gY2FsbCBudW1iZXIiKTsKKwkgICAgcmV0dXJuOworCX0KKworCXBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKwlpZiAobm9fcmVmZXJzdWIpIHsKKwkgICAgLyogQWRkIFJlZmVyLVN1YjogZmFsc2UgaW4gb3V0Z29pbmcgUkVGRVIgcmVxdWVzdCAqLworCSAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfaW5pdDIoJnJlZmVyX3N1YiwgJlNUUl9SRUZFUl9TVUIsIAorCQkJCQkgICAmU1RSX0ZBTFNFKTsKKwkgICAgcGpfbGlzdF9wdXNoX2JhY2soJm1zZ19kYXRhLmhkcl9saXN0LCAmcmVmZXJfc3ViKTsKKwl9CisKKwlwanN1YV9jYWxsX3hmZXJfcmVwbGFjZXMoY2FsbCwgZHN0X2NhbGwsIAorCQkJCSBQSlNVQV9YRkVSX05PX1JFUVVJUkVfUkVQTEFDRVMsIAorCQkJCSAmbXNnX2RhdGEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfc2VuZF9kdG1mXzI4MzMoKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgPT0gLTEpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0gZWxzZSBpZiAoIXBqc3VhX2NhbGxfaGFzX21lZGlhKGN1cnJlbnRfY2FsbCkpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTWVkaWEgaXMgbm90IGVzdGFibGlzaGVkIHlldCEiKSk7CisgICAgfSBlbHNlIHsKKwlwal9zdHJfdCBkaWdpdHM7CisJaW50IGNhbGwgPSBjdXJyZW50X2NhbGw7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCWNoYXIgYnVmWzEyOF07CisKKwlpZiAoIXNpbXBsZV9pbnB1dCgiRFRNRiBzdHJpbmdzIHRvIHNlbmQgKDAtOSojQS1CKSIsIGJ1ZiwgCisJICAgIHNpemVvZihidWYpKSkKKwl7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoY2FsbCAhPSBjdXJyZW50X2NhbGwpIHsKKwkgICAgcHV0cygiQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQiKTsKKwkgICAgcmV0dXJuOworCX0KKworCWRpZ2l0cyA9IHBqX3N0cihidWYpOworCXN0YXR1cyA9IHBqc3VhX2NhbGxfZGlhbF9kdG1mKGN1cnJlbnRfY2FsbCwgJmRpZ2l0cyk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqc3VhX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gc2VuZCBEVE1GIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCSAgICBwdXRzKCJEVE1GIGRpZ2l0cyBlbnF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uIik7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfc2VuZF9kdG1mX2luZm8oKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgPT0gLTEpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworICAgIH0gZWxzZSB7CisJY29uc3QgcGpfc3RyX3QgU0lQX0lORk8gPSBwal9zdHIoIklORk8iKTsKKwlwal9zdHJfdCBkaWdpdHM7CisJaW50IGNhbGwgPSBjdXJyZW50X2NhbGw7CisJaW50IGk7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCWNoYXIgYnVmWzEyOF07CisKKwlpZiAoIXNpbXBsZV9pbnB1dCgiRFRNRiBzdHJpbmdzIHRvIHNlbmQgKDAtOSojQS1CKSIsIGJ1ZiwgCisJICAgIHNpemVvZihidWYpKSkKKwl7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoY2FsbCAhPSBjdXJyZW50X2NhbGwpIHsKKwkgICAgcHV0cygiQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQiKTsKKwkgICAgcmV0dXJuOworCX0KKworCWRpZ2l0cyA9IHBqX3N0cihidWYpOworCWZvciAoaT0wOyBpPGRpZ2l0cy5zbGVuOyArK2kpIHsKKwkgICAgY2hhciBib2R5WzgwXTsKKwkgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisKKwkgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworCSAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUgPSBwal9zdHIoImFwcGxpY2F0aW9uL2R0bWYtcmVsYXkiKTsKKworCSAgICBwal9hbnNpX3NucHJpbnRmKGJvZHksIHNpemVvZihib2R5KSwKKwkJIlNpZ25hbD0lY1xyXG4iCisJCSJEdXJhdGlvbj0xNjAiLAorCQlidWZbaV0pOworCSAgICBtc2dfZGF0YS5tc2dfYm9keSA9IHBqX3N0cihib2R5KTsKKworCSAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NlbmRfcmVxdWVzdChjdXJyZW50X2NhbGwsICZTSVBfSU5GTywgCisJCSZtc2dfZGF0YSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlyZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1aV9zZW5kX2FyYml0cmFyeV9yZXF1ZXN0KCkKK3sKKyAgICBjaGFyIHRleHRbMTI4XTsKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIGNoYXIgKnVyaTsKKyAgICBpbnB1dF9yZXN1bHQgcmVzdWx0OworICAgIHBqX3N0cl90IHRtcDsKKworICAgIGlmIChwanN1YV9hY2NfZ2V0X2NvdW50KCkgPT0gMCkgeworCXB1dHMoIlNvcnJ5LCBuZWVkIGF0IGxlYXN0IG9uZSBhY2NvdW50IGNvbmZpZ3VyZWQiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcHV0cygiU2VuZCBhcmJpdHJhcnkgcmVxdWVzdCB0byByZW1vdGUgaG9zdCIpOworCisgICAgLyogSW5wdXQgTUVUSE9EICovCisgICAgaWYgKCFzaW1wbGVfaW5wdXQoIlJlcXVlc3QgbWV0aG9kOiIsdGV4dCxzaXplb2YodGV4dCkpKQorCXJldHVybjsKKworICAgIC8qIElucHV0IGRlc3RpbmF0aW9uIFVSSSAqLworICAgIHVyaSA9IE5VTEw7CisgICAgdWlfaW5wdXRfdXJsKCJEZXN0aW5hdGlvbiBVUkkiLCBidWYsIHNpemVvZihidWYpLCAmcmVzdWx0KTsKKyAgICBpZiAocmVzdWx0Lm5iX3Jlc3VsdCAhPSBQSlNVQV9BUFBfTk9fTkIpIHsKKworCWlmIChyZXN1bHQubmJfcmVzdWx0ID09IC0xKSB7CisJICAgIHB1dHMoIlNvcnJ5IHlvdSBjYW4ndCBkbyB0aGF0ISIpOworCSAgICByZXR1cm47CisJfSBlbHNlIGlmIChyZXN1bHQubmJfcmVzdWx0ID09IDApIHsKKwkgICAgdXJpID0gTlVMTDsKKwkgICAgaWYgKGN1cnJlbnRfY2FsbCA9PSBQSlNVQV9JTlZBTElEX0lEKSB7CisJCXB1dHMoIk5vIGN1cnJlbnQgY2FsbCIpOworCQlyZXR1cm47CisJICAgIH0KKwl9IGVsc2UgewkgICAgCisJICAgIHBqc3VhX2J1ZGR5X2luZm8gYmluZm87CisJICAgIHBqc3VhX2J1ZGR5X2dldF9pbmZvKHJlc3VsdC5uYl9yZXN1bHQtMSwgJmJpbmZvKTsKKwkgICAgdG1wLnB0ciA9IGJ1ZjsKKwkgICAgcGpfc3RybmNweV93aXRoX251bGwoJnRtcCwgJmJpbmZvLnVyaSwgc2l6ZW9mKGJ1ZikpOworCSAgICB1cmkgPSBidWY7CisJfQorCisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXVyaSA9IHJlc3VsdC51cmlfcmVzdWx0OworICAgIH0gZWxzZSB7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICh1cmkpIHsKKwl0bXAgPSBwal9zdHIodXJpKTsKKwlzZW5kX3JlcXVlc3QodGV4dCwgJnRtcCk7CisgICAgfSBlbHNlIHsKKwkvKiBJZiB5b3Ugc2VuZCBjYWxsIGNvbnRyb2wgcmVxdWVzdCB1c2luZyB0aGlzIG1ldGhvZAorCSogKHN1Y2ggcmVxdWVzdHMgaW5jbHVkZXMgQllFLCBDQU5DRUwsIGV0Yy4pLCBpdCB3aWxsCisJKiBub3QgZ28gd2VsbCB3aXRoIHRoZSBjYWxsIHN0YXRlLCBzbyBkb24ndCBkbyBpdAorCSogdW5sZXNzIGl0J3MgZm9yIHRlc3RpbmcuCisJKi8KKwlwal9zdHJfdCBtZXRob2QgPSBwal9zdHIodGV4dCk7CisJcGpzdWFfY2FsbF9zZW5kX3JlcXVlc3QoY3VycmVudF9jYWxsLCAmbWV0aG9kLCBOVUxMKTsKKyAgICB9CSAgICAKK30KKworc3RhdGljIHZvaWQgdWlfZWNobyhjaGFyIG1lbnVpbltdKQoreworICAgIGlmIChwal9hbnNpX3N0cm5pY21wKG1lbnVpbiwgImVjaG8iLCA0KT09MCkgeworCXBqX3N0cl90IHRtcDsKKworCXRtcC5wdHIgPSBtZW51aW4rNTsKKwl0bXAuc2xlbiA9IHBqX2Fuc2lfc3RybGVuKG1lbnVpbiktNjsKKworCWlmICh0bXAuc2xlbiA8IDEpIHsKKwkgICAgcHV0cygiVXNhZ2U6IGVjaG8gWzB8MV0iKTsKKwkgICAgcmV0dXJuOworCX0KKwljbWRfZWNobyA9ICp0bXAucHRyICE9ICcwJyB8fCB0bXAuc2xlbiE9MTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX3NsZWVwKGNoYXIgbWVudWluW10pCit7CisgICAgaWYgKHBqX2Fuc2lfc3RybmljbXAobWVudWluLCAic2xlZXAiLCA1KT09MCkgeworCXBqX3N0cl90IHRtcDsKKwlpbnQgZGVsYXk7CisKKwl0bXAucHRyID0gbWVudWluKzY7CisJdG1wLnNsZW4gPSBwal9hbnNpX3N0cmxlbihtZW51aW4pLTc7CisKKwlpZiAodG1wLnNsZW4gPCAxKSB7CisJICAgIHB1dHMoIlVzYWdlOiBzbGVlcCBNU0VDIik7CisJICAgIHJldHVybjsKKwl9CisKKwlkZWxheSA9IHBqX3N0cnRvdWwoJnRtcCk7CisJaWYgKGRlbGF5IDwgMCkgZGVsYXkgPSAwOworCXBqX3RocmVhZF9zbGVlcChkZWxheSk7CQkKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVpX3N1YnNjcmliZShjaGFyIG1lbnVpbltdKQoreworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW5wdXRfcmVzdWx0IHJlc3VsdDsKKworICAgIHVpX2lucHV0X3VybCgiKHVuKVN1YnNjcmliZSBwcmVzZW5jZSBvZiIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZyZXN1bHQpOworICAgIGlmIChyZXN1bHQubmJfcmVzdWx0ICE9IFBKU1VBX0FQUF9OT19OQikgeworCWlmIChyZXN1bHQubmJfcmVzdWx0ID09IC0xKSB7CisJICAgIGludCBpLCBjb3VudDsKKwkgICAgY291bnQgPSBwanN1YV9nZXRfYnVkZHlfY291bnQoKTsKKwkgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkKKwkJcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXMoaSwgbWVudWluWzBdPT0ncycpOworCX0gZWxzZSBpZiAocmVzdWx0Lm5iX3Jlc3VsdCA9PSAwKSB7CisJICAgIHB1dHMoIlNvcnJ5LCBjYW4gb25seSBzdWJzY3JpYmUgdG8gYnVkZHkncyBwcmVzZW5jZSwgIgorCQkibm90IGZyb20gZXhpc3RpbmcgY2FsbCIpOworCX0gZWxzZSB7CisJICAgIHBqc3VhX2J1ZGR5X3N1YnNjcmliZV9wcmVzKHJlc3VsdC5uYl9yZXN1bHQtMSwgKG1lbnVpblswXT09J3MnKSk7CisJfQorCisgICAgfSBlbHNlIGlmIChyZXN1bHQudXJpX3Jlc3VsdCkgeworCXB1dHMoIlNvcnJ5LCBjYW4gb25seSBzdWJzY3JpYmUgdG8gYnVkZHkncyBwcmVzZW5jZSwgIgorCSAgICAibm90IGFyYml0cmFyeSBVUkwgKGZvciBub3cpIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1aV9yZWdpc3RlcihjaGFyIG1lbnVpbltdKQoreworICAgIHN3aXRjaCAobWVudWluWzFdKSB7CisgICAgY2FzZSAncic6CisJLyoKKwkqIFJlLVJlZ2lzdGVyLgorCSovCisJcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb24oY3VycmVudF9hY2MsIFBKX1RSVUUpOworCWJyZWFrOworICAgIGNhc2UgJ3UnOgorCS8qCisJKiBVbnJlZ2lzdGVyCisJKi8KKwlwanN1YV9hY2Nfc2V0X3JlZ2lzdHJhdGlvbihjdXJyZW50X2FjYywgUEpfRkFMU0UpOworCWJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfdG9nZ2xlX3N0YXRlKCkKK3sKKyAgICBwanN1YV9hY2NfaW5mbyBhY2NfaW5mbzsKKworICAgIHBqc3VhX2FjY19nZXRfaW5mbyhjdXJyZW50X2FjYywgJmFjY19pbmZvKTsKKyAgICBhY2NfaW5mby5vbmxpbmVfc3RhdHVzID0gIWFjY19pbmZvLm9ubGluZV9zdGF0dXM7CisgICAgcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzKGN1cnJlbnRfYWNjLCBhY2NfaW5mby5vbmxpbmVfc3RhdHVzKTsKKyAgICBwcmludGYoIlNldHRpbmcgJXMgb25saW5lIHN0YXR1cyB0byAlc1xuIiwKKwkgICBhY2NfaW5mby5hY2NfdXJpLnB0ciwKKwkgICAoYWNjX2luZm8ub25saW5lX3N0YXR1cz8ib25saW5lIjoib2ZmbGluZSIpKTsKK30KKworLyoKKyAqIENoYW5nZSBleHRlbmRlZCBvbmxpbmUgc3RhdHVzLgorICovCitzdGF0aWMgdm9pZCB1aV9jaGFuZ2Vfb25saW5lX3N0YXR1cygpCit7CisgICAgY2hhciBtZW51aW5bMzJdOworICAgIHBqX2Jvb2xfdCBvbmxpbmVfc3RhdHVzOworICAgIHBqcnBpZF9lbGVtZW50IGVsZW07CisgICAgaW50IGksIGNob2ljZTsKKworICAgIGVudW0geworCUFWQUlMQUJMRSwgQlVTWSwgT1RQLCBJRExFLCBBV0FZLCBCUkIsIE9GRkxJTkUsIE9QVF9NQVgKKyAgICB9OworCisgICAgc3RydWN0IG9wdCB7CisJaW50IGlkOworCWNoYXIgKm5hbWU7CisgICAgfSBvcHRzW10gPSB7CisJeyBBVkFJTEFCTEUsICJBdmFpbGFibGUiIH0sCisJeyBCVVNZLCAiQnVzeSJ9LAorCXsgT1RQLCAiT24gdGhlIHBob25lIn0sCisJeyBJRExFLCAiSWRsZSJ9LAorCXsgQVdBWSwgIkF3YXkifSwKKwl7IEJSQiwgIkJlIHJpZ2h0IGJhY2sifSwKKwl7IE9GRkxJTkUsICJPZmZsaW5lIn0KKyAgICB9OworCisgICAgcHJpbnRmKCJcbiIKKwkgICAiQ2hvaWNlczpcbiIpOworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUob3B0cyk7ICsraSkgeworCXByaW50ZigiICAlZCAgJXNcbiIsIG9wdHNbaV0uaWQrMSwgb3B0c1tpXS5uYW1lKTsKKyAgICB9CisKKyAgICBpZiAoIXNpbXBsZV9pbnB1dCgiU2VsZWN0IHN0YXR1cyIsIG1lbnVpbiwgc2l6ZW9mKG1lbnVpbikpKQorCXJldHVybjsKKworICAgIGNob2ljZSA9IGF0b2kobWVudWluKSAtIDE7CisgICAgaWYgKGNob2ljZSA8IDAgfHwgY2hvaWNlID49IE9QVF9NQVgpIHsKKwlwdXRzKCJJbnZhbGlkIHNlbGVjdGlvbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9iemVybygmZWxlbSwgc2l6ZW9mKGVsZW0pKTsKKyAgICBlbGVtLnR5cGUgPSBQSlJQSURfRUxFTUVOVF9UWVBFX1BFUlNPTjsKKworICAgIG9ubGluZV9zdGF0dXMgPSBQSl9UUlVFOworCisgICAgc3dpdGNoIChjaG9pY2UpIHsKKyAgICBjYXNlIEFWQUlMQUJMRToKKwlicmVhazsKKyAgICBjYXNlIEJVU1k6CisJZWxlbS5hY3Rpdml0eSA9IFBKUlBJRF9BQ1RJVklUWV9CVVNZOworCWVsZW0ubm90ZSA9IHBqX3N0cigiQnVzeSIpOworCWJyZWFrOworICAgIGNhc2UgT1RQOgorCWVsZW0uYWN0aXZpdHkgPSBQSlJQSURfQUNUSVZJVFlfQlVTWTsKKwllbGVtLm5vdGUgPSBwal9zdHIoIk9uIHRoZSBwaG9uZSIpOworCWJyZWFrOworICAgIGNhc2UgSURMRToKKwllbGVtLmFjdGl2aXR5ID0gUEpSUElEX0FDVElWSVRZX1VOS05PV047CisJZWxlbS5ub3RlID0gcGpfc3RyKCJJZGxlIik7CisJYnJlYWs7CisgICAgY2FzZSBBV0FZOgorCWVsZW0uYWN0aXZpdHkgPSBQSlJQSURfQUNUSVZJVFlfQVdBWTsKKwllbGVtLm5vdGUgPSBwal9zdHIoIkF3YXkiKTsKKwlicmVhazsKKyAgICBjYXNlIEJSQjoKKwllbGVtLmFjdGl2aXR5ID0gUEpSUElEX0FDVElWSVRZX1VOS05PV047CisJZWxlbS5ub3RlID0gcGpfc3RyKCJCZSByaWdodCBiYWNrIik7CisJYnJlYWs7CisgICAgY2FzZSBPRkZMSU5FOgorCW9ubGluZV9zdGF0dXMgPSBQSl9GQUxTRTsKKwlicmVhazsKKyAgICB9CisKKyAgICBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyKGN1cnJlbnRfYWNjLCBvbmxpbmVfc3RhdHVzLCAmZWxlbSk7Cit9CisKKy8qCisgKiBMaXN0IHRoZSBwb3J0cyBpbiBjb25mZXJlbmNlIGJyaWRnZQorICovCitzdGF0aWMgdm9pZCB1aV9jb25mX2xpc3QoKQoreworICAgIHVuc2lnbmVkIGksIGNvdW50OworICAgIHBqc3VhX2NvbmZfcG9ydF9pZCBpZFtQSlNVQV9NQVhfQ0FMTFNdOworCisgICAgcHJpbnRmKCJDb25mZXJlbmNlIHBvcnRzOlxuIik7CisKKyAgICBjb3VudCA9IFBKX0FSUkFZX1NJWkUoaWQpOworICAgIHBqc3VhX2VudW1fY29uZl9wb3J0cyhpZCwgJmNvdW50KTsKKworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwljaGFyIHR4bGlzdFtQSlNVQV9NQVhfQ0FMTFMqNCsxMF07CisJdW5zaWduZWQgajsKKwlwanN1YV9jb25mX3BvcnRfaW5mbyBpbmZvOworCisJcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvKGlkW2ldLCAmaW5mbyk7CisKKwl0eGxpc3RbMF0gPSAnXDAnOworCWZvciAoaj0wOyBqPGluZm8ubGlzdGVuZXJfY250OyArK2opIHsKKwkgICAgY2hhciBzWzEwXTsKKwkgICAgcGpfYW5zaV9zbnByaW50ZihzLCBzaXplb2YocyksICIjJWQgIiwgaW5mby5saXN0ZW5lcnNbal0pOworCSAgICBwal9hbnNpX3N0cmNhdCh0eGxpc3QsIHMpOworCX0KKwlwcmludGYoIlBvcnQgIyUwMmRbJTJkS0h6LyVkbXMvJWRdICUyMC4qcyAgdHJhbnNtaXR0aW5nIHRvOiAlc1xuIiwgCisJICAgICAgIGluZm8uc2xvdF9pZCwgCisJICAgICAgIGluZm8uY2xvY2tfcmF0ZS8xMDAwLAorCSAgICAgICBpbmZvLnNhbXBsZXNfcGVyX2ZyYW1lKjEwMDAvaW5mby5jaGFubmVsX2NvdW50L2luZm8uY2xvY2tfcmF0ZSwKKwkgICAgICAgaW5mby5jaGFubmVsX2NvdW50LAorCSAgICAgICAoaW50KWluZm8ubmFtZS5zbGVuLCAKKwkgICAgICAgaW5mby5uYW1lLnB0ciwKKwkgICAgICAgdHhsaXN0KTsKKworICAgIH0KKyAgICBwdXRzKCIiKTsKK30KKworc3RhdGljIHZvaWQgdWlfY29uZl9jb25uZWN0KGNoYXIgbWVudWluW10pCit7CisgICAgY2hhciB0bXBbMTBdLCBzcmNfcG9ydFsxMF0sIGRzdF9wb3J0WzEwXTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IGNudDsKKyAgICBjb25zdCBjaGFyICpzcmNfdGl0bGUsICpkc3RfdGl0bGU7CisKKyAgICBjbnQgPSBzc2NhbmYobWVudWluLCAiJXMgJXMgJXMiLCB0bXAsIHNyY19wb3J0LCBkc3RfcG9ydCk7CisKKyAgICBpZiAoY250ICE9IDMpIHsKKwl1aV9jb25mX2xpc3QoKTsKKworCXNyY190aXRsZSA9IChtZW51aW5bMV09PSdjJz8gIkNvbm5lY3Qgc3JjIHBvcnQgIyI6CisJCQkJICAgICAiRGlzY29ubmVjdCBzcmMgcG9ydCAjIik7CisJZHN0X3RpdGxlID0gKG1lbnVpblsxXT09J2MnPyAiVG8gZHN0IHBvcnQgIyI6IkZyb20gZHN0IHBvcnQgIyIpOworCisJaWYgKCFzaW1wbGVfaW5wdXQoc3JjX3RpdGxlLCBzcmNfcG9ydCwgc2l6ZW9mKHNyY19wb3J0KSkpCisJICAgIHJldHVybjsKKworCWlmICghc2ltcGxlX2lucHV0KGRzdF90aXRsZSwgZHN0X3BvcnQsIHNpemVvZihkc3RfcG9ydCkpKQorCSAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1lbnVpblsxXT09J2MnKSB7CisJc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KG15X2F0b2koc3JjX3BvcnQpLCBteV9hdG9pKGRzdF9wb3J0KSk7CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSBwanN1YV9jb25mX2Rpc2Nvbm5lY3QobXlfYXRvaShzcmNfcG9ydCksIG15X2F0b2koZHN0X3BvcnQpKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJcHV0cygiU3VjY2VzcyIpOworICAgIH0gZWxzZSB7CisJcHV0cygiRVJST1IhISIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfYWRqdXN0X3ZvbHVtZSgpCit7CisgICAgY2hhciBidWZbMTI4XTsKKyAgICBjaGFyIHRleHRbMTI4XTsKKyAgICBzcHJpbnRmKGJ1ZiwgIkFkanVzdCBtaWMgbGV2ZWw6IFslNC4xZnhdICIsIGFwcF9jb25maWcubWljX2xldmVsKTsKKyAgICBpZiAoc2ltcGxlX2lucHV0KGJ1Zix0ZXh0LHNpemVvZih0ZXh0KSkpIHsKKwljaGFyICplcnI7CisJYXBwX2NvbmZpZy5taWNfbGV2ZWwgPSAoZmxvYXQpc3RydG9kKHRleHQsICZlcnIpOworCXBqc3VhX2NvbmZfYWRqdXN0X3J4X2xldmVsKDAsIGFwcF9jb25maWcubWljX2xldmVsKTsKKyAgICB9CisgICAgc3ByaW50ZihidWYsICJBZGp1c3Qgc3BlYWtlciBsZXZlbDogWyU0LjFmeF0gIiwgYXBwX2NvbmZpZy5zcGVha2VyX2xldmVsKTsKKyAgICBpZiAoc2ltcGxlX2lucHV0KGJ1Zix0ZXh0LHNpemVvZih0ZXh0KSkpIHsKKwljaGFyICplcnI7CisJYXBwX2NvbmZpZy5zcGVha2VyX2xldmVsID0gKGZsb2F0KXN0cnRvZCh0ZXh0LCAmZXJyKTsKKwlwanN1YV9jb25mX2FkanVzdF90eF9sZXZlbCgwLCBhcHBfY29uZmlnLnNwZWFrZXJfbGV2ZWwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWlfZHVtcF9jYWxsX3F1YWxpdHkoKQoreworICAgIGlmIChjdXJyZW50X2NhbGwgIT0gUEpTVUFfSU5WQUxJRF9JRCkgeworCWxvZ19jYWxsX2R1bXAoY3VycmVudF9jYWxsKTsKKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJObyBjdXJyZW50IGNhbGwiKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1aV9kdW1wX2NvbmZpZ3VyYXRpb24oKQoreworICAgIGNoYXIgc2V0dGluZ3NbMjAwMF07CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IHdyaXRlX3NldHRpbmdzKCZhcHBfY29uZmlnLCBzZXR0aW5ncywgc2l6ZW9mKHNldHRpbmdzKSk7CisgICAgaWYgKGxlbiA8IDEpCisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBub3QgZW5vdWdoIGJ1ZmZlciIpKTsKKyAgICBlbHNlCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIkR1bXBpbmcgY29uZmlndXJhdGlvbiAoJWQgYnl0ZXMpOlxuJXNcbiIsCQorCQkgIGxlbiwgc2V0dGluZ3MpKTsJCit9CisKK3N0YXRpYyB2b2lkIHVpX3dyaXRlX3NldHRpbmdzKCkKK3sKKyAgICBjaGFyIHNldHRpbmdzWzIwMDBdOworICAgIGludCBsZW47CisgICAgY2hhciBidWZbMTI4XTsKKworICAgIGxlbiA9IHdyaXRlX3NldHRpbmdzKCZhcHBfY29uZmlnLCBzZXR0aW5ncywgc2l6ZW9mKHNldHRpbmdzKSk7CisgICAgaWYgKGxlbiA8IDEpCisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBub3QgZW5vdWdoIGJ1ZmZlciIpKTsKKyAgICBlbHNlIHsKKwlwal9vc2hhbmRsZV90IGZkOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCXN0YXR1cyA9IHBqX2ZpbGVfb3BlbihhcHBfY29uZmlnLnBvb2wsIGJ1ZiwgUEpfT19XUk9OTFksICZmZCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqc3VhX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gb3BlbiBmaWxlIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCSAgICBwal9zc2l6ZV90IHNpemUgPSBsZW47CisJICAgIHBqX2ZpbGVfd3JpdGUoZmQsIHNldHRpbmdzLCAmc2l6ZSk7CisJICAgIHBqX2ZpbGVfY2xvc2UoZmQpOworCisJICAgIHByaW50ZigiU2V0dGluZ3Mgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdG8gJyVzJ1xuIiwgYnVmKTsKKwl9CisgICAgfQorfQorCisvKgorICogRHVtcCBhcHBsaWNhdGlvbiBzdGF0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHVpX2FwcF9kdW1wKHBqX2Jvb2xfdCBkZXRhaWwpCit7CisgICAgcGpzdWFfZHVtcChkZXRhaWwpOworfQorCitzdGF0aWMgdm9pZCB1aV9jYWxsX3JlZGlyZWN0KGNoYXIgbWVudWluW10pCit7CisgICAgaWYgKGN1cnJlbnRfY2FsbCA9PSBQSlNVQV9JTlZBTElEX0lEKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGN1cnJlbnQgY2FsbCIpKTsKKyAgICB9IGVsc2UgeworCWlmICghcGpzdWFfY2FsbF9pc19hY3RpdmUoY3VycmVudF9jYWxsKSkgeworCSAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiQ2FsbCAlZCBoYXMgZ29uZSIsIGN1cnJlbnRfY2FsbCkpOworCX0gZWxzZSBpZiAobWVudWluWzFdID09ICdhJykgeworCSAgICBwanN1YV9jYWxsX3Byb2Nlc3NfcmVkaXJlY3QoY3VycmVudF9jYWxsLCAKKwkJUEpTSVBfUkVESVJFQ1RfQUNDRVBUX1JFUExBQ0UpOworCX0gZWxzZSBpZiAobWVudWluWzFdID09ICdBJykgeworCSAgICBwanN1YV9jYWxsX3Byb2Nlc3NfcmVkaXJlY3QoY3VycmVudF9jYWxsLCAKKwkJUEpTSVBfUkVESVJFQ1RfQUNDRVBUKTsKKwl9IGVsc2UgaWYgKG1lbnVpblsxXSA9PSAncicpIHsKKwkgICAgcGpzdWFfY2FsbF9wcm9jZXNzX3JlZGlyZWN0KGN1cnJlbnRfY2FsbCwKKwkJUEpTSVBfUkVESVJFQ1RfUkVKRUNUKTsKKwl9IGVsc2UgeworCSAgICBwanN1YV9jYWxsX3Byb2Nlc3NfcmVkaXJlY3QoY3VycmVudF9jYWxsLAorCQlQSlNJUF9SRURJUkVDVF9TVE9QKTsKKwl9CisgICAgfQorfQorCisvKgorICogTWFpbiAidXNlciBpbnRlcmZhY2UiIGxvb3AuCisgKi8KK3ZvaWQgbGVnYWN5X21haW4oKQoreyAgICAKKyAgICBjaGFyIG1lbnVpbls4MF07ICAgIAorICAgIGNoYXIgYnVmWzEyOF07ICAgIAorCisgICAga2V5c3Ryb2tlX2hlbHAoKTsKKworICAgIGZvciAoOzspIHsKKworCXByaW50ZigiPj4+ICIpOworCWZmbHVzaChzdGRvdXQpOworCisJaWYgKGZnZXRzKG1lbnVpbiwgc2l6ZW9mKG1lbnVpbiksIHN0ZGluKSA9PSBOVUxMKSB7CisJICAgIC8qIAorCSAgICAgKiBCZSBmcmllbmRseSB0byB1c2VycyB3aG8gcmVkaXJlY3QgY29tbWFuZHMgaW50bworCSAgICAgKiBwcm9ncmFtLCB3aGVuIGZpbGUgZW5kcywgcmVzdW1lIHdpdGgga2JkLgorCSAgICAgKiBJZiBleGl0IGlzIGRlc2lyZWQgZW5kIHNjcmlwdCB3aXRoIHEgZm9yIHF1aXQKKwkgICAgICovCisgCSAgICAvKiBSZW9wZW4gc3RkaW4vc3Rkb3V0L3N0ZGVyciB0byAvZGV2L2NvbnNvbGUgKi8KKyNpZiAoKGRlZmluZWQoUEpfV0lOMzIpICYmIFBKX1dJTjMyIT0wKSB8fCBcCisgICAgIChkZWZpbmVkKFBKX1dJTjY0KSAmJiBQSl9XSU42NCE9MCkpICYmIFwKKyAgKCFkZWZpbmVkKFBKX1dJTjMyX1dJTkNFKSB8fCBQSl9XSU4zMl9XSU5DRT09MCkKKwkgICAgaWYgKGZyZW9wZW4gKCJDT05JTiQiLCAiciIsIHN0ZGluKSA9PSBOVUxMKSB7CisjZWxzZQorCSAgICBpZiAoMSkgeworI2VuZGlmCisJCXB1dHMoIkNhbm5vdCBzd2l0Y2ggYmFjayB0byBjb25zb2xlIGZyb20gZmlsZSByZWRpcmVjdGlvbiIpOworCQltZW51aW5bMF0gPSAncSc7CisJCW1lbnVpblsxXSA9ICdcMCc7CisJICAgIH0gZWxzZSB7CisJCXB1dHMoIlN3aXRjaGVkIGJhY2sgdG8gY29uc29sZSBmcm9tIGZpbGUgcmVkaXJlY3Rpb24iKTsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisKKwlpZiAoY21kX2VjaG8pIHsKKwkgICAgcHJpbnRmKCIlcyIsIG1lbnVpbik7CisJfQorCisJLyogVXBkYXRlIGNhbGwgc2V0dGluZyAqLworCXBqc3VhX2NhbGxfc2V0dGluZ19kZWZhdWx0KCZjYWxsX29wdCk7CisJY2FsbF9vcHQuYXVkX2NudCA9IGFwcF9jb25maWcuYXVkX2NudDsKKwljYWxsX29wdC52aWRfY250ID0gYXBwX2NvbmZpZy52aWQudmlkX2NudDsKKworCXN3aXRjaCAobWVudWluWzBdKSB7CisKKwljYXNlICdtJzoKKwkgICAgLyogTWFrZSBjYWxsISA6ICovCisJICAgIHVpX21ha2VfbmV3X2NhbGwoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdNJzoKKwkgICAgLyogTWFrZSBtdWx0aXBsZSBjYWxscyEgOiAqLworCSAgICB1aV9tYWtlX211bHRpX2NhbGwoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICduJzoKKwkgICAgdWlfZGV0ZWN0X25hdF90eXBlKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAnaSc6CisJICAgIC8qIFNlbmQgaW5zdGFudCBtZXNzYWVnICovCisJICAgIHVpX3NlbmRfaW5zdGFudF9tZXNzYWdlKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAnYSc6CisJICAgIHVpX2Fuc3dlcl9jYWxsKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAnaCc6CisJICAgIHVpX2hhbmd1cF9jYWxsKG1lbnVpbik7CisJICAgIGJyZWFrOworCisJY2FzZSAnXSc6CisJY2FzZSAnWyc6CisJICAgIC8qCisJICAgICAqIEN5Y2xlIG5leHQvcHJldiBkaWFsb2cuCisJICAgICAqLworCSAgICB1aV9jeWNsZV9kaWFsb2cobWVudWluKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICc+JzoKKwljYXNlICc8JzoKKwkgICAgdWlfY3ljbGVfYWNjb3VudCgpOworCSAgICBicmVhazsKKworCWNhc2UgJysnOgorCSAgICBpZiAobWVudWluWzFdID09ICdiJykgeworCQl1aV9hZGRfYnVkZHkoKTsKKwkgICAgfSBlbHNlIGlmIChtZW51aW5bMV0gPT0gJ2EnKSB7CisJCXVpX2FkZF9hY2NvdW50KCZhcHBfY29uZmlnLnJ0cF9jZmcpOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIkludmFsaWQgaW5wdXQgJXNcbiIsIG1lbnVpbik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICctJzoKKwkgICAgaWYgKG1lbnVpblsxXSA9PSAnYicpIHsKKwkJdWlfZGVsZXRlX2J1ZGR5KCk7CisJICAgIH0gZWxzZSBpZiAobWVudWluWzFdID09ICdhJykgeworCQl1aV9kZWxldGVfYWNjb3VudCgpOworCSAgICB9IGVsc2UgeworCQlwcmludGYoIkludmFsaWQgaW5wdXQgJXNcbiIsIG1lbnVpbik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdIJzoKKwkgICAgLyoKKwkgICAgICogSG9sZCBjYWxsLgorCSAgICAgKi8KKwkgICAgdWlfY2FsbF9ob2xkKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAndic6CSAgICAKKyNpZiBQSlNVQV9IQVNfVklERU8KKwkgICAgaWYgKG1lbnVpblsxXT09J2knICYmIG1lbnVpblsyXT09J2QnICYmIG1lbnVpblszXT09JyAnKSB7CisJCXZpZF9oYW5kbGVfbWVudShtZW51aW4pOworCSAgICB9IGVsc2UKKyNlbmRpZgorCSAgICBpZiAoY3VycmVudF9jYWxsICE9IC0xKSB7CisJCS8qCisJCSAqIHJlLUlOVklURQorCQkgKi8KKwkJdWlfY2FsbF9yZWludml0ZSgpOworCSAgICB9IGVsc2UgeworCQlQSl9MT0coMywoVEhJU19GSUxFLCAiTm8gY3VycmVudCBjYWxsIikpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnVSc6CisJICAgIC8qCisJICAgICAqIFNlbmQgVVBEQVRFCisJICAgICAqLworCSAgICB1aV9zZW5kX3VwZGF0ZSgpOworCSAgICBicmVhazsKKworCWNhc2UgJ0MnOgorCSAgICBpZiAobWVudWluWzFdID09ICdwJykgeworCQl1aV9tYW5hZ2VfY29kZWNfcHJpbygpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAneCc6CisJICAgIC8qCisJICAgICAqIFRyYW5zZmVyIGNhbGwuCisJICAgICAqLworCSAgICB1aV9jYWxsX3RyYW5zZmVyKGFwcF9jb25maWcubm9fcmVmZXJzdWIpOworCSAgICBicmVhazsKKworCWNhc2UgJ1gnOgorCSAgICAvKgorCSAgICAgKiBUcmFuc2ZlciBjYWxsIHdpdGggcmVwbGFjZXMuCisJICAgICAqLworCSAgICB1aV9jYWxsX3RyYW5zZmVyX3JlcGxhY2VzKGFwcF9jb25maWcubm9fcmVmZXJzdWIpOworCSAgICBicmVhazsKKworCWNhc2UgJyMnOgorCSAgICAvKgorCSAgICAgKiBTZW5kIERUTUYgc3RyaW5ncy4KKwkgICAgICovCisJICAgIHVpX3NlbmRfZHRtZl8yODMzKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAnKic6CisJICAgIC8qIFNlbmQgRFRNRiB3aXRoIElORk8gKi8KKwkgICAgdWlfc2VuZF9kdG1mX2luZm8oKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdTJzoKKwkgICAgLyoKKwkgICAgICogU2VuZCBhcmJpdHJhcnkgcmVxdWVzdAorCSAgICAgKi8KKwkgICAgdWlfc2VuZF9hcmJpdHJhcnlfcmVxdWVzdCgpOworCSAgICBicmVhazsKKworCWNhc2UgJ2UnOgorCSAgICB1aV9lY2hvKG1lbnVpbik7CisJICAgIGJyZWFrOworCisJY2FzZSAncyc6CisJICAgIGlmIChwal9hbnNpX3N0cm5pY21wKG1lbnVpbiwgInNsZWVwIiwgNSk9PTApIHsKKwkJdWlfc2xlZXAobWVudWluKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgLyogQ29udGludWUgYmVsb3cgKi8KKworCWNhc2UgJ3UnOgorCSAgICAvKgorCSAgICAgKiBTdWJzY3JpYmUvdW5zdWJzY3JpYmUgcHJlc2VuY2UuCisJICAgICAqLworCSAgICB1aV9zdWJzY3JpYmUobWVudWluKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdyJzoKKwkgICAgdWlfcmVnaXN0ZXIobWVudWluKTsKKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgJ3QnOgorCSAgICB1aV90b2dnbGVfc3RhdGUoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdUJzoKKwkgICAgdWlfY2hhbmdlX29ubGluZV9zdGF0dXMoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdjJzoKKwkgICAgc3dpdGNoIChtZW51aW5bMV0pIHsKKwkgICAgY2FzZSAnbCc6CisJCXVpX2NvbmZfbGlzdCgpOworCQlicmVhazsKKwkgICAgY2FzZSAnYyc6CisJICAgIGNhc2UgJ2QnOgorCQl1aV9jb25mX2Nvbm5lY3QobWVudWluKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdWJzoKKwkgICAgLyogQWRqdXN0IGF1ZGlvIHZvbHVtZSAqLwkgICAgCisJICAgIHVpX2FkanVzdF92b2x1bWUoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgICAgaWYgKG1lbnVpblsxXSA9PSAnYycpIHsKKwkJdWlfZHVtcF9jb25maWd1cmF0aW9uKCk7CQorCSAgICB9IGVsc2UgaWYgKG1lbnVpblsxXSA9PSAncScpIHsKKwkJdWlfZHVtcF9jYWxsX3F1YWxpdHkoKTsKKwkgICAgfSBlbHNlIHsJCQorCQl1aV9hcHBfZHVtcChtZW51aW5bMV09PSdkJyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdmJzoKKwkgICAgaWYgKHNpbXBsZV9pbnB1dCgiRW50ZXIgb3V0cHV0IGZpbGVuYW1lIiwgYnVmLCBzaXplb2YoYnVmKSkpIHsKKwkJdWlfd3JpdGVfc2V0dGluZ3MoKTsJCQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnTCc6ICAgLyogUmVzdGFydCAqLworCWNhc2UgJ3EnOgorCSAgICBsZWdhY3lfb25fc3RvcHBlZChtZW51aW5bMF09PSdMJyk7CisJICAgIGdvdG8gb25fZXhpdDsKKworCWNhc2UgJ1InOgkgICAgCisJICAgIHVpX2NhbGxfcmVkaXJlY3QobWVudWluKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBpZiAobWVudWluWzBdICE9ICdcbicgJiYgbWVudWluWzBdICE9ICdccicpIHsKKwkJcHJpbnRmKCJJbnZhbGlkIGlucHV0ICVzIiwgbWVudWluKTsKKwkgICAgfQorCSAgICBrZXlzdHJva2VfaGVscCgpOworCSAgICBicmVhazsKKwl9CisgICAgfQorCitvbl9leGl0OgorICAgIDsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vYXBwbGljYXRpb24udWlkZXNpZ24gYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2FwcGxpY2F0aW9uLnVpZGVzaWduCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmYzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2FwcGxpY2F0aW9uLnVpZGVzaWduCkBAIC0wLDAgKzEsMTM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGRlc2lnbmVyRGF0YSB2ZXJzaW9uPSIxLjEuMCI+CisgIDxjb21wb25lbnRNYW5pZmVzdD4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DQWtuQXBwbGljYXRpb24iIHZlcnNpb249IjEuMS4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuTm9uTGF5b3V0QmFzZSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5Db21tb25CYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNBa25Eb2N1bWVudCIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DQWtuVmlld0FwcFVpIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNBa25BcHBVaSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DQWtuQXBwVWlCYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkRlc2lnblRpbWVDb250YWluZXIiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuU3RhdHVzUGFuZSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5Db250cm9sQmFzZSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5TdGF0dXNQYW5lQ2FwdGlvbiIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5TdGF0dXNQYW5lVGl0bGVCYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNCQSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DQkFCYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkF2a29uVmlld1JlZmVyZW5jZSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5EZXNpZ25SZWZlcmVuY2UiIHZlcnNpb249IjEuMC4wIi8+CisgIDwvY29tcG9uZW50TWFuaWZlc3Q+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5zeW1iaWFuLmRtLlJFU09VUkNFX0RJUkVDVE9SWV9JRCI+ZGF0YTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi52ZXJzaW9uIj4zLjIuMDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi52ZW5kb3IiPmNvbS5ub2tpYS5zZXJpZXM2MDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5zeW1iaWFuLmRtLkNPTVBPTkVOVF9QUk9WSURFUiI+Y29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi5TeW1iaWFuLVByb3ZpZGVyPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uSU5DTFVERV9ESVJFQ1RPUllfSUQiPmluYzwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5zeW1iaWFuLmRtLlJPT1RfQ09OVEFJTkVSIj5wanN1YUFwcFVpPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uU09VUkNFX0RJUkVDVE9SWV9JRCI+c3JjPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uUk9PVF9BUFBMSUNBVElPTl9OQU1FIj5wanN1YTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5zeW1iaWFuLmRtLlNPVVJDRUdFTl9QUk9WSURFUiI+Y29tLm5va2lhLnNkdC5zb3VyY2VnZW4uU3ltYmlhbi1Qcm92aWRlcjwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBpZD0iY29tLm5va2lhLnNkdC5zeW1iaWFuLmRtLkJVSUxEX0RJUkVDVE9SWV9JRCI+Z3JvdXA8L3Byb3BlcnR5PgorICA8Y29tcG9uZW50IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNBa25BcHBsaWNhdGlvbiI+CisgICAgPHByb3BlcnR5IGlkPSJjbGFzc05hbWUiPkNwanN1YUFwcGxpY2F0aW9uPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgaWQ9ImRvY3VtZW50QmFzZSI+cGpzdWE8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBpZD0ibmFtZSI+cGpzdWFBcHBsaWNhdGlvbjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IGlkPSJ1aWQiPjB4RTQ0QzJEMDI8L3Byb3BlcnR5PgorICAgIDxjb21wb25lbnQgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0FrbkRvY3VtZW50Ij4KKyAgICAgIDxwcm9wZXJ0eSBpZD0iY2xhc3NOYW1lIj5DcGpzdWFEb2N1bWVudDwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgaWQ9Im5hbWUiPnBqc3VhRG9jdW1lbnQ8L3Byb3BlcnR5PgorICAgICAgPGNvbXBvbmVudCBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DQWtuVmlld0FwcFVpIj4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJpbml0aWFsRGVzaWduIiB0eXBlPSJjb21wb25lbnRSZWYiPmFrblZpZXdSZWZlcmVuY2UxPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJjbGFzc05hbWUiPkNwanN1YUFwcFVpPC9wcm9wZXJ0eT4KKyAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9ImxvY2F0aW9uIj4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9IngiPjUxPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9InkiPjQ0PC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9Im5hbWUiPnBqc3VhQXBwVWk8L3Byb3BlcnR5PgorICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ic2l6ZSI+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJ3aWR0aCI+MjQwPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9ImhlaWdodCI+MzIwPC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8Y29tcG9uZW50IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLlN0YXR1c1BhbmUiPgorICAgICAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJsb2NhdGlvbiI+CisgICAgICAgICAgICA8cHJvcGVydHkgaWQ9IngiPjIwPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5zdGF0dXNQYW5lPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ic2l6ZSI+CisgICAgICAgICAgICA8cHJvcGVydHkgaWQ9IndpZHRoIj4yMDQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJoZWlnaHQiPjYzPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICAgICAgPGNvbXBvbmVudCBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5TdGF0dXNQYW5lQ2FwdGlvbiI+CisgICAgICAgICAgICA8cHJvcGVydHkgaWQ9InNob3J0Q2FwdGlvbiIgdHlwZT0iaTE4biI+U1RSX3Bqc3VhQXBwbGljYXRpb25fNTwvcHJvcGVydHk+CisgICAgICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ibG9jYXRpb24iPgorICAgICAgICAgICAgICA8cHJvcGVydHkgaWQ9IngiPjU2PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0ibG9uZ0NhcHRpb24iIHR5cGU9ImkxOG4iPlNUUl9wanN1YUFwcGxpY2F0aW9uXzQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5jYXB0aW9uPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJzaXplIj4KKyAgICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJ3aWR0aCI+MTQ4PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJoZWlnaHQiPjQzPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgICAgICA8L2NvbXBvbmVudD4KKyAgICAgICAgPC9jb21wb25lbnQ+CisgICAgICAgIDxjb21wb25lbnQgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0JBIj4KKyAgICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ibG9jYXRpb24iPgorICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJ5Ij4yODg8L3Byb3BlcnR5PgorICAgICAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0iaW5mbyI+CisgICAgICAgICAgICA8cHJvcGVydHkgaWQ9ImxlZnRUZXh0IiB0eXBlPSJpMThuIj5TVFJfcGpzdWFBcHBsaWNhdGlvbl8xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0icmlnaHRUZXh0IiB0eXBlPSJpMThuIj5TVFJfcGpzdWFBcHBsaWNhdGlvbl8yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0ibWlkZGxlVGV4dCIgdHlwZT0iaTE4biI+U1RSX3Bqc3VhQXBwbGljYXRpb25fMzwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgaWQ9ImxlZnRJZCI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0icmlnaHRJZCI+RUFrblNvZnRrZXlCYWNrPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0idHlwZSI+Ul9BVktPTl9TT0ZUS0VZU19FWElUPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5jb250cm9sUGFuZTwvcHJvcGVydHk+CisgICAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9InNpemUiPgorICAgICAgICAgICAgPHByb3BlcnR5IGlkPSJ3aWR0aCI+MjQwPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBpZD0iaGVpZ2h0Ij4zMjwvcHJvcGVydHk+CisgICAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8L2NvbXBvbmVudD4KKyAgICAgICAgPGNvbXBvbmVudCBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5BdmtvblZpZXdSZWZlcmVuY2UiPgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0iZmlsZVBhdGgiPnBqc3VhQ29udGFpbmVyLnVpZGVzaWduPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0idGFiSW1hZ2UiLz4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9ImJhc2VOYW1lIj5wanN1YUNvbnRhaW5lcjwvcHJvcGVydHk+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5ha25WaWV3UmVmZXJlbmNlMTwvcHJvcGVydHk+CisgICAgICAgIDwvY29tcG9uZW50PgorICAgICAgPC9jb21wb25lbnQ+CisgICAgPC9jb21wb25lbnQ+CisgIDwvY29tcG9uZW50PgorICA8c3RyaW5nQnVuZGxlPgorICAgIDxzdHJpbmdUYWJsZSBsYW5ndWFnZT0iTEFOR19FbmdsaXNoIj4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUFwcGxpY2F0aW9uXzEiLz4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUFwcGxpY2F0aW9uXzIiLz4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUFwcGxpY2F0aW9uXzMiLz4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUFwcGxpY2F0aW9uXzQiPnBqc3VhPC9zdHJpbmc+CisgICAgICA8c3RyaW5nIGlkPSJTVFJfcGpzdWFBcHBsaWNhdGlvbl81Ij5wanN1YTwvc3RyaW5nPgorICAgIDwvc3RyaW5nVGFibGU+CisgIDwvc3RyaW5nQnVuZGxlPgorICA8bWFjcm9UYWJsZS8+CisgIDxzb3VyY2VNYXBwaW5nU3RhdGU+CisgICAgPHJlc291cmNlTWFwcGluZ3M+CisgICAgICA8cmVzb3VyY2VNYXBwaW5nIGluc3RhbmNlTmFtZT0icGpzdWFBcHBVaSI+cl9hcHBsaWNhdGlvbl9wanN1YV9hcHBfdWk8L3Jlc291cmNlTWFwcGluZz4KKyAgICAgIDxyZXNvdXJjZU1hcHBpbmcgaW5zdGFuY2VOYW1lPSJzdGF0dXNQYW5lIj5yX2FwcGxpY2F0aW9uX3N0YXR1c19wYW5lPC9yZXNvdXJjZU1hcHBpbmc+CisgICAgICA8cmVzb3VyY2VNYXBwaW5nIGluc3RhbmNlTmFtZT0icGpzdWFBcHBVaSIgcnNyY0lkPSJsb2NhbGlzYWJsZV9hcHBfaW5mbyI+cl9sb2NhbGlzYWJsZV9hcHBfaW5mbzwvcmVzb3VyY2VNYXBwaW5nPgorICAgICAgPHJlc291cmNlTWFwcGluZyBpbnN0YW5jZU5hbWU9ImFrblZpZXdSZWZlcmVuY2UxIiByc3JjSWQ9InRhYlRleHQiPnJfYXBwbGljYXRpb25fYWtuX3ZpZXdfcmVmZXJlbmNlMTwvcmVzb3VyY2VNYXBwaW5nPgorICAgIDwvcmVzb3VyY2VNYXBwaW5ncz4KKyAgICA8ZW51bU1hcHBpbmdzPgorICAgICAgPGVudW1NYXBwaW5nIGluc3RhbmNlTmFtZT0iYWtuVmlld1JlZmVyZW5jZTEiIHByb3BlcnR5SWQ9IiIgbmFtZUFsZ29yaXRobT0iY29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi5OQU1FX0FMR19WSUVXX1VJRCI+RVBqc3VhQ29udGFpbmVyVmlld0lkPC9lbnVtTWFwcGluZz4KKyAgICA8L2VudW1NYXBwaW5ncz4KKyAgICA8YXJyYXlNYXBwaW5ncy8+CisgIDwvc291cmNlTWFwcGluZ1N0YXRlPgorICA8Z2VuZXJhdGVkRmlsZXM+CisgICAgPGZpbGU+c3JjL3Bqc3VhYXBwbGljYXRpb24uY3BwPC9maWxlPgorICAgIDxmaWxlPnNyYy9wanN1YWNvbnRhaW5lcnZpZXcuY3BwPC9maWxlPgorICAgIDxmaWxlPnNyYy9wanN1YWRvY3VtZW50LmNwcDwvZmlsZT4KKyAgICA8ZmlsZT5pbmMvcGpzdWFkb2N1bWVudC5oPC9maWxlPgorICAgIDxmaWxlPmluYy9wanN1YWNvbnRhaW5lcnZpZXcuaDwvZmlsZT4KKyAgICA8ZmlsZT5pbmMvcGpzdWFhcHB1aS5oPC9maWxlPgorICAgIDxmaWxlPmluYy9wanN1YWFwcGxpY2F0aW9uLmg8L2ZpbGU+CisgICAgPGZpbGU+c3JjL3Bqc3VhYXBwdWkuY3BwPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWEucnNzPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWFjb250YWluZXIucnNzaTwvZmlsZT4KKyAgICA8ZmlsZT5pbmMvcGpzdWEuaHJoPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWEubG9jPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWEubDAxPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWFjb250YWluZXIubG9jPC9maWxlPgorICAgIDxmaWxlPmRhdGEvcGpzdWFjb250YWluZXIubDAxPC9maWxlPgorICA8L2dlbmVyYXRlZEZpbGVzPgorPC9kZXNpZ25lckRhdGE+CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWEubDAxIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhLmwwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg1NWJjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhLmwwMQpAQCAtMCwwICsxLDE0IEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBwanN1YS5sMDEKKyBBdXRob3IgICAgICA6IG5hbmFuZworIENvcHlyaWdodCAgIDogQ29weXJpZ2h0IChDKSAyMDEzIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorIERlc2NyaXB0aW9uIDogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvLyBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgbGFuZ3VhZ2U6IFVLIEVuZ2xpc2ggKDAxKQorI2RlZmluZSBTVFJfcGpzdWFBcHBsaWNhdGlvbl80ICJwanN1YSIKKyNkZWZpbmUgU1RSX3Bqc3VhQXBwbGljYXRpb25fNSAicGpzdWEiCisjZGVmaW5lIFNUUl9wanN1YUFwcGxpY2F0aW9uXzEgIiIKKyNkZWZpbmUgU1RSX3Bqc3VhQXBwbGljYXRpb25fMiAiIgorI2RlZmluZSBTVFJfcGpzdWFBcHBsaWNhdGlvbl8zICIiCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWEubG9jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhLmxvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDhkNmMxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhLmxvYwpAQCAtMCwwICsxLDExIEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBwanN1YS5sb2MKKyBBdXRob3IgICAgICA6IG5hbmFuZworIENvcHlyaWdodCAgIDogQ29weXJpZ2h0IChDKSAyMDEzIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorIERlc2NyaXB0aW9uIDogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgTEFOR1VBR0VfMDEKKyNpbmNsdWRlICJwanN1YS5sMDEiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YS5yc3MgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWEucnNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDMxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWEucnNzCkBAIC0wLDAgKzEsNDYgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhLnJzcworIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05BTUUgUEpTVQorCisjaW5jbHVkZSA8YXZrb24ucnNnPgorI2luY2x1ZGUgPGF2a29uLnJoPgorI2luY2x1ZGUgPGVpa29uLnJoPgorI2luY2x1ZGUgPGFwcGluZm8ucmg+CisjaW5jbHVkZSAicGpzdWEuaHJoIgorI2luY2x1ZGUgInBqc3VhLmxvYyIKKworUkVTT1VSQ0UgUlNTX1NJR05BVFVSRQorCXsKKwl9CitSRVNPVVJDRSBUQlVGCisJeworCWJ1ZiA9ICJwanN1YSI7CisJfQorUkVTT1VSQ0UgRUlLX0FQUF9JTkZPIHJfYXBwbGljYXRpb25fcGpzdWFfYXBwX3VpCisJeworCWNiYSA9IFJfQVZLT05fU09GVEtFWVNfRVhJVDsKKwlzdGF0dXNfcGFuZSA9IHJfYXBwbGljYXRpb25fc3RhdHVzX3BhbmU7CisJfQorUkVTT1VSQ0UgU1RBVFVTX1BBTkVfQVBQX01PREVMIHJfYXBwbGljYXRpb25fc3RhdHVzX3BhbmUKKwl7CisJfQorUkVTT1VSQ0UgTE9DQUxJU0FCTEVfQVBQX0lORk8gcl9sb2NhbGlzYWJsZV9hcHBfaW5mbworCXsKKwlzaG9ydF9jYXB0aW9uID0gU1RSX3Bqc3VhQXBwbGljYXRpb25fNTsKKwljYXB0aW9uX2FuZF9pY29uID0gQ0FQVElPTl9BTkRfSUNPTl9JTkZPCisJCXsKKwkJY2FwdGlvbiA9IFNUUl9wanN1YUFwcGxpY2F0aW9uXzQ7CisJCW51bWJlcl9vZl9pY29ucyA9IDA7CisJCX07CisJfQorUkVTT1VSQ0UgVEJVRiByX2FwcGxpY2F0aW9uX2Frbl92aWV3X3JlZmVyZW5jZTEKKwl7CisJfQorCisjaW5jbHVkZSAicGpzdWFDb250YWluZXIucnNzaSIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YUNvbnRhaW5lci5sMDEgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWFDb250YWluZXIubDAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjI4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWFDb250YWluZXIubDAxCkBAIC0wLDAgKzEsMTQgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQ29udGFpbmVyLmwwMQorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8vIGxvY2FsaXplZCBzdHJpbmdzIGZvciBsYW5ndWFnZTogVUsgRW5nbGlzaCAoMDEpCisjZGVmaW5lIFNUUl9wanN1YUNvbnRhaW5lclZpZXdfMiAiIgorI2RlZmluZSBTVFJfcGpzdWFDb250YWluZXJWaWV3XzMgIiIKKyNkZWZpbmUgU1RSX3Bqc3VhQ29udGFpbmVyVmlld180ICJwanN1YUNvbnRhaW5lciIKKyNkZWZpbmUgU1RSX3Bqc3VhQ29udGFpbmVyVmlld18xICIiCisjZGVmaW5lIFNUUl9wanN1YUNvbnRhaW5lclZpZXdfNSAiUGxlYXNlIHdhaXQuLiIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YUNvbnRhaW5lci5sb2MgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWFDb250YWluZXIubG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWMxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWFDb250YWluZXIubG9jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQ29udGFpbmVyLmxvYworIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBMQU5HVUFHRV8wMQorI2luY2x1ZGUgInBqc3VhQ29udGFpbmVyLmwwMSIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhQ29udGFpbmVyLnJzc2kgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2RhdGEvcGpzdWFDb250YWluZXIucnNzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2ZjMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhQ29udGFpbmVyLnJzc2kKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgInBqc3VhQ29udGFpbmVyLmxvYyIKKworUkVTT1VSQ0UgQVZLT05fVklFVyByX3Bqc3VhX2NvbnRhaW5lcl9wanN1YV9jb250YWluZXJfdmlldworCXsKKwljYmEgPSBSX0FWS09OX1NPRlRLRVlTX0VYSVQ7CisJdG9vbGJhciA9IDA7CisJfQorUkVTT1VSQ0UgU1RBVFVTX1BBTkVfQVBQX01PREVMIHJfcGpzdWFfY29udGFpbmVyX3N0YXR1c19wYW5lCisJeworCXBhbmVzID0KKwkJeworCQlTUEFORV9QQU5FCisJCQl7CisJCQlpZCA9IEVFaWtTdGF0dXNQYW5lVWlkVGl0bGU7CisJCQl0eXBlID0gRUFrbkN0VGl0bGVQYW5lOworCQkJcmVzb3VyY2UgPSByX3Bqc3VhX2NvbnRhaW5lcl90aXRsZV9yZXNvdXJjZTsKKwkJCX0KKwkJfTsKKwl9CitSRVNPVVJDRSBUSVRMRV9QQU5FIHJfcGpzdWFfY29udGFpbmVyX3RpdGxlX3Jlc291cmNlCisJeworCXR4dCA9IFNUUl9wanN1YUNvbnRhaW5lclZpZXdfNDsKKwl9CitSRVNPVVJDRSBMQUJFTCByX3Bqc3VhX2NvbnRhaW5lcl9sYWJlbDEKKwl7CisJdHh0ID0gU1RSX3Bqc3VhQ29udGFpbmVyVmlld181OworCWhvcml6X2FsaWduID0gRUVpa0xhYmVsQWxpZ25IQ2VudGVyOworCX0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YV9yZWcubG9jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhX3JlZy5sb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5OWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YV9yZWcubG9jCkBAIC0wLDAgKzEsMTEgQEAKKy8vICBMT0NBTElTQVRJT04gU1RSSU5HUworCisvLyBDYXB0aW9uIHN0cmluZyBmb3IgYXBwLgorI2RlZmluZSBxdG5fY2FwdGlvbl9zdHJpbmcgInBqc3VhIgorCisvLyBTaG9ydCBjYXB0aW9uIHN0cmluZyBmb3IgYXBwLgorI2RlZmluZSBxdG5fc2hvcnRfY2FwdGlvbl9zdHJpbmcgIkhXIgorCisjZGVmaW5lIHF0bl9sb2NfcmVzb3VyY2VfZmlsZV8xICJcXHJlc291cmNlXFxhcHBzXFxwanN1YSIKKworLy8gRW5kIG9mIEZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YV9yZWcucnNzIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9kYXRhL3Bqc3VhX3JlZy5yc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxYTAwYgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZGF0YS9wanN1YV9yZWcucnNzCkBAIC0wLDAgKzEsMjEgQEAKKworI2luY2x1ZGUgPGVpa29uLnJoPgorI2luY2x1ZGUgPGF2a29uLnJzZz4KKyNpbmNsdWRlIDxhdmtvbi5yaD4KKyNpbmNsdWRlIDxhcHBpbmZvLnJoPgorI2luY2x1ZGUgInBqc3VhX3JlZy5sb2MiCisjaW5jbHVkZSA8cGpzdWEucnNnPgorCitVSUQyIEtVaWRBcHBSZWdpc3RyYXRpb25SZXNvdXJjZUZpbGUKK1VJRDMgMHhFNDRDMkQwMgorCitSRVNPVVJDRSBBUFBfUkVHSVNUUkFUSU9OX0lORk8KKwl7CisJYXBwX2ZpbGU9InBqc3VhIjsKKwlsb2NhbGlzYWJsZV9yZXNvdXJjZV9maWxlID0gIHF0bl9sb2NfcmVzb3VyY2VfZmlsZV8xOworCWxvY2FsaXNhYmxlX3Jlc291cmNlX2lkID0gUl9MT0NBTElTQUJMRV9BUFBfSU5GTzsKKworCWVtYmVkZGFiaWxpdHk9S0FwcE5vdEVtYmVkZGFibGU7CisJbmV3ZmlsZT1LQXBwRG9lc05vdFN1cHBvcnROZXdGaWxlOworCX0KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbGlzdF9pY29uLmJtcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ2Z4L2xpc3RfaWNvbi5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3NGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ2Z4L2xpc3RfaWNvbi5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbGlzdF9pY29uX21hc2suYm1wIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbGlzdF9pY29uX21hc2suYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjA1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dmeC9saXN0X2ljb25fbWFzay5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbWFya19pY29uLmJtcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ2Z4L21hcmtfaWNvbi5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1NzFlMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ2Z4L21hcmtfaWNvbi5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbWFya19pY29uX21hc2suYm1wIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvbWFya19pY29uX21hc2suYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODc0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dmeC9tYXJrX2ljb25fbWFzay5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvcGpzdWEuYm1wIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvcGpzdWEuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzIwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dmeC9wanN1YS5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvcWduX21lbnVfcGpzdWEuc3ZnIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9nZngvcWduX21lbnVfcGpzdWEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGE2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dmeC9xZ25fbWVudV9wanN1YS5zdmcKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMSBUaW55Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLXRpbnkuZHRkIj4NCis8c3ZnIGJhc2VQcm9maWxlPSJ0aW55IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgODggODcuOTk5Ij4NCis8Zz4NCis8Zz4NCis8Zz4NCis8Zz4NCis8cmVjdCBmaWxsPSJub25lIiB3aWR0aD0iODgiIGhlaWdodD0iODcuOTk5Ii8+DQorPC9nPg0KKzwvZz4NCis8Zz4NCis8bGluZWFyR3JhZGllbnQgaWQ9IlhNTElEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyLjMwNDIiIHkxPSIxOC4zNzk5IiB4Mj0iNjMuNDExMyIgeTI9Ijc5LjI4NyI+DQorPHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojQjNEREZGIi8+DQorPHN0b3Agb2Zmc2V0PSIwLjgxNDYiIHN0eWxlPSJzdG9wLWNvbG9yOiMwODQyOTYiLz4NCis8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwODQyOTYiLz4NCis8L2xpbmVhckdyYWRpZW50Pg0KKzxwYXRoIGZpbGw9InVybCgjWE1MSURfN18pIiBkPSJNMzIuMTM1LDcuNDE1TDE0LjM2MywxNy40MzJ2MjMuMTY3YzAsMCw4LjkyNiwxNS4zNTEsMTAuNDY4LDE4LjAwMSAgICAgICBjLTIuMzg2LDEuNzA0LTE1LjQ0LDExLjAzLTE1LjQ0LDExLjAzbDIxLjYxMywxMi42NTJjMCwwLDEyLjkwNy05Ljg1LDE0LjcxLTExLjIyNmMxLjk3OSwxLjEwOSwxNi4yMzEsOS4xMDEsMTYuMjMxLDkuMTAxICAgICAgIGwxNi42NjQtMTUuMTMyYzAsMC0xNC4wNjYtNi45MjktMTYuODg4LTguMzE4YzEuNDY3LTMuMDEsMTAuNTMxLTIxLjYwNCwxMC41MzEtMjEuNjA0bC0yMi4yOTgtOS41OSAgICAgICBjMCwwLTEuNDg2LDMuMTczLTIuMDkzLDQuNDY3Yy0yLjA0Ni0wLjg4LTYuNTczLTIuODI2LTYuNTczLTIuODI2cy0zLjcxMywyLjQ2My01LjY5NiwzLjc3OCAgICAgICBjLTAuMzI3LTAuNzQ0LTAuNTQyLTEuMjMzLTAuNjU3LTEuNDk1YzAuMDA3LTAuODI0LDAuMjEzLTIzLjcyLDAuMjEzLTIzLjcyTDMyLjEzNSw3LjQxNXoiLz4NCis8bGluZWFyR3JhZGllbnQgaWQ9IlhNTElEXzhfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjQwLjgyNzYiIHkxPSI1Mi4xOTE0IiB4Mj0iMTYuMTk5NyIgeTI9IjIxLjEzNTMiPg0KKzxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzVBQTdFMCIvPg0KKzxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzMzNjZDQyIvPg0KKzwvbGluZWFyR3JhZGllbnQ+DQorPHBvbHlnb24gZmlsbD0idXJsKCNYTUxJRF84XykiIHBvaW50cz0iNTkuMDUxLDU3LjYyMSA2OS41MzYsMzYuMTExIDUwLjk0NCwyOC4xMTUgNDguODUyLDMyLjU4MSA0MS40OTMsMjkuNDE4IDM0LjcxOSwzMy45MTEgICAgICAgIDMyLjkzMiwyOS44NDkgMzMuMTE3LDkuMTU3IDE2LjM2MywxOC42MDEgMTYuMzYzLDQwLjA2IDI3LjQ3Niw1OS4xNjkgMTMuMDY0LDY5LjQ2MyAzMC44NTYsNzkuODc5IDQ1LjU0Niw2OC42NjkgICAgICAgIDYxLjY2Nyw3Ny43MDggNzUuMDg5LDY1LjUyMSAiLz4NCis8bGluZWFyR3JhZGllbnQgaWQ9IlhNTElEXzlfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjYwLjU4NSIgeTE9IjMxLjg3NiIgeDI9IjUzLjg1ODIiIHkyPSI0NS4xMTI1Ij4NCis8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiM1QUE3RTAiLz4NCis8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzY2Q0MiLz4NCis8L2xpbmVhckdyYWRpZW50Pg0KKzxwb2x5Z29uIGZpbGw9InVybCgjWE1MSURfOV8pIiBwb2ludHM9IjQxLjI2LDQ4Ljc4MyA1MC45NDQsMjguMTE1IDY5LjUzNiwzNi4xMTEgNTkuMDUxLDU3LjYyMSAiLz4NCis8cG9seWdvbiBmaWxsPSIjMDA0NkI3IiBwb2ludHM9IjE2LjM2Myw0MC4wNiAyNy40NzYsNTkuMTY5IDQxLjI2LDQ4Ljc4MyAzMi45MzIsMjkuODQ5ICIvPg0KKzxwb2x5Z29uIGZpbGw9IiMzMzY2Q0MiIHBvaW50cz0iMTYuMzYzLDQwLjA2IDE2LjM2MywxOC42MDEgMzMuMTE3LDkuMTU3IDMyLjkzMiwyOS44NDkgIi8+DQorPHBvbHlnb24gZmlsbD0iI0NGRUNGRiIgcG9pbnRzPSIyNi42OTYsMzkuMjMgNDEuNDkzLDI5LjQxOCA1OS41MjMsMzcuMTY4IDQ1LjU0Niw0Ny45NTQgIi8+DQorPHBhdGggZmlsbD0iIzVBQTdFMCIgZD0iTTQxLjk1NCw1NS4yODYiLz4NCis8cG9seWdvbiBmaWxsPSIjMzM2NkNDIiBwb2ludHM9IjI2LjY5NiwzOS4yMyAyNy40NzYsNTkuMTY5IDQ1LjU0Niw2OC42NjkgNDUuNTQ2LDQ3Ljk1NCAiLz4NCis8cG9seWdvbiBmaWxsPSIjNUFBN0UwIiBwb2ludHM9IjEzLjA2NCw2OS40NjMgMjcuNDc2LDU5LjE2OSA0NS41NDYsNjguNjY5IDMwLjg1Niw3OS44NzkgIi8+DQorPGxpbmVhckdyYWRpZW50IGlkPSJYTUxJRF8xMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjkuMjA4NSIgeTE9IjYzLjY4MzYiIHgyPSI0OC43MTAyIiB5Mj0iNTYuMTk3NiI+DQorPHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojNUFBN0UwIi8+DQorPHN0b3Agb2Zmc2V0PSIwLjAwNTYiIHN0eWxlPSJzdG9wLWNvbG9yOiM1QUE3RTAiLz4NCis8c3RvcCBvZmZzZXQ9IjAuODUiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzY2Q0MiLz4NCis8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzY2Q0MiLz4NCis8L2xpbmVhckdyYWRpZW50Pg0KKzxwb2x5Z29uIGZpbGw9InVybCgjWE1MSURfMTBfKSIgcG9pbnRzPSI0My40MjMsNDYuOTcxIDI3LjQ3Niw1OS4xNjkgNDUuNTQ2LDY4LjY2OSA0NS41NDYsNDcuOTU0ICIvPg0KKzxwb2x5Z29uIGZpbGw9IiMwMDQ2QjciIHBvaW50cz0iNDUuNTQ2LDQ3Ljk1NCA0NS41NDYsNjguNjY5IDU5LjA1MSw1Ny42MjEgNTkuNTIzLDM3LjE2OCAiLz4NCis8bGluZWFyR3JhZGllbnQgaWQ9IlhNTElEXzExXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0NS4zOTM2IiB5MT0iNTkuNTE4NiIgeDI9IjU5LjA1MDgiIHkyPSI1OS41MTg2Ij4NCis8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDQ2QjciLz4NCis8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzY2Q0MiLz4NCis8L2xpbmVhckdyYWRpZW50Pg0KKzxwb2x5Z29uIGZpbGw9InVybCgjWE1MSURfMTFfKSIgcG9pbnRzPSI0NS4zOTQsNTAuMzY4IDQ1LjU0Niw2OC42NjkgNTkuMDUxLDU3LjYyMSAiLz4NCis8bGluZWFyR3JhZGllbnQgaWQ9IlhNTElEXzEyXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI2MC44OTQ1IiB5MT0iNjguNjgwNyIgeDI9IjU3LjI5NTMiIHkyPSI1OC43OTIiPg0KKzxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzVBQTdFMCIvPg0KKzxzdG9wIG9mZnNldD0iMC40MTAxIiBzdHlsZT0ic3RvcC1jb2xvcjojNUFBN0UwIi8+DQorPHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMzM2NkNDIi8+DQorPC9saW5lYXJHcmFkaWVudD4NCis8cG9seWdvbiBmaWxsPSJ1cmwoI1hNTElEXzEyXykiIHBvaW50cz0iNjEuNjY3LDc3LjcwOCA0NS41NDYsNjguNjY5IDU5LjA1MSw1Ny42MjEgNzUuMDg5LDY1LjUyMSAiLz4NCis8L2c+DQorPC9nPg0KKzwvZz4NCis8L3N2Zz4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dyb3VwL0FCTEQuQkFUIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9ncm91cC9BQkxELkJBVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM4YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9ncm91cC9BQkxELkJBVApAQCAtMCwwICsxLDE1IEBACitARUNITyBPRkYKKworUkVNIEJsZG1ha2UtZ2VuZXJhdGVkIGJhdGNoIGZpbGUgLSBBQkxELkJBVAorUkVNICoqIERPIE5PVCBFRElUICoqCisKK3BlcmwgLVMgQUJMRC5QTCAiXFVzZXJzXFRlbHV1XHBqc2lwXHRydW5rXHBqc2lwLWFwcHNcc3JjXHBqc3VhXHN5bWJpYW5cZ3JvdXBcXCIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKK2lmIGVycm9ybGV2ZWw9PTEgZ290byBDaGVja1BlcmwKK2dvdG8gRW5kCisKKzpDaGVja1BlcmwKK3BlcmwgLXYgPk5VTAoraWYgZXJyb3JsZXZlbD09MSBlY2hvIElzIFBlcmwsIHZlcnNpb24gNS4wMDNfMDcgb3IgbGF0ZXIsIGluc3RhbGxlZD8KK2dvdG8gRW5kCisKKzpFbmQKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ3JvdXAvYmxkLmluZiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ3JvdXAvYmxkLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM2ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9ncm91cC9ibGQuaW5mCkBAIC0wLDAgKzEsMjYgQEAKKworUFJKX1BMQVRGT1JNUworV0lOU0NXIEFSTVY1IEdDQ0UKKworCisjaWZkZWYgU0JTVjIKKworUFJKX0VYVEVOU0lPTlMKKwkKKwlTVEFSVCBFWFRFTlNJT04gczYwL21pZmNvbnYKKwlPUFRJT04gVEFSR0VURklMRSBwanN1YV8weEU0NEMyRDAyLm1pZgorCU9QVElPTiBIRUFERVJGSUxFIHBqc3VhXzB4RTQ0QzJEMDIubWJnCisJT1BUSU9OIFNPVVJDRURJUiAuLi9nZngKKwlPUFRJT04gU09VUkNFUyAtYzMyIHFnbl9tZW51X3Bqc3VhCisJRU5ECisKKyNlbHNlCisKK1BSSl9NTVBGSUxFUworCisJZ251bWFrZWZpbGUgcGpzdWFfaWNvbnMubWsKKworI2VuZGlmCisKK1BSSl9NTVBGSUxFUworcGpzdWEubW1wCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dyb3VwL3Bqc3VhLm1tcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vZ3JvdXAvcGpzdWEubW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTk4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dyb3VwL3Bqc3VhLm1tcApAQCAtMCwwICsxLDEwNSBAQAorLy8gVGhlc2UgcGFydCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkgYXV0b21hdGVkIHRlc3QKKy8vID1CRUdJTgorI2RlZmluZSBTTkRfSEFTX0FQUwkwCisjZGVmaW5lIFNORF9IQVNfVkFTCTAKKyNkZWZpbmUgU05EX0hBU19NREEJMQorLy8gPUVORAorCitUQVJHRVQJCQlwanN1YS5leGUKK1VJRAkJCTB4MTAwMDM5Q0UgMHhFNDRDMkQwMgorVkVORE9SSUQJICAJMAorVEFSR0VUVFlQRQkJZXhlCitFUE9DU1RBQ0tTSVpFCSAJMHg1MDAwCisKK1NZU1RFTUlOQ0xVREUgCQlcZXBvYzMyXGluY2x1ZGUgXGVwb2MzMlxpbmNsdWRlXHZhcmlhbnQgXGVwb2MzMlxpbmNsdWRlXGVjb20KK1VTRVJJTkNMVURFCSAgIAkuLlxpbmMgLi5cZGF0YQorCitTT1VSQ0VQQVRICQkuLlxkYXRhCitTVEFSVCBSRVNPVVJDRQkJcGpzdWEucnNzCitIRUFERVIKK1RBUkdFVFBBVEggCQlyZXNvdXJjZVxhcHBzCitFTkQgLy9SRVNPVVJDRQorCitTVEFSVCBSRVNPVVJDRQkJcGpzdWFfcmVnLnJzcworVEFSR0VUUEFUSCAJICAJXHByaXZhdGVcMTAwMDNhM2ZcYXBwcworRU5EIC8vUkVTT1VSQ0UKKworTElCUkFSWQkJCWV1c2VyLmxpYiBhcHBhcmMubGliIGNvbmUubGliIGVpa2NvcmUubGliIGF2a29uLmxpYgorTElCUkFSWQkJCWNvbW1vbmVuZ2luZS5saWIgZWZzcnYubGliIGVzdG9yLmxpYiBlaWtjb2N0bC5saWIgZWlrZGxnLmxpYiAKK0xJQlJBUlkJCQllaWtjdGwubGliIGJhZmwubGliIGZic2NsaS5saWIgYWtubm90aWZ5LmxpYiBha25pY29uLmxpYgorTElCUkFSWQkJCWV0ZXh0LmxpYiBnZGkubGliIGVndWwubGliIGluc29jay5saWIKK0xJQlJBUlkJCQllY29tLmxpYiBJbmV0UHJvdFV0aWwubGliIGh0dHAubGliIGVzb2NrLmxpYgorCitMQU5HIAkJCQkwMQorCitTVEFSVCBCSVRNQVAgcGpzdWEubWJtCisJSEVBREVSCisJVEFSR0VUUEFUSCBccmVzb3VyY2VcYXBwcworCVNPVVJDRVBBVEggLi5cZ2Z4CisJU09VUkNFIGMxMiwxIGxpc3RfaWNvbi5ibXAgbGlzdF9pY29uX21hc2suYm1wCisJU09VUkNFIGMyNCBwanN1YS5ibXAKK0VORAorCitTT1VSQ0VQQVRICQkuLlxzcmMKKworI2lmZGVmIEVOQUJMRV9BQklWMl9NT0RFCitERUJVR0dBQkxFX1VERUJPTkxZCisjZW5kaWYKKworU09VUkNFIHBqc3VhQ29udGFpbmVyLmNwcCBQanN1YUNvbnRhaW5lclZpZXcuY3BwIHBqc3VhQXBwbGljYXRpb24uY3BwIHBqc3VhRG9jdW1lbnQuY3BwIHBqc3VhQXBwVWkuY3BwCisKKworLyogUEpTSVAgbGlicmFyeSBkZXBlbmRlbmNpZXMgKi8KKworTUFDUk8JCQlQSl9NX0kzODY9MQorTUFDUk8JCQlQSl9TWU1CSUFOPTEKKworU1lTVEVNSU5DTFVERQkJLi5cLi5cLi5cLi5cLi5ccGpsaWJcaW5jbHVkZQorU1lTVEVNSU5DTFVERQkJLi5cLi5cLi5cLi5cLi5ccGpsaWItdXRpbFxpbmNsdWRlCitTWVNURU1JTkNMVURFCQkuLlwuLlwuLlwuLlwuLlxwam5hdGhcaW5jbHVkZQorU1lTVEVNSU5DTFVERQkJLi5cLi5cLi5cLi5cLi5ccGptZWRpYVxpbmNsdWRlCitTWVNURU1JTkNMVURFCQkuLlwuLlwuLlwuLlwuLlxwanNpcFxpbmNsdWRlCisKK1NZU1RFTUlOQ0xVREUJCVxlcG9jMzJcaW5jbHVkZVxsaWJjCisKK0xJQlJBUlkJCQllc3RsaWIubGliIGNoYXJjb252LmxpYiBoYWwubGliCisKK1NUQVRJQ0xJQlJBUlkJCXBqc3VhX2xpYi5saWIKK1NUQVRJQ0xJQlJBUlkJCXBqc2lwX3VhLmxpYiBwanNpcF9zaW1wbGUubGliIHBqc2lwLmxpYgorU1RBVElDTElCUkFSWQkJbGliZ3NtY29kZWMubGliIGxpYnNwZWV4Y29kZWMubGliIAorU1RBVElDTElCUkFSWQkJbGliZzcyMjFjb2RlYy5saWIgbGlicGFzc3Rocm91Z2hjb2RlYy5saWIKK1NUQVRJQ0xJQlJBUlkJCXBqbWVkaWEubGliCitTVEFUSUNMSUJSQVJZCQlwam1lZGlhX2F1ZGlvZGV2LmxpYgorU1RBVElDTElCUkFSWQkJcGpzZHAubGliCitTVEFUSUNMSUJSQVJZCQlwam5hdGgubGliCitTVEFUSUNMSUJSQVJZCQlwamxpYl91dGlsLmxpYiBwamxpYi5saWIKK1NUQVRJQ0xJQlJBUlkJCWxpYnNydHAubGliCitTVEFUSUNMSUJSQVJZCQlsaWJyZXNhbXBsZS5saWIKKworLyogU291bmQgZGV2aWNlIChBUFMvVkFTL01EQSkgbGlicmFyeSAmIGNhcGFiaWxpdHkgc2V0dGluZ3MgKi8KKyNpZiBTTkRfSEFTX0FQUworCUxJQlJBUlkJCUFQU1Nlc3Npb24yLmxpYgorI2VuZGlmCisKKyNpZiBTTkRfSEFTX1ZBUworCUxJQlJBUlkJCVZvSVBBdWRpb0ludGZjLmxpYgkJCisjZW5kaWYKKworI2lmIFNORF9IQVNfTURBCisJTElCUkFSWSAJbWVkaWFjbGllbnRhdWRpb3N0cmVhbS5saWIKKwlMSUJSQVJZIAltZWRpYWNsaWVudGF1ZGlvaW5wdXRzdHJlYW0ubGliCisjZW5kaWYKKworI2lmIFNORF9IQVNfQVBTIHx8IFNORF9IQVNfVkFTCisJQ0FQQUJJTElUWQlOZXR3b3JrU2VydmljZXMgTG9jYWxTZXJ2aWNlcyBSZWFkVXNlckRhdGEgV3JpdGVVc2VyRGF0YSBVc2VyRW52aXJvbm1lbnQgTXVsdGltZWRpYURECisjZWxzZQorCUNBUEFCSUxJVFkJTmV0d29ya1NlcnZpY2VzIExvY2FsU2VydmljZXMgUmVhZFVzZXJEYXRhIFdyaXRlVXNlckRhdGEgVXNlckVudmlyb25tZW50CisjZW5kaWYKKworCisvKiBQSlNVQSBBUFAgKi8KKworU09VUkNFUEFUSAkJLi5cLi4KKworU09VUkNFIAkJCXBqc3VhX2FwcF9jbGkuYyBwanN1YV9hcHBfbGVnYWN5LmMKK1NPVVJDRSAJCQlwanN1YV9hcHAuYyBwanN1YV9hcHBfY29tbW9uLmMgcGpzdWFfYXBwX2NvbmZpZy5jCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2dyb3VwL3Bqc3VhX2ljb25zLm1rIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9ncm91cC9wanN1YV9pY29ucy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjViYTIxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9ncm91cC9wanN1YV9pY29ucy5tawpAQCAtMCwwICsxLDc1IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIE5hbWUJIDogSWNvbnNfYWlmX3NjYWxhYmxlX2RjLm1rCisjICBQYXJ0IG9mICA6IHBqc3VhCisjCisjICBEZXNjcmlwdGlvbjoKKyMgCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitpZmVxIChXSU5TLCQoZmluZHN0cmluZyBXSU5TLCAkKFBMQVRGT1JNKSkpCitaRElSPSQoRVBPQ1JPT1QpZXBvYzMyXHJlbGVhc2VcJChQTEFURk9STSlcJChDRkcpXFoKK2Vsc2UKK1pESVI9JChFUE9DUk9PVCllcG9jMzJcZGF0YVx6CitlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUT0RPOiBDb25maWd1cmUgdGhlc2UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUQVJHRVRESVI9JChaRElSKVxyZXNvdXJjZVxhcHBzCitJQ09OVEFSR0VURklMRU5BTUU9JChUQVJHRVRESVIpXHBqc3VhX2FpZi5taWYKK0hFQURFUkRJUj0kKEVQT0NST09UKWVwb2MzMlxpbmNsdWRlCitIRUFERVJGSUxFTkFNRT0kKEhFQURFUkRJUilccGpzdWFfYWlmLm1iZworCitJQ09ORElSPS4uXGdmeAorCitkb19ub3RoaW5nIDoKKwlAcmVtIGRvX25vdGhpbmcKKworTUFLTUFLRSA6IGRvX25vdGhpbmcKKworQkxEIDogZG9fbm90aGluZworCitDTEVBTiA6CisJQGVjaG8gLi4uRGVsZXRpbmcgJChJQ09OVEFSR0VURklMRU5BTUUpCisJZGVsIC9xIC9mICQoSUNPTlRBUkdFVEZJTEVOQU1FKQorCitMSUIgOiBkb19ub3RoaW5nCisKK0NMRUFOTElCIDogZG9fbm90aGluZworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVE9ETzogQ29uZmlndXJlIHRoZXNlLgorIworIyBOT1RFIDE6IERPIE5PVCBERUZJTkUgTUFTSyBGSUxFIE5BTUVTISBUaGV5IGFyZSBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5IGJ5CisjIE1pZkNvbnYgaWYgdGhlIG1hc2sgZGV0cGggaXMgZGVmaW5lZC4KKyMKKyMgTk9URSAyOiBVc3VhbGx5LCBzb3VyY2UgcGF0aHMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYml0bWFwCisjIGRlZmluaXRpb25zLiBNaWZDb252IHNlYXJjaGVzIGZvciB0aGUgaWNvbnMgaW4gYWxsIGljb24gZGlyZWN0b3JpZXMgaW4gYQorIyBwcmVkZWZpbmVkIG9yZGVyLCB3aGljaCBpcyBjdXJyZW50bHkgXHM2MFxpY29ucywgXHM2MFxiaXRtYXBzMi4KKyMgVGhlIGRpcmVjdG9yeSBcczYwXGljb25zIGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggb25seSBpZiB0aGUgZmVhdHVyZSBmbGFnCisjIF9fU0NBTEFCTEVfSUNPTlMgaXMgZGVmaW5lZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBOT1RFOiBpZiB5b3UgaGF2ZSBKVVNUSU5USU1FIGVuYWJsZWQgZm9yIHlvdXIgUzYwIDNyZCBGUDEgb3IgbmV3ZXIgU0RLCisjIGFuZCB0aGlzIGNvbW1hbmQgY3Jhc2hlcywgY29uc2lkZXIgYWRkaW5nICIvWCIgdG8gdGhlIGNvbW1hbmQgbGluZS4KKyMgU2VlIDxodHRwOi8vZm9ydW0ubm9raWEuY29tL2RvY3VtZW50L0ZvcnVtX05va2lhX1RlY2huaWNhbF9MaWJyYXJ5X3YxXzM1L2NvbnRlbnRzL0ZOVEwvQnVpbGRfcHJvY2Vzc19mYWlsc19hdF9taWZfZmlsZV9jcmVhdGlvbl9pbl9TNjBfM3JkX0VkX0ZQMV9TREsuaHRtPgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JFU09VUkNFIDogJChJQ09OVEFSR0VURklMRU5BTUUpCisKKyQoSUNPTlRBUkdFVEZJTEVOQU1FKSA6ICQoSUNPTkRJUilccWduX21lbnVfcGpzdWEuc3ZnCisJbWlmY29udiAkKElDT05UQVJHRVRGSUxFTkFNRSkgXAorCQkvSCQoSEVBREVSRklMRU5BTUUpIFwKKwkJL2MzMiw4ICQoSUNPTkRJUilccWduX21lbnVfcGpzdWEuc3ZnCisJCQorRlJFRVpFIDogZG9fbm90aGluZworCitTQVZFU1BBQ0UgOiBkb19ub3RoaW5nCisKK1JFTEVBU0FCTEVTIDoKKwlAZWNobyAkKElDT05UQVJHRVRGSUxFTkFNRSkKKworRklOQUwgOiBkb19ub3RoaW5nCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL1Bqc3VhQ29udGFpbmVyVmlldy5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvUGpzdWFDb250YWluZXJWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiM2VkOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL1Bqc3VhQ29udGFpbmVyVmlldy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IFBqc3VhQ29udGFpbmVyVmlldy5oCisgQXV0aG9yICAgICAgOiBuYW5hbmcKKyBDb3B5cmlnaHQgICA6IENvcHlyaWdodCAoQykgMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyBEZXNjcmlwdGlvbiA6IAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmbmRlZiBQSlNVQUNPTlRBSU5FUlZJRVdfSAorI2RlZmluZSBQSlNVQUNPTlRBSU5FUlZJRVdfSAorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluY2x1ZGVzXQorI2luY2x1ZGUgPGFrbnZpZXcuaD4KKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIEluY2x1ZGVzXQorCisKKy8vIFtbWyBiZWdpbiBbRXZlbnQgSGFuZGxlciBJbmNsdWRlc10KKy8vIF1dXSBlbmQgW0V2ZW50IEhhbmRsZXIgSW5jbHVkZXNdCisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29uc3RhbnRzXQorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29uc3RhbnRzXQorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEZvcndhcmQgRGVjbGFyYXRpb25zXQorY2xhc3MgQ1Bqc3VhQ29udGFpbmVyOworLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgRm9yd2FyZCBEZWNsYXJhdGlvbnNdCisKKy8qKgorICogQXZrb24gdmlldyBjbGFzcyBmb3IgcGpzdWFDb250YWluZXJWaWV3LiBJdCBpcyByZWdpc3RlciB3aXRoIHRoZSB2aWV3IHNlcnZlcgorICogYnkgdGhlIEFwcFVpLiBJdCBvd25zIHRoZSBjb250YWluZXIgY29udHJvbC4KKyAqIEBjbGFzcwlDcGpzdWFDb250YWluZXJWaWV3IHBqc3VhQ29udGFpbmVyVmlldy5oCisgKi8JCQkJCQkKKwkJCQorY2xhc3MgQ3Bqc3VhQ29udGFpbmVyVmlldyA6IHB1YmxpYyBDQWtuVmlldworCXsKKwkKKwkKKwkvLyBbW1sgYmVnaW4gW1B1YmxpYyBTZWN0aW9uXQorcHVibGljOgorCS8vIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcgorCUNwanN1YUNvbnRhaW5lclZpZXcoKTsKKwlzdGF0aWMgQ3Bqc3VhQ29udGFpbmVyVmlldyogTmV3TCgpOworCXN0YXRpYyBDcGpzdWFDb250YWluZXJWaWV3KiBOZXdMQygpOyAgICAgICAgCisJdm9pZCBDb25zdHJ1Y3RMKCk7CisJdmlydHVhbCB+Q3Bqc3VhQ29udGFpbmVyVmlldygpOworCQkJCQkJCisJLy8gZnJvbSBiYXNlIGNsYXNzIENBa25WaWV3CisJVFVpZCBJZCgpIGNvbnN0OworCXZvaWQgSGFuZGxlQ29tbWFuZEwoIFRJbnQgYUNvbW1hbmQgKTsKKwkKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIE1ldGhvZHNdCisJQ1Bqc3VhQ29udGFpbmVyKiBDcmVhdGVDb250YWluZXJMKCk7CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgTWV0aG9kc10KKwkKKwkvLyBdXV0gZW5kIFtQdWJsaWMgU2VjdGlvbl0KKwkKKwl2b2lkIFB1dE1lc3NhZ2UoIGNvbnN0IGNoYXIgKm1zZyApOworCQorCS8vIFtbWyBiZWdpbiBbUHJvdGVjdGVkIFNlY3Rpb25dCitwcm90ZWN0ZWQ6CisJLy8gZnJvbSBiYXNlIGNsYXNzIENBa25WaWV3CisJdm9pZCBEb0FjdGl2YXRlTCgKKwkJY29uc3QgVFZ3c1ZpZXdJZCYgYVByZXZWaWV3SWQsCisJCVRVaWQgYUN1c3RvbU1lc3NhZ2VJZCwKKwkJY29uc3QgVERlc0M4JiBhQ3VzdG9tTWVzc2FnZSApOworCXZvaWQgRG9EZWFjdGl2YXRlKCk7CisJdm9pZCBIYW5kbGVTdGF0dXNQYW5lU2l6ZUNoYW5nZSgpOworCQorCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtPdmVycmlkZGVuIE1ldGhvZHNdCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtPdmVycmlkZGVuIE1ldGhvZHNdCisJCisJCisJLy8gW1tbIGJlZ2luIFtVc2VyIEhhbmRsZXJzXQorCS8vIF1dXSBlbmQgW1VzZXIgSGFuZGxlcnNdCisJCisJLy8gXV1dIGVuZCBbUHJvdGVjdGVkIFNlY3Rpb25dCisJCisJCisJLy8gW1tbIGJlZ2luIFtQcml2YXRlIFNlY3Rpb25dCitwcml2YXRlOgorCXZvaWQgU2V0dXBTdGF0dXNQYW5lTCgpOworCXZvaWQgQ2xlYW51cFN0YXR1c1BhbmUoKTsKKwkKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluc3RhbmNlIFZhcmlhYmxlc10KKwlDUGpzdWFDb250YWluZXIqIGlQanN1YUNvbnRhaW5lcjsKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBJbnN0YW5jZSBWYXJpYWJsZXNdCisJCisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBNZXRob2RzXQorCS8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIE1ldGhvZHNdCisJCisJLy8gXV1dIGVuZCBbUHJpdmF0ZSBTZWN0aW9uXQorCQorCX07CisKKyNlbmRpZiAvLyBQSlNVQUNPTlRBSU5FUlZJRVdfSApkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWEuaHJoIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWEuaHJoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjdmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2luYy9wanN1YS5ocmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIE5hbWUgICAgICAgIDogcGpzdWEuaHJoCisgQXV0aG9yICAgICAgOiBuYW5hbmcKKyBDb3B5cmlnaHQgICA6IENvcHlyaWdodCAoQykgMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyBEZXNjcmlwdGlvbiA6IAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZW51bSBUcGpzdWFWaWV3VWlkcworCXsKKwlFUGpzdWFDb250YWluZXJWaWV3SWQgPSAxCisJfTsKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhLnBhbiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhLnBhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzNkYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWEucGFuCkBAIC0wLDAgKzEsMTggQEAKKworI2lmbmRlZiBQSlNVQV9QQU5fSAorI2RlZmluZSBQSlNVQV9QQU5fSAorCisvKiogcGpzdWEgYXBwbGljYXRpb24gcGFuaWMgY29kZXMgKi8KK2VudW0gVHBqc3VhUGFuaWNzCisJeworCUVwanN1YVVpID0gMQorCS8vIGFkZCBmdXJ0aGVyIHBhbmljcyBoZXJlCisJfTsKKworaW5saW5lIHZvaWQgUGFuaWMoVHBqc3VhUGFuaWNzIGFSZWFzb24pCisJeworCV9MSVQoYXBwbGljYXRpb25OYW1lLCJwanN1YSIpOworCVVzZXI6OlBhbmljKGFwcGxpY2F0aW9uTmFtZSwgYVJlYXNvbik7CisJfQorCisjZW5kaWYgLy8gUEpTVUFfUEFOX0gKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhQXBwVWkuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhQXBwVWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZkMjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWFBcHBVaS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQXBwVWkuaAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZm5kZWYgUEpTVUFBUFBVSV9ICisjZGVmaW5lIFBKU1VBQVBQVUlfSAorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluY2x1ZGVzXQorI2luY2x1ZGUgPGFrbnZpZXdhcHB1aS5oPgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgSW5jbHVkZXNdCisKKworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBGb3J3YXJkIERlY2xhcmF0aW9uc10KK2NsYXNzIENwanN1YUNvbnRhaW5lclZpZXc7CisvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBGb3J3YXJkIERlY2xhcmF0aW9uc10KKworLyoqCisgKiBAY2xhc3MJQ3Bqc3VhQXBwVWkgcGpzdWFBcHBVaS5oCisgKiBAYnJpZWYgVGhlIEFwcFVpIGNsYXNzIGhhbmRsZXMgYXBwbGljYXRpb24td2lkZSBhc3BlY3RzIG9mIHRoZSB1c2VyIGludGVyZmFjZSwgaW5jbHVkaW5nCisgKiAgICAgICAgdmlldyBtYW5hZ2VtZW50IGFuZCB0aGUgZGVmYXVsdCBtZW51LCBjb250cm9sIHBhbmUsIGFuZCBzdGF0dXMgcGFuZS4KKyAqLworY2xhc3MgQ3Bqc3VhQXBwVWkgOiBwdWJsaWMgQ0FrblZpZXdBcHBVaQorCXsKK3B1YmxpYzogCisJLy8gY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKKwlDcGpzdWFBcHBVaSgpOworCXZpcnR1YWwgfkNwanN1YUFwcFVpKCk7CisJdm9pZCBDb25zdHJ1Y3RMKCk7CisKK3B1YmxpYzoKKwkvLyBmcm9tIENDb2VBcHBVaQorCVRLZXlSZXNwb25zZSBIYW5kbGVLZXlFdmVudEwoCisJCQkJY29uc3QgVEtleUV2ZW50JiBhS2V5RXZlbnQsCisJCQkJVEV2ZW50Q29kZSBhVHlwZSApOworCisJLy8gZnJvbSBDRWlrQXBwVWkKKwl2b2lkIEhhbmRsZUNvbW1hbmRMKCBUSW50IGFDb21tYW5kICk7CisJdm9pZCBIYW5kbGVSZXNvdXJjZUNoYW5nZUwoIFRJbnQgYVR5cGUgKTsKKworCS8vIGZyb20gQ0FrbkFwcFVpCisJdm9pZCBIYW5kbGVWaWV3RGVhY3RpdmF0aW9uKCAKKwkJCWNvbnN0IFRWd3NWaWV3SWQmIGFWaWV3SWRUb0JlRGVhY3RpdmF0ZWQsIAorCQkJY29uc3QgVFZ3c1ZpZXdJZCYgYU5ld2x5QWN0aXZhdGVkVmlld0lkICk7CisKK3ByaXZhdGU6CisJdm9pZCBJbml0aWFsaXplQ29udGFpbmVyc0woKTsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIE1ldGhvZHNdCitwdWJsaWM6IAorCS8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIE1ldGhvZHNdCisJCisJdm9pZCBQdXRNc2coY29uc3QgY2hhciAqbXNnKTsKKwkKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluc3RhbmNlIFZhcmlhYmxlc10KK3ByaXZhdGU6IAorCUNwanN1YUNvbnRhaW5lclZpZXcqIGlQanN1YUNvbnRhaW5lclZpZXc7CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgSW5zdGFuY2UgVmFyaWFibGVzXQorCQorCQorCS8vIFtbWyBiZWdpbiBbVXNlciBIYW5kbGVyc10KK3Byb3RlY3RlZDogCisJLy8gXV1dIGVuZCBbVXNlciBIYW5kbGVyc10KKwl2b2lkIFByZXBhcmVUb0V4aXQoKTsKKworCX07CisKKyNlbmRpZiAvLyBQSlNVQUFQUFVJX0gJCQkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhQXBwbGljYXRpb24uaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhQXBwbGljYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY2ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWFBcHBsaWNhdGlvbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQXBwbGljYXRpb24uaAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZm5kZWYgUEpTVUFBUFBMSUNBVElPTl9ICisjZGVmaW5lIFBKU1VBQVBQTElDQVRJT05fSAorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluY2x1ZGVzXQorI2luY2x1ZGUgPGFrbmFwcC5oPgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgSW5jbHVkZXNdCisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29uc3RhbnRzXQorY29uc3QgVFVpZCBLVWlkcGpzdWFBcHBsaWNhdGlvbiA9IHsgMHhFNDRDMkQwMiB9OworLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29uc3RhbnRzXQorCisvKioKKyAqCisgKiBAY2xhc3MJQ3Bqc3VhQXBwbGljYXRpb24gcGpzdWFBcHBsaWNhdGlvbi5oCisgKiBAYnJpZWYJQSBDQWtuQXBwbGljYXRpb24tZGVyaXZlZCBjbGFzcyBpcyByZXF1aXJlZCBieSB0aGUgUzYwIGFwcGxpY2F0aW9uIAorICogICAgICAgICAgZnJhbWV3b3JrLiBJdCBpcyBzdWJjbGFzc2VkIHRvIGNyZWF0ZSB0aGUgYXBwbGljYXRpb24ncyBkb2N1bWVudCAKKyAqICAgICAgICAgIG9iamVjdC4KKyAqLworY2xhc3MgQ3Bqc3VhQXBwbGljYXRpb24gOiBwdWJsaWMgQ0FrbkFwcGxpY2F0aW9uCisJeworcHJpdmF0ZToKKwlUVWlkIEFwcERsbFVpZCgpIGNvbnN0OworCUNBcGFEb2N1bWVudCogQ3JlYXRlRG9jdW1lbnRMKCk7CisJCisJfTsKKwkJCQorI2VuZGlmIC8vIFBKU1VBQVBQTElDQVRJT05fSAkJCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2luYy9wanN1YUNvbnRhaW5lci5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWFDb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWUxNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9pbmMvcGpzdWFDb250YWluZXIuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIE5hbWUgICAgICAgIDogcGpzdWFDb250YWluZXIuaAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZm5kZWYgUEpTVUFDT05UQUlORVJfSAorI2RlZmluZSBQSlNVQUNPTlRBSU5FUl9ICisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgSW5jbHVkZXNdCisjaW5jbHVkZSA8Y29lY250cmwuaD4JCQorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgSW5jbHVkZXNdCisKKworLy8gW1tbIGJlZ2luIFtFdmVudCBIYW5kbGVyIEluY2x1ZGVzXQorLy8gXV1dIGVuZCBbRXZlbnQgSGFuZGxlciBJbmNsdWRlc10KKworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBGb3J3YXJkIERlY2xhcmF0aW9uc10KK2NsYXNzIE1FaWtDb21tYW5kT2JzZXJ2ZXI7CQkKK2NsYXNzIENFaWtJbWFnZTsKK2NsYXNzIENFaWtMYWJlbDsKKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIEZvcndhcmQgRGVjbGFyYXRpb25zXQorCisvKioKKyAqIENvbnRhaW5lciBjbGFzcyBmb3IgcGpzdWFDb250YWluZXIKKyAqIAorICogQGNsYXNzCUNQanN1YUNvbnRhaW5lciBwanN1YUNvbnRhaW5lci5oCisgKi8KK2NsYXNzIENQanN1YUNvbnRhaW5lciA6IHB1YmxpYyBDQ29lQ29udHJvbAorCXsKK3B1YmxpYzoKKwkvLyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IKKwlDUGpzdWFDb250YWluZXIoKTsKKwlzdGF0aWMgQ1Bqc3VhQ29udGFpbmVyKiBOZXdMKCAKKwkJY29uc3QgVFJlY3QmIGFSZWN0LCAKKwkJY29uc3QgQ0NvZUNvbnRyb2wqIGFQYXJlbnQsIAorCQlNRWlrQ29tbWFuZE9ic2VydmVyKiBhQ29tbWFuZE9ic2VydmVyICk7CisJc3RhdGljIENQanN1YUNvbnRhaW5lciogTmV3TEMoIAorCQljb25zdCBUUmVjdCYgYVJlY3QsIAorCQljb25zdCBDQ29lQ29udHJvbCogYVBhcmVudCwgCisJCU1FaWtDb21tYW5kT2JzZXJ2ZXIqIGFDb21tYW5kT2JzZXJ2ZXIgKTsKKwl2b2lkIENvbnN0cnVjdEwoIAorCQljb25zdCBUUmVjdCYgYVJlY3QsIAorCQljb25zdCBDQ29lQ29udHJvbCogYVBhcmVudCwgCisJCU1FaWtDb21tYW5kT2JzZXJ2ZXIqIGFDb21tYW5kT2JzZXJ2ZXIgKTsKKwl2aXJ0dWFsIH5DUGpzdWFDb250YWluZXIoKTsKKworcHVibGljOgorCS8vIGZyb20gYmFzZSBjbGFzcyBDQ29lQ29udHJvbAorCVRJbnQgQ291bnRDb21wb25lbnRDb250cm9scygpIGNvbnN0OworCUNDb2VDb250cm9sKiBDb21wb25lbnRDb250cm9sKCBUSW50IGFJbmRleCApIGNvbnN0OworCVRLZXlSZXNwb25zZSBPZmZlcktleUV2ZW50TCggCisJCQljb25zdCBUS2V5RXZlbnQmIGFLZXlFdmVudCwgCisJCQlURXZlbnRDb2RlIGFUeXBlICk7CisJdm9pZCBIYW5kbGVSZXNvdXJjZUNoYW5nZSggVEludCBhVHlwZSApOworCQorcHJvdGVjdGVkOgorCS8vIGZyb20gYmFzZSBjbGFzcyBDQ29lQ29udHJvbAorCXZvaWQgU2l6ZUNoYW5nZWQoKTsKKworcHJpdmF0ZToKKwkvLyBmcm9tIGJhc2UgY2xhc3MgQ0NvZUNvbnRyb2wKKwl2b2lkIERyYXcoIGNvbnN0IFRSZWN0JiBhUmVjdCApIGNvbnN0OworCitwcml2YXRlOgorCXZvaWQgSW5pdGlhbGl6ZUNvbnRyb2xzTCgpOworCXZvaWQgTGF5b3V0Q29udHJvbHMoKTsKKwlDQ29lQ29udHJvbCogaUZvY3VzQ29udHJvbDsKKwlNRWlrQ29tbWFuZE9ic2VydmVyKiBpQ29tbWFuZE9ic2VydmVyOworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgTWV0aG9kc10KK3B1YmxpYzogCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgTWV0aG9kc10KKwkKKwl2b2lkIFB1dE1lc3NhZ2VMKCBjb25zdCBjaGFyKiBtc2cgKTsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIFR5cGUgRGVjbGFyYXRpb25zXQorcHVibGljOiAKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBUeXBlIERlY2xhcmF0aW9uc10KKwkKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluc3RhbmNlIFZhcmlhYmxlc10KK3ByaXZhdGU6IAorCUNFaWtJbWFnZSogaUltYWdlMTsKKwlDRWlrTGFiZWwqIGlMYWJlbDE7CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgSW5zdGFuY2UgVmFyaWFibGVzXQorCQorCQorCS8vIFtbWyBiZWdpbiBbT3ZlcnJpZGRlbiBNZXRob2RzXQorcHJvdGVjdGVkOiAKKwkvLyBdXV0gZW5kIFtPdmVycmlkZGVuIE1ldGhvZHNdCisJCisJCisJLy8gW1tbIGJlZ2luIFtVc2VyIEhhbmRsZXJzXQorcHJvdGVjdGVkOiAKKwkvLyBdXV0gZW5kIFtVc2VyIEhhbmRsZXJzXQorCQorcHVibGljOiAKKwllbnVtIFRDb250cm9scworCQl7CisJCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCUVJbWFnZTEsCisJCUVMYWJlbDEsCisJCQorCQkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkJCisJCS8vIGFkZCBhbnkgdXNlci1kZWZpbmVkIGVudHJpZXMgaGVyZS4uLgorCQkKKwkJRUxhc3RDb250cm9sCisJCX07CisJfTsKKwkJCQkKKyNlbmRpZiAvLyBQSlNVQUNPTlRBSU5FUl9ICmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2luYy9wanN1YURvY3VtZW50LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL2luYy9wanN1YURvY3VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1ZGVmZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vaW5jL3Bqc3VhRG9jdW1lbnQuaApAQCAtMCwwICsxLDM2IEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBwanN1YURvY3VtZW50LmgKKyBBdXRob3IgICAgICA6IG5hbmFuZworIENvcHlyaWdodCAgIDogQ29weXJpZ2h0IChDKSAyMDEzIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorIERlc2NyaXB0aW9uIDogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZuZGVmIFBKU1VBRE9DVU1FTlRfSAorI2RlZmluZSBQSlNVQURPQ1VNRU5UX0gKKworI2luY2x1ZGUgPGFrbmRvYy5oPgorCQkKK2NsYXNzIENFaWtBcHBVaTsKKworLyoqCisqIEBjbGFzcwlDcGpzdWFEb2N1bWVudCBwanN1YURvY3VtZW50LmgKKyogQGJyaWVmCUEgQ0FrbkRvY3VtZW50LWRlcml2ZWQgY2xhc3MgaXMgcmVxdWlyZWQgYnkgdGhlIFM2MCBhcHBsaWNhdGlvbiAKKyogICAgICAgICAgIGZyYW1ld29yay4gSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBBcHBVaSBvYmplY3QuIAorKi8KK2NsYXNzIENwanN1YURvY3VtZW50IDogcHVibGljIENBa25Eb2N1bWVudAorCXsKK3B1YmxpYzogCisJLy8gY29uc3RydWN0b3IKKwlzdGF0aWMgQ3Bqc3VhRG9jdW1lbnQqIE5ld0woIENFaWtBcHBsaWNhdGlvbiYgYUFwcCApOworCitwcml2YXRlOiAKKwkvLyBjb25zdHJ1Y3RvcnMKKwlDcGpzdWFEb2N1bWVudCggQ0Vpa0FwcGxpY2F0aW9uJiBhQXBwICk7CisJdm9pZCBDb25zdHJ1Y3RMKCk7CisJCitwdWJsaWM6IAorCS8vIGZyb20gYmFzZSBjbGFzcyBDRWlrRG9jdW1lbnQKKwlDRWlrQXBwVWkqIENyZWF0ZUFwcFVpTCgpOworCX07CisjZW5kaWYgLy8gUEpTVUFET0NVTUVOVF9ICmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3Bqc3VhQ29udGFpbmVyLnVpZGVzaWduIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9wanN1YUNvbnRhaW5lci51aWRlc2lnbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBmZDZkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9wanN1YUNvbnRhaW5lci51aWRlc2lnbgpAQCAtMCwwICsxLDE1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxkZXNpZ25lckRhdGEgdmVyc2lvbj0iMS4xLjAiPgorICA8Y29tcG9uZW50TWFuaWZlc3Q+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0FrblZpZXciIHZlcnNpb249IjEuMi4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuRGVzaWduVGltZUNvbnRhaW5lciIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5Db21tb25CYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLlN0YXR1c1BhbmUiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ29udHJvbEJhc2UiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuU3RhdHVzUGFuZVRpdGxlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLlN0YXR1c1BhbmVUaXRsZUJhc2UiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0JBIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNCQUJhc2UiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0NvZUNvbnRyb2wiIHZlcnNpb249IjEuMi4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ29udGFpbmVyQmFzZSIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgICA8bWFuaWZlc3RFbnRyeSBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DRWlrSW1hZ2UiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc3ltYmlhbi5DRWlrQWxpZ25lZEJhc2UiIHZlcnNpb249IjEuMC4wIi8+CisgICAgPG1hbmlmZXN0RW50cnkgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0NvZUNvbnRyb2xCYXNlIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgIDxtYW5pZmVzdEVudHJ5IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNFaWtMYWJlbCIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgPC9jb21wb25lbnRNYW5pZmVzdD4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uUkVTT1VSQ0VfRElSRUNUT1JZX0lEIj5kYXRhPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LmNvbXBvbmVudC5zeW1iaWFuLnZlcnNpb24iPjMuMi4wPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LmNvbXBvbmVudC5zeW1iaWFuLnZlbmRvciI+Y29tLm5va2lhLnNlcmllczYwPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uQ09NUE9ORU5UX1BST1ZJREVSIj5jb20ubm9raWEuc2R0LmNvbXBvbmVudC5zeW1iaWFuLlN5bWJpYW4tUHJvdmlkZXI8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgaWQ9ImNvbS5ub2tpYS5zZHQuc3ltYmlhbi5kbS5JTkNMVURFX0RJUkVDVE9SWV9JRCI+aW5jPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uU09VUkNFX0RJUkVDVE9SWV9JRCI+c3JjPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uU09VUkNFR0VOX1BST1ZJREVSIj5jb20ubm9raWEuc2R0LnNvdXJjZWdlbi5TeW1iaWFuLVByb3ZpZGVyPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IGlkPSJjb20ubm9raWEuc2R0LnN5bWJpYW4uZG0uQlVJTERfRElSRUNUT1JZX0lEIj5ncm91cDwvcHJvcGVydHk+CisgIDxjb21wb25lbnQgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0FrblZpZXciPgorICAgIDxwcm9wZXJ0eSBpZD0iY2xhc3NOYW1lIj5DcGpzdWFDb250YWluZXJWaWV3PC9wcm9wZXJ0eT4KKyAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ibG9jYXRpb24iPgorICAgICAgPHByb3BlcnR5IGlkPSJ4Ij41MTwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgaWQ9InkiPjQ0PC9wcm9wZXJ0eT4KKyAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5wanN1YUNvbnRhaW5lclZpZXc8L3Byb3BlcnR5PgorICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJzaXplIj4KKyAgICAgIDxwcm9wZXJ0eSBpZD0id2lkdGgiPjI0MDwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgaWQ9ImhlaWdodCI+MzIwPC9wcm9wZXJ0eT4KKyAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgPGNvbXBvbmVudCBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5TdGF0dXNQYW5lIj4KKyAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJsb2NhdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0ieCI+MjA8L3Byb3BlcnR5PgorICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgPHByb3BlcnR5IGlkPSJuYW1lIj5zdGF0dXNQYW5lPC9wcm9wZXJ0eT4KKyAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJzaXplIj4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJ3aWR0aCI+MjA0PC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJoZWlnaHQiPjYzPC9wcm9wZXJ0eT4KKyAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgIDxjb21wb25lbnQgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuU3RhdHVzUGFuZVRpdGxlIj4KKyAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9ImxvY2F0aW9uIj4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9IngiPjU2PC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9Im5hbWUiPnRpdGxlPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJ0aXRsZVRleHQiIHR5cGU9ImkxOG4iPlNUUl9wanN1YUNvbnRhaW5lclZpZXdfNDwvcHJvcGVydHk+CisgICAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJzaXplIj4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9IndpZHRoIj4xNDg8L3Byb3BlcnR5PgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0iaGVpZ2h0Ij40MzwvcHJvcGVydHk+CisgICAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9ImltYWdlIi8+CisgICAgICA8L2NvbXBvbmVudD4KKyAgICA8L2NvbXBvbmVudD4KKyAgICA8Y29tcG9uZW50IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNCQSI+CisgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ibG9jYXRpb24iPgorICAgICAgICA8cHJvcGVydHkgaWQ9InkiPjI4ODwvcHJvcGVydHk+CisgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0iaW5mbyI+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0ibGVmdFRleHQiIHR5cGU9ImkxOG4iPlNUUl9wanN1YUNvbnRhaW5lclZpZXdfMTwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0icmlnaHRUZXh0IiB0eXBlPSJpMThuIj5TVFJfcGpzdWFDb250YWluZXJWaWV3XzI8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9Im1pZGRsZVRleHQiIHR5cGU9ImkxOG4iPlNUUl9wanN1YUNvbnRhaW5lclZpZXdfMzwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0ibGVmdElkIj48L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9InJpZ2h0SWQiPkVBa25Tb2Z0a2V5QmFjazwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0idHlwZSI+Ul9BVktPTl9TT0ZUS0VZU19FWElUPC9wcm9wZXJ0eT4KKyAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBpZD0ibmFtZSI+Y29udHJvbFBhbmU8L3Byb3BlcnR5PgorICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9InNpemUiPgorICAgICAgICA8cHJvcGVydHkgaWQ9IndpZHRoIj4yNDA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9ImhlaWdodCI+MzI8L3Byb3BlcnR5PgorICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgIDwvY29tcG9uZW50PgorICAgIDxjb21wb25lbnQgaWQ9ImNvbS5ub2tpYS5zZHQuc2VyaWVzNjAuQ0NvZUNvbnRyb2wiPgorICAgICAgPHByb3BlcnR5IGlkPSJiYWNrQ29sb3IiPjAsMCwwPC9wcm9wZXJ0eT4KKyAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJsb2NhdGlvbiI+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0ieSI+NjY8L3Byb3BlcnR5PgorICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgPHByb3BlcnR5IGlkPSJjbGFzc05hbWUiPkNQanN1YUNvbnRhaW5lcjwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgaWQ9Im5hbWUiPnBqc3VhQ29udGFpbmVyPC9wcm9wZXJ0eT4KKyAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJzaXplIj4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJ3aWR0aCI+MjQwPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IGlkPSJoZWlnaHQiPjIyMjwvcHJvcGVydHk+CisgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICA8Y29tcG9uZW50IGlkPSJjb20ubm9raWEuc2R0LnNlcmllczYwLkNFaWtJbWFnZSI+CisgICAgICAgIDxjb21wb3VuZFByb3BlcnR5IGlkPSJsb2NhdGlvbiI+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJ4Ij4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9InkiPjA8L3Byb3BlcnR5PgorICAgICAgICA8L2NvbXBvdW5kUHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0ibmFtZSI+aW1hZ2UxPC9wcm9wZXJ0eT4KKyAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9InNpemUiPgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0id2lkdGgiPjk5PC9wcm9wZXJ0eT4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9ImhlaWdodCI+MTExPC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0iaW1hZ2UiPgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0iYm1wZmlsZSI+XHJlc291cmNlXGFwcHNccGpzdWEubWJtPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8cHJvcGVydHkgaWQ9ImJtcGlkIj5FTWJtUGpzdWFQanN1YTwvcHJvcGVydHk+CisgICAgICAgIDwvY29tcG91bmRQcm9wZXJ0eT4KKyAgICAgIDwvY29tcG9uZW50PgorICAgICAgPGNvbXBvbmVudCBpZD0iY29tLm5va2lhLnNkdC5zZXJpZXM2MC5DRWlrTGFiZWwiPgorICAgICAgICA8Y29tcG91bmRQcm9wZXJ0eSBpZD0ibG9jYXRpb24iPgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0ieSI+MTk2PC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgaWQ9Im5hbWUiPmxhYmVsMTwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBpZD0idGV4dCIgdHlwZT0iaTE4biI+U1RSX3Bqc3VhQ29udGFpbmVyVmlld181PC9wcm9wZXJ0eT4KKyAgICAgICAgPGNvbXBvdW5kUHJvcGVydHkgaWQ9InNpemUiPgorICAgICAgICAgIDxwcm9wZXJ0eSBpZD0id2lkdGgiPjI0MTwvcHJvcGVydHk+CisgICAgICAgICAgPHByb3BlcnR5IGlkPSJoZWlnaHQiPjI3PC9wcm9wZXJ0eT4KKyAgICAgICAgPC9jb21wb3VuZFByb3BlcnR5PgorICAgICAgPC9jb21wb25lbnQ+CisgICAgPC9jb21wb25lbnQ+CisgIDwvY29tcG9uZW50PgorICA8c3RyaW5nQnVuZGxlPgorICAgIDxzdHJpbmdUYWJsZSBsYW5ndWFnZT0iTEFOR19FbmdsaXNoIj4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUNvbnRhaW5lclZpZXdfMSIvPgorICAgICAgPHN0cmluZyBpZD0iU1RSX3Bqc3VhQ29udGFpbmVyVmlld18yIi8+CisgICAgICA8c3RyaW5nIGlkPSJTVFJfcGpzdWFDb250YWluZXJWaWV3XzMiLz4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUNvbnRhaW5lclZpZXdfNCI+cGpzdWFDb250YWluZXI8L3N0cmluZz4KKyAgICAgIDxzdHJpbmcgaWQ9IlNUUl9wanN1YUNvbnRhaW5lclZpZXdfNSI+UGxlYXNlIHdhaXQuLjwvc3RyaW5nPgorICAgIDwvc3RyaW5nVGFibGU+CisgIDwvc3RyaW5nQnVuZGxlPgorICA8bWFjcm9UYWJsZS8+CisgIDxzb3VyY2VNYXBwaW5nU3RhdGU+CisgICAgPHJlc291cmNlTWFwcGluZ3M+CisgICAgICA8cmVzb3VyY2VNYXBwaW5nIGluc3RhbmNlTmFtZT0icGpzdWFDb250YWluZXJWaWV3Ij5yX3Bqc3VhX2NvbnRhaW5lcl9wanN1YV9jb250YWluZXJfdmlldzwvcmVzb3VyY2VNYXBwaW5nPgorICAgICAgPHJlc291cmNlTWFwcGluZyBpbnN0YW5jZU5hbWU9InN0YXR1c1BhbmUiPnJfcGpzdWFfY29udGFpbmVyX3N0YXR1c19wYW5lPC9yZXNvdXJjZU1hcHBpbmc+CisgICAgICA8cmVzb3VyY2VNYXBwaW5nIGluc3RhbmNlTmFtZT0ibGFiZWwxIj5yX3Bqc3VhX2NvbnRhaW5lcl9sYWJlbDE8L3Jlc291cmNlTWFwcGluZz4KKyAgICAgIDxyZXNvdXJjZU1hcHBpbmcgaW5zdGFuY2VOYW1lPSJ0aXRsZSI+cl9wanN1YV9jb250YWluZXJfdGl0bGVfcmVzb3VyY2U8L3Jlc291cmNlTWFwcGluZz4KKyAgICA8L3Jlc291cmNlTWFwcGluZ3M+CisgICAgPGVudW1NYXBwaW5ncz4KKyAgICAgIDxlbnVtTWFwcGluZyBpbnN0YW5jZU5hbWU9ImxhYmVsMSIgcHJvcGVydHlJZD0iZm9udCI+RUVpa0xhYmVsRm9udE5vcm1hbDwvZW51bU1hcHBpbmc+CisgICAgICA8ZW51bU1hcHBpbmcgaW5zdGFuY2VOYW1lPSJwanN1YUNvbnRhaW5lclZpZXciIHByb3BlcnR5SWQ9IiIgbmFtZUFsZ29yaXRobT0iY29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi5OQU1FX0FMR19WSUVXX1VJRCI+RVBqc3VhQ29udGFpbmVyVmlld0lkPC9lbnVtTWFwcGluZz4KKyAgICAgIDxlbnVtTWFwcGluZyBpbnN0YW5jZU5hbWU9ImxhYmVsMSIgcHJvcGVydHlJZD0iYWxpZ25tZW50Ij5FRWlrTGFiZWxBbGlnbkhDZW50ZXI8L2VudW1NYXBwaW5nPgorICAgICAgPGVudW1NYXBwaW5nIGluc3RhbmNlTmFtZT0idGl0bGUiIHByb3BlcnR5SWQ9IiIgbmFtZUFsZ29yaXRobT0iY29tLm5va2lhLnNkdC5jb21wb25lbnQuc3ltYmlhbi5OQU1FX0FMR19TVEFUVVNfUEFORV9JRCI+RUVpa1N0YXR1c1BhbmVVaWRUaXRsZTwvZW51bU1hcHBpbmc+CisgICAgICA8ZW51bU1hcHBpbmcgaW5zdGFuY2VOYW1lPSJ0aXRsZSIgcHJvcGVydHlJZD0iIiBuYW1lQWxnb3JpdGhtPSJjb20ubm9raWEuc2R0LmNvbXBvbmVudC5zeW1iaWFuLk5BTUVfQUxHX0NPTlRST0xfVFlQRSI+RUFrbkN0VGl0bGVQYW5lPC9lbnVtTWFwcGluZz4KKyAgICA8L2VudW1NYXBwaW5ncz4KKyAgICA8YXJyYXlNYXBwaW5ncy8+CisgIDwvc291cmNlTWFwcGluZ1N0YXRlPgorICA8Z2VuZXJhdGVkRmlsZXM+CisgICAgPGZpbGU+c3JjL3Bqc3VhY29udGFpbmVyLmNwcDwvZmlsZT4KKyAgICA8ZmlsZT5zcmMvcGpzdWFjb250YWluZXJ2aWV3LmNwcDwvZmlsZT4KKyAgICA8ZmlsZT5pbmMvcGpzdWFjb250YWluZXIuaDwvZmlsZT4KKyAgICA8ZmlsZT5pbmMvcGpzdWFjb250YWluZXJ2aWV3Lmg8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YS5yc3M8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YWNvbnRhaW5lci5yc3NpPC9maWxlPgorICAgIDxmaWxlPmluYy9wanN1YS5ocmg8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YS5sb2M8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YS5sMDE8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YWNvbnRhaW5lci5sb2M8L2ZpbGU+CisgICAgPGZpbGU+ZGF0YS9wanN1YWNvbnRhaW5lci5sMDE8L2ZpbGU+CisgIDwvZ2VuZXJhdGVkRmlsZXM+Cis8L2Rlc2lnbmVyRGF0YT4KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vc2lzL2JhY2t1cF9yZWdpc3RyYXRpb24ueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zaXMvYmFja3VwX3JlZ2lzdHJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZjJkMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vc2lzL2JhY2t1cF9yZWdpc3RyYXRpb24ueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxiYWNrdXBfcmVnaXN0cmF0aW9uPgorICA8c3lzdGVtX2JhY2t1cC8+CisgIDxyZXN0b3JlIHJlcXVpcmVzX3JlYm9vdCA9ICJubyIvPgorPC9iYWNrdXBfcmVnaXN0cmF0aW9uPgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zaXMvcGpzdWEucGtnIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zaXMvcGpzdWEucGtnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3Npcy9wanN1YS5wa2cKQEAgLTAsMCArMSwzNiBAQAorOyBwanN1YS5wa2cKKzsgVGhpcyBpcyBhbiBhdXRvLWdlbmVyYXRlZCBQS0cgZmlsZSBieSBDYXJiaWRlLgorOyBUaGlzIGZpbGUgdXNlcyB2YXJpYWJsZXMgc3BlY2lmaWMgdG8gQ2FyYmlkZSBidWlsZHMgdGhhdCB3aWxsIG5vdCB3b3JrCis7IG9uIGNvbW1hbmQtbGluZSBidWlsZHMuIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGdlbmVyYXRlZCBQS0cgZmlsZSBmcm9tIHRoZQorOyBjb21tYW5kLWxpbmUgdG9vbHMgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhlIHZhcmlhYmxlcyB3aXRoIHRoZSBhcHByb3ByaWF0ZQorOyB2YWx1ZXM6ICQoRVBPQ1JPT1QpLCAkKFBMQVRGT1JNKSwgJChUQVJHRVQpCis7IEFsc28sIHRoZSByZXNvdXJjZSBmaWxlIGVudHJpZXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIGxhbmd1YWdlCis7IHVzZWQgaW4gdGhlIGJ1aWxkLiBGb3IgZXhhbXBsZSwgaWYgYnVpbGRpbmcgZm9yIExBTkdVQUdFXzAxLCBjaGFuZ2UgdGhlIGZpbGUKKzsgZXh0ZW5zaW9ucyAucnNjIHRvIC5yMDEuCis7Cis7TGFuZ3VhZ2UgLSBzdGFuZGFyZCBsYW5ndWFnZSBkZWZpbml0aW9ucworJkVOCisKKzsgc3RhbmRhcmQgU0lTIGZpbGUgaGVhZGVyCisjeyJwanN1YSJ9LCgweEU0NEMyRDAyKSwxLDAsMAorCis7TG9jYWxpc2VkIFZlbmRvciBuYW1lCisleyJWZW5kb3ItRU4ifQorCis7VW5pcXVlIFZlbmRvciBuYW1lCis6IlZlbmRvciIKKworO1N1cHBvcnRzIFNlcmllcyA2MCB2IDMuMAorWzB4MTAxRjc5NjFdLCAwLCAwLCAwLCB7IlNlcmllczYwUHJvZHVjdElEIn0KKworO0ZpbGVzIHRvIGluc3RhbGwKKztZb3Ugc2hvdWxkIGNoYW5nZSB0aGUgc291cmNlIHBhdGhzIHRvIG1hdGNoIHRoYXQgb2YgeW91ciBlbnZpcm9ubWVudAorOzxzb3VyY2U+IDxkZXN0aW5hdGlvbj4KKyIkKEVQT0NST09UKUVwb2MzMlxyZWxlYXNlXCQoUExBVEZPUk0pXCQoVEFSR0VUKVxwanN1YS5leGUiCQktIiE6XHN5c1xiaW5ccGpzdWEuZXhlIgorIiQoRVBPQ1JPT1QpRXBvYzMyXGRhdGFcelxyZXNvdXJjZVxhcHBzXHBqc3VhLnIwMSIJCS0iITpccmVzb3VyY2VcYXBwc1xwanN1YS5yMDEiCisiJChFUE9DUk9PVClFcG9jMzJcZGF0YVx6XHByaXZhdGVcMTAwMDNhM2ZcYXBwc1xwanN1YV9yZWcucjAxIgktIiE6XHByaXZhdGVcMTAwMDNhM2ZcaW1wb3J0XGFwcHNccGpzdWFfcmVnLnIwMSIKKyIkKEVQT0NST09UKWVwb2MzMlxkYXRhXHpccmVzb3VyY2VcYXBwc1xwanN1YV9haWYubWlmIiAtIiE6XHJlc291cmNlXGFwcHNccGpzdWFfYWlmLm1pZiIKKyIkKEVQT0NST09UKWVwb2MzMlxkYXRhXHpccmVzb3VyY2VcYXBwc1xwanN1YS5tYm0iIC0iITpccmVzb3VyY2VcYXBwc1xwanN1YS5tYm0iCis7IEFkZCBhbnkgaW5zdGFsbGF0aW9uIG5vdGVzIGlmIGFwcGxpY2FibGUKKzsicGpzdWEudHh0IgkJCQkJICAtIiE6XHByaXZhdGVcMHhFNDRDMkQwMlxwanN1YS50eHQiCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vc3JjL1Bqc3VhQ29udGFpbmVyVmlldy5jcHAgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9QanN1YUNvbnRhaW5lclZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTUyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9QanN1YUNvbnRhaW5lclZpZXcuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBQanN1YUNvbnRhaW5lclZpZXcuY3BwCisgQXV0aG9yICAgICAgOiBuYW5hbmcKKyBDb3B5cmlnaHQgICA6IENvcHlyaWdodCAoQykgMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyBEZXNjcmlwdGlvbiA6IAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBTeXN0ZW0gSW5jbHVkZXNdCisjaW5jbHVkZSA8YWtudmlld2FwcHVpLmg+CisjaW5jbHVkZSA8ZWlrbWVudWIuaD4KKyNpbmNsdWRlIDxhdmtvbi5ocmg+CisjaW5jbHVkZSA8YmFyc3JlYWQuaD4KKyNpbmNsdWRlIDxlaWtpbWFnZS5oPgorI2luY2x1ZGUgPGVpa2Vudi5oPgorI2luY2x1ZGUgPHN0cmluZ2xvYWRlci5oPgorI2luY2x1ZGUgPGVpa2xhYmVsLmg+CisjaW5jbHVkZSA8YWtuY29udGV4dC5oPgorI2luY2x1ZGUgPGFrbnRpdGxlLmg+CisjaW5jbHVkZSA8ZWlrYnRncGMuaD4KKyNpbmNsdWRlIDxwanN1YS5yc2c+CisvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBTeXN0ZW0gSW5jbHVkZXNdCisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKworI2luY2x1ZGUgInBqc3VhLmhyaCIKKyNpbmNsdWRlICJwanN1YUNvbnRhaW5lclZpZXcuaCIKKyNpbmNsdWRlICJwanN1YUNvbnRhaW5lci5oIgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb25zdGFudHNdCisvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb25zdGFudHNdCisKKy8qKgorICogRmlyc3QgcGhhc2Ugb2YgU3ltYmlhbiB0d28tcGhhc2UgY29uc3RydWN0aW9uLiBTaG91bGQgbm90IGNvbnRhaW4gYW55CisgKiBjb2RlIHRoYXQgY291bGQgbGVhdmUuCisgKi8KK0NwanN1YUNvbnRhaW5lclZpZXc6OkNwanN1YUNvbnRhaW5lclZpZXcoKQorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvbnRlbnRzXQorCWlQanN1YUNvbnRhaW5lciA9IE5VTEw7CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJfQorCisvKiogCisgKiBUaGUgdmlldydzIGRlc3RydWN0b3IgcmVtb3ZlcyB0aGUgY29udGFpbmVyIGZyb20gdGhlIGNvbnRyb2wKKyAqIHN0YWNrIGFuZCBkZXN0cm95cyBpdC4KKyAqLworQ3Bqc3VhQ29udGFpbmVyVmlldzo6fkNwanN1YUNvbnRhaW5lclZpZXcoKQorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvbnRlbnRzXQorCWRlbGV0ZSBpUGpzdWFDb250YWluZXI7CisJaVBqc3VhQ29udGFpbmVyID0gTlVMTDsKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisKKy8qKgorICogU3ltYmlhbiB0d28tcGhhc2UgY29uc3RydWN0b3IuCisgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2UgdGhlbiBjYWxscyB0aGUgc2Vjb25kLXBoYXNlIGNvbnN0cnVjdG9yCisgKiB3aXRob3V0IGxlYXZpbmcgdGhlIGluc3RhbmNlIG9uIHRoZSBjbGVhbnVwIHN0YWNrLgorICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ3Bqc3VhQ29udGFpbmVyVmlldworICovCitDcGpzdWFDb250YWluZXJWaWV3KiBDcGpzdWFDb250YWluZXJWaWV3OjpOZXdMKCkKKwl7CisJQ3Bqc3VhQ29udGFpbmVyVmlldyogc2VsZiA9IENwanN1YUNvbnRhaW5lclZpZXc6Ok5ld0xDKCk7CisJQ2xlYW51cFN0YWNrOjpQb3AoIHNlbGYgKTsKKwlyZXR1cm4gc2VsZjsKKwl9CisKKy8qKgorICogU3ltYmlhbiB0d28tcGhhc2UgY29uc3RydWN0b3IuCisgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2UsIHB1c2hlcyBpdCBvbiB0aGUgY2xlYW51cCBzdGFjaywKKyAqIHRoZW4gY2FsbHMgdGhlIHNlY29uZC1waGFzZSBjb25zdHJ1Y3Rvci4KKyAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIENwanN1YUNvbnRhaW5lclZpZXcKKyAqLworQ3Bqc3VhQ29udGFpbmVyVmlldyogQ3Bqc3VhQ29udGFpbmVyVmlldzo6TmV3TEMoKQorCXsKKwlDcGpzdWFDb250YWluZXJWaWV3KiBzZWxmID0gbmV3ICggRUxlYXZlICkgQ3Bqc3VhQ29udGFpbmVyVmlldygpOworCUNsZWFudXBTdGFjazo6UHVzaEwoIHNlbGYgKTsKKwlzZWxmLT5Db25zdHJ1Y3RMKCk7CisJcmV0dXJuIHNlbGY7CisJfQorCisKKy8qKgorICogU2Vjb25kLXBoYXNlIGNvbnN0cnVjdG9yIGZvciB2aWV3LiAgCisgKiBJbml0aWFsaXplIGNvbnRlbnRzIGZyb20gcmVzb3VyY2UuCisgKi8gCit2b2lkIENwanN1YUNvbnRhaW5lclZpZXc6OkNvbnN0cnVjdEwoKQorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvZGVdCisJQmFzZUNvbnN0cnVjdEwoIFJfUEpTVUFfQ09OVEFJTkVSX1BKU1VBX0NPTlRBSU5FUl9WSUVXICk7CisJCQkJCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29kZV0KKwkKKwkvLyBhZGQgeW91ciBvd24gaW5pdGlhbGl6YXRpb24gY29kZSBoZXJlCisJfQorCisvKioKKyAqIEByZXR1cm4gVGhlIFVJRCBmb3IgdGhpcyB2aWV3CisgKi8KK1RVaWQgQ3Bqc3VhQ29udGFpbmVyVmlldzo6SWQoKSBjb25zdAorCXsKKwlyZXR1cm4gVFVpZDo6VWlkKCBFUGpzdWFDb250YWluZXJWaWV3SWQgKTsKKwl9CisKKy8qKgorICogSGFuZGxlIGEgY29tbWFuZCBmb3IgdGhpcyB2aWV3IChvdmVycmlkZSkKKyAqIEBwYXJhbSBhQ29tbWFuZCBjb21tYW5kIGlkIHRvIGJlIGhhbmRsZWQKKyAqLwordm9pZCBDcGpzdWFDb250YWluZXJWaWV3OjpIYW5kbGVDb21tYW5kTCggVEludCBhQ29tbWFuZCApCisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29kZV0KKwlUQm9vbCBjb21tYW5kSGFuZGxlZCA9IEVGYWxzZTsKKwlzd2l0Y2ggKCBhQ29tbWFuZCApCisJCXsJLy8gY29kZSB0byBkaXNwYXRjaCB0byB0aGUgQWtuVmlldydzIG1lbnUgYW5kIENCQSBjb21tYW5kcyBpcyBnZW5lcmF0ZWQgaGVyZQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkKKwkJCisJaWYgKCAhY29tbWFuZEhhbmRsZWQgKSAKKwkJeworCQorCQlpZiAoIGFDb21tYW5kID09IEVBa25Tb2Z0a2V5QmFjayApCisJCQl7CisJCQlBcHBVaSgpLT5IYW5kbGVDb21tYW5kTCggRUVpa0NtZEV4aXQgKTsKKwkJCX0KKwkKKwkJfQorCS8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIENvZGVdCisJCisJfQorCisvKioKKyAqCUhhbmRsZXMgdXNlciBhY3Rpb25zIGR1cmluZyBhY3RpdmF0aW9uIG9mIHRoZSB2aWV3LCAKKyAqCXN1Y2ggYXMgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50LgorICovCit2b2lkIENwanN1YUNvbnRhaW5lclZpZXc6OkRvQWN0aXZhdGVMKCAKKwkJY29uc3QgVFZ3c1ZpZXdJZCYgLyphUHJldlZpZXdJZCovLAorCQlUVWlkIC8qYUN1c3RvbU1lc3NhZ2VJZCovLAorCQljb25zdCBURGVzQzgmIC8qYUN1c3RvbU1lc3NhZ2UqLyApCisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJU2V0dXBTdGF0dXNQYW5lTCgpOworCQorCQkJCQorCQkJCQorCQorCWlmICggaVBqc3VhQ29udGFpbmVyID09IE5VTEwgKQorCQl7CisJCWlQanN1YUNvbnRhaW5lciA9IENyZWF0ZUNvbnRhaW5lckwoKTsKKwkJaVBqc3VhQ29udGFpbmVyLT5TZXRNb3BQYXJlbnQoIHRoaXMgKTsKKwkJQXBwVWkoKS0+QWRkVG9TdGFja0woICp0aGlzLCBpUGpzdWFDb250YWluZXIgKTsKKwkJfSAKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisKKy8qKgorICovCit2b2lkIENwanN1YUNvbnRhaW5lclZpZXc6OkRvRGVhY3RpdmF0ZSgpCisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJQ2xlYW51cFN0YXR1c1BhbmUoKTsKKwkKKwlpZiAoIGlQanN1YUNvbnRhaW5lciAhPSBOVUxMICkKKwkJeworCQlBcHBVaSgpLT5SZW1vdmVGcm9tVmlld1N0YWNrKCAqdGhpcywgaVBqc3VhQ29udGFpbmVyICk7CisJCWRlbGV0ZSBpUGpzdWFDb250YWluZXI7CisJCWlQanN1YUNvbnRhaW5lciA9IE5VTEw7CisJCX0KKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisKKy8qKiAKKyAqIEhhbmRsZSBzdGF0dXMgcGFuZSBzaXplIGNoYW5nZSBmb3IgdGhpcyB2aWV3IChvdmVycmlkZSkKKyAqLwordm9pZCBDcGpzdWFDb250YWluZXJWaWV3OjpIYW5kbGVTdGF0dXNQYW5lU2l6ZUNoYW5nZSgpCisJeworCUNBa25WaWV3OjpIYW5kbGVTdGF0dXNQYW5lU2l6ZUNoYW5nZSgpOworCQorCS8vIHRoaXMgbWF5IGZhaWwsIGJ1dCB3ZSdyZSBub3QgYWJsZSB0byBwcm9wYWdhdGUgZXhjZXB0aW9ucyBoZXJlCisJVFZ3c1ZpZXdJZCB2aWV3OworCUFwcFVpKCktPkdldEFjdGl2ZVZpZXdJZCggdmlldyApOworCWlmICggdmlldy5pVmlld1VpZCA9PSBJZCgpICkKKwkJeworCQlUSW50IHJlc3VsdDsKKwkJVFJBUCggcmVzdWx0LCBTZXR1cFN0YXR1c1BhbmVMKCkgKTsKKwkJfQorCisJLy8gSGlkZSBtZW51CisJQ2JhKCktPk1ha2VWaXNpYmxlKEVGYWxzZSk7CisJCisJLy9QdXRNZXNzYWdlKCJIYW5kbGVTdGF0dXNQYW5lU2l6ZUNoYW5nZSgpIik7CisJCisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb2RlXQorCS8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIENvZGVdCisJCisJfQorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIGZ1bmN0aW9uOiBkbyBub3QgbW9kaWZ5Cit2b2lkIENwanN1YUNvbnRhaW5lclZpZXc6OlNldHVwU3RhdHVzUGFuZUwoKQorCXsKKwkvLyByZXNldCB0aGUgY29udGV4dCBwYW5lCisJVFVpZCBjb250ZXh0UGFuZVVpZCA9IFRVaWQ6OlVpZCggRUVpa1N0YXR1c1BhbmVVaWRDb250ZXh0ICk7CisJQ0Vpa1N0YXR1c1BhbmVCYXNlOjpUUGFuZUNhcGFiaWxpdGllcyBzdWJQYW5lQ29udGV4dCA9IAorCQlTdGF0dXNQYW5lKCktPlBhbmVDYXBhYmlsaXRpZXMoIGNvbnRleHRQYW5lVWlkICk7CisJaWYgKCBzdWJQYW5lQ29udGV4dC5Jc1ByZXNlbnQoKSAmJiBzdWJQYW5lQ29udGV4dC5Jc0FwcE93bmVkKCkgKQorCQl7CisJCUNBa25Db250ZXh0UGFuZSogY29udGV4dCA9IHN0YXRpY19jYXN0PCBDQWtuQ29udGV4dFBhbmUqID4gKCAKKwkJCVN0YXR1c1BhbmUoKS0+Q29udHJvbEwoIGNvbnRleHRQYW5lVWlkICkgKTsKKwkJY29udGV4dC0+U2V0UGljdHVyZVRvRGVmYXVsdEwoKTsKKwkJfQorCQorCS8vIHNldHVwIHRoZSB0aXRsZSBwYW5lCisJVFVpZCB0aXRsZVBhbmVVaWQgPSBUVWlkOjpVaWQoIEVFaWtTdGF0dXNQYW5lVWlkVGl0bGUgKTsKKwlDRWlrU3RhdHVzUGFuZUJhc2U6OlRQYW5lQ2FwYWJpbGl0aWVzIHN1YlBhbmVUaXRsZSA9IAorCQlTdGF0dXNQYW5lKCktPlBhbmVDYXBhYmlsaXRpZXMoIHRpdGxlUGFuZVVpZCApOworCWlmICggc3ViUGFuZVRpdGxlLklzUHJlc2VudCgpICYmIHN1YlBhbmVUaXRsZS5Jc0FwcE93bmVkKCkgKQorCQl7CisJCUNBa25UaXRsZVBhbmUqIHRpdGxlID0gc3RhdGljX2Nhc3Q8IENBa25UaXRsZVBhbmUqID4oIAorCQkJU3RhdHVzUGFuZSgpLT5Db250cm9sTCggdGl0bGVQYW5lVWlkICkgKTsKKwkJVFJlc291cmNlUmVhZGVyIHJlYWRlcjsKKwkJaUVpa29uRW52LT5DcmVhdGVSZXNvdXJjZVJlYWRlckxDKCByZWFkZXIsIFJfUEpTVUFfQ09OVEFJTkVSX1RJVExFX1JFU09VUkNFICk7CisJCXRpdGxlLT5TZXRGcm9tUmVzb3VyY2VMKCByZWFkZXIgKTsKKwkJQ2xlYW51cFN0YWNrOjpQb3BBbmREZXN0cm95KCk7IC8vIHJlYWRlciBpbnRlcm5hbCBzdGF0ZQorCQl9CisJCQkJCisJfQorCisvLyBdXV0gZW5kIGdlbmVyYXRlZCBmdW5jdGlvbgorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIGZ1bmN0aW9uOiBkbyBub3QgbW9kaWZ5Cit2b2lkIENwanN1YUNvbnRhaW5lclZpZXc6OkNsZWFudXBTdGF0dXNQYW5lKCkKKwl7CisJfQorCisvLyBdXV0gZW5kIGdlbmVyYXRlZCBmdW5jdGlvbgorCisvKioKKyAqCUNyZWF0ZXMgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHRoZSB2aWV3LiAgWW91IG1heSBtb2RpZnkgdGhpcyBtZXRob2QncworICoJY29udGVudHMgYW5kIHRoZSBDUGpzdWFDb250YWluZXI6Ok5ld0woKSBzaWduYXR1cmUgYXMgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlCisgKgljb250YWluZXIsIGJ1dCB0aGUgc2lnbmF0dXJlIGZvciB0aGlzIG1ldGhvZCBpcyBmaXhlZC4KKyAqCUByZXR1cm4gbmV3IGluaXRpYWxpemVkIGluc3RhbmNlIG9mIENQanN1YUNvbnRhaW5lcgorICovCitDUGpzdWFDb250YWluZXIqIENwanN1YUNvbnRhaW5lclZpZXc6OkNyZWF0ZUNvbnRhaW5lckwoKQorCXsKKwlyZXR1cm4gQ1Bqc3VhQ29udGFpbmVyOjpOZXdMKCBDbGllbnRSZWN0KCksIE5VTEwsIHRoaXMgKTsKKwl9CisKK3ZvaWQgQ3Bqc3VhQ29udGFpbmVyVmlldzo6UHV0TWVzc2FnZSggY29uc3QgY2hhciAqbXNnICkKK3sKKwlpZiAoIWlQanN1YUNvbnRhaW5lcikKKwkgICAgcmV0dXJuOworCisJVFJBUEQocmVzdWx0LCBpUGpzdWFDb250YWluZXItPlB1dE1lc3NhZ2VMKG1zZykpOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zcmMvcGpzdWFBcHBVaS5jcHAgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YUFwcFVpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI4YzQyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zcmMvcGpzdWFBcHBVaS5jcHAKQEAgLTAsMCArMSwzNzAgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQXBwVWkuY3BwCisgQXV0aG9yICAgICAgOiBuYW5hbmcKKyBDb3B5cmlnaHQgICA6IENvcHlyaWdodCAoQykgMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyBEZXNjcmlwdGlvbiA6IAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBTeXN0ZW0gSW5jbHVkZXNdCisjaW5jbHVkZSA8ZWlrbWVudWIuaD4KKyNpbmNsdWRlIDxha25jb250ZXh0Lmg+CisjaW5jbHVkZSA8YWtudGl0bGUuaD4KKyNpbmNsdWRlIDxwanN1YS5yc2c+CisvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBTeXN0ZW0gSW5jbHVkZXNdCisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKyNpbmNsdWRlICJwanN1YUFwcFVpLmgiCisjaW5jbHVkZSAicGpzdWEuaHJoIgorI2luY2x1ZGUgInBqc3VhQ29udGFpbmVyVmlldy5oIgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb25zdGFudHNdCisvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb25zdGFudHNdCisKKyNpbmNsdWRlICIuLi8uLi9wanN1YV9hcHAuaCIKKyNpbmNsdWRlICIuLi8uLi9wanN1YV9hcHBfY29uZmlnLmgiCisKKy8qIEdsb2JhbCB2YXJzICovCitzdGF0aWMgQ3Bqc3VhQXBwVWkgKmFwcHVpID0gTlVMTDsKK3N0YXRpYyBwal9pb3F1ZXVlX3QgKmFwcF9pb3F1ZXVlID0gTlVMTDsKK3N0YXRpYyBpbnQgc3RhcnRfYXJnYyA9IDA7CitzdGF0aWMgY2hhciAqKnN0YXJ0X2FyZ3YgPSBOVUxMOworCitzdGF0aWMgcGpfc3RhdHVzX3QgSW5pdFN5bWJTb2NrZXQoKTsKK3N0YXRpYyB2b2lkIERlc3Ryb3lTeW1iU29ja2V0KCk7CisKKy8qIEhlbHBlciBmdW50aW9ucyB0byBpbml0L3Jlc3RhcnQvZGVzdHJveSB0aGUgcGpzdWEgKi8KK3N0YXRpYyB2b2lkIFBqc3VhSW5pdEwoKTsKK3N0YXRpYyB2b2lkIFBqc3VhRGVzdHJveUwoKTsKKworLyogcGpzdWEgYXBwIGNhbGxiYWNrcyAqLworc3RhdGljIHZvaWQgUGpzdWFPblN0YXJ0ZWQocGpfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyKiB0aXRsZSk7CitzdGF0aWMgdm9pZCBQanN1YU9uU3RvcHBlZChwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKK3N0YXRpYyB2b2lkIFBqc3VhT25Db25maWcocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKTsKKworLyogSGVscGVyIGNsYXNzIHRvIHNjaGVkdWxlIGZ1bmN0aW9uIGV4ZWN1dGlvbiAqLworY2xhc3MgTXlUaW1lciA6IHB1YmxpYyBDQWN0aXZlIAoreworcHVibGljOgorICAgIHR5cGVkZWYgdm9pZCAoKnRpbWVyX2Z1bmMpKCk7CisgICAgCitwdWJsaWM6CisgICAgc3RhdGljIE15VGltZXIqIE5ld0woaW50IG1zLCB0aW1lcl9mdW5jIGYpIHsKKwlNeVRpbWVyICpzZWxmID0gbmV3IE15VGltZXIoZik7CisJQ2xlYW51cFN0YWNrOjpQdXNoTChzZWxmKTsKKwlzZWxmLT5Db25zdHJ1Y3RMKG1zKTsKKwlDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKwlyZXR1cm4gc2VsZjsKKyAgICB9CisgICAgCisgICAgTXlUaW1lcih0aW1lcl9mdW5jIGYpIDogQ0FjdGl2ZShFUHJpb3JpdHlTdGFuZGFyZCksIGZ1bmMoZikge30KKyAgICB+TXlUaW1lcigpIHsKKwlDYW5jZWwoKTsKKwlydGltZXIuQ2xvc2UoKTsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIFJ1bkwoKSB7ICgqZnVuYykoKTsgZGVsZXRlIHRoaXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgRG9DYW5jZWwoKSB7IHJ0aW1lci5DYW5jZWwoKTsgfQorCitwcml2YXRlOgkKKyAgICBSVGltZXIgcnRpbWVyOworICAgIHRpbWVyX2Z1bmMgZnVuYzsKKyAgICAKKyAgICB2b2lkIENvbnN0cnVjdEwoaW50IG1zKSB7CisJcnRpbWVyLkNyZWF0ZUxvY2FsKCk7CisJQ0FjdGl2ZVNjaGVkdWxlcjo6QWRkKHRoaXMpOworCXJ0aW1lci5BZnRlcihpU3RhdHVzLCBtcyAqIDEwMDApOworCVNldEFjdGl2ZSgpOworICAgIH0KK307CisKKy8qKgorICogQ29uc3RydWN0IHRoZSBDcGpzdWFBcHBVaSBpbnN0YW5jZQorICovIAorQ3Bqc3VhQXBwVWk6OkNwanN1YUFwcFVpKCkKKwl7CisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb250ZW50c10KKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisKKy8qKiAKKyAqIFRoZSBhcHB1aSdzIGRlc3RydWN0b3IgcmVtb3ZlcyB0aGUgY29udGFpbmVyIGZyb20gdGhlIGNvbnRyb2wKKyAqIHN0YWNrIGFuZCBkZXN0cm95cyBpdC4KKyAqLworQ3Bqc3VhQXBwVWk6On5DcGpzdWFBcHBVaSgpCisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJfQorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIGZ1bmN0aW9uOiBkbyBub3QgbW9kaWZ5Cit2b2lkIENwanN1YUFwcFVpOjpJbml0aWFsaXplQ29udGFpbmVyc0woKQorCXsKKwlpUGpzdWFDb250YWluZXJWaWV3ID0gQ3Bqc3VhQ29udGFpbmVyVmlldzo6TmV3TCgpOworCUFkZFZpZXdMKCBpUGpzdWFDb250YWluZXJWaWV3ICk7CisJU2V0RGVmYXVsdFZpZXdMKCAqaVBqc3VhQ29udGFpbmVyVmlldyApOworCX0KKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIGZ1bmN0aW9uCisKKy8qKgorICogSGFuZGxlIGEgY29tbWFuZCBmb3IgdGhpcyBhcHB1aSAob3ZlcnJpZGUpCisgKiBAcGFyYW0gYUNvbW1hbmQgY29tbWFuZCBpZCB0byBiZSBoYW5kbGVkCisgKi8KK3ZvaWQgQ3Bqc3VhQXBwVWk6OkhhbmRsZUNvbW1hbmRMKCBUSW50IGFDb21tYW5kICkKKwl7CisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb2RlXQorCVRCb29sIGNvbW1hbmRIYW5kbGVkID0gRUZhbHNlOworCXN3aXRjaCAoIGFDb21tYW5kICkKKwkJeyAvLyBjb2RlIHRvIGRpc3BhdGNoIHRvIHRoZSBBcHBVaSdzIG1lbnUgYW5kIENCQSBjb21tYW5kcyBpcyBnZW5lcmF0ZWQgaGVyZQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkKKwkJCisJaWYgKCAhY29tbWFuZEhhbmRsZWQgKSAKKwkJeworCQlpZiAoIGFDb21tYW5kID09IEVBa25Tb2Z0a2V5RXhpdCB8fCBhQ29tbWFuZCA9PSBFRWlrQ21kRXhpdCApCisJCQl7CisJCQlFeGl0KCk7CisJCQl9CisJCX0KKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb2RlXQorCQorCX0KKworLyoqIAorICogT3ZlcnJpZGUgb2YgdGhlIEhhbmRsZVJlc291cmNlQ2hhbmdlTCB2aXJ0dWFsIGZ1bmN0aW9uCisgKi8KK3ZvaWQgQ3Bqc3VhQXBwVWk6OkhhbmRsZVJlc291cmNlQ2hhbmdlTCggVEludCBhVHlwZSApCisJeworCUNBa25WaWV3QXBwVWk6OkhhbmRsZVJlc291cmNlQ2hhbmdlTCggYVR5cGUgKTsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvZGVdCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29kZV0KKwkKKwl9CisJCQkJCisvKiogCisgKiBPdmVycmlkZSBvZiB0aGUgSGFuZGxlS2V5RXZlbnRMIHZpcnR1YWwgZnVuY3Rpb24KKyAqIEByZXR1cm4gRUtleVdhc0NvbnN1bWVkIGlmIGV2ZW50IHdhcyBoYW5kbGVkLCBFS2V5V2FzTm90Q29uc3VtZWQgaWYgbm90CisgKiBAcGFyYW0gYUtleUV2ZW50IAorICogQHBhcmFtIGFUeXBlIAorICovCitUS2V5UmVzcG9uc2UgQ3Bqc3VhQXBwVWk6OkhhbmRsZUtleUV2ZW50TCgKKwkJY29uc3QgVEtleUV2ZW50JiBhS2V5RXZlbnQsCisJCVRFdmVudENvZGUgYVR5cGUgKQorCXsKKwkvLyBUaGUgaW5oZXJpdGVkIEhhbmRsZUtleUV2ZW50TCBpcyBwcml2YXRlIGFuZCBjYW5ub3QgYmUgY2FsbGVkCisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb250ZW50c10KKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKworCS8vIExlZnQgb3IgcmlnaHQgc29mdGtleSBwcmVzc2VkCisJaWYgKGFUeXBlPT1FRXZlbnRLZXlEb3duICYmIAorCSAgICAoYUtleUV2ZW50LmlTY2FuQ29kZSA9PSBFU3RkS2V5RGV2aWNlMCB8fCAKKwkgICAgIGFLZXlFdmVudC5pU2NhbkNvZGUgPT0gRVN0ZEtleURldmljZTEpKSAgICAKKwl7CisJICAgIENiYSgpLT5NYWtlVmlzaWJsZShFVHJ1ZSk7CisJfSBlbHNlIHsKKwkgICAgQ2JhKCktPk1ha2VWaXNpYmxlKEVGYWxzZSk7ICAgCisJfQorCisJcmV0dXJuIEVLZXlXYXNOb3RDb25zdW1lZDsKKwl9CisKKy8qKiAKKyAqIE92ZXJyaWRlIG9mIHRoZSBIYW5kbGVWaWV3RGVhY3RpdmF0aW9uIHZpcnR1YWwgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gYVZpZXdJZFRvQmVEZWFjdGl2YXRlZCAKKyAqIEBwYXJhbSBhTmV3bHlBY3RpdmF0ZWRWaWV3SWQgCisgKi8KK3ZvaWQgQ3Bqc3VhQXBwVWk6OkhhbmRsZVZpZXdEZWFjdGl2YXRpb24oIAorCQljb25zdCBUVndzVmlld0lkJiBhVmlld0lkVG9CZURlYWN0aXZhdGVkLCAKKwkJY29uc3QgVFZ3c1ZpZXdJZCYgYU5ld2x5QWN0aXZhdGVkVmlld0lkICkKKwl7CisJQ0FrblZpZXdBcHBVaTo6SGFuZGxlVmlld0RlYWN0aXZhdGlvbiggCisJCQlhVmlld0lkVG9CZURlYWN0aXZhdGVkLCAKKwkJCWFOZXdseUFjdGl2YXRlZFZpZXdJZCApOworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJfQorCisvKioKKyAqIEBicmllZiBDb21wbGV0ZXMgdGhlIHNlY29uZCBwaGFzZSBvZiBTeW1iaWFuIG9iamVjdCBjb25zdHJ1Y3Rpb24uIAorICogUHV0IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBjb3VsZCBsZWF2ZSBoZXJlLiAKKyAqLyAKK3ZvaWQgQ3Bqc3VhQXBwVWk6OkNvbnN0cnVjdEwoKQorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvbnRlbnRzXQorCQorCUJhc2VDb25zdHJ1Y3RMKCBFQWtuRW5hYmxlU2tpbiAgfCAKKwkJCQkJIEVBa25FbmFibGVNU0sgKTsgCisJSW5pdGlhbGl6ZUNvbnRhaW5lcnNMKCk7CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJLy8gU2F2ZSBwb2ludGVyIHRvIHRoaXMgQXBwVWkKKwlhcHB1aSA9IHRoaXM7CisJCisJLy8gRnVsbCBzY3JlZW4KKwlTdGF0dXNQYW5lKCktPk1ha2VWaXNpYmxlKEVGYWxzZSk7CisJQ2JhKCktPk1ha2VWaXNpYmxlKEVGYWxzZSk7CisKKwlpZiAoSW5pdFN5bWJTb2NrZXQoKSAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFB1dE1zZygiRmFpbGVkIHRvIGluaXRpYWxpemUgU3ltYmlhbiBuZXR3b3JrIHBhcmFtLiIpOworCX0gZWxzZSB7CQorCSAgICBzdGFydF9hcmdjID0gcGpzdWFfYXBwX2RlZl9hcmdjOworCSAgICBzdGFydF9hcmd2ID0gKGNoYXIqKilwanN1YV9hcHBfZGVmX2FyZ3Y7CisKKwkgICAgLy8gU2NoZWR1bGUgTGliIEluaXQKKwkgICAgTXlUaW1lcjo6TmV3TCgxMDAsICZQanN1YUluaXRMKTsKKwl9CisJCisJfQorCisvKiBDYWxsZWQgYnkgU3ltYmlhbiBHVUkgZnJhbWV3b3JrIHdoZW4gYXBwIGlzIGFib3V0IHRvIGV4aXQgKi8KK3ZvaWQgQ3Bqc3VhQXBwVWk6OlByZXBhcmVUb0V4aXQoKQoreworICAgIFRSQVBEKHJlc3VsdCwgUGpzdWFEZXN0cm95TCgpKTsKKyAgICBEZXN0cm95U3ltYlNvY2tldCgpOworICAgIENsb3NlU1RETElCKCk7CisgICAgQ0FrblZpZXdBcHBVaTo6UHJlcGFyZVRvRXhpdCgpOworfQorCisvKiBQcmludCBtZXNzYWdlIG9uIHNjcmVlbiAqLwordm9pZCBDcGpzdWFBcHBVaTo6UHV0TXNnKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBpUGpzdWFDb250YWluZXJWaWV3LT5QdXRNZXNzYWdlKG1zZyk7Cit9CisKKyNpbmNsdWRlIDxlc19zb2NrLmg+CisKK3N0YXRpYyBSU29ja2V0U2VydiBhU29ja2V0U2VydmVyOworc3RhdGljIFJDb25uZWN0aW9uIGFDb25uOworCisvKiBDYWxsZWQgd2hlbiBwanN1YSBpcyBzdGFydGVkICovCit2b2lkIFBqc3VhT25TdGFydGVkKHBqX3N0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciogdGl0bGUpCit7CisgICAgY2hhciBlcnJfbXNnWzEyOF07CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgfHwgdGl0bGUgPT0gTlVMTCkgeworCWNoYXIgZXJyX3N0cltQSl9FUlJfTVNHX1NJWkVdOworCXBqX3N0cmVycm9yKHN0YXR1cywgZXJyX3N0ciwgc2l6ZW9mKGVycl9zdHIpKTsKKwlwal9hbnNpX3NucHJpbnRmKGVycl9tc2csIHNpemVvZihlcnJfbXNnKSwgIiVzOiAlcyIsCisJCQkgKHRpdGxlP3RpdGxlOiJBcHAgc3RhcnQgZXJyb3IiKSwgZXJyX3N0cik7CisJdGl0bGUgPSBlcnJfbXNnOworICAgIH0KKworICAgIGFwcHVpLT5QdXRNc2codGl0bGUpOworfQorCisvKiBDYWxsZWQgd2hlbiBwanN1YSBpcyBzdG9wcGVkICovCit2b2lkIFBqc3VhT25TdG9wcGVkKHBqX2Jvb2xfdCByZXN0YXJ0LCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKHJlc3RhcnQpIHsKKwlzdGFydF9hcmdjID0gYXJnYzsKKwlzdGFydF9hcmd2ID0gYXJndjsKKworCS8vIFNjaGVkdWxlIExpYiBJbml0CisJTXlUaW1lcjo6TmV3TCgxMDAsICZQanN1YUluaXRMKTsKKyAgICB9IGVsc2UgeworCS8qIERlc3Ryb3kgJiBxdWl0IEdVSSwgZS5nOiBjbGVhbiB1cCB3aW5kb3csIHJlc291cmNlcyAgKi8KKwlhcHB1aS0+RXhpdCgpOworICAgIH0KK30KKworLyogQ2FsbGVkIGJlZm9yZSBwanN1YSBpbml0aWFsaXppbmcgY29uZmlnLgorICogV2UgbmVlZCB0byBvdmVycmlkZSBzb21lIHNldHRpbmdzIGhlcmUuCisgKi8KK3ZvaWQgUGpzdWFPbkNvbmZpZyhwanN1YV9hcHBfY29uZmlnICpjZmcpCit7CisgICAgLyogRGlzYWJsZSB0aHJlYWRpbmcgKi8KKyAgICBjZmctPmNmZy50aHJlYWRfY250ID0gMDsKKyAgICBjZmctPmNmZy50aHJlYWRfY250ID0gMDsKKyAgICBjZmctPm1lZGlhX2NmZy50aHJlYWRfY250ID0gMDsKKyAgICBjZmctPm1lZGlhX2NmZy5oYXNfaW9xdWV1ZSA9IFBKX0ZBTFNFOworCisgICAgLyogQ3JlYXRlIGlvcXVldWUgZm9yIHRlbG5ldCBDTEkgKi8KKyAgICBpZiAoYXBwX2lvcXVldWUgPT0gIE5VTEwpIHsKKwlwal9pb3F1ZXVlX2NyZWF0ZShjZmctPnBvb2wsIDAsICZhcHBfaW9xdWV1ZSk7CisgICAgfQorICAgIGNmZy0+Y2xpX2NmZy50ZWxuZXRfY2ZnLmlvcXVldWUgPSBhcHBfaW9xdWV1ZTsgCit9CisKKy8vIFNldCBTeW1iaWFuIE9TIHBhcmFtZXRlcnMgaW4gcGpsaWIuCisvLyBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgcGpfaW5pdCgpIGlzIGNhbGxlZC4KK3BqX3N0YXR1c190IEluaXRTeW1iU29ja2V0KCkKK3sKKyAgICBwal9zeW1iaWFub3NfcGFyYW1zIHN5bV9wYXJhbXM7CisgICAgVEludCBlcnI7CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSBSU29ja2V0U2VydgorICAgIGlmICgoZXJyPWFTb2NrZXRTZXJ2ZXIuQ29ubmVjdCgzMikpICE9IEtFcnJOb25lKSB7CisJcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGVycik7CisgICAgfQorICAgIAorICAgIC8vIE9wZW4gdXAgYSBjb25uZWN0aW9uCisgICAgaWYgKChlcnI9YUNvbm4uT3BlbihhU29ja2V0U2VydmVyKSkgIT0gS0Vyck5vbmUpIHsKKwlhU29ja2V0U2VydmVyLkNsb3NlKCk7CisJcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGVycik7CisgICAgfQorICAgIGlmICgoZXJyPWFDb25uLlN0YXJ0KCkpICE9IEtFcnJOb25lKSB7CisJYUNvbm4uQ2xvc2UoKTsKKwlhU29ja2V0U2VydmVyLkNsb3NlKCk7CisJcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGVycik7CisgICAgfQorICAgIAorICAgIHBqX2J6ZXJvKCZzeW1fcGFyYW1zLCBzaXplb2Yoc3ltX3BhcmFtcykpOworICAgIHN5bV9wYXJhbXMucnNvY2tldHNlcnYgPSAmYVNvY2tldFNlcnZlcjsKKyAgICBzeW1fcGFyYW1zLnJjb25uZWN0aW9uID0gJmFDb25uOworICAgIHBqX3N5bWJpYW5vc19zZXRfcGFyYW1zKCZzeW1fcGFyYW1zKTsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCit2b2lkIERlc3Ryb3lTeW1iU29ja2V0KCkKK3sKKyAgICBhQ29ubi5DbG9zZSgpOworICAgIGFTb2NrZXRTZXJ2ZXIuQ2xvc2UoKTsKK30KKworCit2b2lkIFBqc3VhSW5pdEwoKQoreworICAgIHBqc3VhX2FwcF9jZmdfdCBhcHBfY2ZnOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICAKKyAgICBQanN1YURlc3Ryb3lMKCk7CisgICAgCisgICAgcGpfYnplcm8oJmFwcF9jZmcsIHNpemVvZihhcHBfY2ZnKSk7CisgICAgYXBwX2NmZy5hcmdjID0gc3RhcnRfYXJnYzsKKyAgICBhcHBfY2ZnLmFyZ3YgPSBzdGFydF9hcmd2OworICAgIGFwcF9jZmcub25fc3RhcnRlZCA9ICZQanN1YU9uU3RhcnRlZDsKKyAgICBhcHBfY2ZnLm9uX3N0b3BwZWQgPSAmUGpzdWFPblN0b3BwZWQ7CisgICAgYXBwX2NmZy5vbl9jb25maWdfaW5pdCA9ICZQanN1YU9uQ29uZmlnOworCisgICAgYXBwdWktPlB1dE1zZygiSW5pdGlhbGl6aW5nLi4iKTsKKyAgICBzdGF0dXMgPSBwanN1YV9hcHBfaW5pdCgmYXBwX2NmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworICAgIAorICAgIGFwcHVpLT5QdXRNc2coIlN0YXJ0aW5nLi4iKTsKKyAgICBzdGF0dXMgPSBwanN1YV9hcHBfcnVuKFBKX0ZBTFNFKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKK29uX3JldHVybjoKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJYXBwdWktPlB1dE1zZygiSW5pdGlhbGl6YXRpb24gZmFpbGVkIik7Cit9CisKK3ZvaWQgUGpzdWFEZXN0cm95TCgpCit7CisgICAgaWYgKGFwcF9pb3F1ZXVlKSB7CisJcGpfaW9xdWV1ZV9kZXN0cm95KGFwcF9pb3F1ZXVlKTsKKwlhcHBfaW9xdWV1ZSA9IE5VTEw7CisgICAgfQorICAgIHBqc3VhX2FwcF9kZXN0cm95KCk7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YUFwcGxpY2F0aW9uLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vc3JjL3Bqc3VhQXBwbGljYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTZiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YUFwcGxpY2F0aW9uLmNwcApAQCAtMCwwICsxLDc4IEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBwanN1YUFwcGxpY2F0aW9uLmNwcAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgU3lzdGVtIEluY2x1ZGVzXQorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgU3lzdGVtIEluY2x1ZGVzXQorCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIEluY2x1ZGVzXQorI2luY2x1ZGUgInBqc3VhQXBwbGljYXRpb24uaCIKKyNpbmNsdWRlICJwanN1YURvY3VtZW50LmgiCisjaWZkZWYgRUtBMgorI2luY2x1ZGUgPGVpa3N0YXJ0Lmg+CisjZW5kaWYKKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIEluY2x1ZGVzXQorCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbidzIFVJRCAob3ZlcnJpZGUgZnJvbSBDQXBhQXBwbGljYXRpb246OkFwcERsbFVpZCgpKQorICogQHJldHVybiBVSUQgZm9yIHRoaXMgYXBwbGljYXRpb24gKEtVaWRwanN1YUFwcGxpY2F0aW9uKQorICovCitUVWlkIENwanN1YUFwcGxpY2F0aW9uOjpBcHBEbGxVaWQoKSBjb25zdAorCXsKKwlyZXR1cm4gS1VpZHBqc3VhQXBwbGljYXRpb247CisJfQorCisvKioKKyAqIEBicmllZiBDcmVhdGVzIHRoZSBhcHBsaWNhdGlvbidzIGRvY3VtZW50IChvdmVycmlkZSBmcm9tIENBcGFBcHBsaWNhdGlvbjo6Q3JlYXRlRG9jdW1lbnRMKCkpCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0IChDcGpzdWFEb2N1bWVudCkKKyAqLworQ0FwYURvY3VtZW50KiBDcGpzdWFBcHBsaWNhdGlvbjo6Q3JlYXRlRG9jdW1lbnRMKCkKKwl7CisJcmV0dXJuIENwanN1YURvY3VtZW50OjpOZXdMKCAqdGhpcyApOworCX0KKworI2lmZGVmIEVLQTIKKworLyoqCisgKglAYnJpZWYgQ2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsgdG8gY29uc3RydWN0IHRoZSBhcHBsaWNhdGlvbiBvYmplY3QKKyAqICBAcmV0dXJuIFRoZSBhcHBsaWNhdGlvbiAoQ3Bqc3VhQXBwbGljYXRpb24pCisgKi8JCitMT0NBTF9DIENBcGFBcHBsaWNhdGlvbiogTmV3QXBwbGljYXRpb24oKQorCXsKKwlyZXR1cm4gbmV3IENwanN1YUFwcGxpY2F0aW9uOworCX0KKworLyoqCisqIEBicmllZiBUaGlzIHN0YW5kYXJkIGV4cG9ydCBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGFsbCBTZXJpZXMgNjAgYXBwbGljYXRpb25zCisqIEByZXR1cm4gZXJyb3IgY29kZQorICovCQorR0xERUZfQyBUSW50IEUzMk1haW4oKQorCXsKKwlyZXR1cm4gRWlrU3RhcnQ6OlJ1bkFwcGxpY2F0aW9uKCBOZXdBcHBsaWNhdGlvbiApOworCX0KKwkKKyNlbHNlIAkvLyBTZXJpZXMgNjAgMi54IG1haW4gRExMIHByb2dyYW0gY29kZQorCisvKioKKyogQGJyaWVmIFRoaXMgc3RhbmRhcmQgZXhwb3J0IGNvbnN0cnVjdHMgdGhlIGFwcGxpY2F0aW9uIG9iamVjdC4KKyogQHJldHVybiBUaGUgYXBwbGljYXRpb24gKENwanN1YUFwcGxpY2F0aW9uKQorKi8KK0VYUE9SVF9DIENBcGFBcHBsaWNhdGlvbiogTmV3QXBwbGljYXRpb24oKQorCXsKKwlyZXR1cm4gbmV3IENwanN1YUFwcGxpY2F0aW9uOworCX0KKworLyoqCisqIEBicmllZiBUaGlzIHN0YW5kYXJkIGV4cG9ydCBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGFsbCBTZXJpZXMgNjAgYXBwbGljYXRpb25zCisqIEByZXR1cm4gZXJyb3IgY29kZQorKi8KK0dMREVGX0MgVEludCBFMzJEbGwoVERsbFJlYXNvbiAvKnJlYXNvbiovKQorCXsKKwlyZXR1cm4gS0Vyck5vbmU7CisJfQorCisjZW5kaWYgLy8gRUtBMgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zcmMvcGpzdWFDb250YWluZXIuY3BwIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzdWEvc3ltYmlhbi9zcmMvcGpzdWFDb250YWluZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZWM1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YUNvbnRhaW5lci5jcHAKQEAgLTAsMCArMSwzMTIgQEAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBOYW1lICAgICAgICA6IHBqc3VhQ29udGFpbmVyLmNwcAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgU3lzdGVtIEluY2x1ZGVzXQorI2luY2x1ZGUgPGJhcnNyZWFkLmg+CisjaW5jbHVkZSA8ZWlraW1hZ2UuaD4KKyNpbmNsdWRlIDxlaWtlbnYuaD4KKyNpbmNsdWRlIDxzdHJpbmdsb2FkZXIuaD4KKyNpbmNsdWRlIDxlaWtsYWJlbC5oPgorI2luY2x1ZGUgPGFrbnZpZXdhcHB1aS5oPgorI2luY2x1ZGUgPGVpa2FwcHVpLmg+CisjaW5jbHVkZSA8YWtuaWNvbnV0aWxzLmg+CisjaW5jbHVkZSA8cGpzdWEubWJnPgorI2luY2x1ZGUgPHBqc3VhLnJzZz4KKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIFN5c3RlbSBJbmNsdWRlc10KKworLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBVc2VyIEluY2x1ZGVzXQorI2luY2x1ZGUgInBqc3VhQ29udGFpbmVyLmgiCisjaW5jbHVkZSAicGpzdWFDb250YWluZXJWaWV3LmgiCisjaW5jbHVkZSAicGpzdWEuaHJoIgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKworI2luY2x1ZGUgPGVpa21lbnViLmg+CisKKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29uc3RhbnRzXQorX0xJVCggS3Bqc3VhRmlsZSwgIlxccmVzb3VyY2VcXGFwcHNcXHBqc3VhLm1ibSIgKTsKKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIENvbnN0YW50c10KKworLyoqCisgKiBGaXJzdCBwaGFzZSBvZiBTeW1iaWFuIHR3by1waGFzZSBjb25zdHJ1Y3Rpb24uIFNob3VsZCBub3QgCisgKiBjb250YWluIGFueSBjb2RlIHRoYXQgY291bGQgbGVhdmUuCisgKi8KK0NQanN1YUNvbnRhaW5lcjo6Q1Bqc3VhQ29udGFpbmVyKCkKKwl7CisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb250ZW50c10KKwlpSW1hZ2UxID0gTlVMTDsKKwlpTGFiZWwxID0gTlVMTDsKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisvKiogCisgKiBEZXN0cm95IGNoaWxkIGNvbnRyb2xzLgorICovCitDUGpzdWFDb250YWluZXI6On5DUGpzdWFDb250YWluZXIoKQorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvbnRlbnRzXQorCWRlbGV0ZSBpSW1hZ2UxOworCWlJbWFnZTEgPSBOVUxMOworCWRlbGV0ZSBpTGFiZWwxOworCWlMYWJlbDEgPSBOVUxMOworCS8vIF1dXSBlbmQgZ2VuZXJhdGVkIHJlZ2lvbiBbR2VuZXJhdGVkIENvbnRlbnRzXQorCQorCX0KKwkJCQkKKy8qKgorICogQ29uc3RydWN0IHRoZSBjb250cm9sIChmaXJzdCBwaGFzZSkuCisgKiAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBhbmQgaW5pdGlhbGl6ZXMgaXQuCisgKiAgSW5zdGFuY2UgaXMgbm90IGxlZnQgb24gY2xlYW51cCBzdGFjay4KKyAqIEBwYXJhbSBhUmVjdCBib3VuZGluZyByZWN0YW5nbGUKKyAqIEBwYXJhbSBhUGFyZW50IG93bmluZyBwYXJlbnQsIG9yIE5VTEwKKyAqIEBwYXJhbSBhQ29tbWFuZE9ic2VydmVyIGNvbW1hbmQgb2JzZXJ2ZXIKKyAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgQ1Bqc3VhQ29udGFpbmVyCisgKi8KK0NQanN1YUNvbnRhaW5lciogQ1Bqc3VhQ29udGFpbmVyOjpOZXdMKCAKKwkJY29uc3QgVFJlY3QmIGFSZWN0LCAKKwkJY29uc3QgQ0NvZUNvbnRyb2wqIGFQYXJlbnQsIAorCQlNRWlrQ29tbWFuZE9ic2VydmVyKiBhQ29tbWFuZE9ic2VydmVyICkKKwl7CisJQ1Bqc3VhQ29udGFpbmVyKiBzZWxmID0gQ1Bqc3VhQ29udGFpbmVyOjpOZXdMQyggCisJCQlhUmVjdCwgCisJCQlhUGFyZW50LCAKKwkJCWFDb21tYW5kT2JzZXJ2ZXIgKTsKKwlDbGVhbnVwU3RhY2s6OlBvcCggc2VsZiApOworCXJldHVybiBzZWxmOworCX0KKworLyoqCisgKiBDb25zdHJ1Y3QgdGhlIGNvbnRyb2wgKGZpcnN0IHBoYXNlKS4KKyAqICBDcmVhdGVzIGFuIGluc3RhbmNlIGFuZCBpbml0aWFsaXplcyBpdC4KKyAqICBJbnN0YW5jZSBpcyBsZWZ0IG9uIGNsZWFudXAgc3RhY2suCisgKiBAcGFyYW0gYVJlY3QgVGhlIHJlY3RhbmdsZSBmb3IgdGhpcyB3aW5kb3cKKyAqIEBwYXJhbSBhUGFyZW50IG93bmluZyBwYXJlbnQsIG9yIE5VTEwKKyAqIEBwYXJhbSBhQ29tbWFuZE9ic2VydmVyIGNvbW1hbmQgb2JzZXJ2ZXIKKyAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIENQanN1YUNvbnRhaW5lcgorICovCitDUGpzdWFDb250YWluZXIqIENQanN1YUNvbnRhaW5lcjo6TmV3TEMoIAorCQljb25zdCBUUmVjdCYgYVJlY3QsIAorCQljb25zdCBDQ29lQ29udHJvbCogYVBhcmVudCwgCisJCU1FaWtDb21tYW5kT2JzZXJ2ZXIqIGFDb21tYW5kT2JzZXJ2ZXIgKQorCXsKKwlDUGpzdWFDb250YWluZXIqIHNlbGYgPSBuZXcgKCBFTGVhdmUgKSBDUGpzdWFDb250YWluZXIoKTsKKwlDbGVhbnVwU3RhY2s6OlB1c2hMKCBzZWxmICk7CisJc2VsZi0+Q29uc3RydWN0TCggYVJlY3QsIGFQYXJlbnQsIGFDb21tYW5kT2JzZXJ2ZXIgKTsKKwlyZXR1cm4gc2VsZjsKKwl9CisJCQkKKy8qKgorICogQ29uc3RydWN0IHRoZSBjb250cm9sIChzZWNvbmQgcGhhc2UpLgorICogIENyZWF0ZXMgYSB3aW5kb3cgdG8gY29udGFpbiB0aGUgY29udHJvbHMgYW5kIGFjdGl2YXRlcyBpdC4KKyAqIEBwYXJhbSBhUmVjdCBib3VuZGluZyByZWN0YW5nbGUKKyAqIEBwYXJhbSBhQ29tbWFuZE9ic2VydmVyIGNvbW1hbmQgb2JzZXJ2ZXIKKyAqIEBwYXJhbSBhUGFyZW50IG93bmluZyBwYXJlbnQsIG9yIE5VTEwKKyAqLyAKK3ZvaWQgQ1Bqc3VhQ29udGFpbmVyOjpDb25zdHJ1Y3RMKCAKKwkJY29uc3QgVFJlY3QmIGFSZWN0LCAKKwkJY29uc3QgQ0NvZUNvbnRyb2wqIGFQYXJlbnQsIAorCQlNRWlrQ29tbWFuZE9ic2VydmVyKiBhQ29tbWFuZE9ic2VydmVyICkKKwl7CisJaWYgKCBhUGFyZW50ID09IE5VTEwgKQorCSAgICB7CisJCUNyZWF0ZVdpbmRvd0woKTsKKwkgICAgfQorCWVsc2UKKwkgICAgeworCSAgICBTZXRDb250YWluZXJXaW5kb3dMKCAqYVBhcmVudCApOworCSAgICB9CisJaUZvY3VzQ29udHJvbCA9IE5VTEw7CisJaUNvbW1hbmRPYnNlcnZlciA9IGFDb21tYW5kT2JzZXJ2ZXI7CisJSW5pdGlhbGl6ZUNvbnRyb2xzTCgpOworCVNldFJlY3QoIGFSZWN0ICk7CisKKwkvLyBGdWxsIHNjcmVlbgorCVNldEV4dGVudFRvV2hvbGVTY3JlZW4oKTsKKwkKKwkvLyBTZXQgbGFiZWwgY29sb3IKKwkvL2lMYWJlbDEtPk92ZXJyaWRlQ29sb3JMKCBFQ29sb3JMYWJlbFRleHQsIEtSZ2JXaGl0ZSApOworCS8vaUxhYmVsMS0+T3ZlcnJpZGVDb2xvckwoRUNvbG9yQ29udHJvbEJhY2tncm91bmQsIEtSZ2JCbGFjayApCisJaUxhYmVsMS0+U2V0RW1waGFzaXMoIENFaWtMYWJlbDo6RUZ1bGxFbXBoYXNpcyk7CisJaUxhYmVsMS0+T3ZlcnJpZGVDb2xvckwoIEVDb2xvckxhYmVsSGlnaGxpZ2h0RnVsbEVtcGhhc2lzLCBLUmdiQmxhY2sgKTsKKwlpTGFiZWwxLT5PdmVycmlkZUNvbG9yTCggRUNvbG9yTGFiZWxUZXh0RW1waGFzaXMsIEtSZ2JXaGl0ZSApOworCisJLy8gU2V0IGxhYmVsIGZvbnQKKwkgQ0ZvbnQqIGZvbnRVc2VkOworCV9MSVQoZiwiQXJpYWwiKTsKKwlURm9udFNwZWMqIGZvbnRTcGVjID0gbmV3IFRGb250U3BlYyhmLCAxMDUpOworCVRGb250U3R5bGUqIGZvbnRTdHlsZSA9IG5ldyBURm9udFN0eWxlKCk7CisJZm9udFN0eWxlLT5TZXRQb3N0dXJlKEVQb3N0dXJlVXByaWdodCk7CisJZm9udFN0eWxlLT5TZXRTdHJva2VXZWlnaHQoRVN0cm9rZVdlaWdodE5vcm1hbCk7CisJZm9udFNwZWMtPmlGb250U3R5bGUgPSAqZm9udFN0eWxlOworCWZvbnRVc2VkID0gaUNvZUVudi0+Q3JlYXRlU2NyZWVuRm9udEwoKmZvbnRTcGVjKTsKKwlpTGFiZWwxLT5TZXRGb250KGZvbnRVc2VkKTsKKwlpTGFiZWwxLT5TZXRBbGlnbm1lbnQoIEVIQ2VudGVyVkNlbnRlciApOworCQorCUFjdGl2YXRlTCgpOworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtQb3N0LUFjdGl2YXRlTCBpbml0aWFsaXphdGlvbnNdCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtQb3N0LUFjdGl2YXRlTCBpbml0aWFsaXphdGlvbnNdCisJCisJfQorCQkJCisvKioKKyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29udHJvbHMgaW4gdGhlIGNvbnRhaW5lciAob3ZlcnJpZGUpCisqIEByZXR1cm4gY291bnQKKyovCitUSW50IENQanN1YUNvbnRhaW5lcjo6Q291bnRDb21wb25lbnRDb250cm9scygpIGNvbnN0CisJeworCXJldHVybiAoIGludCApIEVMYXN0Q29udHJvbDsKKwl9CisJCQkJCisvKioKKyogR2V0IHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIGluZGV4IChvdmVycmlkZSkKKyogQHBhcmFtIGFJbmRleCBDb250cm9sIGluZGV4IFswLi4ubikgKGxpbWl0ZWQgYnkgI0NvdW50Q29tcG9uZW50Q29udHJvbHMpCisqIEByZXR1cm4gUG9pbnRlciB0byBjb250cm9sCisqLworQ0NvZUNvbnRyb2wqIENQanN1YUNvbnRhaW5lcjo6Q29tcG9uZW50Q29udHJvbCggVEludCBhSW5kZXggKSBjb25zdAorCXsKKwkvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIHJlZ2lvbjogZG8gbm90IG1vZGlmeSBbR2VuZXJhdGVkIENvbnRlbnRzXQorCXN3aXRjaCAoIGFJbmRleCApCisJCXsKKwkJY2FzZSBFSW1hZ2UxOgorCQkJcmV0dXJuIGlJbWFnZTE7CisJCWNhc2UgRUxhYmVsMToKKwkJCXJldHVybiBpTGFiZWwxOworCQl9CisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJLy8gaGFuZGxlIGFueSB1c2VyIGNvbnRyb2xzIGhlcmUuLi4KKwkKKwlyZXR1cm4gTlVMTDsKKwl9CisJCQkJCisvKioKKyAqCUhhbmRsZSByZXNpemluZyBvZiB0aGUgY29udGFpbmVyLiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbGF5IG91dAorICogIGZ1bGwtc2l6ZWQgY29udHJvbHMgbGlrZSBsaXN0IGJveGVzIGZvciBhbnkgc2NyZWVuIHNpemUsIGFuZCB3aWxsIGxheW91dAorICogIGxhYmVscywgZWRpdG9ycywgZXRjLiB0byB0aGUgc2l6ZSB0aGV5IHdlcmUgZ2l2ZW4gaW4gdGhlIFVJIGRlc2lnbmVyLgorICogIFRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gYWRqdXN0IGFyYml0cmFyeSBjb250cm9scyB0bworICogIGFueSBzY3JlZW4gc2l6ZS4KKyAqLwkJCQkKK3ZvaWQgQ1Bqc3VhQ29udGFpbmVyOjpTaXplQ2hhbmdlZCgpCisJeworCUNDb2VDb250cm9sOjpTaXplQ2hhbmdlZCgpOworCUxheW91dENvbnRyb2xzKCk7CisKKwkvLyBBbGlnbiB0aGUgaW1hZ2UKKwlpbnQgeCA9IChTaXplKCkuaVdpZHRoIC0gaUltYWdlMS0+U2l6ZSgpLmlXaWR0aCkgLyAyOworCWludCB5ID0gKFNpemUoKS5pSGVpZ2h0IC0gaUltYWdlMS0+U2l6ZSgpLmlIZWlnaHQpIC8gMjsKKwlpSW1hZ2UxLT5TZXRQb3NpdGlvbihUUG9pbnQoeCwgeSkpOworCQorCS8vIEFsaWduIHRoZSBsYWJlbAorCWlMYWJlbDEtPlNldEV4dGVudChUUG9pbnQoMCwgU2l6ZSgpLmlIZWlnaHQgLSBpTGFiZWwxLT5TaXplKCkuaUhlaWdodCksCisJCQkgICBUU2l6ZShTaXplKCkuaVdpZHRoLCBpTGFiZWwxLT5TaXplKCkuaUhlaWdodCkpOworCQorCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCQkKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisJCQkJCisvLyBbW1sgYmVnaW4gZ2VuZXJhdGVkIGZ1bmN0aW9uOiBkbyBub3QgbW9kaWZ5CisvKioKKyAqIExheW91dCBjb21wb25lbnRzIGFzIHNwZWNpZmllZCBpbiB0aGUgVUkgRGVzaWduZXIKKyAqLwordm9pZCBDUGpzdWFDb250YWluZXI6OkxheW91dENvbnRyb2xzKCkKKwl7CisJaUltYWdlMS0+U2V0RXh0ZW50KCBUUG9pbnQoIDAsIDAgKSwgVFNpemUoIDk5LCAxMTEgKSApOworCWlMYWJlbDEtPlNldEV4dGVudCggVFBvaW50KCAwLCAxOTYgKSwgVFNpemUoIDI0MSwgMjcgKSApOworCX0KKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIGZ1bmN0aW9uCisKKy8qKgorICoJSGFuZGxlIGtleSBldmVudHMuCisgKi8JCQkJCitUS2V5UmVzcG9uc2UgQ1Bqc3VhQ29udGFpbmVyOjpPZmZlcktleUV2ZW50TCggCisJCWNvbnN0IFRLZXlFdmVudCYgYUtleUV2ZW50LCAKKwkJVEV2ZW50Q29kZSBhVHlwZSApCisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgQ29udGVudHNdCisJCisJaWYgKCBpRm9jdXNDb250cm9sICE9IE5VTEwKKwkJJiYgaUZvY3VzQ29udHJvbC0+T2ZmZXJLZXlFdmVudEwoIGFLZXlFdmVudCwgYVR5cGUgKSA9PSBFS2V5V2FzQ29uc3VtZWQgKQorCQl7CisJCXJldHVybiBFS2V5V2FzQ29uc3VtZWQ7CisJCX0KKwlyZXR1cm4gQ0NvZUNvbnRyb2w6Ok9mZmVyS2V5RXZlbnRMKCBhS2V5RXZlbnQsIGFUeXBlICk7CisJfQorCQkJCQorLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCBmdW5jdGlvbjogZG8gbm90IG1vZGlmeQorLyoqCisgKglJbml0aWFsaXplIGVhY2ggY29udHJvbCB1cG9uIGNyZWF0aW9uLgorICovCQkJCQordm9pZCBDUGpzdWFDb250YWluZXI6OkluaXRpYWxpemVDb250cm9sc0woKQorCXsKKwlpSW1hZ2UxID0gbmV3ICggRUxlYXZlICkgQ0Vpa0ltYWdlOworCQl7CisJCUNGYnNCaXRtYXAgKmJpdG1hcCwgKm1hc2s7CisJCUFrbkljb25VdGlsczo6Q3JlYXRlSWNvbkwoIGJpdG1hcCwgbWFzaywKKwkJCQlLcGpzdWFGaWxlLCBFTWJtUGpzdWFQanN1YSwgLTEgKTsKKwkJQWtuSWNvblV0aWxzOjpTZXRTaXplKCBiaXRtYXAsIFRTaXplKCA5OSwgMTExICksIEVBc3BlY3RSYXRpb1ByZXNlcnZlZCApOworCQlpSW1hZ2UxLT5TZXRQaWN0dXJlKCBiaXRtYXAgKTsKKwkJfQorCWlJbWFnZTEtPlNldEFsaWdubWVudCggRUhDZW50ZXJWVG9wICk7CisJaUxhYmVsMSA9IG5ldyAoIEVMZWF2ZSApIENFaWtMYWJlbDsKKwlpTGFiZWwxLT5TZXRDb250YWluZXJXaW5kb3dMKCAqdGhpcyApOworCQl7CisJCVRSZXNvdXJjZVJlYWRlciByZWFkZXI7CisJCWlFaWtvbkVudi0+Q3JlYXRlUmVzb3VyY2VSZWFkZXJMQyggcmVhZGVyLCBSX1BKU1VBX0NPTlRBSU5FUl9MQUJFTDEgKTsKKwkJaUxhYmVsMS0+Q29uc3RydWN0RnJvbVJlc291cmNlTCggcmVhZGVyICk7CisJCUNsZWFudXBTdGFjazo6UG9wQW5kRGVzdHJveSgpOyAvLyByZWFkZXIgaW50ZXJuYWwgc3RhdGUKKwkJfQorCQorCX0KKy8vIF1dXSBlbmQgZ2VuZXJhdGVkIGZ1bmN0aW9uCisKKy8qKiAKKyAqIEhhbmRsZSBnbG9iYWwgcmVzb3VyY2UgY2hhbmdlcywgc3VjaCBhcyBzY2FsYWJsZSBVSSBvciBza2luIGV2ZW50cyAob3ZlcnJpZGUpCisgKi8KK3ZvaWQgQ1Bqc3VhQ29udGFpbmVyOjpIYW5kbGVSZXNvdXJjZUNoYW5nZSggVEludCBhVHlwZSApCisJeworCUNDb2VDb250cm9sOjpIYW5kbGVSZXNvdXJjZUNoYW5nZSggYVR5cGUgKTsKKwlTZXRSZWN0KCBpQXZrb25WaWV3QXBwVWktPlZpZXcoIFRVaWQ6OlVpZCggRVBqc3VhQ29udGFpbmVyVmlld0lkICkgKS0+Q2xpZW50UmVjdCgpICk7CisJLy8gW1tbIGJlZ2luIGdlbmVyYXRlZCByZWdpb246IGRvIG5vdCBtb2RpZnkgW0dlbmVyYXRlZCBDb250ZW50c10KKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisJCQkJCisvKioKKyAqCURyYXcgY29udGFpbmVyIGNvbnRlbnRzLgorICovCQkJCQordm9pZCBDUGpzdWFDb250YWluZXI6OkRyYXcoIGNvbnN0IFRSZWN0JiBhUmVjdCApIGNvbnN0CisJeworCS8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgQ29udGVudHNdCisJQ1dpbmRvd0djJiBnYyA9IFN5c3RlbUdjKCk7CisJZ2MuU2V0UGVuU3R5bGUoIENHcmFwaGljc0NvbnRleHQ6OkVOdWxsUGVuICk7CisJVFJnYiBiYWNrQ29sb3IoIDAsMCwwICk7CisJZ2MuU2V0QnJ1c2hDb2xvciggYmFja0NvbG9yICk7CisJZ2MuU2V0QnJ1c2hTdHlsZSggQ0dyYXBoaWNzQ29udGV4dDo6RVNvbGlkQnJ1c2ggKTsKKwlnYy5EcmF3UmVjdCggYVJlY3QgKTsKKwkKKwkvLyBdXV0gZW5kIGdlbmVyYXRlZCByZWdpb24gW0dlbmVyYXRlZCBDb250ZW50c10KKwkKKwl9CisKK3ZvaWQgQ1Bqc3VhQ29udGFpbmVyOjpQdXRNZXNzYWdlTCggY29uc3QgY2hhciAqIG1zZyApCit7CisgICAgaWYgKCFpTGFiZWwxKQorCXJldHVybjsKKyAgICAKKyAgICBUUHRyQzggcHRyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFVpbnQ4Kj4obXNnKSk7CisgICAgSEJ1ZkMqIGJ1ZmZlciA9IEhCdWZDOjpOZXdMQyhwdHIuTGVuZ3RoKCkpOworICAgIGJ1ZmZlci0+RGVzKCkuQ29weShwdHIpOworCisgICAgaUxhYmVsMS0+U2V0VGV4dEwoKmJ1ZmZlcik7CisgICAgaUxhYmVsMS0+RHJhd05vdygpOworCisgICAgQ2xlYW51cFN0YWNrOjpQb3BBbmREZXN0cm95KGJ1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YURvY3VtZW50LmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3N5bWJpYW4vc3JjL3Bqc3VhRG9jdW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDljNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS9zeW1iaWFuL3NyYy9wanN1YURvY3VtZW50LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTmFtZSAgICAgICAgOiBwanN1YURvY3VtZW50LmNwcAorIEF1dGhvciAgICAgIDogbmFuYW5nCisgQ29weXJpZ2h0ICAgOiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgRGVzY3JpcHRpb24gOiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8vIFtbWyBiZWdpbiBnZW5lcmF0ZWQgcmVnaW9uOiBkbyBub3QgbW9kaWZ5IFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKyNpbmNsdWRlICJwanN1YURvY3VtZW50LmgiCisjaW5jbHVkZSAicGpzdWFBcHBVaS5oIgorLy8gXV1dIGVuZCBnZW5lcmF0ZWQgcmVnaW9uIFtHZW5lcmF0ZWQgVXNlciBJbmNsdWRlc10KKworLyoqCisgKiBAYnJpZWYgQ29uc3RydWN0cyB0aGUgZG9jdW1lbnQgY2xhc3MgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAqIEBwYXJhbSBhbkFwcGxpY2F0aW9uIHRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZQorICovCitDcGpzdWFEb2N1bWVudDo6Q3Bqc3VhRG9jdW1lbnQoIENFaWtBcHBsaWNhdGlvbiYgYW5BcHBsaWNhdGlvbiApCisJOiBDQWtuRG9jdW1lbnQoIGFuQXBwbGljYXRpb24gKQorCXsKKwl9CisKKy8qKgorICogQGJyaWVmIENvbXBsZXRlcyB0aGUgc2Vjb25kIHBoYXNlIG9mIFN5bWJpYW4gb2JqZWN0IGNvbnN0cnVjdGlvbi4gCisgKiBQdXQgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IGNvdWxkIGxlYXZlIGhlcmUuICAKKyAqLyAKK3ZvaWQgQ3Bqc3VhRG9jdW1lbnQ6OkNvbnN0cnVjdEwoKQorCXsKKwl9CisJCisvKioKKyAqIFN5bWJpYW4gT1MgdHdvLXBoYXNlIGNvbnN0cnVjdG9yLgorICoKKyAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Bqc3VhRG9jdW1lbnQsIGNvbnN0cnVjdHMgaXQsIGFuZAorICogcmV0dXJucyBpdC4KKyAqCisgKiBAcGFyYW0gYUFwcCB0aGUgYXBwbGljYXRpb24gaW5zdGFuY2UKKyAqIEByZXR1cm4gdGhlIG5ldyBDcGpzdWFEb2N1bWVudAorICovCitDcGpzdWFEb2N1bWVudCogQ3Bqc3VhRG9jdW1lbnQ6Ok5ld0woIENFaWtBcHBsaWNhdGlvbiYgYUFwcCApCisJeworCUNwanN1YURvY3VtZW50KiBzZWxmID0gbmV3ICggRUxlYXZlICkgQ3Bqc3VhRG9jdW1lbnQoIGFBcHAgKTsKKwlDbGVhbnVwU3RhY2s6OlB1c2hMKCBzZWxmICk7CisJc2VsZi0+Q29uc3RydWN0TCgpOworCUNsZWFudXBTdGFjazo6UG9wKCBzZWxmICk7CisJcmV0dXJuIHNlbGY7CisJfQorCisvKioKKyAqIEBicmllZiBDcmVhdGVzIHRoZSBhcHBsaWNhdGlvbiBVSSBvYmplY3QgZm9yIHRoaXMgZG9jdW1lbnQuCisgKiBAcmV0dXJuIHRoZSBuZXcgaW5zdGFuY2UKKyAqLwkKK0NFaWtBcHBVaSogQ3Bqc3VhRG9jdW1lbnQ6OkNyZWF0ZUFwcFVpTCgpCisJeworCXJldHVybiBuZXcgKCBFTGVhdmUgKSBDcGpzdWFBcHBVaTsKKwl9CisJCQkJCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS93bS9tYWluX3dtLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS93bS9tYWluX3dtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljMjEzOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3dtL21haW5fd20uYwpAQCAtMCwwICsxLDM3MCBAQAorLyogJElkOiBtYWluX3dtLmMgNDQ5MiAyMDEzLTA0LTIzIDEwOjU5OjUyWiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHdpbnVzZXJtLmg+CisjaW5jbHVkZSA8YXlnc2hlbGwuaD4KKyNpbmNsdWRlICIuLlxwanN1YV9hcHAuaCIKKyNpbmNsdWRlICIuLlxwanN1YV9hcHBfY29uZmlnLmgiCisKKyNkZWZpbmUgTUFJTldJTkRPV0NMQVNTIFRFWFQoIlBqc3VhRGxnIikKKyNkZWZpbmUgTUFJTldJTkRPV1RJVExFIFRFWFQoIlBKU1VBIikKKyNkZWZpbmUgTE9HT19QQVRIIFRFWFQoIlxcUHJvZ3JhbSBGaWxlc1xccGpzdWFcXHBqc3VhLmJtcCIpCisKKyNkZWZpbmUgV01fQVBQX0lOSVQJV01fVVNFUiArIDEKKyNkZWZpbmUgV01fQVBQX0RFU1RST1kJV01fVVNFUiArIDIKKyNkZWZpbmUgV01fQVBQX1JFU1RBUlQJV01fVVNFUiArIDMKKworc3RhdGljIEhJTlNUQU5DRQkgZ19oSW5zdDsKK3N0YXRpYyBIV05ECQkgZ19oV25kTWVudUJhcjsKK3N0YXRpYyBIV05ECQkgZ19oV25kTWFpbjsKK3N0YXRpYyBIV05ECQkgZ19oV25kTGJsOworc3RhdGljIEhXTkQJCSBnX2hXbmRJbWc7CitzdGF0aWMgSEJJVE1BUAkJIGdfaEJtcDsKKworc3RhdGljIGludAkJIHN0YXJ0X2FyZ2M7CitzdGF0aWMgY2hhcgkgICAgICAgKipzdGFydF9hcmd2OworCisvKiBIZWxwZXIgZnVudGlvbnMgdG8gaW5pdC9kZXN0cm95IHRoZSBwanN1YSAqLworc3RhdGljIHZvaWQgUGpzdWFJbml0KCk7CitzdGF0aWMgdm9pZCBQanN1YURlc3Ryb3koKTsKKworLyogcGpzdWEgYXBwIGNhbGxiYWNrcyAqLworc3RhdGljIHZvaWQgUGpzdWFPblN0YXJ0ZWQocGpfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyKiB0aXRsZSk7CitzdGF0aWMgdm9pZCBQanN1YU9uU3RvcHBlZChwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKK3N0YXRpYyB2b2lkIFBqc3VhT25Db25maWcocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKTsKKworTFJFU1VMVCBDQUxMQkFDSyBEaWFsb2dQcm9jKGNvbnN0IEhXTkQgaFduZCwKKwkJCSAgICBjb25zdCBVSU5UIE1zZywgCisJCQkgICAgY29uc3QgV1BBUkFNIHdQYXJhbSwKKwkJCSAgICBjb25zdCBMUEFSQU0gbFBhcmFtKSAKK3sgICAKKyAgICBMUkVTVUxUIHJlcyA9IDA7CisKKyAgICBzd2l0Y2ggKE1zZykgeworICAgIGNhc2UgV01fQ1JFQVRFOgorCWdfaFduZE1haW4gPSBoV25kOworCWJyZWFrOworCisgICAgY2FzZSBXTV9DT01NQU5EOiAvKiBFeGl0IG1lbnUgKi8KKyAgICBjYXNlIFdNX0NMT1NFOgorCVBvc3RRdWl0TWVzc2FnZSgwKTsKKwlicmVhazsKKworICAgIGNhc2UgV01fSE9US0VZOgorCS8qIEV4aXQgYXBwIHdoZW4gYmFjayBpcyBwcmVzc2VkLiAqLworCWlmIChWS19UQkFDSyA9PSBISVdPUkQobFBhcmFtKSAmJiAoMCAhPSAoTU9EX0tFWVVQICYgTE9XT1JEKGxQYXJhbSkpKSkgeworCSAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgTXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBXTV9DVExDT0xPUlNUQVRJQzoKKwkvKiBTZXQgdGV4dCBhbmQgYmFja2dyb3VuZCBjb2xvciBmb3Igc3RhdGljIHdpbmRvd3MgKi8KKwlTZXRUZXh0Q29sb3IoKEhEQyl3UGFyYW0sIFJHQigyNTUsIDI1NSwgMjU1KSk7CisJU2V0QmtDb2xvcigoSERDKXdQYXJhbSwgUkdCKDAsIDAsIDApKTsKKwlyZXR1cm4gKExSRVNVTFQpR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpOworCisgICAgY2FzZSBXTV9BUFBfSU5JVDoKKyAgICBjYXNlIFdNX0FQUF9SRVNUQVJUOgorCVBqc3VhSW5pdCgpOworCWJyZWFrOworCisgICAgY2FzZSBXTV9BUFBfREVTVFJPWToKKwlQb3N0UXVpdE1lc3NhZ2UoMCk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIE1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKworLyogPT09IEdVSSA9PT0gKi8KKworcGpfc3RhdHVzX3QgR3VpSW5pdCgpCit7CisgICAgV05EQ0xBU1Mgd2M7CisgICAgSFdORCBoV25kID0gTlVMTDsJCisgICAgUkVDVCByOworICAgIERXT1JEIGR3U3R5bGU7CisgICAgZW51bSB7IExBQkVMX0hFSUdIVCA9IDMwIH07CisgICAgZW51bSB7IE1FTlVfSURfRVhJVCA9IDUwMDAwIH07CisgICAgQklUTUFQIGJtcDsKKyAgICBITUVOVSBoUm9vdE1lbnU7CisgICAgU0hNRU5VQkFSSU5GTyBtYmk7CisKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgID0gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBhcHAgaXMgcnVubmluZy4gSWYgaXQncyBydW5uaW5nIHRoZW4gZm9jdXMgb24gdGhlIHdpbmRvdyAqLworICAgIGhXbmQgPSBGaW5kV2luZG93KE1BSU5XSU5ET1dDTEFTUywgTUFJTldJTkRPV1RJVExFKTsKKworICAgIGlmIChOVUxMICE9IGhXbmQpIHsKKwlTZXRGb3JlZ3JvdW5kV2luZG93KGhXbmQpOyAgICAKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHdjLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisgICAgd2MubHBmblduZFByb2MgPSAoV05EUFJPQylEaWFsb2dQcm9jOworICAgIHdjLmNiQ2xzRXh0cmEgPSAwOworICAgIHdjLmNiV25kRXh0cmEgPSAwOworICAgIHdjLmhJbnN0YW5jZSA9IGdfaEluc3Q7CisgICAgd2MuaEljb24gPSAwOworICAgIHdjLmhDdXJzb3IgPSAwOworICAgIHdjLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKTsKKyAgICB3Yy5scHN6TWVudU5hbWUJPSAwOworICAgIHdjLmxwc3pDbGFzc05hbWUgPSBNQUlOV0lORE9XQ0xBU1M7CisgICAgCisgICAgaWYgKCFSZWdpc3RlckNsYXNzKCZ3YykgIT0gMCkgeworCURXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIGFwcC4gd2luZG93ICovCisgICAgZ19oV25kTWFpbiA9IENyZWF0ZVdpbmRvdyhNQUlOV0lORE9XQ0xBU1MsIE1BSU5XSU5ET1dUSVRMRSwKKwkJCSAgICAgIFdTX1ZJU0lCTEUsIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIAorCQkJICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKKwkJCSAgICAgIChIV05EKU5VTEwsIE5VTEwsIGdfaEluc3QsIChMUFNUUilOVUxMKTsKKyAgICBpZiAoZ19oV25kTWFpbiA9PSBOVUxMKSB7CisJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBleGl0IG1lbnUgKi8KKyAgICBoUm9vdE1lbnUgPSBDcmVhdGVNZW51KCk7CisgICAgQXBwZW5kTWVudShoUm9vdE1lbnUsIE1GX1NUUklORywgTUVOVV9JRF9FWElULCBMIkV4aXQiKTsKKworICAgIC8qIEluaXRpYWxpemUgbWVudWJhciAqLworICAgIFplcm9NZW1vcnkoJm1iaSwgc2l6ZW9mKFNITUVOVUJBUklORk8pKTsKKyAgICBtYmkuY2JTaXplICAgICAgPSBzaXplb2YoU0hNRU5VQkFSSU5GTyk7CisgICAgbWJpLmh3bmRQYXJlbnQgID0gZ19oV25kTWFpbjsKKyAgICBtYmkuZHdGbGFncwkgICAgPSBTSENNQkZfSElERVNJUEJVVFRPTnxTSENNQkZfSE1FTlU7CisgICAgbWJpLm5Ub29sQmFySWQgID0gKFVJTlQpaFJvb3RNZW51OworICAgIG1iaS5oSW5zdFJlcyAgICA9IGdfaEluc3Q7CisKKyAgICBpZiAoRkFMU0UgPT0gU0hDcmVhdGVNZW51QmFyKCZtYmkpKSB7CisJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9CisKKyAgICAvKiBTdG9yZSBtZW51IHdpbmRvdyBoYW5kbGUgKi8KKyAgICBnX2hXbmRNZW51QmFyID0gbWJpLmh3bmRNQjsKKworICAgIC8qIFNob3cgdGhlIG1lbnUgKi8KKyAgICBEcmF3TWVudUJhcihnX2hXbmRNYWluKTsKKyAgICBTaG93V2luZG93KGdfaFduZE1lbnVCYXIsIFNXX1NIT1cpOworCisgICAgLyogT3ZlcnJpZGUgYmFjayBidXR0b24gKi8KKyAgICBTZW5kTWVzc2FnZShnX2hXbmRNZW51QmFyLCBTSENNQk1fT1ZFUlJJREVLRVksIFZLX1RCQUNLLAorCSAgICBNQUtFTFBBUkFNKFNITUJPRl9OT0RFRkFVTFQgfCBTSE1CT0ZfTk9USUZZLAorCSAgICBTSE1CT0ZfTk9ERUZBVUxUIHwgU0hNQk9GX05PVElGWSkpOworCisgICAgLyogR2V0IG1haW4gd2luZG93IHNpemUgKi8KKyAgICBHZXRDbGllbnRSZWN0KGdfaFduZE1haW4sICZyKTsKKyNpZiBkZWZpbmVkKFdJTjMyX1BMQVRGT1JNX1BTUEMpICYmIFdJTjMyX1BMQVRGT1JNX1BTUEMgIT0gMAorICAgIC8qIEFkanVzdCB0aGUgaGVpZ2h0IGZvciBQb2NrZXRQQyBwbGF0Zm9ybSAqLworICAgIHIuYm90dG9tIC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lNRU5VKTsKKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIGxvZ28gKi8KKyAgICBnX2hCbXAgPSBTSExvYWRESUJpdG1hcChMT0dPX1BBVEgpOyAvKiBmb3IganBlZywgdXNlcyBTSExvYWRJbWFnZUZpbGUoKSAqLworICAgIGlmIChnX2hCbXAgPT0gTlVMTCkgeworCURXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9CisgICAgR2V0T2JqZWN0KGdfaEJtcCwgc2l6ZW9mKGJtcCksICZibXApOworCisgICAgZHdTdHlsZSA9IFNTX0NFTlRFUklNQUdFIHwgU1NfUkVBTFNJWkVJTUFHRSB8IFNTX0JJVE1BUCB8CisJICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFOworICAgIGdfaFduZEltZyA9IENyZWF0ZVdpbmRvdyhURVhUKCJTVEFUSUMiKSwgTlVMTCwgZHdTdHlsZSwKKwkJCSAgICAgKHIucmlnaHQtci5sZWZ0LWJtcC5ibVdpZHRoKS8yLAorCQkJICAgICAoci5ib3R0b20tci50b3AtYm1wLmJtSGVpZ2h0KS8yLAorCQkJICAgICBibXAuYm1XaWR0aCwgYm1wLmJtSGVpZ2h0LAorCQkJICAgICBnX2hXbmRNYWluLCAoSE1FTlUpMCwgZ19oSW5zdCwgTlVMTCk7CisgICAgaWYgKGdfaFduZEltZyA9PSBOVUxMKSB7CisJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworICAgIH0KKyAgICBTZW5kTWVzc2FnZShnX2hXbmRJbWcsIFNUTV9TRVRJTUFHRSwgKFdQQVJBTSlJTUFHRV9CSVRNQVAsIChMUEFSQU0pZ19oQm1wKTsKKworICAgIC8qIENyZWF0ZSBsYWJlbCAqLworICAgIGR3U3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBFU19DRU5URVI7CisgICAgZ19oV25kTGJsID0gQ3JlYXRlV2luZG93KFRFWFQoIlNUQVRJQyIpLCBOVUxMLCBkd1N0eWxlLAorCQkwLCByLmJvdHRvbS1MQUJFTF9IRUlHSFQsIHIucmlnaHQtci5sZWZ0LCBMQUJFTF9IRUlHSFQsCisgICAgICAgICAgICAgICAgZ19oV25kTWFpbiwgKEhNRU5VKTAsIGdfaEluc3QsIE5VTEwpOworICAgIGlmIChnX2hXbmRMYmwgPT0gTlVMTCkgeworCURXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9CisgICAgU2V0V2luZG93VGV4dChnX2hXbmRMYmwsIF9UKCJQbGVhc2Ugd2FpdC4uIikpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitwal9zdGF0dXNfdCBHdWlTdGFydCgpCit7CisgICAgTVNHIG1zZzsKKyAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgeworICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgfQorCisgICAgcmV0dXJuIChtc2cud1BhcmFtKTsKK30KKwordm9pZCBHdWlEZXN0cm95KHZvaWQpCit7CisgICAgaWYgKGdfaFduZE1haW4pIHsKKwlEZXN0cm95V2luZG93KGdfaFduZE1haW4pOworCWdfaFduZE1haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAoZ19oV25kTWVudUJhcikgeworCURlc3Ryb3lXaW5kb3coZ19oV25kTWVudUJhcik7CisJZ19oV25kTWVudUJhciA9IE5VTEw7CisgICAgfQorICAgIGlmIChnX2hXbmRMYmwpIHsKKwlEZXN0cm95V2luZG93KGdfaFduZExibCk7CisJZ19oV25kTGJsID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGdfaFduZEltZykgeworCURlc3Ryb3lXaW5kb3coZ19oV25kSW1nKTsKKwlnX2hXbmRJbWcgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZ19oQm1wKSB7CisJRGVsZXRlT2JqZWN0KGdfaEJtcCk7CisJZ19oQm1wID0gTlVMTDsKKyAgICB9CisgICAgVW5yZWdpc3RlckNsYXNzKE1BSU5XSU5ET1dDTEFTUywgZ19oSW5zdCk7Cit9CisKKy8qID09PSBFTkdJTkUgPT09ICovCisKKy8qIENhbGxlZCB3aGVuIHBqc3VhIGlzIHN0YXJ0ZWQgKi8KK3ZvaWQgUGpzdWFPblN0YXJ0ZWQocGpfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBjaGFyKiB0aXRsZSkKK3sKKyAgICB3Y2hhcl90IHd0aXRsZVsxMjhdOworICAgIGNoYXIgZXJyX21zZ1sxMjhdOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTIHx8IHRpdGxlID09IE5VTEwpIHsKKwljaGFyIGVycl9zdHJbUEpfRVJSX01TR19TSVpFXTsKKwlwal9zdHJlcnJvcihzdGF0dXMsIGVycl9zdHIsIHNpemVvZihlcnJfc3RyKSk7CisJcGpfYW5zaV9zbnByaW50ZihlcnJfbXNnLCBzaXplb2YoZXJyX21zZyksICIlczogJXMiLAorCQkJICh0aXRsZT90aXRsZToiQXBwIHN0YXJ0IGVycm9yIiksIGVycl9zdHIpOworCXRpdGxlID0gZXJyX21zZzsKKyAgICB9CisKKyAgICBwal9hbnNpX3RvX3VuaWNvZGUodGl0bGUsIHN0cmxlbih0aXRsZSksIHd0aXRsZSwgUEpfQVJSQVlfU0laRSh3dGl0bGUpKTsKKyAgICBTZXRXaW5kb3dUZXh0KGdfaFduZExibCwgd3RpdGxlKTsKK30KKworLyogQ2FsbGVkIHdoZW4gcGpzdWEgaXMgc3RvcHBlZCAqLwordm9pZCBQanN1YU9uU3RvcHBlZChwal9ib29sX3QgcmVzdGFydCwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChyZXN0YXJ0KSB7CisJc3RhcnRfYXJnYyA9IGFyZ2M7CisJc3RhcnRfYXJndiA9IGFyZ3Y7CisKKwkvLyBTY2hlZHVsZSBMaWIgUmVzdGFydAorCVBvc3RNZXNzYWdlKGdfaFduZE1haW4sIFdNX0FQUF9SRVNUQVJULCAwLCAwKTsKKyAgICB9IGVsc2UgeworCS8qIERlc3Ryb3kgJiBxdWl0IEdVSSwgZS5nOiBjbGVhbiB1cCB3aW5kb3csIHJlc291cmNlcyAgKi8KKwlQb3N0TWVzc2FnZShnX2hXbmRNYWluLCBXTV9BUFBfREVTVFJPWSwgMCwgMCk7CisgICAgfQorfQorCisvKiBDYWxsZWQgYmVmb3JlIHBqc3VhIGluaXRpYWxpemluZyBjb25maWcuICovCit2b2lkIFBqc3VhT25Db25maWcocGpzdWFfYXBwX2NvbmZpZyAqY2ZnKQoreworICAgIFBKX1VOVVNFRF9BUkcoY2ZnKTsKK30KKwordm9pZCBQanN1YUluaXQoKQoreworICAgIHBqc3VhX2FwcF9jZmdfdCBhcHBfY2ZnOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIERlc3Ryb3kgcGpzdWEgYXBwIGZpcnN0ICovCisgICAgcGpzdWFfYXBwX2Rlc3Ryb3koKTsKKworICAgIC8qIEluaXQgcGpzdWEgYXBwICovCisgICAgcGpfYnplcm8oJmFwcF9jZmcsIHNpemVvZihhcHBfY2ZnKSk7CisgICAgYXBwX2NmZy5hcmdjID0gc3RhcnRfYXJnYzsKKyAgICBhcHBfY2ZnLmFyZ3YgPSBzdGFydF9hcmd2OworICAgIGFwcF9jZmcub25fc3RhcnRlZCA9ICZQanN1YU9uU3RhcnRlZDsKKyAgICBhcHBfY2ZnLm9uX3N0b3BwZWQgPSAmUGpzdWFPblN0b3BwZWQ7CisgICAgYXBwX2NmZy5vbl9jb25maWdfaW5pdCA9ICZQanN1YU9uQ29uZmlnOworCisgICAgU2V0V2luZG93VGV4dChnX2hXbmRMYmwsIF9UKCJJbml0aWFsaXppbmcuLiIpKTsKKyAgICBzdGF0dXMgPSBwanN1YV9hcHBfaW5pdCgmYXBwX2NmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworICAgIAorICAgIFNldFdpbmRvd1RleHQoZ19oV25kTGJsLCBfVCgiU3RhcnRpbmcuLiIpKTsKKyAgICBzdGF0dXMgPSBwanN1YV9hcHBfcnVuKFBKX0ZBTFNFKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKK29uX3JldHVybjoKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJU2V0V2luZG93VGV4dChnX2hXbmRMYmwsIF9UKCJJbml0aWFsaXphdGlvbiBmYWlsZWQiKSk7Cit9CisKK3ZvaWQgUGpzdWFEZXN0cm95KCkKK3sKKyAgICBwanN1YV9hcHBfZGVzdHJveSgpOworfQorCisvKiA9PT0gTUFJTiA9PT0gKi8KKworaW50IFdJTkFQSSBXaW5NYWluKAorICAgIEhJTlNUQU5DRSBoSW5zdGFuY2UsCisgICAgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsCisgICAgTFBXU1RSIGxwQ21kTGluZSwKKyAgICBpbnQgblNob3dDbWQKKykKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhoUHJldkluc3RhbmNlKTsKKyAgICBQSl9VTlVTRURfQVJHKGxwQ21kTGluZSk7CisgICAgUEpfVU5VU0VEX0FSRyhuU2hvd0NtZCk7CisKKyAgICAvLyBzdG9yZSB0aGUgaEluc3RhbmNlIGluIGdsb2JhbAorICAgIGdfaEluc3QgPSBoSW5zdGFuY2U7CisKKyAgICAvLyBTdGFydCBHVUkKKyAgICBzdGF0dXMgPSBHdWlJbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgLy8gU2V0dXAgYXJncyBhbmQgc3RhcnQgcGpzdWEKKyAgICBzdGFydF9hcmdjID0gcGpzdWFfYXBwX2RlZl9hcmdjOworICAgIHN0YXJ0X2FyZ3YgPSAoY2hhcioqKXBqc3VhX2FwcF9kZWZfYXJndjsKKyAgICBQb3N0TWVzc2FnZShnX2hXbmRNYWluLCBXTV9BUFBfSU5JVCwgMCwgMCk7CisKKyAgICBzdGF0dXMgPSBHdWlTdGFydCgpOworCQorb25fcmV0dXJuOgorICAgIFBqc3VhRGVzdHJveSgpOworICAgIEd1aURlc3Ryb3koKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS93bS9wanN1YS5ibXAgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN1YS93bS9wanN1YS5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMGM5NQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3VhL3dtL3Bqc3VhLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvZ3VpLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvZ3VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ZDhmNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9ndWkuaApAQCAtMCwwICsxLDcyIEBACisvKiAkSWQ6IGd1aS5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX0dVSV9IX18KKyNkZWZpbmUgX19HVUlfSF9fCisKKyNpbmNsdWRlIDxwai90eXBlcy5oPgorCitQSl9CRUdJTl9ERUNMCisKK3R5cGVkZWYgY2hhciBndWlfdGl0bGVbMzJdOworCit0eXBlZGVmIHZvaWQgKCpndWlfbWVudV9oYW5kbGVyKSAodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IGd1aV9tZW51IAoreworICAgIGd1aV90aXRsZQkJIHRpdGxlOworICAgIGd1aV9tZW51X2hhbmRsZXIJIGhhbmRsZXI7CisgICAgdW5zaWduZWQJCSBzdWJtZW51X2NudDsKKyAgICBzdHJ1Y3QgZ3VpX21lbnUJKnN1Ym1lbnVzWzE2XTsKK30gZ3VpX21lbnU7CisKK2VudW0gZ3VpX2ZsYWcgCit7CisgICAgV0lUSF9PSyA9IDAsCisgICAgV0lUSF9ZRVNOTyA9IDEsCisgICAgV0lUSF9PS0NBTkNFTCA9IDIKK307CisKK2VudW0gZ3VpX2tleQoreworICAgIEtFWV9DQU5DRUwgPSAnOScsCisgICAgS0VZX05PID0gJzAnLAorICAgIEtFWV9ZRVMgPSAnMScsCisgICAgS0VZX09LID0gJzEnLAorfTsKKworLyogSW5pdGlhbGl6ZSBHVUkgd2l0aCB0aGUgbWVudXMgYW5kIHN0dWZmICovCitwal9zdGF0dXNfdCBndWlfaW5pdChndWlfbWVudSAqbWVudSk7CisKKy8qIFJ1biBHVUkgbWFpbiBsb29wICovCitwal9zdGF0dXNfdCBndWlfc3RhcnQoZ3VpX21lbnUgKm1lbnUpOworCisvKiBTaWduYWwgR1VJIG1haW5sb29wIHRvIHN0b3AgKi8KK3ZvaWQgZ3VpX2Rlc3Ryb3kodm9pZCk7CisKKy8qIEFVWDogZGlzcGxheSBtZXNzYWdlYm94ICovCitlbnVtIGd1aV9rZXkgZ3VpX21zZ2JveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgZW51bSBndWlfZmxhZyBmbGFnKTsKKworLyogQVVYOiBzbGVlcCAqLwordm9pZCBndWlfc2xlZXAodW5zaWduZWQgc2VjKTsKKworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX0dVSV9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9tYWluX2NvbnNvbGUuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9tYWluX2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmFhM2YyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L21haW5fY29uc29sZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiAkSWQ6IG1haW5fY29uc29sZS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInN5c3Rlc3QuaCIKKyNpbmNsdWRlICJndWkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisKK3N0YXRpYyBwal9ib29sX3QgY29uc29sZV9xdWl0OworCitlbnVtIGd1aV9rZXkgZ3VpX21zZ2JveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgZW51bSBndWlfZmxhZyBmbGFnKQoreworICAgIHB1dHModGl0bGUpOworICAgIHB1dHMobWVzc2FnZSk7CisKKyAgICBmb3IgKDs7KSB7CisJY2hhciBpbnB1dFsxMF0sICpyZXQ7CisKKwlpZiAoZmxhZyA9PSBXSVRIX1lFU05PKQorCSAgICBwcmludGYoIiVjOlllcyAgJWM6Tm8gICIsIEtFWV9ZRVMsIEtFWV9OTyk7CisJZWxzZSBpZiAoZmxhZyA9PSBXSVRIX09LKQorCSAgICBwcmludGYoIiVjOk9LICAiLCBLRVlfT0spOworCWVsc2UgaWYgKGZsYWcgPT0gV0lUSF9PS0NBTkNFTCkKKwkgICAgcHJpbnRmKCIlYzpPSyAgJWM6Q2FuY2VsICAiLCBLRVlfT0ssIEtFWV9DQU5DRUwpOworCXB1dHMoIiIpOworCisJcmV0ID0gZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKTsKKwlpZiAoIXJldCkKKwkgICAgcmV0dXJuIEtFWV9DQU5DRUw7CisKKwlpZiAoaW5wdXRbMF09PUtFWV9OTyB8fCBpbnB1dFswXT09S0VZX1lFUyB8fCBpbnB1dFswXT09S0VZX0NBTkNFTCkKKwkgICAgcmV0dXJuIChlbnVtIGd1aV9rZXkpaW5wdXRbMF07CisgICAgfQorfQorCitwal9zdGF0dXNfdCBndWlfaW5pdChndWlfbWVudSAqbWVudSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKG1lbnUpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZW51KGNvbnN0IGNoYXIgKmluZGVudCwgY2hhciAqbWVudV9pZCwgZ3VpX21lbnUgKm1lbnUpCit7CisgICAgY2hhciBjaGlsZF9pbmRlbnRbMTZdOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBwal9hbnNpX3NucHJpbnRmKGNoaWxkX2luZGVudCwgc2l6ZW9mKGNoaWxkX2luZGVudCksICIlcyAgIiwgaW5kZW50KTsKKworICAgIHByaW50ZigiJXMlczogJXNcbiIsIGluZGVudCwgbWVudV9pZCwgbWVudS0+dGl0bGUpOworCisgICAgZm9yIChpPTA7IGk8bWVudS0+c3VibWVudV9jbnQ7ICsraSkgeworCWNoYXIgY2hpbGRfaWRbMTBdOworCisJcGpfYW5zaV9zcHJpbnRmKGNoaWxkX2lkLCAiJXMldSIsIG1lbnVfaWQsIGkpOworCisJaWYgKCFtZW51LT5zdWJtZW51c1tpXSkKKwkgICAgcHV0cygiIik7CisJZWxzZQorCSAgICBwcmludF9tZW51KGNoaWxkX2luZGVudCwgY2hpbGRfaWQsIG1lbnUtPnN1Ym1lbnVzW2ldKTsKKyAgICB9Cit9CisKK3BqX3N0YXR1c190IGd1aV9zdGFydChndWlfbWVudSAqbWVudSkKK3sKKyAgICB3aGlsZSAoIWNvbnNvbGVfcXVpdCkgeworCXVuc2lnbmVkIGk7CisJY2hhciBpbnB1dFsxMF0sICpwOworCWd1aV9tZW51ICpjaG9pY2U7CisKKwlwdXRzKCJNIEUgTiBVIDoiKTsKKwlwdXRzKCItLS0tLS0tLS0iKTsKKwlmb3IgKGk9MDsgaTxtZW51LT5zdWJtZW51X2NudDsgKytpKSB7CisJICAgIGNoYXIgbWVudV9pZFs0XTsKKwkgICAgcGpfYW5zaV9zcHJpbnRmKG1lbnVfaWQsICIldSIsIGkpOworCSAgICBwcmludF9tZW51KCIiLCBtZW51X2lkLCBtZW51LT5zdWJtZW51c1tpXSk7CisJfQorCXB1dHMoIiIpOworCXByaW50ZigiRW50ZXIgdGhlIG1lbnUgbnVtYmVyOiAiKTsKKworCWlmICghZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKSkKKwkgICAgYnJlYWs7CisKKwlwID0gaW5wdXQ7CisJY2hvaWNlID0gbWVudTsKKwl3aGlsZSAoKnAgJiYgKnAhPSdccicgJiYgKnAhPSdcbicpIHsKKwkgICAgdW5zaWduZWQgZCA9ICgqcCAtICcwJyk7CisJICAgIGlmIChkIDwgMCB8fCBkID49IGNob2ljZS0+c3VibWVudV9jbnQpIHsKKwkJcHV0cygiSW52YWxpZCBzZWxlY3Rpb24iKTsKKwkJY2hvaWNlID0gTlVMTDsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICBjaG9pY2UgPSBjaG9pY2UtPnN1Ym1lbnVzW2RdOworCSAgICArK3A7CisJfQorCisJaWYgKGNob2ljZSAmJiAqcCE9J1xyJyAmJiAqcCE9J1xuJykgeworCSAgICBwdXRzKCJJbnZhbGlkIGNoYXJhY3RlcnMgZW50ZXJlZCIpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoY2hvaWNlICYmIGNob2ljZS0+aGFuZGxlcikKKwkgICAgKCpjaG9pY2UtPmhhbmRsZXIpKCk7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3ZvaWQgZ3VpX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBjb25zb2xlX3F1aXQgPSBQSl9UUlVFOworfQorCit2b2lkIGd1aV9zbGVlcCh1bnNpZ25lZCBzZWMpCit7CisgICAgcGpfdGhyZWFkX3NsZWVwKHNlYyAqIDEwMDApOworfQorCitpbnQgbWFpbigpCit7CisgICAgaWYgKHN5c3Rlc3RfaW5pdCgpICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIDE7CisKKyAgICBzeXN0ZXN0X3J1bigpOworICAgIHN5c3Rlc3RfZGVpbml0KCk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L21haW5fd20uYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9tYWluX3dtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhYWMxZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9tYWluX3dtLmMKQEAgLTAsMCArMSw0NDQgQEAKKy8qICRJZDogbWFpbl93bS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgImd1aS5oIgorI2luY2x1ZGUgInN5c3Rlc3QuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKworI2luY2x1ZGUgImd1aS5oIgorI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbnVzZXJtLmg+CisjaW5jbHVkZSA8YXlnc2hlbGwuaD4KKworI2RlZmluZSBNQUlOV0lORE9XQ0xBU1MgVEVYVCgiU3lzVGVzdERsZyIpCisjZGVmaW5lIE1BSU5XSU5ET1dUSVRMRSBURVhUKCJQSlNZU1RFU1QiKQorCit0eXBlZGVmIHN0cnVjdCBtZW51X2hhbmRsZXJfdCB7CisgICAgVUlOVAkJIGlkOworICAgIGd1aV9tZW51X2hhbmRsZXIJIGhhbmRsZXI7Cit9IG1lbnVfaGFuZGxlcl90OworCitzdGF0aWMgSElOU1RBTkNFCSBnX2hJbnN0Oworc3RhdGljIEhXTkQJCSBnX2hXbmRNZW51QmFyOworc3RhdGljIEhXTkQJCSBnX2hXbmRNYWluOworc3RhdGljIEhXTkQJCSBnX2hXbmRMb2c7CitzdGF0aWMgcGpfdGhyZWFkX3QJKmdfbG9nX3RocmVhZDsKK3N0YXRpYyBndWlfbWVudQkJKmdfbWVudTsKK3N0YXRpYyB1bnNpZ25lZAkJIGdfbWVudV9oYW5kbGVyX2NudDsKK3N0YXRpYyBtZW51X2hhbmRsZXJfdAkgZ19tZW51X2hhbmRsZXJzWzY0XTsKKworc3RhdGljIHBqX2xvZ19mdW5jCSpnX2xvZ193cml0ZXJfb3JpZzsKKworc3RhdGljIHBqX3N0YXR1c190IGd1aV91cGRhdGVfbWVudShndWlfbWVudSAqbWVudSk7CisKK3N0YXRpYyB2b2lkIGxvZ193cml0ZXIoaW50IGxldmVsLCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisgICAgd2NoYXJfdCBidWZbNTEyXTsKKyAgICBpbnQgY3VyX2xlbjsKKworICAgIFBKX1VOVVNFRF9BUkcobGV2ZWwpOworCisgICAgcGpfYW5zaV90b191bmljb2RlKGJ1ZmZlciwgbGVuLCBidWYsIDUxMik7CisKKyAgICBpZiAoIWdfaFduZExvZykKKwlyZXR1cm47CisKKyAgICAvKiBGb3Igbm93LCBpZ25vcmUgbG9nIG1lc3NhZ2VzIGZyb20gb3RoZXIgdGhyZWFkIHRvIGF2b2lkIGRlYWRsb2NrICovCisgICAgaWYgKGdfbG9nX3RocmVhZCA9PSBwal90aHJlYWRfdGhpcygpKSB7CisJY3VyX2xlbiA9IChpbnQpU2VuZE1lc3NhZ2UoZ19oV25kTG9nLCBXTV9HRVRURVhUTEVOR1RILCAwLCAwKTsKKwlTZW5kTWVzc2FnZShnX2hXbmRMb2csIEVNX1NFVFNFTCwgKFdQQVJBTSljdXJfbGVuLCAoTFBBUkFNKWN1cl9sZW4pOworCVNlbmRNZXNzYWdlKGdfaFduZExvZywgRU1fUkVQTEFDRVNFTCwgKFdQQVJBTSkwLCAoTFBBUkFNKWJ1Zik7CisgICAgfQorICAgIAorICAgIC8vdW5jb21tZW50IHRvIGZvcndhcmQgdG8gdGhlIG9yaWdpbmFsIGxvZyB3cml0ZXIKKyAgICBpZiAoZ19sb2dfd3JpdGVyX29yaWcpCisJKCpnX2xvZ193cml0ZXJfb3JpZykobGV2ZWwsIGJ1ZmZlciwgbGVuKTsKK30KKworLyogZXhlY3V0ZSBtZW51IGhhbmRsZXIgZm9yIGlkIG1lbnUgc3BlY2lmaWVkLCByZXR1cm4gRkFMU0UgaWYgbWVudSBoYW5kbGVyIAorICogaXMgbm90IGZvdW5kLgorICovCitzdGF0aWMgQk9PTCBoYW5kbGVfbWVudShVSU5UIGlkKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ19tZW51X2hhbmRsZXJfY250OyArK2kpIHsKKwlpZiAoZ19tZW51X2hhbmRsZXJzW2ldLmlkID09IGlkKSB7CisJICAgIC8qIG1lbnUgaGFuZGxlciBmb3VuZCwgZXhlY3V0ZSBpdCAqLworCSAgICAoKmdfbWVudV9oYW5kbGVyc1tpXS5oYW5kbGVyKSgpOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKiBnZW5lcmF0ZSBzdWJtZW51IGFuZCByZWdpc3RlciB0aGUgbWVudSBoYW5kbGVyLCB0aGVuIHJldHVybiBuZXh0IG1lbnUgaWQgKi8KK3N0YXRpYyBVSU5UIGdlbmVyYXRlX3N1Ym1lbnUoSE1FTlUgcGFyZW50LCBVSU5UIGlkX3N0YXJ0LCBndWlfbWVudSAqbWVudSkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIFVJTlQgaWQgPSBpZF9zdGFydDsKKworICAgIGlmICghbWVudSkKKwlyZXR1cm4gaWQ7CisKKyAgICAvKiBnZW5lcmF0ZSBzdWJtZW51ICovCisgICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPnN1Ym1lbnVfY250OyArK2kpIHsKKworCWlmIChtZW51LT5zdWJtZW51c1tpXSA9PSBOVUxMKSB7CisKKwkgICAgLyogYWRkIHNlcGFyYXRvciAqLworCSAgICBBcHBlbmRNZW51KHBhcmVudCwgTUZfU0VQQVJBVE9SLCAwLCAwKTsKKwkKKwl9ICBlbHNlIGlmIChtZW51LT5zdWJtZW51c1tpXS0+c3VibWVudV9jbnQgIT0gMCkgeworCSAgICAKKwkgICAgLyogdGhpcyBzdWJtZW51IGl0ZW0gaGFzIGNoaWxkcmVuLCBnZW5lcmF0ZSBwb3B1cCBtZW51ICovCisJICAgIEhNRU5VIGhNZW51OworCSAgICB3Y2hhcl90IGJ1Zls2NF07CisJICAgIAorCSAgICBwal9hbnNpX3RvX3VuaWNvZGUobWVudS0+c3VibWVudXNbaV0tPnRpdGxlLCAKKwkJCSAgICAgICBwal9hbnNpX3N0cmxlbihtZW51LT5zdWJtZW51c1tpXS0+dGl0bGUpLAorCQkJICAgICAgIGJ1ZiwgNjQpOworCisJICAgIGhNZW51ID0gQ3JlYXRlUG9wdXBNZW51KCk7CisJICAgIEFwcGVuZE1lbnUocGFyZW50LCBNRl9TVFJJTkd8TUZfRU5BQkxFRHxNRl9QT1BVUCwgKFVJTlQpaE1lbnUsIGJ1Zik7CisJICAgIGlkID0gZ2VuZXJhdGVfc3VibWVudShoTWVudSwgaWQsIG1lbnUtPnN1Ym1lbnVzW2ldKTsKKworCX0gZWxzZSB7CisKKwkgICAgLyogdGhpcyBzdWJtZW51IGl0ZW0gaXMgbGVhZiwgcmVnaXN0ZXIgdGhlIGhhbmRsZXIgKi8KKwkgICAgd2NoYXJfdCBidWZbNjRdOworCSAgICAKKwkgICAgcGpfYW5zaV90b191bmljb2RlKG1lbnUtPnN1Ym1lbnVzW2ldLT50aXRsZSwgCisJCQkgICAgICAgcGpfYW5zaV9zdHJsZW4obWVudS0+c3VibWVudXNbaV0tPnRpdGxlKSwKKwkJCSAgICAgICBidWYsIDY0KTsKKworCSAgICBBcHBlbmRNZW51KHBhcmVudCwgTUZfU1RSSU5HLCBpZCwgYnVmKTsKKworCSAgICBpZiAobWVudS0+c3VibWVudXNbaV0tPmhhbmRsZXIpIHsKKwkJZ19tZW51X2hhbmRsZXJzW2dfbWVudV9oYW5kbGVyX2NudF0uaWQgPSBpZDsKKwkJZ19tZW51X2hhbmRsZXJzW2dfbWVudV9oYW5kbGVyX2NudF0uaGFuZGxlciA9IAorCQkJCQltZW51LT5zdWJtZW51c1tpXS0+aGFuZGxlcjsKKwkJKytnX21lbnVfaGFuZGxlcl9jbnQ7CisJICAgIH0KKworCSAgICArK2lkOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gaWQ7Cit9CisKK0JPT0wgSW5pdERpYWxvZygpCit7CisgICAgLyogdXBkYXRlIG1lbnUgKi8KKyAgICBpZiAoZ3VpX3VwZGF0ZV9tZW51KGdfbWVudSkgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworTFJFU1VMVCBDQUxMQkFDSyBEaWFsb2dQcm9jKGNvbnN0IEhXTkQgaFduZCwKKwkJCSAgICBjb25zdCBVSU5UIE1zZywgCisJCQkgICAgY29uc3QgV1BBUkFNIHdQYXJhbSwKKwkJCSAgICBjb25zdCBMUEFSQU0gbFBhcmFtKSAKK3sgICAKKyAgICBMUkVTVUxUIHJlcyA9IDA7CisKKyAgICBzd2l0Y2ggKE1zZykgeworICAgIGNhc2UgV01fQ1JFQVRFOgorCWdfaFduZE1haW4gPSBoV25kOworCWlmIChGQUxTRSA9PSBJbml0RGlhbG9nKCkpeworCSAgICBEZXN0cm95V2luZG93KGdfaFduZE1haW4pOworCX0KKwlicmVhazsKKworICAgIGNhc2UgV01fQ0xPU0U6CisJRGVzdHJveVdpbmRvdyhnX2hXbmRNYWluKTsKKwlicmVhazsKKworICAgIGNhc2UgV01fREVTVFJPWToKKwlpZiAoZ19oV25kTWVudUJhcikKKwkgICAgRGVzdHJveVdpbmRvdyhnX2hXbmRNZW51QmFyKTsKKwlnX2hXbmRNZW51QmFyID0gTlVMTDsKKwlnX2hXbmRNYWluID0gTlVMTDsKKyAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01fSE9US0VZOgorCS8qIEV4aXQgYXBwIHdoZW4gYmFjayBpcyBwcmVzc2VkLiAqLworCWlmIChWS19UQkFDSyA9PSBISVdPUkQobFBhcmFtKSAmJiAoMCAhPSAoTU9EX0tFWVVQICYgTE9XT1JEKGxQYXJhbSkpKSkgeworCSAgICBEZXN0cm95V2luZG93KGdfaFduZE1haW4pOworCX0gZWxzZSB7CisJICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIE1zZywgd1BhcmFtLCBsUGFyYW0pOworCX0KKwlicmVhazsKKworICAgIGNhc2UgV01fQ09NTUFORDoKKwlyZXMgPSBoYW5kbGVfbWVudShMT1dPUkQod1BhcmFtKSk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIE1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKworLyogPT09IEFQSSA9PT0gKi8KKworcGpfc3RhdHVzX3QgZ3VpX2luaXQoZ3VpX21lbnUgKm1lbnUpCit7CisgICAgV05EQ0xBU1Mgd2M7CisgICAgSFdORCBoV25kID0gTlVMTDsJCisgICAgUkVDVCByOworICAgIERXT1JEIGR3U3R5bGU7CisKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgID0gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBhcHAgaXMgcnVubmluZy4gSWYgaXQncyBydW5uaW5nIHRoZW4gZm9jdXMgb24gdGhlIHdpbmRvdyAqLworICAgIGhXbmQgPSBGaW5kV2luZG93KE1BSU5XSU5ET1dDTEFTUywgTUFJTldJTkRPV1RJVExFKTsKKworICAgIGlmIChOVUxMICE9IGhXbmQpIHsKKwlTZXRGb3JlZ3JvdW5kV2luZG93KGhXbmQpOyAgICAKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGdfbWVudSA9IG1lbnU7CisKKyAgICB3Yy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHdjLmxwZm5XbmRQcm9jID0gKFdORFBST0MpRGlhbG9nUHJvYzsKKyAgICB3Yy5jYkNsc0V4dHJhID0gMDsKKyAgICB3Yy5jYlduZEV4dHJhID0gMDsKKyAgICB3Yy5oSW5zdGFuY2UgPSBnX2hJbnN0OworICAgIHdjLmhJY29uID0gMDsKKyAgICB3Yy5oQ3Vyc29yID0gMDsKKyAgICB3Yy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSCkgR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworICAgIHdjLmxwc3pNZW51TmFtZQk9IDA7CisgICAgd2MubHBzekNsYXNzTmFtZSA9IE1BSU5XSU5ET1dDTEFTUzsKKyAgICAKKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjKSAhPSAwKSB7CisJRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgYXBwLiB3aW5kb3cgKi8KKyAgICBnX2hXbmRNYWluID0gQ3JlYXRlV2luZG93KE1BSU5XSU5ET1dDTEFTUywgTUFJTldJTkRPV1RJVExFLAorCQkJICAgICAgV1NfVklTSUJMRSwgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgCisJCQkgICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAorCQkJICAgICAgKEhXTkQpTlVMTCwgTlVMTCwgZ19oSW5zdCwgKExQU1RSKU5VTEwpOworCisgICAgLyogQ3JlYXRlIGVkaXQgY29udHJvbCB0byBwcmludCBsb2cgKi8KKyAgICBHZXRDbGllbnRSZWN0KGdfaFduZE1haW4sICZyKTsKKyAgICBkd1N0eWxlID0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8CisJICAgICAgRVNfTVVMVElMSU5FIHwgRVNfUkVBRE9OTFkgfCBFU19BVVRPVlNDUk9MTCB8IEVTX0xFRlQ7CisgICAgZ19oV25kTG9nID0gQ3JlYXRlV2luZG93KAorICAgICAgICAgICAgICAgIFRFWFQoIkVESVQiKSwgICAvLyBDbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIFdpbmRvdyB0ZXh0CisgICAgICAgICAgICAgICAgZHdTdHlsZSwgICAgICAgIC8vIFdpbmRvdyBzdHlsZQorICAgICAgICAgICAgICAgIDAsCQkvLyB4LWNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8vIHktY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXItbGVmdCBjb3JuZXIKKwkJci5yaWdodC1yLmxlZnQsIC8vIFdpZHRoIG9mIHRoZSB3aW5kb3cgZm9yIHRoZSBlZGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wKKwkJci5ib3R0b20tci50b3AsIC8vIEhlaWdodCBvZiB0aGUgd2luZG93IGZvciB0aGUgZWRpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9sCisgICAgICAgICAgICAgICAgZ19oV25kTWFpbiwgICAgIC8vIFdpbmRvdyBoYW5kbGUgdG8gdGhlIHBhcmVudCB3aW5kb3cKKyAgICAgICAgICAgICAgICAoSE1FTlUpIDAsCS8vIENvbnRyb2wgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIGdfaEluc3QsICAgICAgICAvLyBJbnN0YW5jZSBoYW5kbGUKKyAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLy8gU3BlY2lmeSBOVUxMIGZvciB0aGlzIHBhcmFtZXRlciB3aGVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5b3UgY3JlYXRlIGEgY29udHJvbAorCisgICAgLyogUmVzaXplIHRoZSBsb2cgKi8KKyAgICBpZiAoZ19oV25kTWVudUJhcikgeworCVJFQ1Qgcl9tZW51ID0gezB9OworCisJR2V0V2luZG93UmVjdChnX2hXbmRMb2csICZyKTsKKwlHZXRXaW5kb3dSZWN0KGdfaFduZE1lbnVCYXIsICZyX21lbnUpOworCWlmIChyLmJvdHRvbSA+IHJfbWVudS50b3ApIHsKKwkgICAgTW92ZVdpbmRvdyhnX2hXbmRMb2csIDAsIDAsIHIucmlnaHQtci5sZWZ0LCAKKwkJICAgICAgIChyLmJvdHRvbS1yLnRvcCktKHJfbWVudS5ib3R0b20tcl9tZW51LnRvcCksIFRSVUUpOworCX0KKyAgICB9CisKKyAgICAvKiBGb2N1cyBpdCwgc28gU1AgdXNlciBjYW4gc2Nyb2xsIHRoZSBsb2cgKi8KKyAgICBTZXRGb2N1cyhnX2hXbmRMb2cpOworCisgICAgLyogR2V0IHRoZSBsb2cgdGhyZWFkICovCisgICAgZ19sb2dfdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKworICAgIC8qIFJlZGlyZWN0IGxvZyAmIHVwZGF0ZSBsb2cgZGVjb3Igc2V0dGluZyAqLworICAgIC8qCisgICAgbG9nX2RlY29yID0gcGpfbG9nX2dldF9kZWNvcigpOworICAgIGxvZ19kZWNvciA9IFBKX0xPR19IQVNfTkVXTElORSB8IFBKX0xPR19IQVNfQ1I7CisgICAgcGpfbG9nX3NldF9kZWNvcihsb2dfZGVjb3IpOworICAgICovCisgICAgZ19sb2dfd3JpdGVyX29yaWcgPSBwal9sb2dfZ2V0X2xvZ19mdW5jKCk7CisgICAgcGpfbG9nX3NldF9sb2dfZnVuYygmbG9nX3dyaXRlcik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgZ3VpX3VwZGF0ZV9tZW51KGd1aV9tZW51ICptZW51KQoreworICAgIGVudW0geyBNRU5VX0lEX1NUQVJUID0gNTAwMDAgfTsKKyAgICBVSU5UIGlkX3N0YXJ0ID0gTUVOVV9JRF9TVEFSVDsKKyAgICBITUVOVSBoUm9vdE1lbnU7CisgICAgU0hNRU5VQkFSSU5GTyBtYmk7CisKKyAgICAvKiBkZWxldGUgZXhpc3RpbmcgbWVudSAqLworICAgIGlmIChnX2hXbmRNZW51QmFyKSB7CisJRGVzdHJveVdpbmRvdyhnX2hXbmRNZW51QmFyKTsKKwlnX2hXbmRNZW51QmFyID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBkZWxldGUgbWVudSBoYW5kbGVyIG1hcCAqLworICAgIGdfbWVudV9oYW5kbGVyX2NudCA9IDA7CisKKyAgICAvKiBzbWFydHBob25lIGNhbiBvbmx5IGhhdmUgdHdvIHJvb3QgbWVudXMgKi8KKyAgICBwal9hc3NlcnQobWVudS0+c3VibWVudV9jbnQgPD0gMik7CisKKyAgICAvKiBnZW5lcmF0ZSBtZW51IHRyZWUgKi8KKyAgICBoUm9vdE1lbnUgPSBDcmVhdGVNZW51KCk7CisgICAgaWRfc3RhcnQgPSBnZW5lcmF0ZV9zdWJtZW51KGhSb290TWVudSwgaWRfc3RhcnQsIG1lbnUpOworCisgICAgLyogaW5pdGlhbGl6ZSBtZW51YmFyICovCisgICAgWmVyb01lbW9yeSgmbWJpLCBzaXplb2YoU0hNRU5VQkFSSU5GTykpOworICAgIG1iaS5jYlNpemUgICAgICA9IHNpemVvZihTSE1FTlVCQVJJTkZPKTsKKyAgICBtYmkuaHduZFBhcmVudCAgPSBnX2hXbmRNYWluOworICAgIG1iaS5kd0ZsYWdzCSAgICA9IFNIQ01CRl9ISURFU0lQQlVUVE9OfFNIQ01CRl9ITUVOVTsKKyAgICBtYmkublRvb2xCYXJJZCAgPSAoVUlOVCloUm9vdE1lbnU7CisgICAgbWJpLmhJbnN0UmVzICAgID0gZ19oSW5zdDsKKworICAgIGlmIChGQUxTRSA9PSBTSENyZWF0ZU1lbnVCYXIoJm1iaSkpIHsKKwlEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworICAgIH0KKworICAgIC8qIHN0b3JlIG1lbnUgd2luZG93IGhhbmRsZSAqLworICAgIGdfaFduZE1lbnVCYXIgPSBtYmkuaHduZE1COworCisgICAgLyogc3RvcmUgY3VycmVudCBtZW51ICovCisgICAgZ19tZW51ID0gbWVudTsKKworICAgIC8qIHNob3cgdGhlIG1lbnUgKi8KKyAgICBEcmF3TWVudUJhcihnX2hXbmRNYWluKTsKKyAgICBTaG93V2luZG93KGdfaFduZE1lbnVCYXIsIFNXX1NIT1cpOworCisgICAgLyogb3ZlcnJpZGUgYmFjayBidXR0b24gKi8KKyAgICBTZW5kTWVzc2FnZShnX2hXbmRNZW51QmFyLCBTSENNQk1fT1ZFUlJJREVLRVksIFZLX1RCQUNLLAorCSAgICBNQUtFTFBBUkFNKFNITUJPRl9OT0RFRkFVTFQgfCBTSE1CT0ZfTk9USUZZLAorCSAgICBTSE1CT0ZfTk9ERUZBVUxUIHwgU0hNQk9GX05PVElGWSkpOworCisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworZW51bSBndWlfa2V5IGd1aV9tc2dib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGVudW0gZ3VpX2ZsYWcgZmxhZykKK3sKKyAgICB3Y2hhcl90IGJ1Zl90aXRsZVs2NF07CisgICAgd2NoYXJfdCBidWZfbXNnWzUxMl07CisgICAgVUlOVCB3ZmxhZyA9IDA7CisgICAgaW50IHJldGNvZGU7CisKKyAgICBwal9hbnNpX3RvX3VuaWNvZGUodGl0bGUsIHBqX2Fuc2lfc3RybGVuKHRpdGxlKSwgYnVmX3RpdGxlLCA2NCk7CisgICAgcGpfYW5zaV90b191bmljb2RlKG1lc3NhZ2UsIHBqX2Fuc2lfc3RybGVuKG1lc3NhZ2UpLCBidWZfbXNnLCA1MTIpOworCisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgY2FzZSBXSVRIX09LOgorCXdmbGFnID0gTUJfT0s7CisJYnJlYWs7CisgICAgY2FzZSBXSVRIX1lFU05POgorCXdmbGFnID0gTUJfWUVTTk87CisJYnJlYWs7CisgICAgY2FzZSBXSVRIX09LQ0FOQ0VMOgorCXdmbGFnID0gTUJfT0tDQU5DRUw7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0Y29kZSA9IE1lc3NhZ2VCb3goZ19oV25kTWFpbiwgYnVmX21zZywgYnVmX3RpdGxlLCB3ZmxhZyk7CisKKyAgICBzd2l0Y2ggKHJldGNvZGUpIHsKKyAgICBjYXNlIElET0s6CisJcmV0dXJuIEtFWV9PSzsKKyAgICBjYXNlIElEWUVTOgorCXJldHVybiBLRVlfWUVTOworICAgIGNhc2UgSUROTzoKKwlyZXR1cm4gS0VZX05POworICAgIGRlZmF1bHQ6CisJcmV0dXJuIEtFWV9DQU5DRUw7CisgICAgfQorfQorCit2b2lkIGd1aV9zbGVlcCh1bnNpZ25lZCBzZWMpCit7CisgICAgcGpfdGhyZWFkX3NsZWVwKHNlYyAqIDEwMDApOworfQorCitwal9zdGF0dXNfdCBndWlfc3RhcnQoZ3VpX21lbnUgKm1lbnUpCit7CisgICAgTVNHIG1zZzsKKworICAgIFBKX1VOVVNFRF9BUkcobWVudSk7CisKKyAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgeworICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisgICAgfQorICAgIAorICAgIHJldHVybiAobXNnLndQYXJhbSk7Cit9CisKK3ZvaWQgZ3VpX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBpZiAoZ19oV25kTWFpbikgeworCURlc3Ryb3lXaW5kb3coZ19oV25kTWFpbik7CisJZ19oV25kTWFpbiA9IE5VTEw7CisgICAgfQorfQorCisKK2ludCBXSU5BUEkgV2luTWFpbigKKyAgICBISU5TVEFOQ0UgaEluc3RhbmNlLAorICAgIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAorICAgIExQV1NUUiBscENtZExpbmUsCisgICAgaW50IG5TaG93Q21kCispCit7CisgICAgaW50IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcoaFByZXZJbnN0YW5jZSk7CisgICAgUEpfVU5VU0VEX0FSRyhscENtZExpbmUpOworICAgIFBKX1VOVVNFRF9BUkcoblNob3dDbWQpOworCisgICAgLy8gc3RvcmUgdGhlIGhJbnN0YW5jZSBpbiBnbG9iYWwKKyAgICBnX2hJbnN0ID0gaEluc3RhbmNlOworCisgICAgc3RhdHVzID0gc3lzdGVzdF9pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgc3RhdHVzID0gc3lzdGVzdF9ydW4oKTsKKwkKK29uX3JldHVybjoKKyAgICBzeXN0ZXN0X2RlaW5pdCgpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9wanN5c3Rlc3Rfd2luY2UucmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvcGpzeXN0ZXN0X3dpbmNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmVmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvcGpzeXN0ZXN0X3dpbmNlLnJjCkBAIC0wLDAgKzEsMTA4IEBACisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0Lg0KKy8vDQorI2luY2x1ZGUgInJlc291cmNlLmgiDQorDQorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLg0KKy8vDQorI2luY2x1ZGUgImFmeHJlcy5oIg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcw0KKw0KKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkNCisjaWZkZWYgX1dJTjMyDQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMNCisjcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQ0KKyNlbmRpZiAvL19XSU4zMg0KKw0KKyNpZmRlZiBBUFNUVURJT19JTlZPS0VEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFRFWFRJTkNMVURFDQorLy8NCisNCisxIFRFWFRJTkNMVURFIA0KK0JFR0lODQorICAgICJyZXNvdXJjZS5oXDAiDQorRU5EDQorDQorMiBURVhUSU5DTFVERSANCitCRUdJTg0KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKzMgVEVYVElOQ0xVREUgDQorQkVHSU4NCisgICAgIiNpbmNsdWRlICIicGpzeXN0ZXN0X3dpbmNlLnJjMiIiXHJcbiINCisgICAgIlxyXG4iDQorICAgICJcMCINCitFTkQNCisNCisjZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBEaWFsb2cNCisvLw0KKw0KK0lERF9NQUlOX0RJQUxPRyBESUFMT0cgIDAsIDAsIDgyLCA3Mw0KK1NUWUxFIERTX1NFVEZPTlQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTA0KK0ZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiDQorQkVHSU4NCisgICAgRURJVFRFWFQgICAgICAgIElEQ19FRElUMSw3LDcsNTcsNTksRVNfTVVMVElMSU5FIHwgRVNfQVVUT1ZTQ1JPTEwgfCBFU19SRUFET05MWSB8IE5PVCBXU19CT1JERVIgfCBOT1QgV1NfVEFCU1RPUA0KK0VORA0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBERVNJR05JTkZPDQorLy8NCisNCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRA0KK0dVSURFTElORVMgREVTSUdOSU5GTyANCitCRUdJTg0KKyAgICBJRERfTUFJTl9ESUFMT0csIERJQUxPRw0KKyAgICBCRUdJTg0KKyAgICAgICAgTEVGVE1BUkdJTiwgNw0KKyAgICAgICAgUklHSFRNQVJHSU4sIDY0DQorICAgICAgICBUT1BNQVJHSU4sIDcNCisgICAgICAgIEJPVFRPTU1BUkdJTiwgNjYNCisgICAgRU5EDQorRU5EDQorI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gU3RyaW5nIFRhYmxlDQorLy8NCisNCitTVFJJTkdUQUJMRSANCitCRUdJTg0KKyAgICBJRFNfTUFJTl9USVRMRSAgICAgICAgICAiUEpTWVNURVNUIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKw0KKw0KKyNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4NCisvLw0KKyNpbmNsdWRlICJwanN5c3Rlc3Rfd2luY2UucmMyIg0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VEDQorDQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L3Bqc3lzdGVzdF93aW5jZS5yYzIgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvcGpzeXN0ZXN0X3dpbmNlLnJjMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlNjZiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L3Bqc3lzdGVzdF93aW5jZS5yYzIKQEAgLTAsMCArMSwxMCBAQAorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCisJI2Vycm9yIHRoaXMgZmlsZSBpcyBub3QgZWRpdGFibGUgYnkgTWljcm9zb2Z0IFZpc3VhbCBDKysNCisjZW5kaWYgLy9BUFNUVURJT19JTlZPS0VEDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBBZGQgbWFudWFsbHkgZWRpdGVkIHJlc291cmNlcyBoZXJlLi4uDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvcmVzb3VyY2UuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjA4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3QvcmVzb3VyY2UuaApAQCAtMCwwICsxLDE4IEBACisvL3t7Tk9fREVQRU5ERU5DSUVTfX0KKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCisvLyBVc2VkIGJ5IHBqc3lzdGVzdF93aW5jZS5yYworLy8KKyNkZWZpbmUgSUREX01BSU5fRElBTE9HICAgICAgICAgICAgICAgICAxMDEKKyNkZWZpbmUgSURTX01BSU5fVElUTEUgICAgICAgICAgICAgICAgICAxMDIKKyNkZWZpbmUgSURDX0VESVQxICAgICAgICAgICAgICAgICAgICAgICAxMDAxCisKKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCisvLyAKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDMKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDIKKyNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3Qvc3lzdGVzdC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L3N5c3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBjZThmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcGpzeXN0ZXN0L3N5c3Rlc3QuYwpAQCAtMCwwICsxLDEzNzEgQEAKKy8qICRJZDogc3lzdGVzdC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJzeXN0ZXN0LmgiCisjaW5jbHVkZSAiZ3VpLmgiCisKKyNkZWZpbmUgVEhJU19GSUxFICJzeXN0ZXN0LmMiCisKK3Vuc2lnbmVkICAgIHRlc3RfaXRlbV9jb3VudDsKK3Rlc3RfaXRlbV90IHRlc3RfaXRlbXNbU1lTVEVTVF9NQVhfVEVTVF07CitjaGFyCSAgICBkb2NfcGF0aFtQQVRIX0xFTkdUSF0gPSB7MH07CitjaGFyCSAgICByZXNfcGF0aFtQQVRIX0xFTkdUSF0gPSB7MH07CitjaGFyCSAgICBmcGF0aFtQQVRIX0xFTkdUSF07CisKKyNkZWZpbmUgVVNFUl9FUlJPUiAgIlVzZXIgdXNlZCBzYWlkIG5vdCBva2F5IgorCitzdGF0aWMgdm9pZCBzeXN0ZXN0X3dpemFyZCh2b2lkKTsKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfbGlzdF9hdWRpb19kZXZzKHZvaWQpOworc3RhdGljIHZvaWQgc3lzdGVzdF9kaXNwbGF5X3NldHRpbmdzKHZvaWQpOworc3RhdGljIHZvaWQgc3lzdGVzdF9wbGF5X3RvbmUodm9pZCk7CitzdGF0aWMgdm9pZCBzeXN0ZXN0X3BsYXlfd2F2MSh2b2lkKTsKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfcGxheV93YXYyKHZvaWQpOworc3RhdGljIHZvaWQgc3lzdGVzdF9yZWNfYXVkaW8odm9pZCk7CitzdGF0aWMgdm9pZCBzeXN0ZXN0X2F1ZGlvX3Rlc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBzeXN0ZXN0X2xhdGVuY3lfdGVzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfYWVjX3Rlc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBleGl0X2FwcCh2b2lkKTsKKworLyogTWVudXMgKi8KK3N0YXRpYyBndWlfbWVudSBtZW51X2V4aXQgPSB7ICJFeGl0IiwgJmV4aXRfYXBwIH07CisKK3N0YXRpYyBndWlfbWVudSBtZW51X3dpemFyZCA9ICB7ICJSdW4gdGVzdCB3aXphcmQiLCAmc3lzdGVzdF93aXphcmQgfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X3BsYXl0biA9IHsgIlBsYXkgVG9uZSIsICZzeXN0ZXN0X3BsYXlfdG9uZSB9Oworc3RhdGljIGd1aV9tZW51IG1lbnVfcGxheXd2MSA9IHsgIlBsYXkgV0FWIEZpbGUxIiwgJnN5c3Rlc3RfcGxheV93YXYxIH07CitzdGF0aWMgZ3VpX21lbnUgbWVudV9wbGF5d3YyID0geyAiUGxheSBXQVYgRmlsZTIiLCAmc3lzdGVzdF9wbGF5X3dhdjIgfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X3JlY2F1ZCAgPSB7ICJSZWNvcmQgQXVkaW8iLCAmc3lzdGVzdF9yZWNfYXVkaW8gfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X2F1ZHRlc3QgPSB7ICJEZXZpY2UgVGVzdCIsICZzeXN0ZXN0X2F1ZGlvX3Rlc3QgfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X2NhbGNsYXQgPSB7ICJMYXRlbmN5IFRlc3QiLCAmc3lzdGVzdF9sYXRlbmN5X3Rlc3QgfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X3NuZGFlYyA9IHsgIkFFQy9BRVMgVGVzdCIsICZzeXN0ZXN0X2FlY190ZXN0IH07CisKK3N0YXRpYyBndWlfbWVudSBtZW51X2xpc3RkZXYgPSB7ICJWaWV3IERldmljZXMiLCAmc3lzdGVzdF9saXN0X2F1ZGlvX2RldnMgfTsKK3N0YXRpYyBndWlfbWVudSBtZW51X2dldHNldHMgPSB7ICJWaWV3IFNldHRpbmdzIiwgJnN5c3Rlc3RfZGlzcGxheV9zZXR0aW5ncyB9OworCitzdGF0aWMgZ3VpX21lbnUgbWVudV90ZXN0cyA9IHsgCisgICAgIlRlc3RzIiwgTlVMTCwgCisgICAgMTAsIAorICAgIHsKKwkmbWVudV93aXphcmQsCisJJm1lbnVfYXVkdGVzdCwgCisJJm1lbnVfcGxheXRuLAorCSZtZW51X3BsYXl3djEsCisJJm1lbnVfcGxheXd2MiwKKwkmbWVudV9yZWNhdWQsCisJJm1lbnVfY2FsY2xhdCwKKwkmbWVudV9zbmRhZWMsCisJTlVMTCwgCisJJm1lbnVfZXhpdAorICAgIH0KK307CisKK3N0YXRpYyBndWlfbWVudSBtZW51X29wdGlvbnMgPSB7IAorICAgICJPcHRpb25zIiwgTlVMTCwgCisgICAgMiwgCisgICAgeworCSZtZW51X2xpc3RkZXYsCisJJm1lbnVfZ2V0c2V0cywKKyAgICB9Cit9OworCitzdGF0aWMgZ3VpX21lbnUgcm9vdF9tZW51ID0geyAKKyAgICAiUm9vdCIsIE5VTEwsIDIsIHsmbWVudV90ZXN0cywgJm1lbnVfb3B0aW9uc30gCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFBKX0RBUldJTk9TKSAmJiBQSl9EQVJXSU5PUyE9MAorUEpfSU5MSU5FKGNoYXIgKikgYWRkX3BhdGgoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZm5hbWUpCit7CisgICAgc3RybmNweShmcGF0aCwgcGF0aCwgUEFUSF9MRU5HVEgpOworICAgIHN0cm5jYXQoZnBhdGgsIGZuYW1lLCBQQVRIX0xFTkdUSCk7CisgICAgcmV0dXJuIGZwYXRoOworfQorI2Vsc2UKKyMgICBkZWZpbmUgYWRkX3BhdGgocGF0aCwgZm5hbWUpIGZuYW1lCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXhpdF9hcHAodm9pZCkKK3sKKyAgICBzeXN0ZXN0X3NhdmVfcmVzdWx0KGFkZF9wYXRoKGRvY19wYXRoLCBSRVNVTFRfT1VUX1BBVEgpKTsKKyAgICBndWlfZGVzdHJveSgpOworfQorCisKKyNpbmNsdWRlIDxwanN1YS1saWIvcGpzdWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhX2F1ZGlvZGV2Lmg+CisKK3R5cGVkZWYgc3RydWN0IHN5c3Rlc3RfdAoreworICAgIHBqc3VhX2NvbmZpZwkgICAgdWFfY2ZnOworICAgIHBqc3VhX21lZGlhX2NvbmZpZwkgICAgbWVkaWFfY2ZnOworICAgIHBqbWVkaWFfYXVkX2Rldl9pbmRleCAgIHJlY19pZDsKKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5kZXggICBwbGF5X2lkOworfSBzeXN0ZXN0X3Q7CisKK3N0YXRpYyBzeXN0ZXN0X3Qgc3lzdGVzdDsKK3N0YXRpYyBjaGFyIHRleHRidWZbNjAwXTsKKworLyogRGV2aWNlIElEIHRvIHRlc3QgKi8KK2ludCBzeXN0ZXN0X2NhcF9kZXZfaWQgPSBQSk1FRElBX0FVRF9ERUZBVUxUX0NBUFRVUkVfREVWOworaW50IHN5c3Rlc3RfcGxheV9kZXZfaWQgPSBQSk1FRElBX0FVRF9ERUZBVUxUX1BMQVlCQUNLX0RFVjsKKworc3RhdGljIHZvaWQgc3lzdGVzdF9wZXJyb3IoY29uc3QgY2hhciAqdGl0bGUsIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworICAgIGNoYXIgdGhlbXNnW1BKX0VSUl9NU0dfU0laRSArIDEwMF07CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBlbHNlCisJZXJybXNnWzBdID0gJ1wwJzsKKyAgICAKKyAgICBzdHJjcHkodGhlbXNnLCB0aXRsZSk7CisgICAgc3RybmNhdCh0aGVtc2csIGVycm1zZywgc2l6ZW9mKHRoZW1zZyktMSk7CisgICAgdGhlbXNnW3NpemVvZih0aGVtc2cpLTFdID0gJ1wwJzsKKworICAgIGd1aV9tc2dib3goIkVycm9yIiwgdGhlbXNnLCBXSVRIX09LKTsKK30KKwordGVzdF9pdGVtX3QgKnN5c3Rlc3RfYWxsb2NfdGVzdF9pdGVtKGNvbnN0IGNoYXIgKnRpdGxlKQoreworICAgIHRlc3RfaXRlbV90ICp0aTsKKworICAgIGlmICh0ZXN0X2l0ZW1fY291bnQgPT0gU1lTVEVTVF9NQVhfVEVTVCkgeworCWd1aV9tc2dib3goIkVycm9yIiwgIllvdSBoYXZlIGRvbmUgdG9vIG1hbnkgdGVzdHMiLCBXSVRIX09LKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0aSA9ICZ0ZXN0X2l0ZW1zW3Rlc3RfaXRlbV9jb3VudCsrXTsKKyAgICBwal9iemVybyh0aSwgc2l6ZW9mKCp0aSkpOworICAgIHBqX2Fuc2lfc3RyY3B5KHRpLT50aXRsZSwgdGl0bGUpOworCisgICAgcmV0dXJuIHRpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRlc3Q6IHBsYXkgc2ltcGxlIHJpbmdiYWNrIHRvbmUgYW5kIGhlYXIgaXQgCisgKi8KK3N0YXRpYyB2b2lkIHN5c3Rlc3RfcGxheV90b25lKHZvaWQpCit7CisgICAgLyogUmluZ3RvbmVzICAqLworICAgICNkZWZpbmUgUklOR0JBQ0tfRlJFUTEJICAgIDQ0MAkgICAgLyogNDAwICovCisgICAgI2RlZmluZSBSSU5HQkFDS19GUkVRMgkgICAgNDgwCSAgICAvKiA0NTAgKi8KKyAgICAjZGVmaW5lIFJJTkdCQUNLX09OCQkgICAgMzAwMCAgICAvKiA0MDAgKi8KKyAgICAjZGVmaW5lIFJJTkdCQUNLX09GRgkgICAgNDAwMCAgICAvKiAyMDAgKi8KKyAgICAjZGVmaW5lIFJJTkdCQUNLX0NOVAkgICAgMQkgICAgLyogMiAgICovCisgICAgI2RlZmluZSBSSU5HQkFDS19JTlRFUlZBTAkgICAgNDAwMCAgICAvKiAyMDAwICovCisKKyAgICB1bnNpZ25lZCBpLCBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBwam1lZGlhX3RvbmVfZGVzYyB0b25lW1JJTkdCQUNLX0NOVF07CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBwam1lZGlhX3BvcnQgKnJpbmdiYWNrX3BvcnQgPSBOVUxMOworICAgIGVudW0gZ3VpX2tleSBrZXk7CisgICAgaW50IHJpbmdiYWNrX3Nsb3QgPSAtMTsKKyAgICB0ZXN0X2l0ZW1fdCAqdGk7CisgICAgcGpfc3RyX3QgbmFtZTsKKyAgICBjb25zdCBjaGFyICp0aXRsZSA9ICJBdWRpbyBUb25lIFBsYXliYWNrIFRlc3QiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHRpID0gc3lzdGVzdF9hbGxvY190ZXN0X2l0ZW0odGl0bGUpOworICAgIGlmICghdGkpCisJcmV0dXJuOworCisgICAga2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwKKwkJICAgICAiVGhpcyB0ZXN0IHdpbGwgcGxheSBzaW1wbGUgcmluZ2JhY2sgdG9uZSB0byAiCisJCSAgICAgInRoZSBzcGVha2VyLiBQbGVhc2UgbGlzdGVuIGNhcmVmdWxseSBmb3IgYXVkaW8gIgorCQkgICAgICJpbXBhaXJtZW50cyBzdWNoIGFzIHN0dXR0ZXIuIFlvdSBtYXkgbmVlZCAiCisJCSAgICAgInRvIGxldCB0aGlzIHRlc3QgcnVubmluZyBmb3IgYSB3aGlsZSB0byAiCisJCSAgICAgIm1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgb2theS4gUHJlc3MgIgorCQkgICAgICJPSyB0byBzdGFydCwgQ0FOQ0VMIHRvIHNraXAiLAorCQkgICAgIFdJVEhfT0tDQU5DRUwpOworICAgIGlmIChrZXkgIT0gS0VZX09LKSB7CisJdGktPnNraXBwZWQgPSBQSl9UUlVFOworCXJldHVybjsKKyAgICB9CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUnVubmluZyAlcyIsIHRpdGxlKSk7CisKKyAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInJpbmdiYWNrIiwgNTEyLCA1MTIpOworICAgIHNhbXBsZXNfcGVyX2ZyYW1lID0gc3lzdGVzdC5tZWRpYV9jZmcuYXVkaW9fZnJhbWVfcHRpbWUgKiAKKwkJCXN5c3Rlc3QubWVkaWFfY2ZnLmNsb2NrX3JhdGUgKgorCQkJc3lzdGVzdC5tZWRpYV9jZmcuY2hhbm5lbF9jb3VudCAvIDEwMDA7CisKKyAgICAvKiBSaW5nYmFjayB0b25lIChjYWxsIGlzIHJpbmdpbmcpICovCisgICAgbmFtZSA9IHBqX3N0cigicmluZ2JhY2siKTsKKyAgICBzdGF0dXMgPSBwam1lZGlhX3RvbmVnZW5fY3JlYXRlMihwb29sLCAmbmFtZSwgCisJCQkJICAgICBzeXN0ZXN0Lm1lZGlhX2NmZy5jbG9ja19yYXRlLAorCQkJCSAgICAgc3lzdGVzdC5tZWRpYV9jZmcuY2hhbm5lbF9jb3VudCwgCisJCQkJICAgICBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkgICAgIDE2LCBQSk1FRElBX1RPTkVHRU5fTE9PUCwgCisJCQkJICAgICAmcmluZ2JhY2tfcG9ydCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgcGpfYnplcm8oJnRvbmUsIHNpemVvZih0b25lKSk7CisgICAgZm9yIChpPTA7IGk8UklOR0JBQ0tfQ05UOyArK2kpIHsKKwl0b25lW2ldLmZyZXExID0gUklOR0JBQ0tfRlJFUTE7CisJdG9uZVtpXS5mcmVxMiA9IFJJTkdCQUNLX0ZSRVEyOworCXRvbmVbaV0ub25fbXNlYyA9IFJJTkdCQUNLX09OOworCXRvbmVbaV0ub2ZmX21zZWMgPSBSSU5HQkFDS19PRkY7CisgICAgfQorICAgIHRvbmVbUklOR0JBQ0tfQ05ULTFdLm9mZl9tc2VjID0gUklOR0JBQ0tfSU5URVJWQUw7CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3RvbmVnZW5fcGxheShyaW5nYmFja19wb3J0LCBSSU5HQkFDS19DTlQsIHRvbmUsCisJCQkJICBQSk1FRElBX1RPTkVHRU5fTE9PUCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9hZGRfcG9ydChwb29sLCByaW5nYmFja19wb3J0LCAmcmluZ2JhY2tfc2xvdCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KHJpbmdiYWNrX3Nsb3QsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIGtleSA9IGd1aV9tc2dib3godGl0bGUsCisJCSAgICAgIlJpbmdiYWNrIHRvbmUgc2hvdWxkIGJlIHBsYXlpbmcgbm93IGluIHRoZSAiCisJCSAgICAgInNwZWFrZXIuIFByZXNzIE9LIHRvIHN0b3AuICIsIFdJVEhfT0spOworCisgICAgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworb25fcmV0dXJuOgorICAgIGlmIChyaW5nYmFja19zbG90ICE9IC0xKQorCXBqc3VhX2NvbmZfcmVtb3ZlX3BvcnQocmluZ2JhY2tfc2xvdCk7CisgICAgaWYgKHJpbmdiYWNrX3BvcnQpCisJcGptZWRpYV9wb3J0X2Rlc3Ryb3kocmluZ2JhY2tfcG9ydCk7CisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc3lzdGVzdF9wZXJyb3IoIlNvcnJ5IHdlIGVuY291bnRlciBlcnJvciB3aGVuIGluaXRpYWxpemluZyAiCisJCSAgICAgICAidGhlIHRvbmUgZ2VuZXJhdG9yOiAiLCBzdGF0dXMpOworCXRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJcGpfc3RyZXJyb3Ioc3RhdHVzLCB0aS0+cmVhc29uLCBzaXplb2YodGktPnJlYXNvbikpOworICAgIH0gZWxzZSB7CisJa2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwgIklzIHRoZSBhdWRpbyBva2F5PyIsIFdJVEhfWUVTTk8pOworCXRpLT5zdWNjZXNzID0gKGtleSA9PSBLRVlfWUVTKTsKKwlpZiAoIXRpLT5zdWNjZXNzKQorCSAgICBwal9hbnNpX3N0cmNweSh0aS0+cmVhc29uLCBVU0VSX0VSUk9SKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKiBVdGlsOiBjcmVhdGUgZmlsZSBwbGF5ZXIsIGVhY2ggdGltZSB0cnlpbmcgZGlmZmVyZW50IHBhdGhzIHVudGlsIHdlIGdldAorICogdGhlIGZpbGUuCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjcmVhdGVfcGxheWVyKHVuc2lnbmVkIHBhdGhfY250LCBjb25zdCBjaGFyICpwYXRoc1tdLCAKKwkJCQkgcGpzdWFfcGxheWVyX2lkICpwX2lkKQoreworICAgIHBqX3N0cl90IG5hbWU7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfRU5PVEZPVU5EOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGk9MDsgaTxwYXRoX2NudDsgKytpKSB7CisJc3RhdHVzID0gcGpzdWFfcGxheWVyX2NyZWF0ZShwal9jc3RyKCZuYW1lLCBwYXRoc1tpXSksIDAsIHBfaWQpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGVzdDogcGxheSBXQVYgZmlsZQorICovCitzdGF0aWMgdm9pZCBzeXN0ZXN0X3BsYXlfd2F2KHVuc2lnbmVkIHBhdGhfY250LCBjb25zdCBjaGFyICpwYXRoc1tdKQoreworICAgIHBqc3VhX3BsYXllcl9pZCBwbGF5X2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBlbnVtIGd1aV9rZXkga2V5OworICAgIHRlc3RfaXRlbV90ICp0aTsKKyAgICBjb25zdCBjaGFyICp0aXRsZSA9ICJXQVYgRmlsZSBQbGF5YmFjayBUZXN0IjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICB0aSA9IHN5c3Rlc3RfYWxsb2NfdGVzdF9pdGVtKHRpdGxlKTsKKyAgICBpZiAoIXRpKQorCXJldHVybjsKKworICAgIHBqX2Fuc2lfc25wcmludGYodGV4dGJ1Ziwgc2l6ZW9mKHRleHRidWYpLAorCQkgICAgICJUaGlzIHRlc3Qgd2lsbCBwbGF5ICVzIGZpbGUgdG8gIgorCQkgICAgICJ0aGUgc3BlYWtlci4gUGxlYXNlIGxpc3RlbiBjYXJlZnVsbHkgZm9yIGF1ZGlvICIKKwkJICAgICAiaW1wYWlybWVudHMgc3VjaCBhcyBzdHV0dGVyLiBMZXQgdGhpcyB0ZXN0IHJ1biAiCisJCSAgICAgImZvciBhIHdoaWxlIHRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgb2theS4iCisJCSAgICAgIiBQcmVzcyBPSyB0byBzdGFydCwgQ0FOQ0VMIHRvIHNraXAiLAorCQkgICAgIHBhdGhzWzBdKTsKKworICAgIGtleSA9IGd1aV9tc2dib3godGl0bGUsIHRleHRidWYsCisJCSAgICAgV0lUSF9PS0NBTkNFTCk7CisgICAgaWYgKGtleSAhPSBLRVlfT0spIHsKKwl0aS0+c2tpcHBlZCA9IFBKX1RSVUU7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJSdW5uaW5nICVzIiwgdGl0bGUpKTsKKworICAgIC8qIFdBViBwb3J0ICovCisgICAgc3RhdHVzID0gY3JlYXRlX3BsYXllcihwYXRoX2NudCwgcGF0aHMsICZwbGF5X2lkKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3QocGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQocGxheV9pZCksIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIGtleSA9IGd1aV9tc2dib3godGl0bGUsCisJCSAgICAgIldBViBmaWxlIHNob3VsZCBiZSBwbGF5aW5nIG5vdyBpbiB0aGUgIgorCQkgICAgICJzcGVha2VyLiBQcmVzcyBPSyB0byBzdG9wLiAiLCBXSVRIX09LKTsKKworICAgIHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisKK29uX3JldHVybjoKKyAgICBpZiAocGxheV9pZCAhPSAtMSkKKwlwanN1YV9wbGF5ZXJfZGVzdHJveShwbGF5X2lkKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXN5c3Rlc3RfcGVycm9yKCJTb3JyeSB3ZSd2ZSBlbmNvdW50ZXJlZCBlcnJvciIsIHN0YXR1cyk7CisJdGktPnN1Y2Nlc3MgPSBQSl9GQUxTRTsKKwlwal9zdHJlcnJvcihzdGF0dXMsIHRpLT5yZWFzb24sIHNpemVvZih0aS0+cmVhc29uKSk7CisgICAgfSBlbHNlIHsKKwlrZXkgPSBndWlfbXNnYm94KHRpdGxlLCAiSXMgdGhlIGF1ZGlvIG9rYXk/IiwgV0lUSF9ZRVNOTyk7CisJdGktPnN1Y2Nlc3MgPSAoa2V5ID09IEtFWV9ZRVMpOworCWlmICghdGktPnN1Y2Nlc3MpCisJICAgIHBqX2Fuc2lfc3RyY3B5KHRpLT5yZWFzb24sIFVTRVJfRVJST1IpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfcGxheV93YXYxKHZvaWQpCit7CisgICAgY29uc3QgY2hhciAqcGF0aHNbXSA9IHsgYWRkX3BhdGgocmVzX3BhdGgsIFdBVl9QTEFZQkFDS19QQVRIKSwKKwkJCSAgICBBTFRfUEFUSDEgV0FWX1BMQVlCQUNLX1BBVEggfTsKKyAgICBzeXN0ZXN0X3BsYXlfd2F2KFBKX0FSUkFZX1NJWkUocGF0aHMpLCBwYXRocyk7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfcGxheV93YXYyKHZvaWQpCit7CisgICAgY29uc3QgY2hhciAqcGF0aHNbXSA9IHsgYWRkX3BhdGgocmVzX3BhdGgsIFdBVl9UT0NLOF9QQVRIKSwKKwkJCSAgICBBTFRfUEFUSDEgV0FWX1RPQ0s4X1BBVEh9OworICAgIHN5c3Rlc3RfcGxheV93YXYoUEpfQVJSQVlfU0laRShwYXRocyksIHBhdGhzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRlc3Q6IHJlY29yZCBhdWRpbyAKKyAqLworc3RhdGljIHZvaWQgc3lzdGVzdF9yZWNfYXVkaW8odm9pZCkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBmaWxlbmFtZSA9IHBqX3N0cihhZGRfcGF0aChkb2NfcGF0aCwgV0FWX1JFQ19PVVRfUEFUSCkpOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisgICAgZW51bSBndWlfa2V5IGtleTsKKyAgICBwanN1YV9yZWNvcmRlcl9pZCByZWNfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqc3VhX3BsYXllcl9pZCBwbGF5X2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBwanN1YV9jb25mX3BvcnRfaWQgcmVjX3Nsb3QgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqc3VhX2NvbmZfcG9ydF9pZCBwbGF5X3Nsb3QgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgY29uc3QgY2hhciAqdGl0bGUgPSAiQXVkaW8gUmVjb3JkaW5nIjsKKyAgICB0ZXN0X2l0ZW1fdCAqdGk7CisKKyAgICB0aSA9IHN5c3Rlc3RfYWxsb2NfdGVzdF9pdGVtKHRpdGxlKTsKKyAgICBpZiAoIXRpKQorCXJldHVybjsKKworICAgIGtleSA9IGd1aV9tc2dib3godGl0bGUsCisJCSAgICAgIlRoaXMgdGVzdCB3aWxsIGFsbG93IHlvdSB0byByZWNvcmQgYXVkaW8gIgorCQkgICAgICJmcm9tIHRoZSBtaWNyb3Bob25lLCBhbmQgcGxheWJhY2sgdGhlICIKKwkJICAgICAiYXVkaW8gdG8gdGhlIHNwZWFrZXIuIFByZXNzIE9LIHRvIHN0YXJ0IHJlY29yZGluZywgIgorCQkgICAgICJDQU5DRUwgdG8gc2tpcC4iLCAKKwkJICAgICBXSVRIX09LQ0FOQ0VMKTsKKyAgICBpZiAoa2V5ICE9IEtFWV9PSykgeworCXRpLT5za2lwcGVkID0gUEpfVFJVRTsKKwlyZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJ1bm5pbmcgJXMiLCB0aXRsZSkpOworCisgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJyZWN0ZXN0IiwgNTEyLCA1MTIpOworCisgICAgc3RhdHVzID0gcGpzdWFfcmVjb3JkZXJfY3JlYXRlKCZmaWxlbmFtZSwgMCwgTlVMTCwgLTEsIDAsICZyZWNfaWQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIHJlY19zbG90ID0gcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydChyZWNfaWQpOworCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KDAsIHJlY19zbG90KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBrZXkgPSBndWlfbXNnYm94KHRpdGxlLAorCQkgICAgICJSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3Mgbm93LCBwbGVhc2Ugc2F5ICIKKwkJICAgICAic29tZXRoaW5nIGluIHRoZSBtaWNyb3Bob25lLiBQcmVzcyBPSyAiCisJCSAgICAgInRvIHN0b3AgcmVjb3JkaW5nIiwgV0lUSF9PSyk7CisKKyAgICBwanN1YV9jb25mX2Rpc2Nvbm5lY3QoMCwgcmVjX3Nsb3QpOworICAgIHJlY19zbG90ID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBwanN1YV9yZWNvcmRlcl9kZXN0cm95KHJlY19pZCk7CisgICAgcmVjX2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKworICAgIHN0YXR1cyA9IHBqc3VhX3BsYXllcl9jcmVhdGUoJmZpbGVuYW1lLCAwLCAmcGxheV9pZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgcGxheV9zbG90ID0gcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQocGxheV9pZCk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3QocGxheV9zbG90LCAwKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBrZXkgPSBndWlfbXNnYm94KHRpdGxlLAorCQkgICAgICJSZWNvcmRpbmcgaGFzIGJlZW4gc3RvcHBlZC4gIgorCQkgICAgICJUaGUgcmVjb3JkZWQgYXVkaW8gaXMgYmVpbmcgcGxheWVkIG5vdyB0byAiCisJCSAgICAgInRoZSBzcGVha2VyIGRldmljZSwgaW4gYSBsb29wLiBMaXN0ZW4gZm9yICIKKwkJICAgICAiYW55IGF1ZGlvIGltcGFpcm1lbnRzLiBQcmVzcyBPSyB0byBzdG9wLiIsIAorCQkgICAgIFdJVEhfT0spOworCitvbl9yZXR1cm46CisgICAgaWYgKHJlY19zbG90ICE9IFBKU1VBX0lOVkFMSURfSUQpCisJcGpzdWFfY29uZl9kaXNjb25uZWN0KDAsIHJlY19zbG90KTsKKyAgICBpZiAocmVjX2lkICE9IFBKU1VBX0lOVkFMSURfSUQpCisJcGpzdWFfcmVjb3JkZXJfZGVzdHJveShyZWNfaWQpOworICAgIGlmIChwbGF5X3Nsb3QgIT0gUEpTVUFfSU5WQUxJRF9JRCkKKwlwanN1YV9jb25mX2Rpc2Nvbm5lY3QocGxheV9zbG90LCAwKTsKKyAgICBpZiAocGxheV9pZCAhPSBQSlNVQV9JTlZBTElEX0lEKQorCXBqc3VhX3BsYXllcl9kZXN0cm95KHBsYXlfaWQpOworICAgIGlmIChwb29sKQorCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXN5c3Rlc3RfcGVycm9yKCJTb3JyeSB3ZSBlbmNvdW50ZXJlZCBhbiBlcnJvcjogIiwgc3RhdHVzKTsKKwl0aS0+c3VjY2VzcyA9IFBKX0ZBTFNFOworCXBqX3N0cmVycm9yKHN0YXR1cywgdGktPnJlYXNvbiwgc2l6ZW9mKHRpLT5yZWFzb24pKTsKKyAgICB9IGVsc2UgeworCWtleSA9IGd1aV9tc2dib3godGl0bGUsICJJcyB0aGUgYXVkaW8gb2theT8iLCBXSVRIX1lFU05PKTsKKwl0aS0+c3VjY2VzcyA9IChrZXkgPT0gS0VZX1lFUyk7CisJaWYgKCF0aS0+c3VjY2VzcykgeworCSAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYsIHNpemVvZih0ZXh0YnVmKSwKKwkJCSAgICAgIllvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gY29weSB0aGUgcmVjb3JkZWQgIgorCQkJICAgICAiV0FWIGZpbGUgJXMgdG8gYSBkZXNrdG9wIGNvbXB1dGVyIGFuZCBhbmFseXplICIKKwkJCSAgICAgIml0LCB0byBmaW5kIG91dCB3aGV0aGVyIGl0J3MgYSByZWNvcmRpbmcgIgorCQkJICAgICAib3IgcGxheWJhY2sgcHJvYmxlbS4iLAorCQkJICAgICBXQVZfUkVDX09VVF9QQVRIKTsKKwkgICAgZ3VpX21zZ2JveCh0aXRsZSwgdGV4dGJ1ZiwgV0lUSF9PSyk7CisJICAgIHBqX2Fuc2lfc3RyY3B5KHRpLT5yZWFzb24sIFVTRVJfRVJST1IpOworCX0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRlc3Q6IGF1ZGlvIHN5c3RlbSB0ZXN0CisgKi8KK3N0YXRpYyB2b2lkIHN5c3Rlc3RfYXVkaW9fdGVzdCh2b2lkKQoreworICAgIGVudW0geworCUdPT0RfTUFYX0lOVEVSVkFMID0gNSwKKyAgICB9OworICAgIGNvbnN0IHBqbWVkaWFfZGlyIGRpciA9IFBKTUVESUFfRElSX0NBUFRVUkVfUExBWUJBQ0s7CisgICAgcGptZWRpYV9hdWRfcGFyYW0gcGFyYW07CisgICAgcGptZWRpYV9hdWRfdGVzdF9yZXN1bHRzIHJlc3VsdDsKKyAgICBwal9zaXplX3QgdGV4dGJ1ZnBvczsKKyAgICBlbnVtIGd1aV9rZXkga2V5OworICAgIHVuc2lnbmVkIHByb2JsZW1fY291bnQgPSAwOworICAgIGNvbnN0IGNoYXIgKnByb2JsZW1zWzE2XTsKKyAgICBjaGFyIGRyaWZ0dGV4dFsxMjBdOworICAgIHRlc3RfaXRlbV90ICp0aTsKKyAgICBjb25zdCBjaGFyICp0aXRsZSA9ICJBdWRpbyBEZXZpY2UgVGVzdCI7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgdGkgPSBzeXN0ZXN0X2FsbG9jX3Rlc3RfaXRlbSh0aXRsZSk7CisgICAgaWYgKCF0aSkKKwlyZXR1cm47CisKKyAgICBrZXkgPSBndWlfbXNnYm94KHRpdGxlLAorCQkgICAgICJUaGlzIHdpbGwgcnVuIGFuIGF1dG9tYXRlZCB0ZXN0IGZvciBhYm91dCAiCisJCSAgICAgInRlbiBzZWNvbmRzIG9yIHNvLCBhbmQgZGlzcGxheSBzb21lICIKKwkJICAgICAic3RhdGlzdGljcyBhYm91dCB5b3VyIHNvdW5kIGRldmljZS4gIgorCQkgICAgICJQbGVhc2UgZG9uJ3QgZG8gYW55dGhpbmcgdW50aWwgdGhlIHRlc3QgY29tcGxldGVzLiAiCisJCSAgICAgIlByZXNzIE9LIHRvIHN0YXJ0LCBvciBDQU5DRUwgdG8gc2tpcCB0aGlzIHRlc3QuIiwKKwkJICAgICBXSVRIX09LQ0FOQ0VMKTsKKyAgICBpZiAoa2V5ICE9IEtFWV9PSykgeworCXRpLT5za2lwcGVkID0gUEpfVFJVRTsKKwlyZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJ1bm5pbmcgJXMiLCB0aXRsZSkpOworCisgICAgLyogRGlzYWJsZSBzb3VuZCBkZXZpY2UgaW4gcGpzdWEgZmlyc3QgKi8KKyAgICBwanN1YV9zZXRfbm9fc25kX2RldigpOworCisgICAgLyogU2V0dXAgcGFyYW1ldGVycyAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKHN5c3Rlc3QucGxheV9pZCwgJnBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzeXN0ZXN0X3BlcnJvcigiU29ycnkgd2UgaGFkIGVycm9yIGluIHBqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKCkiLCBzdGF0dXMpOworCXBqc3VhX3NldF9zbmRfZGV2KHN5c3Rlc3QucmVjX2lkLCBzeXN0ZXN0LnBsYXlfaWQpOworCXRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJcGpfc3RyZXJyb3Ioc3RhdHVzLCB0aS0+cmVhc29uLCBzaXplb2YodGktPnJlYXNvbikpOworCXRpLT5yZWFzb25bc2l6ZW9mKHRpLT5yZWFzb24pLTFdID0gJ1wwJzsKKwlyZXR1cm47CisgICAgfQorCisgICAgcGFyYW0uZGlyID0gZGlyOworICAgIHBhcmFtLnJlY19pZCA9IHN5c3Rlc3QucmVjX2lkOworICAgIHBhcmFtLnBsYXlfaWQgPSBzeXN0ZXN0LnBsYXlfaWQ7CisgICAgcGFyYW0uY2xvY2tfcmF0ZSA9IHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9jbG9ja19yYXRlOworICAgIHBhcmFtLmNoYW5uZWxfY291bnQgPSBzeXN0ZXN0Lm1lZGlhX2NmZy5jaGFubmVsX2NvdW50OworICAgIHBhcmFtLnNhbXBsZXNfcGVyX2ZyYW1lID0gcGFyYW0uY2xvY2tfcmF0ZSAqIHBhcmFtLmNoYW5uZWxfY291bnQgKiAKKwkJCSAgICAgIHN5c3Rlc3QubWVkaWFfY2ZnLmF1ZGlvX2ZyYW1lX3B0aW1lIC8gMTAwMDsKKworICAgIC8qIExhdGVuY3kgc2V0dGluZ3MgKi8KKyAgICBwYXJhbS5mbGFncyB8PSAoUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9MQVRFTkNZIHwgCisJCSAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9MQVRFTkNZKTsKKyAgICBwYXJhbS5pbnB1dF9sYXRlbmN5X21zID0gc3lzdGVzdC5tZWRpYV9jZmcuc25kX3JlY19sYXRlbmN5OworICAgIHBhcmFtLm91dHB1dF9sYXRlbmN5X21zID0gc3lzdGVzdC5tZWRpYV9jZmcuc25kX3BsYXlfbGF0ZW5jeTsKKworICAgIC8qIFJ1biB0aGUgdGVzdCAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3Rlc3QoJnBhcmFtLCAmcmVzdWx0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzeXN0ZXN0X3BlcnJvcigiU29ycnkgd2UgZW5jb3VudGVyZWQgZXJyb3Igd2l0aCB0aGUgdGVzdCIsIHN0YXR1cyk7CisJcGpzdWFfc2V0X3NuZF9kZXYoc3lzdGVzdC5yZWNfaWQsIHN5c3Rlc3QucGxheV9pZCk7CisJdGktPnN1Y2Nlc3MgPSBQSl9GQUxTRTsKKwlwal9zdHJlcnJvcihzdGF0dXMsIHRpLT5yZWFzb24sIHNpemVvZih0aS0+cmVhc29uKSk7CisJdGktPnJlYXNvbltzaXplb2YodGktPnJlYXNvbiktMV0gPSAnXDAnOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIHBqc3VhIHNvdW5kIGRldmljZSAqLworICAgIHBqc3VhX3NldF9zbmRfZGV2KHN5c3Rlc3QucmVjX2lkLCBzeXN0ZXN0LnBsYXlfaWQpOworCisgICAgLyogQW5hbHl6ZSB0aGUgcmVzdWx0ISAqLworICAgIHN0cmNweSh0ZXh0YnVmLCAiSGVyZSBhcmUgdGhlIGF1ZGlvIHN0YXRpc3RpY3M6XHJcbiIpOworICAgIHRleHRidWZwb3MgPSBzdHJsZW4odGV4dGJ1Zik7CisKKyAgICBpZiAocmVzdWx0LnJlYy5mcmFtZV9jbnQ9PTApIHsKKwlwcm9ibGVtc1twcm9ibGVtX2NvdW50KytdID0gCisJICAgICJObyBhdWRpbyBmcmFtZXMgd2VyZSBjYXB0dXJlZCBmcm9tIHRoZSBtaWNyb3Bob25lLiAiCisJICAgICJUaGlzIG1lYW5zIHRoZSBhdWRpbyBkZXZpY2UgaXMgbm90IHdvcmtpbmcgcHJvcGVybHkuIjsKKyAgICB9IGVsc2UgeworCXBqX2Fuc2lfc25wcmludGYodGV4dGJ1Zit0ZXh0YnVmcG9zLCAKKwkJCSBzaXplb2YodGV4dGJ1ZiktdGV4dGJ1ZnBvcywKKwkJCSAiUmVjIDogaW50ZXJ2YWwgKG1pbi9tYXgvYXZnL2Rldik9XHJcbiIKKwkJCSAiICAgICAgICAgJXUvJXUvJXUvJXUgKG1zKVxyXG4iCisJCQkgIiAgICAgIG1heCBidXJzdD0ldVxyXG4iLAorCQkJIHJlc3VsdC5yZWMubWluX2ludGVydmFsLAorCQkJIHJlc3VsdC5yZWMubWF4X2ludGVydmFsLAorCQkJIHJlc3VsdC5yZWMuYXZnX2ludGVydmFsLAorCQkJIHJlc3VsdC5yZWMuZGV2X2ludGVydmFsLAorCQkJIHJlc3VsdC5yZWMubWF4X2J1cnN0KTsKKwl0ZXh0YnVmcG9zID0gc3RybGVuKHRleHRidWYpOworCisJaWYgKHJlc3VsdC5yZWMubWF4X2J1cnN0ID4gR09PRF9NQVhfSU5URVJWQUwpIHsKKwkgICAgcHJvYmxlbXNbcHJvYmxlbV9jb3VudCsrXSA9IAorCQkiUmVjb3JkaW5nIG1heCBidXJzdCBpcyBxdWl0ZSBoaWdoIjsKKwl9CisgICAgfQorCisgICAgaWYgKHJlc3VsdC5wbGF5LmZyYW1lX2NudD09MCkgeworCXByb2JsZW1zW3Byb2JsZW1fY291bnQrK10gPSAKKwkgICAgIk5vIGF1ZGlvIGZyYW1lcyB3ZXJlIHBsYXllZCB0byB0aGUgc3BlYWtlci4gIgorCSAgICAiVGhpcyBtZWFucyB0aGUgYXVkaW8gZGV2aWNlIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LiI7CisgICAgfSBlbHNlIHsKKwlwal9hbnNpX3NucHJpbnRmKHRleHRidWYrdGV4dGJ1ZnBvcywgCisJCQkgc2l6ZW9mKHRleHRidWYpLXRleHRidWZwb3MsCisJCQkgIlBsYXk6IGludGVydmFsIChtaW4vbWF4L2F2Zy9kZXYpPVxyXG4iCisJCQkgIiAgICAgICAgICV1LyV1LyV1LyV1IChtcylcclxuIgorCQkJICIgICAgICBidXJzdD0ldVxyXG4iLAorCQkJIHJlc3VsdC5wbGF5Lm1pbl9pbnRlcnZhbCwKKwkJCSByZXN1bHQucGxheS5tYXhfaW50ZXJ2YWwsCisJCQkgcmVzdWx0LnBsYXkuYXZnX2ludGVydmFsLAorCQkJIHJlc3VsdC5wbGF5LmRldl9pbnRlcnZhbCwKKwkJCSByZXN1bHQucGxheS5tYXhfYnVyc3QpOworCXRleHRidWZwb3MgPSBzdHJsZW4odGV4dGJ1Zik7CisKKwlpZiAocmVzdWx0LnBsYXkubWF4X2J1cnN0ID4gR09PRF9NQVhfSU5URVJWQUwpIHsKKwkgICAgcHJvYmxlbXNbcHJvYmxlbV9jb3VudCsrXSA9IAorCQkiUGxheWJhY2sgbWF4IGJ1cnN0IGlzIHF1aXRlIGhpZ2giOworCX0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0LnJlY19kcmlmdF9wZXJfc2VjKSB7CisJY29uc3QgY2hhciAqd2hpY2ggPSByZXN1bHQucmVjX2RyaWZ0X3Blcl9zZWM+PTAgPyAiZmFzdGVyIiA6ICJzbG93ZXIiOworCXVuc2lnbmVkIGRyaWZ0ID0gcmVzdWx0LnJlY19kcmlmdF9wZXJfc2VjPj0wID8gCisJCQkgICAgcmVzdWx0LnJlY19kcmlmdF9wZXJfc2VjIDoKKwkJCSAgICAtcmVzdWx0LnJlY19kcmlmdF9wZXJfc2VjOworCisJcGpfYW5zaV9zbnByaW50ZihkcmlmdHRleHQsIHNpemVvZihkcmlmdHRleHQpLAorCQkJIkNsb2NrIGRyaWZ0cyBkZXRlY3RlZC4gQ2FwdHVyZSAiCisJCQkiaXMgJWQgc2FtcGxlcy9zZWMgJXMgIgorCQkJInRoYW4gdGhlIHBsYXliYWNrIGRldmljZSIsCisJCQlkcmlmdCwgd2hpY2gpOworCXByb2JsZW1zW3Byb2JsZW1fY291bnQrK10gPSBkcmlmdHRleHQ7CisgICAgfQorCisgICAgaWYgKHByb2JsZW1fY291bnQgPT0gMCkgeworCXBqX2Fuc2lfc25wcmludGYodGV4dGJ1Zit0ZXh0YnVmcG9zLCAKKwkJCSBzaXplb2YodGV4dGJ1ZiktdGV4dGJ1ZnBvcywKKwkJCSAiXHJcblRoZSBzb3VuZCBkZXZpY2Ugc2VlbXMgdG8gYmUgb2theSEiKTsKKwl0ZXh0YnVmcG9zID0gc3RybGVuKHRleHRidWYpOworCisJa2V5ID0gZ3VpX21zZ2JveCgiQXVkaW8gRGV2aWNlIFRlc3QiLCB0ZXh0YnVmLCBXSVRIX09LKTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGk7CisKKwlwal9hbnNpX3NucHJpbnRmKHRleHRidWYrdGV4dGJ1ZnBvcywKKwkJCSBzaXplb2YodGV4dGJ1ZiktdGV4dGJ1ZnBvcywgCisJCQkgIlRoZXJlIGNvdWxkIGJlICVkIHByb2JsZW0ocykgd2l0aCB0aGUgIgorCQkJICJzb3VuZCBkZXZpY2U6XHJcbiIsCisJCQkgcHJvYmxlbV9jb3VudCk7CisJdGV4dGJ1ZnBvcyA9IHN0cmxlbih0ZXh0YnVmKTsKKworCWZvciAoaT0wOyBpPHByb2JsZW1fY291bnQ7ICsraSkgeworCSAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYrdGV4dGJ1ZnBvcywKKwkJCSAgICAgc2l6ZW9mKHRleHRidWYpLXRleHRidWZwb3MsIAorCQkJICAgICAiICVkOiAlc1xyXG4iLCBpKzEsIHByb2JsZW1zW2ldKTsKKwkgICAgdGV4dGJ1ZnBvcyA9IHN0cmxlbih0ZXh0YnVmKTsKKwl9CisKKwlrZXkgPSBndWlfbXNnYm94KHRpdGxlLCB0ZXh0YnVmLCBXSVRIX09LKTsKKyAgICB9CisKKyAgICB0aS0+c3VjY2VzcyA9IFBKX1RSVUU7CisgICAgcGpfYW5zaV9zdHJuY3B5KHRpLT5yZWFzb24sIHRleHRidWYsIHNpemVvZih0aS0+cmVhc29uKSk7CisgICAgdGktPnJlYXNvbltzaXplb2YodGktPnJlYXNvbiktMV0gPSAnXDAnOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzb3VuZCBsYXRlbmN5IHRlc3QKKyAqLworc3RhdGljIGludCBjYWxjdWxhdGVfbGF0ZW5jeShwal9wb29sX3QgKnBvb2wsIHBqbWVkaWFfcG9ydCAqd2F2LAorCQkJICAgICB1bnNpZ25lZCAqbGF0X3N1bSwgdW5zaWduZWQgKmxhdF9jbnQsIAorCQkJICAgICB1bnNpZ25lZCAqbGF0X21pbiwgdW5zaWduZWQgKmxhdF9tYXgpCit7CisgICAgcGptZWRpYV9mcmFtZSBmcm07CisgICAgc2hvcnQgKmJ1ZjsKKyAgICB1bnNpZ25lZCBpLCBjbG9ja19yYXRlLCBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBwal9zaXplX3QgcmVhZCwgbGVuOworICAgIHVuc2lnbmVkIHN0YXJ0X3BvczsKKyAgICBwal9ib29sX3QgZmlyc3Q7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgKmxhdF9zdW0gPSAwOworICAgICpsYXRfY250ID0gMDsKKyAgICAqbGF0X21pbiA9IDEwMDAwOworICAgICpsYXRfbWF4ID0gMDsKKworICAgIHNhbXBsZXNfcGVyX2ZyYW1lID0gUEpNRURJQV9QSUFfU1BGKCZ3YXYtPmluZm8pOworICAgIGNsb2NrX3JhdGUgPSBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKTsKKyAgICBmcm0uYnVmID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzYW1wbGVzX3Blcl9mcmFtZSAqIDIpOworICAgIGZybS5zaXplID0gc2FtcGxlc19wZXJfZnJhbWUgKiAyOworICAgIGxlbiA9IHBqbWVkaWFfd2F2X3BsYXllcl9nZXRfbGVuKHdhdik7CisgICAgYnVmID0gcGpfcG9vbF9hbGxvYyhwb29sLCBsZW4gKyBzYW1wbGVzX3Blcl9mcmFtZSk7CisKKyAgICAvKiBSZWFkIHRoZSB3aG9sZSBmaWxlICovCisgICAgcmVhZCA9IDA7CisgICAgd2hpbGUgKHJlYWQgPCBsZW4vMikgeworCXN0YXR1cyA9IHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUod2F2LCAmZnJtKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGJyZWFrOworCisJcGptZWRpYV9jb3B5X3NhbXBsZXMoYnVmK3JlYWQsIChzaG9ydCopZnJtLmJ1Ziwgc2FtcGxlc19wZXJfZnJhbWUpOworCXJlYWQgKz0gc2FtcGxlc19wZXJfZnJhbWU7CisgICAgfQorCisgICAgaWYgKHJlYWQgPCAyICogY2xvY2tfcmF0ZSkgeworCXN5c3Rlc3RfcGVycm9yKCJUaGUgV0FWIGZpbGUgaXMgdG9vIHNob3J0IiwgUEpfU1VDQ0VTUyk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFplcm8gdGhlIGZpcnN0IDUwMG1zIHRvIHJlbW92ZSBsb3VkIGNsaWNrIG5vaXNlcyAKKyAgICAgKiAoa2V5cGFkIHByZXNzLCBldGMuKQorICAgICAqLworICAgIHBqbWVkaWFfemVyb19zYW1wbGVzKGJ1ZiwgY2xvY2tfcmF0ZSAvIDIpOworCisgICAgLyogTG9vcCB0byBjYWxjdWxhdGUgbGF0ZW5jeSAqLworICAgIHN0YXJ0X3BvcyA9IDA7CisgICAgZmlyc3QgPSBQSl9UUlVFOworICAgIHdoaWxlIChzdGFydF9wb3MgPCBsZW4vMiAtIGNsb2NrX3JhdGUpIHsKKwlpbnQgbWF4X3NpZ25hbCA9IDA7CisJdW5zaWduZWQgbWF4X3NpZ25hbF9wb3MgPSBzdGFydF9wb3M7CisJdW5zaWduZWQgbWF4X2VjaG9fcG9zID0gMDsKKwl1bnNpZ25lZCBwb3M7CisJdW5zaWduZWQgbGF0OworCisJLyogR2V0IHRoZSBsYXJnZXN0IHNpZ25hbCBpbiB0aGUgbmV4dCAwLjdzICovCisJZm9yIChpPXN0YXJ0X3BvczsgaTxzdGFydF9wb3MgKyBjbG9ja19yYXRlICogNzAwIC8gMTAwMDsgKytpKSB7CisJICAgIGlmIChhYnMoYnVmW2ldKSA+IG1heF9zaWduYWwpIHsKKwkJbWF4X3NpZ25hbCA9IGFicyhidWZbaV0pOworCQltYXhfc2lnbmFsX3BvcyA9IGk7CisJICAgIH0KKwl9CisKKwkvKiBBZHZhbmNlIDEwbXMgZnJvbSBtYXhfc2lnbmFsX3BvcyAqLworCXBvcyA9IG1heF9zaWduYWxfcG9zICsgMTAgKiBjbG9ja19yYXRlIC8gMTAwMDsKKworCS8qIEdldCB0aGUgbGFyZ2VzdCBzaWduYWwgaW4gdGhlIG5leHQgODAwbXMgKi8KKwltYXhfc2lnbmFsID0gMDsKKwltYXhfZWNob19wb3MgPSBwb3M7CisJZm9yIChpPXBvczsgaTxwb3MrY2xvY2tfcmF0ZSAqIDggLyAxMDsgKytpKSB7CisJICAgIGlmIChhYnMoYnVmW2ldKSA+IG1heF9zaWduYWwpIHsKKwkJbWF4X3NpZ25hbCA9IGFicyhidWZbaV0pOworCQltYXhfZWNob19wb3MgPSBpOworCSAgICB9CisJfQorCisJbGF0ID0gKG1heF9lY2hvX3BvcyAtIG1heF9zaWduYWxfcG9zKSAqIDEwMDAgLyBjbG9ja19yYXRlOworCisjaWYgMAorCVBKX0xPRyg0LChUSElTX0ZJTEUsICJTaWduYWwgYXQgJWRtcywgZWNobyBhdCAlZCBtcywgbGF0ZW5jeSAlZCBtcyIsCisJCSAgbWF4X3NpZ25hbF9wb3MgKiAxMDAwIC8gY2xvY2tfcmF0ZSwKKwkJICBtYXhfZWNob19wb3MgKiAxMDAwIC8gY2xvY2tfcmF0ZSwKKwkJICBsYXQpKTsKKyNlbmRpZgorCisJKmxhdF9zdW0gKz0gbGF0OworCSgqbGF0X2NudCkrKzsKKwlpZiAobGF0IDwgKmxhdF9taW4pCisJICAgICpsYXRfbWluID0gbGF0OworCWlmIChsYXQgPiAqbGF0X21heCkKKwkgICAgKmxhdF9tYXggPSBsYXQ7CisKKwkvKiBBZHZhbmNlIG5leHQgbG9vcCAqLworCWlmIChmaXJzdCkgeworCSAgICBzdGFydF9wb3MgPSBtYXhfc2lnbmFsX3BvcyArIGNsb2NrX3JhdGUgKiA5IC8gMTA7CisJICAgIGZpcnN0ID0gUEpfRkFMU0U7CisJfSBlbHNlIHsKKwkgICAgc3RhcnRfcG9zICs9IGNsb2NrX3JhdGU7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHN5c3Rlc3RfbGF0ZW5jeV90ZXN0KHZvaWQpCit7CisgICAgY29uc3QgY2hhciAqcmVmX3dhdl9wYXRoc1tdID0geyBhZGRfcGF0aChyZXNfcGF0aCwgV0FWX1RPQ0s4X1BBVEgpLCBBTFRfUEFUSDEgV0FWX1RPQ0s4X1BBVEggfTsKKyAgICBwal9zdHJfdCByZWNfd2F2X2ZpbGU7CisgICAgcGpzdWFfcGxheWVyX2lkIHBsYXlfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqc3VhX2NvbmZfcG9ydF9pZCBwbGF5X3Nsb3QgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIHBqc3VhX3JlY29yZGVyX2lkIHJlY19pZCA9IFBKU1VBX0lOVkFMSURfSUQ7CisgICAgcGpzdWFfY29uZl9wb3J0X2lkIHJlY19zbG90ID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHBqbWVkaWFfcG9ydCAqd2F2X3BvcnQgPSBOVUxMOworICAgIHVuc2lnbmVkIGxhdF9zdW09MCwgbGF0X2NudD0wLCBsYXRfbWluPTAsIGxhdF9tYXg9MDsKKyAgICBlbnVtIGd1aV9rZXkga2V5OworICAgIHRlc3RfaXRlbV90ICp0aTsKKyAgICBjb25zdCBjaGFyICp0aXRsZSA9ICJBdWRpbyBMYXRlbmN5IFRlc3QiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHRpID0gc3lzdGVzdF9hbGxvY190ZXN0X2l0ZW0odGl0bGUpOworICAgIGlmICghdGkpCisJcmV0dXJuOworCisgICAga2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwKKwkJICAgICAiVGhpcyB0ZXN0IHdpbGwgdHJ5IHRvIGZpbmQgdGhlIGF1ZGlvIGRldmljZSdzICIKKwkJICAgICAibGF0ZW5jeS4gV2Ugd2lsbCBwbGF5IGEgc3BlY2lhbCBXQVYgZmlsZSB0byB0aGUgIgorCQkgICAgICJzcGVha2VyIGZvciB0ZW4gc2Vjb25kcywgdGhlbiBhdCB0aGUgZW5kICIKKwkJICAgICAiY2FsY3VsYXRlIHRoZSBsYXRlbmN5LiBQbGVhc2UgZG9uJ3QgZG8gYW55dGhpbmcgIgorCQkgICAgICJ1bnRpbCB0aGUgdGVzdCBpcyBkb25lLiIsIFdJVEhfT0tDQU5DRUwpOworICAgIGlmIChrZXkgIT0gS0VZX09LKSB7CisJdGktPnNraXBwZWQgPSBQSl9UUlVFOworCXJldHVybjsKKyAgICB9CisgICAga2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwgCisJCSAgICAgIkZvciB0aGlzIHRlc3QgdG8gd29yaywgd2UgbXVzdCBiZSBhYmxlIHRvIGNhcHR1cmUgIgorCQkgICAgICJ0aGUgYXVkaW8gcGxheWVkIGluIHRoZSBzcGVha2VyICh0aGUgZWNobyksIGFuZCBvbmx5IgorCQkgICAgICIgdGhhdCBhdWRpbyAoaS5lLiB5b3UgbXVzdCBiZSBpbiByZWxhdGl2ZWx5IHF1aWV0ICIKKwkJICAgICAicGxhY2UgdG8gcnVuIHRoaXMgdGVzdCkuICIKKwkJICAgICAiUHJlc3MgT0sgdG8gc3RhcnQsIG9yIENBTkNFTCB0byBza2lwLiIsCisJCSAgICAgV0lUSF9PS0NBTkNFTCk7CisgICAgaWYgKGtleSAhPSBLRVlfT0spIHsKKwl0aS0+c2tpcHBlZCA9IFBKX1RSVUU7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJSdW5uaW5nICVzIiwgdGl0bGUpKTsKKworICAgIHN0YXR1cyA9IGNyZWF0ZV9wbGF5ZXIoUEpfQVJSQVlfU0laRShyZWZfd2F2X3BhdGhzKSwgcmVmX3dhdl9wYXRocywgCisJCQkgICAmcGxheV9pZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgcGxheV9zbG90ID0gcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQocGxheV9pZCk7CisKKyAgICByZWNfd2F2X2ZpbGUgPSBwal9zdHIoYWRkX3BhdGgoZG9jX3BhdGgsIFdBVl9MQVRFTkNZX09VVF9QQVRIKSk7CisgICAgc3RhdHVzID0gcGpzdWFfcmVjb3JkZXJfY3JlYXRlKCZyZWNfd2F2X2ZpbGUsIDAsIE5VTEwsIC0xLCAwLCAmcmVjX2lkKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICByZWNfc2xvdCA9IHBqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnQocmVjX2lkKTsKKworICAgIC8qIFNldHVwIHRoZSB0ZXN0ICovCisgICAgLy9zdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3QoMCwgMCk7CisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KHBsYXlfc2xvdCwgMCk7CisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KDAsIHJlY19zbG90KTsKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3QocGxheV9zbG90LCByZWNfc2xvdCk7CisgICAgCisKKyAgICAvKiBXZSdyZSBydW5uaW5nICovCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlBsZWFzZSB3YWl0IHdoaWxlIHRlc3QgaXMgcnVubmluZyAofjEwIHNlYykiKSk7CisgICAgZ3VpX3NsZWVwKDEwKTsKKworICAgIC8qIERvbmUgd2l0aCB0aGUgdGVzdCAqLworICAgIC8vc3RhdHVzID0gcGpzdWFfY29uZl9kaXNjb25uZWN0KDAsIDApOworICAgIHN0YXR1cyA9IHBqc3VhX2NvbmZfZGlzY29ubmVjdChwbGF5X3Nsb3QsIHJlY19zbG90KTsKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Rpc2Nvbm5lY3QoMCwgcmVjX3Nsb3QpOworICAgIHN0YXR1cyA9IHBqc3VhX2NvbmZfZGlzY29ubmVjdChwbGF5X3Nsb3QsIDApOworCisgICAgcGpzdWFfcmVjb3JkZXJfZGVzdHJveShyZWNfaWQpOworICAgIHJlY19pZCA9IFBKU1VBX0lOVkFMSURfSUQ7CisKKyAgICBwanN1YV9wbGF5ZXJfZGVzdHJveShwbGF5X2lkKTsKKyAgICBwbGF5X2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKworICAgIC8qIENvbmZpcm0gdGhhdCBlY2hvIGlzIGhlYXJkICovCisgICAgZ3VpX21zZ2JveCh0aXRsZSwKKwkgICAgICAgIlRlc3QgaXMgZG9uZS4gTm93IHdlIG5lZWQgdG8gY29uZmlybSB0aGF0IHdlIGluZGVlZCAiCisJICAgICAgICJjYXB0dXJlZCB0aGUgZWNoby4gV2Ugd2lsbCBwbGF5IHRoZSBjYXB0dXJlZCBhdWRpbyAiCisJICAgICAgICJhbmQgcGxlYXNlIGNvbmZpcm0gdGhhdCB5b3UgY2FuIGhlYXIgdGhlICd0b2NrJyBlY2hvLiIsCisJICAgICAgIFdJVEhfT0spOworCisgICAgc3RhdHVzID0gcGpzdWFfcGxheWVyX2NyZWF0ZSgmcmVjX3dhdl9maWxlLCAwLCAmcGxheV9pZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgcGxheV9zbG90ID0gcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQocGxheV9pZCk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3QocGxheV9zbG90LCAwKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBrZXkgPSBndWlfbXNnYm94KHRpdGxlLAorCQkgICAgICJUaGUgY2FwdHVyZWQgYXVkaW8gaXMgYmVpbmcgcGxheWVkIGJhY2sgbm93LiAiCisJCSAgICAgIkNhbiB5b3UgaGVhciB0aGUgJ3RvY2snIGVjaG8/IiwKKwkJICAgICBXSVRIX1lFU05PKTsKKworICAgIHBqc3VhX3BsYXllcl9kZXN0cm95KHBsYXlfaWQpOworICAgIHBsYXlfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworCisgICAgaWYgKGtleSAhPSBLRVlfWUVTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgLyogTm93IGFuYWx5emUgdGhlIGxhdGVuY3kgKi8KKyAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoImxhdGVuY3kiLCA1MTIsIDUxMik7CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3dhdl9wbGF5ZXJfcG9ydF9jcmVhdGUocG9vbCwgcmVjX3dhdl9maWxlLnB0ciwgMCwgMCwgMCwgJndhdl9wb3J0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICBzdGF0dXMgPSBjYWxjdWxhdGVfbGF0ZW5jeShwb29sLCB3YXZfcG9ydCwgJmxhdF9zdW0sICZsYXRfY250LCAKKwkJCSAgICAgICAmbGF0X21pbiwgJmxhdF9tYXgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworb25fcmV0dXJuOgorICAgIGlmICh3YXZfcG9ydCkKKwlwam1lZGlhX3BvcnRfZGVzdHJveSh3YXZfcG9ydCk7CisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIGlmIChwbGF5X2lkICE9IFBKU1VBX0lOVkFMSURfSUQpCisJcGpzdWFfcGxheWVyX2Rlc3Ryb3kocGxheV9pZCk7CisgICAgaWYgKHJlY19pZCAhPSBQSlNVQV9JTlZBTElEX0lEKQorCXBqc3VhX3JlY29yZGVyX2Rlc3Ryb3kocmVjX2lkKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXN5c3Rlc3RfcGVycm9yKCJTb3JyeSB3ZSBlbmNvdW50ZXJlZCBhbiBlcnJvcjogIiwgc3RhdHVzKTsKKwl0aS0+c3VjY2VzcyA9IFBKX0ZBTFNFOworCXBqX3N0cmVycm9yKHN0YXR1cywgdGktPnJlYXNvbiwgc2l6ZW9mKHRpLT5yZWFzb24pKTsKKyAgICB9IGVsc2UgaWYgKGtleSAhPSBLRVlfWUVTKSB7CisJdGktPnN1Y2Nlc3MgPSBQSl9GQUxTRTsKKwlpZiAoIXRpLT5zdWNjZXNzKSB7CisJICAgIHBqX2Fuc2lfc3RyY3B5KHRpLT5yZWFzb24sIFVTRVJfRVJST1IpOworCX0KKyAgICB9IGVsc2UgeworCWNoYXIgbXNnWzIwMF07CisJcGpfc2l6ZV90IG1zZ2xlbjsKKworCXBqX2Fuc2lfc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJCSAiVGhlIHNvdW5kIGRldmljZSBsYXRlbmN5OlxyXG4iCisJCQkgIiBNaW49JXUsIE1heD0ldSwgQXZnPSV1XHJcbiIsCisJCQkgbGF0X21pbiwgbGF0X21heCwgbGF0X3N1bS9sYXRfY250KTsKKwltc2dsZW4gPSBzdHJsZW4obXNnKTsKKworCWlmIChsYXRfc3VtL2xhdF9jbnQgPiA1MDApIHsKKwkgICAgcGpfYW5zaV9zbnByaW50Zihtc2crbXNnbGVuLCBzaXplb2YobXNnKS1tc2dsZW4sCisJCQkgICAgICJUaGUgbGF0ZW5jeSBpcyBodWdlIVxyXG4iKTsKKwkgICAgbXNnbGVuID0gc3RybGVuKG1zZyk7CisJfSBlbHNlIGlmIChsYXRfc3VtL2xhdF9jbnQgPiAyMDApIHsKKwkgICAgcGpfYW5zaV9zbnByaW50Zihtc2crbXNnbGVuLCBzaXplb2YobXNnKS1tc2dsZW4sCisJCQkgICAgICJUaGUgbGF0ZW5jeSBpcyBxdWl0ZSBoaWdoXHJcbiIpOworCSAgICBtc2dsZW4gPSBzdHJsZW4obXNnKTsKKwl9CisJCisJa2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwgbXNnLCBXSVRIX09LKTsKKworCXRpLT5zdWNjZXNzID0gUEpfVFJVRTsKKwlwal9hbnNpX3N0cm5jcHkodGktPnJlYXNvbiwgbXNnLCBzaXplb2YodGktPnJlYXNvbikpOworCXRpLT5yZWFzb25bc2l6ZW9mKHRpLT5yZWFzb24pLTFdID0gJ1wwJzsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgc3lzdGVzdF9hZWNfdGVzdCh2b2lkKQoreworICAgIGNvbnN0IGNoYXIgKnJlZl93YXZfcGF0aHNbXSA9IHsgYWRkX3BhdGgocmVzX3BhdGgsIFdBVl9QTEFZQkFDS19QQVRIKSwKKwkJCQkgICAgQUxUX1BBVEgxIFdBVl9QTEFZQkFDS19QQVRIIH07CisgICAgcGpzdWFfcGxheWVyX2lkIHBsYXllcl9pZCA9IFBKU1VBX0lOVkFMSURfSUQ7CisgICAgcGpzdWFfcmVjb3JkZXJfaWQgd3JpdGVyX2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICBlbnVtIGd1aV9rZXkga2V5OworICAgIHRlc3RfaXRlbV90ICp0aTsKKyAgICBjb25zdCBjaGFyICp0aXRsZSA9ICJBRUMvQUVTIFRlc3QiOworICAgIHVuc2lnbmVkIGxhc3RfZWNfdGFpbCA9IDA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHBqX3N0cl90IHRtcDsKKworICAgIHRpID0gc3lzdGVzdF9hbGxvY190ZXN0X2l0ZW0odGl0bGUpOworICAgIGlmICghdGkpCisJcmV0dXJuOworCisgICAga2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwKKwkJICAgICAiVGhpcyB0ZXN0IHdpbGwgdHJ5IHRvIGZpbmQgd2hldGhlciB0aGUgQUVDL0FFUyAiCisJCSAgICAgIndvcmtzIGdvb2Qgb24gdGhpcyBzeXN0ZW0uIFRlc3Qgd2lsbCBwbGF5IGEgZmlsZSAiCisJCSAgICAgIndoaWxlIHJlY29yZGluZyBmcm9tIG1pYy4gVGhlIHJlY29yZGluZyB3aWxsIGJlICIKKwkJICAgICAicGxheWVkIGJhY2sgbGF0ZXIgc28geW91IGNhbiBjaGVjayBpZiBlY2hvIGlzIHRoZXJlLiAiCisJCSAgICAgIlByZXNzIE9LIHRvIHN0YXJ0LiIsCisJCSAgICAgV0lUSF9PS0NBTkNFTCk7CisgICAgaWYgKGtleSAhPSBLRVlfT0spIHsKKwl0aS0+c2tpcHBlZCA9IFBKX1RSVUU7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFNhdmUgY3VycmVudCBFQyB0YWlsICovCisgICAgc3RhdHVzID0gcGpzdWFfZ2V0X2VjX3RhaWwoJmxhc3RfZWNfdGFpbCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgLyogU2V0IEVDIHRhaWwgc2V0dGluZyB0byBkZWZhdWx0ICovCisgICAgc3RhdHVzID0gcGpzdWFfc2V0X2VjKFBKU1VBX0RFRkFVTFRfRUNfVEFJTF9MRU4sIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qCisgICAgICogQ3JlYXRlIHBsYXllciBhbmQgcmVjb3JkZXIKKyAgICAgKi8KKyAgICBzdGF0dXMgPSBjcmVhdGVfcGxheWVyKFBKX0FSUkFZX1NJWkUocmVmX3dhdl9wYXRocyksIHJlZl93YXZfcGF0aHMsIAorCQkJICAgJnBsYXllcl9pZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiRXJyb3Igb3BlbmluZyBXQVYgZmlsZSAlcyIsCisJCSAgICAgV0FWX1BMQVlCQUNLX1BBVEgpKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9yZWNvcmRlcl9jcmVhdGUoCisgICAgICAgICAgICAgICAgIHBqX2NzdHIoJnRtcCwgYWRkX3BhdGgoZG9jX3BhdGgsIEFFQ19SRUNfUEFUSCkpLCAwLCAwLCAtMSwKKyAgICAgICAgICAgICAgICAgMCwgJndyaXRlcl9pZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJUEpfUEVSUk9SKDEsKFRISVNfRklMRSwgc3RhdHVzLCAiRXJyb3Igd3JpdGluZyBXQVYgZmlsZSAlcyIsCisJCSAgICAgQUVDX1JFQ19QQVRIKSk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTdGFydCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nLgorICAgICAqLworICAgIHBqc3VhX2NvbmZfY29ubmVjdChwanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydChwbGF5ZXJfaWQpLCAwKTsKKyAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKyAgICBwanN1YV9jb25mX2Nvbm5lY3QoMCwgcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydCh3cml0ZXJfaWQpKTsKKworICAgIC8qIFdhaXQgdXNlciBzaWduYWwgKi8KKyAgICBndWlfbXNnYm94KHRpdGxlLCAiQUVDL0FFUyB0ZXN0IGlzIHJ1bm5pbmcuIFByZXNzIE9LIHRvIHN0b3AgdGhpcyB0ZXN0LiIsCisJICAgICAgIFdJVEhfT0spOworCisgICAgLyoKKyAgICAgKiBTdG9wIGFuZCBjbG9zZSBwbGF5YmFjayBhbmQgcmVjb3JkZXIKKyAgICAgKi8KKyAgICBwanN1YV9jb25mX2Rpc2Nvbm5lY3QoMCwgcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydCh3cml0ZXJfaWQpKTsKKyAgICBwanN1YV9jb25mX2Rpc2Nvbm5lY3QocGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQocGxheWVyX2lkKSwgMCk7CisgICAgcGpzdWFfcmVjb3JkZXJfZGVzdHJveSh3cml0ZXJfaWQpOworICAgIHBqc3VhX3BsYXllcl9kZXN0cm95KHBsYXllcl9pZCk7CisgICAgcGxheWVyX2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICB3cml0ZXJfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworCisgICAgLyoKKyAgICAgKiBQbGF5IHRoZSByZXN1bHQuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzdWFfcGxheWVyX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgcGpfY3N0cigmdG1wLCBhZGRfcGF0aChkb2NfcGF0aCwgQUVDX1JFQ19QQVRIKSksCisgICAgICAgICAgICAgICAgIDAsICZwbGF5ZXJfaWQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCVBKX1BFUlJPUigxLChUSElTX0ZJTEUsIHN0YXR1cywgIkVycm9yIG9wZW5pbmcgV0FWIGZpbGUgJXMiLCBBRUNfUkVDX1BBVEgpKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgcGpzdWFfY29uZl9jb25uZWN0KHBqc3VhX3BsYXllcl9nZXRfY29uZl9wb3J0KHBsYXllcl9pZCksIDApOworCisgICAgLyogV2FpdCB1c2VyIHNpZ25hbCAqLworICAgIGd1aV9tc2dib3godGl0bGUsICJXZSBhcmUgbm93IHBsYXlpbmcgdGhlIGNhcHR1cmVkIGF1ZGlvIGZyb20gdGhlIG1pYy4gIgorCQkgICAgICAiQ2hlY2sgaWYgZWNobyAob2YgdGhlIGF1ZGlvIHBsYXllZCBiYWNrIHByZXZpb3VzbHkpIGlzICIKKwkJICAgICAgInByZXNlbnQgaW4gdGhlIGF1ZGlvLiBUaGUgcmVjb3JkaW5nIGlzIHN0b3JlZCBpbiAiIAorCQkgICAgICBBRUNfUkVDX1BBVEggIiBmb3Igb2ZmbGluZSBhbmFseXNpcy4gIgorCQkgICAgICAiUHJlc3MgT0sgdG8gc3RvcC4iLAorCQkgICAgICBXSVRIX09LKTsKKworICAgIHBqc3VhX2NvbmZfZGlzY29ubmVjdChwanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydChwbGF5ZXJfaWQpLCAwKTsKKworICAgIGtleSA9IGd1aV9tc2dib3godGl0bGUsCisJCSAgICAgIkRpZCB5b3Ugbm90aWNlIGFueSBlY2hvIGluIHRoZSByZWNvcmRpbmc/IiwKKwkJICAgICBXSVRIX1lFU05PKTsKKworCitvbl9yZXR1cm46CisgICAgaWYgKHBsYXllcl9pZCAhPSBQSlNVQV9JTlZBTElEX0lEKQorCXBqc3VhX3BsYXllcl9kZXN0cm95KHBsYXllcl9pZCk7CisgICAgaWYgKHdyaXRlcl9pZCAhPSBQSlNVQV9JTlZBTElEX0lEKQorCXBqc3VhX3JlY29yZGVyX2Rlc3Ryb3kod3JpdGVyX2lkKTsKKworICAgIC8qIFdhaXQgdW50aWwgc291bmQgZGV2aWNlIGNsb3NlZCBiZWZvcmUgcmVzdG9yaW5nIGJhY2sgRUMgdGFpbCBzZXR0aW5nICovCisgICAgd2hpbGUgKHBqc3VhX3NuZF9pc19hY3RpdmUoKSkKKwlwal90aHJlYWRfc2xlZXAoMTApOworICAgIHBqc3VhX3NldF9lYyhsYXN0X2VjX3RhaWwsIDApOworCisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzeXN0ZXN0X3BlcnJvcigiU29ycnkgd2UgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICIsIHN0YXR1cyk7CisJdGktPnN1Y2Nlc3MgPSBQSl9GQUxTRTsKKwlwal9zdHJlcnJvcihzdGF0dXMsIHRpLT5yZWFzb24sIHNpemVvZih0aS0+cmVhc29uKSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gS0VZX1lFUykgeworCXRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJaWYgKCF0aS0+c3VjY2VzcykgeworCSAgICBwal9hbnNpX3N0cmNweSh0aS0+cmVhc29uLCBVU0VSX0VSUk9SKTsKKwl9CisgICAgfSBlbHNlIHsKKwljaGFyIG1zZ1syMDBdOworCisJcGpfYW5zaV9zbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiVGVzdCBzdWNjZWVkZWQuXHJcbiIpOworCisJdGktPnN1Y2Nlc3MgPSBQSl9UUlVFOworCXBqX2Fuc2lfc3RybmNweSh0aS0+cmVhc29uLCBtc2csIHNpemVvZih0aS0+cmVhc29uKSk7CisJdGktPnJlYXNvbltzaXplb2YodGktPnJlYXNvbiktMV0gPSAnXDAnOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlndXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgc3lzdGVzdF9saXN0X2F1ZGlvX2RldnMoKQoreworICAgIHVuc2lnbmVkIGksIGRldl9jb3VudDsKKyAgICBwal9zaXplX3QgbGVuPTA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHRlc3RfaXRlbV90ICp0aTsKKyAgICBlbnVtIGd1aV9rZXkga2V5OworICAgIGNvbnN0IGNoYXIgKnRpdGxlID0gIkF1ZGlvIERldmljZSBMaXN0IjsKKyAgICAKKyAgICB0aSA9IHN5c3Rlc3RfYWxsb2NfdGVzdF9pdGVtKHRpdGxlKTsKKyAgICBpZiAoIXRpKQorCXJldHVybjsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJSdW5uaW5nICVzIiwgdGl0bGUpKTsKKworICAgIGRldl9jb3VudCA9IHBqbWVkaWFfYXVkX2Rldl9jb3VudCgpOworICAgIGlmIChkZXZfY291bnQgPT0gMCkgeworCWtleSA9IGd1aV9tc2dib3godGl0bGUsIAorCQkJICJObyBhdWRpbyBkZXZpY2VzIGFyZSBmb3VuZCIsIFdJVEhfT0spOworCXRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJcGpfYW5zaV9zdHJjcHkodGktPnJlYXNvbiwgIk5vIGRldmljZSBmb3VuZCIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRpLT5yZWFzb24rbGVuLCBzaXplb2YodGktPnJlYXNvbiktbGVuLAorCQkgICAgICJGb3VuZCAldSBkZXZpY2VzXHJcbiIsIGRldl9jb3VudCk7CisgICAgbGVuID0gc3RybGVuKHRpLT5yZWFzb24pOworCisgICAgZm9yIChpPTA7IGk8ZGV2X2NvdW50OyArK2kpIHsKKwlwam1lZGlhX2F1ZF9kZXZfaW5mbyBpbmZvOworCisJc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKGksICZpbmZvKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgc3lzdGVzdF9wZXJyb3IoIkVycm9yIHJldHJpZXZpbmcgZGV2aWNlIGluZm86ICIsIHN0YXR1cyk7CisJICAgIHRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJICAgIHBqX3N0cmVycm9yKHN0YXR1cywgdGktPnJlYXNvbiwgc2l6ZW9mKHRpLT5yZWFzb24pKTsKKwkgICAgcmV0dXJuOworCX0KKworCXBqX2Fuc2lfc25wcmludGYodGktPnJlYXNvbitsZW4sIHNpemVvZih0aS0+cmVhc29uKS1sZW4sCisJCQkgIiAlMmQ6ICVzIFslc10gKCVkLyVkKVxyXG4iLAorCQkgICAgICAgICAgaSwgaW5mby5kcml2ZXIsIGluZm8ubmFtZSwgCisJCQkgIGluZm8uaW5wdXRfY291bnQsIGluZm8ub3V0cHV0X2NvdW50KTsKKwlsZW4gPSBzdHJsZW4odGktPnJlYXNvbik7CisgICAgfQorCisgICAgdGktPnJlYXNvbltsZW5dID0gJ1wwJzsKKyAgICBrZXkgPSBndWlfbXNnYm94KHRpdGxlLCB0aS0+cmVhc29uLCBXSVRIX09LKTsKKworICAgIHRpLT5zdWNjZXNzID0gUEpfVFJVRTsKK30KKworc3RhdGljIHZvaWQgc3lzdGVzdF9kaXNwbGF5X3NldHRpbmdzKHZvaWQpCit7CisgICAgcGptZWRpYV9hdWRfZGV2X2luZm8gZGk7CisgICAgcGpfc2l6ZV90IGxlbiA9IDA7CisgICAgZW51bSBndWlfa2V5IGtleTsKKyAgICB0ZXN0X2l0ZW1fdCAqdGk7CisgICAgY29uc3QgY2hhciAqdGl0bGUgPSAiQXVkaW8gU2V0dGluZ3MiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHRpID0gc3lzdGVzdF9hbGxvY190ZXN0X2l0ZW0odGl0bGUpOworICAgIGlmICghdGkpCisJcmV0dXJuOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJ1bm5pbmcgJXMiLCB0aXRsZSkpOworCisgICAgcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmK2xlbiwgc2l6ZW9mKHRleHRidWYpLWxlbiwgIlZlcnNpb246ICVzXHJcbiIsCisJCSAgICAgcGpfZ2V0X3ZlcnNpb24oKSk7CisgICAgbGVuID0gc3RybGVuKHRleHRidWYpOworCisgICAgcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmK2xlbiwgc2l6ZW9mKHRleHRidWYpLWxlbiwgIlRlc3QgY2xvY2sgcmF0ZTogJWRcclxuIiwKKwkJICAgICBzeXN0ZXN0Lm1lZGlhX2NmZy5jbG9ja19yYXRlKTsKKyAgICBsZW4gPSBzdHJsZW4odGV4dGJ1Zik7CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYrbGVuLCBzaXplb2YodGV4dGJ1ZiktbGVuLCAiRGV2aWNlIGNsb2NrIHJhdGU6ICVkXHJcbiIsCisJCSAgICAgc3lzdGVzdC5tZWRpYV9jZmcuc25kX2Nsb2NrX3JhdGUpOworICAgIGxlbiA9IHN0cmxlbih0ZXh0YnVmKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYodGV4dGJ1ZitsZW4sIHNpemVvZih0ZXh0YnVmKS1sZW4sICJBdWQgZnJhbWUgcHRpbWU6ICVkXHJcbiIsCisJCSAgICAgc3lzdGVzdC5tZWRpYV9jZmcuYXVkaW9fZnJhbWVfcHRpbWUpOworICAgIGxlbiA9IHN0cmxlbih0ZXh0YnVmKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYodGV4dGJ1ZitsZW4sIHNpemVvZih0ZXh0YnVmKS1sZW4sICJDaGFubmVsIGNvdW50OiAlZFxyXG4iLAorCQkgICAgIHN5c3Rlc3QubWVkaWFfY2ZnLmNoYW5uZWxfY291bnQpOworICAgIGxlbiA9IHN0cmxlbih0ZXh0YnVmKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYodGV4dGJ1ZitsZW4sIHNpemVvZih0ZXh0YnVmKS1sZW4sICJBdWRpbyBzd2l0Y2hpbmc6ICVzXHJcbiIsCisJICAgIChQSk1FRElBX0NPTkZfVVNFX1NXSVRDSF9CT0FSRCA/ICJTd2l0Y2hib2FyZCIgOiAiQ29uZiBicmlkZ2UiKSk7CisgICAgbGVuID0gc3RybGVuKHRleHRidWYpOworCisgICAgcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmK2xlbiwgc2l6ZW9mKHRleHRidWYpLWxlbiwgIlNuZCBidWZmIGNvdW50OiAlZFxyXG4iLAorCQkgICAgIFBKTUVESUFfU09VTkRfQlVGRkVSX0NPVU5UKTsKKyAgICBsZW4gPSBzdHJsZW4odGV4dGJ1Zik7CisKKyAgICAvKiBDYXB0dXJlIGRldmljZSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX2Rldl9nZXRfaW5mbyhzeXN0ZXN0LnJlY19pZCwgJmRpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzeXN0ZXN0X3BlcnJvcigiRXJyb3IgcXVlcnlpbmcgZGV2aWNlIGluZm8iLCBzdGF0dXMpOworCXRpLT5zdWNjZXNzID0gUEpfRkFMU0U7CisJcGpfc3RyZXJyb3Ioc3RhdHVzLCB0aS0+cmVhc29uLCBzaXplb2YodGktPnJlYXNvbikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYrbGVuLCBzaXplb2YodGV4dGJ1ZiktbGVuLAorCQkgICAgICJSZWMgZGV2IDogJWQgKCVzKSBbJXNdXHJcbiIsCisJCSAgICAgc3lzdGVzdC5yZWNfaWQsCisJCSAgICAgZGkubmFtZSwKKwkJICAgICBkaS5kcml2ZXIpOworICAgIGxlbiA9IHN0cmxlbih0ZXh0YnVmKTsKKworICAgIHBqX2Fuc2lfc25wcmludGYodGV4dGJ1ZitsZW4sIHNpemVvZih0ZXh0YnVmKS1sZW4sCisJCSAgICAgIlJlYyAgYnVmIDogJWQgbXNlY1xyXG4iLAorCQkgICAgIHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9yZWNfbGF0ZW5jeSk7CisgICAgbGVuID0gc3RybGVuKHRleHRidWYpOworCisgICAgLyogUGxheWJhY2sgZGV2aWNlICovCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKHN5c3Rlc3QucGxheV9pZCwgJmRpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzeXN0ZXN0X3BlcnJvcigiRXJyb3IgcXVlcnlpbmcgZGV2aWNlIGluZm8iLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYrbGVuLCBzaXplb2YodGV4dGJ1ZiktbGVuLAorCQkgICAgICJQbGF5IGRldjogJWQgKCVzKSBbJXNdXHJcbiIsCisJCSAgICAgc3lzdGVzdC5wbGF5X2lkLAorCQkgICAgIGRpLm5hbWUsCisJCSAgICAgZGkuZHJpdmVyKTsKKyAgICBsZW4gPSBzdHJsZW4odGV4dGJ1Zik7CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYrbGVuLCBzaXplb2YodGV4dGJ1ZiktbGVuLAorCQkgICAgICJQbGF5IGJ1ZjogJWQgbXNlY1xyXG4iLAorCQkgICAgIHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9wbGF5X2xhdGVuY3kpOworICAgIGxlbiA9IHN0cmxlbih0ZXh0YnVmKTsKKworICAgIHRpLT5zdWNjZXNzID0gUEpfVFJVRTsKKyAgICBwal9hbnNpX3N0cm5jcHkodGktPnJlYXNvbiwgdGV4dGJ1Ziwgc2l6ZW9mKHRpLT5yZWFzb24pKTsKKyAgICB0aS0+cmVhc29uW3NpemVvZih0aS0+cmVhc29uKS0xXSA9ICdcMCc7CisgICAga2V5ID0gZ3VpX21zZ2JveCh0aXRsZSwgdGV4dGJ1ZiwgV0lUSF9PSyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgc3lzdGVzdF9pbml0KHZvaWQpCit7CisgICAgcGpzdWFfbG9nZ2luZ19jb25maWcgbG9nX2NmZzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9TVUNDRVNTOworCisgICAgc3RhdHVzID0gcGpzdWFfY3JlYXRlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc3lzdGVzdF9wZXJyb3IoIlNvcnJ5IHdlJ3ZlIGhhZCBlcnJvciBpbiBwanN1YV9jcmVhdGUoKTogIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHBqc3VhX2xvZ2dpbmdfY29uZmlnX2RlZmF1bHQoJmxvZ19jZmcpOworICAgIGxvZ19jZmcubG9nX2ZpbGVuYW1lID0gcGpfc3RyKGFkZF9wYXRoKGRvY19wYXRoLCBMT0dfT1VUX1BBVEgpKTsKKworICAgIHBqc3VhX2NvbmZpZ19kZWZhdWx0KCZzeXN0ZXN0LnVhX2NmZyk7CisgICAgcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQoJnN5c3Rlc3QubWVkaWFfY2ZnKTsKKyAgICBzeXN0ZXN0Lm1lZGlhX2NmZy5jbG9ja19yYXRlID0gVEVTVF9DTE9DS19SQVRFOworICAgIHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9jbG9ja19yYXRlID0gREVWX0NMT0NLX1JBVEU7CisgICAgaWYgKE9WRVJSSURFX0FVRF9GUkFNRV9QVElNRSkKKwlzeXN0ZXN0Lm1lZGlhX2NmZy5hdWRpb19mcmFtZV9wdGltZSA9IE9WRVJSSURFX0FVRF9GUkFNRV9QVElNRTsKKyAgICBzeXN0ZXN0Lm1lZGlhX2NmZy5jaGFubmVsX2NvdW50ID0gQ0hBTk5FTF9DT1VOVDsKKyAgICBzeXN0ZXN0LnJlY19pZCA9IFJFQ19ERVZfSUQ7CisgICAgc3lzdGVzdC5wbGF5X2lkID0gUExBWV9ERVZfSUQ7CisgICAgc3lzdGVzdC5tZWRpYV9jZmcuZWNfdGFpbF9sZW4gPSAwOworICAgIHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9hdXRvX2Nsb3NlX3RpbWUgPSAwOworCisjaWYgZGVmaW5lZChPVkVSUklERV9BVURERVZfUExBWV9MQVQpICYmIE9WRVJSSURFX0FVRERFVl9QTEFZX0xBVCE9MAorICAgIHN5c3Rlc3QubWVkaWFfY2ZnLnNuZF9wbGF5X2xhdGVuY3kgPSBPVkVSUklERV9BVURERVZfUExBWV9MQVQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoT1ZFUlJJREVfQVVEREVWX1JFQ19MQVQpICYmIE9WRVJSSURFX0FVRERFVl9SRUNfTEFUIT0wCisgICAgc3lzdGVzdC5tZWRpYV9jZmcuc25kX3JlY19sYXRlbmN5ID0gT1ZFUlJJREVfQVVEREVWX1JFQ19MQVQ7CisjZW5kaWYKKwkKKyAgICBzdGF0dXMgPSBwanN1YV9pbml0KCZzeXN0ZXN0LnVhX2NmZywgJmxvZ19jZmcsICZzeXN0ZXN0Lm1lZGlhX2NmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzdWFfZGVzdHJveSgpOworCXN5c3Rlc3RfcGVycm9yKCJTb3JyeSB3ZSd2ZSBoYWQgZXJyb3IgaW4gcGpzdWFfaW5pdCgpOiAiLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfc3RhcnQoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwanN1YV9kZXN0cm95KCk7CisJc3lzdGVzdF9wZXJyb3IoIlNvcnJ5IHdlJ3ZlIGhhZCBlcnJvciBpbiBwanN1YV9zdGFydCgpOiAiLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gZ3VpX2luaXQoJnJvb3RfbWVudSk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgcmV0dXJuIDA7CisKK29uX3JldHVybjoKKyAgICBndWlfZGVzdHJveSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworaW50IHN5c3Rlc3Rfc2V0X2RldihpbnQgY2FwX2RldiwgaW50IHBsYXlfZGV2KQoreworICAgIHN5c3Rlc3QucmVjX2lkID0gc3lzdGVzdF9jYXBfZGV2X2lkID0gY2FwX2RldjsKKyAgICBzeXN0ZXN0LnBsYXlfaWQgPSBzeXN0ZXN0X3BsYXlfZGV2X2lkID0gcGxheV9kZXY7CisgICAgcmV0dXJuIHBqc3VhX3NldF9zbmRfZGV2KGNhcF9kZXYsIHBsYXlfZGV2KTsKK30KKworc3RhdGljIHZvaWQgc3lzdGVzdF93aXphcmQodm9pZCkKK3sKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUnVubmluZyB0ZXN0IHdpemFyZCIpKTsKKyAgICBzeXN0ZXN0X2xpc3RfYXVkaW9fZGV2cygpOworICAgIHN5c3Rlc3RfZGlzcGxheV9zZXR0aW5ncygpOworICAgIHN5c3Rlc3RfcGxheV90b25lKCk7CisgICAgc3lzdGVzdF9wbGF5X3dhdjEoKTsKKyAgICBzeXN0ZXN0X3JlY19hdWRpbygpOworICAgIHN5c3Rlc3RfYXVkaW9fdGVzdCgpOworICAgIHN5c3Rlc3RfbGF0ZW5jeV90ZXN0KCk7CisgICAgc3lzdGVzdF9hZWNfdGVzdCgpOworICAgIGd1aV9tc2dib3goIlRlc3Qgd2l6YXJkIiwgIlRlc3Qgd2l6YXJkIGNvbXBsZXRlLiIsIFdJVEhfT0spOworfQorCisKK2ludCBzeXN0ZXN0X3J1bih2b2lkKQoreworICAgIGd1aV9zdGFydCgmcm9vdF9tZW51KTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzeXN0ZXN0X3NhdmVfcmVzdWx0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfb3NoYW5kbGVfdCBmZDsKKyAgICBwal90aW1lX3ZhbCB0djsKKyAgICBwal9wYXJzZWRfdGltZSBwdDsKKyAgICBwal9zc2l6ZV90IHNpemU7CisgICAgY29uc3QgY2hhciAqdGV4dDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwal9maWxlX29wZW4oTlVMTCwgZmlsZW5hbWUsIFBKX09fV1JPTkxZIHwgUEpfT19BUFBFTkQsICZmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmLCBzaXplb2YodGV4dGJ1ZiksCisJCQkgIkVycm9yIG9wZW5pbmcgZmlsZSAlcyIsCisJCQkgZmlsZW5hbWUpOworCXN5c3Rlc3RfcGVycm9yKHRleHRidWYsIHN0YXR1cyk7CisJcmV0dXJuOworICAgIH0KKworICAgIHRleHQgPSAiXHJcblxyXG5QSlNZU1RFU1QgUmVwb3J0XHJcbiI7CisgICAgc2l6ZSA9IHN0cmxlbih0ZXh0KTsKKyAgICBwal9maWxlX3dyaXRlKGZkLCB0ZXh0LCAmc2l6ZSk7CisKKyAgICAvKiBQdXQgdGltZXN0YW1wICovCisgICAgcGpfZ2V0dGltZW9mZGF5KCZ0dik7CisgICAgaWYgKHBqX3RpbWVfZGVjb2RlKCZ0diwgJnB0KSA9PSBQSl9TVUNDRVNTKSB7CisJcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmLCBzaXplb2YodGV4dGJ1ZiksCisJCQkgIlRpbWU6ICUwNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkXHJcbiIsCisJCQkgcHQueWVhciwgcHQubW9uKzEsIHB0LmRheSwKKwkJCSBwdC5ob3VyLCBwdC5taW4sIHB0LnNlYyk7CisJc2l6ZSA9IHN0cmxlbih0ZXh0YnVmKTsKKwlwal9maWxlX3dyaXRlKGZkLCB0ZXh0YnVmLCAmc2l6ZSk7CisgICAgfQorCisgICAgcGpfYW5zaV9zbnByaW50Zih0ZXh0YnVmLCBzaXplb2YodGV4dGJ1ZiksCisJCSAgICAgIlRlc3RzIGludm9rZWQ6ICV1XHJcbiIKKwkJICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIiwKKwkJICAgICB0ZXN0X2l0ZW1fY291bnQpOworICAgIHNpemUgPSBzdHJsZW4odGV4dGJ1Zik7CisgICAgcGpfZmlsZV93cml0ZShmZCwgdGV4dGJ1ZiwgJnNpemUpOworCisgICAgZm9yIChpPTA7IGk8dGVzdF9pdGVtX2NvdW50OyArK2kpIHsKKwl0ZXN0X2l0ZW1fdCAqdGkgPSAmdGVzdF9pdGVtc1tpXTsKKwlwal9hbnNpX3NucHJpbnRmKHRleHRidWYsIHNpemVvZih0ZXh0YnVmKSwKKwkJCSAiXHJcblRFU1QgJWQ6ICVzICVzXHJcbiIsCisJCQkgaSwgdGktPnRpdGxlLAorCQkJICh0aS0+c2tpcHBlZD8gIlNraXBwZWQiIDogKHRpLT5zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWxlZCIpKSk7CisJc2l6ZSA9IHN0cmxlbih0ZXh0YnVmKTsKKwlwal9maWxlX3dyaXRlKGZkLCB0ZXh0YnVmLCAmc2l6ZSk7CisKKwlzaXplID0gc3RybGVuKHRpLT5yZWFzb24pOworCXBqX2ZpbGVfd3JpdGUoZmQsIHRpLT5yZWFzb24sICZzaXplKTsKKworCXNpemUgPSAyOworCXBqX2ZpbGVfd3JpdGUoZmQsICJcclxuIiwgJnNpemUpOworICAgIH0KKworCisgICAgcGpfZmlsZV9jbG9zZShmZCk7CisKKyAgICBwal9hbnNpX3NucHJpbnRmKHRleHRidWYsIHNpemVvZih0ZXh0YnVmKSwKKwkJICAgICAiVGVzdCByZXN1bHQgc3VjY2Vzc2Z1bGx5IGFwcGVuZGVkIHRvIGZpbGUgJXMiLAorCQkgICAgIGZpbGVuYW1lKTsKKyAgICBndWlfbXNnYm94KCJUZXN0IHJlc3VsdCBzYXZlZCIsIHRleHRidWYsIFdJVEhfT0spOworfQorCit2b2lkIHN5c3Rlc3RfZGVpbml0KHZvaWQpCit7CisgICAgZ3VpX2Rlc3Ryb3koKTsKKyAgICBwanN1YV9kZXN0cm95KCk7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3Bqc3lzdGVzdC9zeXN0ZXN0LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3Qvc3lzdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWFhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9wanN5c3Rlc3Qvc3lzdGVzdC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiAkSWQ6IHN5c3Rlc3QuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19TWVNURVNUX0hfXworI2RlZmluZSBfX1NZU1RFU1RfSF9fCisKKyNpbmNsdWRlIDxwamxpYi5oPgorCisvKgorICogT3ZlcnJpZGVhYmxlIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBSRUNfREVWX0lECQkJc3lzdGVzdF9jYXBfZGV2X2lkCisjZGVmaW5lIFBMQVlfREVWX0lECQkJc3lzdGVzdF9wbGF5X2Rldl9pZAorLy8jZGVmaW5lIFJFQ19ERVZfSUQJCQk1CisvLyNkZWZpbmUgUExBWV9ERVZfSUQJCQk1CisjZGVmaW5lIE9WRVJSSURFX0FVRERFVl9SRUNfTEFUCQkwCisjZGVmaW5lIE9WRVJSSURFX0FVRERFVl9QTEFZX0xBVAkwCisjZGVmaW5lIE9WRVJSSURFX0FVRF9GUkFNRV9QVElNRQkwCisKKy8qIERvbid0IGNoYW5nZSB0aGlzICovCisjZGVmaW5lIENIQU5ORUxfQ09VTlQJCQkxCisKKy8qIElmIHlvdSBjaGFuZ2UgQ0xPQ0tfUkFURSB0aGVuIHRoZSBpbnB1dCBXQVYgZmlsZXMgbmVlZCB0byBiZQorICogY2hhbmdlZCwgc28gbm9ybWFsbHkgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhpcy4KKyAqLworI2RlZmluZSBURVNUX0NMT0NLX1JBVEUJCQk4MDAwCisKKy8qIFlvdSBtYXkgY2hhbmdlIHNvdW5kIGRldmljZSdzIGNsb2NrIHJhdGUgYXMgbG9uZyBhcyByZXNhbXBsaW5nCisgKiBpcyBlbmFibGVkLgorICovCisjZGVmaW5lIERFVl9DTE9DS19SQVRFCQkJODAwMAorCisKKyNpZiBkZWZpbmVkKFBKX1dJTjMyX1dJTkNFKSAmJiBQSl9XSU4zMl9XSU5DRQorICAgICNkZWZpbmUgTE9HX09VVF9QQVRICQkiXFxQSlNZU1RFU1QuVFhUIgorICAgICNkZWZpbmUgUkVTVUxUX09VVF9QQVRICQkiXFxQSlNZU1RFU1RfUkVTVUxULlRYVCIKKyAgICAjZGVmaW5lIFdBVl9QTEFZQkFDS19QQVRICQkiXFxQcm9ncmFtIEZpbGVzXFxwanN5c3Rlc3RcXGlucHV0Ljgud2F2IgorICAgICNkZWZpbmUgV0FWX1JFQ19PVVRfUEFUSAkJIlxcUEpTWVNURVNUX1RFU1RSRUMuV0FWIgorICAgICNkZWZpbmUgV0FWX1RPQ0s4X1BBVEgJCSJcXFByb2dyYW0gRmlsZXNcXHBqc3lzdGVzdFxcdG9jazguV0FWIgorICAgICNkZWZpbmUgV0FWX0xBVEVOQ1lfT1VUX1BBVEgJIlxcUEpTWVNURVNUX0xBVFJFQy5XQVYiCisgICAgI2RlZmluZSBBTFRfUEFUSDEJCQkiIgorICAgICNkZWZpbmUgQUVDX1JFQ19QQVRICQkiXFxQSlNZU1RFU1RfQUVDUkVDLldBViIKKyNlbHNlCisgICAgI2RlZmluZSBMT0dfT1VUX1BBVEgJCSJQSlNZU1RFU1QuVFhUIgorICAgICNkZWZpbmUgUkVTVUxUX09VVF9QQVRICQkiUEpTWVNURVNUX1JFU1VMVC5UWFQiCisgICAgI2RlZmluZSBXQVZfUExBWUJBQ0tfUEFUSAkJImlucHV0Ljgud2F2IgorICAgICNkZWZpbmUgV0FWX1JFQ19PVVRfUEFUSAkJIlBKU1lTVEVTVF9URVNUUkVDLldBViIKKyAgICAjZGVmaW5lIFdBVl9UT0NLOF9QQVRICQkidG9jazgud2F2IgorICAgICNkZWZpbmUgV0FWX0xBVEVOQ1lfT1VUX1BBVEgJIlBKU1lTVEVTVF9MQVRSRUMuV0FWIgorICAgICNkZWZpbmUgQUxUX1BBVEgxCQkJIi4uLy4uL3Rlc3RzL3Bqc3VhL3dhdnMvIgorICAgICNkZWZpbmUgQUVDX1JFQ19QQVRICQkiUEpTWVNURVNUX0FFQ1JFQy5XQVYiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBBUEksIHRvIGJlIGNhbGxlZCBieSBtYWluKCkgKi8KK2ludAkgICAgc3lzdGVzdF9pbml0KHZvaWQpOworaW50CSAgICBzeXN0ZXN0X3NldF9kZXYoaW50IGNhcF9kZXYsIGludCBwbGF5X2Rldik7CitpbnQJICAgIHN5c3Rlc3RfcnVuKHZvaWQpOwordm9pZAkgICAgc3lzdGVzdF9zYXZlX3Jlc3VsdChjb25zdCBjaGFyICpmaWxlbmFtZSk7Cit2b2lkCSAgICBzeXN0ZXN0X2RlaW5pdCh2b2lkKTsKKworLyogRGV2aWNlIElEIHRvIHRlc3QgKi8KK2V4dGVybiBpbnQgc3lzdGVzdF9jYXBfZGV2X2lkOworZXh0ZXJuIGludCBzeXN0ZXN0X3BsYXlfZGV2X2lkOworCisvKiBUZXN0IGl0ZW0gaXMgdXNlZCB0byByZWNvcmQgdGhlIHRlc3QgcmVzdWx0ICovCit0eXBlZGVmIHN0cnVjdCB0ZXN0X2l0ZW1fdAoreworICAgIGNoYXIJdGl0bGVbODBdOworICAgIHBqX2Jvb2xfdAlza2lwcGVkOworICAgIHBqX2Jvb2xfdAlzdWNjZXNzOworICAgIGNoYXIJcmVhc29uWzEwMjRdOworfSB0ZXN0X2l0ZW1fdDsKKworI2RlZmluZSBTWVNURVNUX01BWF9URVNUICAgIDMyCitleHRlcm4gdW5zaWduZWQJICAgIHRlc3RfaXRlbV9jb3VudDsKK2V4dGVybiB0ZXN0X2l0ZW1fdCAgdGVzdF9pdGVtc1tTWVNURVNUX01BWF9URVNUXTsKKyNkZWZpbmUgUEFUSF9MRU5HVEgJICAgIFBKX01BWFBBVEgKK2V4dGVybiBjaGFyCSAgICBkb2NfcGF0aFtQQVRIX0xFTkdUSF07CitleHRlcm4gY2hhcgkgICAgcmVzX3BhdGhbUEFUSF9MRU5HVEhdOworCit0ZXN0X2l0ZW1fdCAqc3lzdGVzdF9hbGxvY190ZXN0X2l0ZW0oY29uc3QgY2hhciAqdGl0bGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogX19TWVNURVNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvREVQUkVDQVRFRC50eHQgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9ERVBSRUNBVEVELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU4NTg3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvREVQUkVDQVRFRC50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIFB5dGhvbiBtb2R1bGUgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB1bmRlcgorcGpzaXAtYXBwcy9weXRob24gZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvTWFrZWZpbGUgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVkMmZiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACithbGw6CisJcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKKworY2xlYW46CisJcHl0aG9uIHNldHVwLnB5IGNsZWFuCisJcm0gLXJmIC4vYnVpbGQKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL2hlbHBlci5tYWsgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9oZWxwZXIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWNjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9oZWxwZXIubWFrCkBAIC0wLDAgKzEsMTcgQEAKK2luY2x1ZGUgLi4vLi4vLi4vYnVpbGQubWFrCisKK2xpYl9kaXI6CisJQGZvciB0b2tlbiBpbiBgZWNobyAkKEFQUF9MREZMQUdTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBMIHwgc2VkICdzLy1MLy8nOyBcCisJZG9uZQorCitpbmNfZGlyOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfQ0ZMQUdTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBJIHwgc2VkICdzLy1JLy8nOyBcCisJZG9uZQorCitsaWJzOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfTERMSUJTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBcXC1sIHwgc2VkICdzLy1sLy8nOyBcCisJZG9uZQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9wanN1YS5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3Bqc3VhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjliYTUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9wanN1YS5weQpAQCAtMCwwICsxLDI2NCBAQAoraW1wb3J0IHB5X3Bqc3VhCisKK3N0YXR1cyA9IHB5X3Bqc3VhLmNyZWF0ZSgpCitwcmludCAicHkgc3RhdHVzICIgKyBgc3RhdHVzYAorCisKKyMKKyMgQ3JlYXRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cworIwordWFfY2ZnID0gcHlfcGpzdWEuY29uZmlnX2RlZmF1bHQoKQorbG9nX2NmZyA9IHB5X3Bqc3VhLmxvZ2dpbmdfY29uZmlnX2RlZmF1bHQoKQorbWVkaWFfY2ZnID0gcHlfcGpzdWEubWVkaWFfY29uZmlnX2RlZmF1bHQoKQorCisjCisjIExvZ2dpbmcgY2FsbGJhY2suCisjCitkZWYgbG9nZ2luZ19jYjEobGV2ZWwsIHN0ciwgbGVuKToKKyAgICBwcmludCBzdHIsCisKKworIworIyBDb25maWd1cmUgbG9nZ2luZworIworbG9nX2NmZy5jYiA9IGxvZ2dpbmdfY2IxCitsb2dfY2ZnLmNvbnNvbGVfbGV2ZWwgPSA0CisKKyMKKyMgSW5pdGlhbGl6ZSBwanN1YSEKKyMKK3N0YXR1cyA9IHB5X3Bqc3VhLmluaXQodWFfY2ZnLCBsb2dfY2ZnLCBtZWRpYV9jZmcpOworcHJpbnQgInB5IHN0YXR1cyBhZnRlciBpbml0aWFsaXphdGlvbiA6IiArIGBzdGF0dXNgCisKKworIworIyBTdGFydCBwanN1YSEKKyMKK3N0YXR1cyA9IHB5X3Bqc3VhLnN0YXJ0KCkKK2lmIHN0YXR1cyAhPSAwOgorICAgIGV4aXQoMSkKKworCittZXNzYWdlID0gcHlfcGpzdWEubXNnX2RhdGFfaW5pdCgpCisKK3ByaW50ICJpZGVudGl0YXMgb2JqZWN0IG1lc3NhZ2UgZGF0YSA6IiArIGBtZXNzYWdlYAorCitzaXBhZGRyID0gJ3NpcDoxNjcuMjA1LjM0Ljk5JworcHJpbnQgImNoZWNraW5nIHNpcCBhZGRyZXNzIFslc10gOiAlZCIgJSAoc2lwYWRkciwgcHlfcGpzdWEudmVyaWZ5X3NpcF91cmwoc2lwYWRkcikpCisKK3NpcGFkZHIgPSAnMTY3LjIwNS4zNC45OScKK3ByaW50ICJjaGVja2luZyBpbnZhbGlkIHNpcCBhZGRyZXNzIFslc10gOiAlZCIgJSAoc2lwYWRkciwgcHlfcGpzdWEudmVyaWZ5X3NpcF91cmwoc2lwYWRkcikpCisKK29iamVjdCA9IHB5X3Bqc3VhLmdldF9wanNpcF9lbmRwdCgpCitwcmludCAiaWRlbnRpdGFzIEVuZHBvaW50IDoiICsgYG9iamVjdGAgKyAiIgorCittZWRpYWVuZCA9IHB5X3Bqc3VhLmdldF9wam1lZGlhX2VuZHB0KCkKK3ByaW50ICJpZGVudGl0YXMgTWVkaWEgRW5kcG9pbnQgOiIgKyBgbWVkaWFlbmRgICsgIiIKKworcG9vbCA9IHB5X3Bqc3VhLmdldF9wb29sX2ZhY3RvcnkoKQorcHJpbnQgImlkZW50aXRhcyBwb29sIGZhY3RvcnkgOiIgKyBgcG9vbGAgKyAiIgorCitzdGF0dXMgPSBweV9wanN1YS5oYW5kbGVfZXZlbnRzKDMwMDApCitwcmludCAicHkgc3RhdHVzIGFmdGVyIDMgc2Vjb25kIG9mIGJsb2NraW5nIHdhaXQgOiIgKyBgc3RhdHVzYAorCisKKworIyBlbmQgb2YgbmV3IHRlc3RydW4KKworIworCisjIGxpYiB0cmFuc3BvcnQKK3N0dW5jID0gcHlfcGpzdWEuc3R1bl9jb25maWdfZGVmYXVsdCgpOworCisKK3RjID0gcHlfcGpzdWEudHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCk7CisKKworcHlfcGpzdWEubm9ybWFsaXplX3N0dW5fY29uZmlnKHN0dW5jKTsKKworCitzdGF0dXMsIGlkID0gcHlfcGpzdWEudHJhbnNwb3J0X2NyZWF0ZSgxLCB0Yyk7CitwcmludCAicHkgdHJhbnNwb3J0IGNyZWF0ZSBzdGF0dXMgIiArIGBzdGF0dXNgCisKK3RpID0gcHlfcGpzdWEuVHJhbnNwb3J0X0luZm8oKTsKK3RpID0gcHlfcGpzdWEudHJhbnNwb3J0X2dldF9pbmZvKGlkKQorcHJpbnQgInB5IHRyYW5zcG9ydCBnZXQgaW5mbyBzdGF0dXMgIiArIGBzdGF0dXNgCisKK3N0YXR1cyA9IHB5X3Bqc3VhLnRyYW5zcG9ydF9zZXRfZW5hYmxlKGlkLDEpCitwcmludCAicHkgdHJhbnNwb3J0IHNldCBlbmFibGUgc3RhdHVzICIgKyBgc3RhdHVzYAoraWYgc3RhdHVzICE9IDAgOgorCXB5X3Bqc3VhLnBlcnJvcigicHlfcGpzdWEiLCJzZXQgZW5hYmxlIixzdGF0dXMpCisKKworc3RhdHVzID0gcHlfcGpzdWEudHJhbnNwb3J0X2Nsb3NlKGlkLDEpCitwcmludCAicHkgdHJhbnNwb3J0IGNsb3NlIHN0YXR1cyAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwiY2xvc2UiLHN0YXR1cykKKworIyBlbmQgb2YgbGliIHRyYW5zcG9ydAorCisjIGxpYiBhY2NvdW50IAorCithY2NmZyA9IHB5X3Bqc3VhLmFjY19jb25maWdfZGVmYXVsdCgpCitzdGF0dXMsIGFjY2lkID0gcHlfcGpzdWEuYWNjX2FkZChhY2NmZywgMSkKK3ByaW50ICJweSBhY2MgYWRkIHN0YXR1cyAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwiYWRkIGFjYyIsc3RhdHVzKQorY291bnQgPSBweV9wanN1YS5hY2NfZ2V0X2NvdW50KCkKK3ByaW50ICJhY2MgY291bnQgIiArIGBjb3VudGAKKworYWNjaWQgPSBweV9wanN1YS5hY2NfZ2V0X2RlZmF1bHQoKQorCitwcmludCAiYWNjIGlkIGRlZmF1bHQgIiArIGBhY2NpZGAKKworIyBlbmQgb2YgbGliIGFjY291bnQKKworI2xpYiBidWRkeQorCitiY2ZnID0gcHlfcGpzdWEuQnVkZHlfQ29uZmlnKCkKK3N0YXR1cywgaWQgPSBweV9wanN1YS5idWRkeV9hZGQoYmNmZykKK2FjY19pZCA9IGlkCitwcmludCAicHkgYnVkZHkgYWRkIHN0YXR1cyAiICsgYHN0YXR1c2AgKyAiIGlkICIgKyBgaWRgCitib29sID0gcHlfcGpzdWEuYnVkZHlfaXNfdmFsaWQoaWQpCitwcmludCAicHkgYnVkZHkgaXMgdmFsaWQgIiArIGBib29sYAorY291bnQgPSBweV9wanN1YS5nZXRfYnVkZHlfY291bnQoKQorcHJpbnQgImJ1ZGR5IGNvdW50ICIgKyBgY291bnRgCitiaW5mbyA9IHB5X3Bqc3VhLmJ1ZGR5X2dldF9pbmZvKGlkKQoraWRzID0gcHlfcGpzdWEuZW51bV9idWRkaWVzKCkKK3N0YXR1cyA9IHB5X3Bqc3VhLmJ1ZGR5X2RlbChpZCkKK3ByaW50ICJweSBidWRkeSBkZWwgc3RhdHVzICIgKyBgc3RhdHVzYAorc3RhdHVzID0gcHlfcGpzdWEuYnVkZHlfc3Vic2NyaWJlX3ByZXMoaWQsIDEpCitwcmludCAicHkgYnVkZHkgc3Vic2NyaWJlIHByZXMgc3RhdHVzICIgKyBgc3RhdHVzYAorcHlfcGpzdWEucHJlc19kdW1wKDEpCitzdGF0dXMgPSBweV9wanN1YS5pbV9zZW5kKGFjY2lkLCAiZmFocmlzQGRpdnVzaS5jb20iLCAiIiwgImhhbGxvIiwgbWVzc2FnZSwgMCkKK3ByaW50ICJweSBpbSBzZW5kIHN0YXR1cyAiICsgYHN0YXR1c2AKK3N0YXR1cyA9IHB5X3Bqc3VhLmltX3R5cGluZyhhY2NpZCwgImZhaHJpc0BkaXZ1c2kuY29tIiwgMSwgbWVzc2FnZSkKK3ByaW50ICJweSBpbSB0eXBpbmcgc3RhdHVzICIgKyBgc3RhdHVzYAorI3ByaW50ICJiaW5mbyAiICsgYGJpbmZvYAorCisjZW5kIG9mIGxpYiBidWRkeQorCisjbGliIG1lZGlhCitjb3VudCA9IHB5X3Bqc3VhLmNvbmZfZ2V0X21heF9wb3J0cygpCitwcmludCAicHkgbWVkaWEgY29uZiBnZXQgbWF4IHBvcnRzICIgKyBgY291bnRgCitjb3VudCA9IHB5X3Bqc3VhLmNvbmZfZ2V0X2FjdGl2ZV9wb3J0cygpCitwcmludCAicHkgbWVkaWEgY29uZiBnZXQgYWN0aXZlIHBvcnRzICIgKyBgY291bnRgCitpZHMgPSBweV9wanN1YS5lbnVtX2NvbmZfcG9ydHMoKQorZm9yIGlkIGluIGlkczoKKwlwcmludCAicHkgbWVkaWEgY29uZiBwb3J0cyAiICsgYGlkYAorCWNwX2luZm8gPSBweV9wanN1YS5jb25mX2dldF9wb3J0X2luZm8oaWQpCisJcHJpbnQgInBvcnQgaW5mbyBuYW1lICIgKyBjcF9pbmZvLm5hbWUKK3Bvb2wgPSBweV9wanN1YS5QSl9Qb29sKCkKK3BvcnQgPSBweV9wanN1YS5QSk1lZGlhX1BvcnQoKQorc3RhdHVzLCBpZCA9IHB5X3Bqc3VhLmNvbmZfYWRkX3BvcnQocG9vbCxwb3J0KQorcHJpbnQgInB5IG1lZGlhIGNvbmYgYWRkIHBvcnQgc3RhdHVzICIgKyBgc3RhdHVzYCArICIgaWQgIiArIGBpZGAKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwiYWRkIHBvcnQiLHN0YXR1cykKK3N0YXR1cyA9IHB5X3Bqc3VhLmNvbmZfcmVtb3ZlX3BvcnQoaWQpCitwcmludCAicHkgbWVkaWEgY29uZiByZW1vdmUgcG9ydCBzdGF0dXMgIiArIGBzdGF0dXNgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInJlbW92ZSBwb3J0IixzdGF0dXMpCitzdGF0dXMgPSBweV9wanN1YS5jb25mX2Nvbm5lY3QoaWQsIGlkKQorcHJpbnQgInB5IG1lZGlhIGNvbmYgY29ubmVjdCBzdGF0dXMgIiArIGBzdGF0dXNgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsImNvbm5lY3QiLHN0YXR1cykKK3N0YXR1cyA9IHB5X3Bqc3VhLmNvbmZfZGlzY29ubmVjdChpZCwgaWQpCitwcmludCAicHkgbWVkaWEgY29uZiBkaXNjb25uZWN0IHN0YXR1cyAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwiZGlzY29ubmVjdCIsc3RhdHVzKQorc3RhdHVzLCBpZCA9IHB5X3Bqc3VhLnBsYXllcl9jcmVhdGUoInRlc3Qud2F2IiwgMCkKK3ByaW50ICJweSBtZWRpYSBwbGF5ZXIgY3JlYXRlIHN0YXR1cyAiICsgYHN0YXR1c2AgKyAiIGlkICIgKyBgaWRgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInBsYXllciBjcmVhdGUiLHN0YXR1cykKK2NfaWQgPSBweV9wanN1YS5wbGF5ZXJfZ2V0X2NvbmZfcG9ydChpZCkKK3ByaW50ICJweSBtZWRpYSBwbGF5ZXIgZ2V0IGNvbmYgcG9ydCBpZCAiICsgYGNfaWRgCitzdGF0dXMgPSBweV9wanN1YS5wbGF5ZXJfc2V0X3BvcyhpZCwgMTApCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInBsYXllciBzZXQgcG9zIixzdGF0dXMpCitzdGF0dXMgPSBweV9wanN1YS5wbGF5ZXJfZGVzdHJveShpZCkKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwicGxheWVyIGRlc3Ryb3kiLHN0YXR1cykKK3N0YXR1cywgaWQgPSBweV9wanN1YS5yZWNvcmRlcl9jcmVhdGUoInJlYy53YXYiLCAwLCAiTm9uZSIsIDEwMDAsIDApCitwcmludCAicHkgbWVkaWEgcmVjb3JkZXIgY3JlYXRlIHN0YXR1cyAiICsgYHN0YXR1c2AgKyAiIGlkICIgKyBgaWRgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInJlY29yZGVyIGNyZWF0ZSIsc3RhdHVzKQorc3RhdHVzID0gcHlfcGpzdWEucmVjb3JkZXJfZ2V0X2NvbmZfcG9ydChpZCkKK3ByaW50ICJweSBtZWRpYSByZWNvcmRlciBnZXQgY29uZiBwb3J0IHN0YXR1cyAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwicmVjb3JkZXIgZ2V0IGNvbmYgcG9ydCIsc3RhdHVzKQorc3RhdHVzID0gcHlfcGpzdWEucmVjb3JkZXJfZGVzdHJveShpZCkKK3ByaW50ICJweSBtZWRpYSByZWNvcmRlciBkZXN0cm95IHN0YXR1cyAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwicmVjb3JkZXIgZGVzdHJveSIsc3RhdHVzKQorI2NkZXYsIHBkZXYgPSBweV9wanN1YS5nZXRfc25kX2RldigpCisjcHJpbnQgInB5IG1lZGlhIGdldCBzbmQgZGV2IGNhcHR1cmUgZGV2ICIgKyBgY2RldmAgKyAiIHBsYXliYWNrIGRldiAiICsgYHBkZXZgCitzdGF0dXMgPSBweV9wanN1YS5zZXRfc25kX2RldigwLDEpCitwcmludCAicHkgbWVkaWEgc2V0IHNuZCBkZXYgc3RhdHVzICIgKyBgc3RhdHVzYAoraWYgc3RhdHVzICE9IDAgOgorCXB5X3Bqc3VhLnBlcnJvcigicHlfcGpzdWEiLCJzZXQgc25kIGRldiIsc3RhdHVzKQorc3RhdHVzID0gcHlfcGpzdWEuc2V0X251bGxfc25kX2RldigpCitwcmludCAicHkgbWVkaWEgc2V0IG51bGwgc25kIGRldiBzdGF0dXMgIiArIGBzdGF0dXNgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInNldCBudWxsIHNuZCBkZXYiLHN0YXR1cykKK3BvcnQgPSBweV9wanN1YS5zZXRfbm9fc25kX2RldigpCitzdGF0dXMgPSBweV9wanN1YS5zZXRfZWMoMCwwKQorcHJpbnQgInB5IG1lZGlhIHNldCBlYyBzdGF0dXMgIiArIGBzdGF0dXNgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsInNldCBlYyIsc3RhdHVzKQordGFpbCA9IHB5X3Bqc3VhLmdldF9lY190YWlsKCkKK3ByaW50ICJweSBtZWRpYSBnZXQgZWMgdGFpbCAiICsgYHRhaWxgCitpbmZvcyA9IHB5X3Bqc3VhLmVudW1fY29kZWNzKCkKK2ZvciBpbmZvIGluIGluZm9zOgorCXByaW50ICJweSBtZWRpYSBlbnVtIGNvZGVjcyAiICsgYGluZm9gCitzdGF0dXMgPSBweV9wanN1YS5jb2RlY19zZXRfcHJpb3JpdHkoImNvYmEiLCAwKQorcHJpbnQgInB5IG1lZGlhIGNvZGVjIHNldCBwcmlvcml0eSAiICsgYHN0YXR1c2AKK2lmIHN0YXR1cyAhPSAwIDoKKwlweV9wanN1YS5wZXJyb3IoInB5X3Bqc3VhIiwiY29kZWMgc2V0IHByaW9yaXR5IixzdGF0dXMpCitjX3BhcmFtID0gcHlfcGpzdWEuY29kZWNfZ2V0X3BhcmFtKCJjb2JhIikKK3N0YXR1cyA9IHB5X3Bqc3VhLmNvZGVjX3NldF9wYXJhbSgiY29iYSIsIGNfcGFyYW0pCitwcmludCAicHkgbWVkaWEgY29kZWMgc2V0IHBhcmFtICIgKyBgc3RhdHVzYAoraWYgc3RhdHVzICE9IDAgOgorCXB5X3Bqc3VhLnBlcnJvcigicHlfcGpzdWEiLCJjb2RlYyBzZXQgcGFyYW0iLHN0YXR1cykKKwkKKyNlbmQgb2YgbGliIG1lZGlhCisKKyNsaWIgY2FsbAorCitjb3VudCA9IHB5X3Bqc3VhLmNhbGxfZ2V0X21heF9jb3VudCgpCitwcmludCAicHkgY2FsbCBnZXQgbWF4IGNvdW50ICIgKyBgY291bnRgCitjb3VudCA9IHB5X3Bqc3VhLmNhbGxfZ2V0X2NvdW50KCkKK3ByaW50ICJweSBjYWxsIGdldCBjb3VudCAiICsgYGNvdW50YAoraWRzID0gcHlfcGpzdWEuZW51bV9jYWxscygpCitmb3IgaWQgaW4gaWRzOgorCXByaW50ICJweSBlbnVtIGNhbGxzIGlkICIgKyBgaWRgCittc2dfZGF0YSA9IHB5X3Bqc3VhLk1zZ19EYXRhKCkKK3N0YXR1cywgaWQgPSBweV9wanN1YS5jYWxsX21ha2VfY2FsbCgtMSwgInNpcDpidWx1a3VjaW5nMUBpcHRlbC5vcmciLCAwLCAwLCBtc2dfZGF0YSkKK3ByaW50ICJweSBjYWxsIG1ha2UgY2FsbCAiICsgYHN0YXR1c2AgKyAiIGlkICIgKyBgaWRgCitpZiBzdGF0dXMgIT0gMCA6CisJcHlfcGpzdWEucGVycm9yKCJweV9wanN1YSIsImNhbGwgbWFrZSBjYWxsIixzdGF0dXMpCitib29sID0gcHlfcGpzdWEuY2FsbF9pc19hY3RpdmUoaWQpCitwcmludCAicHkgY2FsbCBpcyBhY3RpdmUgIiArIGBib29sYAorYm9vbCA9IHB5X3Bqc3VhLmNhbGxfaGFzX21lZGlhKGlkKQorcHJpbnQgInB5IGNhbGwgaGFzIG1lZGlhICIgKyBgYm9vbGAKK2NwX2lkID0gcHlfcGpzdWEuY2FsbF9nZXRfY29uZl9wb3J0KGlkKQorcHJpbnQgInB5IGNhbGwgZ2V0IGNvbmYgcG9ydCAiICsgYGNwX2lkYAoraW5mbyA9IHB5X3Bqc3VhLmNhbGxfZ2V0X2luZm8oaWQpCitpZiBpbmZvICE9IE5vbmUgOgorCXByaW50ICJweSBpbmZvIGlkICIgKyBgaW5mby5pZGAKK3N0YXR1cyA9IHB5X3Bqc3VhLmNhbGxfc2V0X3VzZXJfZGF0YShpZCwgMCkKK3ByaW50ICJweSBjYWxsIHNldCB1c2VyIGRhdGEgc3RhdHVzICIgKyBgc3RhdHVzYAoraWYgc3RhdHVzICE9IDAgOgorCXB5X3Bqc3VhLnBlcnJvcigicHlfcGpzdWEiLCJzZXQgdXNlciBkYXRhIixzdGF0dXMpCit1c2VyX2RhdGEgPSBweV9wanN1YS5jYWxsX2dldF91c2VyX2RhdGEoaWQpCitwcmludCAicHkgY2FsbCBnZXQgdXNlciBkYXRhICIgKyBgdXNlcl9kYXRhYAorCisKKworI2VuZCBvZiBsaWIgY2FsbAorCitweV9wanN1YS5wZXJyb3IoInNheWEiLCJoYWxsbyIsNzAwMDYpCisKK3N0YXR1cyA9IHB5X3Bqc3VhLmRlc3Ryb3koKQorcHJpbnQgInB5IHN0YXR1cyAiICsgYHN0YXR1c2AKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9wanN1YV9hcHAucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9wanN1YV9hcHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmZDU2YwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3Bqc3VhX2FwcC5weQpAQCAtMCwwICsxLDc4MCBAQAorIyAkSWQ6IHBqc3VhX2FwcC5weSAxNDM4IDIwMDctMDktMTcgMTU6NDQ6NDdaIGJlbm55bHAgJAorIworIyBTYW1wbGUgYW5kIHNpbXBsZSBQeXRob24gc2NyaXB0IHRvIG1ha2UgYW5kIHJlY2VpdmUgY2FsbHMsIGFuZCBkbworIyBwcmVzZW5jZSBhbmQgaW5zdGFudCBtZXNzYWdpbmcvSU0gdXNpbmcgUEpTVUEtQVBJIGJpbmRpbmcgZm9yIFB5dGhvbi4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisjCitpbXBvcnQgcHlfcGpzdWEKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aHJlYWQKKworIworIyBDb25maWd1cmF0aW9ucworIworVEhJU19GSUxFID0gInBqc3VhX2FwcC5weSIKK0NfUVVJVCA9IDAKK0NfTE9HX0xFVkVMID0gNAorCisjIFNUVU4gY29uZmlnLgorIyBTZXQgQ19TVFVOX0hPU1QgdG8gdGhlIGFkZHJlc3M6cG9ydCBvZiB0aGUgU1RVTiBzZXJ2ZXIgdG8gZW5hYmxlIFNUVU4KKyMKK0NfU1RVTl9IT1NUID0gIiIKKyNDX1NUVU5fSE9TVCA9ICIxOTIuMTY4LjAuMiIKKyNDX1NUVU5fSE9TVCA9ICJzdHVuLmlwdGVsLm9yZzozNDc4IgorCisjIFNJUCBwb3J0CitDX1NJUF9QT1JUID0gNTA2MAorCisKKyMgR2xvYmFscworIworZ191YV9jZmcgPSBOb25lCitnX2FjY19pZCA9IHB5X3Bqc3VhLlBKU1VBX0lOVkFMSURfSUQKK2dfY3VycmVudF9jYWxsID0gcHlfcGpzdWEuUEpTVUFfSU5WQUxJRF9JRAorZ193YXZfZmlsZXMgPSBbXQorZ193YXZfaWQgPSAwCitnX3dhdl9wb3J0ID0gMAorZ19yZWNfZmlsZSA9ICIiCitnX3JlY19pZCA9IDAKK2dfcmVjX3BvcnQgPSAwCisKKyMgVXRpbGl0eTogZGlzcGxheSBQSiBlcnJvciBhbmQgZXhpdAorIworZGVmIGVycl9leGl0KHRpdGxlLCByYyk6CisgICAgcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgdGl0bGUsIHJjKQorICAgIHB5X3Bqc3VhLmRlc3Ryb3koKQorICAgIGV4aXQoMSkKKworCisjIExvZ2dpbmcgZnVuY3Rpb24gKGFsc28gY2FsbGJhY2ssIGNhbGxlZCBieSBwanN1YS1saWIpCisjCitkZWYgbG9nX2NiKGxldmVsLCBzdHIsIGxlbik6CisgICAgaWYgbGV2ZWwgPD0gQ19MT0dfTEVWRUw6CisgICAgICAgIHByaW50IHN0ciwKKworZGVmIHdyaXRlX2xvZyhsZXZlbCwgc3RyKToKKyAgICBsb2dfY2IobGV2ZWwsIHN0ciArICJcbiIsIDApCisKKworIyBVdGlsaXR5IHRvIGdldCBjYWxsIGluZm8KKyMKK2RlZiBjYWxsX25hbWUoY2FsbF9pZCk6CisJY2kgPSBweV9wanN1YS5jYWxsX2dldF9pbmZvKGNhbGxfaWQpCisJcmV0dXJuICJbQ2FsbCAiICsgYGNhbGxfaWRgICsgIiAiICsgY2kucmVtb3RlX2luZm8gKyAiXSIKKworIyBDYWxsYmFjayB3aGVuIGNhbGwgc3RhdGUgaGFzIGNoYW5nZWQuCisjCitkZWYgb25fY2FsbF9zdGF0ZShjYWxsX2lkLCBlKToJCisJZ2xvYmFsIGdfY3VycmVudF9jYWxsCisJY2kgPSBweV9wanN1YS5jYWxsX2dldF9pbmZvKGNhbGxfaWQpCisJd3JpdGVfbG9nKDMsIGNhbGxfbmFtZShjYWxsX2lkKSArICIgc3RhdGUgPSAiICsgYGNpLnN0YXRlX3RleHRgKQorCWlmIGNpLnN0YXRlID09IHB5X3Bqc3VhLlBKU0lQX0lOVl9TVEFURV9ESVNDT05ORUNURUQ6CisJCWdfY3VycmVudF9jYWxsID0gcHlfcGpzdWEuUEpTVUFfSU5WQUxJRF9JRAorCisjIENhbGxiYWNrIGZvciBpbmNvbWluZyBjYWxsCisjCitkZWYgb25faW5jb21pbmdfY2FsbChhY2NfaWQsIGNhbGxfaWQsIHJkYXRhKToKKwlnbG9iYWwgZ19jdXJyZW50X2NhbGwKKwkKKwlpZiBnX2N1cnJlbnRfY2FsbCAhPSBweV9wanN1YS5QSlNVQV9JTlZBTElEX0lEOgorCQkjIFRoZXJlJ3MgY2FsbCBpbiBwcm9ncmVzcyAtIGFuc3dlciBCdXN5CisJCXB5X3Bqc3VhLmNhbGxfYW5zd2VyKGNhbGxfaWQsIDQ4NiwgTm9uZSwgTm9uZSkKKwkJcmV0dXJuCisJCisJZ19jdXJyZW50X2NhbGwgPSBjYWxsX2lkCisJY2kgPSBweV9wanN1YS5jYWxsX2dldF9pbmZvKGNhbGxfaWQpCisJd3JpdGVfbG9nKDMsICIqKiogSW5jb21pbmcgY2FsbDogIiArIGNhbGxfbmFtZShjYWxsX2lkKSArICIqKioiKQorCXdyaXRlX2xvZygzLCAiKioqIFByZXNzIGEgdG8gYW5zd2VyIG9yIGggdG8gaGFuZ3VwICAqKioiKQorCQorCQorCQorIyBDYWxsYmFjayB3aGVuIG1lZGlhIHN0YXRlIGhhcyBjaGFuZ2VkIChlLmcuIGVzdGFibGlzaGVkIG9yIHRlcm1pbmF0ZWQpCisjCitkZWYgb25fY2FsbF9tZWRpYV9zdGF0ZShjYWxsX2lkKToKKwljaSA9IHB5X3Bqc3VhLmNhbGxfZ2V0X2luZm8oY2FsbF9pZCkKKwlpZiBjaS5tZWRpYV9zdGF0dXMgPT0gcHlfcGpzdWEuUEpTVUFfQ0FMTF9NRURJQV9BQ1RJVkU6CisJCXB5X3Bqc3VhLmNvbmZfY29ubmVjdChjaS5jb25mX3Nsb3QsIDApCisJCXB5X3Bqc3VhLmNvbmZfY29ubmVjdCgwLCBjaS5jb25mX3Nsb3QpCisJCXdyaXRlX2xvZygzLCBjYWxsX25hbWUoY2FsbF9pZCkgKyAiOiBtZWRpYSBpcyBhY3RpdmUiKQorCWVsc2U6CisJCXdyaXRlX2xvZygzLCBjYWxsX25hbWUoY2FsbF9pZCkgKyAiOiBtZWRpYSBpcyBpbmFjdGl2ZSIpCisKKworIyBDYWxsYmFjayB3aGVuIGFjY291bnQgcmVnaXN0cmF0aW9uIHN0YXRlIGhhcyBjaGFuZ2VkCisjCitkZWYgb25fcmVnX3N0YXRlKGFjY19pZCk6CisJYWNjX2luZm8gPSBweV9wanN1YS5hY2NfZ2V0X2luZm8oYWNjX2lkKQorCWlmIGFjY19pbmZvLmhhc19yZWdpc3RyYXRpb24gIT0gMDoKKwkJY21kID0gInJlZ2lzdHJhdGlvbiIKKwllbHNlOgorCQljbWQgPSAidW5yZWdpc3RyYXRpb24iCisJaWYgYWNjX2luZm8uc3RhdHVzICE9IDAgYW5kIGFjY19pbmZvLnN0YXR1cyAhPSAyMDA6CisJCXdyaXRlX2xvZygzLCAiQWNjb3VudCAiICsgY21kICsgIiBmYWlsZWQ6IHJjPSIgKyBgYWNjX2luZm8uc3RhdHVzYCArICIgIiArIGFjY19pbmZvLnN0YXR1c190ZXh0KQorCWVsc2U6CisJCXdyaXRlX2xvZygzLCAiQWNjb3VudCAiICsgY21kICsgIiBzdWNjZXNzIikKKworCisjIENhbGxiYWNrIHdoZW4gYnVkZHkncyBwcmVzZW5jZSBzdGF0ZSBoYXMgY2hhbmdlZAorIworZGVmIG9uX2J1ZGR5X3N0YXRlKGJ1ZGR5X2lkKToKKwl3cml0ZV9sb2coMywgIk9uIEJ1ZGR5IHN0YXRlIGNhbGxlZCIpCisJYnVkZHlfaW5mbyA9IHB5X3Bqc3VhLmJ1ZGR5X2dldF9pbmZvKGJ1ZGR5X2lkKQorCWlmIGJ1ZGR5X2luZm8uc3RhdHVzICE9IDAgYW5kIGJ1ZGR5X2luZm8uc3RhdHVzICE9IDIwMDoKKwkJd3JpdGVfbG9nKDMsICJTdGF0dXMgb2YgIiArIGBidWRkeV9pbmZvLnVyaWAgKyAiIGlzICIgKyBgYnVkZHlfaW5mby5zdGF0dXNfdGV4dGApCisJZWxzZToKKwkJd3JpdGVfbG9nKDMsICJTdGF0dXMgOiAiICsgYGJ1ZGR5X2luZm8uc3RhdHVzYCkKKworIyBDYWxsYmFjayBvbiBpbmNvbWluZyBwYWdlciAoTUVTU0FHRSkKKyMJCQorZGVmIG9uX3BhZ2VyKGNhbGxfaWQsIHN0cmZyb20sIHN0cnRvLCBjb250YWN0LCBtaW1lX3R5cGUsIHRleHQpOgorCXdyaXRlX2xvZygzLCAiTUVTU0FHRSBmcm9tICIgKyBgc3RyZnJvbWAgKyAiIDogIiArIGB0ZXh0YCkKKworCisjIENhbGxiYWNrIG9uIHRoZSBkZWxpdmVyeSBzdGF0dXMgb2Ygb3V0Z29pbmcgcGFnZXIgKE1FU1NBR0UpCisjCQorZGVmIG9uX3BhZ2VyX3N0YXR1cyhjYWxsX2lkLCBzdHJ0bywgYm9keSwgdXNlcl9kYXRhLCBzdGF0dXMsIHJlYXNvbik6CisJd3JpdGVfbG9nKDMsICJNRVNTQUdFIHRvICIgKyBgc3RydG9gICsgIiBzdGF0dXMgIiArIGBzdGF0dXNgICsgIiByZWFzb24gIiArIGByZWFzb25gKQorCisKKyMgUmVjZWl2ZWQgdHlwaW5nIGluZGljYXRpb24KKyMKK2RlZiBvbl90eXBpbmcoY2FsbF9pZCwgc3RyZnJvbSwgdG8sIGNvbnRhY3QsIGlzX3R5cGluZyk6CisJc3RyX3QgPSAiIgorCWlmIGlzX3R5cGluZzoKKwkJc3RyX3QgPSAiaXMgdHlwaW5nLi4iCisJZWxzZToKKwkJc3RyX3QgPSAiaGFzIHN0b3BwZWQgdHlwaW5nIgorCXdyaXRlX2xvZygzLCAiSU0gaW5kaWNhdGlvbjogIiArIHN0cmZyb20gKyAiICIgKyBzdHJfdCkKKworIyBSZWNlaXZlZCB0aGUgc3RhdHVzIG9mIHByZXZpb3VzIGNhbGwgdHJhbnNmZXIgcmVxdWVzdAorIworZGVmIG9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKGNhbGxfaWQsc3RhdHVzX2NvZGUsc3RhdHVzX3RleHQsZmluYWwscF9jb250KToKKwlzdHJmaW5hbCA9ICIiCisJaWYgZmluYWwgPT0gMToKKwkJc3RyZmluYWwgPSAiW2ZpbmFsXSIKKwkKKwl3cml0ZV9sb2coMywgIkNhbGwgIiArIGBjYWxsX2lkYCArICI6IHRyYW5zZmVyIHN0YXR1cz0gIiArIGBzdGF0dXNfY29kZWAgKyAiICIgKyBzdGF0dXNfdGV4dCsgIiAiICsgc3RyZmluYWwpCisJICAgICAgCisJaWYgc3RhdHVzX2NvZGUvMTAwID09IDI6CisJCXdyaXRlX2xvZygzLCAiQ2FsbCAiICsgYGNhbGxfaWRgICsgIiA6IGNhbGwgdHJhbnNmZXJlZCBzdWNjZXNzZnVsbHksIGRpc2Nvbm5lY3RpbmcgY2FsbCIpCisJCXN0YXR1cyA9IHB5X3Bqc3VhLmNhbGxfaGFuZ3VwKGNhbGxfaWQsIDQxMCwgTm9uZSwgTm9uZSkKKwkJcF9jb250ID0gMAorCisjIENhbGxiYWNrIG9uIGluY29taW5nIGNhbGwgdHJhbnNmZXIgcmVxdWVzdAorIwkJCitkZWYgb25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0KGNhbGxfaWQsIGRzdCwgY29kZSk6CisJd3JpdGVfbG9nKDMsICJDYWxsIHRyYW5zZmVyIHJlcXVlc3QgZnJvbSAiICsgYGNhbGxfaWRgICsgIiB0byAiICsgZHN0ICsgIiB3aXRoIGNvZGUgIiArIGBjb2RlYCkKKworIworIyBJbml0aWFsaXplIHBqc3VhLgorIworZGVmIGFwcF9pbml0KCk6CisJZ2xvYmFsIGdfYWNjX2lkLCBnX3VhX2NmZworCisJIyBDcmVhdGUgcGpzdWEgYmVmb3JlIGFueXRoaW5nIGVsc2UKKwlzdGF0dXMgPSBweV9wanN1YS5jcmVhdGUoKQorCWlmIHN0YXR1cyAhPSAwOgorCQllcnJfZXhpdCgicGpzdWEgY3JlYXRlKCkgZXJyb3IiLCBzdGF0dXMpCisKKwkjIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBsb2dnaW5nIGNvbmZpZworCWxvZ19jZmcgPSBweV9wanN1YS5sb2dnaW5nX2NvbmZpZ19kZWZhdWx0KCkKKwlsb2dfY2ZnLmxldmVsID0gQ19MT0dfTEVWRUwKKwlsb2dfY2ZnLmNiID0gbG9nX2NiCisKKwkjIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBwanN1YSBjb25maWcKKwkjIE5vdGU6IGZvciB0aGlzIFB5dGhvbiBtb2R1bGUsIHRocmVhZF9jbnQgbXVzdCBiZSAwIHNpbmNlIFB5dGhvbgorCSMgICAgICAgZG9lc24ndCBsaWtlIHRvIGJlIGNhbGxlZCBmcm9tIGFsaWVuIHRocmVhZCAocGpzdWEncyB0aHJlYWQKKwkjICAgICAgIGluIHRoaXMgY2FzZSkJICAgIAorCXVhX2NmZyA9IHB5X3Bqc3VhLmNvbmZpZ19kZWZhdWx0KCkKKwl1YV9jZmcudGhyZWFkX2NudCA9IDAKKwl1YV9jZmcudXNlcl9hZ2VudCA9ICJQSlNVQS9QeXRob24gMC4xIgorCXVhX2NmZy5jYi5vbl9pbmNvbWluZ19jYWxsID0gb25faW5jb21pbmdfY2FsbAorCXVhX2NmZy5jYi5vbl9jYWxsX21lZGlhX3N0YXRlID0gb25fY2FsbF9tZWRpYV9zdGF0ZQorCXVhX2NmZy5jYi5vbl9yZWdfc3RhdGUgPSBvbl9yZWdfc3RhdGUKKwl1YV9jZmcuY2Iub25fY2FsbF9zdGF0ZSA9IG9uX2NhbGxfc3RhdGUKKwl1YV9jZmcuY2Iub25fYnVkZHlfc3RhdGUgPSBvbl9idWRkeV9zdGF0ZQorCXVhX2NmZy5jYi5vbl9wYWdlciA9IG9uX3BhZ2VyCisJdWFfY2ZnLmNiLm9uX3BhZ2VyX3N0YXR1cyA9IG9uX3BhZ2VyX3N0YXR1cworCXVhX2NmZy5jYi5vbl90eXBpbmcgPSBvbl90eXBpbmcKKwl1YV9jZmcuY2Iub25fY2FsbF90cmFuc2Zlcl9zdGF0dXMgPSBvbl9jYWxsX3RyYW5zZmVyX3N0YXR1cworCXVhX2NmZy5jYi5vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QgPSBvbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QKKworCSMgQ29uZmlndXJlIFNUVU4gc2V0dGluZworCWlmIENfU1RVTl9IT1NUICE9ICIiOgorCSAgICB1YV9jZmcuc3R1bl9ob3N0ID0gQ19TVFVOX0hPU1Q7CisKKwkjIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBtZWRpYSBjb25maWcKKwltZWRfY2ZnID0gcHlfcGpzdWEubWVkaWFfY29uZmlnX2RlZmF1bHQoKQorCW1lZF9jZmcuZWNfdGFpbF9sZW4gPSAwCisKKwkjCisJIyBJbml0aWFsaXplIHBqc3VhISEKKwkjCisJc3RhdHVzID0gcHlfcGpzdWEuaW5pdCh1YV9jZmcsIGxvZ19jZmcsIG1lZF9jZmcpCisJaWYgc3RhdHVzICE9IDA6CisJCWVycl9leGl0KCJwanN1YSBpbml0KCkgZXJyb3IiLCBzdGF0dXMpCisKKwkjIENvbmZpZ3VyZSBVRFAgdHJhbnNwb3J0IGNvbmZpZworCXRyYW5zcG9ydF9jZmcgPSBweV9wanN1YS50cmFuc3BvcnRfY29uZmlnX2RlZmF1bHQoKQorCXRyYW5zcG9ydF9jZmcucG9ydCA9IENfU0lQX1BPUlQKKworCSMgQ3JlYXRlIFVEUCB0cmFuc3BvcnQKKwlzdGF0dXMsIHRyYW5zcG9ydF9pZCA9IFwKKwkgICAgcHlfcGpzdWEudHJhbnNwb3J0X2NyZWF0ZShweV9wanN1YS5QSlNJUF9UUkFOU1BPUlRfVURQLCB0cmFuc3BvcnRfY2ZnKQorCWlmIHN0YXR1cyAhPSAwOgorCQllcnJfZXhpdCgiRXJyb3IgY3JlYXRpbmcgVURQIHRyYW5zcG9ydCIsIHN0YXR1cykKKwkJCisKKwkjIENyZWF0ZSBpbml0aWFsIGRlZmF1bHQgYWNjb3VudAorCXN0YXR1cywgYWNjX2lkID0gcHlfcGpzdWEuYWNjX2FkZF9sb2NhbCh0cmFuc3BvcnRfaWQsIDEpCisJaWYgc3RhdHVzICE9IDA6CisJCWVycl9leGl0KCJFcnJvciBjcmVhdGluZyBhY2NvdW50Iiwgc3RhdHVzKQorCisJZ19hY2NfaWQgPSBhY2NfaWQKKwlnX3VhX2NmZyA9IHVhX2NmZworCisjIEFkZCBTSVAgYWNjb3VudCBpbnRlcnJhY3RpdmVseQorIworZGVmIGFkZF9hY2NvdW50KCk6CisJZ2xvYmFsIGdfYWNjX2lkCisKKwlhY2NfZG9tYWluID0gIiIKKwlhY2NfdXNlcm5hbWUgPSAiIgorCWFjY19wYXNzd2QgPSIiCisJY29uZmlybSA9ICIiCisJCisJIyBJbnB1dCBhY2NvdW50IGNvbmZpZ3MKKwlwcmludCAiWW91ciBTSVAgZG9tYWluIChlLmcuIG15cHJvdmlkZXIuY29tKTogIiwKKwlhY2NfZG9tYWluID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwlpZiBhY2NfZG9tYWluID09ICJcbiI6IAorCQlyZXR1cm4KKwlhY2NfZG9tYWluID0gYWNjX2RvbWFpbi5yZXBsYWNlKCJcbiIsICIiKQorCisJcHJpbnQgIllvdXIgdXNlcm5hbWUgKGUuZy4gYWxpY2UpOiAiLAorCWFjY191c2VybmFtZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJaWYgYWNjX3VzZXJuYW1lID09ICJcbiI6CisJCXJldHVybgorCWFjY191c2VybmFtZSA9IGFjY191c2VybmFtZS5yZXBsYWNlKCJcbiIsICIiKQorCisJcHJpbnQgIllvdXIgcGFzc3dvcmQgKGUuZy4gc2VjcmV0KTogIiwKKwlhY2NfcGFzc3dkID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwlpZiBhY2NfcGFzc3dkID09ICJcbiI6CisJCXJldHVybgorCWFjY19wYXNzd2QgPSBhY2NfcGFzc3dkLnJlcGxhY2UoIlxuIiwgIiIpCisKKwkjIENvbmZpZ3VyZSBhY2NvdW50IGNvbmZpZ3VyYXRpb24KKwlhY2NfY2ZnID0gcHlfcGpzdWEuYWNjX2NvbmZpZ19kZWZhdWx0KCkKKwlhY2NfY2ZnLmlkID0gInNpcDoiICsgYWNjX3VzZXJuYW1lICsgIkAiICsgYWNjX2RvbWFpbgorCWFjY19jZmcucmVnX3VyaSA9ICJzaXA6IiArIGFjY19kb21haW4KKworCWNyZWRfaW5mbyA9IHB5X3Bqc3VhLlBqc2lwX0NyZWRfSW5mbygpCisJY3JlZF9pbmZvLnJlYWxtID0gIioiCisJY3JlZF9pbmZvLnNjaGVtZSA9ICJkaWdlc3QiCisJY3JlZF9pbmZvLnVzZXJuYW1lID0gYWNjX3VzZXJuYW1lCisJY3JlZF9pbmZvLmRhdGFfdHlwZSA9IDAKKwljcmVkX2luZm8uZGF0YSA9IGFjY19wYXNzd2QKKworCWFjY19jZmcuY3JlZF9pbmZvLmFwcGVuZCgxKQorCWFjY19jZmcuY3JlZF9pbmZvWzBdID0gY3JlZF9pbmZvCisKKwkjIEFkZCBuZXcgU0lQIGFjY291bnQKKwlzdGF0dXMsIGFjY19pZCA9IHB5X3Bqc3VhLmFjY19hZGQoYWNjX2NmZywgMSkKKwlpZiBzdGF0dXMgIT0gMDoKKwkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkZGluZyBTSVAgYWNjb3VudCIsIHN0YXR1cykKKwllbHNlOgorCQlnX2FjY19pZCA9IGFjY19pZAorCQl3cml0ZV9sb2coMywgIkFjY291bnQgIiArIGFjY19jZmcuaWQgKyAiIGFkZGVkIikKKworZGVmIGFkZF9wbGF5ZXIoKToKKwlnbG9iYWwgZ193YXZfZmlsZXMKKwlnbG9iYWwgZ193YXZfaWQKKwlnbG9iYWwgZ193YXZfcG9ydAorCQorCWZpbGVfbmFtZSA9ICIiCisJc3RhdHVzID0gLTEKKwl3YXZfaWQgPSAwCisJCisJcHJpbnQgIkVudGVyIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHBsYXllcihlLmcuIC90bXAvYXVkaW8ud2F2KTogIiwKKwlmaWxlX25hbWUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCWlmIGZpbGVfbmFtZSA9PSAiXG4iOiAKKwkJcmV0dXJuCisJZmlsZV9uYW1lID0gZmlsZV9uYW1lLnJlcGxhY2UoIlxuIiwgIiIpCisJc3RhdHVzLCB3YXZfaWQgPSBweV9wanN1YS5wbGF5ZXJfY3JlYXRlKGZpbGVfbmFtZSwgMCkKKwlpZiBzdGF0dXMgIT0gMDoKKwkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkZGluZyBmaWxlIHBsYXllciAiLCBzdGF0dXMpCisJZWxzZToKKwkJZ193YXZfZmlsZXMuYXBwZW5kKGZpbGVfbmFtZSkKKwkJaWYgZ193YXZfaWQgPT0gMDoKKwkJCWdfd2F2X2lkID0gd2F2X2lkCisJCQlnX3dhdl9wb3J0ID0gcHlfcGpzdWEucGxheWVyX2dldF9jb25mX3BvcnQod2F2X2lkKQorCQl3cml0ZV9sb2coMywgIkZpbGUgcGxheWVyICIgKyBmaWxlX25hbWUgKyAiIGFkZGVkIikKKwkJCitkZWYgYWRkX3JlY29yZGVyKCk6CisJZ2xvYmFsIGdfcmVjX2ZpbGUKKwlnbG9iYWwgZ19yZWNfaWQKKwlnbG9iYWwgZ19yZWNfcG9ydAorCQorCWZpbGVfbmFtZSA9ICIiCisJc3RhdHVzID0gLTEKKwlyZWNfaWQgPSAwCisJCisJcHJpbnQgIkVudGVyIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHJlY29yZGVyKGUuZy4gL3RtcC9hdWRpby53YXYpOiAiLAorCWZpbGVfbmFtZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJaWYgZmlsZV9uYW1lID09ICJcbiI6IAorCQlyZXR1cm4KKwlmaWxlX25hbWUgPSBmaWxlX25hbWUucmVwbGFjZSgiXG4iLCAiIikKKwlzdGF0dXMsIHJlY19pZCA9IHB5X3Bqc3VhLnJlY29yZGVyX2NyZWF0ZShmaWxlX25hbWUsIDAsIE5vbmUsIDAsIDApCisJaWYgc3RhdHVzICE9IDA6CisJCXB5X3Bqc3VhLnBlcnJvcihUSElTX0ZJTEUsICJFcnJvciBhZGRpbmcgZmlsZSByZWNvcmRlciAiLCBzdGF0dXMpCisJZWxzZToKKwkJZ19yZWNfZmlsZSA9IGZpbGVfbmFtZQorCQlnX3JlY19pZCA9IHJlY19pZAorCQlnX3JlY19wb3J0ID0gcHlfcGpzdWEucmVjb3JkZXJfZ2V0X2NvbmZfcG9ydChyZWNfaWQpCisJCXdyaXRlX2xvZygzLCAiRmlsZSByZWNvcmRlciAiICsgZmlsZV9uYW1lICsgIiBhZGRlZCIpCisKK2RlZiBjb25mX2xpc3QoKToKKwlwb3J0cyA9IE5vbmUKKwlwcmludCAiQ29uZmVyZW5jZSBwb3J0cyA6ICIKKwlwb3J0cyA9IHB5X3Bqc3VhLmVudW1fY29uZl9wb3J0cygpCisKKwlmb3IgcG9ydCBpbiBwb3J0czoKKwkJaW5mbyA9IE5vbmUKKwkJaW5mbyA9IHB5X3Bqc3VhLmNvbmZfZ2V0X3BvcnRfaW5mbyhwb3J0KQorCQl0eGxpc3QgPSAiIgorCQlmb3IgbGlzdGVuZXIgaW4gaW5mby5saXN0ZW5lcnM6CisJCQl0eGxpc3QgPSB0eGxpc3QgKyAiIyIgKyBgbGlzdGVuZXJgICsgIiAiCisJCQorCQlwcmludCAiUG9ydCAjIiArIGBpbmZvLnNsb3RfaWRgICsgIlsiICsgYChpbmZvLmNsb2NrX3JhdGUvMTAwMClgICsgIktIei8iICsgYChpbmZvLnNhbXBsZXNfcGVyX2ZyYW1lICogMTAwMCAvIGluZm8uY2xvY2tfcmF0ZSlgICsgIm1zXSAiICsgaW5mby5uYW1lICsgIiB0cmFuc21pdHRpbmcgdG86ICIgKyB0eGxpc3QKKwkJCitkZWYgY29ubmVjdF9wb3J0KCk6CisJc3JjX3BvcnQgPSAwCisJZHN0X3BvcnQgPSAwCisJCisJcHJpbnQgIkNvbm5lY3Qgc3JjIHBvcnQgIyAoZW1wdHkgdG8gY2FuY2VsKTogIgorCXNyY19wb3J0ID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwlpZiBzcmNfcG9ydCA9PSAiXG4iOiAKKwkJcmV0dXJuCisJc3JjX3BvcnQgPSBzcmNfcG9ydC5yZXBsYWNlKCJcbiIsICIiKQorCXNyY19wb3J0ID0gaW50KHNyY19wb3J0KQorCXByaW50ICJUbyBkc3QgcG9ydCAjIChlbXB0eSB0byBjYW5jZWwpOiAiCisJZHN0X3BvcnQgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCWlmIGRzdF9wb3J0ID09ICJcbiI6IAorCQlyZXR1cm4KKwlkc3RfcG9ydCA9IGRzdF9wb3J0LnJlcGxhY2UoIlxuIiwgIiIpCisJZHN0X3BvcnQgPSBpbnQoZHN0X3BvcnQpCisJc3RhdHVzID0gcHlfcGpzdWEuY29uZl9jb25uZWN0KHNyY19wb3J0LCBkc3RfcG9ydCkKKwlpZiBzdGF0dXMgIT0gMDoKKwkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIGNvbm5lY3RpbmcgcG9ydCAiLCBzdGF0dXMpCisJZWxzZToJCQorCQl3cml0ZV9sb2coMywgIlBvcnQgY29ubmVjdGVkIGZyb20gIiArIGBzcmNfcG9ydGAgKyAiIHRvICIgKyBgZHN0X3BvcnRgKQorCQkKK2RlZiBkaXNjb25uZWN0X3BvcnQoKToKKwlzcmNfcG9ydCA9IDAKKwlkc3RfcG9ydCA9IDAKKwkKKwlwcmludCAiRGlzY29ubmVjdCBzcmMgcG9ydCAjIChlbXB0eSB0byBjYW5jZWwpOiAiCisJc3JjX3BvcnQgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCWlmIHNyY19wb3J0ID09ICJcbiI6IAorCQlyZXR1cm4KKwlzcmNfcG9ydCA9IHNyY19wb3J0LnJlcGxhY2UoIlxuIiwgIiIpCisJc3JjX3BvcnQgPSBpbnQoc3JjX3BvcnQpCisJcHJpbnQgIkZyb20gZHN0IHBvcnQgIyAoZW1wdHkgdG8gY2FuY2VsKTogIgorCWRzdF9wb3J0ID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwlpZiBkc3RfcG9ydCA9PSAiXG4iOiAKKwkJcmV0dXJuCisJZHN0X3BvcnQgPSBkc3RfcG9ydC5yZXBsYWNlKCJcbiIsICIiKQorCWRzdF9wb3J0ID0gaW50KGRzdF9wb3J0KQorCXN0YXR1cyA9IHB5X3Bqc3VhLmNvbmZfZGlzY29ubmVjdChzcmNfcG9ydCwgZHN0X3BvcnQpCisJaWYgc3RhdHVzICE9IDA6CisJCXB5X3Bqc3VhLnBlcnJvcihUSElTX0ZJTEUsICJFcnJvciBkaXNjb25uZWN0aW5nIHBvcnQgIiwgc3RhdHVzKQorCWVsc2U6CQkKKwkJd3JpdGVfbG9nKDMsICJQb3J0IGRpc2Nvbm5lY3RlZCAiICsgYHNyY19wb3J0YCArICIgZnJvbSAiICsgYGRzdF9wb3J0YCkKKworZGVmIGR1bXBfY2FsbF9xdWFsaXR5KCk6CisJZ2xvYmFsIGdfY3VycmVudF9jYWxsCisJCisJYnVmID0gIiIKKwlpZiBnX2N1cnJlbnRfY2FsbCAhPSAtMToKKwkJYnVmID0gcHlfcGpzdWEuY2FsbF9kdW1wKGdfY3VycmVudF9jYWxsLCAxLCAxMDI0LCAiICAiKQorCQl3cml0ZV9sb2coMywgIlxuIiArIGJ1ZikKKwllbHNlOgorCQl3cml0ZV9sb2coMywgIk5vIGN1cnJlbnQgY2FsbCIpCisKK2RlZiB4ZmVyX2NhbGwoKToKKwlnbG9iYWwgZ19jdXJyZW50X2NhbGwKKwkKKwlpZiBnX2N1cnJlbnRfY2FsbCA9PSAtMToKKwkJCisJCXdyaXRlX2xvZygzLCAiTm8gY3VycmVudCBjYWxsIikKKworCWVsc2U6CisJCWNhbGwgPSBnX2N1cnJlbnRfY2FsbAkJCisJCWNpID0gcHlfcGpzdWEuY2FsbF9nZXRfaW5mbyhnX2N1cnJlbnRfY2FsbCkKKwkJcHJpbnQgIlRyYW5zZmVyaW5nIGN1cnJlbnQgY2FsbCBbIisgYGdfY3VycmVudF9jYWxsYCArICJdICIgKyBjaS5yZW1vdGVfaW5mbworCQlwcmludCAiRW50ZXIgc2lwIHVybCA6ICIKKwkJdXJsID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwkJaWYgdXJsID09ICJcbiI6IAorCQkJcmV0dXJuCisJCXVybCA9IHVybC5yZXBsYWNlKCJcbiIsICIiKQorCQlpZiBjYWxsICE9IGdfY3VycmVudF9jYWxsOgorCQkJcHJpbnQgIkNhbGwgaGFzIGJlZW4gZGlzY29ubmVjdGVkIgorCQkJcmV0dXJuCisJCW1zZ19kYXRhID0gcHlfcGpzdWEubXNnX2RhdGFfaW5pdCgpCisJCXN0YXR1cyA9IHB5X3Bqc3VhLmNhbGxfeGZlcihnX2N1cnJlbnRfY2FsbCwgdXJsLCBtc2dfZGF0YSk7CisJCWlmIHN0YXR1cyAhPSAwOgorCQkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIHRyYW5zZmVyaW5nIGNhbGwgIiwgc3RhdHVzKQorCQllbHNlOgkJCisJCQl3cml0ZV9sb2coMywgIkNhbGwgdHJhbnNmZXJlZCB0byAiICsgdXJsKQorCQkKK2RlZiB4ZmVyX2NhbGxfcmVwbGFjZXMoKToKKwlpZiBnX2N1cnJlbnRfY2FsbCA9PSAtMToKKwkJd3JpdGVfbG9nKDMsICJObyBjdXJyZW50IGNhbGwiKQorCWVsc2U6CisJCWNhbGwgPSBnX2N1cnJlbnRfY2FsbAorCQkKKwkJaWRzID0gcHlfcGpzdWEuZW51bV9jYWxscygpCisJCWlmIGxlbihpZHMpIDw9IDE6CisJCQlwcmludCAiVGhlcmUgYXJlIG5vIG90aGVyIGNhbGxzIgorCQkJcmV0dXJuCQkKKworCQljaSA9IHB5X3Bqc3VhLmNhbGxfZ2V0X2luZm8oZ19jdXJyZW50X2NhbGwpCisJCXByaW50ICJUcmFuc2ZlciBjYWxsIFsiICsgYGdfY3VycmVudF9jYWxsYCArICJdICIgKyBjaS5yZW1vdGVfaW5mbyArICIgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6IgorCQlmb3IgaSBpbiByYW5nZSgwLCBsZW4oaWRzKSk6CQkgICAgCisJCQlpZiBpZHNbaV0gPT0gY2FsbDoKKwkJCQljb250aW51ZQorCQkJY2FsbF9pbmZvID0gcHlfcGpzdWEuY2FsbF9nZXRfaW5mbyhpZHNbaV0pCisJCQlwcmludCBgaWRzW2ldYCArICIgICIgKyAgY2FsbF9pbmZvLnJlbW90ZV9pbmZvICsgIiAgWyIgKyBjYWxsX2luZm8uc3RhdGVfdGV4dCArICJdIgkJCisKKwkJcHJpbnQgIkVudGVyIGNhbGwgbnVtYmVyIHRvIGJlIHJlcGxhY2VkIDogIgorCQlidWYgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCQlidWYgPSBidWYucmVwbGFjZSgiXG4iLCIiKQorCQlpZiBidWYgPT0gIiI6CisJCQlyZXR1cm4KKwkJZHN0X2NhbGwgPSBpbnQoYnVmKQorCQkKKwkJaWYgY2FsbCAhPSBnX2N1cnJlbnRfY2FsbDoKKwkJCXByaW50ICJDYWxsIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCIKKwkJCXJldHVybgkJCisJCQorCQlpZiBkc3RfY2FsbCA9PSBjYWxsOgorCQkJcHJpbnQgIkRlc3RpbmF0aW9uIGNhbGwgbnVtYmVyIG11c3Qgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjYWxsIGJlaW5nIHRyYW5zZmVyZWQiCisJCQlyZXR1cm4KKwkJCisJCWlmIGRzdF9jYWxsID49IHB5X3Bqc3VhLlBKU1VBX01BWF9DQUxMUzoKKwkJCXByaW50ICJJbnZhbGlkIGRlc3RpbmF0aW9uIGNhbGwgbnVtYmVyIgorCQkJcmV0dXJuCisJCisJCWlmIHB5X3Bqc3VhLmNhbGxfaXNfYWN0aXZlKGRzdF9jYWxsKSA9PSAwOgorCQkJcHJpbnQgIkludmFsaWQgZGVzdGluYXRpb24gY2FsbCBudW1iZXIiCisJCQlyZXR1cm4JCQorCisJCXB5X3Bqc3VhLmNhbGxfeGZlcl9yZXBsYWNlcyhjYWxsLCBkc3RfY2FsbCwgMCwgTm9uZSkKKwkJCisjCisjIFdvcmtlciB0aHJlYWQgZnVuY3Rpb24uCisjIFB5dGhvbiBkb2Vzbid0IGxpa2UgaXQgd2hlbiBpdCdzIGNhbGxlZCBmcm9tIGFuIGFsaWVuIHRocmVhZAorIyAocGpzdWEncyB3b3JrZXIgdGhyZWFkLCBpbiB0aGlzIGNhc2UpLCBzbyBmb3IgUHl0aG9uIHdlIG11c3QKKyMgZGlzYWJsZSB3b3JrZXIgdGhyZWFkIGluIHBqc3VhIGFuZCBwb2xsIHBqc3VhIGZyb20gUHl0aG9uIGluc3RlYWQuCisjCitkZWYgd29ya2VyX3RocmVhZF9tYWluKGFyZyk6CisJZ2xvYmFsIENfUVVJVAorCXRocmVhZF9kZXNjID0gMDsKKwlzdGF0dXMgPSBweV9wanN1YS50aHJlYWRfcmVnaXN0ZXIoInB5dGhvbiB3b3JrZXIiLCB0aHJlYWRfZGVzYykKKwlpZiBzdGF0dXMgIT0gMDoKKwkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIHJlZ2lzdGVyaW5nIHRocmVhZCIsIHN0YXR1cykKKwllbHNlOgorCQl3aGlsZSBDX1FVSVQgPT0gMDoKKwkJCXB5X3Bqc3VhLmhhbmRsZV9ldmVudHMoNTApCisJCXByaW50ICJXb3JrZXIgdGhyZWFkIHF1aXR0aW5nLi4iCisJCUNfUVVJVCA9IDIKKworCisjIFN0YXJ0IHBqc3VhCisjCitkZWYgYXBwX3N0YXJ0KCk6CisJIyBEb25lIHdpdGggaW5pdGlhbGl6YXRpb24sIHN0YXJ0IHBqc3VhISEKKwkjCisJc3RhdHVzID0gcHlfcGpzdWEuc3RhcnQoKQorCWlmIHN0YXR1cyAhPSAwOgorCQllcnJfZXhpdCgiRXJyb3Igc3RhcnRpbmcgcGpzdWEhIiwgc3RhdHVzKQorCisJIyBTdGFydCB3b3JrZXIgdGhyZWFkCisJdGhyID0gdGhyZWFkLnN0YXJ0X25ldyh3b3JrZXJfdGhyZWFkX21haW4sICgwLCkpCisgICAgCisJcHJpbnQgIlBKU1VBIFN0YXJ0ZWQhISIKKworCisjIFByaW50IGFjY291bnQgYW5kIGJ1ZGR5IGxpc3QKK2RlZiBwcmludF9hY2NfYnVkZHlfbGlzdCgpOgorCWdsb2JhbCBnX2FjY19pZAorCQorCWFjY19pZHMgPSBweV9wanN1YS5lbnVtX2FjY3MoKQorCXByaW50ICJBY2NvdW50IGxpc3Q6IgorCWZvciBhY2NfaWQgaW4gYWNjX2lkczoKKwkJYWNjX2luZm8gPSBweV9wanN1YS5hY2NfZ2V0X2luZm8oYWNjX2lkKQorCQlpZiBhY2NfaW5mby5oYXNfcmVnaXN0cmF0aW9uID09IDA6CisJCQlhY2Nfc3RhdHVzID0gYWNjX2luZm8uc3RhdHVzX3RleHQKKwkJZWxzZToKKwkJCWFjY19zdGF0dXMgPSBgYWNjX2luZm8uc3RhdHVzYCArICIvIiArIGFjY19pbmZvLnN0YXR1c190ZXh0ICsgIiAoZXhwaXJlcz0iICsgYGFjY19pbmZvLmV4cGlyZXNgICsgIikiCisKKwkJaWYgYWNjX2lkID09IGdfYWNjX2lkOgorCQkJcHJpbnQgIiAqIiwKKwkJZWxzZToKKwkJCXByaW50ICIgICIsCisKKwkJcHJpbnQgIlsiICsgYGFjY19pZGAgKyAiXSAiICsgYWNjX2luZm8uYWNjX3VyaSArICI6ICIgKyBhY2Nfc3RhdHVzCisJCXByaW50ICIgICAgICAgUHJlc2VuY2Ugc3RhdHVzOiAiLAorCQlpZiBhY2NfaW5mby5vbmxpbmVfc3RhdHVzICE9IDA6CisJCQlwcmludCAiT25saW5lIgorCQllbHNlOgorCQkJcHJpbnQgIkludmlzaWJsZSIKKworCWlmIHB5X3Bqc3VhLmdldF9idWRkeV9jb3VudCgpID4gMDoKKwkJcHJpbnQgIiIKKwkJcHJpbnQgIkJ1ZGR5IGxpc3Q6IgorCQlidWRkeV9pZHMgPSBweV9wanN1YS5lbnVtX2J1ZGRpZXMoKQorCQlmb3IgYnVkZHlfaWQgaW4gYnVkZHlfaWRzOgorCQkJYmkgPSBweV9wanN1YS5idWRkeV9nZXRfaW5mbyhidWRkeV9pZCkKKwkJCXByaW50ICIgICBbIiArIGBidWRkeV9pZGAgKyAiXSAiICsgYmkuc3RhdHVzX3RleHQgKyAiICIgKyBiaS51cmkKKwkKKwkJCisjIFByaW50IGFwcGxpY2F0aW9uIG1lbnUKKyMKK2RlZiBwcmludF9tZW51KCk6CisJcHJpbnQgIiIKKwlwcmludCAiPj4+IgorCXByaW50X2FjY19idWRkeV9saXN0KCkKKwlwcmludCAiIiIKKys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworfCAgICAgICAgIENhbGwgQ29tbWFuZHMgOiAgICAgIHwgIEJ1ZGR5LCBJTSAmIFByZXNlbmNlOiAgIHwgICAgQWNjb3VudDogICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwKK3wgIG0gIE1ha2UgY2FsbCAgICAgICAgICAgICAgICB8ICtiICBBZGQgYnVkZHkgICAgICAgICAgICB8ICthICBBZGQgYWNjb3VudCAgfAorfCAgYSAgQW5zd2VyIGN1cnJlbnQgY2FsbCAgICAgIHwgLWIgIERlbGV0ZSBidWRkeSAgICAgICAgIHwgLWEgIERlbGV0ZSBhY2NudCB8Cit8ICBoICBIYW5ndXAgY3VycmVudCBjYWxsICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwKK3wgIEggIEhvbGQgY2FsbCAgICAgICAgICAgICAgICB8ICBpICBTZW5kIGluc3RhbnQgbWVzc2FnZSB8IHJyICByZWdpc3RlciAgICAgfAorfCAgdiAgcmUtaW5WaXRlIChyZWxlYXNlIEhvbGQpIHwgIHMgIFN1YnNjcmliZSBwcmVzZW5jZSAgIHwgcnUgIFVucmVnaXN0ZXIgICB8Cit8ICAjICBTZW5kIERUTUYgc3RyaW5nICAgICAgICAgfCAgdSAgVW5zdWJzY3JpYmUgcHJlc2VuY2UgfCAgICAgICAgICAgICAgICAgIHwKK3wgZHEgIER1bXAgY3Vyci4gY2FsbCBxdWFsaXR5ICB8ICB0ICBUb0dnbGUgT25saW5lIHN0YXR1cyB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rCit8ICB4ICBYZmVyIGNhbGwgICAgICAgICAgICAgICAgfCAgICAgTWVkaWEgQ29tbWFuZHM6ICAgICAgfCAgICBTdGF0dXM6ICAgICAgIHwKK3wgIFggIFhmZXIgd2l0aCBSZXBsYWNlcyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2wgIExpc3QgcG9ydHMgICAgICAgICAgIHwgIGQgIER1bXAgc3RhdHVzICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgQ29ubmVjdCBwb3J0ICAgICAgICAgfCBkZCAgRHVtcCBkZXRhaWwgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNkICBEaXNjb25uZWN0IHBvcnQgICAgICB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgK3AgIEFkZCBmaWxlIHBsYXllciAgICAgIHwgICAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyArciAgQWRkIGZpbGUgcmVjb3JkZXIgICAgfCAgICAgICAgICAgICAgICAgIHwKK3wgIHEgIFF1aXQgYXBwbGljYXRpb24gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rIiIiCisJcHJpbnQgIllvdSBoYXZlICIgKyBgcHlfcGpzdWEuY2FsbF9nZXRfY291bnQoKWAgKyAiIGFjdGl2ZSBjYWxsKHMpIgorCXByaW50ICI+Pj4iLCAKKworIyBNZW51CisjCitkZWYgYXBwX21lbnUoKToKKwlnbG9iYWwgZ19hY2NfaWQKKwlnbG9iYWwgZ19jdXJyZW50X2NhbGwKKworCXF1aXQgPSAwCisJd2hpbGUgcXVpdCA9PSAwOgorCQlwcmludF9tZW51KCkKKwkJY2hvaWNlID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKworCQlpZiBjaG9pY2VbMF0gPT0gInEiOgorCQkJcXVpdCA9IDEKKworCQllbGlmIGNob2ljZVswXSA9PSAiaSI6CisJCQkjIFNlbmRpbmcgSU0JCisJCQlwcmludCAiU2VuZCBJTSB0byBTSVAgVVJMOiAiLAorCQkJdXJsID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwkJCWlmIHVybCA9PSAiXG4iOgorCQkJCWNvbnRpbnVlCisKKwkJCSMgU2VuZCB0eXBpbmcgaW5kaWNhdGlvbgorCQkJcHlfcGpzdWEuaW1fdHlwaW5nKGdfYWNjX2lkLCB1cmwsIDEsIE5vbmUpIAorCisJCQlwcmludCAiVGhlIGNvbnRlbnQ6ICIsCisJCQltZXNzYWdlID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwkJCWlmIG1lc3NhZ2UgPT0gIlxuIjoKKwkJCQlweV9wanN1YS5pbV90eXBpbmcoZ19hY2NfaWQsIHVybCwgMCwgTm9uZSkgCQkKKwkJCQljb250aW51ZQorCisJCQkjIFNlbmQgdGhlIElNIQorCQkJcHlfcGpzdWEuaW1fc2VuZChnX2FjY19pZCwgdXJsLCBOb25lLCBtZXNzYWdlLCBOb25lLCAwKQorCisJCWVsaWYgY2hvaWNlWzBdID09ICJtIjoKKwkJCSMgTWFrZSBjYWxsIAorCQkJcHJpbnQgIlVzaW5nIGFjY291bnQgIiwgZ19hY2NfaWQKKwkJCXByaW50ICJNYWtlIGNhbGwgdG8gU0lQIFVSTDogIiwKKwkJCXVybCA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJCQl1cmwgPSB1cmwucmVwbGFjZSgiXG4iLCAiIikKKwkJCWlmIHVybCA9PSAiIjoKKwkJCQljb250aW51ZQorCisJCQkjIEluaXRpYXRlIHRoZSBjYWxsIQorCQkJc3RhdHVzLCBjYWxsX2lkID0gcHlfcGpzdWEuY2FsbF9tYWtlX2NhbGwoZ19hY2NfaWQsIHVybCwgMCwgMCwgTm9uZSkKKyAgICAgICAgICAgIAorCQkJaWYgc3RhdHVzICE9IDA6CisJCQkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIG1ha2luZyBjYWxsIiwgc3RhdHVzKQorCQkJZWxzZToKKwkJCQlnX2N1cnJlbnRfY2FsbCA9IGNhbGxfaWQKKworCQllbGlmIGNob2ljZVswXSA9PSAiKyIgYW5kIGNob2ljZVsxXSA9PSAiYiI6CisJCQkjIEFkZCBuZXcgYnVkZHkKKwkJCWJjID0gcHlfcGpzdWEuQnVkZHlfQ29uZmlnKCkKKwkJCXByaW50ICJCdWRkeSBVUkw6ICIsCisJCQliYy51cmkgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCQkJaWYgYmMudXJpID09ICJcbiI6CisJCQkJY29udGludWUKKyAgICAgICAgICAgIAorCQkJYmMudXJpID0gYmMudXJpLnJlcGxhY2UoIlxuIiwgIiIpCisJCQliYy5zdWJzY3JpYmUgPSAxCisJCQlzdGF0dXMsIGJ1ZGR5X2lkID0gcHlfcGpzdWEuYnVkZHlfYWRkKGJjKQorCQkJaWYgc3RhdHVzICE9IDA6CisJCQkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkZGluZyBidWRkeSIsIHN0YXR1cykKKwkJZWxpZiBjaG9pY2VbMF0gPT0gIi0iIGFuZCBjaG9pY2VbMV0gPT0gImIiOgorCQkJcHJpbnQgIkVudGVyIGJ1ZGR5IElEIHRvIGRlbGV0ZSA6ICIKKwkJCWJ1ZiA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJCQlidWYgPSBidWYucmVwbGFjZSgiXG4iLCIiKQorCQkJaWYgYnVmID09ICIiOgorCQkJCWNvbnRpbnVlCisJCQlpID0gaW50KGJ1ZikKKwkJCWlmIHB5X3Bqc3VhLmJ1ZGR5X2lzX3ZhbGlkKGkpID09IDA6CisJCQkJcHJpbnQgIkludmFsaWQgYnVkZHkgaWQgIiArIGBpYAorCQkJZWxzZToKKwkJCQlweV9wanN1YS5idWRkeV9kZWwoaSkKKwkJCQlwcmludCAiQnVkZHkgIiArIGBpYCArICIgZGVsZXRlZCIJCQorCQllbGlmIGNob2ljZVswXSA9PSAiKyIgYW5kIGNob2ljZVsxXSA9PSAiYSI6CisJCQkjIEFkZCBhY2NvdW50CisJCQlhZGRfYWNjb3VudCgpCisJCWVsaWYgY2hvaWNlWzBdID09ICItIiBhbmQgY2hvaWNlWzFdID09ICJhIjoKKwkJCXByaW50ICJFbnRlciBhY2NvdW50IElEIHRvIGRlbGV0ZSA6ICIKKwkJCWJ1ZiA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJCQlidWYgPSBidWYucmVwbGFjZSgiXG4iLCIiKQorCQkJaWYgYnVmID09ICIiOgorCQkJCWNvbnRpbnVlCisJCQlpID0gaW50KGJ1ZikKKworCQkJaWYgcHlfcGpzdWEuYWNjX2lzX3ZhbGlkKGkpID09IDA6CisJCQkJcHJpbnQgIkludmFsaWQgYWNjb3VudCBpZCAiICsgYGlgCisJCQllbHNlOgorCQkJCXB5X3Bqc3VhLmFjY19kZWwoaSkKKwkJCQlwcmludCAiQWNjb3VudCAiICsgYGlgICsgIiBkZWxldGVkIgorCSAgICAKKwkJZWxpZiBjaG9pY2VbMF0gPT0gIisiIGFuZCBjaG9pY2VbMV0gPT0gInAiOgorCQkJYWRkX3BsYXllcigpCisJCWVsaWYgY2hvaWNlWzBdID09ICIrIiBhbmQgY2hvaWNlWzFdID09ICJyIjoKKwkJCWFkZF9yZWNvcmRlcigpCisJCWVsaWYgY2hvaWNlWzBdID09ICJjIiBhbmQgY2hvaWNlWzFdID09ICJsIjoKKwkJCWNvbmZfbGlzdCgpCisJCWVsaWYgY2hvaWNlWzBdID09ICJjIiBhbmQgY2hvaWNlWzFdID09ICJjIjoKKwkJCWNvbm5lY3RfcG9ydCgpCisJCWVsaWYgY2hvaWNlWzBdID09ICJjIiBhbmQgY2hvaWNlWzFdID09ICJkIjoKKwkJCWRpc2Nvbm5lY3RfcG9ydCgpCisJCWVsaWYgY2hvaWNlWzBdID09ICJkIiBhbmQgY2hvaWNlWzFdID09ICJxIjoKKwkJCWR1bXBfY2FsbF9xdWFsaXR5KCkKKwkJZWxpZiBjaG9pY2VbMF0gPT0gIngiOgorCQkJeGZlcl9jYWxsKCkKKwkJZWxpZiBjaG9pY2VbMF0gPT0gIlgiOgorCQkJeGZlcl9jYWxsX3JlcGxhY2VzKCkKKwkJZWxpZiBjaG9pY2VbMF0gPT0gImgiOgorCQkJaWYgZ19jdXJyZW50X2NhbGwgIT0gcHlfcGpzdWEuUEpTVUFfSU5WQUxJRF9JRDoKKwkJCQlweV9wanN1YS5jYWxsX2hhbmd1cChnX2N1cnJlbnRfY2FsbCwgNjAzLCBOb25lLCBOb25lKQorCQkJZWxzZToKKwkJCQlwcmludCAiTm8gY3VycmVudCBjYWxsIgorCQllbGlmIGNob2ljZVswXSA9PSAiSCI6CisJCQlpZiBnX2N1cnJlbnRfY2FsbCAhPSBweV9wanN1YS5QSlNVQV9JTlZBTElEX0lEOgorCQkJCXB5X3Bqc3VhLmNhbGxfc2V0X2hvbGQoZ19jdXJyZW50X2NhbGwsIE5vbmUpCisJCQorCQkJZWxzZToKKwkJCQlwcmludCAiTm8gY3VycmVudCBjYWxsIgorCQllbGlmIGNob2ljZVswXSA9PSAidiI6CisJCQlpZiBnX2N1cnJlbnRfY2FsbCAhPSBweV9wanN1YS5QSlNVQV9JTlZBTElEX0lEOgorCQkKKwkJCQlweV9wanN1YS5jYWxsX3JlaW52aXRlKGdfY3VycmVudF9jYWxsLCAxLCBOb25lKTsKKworCQkJZWxzZToKKwkJCQlwcmludCAiTm8gY3VycmVudCBjYWxsIgorCQllbGlmIGNob2ljZVswXSA9PSAiIyI6CisJCQlpZiBnX2N1cnJlbnRfY2FsbCA9PSBweV9wanN1YS5QSlNVQV9JTlZBTElEX0lEOgkJCisJCQkJcHJpbnQgIk5vIGN1cnJlbnQgY2FsbCIKKwkJCWVsaWYgcHlfcGpzdWEuY2FsbF9oYXNfbWVkaWEoZ19jdXJyZW50X2NhbGwpID09IDA6CisJCQkJcHJpbnQgIk1lZGlhIGlzIG5vdCBlc3RhYmxpc2hlZCB5ZXQhIgorCQkJZWxzZToKKwkJCQljYWxsID0gZ19jdXJyZW50X2NhbGwKKwkJCQlwcmludCAiRFRNRiBzdHJpbmdzIHRvIHNlbmQgKDAtOSojQS1CKSIKKwkJCQlidWYgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCQkJCWJ1ZiA9IGJ1Zi5yZXBsYWNlKCJcbiIsICIiKQorCQkJCWlmIGJ1ZiA9PSAiIjoKKwkJCQkJY29udGludWUKKwkJCQlpZiBjYWxsICE9IGdfY3VycmVudF9jYWxsOgorCQkJCQlwcmludCAiQ2FsbCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQiCisJCQkJCWNvbnRpbnVlCisJCQkJc3RhdHVzID0gcHlfcGpzdWEuY2FsbF9kaWFsX2R0bWYoZ19jdXJyZW50X2NhbGwsIGJ1ZikKKwkJCQlpZiBzdGF0dXMgIT0gMDoKKwkJCQkJcHlfcGpzdWEucGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBzZW5kIERUTUYiLCBzdGF0dXMpOworCQkJCWVsc2U6CisJCQkJCXByaW50ICJEVE1GIGRpZ2l0cyBlbnF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uIgorCQllbGlmIGNob2ljZVswXSA9PSAicyI6CisJCQlwcmludCAiU3Vic2NyaWJlIHByZXNlbmNlIG9mIChidWRkeSBpZCkgOiAiCisJCQlidWYgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorCQkJYnVmID0gYnVmLnJlcGxhY2UoIlxuIiwiIikKKwkJCWlmIGJ1ZiA9PSAiIjoKKwkJCQljb250aW51ZQorCQkJaSA9IGludChidWYpCisJCQlweV9wanN1YS5idWRkeV9zdWJzY3JpYmVfcHJlcyhpLCAxKQorCQllbGlmIGNob2ljZVswXSA9PSAidSI6CisJCQlwcmludCAiVW5zdWJzY3JpYmUgcHJlc2VuY2Ugb2YgKGJ1ZGR5IGlkKSA6ICIKKwkJCWJ1ZiA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisJCQlidWYgPSBidWYucmVwbGFjZSgiXG4iLCIiKQorCQkJaWYgYnVmID09ICIiOgorCQkJCWNvbnRpbnVlCisJCQlpID0gaW50KGJ1ZikKKwkJCXB5X3Bqc3VhLmJ1ZGR5X3N1YnNjcmliZV9wcmVzKGksIDApCisJCWVsaWYgY2hvaWNlWzBdID09ICJ0IjoKKwkJCWFjY19pbmZvID0gcHlfcGpzdWEuYWNjX2dldF9pbmZvKGdfYWNjX2lkKQorCQkJaWYgYWNjX2luZm8ub25saW5lX3N0YXR1cyA9PSAwOgorCQkJCWFjY19pbmZvLm9ubGluZV9zdGF0dXMgPSAxCisJCQllbHNlOgorCQkJCWFjY19pbmZvLm9ubGluZV9zdGF0dXMgPSAwCisJCQlweV9wanN1YS5hY2Nfc2V0X29ubGluZV9zdGF0dXMoZ19hY2NfaWQsIGFjY19pbmZvLm9ubGluZV9zdGF0dXMpCisJCQlzdCA9ICIiCisJCQlpZiBhY2NfaW5mby5vbmxpbmVfc3RhdHVzID09IDA6CisJCQkJc3QgPSAib2ZmbGluZSIKKwkJCWVsc2U6CisJCQkJc3QgPSAib25saW5lIgorCQkJcHJpbnQgIlNldHRpbmcgIiArIGFjY19pbmZvLmFjY191cmkgKyAiIG9ubGluZSBzdGF0dXMgdG8gIiArIHN0CisJCWVsaWYgY2hvaWNlWzBdID09ICJyIjoKKwkJCWlmIGNob2ljZVsxXSA9PSAiciI6CSAgICAKKwkJCQlweV9wanN1YS5hY2Nfc2V0X3JlZ2lzdHJhdGlvbihnX2FjY19pZCwgMSkKKwkJCWVsaWYgY2hvaWNlWzFdID09ICJ1IjoKKwkJCQlweV9wanN1YS5hY2Nfc2V0X3JlZ2lzdHJhdGlvbihnX2FjY19pZCwgMCkKKwkJZWxpZiBjaG9pY2VbMF0gPT0gImQiOgorCQkJcHlfcGpzdWEuZHVtcChjaG9pY2VbMV0gPT0gImQiKQorCQllbGlmIGNob2ljZVswXSA9PSAiYSI6CisJCQlpZiBnX2N1cnJlbnRfY2FsbCAhPSBweV9wanN1YS5QSlNVQV9JTlZBTElEX0lEOgkJCQkKKwkJCQkKKwkJCQlweV9wanN1YS5jYWxsX2Fuc3dlcihnX2N1cnJlbnRfY2FsbCwgMjAwLCBOb25lLCBOb25lKQorCQkJZWxzZToKKwkJCQlwcmludCAiTm8gY3VycmVudCBjYWxsIgorCisKKyMKKyMgbWFpbgorIworYXBwX2luaXQoKQorYXBwX3N0YXJ0KCkKK2FwcF9tZW51KCkKKworIworIyBEb25lLCBxdWl0dGluZy4uCisjCitwcmludCAiUEpTVUEgc2h1dHRpbmcgZG93bi4uIgorQ19RVUlUID0gMQorIyBHaXZlIHRoZSB3b3JrZXIgdGhyZWFkIGNoYW5jZSB0byBxdWl0IGl0c2VsZgord2hpbGUgQ19RVUlUICE9IDI6CisgICAgcHlfcGpzdWEuaGFuZGxlX2V2ZW50cyg1MCkKKworcHJpbnQgIlBKU1VBIGRlc3Ryb3lpbmcuLiIKK3B5X3Bqc3VhLmRlc3Ryb3koKQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9weV9wanN1YS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvcHlfcGpzdWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIyMTMzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvcHlfcGpzdWEuYwpAQCAtMCwwICsxLDU4NzIgQEAKKy8qICRJZDogcHlfcGpzdWEuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInB5X3Bqc3VhLmgiCisKKyNkZWZpbmUgVEhJU19GSUxFICAgICJtYWluLmMiCisjZGVmaW5lIFBPT0xfU0laRSAgICA0MDAwCisjZGVmaW5lIFNORF9ERVZfTlVNICA2NAorI2RlZmluZSBTTkRfTkFNRV9MRU4gIDY0CisKKy8qIExJQiBCQVNFICovCisKK3N0YXRpYyBQeU9iamVjdCogb2JqX2xvZ19jYjsKK3N0YXRpYyBsb25nIHRocmVhZF9pZDsKKworI2RlZmluZSBFTlRFUl9QWVRIT04oKQkgICAgUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCkKKyNkZWZpbmUgTEVBVkVfUFlUSE9OKCkJICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSkKKworLyoKKyAqIGNiX2xvZ19jYgorICogZGVjbGFyZXMgbWV0aG9kIGZvciByZWNvbmZpZ3VyaW5nIGxvZ2dpbmcgcHJvY2VzcyBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGNiX2xvZ19jYihpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJCisgICAgLyogSWdub3JlIGlmIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGZyb20gYWxpZW4gdGhyZWFkIGNvbnRleHQsCisgICAgICogb3Igb3RoZXJ3aXNlIGl0IHdpbGwgY3Jhc2ggUHl0aG9uLgorICAgICAqLworICAgIGlmIChwal90aHJlYWRfbG9jYWxfZ2V0KHRocmVhZF9pZCkgPT0gMCkKKwlyZXR1cm47CisKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhvYmpfbG9nX2NiKSkKKyAgICB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKyAgICAgICAgICAgIG9ial9sb2dfY2IsIFB5X0J1aWxkVmFsdWUoImkiLGxldmVsKSwKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGF0YSksIFB5X0J1aWxkVmFsdWUoImkiLGxlbiksIE5VTEwKKyAgICAgICAgKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisKKy8qCisgKiBUaGUgZ2xvYmFsIGNhbGxiYWNrIG9iamVjdC4KKyAqLworc3RhdGljIFB5T2JqX3Bqc3VhX2NhbGxiYWNrICogZ19vYmpfY2FsbGJhY2s7CisKKworLyoKKyAqIGNiX29uX2NhbGxfc3RhdGUKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9jYWxsX3N0YXRlIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fY2FsbF9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQsIHBqc2lwX2V2ZW50ICplKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3N0YXRlKSkKKyAgICB7CQorICAgICAgICBQeU9ial9wanNpcF9ldmVudCAqIG9iajsKKworCUVOVEVSX1BZVEhPTigpOworCisJb2JqID0gKFB5T2JqX3Bqc2lwX2V2ZW50ICopUHlUeXBlX0dlbmVyaWNOZXcoJlB5VHlwX3Bqc2lwX2V2ZW50LAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJCQorCW9iai0+ZXZlbnQgPSBlOworCQkKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKyAgICAgICAgICAgIGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3N0YXRlLAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIixjYWxsX2lkKSwKKwkgICAgb2JqLAorCSAgICBOVUxMCisgICAgICAgICk7CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGNiX29uX2luY29taW5nX2NhbGwKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9pbmNvbWluZ19jYWxsIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25faW5jb21pbmdfY2FsbChwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9pbmNvbWluZ19jYWxsKSkKKyAgICB7CisJUHlPYmpfcGpzaXBfcnhfZGF0YSAqIG9iajsKKworCUVOVEVSX1BZVEhPTigpOworCisJb2JqID0gKFB5T2JqX3Bqc2lwX3J4X2RhdGEgKilQeVR5cGVfR2VuZXJpY05ldygmUHlUeXBfcGpzaXBfcnhfZGF0YSwgCisJCQkJCQkJTlVMTCwgTlVMTCk7CisJb2JqLT5yZGF0YSA9IHJkYXRhOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2luY29taW5nX2NhbGwsCisJCVB5X0J1aWxkVmFsdWUoImkiLGFjY19pZCksCisgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiaSIsY2FsbF9pZCksCisJCW9iaiwKKwkJTlVMTAorICAgICAgICApOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBjYl9vbl9jYWxsX21lZGlhX3N0YXRlCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fY2FsbF9tZWRpYV9zdGF0ZSBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX2NhbGxfbWVkaWFfc3RhdGUocGpzdWFfY2FsbF9pZCBjYWxsX2lkKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX21lZGlhX3N0YXRlKSkKKyAgICB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCSAgICBnX29ial9jYWxsYmFjay0+b25fY2FsbF9tZWRpYV9zdGF0ZSwKKwkgICAgImkiLAorCSAgICBjYWxsX2lkLAorCSAgICBOVUxMCisJKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fZHRtZl9kaWdpdCgpCisgKiBDYWxsYmFjayBmcm9tIFBKU1VBLUxJQiBvbiByZWNlaXZpbmcgRFRNRiBkaWdpdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9kdG1mX2RpZ2l0KHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgaW50IGRpZ2l0KQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9kdG1mX2RpZ2l0KSkKKyAgICB7CisJY2hhciBkaWdpdF9zdHJbMTBdOworCisJRU5URVJfUFlUSE9OKCk7CisKKwlwal9hbnNpX3NucHJpbnRmKGRpZ2l0X3N0ciwgc2l6ZW9mKGRpZ2l0X3N0ciksICIlYyIsIGRpZ2l0KTsKKworICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorCSAgICBnX29ial9jYWxsYmFjay0+b25fZHRtZl9kaWdpdCwKKwkgICAgUHlfQnVpbGRWYWx1ZSgiaSIsY2FsbF9pZCksCisJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGlnaXRfc3RyKSwKKwkgICAgTlVMTAorCSk7CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIE5vdGlmeSBhcHBsaWNhdGlvbiBvbiBjYWxsIGJlaW5nIHRyYW5zZmVyZWQuCisgKiAhbW9kaWZpZWQgQDA2MTIwNgorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QocGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorCQkJCSAgICAgICAgY29uc3QgcGpfc3RyX3QgKmRzdCwKKwkJCQkgICAgICAgIHBqc2lwX3N0YXR1c19jb2RlICpjb2RlKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QpKQorICAgIHsKKwlQeU9iamVjdCAqIHJldDsKKwlpbnQgY2Q7CisKKwlFTlRFUl9QWVRIT04oKTsKKworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCwKKwkgICAgUHlfQnVpbGRWYWx1ZSgiaSIsY2FsbF9pZCksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkc3QtPnB0ciwgZHN0LT5zbGVuKSwKKyAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImkiLCpjb2RlKSwKKwkgICAgTlVMTAorICAgICAgICApOworCWlmIChyZXQgIT0gTlVMTCkgeworCSAgICBpZiAocmV0ICE9IFB5X05vbmUpIHsKKwkJaWYgKFB5QXJnX1BhcnNlKHJldCwiaSIsJmNkKSkgeworCQkgICAgKmNvZGUgPSBjZDsKKwkJfQorCSAgICB9CisJfQorCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBOb3RpZnkgYXBwbGljYXRpb24gb2YgdGhlIHN0YXR1cyBvZiBwcmV2aW91c2x5IHNlbnQgY2FsbAorICogdHJhbnNmZXIgcmVxdWVzdC4gQXBwbGljYXRpb24gY2FuIG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUKKyAqIGNhbGwgdHJhbnNmZXIgcmVxdWVzdCwgZm9yIGV4YW1wbGUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gCisgKiB0ZXJtaW5hdGUgZXhpc3RpbmcgY2FsbC4KKyAqICFtb2RpZmllZCBAMDYxMjA2CisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkJCWludCBzdGF0dXNfY29kZSwKKwkJCQkJY29uc3QgcGpfc3RyX3QgKnN0YXR1c190ZXh0LAorCQkJCQlwal9ib29sX3QgZmluYWwsCisJCQkJCXBqX2Jvb2xfdCAqcF9jb250KQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cykpCisgICAgeworCVB5T2JqZWN0ICogcmV0OworCWludCBjbnQ7CisKKwlFTlRFUl9QWVRIT04oKTsKKworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzLAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIixjYWxsX2lkKSwKKwkgICAgUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzX2NvZGUpLAorICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RhdHVzX3RleHQtPnB0ciwgc3RhdHVzX3RleHQtPnNsZW4pLAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIixmaW5hbCksCisgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJpIiwqcF9jb250KSwKKwkgICAgTlVMTAorICAgICAgICApOworCWlmIChyZXQgIT0gTlVMTCkgeworCSAgICBpZiAocmV0ICE9IFB5X05vbmUpIHsKKwkJaWYgKFB5QXJnX1BhcnNlKHJldCwiaSIsJmNudCkpIHsKKwkJICAgICpwX2NvbnQgPSBjbnQ7CisJCX0KKwkgICAgfQorCX0KKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogTm90aWZ5IGFwcGxpY2F0aW9uIGFib3V0IGluY29taW5nIElOVklURSB3aXRoIFJlcGxhY2VzIGhlYWRlci4KKyAqIEFwcGxpY2F0aW9uIG1heSByZWplY3QgdGhlIHJlcXVlc3QgYnkgc2V0dGluZyBub24tMnh4IGNvZGUuCisgKiAhbW9kaWZpZWQgQDA2MTIwNgorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCggcGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorCQkJCQlwanNpcF9yeF9kYXRhICpyZGF0YSwKKwkJCQkJaW50ICpzdF9jb2RlLAorCQkJCQlwal9zdHJfdCAqc3RfdGV4dCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fY2FsbF9yZXBsYWNlX3JlcXVlc3QpKQorICAgIHsKKwlQeU9iamVjdCAqIHJldDsKKwlQeU9iamVjdCAqIHR4dDsKKwlpbnQgY2Q7CisgICAgICAgIFB5T2JqX3Bqc2lwX3J4X2RhdGEgKiBvYmo7CisKKwlFTlRFUl9QWVRIT04oKTsKKworCW9iaiA9IChQeU9ial9wanNpcF9yeF9kYXRhICopUHlUeXBlX0dlbmVyaWNOZXcoJlB5VHlwX3Bqc2lwX3J4X2RhdGEsCisJCQkJCQkJTlVMTCwgTlVMTCk7CisgICAgICAgIG9iai0+cmRhdGEgPSByZGF0YTsKKworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0LAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIixjYWxsX2lkKSwKKwkgICAgb2JqLAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIiwqc3RfY29kZSksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdF90ZXh0LT5wdHIsIHN0X3RleHQtPnNsZW4pLAorCSAgICBOVUxMCisgICAgICAgICk7CisJaWYgKHJldCAhPSBOVUxMKSB7CisJICAgIGlmIChyZXQgIT0gUHlfTm9uZSkgeworCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShyZXQsImlPIiwmY2QsICZ0eHQpKSB7CisJCSAgICAqc3RfY29kZSA9IGNkOworCQkgICAgc3RfdGV4dC0+cHRyID0gUHlTdHJpbmdfQXNTdHJpbmcodHh0KTsKKwkJICAgIHN0X3RleHQtPnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcodHh0KSk7CisJCX0KKwkgICAgfQorCX0KKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogTm90aWZ5IGFwcGxpY2F0aW9uIHRoYXQgYW4gZXhpc3RpbmcgY2FsbCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoCisgKiBhIG5ldyBjYWxsLiBUaGlzIGhhcHBlbnMgd2hlbiBQSlNVQS1BUEkgcmVjZWl2ZXMgaW5jb21pbmcgSU5WSVRFCisgKiByZXF1ZXN0IHdpdGggUmVwbGFjZXMgaGVhZGVyLgorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX3JlcGxhY2VkKHBqc3VhX2NhbGxfaWQgb2xkX2NhbGxfaWQsCisJCQkJcGpzdWFfY2FsbF9pZCBuZXdfY2FsbF9pZCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fY2FsbF9yZXBsYWNlZCkpCisgICAgeworCUVOVEVSX1BZVEhPTigpOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICBnX29ial9jYWxsYmFjay0+b25fY2FsbF9yZXBsYWNlZCwKKwkgICAgUHlfQnVpbGRWYWx1ZSgiaSIsb2xkX2NhbGxfaWQpLAorCSAgICBQeV9CdWlsZFZhbHVlKCJpIixuZXdfY2FsbF9pZCksCisJICAgIE5VTEwKKyAgICAgICAgKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fcmVnX3N0YXRlCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fcmVnX3N0YXRlIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fcmVnX3N0YXRlKHBqc3VhX2FjY19pZCBhY2NfaWQpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX3JlZ19zdGF0ZSkpCisgICAgeworCUVOVEVSX1BZVEhPTigpOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkgICAgZ19vYmpfY2FsbGJhY2stPm9uX3JlZ19zdGF0ZSwKKwkgICAgImkiLAorCSAgICBhY2NfaWQsCisJICAgIE5VTEwKKwkpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBjYl9vbl9idWRkeV9zdGF0ZQorICogZGVjbGFyZXMgbWV0aG9kIG9uX2J1ZGR5IHN0YXRlIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fYnVkZHlfc3RhdGUocGpzdWFfYnVkZHlfaWQgYnVkZHlfaWQpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX2J1ZGR5X3N0YXRlKSkKKyAgICB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCSAgICBnX29ial9jYWxsYmFjay0+b25fYnVkZHlfc3RhdGUsCisJICAgICJpIiwKKwkgICAgYnVkZHlfaWQsCisJICAgIE5VTEwKKwkpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisvKgorICogY2Jfb25fcGFnZXIKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9wYWdlciBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX3BhZ2VyKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgY29uc3QgcGpfc3RyX3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal9zdHJfdCAqdG8sIGNvbnN0IHBqX3N0cl90ICpjb250YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfc3RyX3QgKm1pbWVfdHlwZSwgY29uc3QgcGpfc3RyX3QgKmJvZHkpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX3BhZ2VyKSkKKyAgICB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKyAgICAgICAgICAgIGdfb2JqX2NhbGxiYWNrLT5vbl9wYWdlcixQeV9CdWlsZFZhbHVlKCJpIixjYWxsX2lkKSwKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyb20tPnB0ciwgZnJvbS0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0by0+cHRyLCB0by0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb250YWN0LT5wdHIsIGNvbnRhY3QtPnNsZW4pLAorICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobWltZV90eXBlLT5wdHIsIG1pbWVfdHlwZS0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShib2R5LT5wdHIsIGJvZHktPnNsZW4pLCAKKwkgICAgTlVMTAorICAgICAgICApOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBjYl9vbl9wYWdlcl9zdGF0dXMKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9wYWdlcl9zdGF0dXMgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9wYWdlcl9zdGF0dXMocGpzdWFfY2FsbF9pZCBjYWxsX2lkLCBjb25zdCBwal9zdHJfdCAqdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3N0cl90ICpib2R5LCB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqc2lwX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfc3RyX3QgKnJlYXNvbikKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fcGFnZXIpKQorICAgIHsKKwlQeU9iamVjdCAqIG9ial91c2VyX2RhdGE7CisKKwlFTlRFUl9QWVRIT04oKTsKKworCW9ial91c2VyX2RhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwgdXNlcl9kYXRhKTsKKworICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX3BhZ2VyX3N0YXR1cywKKwkgICAgUHlfQnVpbGRWYWx1ZSgiaSIsY2FsbF9pZCksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0by0+cHRyLCB0by0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShib2R5LT5wdHIsIGJvZHktPnNsZW4pLCAKKwkgICAgb2JqX3VzZXJfZGF0YSwKKyAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyksCisJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlYXNvbi0+cHRyLHJlYXNvbi0+c2xlbiksCisJICAgIE5VTEwKKyAgICAgICAgKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fdHlwaW5nCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fdHlwaW5nIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fdHlwaW5nKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgY29uc3QgcGpfc3RyX3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfc3RyX3QgKnRvLCBjb25zdCBwal9zdHJfdCAqY29udGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3QgaXNfdHlwaW5nKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl90eXBpbmcpKQorICAgIHsKKwlFTlRFUl9QWVRIT04oKTsKKworICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX3R5cGluZyxQeV9CdWlsZFZhbHVlKCJpIixjYWxsX2lkKSwKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyb20tPnB0ciwgZnJvbS0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0by0+cHRyLCB0by0+c2xlbiksCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb250YWN0LT5wdHIsIGNvbnRhY3QtPnNsZW4pLAorICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiaSIsaXNfdHlwaW5nKSwKKwkgICAgTlVMTAorICAgICAgICApOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKworLyogCisgKiB0cmFuc2xhdGVfaGRyCisgKiBpbnRlcm5hbCBmdW5jdGlvbiAKKyAqIHRyYW5zbGF0ZSBmcm9tIGhkcl9saXN0IHRvIHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkcgorICovCit2b2lkIHRyYW5zbGF0ZV9oZHIocGpfcG9vbF90ICpwb29sLCBwanNpcF9oZHIgKmhkciwgUHlPYmplY3QgKnB5X2hkcl9saXN0KQoreworICAgIHBqX2xpc3RfaW5pdChoZHIpOworCisgICAgaWYgKFB5TGlzdF9DaGVjayhweV9oZHJfbGlzdCkpIHsKKwlpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUocHlfaGRyX2xpc3QpOyBpKyspIAorCXsgCisgICAgICAgICAgICBwal9zdHJfdCBobmFtZSwgaHZhbHVlOworCSAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgKiBuZXdfaGRyOworICAgICAgICAgICAgUHlPYmplY3QgKiB0dXBsZSA9IFB5TGlzdF9HZXRJdGVtKHB5X2hkcl9saXN0LCBpKTsKKworICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodHVwbGUpKSAKKwkgICAgeworICAgICAgICAgICAgICAgIGhuYW1lLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwwKSk7CisgICAgICAgICAgICAgICAgaG5hbWUuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZworCQkJCQkoUHlUdXBsZV9HZXRJdGVtKHR1cGxlLDApKSk7CisgICAgICAgICAgICAgICAgaHZhbHVlLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwxKSk7CisgICAgICAgICAgICAgICAgaHZhbHVlLnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcKKwkJCQkJKFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwxKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaG5hbWUucHRyID0gIiI7CisJCWhuYW1lLnNsZW4gPSAwOworCQlodmFsdWUucHRyID0gIiI7CisJCWh2YWx1ZS5zbGVuID0gMDsKKyAgICAgICAgICAgIH0gIAorICAgICAgICAgICAgbmV3X2hkciA9IHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkcl9jcmVhdGUocG9vbCwgJmhuYW1lLCAmaHZhbHVlKTsKKyAgICAgICAgICAgIHBqX2xpc3RfcHVzaF9iYWNrKChwal9saXN0X3R5cGUgKiloZHIsIChwal9saXN0X3R5cGUgKiluZXdfaGRyKTsKKwl9ICAgICAKKyAgICB9Cit9CisKKy8qIAorICogdHJhbnNsYXRlX2hkcl9yZXYKKyAqIGludGVybmFsIGZ1bmN0aW9uCisgKiB0cmFuc2xhdGUgZnJvbSBwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgdG8gaGRyX2xpc3QKKyAqLworCit2b2lkIHRyYW5zbGF0ZV9oZHJfcmV2KHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkciAqaGRyLCBQeU9iamVjdCAqcHlfaGRyX2xpc3QpCit7CisgICAgaW50IGk7CisgICAgaW50IGxlbjsKKyAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgKiBwX2hkcjsKKworICAgIGxlbiA9IHBqX2xpc3Rfc2l6ZShoZHIpOworICAgIAorICAgIGlmIChsZW4gPiAwKSAKKyAgICB7CisgICAgICAgIHBfaGRyID0gaGRyOworICAgICAgICBQeV9YREVDUkVGKHB5X2hkcl9saXN0KTsKKyAgICAgICAgcHlfaGRyX2xpc3QgPSBQeUxpc3RfTmV3KGxlbik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAmJiBwX2hkciAhPSBOVUxMOyBpKyspIAorCXsKKyAgICAgICAgICAgIFB5T2JqZWN0ICogdHVwbGU7CisgICAgICAgICAgICBQeU9iamVjdCAqIHN0cjsKKworICAgICAgICAgICAgdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKKwkgICAgCisgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwX2hkci0+bmFtZS5wdHIsIHBfaGRyLT5uYW1lLnNsZW4pOworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHR1cGxlLCAwLCBzdHIpOworICAgICAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUKKwkJKGhkci0+aHZhbHVlLnB0ciwgcF9oZHItPmh2YWx1ZS5zbGVuKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh0dXBsZSwgMSwgc3RyKTsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHB5X2hkcl9saXN0LCBpLCB0dXBsZSk7CisgICAgICAgICAgICBwX2hkciA9IHBfaGRyLT5uZXh0OworCX0KKyAgICB9CisgICAgCisgICAgCit9CisKKy8qCisgKiBweV9wanN1YV90aHJlYWRfcmVnaXN0ZXIKKyAqICFhZGRlZCBAIDA2MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RocmVhZF9yZWdpc3RlcihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKwkKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CQorICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKnB5X2Rlc2M7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZDsKKyAgICB2b2lkICp0aHJlYWRfZGVzYzsKKyNpZiAwCisgICAgaW50IHNpemU7CisgICAgaW50IGk7CisgICAgaW50ICp0ZDsKKyNlbmRpZgorCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJzTyIsICZuYW1lLCAmcHlfZGVzYykpCisgICAgeworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2lmIDAKKyAgICBzaXplID0gUHlMaXN0X1NpemUocHlfZGVzYyk7CisgICAgdGQgPSAoaW50ICopbWFsbG9jKHNpemUgKiBzaXplb2YoaW50KSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgCisgICAgeworCWlmICghUHlBcmdfUGFyc2UoUHlMaXN0X0dldEl0ZW0ocHlfZGVzYyxpKSwiaSIsIHRkW2ldKSkgCisJeworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorICAgIHRocmVhZF9kZXNjID0gdGQ7CisjZWxzZQorICAgIHRocmVhZF9kZXNjID0gbWFsbG9jKHNpemVvZihwal90aHJlYWRfZGVzYykpOworI2VuZGlmCisgICAgc3RhdHVzID0gcGpfdGhyZWFkX3JlZ2lzdGVyKG5hbWUsIHRocmVhZF9kZXNjLCAmdGhyZWFkKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlzdGF0dXMgPSBwal90aHJlYWRfbG9jYWxfc2V0KHRocmVhZF9pZCwgKHZvaWQqKTEpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdAorICogIW1vZGlmaWVkIEAgMDUxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnICpvYmo7CQorICAgIHBqc3VhX2xvZ2dpbmdfY29uZmlnIGNmZzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCgmY2ZnKTsKKyAgICBvYmogPSAoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKikgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbmV3CisJCSgmUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcsTlVMTCxOVUxMKTsKKyAgICBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOworfQorCisKKy8qCisgKiBweV9wanN1YV9jb25maWdfZGVmYXVsdAorICogIW1vZGlmaWVkIEAgMDUxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZmlnX2RlZmF1bHQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgUHlPYmpfcGpzdWFfY29uZmlnICpvYmo7CisgICAgcGpzdWFfY29uZmlnIGNmZzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGpzdWFfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisgICAgb2JqID0gKFB5T2JqX3Bqc3VhX2NvbmZpZyAqKSBQeU9ial9wanN1YV9jb25maWdfbmV3KCZQeVR5cF9wanN1YV9jb25maWcsIE5VTEwsIE5VTEwpOworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKworICAgIHJldHVybiAoUHlPYmplY3QgKilvYmo7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX21lZGlhX2NvbmZpZ19kZWZhdWx0CisgKiAhbW9kaWZpZWQgQCAwNTEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICogcHlfcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQoUHlPYmplY3QgKnBTZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZyAqb2JqOworICAgIHBqc3VhX21lZGlhX2NvbmZpZyBjZmc7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBqc3VhX21lZGlhX2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV9tZWRpYV9jb25maWcgKikKKwkgIFB5VHlwZV9HZW5lcmljTmV3KCZQeVR5cF9wanN1YV9tZWRpYV9jb25maWcsIE5VTEwsIE5VTEwpOworICAgIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOworfQorCisKKy8qCisgKiBweV9wanN1YV9tc2dfZGF0YV9pbml0CisgKiAhbW9kaWZpZWQgQCAwNTEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9tc2dfZGF0YV9pbml0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX21zZ19kYXRhICpvYmo7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnOworICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnKTsKKyAgICBvYmogPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilQeU9ial9wanN1YV9tc2dfZGF0YV9uZXcoJlB5VHlwX3Bqc3VhX21zZ19kYXRhLCBOVUxMLCBOVUxMKTsKKyAgICBQeV9YREVDUkVGKG9iai0+Y29udGVudF90eXBlKTsKKyAgICBvYmotPmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICBtc2cuY29udGVudF90eXBlLnB0ciwgbXNnLmNvbnRlbnRfdHlwZS5zbGVuCisgICAgKTsKKyAgICBQeV9YREVDUkVGKG9iai0+bXNnX2JvZHkpOworICAgIG9iai0+bXNnX2JvZHkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgbXNnLm1zZ19ib2R5LnB0ciwgbXNnLm1zZ19ib2R5LnNsZW4KKyAgICApOworCisgICAgdHJhbnNsYXRlX2hkcl9yZXYoKHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkciAqKSZtc2cuaGRyX2xpc3Qsb2JqLT5oZHJfbGlzdCk7CisgICAgCisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKK30KKworCisvKgorICogcHlfcGpzdWFfcmVjb25maWd1cmVfbG9nZ2luZworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmcoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgUHlPYmplY3QgKiBsb2dPYmo7CisgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKmxvZzsKKyAgICBwanN1YV9sb2dnaW5nX2NvbmZpZyBjZmc7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPIiwgJmxvZ09iaikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGxvZ09iaiAhPSBQeV9Ob25lKSAKKyAgICB7CisgICAgICAgIGxvZyA9IChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyAqKWxvZ09iajsKKyAgICAgICAgY2ZnLm1zZ19sb2dnaW5nID0gbG9nLT5tc2dfbG9nZ2luZzsKKyAgICAgICAgY2ZnLmxldmVsID0gbG9nLT5sZXZlbDsKKyAgICAgICAgY2ZnLmNvbnNvbGVfbGV2ZWwgPSBsb2ctPmNvbnNvbGVfbGV2ZWw7CisgICAgICAgIGNmZy5kZWNvciA9IGxvZy0+ZGVjb3I7CisgICAgICAgIGNmZy5sb2dfZmlsZW5hbWUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcobG9nLT5sb2dfZmlsZW5hbWUpOworICAgICAgICBjZmcubG9nX2ZpbGVuYW1lLnNsZW4gPSBzdHJsZW4oY2ZnLmxvZ19maWxlbmFtZS5wdHIpOworICAgICAgICBQeV9YREVDUkVGKG9ial9sb2dfY2IpOworICAgICAgICBvYmpfbG9nX2NiID0gbG9nLT5jYjsKKyAgICAgICAgUHlfSU5DUkVGKG9ial9sb2dfY2IpOworICAgICAgICBjZmcuY2IgPSAmY2JfbG9nX2NiOworICAgICAgICBzdGF0dXMgPSBwanN1YV9yZWNvbmZpZ3VyZV9sb2dnaW5nKCZjZmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmcoTlVMTCk7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisKKy8qCisgKiBweV9wanN1YV9wb29sX2NyZWF0ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3Bvb2xfY3JlYXRlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3NpemVfdCBpbml0X3NpemU7CisgICAgcGpfc2l6ZV90IGluY3JlbWVudDsKKyAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICBwal9wb29sX3QgKnA7CisgICAgUHlPYmpfcGpfcG9vbCAqcG9vbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAic0lJIiwgJm5hbWUsICZpbml0X3NpemUsICZpbmNyZW1lbnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIAorICAgIHAgPSBwanN1YV9wb29sX2NyZWF0ZShuYW1lLCBpbml0X3NpemUsIGluY3JlbWVudCk7CisgICAgcG9vbCA9IChQeU9ial9wal9wb29sICopUHlUeXBlX0dlbmVyaWNOZXcoJlB5VHlwX3BqX3Bvb2xfdCwgTlVMTCwgTlVMTCk7CisgICAgcG9vbC0+cG9vbCA9IHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvb2w7CisKK30KKworCisvKgorICogcHlfcGpzdWFfZ2V0X3Bqc2lwX2VuZHB0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc2lwX2VuZHBvaW50ICplbmRwdDsKKyAgICBwanNpcF9lbmRwb2ludCAqZTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZSA9IHBqc3VhX2dldF9wanNpcF9lbmRwdCgpOworICAgIGVuZHB0ID0gKFB5T2JqX3Bqc2lwX2VuZHBvaW50ICopUHlUeXBlX0dlbmVyaWNOZXcoCisgICAgICAgICZQeVR5cF9wanNpcF9lbmRwb2ludCwgTlVMTCwgTlVMTAorICAgICk7CisgICAgZW5kcHQtPmVuZHB0ID0gZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZW5kcHQ7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2dldF9wam1lZGlhX2VuZHB0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZ2V0X3BqbWVkaWFfZW5kcHQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgUHlPYmpfcGptZWRpYV9lbmRwdCAqZW5kcHQ7CisgICAgcGptZWRpYV9lbmRwdCAqZTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZSA9IHBqc3VhX2dldF9wam1lZGlhX2VuZHB0KCk7CisgICAgZW5kcHQgPSAoUHlPYmpfcGptZWRpYV9lbmRwdCAqKVB5VHlwZV9HZW5lcmljTmV3KAorICAgICAgICAmUHlUeXBfcGptZWRpYV9lbmRwdCwgTlVMTCwgTlVMTAorICAgICk7CisgICAgZW5kcHQtPmVuZHB0ID0gZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZW5kcHQ7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2dldF9wb29sX2ZhY3RvcnkKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9nZXRfcG9vbF9mYWN0b3J5KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3BqX3Bvb2xfZmFjdG9yeSAqcG9vbDsKKyAgICBwal9wb29sX2ZhY3RvcnkgKnA7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSBwanN1YV9nZXRfcG9vbF9mYWN0b3J5KCk7CisgICAgcG9vbCA9IChQeU9ial9wal9wb29sX2ZhY3RvcnkgKilQeVR5cGVfR2VuZXJpY05ldygKKyAgICAgICAgJlB5VHlwX3BqX3Bvb2xfZmFjdG9yeSwgTlVMTCwgTlVMTAorICAgICk7CisgICAgcG9vbC0+cG9vbF9mYWN0ID0gcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcG9vbDsKK30KKworCisvKgorICogcHlfcGpzdWFfcGVycm9yCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcGVycm9yKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKyAgICBjb25zdCBjaGFyICp0aXRsZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgInNzaSIsICZzZW5kZXIsICZ0aXRsZSwgJnN0YXR1cykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisgICAgcGpzdWFfcGVycm9yKHNlbmRlciwgdGl0bGUsIHN0YXR1cyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisKKy8qCisgKiBweV9wanN1YV9jcmVhdGUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jcmVhdGUoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdGF0dXMgPSBwanN1YV9jcmVhdGUoKTsKKyAgICAKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIAorICAgIHsKKwlzdGF0dXMgPSBwal90aHJlYWRfbG9jYWxfYWxsb2MoJnRocmVhZF9pZCk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICBzdGF0dXMgPSBwal90aHJlYWRfbG9jYWxfc2V0KHRocmVhZF9pZCwgKHZvaWQqKTEpOworICAgIH0KKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisKKy8qCisgKiBweV9wanN1YV9pbml0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfaW5pdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgUHlPYmplY3QgKm9fdWFfY2ZnLCAqb19sb2dfY2ZnLCAqb19tZWRpYV9jZmc7CisgICAgcGpzdWFfY29uZmlnIGNmZ191YSwgKnBfY2ZnX3VhOworICAgIHBqc3VhX2xvZ2dpbmdfY29uZmlnIGNmZ19sb2csICpwX2NmZ19sb2c7CisgICAgcGpzdWFfbWVkaWFfY29uZmlnIGNmZ19tZWRpYSwgKnBfY2ZnX21lZGlhOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPT08iLCAmb191YV9jZmcsICZvX2xvZ19jZmcsICZvX21lZGlhX2NmZykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcGpzdWFfY29uZmlnX2RlZmF1bHQoJmNmZ191YSk7CisgICAgcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCgmY2ZnX2xvZyk7CisgICAgcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQoJmNmZ19tZWRpYSk7CisKKyAgICBpZiAob191YV9jZmcgIT0gUHlfTm9uZSkgCisgICAgeworCVB5T2JqX3Bqc3VhX2NvbmZpZyAqb2JqX3VhX2NmZyA9IChQeU9ial9wanN1YV9jb25maWcqKW9fdWFfY2ZnOworCisJUHlPYmpfcGpzdWFfY29uZmlnX2V4cG9ydCgmY2ZnX3VhLCBvYmpfdWFfY2ZnKTsKKworICAgIAlnX29ial9jYWxsYmFjayA9IG9ial91YV9jZmctPmNiOworICAgIAlQeV9JTkNSRUYoZ19vYmpfY2FsbGJhY2spOworCisgICAgCWNmZ191YS5jYi5vbl9jYWxsX3N0YXRlID0gJmNiX29uX2NhbGxfc3RhdGU7CisgICAgCWNmZ191YS5jYi5vbl9pbmNvbWluZ19jYWxsID0gJmNiX29uX2luY29taW5nX2NhbGw7CisgICAgCWNmZ191YS5jYi5vbl9jYWxsX21lZGlhX3N0YXRlID0gJmNiX29uX2NhbGxfbWVkaWFfc3RhdGU7CisJY2ZnX3VhLmNiLm9uX2R0bWZfZGlnaXQgPSAmY2Jfb25fZHRtZl9kaWdpdDsKKyAgICAJY2ZnX3VhLmNiLm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCA9ICZjYl9vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3Q7CisgICAgCWNmZ191YS5jYi5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyA9ICZjYl9vbl9jYWxsX3RyYW5zZmVyX3N0YXR1czsKKyAgICAJY2ZnX3VhLmNiLm9uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0ID0gJmNiX29uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0OworICAgIAljZmdfdWEuY2Iub25fY2FsbF9yZXBsYWNlZCA9ICZjYl9vbl9jYWxsX3JlcGxhY2VkOworICAgIAljZmdfdWEuY2Iub25fcmVnX3N0YXRlID0gJmNiX29uX3JlZ19zdGF0ZTsKKyAgICAJY2ZnX3VhLmNiLm9uX2J1ZGR5X3N0YXRlID0gJmNiX29uX2J1ZGR5X3N0YXRlOworICAgIAljZmdfdWEuY2Iub25fcGFnZXIgPSAmY2Jfb25fcGFnZXI7CisgICAgCWNmZ191YS5jYi5vbl9wYWdlcl9zdGF0dXMgPSAmY2Jfb25fcGFnZXJfc3RhdHVzOworICAgIAljZmdfdWEuY2Iub25fdHlwaW5nID0gJmNiX29uX3R5cGluZzsKKworICAgICAgICBwX2NmZ191YSA9ICZjZmdfdWE7CisKKyAgICB9IGVsc2UgeworICAgICAgICBwX2NmZ191YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG9fbG9nX2NmZyAhPSBQeV9Ob25lKSAKKyAgICB7CisJUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKiBvYmpfbG9nOworCisgICAgICAgIG9ial9sb2cgPSAoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKilvX2xvZ19jZmc7CisgICAgICAgIAorICAgICAgICBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19leHBvcnQoJmNmZ19sb2csIG9ial9sb2cpOworCisgICAgICAgIFB5X1hERUNSRUYob2JqX2xvZ19jYik7CisgICAgICAgIG9ial9sb2dfY2IgPSBvYmpfbG9nLT5jYjsKKyAgICAgICAgUHlfSU5DUkVGKG9ial9sb2dfY2IpOworCisgICAgICAgIGNmZ19sb2cuY2IgPSAmY2JfbG9nX2NiOworICAgICAgICBwX2NmZ19sb2cgPSAmY2ZnX2xvZzsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHBfY2ZnX2xvZyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG9fbWVkaWFfY2ZnICE9IFB5X05vbmUpIAorICAgIHsKKwlQeU9ial9wanN1YV9tZWRpYV9jb25maWdfZXhwb3J0KCZjZmdfbWVkaWEsIAorCQkJCSAgICAgICAgKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZyopb19tZWRpYV9jZmcpOworCXBfY2ZnX21lZGlhID0gJmNmZ19tZWRpYTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHBfY2ZnX21lZGlhID0gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9pbml0KHBfY2ZnX3VhLCBwX2NmZ19sb2csIHBfY2ZnX21lZGlhKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworCisvKgorICogcHlfcGpzdWFfc3RhcnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9zdGFydChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0YXR1cyA9IHBqc3VhX3N0YXJ0KCk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2Rlc3Ryb3kKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9kZXN0cm95KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RhdHVzID0gcGpzdWFfZGVzdHJveSgpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisKKy8qCisgKiBweV9wanN1YV9oYW5kbGVfZXZlbnRzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfaGFuZGxlX2V2ZW50cyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIG1zZWM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmbXNlYykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBTaW5jZSBoYW5kbGVfZXZlbnRzKCkgd2lsbCBibG9jaywgd2UgbXVzdCB3cmFwIGl0IHdpdGggQUxMT1dfVEhSRUFEUworICAgICAqIGNvbnN0cnVjdCwgb3Igb3RoZXJ3aXNlIG1hbnkgUHl0aG9uIGJsb2NraW5nIGZ1bmN0aW9ucyAoc3VjaCBhcworICAgICAqIHRpbWUuc2xlZXAoKSwgcmVhZGxpbmUoKSwgZXRjLikgbWF5IGhhbmcvYmxvY2sgaW5kZWZpbml0ZWx5LgorICAgICAqIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2N1cnJlbnQvYXBpL3RocmVhZHMuaHRtbCBmb3IgbW9yZSBpbmZvLgorICAgICAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXQgPSBwanN1YV9oYW5kbGVfZXZlbnRzKG1zZWMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHJldCk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX3ZlcmlmeV9zaXBfdXJsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfdmVyaWZ5X3NpcF91cmwoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGNvbnN0IGNoYXIgKnVybDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAicyIsICZ1cmwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0YXR1cyA9IHBqc3VhX3ZlcmlmeV9zaXBfdXJsKHVybCk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKworLyoKKyAqIGZ1bmN0aW9uIGRvYworICovCisKK3N0YXRpYyBjaGFyIHBqc3VhX3RocmVhZF9yZWdpc3Rlcl9kb2NbXSA9CisgICAgImludCBweV9wanN1YS50aHJlYWRfcmVnaXN0ZXIoc3RyaW5nIG5hbWUsIGludFtdIGRlc2MpIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3BlcnJvcl9kb2NbXSA9CisgICAgInZvaWQgcHlfcGpzdWEucGVycm9yIChzdHJpbmcgc2VuZGVyLCBzdHJpbmcgdGl0bGUsIGludCBzdGF0dXMpICIKKyAgICAiRGlzcGxheSBlcnJvciBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUuIFBhcmFtZXRlcnM6ICIKKyAgICAic2VuZGVyOiBUaGUgbG9nIHNlbmRlciBmaWVsZDsgICIKKyAgICAidGl0bGU6IE1lc3NhZ2UgdGl0bGUgZm9yIHRoZSBlcnJvcjsgIgorICAgICJzdGF0dXM6IFN0YXR1cyBjb2RlLiI7CisKK3N0YXRpYyBjaGFyIHBqc3VhX2NyZWF0ZV9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jcmVhdGUgKHZvaWQpICIKKyAgICAiSW5zdGFudGlhdGUgcGpzdWEgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9uICIKKyAgICAibXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGZ1bmN0aW9ucywgdG8gbWFrZSBzdXJlICIKKyAgICAidGhhdCB0aGUgdW5kZXJseWluZyBsaWJyYXJpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBPbmNlIHRoaXMgIgorICAgICJmdW5jdGlvbiBoYXMgcmV0dXJuZWQgc3VjY2VzcywgYXBwbGljYXRpb24gbXVzdCBjYWxsIHBqc3VhX2Rlc3Ryb3koKSAiCisgICAgImJlZm9yZSBxdWl0dGluZy4iOworCitzdGF0aWMgY2hhciBwanN1YV9pbml0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmluaXQgKHB5X3Bqc3VhLkNvbmZpZyBvYmpfdWFfY2ZnLCAiCisgICAgICAgICJweV9wanN1YS5Mb2dnaW5nX0NvbmZpZyBsb2dfY2ZnLCBweV9wanN1YS5NZWRpYV9Db25maWcgbWVkaWFfY2ZnKSAiCisgICAgIkluaXRpYWxpemUgcGpzdWEgd2l0aCB0aGUgc3BlY2lmaWVkIHNldHRpbmdzLiBBbGwgdGhlIHNldHRpbmdzIGFyZSAiCisgICAgIm9wdGlvbmFsLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBjb25maWcgaXMgbm90ICIKKyAgICAic3BlY2lmaWVkLiBQYXJhbWV0ZXJzOiAiCisgICAgIm9ial91YV9jZmcgOiBVc2VyIGFnZW50IGNvbmZpZ3VyYXRpb247ICAiCisgICAgImxvZ19jZmcgOiBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb247ICIKKyAgICAibWVkaWFfY2ZnIDogT3B0aW9uYWwgbWVkaWEgY29uZmlndXJhdGlvbi4iOworCitzdGF0aWMgY2hhciBwanN1YV9zdGFydF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5zdGFydCAodm9pZCkgIgorICAgICJBcHBsaWNhdGlvbiBpcyByZWNvbW1lbmRlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgYWxsICIKKyAgICAiaW5pdGlhbGl6YXRpb24gaXMgZG9uZSwgc28gdGhhdCB0aGUgbGlicmFyeSBjYW4gZG8gYWRkaXRpb25hbCBjaGVja2luZyAiCisgICAgInNldCB1cCBhZGRpdGlvbmFsIjsKKworc3RhdGljIGNoYXIgcGpzdWFfZGVzdHJveV9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5kZXN0cm95ICh2b2lkKSAiCisgICAgIkRlc3Ryb3kgcGpzdWEgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIFBKU1VBIGlzIGNyZWF0ZWQuIFRvICIKKyAgICAibWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uICIKKyAgICAic2V2ZXJhbCB0aW1lcyB3aXRoIG5vIGRhbmdlci4iOworCitzdGF0aWMgY2hhciBwanN1YV9oYW5kbGVfZXZlbnRzX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmhhbmRsZV9ldmVudHMgKGludCBtc2VjX3RpbWVvdXQpICIKKyAgICAiUG9sbCBwanN1YSBmb3IgZXZlbnRzLCBhbmQgaWYgbmVjZXNzYXJ5IGJsb2NrIHRoZSBjYWxsZXIgdGhyZWFkIGZvciB0aGUgIgorICAgICJzcGVjaWZpZWQgbWF4aW11bSBpbnRlcnZhbCAoaW4gbWlsaXNlY29uZHMpIFBhcmFtZXRlcnM6ICIKKyAgICAibXNlY190aW1lb3V0OiBNYXhpbXVtIHRpbWUgdG8gd2FpdCwgaW4gbWlsaXNlY29uZHMuICIKKyAgICAiUmV0dXJuczogVGhlIG51bWJlciBvZiBldmVudHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZCBkdXJpbmcgdGhlIHBvbGwuICIKKyAgICAiTmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIGVycm9yLCBhbmQgYXBwbGljYXRpb24gY2FuIHJldHJpZXZlIHRoZSBlcnJvciAiCisgICAgImFzIChlcnIgPSAtcmV0dXJuX3ZhbHVlKS4iOworCitzdGF0aWMgY2hhciBwanN1YV92ZXJpZnlfc2lwX3VybF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS52ZXJpZnlfc2lwX3VybCAoc3RyaW5nIGNfdXJsKSAiCisgICAgIlZlcmlmeSB0aGF0IHZhbGlkIFNJUCB1cmwgaXMgZ2l2ZW4gUGFyYW1ldGVyczogIgorICAgICJjX3VybDogVGhlIFVSTCwgYXMgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZy4iOworCitzdGF0aWMgY2hhciBwanN1YV9wb29sX2NyZWF0ZV9kb2NbXSA9CisgICAgInB5X3Bqc3VhLlBqX1Bvb2wgcHlfcGpzdWEucG9vbF9jcmVhdGUgKHN0cmluZyBuYW1lLCBpbnQgaW5pdF9zaXplLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgaW5jcmVtZW50KSAiCisgICAgIkNyZWF0ZSBtZW1vcnkgcG9vbCBQYXJhbWV0ZXJzOiAiCisgICAgIm5hbWU6IE9wdGlvbmFsIHBvb2wgbmFtZTsgIgorICAgICJpbml0X3NpemU6IEluaXRpYWwgc2l6ZSBvZiB0aGUgcG9vbDsgICIKKyAgICAiaW5jcmVtZW50OiBJbmNyZW1lbnQgc2l6ZS4iOworCitzdGF0aWMgY2hhciBwanN1YV9nZXRfcGpzaXBfZW5kcHRfZG9jW10gPQorICAgICJweV9wanN1YS5QanNpcF9FbmRwb2ludCBweV9wanN1YS5nZXRfcGpzaXBfZW5kcHQgKHZvaWQpICIKKyAgICAiSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IFNJUCBlbmRwb2ludCBpbnN0YW5jZSBvZiBwanN1YSwgd2hpY2ggaXMgbmVlZGVkICIKKyAgICAiZm9yIGV4YW1wbGUgdG8gcmVnaXN0ZXIgbW9kdWxlLCBjcmVhdGUgdHJhbnNwb3J0cywgZXRjLiBQcm9iYWJseSBpcyBvbmx5ICIKKyAgICAidmFsaWQgYWZ0ZXIgcGpzdWFfaW5pdCgpIGlzIGNhbGxlZC4iOworCitzdGF0aWMgY2hhciBwanN1YV9nZXRfcGptZWRpYV9lbmRwdF9kb2NbXSA9CisgICAgInB5X3Bqc3VhLlBqbWVkaWFfRW5kcHQgcHlfcGpzdWEuZ2V0X3BqbWVkaWFfZW5kcHQgKHZvaWQpICIKKyAgICAiSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLiBPbmx5IHZhbGlkIGFmdGVyICIKKyAgICAicGpzdWFfaW5pdCgpIGlzIGNhbGxlZC4iOworCitzdGF0aWMgY2hhciBwanN1YV9nZXRfcG9vbF9mYWN0b3J5X2RvY1tdID0KKyAgICAicHlfcGpzdWEuUGpfUG9vbF9GYWN0b3J5IHB5X3Bqc3VhLmdldF9wb29sX2ZhY3RvcnkgKHZvaWQpICIKKyAgICAiSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IFBKU1VBIHBvb2wgZmFjdG9yeS4gT25seSB2YWxpZCBhZnRlciAiCisgICAgInBqc3VhX2luaXQoKSBpcyBjYWxsZWQuIjsKKworc3RhdGljIGNoYXIgcGpzdWFfcmVjb25maWd1cmVfbG9nZ2luZ19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5yZWNvbmZpZ3VyZV9sb2dnaW5nIChweV9wanN1YS5Mb2dnaW5nX0NvbmZpZyBjKSAiCisgICAgIkFwcGxpY2F0aW9uIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgYW55IHRpbWUgKGFmdGVyIHBqc3VhX2NyZWF0ZSgpLCBvZiAiCisgICAgImNvdXJzZSkgdG8gY2hhbmdlIGxvZ2dpbmcgc2V0dGluZ3MuIFBhcmFtZXRlcnM6ICIKKyAgICAiYzogTG9nZ2luZyBjb25maWd1cmF0aW9uLiI7CisKK3N0YXRpYyBjaGFyIHBqc3VhX2xvZ2dpbmdfY29uZmlnX2RlZmF1bHRfZG9jW10gPQorICAgICJweV9wanN1YS5Mb2dnaW5nX0NvbmZpZyBweV9wanN1YS5sb2dnaW5nX2NvbmZpZ19kZWZhdWx0ICAoKSAgIgorICAgICJVc2UgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIGxvZ2dpbmcgY29uZmlnLiI7CisKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZpZ19kZWZhdWx0X2RvY1tdID0KKyAgICAicHlfcGpzdWEuQ29uZmlnIHB5X3Bqc3VhLmNvbmZpZ19kZWZhdWx0ICgpLiBVc2UgdGhpcyBmdW5jdGlvbiB0byAiCisgICAgImluaXRpYWxpemUgcGpzdWEgY29uZmlnLiAiOworCitzdGF0aWMgY2hhciBwanN1YV9tZWRpYV9jb25maWdfZGVmYXVsdF9kb2NbXSA9CisgICAgInB5X3Bqc3VhLk1lZGlhX0NvbmZpZyBweV9wanN1YS5tZWRpYV9jb25maWdfZGVmYXVsdCAoKS4gIgorICAgICJVc2UgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIG1lZGlhIGNvbmZpZy4iOworCitzdGF0aWMgY2hhciBwanN1YV9tc2dfZGF0YV9pbml0X2RvY1tdID0KKyAgICAicHlfcGpzdWEuTXNnX0RhdGEgdm9pZCBweV9wanN1YS5tc2dfZGF0YV9pbml0ICgpICIKKyAgICAiSW5pdGlhbGl6ZSBtZXNzYWdlIGRhdGEgIjsKKyAgICAgICAgCisKKy8qIEVORCBPRiBMSUIgQkFTRSAqLworCisvKiBMSUIgVFJBTlNQT1JUICovCisKKy8qCisgKiBweV9wanN1YV90cmFuc3BvcnRfY29uZmlnX2RlZmF1bHQKKyAqICFtb2RpZmllZCBAIDA1MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkJICAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKm9iajsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIGNmZzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnKikKKwkgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3KCZQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnLAorCQkJCQkgICBOVUxMLCBOVUxMKTsKKyAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2ltcG9ydChvYmosICZjZmcpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3RyYW5zcG9ydF9jcmVhdGUKKyAqICFtb2RpZmllZCBAIDA1MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RyYW5zcG9ydF9jcmVhdGUoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCB0eXBlOworICAgIFB5T2JqZWN0ICogdG1wT2JqOworICAgIHBqc3VhX3RyYW5zcG9ydF9jb25maWcgY2ZnOworICAgIHBqc3VhX3RyYW5zcG9ydF9pZCBpZDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU8iLCAmdHlwZSwgJnRtcE9iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHRtcE9iaiAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqb2JqOworICAgICAgICBvYmogPSAoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyopdG1wT2JqOworCVB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZXhwb3J0KCZjZmcsIG9iaik7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUodHlwZSwgJmNmZywgJmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfY3JlYXRlKHR5cGUsIE5VTEwsICZpZCk7CisgICAgfQorICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfZW51bV90cmFuc3BvcnRzCisgKiAhbW9kaWZpZWQgQCAyNjEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9lbnVtX3RyYW5zcG9ydHMoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIAorICAgIHBqc3VhX3RyYW5zcG9ydF9pZCBpZFtQSlNJUF9NQVhfVFJBTlNQT1JUU107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIGMgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICBzdGF0dXMgPSBwanN1YV9lbnVtX3RyYW5zcG9ydHMoaWQsICZjKTsKKyAgICAKKyAgICBsaXN0ID0gUHlMaXN0X05ldyhjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSAKKyAgICB7ICAgICAKKyAgICAgICAgaW50IHJldCA9IFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X0J1aWxkVmFsdWUoImkiLCBpZFtpXSkpOworICAgICAgICBpZiAocmV0ID09IC0xKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLGxpc3QpOworfQorCisvKgorICogcHlfcGpzdWFfdHJhbnNwb3J0X2dldF9pbmZvCisgKiAhbW9kaWZpZWQgQCAwNTEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV90cmFuc3BvcnRfZ2V0X2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBpZDsKKyAgICBwanN1YV90cmFuc3BvcnRfaW5mbyBpbmZvOworICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm8oaWQsICZpbmZvKTsJCisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8gKm9iajsKKyAgICAgICAgb2JqID0gKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvICopIAorCSAgICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX25ldygmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2luZm8sIAorCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCVB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX2ltcG9ydChvYmosICZpbmZvKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLCBvYmopOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCisvKgorICogcHlfcGpzdWFfdHJhbnNwb3J0X3NldF9lbmFibGUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV90cmFuc3BvcnRfc2V0X2VuYWJsZQorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBpbnQgaWQ7CisgICAgaW50IGVuYWJsZWQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmlkLCAmZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIHN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlKGlkLCBlbmFibGVkKTsJCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV90cmFuc3BvcnRfY2xvc2UKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV90cmFuc3BvcnRfY2xvc2UoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBpZDsKKyAgICBpbnQgZm9yY2U7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmlkLCAmZm9yY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfY2xvc2UoaWQsIGZvcmNlKTsJCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKK3N0YXRpYyBjaGFyIHBqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdF9kb2NbXSA9CisgICAgInB5X3Bqc3VhLlRyYW5zcG9ydF9Db25maWcgcHlfcGpzdWEudHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0ICgpICIKKyAgICAiQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVURQIGNvbmZpZyB3aXRoIGRlZmF1bHQgdmFsdWVzLiI7CitzdGF0aWMgY2hhciBwanN1YV90cmFuc3BvcnRfY3JlYXRlX2RvY1tdID0KKyAgICAiaW50LCBpbnQgcHlfcGpzdWEudHJhbnNwb3J0X2NyZWF0ZSAoaW50IHR5cGUsICIKKyAgICAicHlfcGpzdWEuVHJhbnNwb3J0X0NvbmZpZyBjZmcpICIKKyAgICAiQ3JlYXRlIFNJUCB0cmFuc3BvcnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2VudW1fdHJhbnNwb3J0c19kb2NbXSA9CisgICAgImludFtdIHB5X3Bqc3VhLmVudW1fdHJhbnNwb3J0cyAoKSAiCisgICAgIkVudW1lcmF0ZSBhbGwgdHJhbnNwb3J0cyBjdXJyZW50bHkgY3JlYXRlZCBpbiB0aGUgc3lzdGVtLiI7CitzdGF0aWMgY2hhciBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm9fZG9jW10gPQorICAgICJ2b2lkIHB5X3Bqc3VhLnRyYW5zcG9ydF9nZXRfaW5mbyAiCisgICAgIihweV9wanN1YS5UcmFuc3BvcnRfSUQgaWQsIHB5X3Bqc3VhLlRyYW5zcG9ydF9JbmZvIGluZm8pICIKKyAgICAiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRyYW5zcG9ydHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlX2RvY1tdID0KKyAgICAidm9pZCBweV9wanN1YS50cmFuc3BvcnRfc2V0X2VuYWJsZSAiCisgICAgIihweV9wanN1YS5UcmFuc3BvcnRfSUQgaWQsIGludCBlbmFibGVkKSAiCisgICAgIkRpc2FibGUgYSB0cmFuc3BvcnQgb3IgcmUtZW5hYmxlIGl0LiAiCisgICAgIkJ5IGRlZmF1bHQgdHJhbnNwb3J0IGlzIGFsd2F5cyBlbmFibGVkIGFmdGVyIGl0IGlzIGNyZWF0ZWQuICIKKyAgICAiRGlzYWJsaW5nIGEgdHJhbnNwb3J0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNsb3NlIHRoZSBzb2NrZXQsICIKKyAgICAiaXQgd2lsbCBvbmx5IGRpc2NhcmQgaW5jb21pbmcgbWVzc2FnZXMgYW5kIHByZXZlbnQgdGhlIHRyYW5zcG9ydCAiCisgICAgImZyb20gYmVpbmcgdXNlZCB0byBzZW5kIG91dGdvaW5nIG1lc3NhZ2VzLiI7CitzdGF0aWMgY2hhciBwanN1YV90cmFuc3BvcnRfY2xvc2VfZG9jW10gPQorICAgICJ2b2lkIHB5X3Bqc3VhLnRyYW5zcG9ydF9jbG9zZSAocHlfcGpzdWEuVHJhbnNwb3J0X0lEIGlkLCBpbnQgZm9yY2UpICIKKyAgICAiQ2xvc2UgdGhlIHRyYW5zcG9ydC4gSWYgdHJhbnNwb3J0IGlzIGZvcmNlZnVsbHkgY2xvc2VkLCAiCisgICAgIml0IHdpbGwgYmUgaW1tZWRpYXRlbHkgY2xvc2VkLCBhbmQgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zICIKKyAgICAidGhhdCBhcmUgdXNpbmcgdGhlIHRyYW5zcG9ydCBtYXkgbm90IHRlcm1pbmF0ZSBwcm9wZXJseS4gIgorICAgICJPdGhlcndpc2UsIHRoZSBzeXN0ZW0gd2lsbCB3YWl0IHVudGlsIGFsbCB0cmFuc2FjdGlvbnMgYXJlIGNsb3NlZCAiCisgICAgIndoaWxlIHByZXZlbnRpbmcgbmV3IHVzZXJzIGZyb20gdXNpbmcgdGhlIHRyYW5zcG9ydCwgYW5kIHdpbGwgY2xvc2UgIgorICAgICJ0aGUgdHJhbnNwb3J0IHdoZW4gaXQgaXMgc2FmZSB0byBkbyBzby4iOworCisvKiBFTkQgT0YgTElCIFRSQU5TUE9SVCAqLworCisvKiBMSUIgQUNDT1VOVCAqLworCisKKy8qCisgKiBweV9wanN1YV9hY2NfY29uZmlnX2RlZmF1bHQKKyAqICFtb2RpZmllZCBAIDA1MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19jb25maWdfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBQeU9ial9wanN1YV9hY2NfY29uZmlnICpvYmo7CisgICAgcGpzdWFfYWNjX2NvbmZpZyBjZmc7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqc3VhX2FjY19jb25maWdfZGVmYXVsdCgmY2ZnKTsKKyAgICBvYmogPSAoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyAqKQorCSAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19uZXcoJlB5VHlwX3Bqc3VhX2FjY19jb25maWcsIAorCQkJCSAgICAgTlVMTCwgTlVMTCk7CisgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2dldF9jb3VudAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19nZXRfY291bnQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgaW50IGNvdW50OworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb3VudCA9IHBqc3VhX2FjY19nZXRfY291bnQoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsY291bnQpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2lzX3ZhbGlkCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2lzX3ZhbGlkKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaWQ7CisgICAgaW50IGlzX3ZhbGlkOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpc192YWxpZCA9IHBqc3VhX2FjY19pc192YWxpZChpZCk7CQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaXNfdmFsaWQpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX3NldF9kZWZhdWx0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX3NldF9kZWZhdWx0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaWQ7CisgICAgaW50IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0YXR1cyA9IHBqc3VhX2FjY19zZXRfZGVmYXVsdChpZCk7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2dldF9kZWZhdWx0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2dldF9kZWZhdWx0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaWQ7CisJCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZCA9IHBqc3VhX2FjY19nZXRfZGVmYXVsdCgpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2FkZAorICogIW1vZGlmaWVkIEAgMDUxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2FkZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlzX2RlZmF1bHQ7CisgICAgUHlPYmplY3QgKiBhY09iajsKKyAgICBQeU9ial9wanN1YV9hY2NfY29uZmlnICogYWM7CisgICAgaW50IGFjY19pZDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPaSIsICZhY09iaiwgJmlzX2RlZmF1bHQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICBpZiAoYWNPYmogIT0gUHlfTm9uZSkgeworCXBqc3VhX2FjY19jb25maWcgY2ZnOworCisJcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgICAgICBhYyA9IChQeU9ial9wanN1YV9hY2NfY29uZmlnICopYWNPYmo7CisgICAgICAgIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfZXhwb3J0KCZjZmcsIGFjKTsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfYWNjX2FkZCgmY2ZnLCBpc19kZWZhdWx0LCAmYWNjX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBQSl9FSU5WQUw7CisJYWNjX2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgc3RhdHVzLCBhY2NfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2FkZF9sb2NhbAorICogIW1vZGlmaWVkIEAgMDUxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2FkZF9sb2NhbChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlzX2RlZmF1bHQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgcF9hY2NfaWQ7CisgICAgaW50IHN0YXR1czsKKwkKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJnRpZCwgJmlzX2RlZmF1bHQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfYWRkX2xvY2FsKHRpZCwgaXNfZGVmYXVsdCwgJnBfYWNjX2lkKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBzdGF0dXMsIHBfYWNjX2lkKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19kZWwKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfZGVsKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYWNjX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKwkKKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfZGVsKGFjY19pZCk7CQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19tb2RpZnkKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfbW9kaWZ5KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgUHlPYmplY3QgKiBhY09iajsKKyAgICBQeU9ial9wanN1YV9hY2NfY29uZmlnICogYWM7CisgICAgaW50IGFjY19pZDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpTyIsICZhY2NfaWQsICZhY09iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGFjT2JqICE9IFB5X05vbmUpIHsKKwlwanN1YV9hY2NfY29uZmlnIGNmZzsJCisKKwlwanN1YV9hY2NfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisgICAgICAgIGFjID0gKFB5T2JqX3Bqc3VhX2FjY19jb25maWcgKilhY09iajsKKyAgICAgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19leHBvcnQoJmNmZywgYWMpOworCisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2FjY19tb2RpZnkoYWNjX2lkLCAmY2ZnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBQSl9FSU5WQUw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cyhQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkJUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaXNfb25saW5lOwkKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBzdGF0dXM7CQorCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZhY2NfaWQsICZpc19vbmxpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICBzdGF0dXMgPSBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoYWNjX2lkLCBpc19vbmxpbmUpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1czIKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQkgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaXNfb25saW5lOwkKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBhY3Rpdml0eV9pZDsKKyAgICBjb25zdCBjaGFyICphY3Rpdml0eV90ZXh0OworICAgIHBqcnBpZF9lbGVtZW50IHJwaWQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOwkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWlpcyIsICZhY2NfaWQsICZpc19vbmxpbmUsCisJCQkgICZhY3Rpdml0eV9pZCwgJmFjdGl2aXR5X3RleHQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqX2J6ZXJvKCZycGlkLCBzaXplb2YocnBpZCkpOworICAgIHJwaWQuYWN0aXZpdHkgPSBhY3Rpdml0eV9pZDsKKyAgICBycGlkLm5vdGUgPSBwal9zdHIoKGNoYXIqKWFjdGl2aXR5X3RleHQpOworCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzMihhY2NfaWQsIGlzX29ubGluZSwgJnJwaWQpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb24KKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2Nfc2V0X3JlZ2lzdHJhdGlvbihQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkgICAgICAgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgcmVuZXc7CQorICAgIGludCBhY2NfaWQ7CisgICAgaW50IHN0YXR1czsJCisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmFjY19pZCwgJnJlbmV3KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb24oYWNjX2lkLCByZW5ldyk7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2dldF9pbmZvCisgKiAhbW9kaWZpZWQgQCAwNTEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfZ2V0X2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgYWNjX2lkOworICAgIFB5T2JqX3Bqc3VhX2FjY19pbmZvICogb2JqOworICAgIHBqc3VhX2FjY19pbmZvIGluZm87CisgICAgaW50IHN0YXR1czsJCisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYWNjX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZCwgJmluZm8pOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCW9iaiA9IChQeU9ial9wanN1YV9hY2NfaW5mbyAqKQorCSAgICBQeU9ial9wanN1YV9hY2NfaW5mb19uZXcoJlB5VHlwX3Bqc3VhX2FjY19pbmZvLE5VTEwsIE5VTEwpOworCVB5T2JqX3Bqc3VhX2FjY19pbmZvX2ltcG9ydChvYmosICZpbmZvKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLCBvYmopOworICAgIH0gZWxzZSB7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworICAgIH0KK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fYWNjcworICogIW1vZGlmaWVkIEAgMjQxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV9hY2NzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICAKKyAgICBwanN1YV9hY2NfaWQgaWRbUEpTVUFfTUFYX0FDQ107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIGMgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9lbnVtX2FjY3MoaWQsICZjKTsKKyAgICAKKyAgICBsaXN0ID0gUHlMaXN0X05ldyhjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSAKKyAgICB7CisgICAgICAgIGludCByZXQgPSBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeV9CdWlsZFZhbHVlKCJpIiwgaWRbaV0pKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgCisJeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLGxpc3QpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2VudW1faW5mbworICogIW1vZGlmaWVkIEAgMjQxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2VudW1faW5mbyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgcGpzdWFfYWNjX2luZm8gaW5mb1tQSlNVQV9NQVhfQUNDXTsKKyAgICB1bnNpZ25lZCBjLCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIGMgPSBQSl9BUlJBWV9TSVpFKGluZm8pOworICAgIHN0YXR1cyA9IHBqc3VhX2FjY19lbnVtX2luZm8oaW5mbywgJmMpOworICAgIAorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgUHlPYmpfcGpzdWFfYWNjX2luZm8gKm9iajsKKyAgICAgICAgb2JqID0gKFB5T2JqX3Bqc3VhX2FjY19pbmZvICopCisJICAgICAgUHlPYmpfcGpzdWFfYWNjX2luZm9fbmV3KCZQeVR5cF9wanN1YV9hY2NfaW5mbywgTlVMTCwgTlVMTCk7CisKKwlQeU9ial9wanN1YV9hY2NfaW5mb19pbXBvcnQob2JqLCAmaW5mb1tpXSk7CisKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgKFB5T2JqZWN0ICopb2JqKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLGxpc3QpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2ZpbmRfZm9yX291dGdvaW5nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2ZpbmRfZm9yX291dGdvaW5nKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQlQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgYWNjX2lkOwkKKyAgICBQeU9iamVjdCAqIHVybDsKKyAgICBwal9zdHJfdCBzdHI7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk8iLCAmdXJsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHIucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcodXJsKTsKKyAgICBzdHIuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyh1cmwpKTsKKwkKKyAgICBhY2NfaWQgPSBwanN1YV9hY2NfZmluZF9mb3Jfb3V0Z29pbmcoJnN0cik7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBhY2NfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2ZpbmRfZm9yX2luY29taW5nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2ZpbmRfZm9yX2luY29taW5nKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQlQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgYWNjX2lkOwkKKyAgICBQeU9iamVjdCAqIHRtcE9iajsKKyAgICBQeU9ial9wanNpcF9yeF9kYXRhICogb2JqOworICAgIHBqc2lwX3J4X2RhdGEgKiByZGF0YTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiTyIsICZ0bXBPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0bXBPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9iaiA9IChQeU9ial9wanNpcF9yeF9kYXRhICopdG1wT2JqOworICAgICAgICByZGF0YSA9IG9iai0+cmRhdGE7CisgICAgICAgIGFjY19pZCA9IHBqc3VhX2FjY19maW5kX2Zvcl9pbmNvbWluZyhyZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjX2lkID0gcGpzdWFfYWNjX2ZpbmRfZm9yX2luY29taW5nKE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGFjY19pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfY3JlYXRlX3VhY19jb250YWN0CisgKiAhbW9kaWZpZWQgQCAwNjEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfY3JlYXRlX3VhY19jb250YWN0KFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQkgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgYWNjX2lkOworICAgIFB5T2JqZWN0ICogcE9iajsKKyAgICBQeU9ial9wal9wb29sICogcDsKKyAgICBwal9wb29sX3QgKiBwb29sOworICAgIFB5T2JqZWN0ICogc3RyYzsKKyAgICBwal9zdHJfdCBjb250YWN0OworICAgIFB5T2JqZWN0ICogc3RydTsKKyAgICBwal9zdHJfdCB1cmk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9pTyIsICZwT2JqLCAmYWNjX2lkLCAmc3RydSkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIHAgPSAoUHlPYmpfcGpfcG9vbCAqKXBPYmo7CisgICAgICAgIHBvb2wgPSBwLT5wb29sOyAgICAKKyAgICAgICAgdXJpLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cnUpOworICAgICAgICB1cmkuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhzdHJ1KSk7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2FjY19jcmVhdGVfdWFjX2NvbnRhY3QocG9vbCwgJmNvbnRhY3QsIGFjY19pZCwgJnVyaSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfYWNjX2NyZWF0ZV91YWNfY29udGFjdChOVUxMLCAmY29udGFjdCwgYWNjX2lkLCAmdXJpKTsKKyAgICB9CisgICAgc3RyYyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbnRhY3QucHRyLCBjb250YWN0LnNsZW4pOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPIiwgc3RyYyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfY3JlYXRlX3Vhc19jb250YWN0CisgKiAhbW9kaWZpZWQgQCAwNjEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfY3JlYXRlX3Vhc19jb250YWN0KFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQkgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgYWNjX2lkOwkKKyAgICBQeU9iamVjdCAqIHBPYmo7CisgICAgUHlPYmpfcGpfcG9vbCAqIHA7CisgICAgcGpfcG9vbF90ICogcG9vbDsKKyAgICBQeU9iamVjdCAqIHN0cmM7CisgICAgcGpfc3RyX3QgY29udGFjdDsKKyAgICBQeU9iamVjdCAqIHJPYmo7CisgICAgUHlPYmpfcGpzaXBfcnhfZGF0YSAqIG9ianI7CisgICAgcGpzaXBfcnhfZGF0YSAqIHJkYXRhOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPaU8iLCAmcE9iaiwgJmFjY19pZCwgJnJPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwT2JqICE9IFB5X05vbmUpCisgICAgeworICAgICAgICBwID0gKFB5T2JqX3BqX3Bvb2wgKilwT2JqOworICAgICAgICBwb29sID0gcC0+cG9vbDsKKyAgICB9IGVsc2UgeworCQlwb29sID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHJPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9ianIgPSAoUHlPYmpfcGpzaXBfcnhfZGF0YSAqKXJPYmo7CisgICAgICAgIHJkYXRhID0gb2Jqci0+cmRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmRhdGEgPSBOVUxMOworICAgIH0KKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfY3JlYXRlX3Vhc19jb250YWN0KHBvb2wsICZjb250YWN0LCBhY2NfaWQsIHJkYXRhKTsKKyAgICBzdHJjID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29udGFjdC5wdHIsIGNvbnRhY3Quc2xlbik7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLCBzdHJjKTsKK30KKworc3RhdGljIGNoYXIgcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0X2RvY1tdID0KKyAgICAicHlfcGpzdWEuQWNjX0NvbmZpZyBweV9wanN1YS5hY2NfY29uZmlnX2RlZmF1bHQgKCkgIgorICAgICJDYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhY2NvdW50IGNvbmZpZyB3aXRoIGRlZmF1bHQgdmFsdWVzLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZ2V0X2NvdW50X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmFjY19nZXRfY291bnQgKCkgIgorICAgICJHZXQgbnVtYmVyIG9mIGN1cnJlbnQgYWNjb3VudHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19pc192YWxpZF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5hY2NfaXNfdmFsaWQgKGludCBhY2NfaWQpICAiCisgICAgIkNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgYWNjb3VudCBJRCBpcyB2YWxpZC4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX3NldF9kZWZhdWx0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmFjY19zZXRfZGVmYXVsdCAoaW50IGFjY19pZCkgIgorICAgICJTZXQgZGVmYXVsdCBhY2NvdW50IHRvIGJlIHVzZWQgd2hlbiBpbmNvbWluZyAiCisgICAgImFuZCBvdXRnb2luZyByZXF1ZXN0cyBkb2Vzbid0IG1hdGNoIGFueSBhY2NvdW50cy4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX2dldF9kZWZhdWx0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmFjY19nZXRfZGVmYXVsdCAoKSAiCisgICAgIkdldCBkZWZhdWx0IGFjY291bnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19hZGRfZG9jW10gPQorICAgICJpbnQsIGludCBweV9wanN1YS5hY2NfYWRkIChweV9wanN1YS5BY2NfQ29uZmlnIGNmZywgIgorICAgICJpbnQgaXNfZGVmYXVsdCkgIgorICAgICJBZGQgYSBuZXcgYWNjb3VudCB0byBwanN1YS4gUEpTVUEgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgIgorICAgICIod2l0aCBwanN1YV9pbml0KCkpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19hZGRfbG9jYWxfZG9jW10gPQorICAgICJpbnQsaW50IHB5X3Bqc3VhLmFjY19hZGRfbG9jYWwgKGludCB0aWQsICIKKyAgICAiaW50IGlzX2RlZmF1bHQpICIKKyAgICAiQWRkIGEgbG9jYWwgYWNjb3VudC4gQSBsb2NhbCBhY2NvdW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgIgorICAgICJsb2NhbCBlbmRwb2ludCBpbnN0ZWFkIG9mIGEgc3BlY2lmaWMgdXNlciwgYW5kIGZvciB0aGlzIHJlYXNvbiwgIgorICAgICJhIHRyYW5zcG9ydCBJRCBpcyBuZWVkZWQgdG8gb2J0YWluIHRoZSBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZGVsX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmFjY19kZWwgKGludCBhY2NfaWQpICIKKyAgICAiRGVsZXRlIGFjY291bnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19tb2RpZnlfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuYWNjX21vZGlmeSAoaW50IGFjY19pZCwgcHlfcGpzdWEuQWNjX0NvbmZpZyBjZmcpICIKKyAgICAiTW9kaWZ5IGFjY291bnQgaW5mb3JtYXRpb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1c19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5hY2Nfc2V0X29ubGluZV9zdGF0dXMyKGludCBhY2NfaWQsIGludCBpc19vbmxpbmUpICIKKyAgICAiTW9kaWZ5IGFjY291bnQncyBwcmVzZW5jZSBzdGF0dXMgdG8gYmUgYWR2ZXJ0aXNlZCAiCisgICAgInRvIHJlbW90ZS9wcmVzZW5jZSBzdWJzY3JpYmVycy4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzMl9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5hY2Nfc2V0X29ubGluZV9zdGF0dXMgKGludCBhY2NfaWQsIGludCBpc19vbmxpbmUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCBhY3Rpdml0eV9pZCwgc3RyaW5nIGFjdGl2aXR5X3RleHQpICIKKyAgICAiTW9kaWZ5IGFjY291bnQncyBwcmVzZW5jZSBzdGF0dXMgdG8gYmUgYWR2ZXJ0aXNlZCAiCisgICAgInRvIHJlbW90ZS9wcmVzZW5jZSBzdWJzY3JpYmVycy4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb25fZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuYWNjX3NldF9yZWdpc3RyYXRpb24gKGludCBhY2NfaWQsIGludCByZW5ldykgIgorICAgICJVcGRhdGUgcmVnaXN0cmF0aW9uIG9yIHBlcmZvcm0gdW5yZWdpc3RyYXRpb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19nZXRfaW5mb19kb2NbXSA9CisgICAgInB5X3Bqc3VhLkFjY19JbmZvIHB5X3Bqc3VhLmFjY19nZXRfaW5mbyAoaW50IGFjY19pZCkgIgorICAgICJHZXQgYWNjb3VudCBpbmZvcm1hdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9hY2NzX2RvY1tdID0KKyAgICAiaW50W10gcHlfcGpzdWEuZW51bV9hY2NzICgpICIKKyAgICAiRW51bSBhY2NvdW50cyBhbGwgYWNjb3VudCBpZHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19lbnVtX2luZm9fZG9jW10gPQorICAgICJweV9wanN1YS5BY2NfSW5mb1tdIHB5X3Bqc3VhLmFjY19lbnVtX2luZm8gKCkgIgorICAgICJFbnVtIGFjY291bnRzIGluZm8uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19maW5kX2Zvcl9vdXRnb2luZ19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5hY2NfZmluZF9mb3Jfb3V0Z29pbmcgKHN0cmluZyB1cmwpICIKKyAgICAiVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBmaW5kIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGFjY291bnQgIgorICAgICJ0byB1c2VkIHRvIHJlYWNoIHRvIHRoZSBzcGVjaWZpZWQgVVJMLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZmluZF9mb3JfaW5jb21pbmdfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuYWNjX2ZpbmRfZm9yX2luY29taW5nIChQeU9ial9wanNpcF9yeF9kYXRhIHJkYXRhKSAiCisgICAgIlRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBhY2NvdW50ICIKKyAgICAidG8gYmUgdXNlZCB0byBoYW5kbGUgaW5jb21pbmcgY2FsbHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19jcmVhdGVfdWFjX2NvbnRhY3RfZG9jW10gPQorICAgICJzdHJpbmcgcHlfcGpzdWEuYWNjX2NyZWF0ZV91YWNfY29udGFjdCAoUHlPYmpfcGpfcG9vbCBwb29sLCAiCisgICAgImludCBhY2NfaWQsIHN0cmluZyB1cmkpICIKKyAgICAiQ3JlYXRlIGEgc3VpdGFibGUgVVJJIHRvIGJlIHB1dCBhcyBDb250YWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgIgorICAgICJ0YXJnZXQgVVJJIGZvciB0aGUgc3BlY2lmaWVkIGFjY291bnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19jcmVhdGVfdWFzX2NvbnRhY3RfZG9jW10gPQorICAgICJzdHJpbmcgcHlfcGpzdWEuYWNjX2NyZWF0ZV91YXNfY29udGFjdCAoUHlPYmpfcGpfcG9vbCBwb29sLCAiCisgICAgImludCBhY2NfaWQsIFB5T2JqX3Bqc2lwX3J4X2RhdGEgcmRhdGEpICIKKyAgICAiQ3JlYXRlIGEgc3VpdGFibGUgVVJJIHRvIGJlIHB1dCBhcyBDb250YWN0IGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiAiCisgICAgImluIHRoZSBpbmNvbWluZyByZXF1ZXN0LiI7CisKKy8qIEVORCBPRiBMSUIgQUNDT1VOVCAqLworCisvKiBMSUIgQlVERFkgKi8KKworCisKKy8qCisgKiBweV9wanN1YV9idWRkeV9jb25maWdfZGVmYXVsdAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2J1ZGR5X2NvbmZpZ19kZWZhdWx0KFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCSAgICAgICBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZyAqb2JqOwkKKyAgICBwanN1YV9idWRkeV9jb25maWcgY2ZnOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcGpzdWFfYnVkZHlfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisgICAgb2JqID0gKFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZyAqKSAKKwkgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19uZXcoJlB5VHlwX3Bqc3VhX2J1ZGR5X2NvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX2ltcG9ydChvYmosICZjZmcpOworICAgIAorICAgIHJldHVybiAoUHlPYmplY3QgKilvYmo7Cit9CisKKy8qCisgKiBweV9wanN1YV9nZXRfYnVkZHlfY291bnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9nZXRfYnVkZHlfY291bnQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCByZXQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXQgPSBwanN1YV9nZXRfYnVkZHlfY291bnQoKTsKKwkKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHJldCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9pc192YWxpZAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2J1ZGR5X2lzX3ZhbGlkKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaWQ7CisgICAgaW50IGlzX3ZhbGlkOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXNfdmFsaWQgPSBwanN1YV9idWRkeV9pc192YWxpZChpZCk7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBpc192YWxpZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9lbnVtX2J1ZGRpZXMKKyAqICFtb2RpZmllZCBAIDI0MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2VudW1fYnVkZGllcyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgCisgICAgcGpzdWFfYnVkZHlfaWQgaWRbUEpTVUFfTUFYX0JVRERJRVNdOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaWQpOworICAgIHN0YXR1cyA9IHBqc3VhX2VudW1fYnVkZGllcyhpZCwgJmMpOworICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPIixsaXN0KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2J1ZGR5X2dldF9pbmZvCisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9nZXRfaW5mbyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBidWRkeV9pZDsKKyAgICBQeU9ial9wanN1YV9idWRkeV9pbmZvICogb2JqOworICAgIHBqc3VhX2J1ZGR5X2luZm8gaW5mbzsKKyAgICBpbnQgc3RhdHVzOwkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZidWRkeV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfZ2V0X2luZm8oYnVkZHlfaWQsICZpbmZvKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlvYmogPSAoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqKQorCSAgICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19uZXcoJlB5VHlwX3Bqc3VhX2J1ZGR5X2luZm8sTlVMTCxOVUxMKTsKKwlQeU9ial9wanN1YV9idWRkeV9pbmZvX2ltcG9ydChvYmosICZpbmZvKTsJCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPIiwgb2JqKTsKKyAgICB9IGVsc2UgeworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9hZGQKKyAqICFtb2RpZmllZCBAIDA2MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2J1ZGR5X2FkZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAKKyAgICBQeU9iamVjdCAqIGJjT2JqOworICAgIGludCBidWRkeV9pZDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPIiwgJmJjT2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoYmNPYmogIT0gUHlfTm9uZSkgeworCXBqc3VhX2J1ZGR5X2NvbmZpZyBjZmc7CisJUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICogYmM7CisKKyAgICAgICAgYmMgPSAoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICopYmNPYmo7CisKKwlwanN1YV9idWRkeV9jb25maWdfZGVmYXVsdCgmY2ZnKTsKKyAgICAgICAgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX2V4cG9ydCgmY2ZnLCBiYyk7ICAKKyAgICAKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfYWRkKCZjZmcsICZidWRkeV9pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gUEpfRUlOVkFMOworCWJ1ZGR5X2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgc3RhdHVzLCBidWRkeV9pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9kZWwKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9kZWwoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBidWRkeV9pZDsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmJ1ZGR5X2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisJCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfZGVsKGJ1ZGR5X2lkKTsJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlcyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGJ1ZGR5X2lkOworICAgIGludCBzdGF0dXM7CisgICAgaW50IHN1YnNjcmliZTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmYnVkZHlfaWQsICZzdWJzY3JpYmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKwkKKyAgICBzdGF0dXMgPSBwanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlcyhidWRkeV9pZCwgc3Vic2NyaWJlKTsJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfcHJlc19kdW1wCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcHJlc19kdW1wKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgdmVyYm9zZTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZ2ZXJib3NlKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisJCisgICAgcGpzdWFfcHJlc19kdW1wKHZlcmJvc2UpOwkKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qCisgKiBweV9wanN1YV9pbV9zZW5kCisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9pbV9zZW5kKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBhY2NfaWQ7CisgICAgcGpfc3RyX3QgKiBtaW1lX3R5cGUsIHRtcF9taW1lX3R5cGU7CisgICAgcGpfc3RyX3QgdG8sIGNvbnRlbnQ7CisgICAgUHlPYmplY3QgKiBzdDsKKyAgICBQeU9iamVjdCAqIHNtdDsKKyAgICBQeU9iamVjdCAqIHNjOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICogb21kT2JqOworICAgIFB5T2JqX3Bqc3VhX21zZ19kYXRhICogb21kOworICAgIAorICAgIGludCB1c2VyX2RhdGE7CisgICAgcGpfcG9vbF90ICpwb29sOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpT09PT2kiLCAmYWNjX2lkLCAKKwkJJnN0LCAmc210LCAmc2MsICZvbWRPYmosICZ1c2VyX2RhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzbXQgIT0gUHlfTm9uZSkgeworICAgICAgICBtaW1lX3R5cGUgPSAmdG1wX21pbWVfdHlwZTsKKwl0bXBfbWltZV90eXBlID0gUHlTdHJpbmdfdG9fcGpfc3RyKHNtdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWltZV90eXBlID0gTlVMTDsKKyAgICB9CisgICAgdG8gPSBQeVN0cmluZ190b19wal9zdHIoc3QpOworICAgICAgICBjb250ZW50ID0gUHlTdHJpbmdfdG9fcGpfc3RyKHNjKTsKKworICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkgeworCQkKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworCW1zZ19kYXRhLmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX3RvX3BqX3N0cihvbWQtPmNvbnRlbnRfdHlwZSk7CisJbXNnX2RhdGEubXNnX2JvZHkgPSBQeVN0cmluZ190b19wal9zdHIob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicGpzdWEiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9pbV9zZW5kKGFjY19pZCwgJnRvLCBtaW1lX3R5cGUsIAorCQkJJmNvbnRlbnQsICZtc2dfZGF0YSwgKHZvaWQgKil1c2VyX2RhdGEpOwkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIH0gZWxzZSB7CisJCQorICAgICAgICBzdGF0dXMgPSBwanN1YV9pbV9zZW5kKGFjY19pZCwgJnRvLCBtaW1lX3R5cGUsIAorCQkJJmNvbnRlbnQsIE5VTEwsIE5VTEwpOwkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9pbV90eXBpbmcKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9pbV90eXBpbmcoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGFjY19pZDsKKyAgICBwal9zdHJfdCB0bzsKKyAgICBQeU9iamVjdCAqIHN0OworICAgIGludCBpc190eXBpbmc7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7CisgICAgcGpfcG9vbF90ICogcG9vbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9pTyIsICZhY2NfaWQsICZzdCwgJmlzX3R5cGluZywgJm9tZE9iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCQorICAgIHRvID0gUHlTdHJpbmdfdG9fcGpfc3RyKHN0KTsKKworICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkgeworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilvbWRPYmo7CisJbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfdG9fcGpfc3RyKG9tZC0+Y29udGVudF90eXBlKTsKKwltc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX3RvX3BqX3N0cihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJwanN1YSIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2ltX3R5cGluZyhhY2NfaWQsICZ0bywgaXNfdHlwaW5nLCAmbXNnX2RhdGEpOwkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2ltX3R5cGluZyhhY2NfaWQsICZ0bywgaXNfdHlwaW5nLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKK3N0YXRpYyBjaGFyIHBqc3VhX2J1ZGR5X2NvbmZpZ19kZWZhdWx0X2RvY1tdID0KKyAgICAicHlfcGpzdWEuQnVkZHlfQ29uZmlnIHB5X3Bqc3VhLmJ1ZGR5X2NvbmZpZ19kZWZhdWx0ICgpICIKKyAgICAiU2V0IGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBidWRkeSBjb25maWcuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2dldF9idWRkeV9jb3VudF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5nZXRfYnVkZHlfY291bnQgKCkgIgorICAgICJHZXQgdG90YWwgbnVtYmVyIG9mIGJ1ZGRpZXMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2J1ZGR5X2lzX3ZhbGlkX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmJ1ZGR5X2lzX3ZhbGlkIChpbnQgYnVkZHlfaWQpICIKKyAgICAiQ2hlY2sgaWYgYnVkZHkgSUQgaXMgdmFsaWQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2VudW1fYnVkZGllc19kb2NbXSA9CisgICAgImludFtdIHB5X3Bqc3VhLmVudW1fYnVkZGllcyAoKSAiCisgICAgIkVudW0gYnVkZHkgSURzLiI7CitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9nZXRfaW5mb19kb2NbXSA9CisgICAgInB5X3Bqc3VhLkJ1ZGR5X0luZm8gcHlfcGpzdWEuYnVkZHlfZ2V0X2luZm8gKGludCBidWRkeV9pZCkgIgorICAgICJHZXQgZGV0YWlsZWQgYnVkZHkgaW5mby4iOworc3RhdGljIGNoYXIgcGpzdWFfYnVkZHlfYWRkX2RvY1tdID0KKyAgICAiaW50LGludCBweV9wanN1YS5idWRkeV9hZGQgKHB5X3Bqc3VhLkJ1ZGR5X0NvbmZpZyBjZmcpICIKKyAgICAiQWRkIG5ldyBidWRkeS4iOworc3RhdGljIGNoYXIgcGpzdWFfYnVkZHlfZGVsX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmJ1ZGR5X2RlbCAoaW50IGJ1ZGR5X2lkKSAiCisgICAgIkRlbGV0ZSBidWRkeS4iOworc3RhdGljIGNoYXIgcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXNfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuYnVkZHlfc3Vic2NyaWJlX3ByZXMgKGludCBidWRkeV9pZCwgaW50IHN1YnNjcmliZSkgIgorICAgICJFbmFibGUvZGlzYWJsZSBidWRkeSdzIHByZXNlbmNlIG1vbml0b3JpbmcuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3ByZXNfZHVtcF9kb2NbXSA9CisgICAgInZvaWQgcHlfcGpzdWEucHJlc19kdW1wIChpbnQgdmVyYm9zZSkgIgorICAgICJEdW1wIHByZXNlbmNlIHN1YnNjcmlwdGlvbnMgdG8gbG9nIGZpbGUuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2ltX3NlbmRfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuaW1fc2VuZCAoaW50IGFjY19pZCwgc3RyaW5nIHRvLCBzdHJpbmcgbWltZV90eXBlLCAiCisgICAgInN0cmluZyBjb250ZW50LCBweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSwgaW50IHVzZXJfZGF0YSkgIgorICAgICJTZW5kIGluc3RhbnQgbWVzc2FnaW5nIG91dHNpZGUgZGlhbG9nLCB1c2luZyB0aGUgc3BlY2lmaWVkIGFjY291bnQgIgorICAgICJmb3Igcm91dGUgc2V0IGFuZCBhdXRoZW50aWNhdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfaW1fdHlwaW5nX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmltX3R5cGluZyAoaW50IGFjY19pZCwgc3RyaW5nIHRvLCBpbnQgaXNfdHlwaW5nLCAiCisgICAgInB5X3Bqc3VhLk1zZ19EYXRhIG1zZ19kYXRhKSAiCisgICAgIlNlbmQgdHlwaW5nIGluZGljYXRpb24gb3V0c2lkZSBkaWFsb2cuIjsKKworLyogRU5EIE9GIExJQiBCVUREWSAqLworCisvKiBMSUIgTUVESUEgKi8KKworCisKKy8qCisgKiBQeU9ial9wanN1YV9jb2RlY19pbmZvCisgKiBDb2RlYyBJbmZvCisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgCisgICAgUHlPYmplY3QgKiBjb2RlY19pZDsKKyAgICBwal91aW50OF90IHByaW9yaXR5OyAgICAKKyAgICBjaGFyIGJ1Zl9bMzJdOworfSBQeU9ial9wanN1YV9jb2RlY19pbmZvOworCisKKy8qCisgKiBjb2RlY19pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBjb2RlY19pbmZvIGZyb20gbWVtb3J5CisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIHZvaWQgY29kZWNfaW5mb19kZWFsbG9jKFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8qIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb2RlY19pZCk7ICAgIAorICAgIAorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogY29kZWNfaW5mb19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBjb2RlY19pbmZvIG9iamVjdAorICogIW1vZGlmaWVkIEAgMDcxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIGNvZGVjX2luZm9fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9jb2RlY19pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9jb2RlY19pbmZvICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNlbGYtPmNvZGVjX2lkID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5jb2RlY19pZCA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSAgICAgICAgCisJCisKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qCisgKiBjb2RlY19pbmZvX21lbWJlcnMKKyAqICFtb2RpZmllZCBAIDA3MTIwNgorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgY29kZWNfaW5mb19tZW1iZXJzW10gPQoreyAgICAKKyAgICB7CisgICAgICAgICJjb2RlY19pZCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb2RlY19pbmZvLCBjb2RlY19pZCksIDAsCisgICAgICAgICJDb2RlYyB1bmlxdWUgaWRlbnRpZmljYXRpb24uIiAgICAgICAgCisgICAgfSwKKyAgICAKKyAgICB7CisgICAgICAgICJwcmlvcml0eSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29kZWNfaW5mbywgcHJpb3JpdHkpLCAwLAorICAgICAgICAiQ29kZWMgcHJpb3JpdHkgKGludGVnZXIgMC0yNTUpLiIKKyAgICB9LAorICAgIAorICAgIAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV9jb2RlY19pbmZvCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfY29kZWNfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5Db2RlY19JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9jb2RlY19pbmZvKSwgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKWNvZGVjX2luZm9fZGVhbGxvYywvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDb2RlYyBJbmZvIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvZGVjX2luZm9fbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvZGVjX2luZm9fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvCisgKiBDb25mIFBvcnQgSW5mbworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICAKKyAgICBpbnQgIHNsb3RfaWQ7CisgICAgUHlPYmplY3QgKiAgbmFtZTsKKyAgICB1bnNpZ25lZCAgY2xvY2tfcmF0ZTsKKyAgICB1bnNpZ25lZCAgY2hhbm5lbF9jb3VudDsKKyAgICB1bnNpZ25lZCAgc2FtcGxlc19wZXJfZnJhbWU7CisgICAgdW5zaWduZWQgIGJpdHNfcGVyX3NhbXBsZTsKKyAgICBQeUxpc3RPYmplY3QgKiBsaXN0ZW5lcnM7CisKK30gUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm87CisKKworLyoKKyAqIGNvbmZfcG9ydF9pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBjb25mX3BvcnRfaW5mbyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBjb25mX3BvcnRfaW5mb19kZWFsbG9jKFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+bmFtZSk7ICAgIAorICAgIFB5X1hERUNSRUYoc2VsZi0+bGlzdGVuZXJzKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworLyoKKyAqIGNvbmZfcG9ydF9pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIGNvbmZfcG9ydF9pbmZvIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBjb25mX3BvcnRfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpCisgICAgeworICAgICAgICBzZWxmLT5uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5uYW1lID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9ICAgICAgICAKKwkKKwlzZWxmLT5saXN0ZW5lcnMgPSAoUHlMaXN0T2JqZWN0ICopUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKHNlbGYtPmxpc3RlbmVycyA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworLyoKKyAqIGNvbmZfcG9ydF9pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGNvbmZfcG9ydF9pbmZvX21lbWJlcnNbXSA9Cit7ICAgCisgICAgeworICAgICAgICAic2xvdF9pZCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIHNsb3RfaWQpLCAwLAorICAgICAgICAiQ29uZmVyZW5jZSBwb3J0IG51bWJlci4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJuYW1lIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvLCBuYW1lKSwgMCwKKyAgICAgICAgIlBvcnQgbmFtZSIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAiY2xvY2tfcmF0ZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIGNsb2NrX3JhdGUpLCAwLAorICAgICAgICAiQ2xvY2sgcmF0ZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNoYW5uZWxfY291bnQiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvLCBjaGFubmVsX2NvdW50KSwgMCwKKyAgICAgICAgIk51bWJlciBvZiBjaGFubmVscy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJzYW1wbGVzX3Blcl9mcmFtZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIHNhbXBsZXNfcGVyX2ZyYW1lKSwgMCwKKyAgICAgICAgIlNhbXBsZXMgcGVyIGZyYW1lICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImJpdHNfcGVyX3NhbXBsZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIGJpdHNfcGVyX3NhbXBsZSksIDAsCisgICAgICAgICJCaXRzIHBlciBzYW1wbGUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJsaXN0ZW5lcnMiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIGxpc3RlbmVycyksIDAsCisgICAgICAgICJBcnJheSBvZiBsaXN0ZW5lcnMgKGluIG90aGVyIHdvcmRzLCBwb3J0cyB3aGVyZSB0aGlzIHBvcnQgIgorCSJpcyB0cmFuc21pdHRpbmcgdG8iCisgICAgfSwKKyAgICAKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfY29uZl9wb3J0X2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5Db25mX1BvcnRfSW5mbyIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpY29uZl9wb3J0X2luZm9fZGVhbGxvYywvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDb25mIFBvcnQgSW5mbyBvYmplY3RzIiwgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBjb25mX3BvcnRfaW5mb19tZW1iZXJzLCAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY29uZl9wb3J0X2luZm9fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLyoKKyAqIFB5T2JqX3BqbWVkaWFfcG9ydAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHBqbWVkaWFfcG9ydCAqIHBvcnQ7Cit9IFB5T2JqX3BqbWVkaWFfcG9ydDsKKworCisvKgorICogUHlUeXBfcGptZWRpYV9wb3J0CisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGptZWRpYV9wb3J0ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5QSk1lZGlhX1BvcnQiLCAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGptZWRpYV9wb3J0KSwgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCisgICAgInBqbWVkaWFfcG9ydCBvYmplY3RzIiwgICAgICAgLyogdHBfZG9jICovCisKK307CisKKy8qCisgKiBQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbworICogUEpNZWRpYSBTbmQgRGV2IEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgCisgICAgCisgICAgdW5zaWduZWQgIGlucHV0X2NvdW50OworICAgIHVuc2lnbmVkICBvdXRwdXRfY291bnQ7CisgICAgdW5zaWduZWQgIGRlZmF1bHRfc2FtcGxlc19wZXJfc2VjOyAgICAKKyAgICBQeU9iamVjdCAqIG5hbWU7CisKK30gUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm87CisKKworLyoKKyAqIHBqbWVkaWFfc25kX2Rldl9pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBwam1lZGlhX3NuZF9kZXZfaW5mbyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBwam1lZGlhX3NuZF9kZXZfaW5mb19kZWFsbG9jKFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+bmFtZSk7ICAgICAgICAKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworLyoKKyAqIHBqbWVkaWFfc25kX2Rldl9pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIHBqbWVkaWFfc25kX2Rldl9pbmZvIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBwam1lZGlhX3NuZF9kZXZfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpCisgICAgeworICAgICAgICBzZWxmLT5uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5uYW1lID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9ICAgICAgICAKKwkKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qCisgKiBwam1lZGlhX3NuZF9kZXZfaW5mb19tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBwam1lZGlhX3NuZF9kZXZfaW5mb19tZW1iZXJzW10gPQoreyAgIAorICAgIAorICAgIHsKKyAgICAgICAgIm5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8sIG5hbWUpLCAwLAorICAgICAgICAiRGV2aWNlIG5hbWUiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgImlucHV0X2NvdW50IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbywgaW5wdXRfY291bnQpLCAwLAorICAgICAgICAiTWF4IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm91dHB1dF9jb3VudCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8sIG91dHB1dF9jb3VudCksIDAsCisgICAgICAgICJNYXggbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImRlZmF1bHRfc2FtcGxlc19wZXJfc2VjIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbywgZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWMpLCAwLAorICAgICAgICAiRGVmYXVsdCBzYW1wbGluZyByYXRlLiIKKyAgICB9LAorICAgIAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wam1lZGlhX3NuZF9kZXZfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqbWVkaWFfc25kX2Rldl9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLlBKTWVkaWFfU25kX0Rldl9JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3Rvcilwam1lZGlhX3NuZF9kZXZfaW5mb19kZWFsbG9jLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIlBKTWVkaWEgU25kIERldiBJbmZvIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqbWVkaWFfc25kX2Rldl9pbmZvX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBwam1lZGlhX3NuZF9kZXZfaW5mb19uZXcsICAgICAgICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisvKgorICogUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvCisgKiBQSk1lZGlhIENvZGVjIFBhcmFtIEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgCisgICAgdW5zaWduZWQgIGNsb2NrX3JhdGU7CisgICAgdW5zaWduZWQgIGNoYW5uZWxfY250OworICAgIHBqX3VpbnQzMl90IGF2Z19icHM7CisgICAgcGpfdWludDE2X3QgZnJtX3B0aW1lOworICAgIHBqX3VpbnQ4X3QgIHBjbV9iaXRzX3Blcl9zYW1wbGU7CisgICAgcGpfdWludDhfdCAgcHQ7CQorCit9IFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbzsKKworCisKKy8qCisgKiBwam1lZGlhX2NvZGVjX3BhcmFtX2luZm9fbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvX21lbWJlcnNbXSA9Cit7ICAgCisgICAgCisgICAgeworICAgICAgICAiY2xvY2tfcmF0ZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBjbG9ja19yYXRlKSwgMCwKKyAgICAgICAgIlNhbXBsaW5nIHJhdGUgaW4gSHoiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjaGFubmVsX2NudCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBjaGFubmVsX2NudCksIDAsCisgICAgICAgICJDaGFubmVsIGNvdW50IgorICAgIH0sCisgICAgeworICAgICAgICAiYXZnX2JwcyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBhdmdfYnBzKSwgMCwKKyAgICAgICAgIkF2ZXJhZ2UgYmFuZHdpZHRoIGluIGJpdHMvc2VjIgorICAgIH0sCisgICAgeworICAgICAgICAiZnJtX3B0aW1lIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8sIGZybV9wdGltZSksIDAsCisgICAgICAgICJCYXNlIGZyYW1lIHB0aW1lIGluIG1zZWMuIgorICAgIH0sCisgICAgeworICAgICAgICAicGNtX2JpdHNfcGVyX3NhbXBsZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBwY21fYml0c19wZXJfc2FtcGxlKSwgMCwKKyAgICAgICAgIkJpdHMvc2FtcGxlIGluIHRoZSBQQ00gc2lkZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB0IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8sIHB0KSwgMCwKKyAgICAgICAgIlBheWxvYWQgdHlwZSIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8gPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbV9JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJQSk1lZGlhIENvZGVjIFBhcmFtIEluZm8gb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIAorCit9OworCisvKgorICogUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nCisgKiBQSk1lZGlhIENvZGVjIFBhcmFtIFNldHRpbmcKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgcGpfdWludDhfdCAgZnJtX3Blcl9wa3Q7IAorICAgIHVuc2lnbmVkICAgIHZhZDsKKyAgICB1bnNpZ25lZCAgICBjbmc7CisgICAgdW5zaWduZWQgICAgcGVuaDsKKyAgICB1bnNpZ25lZCAgICBwbGM7CisgICAgdW5zaWduZWQgICAgcmVzZXJ2ZWQ7CisgICAgcGpfdWludDhfdCAgZW5jX2ZtdHBfbW9kZTsKKyAgICBwal91aW50OF90ICBkZWNfZm10cF9tb2RlOyAKKworfSBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmc7CisKKworCisvKgorICogcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIHBqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZ19tZW1iZXJzW10gPQoreyAgIAorICAgIAorICAgIHsKKyAgICAgICAgImZybV9wZXJfcGt0IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIGZybV9wZXJfcGt0KSwgMCwKKyAgICAgICAgIk51bWJlciBvZiBmcmFtZXMgcGVyIHBhY2tldCIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInZhZCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLCB2YWQpLCAwLAorICAgICAgICAiVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IiCisgICAgfSwKKyAgICB7CisgICAgICAgICJwZW5oIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIHBlbmgpLCAwLAorICAgICAgICAiUGVyY2VwdHVhbCBFbmhhbmNlbWVudCIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInBsYyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLCBwbGMpLCAwLAorICAgICAgICAiUGFja2V0IGxvc3MgY29uY2VhbG1lbnQiCisgICAgfSwKKyAgICB7CisgICAgICAgICJyZXNlcnZlZCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLCByZXNlcnZlZCksIDAsCisgICAgICAgICJSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvIgorICAgIH0sCisgICAgeworICAgICAgICAiY25nIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIGNuZyksIDAsCisgICAgICAgICJDb21mb3J0IE5vaXNlIEdlbmVyYXRvciIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVuY19mbXRwX21vZGUiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZywgZW5jX2ZtdHBfbW9kZSksIDAsCisgICAgICAgICJNb2RlIHBhcmFtIGluIGZtdHAgKGRlZjowKSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImRlY19mbXRwX21vZGUiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZywgZGVjX2ZtdHBfbW9kZSksIDAsCisgICAgICAgICJNb2RlIHBhcmFtIGluIGZtdHAgKGRlZjowKSIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbV9TZXR0aW5nIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJQSk1lZGlhIENvZGVjIFBhcmFtIFNldHRpbmcgb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIAorCit9OworCisvKgorICogUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbQorICogUEpNZWRpYSBDb2RlYyBQYXJhbQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICAKKyAgICBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8gKiBpbmZvOworICAgIFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZyAqIHNldHRpbmc7CisKK30gUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbTsKKworCisvKgorICogcGptZWRpYV9jb2RlY19wYXJhbV9kZWFsbG9jCisgKiBkZWxldGVzIGEgcGptZWRpYV9jb2RlY19wYXJhbSBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBwam1lZGlhX2NvZGVjX3BhcmFtX2RlYWxsb2MoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmluZm8pOyAgICAgICAgCisgICAgUHlfWERFQ1JFRihzZWxmLT5zZXR0aW5nKTsgICAgICAgIAorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogcGptZWRpYV9jb2RlY19wYXJhbV9uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBwam1lZGlhX2NvZGVjX3BhcmFtIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBwam1lZGlhX2NvZGVjX3BhcmFtX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpCisgICAgeworICAgICAgICBzZWxmLT5pbmZvID0gKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbyAqKQorCSAgICBQeVR5cGVfR2VuZXJpY05ldygmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKHNlbGYtPmluZm8gPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gICAgICAgIAorCXNlbGYtPnNldHRpbmcgPSAoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nICopCisJICAgIFB5VHlwZV9HZW5lcmljTmV3KCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc2VsZi0+c2V0dGluZyA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogcGptZWRpYV9jb2RlY19wYXJhbV9tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBwam1lZGlhX2NvZGVjX3BhcmFtX21lbWJlcnNbXSA9Cit7ICAgCisgICAgCisgICAgeworICAgICAgICAiaW5mbyIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtLCBpbmZvKSwgMCwKKyAgICAgICAgIlRoZSAnaW5mbycgcGFydCBvZiBjb2RlYyBwYXJhbSBkZXNjcmliZXMgdGhlIGNhcGFiaWxpdHkgb2YgdGhlIGNvZGVjLCIKKyAgICAgICAgIiBhbmQgdGhlIHZhbHVlIHNob3VsZCBOT1QgYmUgY2hhbmdlZCBieSBhcHBsaWNhdGlvbi4iICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgInNldHRpbmciLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSwgc2V0dGluZyksIDAsIAorICAgICAgICAiVGhlICdzZXR0aW5nJyBwYXJ0IG9mIGNvZGVjIHBhcmFtIGRlc2NyaWJlcyB2YXJpb3VzIHNldHRpbmdzIHRvIGJlICIKKyAgICAgICAgImFwcGxpZWQgdG8gdGhlIGNvZGVjLiBXaGVuIHRoZSBjb2RlYyBwYXJhbSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgIgorICAgICAgICAiY29kZWMgb3IgY29kZWMgZmFjdG9yeSwgdGhlIHZhbHVlcyBvZiB0aGVzZSB3aWxsIGJlIGZpbGxlZCBieSAiCisgICAgICAgICJ0aGUgY2FwYWJpbGl0eSBvZiB0aGUgY29kZWMuIEFueSBmZWF0dXJlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgIgorICAgICAgICAidGhlIGNvZGVjIChlLmcuIHZhZCBvciBwbGMpIHdpbGwgYmUgdHVybmVkIG9uLCBzbyB0aGF0IGFwcGxpY2F0aW9uICIKKyAgICAgICAgImNhbiBxdWVyeSB3aGljaCBjYXBhYmlsaXRpZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuICIKKyAgICAgICAgIkFwcGxpY2F0aW9uIG1heSBjaGFuZ2UgdGhlIHNldHRpbmdzIGhlcmUgYmVmb3JlIGluc3RhbnRpYXRpbmcgIgorICAgICAgICAidGhlIGNvZGVjL3N0cmVhbS4iICAgICAgICAKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbSA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5QSk1lZGlhX0NvZGVjX1BhcmFtIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtKSwgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKXBqbWVkaWFfY29kZWNfcGFyYW1fZGVhbGxvYywvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJQSk1lZGlhIENvZGVjIFBhcmFtIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW1fbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW1fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLyoKKyAqIHB5X3Bqc3VhX2NvbmZfZ2V0X21heF9wb3J0cworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NvbmZfZ2V0X21heF9wb3J0cworKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgcmV0OworICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gcGpzdWFfY29uZl9nZXRfbWF4X3BvcnRzKCk7CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCByZXQpOworfQorCisvKgorICogcHlfcGpzdWFfY29uZl9nZXRfYWN0aXZlX3BvcnRzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9nZXRfYWN0aXZlX3BvcnRzCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCByZXQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldCA9IHBqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0cygpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcmV0KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fY29uZl9wb3J0cworICogIW1vZGlmaWVkIEAgMjQxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV9jb25mX3BvcnRzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICAKKyAgICBwanN1YV9jb25mX3BvcnRfaWQgaWRbUEpTVUFfTUFYX0NPTkZfUE9SVFNdOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBjID0gUEpfQVJSQVlfU0laRShpZCk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9jb25mX3BvcnRzKGlkLCAmYyk7CisgICAgCisgICAgbGlzdCA9IFB5TGlzdF9OZXcoYyk7CisgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykgCisgICAgeworICAgICAgICBpbnQgcmV0ID0gUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIAorCXsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLGxpc3QpOworfQorCisvKgorICogcHlfcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8gKiBvYmo7CisgICAgcGpzdWFfY29uZl9wb3J0X2luZm8gaW5mbzsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2dldF9wb3J0X2luZm8oaWQsICZpbmZvKTsKKyAgICBvYmogPSAoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8gKiljb25mX3BvcnRfaW5mb19uZXcKKwkgICAgKCZQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbyxOVUxMLE5VTEwpOworICAgIG9iai0+Yml0c19wZXJfc2FtcGxlID0gaW5mby5iaXRzX3Blcl9zYW1wbGU7CisgICAgb2JqLT5jaGFubmVsX2NvdW50ID0gaW5mby5iaXRzX3Blcl9zYW1wbGU7CisgICAgb2JqLT5jbG9ja19yYXRlID0gaW5mby5jbG9ja19yYXRlOworICAgIG9iai0+bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGluZm8ubmFtZS5wdHIsIGluZm8ubmFtZS5zbGVuKTsKKyAgICBvYmotPnNhbXBsZXNfcGVyX2ZyYW1lID0gaW5mby5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBvYmotPnNsb3RfaWQgPSBpbmZvLnNsb3RfaWQ7CisgICAgCisgICAgb2JqLT5saXN0ZW5lcnMgPSAoUHlMaXN0T2JqZWN0ICopUHlMaXN0X05ldyhpbmZvLmxpc3RlbmVyX2NudCk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm8ubGlzdGVuZXJfY250OyBpKyspIHsKKwlQeU9iamVjdCAqIGl0ZW0gPSBQeV9CdWlsZFZhbHVlKCJpIixpbmZvLmxpc3RlbmVyc1tpXSk7CisJUHlMaXN0X1NldEl0ZW0oKFB5T2JqZWN0ICopb2JqLT5saXN0ZW5lcnMsIGksIGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyIsIG9iaik7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2FkZF9wb3J0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9hZGRfcG9ydAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHBfaWQ7CisgICAgUHlPYmplY3QgKiBvcG9ydE9iajsKKyAgICBQeU9ial9wam1lZGlhX3BvcnQgKiBvcG9ydDsKKyAgICBwam1lZGlhX3BvcnQgKiBwb3J0OworICAgIFB5T2JqZWN0ICogb3Bvb2xPYmo7CisgICAgUHlPYmpfcGpfcG9vbCAqIG9wb29sOworICAgIHBqX3Bvb2xfdCAqIHBvb2w7CisgICAgCisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPTyIsICZvcG9vbE9iaiwgJm9wb3J0T2JqKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob3Bvb2xPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9wb29sID0gKFB5T2JqX3BqX3Bvb2wgKilvcG9vbE9iajsKKwkJcG9vbCA9IG9wb29sLT5wb29sOworICAgIH0gZWxzZSB7CisgICAgICAgb3Bvb2wgPSBOVUxMOworICAgICAgIHBvb2wgPSBOVUxMOworICAgIH0KKyAgICBpZiAob3BvcnRPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9wb3J0ID0gKFB5T2JqX3BqbWVkaWFfcG9ydCAqKW9wb3J0T2JqOworCQlwb3J0ID0gb3BvcnQtPnBvcnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BvcnQgPSBOVUxMOworICAgICAgICBwb3J0ID0gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2FkZF9wb3J0KHBvb2wsIHBvcnQsICZwX2lkKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBzdGF0dXMsIHBfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfY29uZl9yZW1vdmVfcG9ydAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NvbmZfcmVtb3ZlX3BvcnQKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBpZDsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX3JlbW92ZV9wb3J0KGlkKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2Nvbm5lY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2Nvbm5lY3QKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBzb3VyY2UsIHNpbms7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZzb3VyY2UsICZzaW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9jb25uZWN0KHNvdXJjZSwgc2luayk7CisgICAgCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY29uZl9kaXNjb25uZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9kaXNjb25uZWN0CisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc291cmNlLCBzaW5rOworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmc291cmNlLCAmc2luaykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX2NvbmZfZGlzY29ubmVjdChzb3VyY2UsIHNpbmspOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3BsYXllcl9jcmVhdGUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wbGF5ZXJfY3JlYXRlCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgaW50IG9wdGlvbnM7CisgICAgUHlPYmplY3QgKiBmaWxlbmFtZTsKKyAgICBwal9zdHJfdCBzdHI7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPaSIsICZmaWxlbmFtZSwgJm9wdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICBzdHIucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoZmlsZW5hbWUpOworICAgIHN0ci5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVuYW1lKSk7CisgICAgc3RhdHVzID0gcGpzdWFfcGxheWVyX2NyZWF0ZSgmc3RyLCBvcHRpb25zLCAmaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgCisgICAgaW50IGlkLCBwb3J0X2lkOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBwb3J0X2lkID0gcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQoaWQpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcG9ydF9pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9wbGF5ZXJfc2V0X3BvcworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3BsYXllcl9zZXRfcG9zCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgcGpfdWludDMyX3Qgc2FtcGxlczsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlJIiwgJmlkLCAmc2FtcGxlcykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX3BsYXllcl9zZXRfcG9zKGlkLCBzYW1wbGVzKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9wbGF5ZXJfZGVzdHJveQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3BsYXllcl9kZXN0cm95CisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfcGxheWVyX2Rlc3Ryb3koaWQpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3JlY29yZGVyX2NyZWF0ZQorICogIW1vZGlmaWVkIEAgMjYxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcmVjb3JkZXJfY3JlYXRlCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgcF9pZDsKKyAgICBpbnQgb3B0aW9uczsKKyAgICBpbnQgbWF4X3NpemU7CisgICAgUHlPYmplY3QgKiBmaWxlbmFtZTsKKyAgICBwal9zdHJfdCBzdHI7CisgICAgUHlPYmplY3QgKiBlbmNfcGFyYW07CisgICAgcGpfc3RyX3Qgc3RycGFyYW07CisgICAgaW50IGVuY190eXBlOworICAgIAorICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiT2lPaWkiLCAmZmlsZW5hbWUsIAorCQkmZW5jX3R5cGUsICZlbmNfcGFyYW0sICZtYXhfc2l6ZSwgJm9wdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICBzdHIucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoZmlsZW5hbWUpOworICAgIHN0ci5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVuYW1lKSk7CisgICAgaWYgKGVuY19wYXJhbSAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgc3RycGFyYW0ucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoZW5jX3BhcmFtKTsKKyAgICAgICAgc3RycGFyYW0uc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhlbmNfcGFyYW0pKTsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfcmVjb3JkZXJfY3JlYXRlCisJCSgmc3RyLCBlbmNfdHlwZSwgTlVMTCwgbWF4X3NpemUsIG9wdGlvbnMsICZwX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBwanN1YV9yZWNvcmRlcl9jcmVhdGUKKwkJKCZzdHIsIGVuY190eXBlLCBOVUxMLCBtYXhfc2l6ZSwgb3B0aW9ucywgJnBfaWQpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBzdGF0dXMsIHBfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnQKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIAorICAgIGludCBpZCwgcG9ydF9pZDsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgcG9ydF9pZCA9IHBqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnQoaWQpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcG9ydF9pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9yZWNvcmRlcl9kZXN0cm95CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcmVjb3JkZXJfZGVzdHJveQorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGlkOworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX3JlY29yZGVyX2Rlc3Ryb3koaWQpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fc25kX2RldnMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9lbnVtX3NuZF9kZXZzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICAKKyAgICBwam1lZGlhX3NuZF9kZXZfaW5mbyBpbmZvW1NORF9ERVZfTlVNXTsKKyAgICB1bnNpZ25lZCBjLCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaW5mbyk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9zbmRfZGV2cyhpbmZvLCAmYyk7CisgICAgCisgICAgbGlzdCA9IFB5TGlzdF9OZXcoYyk7CisgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykgCisgICAgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBpbnQgajsKKyAgICAgICAgY2hhciAqIHN0cjsKKwkKKyAgICAgICAgUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8gKiBvYmo7CisgICAgICAgIG9iaiA9IChQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbyAqKXBqbWVkaWFfc25kX2Rldl9pbmZvX25ldworCSAgICAoJlB5VHlwX3BqbWVkaWFfc25kX2Rldl9pbmZvLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgb2JqLT5kZWZhdWx0X3NhbXBsZXNfcGVyX3NlYyA9IGluZm9baV0uZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWM7CisgICAgICAgIG9iai0+aW5wdXRfY291bnQgPSBpbmZvW2ldLmlucHV0X2NvdW50OworICAgICAgICBvYmotPm91dHB1dF9jb3VudCA9IGluZm9baV0ub3V0cHV0X2NvdW50OworICAgICAgICBzdHIgPSAoY2hhciAqKW1hbGxvYyhTTkRfTkFNRV9MRU4gKiBzaXplb2YoY2hhcikpOworICAgICAgICBtZW1zZXQoc3RyLCAwLCBTTkRfTkFNRV9MRU4pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU05EX05BTUVfTEVOOyBqKyspCisJeworICAgICAgICAgICAgc3RyW2pdID0gaW5mb1tpXS5uYW1lW2pdOworCX0KKyAgICAgICAgb2JqLT5uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBTTkRfTkFNRV9MRU4pOworICAgICAgICBmcmVlKHN0cik7CisgICAgICAgIHJldCA9IFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIChQeU9iamVjdCAqKW9iaik7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIAorCXsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8iLGxpc3QpOworfQorCisvKgorICogcHlfcGpzdWFfZ2V0X3NuZF9kZXYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9nZXRfc25kX2RldgorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhcHR1cmVfZGV2LCBwbGF5YmFja19kZXY7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfZ2V0X3NuZF9kZXYoJmNhcHR1cmVfZGV2LCAmcGxheWJhY2tfZGV2KTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3NldF9zbmRfZGV2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfc2V0X3NuZF9kZXYKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2OworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmY2FwdHVyZV9kZXYsICZwbGF5YmFja19kZXYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9zZXRfc25kX2RldihjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2KTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9zZXRfbnVsbF9zbmRfZGV2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfc2V0X251bGxfc25kX2RldgorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgCisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfc2V0X251bGxfc25kX2RldigpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3NldF9ub19zbmRfZGV2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfc2V0X25vX3NuZF9kZXYKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIAorICAgIFB5T2JqX3BqbWVkaWFfcG9ydCAqIG9iajsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgIAorICAgIG9iaiA9IChQeU9ial9wam1lZGlhX3BvcnQgKilQeVR5cGVfR2VuZXJpY05ldworCSgmUHlUeXBfcGptZWRpYV9wb3J0LCBOVUxMLCBOVUxMKTsKKyAgICBvYmotPnBvcnQgPSBwanN1YV9zZXRfbm9fc25kX2RldigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPIiwgb2JqKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3NldF9lYworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3NldF9lYworKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IG9wdGlvbnM7CisgICAgaW50IHRhaWxfbXM7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZ0YWlsX21zLCAmb3B0aW9ucykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX3NldF9lYyh0YWlsX21zLCBvcHRpb25zKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9nZXRfZWNfdGFpbAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2dldF9lY190YWlsCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICAKKyAgICBpbnQgc3RhdHVzOwkKKyAgICB1bnNpZ25lZCBwX3RhaWxfbXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9nZXRfZWNfdGFpbCgmcF90YWlsX21zKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBfdGFpbF9tcyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9lbnVtX2NvZGVjcworICogIW1vZGlmaWVkIEAgMjYxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV9jb2RlY3MoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIAorICAgIHBqc3VhX2NvZGVjX2luZm8gaW5mb1tQSk1FRElBX0NPREVDX01HUl9NQVhfQ09ERUNTXTsKKyAgICB1bnNpZ25lZCBjLCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaW5mbyk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9jb2RlY3MoaW5mbywgJmMpOworICAgIAorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIAorICAgIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaW50IGo7CisgICAgICAgIFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8gKiBvYmo7CisgICAgICAgIG9iaiA9IChQeU9ial9wanN1YV9jb2RlY19pbmZvICopY29kZWNfaW5mb19uZXcKKwkgICAgKCZQeVR5cF9wanN1YV9jb2RlY19pbmZvLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgb2JqLT5jb2RlY19pZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplCisJICAgIChpbmZvW2ldLmNvZGVjX2lkLnB0ciwgaW5mb1tpXS5jb2RlY19pZC5zbGVuKTsKKyAgICAgICAgb2JqLT5wcmlvcml0eSA9IGluZm9baV0ucHJpb3JpdHk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorICAgICAgICB7CSAgICAKKyAgICAgICAgICAgICBvYmotPmJ1Zl9bal0gPSBpbmZvW2ldLmJ1Zl9bal07CisgICAgICAgIH0JCisgICAgICAgIHJldCA9IFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIChQeU9iamVjdCAqKW9iaik7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CQorICAgIH0KKyAgICAKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPIixsaXN0KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eQorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgCisgICAgaW50IHN0YXR1czsJCisgICAgUHlPYmplY3QgKiBpZDsKKyAgICBwal9zdHJfdCBzdHI7CisgICAgcGpfdWludDhfdCBwcmlvcml0eTsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9CIiwgJmlkLCAmcHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICBzdHIucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaWQpOworICAgIHN0ci5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKGlkKSk7CisgICAgc3RhdHVzID0gcGpzdWFfY29kZWNfc2V0X3ByaW9yaXR5KCZzdHIsIHByaW9yaXR5KTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb2RlY19nZXRfcGFyYW0KKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb2RlY19nZXRfcGFyYW0KKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIAorICAgIGludCBzdGF0dXM7CQorICAgIFB5T2JqZWN0ICogaWQ7CisgICAgcGpfc3RyX3Qgc3RyOworICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisgICAgUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSAqb2JqOworICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiTyIsICZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIHN0ci5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhpZCk7CisgICAgc3RyLnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcoaWQpKTsKKyAgICBzdGF0dXMgPSBwanN1YV9jb2RlY19nZXRfcGFyYW0oJnN0ciwgJnBhcmFtKTsKKyAgICBvYmogPSAoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSAqKXBqbWVkaWFfY29kZWNfcGFyYW1fbmV3CisJKCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtLCBOVUxMLCBOVUxMKTsKKyAgICBvYmotPmluZm8tPmF2Z19icHMgPSBwYXJhbS5pbmZvLmF2Z19icHM7CisgICAgb2JqLT5pbmZvLT5jaGFubmVsX2NudCA9IHBhcmFtLmluZm8uY2hhbm5lbF9jbnQ7CisgICAgb2JqLT5pbmZvLT5jbG9ja19yYXRlID0gcGFyYW0uaW5mby5jbG9ja19yYXRlOworICAgIG9iai0+aW5mby0+ZnJtX3B0aW1lID0gcGFyYW0uaW5mby5mcm1fcHRpbWU7CisgICAgb2JqLT5pbmZvLT5wY21fYml0c19wZXJfc2FtcGxlID0gcGFyYW0uaW5mby5wY21fYml0c19wZXJfc2FtcGxlOworICAgIG9iai0+aW5mby0+cHQgPSBwYXJhbS5pbmZvLnB0OworICAgIG9iai0+c2V0dGluZy0+Y25nID0gcGFyYW0uc2V0dGluZy5jbmc7CisgICAgLy9kZXByZWNhdGVkOgorICAgIC8vb2JqLT5zZXR0aW5nLT5kZWNfZm10cF9tb2RlID0gcGFyYW0uc2V0dGluZy5kZWNfZm10cF9tb2RlOworICAgIC8vb2JqLT5zZXR0aW5nLT5lbmNfZm10cF9tb2RlID0gcGFyYW0uc2V0dGluZy5lbmNfZm10cF9tb2RlOworICAgIG9iai0+c2V0dGluZy0+ZnJtX3Blcl9wa3QgPSBwYXJhbS5zZXR0aW5nLmZybV9wZXJfcGt0OworICAgIG9iai0+c2V0dGluZy0+cGVuaCA9IHBhcmFtLnNldHRpbmcucGVuaDsKKyAgICBvYmotPnNldHRpbmctPnBsYyA9IHBhcmFtLnNldHRpbmcucGxjOworICAgIG9iai0+c2V0dGluZy0+cmVzZXJ2ZWQgPSBwYXJhbS5zZXR0aW5nLnJlc2VydmVkOworICAgIG9iai0+c2V0dGluZy0+dmFkID0gcGFyYW0uc2V0dGluZy52YWQ7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyIsIG9iaik7Cit9CisvKgorICogcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICAKKyAgICBpbnQgc3RhdHVzOwkKKyAgICBQeU9iamVjdCAqIGlkOworICAgIHBqX3N0cl90IHN0cjsKKyAgICBwam1lZGlhX2NvZGVjX3BhcmFtIHBhcmFtOworICAgIFB5T2JqZWN0ICogdG1wT2JqOworICAgIFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW0gKm9iajsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9PIiwgJmlkLCAmdG1wT2JqKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisKKyAgICBzdHIucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaWQpOworICAgIHN0ci5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKGlkKSk7CisgICAgaWYgKHRtcE9iaiAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgb2JqID0gKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW0gKil0bXBPYmo7CisgICAgICAgIHBhcmFtLmluZm8uYXZnX2JwcyA9IG9iai0+aW5mby0+YXZnX2JwczsKKyAgICAgICAgcGFyYW0uaW5mby5jaGFubmVsX2NudCA9IG9iai0+aW5mby0+Y2hhbm5lbF9jbnQ7CisgICAgICAgIHBhcmFtLmluZm8uY2xvY2tfcmF0ZSA9IG9iai0+aW5mby0+Y2xvY2tfcmF0ZTsKKyAgICAgICAgcGFyYW0uaW5mby5mcm1fcHRpbWUgPSBvYmotPmluZm8tPmZybV9wdGltZTsKKyAgICAgICAgcGFyYW0uaW5mby5wY21fYml0c19wZXJfc2FtcGxlID0gb2JqLT5pbmZvLT5wY21fYml0c19wZXJfc2FtcGxlOworICAgICAgICBwYXJhbS5pbmZvLnB0ID0gb2JqLT5pbmZvLT5wdDsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5jbmcgPSBvYmotPnNldHRpbmctPmNuZzsKKwkvL0RlcHJlY2F0ZWQ6CisgICAgICAgIC8vcGFyYW0uc2V0dGluZy5kZWNfZm10cF9tb2RlID0gb2JqLT5zZXR0aW5nLT5kZWNfZm10cF9tb2RlOworICAgICAgICAvL3BhcmFtLnNldHRpbmcuZW5jX2ZtdHBfbW9kZSA9IG9iai0+c2V0dGluZy0+ZW5jX2ZtdHBfbW9kZTsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5mcm1fcGVyX3BrdCA9IG9iai0+c2V0dGluZy0+ZnJtX3Blcl9wa3Q7CisgICAgICAgIHBhcmFtLnNldHRpbmcucGVuaCA9IG9iai0+c2V0dGluZy0+cGVuaDsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5wbGMgPSBvYmotPnNldHRpbmctPnBsYzsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5yZXNlcnZlZCA9IG9iai0+c2V0dGluZy0+cmVzZXJ2ZWQ7CisgICAgICAgIHBhcmFtLnNldHRpbmcudmFkID0gb2JqLT5zZXR0aW5nLT52YWQ7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX3NldF9wYXJhbSgmc3RyLCAmcGFyYW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX3NldF9wYXJhbSgmc3RyLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCitzdGF0aWMgY2hhciBwanN1YV9jb25mX2dldF9tYXhfcG9ydHNfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY29uZl9nZXRfbWF4X3BvcnRzICgpICIKKyAgICAiR2V0IG1heGludW0gbnVtYmVyIG9mIGNvbmZlcmVuY2UgcG9ydHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0c19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jb25mX2dldF9hY3RpdmVfcG9ydHMgKCkgIgorICAgICJHZXQgY3VycmVudCBudW1iZXIgb2YgYWN0aXZlIHBvcnRzIGluIHRoZSBicmlkZ2UuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2VudW1fY29uZl9wb3J0c19kb2NbXSA9CisgICAgImludFtdIHB5X3Bqc3VhLmVudW1fY29uZl9wb3J0cyAoKSAiCisgICAgIkVudW1lcmF0ZSBhbGwgY29uZmVyZW5jZSBwb3J0cy4iOworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvX2RvY1tdID0KKyAgICAicHlfcGpzdWEuQ29uZl9Qb3J0X0luZm8gcHlfcGpzdWEuY29uZl9nZXRfcG9ydF9pbmZvIChpbnQgaWQpICIKKyAgICAiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgY29uZmVyZW5jZSBwb3J0IjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZfYWRkX3BvcnRfZG9jW10gPQorICAgICJpbnQsIGludCBweV9wanN1YS5jb25mX2FkZF9wb3J0ICIKKyAgICAiKHB5X3Bqc3VhLlBqX1Bvb2wgcG9vbCwgcHlfcGpzdWEuUEpNZWRpYV9Qb3J0IHBvcnQpICIKKyAgICAiQWRkIGFyYml0cmFyeSBtZWRpYSBwb3J0IHRvIFBKU1VBJ3MgY29uZmVyZW5jZSBicmlkZ2UuICIKKyAgICAiQXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGFkZCB0aGUgbWVkaWEgcG9ydCAiCisgICAgInRoYXQgaXQgY3JlYXRlcy4gRm9yIG1lZGlhIHBvcnRzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgUEpTVUEtTElCICIKKyAgICAiKHN1Y2ggYXMgY2FsbHMsIGZpbGUgcGxheWVyLCBvciBmaWxlIHJlY29yZGVyKSwgUEpTVUEtTElCIHdpbGwgIgorICAgICJhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcG9ydCB0byB0aGUgYnJpZGdlLiI7CitzdGF0aWMgY2hhciBwanN1YV9jb25mX3JlbW92ZV9wb3J0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNvbmZfcmVtb3ZlX3BvcnQgKGludCBpZCkgIgorICAgICJSZW1vdmUgYXJiaXRyYXJ5IHNsb3QgZnJvbSB0aGUgY29uZmVyZW5jZSBicmlkZ2UuICIKKyAgICAiQXBwbGljYXRpb24gc2hvdWxkIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uICIKKyAgICAiaWYgaXQgcmVnaXN0ZXJlZCB0aGUgcG9ydCBtYW51YWxseS4iOworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9jb25uZWN0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNvbmZfY29ubmVjdCAoaW50IHNvdXJjZSwgaW50IHNpbmspICIKKyAgICAiRXN0YWJsaXNoIHVuaWRpcmVjdGlvbmFsIG1lZGlhIGZsb3cgZnJvbSBzb3VjZSB0byBzaW5rLiAiCisgICAgIk9uZSBzb3VyY2UgbWF5IHRyYW5zbWl0IHRvIG11bHRpcGxlIGRlc3RpbmF0aW9ucy9zaW5rLiAiCisgICAgIkFuZCBpZiBtdWx0aXBsZSBzb3VyY2VzIGFyZSB0cmFuc21pdHRpbmcgdG8gdGhlIHNhbWUgc2luaywgIgorICAgICJ0aGUgbWVkaWEgd2lsbCBiZSBtaXhlZCB0b2dldGhlci4gU291cmNlIGFuZCBzaW5rIG1heSByZWZlciAiCisgICAgInRvIHRoZSBzYW1lIElELCBlZmZlY3RpdmVseSBsb29waW5nIHRoZSBtZWRpYS4gIgorICAgICJJZiBiaWRpcmVjdGlvbmFsIG1lZGlhIGZsb3cgaXMgZGVzaXJlZCwgYXBwbGljYXRpb24gIgorICAgICJuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdHdpY2UsIHdpdGggdGhlIHNlY29uZCAiCisgICAgIm9uZSBoYXZpbmcgdGhlIGFyZ3VtZW50cyByZXZlcnNlZC4iOworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9kaXNjb25uZWN0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNvbmZfZGlzY29ubmVjdCAoaW50IHNvdXJjZSwgaW50IHNpbmspICIKKyAgICAiRGlzY29ubmVjdCBtZWRpYSBmbG93IGZyb20gdGhlIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBwb3J0LiI7CitzdGF0aWMgY2hhciBwanN1YV9wbGF5ZXJfY3JlYXRlX2RvY1tdID0KKyAgICAiaW50LCBpbnQgcHlfcGpzdWEucGxheWVyX2NyZWF0ZSAoc3RyaW5nIGZpbGVuYW1lLCBpbnQgb3B0aW9ucykgIgorICAgICJDcmVhdGUgYSBmaWxlIHBsYXllciwgYW5kIGF1dG9tYXRpY2FsbHkgY29ubmVjdCAiCisgICAgInRoaXMgcGxheWVyIHRvIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4iOworc3RhdGljIGNoYXIgcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnRfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEucGxheWVyX2dldF9jb25mX3BvcnQgKGludCkgIgorICAgICJHZXQgY29uZmVyZW5jZSBwb3J0IElEIGFzc29jaWF0ZWQgd2l0aCBwbGF5ZXIuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3BsYXllcl9zZXRfcG9zX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLnBsYXllcl9zZXRfcG9zIChpbnQgaWQsIGludCBzYW1wbGVzKSAiCisgICAgIlNldCBwbGF5YmFjayBwb3NpdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfcGxheWVyX2Rlc3Ryb3lfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEucGxheWVyX2Rlc3Ryb3kgKGludCBpZCkgIgorICAgICJDbG9zZSB0aGUgZmlsZSwgcmVtb3ZlIHRoZSBwbGF5ZXIgZnJvbSB0aGUgYnJpZGdlLCAiCisgICAgImFuZCBmcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgcGxheWVyLiI7CitzdGF0aWMgY2hhciBwanN1YV9yZWNvcmRlcl9jcmVhdGVfZG9jW10gPQorICAgICJpbnQsIGludCBweV9wanN1YS5yZWNvcmRlcl9jcmVhdGUgKHN0cmluZyBmaWxlbmFtZSwgIgorICAgICJpbnQgZW5jX3R5cGUsIGludCBlbmNfcGFyYW0sIGludCBtYXhfc2l6ZSwgaW50IG9wdGlvbnMpICIKKyAgICAiQ3JlYXRlIGEgZmlsZSByZWNvcmRlciwgYW5kIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0aGlzIHJlY29yZGVyICIKKyAgICAidG8gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiBUaGUgcmVjb3JkZXIgY3VycmVudGx5IHN1cHBvcnRzIHJlY29yZGluZyAiCisgICAgIldBViBmaWxlLCBhbmQgb24gV2luZG93cywgTVAzIGZpbGUuIFRoZSB0eXBlIG9mIHRoZSByZWNvcmRlciB0byB1c2UgIgorICAgICJpcyBkZXRlcm1pbmVkIGJ5IHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGUgKGUuZy4gJy53YXYnIG9yICcubXAzJykuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnRfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEucmVjb3JkZXJfZ2V0X2NvbmZfcG9ydCAoaW50IGlkKSAiCisgICAgIkdldCBjb25mZXJlbmNlIHBvcnQgYXNzb2NpYXRlZCB3aXRoIHJlY29yZGVyLiI7CitzdGF0aWMgY2hhciBwanN1YV9yZWNvcmRlcl9kZXN0cm95X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLnJlY29yZGVyX2Rlc3Ryb3kgKGludCBpZCkgIgorICAgICJEZXN0cm95IHJlY29yZGVyICh0aGlzIHdpbGwgY29tcGxldGUgcmVjb3JkaW5nKS4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9zbmRfZGV2c19kb2NbXSA9CisgICAgInB5X3Bqc3VhLlBKTWVkaWFfU25kX0Rldl9JbmZvW10gcHlfcGpzdWEuZW51bV9zbmRfZGV2cyAoaW50IGNvdW50KSAiCisgICAgIkVudW0gc291bmQgZGV2aWNlcy4iOworc3RhdGljIGNoYXIgcGpzdWFfZ2V0X3NuZF9kZXZfZG9jW10gPQorICAgICJpbnQsIGludCBweV9wanN1YS5nZXRfc25kX2RldiAoKSAiCisgICAgIkdldCBjdXJyZW50bHkgYWN0aXZlIHNvdW5kIGRldmljZXMuICIKKyAgICAiSWYgc291bmQgZGV2aWNlcyBoYXMgbm90IGJlZW4gY3JlYXRlZCAiCisgICAgIihmb3IgZXhhbXBsZSB3aGVuIHBqc3VhX3N0YXJ0KCkgaXMgbm90IGNhbGxlZCksICIKKyAgICAiaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAiCisgICAgIlBKX1NVQ0NFU1Mgd2l0aCAtMSBhcyBkZXZpY2UgSURzLiI7CitzdGF0aWMgY2hhciBwanN1YV9zZXRfc25kX2Rldl9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5zZXRfc25kX2RldiAoaW50IGNhcHR1cmVfZGV2LCBpbnQgcGxheWJhY2tfZGV2KSAiCisgICAgIlNlbGVjdCBvciBjaGFuZ2Ugc291bmQgZGV2aWNlLiBBcHBsaWNhdGlvbiBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uICIKKyAgICAiYXQgYW55IHRpbWUgdG8gcmVwbGFjZSBjdXJyZW50IHNvdW5kIGRldmljZS4iOworc3RhdGljIGNoYXIgcGpzdWFfc2V0X251bGxfc25kX2Rldl9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5zZXRfbnVsbF9zbmRfZGV2ICgpICIKKyAgICAiU2V0IHBqc3VhIHRvIHVzZSBudWxsIHNvdW5kIGRldmljZS4gVGhlIG51bGwgc291bmQgZGV2aWNlIG9ubHkgIgorICAgICJwcm92aWRlcyB0aGUgdGltaW5nIG5lZWRlZCBieSB0aGUgY29uZmVyZW5jZSBicmlkZ2UsIGFuZCB3aWxsIG5vdCAiCisgICAgImludGVycmFjdCB3aXRoIGFueSBoYXJkd2FyZS4iOworc3RhdGljIGNoYXIgcGpzdWFfc2V0X25vX3NuZF9kZXZfZG9jW10gPQorICAgICJweV9wanN1YS5QSk1lZGlhX1BvcnQgcHlfcGpzdWEuc2V0X25vX3NuZF9kZXYgKCkgIgorICAgICJEaXNjb25uZWN0IHRoZSBtYWluIGNvbmZlcmVuY2UgYnJpZGdlIGZyb20gYW55IHNvdW5kIGRldmljZXMsICIKKyAgICAiYW5kIGxldCBhcHBsaWNhdGlvbiBjb25uZWN0IHRoZSBicmlkZ2UgdG8gaXQncyAiCisgICAgIm93biBzb3VuZCBkZXZpY2UvbWFzdGVyIHBvcnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3NldF9lY19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5zZXRfZWMgKGludCB0YWlsX21zLCBpbnQgb3B0aW9ucykgIgorICAgICJDb25maWd1cmUgdGhlIGVjaG8gY2FuY2VsbGVyIHRhaWwgbGVuZ3RoIG9mIHRoZSBzb3VuZCBwb3J0LiI7CitzdGF0aWMgY2hhciBwanN1YV9nZXRfZWNfdGFpbF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5nZXRfZWNfdGFpbCAoKSAiCisgICAgIkdldCBjdXJyZW50IGVjaG8gY2FuY2VsbGVyIHRhaWwgbGVuZ3RoLiI7CitzdGF0aWMgY2hhciBwanN1YV9lbnVtX2NvZGVjc19kb2NbXSA9CisgICAgInB5X3Bqc3VhLkNvZGVjX0luZm9bXSBweV9wanN1YS5lbnVtX2NvZGVjcyAoKSAiCisgICAgIkVudW0gYWxsIHN1cHBvcnRlZCBjb2RlY3MgaW4gdGhlIHN5c3RlbS4iOworc3RhdGljIGNoYXIgcGpzdWFfY29kZWNfc2V0X3ByaW9yaXR5X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNvZGVjX3NldF9wcmlvcml0eSAoc3RyaW5nIGlkLCBpbnQgcHJpb3JpdHkpICIKKyAgICAiQ2hhbmdlIGNvZGVjIHByaW9yaXR5LiI7CitzdGF0aWMgY2hhciBwanN1YV9jb2RlY19nZXRfcGFyYW1fZG9jW10gPQorICAgICJweV9wanN1YS5QSk1lZGlhX0NvZGVjX1BhcmFtIHB5X3Bqc3VhLmNvZGVjX2dldF9wYXJhbSAoc3RyaW5nIGlkKSAiCisgICAgIkdldCBjb2RlYyBwYXJhbWV0ZXJzIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvZGVjX3NldF9wYXJhbV9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jb2RlY19zZXRfcGFyYW0gKHN0cmluZyBpZCwgIgorICAgICJweV9wanN1YS5QSk1lZGlhX0NvZGVjX1BhcmFtIHBhcmFtKSAiCisgICAgIlNldCBjb2RlYyBwYXJhbWV0ZXJzLiI7CisKKy8qIEVORCBPRiBMSUIgTUVESUEgKi8KKworLyogTElCIENBTEwgKi8KKworLyoKKyAqIFB5T2JqX3BqX3RpbWVfdmFsCisgKiBQSiBUaW1lIFZhbAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICBsb25nIHNlYzsKKyAgICBsb25nIG1zZWM7CisKK30gUHlPYmpfcGpfdGltZV92YWw7CisKKworCisvKgorICogcGpfdGltZV92YWxfbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgcGpfdGltZV92YWxfbWVtYmVyc1tdID0KK3sgICAKKyAgICAKKyAgICB7CisgICAgICAgICJzZWMiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqX3RpbWVfdmFsLCBzZWMpLCAwLAorICAgICAgICAiVGhlIHNlY29uZHMgcGFydCBvZiB0aGUgdGltZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1zZWMiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqX3RpbWVfdmFsLCBzZWMpLCAwLAorICAgICAgICAiVGhlIG1pbGxpc2Vjb25kcyBmcmFjdGlvbiBvZiB0aGUgdGltZSIKKyAgICB9LAorICAgIAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wal90aW1lX3ZhbAorICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqX3RpbWVfdmFsID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLlBKX1RpbWVfVmFsIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wal90aW1lX3ZhbCksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAwLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIlBKIFRpbWUgVmFsIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqX3RpbWVfdmFsX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIAorCit9OworCisvKgorICogUHlPYmpfcGpzdWFfY2FsbF9pbmZvCisgKiBDYWxsIEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgCisgICAgaW50IGlkOworICAgIGludCByb2xlOworICAgIGludCBhY2NfaWQ7CisgICAgUHlPYmplY3QgKiBsb2NhbF9pbmZvOworICAgIFB5T2JqZWN0ICogbG9jYWxfY29udGFjdDsKKyAgICBQeU9iamVjdCAqIHJlbW90ZV9pbmZvOworICAgIFB5T2JqZWN0ICogcmVtb3RlX2NvbnRhY3Q7CisgICAgUHlPYmplY3QgKiBjYWxsX2lkOworICAgIGludCBzdGF0ZTsKKyAgICBQeU9iamVjdCAqIHN0YXRlX3RleHQ7CisgICAgaW50IGxhc3Rfc3RhdHVzOworICAgIFB5T2JqZWN0ICogbGFzdF9zdGF0dXNfdGV4dDsKKyAgICBpbnQgbWVkaWFfc3RhdHVzOworICAgIGludCBtZWRpYV9kaXI7CisgICAgaW50IGNvbmZfc2xvdDsKKyAgICBQeU9ial9wal90aW1lX3ZhbCAqIGNvbm5lY3RfZHVyYXRpb247CisgICAgUHlPYmpfcGpfdGltZV92YWwgKiB0b3RhbF9kdXJhdGlvbjsKKyAgICBzdHJ1Y3QgeworCWNoYXIgbG9jYWxfaW5mb1sxMjhdOworCWNoYXIgbG9jYWxfY29udGFjdFsxMjhdOworCWNoYXIgcmVtb3RlX2luZm9bMTI4XTsKKwljaGFyIHJlbW90ZV9jb250YWN0WzEyOF07CisJY2hhciBjYWxsX2lkWzEyOF07CisJY2hhciBsYXN0X3N0YXR1c190ZXh0WzEyOF07CisgICAgfSBidWZfOworCit9IFB5T2JqX3Bqc3VhX2NhbGxfaW5mbzsKKworCisvKgorICogY2FsbF9pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBjYWxsX2luZm8gZnJvbSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgY2FsbF9pbmZvX2RlYWxsb2MoUHlPYmpfcGpzdWFfY2FsbF9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+bG9jYWxfaW5mbyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sb2NhbF9jb250YWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlbW90ZV9pbmZvKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlbW90ZV9jb250YWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNhbGxfaWQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhdGVfdGV4dCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0YXR1c190ZXh0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNvbm5lY3RfZHVyYXRpb24pOworICAgIFB5X1hERUNSRUYoc2VsZi0+dG90YWxfZHVyYXRpb24pOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogY2FsbF9pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIGNhbGxfaW5mbyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogY2FsbF9pbmZvX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfY2FsbF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9jYWxsX2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2VsZi0+bG9jYWxfaW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+bG9jYWxfaW5mbyA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSAgICAgICAKKwlzZWxmLT5sb2NhbF9jb250YWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5sb2NhbF9jb250YWN0ID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+cmVtb3RlX2luZm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnJlbW90ZV9pbmZvID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+cmVtb3RlX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnJlbW90ZV9jb250YWN0ID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+Y2FsbF9pZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+Y2FsbF9pZCA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCXNlbGYtPnN0YXRlX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnN0YXRlX3RleHQgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwlzZWxmLT5sYXN0X3N0YXR1c190ZXh0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5sYXN0X3N0YXR1c190ZXh0ID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+Y29ubmVjdF9kdXJhdGlvbiA9IChQeU9ial9wal90aW1lX3ZhbCAqKVB5VHlwZV9HZW5lcmljTmV3CisJICAgICgmUHlUeXBfcGpfdGltZV92YWwsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3RfZHVyYXRpb24gPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwlzZWxmLT50b3RhbF9kdXJhdGlvbiA9IChQeU9ial9wal90aW1lX3ZhbCAqKVB5VHlwZV9HZW5lcmljTmV3CisJICAgICgmUHlUeXBfcGpfdGltZV92YWwsTlVMTCxOVUxMKTsKKyAgICAgICAgaWYgKHNlbGYtPnRvdGFsX2R1cmF0aW9uID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogY2FsbF9pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGNhbGxfaW5mb19tZW1iZXJzW10gPQoreyAgIAorICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGlkKSwgMCwKKyAgICAgICAgIkNhbGwgaWRlbnRpZmljYXRpb24iCisgICAgfSwKKyAgICB7CisgICAgICAgICJyb2xlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHJvbGUpLCAwLAorICAgICAgICAiSW5pdGlhbCBjYWxsIHJvbGUgKFVBQyA9PSBjYWxsZXIpIgorICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2lkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGFjY19pZCksIDAsCisgICAgICAgICJUaGUgYWNjb3VudCBJRCB3aGVyZSB0aGlzIGNhbGwgYmVsb25ncy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJsb2NhbF9pbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbG9jYWxfaW5mbyksIDAsCisgICAgICAgICJMb2NhbCBVUkkiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgImxvY2FsX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBsb2NhbF9jb250YWN0KSwgMCwKKyAgICAgICAgIkxvY2FsIENvbnRhY3QiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgInJlbW90ZV9pbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgcmVtb3RlX2luZm8pLCAwLAorICAgICAgICAiUmVtb3RlIFVSSSIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAicmVtb3RlX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCByZW1vdGVfY29udGFjdCksIDAsCisgICAgICAgICJSZW1vdGUgQ29udGFjdCIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9pZCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGNhbGxfaWQpLCAwLAorICAgICAgICAiRGlhbG9nIENhbGwtSUQgc3RyaW5nIiAgICAgICAgCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0ZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBzdGF0ZSksIDAsCisgICAgICAgICJDYWxsIHN0YXRlIgorICAgIH0sCisgICAgeworICAgICAgICAic3RhdGVfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHN0YXRlX3RleHQpLCAwLAorICAgICAgICAiVGV4dCBkZXNjcmliaW5nIHRoZSBzdGF0ZSAiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgImxhc3Rfc3RhdHVzIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGxhc3Rfc3RhdHVzKSwgMCwKKyAgICAgICAgIkxhc3Qgc3RhdHVzIGNvZGUgaGVhcmQsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGNhdXNlIGNvZGUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJsYXN0X3N0YXR1c190ZXh0IiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbGFzdF9zdGF0dXNfdGV4dCksIDAsCisgICAgICAgICJUaGUgcmVhc29uIHBocmFzZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMuIiAgICAgICAgCisgICAgfSwKKyAgICB7CisgICAgICAgICJtZWRpYV9zdGF0dXMiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbWVkaWFfc3RhdHVzKSwgMCwKKyAgICAgICAgIkNhbGwgbWVkaWEgc3RhdHVzLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1lZGlhX2RpciIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBtZWRpYV9kaXIpLCAwLAorICAgICAgICAiTWVkaWEgZGlyZWN0aW9uIgorICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9zbG90IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGNvbmZfc2xvdCksIDAsCisgICAgICAgICJUaGUgY29uZmVyZW5jZSBwb3J0IG51bWJlciBmb3IgdGhlIGNhbGwiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb25uZWN0X2R1cmF0aW9uIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgY29ubmVjdF9kdXJhdGlvbiksIDAsCisgICAgICAgICJVcC10by1kYXRlIGNhbGwgY29ubmVjdGVkIGR1cmF0aW9uKHplcm8gd2hlbiBjYWxsIGlzIG5vdCBlc3RhYmxpc2hlZCkiCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0b3RhbF9kdXJhdGlvbiIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHRvdGFsX2R1cmF0aW9uKSwgMCwKKyAgICAgICAgIlRvdGFsIGNhbGwgZHVyYXRpb24sIGluY2x1ZGluZyBzZXQtdXAgdGltZSIgICAgICAgIAorICAgIH0sCisgICAgCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX2NhbGxfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2NhbGxfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5DYWxsX0luZm8iLCAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvciljYWxsX2luZm9fZGVhbGxvYywvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDYWxsIEluZm8gb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY2FsbF9pbmZvX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjYWxsX2luZm9fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZ2V0X21heF9jb3VudAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZ2V0X21heF9jb3VudAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNvdW50OworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgY291bnQgPSBwanN1YV9jYWxsX2dldF9tYXhfY291bnQoKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGNvdW50KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvdW50CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9nZXRfY291bnQKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIAorICAgIGludCBjb3VudDsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICIiKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgY291bnQgPSBwanN1YV9jYWxsX2dldF9jb3VudCgpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgY291bnQpOworfQorCisvKgorICogcHlfcGpzdWFfZW51bV9jYWxscworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2VudW1fY2FsbHMoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIAorICAgIHBqc3VhX3RyYW5zcG9ydF9pZCBpZFtQSlNVQV9NQVhfQ0FMTFNdOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBjID0gUEpfQVJSQVlfU0laRShpZCk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9jYWxscyhpZCwgJmMpOworICAgIAorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIAorICAgIHsgICAgIAorICAgICAgICBpbnQgcmV0ID0gUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyIsbGlzdCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX21ha2VfY2FsbAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfbWFrZV9jYWxsCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGFjY19pZDsKKyAgICBwal9zdHJfdCBkc3RfdXJpOworICAgIFB5T2JqZWN0ICogc2Q7CisgICAgdW5zaWduZWQgb3B0aW9uczsKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqIG9tZE9iajsKKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YSAqIG9tZDsKKyAgICBpbnQgdXNlcl9kYXRhOworICAgIGludCBjYWxsX2lkOworICAgIHBqX3Bvb2xfdCAqIHBvb2w7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZQorCQkocEFyZ3MsICJpT0lpTyIsICZhY2NfaWQsICZzZCwgJm9wdGlvbnMsICZ1c2VyX2RhdGEsICZvbWRPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCQorICAgIGRzdF91cmkucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2QpOworICAgIGRzdF91cmkuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhzZCkpOworICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkgCisgICAgeworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilvbWRPYmo7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5zbGVuID0gc3RybGVuCisJCQkoUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpKTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInBqc3VhIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfbWFrZV9jYWxsKGFjY19pZCwgJmRzdF91cmksIAorCQkJb3B0aW9ucywgKHZvaWQqKXVzZXJfZGF0YSwgJm1zZ19kYXRhLCAmY2FsbF9pZCk7CQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfSBlbHNlIHsKKwkJCisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfbWFrZV9jYWxsKGFjY19pZCwgJmRzdF91cmksIAorCQkJb3B0aW9ucywgKHZvaWQqKXVzZXJfZGF0YSwgTlVMTCwgJmNhbGxfaWQpOwkKKyAgICB9CisJCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIixzdGF0dXMsIGNhbGxfaWQpOworCQorfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9pc19hY3RpdmUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX2lzX2FjdGl2ZQorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IGlzQWN0aXZlOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmY2FsbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIGlzQWN0aXZlID0gcGpzdWFfY2FsbF9pc19hY3RpdmUoY2FsbF9pZCk7CisgICAgCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBpc0FjdGl2ZSk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2hhc19tZWRpYQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfaGFzX21lZGlhCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBpbnQgaGFzTWVkaWE7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZjYWxsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgaGFzTWVkaWEgPSBwanN1YV9jYWxsX2hhc19tZWRpYShjYWxsX2lkKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGhhc01lZGlhKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IHBvcnRfaWQ7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZjYWxsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgcG9ydF9pZCA9IHBqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydChjYWxsX2lkKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBvcnRfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9nZXRfaW5mbworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZ2V0X2luZm8KKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYWxsX2lkOworICAgIGludCBzdGF0dXM7CisgICAgUHlPYmpfcGpzdWFfY2FsbF9pbmZvICogb2k7CisgICAgcGpzdWFfY2FsbF9pbmZvIGluZm87CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmNhbGxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZpbmZvKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIAorICAgIHsKKyAgICAgICAgb2kgPSAoUHlPYmpfcGpzdWFfY2FsbF9pbmZvICopY2FsbF9pbmZvX25ldygmUHlUeXBfcGpzdWFfY2FsbF9pbmZvLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgb2ktPmFjY19pZCA9IGluZm8uYWNjX2lkOworICAgICAgICBwal9hbnNpX3NucHJpbnRmKG9pLT5idWZfLmNhbGxfaWQsIHNpemVvZihvaS0+YnVmXy5jYWxsX2lkKSwKKwkgICAgIiUuKnMiLCAoaW50KWluZm8uY2FsbF9pZC5zbGVuLCBpbmZvLmNhbGxfaWQucHRyKTsKKyAgICAgICAgcGpfYW5zaV9zbnByaW50ZihvaS0+YnVmXy5sYXN0X3N0YXR1c190ZXh0LCAKKwkgICAgc2l6ZW9mKG9pLT5idWZfLmxhc3Rfc3RhdHVzX3RleHQpLAorCSAgICAiJS4qcyIsIChpbnQpaW5mby5sYXN0X3N0YXR1c190ZXh0LnNsZW4sIGluZm8ubGFzdF9zdGF0dXNfdGV4dC5wdHIpOworICAgICAgICBwal9hbnNpX3NucHJpbnRmKG9pLT5idWZfLmxvY2FsX2NvbnRhY3QsIHNpemVvZihvaS0+YnVmXy5sb2NhbF9jb250YWN0KSwKKwkgICAgIiUuKnMiLCAoaW50KWluZm8ubG9jYWxfY29udGFjdC5zbGVuLCBpbmZvLmxvY2FsX2NvbnRhY3QucHRyKTsKKyAgICAgICAgcGpfYW5zaV9zbnByaW50ZihvaS0+YnVmXy5sb2NhbF9pbmZvLCBzaXplb2Yob2ktPmJ1Zl8ubG9jYWxfaW5mbyksCisJICAgICIlLipzIiwgKGludClpbmZvLmxvY2FsX2luZm8uc2xlbiwgaW5mby5sb2NhbF9pbmZvLnB0cik7CisgICAgICAgIHBqX2Fuc2lfc25wcmludGYob2ktPmJ1Zl8ucmVtb3RlX2NvbnRhY3QsCisJICAgIHNpemVvZihvaS0+YnVmXy5yZW1vdGVfY29udGFjdCksCisJICAgICIlLipzIiwgKGludClpbmZvLnJlbW90ZV9jb250YWN0LnNsZW4sIGluZm8ucmVtb3RlX2NvbnRhY3QucHRyKTsKKyAgICAgICAgcGpfYW5zaV9zbnByaW50ZihvaS0+YnVmXy5yZW1vdGVfaW5mbywgc2l6ZW9mKG9pLT5idWZfLnJlbW90ZV9pbmZvKSwKKwkgICAgIiUuKnMiLCAoaW50KWluZm8ucmVtb3RlX2luZm8uc2xlbiwgaW5mby5yZW1vdGVfaW5mby5wdHIpOworCisgICAgICAgIG9pLT5jYWxsX2lkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5mby5jYWxsX2lkLnB0ciwgCisJICAgIGluZm8uY2FsbF9pZC5zbGVuKTsKKyAgICAgICAgb2ktPmNvbmZfc2xvdCA9IGluZm8uY29uZl9zbG90OworICAgICAgICBvaS0+Y29ubmVjdF9kdXJhdGlvbi0+c2VjID0gaW5mby5jb25uZWN0X2R1cmF0aW9uLnNlYzsKKyAgICAgICAgb2ktPmNvbm5lY3RfZHVyYXRpb24tPm1zZWMgPSBpbmZvLmNvbm5lY3RfZHVyYXRpb24ubXNlYzsKKyAgICAgICAgb2ktPnRvdGFsX2R1cmF0aW9uLT5zZWMgPSBpbmZvLnRvdGFsX2R1cmF0aW9uLnNlYzsKKyAgICAgICAgb2ktPnRvdGFsX2R1cmF0aW9uLT5tc2VjID0gaW5mby50b3RhbF9kdXJhdGlvbi5tc2VjOworICAgICAgICBvaS0+aWQgPSBpbmZvLmlkOworICAgICAgICBvaS0+bGFzdF9zdGF0dXMgPSBpbmZvLmxhc3Rfc3RhdHVzOworICAgICAgICBvaS0+bGFzdF9zdGF0dXNfdGV4dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorCSAgICBpbmZvLmxhc3Rfc3RhdHVzX3RleHQucHRyLCBpbmZvLmxhc3Rfc3RhdHVzX3RleHQuc2xlbik7CisgICAgICAgIG9pLT5sb2NhbF9jb250YWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisJICAgIGluZm8ubG9jYWxfY29udGFjdC5wdHIsIGluZm8ubG9jYWxfY29udGFjdC5zbGVuKTsKKyAgICAgICAgb2ktPmxvY2FsX2luZm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgIAkgICAgaW5mby5sb2NhbF9pbmZvLnB0ciwgaW5mby5sb2NhbF9pbmZvLnNsZW4pOworICAgICAgICBvaS0+cmVtb3RlX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKwkgICAgaW5mby5yZW1vdGVfY29udGFjdC5wdHIsIGluZm8ucmVtb3RlX2NvbnRhY3Quc2xlbik7CisgICAgICAgIG9pLT5yZW1vdGVfaW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorCSAgICBpbmZvLnJlbW90ZV9pbmZvLnB0ciwgaW5mby5yZW1vdGVfaW5mby5zbGVuKTsKKyAgICAgICAgb2ktPm1lZGlhX2RpciA9IGluZm8ubWVkaWFfZGlyOworICAgICAgICBvaS0+bWVkaWFfc3RhdHVzID0gaW5mby5tZWRpYV9zdGF0dXM7CisgICAgICAgIG9pLT5yb2xlID0gaW5mby5yb2xlOworICAgICAgICBvaS0+c3RhdGUgPSBpbmZvLnN0YXRlOworICAgICAgICBvaS0+c3RhdGVfdGV4dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgCSAgICBpbmZvLnN0YXRlX3RleHQucHRyLCBpbmZvLnN0YXRlX3RleHQuc2xlbik7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyIsIG9pKTsKKyAgICB9IGVsc2UgeworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX3NldF91c2VyX2RhdGEKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX3NldF91c2VyX2RhdGEKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYWxsX2lkOworICAgIGludCB1c2VyX2RhdGE7CQorICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmNhbGxfaWQsICZ1c2VyX2RhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NldF91c2VyX2RhdGEoY2FsbF9pZCwgKHZvaWQqKXVzZXJfZGF0YSk7CisgICAgCisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9nZXRfdXNlcl9kYXRhCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9nZXRfdXNlcl9kYXRhCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICB2b2lkICogdXNlcl9kYXRhOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmY2FsbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHVzZXJfZGF0YSA9IHBqc3VhX2NhbGxfZ2V0X3VzZXJfZGF0YShjYWxsX2lkKTsKKyAgICAKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpdXNlcl9kYXRhKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfYW5zd2VyCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9hbnN3ZXIKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBwal9zdHJfdCAqIHJlYXNvbiwgdG1wX3JlYXNvbjsKKyAgICBQeU9iamVjdCAqIHNyOworICAgIHVuc2lnbmVkIGNvZGU7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7ICAgIAorICAgIHBqX3Bvb2xfdCAqIHBvb2w7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlJT08iLCAmY2FsbF9pZCwgJmNvZGUsICZzciwgJm9tZE9iaikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNyID09IFB5X05vbmUpIAorICAgIHsKKyAgICAgICAgcmVhc29uID0gTlVMTDsKKyAgICB9IGVsc2UgeworCXJlYXNvbiA9ICZ0bXBfcmVhc29uOworICAgICAgICB0bXBfcmVhc29uLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNyKTsKKyAgICAgICAgdG1wX3JlYXNvbi5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKHNyKSk7CisgICAgfQorICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkgCisgICAgeworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilvbWRPYmo7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5zbGVuID0gc3RybGVuCisJCQkoUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpKTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInBqc3VhIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisJCisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfYW5zd2VyKGNhbGxfaWQsIGNvZGUsIHJlYXNvbiwgJm1zZ19kYXRhKTsJCisgICAgCisgICAgICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICB9IGVsc2UgeworCQorICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX2Fuc3dlcihjYWxsX2lkLCBjb2RlLCByZWFzb24sIE5VTEwpOworCQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfaGFuZ3VwCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9oYW5ndXAKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBwal9zdHJfdCAqIHJlYXNvbiwgdG1wX3JlYXNvbjsKKyAgICBQeU9iamVjdCAqIHNyOworICAgIHVuc2lnbmVkIGNvZGU7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7ICAgIAorICAgIHBqX3Bvb2xfdCAqIHBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpSU9PIiwgJmNhbGxfaWQsICZjb2RlLCAmc3IsICZvbWRPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzciA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgcmVhc29uID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZWFzb24gPSAmdG1wX3JlYXNvbjsKKyAgICAgICAgdG1wX3JlYXNvbi5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzcik7CisgICAgICAgIHRtcF9yZWFzb24uc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhzcikpOworICAgIH0KKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIAorICAgIHsKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUuc2xlbiA9IHN0cmxlbgorCQkJKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpKTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJwanN1YSIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX2hhbmd1cChjYWxsX2lkLCBjb2RlLCByZWFzb24sICZtc2dfZGF0YSk7CQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9oYW5ndXAoY2FsbF9pZCwgY29kZSwgcmVhc29uLCBOVUxMKTsJCisgICAgfQorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9zZXRfaG9sZAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfc2V0X2hvbGQKKyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsgICAgCisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7ICAgIAorICAgIHBqX3Bvb2xfdCAqIHBvb2w7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlPIiwgJmNhbGxfaWQsICZvbWRPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKSAKKyAgICB7CisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKTsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlLnNsZW4gPSBzdHJsZW4KKwkJCShQeVN0cmluZ19Bc1N0cmluZyhvbWQtPmNvbnRlbnRfdHlwZSkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhvbWQtPm1zZ19ib2R5KSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicGpzdWEiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZXRfaG9sZChjYWxsX2lkLCAmbXNnX2RhdGEpOwkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2V0X2hvbGQoY2FsbF9pZCwgTlVMTCk7CQorICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfcmVpbnZpdGUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX3JlaW52aXRlCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGNhbGxfaWQ7ICAgIAorICAgIGludCB1bmhvbGQ7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7ICAgIAorICAgIHBqX3Bvb2xfdCAqIHBvb2w7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpTyIsICZjYWxsX2lkLCAmdW5ob2xkLCAmb21kT2JqKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlLnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKTsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlLnNsZW4gPSBzdHJsZW4KKwkJCShQeVN0cmluZ19Bc1N0cmluZyhvbWQtPmNvbnRlbnRfdHlwZSkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkuc2xlbiA9IHN0cmxlbihQeVN0cmluZ19Bc1N0cmluZyhvbWQtPm1zZ19ib2R5KSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicGpzdWEiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9yZWludml0ZShjYWxsX2lkLCB1bmhvbGQsICZtc2dfZGF0YSk7CQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9yZWludml0ZShjYWxsX2lkLCB1bmhvbGQsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfeGZlcgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfeGZlcgorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBjYWxsX2lkOworICAgIHBqX3N0cl90IGRlc3Q7CisgICAgUHlPYmplY3QgKiBzZDsKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqIG9tZE9iajsKKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YSAqIG9tZDsgICAgCisgICAgcGpfcG9vbF90ICogcG9vbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9PIiwgJmNhbGxfaWQsICZzZCwgJm9tZE9iaikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisgICAgZGVzdC5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzZCk7CisgICAgZGVzdC5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKHNkKSk7CisgICAgCisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUuc2xlbiA9IHN0cmxlbgorCQkJKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpKTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJwanN1YSIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3hmZXIoY2FsbF9pZCwgJmRlc3QsICZtc2dfZGF0YSk7CQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF94ZmVyKGNhbGxfaWQsICZkZXN0LCBOVUxMKTsJCisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IGRlc3RfY2FsbF9pZDsKKyAgICB1bnNpZ25lZCBvcHRpb25zOyAgICAKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqIG9tZE9iajsKKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YSAqIG9tZDsgICAgCisgICAgcGpfcG9vbF90ICogcG9vbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlCisJCShwQXJncywgImlpSU8iLCAmY2FsbF9pZCwgJmRlc3RfY2FsbF9pZCwgJm9wdGlvbnMsICZvbWRPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCQorICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsgICAgCisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZS5zbGVuID0gc3RybGVuCisJCQkoUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpKTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcob21kLT5tc2dfYm9keSkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInBqc3VhIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfeGZlcl9yZXBsYWNlcworCQkJKGNhbGxfaWQsIGRlc3RfY2FsbF9pZCwgb3B0aW9ucywgJm1zZ19kYXRhKTsJCisgICAgICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3hmZXJfcmVwbGFjZXMoY2FsbF9pZCwgZGVzdF9jYWxsX2lkLG9wdGlvbnMsIE5VTEwpOwkKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2RpYWxfZHRtZgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZGlhbF9kdG1mCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBQeU9iamVjdCAqIHNkOworICAgIHBqX3N0cl90IGRpZ2l0czsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpTyIsICZjYWxsX2lkLCAmc2QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICBkaWdpdHMucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2QpOworICAgIGRpZ2l0cy5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKHNkKSk7CisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9kaWFsX2R0bWYoY2FsbF9pZCwgJmRpZ2l0cyk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9zZW5kX2ltCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9zZW5kX2ltCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGNhbGxfaWQ7CisgICAgcGpfc3RyX3QgY29udGVudDsKKyAgICBwal9zdHJfdCAqIG1pbWVfdHlwZSwgdG1wX21pbWVfdHlwZTsKKyAgICBQeU9iamVjdCAqIHNtOworICAgIFB5T2JqZWN0ICogc2M7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKiBvbWRPYmo7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKiBvbWQ7ICAgIAorICAgIGludCB1c2VyX2RhdGE7CisgICAgcGpfcG9vbF90ICogcG9vbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlCisJCShwQXJncywgImlPT09pIiwgJmNhbGxfaWQsICZzbSwgJnNjLCAmb21kT2JqLCAmdXNlcl9kYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc20gPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgIG1pbWVfdHlwZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWltZV90eXBlID0gJnRtcF9taW1lX3R5cGU7CisgICAgICAgIHRtcF9taW1lX3R5cGUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoc20pOworICAgICAgICB0bXBfbWltZV90eXBlLnNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQXNTdHJpbmcoc20pKTsKKyAgICB9CisgICAgY29udGVudC5wdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzYyk7CisgICAgY29udGVudC5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKHNjKSk7CisgICAgCisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUuc2xlbiA9IHN0cmxlbgorCQkJKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpKTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJwanN1YSIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NlbmRfaW0KKwkJKGNhbGxfaWQsIG1pbWVfdHlwZSwgJmNvbnRlbnQsICZtc2dfZGF0YSwgKHZvaWQgKil1c2VyX2RhdGEpOwkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2VuZF9pbQorCQkJKGNhbGxfaWQsIG1pbWVfdHlwZSwgJmNvbnRlbnQsIE5VTEwsICh2b2lkICopdXNlcl9kYXRhKTsJCisgICAgfQorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9zZW5kX3R5cGluZ19pbmQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBjYWxsX2lkOyAgICAKKyAgICBpbnQgaXNfdHlwaW5nOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICogb21kT2JqOworICAgIFB5T2JqX3Bqc3VhX21zZ19kYXRhICogb21kOyAgICAKKyAgICBwal9wb29sX3QgKiBwb29sOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaU8iLCAmY2FsbF9pZCwgJmlzX3R5cGluZywgJm9tZE9iaikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUucHRyID0gUHlTdHJpbmdfQXNTdHJpbmcob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUuc2xlbiA9IHN0cmxlbgorCQkJKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+Y29udGVudF90eXBlKSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5LnB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keS5zbGVuID0gc3RybGVuKFB5U3RyaW5nX0FzU3RyaW5nKG9tZC0+bXNnX2JvZHkpKTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJwanN1YSIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZChjYWxsX2lkLCBpc190eXBpbmcsICZtc2dfZGF0YSk7CQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZW5kX3R5cGluZ19pbmQoY2FsbF9pZCwgaXNfdHlwaW5nLCBOVUxMKTsJCisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9oYW5ndXBfYWxsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9oYW5ndXBfYWxsCisoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHBqc3VhX2NhbGxfaGFuZ3VwX2FsbCgpOworICAgIAorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZHVtcAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZHVtcAorKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IHdpdGhfbWVkaWE7CisgICAgUHlPYmplY3QgKiBzYjsKKyAgICBQeU9iamVjdCAqIHNpOworICAgIGNoYXIgKiBidWZmZXI7CisgICAgY2hhciAqIGluZGVudDsKKyAgICB1bnNpZ25lZCBtYXhsZW47ICAgIAorICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpSU8iLCAmY2FsbF9pZCwgJndpdGhfbWVkaWEsICZtYXhsZW4sICZzaSkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIGJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyAobWF4bGVuICogc2l6ZW9mKGNoYXIpKTsKKyAgICBpbmRlbnQgPSBQeVN0cmluZ19Bc1N0cmluZyhzaSk7CisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9kdW1wKGNhbGxfaWQsIHdpdGhfbWVkaWEsIGJ1ZmZlciwgbWF4bGVuLCBpbmRlbnQpOworICAgIHNiID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBtYXhsZW4pOworICAgIGZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyIsIHNiKTsKK30KKworCisvKgorICogcHlfcGpzdWFfZHVtcAorICogRHVtcCBhcHBsaWNhdGlvbiBzdGF0ZXMuCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZHVtcChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICB1bnNpZ25lZCBvbGRfZGVjb3I7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgaW50IGRldGFpbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZkZXRhaWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJTdGFydCBkdW1waW5nIGFwcGxpY2F0aW9uIHN0YXRlczoiKSk7CisKKyAgICBvbGRfZGVjb3IgPSBwal9sb2dfZ2V0X2RlY29yKCk7CisgICAgcGpfbG9nX3NldF9kZWNvcihvbGRfZGVjb3IgJiAoUEpfTE9HX0hBU19ORVdMSU5FIHwgUEpfTE9HX0hBU19DUikpOworCisgICAgaWYgKGRldGFpbCkKKwlwal9kdW1wX2NvbmZpZygpOworCisgICAgcGpzaXBfZW5kcHRfZHVtcChwanN1YV9nZXRfcGpzaXBfZW5kcHQoKSwgZGV0YWlsKTsKKyAgICBwam1lZGlhX2VuZHB0X2R1bXAocGpzdWFfZ2V0X3BqbWVkaWFfZW5kcHQoKSk7CisgICAgcGpzaXBfdHN4X2xheWVyX2R1bXAoZGV0YWlsKTsKKyAgICBwanNpcF91YV9kdW1wKGRldGFpbCk7CisKKworICAgIC8qIER1bXAgYWxsIGludml0ZSBzZXNzaW9uczogKi8KKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiRHVtcGluZyBpbnZpdGUgc2Vzc2lvbnM6IikpOworCisgICAgaWYgKHBqc3VhX2NhbGxfZ2V0X2NvdW50KCkgPT0gMCkgeworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgLSBubyBzZXNzaW9ucyAtIikpOworCisgICAgfSBlbHNlIHsKKwl1bnNpZ25lZCBpLCBtYXg7CisKKwltYXggPSBwanN1YV9jYWxsX2dldF9tYXhfY291bnQoKTsKKwlmb3IgKGk9MDsgaTxtYXg7ICsraSkgeworCSAgICBpZiAocGpzdWFfY2FsbF9pc19hY3RpdmUoaSkpIHsKKwkJcGpzdWFfY2FsbF9kdW1wKGksIGRldGFpbCwgYnVmLCBzaXplb2YoYnVmKSwgIiAgIik7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsICIlcyIsIGJ1ZikpOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIER1bXAgcHJlc2VuY2Ugc3RhdHVzICovCisgICAgcGpzdWFfcHJlc19kdW1wKGRldGFpbCk7CisKKyAgICBwal9sb2dfc2V0X2RlY29yKG9sZF9kZWNvcik7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkR1bXAgY29tcGxldGUiKSk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9nZXRfbWF4X2NvdW50X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfZ2V0X21heF9jb3VudCAoKSAiCisgICAgIkdldCBtYXhpbXVtIG51bWJlciBvZiBjYWxscyBjb25maWd1cmVkIGluIHBqc3VhLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2dldF9jb3VudF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jYWxsX2dldF9jb3VudCAoKSAiCisgICAgIkdldCBudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBjYWxscy4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9jYWxsc19kb2NbXSA9CisgICAgImludFtdIHB5X3Bqc3VhLmVudW1fY2FsbHMgKCkgIgorICAgICJHZXQgbWF4aW11bSBudW1iZXIgb2YgY2FsbHMgY29uZmlndXJlZCBpbiBwanN1YS4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9tYWtlX2NhbGxfZG9jW10gPQorICAgICJpbnQsaW50IHB5X3Bqc3VhLmNhbGxfbWFrZV9jYWxsIChpbnQgYWNjX2lkLCBzdHJpbmcgZHN0X3VyaSwgaW50IG9wdGlvbnMsIgorICAgICJpbnQgdXNlcl9kYXRhLCBweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJNYWtlIG91dGdvaW5nIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBVUkkgdXNpbmcgdGhlIHNwZWNpZmllZCBhY2NvdW50LiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2lzX2FjdGl2ZV9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jYWxsX2lzX2FjdGl2ZSAoaW50IGNhbGxfaWQpICIKKyAgICAiQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjYWxsIGhhcyBhY3RpdmUgSU5WSVRFIHNlc3Npb24gYW5kIHRoZSBJTlZJVEUgIgorICAgICJzZXNzaW9uIGhhcyBub3QgYmVlbiBkaXNjb25uZWN0ZWQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfaGFzX21lZGlhX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfaGFzX21lZGlhIChpbnQgY2FsbF9pZCkgIgorICAgICJDaGVjayBpZiBjYWxsIGhhcyBhbiBhY3RpdmUgbWVkaWEgc2Vzc2lvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9nZXRfY29uZl9wb3J0X2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfZ2V0X2NvbmZfcG9ydCAoaW50IGNhbGxfaWQpICIKKyAgICAiR2V0IHRoZSBjb25mZXJlbmNlIHBvcnQgaWRlbnRpZmljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2dldF9pbmZvX2RvY1tdID0KKyAgICAicHlfcGpzdWEuQ2FsbF9JbmZvIHB5X3Bqc3VhLmNhbGxfZ2V0X2luZm8gKGludCBjYWxsX2lkKSAiCisgICAgIk9idGFpbiBkZXRhaWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBjYWxsLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX3NldF91c2VyX2RhdGFfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY2FsbF9zZXRfdXNlcl9kYXRhIChpbnQgY2FsbF9pZCwgaW50IHVzZXJfZGF0YSkgIgorICAgICJBdHRhY2ggYXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSB0byB0aGUgY2FsbC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9nZXRfdXNlcl9kYXRhX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfZ2V0X3VzZXJfZGF0YSAoaW50IGNhbGxfaWQpICIKKyAgICAiR2V0IHVzZXIgZGF0YSBhdHRhY2hlZCB0byB0aGUgY2FsbC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9hbnN3ZXJfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY2FsbF9hbnN3ZXIgKGludCBjYWxsX2lkLCBpbnQgY29kZSwgc3RyaW5nIHJlYXNvbiwgIgorICAgICJweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJTZW5kIHJlc3BvbnNlIHRvIGluY29taW5nIElOVklURSByZXF1ZXN0LiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2hhbmd1cF9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jYWxsX2hhbmd1cCAoaW50IGNhbGxfaWQsIGludCBjb2RlLCBzdHJpbmcgcmVhc29uLCAiCisgICAgInB5X3Bqc3VhLk1zZ19EYXRhIG1zZ19kYXRhKSAiCisgICAgIkhhbmd1cCBjYWxsIGJ5IHVzaW5nIG1ldGhvZCB0aGF0IGlzIGFwcHJvcHJpYXRlIGFjY29yZGluZyAiCisgICAgInRvIHRoZSBjYWxsIHN0YXRlLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX3NldF9ob2xkX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfc2V0X2hvbGQgKGludCBjYWxsX2lkLCBweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJQdXQgdGhlIHNwZWNpZmllZCBjYWxsIG9uIGhvbGQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfcmVpbnZpdGVfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY2FsbF9yZWludml0ZSAoaW50IGNhbGxfaWQsIGludCB1bmhvbGQsICIKKyAgICAicHlfcGpzdWEuTXNnX0RhdGEgbXNnX2RhdGEpICIKKyAgICAiU2VuZCByZS1JTlZJVEUgKHRvIHJlbGVhc2UgaG9sZCkuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfeGZlcl9kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jYWxsX3hmZXIgKGludCBjYWxsX2lkLCBzdHJpbmcgZGVzdCwgIgorICAgICJweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJJbml0aWF0ZSBjYWxsIHRyYW5zZmVyIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIgorICAgICJUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBSRUZFUiByZXF1ZXN0IHRvIGluc3RydWN0IHJlbW90ZSBjYWxsIHBhcnR5ICIKKyAgICAidG8gaW5pdGlhdGUgYSBuZXcgSU5WSVRFIHNlc3Npb24gdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi90YXJnZXQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfeGZlcl9yZXBsYWNlc19kb2NbXSA9CisgICAgImludCBweV9wanN1YS5jYWxsX3hmZXJfcmVwbGFjZXMgKGludCBjYWxsX2lkLCBpbnQgZGVzdF9jYWxsX2lkLCAiCisgICAgImludCBvcHRpb25zLCBweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJJbml0aWF0ZSBhdHRlbmRlZCBjYWxsIHRyYW5zZmVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBSRUZFUiByZXF1ZXN0ICIKKyAgICAidG8gaW5zdHJ1Y3QgcmVtb3RlIGNhbGwgcGFydHkgdG8gaW5pdGlhdGUgbmV3IElOVklURSBzZXNzaW9uIHRvIHRoZSBVUkwgIgorICAgICJvZiBkZXN0X2NhbGxfaWQuIFRoZSBwYXJ0eSBhdCBkZXN0X2NhbGxfaWQgdGhlbiBzaG91bGQgJ3JlcGxhY2UnIHRoZSBjYWxsIgorICAgICJ3aXRoIHVzIHdpdGggdGhlIG5ldyBjYWxsIGZyb20gdGhlIFJFRkVSIHJlY2lwaWVudC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9kaWFsX2R0bWZfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY2FsbF9kaWFsX2R0bWYgKGludCBjYWxsX2lkLCBzdHJpbmcgZGlnaXRzKSAiCisgICAgIlNlbmQgRFRNRiBkaWdpdHMgdG8gcmVtb3RlIHVzaW5nIFJGQyAyODMzIHBheWxvYWQgZm9ybWF0cy4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9zZW5kX2ltX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfc2VuZF9pbSAoaW50IGNhbGxfaWQsIHN0cmluZyBtaW1lX3R5cGUsIHN0cmluZyBjb250ZW50LCIKKyAgICAicHlfcGpzdWEuTXNnX0RhdGEgbXNnX2RhdGEsIGludCB1c2VyX2RhdGEpICIKKyAgICAiU2VuZCBpbnN0YW50IG1lc3NhZ2luZyBpbnNpZGUgSU5WSVRFIHNlc3Npb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfc2VuZF90eXBpbmdfaW5kX2RvY1tdID0KKyAgICAiaW50IHB5X3Bqc3VhLmNhbGxfc2VuZF90eXBpbmdfaW5kIChpbnQgY2FsbF9pZCwgaW50IGlzX3R5cGluZywgIgorICAgICJweV9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJTZW5kIElNIHR5cGluZyBpbmRpY2F0aW9uIGluc2lkZSBJTlZJVEUgc2Vzc2lvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9oYW5ndXBfYWxsX2RvY1tdID0KKyAgICAidm9pZCBweV9wanN1YS5jYWxsX2hhbmd1cF9hbGwgKCkgIgorICAgICJUZXJtaW5hdGUgYWxsIGNhbGxzLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2R1bXBfZG9jW10gPQorICAgICJpbnQgcHlfcGpzdWEuY2FsbF9kdW1wIChpbnQgY2FsbF9pZCwgaW50IHdpdGhfbWVkaWEsIGludCBtYXhsZW4sICIKKyAgICAic3RyaW5nIGluZGVudCkgIgorICAgICJEdW1wIGNhbGwgYW5kIG1lZGlhIHN0YXRpc3RpY3MgdG8gc3RyaW5nLiI7CisKKy8qIEVORCBPRiBMSUIgQ0FMTCAqLworCisvKgorICogTWFwIG9mIGZ1bmN0aW9uIG5hbWVzIHRvIGZ1bmN0aW9ucworICovCitzdGF0aWMgUHlNZXRob2REZWYgcHlfcGpzdWFfbWV0aG9kc1tdID0KK3sKKyAgICB7CisgICAgICAgICJ0aHJlYWRfcmVnaXN0ZXIiLCBweV9wanN1YV90aHJlYWRfcmVnaXN0ZXIsIE1FVEhfVkFSQVJHUywgCisgICAgICAgICBwanN1YV90aHJlYWRfcmVnaXN0ZXJfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJwZXJyb3IiLCBweV9wanN1YV9wZXJyb3IsIE1FVEhfVkFSQVJHUywgcGpzdWFfcGVycm9yX2RvYworICAgIH0sCisgICAgeworICAgIAkiY3JlYXRlIiwgcHlfcGpzdWFfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsIHBqc3VhX2NyZWF0ZV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJImluaXQiLCBweV9wanN1YV9pbml0LCBNRVRIX1ZBUkFSR1MsIHBqc3VhX2luaXRfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJzdGFydCIsIHB5X3Bqc3VhX3N0YXJ0LCBNRVRIX1ZBUkFSR1MsIHBqc3VhX3N0YXJ0X2RvYworICAgIH0sCisgICAgeworICAgIAkiZGVzdHJveSIsIHB5X3Bqc3VhX2Rlc3Ryb3ksIE1FVEhfVkFSQVJHUywgcGpzdWFfZGVzdHJveV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJImhhbmRsZV9ldmVudHMiLCBweV9wanN1YV9oYW5kbGVfZXZlbnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgCXBqc3VhX2hhbmRsZV9ldmVudHNfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJ2ZXJpZnlfc2lwX3VybCIsIHB5X3Bqc3VhX3ZlcmlmeV9zaXBfdXJsLCBNRVRIX1ZBUkFSR1MsCisgICAgCXBqc3VhX3ZlcmlmeV9zaXBfdXJsX2RvYworICAgIH0sCisgICAgeworICAgIAkicG9vbF9jcmVhdGUiLCBweV9wanN1YV9wb29sX2NyZWF0ZSwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9wb29sX2NyZWF0ZV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJImdldF9wanNpcF9lbmRwdCIsIHB5X3Bqc3VhX2dldF9wanNpcF9lbmRwdCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9nZXRfcGpzaXBfZW5kcHRfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJnZXRfcGptZWRpYV9lbmRwdCIsIHB5X3Bqc3VhX2dldF9wam1lZGlhX2VuZHB0LCBNRVRIX1ZBUkFSR1MsCisgICAgCXBqc3VhX2dldF9wam1lZGlhX2VuZHB0X2RvYworICAgIH0sCisgICAgeworICAgIAkiZ2V0X3Bvb2xfZmFjdG9yeSIsIHB5X3Bqc3VhX2dldF9wb29sX2ZhY3RvcnksIE1FVEhfVkFSQVJHUywKKyAgICAJcGpzdWFfZ2V0X3Bvb2xfZmFjdG9yeV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJInJlY29uZmlndXJlX2xvZ2dpbmciLCBweV9wanN1YV9yZWNvbmZpZ3VyZV9sb2dnaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgCXBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmdfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJsb2dnaW5nX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCwKKyAgICAJTUVUSF9WQVJBUkdTLCBwanN1YV9sb2dnaW5nX2NvbmZpZ19kZWZhdWx0X2RvYworICAgIH0sCisgICAgeworICAgIAkiY29uZmlnX2RlZmF1bHQiLCBweV9wanN1YV9jb25maWdfZGVmYXVsdCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJIm1lZGlhX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQsIE1FVEhfVkFSQVJHUywKKyAgICAJcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHRfZG9jCisgICAgfSwKKyAgICAKKyAgICAKKyAgICB7CisgICAgCSJtc2dfZGF0YV9pbml0IiwgcHlfcGpzdWFfbXNnX2RhdGFfaW5pdCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9tc2dfZGF0YV9pbml0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAidHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0LCAKKyAgICAgICAgTUVUSF9WQVJBUkdTLHBqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInRyYW5zcG9ydF9jcmVhdGUiLCBweV9wanN1YV90cmFuc3BvcnRfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3RyYW5zcG9ydF9jcmVhdGVfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0cmFuc3BvcnRfZW51bV90cmFuc3BvcnRzIiwgcHlfcGpzdWFfZW51bV90cmFuc3BvcnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2VudW1fdHJhbnNwb3J0c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInRyYW5zcG9ydF9nZXRfaW5mbyIsIHB5X3Bqc3VhX3RyYW5zcG9ydF9nZXRfaW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm9fZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0cmFuc3BvcnRfc2V0X2VuYWJsZSIsIHB5X3Bqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlX2RvYworICAgIH0sCisgICAgeworICAgICAgICJ0cmFuc3BvcnRfY2xvc2UiLCBweV9wanN1YV90cmFuc3BvcnRfY2xvc2UsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfdHJhbnNwb3J0X2Nsb3NlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19nZXRfY291bnQiLCBweV9wanN1YV9hY2NfZ2V0X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19nZXRfY291bnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfaXNfdmFsaWQiLCBweV9wanN1YV9hY2NfaXNfdmFsaWQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2lzX3ZhbGlkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3NldF9kZWZhdWx0IiwgcHlfcGpzdWFfYWNjX3NldF9kZWZhdWx0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19zZXRfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19nZXRfZGVmYXVsdCIsIHB5X3Bqc3VhX2FjY19nZXRfZGVmYXVsdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfZ2V0X2RlZmF1bHRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfYWRkIiwgcHlfcGpzdWFfYWNjX2FkZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfYWRkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2FkZF9sb2NhbCIsIHB5X3Bqc3VhX2FjY19hZGRfbG9jYWwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2FkZF9sb2NhbF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19kZWwiLCBweV9wanN1YV9hY2NfZGVsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19kZWxfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfbW9kaWZ5IiwgcHlfcGpzdWFfYWNjX21vZGlmeSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfbW9kaWZ5X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3NldF9vbmxpbmVfc3RhdHVzIiwgcHlfcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19zZXRfb25saW5lX3N0YXR1czIiLCBweV9wanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1czJfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2Nfc2V0X3JlZ2lzdHJhdGlvbiIsIHB5X3Bqc3VhX2FjY19zZXRfcmVnaXN0cmF0aW9uLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19zZXRfcmVnaXN0cmF0aW9uX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2dldF9pbmZvIiwgcHlfcGpzdWFfYWNjX2dldF9pbmZvLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19nZXRfaW5mb19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVudW1fYWNjcyIsIHB5X3Bqc3VhX2VudW1fYWNjcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2FjY3NfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfZW51bV9pbmZvIiwgcHlfcGpzdWFfYWNjX2VudW1faW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfZW51bV9pbmZvX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2ZpbmRfZm9yX291dGdvaW5nIiwgcHlfcGpzdWFfYWNjX2ZpbmRfZm9yX291dGdvaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19maW5kX2Zvcl9vdXRnb2luZ19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19maW5kX2Zvcl9pbmNvbWluZyIsIHB5X3Bqc3VhX2FjY19maW5kX2Zvcl9pbmNvbWluZywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfZmluZF9mb3JfaW5jb21pbmdfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfY3JlYXRlX3VhY19jb250YWN0IiwgcHlfcGpzdWFfYWNjX2NyZWF0ZV91YWNfY29udGFjdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfY3JlYXRlX3VhY19jb250YWN0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2NyZWF0ZV91YXNfY29udGFjdCIsIHB5X3Bqc3VhX2FjY19jcmVhdGVfdWFzX2NvbnRhY3QsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2NyZWF0ZV91YXNfY29udGFjdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImJ1ZGR5X2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfYnVkZHlfY29uZmlnX2RlZmF1bHQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYnVkZHlfY29uZmlnX2RlZmF1bHRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJnZXRfYnVkZHlfY291bnQiLCBweV9wanN1YV9nZXRfYnVkZHlfY291bnQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZ2V0X2J1ZGR5X2NvdW50X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYnVkZHlfaXNfdmFsaWQiLCBweV9wanN1YV9idWRkeV9pc192YWxpZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9idWRkeV9pc192YWxpZF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVudW1fYnVkZGllcyIsIHB5X3Bqc3VhX2VudW1fYnVkZGllcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2J1ZGRpZXNfZG9jCisgICAgfSwgICAgCisgICAgeworICAgICAgICAiYnVkZHlfZ2V0X2luZm8iLCBweV9wanN1YV9idWRkeV9nZXRfaW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9idWRkeV9nZXRfaW5mb19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImJ1ZGR5X2FkZCIsIHB5X3Bqc3VhX2J1ZGR5X2FkZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9idWRkeV9hZGRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJidWRkeV9kZWwiLCBweV9wanN1YV9idWRkeV9kZWwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYnVkZHlfZGVsX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYnVkZHlfc3Vic2NyaWJlX3ByZXMiLCBweV9wanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInByZXNfZHVtcCIsIHB5X3Bqc3VhX3ByZXNfZHVtcCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9wcmVzX2R1bXBfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJpbV9zZW5kIiwgcHlfcGpzdWFfaW1fc2VuZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9pbV9zZW5kX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiaW1fdHlwaW5nIiwgcHlfcGpzdWFfaW1fdHlwaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2ltX3R5cGluZ19kb2MKKyAgICB9LAorICAgICAgICB7CisgICAgICAgICJjb25mX2dldF9tYXhfcG9ydHMiLCBweV9wanN1YV9jb25mX2dldF9tYXhfcG9ydHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29uZl9nZXRfbWF4X3BvcnRzX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9nZXRfYWN0aXZlX3BvcnRzIiwgcHlfcGpzdWFfY29uZl9nZXRfYWN0aXZlX3BvcnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVudW1fY29uZl9wb3J0cyIsIHB5X3Bqc3VhX2VudW1fY29uZl9wb3J0cywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2NvbmZfcG9ydHNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb25mX2dldF9wb3J0X2luZm8iLCBweV9wanN1YV9jb25mX2dldF9wb3J0X2luZm8sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9hZGRfcG9ydCIsIHB5X3Bqc3VhX2NvbmZfYWRkX3BvcnQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29uZl9hZGRfcG9ydF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNvbmZfcmVtb3ZlX3BvcnQiLCBweV9wanN1YV9jb25mX3JlbW92ZV9wb3J0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfcmVtb3ZlX3BvcnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb25mX2Nvbm5lY3QiLCBweV9wanN1YV9jb25mX2Nvbm5lY3QsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29uZl9jb25uZWN0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9kaXNjb25uZWN0IiwgcHlfcGpzdWFfY29uZl9kaXNjb25uZWN0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfZGlzY29ubmVjdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInBsYXllcl9jcmVhdGUiLCBweV9wanN1YV9wbGF5ZXJfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3BsYXllcl9jcmVhdGVfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJwbGF5ZXJfZ2V0X2NvbmZfcG9ydCIsIHB5X3Bqc3VhX3BsYXllcl9nZXRfY29uZl9wb3J0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3BsYXllcl9nZXRfY29uZl9wb3J0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAicGxheWVyX3NldF9wb3MiLCBweV9wanN1YV9wbGF5ZXJfc2V0X3BvcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9wbGF5ZXJfc2V0X3Bvc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInBsYXllcl9kZXN0cm95IiwgcHlfcGpzdWFfcGxheWVyX2Rlc3Ryb3ksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfcGxheWVyX2Rlc3Ryb3lfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJyZWNvcmRlcl9jcmVhdGUiLCBweV9wanN1YV9yZWNvcmRlcl9jcmVhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfcmVjb3JkZXJfY3JlYXRlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAicmVjb3JkZXJfZ2V0X2NvbmZfcG9ydCIsIHB5X3Bqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInJlY29yZGVyX2Rlc3Ryb3kiLCBweV9wanN1YV9yZWNvcmRlcl9kZXN0cm95LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3JlY29yZGVyX2Rlc3Ryb3lfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJlbnVtX3NuZF9kZXZzIiwgcHlfcGpzdWFfZW51bV9zbmRfZGV2cywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX3NuZF9kZXZzX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZ2V0X3NuZF9kZXYiLCBweV9wanN1YV9nZXRfc25kX2RldiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9nZXRfc25kX2Rldl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInNldF9zbmRfZGV2IiwgcHlfcGpzdWFfc2V0X3NuZF9kZXYsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfc2V0X3NuZF9kZXZfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJzZXRfbnVsbF9zbmRfZGV2IiwgcHlfcGpzdWFfc2V0X251bGxfc25kX2RldiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9zZXRfbnVsbF9zbmRfZGV2X2RvYworICAgIH0sCisgICAgeworICAgICAgICAic2V0X25vX3NuZF9kZXYiLCBweV9wanN1YV9zZXRfbm9fc25kX2RldiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9zZXRfbm9fc25kX2Rldl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInNldF9lYyIsIHB5X3Bqc3VhX3NldF9lYywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9zZXRfZWNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJnZXRfZWNfdGFpbCIsIHB5X3Bqc3VhX2dldF9lY190YWlsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2dldF9lY190YWlsX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9jb2RlY3MiLCBweV9wanN1YV9lbnVtX2NvZGVjcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2NvZGVjc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNvZGVjX3NldF9wcmlvcml0eSIsIHB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jb2RlY19zZXRfcHJpb3JpdHlfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb2RlY19nZXRfcGFyYW0iLCBweV9wanN1YV9jb2RlY19nZXRfcGFyYW0sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29kZWNfZ2V0X3BhcmFtX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29kZWNfc2V0X3BhcmFtIiwgcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvZGVjX3NldF9wYXJhbV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X21heF9jb3VudCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X21heF9jb3VudCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9tYXhfY291bnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2dldF9jb3VudCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfZ2V0X2NvdW50X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9jYWxscyIsIHB5X3Bqc3VhX2VudW1fY2FsbHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZW51bV9jYWxsc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfbWFrZV9jYWxsIiwgcHlfcGpzdWFfY2FsbF9tYWtlX2NhbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9tYWtlX2NhbGxfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2lzX2FjdGl2ZSIsIHB5X3Bqc3VhX2NhbGxfaXNfYWN0aXZlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfaXNfYWN0aXZlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9oYXNfbWVkaWEiLCBweV9wanN1YV9jYWxsX2hhc19tZWRpYSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2hhc19tZWRpYV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X2NvbmZfcG9ydCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9jb25mX3BvcnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2dldF9pbmZvIiwgcHlfcGpzdWFfY2FsbF9nZXRfaW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9pbmZvX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9zZXRfdXNlcl9kYXRhIiwgcHlfcGpzdWFfY2FsbF9zZXRfdXNlcl9kYXRhLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfc2V0X3VzZXJfZGF0YV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X3VzZXJfZGF0YSIsIHB5X3Bqc3VhX2NhbGxfZ2V0X3VzZXJfZGF0YSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF91c2VyX2RhdGFfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2Fuc3dlciIsIHB5X3Bqc3VhX2NhbGxfYW5zd2VyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfYW5zd2VyX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9oYW5ndXAiLCBweV9wanN1YV9jYWxsX2hhbmd1cCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2hhbmd1cF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfc2V0X2hvbGQiLCBweV9wanN1YV9jYWxsX3NldF9ob2xkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfc2V0X2hvbGRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX3JlaW52aXRlIiwgcHlfcGpzdWFfY2FsbF9yZWludml0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX3JlaW52aXRlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF94ZmVyIiwgcHlfcGpzdWFfY2FsbF94ZmVyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfeGZlcl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfeGZlcl9yZXBsYWNlcyIsIHB5X3Bqc3VhX2NhbGxfeGZlcl9yZXBsYWNlcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX3hmZXJfcmVwbGFjZXNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2RpYWxfZHRtZiIsIHB5X3Bqc3VhX2NhbGxfZGlhbF9kdG1mLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfZGlhbF9kdG1mX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9zZW5kX2ltIiwgcHlfcGpzdWFfY2FsbF9zZW5kX2ltLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfc2VuZF9pbV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfc2VuZF90eXBpbmdfaW5kIiwgcHlfcGpzdWFfY2FsbF9zZW5kX3R5cGluZ19pbmQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9zZW5kX3R5cGluZ19pbmRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2hhbmd1cF9hbGwiLCBweV9wanN1YV9jYWxsX2hhbmd1cF9hbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9oYW5ndXBfYWxsX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9kdW1wIiwgcHlfcGpzdWFfY2FsbF9kdW1wLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfZHVtcF9kb2MKKyAgICB9LAorICAgIHsKKwkiZHVtcCIsIHB5X3Bqc3VhX2R1bXAsIE1FVEhfVkFSQVJHUywgIkR1bXAgYXBwbGljYXRpb24gc3RhdGUiCisgICAgfSwKKworICAgIAorICAgIHtOVUxMLCBOVUxMfSAvKiBlbmQgb2YgZnVuY3Rpb24gbGlzdCAqLworfTsKKworCisKKy8qCisgKiBNYXBwaW5nIEMgc3RydWN0cyBmcm9tIGFuZCB0byBQeXRob24gb2JqZWN0cyAmIGluaXRpYWxpemluZyBvYmplY3QKKyAqLworRExfRVhQT1JUKHZvaWQpCitpbml0cHlfcGpzdWEodm9pZCkKK3sKKyAgICBQeU9iamVjdCogbSA9IE5VTEw7CisjZGVmaW5lIEFERF9DT05TVEFOVChtb2QsbmFtZSkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kLCNuYW1lLG5hbWUpCisKKyAgICAKKyAgICBQeUV2YWxfSW5pdFRocmVhZHMoKTsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2NhbGxiYWNrKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9jb25maWcpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2xvZ2dpbmdfY29uZmlnKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9tc2dfZGF0YSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX21lZGlhX2NvbmZpZykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpzaXBfZXZlbnQudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzaXBfZXZlbnQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5VHlwX3Bqc2lwX3J4X2RhdGEudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzaXBfcnhfZGF0YSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpfcG9vbF90LnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3BqX3Bvb2xfdCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpzaXBfZW5kcG9pbnQudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzaXBfZW5kcG9pbnQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5VHlwX3BqbWVkaWFfZW5kcHQudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGptZWRpYV9lbmRwdCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpfcG9vbF9mYWN0b3J5LnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3BqX3Bvb2xfZmFjdG9yeSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGpzaXBfY3JlZF9pbmZvLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc2lwX2NyZWRfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBMSUIgVFJBTlNQT1JUICovCisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV90cmFuc3BvcnRfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLyogRU5EIE9GIExJQiBUUkFOU1BPUlQgKi8KKworICAgIC8qIExJQiBBQ0NPVU5UICovCisKKyAgICAKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9hY2NfY29uZmlnKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9hY2NfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBFTkQgT0YgTElCIEFDQ09VTlQgKi8KKworICAgIC8qIExJQiBCVUREWSAqLworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfYnVkZHlfY29uZmlnKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9idWRkeV9pbmZvKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEVORCBPRiBMSUIgQlVERFkgKi8KKworICAgIC8qIExJQiBNRURJQSAqLworICAKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9jb2RlY19pbmZvKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2NvbmZfcG9ydF9pbmZvKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIFB5VHlwX3BqbWVkaWFfcG9ydC50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wam1lZGlhX3BvcnQpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGptZWRpYV9zbmRfZGV2X2luZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEVORCBPRiBMSUIgTUVESUEgKi8KKworICAgIC8qIExJQiBDQUxMICovCisKKyAgICBQeVR5cF9wal90aW1lX3ZhbC50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wal90aW1lX3ZhbCkgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9jYWxsX2luZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRU5EIE9GIExJQiBDQUxMICovCisKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoCisgICAgICAgICJweV9wanN1YSIsIHB5X3Bqc3VhX21ldGhvZHMsIlBKU1VBLWxpYiBtb2R1bGUgZm9yIHB5dGhvbiIKKyAgICApOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9jYWxsYmFjayk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDYWxsYmFjayIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9jYWxsYmFjayk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2NvbmZpZyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb25maWciLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfY29uZmlnKTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhX0NvbmZpZyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9tZWRpYV9jb25maWcpOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9sb2dnaW5nX2NvbmZpZyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMb2dnaW5nX0NvbmZpZyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9sb2dnaW5nX2NvbmZpZyk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX21zZ19kYXRhKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1zZ19EYXRhIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX21zZ19kYXRhKTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzaXBfZXZlbnQpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUGpzaXBfRXZlbnQiLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzaXBfZXZlbnQpOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanNpcF9yeF9kYXRhKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBqc2lwX1J4X0RhdGEiLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzaXBfcnhfZGF0YSk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3BqX3Bvb2xfdCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQal9Qb29sIiwgKFB5T2JqZWN0ICopJlB5VHlwX3BqX3Bvb2xfdCk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc2lwX2VuZHBvaW50KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBqc2lwX0VuZHBvaW50IiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc2lwX2VuZHBvaW50KTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGptZWRpYV9lbmRwdCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQam1lZGlhX0VuZHB0IiwgKFB5T2JqZWN0ICopJlB5VHlwX3BqbWVkaWFfZW5kcHQpOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wal9wb29sX2ZhY3RvcnkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdCgKKyAgICAgICAgbSwgIlBqX1Bvb2xfRmFjdG9yeSIsIChQeU9iamVjdCAqKSZQeVR5cF9wal9wb29sX2ZhY3RvcnkKKyAgICApOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanNpcF9jcmVkX2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUGpzaXBfQ3JlZF9JbmZvIiwKKyAgICAgICAgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc2lwX2NyZWRfaW5mbworICAgICk7CisKKyAgICAvKiBMSUIgVFJBTlNQT1JUICovCisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdAorICAgICAgICAobSwgIlRyYW5zcG9ydF9Db25maWciLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyk7CisgICAgCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV90cmFuc3BvcnRfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFuc3BvcnRfSW5mbyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV90cmFuc3BvcnRfaW5mbyk7CisgICAgCisKKyAgICAvKiBFTkQgT0YgTElCIFRSQU5TUE9SVCAqLworCisgICAgLyogTElCIEFDQ09VTlQgKi8KKworICAgIAorICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfYWNjX2NvbmZpZyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBY2NfQ29uZmlnIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX2FjY19jb25maWcpOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfYWNjX2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWNjX0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfYWNjX2luZm8pOworCisgICAgLyogRU5EIE9GIExJQiBBQ0NPVU5UICovCisKKyAgICAvKiBMSUIgQlVERFkgKi8KKyAgICAKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2J1ZGR5X2NvbmZpZyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCdWRkeV9Db25maWciLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfYnVkZHlfY29uZmlnKTsKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2J1ZGR5X2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQnVkZHlfSW5mbyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9idWRkeV9pbmZvKTsKKworICAgIC8qIEVORCBPRiBMSUIgQlVERFkgKi8KKworICAgIC8qIExJQiBNRURJQSAqLworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9jb2RlY19pbmZvKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvZGVjX0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfY29kZWNfaW5mbyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb25mX1BvcnRfSW5mbyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wam1lZGlhX3BvcnQpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUEpNZWRpYV9Qb3J0IiwgKFB5T2JqZWN0ICopJlB5VHlwX3BqbWVkaWFfcG9ydCk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wam1lZGlhX3NuZF9kZXZfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQSk1lZGlhX1NuZF9EZXZfSW5mbyIsIAorCShQeU9iamVjdCAqKSZQeVR5cF9wam1lZGlhX3NuZF9kZXZfaW5mbyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUEpNZWRpYV9Db2RlY19QYXJhbV9JbmZvIiwgCisJKFB5T2JqZWN0ICopJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUEpNZWRpYV9Db2RlY19QYXJhbV9TZXR0aW5nIiwgCisJKFB5T2JqZWN0ICopJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBKTWVkaWFfQ29kZWNfUGFyYW0iLCAKKwkoUHlPYmplY3QgKikmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbSk7CisKKyAgICAvKiBFTkQgT0YgTElCIE1FRElBICovCisKKyAgICAvKiBMSUIgQ0FMTCAqLworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wal90aW1lX3ZhbCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQSl9UaW1lX1ZhbCIsIChQeU9iamVjdCAqKSZQeVR5cF9wal90aW1lX3ZhbCk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2NhbGxfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDYWxsX0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfY2FsbF9pbmZvKTsKKworICAgIC8qIEVORCBPRiBMSUIgQ0FMTCAqLworCisKKyAgICAvKgorICAgICAqIEFkZCB2YXJpb3VzIGNvbnN0YW50cy4KKyAgICAgKi8KKworICAgIC8qIENhbGwgc3RhdGVzICovCisgICAgQUREX0NPTlNUQU5UKG0sIFBKU0lQX0lOVl9TVEFURV9OVUxMKTsKKyAgICBBRERfQ09OU1RBTlQobSwgUEpTSVBfSU5WX1NUQVRFX0NBTExJTkcpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9JTlZfU1RBVEVfSU5DT01JTkcpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9JTlZfU1RBVEVfRUFSTFkpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9JTlZfU1RBVEVfQ09OTkVDVElORyk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEKTsKKworICAgIC8qIENhbGwgbWVkaWEgc3RhdHVzIChlbnVtIHBqc3VhX2NhbGxfbWVkaWFfc3RhdHVzKSAqLworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9DQUxMX01FRElBX05PTkUpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9DQUxMX01FRElBX0FDVElWRSk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0NBTExfTUVESUFfTE9DQUxfSE9MRCk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0NBTExfTUVESUFfUkVNT1RFX0hPTEQpOworCisgICAgLyogQnVkZHkgc3RhdHVzICovCisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0JVRERZX1NUQVRVU19VTktOT1dOKTsKKyAgICBBRERfQ09OU1RBTlQobSwgUEpTVUFfQlVERFlfU1RBVFVTX09OTElORSk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0JVRERZX1NUQVRVU19PRkZMSU5FKTsKKworICAgIC8qIFBKU0lQIHRyYW5zcG9ydCB0eXBlcyAoZW51bSBwanNpcF90cmFuc3BvcnRfdHlwZV9lKSAqLworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9UUkFOU1BPUlRfVU5TUEVDSUZJRUQpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9UUkFOU1BPUlRfVURQKTsKKyAgICBBRERfQ09OU1RBTlQobSwgUEpTSVBfVFJBTlNQT1JUX1RDUCk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU0lQX1RSQU5TUE9SVF9UTFMpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNJUF9UUkFOU1BPUlRfU0NUUCk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU0lQX1RSQU5TUE9SVF9MT09QKTsKKyAgICBBRERfQ09OU1RBTlQobSwgUEpTSVBfVFJBTlNQT1JUX0xPT1BfREdSQU0pOworCisKKyAgICAvKiBJbnZhbGlkIElEcyAqLworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9JTlZBTElEX0lEKTsKKworCisgICAgLyogVmFyaW91cyBjb21waWxlIHRpbWUgY29uc3RhbnRzICovCisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0FDQ19NQVhfUFJPWElFUyk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX01BWF9BQ0MpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9SRUdfSU5URVJWQUwpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9QVUJMSVNIX0VYUElSQVRJT04pOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9ERUZBVUxUX0FDQ19QUklPUklUWSk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX01BWF9CVURESUVTKTsKKyAgICBBRERfQ09OU1RBTlQobSwgUEpTVUFfTUFYX0NPTkZfUE9SVFMpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9ERUZBVUxUX0NMT0NLX1JBVEUpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9ERUZBVUxUX0NPREVDX1FVQUxJVFkpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9ERUZBVUxUX0lMQkNfTU9ERSk7CisgICAgQUREX0NPTlNUQU5UKG0sIFBKU1VBX0RFRkFVTFRfRUNfVEFJTF9MRU4pOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9NQVhfQ0FMTFMpOworICAgIEFERF9DT05TVEFOVChtLCBQSlNVQV9YRkVSX05PX1JFUVVJUkVfUkVQTEFDRVMpOworCisKKyN1bmRlZiBBRERfQ09OU1RBTlQKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3B5X3Bqc3VhLmRlZiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3B5X3Bqc3VhLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRkMmYzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvcHlfcGpzdWEuZGVmCkBAIC0wLDAgKzEsMiBAQAorRVhQT1JUUworCWluaXRweV9wanN1YQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvcHlfcGpzdWEuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3B5X3Bqc3VhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ODYzNQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5X3Bqc3VhL3B5X3Bqc3VhLmgKQEAgLTAsMCArMSwyNjYyIEBACisvKiAkSWQ6IHB5X3Bqc3VhLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QWV9QSlNVQV9IX18KKyNkZWZpbmUgX19QWV9QSlNVQV9IX18KKworI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPgorI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YS5oPgorCisKK1BKX0lOTElORShwal9zdHJfdCkgUHlTdHJpbmdfdG9fcGpfc3RyKGNvbnN0IFB5T2JqZWN0ICpvYmopCit7CisgICAgcGpfc3RyX3Qgc3RyOworCisgICAgaWYgKG9iaikgeworCXN0ci5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKKwlzdHIuc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7CisgICAgfSBlbHNlIHsKKwlzdHIucHRyID0gTlVMTDsKKwlzdHIuc2xlbiA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wal9wb29sCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgcGpfcG9vbF90ICogcG9vbDsKK30gUHlPYmpfcGpfcG9vbDsKKworCisvKgorICogUHlUeXBfcGpfcG9vbF90CisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpfcG9vbF90ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5Qal9Qb29sIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3BqX3Bvb2wpLCAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAicGpfcG9vbF90IG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanNpcF9lbmRwb2ludAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHBqc2lwX2VuZHBvaW50ICogZW5kcHQ7Cit9IFB5T2JqX3Bqc2lwX2VuZHBvaW50OworCisKKy8qCisgKiBQeVR5cF9wanNpcF9lbmRwb2ludAorICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc2lwX2VuZHBvaW50ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5QanNpcF9FbmRwb2ludCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc2lwX2VuZHBvaW50KSwvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAicGpzaXBfZW5kcG9pbnQgb2JqZWN0cyIsICAvKiB0cF9kb2MgKi8KK307CisKKworLyoKKyAqIFB5T2JqX3BqbWVkaWFfZW5kcHQKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBwam1lZGlhX2VuZHB0ICogZW5kcHQ7Cit9IFB5T2JqX3BqbWVkaWFfZW5kcHQ7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlUeXBfcGptZWRpYV9lbmRwdAorICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqbWVkaWFfZW5kcHQgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLlBqbWVkaWFfRW5kcHQiLCAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGptZWRpYV9lbmRwdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJwam1lZGlhX2VuZHB0IG9iamVjdHMiLCAgIC8qIHRwX2RvYyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3BqX3Bvb2xfZmFjdG9yeQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHBqX3Bvb2xfZmFjdG9yeSAqIHBvb2xfZmFjdDsKK30gUHlPYmpfcGpfcG9vbF9mYWN0b3J5OworCisKKworLyoKKyAqIFB5VHlwX3BqX3Bvb2xfZmFjdG9yeQorICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqX3Bvb2xfZmFjdG9yeSA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuUGpfUG9vbF9GYWN0b3J5IiwvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wal9wb29sX2ZhY3RvcnkpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAicGpfcG9vbF9mYWN0b3J5IG9iamVjdHMiLCAvKiB0cF9kb2MgKi8KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanNpcF9jcmVkX2luZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIFB5T2JqZWN0ICpyZWFsbTsKKyAgICBQeU9iamVjdCAqc2NoZW1lOworICAgIFB5T2JqZWN0ICp1c2VybmFtZTsKKyAgICBpbnQJICAgICAgZGF0YV90eXBlOworICAgIFB5T2JqZWN0ICpkYXRhOworICAgIAorfSBQeU9ial9wanNpcF9jcmVkX2luZm87CisKKy8qCisgKiBjcmVkX2luZm9fZGVhbGxvYworICogZGVsZXRlcyBhIGNyZWQgaW5mbyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanNpcF9jcmVkX2luZm9fZGVsZXRlKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlYWxtKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnNjaGVtZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT51c2VybmFtZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kYXRhKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzaXBfY3JlZF9pbmZvX2ltcG9ydChQeU9ial9wanNpcF9jcmVkX2luZm8gKm9iaiwKKwkJCQkJIGNvbnN0IHBqc2lwX2NyZWRfaW5mbyAqY2ZnKQoreworICAgIFB5X1hERUNSRUYob2JqLT5yZWFsbSk7CisgICAgb2JqLT5yZWFsbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNmZy0+cmVhbG0ucHRyLCBjZmctPnJlYWxtLnNsZW4pOworICAgIFB5X1hERUNSRUYob2JqLT5zY2hlbWUpOworICAgIG9iai0+c2NoZW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT5zY2hlbWUucHRyLCBjZmctPnNjaGVtZS5zbGVuKTsKKyAgICBQeV9YREVDUkVGKG9iai0+dXNlcm5hbWUpOworICAgIG9iai0+dXNlcm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPnVzZXJuYW1lLnB0ciwgY2ZnLT51c2VybmFtZS5zbGVuKTsKKyAgICBvYmotPmRhdGFfdHlwZSA9IGNmZy0+ZGF0YV90eXBlOworICAgIFB5X1hERUNSRUYob2JqLT5kYXRhKTsKKyAgICBvYmotPmRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPmRhdGEucHRyLCBjZmctPmRhdGEuc2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19leHBvcnQocGpzaXBfY3JlZF9pbmZvICpjZmcsCisJCQkJCSBQeU9ial9wanNpcF9jcmVkX2luZm8gKm9iaikKK3sKKyAgICBjZmctPnJlYWxtCT0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+cmVhbG0pOworICAgIGNmZy0+c2NoZW1lCT0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+c2NoZW1lKTsKKyAgICBjZmctPnVzZXJuYW1lID0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+dXNlcm5hbWUpOworICAgIGNmZy0+ZGF0YV90eXBlID0gb2JqLT5kYXRhX3R5cGU7CisgICAgY2ZnLT5kYXRhCT0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+ZGF0YSk7Cit9CisKKworLyoKKyAqIGNyZWRfaW5mb19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBjcmVkX2luZm8gb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzaXBfY3JlZF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanNpcF9jcmVkX2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2VsZi0+cmVhbG0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnJlYWxtID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnNjaGVtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+c2NoZW1lID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnVzZXJuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT51c2VybmFtZSA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCXNlbGYtPmRhdGFfdHlwZSA9IFBKU0lQX0NSRURfREFUQV9QTEFJTl9QQVNTV0Q7CisgICAgICAgIHNlbGYtPmRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPmRhdGEgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzaXBfY3JlZF9pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgInJlYWxtIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbywgcmVhbG0pLCAwLAorICAgICAgICAiUmVhbG0iCisgICAgfSwKKyAgICB7CisgICAgICAgICJzY2hlbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzaXBfY3JlZF9pbmZvLCBzY2hlbWUpLCAwLAorICAgICAgICAiU2NoZW1lIgorICAgIH0sCisgICAgeworICAgICAgICAidXNlcm5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzaXBfY3JlZF9pbmZvLCB1c2VybmFtZSksIDAsCisgICAgICAgICJVc2VyIG5hbWUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJkYXRhIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbywgZGF0YSksIDAsCisgICAgICAgICJUaGUgZGF0YSwgd2hpY2ggY2FuIGJlIGEgcGxhaW50ZXh0IHBhc3N3b3JkIG9yIGEgaGFzaGVkIGRpZ2VzdCwgIgorCSJkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGRhdGFfdHlwZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImRhdGFfdHlwZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanNpcF9jcmVkX2luZm8sIGRhdGFfdHlwZSksIDAsCisgICAgICAgICJUeXBlIG9mIGRhdGEiCisgICAgfSwKKyAgICAKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisvKgorICogUHlUeXBfcGpzaXBfY3JlZF9pbmZvCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzaXBfY3JlZF9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLlBqc2lwX0NyZWRfSW5mbyIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzaXBfY3JlZF9pbmZvKSwgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc2lwX2NyZWRfaW5mb19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiUEpTSVAgY3JlZGVudGlhbCBpbmZvcm1hdGlvbiIsIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzaXBfY3JlZF9pbmZvX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanNpcF9jcmVkX2luZm9fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanNpcF9ldmVudAorICogQy9weXRob24gdHlwZXdyYXBwZXIgZm9yIGV2ZW50IHN0cnVjdAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHBqc2lwX2V2ZW50ICogZXZlbnQ7Cit9IFB5T2JqX3Bqc2lwX2V2ZW50OworCisKKworLyoKKyAqIFB5VHlwX3Bqc2lwX2V2ZW50CisgKiBldmVudCBzdHJ1Y3Qgc2lnbmF0dXJlcworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc2lwX2V2ZW50ID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuUGpzaXBfRXZlbnQiLCAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzaXBfZXZlbnQpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAicGpzaXBfZXZlbnQgb2JqZWN0IiwgICAgICAgLyp0cF9kb2MgKi8KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzaXBfcnhfZGF0YQorICogQy9weXRob24gdHlwZXdyYXBwZXIgZm9yIHBqc2lwX3J4X2RhdGEgc3RydWN0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgcGpzaXBfcnhfZGF0YSAqIHJkYXRhOworfSBQeU9ial9wanNpcF9yeF9kYXRhOworCisKKy8qCisgKiBQeVR5cF9wanNpcF9yeF9kYXRhCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzaXBfcnhfZGF0YSA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5QanNpcF9SeF9EYXRhIiwgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzaXBfcnhfZGF0YSksICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAicGpzaXBfcnhfZGF0YSBvYmplY3QiLCAgICAgICAgIC8qdHBfZG9jKi8KK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV9jYWxsYmFjaworICogQy9weXRob24gdHlwZXdyYXBwZXIgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCit0eXBlZGVmIHN0cnVjdCBQeU9ial9wanN1YV9jYWxsYmFjaworeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIFB5T2JqZWN0ICogb25fY2FsbF9zdGF0ZTsKKyAgICBQeU9iamVjdCAqIG9uX2luY29taW5nX2NhbGw7CisgICAgUHlPYmplY3QgKiBvbl9jYWxsX21lZGlhX3N0YXRlOworICAgIFB5T2JqZWN0ICogb25fZHRtZl9kaWdpdDsKKyAgICBQeU9iamVjdCAqIG9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdDsKKyAgICBQeU9iamVjdCAqIG9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzOworICAgIFB5T2JqZWN0ICogb25fY2FsbF9yZXBsYWNlX3JlcXVlc3Q7CisgICAgUHlPYmplY3QgKiBvbl9jYWxsX3JlcGxhY2VkOworICAgIFB5T2JqZWN0ICogb25fcmVnX3N0YXRlOworICAgIFB5T2JqZWN0ICogb25fYnVkZHlfc3RhdGU7CisgICAgUHlPYmplY3QgKiBvbl9wYWdlcjsKKyAgICBQeU9iamVjdCAqIG9uX3BhZ2VyX3N0YXR1czsKKyAgICBQeU9iamVjdCAqIG9uX3R5cGluZzsKK30gUHlPYmpfcGpzdWFfY2FsbGJhY2s7CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2NhbGxiYWNrX2RlbGV0ZQorICogZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2NhbGxiYWNrX2RlbGV0ZShQeU9ial9wanN1YV9jYWxsYmFjayogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2NhbGxfc3RhdGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25faW5jb21pbmdfY2FsbCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9jYWxsX21lZGlhX3N0YXRlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2R0bWZfZGlnaXQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2NhbGxfcmVwbGFjZWQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fcmVnX3N0YXRlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2J1ZGR5X3N0YXRlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX3BhZ2VyKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX3BhZ2VyX3N0YXR1cyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl90eXBpbmcpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfY2FsbGJhY2tfbmV3CisgKiAqIGRlY2xhcmVzIGNvbnN0cnVjdG9yIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfY2FsbGJhY2tfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9jYWxsYmFjayAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfY2FsbGJhY2sgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9jYWxsX3N0YXRlID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX2NhbGxfc3RhdGUgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9pbmNvbWluZ19jYWxsID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX2luY29taW5nX2NhbGwgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9jYWxsX21lZGlhX3N0YXRlID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX2NhbGxfbWVkaWFfc3RhdGUgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9kdG1mX2RpZ2l0ID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX2R0bWZfZGlnaXQgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QgPSBQeV9Ob25lOworICAgICAgICBpZiAoc2VsZi0+b25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0ID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+b25fY2FsbF90cmFuc2Zlcl9zdGF0dXMgPSBQeV9Ob25lOworICAgICAgICBpZiAoc2VsZi0+b25fY2FsbF90cmFuc2Zlcl9zdGF0dXMgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCA9IFB5X05vbmU7CisgICAgICAgIGlmIChzZWxmLT5vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHNlbGYtPm9uX2NhbGxfcmVwbGFjZWQgPSBQeV9Ob25lOworICAgICAgICBpZiAoc2VsZi0+b25fY2FsbF9yZXBsYWNlZCA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHNlbGYtPm9uX3JlZ19zdGF0ZSA9IFB5X05vbmU7CisgICAgICAgIGlmIChzZWxmLT5vbl9yZWdfc3RhdGUgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBzZWxmLT5vbl9idWRkeV9zdGF0ZSA9IFB5X05vbmU7CisgICAgICAgIGlmIChzZWxmLT5vbl9idWRkeV9zdGF0ZSA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHNlbGYtPm9uX3BhZ2VyID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX3BhZ2VyID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+b25fcGFnZXJfc3RhdHVzID0gUHlfTm9uZTsKKyAgICAgICAgaWYgKHNlbGYtPm9uX3BhZ2VyX3N0YXR1cyA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHNlbGYtPm9uX3R5cGluZyA9IFB5X05vbmU7CisgICAgICAgIGlmIChzZWxmLT5vbl90eXBpbmcgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfY2FsbGJhY2tfbWVtYmVycworICogZGVjbGFyZXMgYXZhaWxhYmxlIGZ1bmN0aW9ucyBmb3IgY2FsbGJhY2sgb2JqZWN0CisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV9jYWxsYmFja19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgIm9uX2NhbGxfc3RhdGUiLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX2NhbGxfc3RhdGUpLCAwLCAKKwkiTm90aWZ5IGFwcGxpY2F0aW9uIHdoZW4gaW52aXRlIHN0YXRlIGhhcyBjaGFuZ2VkLiBBcHBsaWNhdGlvbiBtYXkgIgorICAgICAgICAidGhlbiBxdWVyeSB0aGUgY2FsbCBpbmZvIHRvIGdldCB0aGUgZGV0YWlsIGNhbGwgc3RhdGVzLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX2luY29taW5nX2NhbGwiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX2luY29taW5nX2NhbGwpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIG9uIGluY29taW5nIGNhbGwuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fY2FsbF9tZWRpYV9zdGF0ZSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF9tZWRpYV9zdGF0ZSksIDAsCisgICAgICAgICJOb3RpZnkgYXBwbGljYXRpb24gd2hlbiBtZWRpYSBzdGF0ZSBpbiB0aGUgY2FsbCBoYXMgY2hhbmdlZC4gTm9ybWFsICIKKyAgICAgICAgImFwcGxpY2F0aW9uIHdvdWxkIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2ssIGUuZy4gdG8gY29ubmVjdCAiCisgICAgICAgICJ0aGUgY2FsbCdzIG1lZGlhIHRvIHNvdW5kIGRldmljZS4iCisgICAgfSwKKyAgICB7CisJIm9uX2R0bWZfZGlnaXQiLCBUX09CSkVDVF9FWCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fZHRtZl9kaWdpdCksIDAsCisJIk5vdGlmeSBhcHBsaWNhdGlvbiB1cG9uIHJlY2VpdmluZyBpbmNvbWluZyBEVE1GIGRpZ2l0LiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0KSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiBvbiBjYWxsIGJlaW5nIHRyYW5zZmVyZWQuICIKKwkiQXBwbGljYXRpb24gY2FuIGRlY2lkZSB0byBhY2NlcHQvcmVqZWN0IHRyYW5zZmVyIHJlcXVlc3QgIgorCSJieSBzZXR0aW5nIHRoZSBjb2RlIChkZWZhdWx0IGlzIDIwMCkuIFdoZW4gdGhpcyBjYWxsYmFjayAiCisJImlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhY2NlcHQgdGhlICIKKwkidHJhbnNmZXIuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fY2FsbF90cmFuc2Zlcl9zdGF0dXMiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiBvZiB0aGUgc3RhdHVzIG9mIHByZXZpb3VzbHkgc2VudCBjYWxsICIKKyAgICAgICAgInRyYW5zZmVyIHJlcXVlc3QuIEFwcGxpY2F0aW9uIGNhbiBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlICIKKyAgICAgICAgImNhbGwgdHJhbnNmZXIgcmVxdWVzdCwgZm9yIGV4YW1wbGUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gIgorICAgICAgICAidGVybWluYXRlIGV4aXN0aW5nIGNhbGwuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fY2FsbF9yZXBsYWNlX3JlcXVlc3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0KSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiBhYm91dCBpbmNvbWluZyBJTlZJVEUgd2l0aCBSZXBsYWNlcyBoZWFkZXIuICIKKyAgICAgICAgIkFwcGxpY2F0aW9uIG1heSByZWplY3QgdGhlIHJlcXVlc3QgYnkgc2V0dGluZyBub24tMnh4IGNvZGUuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fY2FsbF9yZXBsYWNlZCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF9yZXBsYWNlZCksIDAsCisJIk5vdGlmeSBhcHBsaWNhdGlvbiB0aGF0IGFuIGV4aXN0aW5nIGNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCAiCisJImEgbmV3IGNhbGwuIFRoaXMgaGFwcGVucyB3aGVuIFBKU1VBLUFQSSByZWNlaXZlcyBpbmNvbWluZyBJTlZJVEUgIgorCSJyZXF1ZXN0IHdpdGggUmVwbGFjZXMgaGVhZGVyLiIKKwkiICIKKwkiQWZ0ZXIgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQsIG5vcm1hbGx5IFBKU1VBLUFQSSB3aWxsIGRpc2Nvbm5lY3QgIgorCSJvbGRfY2FsbF9pZCBhbmQgZXN0YWJsaXNoIG5ld19jYWxsX2lkLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX3JlZ19zdGF0ZSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fcmVnX3N0YXRlKSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiB3aGVuIHJlZ2lzdHJhdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQuIEFwcGxpY2F0aW9uICIKKyAgICAgICAgIm1heSB0aGVuIHF1ZXJ5IHRoZSBhY2NvdW50IGluZm8gdG8gZ2V0IHRoZSByZWdpc3RyYXRpb24gZGV0YWlscy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9idWRkeV9zdGF0ZSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fYnVkZHlfc3RhdGUpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIHdoZW4gdGhlIGJ1ZGR5IHN0YXRlIGhhcyBjaGFuZ2VkLiBBcHBsaWNhdGlvbiBtYXkgIgorICAgICAgICAidGhlbiBxdWVyeSB0aGUgYnVkZHkgaW50byB0byBnZXQgdGhlIGRldGFpbHMuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fcGFnZXIiLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX3BhZ2VyKSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiBvbiBpbmNvbWluZyBwYWdlciAoaS5lLiBNRVNTQUdFIHJlcXVlc3QpLiAiCisgICAgICAgICJBcmd1bWVudCBjYWxsX2lkIHdpbGwgYmUgLTEgaWYgTUVTU0FHRSByZXF1ZXN0IGlzIG5vdCByZWxhdGVkIHRvIGFuICIKKyAgICAgICAgImV4aXN0aW5nIGNhbGwuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fcGFnZXJfc3RhdHVzIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9wYWdlcl9zdGF0dXMpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIGFib3V0IHRoZSBkZWxpdmVyeSBzdGF0dXMgb2Ygb3V0Z29pbmcgcGFnZXIgIgorICAgICAgICAicmVxdWVzdC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl90eXBpbmciLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX3R5cGluZyksIDAsCisgICAgICAgICJOb3RpZnkgYXBwbGljYXRpb24gYWJvdXQgdHlwaW5nIGluZGljYXRpb24uIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfY2FsbGJhY2sKKyAqIGNhbGxiYWNrIGNsYXNzIGRlZmluaXRpb24KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9jYWxsYmFjayA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwJCQkJCS8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLkNhbGxiYWNrIiwJCS8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrKSwJLyp0cF9iYXNpY3NpemUqLworICAgIDAsCQkJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9jYWxsYmFja19kZWxldGUsICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgIAkvKnRwX2ZsYWdzKi8KKyAgICAiVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGFwcGxpY2F0aW9uIGNhbGxiYWNrICIKKyAgICAidG8gcmVjZWl2ZSB2YXJpb3VzIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSAiCisgICAgIlBKU1VBLUFQSSIsCQkJLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgCQkJLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2NhbGxiYWNrX21lbWJlcnMsICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAJCQkvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2NhbGxiYWNrX25ldywgICAgICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZworICogQy9QeXRob24gd3JhcHBlciBmb3IgcGpzdWFfbWVkaWFfY29uZmlnIG9iamVjdAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHVuc2lnbmVkIGNsb2NrX3JhdGU7CisgICAgdW5zaWduZWQgbWF4X21lZGlhX3BvcnRzOworICAgIGludAkgICAgIGhhc19pb3F1ZXVlOworICAgIHVuc2lnbmVkIHRocmVhZF9jbnQ7CisgICAgdW5zaWduZWQgcXVhbGl0eTsKKyAgICB1bnNpZ25lZCBwdGltZTsKKyAgICBpbnQJICAgICBub192YWQ7CisgICAgdW5zaWduZWQgaWxiY19tb2RlOworICAgIHVuc2lnbmVkIHR4X2Ryb3BfcGN0OworICAgIHVuc2lnbmVkIHJ4X2Ryb3BfcGN0OworICAgIHVuc2lnbmVkIGVjX29wdGlvbnM7CisgICAgdW5zaWduZWQgZWNfdGFpbF9sZW47Cit9IFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZzsKKworCisvKgorICogUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX21lbWJlcnMKKyAqIGRlY2xhcmVzIGF0dHJpYnV0ZXMgYWNjZXNzaWJsZSBmcm9tIGJvdGggQyBhbmQgUHl0aG9uIGZvciBtZWRpYV9jb25maWcgZmlsZQorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAiY2xvY2tfcmF0ZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIGNsb2NrX3JhdGUpLCAwLAorICAgICAgICAiQ2xvY2sgcmF0ZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4gSWYgdmFsdWUgaXMgemVybywgIgorICAgICAgICAiZGVmYXVsdCBjbG9jayByYXRlIHdpbGwgYmUgdXNlZCAoMTZLSHopLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1heF9tZWRpYV9wb3J0cyIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIG1heF9tZWRpYV9wb3J0cyksIDAsCisgICAgICAgICJTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIG1lZGlhIHBvcnRzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlICIKKyAgICAgICAgImNvbmZlcmVuY2UgYnJpZGdlLiBTaW5jZSBhbGwgbWVkaWEgdGVybWluYXRlIGluIHRoZSBicmlkZ2UgKGNhbGxzLCAiCisgICAgICAgICJmaWxlIHBsYXllciwgZmlsZSByZWNvcmRlciwgZXRjKSwgdGhlIHZhbHVlIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvICIKKyAgICAgICAgInN1cHBvcnQgYWxsIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSAiCisgICAgICAgICJjb21wdXRhdGlvbnMgYXJlIHBlcmZvcm1lZC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJoYXNfaW9xdWV1ZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIGhhc19pb3F1ZXVlKSwgMCwKKyAgICAgICAgIlNwZWNpZnkgd2hldGhlciB0aGUgbWVkaWEgbWFuYWdlciBzaG91bGQgbWFuYWdlIGl0cyBvd24gaW9xdWV1ZSBmb3IgIgorICAgICAgICAidGhlIFJUUC9SVENQIHNvY2tldHMuIElmIHllcywgaW9xdWV1ZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGF0IGxlYXN0ICIKKyAgICAgICAgIm9uZSB3b3JrZXIgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZCB0b28uIElmIG5vLCB0aGUgUlRQL1JUQ1Agc29ja2V0cyAiCisgICAgICAgICJ3aWxsIHNoYXJlIHRoZSBzYW1lIGlvcXVldWUgYXMgU0lQIHNvY2tldHMsIGFuZCBubyB3b3JrZXIgdGhyZWFkIGlzICIKKyAgICAgICAgIm5lZWRlZC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0aHJlYWRfY250IiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdGhyZWFkX2NudCksIDAsCisgICAgICAgICJTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdG8gaGFuZGxlIGluY29taW5nIFJUUCBwYWNrZXRzLiAiCisgICAgICAgICJBIHZhbHVlIG9mIG9uZSBpcyByZWNvbW1lbmRlZCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIgorICAgIH0sCisgICAgeworICAgICAgICAicXVhbGl0eSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIHF1YWxpdHkpLCAwLAorICAgICAgICAiVGhlIG1lZGlhIHF1YWxpdHkgYWxzbyBzZXRzIHNwZWV4IGNvZGVjIHF1YWxpdHkvY29tcGxleGl0eSB0byB0aGUgIgorICAgICAgICAibnVtYmVyLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB0aW1lIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgcHRpbWUpLCAwLAorICAgICAgICAiU3BlY2lmeSBkZWZhdWx0IHB0aW1lLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm5vX3ZhZCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIG5vX3ZhZCksIDAsCisgICAgICAgICJEaXNhYmxlIFZBRD8iCisgICAgfSwKKyAgICB7CisgICAgICAgICJpbGJjX21vZGUiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBpbGJjX21vZGUpLCAwLAorICAgICAgICAiaUxCQyBtb2RlICgyMCBvciAzMCkuIgorICAgIH0sCisgICAgeworICAgICAgICAidHhfZHJvcF9wY3QiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCB0eF9kcm9wX3BjdCksIDAsCisgICAgICAgICJQZXJjZW50YWdlIG9mIFJUUCBwYWNrZXQgdG8gZHJvcCBpbiBUWCBkaXJlY3Rpb24gKHRvIHNpbXVsYXRlIHBhY2tldCAiCisgICAgICAgICJsb3N0KS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJyeF9kcm9wX3BjdCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIHJ4X2Ryb3BfcGN0KSwgMCwKKyAgICAgICAgIlBlcmNlbnRhZ2Ugb2YgUlRQIHBhY2tldCB0byBkcm9wIGluIFJYIGRpcmVjdGlvbiAodG8gc2ltdWxhdGUgcGFja2V0ICIKKyAgICAgICAgImxvc3QpLiJ9LAorICAgIHsKKyAgICAgICAgImVjX29wdGlvbnMiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBlY19vcHRpb25zKSwgMCwKKyAgICAgICAgIkVjaG8gY2FuY2VsbGVyIG9wdGlvbnMgKHNlZSBwam1lZGlhX2VjaG9fY3JlYXRlKCkpIgorICAgIH0sCisgICAgeworICAgICAgICAiZWNfdGFpbF9sZW4iLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBlY190YWlsX2xlbiksIDAsCisgICAgICAgICJFY2hvIGNhbmNlbGxlciB0YWlsIGxlbmd0aCwgaW4gbWlsaXNlY29uZHMuIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLk1lZGlhX0NvbmZpZyIsICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcpLC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiTWVkaWEgQ29uZmlnIG9iamVjdHMiLCAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19tZW1iZXJzLCAvKiB0cF9tZW1iZXJzICovCisKK307CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX2ltcG9ydChQeU9ial9wanN1YV9tZWRpYV9jb25maWcgKm9iaiwKKwkJCQkJICAgIGNvbnN0IHBqc3VhX21lZGlhX2NvbmZpZyAqY2ZnKQoreworICAgIG9iai0+Y2xvY2tfcmF0ZQkgICAgPSBjZmctPmNsb2NrX3JhdGU7CisgICAgb2JqLT5tYXhfbWVkaWFfcG9ydHMgICAgPSBjZmctPm1heF9tZWRpYV9wb3J0czsKKyAgICBvYmotPmhhc19pb3F1ZXVlCSAgICA9IGNmZy0+aGFzX2lvcXVldWU7CisgICAgb2JqLT50aHJlYWRfY250CSAgICA9IGNmZy0+dGhyZWFkX2NudDsKKyAgICBvYmotPnF1YWxpdHkJICAgID0gY2ZnLT5xdWFsaXR5OworICAgIG9iai0+cHRpbWUJCSAgICA9IGNmZy0+cHRpbWU7CisgICAgb2JqLT5ub192YWQJCSAgICA9IGNmZy0+bm9fdmFkOworICAgIG9iai0+aWxiY19tb2RlCSAgICA9IGNmZy0+aWxiY19tb2RlOworICAgIG9iai0+dHhfZHJvcF9wY3QJICAgID0gY2ZnLT50eF9kcm9wX3BjdDsKKyAgICBvYmotPnJ4X2Ryb3BfcGN0CSAgICA9IGNmZy0+cnhfZHJvcF9wY3Q7CisgICAgb2JqLT5lY19vcHRpb25zCSAgICA9IGNmZy0+ZWNfb3B0aW9uczsKKyAgICBvYmotPmVjX3RhaWxfbGVuCSAgICA9IGNmZy0+ZWNfdGFpbF9sZW47Cit9CisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19leHBvcnQocGpzdWFfbWVkaWFfY29uZmlnICpjZmcsCisJCQkJCSAgICBjb25zdCBQeU9ial9wanN1YV9tZWRpYV9jb25maWcgKm9iaikKK3sKKyAgICBjZmctPmNsb2NrX3JhdGUJICAgID0gb2JqLT5jbG9ja19yYXRlOworICAgIGNmZy0+bWF4X21lZGlhX3BvcnRzICAgID0gb2JqLT5tYXhfbWVkaWFfcG9ydHM7CisgICAgY2ZnLT5oYXNfaW9xdWV1ZQkgICAgPSBvYmotPmhhc19pb3F1ZXVlOworICAgIGNmZy0+dGhyZWFkX2NudAkgICAgPSBvYmotPnRocmVhZF9jbnQ7CisgICAgY2ZnLT5xdWFsaXR5CSAgICA9IG9iai0+cXVhbGl0eTsKKyAgICBjZmctPnB0aW1lCQkgICAgPSBvYmotPnB0aW1lOworICAgIGNmZy0+bm9fdmFkCQkgICAgPSBvYmotPm5vX3ZhZDsKKyAgICBjZmctPmlsYmNfbW9kZQkgICAgPSBvYmotPmlsYmNfbW9kZTsKKyAgICBjZmctPnR4X2Ryb3BfcGN0CSAgICA9IG9iai0+dHhfZHJvcF9wY3Q7CisgICAgY2ZnLT5yeF9kcm9wX3BjdAkgICAgPSBvYmotPnJ4X2Ryb3BfcGN0OworICAgIGNmZy0+ZWNfb3B0aW9ucwkgICAgPSBvYmotPmVjX29wdGlvbnM7CisgICAgY2ZnLT5lY190YWlsX2xlbgkgICAgPSBvYmotPmVjX3RhaWxfbGVuOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV9jb25maWcKKyAqIGF0dHJpYnV0ZSBsaXN0IGZvciBjb25maWcgb2JqZWN0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgdW5zaWduZWQJCSAgbWF4X2NhbGxzOworICAgIHVuc2lnbmVkCQkgIHRocmVhZF9jbnQ7CisgICAgUHlPYmplY3QJCSAqb3V0Ym91bmRfcHJveHk7CisgICAgUHlPYmplY3QJICAgICAgICAgKnN0dW5fZG9tYWluOworICAgIFB5T2JqZWN0CQkgKnN0dW5faG9zdDsKKyAgICBQeU9iamVjdAkJICpzdHVuX3JlbGF5X2hvc3Q7CisgICAgUHlPYmpfcGpzdWFfY2FsbGJhY2sgKmNiOworICAgIFB5T2JqZWN0CQkgKnVzZXJfYWdlbnQ7Cit9IFB5T2JqX3Bqc3VhX2NvbmZpZzsKKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9jb25maWdfZGVsZXRlKFB5T2JqX3Bqc3VhX2NvbmZpZyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPm91dGJvdW5kX3Byb3h5KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0dW5fZG9tYWluKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0dW5faG9zdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdHVuX3JlbGF5X2hvc3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y2IpOworICAgIFB5X1hERUNSRUYoc2VsZi0+dXNlcl9hZ2VudCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfY29uZmlnICpvYmosCisJCQkJICAgICAgY29uc3QgcGpzdWFfY29uZmlnICpjZmcpCit7CisgICAgb2JqLT5tYXhfY2FsbHMJPSBjZmctPm1heF9jYWxsczsKKyAgICBvYmotPnRocmVhZF9jbnQJPSBjZmctPnRocmVhZF9jbnQ7CisgICAgUHlfWERFQ1JFRihvYmotPm91dGJvdW5kX3Byb3h5KTsKKyAgICBvYmotPm91dGJvdW5kX3Byb3h5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT5vdXRib3VuZF9wcm94eVswXS5wdHIsCisJCQkJCQkgICAgIGNmZy0+b3V0Ym91bmRfcHJveHlbMF0uc2xlbik7CisgICAgUHlfWERFQ1JFRihvYmotPnN0dW5fZG9tYWluKTsKKyAgICBvYmotPnN0dW5fZG9tYWluCT0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT5zdHVuX2RvbWFpbi5wdHIsCisJCQkJCQkgICAgIGNmZy0+c3R1bl9kb21haW4uc2xlbik7CisgICAgUHlfWERFQ1JFRihvYmotPnN0dW5faG9zdCk7CisgICAgb2JqLT5zdHVuX2hvc3QJPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPnN0dW5faG9zdC5wdHIsCisJCQkJCQkgICAgIGNmZy0+c3R1bl9ob3N0LnNsZW4pOworICAgIFB5X1hERUNSRUYob2JqLT5zdHVuX3JlbGF5X2hvc3QpOworICAgIG9iai0+c3R1bl9yZWxheV9ob3N0PSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPnN0dW5faG9zdC5wdHIsCisJCQkJCQkgICAgIGNmZy0+c3R1bl9ob3N0LnNsZW4pOworICAgIFB5X1hERUNSRUYob2JqLT51c2VyX2FnZW50KTsKKyAgICBvYmotPnVzZXJfYWdlbnQJPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPnVzZXJfYWdlbnQucHRyLAorCQkJCQkJICAgICBjZmctPnVzZXJfYWdlbnQuc2xlbik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfY29uZmlnX2V4cG9ydChwanN1YV9jb25maWcgKmNmZywKKwkJCQkgICAgICBQeU9ial9wanN1YV9jb25maWcgKm9iaikKK3sKKyAgICBjZmctPm1heF9jYWxscwk9IG9iai0+bWF4X2NhbGxzOworICAgIGNmZy0+dGhyZWFkX2NudAk9IG9iai0+dGhyZWFkX2NudDsKKyAgICBpZiAoUHlTdHJpbmdfU2l6ZShvYmotPm91dGJvdW5kX3Byb3h5KSA+IDApIHsKKwljZmctPm91dGJvdW5kX3Byb3h5X2NudCA9IDE7CisJY2ZnLT5vdXRib3VuZF9wcm94eVswXSA9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPm91dGJvdW5kX3Byb3h5KTsKKyAgICB9IGVsc2UgeworCWNmZy0+b3V0Ym91bmRfcHJveHlfY250ID0gMDsKKyAgICB9CisgICAgY2ZnLT5zdHVuX2RvbWFpbgk9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPnN0dW5fZG9tYWluKTsKKyAgICBjZmctPnN0dW5faG9zdAk9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPnN0dW5faG9zdCk7CisgICAgLy9jZmctPnN0dW5fcmVsYXlfaG9zdD0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+c3R1bl9ob3N0KTsKKyAgICBjZmctPnVzZXJfYWdlbnQJPSBQeVN0cmluZ190b19wal9zdHIob2JqLT51c2VyX2FnZW50KTsKKworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqUHlPYmpfcGpzdWFfY29uZmlnX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQlQeU9iamVjdCAqYXJncywgCisJCQkJCVB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfY29uZmlnICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNlbGYtPnVzZXJfYWdlbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnVzZXJfYWdlbnQgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+b3V0Ym91bmRfcHJveHkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPm91dGJvdW5kX3Byb3h5ID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmNiID0gKFB5T2JqX3Bqc3VhX2NhbGxiYWNrICopCisJCSAgIFB5VHlwZV9HZW5lcmljTmV3KCZQeVR5cF9wanN1YV9jYWxsYmFjaywgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChzZWxmLT5jYiA9PSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfY29uZmlnX21lbWJlcnMKKyAqIGF0dHJpYnV0ZSBsaXN0IGFjY2Vzc2libGUgZnJvbSBQeXRob24vQworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfY29uZmlnX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgIAkibWF4X2NhbGxzIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgbWF4X2NhbGxzKSwgMCwKKyAgICAJIk1heGltdW0gY2FsbHMgdG8gc3VwcG9ydCAoZGVmYXVsdDogNCkgIgorICAgIH0sCisgICAgeworICAgIAkidGhyZWFkX2NudCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIHRocmVhZF9jbnQpLCAwLAorICAgIAkiTnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzLiBOb3JtYWxseSBhcHBsaWNhdGlvbiB3aWxsIHdhbnQgdG8gaGF2ZSBhdCAiCisgICAgCSJsZWFzdCBvbmUgd29ya2VyIHRocmVhZCwgdW5sZXNzIHdoZW4gaXQgd2FudHMgdG8gcG9sbCB0aGUgbGlicmFyeSAiCisgICAgCSJwZXJpb2RpY2FsbHksIHdoaWNoIGluIHRoaXMgY2FzZSB0aGUgd29ya2VyIHRocmVhZCBjYW4gYmUgc2V0IHRvICIKKyAgICAJInplcm8uIgorICAgIH0sCisgICAgeworICAgIAkib3V0Ym91bmRfcHJveHkiLCBUX09CSkVDVF9FWCwKKyAgICAJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZmlnLCBvdXRib3VuZF9wcm94eSksIDAsCisgICAgCSJTSVAgVVJMIG9mIHRoZSBvdXRib3VuZCBwcm94eSAob3B0aW9uYWwpIgorICAgIH0sCisgICAgeworICAgIAkic3R1bl9kb21haW4iLCBUX09CSkVDVF9FWCwKKyAgICAJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZmlnLCBzdHVuX2RvbWFpbiksIDAsCisgICAgCSJEb21haW4gb2YgdGhlIFNUVU4gc2VydmVyIChvcHRpb25hbCkuIFNUVU4gc2VydmVyIHdpbGwgYmUgcmVzb2x2ZWQgIgorCSJ1c2luZyBETlMgU1JWIHJlc29sdXRpb24gb25seSB3aGVuIG5hbWVzZXJ2ZXIgaXMgY29uZmlndXJlZC4gIgorCSJBbHRlcm5hdGl2ZWx5LCBpZiBETlMgU1JWIHJlc29sdXRpb24gZm9yIFNUVU4gaXMgbm90IGRlc2lyZWQsICIKKwkiYXBwbGljYXRpb24gY2FuIHNwZWNpZnkgdGhlIFNUVU4gc2VydmVyIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MgIgorCSJpbiBzdHVuX2hvc3QgYXR0cmlidXRlLiIKKyAgICB9LAorICAgIHsKKyAgICAJInN0dW5faG9zdCIsIFRfT0JKRUNUX0VYLAorICAgIAlvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIHN0dW5faG9zdCksIDAsCisgICAgCSJIb3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBTVFVOIHNlcnZlciAob3B0aW9uYWwpLiIKKyAgICB9LAorICAgIHsKKyAgICAJInN0dW5fcmVsYXlfaG9zdCIsIFRfT0JKRUNUX0VYLAorICAgIAlvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIHN0dW5fcmVsYXlfaG9zdCksIDAsCisgICAgCSJIb3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBUVVJOIHNlcnZlciAob3B0aW9uYWwpLiIKKyAgICB9LAorICAgIHsKKyAgICAJImNiIiwgVF9PQkpFQ1RfRVgsIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgY2IpLCAwLAorICAgIAkiQXBwbGljYXRpb24gY2FsbGJhY2suIgorICAgIH0sCisgICAgeworICAgIAkidXNlcl9hZ2VudCIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIHVzZXJfYWdlbnQpLCAwLAorICAgIAkiVXNlciBhZ2VudCBzdHJpbmcgKGRlZmF1bHQgZW1wdHkpIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfY29uZmlnCisgKiB0eXBlIHdyYXBwZXIgZm9yIGNvbmZpZyBjbGFzcworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuQ29uZmlnIiwgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9jb25maWcpLC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9jb25maWdfZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkNvbmZpZyBvYmplY3QiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfY29uZmlnX21lbWJlcnMsLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZ19uZXcsICAgIC8qIHRwX25ldyAqLworCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZworICogY29uZmlndXJhdGlvbiBjbGFzcyBmb3IgbG9nZ2luZ19jb25maWcgb2JqZWN0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgaW50CQkgbXNnX2xvZ2dpbmc7CisgICAgdW5zaWduZWQJIGxldmVsOworICAgIHVuc2lnbmVkCSBjb25zb2xlX2xldmVsOworICAgIHVuc2lnbmVkCSBkZWNvcjsKKyAgICBQeU9iamVjdAkqbG9nX2ZpbGVuYW1lOworICAgIFB5T2JqZWN0CSpjYjsKK30gUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWc7CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX2RlbGV0ZQorICogZGVsZXRlcyBhIGxvZ2dpbmcgY29uZmlnIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX2RlbGV0ZShQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmxvZ19maWxlbmFtZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jYik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX2ltcG9ydChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyAqb2JqLAorCQkJCQkgICAgICBjb25zdCBwanN1YV9sb2dnaW5nX2NvbmZpZyAqY2ZnKQoreworICAgIG9iai0+bXNnX2xvZ2dpbmcJPSBjZmctPm1zZ19sb2dnaW5nOworICAgIG9iai0+bGV2ZWwJCT0gY2ZnLT5sZXZlbDsKKyAgICBvYmotPmNvbnNvbGVfbGV2ZWwJPSBjZmctPmNvbnNvbGVfbGV2ZWw7CisgICAgb2JqLT5kZWNvcgkJPSBjZmctPmRlY29yOworfQorCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19leHBvcnQocGpzdWFfbG9nZ2luZ19jb25maWcgKmNmZywKKwkJCQkJICAgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKm9iaikKK3sKKyAgICBjZmctPm1zZ19sb2dnaW5nCT0gb2JqLT5tc2dfbG9nZ2luZzsKKyAgICBjZmctPmxldmVsCQk9IG9iai0+bGV2ZWw7CisgICAgY2ZnLT5jb25zb2xlX2xldmVsCT0gb2JqLT5jb25zb2xlX2xldmVsOworICAgIGNmZy0+ZGVjb3IJCT0gb2JqLT5kZWNvcjsKKyAgICBjZmctPmxvZ19maWxlbmFtZQk9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPmxvZ19maWxlbmFtZSk7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX25ldworICogY29uc3RydWN0b3IgZm9yIGxvZ2dpbmdfY29uZmlnIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJCSBQeU9iamVjdCAqYXJncywKKwkJCQkJICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNlbGYtPmxvZ19maWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+bG9nX2ZpbGVuYW1lID09IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+Y2IgPSBQeV9Ob25lOworICAgICAgICBpZiAoc2VsZi0+Y2IgPT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgCSJtc2dfbG9nZ2luZyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZywgbXNnX2xvZ2dpbmcpLCAwLAorICAgIAkiTG9nIGluY29taW5nIGFuZCBvdXRnb2luZyBTSVAgbWVzc2FnZT8gWWVzISIKKyAgICB9LAorICAgIHsKKyAgICAJImxldmVsIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnLCBsZXZlbCksIDAsCisgICAgCSJJbnB1dCB2ZXJib3NpdHkgbGV2ZWwuIFZhbHVlIDUgaXMgcmVhc29uYWJsZS4iCisgICAgfSwKKyAgICB7CisgICAgCSJjb25zb2xlX2xldmVsIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnLCBjb25zb2xlX2xldmVsKSwKKyAgICAJMCwgIlZlcmJvc2l0eSBsZXZlbCBmb3IgY29uc29sZS4gVmFsdWUgNCBpcyByZWFzb25hYmxlLiIKKyAgICB9LAorICAgIHsKKyAgICAJImRlY29yIiwgVF9JTlQsIAorCSBvZmZzZXRvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZywgZGVjb3IpLCAwLAorICAgIAkiTG9nIGRlY29yYXRpb24iCisgICAgfSwKKyAgICB7CisgICAgCSJsb2dfZmlsZW5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcsIGxvZ19maWxlbmFtZSksIDAsCisgICAgCSJPcHRpb25hbCBsb2cgZmlsZW5hbWUiCisgICAgfSwKKyAgICB7CisgICAgCSJjYiIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZywgY2IpLCAwLAorICAgIAkiT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIHdyaXRlIGxvZyB0byBhcHBsaWNhdGlvbiAiCisgICAgCSJzcGVjaWZpYyBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9ybG9nIG1lc3NhZ2VzIG9uICIKKyAgICAJImlucHV0IHZlcmJvc2l0eSBsZXZlbC4iCisgICAgfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9sb2dnaW5nX2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5Mb2dnaW5nX0NvbmZpZyIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkxvZ2dpbmcgQ29uZmlnIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX21lbWJlcnMsLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19uZXcsIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhCisgKiB0eXBld3JhcHBlciBmb3IgTWVzc2FnZURhdGEgY2xhc3MKKyAqICFtb2RpZmllZCBAIDA2MTIwNgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIFB5T2JqZWN0ICogaGRyX2xpc3Q7CisgICAgUHlPYmplY3QgKiBjb250ZW50X3R5cGU7CisgICAgUHlPYmplY3QgKiBtc2dfYm9keTsKK30gUHlPYmpfcGpzdWFfbXNnX2RhdGE7CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhX2RlbGV0ZQorICogZGVsZXRlcyBhIG1zZ19kYXRhCisgKiAhbW9kaWZpZWQgQCAwNjEyMDYKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfbXNnX2RhdGFfZGVsZXRlKFB5T2JqX3Bqc3VhX21zZ19kYXRhKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+aGRyX2xpc3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udGVudF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm1zZ19ib2R5KTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhX25ldworICogY29uc3RydWN0b3IgZm9yIG1zZ19kYXRhIG9iamVjdAorICogIW1vZGlmaWVkIEAgMDYxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQkgICBQeU9iamVjdCAqYXJncywKKwkJCQkJICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGEgKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+aGRyX2xpc3QgPSBQeV9Ob25lOworICAgICAgICBpZiAoc2VsZi0+aGRyX2xpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+Y29udGVudF90eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5jb250ZW50X3R5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+bXNnX2JvZHkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPm1zZ19ib2R5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhX21lbWJlcnMKKyAqICFtb2RpZmllZCBAIDA2MTIwNgorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfbXNnX2RhdGFfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJoZHJfbGlzdCIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tc2dfZGF0YSwgaGRyX2xpc3QpLCAwLCAKKwkiQWRkaXRpb25hbCBtZXNzYWdlIGhlYWRlcnMgYXMgbGlua2VkIGxpc3Qgb2Ygc3RyaW5ncy4iCisgICAgfSwgCisgICAgeworCSJjb250ZW50X3R5cGUiLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbXNnX2RhdGEsIGNvbnRlbnRfdHlwZSksIDAsIAorCSJNSU1FIHR5cGUgb2Ygb3B0aW9uYWwgbWVzc2FnZSBib2R5LiIKKyAgICB9LAorICAgIHsKKyAgICAJIm1zZ19ib2R5IiwgVF9PQkpFQ1RfRVgsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21zZ19kYXRhLCBtc2dfYm9keSksIDAsCisgICAgCSJPcHRpb25hbCBtZXNzYWdlIGJvZHkuIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfbXNnX2RhdGEKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9tc2dfZGF0YSA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuTXNnX0RhdGEiLCAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9tc2dfZGF0YSksICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc3VhX21zZ19kYXRhX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJtc2dfZGF0YSBvYmplY3RzIiwgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX21zZ19kYXRhX21lbWJlcnMsICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YV9uZXcsICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnCisgKiBUcmFuc3BvcnQgY29uZmlndXJhdGlvbiBmb3IgY3JlYXRpbmcgVURQIHRyYW5zcG9ydHMgZm9yIGJvdGggU0lQCisgKiBhbmQgbWVkaWEuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgdW5zaWduZWQJcG9ydDsKKyAgICBQeU9iamVjdCAgICpwdWJsaWNfYWRkcjsKKyAgICBQeU9iamVjdCAgICpib3VuZF9hZGRyOworfSBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnOworCisKKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2RlbGV0ZQorICogZGVsZXRlcyBhIHRyYW5zcG9ydCBjb25maWcgZnJvbSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWxldGUoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnB1YmxpY19hZGRyKTsgICAgCisgICAgUHlfWERFQ1JFRihzZWxmLT5ib3VuZF9hZGRyKTsgICAgCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZXhwb3J0KHBqc3VhX3RyYW5zcG9ydF9jb25maWcgKmNmZywKKwkJCQkJCVB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKm9iaikKK3sKKyAgICBjZmctPnB1YmxpY19hZGRyCT0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+cHVibGljX2FkZHIpOworICAgIGNmZy0+Ym91bmRfYWRkcgk9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPmJvdW5kX2FkZHIpOworICAgIGNmZy0+cG9ydAkJPSBvYmotPnBvcnQ7CisKK30KKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqb2JqLAorCQkJCQkJY29uc3QgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqY2ZnKQoreworICAgIFB5X1hERUNSRUYob2JqLT5wdWJsaWNfYWRkcik7ICAgIAorICAgIG9iai0+cHVibGljX2FkZHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPnB1YmxpY19hZGRyLnB0ciwgCisJCQkJCQkgIGNmZy0+cHVibGljX2FkZHIuc2xlbik7CisKKyAgICBQeV9YREVDUkVGKG9iai0+Ym91bmRfYWRkcik7ICAgIAorICAgIG9iai0+Ym91bmRfYWRkciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNmZy0+Ym91bmRfYWRkci5wdHIsIAorCQkJCQkgICAgICAgICBjZmctPmJvdW5kX2FkZHIuc2xlbik7CisKKyAgICBvYmotPnBvcnQgPSBjZmctPnBvcnQ7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgdHJhbnNwb3J0X2NvbmZpZyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJCSAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkJICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+cHVibGljX2FkZHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnB1YmxpY19hZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+Ym91bmRfYWRkciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+Ym91bmRfYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJwb3J0IiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcsIHBvcnQpLCAwLAorICAgICAgICAiVURQIHBvcnQgbnVtYmVyIHRvIGJpbmQgbG9jYWxseS4gVGhpcyBzZXR0aW5nIE1VU1QgYmUgc3BlY2lmaWVkICIKKyAgICAgICAgImV2ZW4gd2hlbiBkZWZhdWx0IHBvcnQgaXMgZGVzaXJlZC4gSWYgdGhlIHZhbHVlIGlzIHplcm8sIHRoZSAiCisgICAgICAgICJ0cmFuc3BvcnQgd2lsbCBiZSBib3VuZCB0byBhbnkgYXZhaWxhYmxlIHBvcnQsIGFuZCBhcHBsaWNhdGlvbiAiCisgICAgICAgICJjYW4gcXVlcnkgdGhlIHBvcnQgYnkgcXVlcnlpbmcgdGhlIHRyYW5zcG9ydCBpbmZvLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB1YmxpY19hZGRyIiwgVF9PQkpFQ1RfRVgsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcsIHB1YmxpY19hZGRyKSwgMCwKKyAgICAgICAgIk9wdGlvbmFsIGFkZHJlc3MgdG8gYWR2ZXJ0aXNlIGFzIHRoZSBhZGRyZXNzIG9mIHRoaXMgdHJhbnNwb3J0LiAiCisgICAgICAgICJBcHBsaWNhdGlvbiBjYW4gc3BlY2lmeSBhbnkgYWRkcmVzcyBvciBob3N0bmFtZSBmb3IgdGhpcyBmaWVsZCwgIgorICAgICAgICAiZm9yIGV4YW1wbGUgaXQgY2FuIHBvaW50IHRvIG9uZSBvZiB0aGUgaW50ZXJmYWNlIGFkZHJlc3MgaW4gdGhlICIKKyAgICAgICAgInN5c3RlbSwgb3IgaXQgY2FuIHBvaW50IHRvIHRoZSBwdWJsaWMgYWRkcmVzcyBvZiBhIE5BVCByb3V0ZXIgIgorICAgICAgICAid2hlcmUgcG9ydCBtYXBwaW5ncyBoYXZlIGJlZW4gY29uZmlndXJlZCBmb3IgdGhlIGFwcGxpY2F0aW9uLiIJCQorICAgIH0sICAgIAorICAgIHsKKyAgICAgICAgImJvdW5kX2FkZHIiLCBUX09CSkVDVF9FWCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcsIGJvdW5kX2FkZHIpLCAwLAorICAgICAgICAiT3B0aW9uYWwgYWRkcmVzcyB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBiZSBib3VuZCB0by4gVGhpcyBvcHRpb24gIgorICAgICAgICAiU0hPVUxEIG9ubHkgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBiaW5kIHRoZSBzb2NrZXQgdG8gcGFydGljdWxhciAiCisgICAgICAgICJpbnRlcmZhY2UgKGluc3RlYWQgb2YgMC4wLjAuMCksIGFuZCBTSE9VTEQgTk9UIGJlIHVzZWQgdG8gc2V0IHRoZSAiCisgICAgICAgICJwdWJsaXNoZWQgYWRkcmVzcyBvZiBhIHRyYW5zcG9ydCAodGhlIHB1YmxpY19hZGRyIGZpZWxkIHNob3VsZCBiZSAiCisgICAgICAgICJ1c2VkIGZvciB0aGF0IHB1cnBvc2UpLiIJCQorICAgIH0sICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5UcmFuc3BvcnRfQ29uZmlnIiwgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJUcmFuc3BvcnQgc2V0dGluZyIsCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbWVtYmVycywvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3LC8qIHRwX25ldyAqLworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbworICogVHJhbnNwb3J0IGluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBpbnQJCSBpZDsKKyAgICBpbnQJCSB0eXBlOworICAgIFB5T2JqZWN0CSp0eXBlX25hbWU7CisgICAgUHlPYmplY3QJKmluZm87CisgICAgdW5zaWduZWQJIGZsYWc7CisgICAgUHlPYmplY3QJKmFkZHI7CisgICAgdW5zaWduZWQJIHBvcnQ7CisgICAgdW5zaWduZWQJIHVzYWdlX2NvdW50OworfSBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbzsKKworCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fZGVsZXRlCisgKiBkZWxldGVzIGEgdHJhbnNwb3J0IGluZm8gZnJvbSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fZGVsZXRlKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dHlwZV9uYW1lKTsgCisgICAgUHlfWERFQ1JFRihzZWxmLT5pbmZvKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFkZHIpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19pbXBvcnQoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8gKm9iaiwKKwkJCQkJICAgICAgY29uc3QgcGpzdWFfdHJhbnNwb3J0X2luZm8gKmluZm8pCit7CisgICAgb2JqLT5pZAkgICAgPSBpbmZvLT5pZDsKKyAgICBvYmotPnR5cGUJICAgID0gaW5mby0+dHlwZTsKKyAgICBvYmotPnR5cGVfbmFtZSAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmZvLT50eXBlX25hbWUucHRyLAorCQkJCQkJIGluZm8tPnR5cGVfbmFtZS5zbGVuKTsKKyAgICBvYmotPmluZm8JICAgID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5mby0+aW5mby5wdHIsCisJCQkJCQkgaW5mby0+aW5mby5zbGVuKTsKKyAgICBvYmotPmZsYWcJICAgID0gaW5mby0+ZmxhZzsKKyAgICBvYmotPmFkZHIJICAgID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5mby0+bG9jYWxfbmFtZS5ob3N0LnB0ciwKKwkJCQkJCSBpbmZvLT5sb2NhbF9uYW1lLmhvc3Quc2xlbik7CisgICAgb2JqLT5wb3J0CSAgICA9IGluZm8tPmxvY2FsX25hbWUucG9ydDsKKyAgICBvYmotPnVzYWdlX2NvdW50PSBpbmZvLT51c2FnZV9jb3VudDsKK30KKworLyoKKyAqIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIHRyYW5zcG9ydF9pbmZvIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJCSBQeU9iamVjdCAqYXJncywKKwkJCQkJCSBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc2VsZi0+dHlwZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT50eXBlX25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+aW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOyAKKyAgICAgICAgaWYgKHNlbGYtPmluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+YWRkciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+YWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBpZCksIDAsCisgICAgICAgICJQSlNVQSB0cmFuc3BvcnQgaWRlbnRpZmljYXRpb24uIgorICAgIH0sCisgICAgeworICAgICAgICAidHlwZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbywgaWQpLCAwLAorICAgICAgICAiVHJhbnNwb3J0IHR5cGUuIgorICAgIH0sCisgICAgeworICAgICAgICAidHlwZV9uYW1lIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCB0eXBlX25hbWUpLCAwLAorICAgICAgICAiVHJhbnNwb3J0IHR5cGUgbmFtZS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJpbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBpbmZvKSwgMCwKKyAgICAgICAgIlRyYW5zcG9ydCBzdHJpbmcgaW5mby9kZXNjcmlwdGlvbi4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJmbGFnIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBmbGFnKSwgMCwKKyAgICAgICAgIlRyYW5zcG9ydCBmbGFnIChzZWUgIyNwanNpcF90cmFuc3BvcnRfZmxhZ3NfZSkuIgorICAgIH0sCisgICAgeworICAgICAgICAiYWRkciIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbywgYWRkciksIDAsCisgICAgICAgICJQdWJsaXNoZWQgYWRkcmVzcyAob3IgdHJhbnNwb3J0IGFkZHJlc3MgbmFtZSkuIgorICAgIH0sCisgICAgeworICAgICAgICAicG9ydCIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbywgcG9ydCksIDAsCisgICAgICAgICJQdWJsaXNoZWQgcG9ydCBudW1iZXIuIgorICAgIH0sCisgICAgeworICAgICAgICAidXNhZ2VfY291bnQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8sIHVzYWdlX2NvdW50KSwgMCwKKyAgICAgICAgIkN1cnJlbnQgbnVtYmVyIG9mIG9iamVjdHMgY3VycmVudGx5IHJlZmVyZW5jaW5nIHRoaXMgdHJhbnNwb3J0LiIKKyAgICB9LCAgICAKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKy8qCisgKiBQeVR5cF9wanN1YV90cmFuc3BvcnRfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX3RyYW5zcG9ydF9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgInB5X3Bqc3VhLlRyYW5zcG9ydF9JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiVHJhbnNwb3J0IEluZm8gb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX25ldywgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBQeU9ial9wanN1YV9hY2NfY29uZmlnCisgKiBBY2MgQ29uZmlnCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgaW50CQkgICAgIHByaW9yaXR5OwkKKyAgICBQeU9iamVjdAkgICAgKmlkOworICAgIFB5T2JqZWN0CSAgICAqcmVnX3VyaTsKKyAgICBpbnQJCSAgICAgcHVibGlzaF9lbmFibGVkOworICAgIFB5T2JqZWN0CSAgICAqZm9yY2VfY29udGFjdDsKKyAgICAvKnBqX3N0cl90IHByb3h5WzhdOyovCisgICAgUHlMaXN0T2JqZWN0ICAgICpwcm94eTsKKyAgICB1bnNpZ25lZAkgICAgIHJlZ190aW1lb3V0OworICAgIC8qcGpzaXBfY3JlZF9pbmZvIGNyZWRfaW5mb1s4XTsqLworICAgIFB5TGlzdE9iamVjdCAgICAqY3JlZF9pbmZvOworICAgIGludAkJICAgICB0cmFuc3BvcnRfaWQ7Cit9IFB5T2JqX3Bqc3VhX2FjY19jb25maWc7CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfZGVsZXRlCisgKiBkZWxldGVzIGEgYWNjX2NvbmZpZyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9hY2NfY29uZmlnX2RlbGV0ZShQeU9ial9wanN1YV9hY2NfY29uZmlnKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+aWQpOyAKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlZ191cmkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Zm9yY2VfY29udGFjdCk7CQorICAgIFB5X1hERUNSRUYoc2VsZi0+cHJveHkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y3JlZF9pbmZvKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyAqb2JqLAorCQkJCQkgIGNvbnN0IHBqc3VhX2FjY19jb25maWcgKmNmZykKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgb2JqLT5wcmlvcml0eSAgID0gY2ZnLT5wcmlvcml0eTsKKyAgICBQeV9YREVDUkVGKG9iai0+aWQpOworICAgIG9iai0+aWQJICAgID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT5pZC5wdHIsIGNmZy0+aWQuc2xlbik7CisgICAgUHlfWERFQ1JFRihvYmotPnJlZ191cmkpOworICAgIG9iai0+cmVnX3VyaSAgICA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNmZy0+cmVnX3VyaS5wdHIsIAorCQkJCQkJIGNmZy0+cmVnX3VyaS5zbGVuKTsKKyAgICBvYmotPnB1Ymxpc2hfZW5hYmxlZCA9IGNmZy0+cHVibGlzaF9lbmFibGVkOworICAgIFB5X1hERUNSRUYob2JqLT5mb3JjZV9jb250YWN0KTsKKyAgICBvYmotPmZvcmNlX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjZmctPmZvcmNlX2NvbnRhY3QucHRyLAorCQkJCQkJICAgIGNmZy0+Zm9yY2VfY29udGFjdC5zbGVuKTsKKyAgICBQeV9YREVDUkVGKG9iai0+cHJveHkpOworICAgIG9iai0+cHJveHkgPSAoUHlMaXN0T2JqZWN0ICopUHlMaXN0X05ldygwKTsKKyAgICBmb3IgKGk9MDsgaTxjZmctPnByb3h5X2NudDsgKytpKSB7CisJUHlPYmplY3QgKiBzdHI7CisJc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT5wcm94eVtpXS5wdHIsIAorCQkJCQkgY2ZnLT5wcm94eVtpXS5zbGVuKTsKKwlQeUxpc3RfQXBwZW5kKChQeU9iamVjdCAqKW9iai0+cHJveHksIHN0cik7CisgICAgfQorCisgICAgb2JqLT5yZWdfdGltZW91dCA9IGNmZy0+cmVnX3RpbWVvdXQ7CisKKyAgICBQeV9YREVDUkVGKG9iai0+Y3JlZF9pbmZvKTsKKyAgICBvYmotPmNyZWRfaW5mbyA9IChQeUxpc3RPYmplY3QgKilQeUxpc3RfTmV3KDApOworICAgIGZvciAoaT0wOyBpPGNmZy0+Y3JlZF9jb3VudDsgKytpKSB7CisJUHlPYmpfcGpzaXBfY3JlZF9pbmZvICogY2k7CisJCisJY2kgPSAoUHlPYmpfcGpzaXBfY3JlZF9pbmZvICopCisJICAgICBQeU9ial9wanNpcF9jcmVkX2luZm9fbmV3KCZQeVR5cF9wanNpcF9jcmVkX2luZm8sTlVMTCxOVUxMKTsKKwlQeU9ial9wanNpcF9jcmVkX2luZm9faW1wb3J0KGNpLCAmY2ZnLT5jcmVkX2luZm9baV0pOworCVB5TGlzdF9BcHBlbmQoKFB5T2JqZWN0ICopb2JqLT5jcmVkX2luZm8sIChQeU9iamVjdCAqKWNpKTsKKyAgICB9CisKKyAgICBvYmotPnRyYW5zcG9ydF9pZCA9IGNmZy0+dHJhbnNwb3J0X2lkOworfQorCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9hY2NfY29uZmlnX2V4cG9ydChwanN1YV9hY2NfY29uZmlnICpjZmcsCisJCQkJCSAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyAqb2JqKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBjZmctPnByaW9yaXR5ICAgPSBvYmotPnByaW9yaXR5OworICAgIGNmZy0+aWQJICAgID0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+aWQpOworICAgIGNmZy0+cmVnX3VyaSAgICA9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPnJlZ191cmkpOworICAgIGNmZy0+cHVibGlzaF9lbmFibGVkID0gb2JqLT5wdWJsaXNoX2VuYWJsZWQ7CisgICAgY2ZnLT5mb3JjZV9jb250YWN0ID0gUHlTdHJpbmdfdG9fcGpfc3RyKG9iai0+Zm9yY2VfY29udGFjdCk7CisKKyAgICBjZmctPnByb3h5X2NudCA9IFB5TGlzdF9TaXplKChQeU9iamVjdCopb2JqLT5wcm94eSk7CisgICAgZm9yIChpID0gMDsgaSA8IGNmZy0+cHJveHlfY250OyBpKyspIHsKKyAgICAgICAgLypjZmcucHJveHlbaV0gPSBhYy0+cHJveHlbaV07Ki8KKyAgICAgICAgY2ZnLT5wcm94eVtpXSA9IFB5U3RyaW5nX3RvX3BqX3N0cihQeUxpc3RfR2V0SXRlbSgoUHlPYmplY3QgKilvYmotPnByb3h5LGkpKTsKKyAgICB9CisKKyAgICBjZmctPnJlZ190aW1lb3V0ID0gb2JqLT5yZWdfdGltZW91dDsKKworICAgIGNmZy0+Y3JlZF9jb3VudCA9IFB5TGlzdF9TaXplKChQeU9iamVjdCopb2JqLT5jcmVkX2luZm8pOworICAgIGZvciAoaSA9IDA7IGkgPCBjZmctPmNyZWRfY291bnQ7IGkrKykgeworICAgICAgICAvKmNmZy5jcmVkX2luZm9baV0gPSBhYy0+Y3JlZF9pbmZvW2ldOyovCisgICAgICAgIFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyAqY2k7CisJY2kgPSAoUHlPYmpfcGpzaXBfY3JlZF9pbmZvKikgCisJICAgICBQeUxpc3RfR2V0SXRlbSgoUHlPYmplY3QgKilvYmotPmNyZWRfaW5mbyxpKTsKKwlQeU9ial9wanNpcF9jcmVkX2luZm9fZXhwb3J0KCZjZmctPmNyZWRfaW5mb1tpXSwgY2kpOworICAgIH0KKworICAgIGNmZy0+dHJhbnNwb3J0X2lkID0gb2JqLT50cmFuc3BvcnRfaWQ7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgYWNjX2NvbmZpZyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgICBQeU9iamVjdCAqYXJncywKKwkJCQkJICAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9hY2NfY29uZmlnICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9hY2NfY29uZmlnICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5pZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+aWQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cmVnX3VyaSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+cmVnX3VyaSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5mb3JjZV9jb250YWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5mb3JjZV9jb250YWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisJc2VsZi0+cHJveHkgPSAoUHlMaXN0T2JqZWN0ICopUHlMaXN0X05ldygwKTsKKwlpZiAoc2VsZi0+cHJveHkgPT0gTlVMTCkgeworCSAgICBQeV9ERUNSRUYoc2VsZik7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlzZWxmLT5jcmVkX2luZm8gPSAoUHlMaXN0T2JqZWN0ICopUHlMaXN0X05ldygwKTsKKwlpZiAoc2VsZi0+Y3JlZF9pbmZvID09IE5VTEwpIHsKKwkgICAgUHlfREVDUkVGKHNlbGYpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworCisvKgorICogUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV9hY2NfY29uZmlnX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAicHJpb3JpdHkiLCBUX0lOVCwgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcHJpb3JpdHkpLCAwLAorICAgICAgICAiQWNjb3VudCBwcmlvcml0eSwgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sIHRoZSBvcmRlciBvZiBtYXRjaGluZyAiCisgICAgICAgICJpbmNvbWluZy9vdXRnb2luZyByZXF1ZXN0cy4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyIG1lYW5zIHRoZSBoaWdoZXIgIgorICAgICAgICAidGhlIHByaW9yaXR5IGlzLCBhbmQgdGhlIGFjY291bnQgd2lsbCBiZSBtYXRjaGVkIGZpcnN0LiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJpZCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBpZCksIDAsCisgICAgICAgICJUaGUgZnVsbCBTSVAgVVJMIGZvciB0aGUgYWNjb3VudC4gIgorICAgICAgICAiVGhlIHZhbHVlIGNhbiB0YWtlIG5hbWUgYWRkcmVzcyBvciBVUkwgZm9ybWF0LCAiCisgICAgICAgICJhbmQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlICdzaXA6YWNjb3VudEBzZXJ2aWNlcHJvdmlkZXInLiAiCisgICAgICAgICJUaGlzIGZpZWxkIGlzIG1hbmRhdG9yeS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJyZWdfdXJpIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIHJlZ191cmkpLCAwLAorICAgICAgICAiVGhpcyBpcyB0aGUgVVJMIHRvIGJlIHB1dCBpbiB0aGUgcmVxdWVzdCBVUkkgZm9yIHRoZSByZWdpc3RyYXRpb24sICIKKyAgICAgICAgImFuZCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgJ3NpcDpzZXJ2aWNlcHJvdmlkZXInLiAiCisgICAgICAgICJUaGlzIGZpZWxkIHNob3VsZCBiZSBzcGVjaWZpZWQgaWYgcmVnaXN0cmF0aW9uIGlzIGRlc2lyZWQuICIKKyAgICAgICAgIklmIHRoZSB2YWx1ZSBpcyBlbXB0eSwgbm8gYWNjb3VudCByZWdpc3RyYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB1Ymxpc2hfZW5hYmxlZCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcHVibGlzaF9lbmFibGVkKSwgMCwKKyAgICAgICAgIlB1Ymxpc2ggcHJlc2VuY2U/ICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImZvcmNlX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgZm9yY2VfY29udGFjdCksIDAsCisgICAgICAgICJPcHRpb25hbCBVUkkgdG8gYmUgcHV0IGFzIENvbnRhY3QgZm9yIHRoaXMgYWNjb3VudC4gIgorICAgICAgICAiSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGZpZWxkIGlzIGxlZnQgZW1wdHksICIKKyAgICAgICAgInNvIHRoYXQgdGhlIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5ICIKKyAgICAgICAgImJhc2VkIG9uIHRoZSB0cmFuc3BvcnQgYWRkcmVzcy4gIgorICAgIH0sCisgICAgeworICAgICAgICAicHJveHkiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcHJveHkpLCAwLAorICAgICAgICAiT3B0aW9uYWwgVVJJIG9mIHRoZSBwcm94aWVzIHRvIGJlIHZpc2l0ZWQgZm9yIGFsbCBvdXRnb2luZyByZXF1ZXN0cyAiCisJInRoYXQgYXJlIHVzaW5nIHRoaXMgYWNjb3VudCAoUkVHSVNURVIsIElOVklURSwgZXRjKS4gQXBwbGljYXRpb24gbmVlZCAiCisJInRvIHNwZWNpZnkgdGhlc2UgcHJveGllcyBpZiB0aGUgc2VydmljZSBwcm92aWRlciByZXF1aXJlcyAiCisJInRoYXQgcmVxdWVzdHMgZGVzdGluZWQgdG93YXJkcyBpdHMgbmV0d29yayBzaG91bGQgZ28gdGhyb3VnaCBjZXJ0YWluICIKKwkicHJveGllcyBmaXJzdCAoZm9yIGV4YW1wbGUsIGJvcmRlciBjb250cm9sbGVycykuIgorICAgIH0sCisgICAgeworICAgICAgICAicmVnX3RpbWVvdXQiLCBUX0lOVCwgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcmVnX3RpbWVvdXQpLCAwLAorICAgICAgICAiT3B0aW9uYWwgaW50ZXJ2YWwgZm9yIHJlZ2lzdHJhdGlvbiwgaW4gc2Vjb25kcy4gIgorICAgICAgICAiSWYgdGhlIHZhbHVlIGlzIHplcm8sIGRlZmF1bHQgaW50ZXJ2YWwgd2lsbCBiZSB1c2VkICIKKyAgICAgICAgIihQSlNVQV9SRUdfSU5URVJWQUwsIDU1IHNlY29uZHMpLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjcmVkX2luZm8iLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgY3JlZF9pbmZvKSwgMCwKKyAgICAgICAgIkFycmF5IG9mIGNyZWRlbnRpYWxzLiBJZiByZWdpc3RyYXRpb24gaXMgZGVzaXJlZCwgbm9ybWFsbHkgdGhlcmUgIgorCSJzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGNyZWRlbnRpYWwgc3BlY2lmaWVkLCB0byBzdWNjZXNzZnVsbHkgIgorCSJhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgc2VydmljZSBwcm92aWRlci4gTW9yZSBjcmVkZW50aWFscyBjYW4gIgorCSJiZSBzcGVjaWZpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RzIGFyZSBleHBlY3RlZCB0byBiZSAiCisJImNoYWxsZW5nZWQgYnkgdGhlIHByb3hpZXMgaW4gdGhlIHJvdXRlIHNldC4iCisgICAgfSwKKyAgICB7CisJInRyYW5zcG9ydF9pZCIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIHRyYW5zcG9ydF9pZCksIDAsCisJIk9wdGlvbmFsbHkgYmluZCB0aGlzIGFjY291bnQgdG8gc3BlY2lmaWMgdHJhbnNwb3J0LiBUaGlzIG5vcm1hbGx5IGlzIgorCSIgbm90IGEgZ29vZCBpZGVhLCBhcyBhY2NvdW50IHNob3VsZCBiZSBhYmxlIHRvIHNlbmQgcmVxdWVzdHMgdXNpbmciCisJIiBhbnkgYXZhaWxhYmxlIHRyYW5zcG9ydHMgYWNjb3JkaW5nIHRvIHRoZSBkZXN0aW5hdGlvbi4gQnV0IHNvbWUiCisJIiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBoYXZlIGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB0aGUgdHJhbnNwb3J0IHRvIgorCSIgdXNlLCBzbyBpbiB0aGF0IGNhc2UgaXQgY2FuIHNldCB0aGlzIGZpZWxkLiIKKyAgICB9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV9hY2NfY29uZmlnCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfYWNjX2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5BY2NfQ29uZmlnIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9hY2NfY29uZmlnKSwgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc3VhX2FjY19jb25maWdfZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkFjYyBDb25maWcgb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMC8qYWNjX2NvbmZpZ19tZXRob2RzKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV9hY2NfaW5mbworICogQWNjIEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBpbnQJCSBpZDsJCisgICAgaW50CQkgaXNfZGVmYXVsdDsKKyAgICBQeU9iamVjdAkqYWNjX3VyaTsKKyAgICBpbnQJCSBoYXNfcmVnaXN0cmF0aW9uOworICAgIGludAkJIGV4cGlyZXM7CisgICAgaW50CQkgc3RhdHVzOworICAgIFB5T2JqZWN0CSpzdGF0dXNfdGV4dDsKKyAgICBpbnQJCSBvbmxpbmVfc3RhdHVzOwkKKyAgICBQeU9iamVjdAkqb25saW5lX3N0YXR1c190ZXh0OworfSBQeU9ial9wanN1YV9hY2NfaW5mbzsKKworCisvKgorICogUHlPYmpfcGpzdWFfYWNjX2luZm9fZGVsZXRlCisgKiBkZWxldGVzIGEgYWNjX2luZm8gZnJvbSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYWNjX2luZm9fZGVsZXRlKFB5T2JqX3Bqc3VhX2FjY19pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+YWNjX3VyaSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0dXNfdGV4dCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbmxpbmVfc3RhdHVzX3RleHQpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9hY2NfaW5mb19pbXBvcnQoUHlPYmpfcGpzdWFfYWNjX2luZm8gKm9iaiwKKwkJCQkJY29uc3QgcGpzdWFfYWNjX2luZm8gKmluZm8pCit7CisgICAgb2JqLT5pZAkgICAgPSBpbmZvLT5pZDsKKyAgICBvYmotPmlzX2RlZmF1bHQgPSBpbmZvLT5pc19kZWZhdWx0OworICAgIG9iai0+YWNjX3VyaSAgICA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGluZm8tPmFjY191cmkucHRyLCAKKwkJCQkJCSBpbmZvLT5hY2NfdXJpLnNsZW4pOworICAgIG9iai0+aGFzX3JlZ2lzdHJhdGlvbiA9IGluZm8tPmhhc19yZWdpc3RyYXRpb247CisgICAgb2JqLT5leHBpcmVzICAgID0gaW5mby0+ZXhwaXJlczsKKyAgICBvYmotPnN0YXR1cwkgICAgPSBpbmZvLT5zdGF0dXM7CisgICAgb2JqLT5zdGF0dXNfdGV4dD0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5mby0+c3RhdHVzX3RleHQucHRyLAorCQkJCQkJIGluZm8tPnN0YXR1c190ZXh0LnNsZW4pOworICAgIG9iai0+b25saW5lX3N0YXR1cyA9IGluZm8tPm9ubGluZV9zdGF0dXM7CisgICAgb2JqLT5vbmxpbmVfc3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmZvLT5vbmxpbmVfc3RhdHVzX3RleHQucHRyLAorCQkJCQkJCSBpbmZvLT5vbmxpbmVfc3RhdHVzX3RleHQuc2xlbik7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2FjY19pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIGFjY19pbmZvIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanN1YV9hY2NfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgUHlPYmplY3QgKmFyZ3MsCisJCQkJCSAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2FjY19pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9hY2NfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+YWNjX3VyaSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+YWNjX3VyaSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCXNlbGYtPnN0YXR1c190ZXh0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT5zdGF0dXNfdGV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCXNlbGYtPm9ubGluZV9zdGF0dXNfdGV4dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+b25saW5lX3N0YXR1c190ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworLyoKKyAqIGFjY19pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGFjY19pbmZvX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAiaWQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGlkKSwgMCwKKyAgICAgICAgIlRoZSBhY2NvdW50IElELiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImlzX2RlZmF1bHQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGlzX2RlZmF1bHQpLCAwLAorICAgICAgICAiRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgYWNjb3VudC4gIgorICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3VyaSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgYWNjX3VyaSksIDAsCisgICAgICAgICJBY2NvdW50IFVSSSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImhhc19yZWdpc3RyYXRpb24iLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGhhc19yZWdpc3RyYXRpb24pLCAwLAorICAgICAgICAiRmxhZyB0byB0ZWxsIHdoZXRoZXIgdGhpcyBhY2NvdW50IGhhcyByZWdpc3RyYXRpb24gc2V0dGluZyAiCisgICAgICAgICIocmVnX3VyaSBpcyBub3QgZW1wdHkpLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImV4cGlyZXMiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGV4cGlyZXMpLCAwLAorICAgICAgICAiQW4gdXAgdG8gZGF0ZSBleHBpcmF0aW9uIGludGVydmFsIGZvciBhY2NvdW50IHJlZ2lzdHJhdGlvbiBzZXNzaW9uLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInN0YXR1cyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgc3RhdHVzKSwgMCwKKyAgICAgICAgIkxhc3QgcmVnaXN0cmF0aW9uIHN0YXR1cyBjb2RlLiBJZiBzdGF0dXMgY29kZSBpcyB6ZXJvLCAiCisgICAgICAgICJ0aGUgYWNjb3VudCBpcyBjdXJyZW50bHkgbm90IHJlZ2lzdGVyZWQuIEFueSBvdGhlciB2YWx1ZSBpbmRpY2F0ZXMgIgorICAgICAgICAidGhlIFNJUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVnaXN0cmF0aW9uLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgc3RhdHVzX3RleHQpLCAwLAorICAgICAgICAiU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMuIgorICAgIH0sCisgICAgeworICAgICAgICAib25saW5lX3N0YXR1cyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgb25saW5lX3N0YXR1cyksIDAsCisgICAgICAgICJQcmVzZW5jZSBvbmxpbmUgc3RhdHVzIGZvciB0aGlzIGFjY291bnQuICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9ubGluZV9zdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgb25saW5lX3N0YXR1c190ZXh0KSwgMCwKKyAgICAgICAgIlByZXNlbmNlIG9ubGluZSBzdGF0dXMgdGV4dC4iCisgICAgfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfYWNjX2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9hY2NfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJweV9wanN1YS5BY2NfSW5mbyIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfYWNjX2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzdWFfYWNjX2luZm9fZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkFjYyBJbmZvIG9iamVjdHMiLCAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGFjY19pbmZvX21lbWJlcnMsCQkgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9hY2NfaW5mb19uZXcsICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnCisgKiBCdWRkeSBDb25maWcKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBQeU9iamVjdAkqdXJpOworICAgIGludAkJIHN1YnNjcmliZTsKK30gUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnOworCisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9jb25maWdfZGVsZXRlCisgKiBkZWxldGVzIGEgYnVkZHlfY29uZmlnIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19kZWxldGUoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dXJpKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX2ltcG9ydChQeU9ial9wanN1YV9idWRkeV9jb25maWcgKm9iaiwKKwkJCQkJICAgIGNvbnN0IHBqc3VhX2J1ZGR5X2NvbmZpZyAqY2ZnKQoreworICAgIFB5X1hERUNSRUYob2JqLT51cmkpOworICAgIG9iai0+dXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY2ZnLT51cmkucHRyLCBjZmctPnVyaS5zbGVuKTsKKyAgICBvYmotPnN1YnNjcmliZSA9IGNmZy0+c3Vic2NyaWJlOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19leHBvcnQocGpzdWFfYnVkZHlfY29uZmlnICpjZmcsCisJCQkJCSAgICBQeU9ial9wanN1YV9idWRkeV9jb25maWcgKm9iaikKK3sKKyAgICBjZmctPnVyaSA9IFB5U3RyaW5nX3RvX3BqX3N0cihvYmotPnVyaSk7CisgICAgY2ZnLT5zdWJzY3JpYmUgPSBvYmotPnN1YnNjcmliZTsKK30KKworCisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9jb25maWdfbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgYnVkZHlfY29uZmlnIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKlB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgICAgUHlPYmplY3QgKmFyZ3MsCisJCQkJCSAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT51cmkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPnVyaSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19tZW1iZXJzW10gPQoreworICAgIAorICAgIHsKKyAgICAgICAgInVyaSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9jb25maWcsIHVyaSksIDAsCisgICAgICAgICJUQnVkZHkgVVJMIG9yIG5hbWUgYWRkcmVzcy4iICAgICAgICAKKyAgICB9LAorICAgIAorICAgIHsKKyAgICAgICAgInN1YnNjcmliZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnLCBzdWJzY3JpYmUpLCAwLAorICAgICAgICAiU3BlY2lmeSB3aGV0aGVyIHByZXNlbmNlIHN1YnNjcmlwdGlvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuICIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV9idWRkeV9jb25maWcKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9idWRkeV9jb25maWcgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuQnVkZHlfQ29uZmlnIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZyksLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJCdWRkeSBDb25maWcgb2JqZWN0cyIsICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQeU9ial9wanN1YV9idWRkeV9jb25maWdfbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19uZXcsICAgLyogdHBfbmV3ICovCisKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm8KKyAqIEJ1ZGR5IEluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8gCisgICAgaW50CQkgaWQ7CisgICAgUHlPYmplY3QJKnVyaTsKKyAgICBQeU9iamVjdAkqY29udGFjdDsKKyAgICBpbnQJCSBzdGF0dXM7CisgICAgUHlPYmplY3QJKnN0YXR1c190ZXh0OworICAgIGludAkJIG1vbml0b3JfcHJlczsKK30gUHlPYmpfcGpzdWFfYnVkZHlfaW5mbzsKKworCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19kZWxldGUKKyAqIGRlbGV0ZXMgYSBidWRkeV9pbmZvIGZyb20gbWVtb3J5CisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19kZWxldGUoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnVyaSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb250YWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXR1c190ZXh0KTsKKyAgICAKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19pbXBvcnQoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqb2JqLAorCQkJCQkgIGNvbnN0IHBqc3VhX2J1ZGR5X2luZm8gKmluZm8pCit7CisgICAgb2JqLT5pZCA9IGluZm8tPmlkOworICAgIFB5X1hERUNSRUYob2JqLT51cmkpOworICAgIG9iai0+dXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoaW5mby0+dXJpLnB0ciwgaW5mby0+dXJpLnNsZW4pOworICAgIFB5X1hERUNSRUYob2JqLT5jb250YWN0KTsKKyAgICBvYmotPmNvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmZvLT5jb250YWN0LnB0ciwgaW5mby0+Y29udGFjdC5zbGVuKTsKKyAgICBvYmotPnN0YXR1cyA9IGluZm8tPnN0YXR1czsKKyAgICBQeV9YREVDUkVGKG9iai0+c3RhdHVzX3RleHQpOworICAgIG9iai0+c3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmZvLT5zdGF0dXNfdGV4dC5wdHIsIAorCQkJCQkJICBpbmZvLT5zdGF0dXNfdGV4dC5zbGVuKTsKKyAgICBvYmotPm1vbml0b3JfcHJlcyA9IGluZm8tPm1vbml0b3JfcHJlczsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBidWRkeV9pbmZvIG9iamVjdAorICogIW1vZGlmaWVkIEAgMDcxMjA2CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm9fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgICAgUHlPYmplY3QgKmFyZ3MsCisJCQkJCSAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+dXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmIChzZWxmLT51cmkgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gICAgICAgIAorCXNlbGYtPmNvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKHNlbGYtPmNvbnRhY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwlzZWxmLT5zdGF0dXNfdGV4dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoc2VsZi0+c3RhdHVzX3RleHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwkKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9pbmZvX21lbWJlcnMKKyAqICFtb2RpZmllZCBAIDA3MTIwNgorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBpZCksIDAsCisgICAgICAgICJUaGUgYnVkZHkgSUQuIgorICAgIH0sCisgICAgeworICAgICAgICAidXJpIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm8sIHVyaSksIDAsCisgICAgICAgICJUaGUgZnVsbCBVUkkgb2YgdGhlIGJ1ZGR5LCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uICIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAiY29udGFjdCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBjb250YWN0KSwgMCwKKyAgICAgICAgIkJ1ZGR5J3MgQ29udGFjdCwgb25seSBhdmFpbGFibGUgd2hlbiBwcmVzZW5jZSBzdWJzY3JpcHRpb24gIgorICAgICAgICAiaGFzIGJlZW4gZXN0YWJsaXNoZWQgdG8gdGhlIGJ1ZGR5LiIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAic3RhdHVzIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBzdGF0dXMpLCAwLAorICAgICAgICAiQnVkZHkncyBvbmxpbmUgc3RhdHVzLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBzdGF0dXNfdGV4dCksIDAsCisgICAgICAgICJUZXh0IHRvIGRlc2NyaWJlIGJ1ZGR5J3Mgb25saW5lIHN0YXR1cy4iICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1vbml0b3JfcHJlcyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbywgbW9uaXRvcl9wcmVzKSwgMCwKKyAgICAgICAgIkZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgbW9uaXRvciB0aGUgcHJlc2VuY2UgaW5mb3JtYXRpb24gIgorICAgICAgICAiZm9yIHRoaXMgYnVkZHkgKG5vcm1hbGx5IHllcywgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQpLiAiCisgICAgfSwKKyAgICAKKyAgICAKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfYnVkZHlfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2J1ZGR5X2luZm8gPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAicHlfcGpzdWEuQnVkZHlfSW5mbyIsICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9idWRkeV9pbmZvX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJCdWRkeSBJbmZvIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm9fbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm9fbmV3LCAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworCisKKworCisjZW5kaWYJLyogX19QWV9QSlNVQV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvc2V0dXAucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weV9wanN1YS9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI1OWMyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlfcGpzdWEvc2V0dXAucHkKQEAgLTAsMCArMSw0NCBAQAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKyMgRmlsbCBpbiBwal9pbmNfZGlycworcGpfaW5jX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC1mIGhlbHBlci5tYWsgaW5jX2RpciIpCitmb3IgbGluZSBpbiBmOgorCXBqX2luY19kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJfZGlycworcGpfbGliX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC1mIGhlbHBlci5tYWsgbGliX2RpciIpCitmb3IgbGluZSBpbiBmOgorCXBqX2xpYl9kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJzCitwal9saWJzID0gW10KK2YgPSBvcy5wb3BlbigibWFrZSAtZiBoZWxwZXIubWFrIGxpYnMiKQorZm9yIGxpbmUgaW4gZjoKKwlwal9saWJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgTWFjIE9TIFggZGVwZWRlbmNpZXMKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKwlleHRyYV9saW5rX2FyZ3MgPSBbIi1mcmFtZXdvcmsiLCAiQ29yZUZvdW5kYXRpb24iLCAKKwkJCSAgICItZnJhbWV3b3JrIiwgIkF1ZGlvVG9vbGJveCJdCitlbHNlOgorCWV4dHJhX2xpbmtfYXJncyA9IFtdCisKKworc2V0dXAobmFtZT0icHlfcGpzdWEiLCB2ZXJzaW9uPSIwLjgiLAorCWV4dF9tb2R1bGVzID0gWworCQlFeHRlbnNpb24oInB5X3Bqc3VhIiwgCisJCQkgIFsicHlfcGpzdWEuYyJdLCAKKwkJCSAgZGVmaW5lX21hY3Jvcz1bKCdQSl9BVVRPQ09ORicsICcxJyksXSwKKwkJCSAgaW5jbHVkZV9kaXJzPXBqX2luY19kaXJzLCAKKwkJCSAgbGlicmFyeV9kaXJzPXBqX2xpYl9kaXJzLCAKKwkJCSAgbGlicmFyaWVzPXBqX2xpYnMsCisJCQkgIGV4dHJhX2xpbmtfYXJncz1leHRyYV9saW5rX2FyZ3MpLAorCV0pCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2FjY291bnQucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9hY2NvdW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzkxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9hY2NvdW50LnB5CkBAIC0wLDAgKzEsMjM5IEBACisjICRJZDogYWNjb3VudC5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YSBQeXRob24gR1VJIERlbW8KKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6ICMgUHl0aG9uIDMKKwlpbXBvcnQgdGtpbnRlciBhcyB0aworCWZyb20gdGtpbnRlciBpbXBvcnQgdHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIG1zZ2JveAorZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisJaW1wb3J0IHR0aworCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgX3Bqc3VhMgoraW1wb3J0IGFjY291bnRzZXR0aW5nCitpbXBvcnQgYXBwbGljYXRpb24KK2ltcG9ydCBjYWxsCitpbXBvcnQgY2hhdCBhcyBjaAorCisjIEFjY291bnQgY2xhc3MKK2NsYXNzIEFjY291bnQocGouQWNjb3VudCk6CisJIiIiCisJSGlnaCBsZXZlbCBQeXRob24gQWNjb3VudCBvYmplY3QsIGRlcml2ZWQgZnJvbSBwanN1YTIncyBBY2NvdW50IG9iamVjdC4KKwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgYXBwKToKKwkJcGouQWNjb3VudC5fX2luaXRfXyhzZWxmKQorCQlzZWxmLmFwcCA9IGFwcAorCQlzZWxmLnJhbmRJZCA9IHJhbmRvbS5yYW5kaW50KDEsIDk5OTkpCisJCXNlbGYuY2ZnID0gIHBqLkFjY291bnRDb25maWcoKQorCQlzZWxmLmNmZ0NoYW5nZWQgPSBGYWxzZQorCQlzZWxmLmJ1ZGR5TGlzdCA9IFtdCisJCXNlbGYuY2hhdExpc3QgPSBbXQorCQlzZWxmLmRlbGV0aW5nID0gRmFsc2UKKworCWRlZiBmaW5kQ2hhdChzZWxmLCB1cmlfc3RyKToKKwkJdXJpID0gY2guUGFyc2VTaXBVcmkodXJpX3N0cikKKwkJaWYgbm90IHVyaTogcmV0dXJuIE5vbmUKKwkJCQorCQlmb3IgY2hhdCBpbiBzZWxmLmNoYXRMaXN0OgorCQkJaWYgY2hhdC5pc1VyaVBhcnRpY2lwYW50KHVyaSkgYW5kIGNoYXQuaXNQcml2YXRlKCk6CisJCQkJcmV0dXJuIGNoYXQKKwkJcmV0dXJuIE5vbmUKKwkKKwlkZWYgbmV3Q2hhdChzZWxmLCB1cmlfc3RyKToKKwkJdXJpID0gY2guUGFyc2VTaXBVcmkodXJpX3N0cikKKwkJaWYgbm90IHVyaTogcmV0dXJuIE5vbmUKKwkJCQorCQljaGF0ID0gY2guQ2hhdChzZWxmLmFwcCwgc2VsZiwgdXJpKQorCQlzZWxmLmNoYXRMaXN0LmFwcGVuZChjaGF0KQorCQlzZWxmLmFwcC51cGRhdGVXaW5kb3dNZW51KCkKKwkJcmV0dXJuIGNoYXQKKwkKKwlkZWYgc3RhdHVzVGV4dChzZWxmKToKKwkJc3RhdHVzID0gJz8nCisJCWlmIHNlbGYuaXNWYWxpZCgpOgorCQkJYWkgPSBzZWxmLmdldEluZm8oKQorCQkJaWYgYWkucmVnTGFzdEVycjoKKwkJCQlzdGF0dXMgPSBzZWxmLmFwcC5lcC51dGlsU3RyRXJyb3IoYWkucmVnTGFzdEVycikKKwkJCWVsaWYgYWkucmVnSXNBY3RpdmU6CisJCQkJaWYgYWkub25saW5lU3RhdHVzOgorCQkJCQlpZiBsZW4oYWkub25saW5lU3RhdHVzVGV4dCk6CisJCQkJCQlzdGF0dXMgPSBhaS5vbmxpbmVTdGF0dXNUZXh0CisJCQkJCWVsc2U6CisJCQkJCQlzdGF0dXMgPSAiT25saW5lIgorCQkJCWVsc2U6CisJCQkJCXN0YXR1cyA9ICJSZWdpc3RlcmVkIgorCQkJZWxzZToKKwkJCQlpZiBhaS5yZWdJc0NvbmZpZ3VyZWQ6CisJCQkJCWlmIGFpLnJlZ1N0YXR1cy8xMDAgPT0gMjoKKwkJCQkJCXN0YXR1cyA9ICJVbnJlZ2lzdGVyZWQiCisJCQkJCWVsc2U6CisJCQkJCQlzdGF0dXMgPSBhaS5yZWdTdGF0dXNUZXh0CisJCQkJZWxzZToKKwkJCQkJc3RhdHVzID0gIkRvZXNuJ3QgcmVnaXN0ZXIiCisJCWVsc2U6CisJCQlzdGF0dXMgPSAnLSBub3QgY3JlYXRlZCAtJworCQlyZXR1cm4gc3RhdHVzCisgICAgICAgIAkKKwlkZWYgb25SZWdTdGF0ZShzZWxmLCBwcm0pOgorCQlzZWxmLmFwcC51cGRhdGVBY2NvdW50KHNlbGYpCisKKyAgICAgICAgZGVmIG9uSW5jb21pbmdDYWxsKHNlbGYsIHBybSk6CisJCWMgPSBjYWxsLkNhbGwoc2VsZiwgY2FsbF9pZD1wcm0uY2FsbElkKQorICAgICAgICAgICAgICAgIGNhbGxfcHJtID0gcGouQ2FsbE9wUGFyYW0oKQorCQljYWxsX3BybS5zdGF0dXNDb2RlID0gMTgwCisJCWMuYW5zd2VyKGNhbGxfcHJtKQorCQljaSA9IGMuZ2V0SW5mbygpCisJCW1zZyA9ICJJbmNvbWluZyBjYWxsIGZvciBhY2NvdW50ICclcyciICUgc2VsZi5jZmcuaWRVcmkKKwkJaWYgbXNnYm94LmFza3F1ZXN0aW9uKG1zZywgIkFjY2VwdCBjYWxsIGZyb20gJyVzJz8iICUgKGNpLnJlbW90ZVVyaSksIGRlZmF1bHQ9bXNnYm94LllFUykgPT0gdSd5ZXMnOgorCQkJY2FsbF9wcm0uc3RhdHVzQ29kZSA9IDIwMAorCQkJYy5hbnN3ZXIoY2FsbF9wcm0pCisJCQkKKwkJCSMgZmluZC9jcmVhdGUgY2hhdCBpbnN0YW5jZQorCQkJY2hhdCA9IHNlbGYuZmluZENoYXQoY2kucmVtb3RlVXJpKQorCQkJaWYgbm90IGNoYXQ6IGNoYXQgPSBzZWxmLm5ld0NoYXQoY2kucmVtb3RlVXJpKQorCQkJCisJCQljaGF0LnNob3dXaW5kb3coKQorCQkJY2hhdC5yZWdpc3RlckNhbGwoY2kucmVtb3RlVXJpLCBjKQorCQkJY2hhdC51cGRhdGVDYWxsU3RhdGUoYywgY2kpCisJCWVsc2U6CisJCQljLmhhbmd1cChjYWxsX3BybSkKKwkJCQorCWRlZiBvbkluc3RhbnRNZXNzYWdlKHNlbGYsIHBybSk6CisJCWNoYXQgPSBzZWxmLmZpbmRDaGF0KHBybS5mcm9tVXJpKQorCQlpZiBub3QgY2hhdDogY2hhdCA9IHNlbGYubmV3Q2hhdChwcm0uZnJvbVVyaSkKKwkJCisJCWNoYXQuc2hvd1dpbmRvdygpCisJCWNoYXQuYWRkTWVzc2FnZShwcm0uZnJvbVVyaSwgcHJtLm1zZ0JvZHkpCisJCQorCWRlZiBvbkluc3RhbnRNZXNzYWdlU3RhdHVzKHNlbGYsIHBybSk6CisJCWlmIHBybS5jb2RlLzEwMCA9PSAyOiByZXR1cm4KKwkJCisJCWNoYXQgPSBzZWxmLmZpbmRDaGF0KHBybS50b1VyaSkKKwkJaWYgbm90IGNoYXQ6CisJCQlwcmludCAiPT09IElNIHN0YXR1cyB0byAnJXMnIGNhbm5vdCBmaW5kIGNoYXQiICUgcHJtLnRvVXJpCisJCQlyZXR1cm4KKwkJCisJCWNoYXQuYWRkTWVzc2FnZShOb25lLCAiRmFpbGVkIHNlbmRpbmcgbWVzc2FnZSB0byAnJXMnOiAlcyIgJSAocHJtLnRvVXJpLCBwcm0ucmVhc29uKSkKKwkJCisJZGVmIG9uVHlwaW5nSW5kaWNhdGlvbihzZWxmLCBwcm0pOgorCQljaGF0ID0gc2VsZi5maW5kQ2hhdChwcm0uZnJvbVVyaSkKKwkJaWYgbm90IGNoYXQ6CisJCQlwcmludCAiPT09IEluY29taW5nIHR5cGluZyBpbmRpY2F0aW9uIGZyb20gJyVzJyBjYW5ub3QgZmluZCBjaGF0IiAlIHBybS5mcm9tVXJpCisJCQlyZXR1cm4KKwkJCisJCWNoYXQuc2V0VHlwaW5nSW5kaWNhdGlvbihwcm0uZnJvbVVyaSwgcHJtLmlzVHlwaW5nKQorCisJCQorIyBBY2NvdW50IGZyYW1lLCB0byBsaXN0IGFjY291bnRzCitjbGFzcyBBY2NvdW50TGlzdEZyYW1lKHR0ay5GcmFtZSk6CisJIiIiCisJVGhpcyBpbXBsZW1lbnRzIGEgRnJhbWUgd2hpY2ggY29udGFpbnMgYWNjb3VudCBsaXN0IGFuZCBidXR0b25zIHRvIG9wZXJhdGUKKwlvbiB0aGVtIChBZGQsIE1vZGlmeSwgRGVsZXRlLCBldGMuKS4gCisJIiIiCisJZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgYXBwLCBhY2NfbGlzdCA9IFtdKToKKwkJdHRrLkZyYW1lLl9faW5pdF9fKHNlbGYsIHBhcmVudCwgbmFtZT0nYWNjbGlzdCcpCisJCXNlbGYuYXBwID0gYXBwCisJCXNlbGYuYWNjTGlzdCA9IGFjY19saXN0CisJCXNlbGYuYWNjRGVsZXRlZExpc3QgPSBbXQorCQlzZWxmLnBhY2soZXhwYW5kPSd5ZXMnLCBmaWxsPSdib3RoJykKKwkJc2VsZi5fY3JlYXRlV2lkZ2V0cygpCisJCWZvciBhY2MgaW4gc2VsZi5hY2NMaXN0OgorCQkJc2VsZi5fc2hvd0FjYyhhY2MpCisJCQorCWRlZiBfY3JlYXRlV2lkZ2V0cyhzZWxmKToKKwkJc2VsZi50diA9IHR0ay5UcmVldmlldyhzZWxmLCBjb2x1bW5zPSgnSUQnLCAnUmVnaXN0cmFyJywgJ0RlZmF1bHQnKSwgc2VsZWN0bW9kZT0nYnJvd3NlJykKKwkJc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9J1ByaW9yaXR5JykKKwkJc2VsZi50di5oZWFkaW5nKDAsIHRleHQ9J0lEJykKKwkJc2VsZi50di5oZWFkaW5nKDEsIHRleHQ9J1JlZ2lzdHJhcicpCisJCXNlbGYudHYuaGVhZGluZygyLCB0ZXh0PSdEZWZhdWx0PycpCisJCXNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPTYwKQorCQlzZWxmLnR2LmNvbHVtbigwLCB3aWR0aD0zMDApCisJCXNlbGYudHYuY29sdW1uKDEsIHdpZHRoPTIwMCkKKwkJc2VsZi50di5jb2x1bW4oMiwgd2lkdGg9NjApCisJCXNlbGYudHYuZ3JpZChjb2x1bW49MCwgcm93PTAsIHJvd3NwYW49NCwgcGFkeD01LCBwYWR5PTUpCisJCQorCQl0dGsuQnV0dG9uKHNlbGYsIHRleHQ9J0FkZC4uJywgY29tbWFuZD1zZWxmLl9vbkJ0bkFkZCkuZ3JpZChjb2x1bW49MSwgcm93PTAsIHBhZHg9NSkKKwkJdHRrLkJ1dHRvbihzZWxmLCB0ZXh0PSdTZXR0aW5ncy4uJywgY29tbWFuZD1zZWxmLl9vbkJ0blNldHRpbmdzKS5ncmlkKGNvbHVtbj0xLCByb3c9MSkKKwkJdHRrLkJ1dHRvbihzZWxmLCB0ZXh0PSdTZXQgRGVmYXVsdCcsIGNvbW1hbmQ9c2VsZi5fb25CdG5TZXREZWZhdWx0KS5ncmlkKGNvbHVtbj0xLCByb3c9MikKKwkJdHRrLkJ1dHRvbihzZWxmLCB0ZXh0PSdEZWxldGUuLicsIGNvbW1hbmQ9c2VsZi5fb25CdG5EZWxldGUpLmdyaWQoY29sdW1uPTEsIHJvdz0zKQorCisJZGVmIF9zaG93QWNjKHNlbGYsIGFjYyk6CisJCWlzX2RlZmF1bHQgPSAnWWVzJyBpZiBhY2MuaXNWYWxpZCgpIGFuZCBhY2MuaXNEZWZhdWx0KCkgZWxzZSAnJworCQl2YWx1ZXMgPSAoYWNjLmNmZy5pZFVyaSwgYWNjLmNmZy5yZWdDb25maWcucmVnaXN0cmFyVXJpLCBpc19kZWZhdWx0KQorCQlzZWxmLnR2Lmluc2VydCgnJywgMCwgc3RyKGFjYy5yYW5kSWQpLCBvcGVuPVRydWUsIHRleHQ9c3RyKGFjYy5jZmcucHJpb3JpdHkpLCB2YWx1ZXM9dmFsdWVzKQorCQorCWRlZiB1cGRhdGVBY2NvdW50KHNlbGYsIGFjYyk6CisJCWlzX2RlZmF1bHQgPSAnWWVzJyBpZiBhY2MuaXNWYWxpZCgpIGFuZCBhY2MuaXNEZWZhdWx0KCkgZWxzZSAnJworCQl2YWx1ZXMgPSAoYWNjLmNmZy5pZFVyaSwgYWNjLmNmZy5yZWdDb25maWcucmVnaXN0cmFyVXJpLCBpc19kZWZhdWx0KQorCQlzZWxmLnR2Lml0ZW0oc3RyKGFjYy5yYW5kSWQpLCB0ZXh0PXN0cihhY2MuY2ZnLnByaW9yaXR5KSwgdmFsdWVzPXZhbHVlcykKKwkKKwlkZWYgX2dldFNlbGVjdGVkQWNjKHNlbGYpOgorCQlpdGVtcyA9IHNlbGYudHYuc2VsZWN0aW9uKCkKKwkJaWYgbm90IGl0ZW1zOgorCQkJcmV0dXJuIE5vbmUKKwkJaWlkID0gaW50KGl0ZW1zWzBdKQorCQlyZXR1cm4gW2FjYyBmb3IgYWNjIGluIHNlbGYuYWNjTGlzdCBpZiBhY2MucmFuZElkPT1paWRdWzBdCisJCisJZGVmIF9vbkJ0bkFkZChzZWxmKToKKwkJY2ZnID0gcGouQWNjb3VudENvbmZpZygpCisJCWRsZyA9IGFjY291bnRzZXR0aW5nLkRpYWxvZyhzZWxmLm1hc3RlciwgY2ZnKQorCQlpZiBkbGcuZG9Nb2RhbCgpOgorCQkJYWNjID0gQWNjb3VudChzZWxmLmFwcCkKKwkJCWFjYy5jZmcgPSBjZmcKKwkJCXNlbGYuX3Nob3dBY2MoYWNjKQorCQkJc2VsZi5hY2NMaXN0LmFwcGVuZChhY2MpCisJCQlzZWxmLmNmZ0NoYW5nZWQgPSBUcnVlCisJCisJZGVmIF9vbkJ0blNldHRpbmdzKHNlbGYpOgorCQlhY2MgPSBzZWxmLl9nZXRTZWxlY3RlZEFjYygpCisJCWlmIG5vdCBhY2M6CisJCQlyZXR1cm4KKwkJZGxnID0gYWNjb3VudHNldHRpbmcuRGlhbG9nKHNlbGYubWFzdGVyLCBhY2MuY2ZnKQorCQlpZiBkbGcuZG9Nb2RhbCgpOgorCQkJc2VsZi51cGRhdGVBY2NvdW50KGFjYykKKwkJCXNlbGYuY2ZnQ2hhbmdlZCA9IFRydWUKKworCWRlZiBfb25CdG5EZWxldGUoc2VsZik6CisJCWFjYyA9IHNlbGYuX2dldFNlbGVjdGVkQWNjKCkKKwkJaWYgbm90IGFjYzoKKwkJCXJldHVybgorCQltc2cgPSAiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSBhY2NvdW50ICclcyciICUgYWNjLmNmZy5pZFVyaQorCQlpZiBtc2dib3guYXNrcXVlc3Rpb24oJ0RlbGV0ZSBhY2NvdW50PycsIG1zZywgZGVmYXVsdD1tc2dib3guTk8pICE9IHUneWVzJzoKKwkJCXJldHVybgorCQlzZWxmLmFjY0xpc3QucmVtb3ZlKGFjYykKKwkJc2VsZi5hY2NEZWxldGVkTGlzdC5hcHBlbmQoYWNjKQorCQlzZWxmLnR2LmRlbGV0ZSggKHN0cihhY2MucmFuZElkKSwpICkKKworCWRlZiBfb25CdG5TZXREZWZhdWx0KHNlbGYpOgorCQlhY2MgPSBzZWxmLl9nZXRTZWxlY3RlZEFjYygpCisJCWlmIG5vdCBhY2M6CisJCQlyZXR1cm4KKwkJaWYgYWNjLmlzVmFsaWQoKToKKwkJCWFjYy5zZXREZWZhdWx0KCkKKwkJZm9yIGFjYyBpbiBzZWxmLmFjY0xpc3Q6CisJCQlzZWxmLnVwZGF0ZUFjY291bnQoYWNjKQorCQkKKwkJCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCWFwcGxpY2F0aW9uLm1haW4oKQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYWNjb3VudHNldHRpbmcucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9hY2NvdW50c2V0dGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNmMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYWNjb3VudHNldHRpbmcucHkKQEAgLTAsMCArMSwzNjkgQEAKKyMgJElkOiBhY2NvdW50c2V0dGluZy5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YSBQeXRob24gR1VJIERlbW8KKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6ICMgUHl0aG9uIDMKKwlpbXBvcnQgdGtpbnRlciBhcyB0aworCWZyb20gdGtpbnRlciBpbXBvcnQgdHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIG1zZ2JveAorZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisJaW1wb3J0IHR0aworCitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgZW5kcG9pbnQKK2ltcG9ydCBhcHBsaWNhdGlvbgorCitjbGFzcyBEaWFsb2codGsuVG9wbGV2ZWwpOgorCSIiIgorCVRoaXMgaW1wbGVtZW50cyBhY2NvdW50IHNldHRpbmdzIGRpYWxvZyB0byBtYW5pcHVsYXRlIGFjY291bnQgc2V0dGluZ3MuCisJIiIiCisJZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgY2ZnKToKKwkJdGsuVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorCQlzZWxmLnRyYW5zaWVudChwYXJlbnQpCisJCXNlbGYucGFyZW50ID0gcGFyZW50CisJCXNlbGYuZ2VvbWV0cnkoIisxMDArMTAwIikKKwkJc2VsZi50aXRsZSgnQWNjb3VudCBzZXR0aW5ncycpCisJCQorCQlzZWxmLmZybSA9IHR0ay5GcmFtZShzZWxmKQorCQlzZWxmLmZybS5wYWNrKGV4cGFuZD0neWVzJywgZmlsbD0nYm90aCcpCisJCQorCQlzZWxmLmlzT2sgPSBGYWxzZQorCQlzZWxmLmNmZyA9IGNmZworCQkKKwkJc2VsZi5jcmVhdGVXaWRnZXRzKCkKKwkKKwlkZWYgZG9Nb2RhbChzZWxmKToKKwkJaWYgc2VsZi5wYXJlbnQ6CisJCQlzZWxmLnBhcmVudC53YWl0X3dpbmRvdyhzZWxmKQorCQllbHNlOgorCQkJc2VsZi53YWl0X3dpbmRvdyhzZWxmKQorCQlyZXR1cm4gc2VsZi5pc09rCisJCQorCWRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgorCQkjIFRoZSBub3RlYm9vaworCQlzZWxmLmZybS5yb3djb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCXNlbGYuZnJtLnJvd2NvbmZpZ3VyZSgxLCB3ZWlnaHQ9MCkKKwkJc2VsZi5mcm0uY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlzZWxmLmZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTEpCisJCXNlbGYud1RhYiA9IHR0ay5Ob3RlYm9vayhzZWxmLmZybSkKKwkJc2VsZi53VGFiLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBjb2x1bW5zcGFuPTIsIHBhZHg9MTAsIHBhZHk9MTAsIGlwYWR4PTIwLCBpcGFkeT0yMCwgc3RpY2t5PXRrLk4rdGsuUyt0ay5XK3RrLkUpCisJCQorCQkjIE1haW4gYnV0dG9ucworCQlidG5PayA9IHR0ay5CdXR0b24oc2VsZi5mcm0sIHRleHQ9J09rJywgY29tbWFuZD1zZWxmLm9uT2spCisJCWJ0bk9rLmdyaWQoY29sdW1uPTAsIHJvdz0xLCBzdGlja3k9dGsuRSwgcGFkeD0yMCwgcGFkeT0xMCkKKwkJYnRuQ2FuY2VsID0gdHRrLkJ1dHRvbihzZWxmLmZybSwgdGV4dD0nQ2FuY2VsJywgY29tbWFuZD1zZWxmLm9uQ2FuY2VsKQorCQlidG5DYW5jZWwuZ3JpZChjb2x1bW49MSwgcm93PTEsIHN0aWNreT10ay5XLCBwYWR4PTIwLCBwYWR5PTEwKQorCQkKKwkJIyBUYWJzCisJCXNlbGYuY3JlYXRlQmFzaWNUYWIoKQorCQlzZWxmLmNyZWF0ZVNpcFRhYigpCisJCXNlbGYuY3JlYXRlTWVkaWFUYWIoKQorCQlzZWxmLmNyZWF0ZU1lZGlhTmF0VGFiKCkKKwkJCisJZGVmIGNyZWF0ZUJhc2ljVGFiKHNlbGYpOgorCQkjIFByZXBhcmUgdGhlIHZhcmlhYmxlcyB0byBzZXQvcmVjZWl2ZSB2YWx1ZXMgZnJvbSBHVUkKKwkJc2VsZi5jZmdQcmlvcml0eSA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy5wcmlvcml0eSkKKwkJc2VsZi5jZmdBY2NJZCA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1zZWxmLmNmZy5pZFVyaSkKKwkJc2VsZi5jZmdSZWdpc3RyYXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9c2VsZi5jZmcucmVnQ29uZmlnLnJlZ2lzdHJhclVyaSkKKwkJc2VsZi5jZmdSZWdpc3Rlck9uQWRkID0gdGsuSW50VmFyKHZhbHVlPXNlbGYuY2ZnLnJlZ0NvbmZpZy5yZWdpc3Rlck9uQWRkKQorCQlzZWxmLmNmZ1VzZXJuYW1lID0gdGsuU3RyaW5nVmFyKCkKKwkJc2VsZi5jZmdQYXNzd29yZCA9IHRrLlN0cmluZ1ZhcigpCisJCWlmIGxlbihzZWxmLmNmZy5zaXBDb25maWcuYXV0aENyZWRzKToKKwkJCXNlbGYuY2ZnVXNlcm5hbWUuc2V0KCBzZWxmLmNmZy5zaXBDb25maWcuYXV0aENyZWRzWzBdLnVzZXJuYW1lICkKKwkJCXNlbGYuY2ZnUGFzc3dvcmQuc2V0KCBzZWxmLmNmZy5zaXBDb25maWcuYXV0aENyZWRzWzBdLmRhdGEgKQorCQlzZWxmLmNmZ1Byb3h5ID0gdGsuU3RyaW5nVmFyKCkKKwkJaWYgbGVuKHNlbGYuY2ZnLnNpcENvbmZpZy5wcm94aWVzKToKKwkJCXNlbGYuY2ZnUHJveHkuc2V0KCBzZWxmLmNmZy5zaXBDb25maWcucHJveGllc1swXSApCisJCQorCQkjIEJ1aWxkIHRoZSB0YWIgcGFnZQorCQlmcm0gPSB0dGsuRnJhbWUoc2VsZi5mcm0pCisJCWZybS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCWZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTIpCisJCXJvdyA9IDAKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nUHJpb3JpdHk6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdGsuU3BpbmJveChmcm0sIGZyb21fPTAsIHRvPTksIHRleHR2YXJpYWJsZT1zZWxmLmNmZ1ByaW9yaXR5LCB3aWR0aD0yKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdJRCAoVVJJKTonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdBY2NJZCwgd2lkdGg9MzIpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1JlZ2lzdHJhciBVUkk6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkVudHJ5KGZybSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnUmVnaXN0cmFyLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nUmVnaXN0ZXIgb24gYWRkJywgdmFyaWFibGU9c2VsZi5jZmdSZWdpc3Rlck9uQWRkKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J09wdGlvbmFsIHByb3h5IFVSSTonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdQcm94eSwgd2lkdGg9MzIpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J0F1dGggdXNlcm5hbWU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkVudHJ5KGZybSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnVXNlcm5hbWUsIHdpZHRoPTE2KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdQYXNzd29yZDonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdQYXNzd29yZCwgc2hvdz0nKicsIHdpZHRoPTE2KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisKKwkJc2VsZi53VGFiLmFkZChmcm0sIHRleHQ9J0Jhc2ljIFNldHRpbmdzJykKKwkJCisKKwlkZWYgY3JlYXRlU2lwVGFiKHNlbGYpOgorCQkjIFByZXBhcmUgdGhlIHZhcmlhYmxlcyB0byBzZXQvcmVjZWl2ZSB2YWx1ZXMgZnJvbSBHVUkKKwkJc2VsZi5jZmdQcmFja1VzZSAJPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuY2FsbENvbmZpZy5wcmFja1VzZSkKKwkJc2VsZi5jZmdUaW1lclVzZSAJPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuY2FsbENvbmZpZy50aW1lclVzZSkKKwkJc2VsZi5jZmdUaW1lckV4cGlyZXMgCT0gdGsuSW50VmFyKHZhbHVlPXNlbGYuY2ZnLmNhbGxDb25maWcudGltZXJTZXNzRXhwaXJlc1NlYykKKwkJc2VsZi5jZmdQdWJsaXNoIAk9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcucHJlc0NvbmZpZy5wdWJsaXNoRW5hYmxlZCkKKwkJc2VsZi5jZmdNd2lFbmFibGVkIAk9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcubXdpQ29uZmlnLmVuYWJsZWQpCisJCXNlbGYuY2ZnRW5hYmxlQ29udGFjdFJld3JpdGUgPSB0ay5Cb29sZWFuVmFyKHZhbHVlPXNlbGYuY2ZnLm5hdENvbmZpZy5jb250YWN0UmV3cml0ZVVzZSAhPSAwKSAKKwkJc2VsZi5jZmdFbmFibGVWaWFSZXdyaXRlID0gdGsuQm9vbGVhblZhcih2YWx1ZT1zZWxmLmNmZy5uYXRDb25maWcudmlhUmV3cml0ZVVzZSAhPSAwKSAKKwkJc2VsZi5jZmdFbmFibGVTZHBSZXdyaXRlID0gdGsuQm9vbGVhblZhcih2YWx1ZT1zZWxmLmNmZy5uYXRDb25maWcuc2RwTmF0UmV3cml0ZVVzZSAhPSAwKQorCQlzZWxmLmNmZ0VuYWJsZVNpcE91dGJvdW5kID0gdGsuQm9vbGVhblZhcih2YWx1ZT1zZWxmLmNmZy5uYXRDb25maWcuc2lwT3V0Ym91bmRVc2UgIT0gMCkKKwkJc2VsZi5jZmdLYUludGVydmFsIAk9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy5uYXRDb25maWcudWRwS2FJbnRlcnZhbFNlYykKKwkJCisJCSMgQnVpbGQgdGhlIHRhYiBwYWdlCisJCWZybSA9IHR0ay5GcmFtZShzZWxmLmZybSkKKwkJZnJtLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJZnJtLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MikKKwkJcm93ID0gMAorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PScxMDByZWwvUFJBQ0s6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nT25seSBvZmZlciBQUkFDSycsIHZhbHVlPXBqLlBKU1VBXzEwMFJFTF9OT1RfVVNFRCwgdmFyaWFibGU9c2VsZi5jZmdQcmFja1VzZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nT2ZmZXIgYW5kIHVzZSBpZiByZW1vdGUgc3VwcG9ydHMnLCB2YWx1ZT1wai5QSlNVQV8xMDBSRUxfT1BUSU9OQUwsIHZhcmlhYmxlPXNlbGYuY2ZnUHJhY2tVc2UpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5SYWRpb2J1dHRvbihmcm0sIHRleHQ9J1JlcXVpcmVkJywgdmFsdWU9cGouUEpTVUFfMTAwUkVMX01BTkRBVE9SWSwgdmFyaWFibGU9c2VsZi5jZmdQcmFja1VzZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nU2Vzc2lvbiBUaW1lcjonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdOb3Qgb2ZmZXJlZCcsIHZhbHVlPXBqLlBKU1VBX1NJUF9USU1FUl9JTkFDVElWRSwgdmFyaWFibGU9c2VsZi5jZmdUaW1lclVzZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nT3B0aW9uYWwnLCB2YWx1ZT1wai5QSlNVQV9TSVBfVElNRVJfT1BUSU9OQUwsIHZhcmlhYmxlPXNlbGYuY2ZnVGltZXJVc2UpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5SYWRpb2J1dHRvbihmcm0sIHRleHQ9J1JlcXVpcmVkJywgdmFsdWU9cGouUEpTVUFfU0lQX1RJTUVSX1JFUVVJUkVELCB2YXJpYWJsZT1zZWxmLmNmZ1RpbWVyVXNlKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSJBbHdheXMgdXNlIiwgdmFsdWU9cGouUEpTVUFfU0lQX1RJTUVSX0FMV0FZUywgdmFyaWFibGU9c2VsZi5jZmdUaW1lclVzZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nU2Vzc2lvbiBUaW1lciBFeHBpcmF0aW9uOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz05MCwgdG89NzIwMCwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnVGltZXJFeHBpcmVzLCB3aWR0aD01KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PScoc2Vjb25kcyknKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSkKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nUHJlc2VuY2U6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRW5hYmxlIFBVQkxJU0gnLCB2YXJpYWJsZT1zZWxmLmNmZ1B1Ymxpc2gpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nTWVzc2FnZSBXYWl0aW5nIEluZGljYXRpb246JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRW5hYmxlIE1XSScsIHZhcmlhYmxlPXNlbGYuY2ZnTXdpRW5hYmxlZCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdOQVQgVHJhdmVyc2FsOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXR0ay5DaGVja2J1dHRvbihmcm0sIHRleHQ9J0VuYWJsZSBDb250YWN0IFJld3JpdGUnLCB2YXJpYWJsZT1zZWxmLmNmZ0VuYWJsZUNvbnRhY3RSZXdyaXRlKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5DaGVja2J1dHRvbihmcm0sIHRleHQ9J0VuYWJsZSBWaWEgUmV3cml0ZScsIHZhcmlhYmxlPXNlbGYuY2ZnRW5hYmxlVmlhUmV3cml0ZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdFbmFibGUgU0RQIElQIEFkZHJlc3MgUmV3cml0ZScsIHZhcmlhYmxlPXNlbGYuY2ZnRW5hYmxlU2RwUmV3cml0ZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdFbmFibGUgU0lQIE91dGJvdW5kIEV4dGVuc2lvbicsIHZhcmlhYmxlPXNlbGYuY2ZnRW5hYmxlU2lwT3V0Ym91bmQpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nVURQIEtlZXAtQWxpdmUgSW50ZXJ2YWw6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdGsuU3BpbmJveChmcm0sIGZyb21fPTAsIHRvPTM2MDAsIHRleHR2YXJpYWJsZT1zZWxmLmNmZ0thSW50ZXJ2YWwsIHdpZHRoPTUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9JyhzZWNvbmRzKSBaZXJvIHRvIGRpc2FibGUuJykuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLkUpCisKKworCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nU0lQIEZlYXR1cmVzJykKKworCWRlZiBjcmVhdGVNZWRpYVRhYihzZWxmKToKKwkJIyBQcmVwYXJlIHRoZSB2YXJpYWJsZXMgdG8gc2V0L3JlY2VpdmUgdmFsdWVzIGZyb20gR1VJCisJCXNlbGYuY2ZnTWVkUG9ydCA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy5tZWRpYUNvbmZpZy50cmFuc3BvcnRDb25maWcucG9ydCkKKwkJc2VsZi5jZmdNZWRQb3J0UmFuZ2UgPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcubWVkaWFDb25maWcudHJhbnNwb3J0Q29uZmlnLnBvcnRSYW5nZSkKKwkJc2VsZi5jZmdNZWRMb2NrQ29kZWMgPSB0ay5Cb29sZWFuVmFyKHZhbHVlPXNlbGYuY2ZnLm1lZGlhQ29uZmlnLmxvY2tDb2RlY0VuYWJsZWQpCisJCXNlbGYuY2ZnTWVkU3J0cCA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy5tZWRpYUNvbmZpZy5zcnRwVXNlKQorCQlzZWxmLmNmZ01lZFNydHBTZWN1cmUgPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcubWVkaWFDb25maWcuc3J0cFNlY3VyZVNpZ25hbGluZykKKwkJc2VsZi5jZmdNZWRJcHY2ID0gdGsuQm9vbGVhblZhcih2YWx1ZT1zZWxmLmNmZy5tZWRpYUNvbmZpZy5pcHY2VXNlPT1wai5QSlNVQV9JUFY2X0VOQUJMRUQpCisJCQorCQkjIEJ1aWxkIHRoZSB0YWIgcGFnZQorCQlmcm0gPSB0dGsuRnJhbWUoc2VsZi5mcm0pCisJCWZybS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCWZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTIxKQorCQlyb3cgPSAwCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1NlY3VyZSBSVFAgKFNSVFApOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXR0ay5SYWRpb2J1dHRvbihmcm0sIHRleHQ9J0Rpc2FibGUnLCB2YWx1ZT1wai5QSk1FRElBX1NSVFBfRElTQUJMRUQsIHZhcmlhYmxlPXNlbGYuY2ZnTWVkU3J0cCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nTWFuZGF0b3J5JywgdmFsdWU9cGouUEpNRURJQV9TUlRQX01BTkRBVE9SWSwgdmFyaWFibGU9c2VsZi5jZmdNZWRTcnRwKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdPcHRpb25hbCAobm9uLXN0YW5kYXJkKScsIHZhbHVlPXBqLlBKTUVESUFfU1JUUF9PUFRJT05BTCwgdmFyaWFibGU9c2VsZi5jZmdNZWRTcnRwKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdTUlRQIHNpZ25hbGluZzonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdEb2VzIG5vdCByZXF1aXJlIHNlY3VyZSBzaWduYWxpbmcnLCB2YWx1ZT0wLCB2YXJpYWJsZT1zZWxmLmNmZ01lZFNydHBTZWN1cmUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5SYWRpb2J1dHRvbihmcm0sIHRleHQ9J1JlcXVpcmUgc2VjdXJlIG5leHQgaG9wIChUTFMpJywgdmFsdWU9MSwgdmFyaWFibGU9c2VsZi5jZmdNZWRTcnRwU2VjdXJlKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdSZXF1aXJlIHNlY3VyZSBlbmQtdG8tZW5kIChTSVBTKScsIHZhbHVlPTIsIHZhcmlhYmxlPXNlbGYuY2ZnTWVkU3J0cFNlY3VyZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nUlRQIHRyYW5zcG9ydCBzdGFydCBwb3J0OicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz0wLCB0bz02NTUzNSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnTWVkUG9ydCwgd2lkdGg9NSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nKDA6IGFueSknKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdQb3J0IHJhbmdlOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz0wLCB0bz02NTUzNSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnTWVkUG9ydFJhbmdlLCB3aWR0aD01KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PScoMDogbm90IGxpbWl0ZWQpJykuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nTG9jayBjb2RlYzonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdFbmFibGUnLCB2YXJpYWJsZT1zZWxmLmNmZ01lZExvY2tDb2RlYykuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdVc2UgSVB2NjonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdZZXMnLCB2YXJpYWJsZT1zZWxmLmNmZ01lZElwdjYpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKworCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nTWVkaWEgc2V0dGluZ3MnKQorCisJZGVmIGNyZWF0ZU1lZGlhTmF0VGFiKHNlbGYpOgorCQkjIFByZXBhcmUgdGhlIHZhcmlhYmxlcyB0byBzZXQvcmVjZWl2ZSB2YWx1ZXMgZnJvbSBHVUkKKwkJc2VsZi5jZmdTaXBVc2VTdHVuID0gdGsuSW50VmFyKHZhbHVlID0gc2VsZi5jZmcubmF0Q29uZmlnLnNpcFN0dW5Vc2UpCisJCXNlbGYuY2ZnTWVkaWFVc2VTdHVuID0gdGsuSW50VmFyKHZhbHVlID0gc2VsZi5jZmcubmF0Q29uZmlnLm1lZGlhU3R1blVzZSkKKwkJc2VsZi5jZmdJY2VFbmFibGVkID0gdGsuQm9vbGVhblZhcih2YWx1ZSA9IHNlbGYuY2ZnLm5hdENvbmZpZy5pY2VFbmFibGVkKQorCQlzZWxmLmNmZ0ljZUFnZ3Jlc3NpdmUgPSB0ay5Cb29sZWFuVmFyKHZhbHVlID0gc2VsZi5jZmcubmF0Q29uZmlnLmljZUFnZ3Jlc3NpdmVOb21pbmF0aW9uKQorCQlzZWxmLmNmZ0Fsd2F5c1VwZGF0ZSA9IHRrLkJvb2xlYW5WYXIodmFsdWUgPSBUcnVlIGlmIHNlbGYuY2ZnLm5hdENvbmZpZy5pY2VBbHdheXNVcGRhdGUgZWxzZSBGYWxzZSkKKwkJc2VsZi5jZmdJY2VOb0hvc3RDYW5kcyA9IHRrLkJvb2xlYW5WYXIodmFsdWUgPSBUcnVlIGlmIHNlbGYuY2ZnLm5hdENvbmZpZy5pY2VNYXhIb3N0Q2FuZHMgPT0gMCBlbHNlIEZhbHNlKQorCQlzZWxmLmNmZ1R1cm5FbmFibGVkID0gdGsuQm9vbGVhblZhcih2YWx1ZSA9IHNlbGYuY2ZnLm5hdENvbmZpZy50dXJuRW5hYmxlZCkKKwkJc2VsZi5jZmdUdXJuU2VydmVyID0gdGsuU3RyaW5nVmFyKHZhbHVlID0gc2VsZi5jZmcubmF0Q29uZmlnLnR1cm5TZXJ2ZXIpCisJCXNlbGYuY2ZnVHVybkNvbm5UeXBlID0gdGsuSW50VmFyKHZhbHVlID0gc2VsZi5jZmcubmF0Q29uZmlnLnR1cm5Db25uVHlwZSkKKwkJc2VsZi5jZmdUdXJuVXNlciA9IHRrLlN0cmluZ1Zhcih2YWx1ZSA9IHNlbGYuY2ZnLm5hdENvbmZpZy50dXJuVXNlck5hbWUpCisJCXNlbGYuY2ZnVHVyblBhc3N3ZCA9IHRrLlN0cmluZ1Zhcih2YWx1ZSA9IHNlbGYuY2ZnLm5hdENvbmZpZy50dXJuUGFzc3dvcmQpCisJCQorCQkjIEJ1aWxkIHRoZSB0YWIgcGFnZQorCQlmcm0gPSB0dGsuRnJhbWUoc2VsZi5mcm0pCisJCWZybS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCWZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTIpCisJCXJvdyA9IDAKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nU0lQIFNUVU4gVXNhZ2U6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nRGVmYXVsdCcsIHZhbHVlPXBqLlBKU1VBX1NUVU5fVVNFX0RFRkFVTFQsIHZhcmlhYmxlPXNlbGYuY2ZnU2lwVXNlU3R1bikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nRGlzYWJsZScsIHZhbHVlPXBqLlBKU1VBX1NUVU5fVVNFX0RJU0FCTEVELCB2YXJpYWJsZT1zZWxmLmNmZ1NpcFVzZVN0dW4pLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J01lZGlhIFNUVU4gVXNhZ2U6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nRGVmYXVsdCcsIHZhbHVlPXBqLlBKU1VBX1NUVU5fVVNFX0RFRkFVTFQsIHZhcmlhYmxlPXNlbGYuY2ZnTWVkaWFVc2VTdHVuKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdEaXNhYmxlJywgdmFsdWU9cGouUEpTVUFfU1RVTl9VU0VfRElTQUJMRUQsIHZhcmlhYmxlPXNlbGYuY2ZnTWVkaWFVc2VTdHVuKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdJQ0U6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRW5hYmxlJywgdmFyaWFibGU9c2VsZi5jZmdJY2VFbmFibGVkKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5DaGVja2J1dHRvbihmcm0sIHRleHQ9J1VzZSBhZ2dyZXNpdmUgbm9taW5hdGlvbicsIHZhcmlhYmxlPXNlbGYuY2ZnSWNlQWdncmVzc2l2ZSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdBbHdheXMgcmUtSU5WSVRFIGFmdGVyIG5lZ290aWF0aW9uJywgdmFyaWFibGU9c2VsZi5jZmdBbHdheXNVcGRhdGUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRGlzYWJsZSBob3N0IGNhbmRpZGF0ZXMnLCB2YXJpYWJsZT1zZWxmLmNmZ0ljZU5vSG9zdENhbmRzKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1RVUk46JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRW5hYmxlJywgdmFyaWFibGU9c2VsZi5jZmdUdXJuRW5hYmxlZCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdUVVJOIHNlcnZlcjonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yKQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdUdXJuU2VydmVyLCB3aWR0aD0yMCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0naG9zdFs6cG9ydF0nKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSwgcGFkeT02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdUVVJOIGNvbm5lY3Rpb246JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLlJhZGlvYnV0dG9uKGZybSwgdGV4dD0nVURQJywgdmFsdWU9cGouUEpfVFVSTl9UUF9VRFAsIHZhcmlhYmxlPXNlbGYuY2ZnVHVybkNvbm5UeXBlKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuUmFkaW9idXR0b24oZnJtLCB0ZXh0PSdUQ1AnLCB2YWx1ZT1wai5QSl9UVVJOX1RQX1RDUCwgdmFyaWFibGU9c2VsZi5jZmdUdXJuQ29ublR5cGUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1RVUk4gdXNlcm5hbWU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MikKKwkJdHRrLkVudHJ5KGZybSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnVHVyblVzZXIsIHdpZHRoPTE2KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdUVVJOIHBhc3N3b3JkOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXR0ay5FbnRyeShmcm0sIHRleHR2YXJpYWJsZT1zZWxmLmNmZ1R1cm5QYXNzd2QsIHNob3c9JyonLCB3aWR0aD0xNikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKworCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nTkFUIHNldHRpbmdzJykKKwkJCisJZGVmIG9uT2soc2VsZik6CisJCSMgQ2hlY2sgYmFzaWMgc2V0dGluZ3MKKwkJZXJyb3JzID0gIiI7CisJCWlmIG5vdCBzZWxmLmNmZ0FjY0lkLmdldCgpOgorCQkJZXJyb3JzICs9ICJBY2NvdW50IElEIGlzIHJlcXVpcmVkXG4iCisJCWlmIHNlbGYuY2ZnQWNjSWQuZ2V0KCk6CisJCQlpZiBub3QgZW5kcG9pbnQudmFsaWRhdGVTaXBVcmkoc2VsZi5jZmdBY2NJZC5nZXQoKSk6CisJCQkJZXJyb3JzICs9ICJJbnZhbGlkIFNJUCBJRCBVUkk6ICclcydcbiIgJSAoc2VsZi5jZmdBY2NJZC5nZXQoKSkKKwkJaWYgc2VsZi5jZmdSZWdpc3RyYXIuZ2V0KCk6CisJCQlpZiBub3QgZW5kcG9pbnQudmFsaWRhdGVTaXBVcmkoc2VsZi5jZmdSZWdpc3RyYXIuZ2V0KCkpOgorCQkJCWVycm9ycyArPSAiSW52YWxpZCBTSVAgcmVnaXN0cmFyIFVSSTogJyVzJ1xuIiAlIChzZWxmLmNmZ1JlZ2lzdHJhci5nZXQoKSkKKwkJaWYgc2VsZi5jZmdQcm94eS5nZXQoKToKKwkJCWlmIG5vdCBlbmRwb2ludC52YWxpZGF0ZVNpcFVyaShzZWxmLmNmZ1Byb3h5LmdldCgpKToKKwkJCQllcnJvcnMgKz0gIkludmFsaWQgU0lQIHByb3h5IFVSSTogJyVzJ1xuIiAlIChzZWxmLmNmZ1Byb3h5LmdldCgpKQorCQlpZiBzZWxmLmNmZ1R1cm5FbmFibGVkLmdldCgpOgorCQkJaWYgbm90IHNlbGYuY2ZnVHVyblNlcnZlci5nZXQoKToKKwkJCQllcnJvcnMgKz0gIlRVUk4gc2VydmVyIGlzIHJlcXVpcmVkXG4iCisJCWlmIGVycm9yczoKKwkJCW1zZ2JveC5zaG93ZXJyb3IoIkVycm9yIGRldGVjdGVkOiIsIGVycm9ycykKKwkJCXJldHVybgorCQkKKwkJIyBCYXNpYyBzZXR0aW5ncworCQlzZWxmLmNmZy5wcmlvcml0eSA9IHNlbGYuY2ZnUHJpb3JpdHkuZ2V0KCkKKwkJc2VsZi5jZmcuaWRVcmkgPSBzZWxmLmNmZ0FjY0lkLmdldCgpCisJCXNlbGYuY2ZnLnJlZ0NvbmZpZy5yZWdpc3RyYXJVcmkgPSBzZWxmLmNmZ1JlZ2lzdHJhci5nZXQoKQorCQlzZWxmLmNmZy5yZWdDb25maWcucmVnaXN0ZXJPbkFkZCA9IHNlbGYuY2ZnUmVnaXN0ZXJPbkFkZC5nZXQoKQorCQl3aGlsZSBsZW4oc2VsZi5jZmcuc2lwQ29uZmlnLmF1dGhDcmVkcyk6CisJCQlzZWxmLmNmZy5zaXBDb25maWcuYXV0aENyZWRzLnBvcCgpCisJCWlmIHNlbGYuY2ZnVXNlcm5hbWUuZ2V0KCk6CisJCQljcmVkID0gcGouQXV0aENyZWRJbmZvKCkKKwkJCWNyZWQuc2NoZW1lID0gImRpZ2VzdCIKKwkJCWNyZWQucmVhbG0gPSAiKiIKKwkJCWNyZWQudXNlcm5hbWUgPSBzZWxmLmNmZ1VzZXJuYW1lLmdldCgpCisJCQljcmVkLmRhdGEgPSBzZWxmLmNmZ1Bhc3N3b3JkLmdldCgpCisJCQlzZWxmLmNmZy5zaXBDb25maWcuYXV0aENyZWRzLmFwcGVuZChjcmVkKQorCQl3aGlsZSBsZW4oc2VsZi5jZmcuc2lwQ29uZmlnLnByb3hpZXMpOgorCQkJc2VsZi5jZmcuc2lwQ29uZmlnLnByb3hpZXMucG9wKCkKKwkJaWYgc2VsZi5jZmdQcm94eS5nZXQoKToKKwkJCXNlbGYuY2ZnLnNpcENvbmZpZy5wcm94aWVzLmFwcGVuZChzZWxmLmNmZ1Byb3h5LmdldCgpKQorCisJCSMgU0lQIGZlYXR1cmVzCisJCXNlbGYuY2ZnLmNhbGxDb25maWcucHJhY2tVc2UJCT0gc2VsZi5jZmdQcmFja1VzZS5nZXQoKSAKKwkJc2VsZi5jZmcuY2FsbENvbmZpZy50aW1lclVzZQkJPSBzZWxmLmNmZ1RpbWVyVXNlLmdldCgpCisJCXNlbGYuY2ZnLmNhbGxDb25maWcudGltZXJTZXNzRXhwaXJlc1NlYwk9IHNlbGYuY2ZnVGltZXJFeHBpcmVzLmdldCgpIAorCQlzZWxmLmNmZy5wcmVzQ29uZmlnLnB1Ymxpc2hFbmFibGVkCT0gc2VsZi5jZmdQdWJsaXNoLmdldCgpIAorCQlzZWxmLmNmZy5td2lDb25maWcuZW5hYmxlZAkJPSBzZWxmLmNmZ013aUVuYWJsZWQuZ2V0KCkgCisJCXNlbGYuY2ZnLm5hdENvbmZpZy5jb250YWN0UmV3cml0ZVVzZQk9IDEgaWYgc2VsZi5jZmdFbmFibGVDb250YWN0UmV3cml0ZS5nZXQoKSBlbHNlIDAKKwkJc2VsZi5jZmcubmF0Q29uZmlnLnZpYVJld3JpdGVVc2UgCT0gMSBpZiBzZWxmLmNmZ0VuYWJsZVZpYVJld3JpdGUuZ2V0KCkgZWxzZSAwCisJCXNlbGYuY2ZnLm5hdENvbmZpZy5zZHBOYXRSZXdyaXRlVXNlCT0gMSBpZiBzZWxmLmNmZ0VuYWJsZVNkcFJld3JpdGUuZ2V0KCkgZWxzZSAwCisJCXNlbGYuY2ZnLm5hdENvbmZpZy5zaXBPdXRib3VuZFVzZQk9IDEgaWYgc2VsZi5jZmdFbmFibGVTaXBPdXRib3VuZC5nZXQoKSBlbHNlIDAKKwkJc2VsZi5jZmcubmF0Q29uZmlnLnVkcEthSW50ZXJ2YWxTZWMJPSBzZWxmLmNmZ0thSW50ZXJ2YWwuZ2V0KCkKKworCQkjIE1lZGlhCisJCXNlbGYuY2ZnLm1lZGlhQ29uZmlnLnRyYW5zcG9ydENvbmZpZy5wb3J0CT0gc2VsZi5jZmdNZWRQb3J0LmdldCgpCisJCXNlbGYuY2ZnLm1lZGlhQ29uZmlnLnRyYW5zcG9ydENvbmZpZy5wb3J0UmFuZ2UJPSBzZWxmLmNmZ01lZFBvcnRSYW5nZS5nZXQoKQorCQlzZWxmLmNmZy5tZWRpYUNvbmZpZy5sb2NrQ29kZWNFbmFibGVkCQk9IHNlbGYuY2ZnTWVkTG9ja0NvZGVjLmdldCgpCisJCXNlbGYuY2ZnLm1lZGlhQ29uZmlnLnNydHBVc2UJCQk9IHNlbGYuY2ZnTWVkU3J0cC5nZXQoKQorCQlzZWxmLmNmZy5tZWRpYUNvbmZpZy5zcnRwU2VjdXJlU2lnbmFsaW5nCT0gc2VsZi5jZmdNZWRTcnRwU2VjdXJlLmdldCgpCisJCXNlbGYuY2ZnLm1lZGlhQ29uZmlnLmlwdjZVc2UJCQk9IHBqLlBKU1VBX0lQVjZfRU5BQkxFRCBpZiBzZWxmLmNmZ01lZElwdjYuZ2V0KCkgZWxzZSBwai5QSlNVQV9JUFY2X0RJU0FCTEVECisJCQorCQkjIE5BVAorCQlzZWxmLmNmZy5uYXRDb25maWcuc2lwU3R1blVzZQkJPSBzZWxmLmNmZ1NpcFVzZVN0dW4uZ2V0KCkKKwkJc2VsZi5jZmcubmF0Q29uZmlnLm1lZGlhU3R1blVzZQkJPSBzZWxmLmNmZ01lZGlhVXNlU3R1bi5nZXQoKQorCQlzZWxmLmNmZy5uYXRDb25maWcuaWNlRW5hYmxlZAkJPSBzZWxmLmNmZ0ljZUVuYWJsZWQuZ2V0KCkKKwkJc2VsZi5jZmcubmF0Q29uZmlnLmljZUFnZ3Jlc3NpdmVOb21pbmF0aW9uID0gc2VsZi5jZmdJY2VBZ2dyZXNzaXZlIC5nZXQoKQorCQlzZWxmLmNmZy5uYXRDb25maWcuaWNlQWx3YXlzVXBkYXRlCT0gc2VsZi5jZmdBbHdheXNVcGRhdGUuZ2V0KCkKKwkJc2VsZi5jZmcubmF0Q29uZmlnLmljZU1heEhvc3RDYW5kcwk9IDAgaWYgc2VsZi5jZmdJY2VOb0hvc3RDYW5kcy5nZXQoKSBlbHNlIC0xIAorCQlzZWxmLmNmZy5uYXRDb25maWcudHVybkVuYWJsZWQJCT0gc2VsZi5jZmdUdXJuRW5hYmxlZC5nZXQoKQorCQlzZWxmLmNmZy5uYXRDb25maWcudHVyblNlcnZlcgkJPSBzZWxmLmNmZ1R1cm5TZXJ2ZXIuZ2V0KCkKKwkJc2VsZi5jZmcubmF0Q29uZmlnLnR1cm5Db25uVHlwZQkJPSBzZWxmLmNmZ1R1cm5Db25uVHlwZS5nZXQoKQorCQlzZWxmLmNmZy5uYXRDb25maWcudHVyblVzZXJOYW1lCQk9IHNlbGYuY2ZnVHVyblVzZXIuZ2V0KCkKKwkJc2VsZi5jZmcubmF0Q29uZmlnLnR1cm5QYXNzd29yZFR5cGUJPSAwCisJCXNlbGYuY2ZnLm5hdENvbmZpZy50dXJuUGFzc3dvcmQJCT0gc2VsZi5jZmdUdXJuUGFzc3dkLmdldCgpCisJCQorCQlzZWxmLmlzT2sgPSBUcnVlCisJCXNlbGYuZGVzdHJveSgpCisJCQorCWRlZiBvbkNhbmNlbChzZWxmKToKKwkJc2VsZi5kZXN0cm95KCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCWFwcGxpY2F0aW9uLm1haW4oKQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYXBwbGljYXRpb24ucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9hcHBsaWNhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU1MGVkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYXBwbGljYXRpb24ucHkKQEAgLTAsMCArMSw1MTAgQEAKKyMgJElkOiBhcHBsaWNhdGlvbi5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YSBQeXRob24gR1VJIERlbW8KKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6ICMgUHl0aG9uIDMKKwlpbXBvcnQgdGtpbnRlciBhcyB0aworCWZyb20gdGtpbnRlciBpbXBvcnQgdHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIG1zZ2JveAorZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisJaW1wb3J0IHR0aworCitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgbG9nCitpbXBvcnQgYWNjb3VudHNldHRpbmcKK2ltcG9ydCBhY2NvdW50CitpbXBvcnQgYnVkZHkKK2ltcG9ydCBlbmRwb2ludAoraW1wb3J0IHNldHRpbmdzCisKK2ltcG9ydCBvcworaW1wb3J0IHRyYWNlYmFjaworCisJCitjbGFzcyBBcHBsaWNhdGlvbih0dGsuRnJhbWUpOgorCSIiIgorCVRoZSBBcHBsaWNhdGlvbiBtYWluIGZyYW1lLgorCSIiIgorCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJdHRrLkZyYW1lLl9faW5pdF9fKHNlbGYsIG5hbWU9J2FwcGxpY2F0aW9uJywgd2lkdGg9MzAwLCBoZWlnaHQ9NTAwKQorCQlzZWxmLnBhY2soZXhwYW5kPSd5ZXMnLCBmaWxsPSdib3RoJykKKwkJc2VsZi5tYXN0ZXIudGl0bGUoJ3Bqc3VhMiBEZW1vJykKKwkJc2VsZi5tYXN0ZXIuZ2VvbWV0cnkoJzUwMHg1MDArMTAwKzEwMCcpCisJCQorCQkjIExvZ2dlcgorCQlzZWxmLmxvZ2dlciA9IGxvZy5Mb2dnZXIoKQorCQkKKwkJIyBBY2NvdW50cworCQlzZWxmLmFjY0xpc3QgPSBbXQorCQkKKwkJIyBHVUkgdmFyaWFibGVzCisJCXNlbGYuc2hvd0xvZ1dpbmRvdyA9IHRrLkludFZhcih2YWx1ZT0wKQorCQlzZWxmLnF1aXR0aW5nID0gRmFsc2UgCisJCQorCQkjIENvbnN0cnVjdCBHVUkKKwkJc2VsZi5fY3JlYXRlV2lkZ2V0cygpCisJCQorCQkjIExvZyB3aW5kb3cKKwkJc2VsZi5sb2dXaW5kb3cgPSBsb2cuTG9nV2luZG93KHNlbGYpCisJCXNlbGYuX29uTWVudVNob3dIaWRlTG9nV2luZG93KCkKKwkJCisJCSMgSW5zdGFudGlhdGUgZW5kcG9pbnQKKwkJc2VsZi5lcCA9IGVuZHBvaW50LkVuZHBvaW50KCkKKwkJc2VsZi5lcC5saWJDcmVhdGUoKQorCQkKKwkJIyBEZWZhdWx0IGNvbmZpZworCQlzZWxmLmFwcENvbmZpZyA9IHNldHRpbmdzLkFwcENvbmZpZygpCisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLnVhQ29uZmlnLnRocmVhZENudCA9IDA7CisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLnVhQ29uZmlnLm1haW5UaHJlYWRPbmx5ID0gVHJ1ZQorCQlzZWxmLmFwcENvbmZpZy5lcENvbmZpZy5sb2dDb25maWcud3JpdGVyID0gc2VsZi5sb2dnZXIKKwkJc2VsZi5hcHBDb25maWcuZXBDb25maWcubG9nQ29uZmlnLmZpbGVuYW1lID0gInB5Z3VpLmxvZyIKKwkJc2VsZi5hcHBDb25maWcuZXBDb25maWcubG9nQ29uZmlnLmZpbGVGbGFncyA9IHBqLlBKX09fQVBQRU5ECisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLmxvZ0NvbmZpZy5sZXZlbCA9IDUKKwkJc2VsZi5hcHBDb25maWcuZXBDb25maWcubG9nQ29uZmlnLmNvbnNvbGVMZXZlbCA9IDUKKwkJCisJZGVmIHNhdmVDb25maWcoc2VsZiwgZmlsZW5hbWU9J3B5Z3VpLmpzJyk6CisJCSMgU2F2ZSBkaXNhYmxlZCBhY2NvdW50cyBzaW5jZSB0aGV5IGFyZSBub3QgbGlzdGVkIGluIHNlbGYuYWNjTGlzdAorCQlkaXNhYmxlZF9hY2NzID0gW2FjIGZvciBhYyBpbiBzZWxmLmFwcENvbmZpZy5hY2NvdW50cyBpZiBub3QgYWMuZW5hYmxlZF0KKwkJc2VsZi5hcHBDb25maWcuYWNjb3VudHMgPSBbXQorCQkKKwkJIyBHZXQgYWNjb3VudCBjb25maWdzIGZyb20gYWN0aXZlIGFjY291bnRzCisJCWZvciBhY2MgaW4gc2VsZi5hY2NMaXN0OgorCQkJYWNmZyA9IHNldHRpbmdzLkFjY0NvbmZpZygpCisJCQlhY2ZnLmVuYWJsZWQgPSBUcnVlCisJCQlhY2ZnLmNvbmZpZyA9IGFjYy5jZmcKKwkJCWZvciBidWQgaW4gYWNjLmJ1ZGR5TGlzdDoKKwkJCQlhY2ZnLmJ1ZGR5Q29uZmlncy5hcHBlbmQoYnVkLmNmZykKKwkJCXNlbGYuYXBwQ29uZmlnLmFjY291bnRzLmFwcGVuZChhY2ZnKQorCQkKKwkJIyBQdXQgYmFjayBkaXNhYmxlZCBhY2NvdW50cworCQlzZWxmLmFwcENvbmZpZy5hY2NvdW50cy5leHRlbmQoZGlzYWJsZWRfYWNjcykKKwkJIyBTYXZlCisJCXNlbGYuYXBwQ29uZmlnLnNhdmVGaWxlKGZpbGVuYW1lKQorCQorCWRlZiBzdGFydChzZWxmLCBjZmdfZmlsZT0ncHlndWkuanMnKToKKwkJIyBMb2FkIGNvbmZpZworCQlpZiBjZmdfZmlsZSBhbmQgb3MucGF0aC5leGlzdHMoY2ZnX2ZpbGUpOgorCQkJc2VsZi5hcHBDb25maWcubG9hZEZpbGUoY2ZnX2ZpbGUpCisKKwkJc2VsZi5hcHBDb25maWcuZXBDb25maWcudWFDb25maWcudGhyZWFkQ250ID0gMDsKKwkJc2VsZi5hcHBDb25maWcuZXBDb25maWcudWFDb25maWcubWFpblRocmVhZE9ubHkgPSBUcnVlCisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLmxvZ0NvbmZpZy53cml0ZXIgPSBzZWxmLmxvZ2dlcgorCQlzZWxmLmFwcENvbmZpZy5lcENvbmZpZy5sb2dDb25maWcubGV2ZWwgPSA1CisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLmxvZ0NvbmZpZy5jb25zb2xlTGV2ZWwgPSA1CisJCQkJCisJCSMgSW5pdGlhbGl6ZSBsaWJyYXJ5CisJCXNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnLnVhQ29uZmlnLnVzZXJBZ2VudCA9ICJweWd1aS0iICsgc2VsZi5lcC5saWJWZXJzaW9uKCkuZnVsbDsKKwkJc2VsZi5lcC5saWJJbml0KHNlbGYuYXBwQ29uZmlnLmVwQ29uZmlnKQorCQlzZWxmLm1hc3Rlci50aXRsZSgncGpzdWEyIERlbW8gdmVyc2lvbiAnICsgc2VsZi5lcC5saWJWZXJzaW9uKCkuZnVsbCkKKwkJCisJCSMgQ3JlYXRlIHRyYW5zcG9ydHMKKwkJaWYgc2VsZi5hcHBDb25maWcudWRwLmVuYWJsZWQ6CisJCQlzZWxmLmVwLnRyYW5zcG9ydENyZWF0ZShzZWxmLmFwcENvbmZpZy51ZHAudHlwZSwgc2VsZi5hcHBDb25maWcudWRwLmNvbmZpZykKKwkJaWYgc2VsZi5hcHBDb25maWcudGNwLmVuYWJsZWQ6CisJCQlzZWxmLmVwLnRyYW5zcG9ydENyZWF0ZShzZWxmLmFwcENvbmZpZy50Y3AudHlwZSwgc2VsZi5hcHBDb25maWcudGNwLmNvbmZpZykKKwkJaWYgc2VsZi5hcHBDb25maWcudGxzLmVuYWJsZWQ6CisJCQlzZWxmLmVwLnRyYW5zcG9ydENyZWF0ZShzZWxmLmFwcENvbmZpZy50bHMudHlwZSwgc2VsZi5hcHBDb25maWcudGxzLmNvbmZpZykKKwkJCQorCQkjIEFkZCBhY2NvdW50cworCQlmb3IgY2ZnIGluIHNlbGYuYXBwQ29uZmlnLmFjY291bnRzOgorCQkJaWYgY2ZnLmVuYWJsZWQ6CisJCQkJc2VsZi5fY3JlYXRlQWNjKGNmZy5jb25maWcpCisJCQkJYWNjID0gc2VsZi5hY2NMaXN0Wy0xXQorCQkJCWZvciBidWRkeV9jZmcgaW4gY2ZnLmJ1ZGR5Q29uZmlnczoKKwkJCQkJc2VsZi5fY3JlYXRlQnVkZHkoYWNjLCBidWRkeV9jZmcpCisJCQkJCisJCSMgU3RhcnQgbGlicmFyeQorCQlzZWxmLmVwLmxpYlN0YXJ0KCkKKwkJCisJCSMgU3RhcnQgcG9sbGluZworCQlzZWxmLl9vblRpbWVyKCkKKworCWRlZiB1cGRhdGVBY2NvdW50KHNlbGYsIGFjYyk6CisJCWlmIGFjYy5kZWxldGluZzoKKwkJCXJldHVybgkjIGlnbm9yZQorCQlpaWQgPSBzdHIoYWNjLnJhbmRJZCkKKwkJdGV4dCA9IGFjYy5jZmcuaWRVcmkKKwkJc3RhdHVzID0gYWNjLnN0YXR1c1RleHQoKQorCQkKKwkJdmFsdWVzID0gKHN0YXR1cywpCisJCWlmIHNlbGYudHYuZXhpc3RzKGlpZCk6CisJCQlzZWxmLnR2Lml0ZW0oaWlkLCB0ZXh0PXRleHQsIHZhbHVlcz12YWx1ZXMpCisJCWVsc2U6CisJCQlzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsICBpaWQsIG9wZW49VHJ1ZSwgdGV4dD10ZXh0LCB2YWx1ZXM9dmFsdWVzKQorCQkKKwlkZWYgdXBkYXRlQnVkZHkoc2VsZiwgYnVkKToKKwkJaWlkID0gJ2J1ZGR5JyArIHN0cihidWQucmFuZElkKQorCQl0ZXh0ID0gYnVkLmNmZy51cmkKKwkJc3RhdHVzID0gYnVkLnN0YXR1c1RleHQoKQorCQkKKwkJdmFsdWVzID0gKHN0YXR1cywpCisJCWlmIHNlbGYudHYuZXhpc3RzKGlpZCk6CisJCQlzZWxmLnR2Lml0ZW0oaWlkLCB0ZXh0PXRleHQsIHZhbHVlcz12YWx1ZXMpCisJCWVsc2U6CisJCQlzZWxmLnR2Lmluc2VydChzdHIoYnVkLmFjY291bnQucmFuZElkKSwgJ2VuZCcsICBpaWQsIG9wZW49VHJ1ZSwgdGV4dD10ZXh0LCB2YWx1ZXM9dmFsdWVzKQorCQkKKwlkZWYgX2NyZWF0ZUFjYyhzZWxmLCBhY2NfY2ZnKToKKwkJYWNjID0gYWNjb3VudC5BY2NvdW50KHNlbGYpCisJCWFjYy5jZmcgPSBhY2NfY2ZnCisJCXNlbGYuYWNjTGlzdC5hcHBlbmQoYWNjKQorCQlzZWxmLnVwZGF0ZUFjY291bnQoYWNjKQorCQlhY2MuY3JlYXRlKGFjYy5jZmcpCisJCWFjYy5jZmdDaGFuZ2VkID0gRmFsc2UKKwkJc2VsZi51cGRhdGVBY2NvdW50KGFjYykKKwkJCQkKKwlkZWYgX2NyZWF0ZUJ1ZGR5KHNlbGYsIGFjYywgYnVkZHlfY2ZnKToKKwkJYnVkID0gYnVkZHkuQnVkZHkoc2VsZikKKwkJYnVkLmNmZyA9IGJ1ZGR5X2NmZworCQlidWQuYWNjb3VudCA9IGFjYworCQlidWQuY3JlYXRlKGFjYywgYnVkLmNmZykKKwkJc2VsZi51cGRhdGVCdWRkeShidWQpCisJCWFjYy5idWRkeUxpc3QuYXBwZW5kKGJ1ZCkKKworCWRlZiBfY3JlYXRlV2lkZ2V0cyhzZWxmKToKKwkJc2VsZi5fY3JlYXRlQXBwTWVudSgpCisJCQorCQkjIE1haW4gcGFuZSwgYSBUcmVldmlldworCQlzZWxmLnR2ID0gdHRrLlRyZWV2aWV3KHNlbGYsIGNvbHVtbnM9KCdTdGF0dXMnKSwgc2hvdz0ndHJlZScpCisJCXNlbGYudHYucGFjayhzaWRlPSd0b3AnLCBmaWxsPSdib3RoJywgZXhwYW5kPSd5ZXMnLCBwYWR4PTUsIHBhZHk9NSkKKworCQlzZWxmLl9jcmVhdGVDb250ZXh0TWVudSgpCisJCQorCQkjIEhhbmRsZSBjbG9zZSBldmVudAorCQlzZWxmLm1hc3Rlci5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuX29uQ2xvc2UpCisJCisJZGVmIF9jcmVhdGVBcHBNZW51KHNlbGYpOgorCQkjIE1haW4gbWVudSBiYXIKKwkJdG9wID0gc2VsZi53aW5mb190b3BsZXZlbCgpCisJCXNlbGYubWVudWJhciA9IHRrLk1lbnUoKQorCQl0b3AuY29uZmlndXJlKG1lbnU9c2VsZi5tZW51YmFyKQorCQkKKwkJIyBGaWxlIG1lbnUKKwkJZmlsZV9tZW51ID0gdGsuTWVudShzZWxmLm1lbnViYXIsIHRlYXJvZmY9RmFsc2UpCisJCXNlbGYubWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0iRmlsZSIsIG1lbnU9ZmlsZV9tZW51KQorCQlmaWxlX21lbnUuYWRkX2NvbW1hbmQobGFiZWw9IkFkZCBhY2NvdW50Li4iLCBjb21tYW5kPXNlbGYuX29uTWVudUFkZEFjY291bnQpCisJCWZpbGVfbWVudS5hZGRfY2hlY2tidXR0b24obGFiZWw9IlNob3cvaGlkZSBsb2cgd2luZG93IiwgY29tbWFuZD1zZWxmLl9vbk1lbnVTaG93SGlkZUxvZ1dpbmRvdywgdmFyaWFibGU9c2VsZi5zaG93TG9nV2luZG93KQorCQlmaWxlX21lbnUuYWRkX3NlcGFyYXRvcigpCisJCWZpbGVfbWVudS5hZGRfY29tbWFuZChsYWJlbD0iU2V0dGluZ3MuLi4iLCBjb21tYW5kPXNlbGYuX29uTWVudVNldHRpbmdzKQorCQlmaWxlX21lbnUuYWRkX2NvbW1hbmQobGFiZWw9IlNhdmUgU2V0dGluZ3MiLCBjb21tYW5kPXNlbGYuX29uTWVudVNhdmVTZXR0aW5ncykKKwkJZmlsZV9tZW51LmFkZF9zZXBhcmF0b3IoKQorCQlmaWxlX21lbnUuYWRkX2NvbW1hbmQobGFiZWw9IlF1aXQiLCBjb21tYW5kPXNlbGYuX29uTWVudVF1aXQpCisKKwkJIyBXaW5kb3cgbWVudQorCQlzZWxmLndpbmRvd19tZW51ID0gdGsuTWVudShzZWxmLm1lbnViYXIsIHRlYXJvZmY9RmFsc2UpCisJCXNlbGYubWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0iV2luZG93IiwgbWVudT1zZWxmLndpbmRvd19tZW51KQorCQkKKwkJIyBIZWxwIG1lbnUKKwkJaGVscF9tZW51ID0gdGsuTWVudShzZWxmLm1lbnViYXIsIHRlYXJvZmY9RmFsc2UpCisJCXNlbGYubWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0iSGVscCIsIG1lbnU9aGVscF9tZW51KQorCQloZWxwX21lbnUuYWRkX2NvbW1hbmQobGFiZWw9IkFib3V0IiwgdW5kZXJsaW5lPTIsIGNvbW1hbmQ9c2VsZi5fb25NZW51QWJvdXQpCisJCisJZGVmIF9zaG93Q2hhdFdpbmRvdyhzZWxmLCBjaGF0X2luc3QpOgorCQljaGF0X2luc3Quc2hvd1dpbmRvdygpCisJCQorCWRlZiB1cGRhdGVXaW5kb3dNZW51KHNlbGYpOgorCQkjIENoYXQgd2luZG93cworCQlzZWxmLndpbmRvd19tZW51LmRlbGV0ZSgwLCB0ay5FTkQpCisJCWZvciBhY2MgaW4gc2VsZi5hY2NMaXN0OgorCQkJZm9yIGMgaW4gYWNjLmNoYXRMaXN0OgorCQkJCWNtZCA9IGxhbWJkYSBhcmc9Yzogc2VsZi5fc2hvd0NoYXRXaW5kb3coYXJnKQorCQkJCXNlbGYud2luZG93X21lbnUuYWRkX2NvbW1hbmQobGFiZWw9Yy50aXRsZSwgY29tbWFuZD1jbWQpCisJCQorCWRlZiBfY3JlYXRlQ29udGV4dE1lbnUoc2VsZik6CisJCXRvcCA9IHNlbGYud2luZm9fdG9wbGV2ZWwoKQorCisJCSMgQ3JlYXRlIEFjY291bnQgY29udGV4dCBtZW51CisJCXNlbGYuYWNjTWVudSA9IHRrLk1lbnUodG9wLCB0ZWFyb2ZmPUZhbHNlKQorCQkjIExhYmVscywgbXVzdCBtYXRjaCB3aXRoIF9vbkFjY0NvbnRleHRNZW51KCkKKwkJbGFiZWxzID0gWydVbnJlZ2lzdGVyJywgJ1JlcmVnaXN0ZXInLCAnQWRkIGJ1ZGR5Li4uJywgJy0nLAorCQkJICAnT25saW5lJywgJ0ludmlzaWJsZScsICdBd2F5JywgJ0J1c3knLCAnLScsCisJCQkgICdTZXR0aW5ncy4uLicsICctJywKKwkJCSAgJ0RlbGV0ZS4uLiddCisJCWZvciBsYWJlbCBpbiBsYWJlbHM6CisJCQlpZiBsYWJlbD09Jy0nOgorCQkJCXNlbGYuYWNjTWVudS5hZGRfc2VwYXJhdG9yKCkKKwkJCWVsc2U6CisJCQkJY21kID0gbGFtYmRhIGFyZz1sYWJlbDogc2VsZi5fb25BY2NDb250ZXh0TWVudShhcmcpCisJCQkJc2VsZi5hY2NNZW51LmFkZF9jb21tYW5kKGxhYmVsPWxhYmVsLCBjb21tYW5kPWNtZCkKKwkJCisJCSMgQ3JlYXRlIEJ1ZGR5IGNvbnRleHQgbWVudQorCQkjIExhYmVscywgbXVzdCBtYXRjaCB3aXRoIF9vbkJ1ZGR5Q29udGV4dE1lbnUoKQorCQlzZWxmLmJ1ZGR5TWVudSA9IHRrLk1lbnUodG9wLCB0ZWFyb2ZmPUZhbHNlKQorCQlsYWJlbHMgPSBbJ0F1ZGlvIGNhbGwnLCAnU2VuZCBpbnN0YW50IG1lc3NhZ2UnLCAnLScsCisJCQkgICdTdWJzY3JpYmUnLCAnVW5zdWJzY3JpYmUnLCAnLScsCisJCQkgICdTZXR0aW5ncy4uLicsICctJywKKwkJCSAgJ0RlbGV0ZS4uLiddCisJCQorCQlmb3IgbGFiZWwgaW4gbGFiZWxzOgorCQkJaWYgbGFiZWw9PSctJzoKKwkJCQlzZWxmLmJ1ZGR5TWVudS5hZGRfc2VwYXJhdG9yKCkKKwkJCWVsc2U6CisJCQkJY21kID0gbGFtYmRhIGFyZz1sYWJlbDogc2VsZi5fb25CdWRkeUNvbnRleHRNZW51KGFyZykKKwkJCQlzZWxmLmJ1ZGR5TWVudS5hZGRfY29tbWFuZChsYWJlbD1sYWJlbCwgY29tbWFuZD1jbWQpCisJCQorCQlpZiAodG9wLnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpPT0nYXF1YScpOgorCQkJc2VsZi50di5iaW5kKCc8Mj4nLCBzZWxmLl9vblR2UmlnaHRDbGljaykKKwkJCXNlbGYudHYuYmluZCgnPENvbnRyb2wtMT4nLCBzZWxmLl9vblR2UmlnaHRDbGljaykKKwkJZWxzZToKKwkJCXNlbGYudHYuYmluZCgnPDM+Jywgc2VsZi5fb25UdlJpZ2h0Q2xpY2spCisJCXNlbGYudHYuYmluZCgnPERvdWJsZS1CdXR0b24tMT4nLCBzZWxmLl9vblR2RG91YmxlQ2xpY2spCisKKwlkZWYgX2dldFNlbGVjdGVkQWNjb3VudChzZWxmKToKKwkJaXRlbXMgPSBzZWxmLnR2LnNlbGVjdGlvbigpCisJCWlmIG5vdCBpdGVtczoKKwkJCXJldHVybiBOb25lCisJCXRyeToKKwkJCWlpZCA9IGludChpdGVtc1swXSkKKwkJZXhjZXB0OgorCQkJcmV0dXJuIE5vbmUKKwkJYWNjcyA9IFthY2MgZm9yIGFjYyBpbiBzZWxmLmFjY0xpc3QgaWYgYWNjLnJhbmRJZD09aWlkXQorCQlpZiBub3QgYWNjczoKKwkJCXJldHVybiBOb25lCisJCXJldHVybiBhY2NzWzBdCisJCisJZGVmIF9nZXRTZWxlY3RlZEJ1ZGR5KHNlbGYpOgorCQlpdGVtcyA9IHNlbGYudHYuc2VsZWN0aW9uKCkKKwkJaWYgbm90IGl0ZW1zOgorCQkJcmV0dXJuIE5vbmUKKwkJdHJ5OgorCQkJaWlkID0gaW50KGl0ZW1zWzBdWzU6XSkKKwkJCWlpZF9wYXJlbnQgPSBpbnQoc2VsZi50di5wYXJlbnQoaXRlbXNbMF0pKQorCQlleGNlcHQ6CisJCQlyZXR1cm4gTm9uZQorCQkJCisJCWFjY3MgPSBbYWNjIGZvciBhY2MgaW4gc2VsZi5hY2NMaXN0IGlmIGFjYy5yYW5kSWQ9PWlpZF9wYXJlbnRdCisJCWlmIG5vdCBhY2NzOgorCQkJcmV0dXJuIE5vbmUKKwkJCQorCQlidWRzID0gW2IgZm9yIGIgaW4gYWNjc1swXS5idWRkeUxpc3QgaWYgYi5yYW5kSWQ9PWlpZF0KKwkJaWYgbm90IGJ1ZHM6CisJCQlyZXR1cm4gTm9uZQorCQkJCisJCXJldHVybiBidWRzWzBdCisJCisJZGVmIF9vblR2UmlnaHRDbGljayhzZWxmLCBldmVudCk6CisJCWlpZCA9IHNlbGYudHYuaWRlbnRpZnlfcm93KGV2ZW50LnkpCisJCSNpaWQgPSBzZWxmLnR2LmlkZW50aWZ5KCdpdGVtJywgZXZlbnQueCwgZXZlbnQueSkKKwkJaWYgaWlkOgorCQkJc2VsZi50di5zZWxlY3Rpb25fc2V0KCAoaWlkLCkgKQorCQkJYWNjID0gc2VsZi5fZ2V0U2VsZWN0ZWRBY2NvdW50KCkKKwkJCWlmIGFjYzoKKwkJCQlzZWxmLmFjY01lbnUucG9zdChldmVudC54X3Jvb3QsIGV2ZW50Lnlfcm9vdCkKKwkJCWVsc2U6CisJCQkJIyBBIGJ1ZGR5IGlzIHNlbGVjdGVkCisJCQkJc2VsZi5idWRkeU1lbnUucG9zdChldmVudC54X3Jvb3QsIGV2ZW50Lnlfcm9vdCkKKwkKKwlkZWYgX29uVHZEb3VibGVDbGljayhzZWxmLCBldmVudCk6CisJCWlpZCA9IHNlbGYudHYuaWRlbnRpZnlfcm93KGV2ZW50LnkpCisJCWlmIGlpZDoKKwkJCXNlbGYudHYuc2VsZWN0aW9uX3NldCggKGlpZCwpICkKKwkJCWFjYyA9IHNlbGYuX2dldFNlbGVjdGVkQWNjb3VudCgpCisJCQlpZiBhY2M6CisJCQkJc2VsZi5jZmdDaGFuZ2VkID0gRmFsc2UKKwkJCQlkbGcgPSBhY2NvdW50c2V0dGluZy5EaWFsb2coc2VsZi5tYXN0ZXIsIGFjYy5jZmcpCisJCQkJaWYgZGxnLmRvTW9kYWwoKToKKwkJCQkJc2VsZi51cGRhdGVBY2NvdW50KGFjYykKKwkJCQkJYWNjLm1vZGlmeShhY2MuY2ZnKQorCQkJZWxzZToKKwkJCQlidWQgPSBzZWxmLl9nZXRTZWxlY3RlZEJ1ZGR5KCkKKwkJCQlhY2MgPSBidWQuYWNjb3VudAorCQkJCWNoYXQgPSBhY2MuZmluZENoYXQoYnVkLmNmZy51cmkpCisJCQkJaWYgbm90IGNoYXQ6CisJCQkJCWNoYXQgPSBhY2MubmV3Q2hhdChidWQuY2ZnLnVyaSkKKwkJCQljaGF0LnNob3dXaW5kb3coKQorCQorCWRlZiBfb25BY2NDb250ZXh0TWVudShzZWxmLCBsYWJlbCk6CisJCWFjYyA9IHNlbGYuX2dldFNlbGVjdGVkQWNjb3VudCgpCisJCWlmIG5vdCBhY2M6CisJCQlyZXR1cm4KKwkJCisJCWlmIGxhYmVsPT0nVW5yZWdpc3Rlcic6CisJCQlhY2Muc2V0UmVnaXN0cmF0aW9uKEZhbHNlKQorCQllbGlmIGxhYmVsPT0nUmVyZWdpc3Rlcic6CisJCQlhY2Muc2V0UmVnaXN0cmF0aW9uKFRydWUpCisJCWVsaWYgbGFiZWw9PSdPbmxpbmUnOgorCQkJcHMgPSBwai5QcmVzZW5jZVN0YXR1cygpCisJCQlwcy5zdGF0dXMgPSBwai5QSlNVQV9CVUREWV9TVEFUVVNfT05MSU5FCisJCQlhY2Muc2V0T25saW5lU3RhdHVzKHBzKQorCQllbGlmIGxhYmVsPT0nSW52aXNpYmxlJzoKKwkJCXBzID0gcGouUHJlc2VuY2VTdGF0dXMoKQorCQkJcHMuc3RhdHVzID0gcGouUEpTVUFfQlVERFlfU1RBVFVTX09GRkxJTkUKKwkJCWFjYy5zZXRPbmxpbmVTdGF0dXMocHMpCisJCWVsaWYgbGFiZWw9PSdBd2F5JzoKKwkJCXBzID0gcGouUHJlc2VuY2VTdGF0dXMoKQorCQkJcHMuc3RhdHVzID0gcGouUEpTVUFfQlVERFlfU1RBVFVTX09OTElORQorCQkJcHMuYWN0aXZpdHkgPSBwai5QSlJQSURfQUNUSVZJVFlfQVdBWQorCQkJcHMubm90ZSA9ICJBd2F5IgorCQkJYWNjLnNldE9ubGluZVN0YXR1cyhwcykKKwkJZWxpZiBsYWJlbD09J0J1c3knOgorCQkJcHMgPSBwai5QcmVzZW5jZVN0YXR1cygpCisJCQlwcy5zdGF0dXMgPSBwai5QSlNVQV9CVUREWV9TVEFUVVNfT05MSU5FCisJCQlwcy5hY3Rpdml0eSA9IHBqLlBKUlBJRF9BQ1RJVklUWV9CVVNZCisJCQlwcy5ub3RlID0gIkJ1c3kiCisJCQlhY2Muc2V0T25saW5lU3RhdHVzKHBzKQorCQllbGlmIGxhYmVsPT0nU2V0dGluZ3MuLi4nOgorCQkJc2VsZi5jZmdDaGFuZ2VkID0gRmFsc2UKKwkJCWRsZyA9IGFjY291bnRzZXR0aW5nLkRpYWxvZyhzZWxmLm1hc3RlciwgYWNjLmNmZykKKwkJCWlmIGRsZy5kb01vZGFsKCk6CisJCQkJc2VsZi51cGRhdGVBY2NvdW50KGFjYykKKwkJCQlhY2MubW9kaWZ5KGFjYy5jZmcpCisJCWVsaWYgbGFiZWw9PSdEZWxldGUuLi4nOgorCQkJbXNnID0gIkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgYWNjb3VudCAnJXMnPyIgJSBhY2MuY2ZnLmlkVXJpCisJCQlpZiBtc2dib3guYXNrcXVlc3Rpb24oJ0RlbGV0ZSBhY2NvdW50PycsIG1zZywgZGVmYXVsdD1tc2dib3guTk8pICE9IHUneWVzJzoKKwkJCQlyZXR1cm4KKwkJCWlpZCA9IHN0cihhY2MucmFuZElkKQorCQkJc2VsZi5hY2NMaXN0LnJlbW92ZShhY2MpCisJCQlhY2Muc2V0UmVnaXN0cmF0aW9uKEZhbHNlKQorCQkJYWNjLmRlbGV0aW5nID0gVHJ1ZQorCQkJZGVsIGFjYworCQkJc2VsZi50di5kZWxldGUoIChpaWQsKSApCisJCWVsaWYgbGFiZWw9PSdBZGQgYnVkZHkuLi4nOgorCQkJY2ZnID0gcGouQnVkZHlDb25maWcoKQorCQkJZGxnID0gYnVkZHkuU2V0dGluZ0RpYWxvZyhzZWxmLm1hc3RlciwgY2ZnKQorCQkJaWYgZGxnLmRvTW9kYWwoKToKKwkJCQlzZWxmLl9jcmVhdGVCdWRkeShhY2MsIGNmZykKKwkJZWxzZToKKwkJCWFzc2VydCBub3QgKCJVbmtub3duIG1lbnUgIiArIGxhYmVsKQorCQorCWRlZiBfb25CdWRkeUNvbnRleHRNZW51KHNlbGYsIGxhYmVsKToKKwkJYnVkID0gc2VsZi5fZ2V0U2VsZWN0ZWRCdWRkeSgpCisJCWlmIG5vdCBidWQ6CisJCQlyZXR1cm4KKwkJYWNjID0gYnVkLmFjY291bnQKKwkJCQorCQlpZiBsYWJlbD09J0F1ZGlvIGNhbGwnOgorCQkJY2hhdCA9IGFjYy5maW5kQ2hhdChidWQuY2ZnLnVyaSkKKwkJCWlmIG5vdCBjaGF0OiBjaGF0ID0gYWNjLm5ld0NoYXQoYnVkLmNmZy51cmkpCisJCQljaGF0LnNob3dXaW5kb3coKQorCQkJY2hhdC5zdGFydENhbGwoKQorCQllbGlmIGxhYmVsPT0nU2VuZCBpbnN0YW50IG1lc3NhZ2UnOgorCQkJY2hhdCA9IGFjYy5maW5kQ2hhdChidWQuY2ZnLnVyaSkKKwkJCWlmIG5vdCBjaGF0OiBjaGF0ID0gYWNjLm5ld0NoYXQoYnVkLmNmZy51cmkpCisJCQljaGF0LnNob3dXaW5kb3coVHJ1ZSkKKwkJZWxpZiBsYWJlbD09J1N1YnNjcmliZSc6CisJCQlidWQuc3Vic2NyaWJlUHJlc2VuY2UoVHJ1ZSkKKwkJZWxpZiBsYWJlbD09J1Vuc3Vic2NyaWJlJzoKKwkJCWJ1ZC5zdWJzY3JpYmVQcmVzZW5jZShGYWxzZSkKKwkJZWxpZiBsYWJlbD09J1NldHRpbmdzLi4uJzoKKwkJCXN1YnMgPSBidWQuY2ZnLnN1YnNjcmliZQorCQkJdXJpICA9IGJ1ZC5jZmcudXJpCisJCQlkbGcgPSBidWRkeS5TZXR0aW5nRGlhbG9nKHNlbGYubWFzdGVyLCBidWQuY2ZnKQorCQkJaWYgZGxnLmRvTW9kYWwoKToKKwkJCQlzZWxmLnVwZGF0ZUJ1ZGR5KGJ1ZCkKKwkJCQkjIFVSSSB1cGRhdGVkPworCQkJCWlmIHVyaSAhPSBidWQuY2ZnLnVyaToKKwkJCQkJY2ZnID0gYnVkLmNmZworCQkJCQkjIGRlbCBvbGQKKwkJCQkJaWlkID0gJ2J1ZGR5JyArIHN0cihidWQucmFuZElkKQorCQkJCQlhY2MuYnVkZHlMaXN0LnJlbW92ZShidWQpCisJCQkJCWRlbCBidWQKKwkJCQkJc2VsZi50di5kZWxldGUoIChpaWQsKSApCisJCQkJCSMgYWRkIG5ldworCQkJCQlzZWxmLl9jcmVhdGVCdWRkeShhY2MsIGNmZykKKwkJCQkjIHByZXNlbmNlIHN1YnNjcmliZSBzZXR0aW5nIHVwZGF0ZWQKKwkJCQllbGlmIHN1YnMgIT0gYnVkLmNmZy5zdWJzY3JpYmU6CisJCQkJCWJ1ZC5zdWJzY3JpYmVQcmVzZW5jZShidWQuY2ZnLnN1YnNjcmliZSkKKwkJZWxpZiBsYWJlbD09J0RlbGV0ZS4uLic6CisJCQltc2cgPSAiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSBidWRkeSAnJXMnPyIgJSBidWQuY2ZnLnVyaQorCQkJaWYgbXNnYm94LmFza3F1ZXN0aW9uKCdEZWxldGUgYnVkZHk/JywgbXNnLCBkZWZhdWx0PW1zZ2JveC5OTykgIT0gdSd5ZXMnOgorCQkJCXJldHVybgorCQkJaWlkID0gJ2J1ZGR5JyArIHN0cihidWQucmFuZElkKQorCQkJYWNjLmJ1ZGR5TGlzdC5yZW1vdmUoYnVkKQorCQkJZGVsIGJ1ZAorCQkJc2VsZi50di5kZWxldGUoIChpaWQsKSApCisJCWVsc2U6CisJCQlhc3NlcnQgbm90ICgiVW5rbm93biBtZW51ICIgKyBsYWJlbCkKKwkJCQorCWRlZiBfb25UaW1lcihzZWxmKToKKwkJaWYgbm90IHNlbGYucXVpdHRpbmc6CisJCQlzZWxmLmVwLmxpYkhhbmRsZUV2ZW50cygxMCkKKwkJCWlmIG5vdCBzZWxmLnF1aXR0aW5nOgorCQkJCXNlbGYubWFzdGVyLmFmdGVyKDUwLCBzZWxmLl9vblRpbWVyKQorCQkJCisJZGVmIF9vbkNsb3NlKHNlbGYpOgorCQlzZWxmLnNhdmVDb25maWcoKQorCQlzZWxmLnF1aXR0aW5nID0gVHJ1ZQorCQlzZWxmLmVwLmxpYkRlc3Ryb3koKQorCQlzZWxmLmVwID0gTm9uZQorCQlzZWxmLnVwZGF0ZSgpCisJCXNlbGYucXVpdCgpCisJCQorCWRlZiBfb25NZW51QWRkQWNjb3VudChzZWxmKToKKwkJY2ZnID0gcGouQWNjb3VudENvbmZpZygpCisJCWRsZyA9IGFjY291bnRzZXR0aW5nLkRpYWxvZyhzZWxmLm1hc3RlciwgY2ZnKQorCQlpZiBkbGcuZG9Nb2RhbCgpOgorCQkJc2VsZi5fY3JlYXRlQWNjKGNmZykKKwkJCQorCWRlZiBfb25NZW51U2hvd0hpZGVMb2dXaW5kb3coc2VsZik6CisJCWlmIHNlbGYuc2hvd0xvZ1dpbmRvdy5nZXQoKToKKwkJCXNlbGYubG9nV2luZG93LmRlaWNvbmlmeSgpCisJCWVsc2U6CisJCQlzZWxmLmxvZ1dpbmRvdy53aXRoZHJhdygpCisJCisJZGVmIF9vbk1lbnVTZXR0aW5ncyhzZWxmKToKKwkJZGxnID0gc2V0dGluZ3MuRGlhbG9nKHNlbGYsIHNlbGYuYXBwQ29uZmlnKQorCQlpZiBkbGcuZG9Nb2RhbCgpOgorCQkJbXNnYm94LnNob3dpbmZvKHNlbGYubWFzdGVyLnRpdGxlKCksICdZb3UgbmVlZCB0byByZXN0YXJ0IGZvciBuZXcgc2V0dGluZ3MgdG8gdGFrZSBlZmZlY3QnKQorCQorCWRlZiBfb25NZW51U2F2ZVNldHRpbmdzKHNlbGYpOgorCQlzZWxmLnNhdmVDb25maWcoKQorCQkKKwlkZWYgX29uTWVudVF1aXQoc2VsZik6CisJCXNlbGYuX29uQ2xvc2UoKQorCisJZGVmIF9vbk1lbnVBYm91dChzZWxmKToKKwkJbXNnYm94LnNob3dpbmZvKHNlbGYubWFzdGVyLnRpdGxlKCksICdBYm91dCcpCisJCQorCitjbGFzcyBFeGNlcHRpb25DYXRjaGVyOgorCSIiIkN1c3RvbSBUayBleGNlcHRpb24gY2F0Y2hlciwgbWFpbmx5IHRvIGRpc3BsYXkgbW9yZSBpbmZvcm1hdGlvbiAKKwkgICBmcm9tIHBqLkVycm9yIGV4Y2VwdGlvbgorCSIiIiAKKwlkZWYgX19pbml0X18oc2VsZiwgZnVuYywgc3Vic3QsIHdpZGdldCk6CisJCXNlbGYuZnVuYyA9IGZ1bmMgCisJCXNlbGYuc3Vic3QgPSBzdWJzdAorCQlzZWxmLndpZGdldCA9IHdpZGdldAorCWRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisJCXRyeToKKwkJCWlmIHNlbGYuc3Vic3Q6CisJCQkJYXJncyA9IGFwcGx5KHNlbGYuc3Vic3QsIGFyZ3MpCisJCQlyZXR1cm4gYXBwbHkoc2VsZi5mdW5jLCBhcmdzKQorCQlleGNlcHQgcGouRXJyb3IsIGVycm9yOgorCQkJcHJpbnQgJ0V4Y2VwdGlvbjonCisJCQlwcmludCAnICAnLCBlcnJvci5pbmZvKCkKKwkJCXByaW50ICdUcmFjZWJhY2s6JworCQkJcHJpbnQgdHJhY2ViYWNrLnByaW50X3N0YWNrKCkKKwkJCWxvZy53cml0ZUxvZzIoMSwgJ0V4Y2VwdGlvbjogJyArIGVycm9yLmluZm8oKSArICdcbicpCisJCWV4Y2VwdCBFeGNlcHRpb24sIGVycm9yOgorCQkJcHJpbnQgJ0V4Y2VwdGlvbjonCisJCQlwcmludCAnICAnLCBzdHIoZXJyb3IpCisJCQlwcmludCAnVHJhY2ViYWNrOicKKwkJCXByaW50IHRyYWNlYmFjay5wcmludF9zdGFjaygpCisJCQlsb2cud3JpdGVMb2cyKDEsICdFeGNlcHRpb246ICcgKyBzdHIoZXJyb3IpICsgJ1xuJykKKworZGVmIG1haW4oKToKKwkjdGsuQ2FsbFdyYXBwZXIgPSBFeGNlcHRpb25DYXRjaGVyCisJYXBwID0gQXBwbGljYXRpb24oKQorCWFwcC5zdGFydCgpCisJYXBwLm1haW5sb29wKCkKKwkJCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCW1haW4oKQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYnVkZHkucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9idWRkeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Y3NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvYnVkZHkucHkKQEAgLTAsMCArMSwxNTIgQEAKKyMgJElkOiBidWRkeS5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YSBQeXRob24gR1VJIERlbW8KKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6ICMgUHl0aG9uIDMKKwlpbXBvcnQgdGtpbnRlciBhcyB0aworCWZyb20gdGtpbnRlciBpbXBvcnQgdHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIG1zZ2JveAorZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisJaW1wb3J0IHR0aworCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgZW5kcG9pbnQKK2ltcG9ydCBhcHBsaWNhdGlvbgorCisjIEJ1ZGR5IGNsYXNzCitjbGFzcyBCdWRkeShwai5CdWRkeSk6CisJIiIiCisJSGlnaCBsZXZlbCBQeXRob24gQnVkZHkgb2JqZWN0LCBkZXJpdmVkIGZyb20gcGpzdWEyJ3MgQnVkZHkgb2JqZWN0LgorCSIiIgorCWRlZiBfX2luaXRfXyhzZWxmLCBhcHApOgorCQlwai5CdWRkeS5fX2luaXRfXyhzZWxmKQorCQlzZWxmLmFwcCA9IGFwcAorCQlzZWxmLnJhbmRJZCA9IHJhbmRvbS5yYW5kaW50KDEsIDk5OTkpCisJCXNlbGYuY2ZnID0gTm9uZQorCQlzZWxmLmFjY291bnQgPSBOb25lCisKKwlkZWYgc3RhdHVzVGV4dChzZWxmKToKKwkJYmkgPSBzZWxmLmdldEluZm8oKQorCQlzdGF0dXMgPSAnJworCQlpZiBiaS5zdWJTdGF0ZSA9PSBwai5QSlNJUF9FVlNVQl9TVEFURV9BQ1RJVkU6CisJCQlpZiBiaS5wcmVzU3RhdHVzLnN0YXR1cyA9PSBwai5QSlNVQV9CVUREWV9TVEFUVVNfT05MSU5FOgorCQkJCXN0YXR1cyA9IGJpLnByZXNTdGF0dXMuc3RhdHVzVGV4dAorCQkJCWlmIG5vdCBzdGF0dXM6CisJCQkJCXN0YXR1cyA9ICdPbmxpbmUnCisJCQllbGlmIGJpLnByZXNTdGF0dXMuc3RhdHVzID09IHBqLlBKU1VBX0JVRERZX1NUQVRVU19PRkZMSU5FOgorCQkJCXN0YXR1cyA9ICdPZmZsaW5lJworCQkJZWxzZToKKwkJCQlzdGF0dXMgPSAnVW5rbm93bicKKwkJcmV0dXJuIHN0YXR1cworCQorCWRlZiBvbkJ1ZGR5U3RhdGUoc2VsZik6CisJCXNlbGYuYXBwLnVwZGF0ZUJ1ZGR5KHNlbGYpCisKK2NsYXNzIFNldHRpbmdEaWFsb2codGsuVG9wbGV2ZWwpOgorCSIiIgorCVRoaXMgaW1wbGVtZW50cyBidWRkeSBzZXR0aW5ncyBkaWFsb2cgdG8gbWFuaXB1bGF0ZSBidWRkeSBzZXR0aW5ncy4KKwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCBjZmcpOgorCQl0ay5Ub3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisJCXNlbGYudHJhbnNpZW50KHBhcmVudCkKKwkJc2VsZi5wYXJlbnQgPSBwYXJlbnQKKwkJc2VsZi5nZW9tZXRyeSgiKzEwMCsxMDAiKQorCQlzZWxmLnRpdGxlKCdCdWRkeSBzZXR0aW5ncycpCisJCQorCQlzZWxmLmZybSA9IHR0ay5GcmFtZShzZWxmKQorCQlzZWxmLmZybS5wYWNrKGV4cGFuZD0neWVzJywgZmlsbD0nYm90aCcpCisJCQorCQlzZWxmLmlzT2sgPSBGYWxzZQorCQlzZWxmLmNmZyA9IGNmZworCQkKKwkJc2VsZi5jcmVhdGVXaWRnZXRzKCkKKwkKKwlkZWYgZG9Nb2RhbChzZWxmKToKKwkJaWYgc2VsZi5wYXJlbnQ6CisJCQlzZWxmLnBhcmVudC53YWl0X3dpbmRvdyhzZWxmKQorCQllbHNlOgorCQkJc2VsZi53YWl0X3dpbmRvdyhzZWxmKQorCQlyZXR1cm4gc2VsZi5pc09rCisJCQorCWRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgorCQkjIFRoZSBub3RlYm9vaworCQlzZWxmLmZybS5yb3djb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCXNlbGYuZnJtLnJvd2NvbmZpZ3VyZSgxLCB3ZWlnaHQ9MCkKKwkJc2VsZi5mcm0uY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlzZWxmLmZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTEpCisJCXNlbGYud1RhYiA9IHR0ay5Ob3RlYm9vayhzZWxmLmZybSkKKwkJc2VsZi53VGFiLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBjb2x1bW5zcGFuPTIsIHBhZHg9NSwgcGFkeT01LCBzdGlja3k9dGsuTit0ay5TK3RrLlcrdGsuRSkKKwkJCisJCSMgTWFpbiBidXR0b25zCisJCWJ0bk9rID0gdHRrLkJ1dHRvbihzZWxmLmZybSwgdGV4dD0nT2snLCBjb21tYW5kPXNlbGYub25PaykKKwkJYnRuT2suZ3JpZChjb2x1bW49MCwgcm93PTEsIHN0aWNreT10ay5FLCBwYWR4PTIwLCBwYWR5PTEwKQorCQlidG5DYW5jZWwgPSB0dGsuQnV0dG9uKHNlbGYuZnJtLCB0ZXh0PSdDYW5jZWwnLCBjb21tYW5kPXNlbGYub25DYW5jZWwpCisJCWJ0bkNhbmNlbC5ncmlkKGNvbHVtbj0xLCByb3c9MSwgc3RpY2t5PXRrLlcsIHBhZHg9MjAsIHBhZHk9MTApCisJCQorCQkjIFRhYnMKKwkJc2VsZi5jcmVhdGVCYXNpY1RhYigpCisJCQorCWRlZiBjcmVhdGVCYXNpY1RhYihzZWxmKToKKwkJIyBQcmVwYXJlIHRoZSB2YXJpYWJsZXMgdG8gc2V0L3JlY2VpdmUgdmFsdWVzIGZyb20gR1VJCisJCXNlbGYuY2ZnVXJpID0gdGsuU3RyaW5nVmFyKCkKKwkJc2VsZi5jZmdVcmkuc2V0KCBzZWxmLmNmZy51cmkgKQorCQlzZWxmLmNmZ1N1YnNjcmliZSA9IHRrLkludFZhcigpCisJCXNlbGYuY2ZnU3Vic2NyaWJlLnNldChzZWxmLmNmZy5zdWJzY3JpYmUpCisJCQorCQkjIEJ1aWxkIHRoZSB0YWIgcGFnZQorCQlmcm0gPSB0dGsuRnJhbWUoc2VsZi5mcm0pCisJCWZybS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisJCWZybS5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTIpCisJCXJvdyA9IDAKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nVVJJOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIpCisJCXR0ay5FbnRyeShmcm0sIHRleHR2YXJpYWJsZT1zZWxmLmNmZ1VyaSwgd2lkdGg9NDApLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XK3RrLkUsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nU3Vic2NyaWJlIHByZXNlbmNlJywgdmFyaWFibGU9c2VsZi5jZmdTdWJzY3JpYmUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKworCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nQmFzaWMgU2V0dGluZ3MnKQorCQkKKwkKKwlkZWYgb25PayhzZWxmKToKKwkJIyBDaGVjayBiYXNpYyBzZXR0aW5ncworCQllcnJvcnMgPSAiIjsKKwkJaWYgc2VsZi5jZmdVcmkuZ2V0KCk6CisJCQlpZiBub3QgZW5kcG9pbnQudmFsaWRhdGVTaXBVcmkoc2VsZi5jZmdVcmkuZ2V0KCkpOgorCQkJCWVycm9ycyArPSAiSW52YWxpZCBCdWRkeSBVUkk6ICclcydcbiIgJSAoc2VsZi5jZmdVcmkuZ2V0KCkpCisJCQkJCisJCWlmIGVycm9yczoKKwkJCW1zZ2JveC5zaG93ZXJyb3IoIkVycm9yIGRldGVjdGVkOiIsIGVycm9ycykKKwkJCXJldHVybgorCQkKKwkJIyBCYXNpYyBzZXR0aW5ncworCQlzZWxmLmNmZy51cmkgPSBzZWxmLmNmZ1VyaS5nZXQoKQorCQlzZWxmLmNmZy5zdWJzY3JpYmUgPSBzZWxmLmNmZ1N1YnNjcmliZS5nZXQoKQorCQkKKwkJc2VsZi5pc09rID0gVHJ1ZQorCQlzZWxmLmRlc3Ryb3koKQorCQkKKwlkZWYgb25DYW5jZWwoc2VsZik6CisJCXNlbGYuZGVzdHJveSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlhcHBsaWNhdGlvbi5tYWluKCkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2NhbGwucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9jYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjdmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9jYWxsLnB5CkBAIC0wLDAgKzEsMTA0IEBACisjICRJZDogY2FsbC5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YSBQeXRob24gR1VJIERlbW8KKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6ICMgUHl0aG9uIDMKKwlpbXBvcnQgdGtpbnRlciBhcyB0aworCWZyb20gdGtpbnRlciBpbXBvcnQgdHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94IGFzIG1zZ2JveAorZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisJaW1wb3J0IHR0aworCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgYXBwbGljYXRpb24KK2ltcG9ydCBlbmRwb2ludCBhcyBlcAorCisjIENhbGwgY2xhc3MKK2NsYXNzIENhbGwocGouQ2FsbCk6CisJIiIiCisJSGlnaCBsZXZlbCBQeXRob24gQ2FsbCBvYmplY3QsIGRlcml2ZWQgZnJvbSBwanN1YTIncyBDYWxsIG9iamVjdC4KKwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgYWNjLCBwZWVyX3VyaT0nJywgY2hhdD1Ob25lLCBjYWxsX2lkID0gcGouUEpTVUFfSU5WQUxJRF9JRCk6CisJCXBqLkNhbGwuX19pbml0X18oc2VsZiwgYWNjLCBjYWxsX2lkKQorICAgICAgICAgICAgICAgIHNlbGYuYWNjID0gYWNjCisJCXNlbGYucGVlclVyaSA9IHBlZXJfdXJpCisJCXNlbGYuY2hhdCA9IGNoYXQKKwkJc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQorCQlzZWxmLm9uaG9sZCA9IEZhbHNlCisKKwlkZWYgb25DYWxsU3RhdGUoc2VsZiwgcHJtKToKKwkJY2kgPSBzZWxmLmdldEluZm8oKQorCQlzZWxmLmNvbm5lY3RlZCA9IGNpLnN0YXRlID09IHBqLlBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQJCQkKKwkJaWYgc2VsZi5jaGF0OgorCQkJc2VsZi5jaGF0LnVwZGF0ZUNhbGxTdGF0ZShzZWxmLCBjaSkKKwkJCQorCWRlZiBvbkNhbGxNZWRpYVN0YXRlKHNlbGYsIHBybSk6CisJCWNpID0gc2VsZi5nZXRJbmZvKCkKKwkJZm9yIG1pIGluIGNpLm1lZGlhOgorCQkJaWYgbWkudHlwZSA9PSBwai5QSk1FRElBX1RZUEVfQVVESU8gYW5kIFwKKwkJCSAgKG1pLnN0YXR1cyA9PSBwai5QSlNVQV9DQUxMX01FRElBX0FDVElWRSBvciBcCisJCQkgICBtaS5zdGF0dXMgPT0gcGouUEpTVUFfQ0FMTF9NRURJQV9SRU1PVEVfSE9MRCk6CisJCQkJbSA9IHNlbGYuZ2V0TWVkaWEobWkuaW5kZXgpCisJCQkJYW0gPSBwai5BdWRpb01lZGlhLnR5cGVjYXN0RnJvbU1lZGlhKG0pCisJCQkJIyBjb25uZWN0IHBvcnRzCisJCQkJZXAuRW5kcG9pbnQuaW5zdGFuY2UuYXVkRGV2TWFuYWdlcigpLmdldENhcHR1cmVEZXZNZWRpYSgpLnN0YXJ0VHJhbnNtaXQoYW0pCisJCQkJYW0uc3RhcnRUcmFuc21pdChlcC5FbmRwb2ludC5pbnN0YW5jZS5hdWREZXZNYW5hZ2VyKCkuZ2V0UGxheWJhY2tEZXZNZWRpYSgpKQorCisJCQkJaWYgbWkuc3RhdHVzID09IHBqLlBKU1VBX0NBTExfTUVESUFfUkVNT1RFX0hPTEQgYW5kIG5vdCBzZWxmLm9uaG9sZDoKKwkJCQkJc2VsZi5jaGF0LmFkZE1lc3NhZ2UoTm9uZSwgIiclcycgc2V0cyBjYWxsIG9uaG9sZCIgJSAoc2VsZi5wZWVyVXJpKSkKKwkJCQkJc2VsZi5vbmhvbGQgPSBUcnVlCisJCQkJZWxpZiBtaS5zdGF0dXMgPT0gcGouUEpTVUFfQ0FMTF9NRURJQV9BQ1RJVkUgYW5kIHNlbGYub25ob2xkOgorCQkJCQlzZWxmLmNoYXQuYWRkTWVzc2FnZShOb25lLCAiJyVzJyBzZXRzIGNhbGwgYWN0aXZlIiAlIChzZWxmLnBlZXJVcmkpKQorCQkJCQlzZWxmLm9uaG9sZCA9IEZhbHNlCisJCQkKKwlkZWYgb25JbnN0YW50TWVzc2FnZShzZWxmLCBwcm0pOgorCQkjIGNoYXQgaW5zdGFuY2Ugc2hvdWxkIGhhdmUgYmVlbiBpbml0YWxpemVkCisJCWlmIG5vdCBzZWxmLmNoYXQ6IHJldHVybgorCQkJCisJCXNlbGYuY2hhdC5hZGRNZXNzYWdlKHNlbGYucGVlclVyaSwgcHJtLm1zZ0JvZHkpCisJCXNlbGYuY2hhdC5zaG93V2luZG93KCkKKwkJCQorCWRlZiBvbkluc3RhbnRNZXNzYWdlU3RhdHVzKHNlbGYsIHBybSk6CisJCWlmIHBybS5jb2RlLzEwMCA9PSAyOiByZXR1cm4KKwkJIyBjaGF0IGluc3RhbmNlIHNob3VsZCBoYXZlIGJlZW4gaW5pdGFsaXplZAorCQlpZiBub3Qgc2VsZi5jaGF0OiByZXR1cm4KKwkJCisJCXNlbGYuY2hhdC5hZGRNZXNzYWdlKE5vbmUsICJGYWlsZWQgc2VuZGluZyBtZXNzYWdlIHRvICclcycgKCVkKTogJXMiICUgKHNlbGYucGVlclVyaSwgcHJtLmNvZGUsIHBybS5yZWFzb24pKQorCQkKKwlkZWYgb25UeXBpbmdJbmRpY2F0aW9uKHNlbGYsIHBybSk6CisJCSMgY2hhdCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBiZWVuIGluaXRhbGl6ZWQKKwkJaWYgbm90IHNlbGYuY2hhdDogcmV0dXJuCisJCQorCQlzZWxmLmNoYXQuc2V0VHlwaW5nSW5kaWNhdGlvbihzZWxmLnBlZXJVcmksIHBybS5pc1R5cGluZykKKwkKKwlkZWYgb25EdG1mRGlnaXQoc2VsZiwgcHJtKToKKwkJI21zZ2JveC5zaG93aW5mbygicHlndWkiLCAnR290IERUTUY6JyArIHBybS5kaWdpdCkKKwkJcGFzcworCQkKKwlkZWYgb25DYWxsTWVkaWFUcmFuc3BvcnRTdGF0ZShzZWxmLCBwcm0pOgorCQkjbXNnYm94LnNob3dpbmZvKCJweWd1aSIsICJNZWRpYSB0cmFuc3BvcnQgc3RhdGUiKQorCQlwYXNzCisJCQorCQkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisJYXBwbGljYXRpb24ubWFpbigpCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9jaGF0LnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvY2hhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJkMmUyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvY2hhdC5weQpAQCAtMCwwICsxLDQ4OSBAQAorIyAkSWQ6IGNoYXQucHkgNDcwNCAyMDE0LTAxLTE2IDA1OjMwOjQ2WiBtaW5nICQKKyMKKyMgcGpzdWEgUHl0aG9uIEdVSSBEZW1vCisjCisjIENvcHlyaWdodCAoQykyMDEzIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorIworaW1wb3J0IHN5cworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOiAjIFB5dGhvbiAzCisJaW1wb3J0IHRraW50ZXIgYXMgdGsKKwlmcm9tIHRraW50ZXIgaW1wb3J0IHR0aworZWxzZToKKwlpbXBvcnQgVGtpbnRlciBhcyB0aworCWltcG9ydCB0dGsKKworaW1wb3J0IGJ1ZGR5CitpbXBvcnQgY2FsbAoraW1wb3J0IGNoYXRndWkgYXMgZ3VpCitpbXBvcnQgZW5kcG9pbnQgYXMgZXAKK2ltcG9ydCBwanN1YTIgYXMgcGoKK2ltcG9ydCByZQorCitTaXBVcmlSZWdleCA9IHJlLmNvbXBpbGUoJyhzaXB8c2lwcyk6KFteOjs+XEBdKilAPyhbXjo7Pl0qKTo/KFteOjs+XSopJykKK0NvbmZJZHggPSAxCisKKyMgU2ltcGxlIFNJUCB1cmkgcGFyc2VyLCBpbnB1dCBVUkkgbXVzdCBoYXZlIGJlZW4gdmFsaWRhdGVkCitkZWYgUGFyc2VTaXBVcmkoc2lwX3VyaV9zdHIpOgorCW0gPSBTaXBVcmlSZWdleC5zZWFyY2goc2lwX3VyaV9zdHIpCisJaWYgbm90IG06CisJCWFzc2VydCgwKQorCQlyZXR1cm4gTm9uZQorCQorCXNjaGVtZSA9IG0uZ3JvdXAoMSkKKwl1c2VyID0gbS5ncm91cCgyKQorCWhvc3QgPSBtLmdyb3VwKDMpCisJcG9ydCA9IG0uZ3JvdXAoNCkKKwlpZiBob3N0ID09ICcnOgorCQlob3N0ID0gdXNlcgorCQl1c2VyID0gJycKKwkJCisJcmV0dXJuIFNpcFVyaShzY2hlbWUubG93ZXIoKSwgdXNlciwgaG9zdC5sb3dlcigpLCBwb3J0KQorCQorY2xhc3MgU2lwVXJpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBzY2hlbWUsIHVzZXIsIGhvc3QsIHBvcnQpOgorCQlzZWxmLnNjaGVtZSA9IHNjaGVtZQorCQlzZWxmLnVzZXIgPSB1c2VyCisJCXNlbGYuaG9zdCA9IGhvc3QKKwkJc2VsZi5wb3J0ID0gcG9ydAorCQkKKwlkZWYgX19jbXBfXyhzZWxmLCBzaXBfdXJpKToKKwkJaWYgc2VsZi5zY2hlbWUgPT0gc2lwX3VyaS5zY2hlbWUgYW5kIHNlbGYudXNlciA9PSBzaXBfdXJpLnVzZXIgYW5kIHNlbGYuaG9zdCA9PSBzaXBfdXJpLmhvc3Q6CisJCQkjIGRvbid0IGNoZWNrIHBvcnQsIGF0IGxlYXN0IGZvciBub3cKKwkJCXJldHVybiAwCisJCXJldHVybiAtMQorCQorCWRlZiBfX3N0cl9fKHNlbGYpOgorCQlzID0gc2VsZi5zY2hlbWUgKyAnOicKKwkJaWYgc2VsZi51c2VyOiBzICs9IHNlbGYudXNlciArICdAJworCQlzICs9IHNlbGYuaG9zdAorCQlpZiBzZWxmLnBvcnQ6IHMrPSAnOicgKyBzZWxmLnBvcnQKKwkJcmV0dXJuIHMKKwkKK2NsYXNzIENoYXQoZ3VpLkNoYXRPYnNlcnZlcik6CisJZGVmIF9faW5pdF9fKHNlbGYsIGFwcCwgYWNjLCB1cmksIGNhbGxfaW5zdD1Ob25lKToKKwkJc2VsZi5fYXBwID0gYXBwCisJCXNlbGYuX2FjYyA9IGFjYworCQlzZWxmLnRpdGxlID0gJycKKwkJCisJCWdsb2JhbCBDb25mSWR4CisJCXNlbGYuY29uZklkeCA9IENvbmZJZHgKKwkJQ29uZklkeCArPSAxCisJCQorCQkjIGVhY2ggcGFydGljaXBhbnQgY2FsbC9idWRkeSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBpbiBjYWxsIGxpc3QKKwkJIyBhbmQgYnVkZHkgbGlzdCB3aXRoIHNhbWUgaW5kZXggYXMgaW4gcGFydGljcGFudCBsaXN0CisJCXNlbGYuX3BhcnRpY2lwYW50TGlzdCA9IFtdCSMgbGlzdCBvZiBTaXBVcmkKKwkJc2VsZi5fY2FsbExpc3QgPSBbXQkJIyBsaXN0IG9mIENhbGwKKwkJc2VsZi5fYnVkZHlMaXN0ID0gW10JCSMgbGlzdCBvZiBCdWRkeQorCQkKKwkJc2VsZi5fZ3VpID0gZ3VpLkNoYXRGcmFtZShzZWxmKQorCQlzZWxmLmFkZFBhcnRpY2lwYW50KHVyaSwgY2FsbF9pbnN0KQorCQorCWRlZiBfdXBkYXRlR3VpKHNlbGYpOgorCQlpZiBzZWxmLmlzUHJpdmF0ZSgpOgorCQkJc2VsZi50aXRsZSA9IHN0cihzZWxmLl9wYXJ0aWNpcGFudExpc3RbMF0pCisJCWVsc2U6CisJCQlzZWxmLnRpdGxlID0gJ0NvbmZlcmVuY2UgIyVkICglZCBwYXJ0aWNpcGFudHMpJyAlIChzZWxmLmNvbmZJZHgsIGxlbihzZWxmLl9wYXJ0aWNpcGFudExpc3QpKQorCQlzZWxmLl9ndWkudGl0bGUoc2VsZi50aXRsZSkKKwkJc2VsZi5fYXBwLnVwZGF0ZVdpbmRvd01lbnUoKQorCQkKKwlkZWYgX2dldENhbGxGcm9tVXJpU3RyKHNlbGYsIHVyaV9zdHIsIG9wID0gJycpOgorCQl1cmkgPSBQYXJzZVNpcFVyaSh1cmlfc3RyKQorCQlpZiB1cmkgbm90IGluIHNlbGYuX3BhcnRpY2lwYW50TGlzdDoKKwkJCXByaW50ICI9PT0gJXMgY2Fubm90IGZpbmQgcGFydGljaXBhbnQgd2l0aCBVUkkgJyVzJyIgJSAob3AsIHVyaV9zdHIpCisJCQlyZXR1cm4gTm9uZQorCQlpZHggPSBzZWxmLl9wYXJ0aWNpcGFudExpc3QuaW5kZXgodXJpKQorCQlpZiBpZHggPCBsZW4oc2VsZi5fY2FsbExpc3QpOgorCQkJcmV0dXJuIHNlbGYuX2NhbGxMaXN0W2lkeF0KKwkJcmV0dXJuIE5vbmUKKwkKKwlkZWYgX2dldEFjdGl2ZU1lZGlhSWR4KHNlbGYsIHRoZWNhbGwpOgorCQljaSA9IHRoZWNhbGwuZ2V0SW5mbygpCisJCWZvciBtaSBpbiBjaS5tZWRpYToKKwkJCWlmIG1pLnR5cGUgPT0gcGouUEpNRURJQV9UWVBFX0FVRElPIGFuZCBcCisJCQkgIChtaS5zdGF0dXMgIT0gcGouUEpTVUFfQ0FMTF9NRURJQV9OT05FIGFuZCBcCisJCQkgICBtaS5zdGF0dXMgIT0gcGouUEpTVUFfQ0FMTF9NRURJQV9FUlJPUik6CisJCQkJcmV0dXJuIG1pLmluZGV4CisJCXJldHVybiAtMQorCQkKKwlkZWYgX2dldEF1ZGlvTWVkaWFGcm9tVXJpU3RyKHNlbGYsIHVyaV9zdHIpOgorCQljID0gc2VsZi5fZ2V0Q2FsbEZyb21VcmlTdHIodXJpX3N0cikKKwkJaWYgbm90IGM6IHJldHVybiBOb25lCisKKwkJaWR4ID0gc2VsZi5fZ2V0QWN0aXZlTWVkaWFJZHgoYykKKwkJaWYgaWR4IDwgMDogcmV0dXJuIE5vbmUKKworCQltID0gYy5nZXRNZWRpYShpZHgpCisJCWFtID0gcGouQXVkaW9NZWRpYS50eXBlY2FzdEZyb21NZWRpYShtKQorCQlyZXR1cm4gYW0KKwkJCisJZGVmIF9zZW5kVHlwaW5nSW5kaWNhdGlvbihzZWxmLCBpc190eXBpbmcsIHNlbmRlcl91cmlfc3RyPScnKToKKwkJc2VuZGVyX3VyaSA9IFBhcnNlU2lwVXJpKHNlbmRlcl91cmlfc3RyKSBpZiBzZW5kZXJfdXJpX3N0ciBlbHNlIE5vbmUKKwkJdHlwZV9pbmRfcGFyYW0gPSBwai5TZW5kVHlwaW5nSW5kaWNhdGlvblBhcmFtKCkKKwkJdHlwZV9pbmRfcGFyYW0uaXNUeXBpbmcgPSBpc190eXBpbmcKKwkJZm9yIGlkeCwgcCBpbiBlbnVtZXJhdGUoc2VsZi5fcGFydGljaXBhbnRMaXN0KToKKwkJCSMgZG9uJ3QgZWNobyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzZW5kZXIKKwkJCWlmIHNlbmRlcl91cmkgYW5kIHAgPT0gc2VuZGVyX3VyaToKKwkJCQljb250aW51ZQorCQkJCQorCQkJIyBzZW5kIHZpYSBjYWxsLCBpZiBhbnksIG9yIGJ1ZGR5CisJCQlzZW5kZXIgPSBOb25lCisJCQlpZiBzZWxmLl9jYWxsTGlzdFtpZHhdIGFuZCBzZWxmLl9jYWxsTGlzdFtpZHhdLmNvbm5lY3RlZDoKKwkJCQlzZW5kZXIgPSBzZWxmLl9jYWxsTGlzdFtpZHhdCisJCQllbHNlOgorCQkJCXNlbmRlciA9IHNlbGYuX2J1ZGR5TGlzdFtpZHhdCisJCQlhc3NlcnQoc2VuZGVyKQorCQkJCQorCQkJdHJ5OgorCQkJCXNlbmRlci5zZW5kVHlwaW5nSW5kaWNhdGlvbih0eXBlX2luZF9wYXJhbSkKKwkJCWV4Y2VwdDoKKwkJCQlwYXNzCisKKwlkZWYgX3NlbmRJbnN0YW50TWVzc2FnZShzZWxmLCBtc2csIHNlbmRlcl91cmlfc3RyPScnKToKKwkJc2VuZGVyX3VyaSA9IFBhcnNlU2lwVXJpKHNlbmRlcl91cmlfc3RyKSBpZiBzZW5kZXJfdXJpX3N0ciBlbHNlIE5vbmUKKwkJc2VuZF9pbV9wYXJhbSA9IHBqLlNlbmRJbnN0YW50TWVzc2FnZVBhcmFtKCkKKwkJc2VuZF9pbV9wYXJhbS5jb250ZW50ID0gc3RyKG1zZykKKwkJZm9yIGlkeCwgcCBpbiBlbnVtZXJhdGUoc2VsZi5fcGFydGljaXBhbnRMaXN0KToKKwkJCSMgZG9uJ3QgZWNobyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzZW5kZXIKKwkJCWlmIHNlbmRlcl91cmkgYW5kIHAgPT0gc2VuZGVyX3VyaToKKwkJCQljb250aW51ZQorCQkJCQorCQkJIyBzZW5kIHZpYSBjYWxsLCBpZiBhbnksIG9yIGJ1ZGR5CisJCQlzZW5kZXIgPSBOb25lCisJCQlpZiBzZWxmLl9jYWxsTGlzdFtpZHhdIGFuZCBzZWxmLl9jYWxsTGlzdFtpZHhdLmNvbm5lY3RlZDoKKwkJCQlzZW5kZXIgPSBzZWxmLl9jYWxsTGlzdFtpZHhdCisJCQllbHNlOgorCQkJCXNlbmRlciA9IHNlbGYuX2J1ZGR5TGlzdFtpZHhdCisJCQlhc3NlcnQoc2VuZGVyKQorCQkJCisJCQl0cnk6CisJCQkJc2VuZGVyLnNlbmRJbnN0YW50TWVzc2FnZShzZW5kX2ltX3BhcmFtKQorCQkJZXhjZXB0OgorCQkJCSMgZXJyb3Igd2lsbCBiZSBoYW5kbGVkIHZpYSBBY2NvdW50Ojpvbkluc3RhbnRNZXNzYWdlU3RhdHVzKCkKKwkJCQlwYXNzCisKKwlkZWYgaXNQcml2YXRlKHNlbGYpOgorCQlyZXR1cm4gbGVuKHNlbGYuX3BhcnRpY2lwYW50TGlzdCkgPD0gMQorCQkKKwlkZWYgaXNVcmlQYXJ0aWNpcGFudChzZWxmLCB1cmkpOgorCQlyZXR1cm4gdXJpIGluIHNlbGYuX3BhcnRpY2lwYW50TGlzdAorCQkKKwlkZWYgcmVnaXN0ZXJDYWxsKHNlbGYsIHVyaV9zdHIsIGNhbGxfaW5zdCk6CisJCXVyaSA9IFBhcnNlU2lwVXJpKHVyaV9zdHIpCisJCXRyeToKKwkJCWlkeCA9IHNlbGYuX3BhcnRpY2lwYW50TGlzdC5pbmRleCh1cmkpCisJCQlidWQgPSBzZWxmLl9idWRkeUxpc3RbaWR4XQorCQkJc2VsZi5fY2FsbExpc3RbaWR4XSA9IGNhbGxfaW5zdAorCQkJY2FsbF9pbnN0LmNoYXQgPSBzZWxmCisJCQljYWxsX2luc3QucGVlclVyaSA9IGJ1ZC5jZmcudXJpCisJCWV4Y2VwdDoKKwkJCWFzc2VydCgwKSAjIGlkeCBtdXN0IGJlIGZvdW5kIQorCQkKKwlkZWYgc2hvd1dpbmRvdyhzZWxmLCBzaG93X3RleHRfY2hhdCA9IEZhbHNlKToKKwkJc2VsZi5fZ3VpLmJyaW5nVG9Gcm9udCgpCisJCWlmIHNob3dfdGV4dF9jaGF0OgorCQkJc2VsZi5fZ3VpLnRleHRTaG93SGlkZShUcnVlKQorCQkKKwlkZWYgYWRkUGFydGljaXBhbnQoc2VsZiwgdXJpLCBjYWxsX2luc3Q9Tm9uZSk6CisJCSMgYXZvaWQgZHVwbGljYXRpb24KKwkJaWYgc2VsZi5pc1VyaVBhcnRpY2lwYW50KHVyaSk6IHJldHVybgorCQkKKwkJdXJpX3N0ciA9IHN0cih1cmkpCisJCQorCQkjIGZpbmQgYnVkZHksIGNyZWF0ZSBvbmUgaWYgbm90IGZvdW5kIChlLmc6IGZvciBJTS90eXBpbmcgaW5kKSwKKwkJIyBpdCBpcyBhIHRlbXBvcmFyeSBvbmUgYW5kIG5vdCByZWFsbHkgcmVnaXN0ZXJlZCB0byBhY2MKKwkJYnVkID0gTm9uZQorCQl0cnk6CisJCQlidWQgPSBzZWxmLl9hY2MuZmluZEJ1ZGR5KHVyaV9zdHIpCisJCWV4Y2VwdDoKKwkJCWJ1ZCA9IGJ1ZGR5LkJ1ZGR5KE5vbmUpCisJCQlidWRfY2ZnID0gcGouQnVkZHlDb25maWcoKQorCQkJYnVkX2NmZy51cmkgPSB1cmlfc3RyCisJCQlidWRfY2ZnLnN1YnNjcmliZSA9IEZhbHNlCisJCQlidWQuY3JlYXRlKHNlbGYuX2FjYywgYnVkX2NmZykKKwkJCWJ1ZC5jZmcgPSBidWRfY2ZnCisJCQlidWQuYWNjb3VudCA9IHNlbGYuX2FjYworCQkJCisJCSMgdXBkYXRlIFVSSSBmcm9tIGJ1ZGR5IFVSSQorCQl1cmkgPSBQYXJzZVNpcFVyaShidWQuY2ZnLnVyaSkKKwkJCisJCSMgYWRkIGl0CisJCXNlbGYuX3BhcnRpY2lwYW50TGlzdC5hcHBlbmQodXJpKQorCQlzZWxmLl9jYWxsTGlzdC5hcHBlbmQoY2FsbF9pbnN0KQorCQlzZWxmLl9idWRkeUxpc3QuYXBwZW5kKGJ1ZCkKKwkJc2VsZi5fZ3VpLmFkZFBhcnRpY2lwYW50KHN0cih1cmkpKQorCQlzZWxmLl91cGRhdGVHdWkoKQorCQorCWRlZiBraWNrUGFydGljaXBhbnQoc2VsZiwgdXJpKToKKwkJaWYgKG5vdCB1cmkpIG9yICh1cmkgbm90IGluIHNlbGYuX3BhcnRpY2lwYW50TGlzdCk6CisJCQlhc3NlcnQoMCkKKwkJCXJldHVybgorCQkKKwkJaWR4ID0gc2VsZi5fcGFydGljaXBhbnRMaXN0LmluZGV4KHVyaSkKKwkJZGVsIHNlbGYuX3BhcnRpY2lwYW50TGlzdFtpZHhdCisJCWRlbCBzZWxmLl9jYWxsTGlzdFtpZHhdCisJCWRlbCBzZWxmLl9idWRkeUxpc3RbaWR4XQorCQlzZWxmLl9ndWkuZGVsUGFydGljaXBhbnQoc3RyKHVyaSkpCisJCQorCQlpZiBzZWxmLl9wYXJ0aWNpcGFudExpc3Q6CisJCQlzZWxmLl91cGRhdGVHdWkoKQorCQllbHNlOgorCQkJc2VsZi5vbkNsb3NlV2luZG93KCkKKwkJCQorCWRlZiBhZGRNZXNzYWdlKHNlbGYsIGZyb21fdXJpX3N0ciwgbXNnKToKKwkJaWYgZnJvbV91cmlfc3RyOgorCQkJIyBwcmludCBtZXNzYWdlIG9uIEdVSQorCQkJbXNnID0gZnJvbV91cmlfc3RyICsgJzogJyArIG1zZworCQkJc2VsZi5fZ3VpLnRleHRBZGRNZXNzYWdlKG1zZykKKwkJCSMgbm93IHJlbGF5IHRvIGFsbCBwYXJ0aWNpcGFudHMKKwkJCXNlbGYuX3NlbmRJbnN0YW50TWVzc2FnZShtc2csIGZyb21fdXJpX3N0cikKKwkJZWxzZToKKwkJCXNlbGYuX2d1aS50ZXh0QWRkTWVzc2FnZShtc2csIEZhbHNlKQorCQkJCisJZGVmIHNldFR5cGluZ0luZGljYXRpb24oc2VsZiwgZnJvbV91cmlfc3RyLCBpc190eXBpbmcpOgorCQkjIG5vdGlmeSBHVUkKKwkJc2VsZi5fZ3VpLnRleHRTZXRUeXBpbmdJbmRpY2F0aW9uKGZyb21fdXJpX3N0ciwgaXNfdHlwaW5nKQorCQkjIG5vdyByZWxheSB0byBhbGwgcGFydGljaXBhbnRzCisJCXNlbGYuX3NlbmRUeXBpbmdJbmRpY2F0aW9uKGlzX3R5cGluZywgZnJvbV91cmlfc3RyKQorCQkKKwlkZWYgc3RhcnRDYWxsKHNlbGYpOgorCQlzZWxmLl9ndWkuZW5hYmxlQXVkaW8oKQorCQljYWxsX3BhcmFtID0gcGouQ2FsbE9wUGFyYW0oKQorCQljYWxsX3BhcmFtLm9wdC5hdWRpb0NvdW50ID0gMQorCQljYWxsX3BhcmFtLm9wdC52aWRlb0NvdW50ID0gMAorCQlmYWlscyA9IFtdCisJCWZvciBpZHgsIHAgaW4gZW51bWVyYXRlKHNlbGYuX3BhcnRpY2lwYW50TGlzdCk6CisJCQkjIGp1c3Qgc2tpcCBpZiBjYWxsIGlzIGluc3RhbnRpYXRlZAorCQkJaWYgc2VsZi5fY2FsbExpc3RbaWR4XToKKwkJCQljb250aW51ZQorCQkJCisJCQl1cmlfc3RyID0gc3RyKHApCisJCQljID0gY2FsbC5DYWxsKHNlbGYuX2FjYywgdXJpX3N0ciwgc2VsZikKKwkJCXNlbGYuX2NhbGxMaXN0W2lkeF0gPSBjCisJCQlzZWxmLl9ndWkuYXVkaW9VcGRhdGVTdGF0ZSh1cmlfc3RyLCBndWkuQXVkaW9TdGF0ZS5JTklUSUFMSVpJTkcpCisJCQkKKwkJCXRyeToKKwkJCQljLm1ha2VDYWxsKHVyaV9zdHIsIGNhbGxfcGFyYW0pCisJCQlleGNlcHQ6CisJCQkJc2VsZi5fY2FsbExpc3RbaWR4XSA9IE5vbmUKKwkJCQlzZWxmLl9ndWkuYXVkaW9VcGRhdGVTdGF0ZSh1cmlfc3RyLCBndWkuQXVkaW9TdGF0ZS5GQUlMRUQpCisJCQkJZmFpbHMuYXBwZW5kKHApCisJCQkJCisJCWZvciBwIGluIGZhaWxzOgorCQkJIyBraWNrIHBhcnRpY2lwYW50cyB3aXRoIGNhbGwgZmFpbHVyZSwgYnV0IHNwYXJlIHRoZSBsYXN0IChhdm9pZCB6b21iaWUgY2hhdCkKKwkJCWlmIG5vdCBzZWxmLmlzUHJpdmF0ZSgpOgorCQkJCXNlbGYua2lja1BhcnRpY2lwYW50KHApCisJCQkKKwlkZWYgc3RvcENhbGwoc2VsZik6CisJCWZvciBpZHgsIHAgaW4gZW51bWVyYXRlKHNlbGYuX3BhcnRpY2lwYW50TGlzdCk6CisJCQlzZWxmLl9ndWkuYXVkaW9VcGRhdGVTdGF0ZShzdHIocCksIGd1aS5BdWRpb1N0YXRlLkRJU0NPTk5FQ1RFRCkKKwkJCWMgPSBzZWxmLl9jYWxsTGlzdFtpZHhdCisJCQlpZiBjOgorCQkJCWMuaGFuZ3VwKHBqLkNhbGxPcFBhcmFtKCkpCisKKwlkZWYgdXBkYXRlQ2FsbFN0YXRlKHNlbGYsIHRoZWNhbGwsIGluZm8gPSBOb25lKToKKwkJIyBpbmZvIGlzIG9wdGlvbmFsIGhlcmUsIGp1c3QgdG8gYXZvaWQgY2FsbGluZyBnZXRJbmZvKCkgdHdpY2UgKGluIHRoZSBjYWxsZXIgYW5kIGhlcmUpCisJCWlmIG5vdCBpbmZvOiBpbmZvID0gdGhlY2FsbC5nZXRJbmZvKCkKKwkJCisJCWlmIGluZm8uc3RhdGUgPCBwai5QSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEOgorCQkJc2VsZi5fZ3VpLmF1ZGlvVXBkYXRlU3RhdGUodGhlY2FsbC5wZWVyVXJpLCBndWkuQXVkaW9TdGF0ZS5JTklUSUFMSVpJTkcpCisJCWVsaWYgaW5mby5zdGF0ZSA9PSBwai5QSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEOgorCQkJc2VsZi5fZ3VpLmF1ZGlvVXBkYXRlU3RhdGUodGhlY2FsbC5wZWVyVXJpLCBndWkuQXVkaW9TdGF0ZS5DT05ORUNURUQpCisJCQltZWRfaWR4ID0gc2VsZi5fZ2V0QWN0aXZlTWVkaWFJZHgodGhlY2FsbCkKKwkJCXNpID0gdGhlY2FsbC5nZXRTdHJlYW1JbmZvKG1lZF9pZHgpCisJCQlzdGF0c19zdHIgPSAiQXVkaW8gY29kZWM6ICVzLyVzXG4uLi4iICUgKHNpLmNvZGVjTmFtZSwgc2kuY29kZWNDbG9ja1JhdGUpCisJCQlzZWxmLl9ndWkuYXVkaW9TZXRTdGF0c1RleHQodGhlY2FsbC5wZWVyVXJpLCBzdGF0c19zdHIpCisJCWVsaWYgaW5mby5zdGF0ZSA9PSBwai5QSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEOgorCQkJaWYgaW5mby5sYXN0U3RhdHVzQ29kZS8xMDAgIT0gMjoKKwkJCQlzZWxmLl9ndWkuYXVkaW9VcGRhdGVTdGF0ZSh0aGVjYWxsLnBlZXJVcmksIGd1aS5BdWRpb1N0YXRlLkZBSUxFRCkKKwkJCWVsc2U6CisJCQkJc2VsZi5fZ3VpLmF1ZGlvVXBkYXRlU3RhdGUodGhlY2FsbC5wZWVyVXJpLCBndWkuQXVkaW9TdGF0ZS5ESVNDT05ORUNURUQpCisJCQkKKwkJCSMgcmVzZXQgZW50cnkgaW4gdGhlIGNhbGxMaXN0CisJCQl0cnk6CisJCQkJaWR4ID0gc2VsZi5fY2FsbExpc3QuaW5kZXgodGhlY2FsbCkKKwkJCQlpZiBpZHggPj0gMDogc2VsZi5fY2FsbExpc3RbaWR4XSA9IE5vbmUKKwkJCWV4Y2VwdDoKKwkJCQlwYXNzCisJCQkKKwkJCXNlbGYuYWRkTWVzc2FnZShOb25lLCAiQ2FsbCB0byAnJXMnIGRpc2Nvbm5lY3RlZDogJXMiICUgKHRoZWNhbGwucGVlclVyaSwgaW5mby5sYXN0UmVhc29uKSkKKwkJCQorCQkJIyBraWNrIHRoZSBkaXNjb25uZWN0ZWQgcGFydGljaXBhbnQsIGJ1dCB0aGUgbGFzdCAoYXZvaWQgem9tYmllIGNoYXQpCisJCQlpZiBub3Qgc2VsZi5pc1ByaXZhdGUoKToKKwkJCQlzZWxmLmtpY2tQYXJ0aWNpcGFudChQYXJzZVNpcFVyaSh0aGVjYWxsLnBlZXJVcmkpKQorCisJCQkKKwkjICoqIGNhbGxiYWNrcyBmcm9tIEdVSSAoQ2hhdE9ic2VydmVyIGltcGxlbWVudGF0aW9uKSAqKgorCQorCSMgVGV4dAorCWRlZiBvblNlbmRNZXNzYWdlKHNlbGYsIG1zZyk6CisJCXNlbGYuX3NlbmRJbnN0YW50TWVzc2FnZShtc2cpCisKKwlkZWYgb25TdGFydFR5cGluZyhzZWxmKToKKwkJc2VsZi5fc2VuZFR5cGluZ0luZGljYXRpb24oVHJ1ZSkKKwkJCisJZGVmIG9uU3RvcFR5cGluZyhzZWxmKToKKwkJc2VsZi5fc2VuZFR5cGluZ0luZGljYXRpb24oRmFsc2UpCisJCQorCSMgQXVkaW8KKwlkZWYgb25IYW5ndXAoc2VsZiwgcGVlcl91cmlfc3RyKToKKwkJYyA9IHNlbGYuX2dldENhbGxGcm9tVXJpU3RyKHBlZXJfdXJpX3N0ciwgIm9uSGFuZ3VwKCkiKQorCQlpZiBub3QgYzogcmV0dXJuCisJCWNhbGxfcGFyYW0gPSBwai5DYWxsT3BQYXJhbSgpCisJCWMuaGFuZ3VwKGNhbGxfcGFyYW0pCisKKwlkZWYgb25Ib2xkKHNlbGYsIHBlZXJfdXJpX3N0cik6CisJCWMgPSBzZWxmLl9nZXRDYWxsRnJvbVVyaVN0cihwZWVyX3VyaV9zdHIsICJvbkhvbGQoKSIpCisJCWlmIG5vdCBjOiByZXR1cm4KKwkJY2FsbF9wYXJhbSA9IHBqLkNhbGxPcFBhcmFtKCkKKwkJYy5zZXRIb2xkKGNhbGxfcGFyYW0pCisKKwlkZWYgb25VbmhvbGQoc2VsZiwgcGVlcl91cmlfc3RyKToKKwkJYyA9IHNlbGYuX2dldENhbGxGcm9tVXJpU3RyKHBlZXJfdXJpX3N0ciwgIm9uVW5ob2xkKCkiKQorCQlpZiBub3QgYzogcmV0dXJuCisJCQorCQljYWxsX3BhcmFtID0gcGouQ2FsbE9wUGFyYW0oKQorCQljYWxsX3BhcmFtLm9wdC5hdWRpb0NvdW50ID0gMQorCQljYWxsX3BhcmFtLm9wdC52aWRlb0NvdW50ID0gMAorCQljYWxsX3BhcmFtLm9wdC5mbGFnIHw9IHBqLlBKU1VBX0NBTExfVU5IT0xECisJCWMucmVpbnZpdGUoY2FsbF9wYXJhbSkKKwkJCisJZGVmIG9uUnhNdXRlKHNlbGYsIHBlZXJfdXJpX3N0ciwgbXV0ZSk6CisJCWFtID0gc2VsZi5fZ2V0QXVkaW9NZWRpYUZyb21VcmlTdHIocGVlcl91cmlfc3RyKQorCQlpZiBub3QgYW06IHJldHVybgorCQlpZiBtdXRlOgorCQkJYW0uc3RvcFRyYW5zbWl0KGVwLkVuZHBvaW50Lmluc3RhbmNlLmF1ZERldk1hbmFnZXIoKS5nZXRQbGF5YmFja0Rldk1lZGlhKCkpCisJCQlzZWxmLmFkZE1lc3NhZ2UoTm9uZSwgIk11dGVkIGF1ZGlvIGZyb20gJyVzJyIgJSAocGVlcl91cmlfc3RyKSkKKwkJZWxzZToKKwkJCWFtLnN0YXJ0VHJhbnNtaXQoZXAuRW5kcG9pbnQuaW5zdGFuY2UuYXVkRGV2TWFuYWdlcigpLmdldFBsYXliYWNrRGV2TWVkaWEoKSkKKwkJCXNlbGYuYWRkTWVzc2FnZShOb25lLCAiVW5tdXRlZCBhdWRpbyBmcm9tICclcyciICUgKHBlZXJfdXJpX3N0cikpCisJCQorCWRlZiBvblJ4Vm9sKHNlbGYsIHBlZXJfdXJpX3N0ciwgdm9sX3BjdCk6CisJCWFtID0gc2VsZi5fZ2V0QXVkaW9NZWRpYUZyb21VcmlTdHIocGVlcl91cmlfc3RyKQorCQlpZiBub3QgYW06IHJldHVybgorCQkjIHBqc3VhIHZvbHVtZSByYW5nZSA9IDA6bXV0ZSwgMTpubyBhZGp1c3RtZW50LCAyOjEwMCUgbG91ZGVyCisJCWFtLmFkanVzdFJ4TGV2ZWwodm9sX3BjdC81MC4wKQorCQlzZWxmLmFkZE1lc3NhZ2UoTm9uZSwgIkFkanVzdGVkIHZvbHVtZSBsZXZlbCBhdWRpbyBmcm9tICclcyciICUgKHBlZXJfdXJpX3N0cikpCisJCQkKKwlkZWYgb25UeE11dGUoc2VsZiwgcGVlcl91cmlfc3RyLCBtdXRlKToKKwkJYW0gPSBzZWxmLl9nZXRBdWRpb01lZGlhRnJvbVVyaVN0cihwZWVyX3VyaV9zdHIpCisJCWlmIG5vdCBhbTogcmV0dXJuCisJCWlmIG11dGU6CisJCQllcC5FbmRwb2ludC5pbnN0YW5jZS5hdWREZXZNYW5hZ2VyKCkuZ2V0Q2FwdHVyZURldk1lZGlhKCkuc3RvcFRyYW5zbWl0KGFtKQorCQkJc2VsZi5hZGRNZXNzYWdlKE5vbmUsICJNdXRlZCBhdWRpbyB0byAnJXMnIiAlIChwZWVyX3VyaV9zdHIpKQorCQllbHNlOgorCQkJZXAuRW5kcG9pbnQuaW5zdGFuY2UuYXVkRGV2TWFuYWdlcigpLmdldENhcHR1cmVEZXZNZWRpYSgpLnN0YXJ0VHJhbnNtaXQoYW0pCisJCQlzZWxmLmFkZE1lc3NhZ2UoTm9uZSwgIlVubXV0ZWQgYXVkaW8gdG8gJyVzJyIgJSAocGVlcl91cmlfc3RyKSkKKworCSMgQ2hhdCByb29tCisJZGVmIG9uQWRkUGFydGljaXBhbnQoc2VsZik6CisJCWJ1ZHMgPSBbXQorCQlkbGcgPSBBZGRQYXJ0aWNpcGFudERsZyhOb25lLCBzZWxmLl9hcHAsIGJ1ZHMpCisJCWlmIGRsZy5kb01vZGFsKCk6CisJCQlmb3IgYnVkIGluIGJ1ZHM6CisJCQkJdXJpID0gUGFyc2VTaXBVcmkoYnVkLmNmZy51cmkpCisJCQkJc2VsZi5hZGRQYXJ0aWNpcGFudCh1cmkpCisJCQlpZiBub3Qgc2VsZi5pc1ByaXZhdGUoKToKKwkJCQlzZWxmLnN0YXJ0Q2FsbCgpCisJCQkJCisJZGVmIG9uU3RhcnRBdWRpbyhzZWxmKToKKwkJc2VsZi5zdGFydENhbGwoKQorCisJZGVmIG9uU3RvcEF1ZGlvKHNlbGYpOgorCQlzZWxmLnN0b3BDYWxsKCkKKwkJCisJZGVmIG9uQ2xvc2VXaW5kb3coc2VsZik6CisJCXNlbGYuc3RvcENhbGwoKQorCQkjIHdpbGwgcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBldmVudHVhbGx5IGRlc3Ryb3kgdGhpcyBjaGF0PworCQlpZiBzZWxmIGluIHNlbGYuX2FjYy5jaGF0TGlzdDogc2VsZi5fYWNjLmNoYXRMaXN0LnJlbW92ZShzZWxmKQorCQlzZWxmLl9hcHAudXBkYXRlV2luZG93TWVudSgpCisJCSMgZGVzdHJveSBHVUkKKwkJc2VsZi5fZ3VpLmRlc3Ryb3koKQorCisKK2NsYXNzIEFkZFBhcnRpY2lwYW50RGxnKHRrLlRvcGxldmVsKToKKwkiIiIKKwlMaXN0IG9mIGJ1ZGRpZXMKKwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCBhcHAsIGJ1ZF9saXN0KToKKwkJdGsuVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorCQlzZWxmLnRpdGxlKCdBZGQgcGFydGljaXBhbnRzLi4nKQorCQlzZWxmLnRyYW5zaWVudChwYXJlbnQpCisJCXNlbGYucGFyZW50ID0gcGFyZW50CisJCXNlbGYuX2FwcCA9IGFwcAorCQlzZWxmLmJ1ZGR5TGlzdCA9IGJ1ZF9saXN0CisJCQorCQlzZWxmLmlzT2sgPSBGYWxzZQorCQkKKwkJc2VsZi5jcmVhdGVXaWRnZXRzKCkKKwkKKwlkZWYgZG9Nb2RhbChzZWxmKToKKwkJaWYgc2VsZi5wYXJlbnQ6CisJCQlzZWxmLnBhcmVudC53YWl0X3dpbmRvdyhzZWxmKQorCQllbHNlOgorCQkJc2VsZi53YWl0X3dpbmRvdyhzZWxmKQorCQlyZXR1cm4gc2VsZi5pc09rCisJCQorCWRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgorCQkjIGJ1ZGR5IGxpc3QKKwkJbGlzdF9mcmFtZSA9IHR0ay5GcmFtZShzZWxmKQorCQlsaXN0X2ZyYW1lLnBhY2soc2lkZT10ay5UT1AsIGZpbGw9dGsuQk9USCwgZXhwYW5kPTEsIHBhZHg9MjAsIHBhZHk9MjApCisJCSNzY3JsID0gdHRrLlNjcm9sbGJhcihzZWxmLCBvcmllbnQ9dGsuVkVSVElDQUwsIGNvbW1hbmQ9bGlzdF9mcmFtZS55dmlldykKKwkJI2xpc3RfZnJhbWUuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNjcmwuc2V0KQorCQkjc2NybC5wYWNrKHNpZGU9dGsuUklHSFQsIGZpbGw9dGsuWSkKKwkJCisJCSMgZHJhdyBidWRkeSBsaXN0CisJCXNlbGYuYnVkZGllcyA9IFtdCisJCWZvciBhY2MgaW4gc2VsZi5fYXBwLmFjY0xpc3Q6CisJCQlzZWxmLmJ1ZGRpZXMuYXBwZW5kKCgwLCBhY2MuY2ZnLmlkVXJpKSkKKwkJCWZvciBidWQgaW4gYWNjLmJ1ZGR5TGlzdDoKKwkJCQlzZWxmLmJ1ZGRpZXMuYXBwZW5kKCgxLCBidWQpKQorCQkKKwkJc2VsZi5idWRfdmFyID0gW10KKwkJZm9yIGlkeCwoZmxhZyxidWQpIGluIGVudW1lcmF0ZShzZWxmLmJ1ZGRpZXMpOgorCQkJc2VsZi5idWRfdmFyLmFwcGVuZCh0ay5JbnRWYXIoKSkKKwkJCWlmIGZsYWc9PTA6CisJCQkJcyA9IHR0ay5TZXBhcmF0b3IobGlzdF9mcmFtZSwgb3JpZW50PXRrLkhPUklaT05UQUwpCisJCQkJcy5wYWNrKGZpbGw9dGsuWCkKKwkJCQlsID0gdGsuTGFiZWwobGlzdF9mcmFtZSwgYW5jaG9yPXRrLlcsIHRleHQ9IkFjY291bnQgJyVzJzoiICUgKGJ1ZCkpCisJCQkJbC5wYWNrKGZpbGw9dGsuWCkKKwkJCWVsc2U6CisJCQkJYyA9IHRrLkNoZWNrYnV0dG9uKGxpc3RfZnJhbWUsIGFuY2hvcj10ay5XLCB0ZXh0PWJ1ZC5jZmcudXJpLCB2YXJpYWJsZT1zZWxmLmJ1ZF92YXJbaWR4XSkKKwkJCQljLnBhY2soZmlsbD10ay5YKQorCQlzID0gdHRrLlNlcGFyYXRvcihsaXN0X2ZyYW1lLCBvcmllbnQ9dGsuSE9SSVpPTlRBTCkKKwkJcy5wYWNrKGZpbGw9dGsuWCkKKworCQkjIE9rL2NhbmNlbCBidXR0b25zCisJCXRhaWxfZnJhbWUgPSB0dGsuRnJhbWUoc2VsZikKKwkJdGFpbF9mcmFtZS5wYWNrKHNpZGU9dGsuQk9UVE9NLCBmaWxsPXRrLkJPVEgsIGV4cGFuZD0xKQorCQkKKwkJYnRuT2sgPSB0dGsuQnV0dG9uKHRhaWxfZnJhbWUsIHRleHQ9J09rJywgZGVmYXVsdD10ay5BQ1RJVkUsIGNvbW1hbmQ9c2VsZi5vbk9rKQorCQlidG5Pay5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0yMCwgcGFkeT0xMCkKKwkJYnRuQ2FuY2VsID0gdHRrLkJ1dHRvbih0YWlsX2ZyYW1lLCB0ZXh0PSdDYW5jZWwnLCBjb21tYW5kPXNlbGYub25DYW5jZWwpCisJCWJ0bkNhbmNlbC5wYWNrKHNpZGU9dGsuUklHSFQsIHBhZHg9MjAsIHBhZHk9MTApCisJCQorCWRlZiBvbk9rKHNlbGYpOgorCQlzZWxmLmJ1ZGR5TGlzdFs6XSA9IFtdCisJCWZvciBpZHgsKGZsYWcsYnVkKSBpbiBlbnVtZXJhdGUoc2VsZi5idWRkaWVzKToKKwkJCWlmIG5vdCBmbGFnOiBjb250aW51ZQorCQkJaWYgc2VsZi5idWRfdmFyW2lkeF0uZ2V0KCkgYW5kIG5vdCAoYnVkIGluIHNlbGYuYnVkZHlMaXN0KToKKwkJCQlzZWxmLmJ1ZGR5TGlzdC5hcHBlbmQoYnVkKQorCQkJCisJCXNlbGYuaXNPayA9IFRydWUKKwkJc2VsZi5kZXN0cm95KCkKKwkJCisJZGVmIG9uQ2FuY2VsKHNlbGYpOgorCQlzZWxmLmRlc3Ryb3koKQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvY2hhdGd1aS5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2NoYXRndWkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5ZTY4MgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2NoYXRndWkucHkKQEAgLTAsMCArMSw0MjAgQEAKKyMgJElkOiBjaGF0Z3VpLnB5IDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkCisjCisjIHBqc3VhIFB5dGhvbiBHVUkgRGVtbworIworIyBDb3B5cmlnaHQgKEMpMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzogIyBQeXRob24gMworCWltcG9ydCB0a2ludGVyIGFzIHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKKwlmcm9tIHRraW50ZXIgaW1wb3J0IG1lc3NhZ2Vib3ggYXMgbXNnYm94CitlbHNlOgorCWltcG9ydCBUa2ludGVyIGFzIHRrCisJaW1wb3J0IHR0aworCWltcG9ydCB0a01lc3NhZ2VCb3ggYXMgbXNnYm94CisKKworY2xhc3MgVGV4dE9ic2VydmVyOgorCWRlZiBvblNlbmRNZXNzYWdlKHNlbGYsIG1zZyk6CisJCXBhc3MKKwlkZWYgb25TdGFydFR5cGluZyhzZWxmKToKKwkJcGFzcworCWRlZiBvblN0b3BUeXBpbmcoc2VsZik6CisJCXBhc3MKKwkJCitjbGFzcyBUZXh0RnJhbWUodHRrLkZyYW1lKToKKwlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBvYnNlcnZlcik6CisJCXR0ay5GcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisJCXNlbGYuX29ic2VydmVyID0gb2JzZXJ2ZXIKKwkJc2VsZi5faXNUeXBpbmcgPSBGYWxzZQorCQlzZWxmLl9jcmVhdGVXaWRnZXRzKCkKKworCWRlZiBfb25TZW5kTWVzc2FnZShzZWxmLCBldmVudCk6CisJCXNlbmRfdGV4dCA9IHNlbGYuX3R5cGluZ0JveC5nZXQoIjEuMCIsIHRrLkVORCkuc3RyaXAoKQorCQlpZiBzZW5kX3RleHQgPT0gJyc6CisJCQlyZXR1cm4KKwkJCisJCXNlbGYuYWRkTWVzc2FnZSgnbWU6ICcgKyBzZW5kX3RleHQpCisJCXNlbGYuX3R5cGluZ0JveC5kZWxldGUoIjAuMCIsIHRrLkVORCkKKwkJc2VsZi5fb25UeXBpbmcoTm9uZSkKKwkJCisJCSMgbm90aWZ5IGFwcCBmb3Igc2VuZGluZyBtZXNzYWdlCisJCXNlbGYuX29ic2VydmVyLm9uU2VuZE1lc3NhZ2Uoc2VuZF90ZXh0KQorCQkKKwlkZWYgX29uVHlwaW5nKHNlbGYsIGV2ZW50KToKKwkJIyBub3RpZnkgYXBwIGZvciB0eXBpbmcgaW5kaWNhdGlvbgorCQlpc190eXBpbmcgPSBzZWxmLl90eXBpbmdCb3guZ2V0KCIxLjAiLCB0ay5FTkQpLnN0cmlwKCkgIT0gJycKKwkJaWYgaXNfdHlwaW5nICE9IHNlbGYuX2lzVHlwaW5nOgorCQkJc2VsZi5faXNUeXBpbmcgPSBpc190eXBpbmcKKwkJCWlmIGlzX3R5cGluZzoKKwkJCQlzZWxmLl9vYnNlcnZlci5vblN0YXJ0VHlwaW5nKCkKKwkJCWVsc2U6CisJCQkJc2VsZi5fb2JzZXJ2ZXIub25TdG9wVHlwaW5nKCkKKwkJCisJZGVmIF9jcmVhdGVXaWRnZXRzKHNlbGYpOgorCQlzZWxmLnJvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJc2VsZi5yb3djb25maWd1cmUoMSwgd2VpZ2h0PTApCisJCXNlbGYucm93Y29uZmlndXJlKDIsIHdlaWdodD0wKQorCQlzZWxmLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJc2VsZi5jb2x1bW5jb25maWd1cmUoMSwgd2VpZ2h0PTApCisJCQorCQlzZWxmLl90ZXh0ID0gdGsuVGV4dChzZWxmLCB3aWR0aD01MCwgaGVpZ2h0PTMwLCBmb250PSgiQXJpYWwiLCAiMTAiKSkKKwkJc2VsZi5fdGV4dC5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PSduc3dlJykKKwkJc2VsZi5fdGV4dC5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCisJCXNlbGYuX3RleHQudGFnX2NvbmZpZygiaW5mbyIsIGZvcmVncm91bmQ9ImRhcmtncmF5IiwgZm9udD0oIkFyaWFsIiwgIjkiLCAiaXRhbGljIikpCisJCQorCQlzY3JsID0gdHRrLlNjcm9sbGJhcihzZWxmLCBvcmllbnQ9dGsuVkVSVElDQUwsIGNvbW1hbmQ9c2VsZi5fdGV4dC55dmlldykKKwkJc2VsZi5fdGV4dC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2NybC5zZXQpCisJCXNjcmwuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHN0aWNreT0nbnN3JykKKwkJCisJCXNlbGYuX3R5cGluZ0JveCA9IHRrLlRleHQoc2VsZiwgd2lkdGg9NTAsIGhlaWdodD0xLCBmb250PSgiQXJpYWwiLCAiMTAiKSkKKwkJc2VsZi5fdHlwaW5nQm94LmdyaWQocm93PTEsIGNvbHVtbnNwYW49Miwgc3RpY2t5PSd3ZScsIHBhZHk9MCkKKwkJCisJCXNlbGYuX3N0YXR1c0JhciA9IHRrLkxhYmVsKHNlbGYsIGFuY2hvcj0ndycsIGZvbnQ9KCJBcmlhbCIsICI4IiwgIml0YWxpYyIpKQorCQlzZWxmLl9zdGF0dXNCYXIuZ3JpZChyb3c9MiwgY29sdW1uc3Bhbj0yLCBzdGlja3k9J3dlJykKKwkJCisJCXNlbGYuX3R5cGluZ0JveC5iaW5kKCc8UmV0dXJuPicsIHNlbGYuX29uU2VuZE1lc3NhZ2UpCisJCXNlbGYuX3R5cGluZ0JveC5iaW5kKCI8S2V5PiIsIHNlbGYuX29uVHlwaW5nKQorCQlzZWxmLl90eXBpbmdCb3guZm9jdXNfc2V0KCkKKwkJCisJZGVmIGFkZE1lc3NhZ2Uoc2VsZiwgbXNnLCBpc19jaGF0ID0gVHJ1ZSk6CisJCXNlbGYuX3RleHQuY29uZmlnKHN0YXRlPXRrLk5PUk1BTCkKKwkJaWYgaXNfY2hhdDoKKwkJCXNlbGYuX3RleHQuaW5zZXJ0KHRrLkVORCwgbXNnKydcclxuJykKKwkJZWxzZToKKwkJCXNlbGYuX3RleHQuaW5zZXJ0KHRrLkVORCwgbXNnKydcclxuJywgJ2luZm8nKQorCQlzZWxmLl90ZXh0LmNvbmZpZyhzdGF0ZT10ay5ESVNBQkxFRCkKKwkJc2VsZi5fdGV4dC55dmlldyh0ay5FTkQpCisKKwlkZWYgc2V0VHlwaW5nSW5kaWNhdGlvbihzZWxmLCB3aG8sIGlzX3R5cGluZyk6CisJCWlmIGlzX3R5cGluZzoKKwkJCXNlbGYuX3N0YXR1c0JhclsndGV4dCddID0gIiclcycgaXMgdHlwaW5nLi4iICUgKHdobykKKwkJZWxzZToKKwkJCXNlbGYuX3N0YXR1c0JhclsndGV4dCddID0gJycKKworY2xhc3MgQXVkaW9TdGF0ZToKKwlOVUxMLCBJTklUSUFMSVpJTkcsIENPTk5FQ1RFRCwgRElTQ09OTkVDVEVELCBGQUlMRUQgPSByYW5nZSg1KQorCQkJCitjbGFzcyBBdWRpb09ic2VydmVyOgorCWRlZiBvbkhhbmd1cChzZWxmLCBwZWVyX3VyaSk6CisJCXBhc3MKKwlkZWYgb25Ib2xkKHNlbGYsIHBlZXJfdXJpKToKKwkJcGFzcworCWRlZiBvblVuaG9sZChzZWxmLCBwZWVyX3VyaSk6CisJCXBhc3MKKwlkZWYgb25SeE11dGUoc2VsZiwgcGVlcl91cmksIGlzX211dGVkKToKKwkJcGFzcworCWRlZiBvblJ4Vm9sKHNlbGYsIHBlZXJfdXJpLCB2b2xfcGN0KToKKwkJcGFzcworCWRlZiBvblR4TXV0ZShzZWxmLCBwZWVyX3VyaSwgaXNfbXV0ZWQpOgorCQlwYXNzCisJCQkKKworY2xhc3MgQXVkaW9GcmFtZSh0dGsuTGFiZWxmcmFtZSk6CisJZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgcGVlcl91cmksIG9ic2VydmVyKToKKwkJdHRrLkxhYmVsZnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB0ZXh0PXBlZXJfdXJpKQorCQlzZWxmLnBlZXJVcmkgPSBwZWVyX3VyaQorCQlzZWxmLl9vYnNlcnZlciA9IG9ic2VydmVyCisJCXNlbGYuX2luaXRGcmFtZSA9IE5vbmUKKwkJc2VsZi5fY2FsbEZyYW1lID0gTm9uZQorCQlzZWxmLl9yeE11dGUgPSBGYWxzZQorCQlzZWxmLl90eE11dGUgPSBGYWxzZQorCQlzZWxmLl9zdGF0ZSA9IEF1ZGlvU3RhdGUuTlVMTAorCQkKKwkJc2VsZi5fY3JlYXRlSW5pdFdpZGdldHMoKQorCQlzZWxmLl9jcmVhdGVXaWRnZXRzKCkKKwkJCisJZGVmIHVwZGF0ZVN0YXRlKHNlbGYsIHN0YXRlKToKKwkJaWYgc2VsZi5fc3RhdGUgPT0gc3RhdGU6CisJCQlyZXR1cm4KKworCQlpZiBzdGF0ZSA9PSBBdWRpb1N0YXRlLklOSVRJQUxJWklORzoKKwkJCXNlbGYuX2NhbGxGcmFtZS5wYWNrX2ZvcmdldCgpCisJCQlzZWxmLl9pbml0RnJhbWUucGFjayhmaWxsPXRrLkJPVEgpCisJCQlzZWxmLl9idG5DYW5jZWwucGFjayhzaWRlPXRrLlRPUCkKKwkJCXNlbGYuX2xibEluaXRTdGF0ZVsndGV4dCddID0gJ0ludGlhbGl6aW5nLi4nCisKKwkJZWxpZiBzdGF0ZSA9PSBBdWRpb1N0YXRlLkNPTk5FQ1RFRDoKKwkJCXNlbGYuX2luaXRGcmFtZS5wYWNrX2ZvcmdldCgpCisJCQlzZWxmLl9jYWxsRnJhbWUucGFjayhmaWxsPXRrLkJPVEgpCQkJCisJCWVsc2U6CisJCQlzZWxmLl9jYWxsRnJhbWUucGFja19mb3JnZXQoKQorCQkJc2VsZi5faW5pdEZyYW1lLnBhY2soZmlsbD10ay5CT1RIKQorCQkJaWYgc3RhdGUgPT0gQXVkaW9TdGF0ZS5GQUlMRUQ6CisJCQkJc2VsZi5fbGJsSW5pdFN0YXRlWyd0ZXh0J10gPSAnRmFpbGVkJworCQkJZWxzZToKKwkJCQlzZWxmLl9sYmxJbml0U3RhdGVbJ3RleHQnXSA9ICdOb3JtYWwgY2xlYXJlZCcKKwkJCQlzZWxmLl9idG5DYW5jZWwucGFja19mb3JnZXQoKQorCQkJCisJCQlzZWxmLl9idG5Ib2xkWyd0ZXh0J10gPSAnSG9sZCcKKwkJCXNlbGYuX2J0bkhvbGQuY29uZmlnKHN0YXRlPXRrLk5PUk1BTCkKKwkJCXNlbGYuX3J4TXV0ZSA9IEZhbHNlCisJCQlzZWxmLl90eE11dGUgPSBGYWxzZQorCQkJc2VsZi5idG5SeE11dGVbJ3RleHQnXSA9ICdNdXRlJworCQkJc2VsZi5idG5UeE11dGVbJ3RleHQnXSA9ICdNdXRlJworCQkJc2VsZi5yeFZvbC5zZXQoNS4wKQorCQkKKwkJIyBzYXZlIGxhc3Qgc3RhdGUKKwkJc2VsZi5fc3RhdGUgPSBzdGF0ZQorCQkKKwlkZWYgc2V0U3RhdHNUZXh0KHNlbGYsIHN0YXRzX3N0cik6CisJCXNlbGYuc3RhdC5jb25maWcoc3RhdGU9dGsuTk9STUFMKQorCQlzZWxmLnN0YXQuZGVsZXRlKCIwLjAiLCB0ay5FTkQpCisJCXNlbGYuc3RhdC5pbnNlcnQodGsuRU5ELCBzdGF0c19zdHIpCisJCXNlbGYuc3RhdC5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCisJCQorCWRlZiBfb25Ib2xkKHNlbGYpOgorCQlzZWxmLl9idG5Ib2xkLmNvbmZpZyhzdGF0ZT10ay5ESVNBQkxFRCkKKwkJIyBub3RpZnkgYXBwCisJCWlmIHNlbGYuX2J0bkhvbGRbJ3RleHQnXSA9PSAnSG9sZCc6CisJCQlzZWxmLl9vYnNlcnZlci5vbkhvbGQoc2VsZi5wZWVyVXJpKQorCQkJc2VsZi5fYnRuSG9sZFsndGV4dCddID0gJ1VuaG9sZCcKKwkJZWxzZToKKwkJCXNlbGYuX29ic2VydmVyLm9uVW5ob2xkKHNlbGYucGVlclVyaSkKKwkJCXNlbGYuX2J0bkhvbGRbJ3RleHQnXSA9ICdIb2xkJworCQlzZWxmLl9idG5Ib2xkLmNvbmZpZyhzdGF0ZT10ay5OT1JNQUwpCisKKwlkZWYgX29uSGFuZ3VwKHNlbGYpOgorCQkjIG5vdGlmeSBhcHAKKwkJc2VsZi5fb2JzZXJ2ZXIub25IYW5ndXAoc2VsZi5wZWVyVXJpKQorCisJZGVmIF9vblJ4TXV0ZShzZWxmKToKKwkJIyBub3RpZnkgYXBwCisJCXNlbGYuX3J4TXV0ZSA9IG5vdCBzZWxmLl9yeE11dGUKKwkJc2VsZi5fb2JzZXJ2ZXIub25SeE11dGUoc2VsZi5wZWVyVXJpLCBzZWxmLl9yeE11dGUpCisJCXNlbGYuYnRuUnhNdXRlWyd0ZXh0J10gPSAnVW5tdXRlJyBpZiBzZWxmLl9yeE11dGUgZWxzZSAnTXV0ZScKKwkJCisJZGVmIF9vblJ4Vm9sKHNlbGYsIGV2ZW50KToKKwkJIyBub3RpZnkgYXBwCisJCXZvbCA9IHNlbGYucnhWb2wuZ2V0KCkKKwkJc2VsZi5fb2JzZXJ2ZXIub25SeFZvbChzZWxmLnBlZXJVcmksIHZvbCoxMC4wKQorCisJZGVmIF9vblR4TXV0ZShzZWxmKToKKwkJIyBub3RpZnkgYXBwCisJCXNlbGYuX3R4TXV0ZSA9IG5vdCBzZWxmLl90eE11dGUKKwkJc2VsZi5fb2JzZXJ2ZXIub25UeE11dGUoc2VsZi5wZWVyVXJpLCBzZWxmLl90eE11dGUpCisJCXNlbGYuYnRuVHhNdXRlWyd0ZXh0J10gPSAnVW5tdXRlJyBpZiBzZWxmLl90eE11dGUgZWxzZSAnTXV0ZScKKworCWRlZiBfY3JlYXRlSW5pdFdpZGdldHMoc2VsZik6CisJCXNlbGYuX2luaXRGcmFtZSA9IHR0ay5GcmFtZShzZWxmKQorCQkjc2VsZi5faW5pdEZyYW1lLnBhY2soZmlsbD10ay5CT1RIKQorCisJCisJCXNlbGYuX2xibEluaXRTdGF0ZSA9IHRrLkxhYmVsKHNlbGYuX2luaXRGcmFtZSwgZm9udD0oIkFyaWFsIiwgIjEyIiksIHRleHQ9JycpCisJCXNlbGYuX2xibEluaXRTdGF0ZS5wYWNrKHNpZGU9dGsuVE9QLCBmaWxsPXRrLlgsIGV4cGFuZD0xKQorCQkKKwkJIyBPcGVyYXRpb246IGNhbmNlbC9raWNrCisJCXNlbGYuX2J0bkNhbmNlbCA9IHR0ay5CdXR0b24oc2VsZi5faW5pdEZyYW1lLCB0ZXh0ID0gJ0NhbmNlbCcsIGNvbW1hbmQ9c2VsZi5fb25IYW5ndXApCisJCXNlbGYuX2J0bkNhbmNlbC5wYWNrKHNpZGU9dGsuVE9QKQorCQkJCQorCWRlZiBfY3JlYXRlV2lkZ2V0cyhzZWxmKToKKwkJc2VsZi5fY2FsbEZyYW1lID0gdHRrLkZyYW1lKHNlbGYpCisJCSNzZWxmLl9jYWxsRnJhbWUucGFjayhmaWxsPXRrLkJPVEgpCisJCQorCQkjIHRvb2xiYXIKKwkJdG9vbGJhciA9IHR0ay5GcmFtZShzZWxmLl9jYWxsRnJhbWUpCisJCXRvb2xiYXIucGFjayhzaWRlPXRrLlRPUCwgZmlsbD10ay5YKQorCQlzZWxmLl9idG5Ib2xkID0gdHRrLkJ1dHRvbih0b29sYmFyLCB0ZXh0PSdIb2xkJywgY29tbWFuZD1zZWxmLl9vbkhvbGQpCisJCXNlbGYuX2J0bkhvbGQucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuWSkKKwkJI3NlbGYuX2J0blhmZXIgPSB0dGsuQnV0dG9uKHRvb2xiYXIsIHRleHQ9J1RyYW5zZmVyLi4nKQorCQkjc2VsZi5fYnRuWGZlci5wYWNrKHNpZGU9dGsuTEVGVCwgZmlsbD10ay5ZKQorCQlzZWxmLl9idG5IYW5nVXAgPSB0dGsuQnV0dG9uKHRvb2xiYXIsIHRleHQ9J0hhbmd1cCcsIGNvbW1hbmQ9c2VsZi5fb25IYW5ndXApCisJCXNlbGYuX2J0bkhhbmdVcC5wYWNrKHNpZGU9dGsuTEVGVCwgZmlsbD10ay5ZKQorCisJCSMgdm9sdW1lIHRvb2wKKwkJdm9sX2ZybSA9IHR0ay5GcmFtZShzZWxmLl9jYWxsRnJhbWUpCisJCXZvbF9mcm0ucGFjayhzaWRlPXRrLlRPUCwgZmlsbD10ay5YKQorCQkKKwkJc2VsZi5yeFZvbEZybSA9IHR0ay5MYWJlbGZyYW1lKHZvbF9mcm0sIHRleHQ9J1JYIHZvbHVtZScpCisJCXNlbGYucnhWb2xGcm0ucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuWSkKKwkJCisJCXNlbGYuYnRuUnhNdXRlID0gdHRrLkJ1dHRvbihzZWxmLnJ4Vm9sRnJtLCB3aWR0aD04LCB0ZXh0PSdNdXRlJywgY29tbWFuZD1zZWxmLl9vblJ4TXV0ZSkKKwkJc2VsZi5idG5SeE11dGUucGFjayhzaWRlPXRrLkxFRlQpCisJCXNlbGYucnhWb2wgPSB0ay5TY2FsZShzZWxmLnJ4Vm9sRnJtLCBvcmllbnQ9dGsuSE9SSVpPTlRBTCwgZnJvbV89MC4wLCB0bz0xMC4wLCBzaG93dmFsdWU9MSkgIywgdGlja2ludGVydmFsPTEwLjAsIHNob3d2YWx1ZT0xKQorCQlzZWxmLnJ4Vm9sLnNldCg1LjApCisJCXNlbGYucnhWb2wuYmluZCgiPEJ1dHRvblJlbGVhc2UtMT4iLCBzZWxmLl9vblJ4Vm9sKQorCQlzZWxmLnJ4Vm9sLnBhY2soc2lkZT10ay5MRUZUKQorCQkKKwkJc2VsZi50eFZvbEZybSA9IHR0ay5MYWJlbGZyYW1lKHZvbF9mcm0sIHRleHQ9J1RYIHZvbHVtZScpCisJCXNlbGYudHhWb2xGcm0ucGFjayhzaWRlPXRrLlJJR0hULCBmaWxsPXRrLlkpCisJCQorCQlzZWxmLmJ0blR4TXV0ZSA9IHR0ay5CdXR0b24oc2VsZi50eFZvbEZybSwgd2lkdGg9OCwgdGV4dD0nTXV0ZScsIGNvbW1hbmQ9c2VsZi5fb25UeE11dGUpCisJCXNlbGYuYnRuVHhNdXRlLnBhY2soc2lkZT10ay5MRUZUKQorCQkKKwkJIyBzdGF0CisJCXNlbGYuc3RhdCA9IHRrLlRleHQoc2VsZi5fY2FsbEZyYW1lLCB3aWR0aD0xMCwgaGVpZ2h0PTIsIGJnPSdsaWdodGdyYXknLCByZWxpZWY9dGsuRkxBVCwgZm9udD0oIkFyaWFsIiwgIjkiKSkKKwkJc2VsZi5zdGF0Lmluc2VydCh0ay5FTkQsICdzdGF0IGhlcmUnKQorCQlzZWxmLnN0YXQucGFjayhzaWRlPXRrLkJPVFRPTSwgZmlsbD10ay5CT1RILCBleHBhbmQ9MSkKKworCitjbGFzcyBDaGF0T2JzZXJ2ZXIoVGV4dE9ic2VydmVyLCBBdWRpb09ic2VydmVyKToKKwlkZWYgb25BZGRQYXJ0aWNpcGFudChzZWxmKToKKwkJcGFzcworCWRlZiBvblN0YXJ0QXVkaW8oc2VsZik6CisJCXBhc3MKKwlkZWYgb25TdG9wQXVkaW8oc2VsZik6CisJCXBhc3MKKwlkZWYgb25DbG9zZVdpbmRvdyhzZWxmKToKKwkJcGFzcworCQkKK2NsYXNzIENoYXRGcmFtZSh0ay5Ub3BsZXZlbCk6CisJIiIiCisJUm9vbQorCSIiIgorCWRlZiBfX2luaXRfXyhzZWxmLCBvYnNlcnZlcik6CisJCXRrLlRvcGxldmVsLl9faW5pdF9fKHNlbGYpCisJCXNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLl9vbkNsb3NlKQorCQlzZWxmLl9vYnNlcnZlciA9IG9ic2VydmVyCisKKwkJc2VsZi5fdGV4dCA9IE5vbmUKKwkJc2VsZi5fdGV4dF9zaG93biA9IFRydWUKKwkJCisJCXNlbGYuX2F1ZGlvRW5hYmxlZCA9IEZhbHNlCisJCXNlbGYuX2F1ZGlvRnJhbWVzID0gW10KKwkJc2VsZi5fY3JlYXRlV2lkZ2V0cygpCisJCisJZGVmIF9jcmVhdGVXaWRnZXRzKHNlbGYpOgorCQkjIHRvb2xiYXIKKwkJc2VsZi50b29sYmFyID0gdHRrLkZyYW1lKHNlbGYpCisJCXNlbGYudG9vbGJhci5wYWNrKHNpZGU9dGsuVE9QLCBmaWxsPXRrLkJPVEgpCisJCQorCQlidG5UZXh0ID0gdHRrLkJ1dHRvbihzZWxmLnRvb2xiYXIsIHRleHQ9J1Nob3cvaGlkZSB0ZXh0JywgY29tbWFuZD1zZWxmLl9vblNob3dIaWRlVGV4dCkKKwkJYnRuVGV4dC5wYWNrKHNpZGU9dGsuTEVGVCwgZmlsbD10ay5ZKQorCQlidG5BdWRpbyA9IHR0ay5CdXR0b24oc2VsZi50b29sYmFyLCB0ZXh0PSdTdGFydC9zdG9wIGF1ZGlvJywgY29tbWFuZD1zZWxmLl9vblN0YXJ0U3RvcEF1ZGlvKQorCQlidG5BdWRpby5wYWNrKHNpZGU9dGsuTEVGVCwgZmlsbD10ay5ZKQorCQkKKwkJdHRrLlNlcGFyYXRvcihzZWxmLnRvb2xiYXIsIG9yaWVudD10ay5WRVJUSUNBTCkucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuWSwgcGFkeCA9IDQpCisKKwkJYnRuQWRkID0gdHRrLkJ1dHRvbihzZWxmLnRvb2xiYXIsIHRleHQ9J0FkZCBwYXJ0aWNpcGFudC4uJywgY29tbWFuZD1zZWxmLl9vbkFkZFBhcnRpY2lwYW50KQorCQlidG5BZGQucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuWSkKKworCQkjIG1lZGlhIGZyYW1lCisJCXNlbGYubWVkaWEgPSB0dGsuRnJhbWUoc2VsZikKKwkJc2VsZi5tZWRpYS5wYWNrKHNpZGU9dGsuQk9UVE9NLCBmaWxsPXRrLkJPVEgsIGV4cGFuZD0xKQorCQkKKwkJIyBjcmVhdGUgVGV4dCBDaGF0IGZyYW1lCisJCXNlbGYubWVkaWFfbGVmdCA9IHR0ay5GcmFtZShzZWxmLm1lZGlhKQorCQlzZWxmLl90ZXh0ID0gVGV4dEZyYW1lKHNlbGYubWVkaWFfbGVmdCwgc2VsZi5fb2JzZXJ2ZXIpCisJCXNlbGYuX3RleHQucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD0xKQorCQlzZWxmLm1lZGlhX2xlZnQucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuQk9USCwgZXhwYW5kPTEpCisJCQorCQkjIGNyZWF0ZSBvdGhlciBtZWRpYSBmcmFtZQorCQlzZWxmLm1lZGlhX3JpZ2h0ID0gdHRrLkZyYW1lKHNlbGYubWVkaWEpCisJCQorCWRlZiBfYXJyYW5nZU1lZGlhRnJhbWVzKHNlbGYpOgorCQlpZiBsZW4oc2VsZi5fYXVkaW9GcmFtZXMpID09IDA6CisJCQlzZWxmLm1lZGlhX3JpZ2h0LnBhY2tfZm9yZ2V0KCkKKwkJCXJldHVybgorCQkKKwkJc2VsZi5tZWRpYV9yaWdodC5wYWNrKHNpZGU9dGsuUklHSFQsIGZpbGw9dGsuQk9USCwgZXhwYW5kPTEpCisJCU1BWF9ST1dTID0gMworCQlyb3dfbnVtID0gMAorCQljb2xfbnVtID0gMQorCQlmb3IgZnJtIGluIHNlbGYuX2F1ZGlvRnJhbWVzOgorCQkJZnJtLmdyaWQocm93PXJvd19udW0sIGNvbHVtbj1jb2xfbnVtLCBzdGlja3k9J25zZXcnLCBwYWR4PTUsIHBhZHk9NSkKKwkJCXJvd19udW0gKz0gMQorCQkJaWYgcm93X251bSA+PSBNQVhfUk9XUzoKKwkJCQlyb3dfbnVtICA9IDAKKwkJCQljb2xfbnVtICs9IDEKKwkKKwlkZWYgX29uU2hvd0hpZGVUZXh0KHNlbGYpOgorCQlzZWxmLnRleHRTaG93SGlkZShub3Qgc2VsZi5fdGV4dF9zaG93bikKKwkJCisJZGVmIF9vbkFkZFBhcnRpY2lwYW50KHNlbGYpOgorCQlzZWxmLl9vYnNlcnZlci5vbkFkZFBhcnRpY2lwYW50KCkKKwkKKwlkZWYgX29uU3RhcnRTdG9wQXVkaW8oc2VsZik6CisJCXNlbGYuX2F1ZGlvRW5hYmxlZCA9IG5vdCBzZWxmLl9hdWRpb0VuYWJsZWQKKwkJaWYgc2VsZi5fYXVkaW9FbmFibGVkOgorCQkJc2VsZi5fb2JzZXJ2ZXIub25TdGFydEF1ZGlvKCkKKwkJZWxzZToKKwkJCXNlbGYuX29ic2VydmVyLm9uU3RvcEF1ZGlvKCkKKwkJc2VsZi5lbmFibGVBdWRpbyhzZWxmLl9hdWRpb0VuYWJsZWQpCisJCQorCWRlZiBfb25DbG9zZShzZWxmKToKKwkJc2VsZi5fb2JzZXJ2ZXIub25DbG9zZVdpbmRvdygpCisJCQkKKwkjIEFQSXMKKwkKKwlkZWYgYnJpbmdUb0Zyb250KHNlbGYpOgorCQlzZWxmLmRlaWNvbmlmeSgpCisJCXNlbGYubGlmdCgpCisJCXNlbGYuX3RleHQuX3R5cGluZ0JveC5mb2N1c19zZXQoKQorCQkKKwlkZWYgdGV4dEFkZE1lc3NhZ2Uoc2VsZiwgbXNnLCBpc19jaGF0ID0gVHJ1ZSk6CisJCXNlbGYuX3RleHQuYWRkTWVzc2FnZShtc2csIGlzX2NoYXQpCisJCQorCWRlZiB0ZXh0U2V0VHlwaW5nSW5kaWNhdGlvbihzZWxmLCB3aG8sIGlzX3R5cGluZyA9IFRydWUpOgorCQlzZWxmLl90ZXh0LnNldFR5cGluZ0luZGljYXRpb24od2hvLCBpc190eXBpbmcpCisJCQorCWRlZiBhZGRQYXJ0aWNpcGFudChzZWxmLCBwYXJ0aWNpcGFudF91cmkpOgorCQlhdWRfZnJtID0gQXVkaW9GcmFtZShzZWxmLm1lZGlhX3JpZ2h0LCBwYXJ0aWNpcGFudF91cmksIHNlbGYuX29ic2VydmVyKQorCQlzZWxmLl9hdWRpb0ZyYW1lcy5hcHBlbmQoYXVkX2ZybSkKKwkKKwlkZWYgZGVsUGFydGljaXBhbnQoc2VsZiwgcGFydGljaXBhbnRfdXJpKToKKwkJZm9yIGF1ZF9mcm0gaW4gc2VsZi5fYXVkaW9GcmFtZXM6CisJCQlpZiBwYXJ0aWNpcGFudF91cmkgPT0gYXVkX2ZybS5wZWVyVXJpOgorCQkJCXNlbGYuX2F1ZGlvRnJhbWVzLnJlbW92ZShhdWRfZnJtKQorCQkJCSMgbmVlZCB0byBkZWxldGUgYXVkX2ZybSBtYW51YWxseT8KKwkJCQlhdWRfZnJtLmRlc3Ryb3koKQorCQkJCXJldHVybgorCisJZGVmIHRleHRTaG93SGlkZShzZWxmLCBzaG93ID0gVHJ1ZSk6CisJCWlmIHNob3c6CisJCQlzZWxmLm1lZGlhX2xlZnQucGFjayhzaWRlPXRrLkxFRlQsIGZpbGw9dGsuQk9USCwgZXhwYW5kPTEpCisJCQlzZWxmLl90ZXh0Ll90eXBpbmdCb3guZm9jdXNfc2V0KCkKKwkJZWxzZToKKwkJCXNlbGYubWVkaWFfbGVmdC5wYWNrX2ZvcmdldCgpCisJCXNlbGYuX3RleHRfc2hvd24gPSBzaG93CisJCisJZGVmIGVuYWJsZUF1ZGlvKHNlbGYsIGlzX2VuYWJsZWQgPSBUcnVlKToKKwkJaWYgaXNfZW5hYmxlZDoKKwkJCXNlbGYuX2FycmFuZ2VNZWRpYUZyYW1lcygpCisJCWVsc2U6CisJCQlzZWxmLm1lZGlhX3JpZ2h0LnBhY2tfZm9yZ2V0KCkKKwkJc2VsZi5fYXVkaW9FbmFibGVkID0gaXNfZW5hYmxlZAorCQkJCisJZGVmIGF1ZGlvVXBkYXRlU3RhdGUoc2VsZiwgcGFydGljaXBhbnRfdXJpLCBzdGF0ZSk6CisJCWZvciBhdWRfZnJtIGluIHNlbGYuX2F1ZGlvRnJhbWVzOgorCQkJaWYgcGFydGljaXBhbnRfdXJpID09IGF1ZF9mcm0ucGVlclVyaToKKwkJCQlhdWRfZnJtLnVwZGF0ZVN0YXRlKHN0YXRlKQorCQkJCWJyZWFrCisJCWlmIHN0YXRlID49IEF1ZGlvU3RhdGUuRElTQ09OTkVDVEVEIGFuZCBsZW4oc2VsZi5fYXVkaW9GcmFtZXMpID09IDE6CisJCQlzZWxmLmVuYWJsZUF1ZGlvKEZhbHNlKQorCQllbHNlOgorCQkJc2VsZi5lbmFibGVBdWRpbyhUcnVlKQorCQkJCisJZGVmIGF1ZGlvU2V0U3RhdHNUZXh0KHNlbGYsIHBhcnRpY2lwYW50X3VyaSwgc3RhdHNfc3RyKToKKwkJZm9yIGF1ZF9mcm0gaW4gc2VsZi5fYXVkaW9GcmFtZXM6CisJCQlpZiBwYXJ0aWNpcGFudF91cmkgPT0gYXVkX2ZybS5wZWVyVXJpOgorCQkJCWF1ZF9mcm0uc2V0U3RhdHNUZXh0KHN0YXRzX3N0cikKKwkJCQlicmVhaworCQkJCQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlyb290ID0gdGsuVGsoKQorCXJvb3QudGl0bGUoIkNoYXQiKQorCXJvb3QuY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCXJvb3Qucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQorCQorCW9icyA9IENoYXRPYnNlcnZlcigpCisJZGxnID0gQ2hhdEZyYW1lKG9icykKKwkjZGxnID0gVGV4dEZyYW1lKHJvb3QpCisJI2RsZyA9IEF1ZGlvRnJhbWUocm9vdCkKKworCSNkbGcucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD0xKQorCXJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvZW5kcG9pbnQucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9lbmRwb2ludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM2N2YyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvZW5kcG9pbnQucHkKQEAgLTAsMCArMSw1MyBAQAorIyAkSWQ6IGVuZHBvaW50LnB5IDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkCisjCisjIHBqc3VhIFB5dGhvbiBHVUkgRGVtbworIworIyBDb3B5cmlnaHQgKEMpMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzogIyBQeXRob24gMworCWltcG9ydCB0a2ludGVyIGFzIHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKKwlmcm9tIHRraW50ZXIgaW1wb3J0IG1lc3NhZ2Vib3ggYXMgbXNnYm94CitlbHNlOgorCWltcG9ydCBUa2ludGVyIGFzIHRrCisJaW1wb3J0IHRrTWVzc2FnZUJveCBhcyBtc2dib3gKKwlpbXBvcnQgdHRrCisKK2ltcG9ydCBwanN1YTIgYXMgcGoKK2ltcG9ydCBhcHBsaWNhdGlvbgorCisKK2NsYXNzIEVuZHBvaW50KHBqLkVuZHBvaW50KToKKwkiIiIKKwlUaGlzIGlzIGhpZ2ggbGV2ZWwgUHl0aG9uIG9iamVjdCBpbmhlcml0ZWQgZnJvbSBwai5FbmRwb2ludAorCSIiIgorCWluc3RhbmNlID0gTm9uZQorCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJcGouRW5kcG9pbnQuX19pbml0X18oc2VsZikKKwkJRW5kcG9pbnQuaW5zdGFuY2UgPSBzZWxmCisJCisJCitkZWYgdmFsaWRhdGVVcmkodXJpKToKKwlyZXR1cm4gRW5kcG9pbnQuaW5zdGFuY2UudXRpbFZlcmlmeVVyaSh1cmkpID09IHBqLlBKX1NVQ0NFU1MKKworZGVmIHZhbGlkYXRlU2lwVXJpKHVyaSk6CisJcmV0dXJuIEVuZHBvaW50Lmluc3RhbmNlLnV0aWxWZXJpZnlTaXBVcmkodXJpKSA9PSBwai5QSl9TVUNDRVNTCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlhcHBsaWNhdGlvbi5tYWluKCkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2xvZy5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL2xvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDExYTNlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHlndWkvbG9nLnB5CkBAIC0wLDAgKzEsMTI3IEBACisjICRJZDogbG9nLnB5IDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkCisjCisjIHBqc3VhIFB5dGhvbiBHVUkgRGVtbworIworIyBDb3B5cmlnaHQgKEMpMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzogIyBQeXRob24gMworCWltcG9ydCB0a2ludGVyIGFzIHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKKwlmcm9tIHRraW50ZXIgaW1wb3J0IG1lc3NhZ2Vib3ggYXMgbXNnYm94CitlbHNlOgorCWltcG9ydCBUa2ludGVyIGFzIHRrCisJaW1wb3J0IHRrTWVzc2FnZUJveCBhcyBtc2dib3gKKwlpbXBvcnQgdHRrCisKK2ltcG9ydCBwanN1YTIgYXMgcGoKK2ltcG9ydCBhcHBsaWNhdGlvbgorCisKK2NsYXNzIExvZ1dpbmRvdyh0ay5Ub3BsZXZlbCk6CisJIiIiCisJTG9nIHdpbmRvdworCSIiIgorCWluc3RhbmNlID0gTm9uZQorCWRlZiBfX2luaXRfXyhzZWxmLCBhcHApOgorCQl0ay5Ub3BsZXZlbC5fX2luaXRfXyhzZWxmLCBuYW1lPSdsb2d3bmQnLCB3aWR0aD02NDAsIGhlaWdodD00ODApCisJCUxvZ1dpbmRvdy5pbnN0YW5jZSA9IHNlbGYKKwkJc2VsZi5hcHAgPSBhcHAKKwkJc2VsZi5zdGF0ZSgnd2l0aGRyYXduJykKKwkJc2VsZi50aXRsZSgnTG9nJykKKwkJc2VsZi5fY3JlYXRlV2lkZ2V0cygpCisJCXNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLl9vbkhpZGUpCisKKwlkZWYgYWRkTG9nKHNlbGYsIGVudHJ5KToKKwkJIiIiZW50cnkgZmllbGRzOgorCQkgICAgaW50CQlsZXZlbDsKKwkJICAgIHN0cmluZwltc2c7CisJCSAgICBsb25nCXRocmVhZElkOworCQkgICAgc3RyaW5nCXRocmVhZE5hbWU7CisJCSIiIgorCQlzZWxmLmFkZExvZzIoZW50cnkubGV2ZWwsIGVudHJ5Lm1zZykKKwkJCisJZGVmIGFkZExvZzIoc2VsZiwgbGV2ZWwsIG1zZyk6CisJCWlmIGxldmVsPT01OgorCQkJdGFncyA9ICgndHJhY2UnLCkKKwkJZWxpZiBsZXZlbD09MzoKKwkJCXRhZ3MgPSAoJ2luZm8nLCkKKwkJZWxpZiBsZXZlbD09MjoKKwkJCXRhZ3MgPSAoJ3dhcm5pbmcnLCkKKwkJZWxpZiBsZXZlbDw9MToKKwkJCXRhZ3MgPSAoJ2Vycm9yJywpCisJCWVsc2U6CisJCQl0YWdzID0gTm9uZQorCQlzZWxmLnRleHQuaW5zZXJ0KHRrLkVORCwgbXNnLCB0YWdzKQorCQlzZWxmLnRleHQuc2VlKHRrLkVORCkKKwkJCisJZGVmIF9jcmVhdGVXaWRnZXRzKHNlbGYpOgorCQlzZWxmLnJvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJc2VsZi5yb3djb25maWd1cmUoMSwgd2VpZ2h0PTApCisJCXNlbGYuY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlzZWxmLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MCkKKwkJCisJCXNlbGYudGV4dCA9IHRrLlRleHQoc2VsZiwgZm9udD0oJ0NvdXJpZXIgTmV3JywgJzgnKSwgd3JhcD10ay5OT05FLCB1bmRvPUZhbHNlLCBwYWR4PTQsIHBhZHk9NSkKKwkJc2VsZi50ZXh0LmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9J25zd2UnLCBwYWR4PTUsIHBhZHk9NSkKKwkJCisJCXNjcmwgPSB0dGsuU2Nyb2xsYmFyKHNlbGYsIG9yaWVudD10ay5WRVJUSUNBTCwgY29tbWFuZD1zZWxmLnRleHQueXZpZXcpCisJCXNlbGYudGV4dC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2NybC5zZXQpCisJCXNjcmwuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHN0aWNreT0nbnN3JywgcGFkeD01LCBwYWR5PTUpCisKKwkJc2NybCA9IHR0ay5TY3JvbGxiYXIoc2VsZiwgb3JpZW50PXRrLkhPUklaT05UQUwsIGNvbW1hbmQ9c2VsZi50ZXh0Lnh2aWV3KQorCQlzZWxmLnRleHQuY29uZmlnKHhzY3JvbGxjb21tYW5kPXNjcmwuc2V0KQorCQlzY3JsLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9J3dlJywgcGFkeD01LCBwYWR5PTUpCisJCQorCQlzZWxmLnRleHQuYmluZCgiPEtleT4iLCBzZWxmLl9vbktleSkKKwkJCisJCXNlbGYudGV4dC50YWdfY29uZmlndXJlKCdub3JtYWwnLCBmb250PSgnQ291cmllciBOZXcnLCAnOCcpLCBmb3JlZ3JvdW5kPSdibGFjaycpCisJCXNlbGYudGV4dC50YWdfY29uZmlndXJlKCd0cmFjZScsIGZvbnQ9KCdDb3VyaWVyIE5ldycsICc4JyksIGZvcmVncm91bmQ9JyM3Nzc3NzcnKQorCQlzZWxmLnRleHQudGFnX2NvbmZpZ3VyZSgnaW5mbycsIGZvbnQ9KCdDb3VyaWVyIE5ldycsICc4JywgJ2JvbGQnKSwgZm9yZWdyb3VuZD0nYmxhY2snKQorCQlzZWxmLnRleHQudGFnX2NvbmZpZ3VyZSgnd2FybmluZycsIGZvbnQ9KCdDb3VyaWVyIE5ldycsICc4JywgJ2JvbGQnKSwgZm9yZWdyb3VuZD0nY3lhbicpCisJCXNlbGYudGV4dC50YWdfY29uZmlndXJlKCdlcnJvcicsIGZvbnQ9KCdDb3VyaWVyIE5ldycsICc4JywgJ2JvbGQnKSwgZm9yZWdyb3VuZD0ncmVkJykKKwkKKwlkZWYgX29uS2V5KHNlbGYsIGV2ZW50KToKKwkJIyBJZ25vcmUga2V5IGV2ZW50IHRvIG1ha2UgdGV4dCB3aWRnZXQgcmVhZC1vbmx5CisJCXJldHVybiAiYnJlYWsiCisJCisJZGVmIF9vbkhpZGUoc2VsZik6CisJCSMgSGlkZSB3aGVuIGNsb3NlICgneCcpIGJ1dHRvbiBpcyBjbGlja2VkCisJCXNlbGYud2l0aGRyYXcoKQorCQlzZWxmLmFwcC5zaG93TG9nV2luZG93LnNldCgwKQorCQkKKwkKK2RlZiB3cml0ZUxvZzIobGV2ZWwsIG1zZyk6CisJaWYgTG9nV2luZG93Lmluc3RhbmNlOgorCQlMb2dXaW5kb3cuaW5zdGFuY2UuYWRkTG9nMihsZXZlbCwgbXNnKQkKKworZGVmIHdyaXRlTG9nKGVudHJ5KToKKwlpZiBMb2dXaW5kb3cuaW5zdGFuY2U6CisJCUxvZ1dpbmRvdy5pbnN0YW5jZS5hZGRMb2coZW50cnkpCisKK2NsYXNzIExvZ2dlcihwai5Mb2dXcml0ZXIpOgorCSIiIgorCUxvZ2dlciB0byByZWNlaXZlIGxvZyBtZXNzYWdlcyBmcm9tIHBqc3VhMgorCSIiIgorCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJcGouTG9nV3JpdGVyLl9faW5pdF9fKHNlbGYpCisJCQorCWRlZiB3cml0ZShzZWxmLCBlbnRyeSk6CisJCXByaW50IGVudHJ5Lm1zZywKKwkJd3JpdGVMb2coZW50cnkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisJYXBwbGljYXRpb24ubWFpbigpCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9zZXR0aW5ncy5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5Z3VpL3NldHRpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWJjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weWd1aS9zZXR0aW5ncy5weQpAQCAtMCwwICsxLDM2MiBAQAorIyAkSWQ6IHNldHRpbmdzLnB5IDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkCisjCisjIHBqc3VhIFB5dGhvbiBHVUkgRGVtbworIworIyBDb3B5cmlnaHQgKEMpMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzogIyBQeXRob24gMworCWltcG9ydCB0a2ludGVyIGFzIHRrCisJZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKKwlmcm9tIHRraW50ZXIgaW1wb3J0IG1lc3NhZ2Vib3ggYXMgbXNnYm94CitlbHNlOgorCWltcG9ydCBUa2ludGVyIGFzIHRrCisJaW1wb3J0IHRrTWVzc2FnZUJveCBhcyBtc2dib3gKKwlpbXBvcnQgdHRrCisKK2ltcG9ydCBwanN1YTIgYXMgcGoKKyNpbXBvcnQgYXBwbGljYXRpb24KKworIyBUcmFuc3BvcnQgc2V0dGluZworY2xhc3MgU2lwVHJhbnNwb3J0Q29uZmlnOgorCWRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCBlbmFibGVkKToKKwkJI3BqLlBlcnNpc3RlbnRPYmplY3QuX19pbml0X18oc2VsZikKKwkJc2VsZi50eXBlID0gdHlwZQorCQlzZWxmLmVuYWJsZWQgPSBlbmFibGVkCisJCXNlbGYuY29uZmlnID0gcGouVHJhbnNwb3J0Q29uZmlnKCkKKwlkZWYgcmVhZE9iamVjdChzZWxmLCBub2RlKToKKwkJY2hpbGRfbm9kZSA9IG5vZGUucmVhZENvbnRhaW5lcigiU2lwVHJhbnNwb3J0IikKKwkJc2VsZi50eXBlID0gY2hpbGRfbm9kZS5yZWFkSW50KCJ0eXBlIikKKwkJc2VsZi5lbmFibGVkID0gY2hpbGRfbm9kZS5yZWFkQm9vbCgiZW5hYmxlZCIpCisJCXNlbGYuY29uZmlnLnJlYWRPYmplY3QoY2hpbGRfbm9kZSkKKwlkZWYgd3JpdGVPYmplY3Qoc2VsZiwgbm9kZSk6CisJCWNoaWxkX25vZGUgPSBub2RlLndyaXRlTmV3Q29udGFpbmVyKCJTaXBUcmFuc3BvcnQiKQorCQljaGlsZF9ub2RlLndyaXRlSW50KCJ0eXBlIiwgc2VsZi50eXBlKQorCQljaGlsZF9ub2RlLndyaXRlQm9vbCgiZW5hYmxlZCIsIHNlbGYuZW5hYmxlZCkKKwkJc2VsZi5jb25maWcud3JpdGVPYmplY3QoY2hpbGRfbm9kZSkKKworIyBBY2NvdW50IHNldHRpbmcgd2l0aCBidWRkeSBsaXN0CitjbGFzcyBBY2NDb25maWc6CisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlzZWxmLmVuYWJsZWQgPSBUcnVlCisJCXNlbGYuY29uZmlnID0gcGouQWNjb3VudENvbmZpZygpCisJCXNlbGYuYnVkZHlDb25maWdzID0gW10KKwlkZWYgcmVhZE9iamVjdChzZWxmLCBub2RlKToKKwkJYWNjX25vZGUgPSBub2RlLnJlYWRDb250YWluZXIoIkFjY291bnQiKQorCQlzZWxmLmVuYWJsZWQgPSBhY2Nfbm9kZS5yZWFkQm9vbCgiZW5hYmxlZCIpCisJCXNlbGYuY29uZmlnLnJlYWRPYmplY3QoYWNjX25vZGUpCisJCWJ1ZGR5X25vZGUgPSBhY2Nfbm9kZS5yZWFkQXJyYXkoImJ1ZGRpZXMiKQorCQl3aGlsZSBidWRkeV9ub2RlLmhhc1VucmVhZCgpOgorCQkJYnVkZHlfY2ZnID0gcGouQnVkZHlDb25maWcoKQorCQkJYnVkZHlfY2ZnLnJlYWRPYmplY3QoYnVkZHlfbm9kZSkKKwkJCXNlbGYuYnVkZHlDb25maWdzLmFwcGVuZChidWRkeV9jZmcpCisJZGVmIHdyaXRlT2JqZWN0KHNlbGYsIG5vZGUpOgorCQlhY2Nfbm9kZSA9IG5vZGUud3JpdGVOZXdDb250YWluZXIoIkFjY291bnQiKQorCQlhY2Nfbm9kZS53cml0ZUJvb2woImVuYWJsZWQiLCBzZWxmLmVuYWJsZWQpCisJCXNlbGYuY29uZmlnLndyaXRlT2JqZWN0KGFjY19ub2RlKQorCQlidWRkeV9ub2RlID0gYWNjX25vZGUud3JpdGVOZXdBcnJheSgiYnVkZGllcyIpCisJCWZvciBidWRkeSBpbiBzZWxmLmJ1ZGR5Q29uZmlnczoKKwkJCWJ1ZGR5X25vZGUud3JpdGVPYmplY3QoYnVkZHkpCisKKwkKKyMgTWFzdGVyIHNldHRpbmdzCitjbGFzcyBBcHBDb25maWc6CisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlzZWxmLmVwQ29uZmlnID0gcGouRXBDb25maWcoKQkjIHBqLkVwQ29uZmlnKCkKKwkJc2VsZi51ZHAgPSBTaXBUcmFuc3BvcnRDb25maWcocGouUEpTSVBfVFJBTlNQT1JUX1VEUCwgVHJ1ZSkKKwkJc2VsZi50Y3AgPSBTaXBUcmFuc3BvcnRDb25maWcocGouUEpTSVBfVFJBTlNQT1JUX1RDUCwgVHJ1ZSkKKwkJc2VsZi50bHMgPSBTaXBUcmFuc3BvcnRDb25maWcocGouUEpTSVBfVFJBTlNQT1JUX1RMUywgRmFsc2UpCisJCXNlbGYuYWNjb3VudHMgPSBbXQkJIyBBcnJheSBvZiBBY2NDb25maWcKKwkJCisJZGVmIGxvYWRGaWxlKHNlbGYsIGZpbGUpOgorCQlqc29uID0gcGouSnNvbkRvY3VtZW50KCkKKwkJanNvbi5sb2FkRmlsZShmaWxlKQorCQlyb290ID0ganNvbi5nZXRSb290Q29udGFpbmVyKCkKKwkJc2VsZi5lcENvbmZpZyA9IHBqLkVwQ29uZmlnKCkKKwkJc2VsZi5lcENvbmZpZy5yZWFkT2JqZWN0KHJvb3QpCisJCQorCQl0cF9ub2RlID0gcm9vdC5yZWFkQXJyYXkoInRyYW5zcG9ydHMiKQorCQlzZWxmLnVkcC5yZWFkT2JqZWN0KHRwX25vZGUpCisJCXNlbGYudGNwLnJlYWRPYmplY3QodHBfbm9kZSkKKwkJaWYgdHBfbm9kZS5oYXNVbnJlYWQoKToKKwkJCXNlbGYudGxzLnJlYWRPYmplY3QodHBfbm9kZSkKKwkJCQorCQlhY2Nfbm9kZSA9IHJvb3QucmVhZEFycmF5KCJhY2NvdW50cyIpCisJCXdoaWxlIGFjY19ub2RlLmhhc1VucmVhZCgpOgorCQkJYWNmZyA9IEFjY0NvbmZpZygpCisJCQlhY2ZnLnJlYWRPYmplY3QoYWNjX25vZGUpCisJCQlzZWxmLmFjY291bnRzLmFwcGVuZChhY2ZnKQorCQkJCisJZGVmIHNhdmVGaWxlKHNlbGYsZmlsZSk6CisJCWpzb24gPSBwai5Kc29uRG9jdW1lbnQoKQorCQkKKwkJIyBXcml0ZSBlbmRwb2ludCBjb25maWcKKwkJanNvbi53cml0ZU9iamVjdChzZWxmLmVwQ29uZmlnKQorCQkKKwkJIyBXcml0ZSB0cmFuc3BvcnQgY29uZmlnCisJCXRwX25vZGUgPSBqc29uLndyaXRlTmV3QXJyYXkoInRyYW5zcG9ydHMiKQorCQlzZWxmLnVkcC53cml0ZU9iamVjdCh0cF9ub2RlKQorCQlzZWxmLnRjcC53cml0ZU9iamVjdCh0cF9ub2RlKQorCQlzZWxmLnRscy53cml0ZU9iamVjdCh0cF9ub2RlKQorCQkKKwkJIyBXcml0ZSBhY2NvdW50IGNvbmZpZ3MKKwkJbm9kZSA9IGpzb24ud3JpdGVOZXdBcnJheSgiYWNjb3VudHMiKQorCQlmb3IgYWNjIGluIHNlbGYuYWNjb3VudHM6CisJCQlhY2Mud3JpdGVPYmplY3Qobm9kZSkKKwkJCQkKKwkJanNvbi5zYXZlRmlsZShmaWxlKQorCQkKKworIyBTZXR0aW5ncyBkaWFsb2cKK2NsYXNzIERpYWxvZyh0ay5Ub3BsZXZlbCk6CisJIiIiCisJVGhpcyBpbXBsZW1lbnRzIGFjY291bnQgc2V0dGluZ3MgZGlhbG9nIHRvIG1hbmlwdWxhdGUgYWNjb3VudCBzZXR0aW5ncy4KKwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCBjZmcpOgorCQl0ay5Ub3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisJCXNlbGYudHJhbnNpZW50KHBhcmVudCkKKwkJc2VsZi5wYXJlbnQgPSBwYXJlbnQKKwkJc2VsZi50aXRsZSgnU2V0dGluZ3MnKQorCQkKKwkJc2VsZi5mcm0gPSB0dGsuRnJhbWUoc2VsZikKKwkJc2VsZi5mcm0ucGFjayhleHBhbmQ9J3llcycsIGZpbGw9J2JvdGgnKQorCQkKKwkJc2VsZi5pc09rID0gRmFsc2UKKwkJc2VsZi5jZmcgPSBjZmcKKwkJCisJCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisJCisJZGVmIGRvTW9kYWwoc2VsZik6CisJCWlmIHNlbGYucGFyZW50OgorCQkJc2VsZi5wYXJlbnQud2FpdF93aW5kb3coc2VsZikKKwkJZWxzZToKKwkJCXNlbGYud2FpdF93aW5kb3coc2VsZikKKwkJcmV0dXJuIHNlbGYuaXNPaworCQkKKwlkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKKwkJIyBUaGUgbm90ZWJvb2sKKwkJc2VsZi5mcm0ucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlzZWxmLmZybS5yb3djb25maWd1cmUoMSwgd2VpZ2h0PTApCisJCXNlbGYuZnJtLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJc2VsZi5mcm0uY29sdW1uY29uZmlndXJlKDEsIHdlaWdodD0xKQorCQlzZWxmLndUYWIgPSB0dGsuTm90ZWJvb2soc2VsZi5mcm0pCisJCXNlbGYud1RhYi5ncmlkKGNvbHVtbj0wLCByb3c9MCwgY29sdW1uc3Bhbj0yLCBwYWR4PTEwLCBwYWR5PTEwLCBpcGFkeD0yMCwgaXBhZHk9MjAsIHN0aWNreT10ay5OK3RrLlMrdGsuVyt0ay5FKQorCQkKKwkJIyBNYWluIGJ1dHRvbnMKKwkJYnRuT2sgPSB0dGsuQnV0dG9uKHNlbGYuZnJtLCB0ZXh0PSdPaycsIGNvbW1hbmQ9c2VsZi5vbk9rKQorCQlidG5Pay5ncmlkKGNvbHVtbj0wLCByb3c9MSwgc3RpY2t5PXRrLkUsIHBhZHg9MjAsIHBhZHk9MTApCisJCWJ0bkNhbmNlbCA9IHR0ay5CdXR0b24oc2VsZi5mcm0sIHRleHQ9J0NhbmNlbCcsIGNvbW1hbmQ9c2VsZi5vbkNhbmNlbCkKKwkJYnRuQ2FuY2VsLmdyaWQoY29sdW1uPTEsIHJvdz0xLCBzdGlja3k9dGsuVywgcGFkeD0yMCwgcGFkeT0xMCkKKwkJCisJCSMgVGFicworCQlzZWxmLmNyZWF0ZUJhc2ljVGFiKCkKKwkJc2VsZi5jcmVhdGVOZXR3b3JrVGFiKCkKKwkJc2VsZi5jcmVhdGVNZWRpYVRhYigpCisKKwlkZWYgY3JlYXRlQmFzaWNUYWIoc2VsZik6CisJCSMgUHJlcGFyZSB0aGUgdmFyaWFibGVzIHRvIHNldC9yZWNlaXZlIHZhbHVlcyBmcm9tIEdVSQorCQlzZWxmLmNmZ0xvZ0ZpbGUgPSB0ay5TdHJpbmdWYXIodmFsdWU9c2VsZi5jZmcuZXBDb25maWcubG9nQ29uZmlnLmZpbGVuYW1lKQorCQlzZWxmLmNmZ0xvZ0FwcGVuZCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9VHJ1ZSBpZiAoc2VsZi5jZmcuZXBDb25maWcubG9nQ29uZmlnLmZpbGVGbGFncyAmIHBqLlBKX09fQVBQRU5EKSBlbHNlIEZhbHNlKQorCQkKKwkJIyBCdWlsZCB0aGUgdGFiIHBhZ2UKKwkJZnJtID0gdHRrLkZyYW1lKHNlbGYuZnJtKQorCQlmcm0uY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlmcm0uY29sdW1uY29uZmlndXJlKDEsIHdlaWdodD0yKQorCQlyb3cgPSAwCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1VzZXIgQWdlbnQ6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PXNlbGYuY2ZnLmVwQ29uZmlnLnVhQ29uZmlnLnVzZXJBZ2VudCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHk9MiwgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdNYXggY2FsbHM6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PXN0cihzZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5tYXhDYWxscykpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR5PTIsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nTG9nIGZpbGU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdMb2dGaWxlLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nQXBwZW5kIGxvZyBmaWxlJywgdmFyaWFibGU9c2VsZi5jZmdMb2dBcHBlbmQpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKworCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nQmFzaWMnKQorCQkKKwlkZWYgY3JlYXRlTmV0d29ya1RhYihzZWxmKToKKwkJc2VsZi5jZmdOYW1lc2VydmVyID0gdGsuU3RyaW5nVmFyKCkKKwkJaWYgbGVuKHNlbGYuY2ZnLmVwQ29uZmlnLnVhQ29uZmlnLm5hbWVzZXJ2ZXIpOgorCQkJc2VsZi5jZmdOYW1lc2VydmVyLnNldChzZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5uYW1lc2VydmVyWzBdKQorCQlzZWxmLmNmZ1N0dW5TZXJ2ZXIgPSB0ay5TdHJpbmdWYXIoKQorCQlpZiBsZW4oc2VsZi5jZmcuZXBDb25maWcudWFDb25maWcuc3R1blNlcnZlcik6CisJCQlzZWxmLmNmZ1N0dW5TZXJ2ZXIuc2V0KHNlbGYuY2ZnLmVwQ29uZmlnLnVhQ29uZmlnLnN0dW5TZXJ2ZXJbMF0pCisJCXNlbGYuY2ZnU3R1bklnbm9yZUVycm9yID0gdGsuQm9vbGVhblZhcih2YWx1ZT1zZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5zdHVuSWdub3JlRmFpbHVyZSkKKwkJCisJCXNlbGYuY2ZnVWRwRW5hYmxlZCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcudWRwLmVuYWJsZWQpCisJCXNlbGYuY2ZnVWRwUG9ydCA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy51ZHAuY29uZmlnLnBvcnQpCisJCXNlbGYuY2ZnVGNwRW5hYmxlZCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcudGNwLmVuYWJsZWQpCisJCXNlbGYuY2ZnVGNwUG9ydCA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy50Y3AuY29uZmlnLnBvcnQpCisJCXNlbGYuY2ZnVGxzRW5hYmxlZCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcudGxzLmVuYWJsZWQpCisJCXNlbGYuY2ZnVGxzUG9ydCA9IHRrLkludFZhcih2YWx1ZT1zZWxmLmNmZy50bHMuY29uZmlnLnBvcnQpCisJCQorCQlzZWxmLmNmZ1Rsc0NhRmlsZSA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1zZWxmLmNmZy50bHMuY29uZmlnLnRsc0NvbmZpZy5DYUxpc3RGaWxlKQorCQlzZWxmLmNmZ1Rsc0NlcnRGaWxlID0gdGsuU3RyaW5nVmFyKHZhbHVlPXNlbGYuY2ZnLnRscy5jb25maWcudGxzQ29uZmlnLmNlcnRGaWxlKQorCQlzZWxmLmNmZ1Rsc1ZlcmlmeUNsaWVudCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcudGxzLmNvbmZpZy50bHNDb25maWcudmVyaWZ5Q2xpZW50KQorCQlzZWxmLmNmZ1Rsc1ZlcmlmeVNlcnZlciA9IHRrLkJvb2xlYW5WYXIodmFsdWU9c2VsZi5jZmcudGxzLmNvbmZpZy50bHNDb25maWcudmVyaWZ5U2VydmVyKQorCQkKKwkJIyBCdWlsZCB0aGUgdGFiIHBhZ2UKKwkJZnJtID0gdHRrLkZyYW1lKHNlbGYuZnJtKQorCQlmcm0uY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorCQlmcm0uY29sdW1uY29uZmlndXJlKDEsIHdlaWdodD0yKQorCQlyb3cgPSAwCisJCSN0dGsuTGFiZWwoZnJtLCB0ZXh0PSdVRFAgdHJhbnNwb3J0OicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIsIHBhZHg9OCkKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nRW5hYmxlIFVEUCB0cmFuc3BvcnQnLCB2YXJpYWJsZT1zZWxmLmNmZ1VkcEVuYWJsZWQpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nVURQIHBvcnQ6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0ay5TcGluYm94KGZybSwgZnJvbV89MCwgdG89NjU1MzUsIHRleHR2YXJpYWJsZT1zZWxmLmNmZ1VkcFBvcnQsIHdpZHRoPTUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9JygwIGZvciBhbnkpJykuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLkUsIHBhZHk9NiwgcGFkeD02KQorCQlyb3cgKz0gMQorCQkjdHRrLkxhYmVsKGZybSwgdGV4dD0nVENQIHRyYW5zcG9ydDonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yLCBwYWR4PTgpCisJCXR0ay5DaGVja2J1dHRvbihmcm0sIHRleHQ9J0VuYWJsZSBUQ1AgdHJhbnNwb3J0JywgdmFyaWFibGU9c2VsZi5jZmdUY3BFbmFibGVkKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1RDUCBwb3J0OicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIsIHBhZHg9OCkKKwkJdGsuU3BpbmJveChmcm0sIGZyb21fPTAsIHRvPTY1NTM1LCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdUY3BQb3J0LCB3aWR0aD01KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PScoMCBmb3IgYW55KScpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5FLCBwYWR5PTYsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJI3R0ay5MYWJlbChmcm0sIHRleHQ9J1RMUyB0cmFuc3BvcnQ6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdFbmFibGUgVExTIHRyYW5zcG9ydCcsIHZhcmlhYmxlPXNlbGYuY2ZnVGxzRW5hYmxlZCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdUTFMgcG9ydDonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yLCBwYWR4PTgpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz0wLCB0bz02NTUzNSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnVGxzUG9ydCwgd2lkdGg9NSkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nKDAgZm9yIGFueSknKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSwgcGFkeT02LCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J1RMUyBDQSBmaWxlOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIsIHBhZHg9OCkKKwkJdHRrLkVudHJ5KGZybSwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnVGxzQ2FGaWxlLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nVExTIGNlcnQgZmlsZTonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yLCBwYWR4PTgpCisJCXR0ay5FbnRyeShmcm0sIHRleHR2YXJpYWJsZT1zZWxmLmNmZ1Rsc0NlcnRGaWxlLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nVExTIHZlcmlmeSBzZXJ2ZXInLCB2YXJpYWJsZT1zZWxmLmNmZ1Rsc1ZlcmlmeVNlcnZlcikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdUTFMgdmVyaWZ5IGNsaWVudCcsIHZhcmlhYmxlPXNlbGYuY2ZnVGxzVmVyaWZ5Q2xpZW50KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02LCBwYWR5PTIpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J0ROUyBhbmQgU1RVTjonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT0yLCBwYWR4PTgpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J05hbWVzZXJ2ZXI6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdOYW1lc2VydmVyLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nU1RVTiBTZXJ2ZXI6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuRW50cnkoZnJtLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdTdHVuU2VydmVyLCB3aWR0aD0zMikuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkNoZWNrYnV0dG9uKGZybSwgdGV4dD0nSWdub3JlIFNUVU4gZmFpbHVyZSBhdCBzdGFydHVwJywgdmFyaWFibGU9c2VsZi5jZmdTdHVuSWdub3JlRXJyb3IpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYsIHBhZHk9MikKKwkJCisJCXNlbGYud1RhYi5hZGQoZnJtLCB0ZXh0PSdOZXR3b3JrJykKKworCWRlZiBjcmVhdGVNZWRpYVRhYihzZWxmKToKKwkJc2VsZi5jZmdDbG9ja3JhdGUgPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLmNsb2NrUmF0ZSkKKwkJc2VsZi5jZmdTbmRDbG9ja3JhdGUgPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLnNuZENsb2NrUmF0ZSkKKwkJc2VsZi5jZmdBdWRpb1B0aW1lID0gdGsuSW50VmFyKHZhbHVlPXNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5hdWRpb0ZyYW1lUHRpbWUpCisJCXNlbGYuY2ZnTWVkaWFRdWFsaXR5ID0gdGsuSW50VmFyKHZhbHVlPXNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5xdWFsaXR5KQorCQlzZWxmLmNmZ0NvZGVjUHRpbWUgPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLnB0aW1lKQorCQlzZWxmLmNmZ1ZhZCA9IHRrLkJvb2xlYW5WYXIodmFsdWU9bm90IHNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5ub1ZhZCkKKwkJc2VsZi5jZmdFY1RhaWxMZW4gPSB0ay5JbnRWYXIodmFsdWU9c2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLmVjVGFpbExlbikKKwkJCisJCSMgQnVpbGQgdGhlIHRhYiBwYWdlCisJCWZybSA9IHR0ay5GcmFtZShzZWxmLmZybSkKKwkJZnJtLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKwkJZnJtLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MikKKwkJcm93ID0gMAorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdNYXggbWVkaWEgcG9ydHM6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PXN0cihzZWxmLmNmZy5lcENvbmZpZy5tZWRDb25maWcubWF4TWVkaWFQb3J0cykpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR5PTIsIHBhZHg9NikKKwkJcm93ICs9IDEKKwkJdHRrLkxhYmVsKGZybSwgdGV4dD0nQ29yZSBjbG9jayByYXRlOicpLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT10ay5FLCBwYWR5PTIsIHBhZHg9OCkKKwkJdGsuU3BpbmJveChmcm0sIGZyb21fPTgwMDAsIHRvPTQ4MDAwLCBpbmNyZW1lbnQ9ODAwMCwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnQ2xvY2tyYXRlLCB3aWR0aD01KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdTbmQgZGV2aWNlIGNsb2NrIHJhdGU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0ay5TcGluYm94KGZybSwgZnJvbV89MCwgdG89NDgwMDAsIGluY3JlbWVudD04MDAwLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdTbmRDbG9ja3JhdGUsIHdpZHRoPTUpLmdyaWQocm93PXJvdywgY29sdW1uPTEsIHN0aWNreT10ay5XLCBwYWR4PTYpCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9JygwOiBmb2xsb3cgY29yZSknKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSwgcGFkeT02LCBwYWR4PTYpCisJCXJvdyArPSAxCisJCXR0ay5MYWJlbChmcm0sIHRleHQ9J0NvcmUgcHRpbWU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0ay5TcGluYm94KGZybSwgZnJvbV89MTAsIHRvPTQwMCwgaW5jcmVtZW50PTEwLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdBdWRpb1B0aW1lLCB3aWR0aD0zKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdSVFAgcHRpbWU6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0ay5TcGluYm94KGZybSwgZnJvbV89MjAsIHRvPTQwMCwgaW5jcmVtZW50PTEwLCB0ZXh0dmFyaWFibGU9c2VsZi5jZmdDb2RlY1B0aW1lLCB3aWR0aD0zKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdNZWRpYSBxdWFsaXR5ICgxLTEwKTonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yLCBwYWR4PTgpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz0xLCB0bz0xMCwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnTWVkaWFRdWFsaXR5LCB3aWR0aD01KS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdWQUQ6JykuZ3JpZChyb3c9cm93LCBjb2x1bW49MCwgc3RpY2t5PXRrLkUsIHBhZHk9MiwgcGFkeD04KQorCQl0dGsuQ2hlY2tidXR0b24oZnJtLCB0ZXh0PSdFbmFibGUnLCB2YXJpYWJsZT1zZWxmLmNmZ1ZhZCkuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PXRrLlcsIHBhZHg9NiwgcGFkeT0yKQorCQlyb3cgKz0gMQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PSdFY2hvIGNhbmNlbGxlciB0YWlsIGxlbmd0aDonKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9dGsuRSwgcGFkeT0yLCBwYWR4PTgpCisJCXRrLlNwaW5ib3goZnJtLCBmcm9tXz0wLCB0bz00MDAsIGluY3JlbWVudD0xMCwgdGV4dHZhcmlhYmxlPXNlbGYuY2ZnRWNUYWlsTGVuLCB3aWR0aD0zKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeD02KQorCQl0dGsuTGFiZWwoZnJtLCB0ZXh0PScobXMsIDAgdG8gZGlzYWJsZSknKS5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9dGsuRSwgcGFkeT02LCBwYWR4PTYpCisJCQorCQlzZWxmLndUYWIuYWRkKGZybSwgdGV4dD0nTWVkaWEnKQorCisJZGVmIG9uT2soc2VsZik6CisJCSMgQ2hlY2sgYmFzaWMgc2V0dGluZ3MKKwkJZXJyb3JzID0gIiI7CisJCWlmIGVycm9yczoKKwkJCW1zZ2JveC5zaG93ZXJyb3IoIkVycm9yIGRldGVjdGVkOiIsIGVycm9ycykKKwkJCXJldHVybgorCQkKKwkJIyBCYXNpYyBzZXR0aW5ncworCQlzZWxmLmNmZy5lcENvbmZpZy5sb2dDb25maWcuZmlsZW5hbWUgPSBzZWxmLmNmZ0xvZ0ZpbGUuZ2V0KCkKKwkJZmxhZ3MgPSBwai5QSl9PX0FQUEVORCBpZiBzZWxmLmNmZ0xvZ0FwcGVuZC5nZXQoKSBlbHNlIDAKKwkJc2VsZi5jZmcuZXBDb25maWcubG9nQ29uZmlnLmZpbGVGbGFncyA9IHNlbGYuY2ZnLmVwQ29uZmlnLmxvZ0NvbmZpZy5maWxlRmxhZ3MgfCBmbGFncyAKKwkJCisJCSMgTmV0d29yayBzZXR0aW5ncworCQlzZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5uYW1lc2VydmVyLmNsZWFyKCkKKwkJaWYgbGVuKHNlbGYuY2ZnTmFtZXNlcnZlci5nZXQoKSk6IAorCQkJc2VsZi5jZmcuZXBDb25maWcudWFDb25maWcubmFtZXNlcnZlci5hcHBlbmQoc2VsZi5jZmdOYW1lc2VydmVyLmdldCgpKQorCQlzZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5zdHVuU2VydmVyLmNsZWFyKCkKKwkJaWYgbGVuKHNlbGYuY2ZnU3R1blNlcnZlci5nZXQoKSk6CisJCQlzZWxmLmNmZy5lcENvbmZpZy51YUNvbmZpZy5zdHVuU2VydmVyLmFwcGVuZChzZWxmLmNmZ1N0dW5TZXJ2ZXIuZ2V0KCkpCisJCQkKKwkJc2VsZi5jZmcuZXBDb25maWcudWFDb25maWcuc3R1bklnbm9yZUZhaWx1cmUgPSBzZWxmLmNmZ1N0dW5JZ25vcmVFcnJvci5nZXQoKQorCQkKKwkJc2VsZi5jZmcudWRwLmVuYWJsZWQgCT0gc2VsZi5jZmdVZHBFbmFibGVkLmdldCgpCisJCXNlbGYuY2ZnLnVkcC5jb25maWcucG9ydCA9IHNlbGYuY2ZnVWRwUG9ydC5nZXQoKQorCQlzZWxmLmNmZy50Y3AuZW5hYmxlZCAJPSBzZWxmLmNmZ1RjcEVuYWJsZWQuZ2V0KCkKKwkJc2VsZi5jZmcudGNwLmNvbmZpZy5wb3J0ID0gc2VsZi5jZmdUY3BQb3J0LmdldCgpCisJCXNlbGYuY2ZnLnRscy5lbmFibGVkIAk9IHNlbGYuY2ZnVGxzRW5hYmxlZC5nZXQoKQorCQlzZWxmLmNmZy50bHMuY29uZmlnLnBvcnQgPSBzZWxmLmNmZ1Rsc1BvcnQuZ2V0KCkKKwkJCisJCXNlbGYuY2ZnLnRscy5jb25maWcudGxzQ29uZmlnLkNhTGlzdEZpbGUgPSBzZWxmLmNmZ1Rsc0NhRmlsZS5nZXQoKQorCQlzZWxmLmNmZy50bHMuY29uZmlnLnRsc0NvbmZpZy5jZXJ0RmlsZSAgID0gc2VsZi5jZmdUbHNDZXJ0RmlsZS5nZXQoKQorCQlzZWxmLmNmZy50bHMuY29uZmlnLnRsc0NvbmZpZy52ZXJpZnlDbGllbnQgPSBzZWxmLmNmZ1Rsc1ZlcmlmeUNsaWVudC5nZXQoKQorCQlzZWxmLmNmZy50bHMuY29uZmlnLnRsc0NvbmZpZy52ZXJpZnlTZXJ2ZXIgPSBzZWxmLmNmZ1Rsc1ZlcmlmeVNlcnZlci5nZXQoKQorCisJCSMgTWVkaWEKKwkJc2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLmNsb2NrUmF0ZQk9IHNlbGYuY2ZnQ2xvY2tyYXRlLmdldCgpCisJCXNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5zbmRDbG9ja1JhdGUgPSBzZWxmLmNmZ1NuZENsb2NrcmF0ZS5nZXQoKQorCQlzZWxmLmNmZy5lcENvbmZpZy5tZWRDb25maWcuYXVkaW9GcmFtZVB0aW1lID0gc2VsZi5jZmdBdWRpb1B0aW1lLmdldCgpCisJCXNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5xdWFsaXR5CT0gc2VsZi5jZmdNZWRpYVF1YWxpdHkuZ2V0KCkKKwkJc2VsZi5jZmcuZXBDb25maWcubWVkQ29uZmlnLnB0aW1lCT0gc2VsZi5jZmdDb2RlY1B0aW1lLmdldCgpCisJCXNlbGYuY2ZnLmVwQ29uZmlnLm1lZENvbmZpZy5ub1ZhZAk9IG5vdCBzZWxmLmNmZ1ZhZC5nZXQoKQorCQlzZWxmLmNmZy5lcENvbmZpZy5tZWRDb25maWcuZWNUYWlsTGVuCT0gc2VsZi5jZmdFY1RhaWxMZW4uZ2V0KCkKKwkJCisJCXNlbGYuaXNPayA9IFRydWUKKwkJc2VsZi5kZXN0cm95KCkKKwkJCisJZGVmIG9uQ2FuY2VsKHNlbGYpOgorCQlzZWxmLmRlc3Ryb3koKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisJI2FwcGxpY2F0aW9uLm1haW4oKQorCWFjZmcgPSBBcHBDb25maWcoKQorCWFjZmcubG9hZEZpbGUoJ3B5Z3VpLmpzJykKKworCWRsZyA9IERpYWxvZyhOb25lLCBhY2ZnKQorCWlmIGRsZy5kb01vZGFsKCk6CisJCWFjZmcuc2F2ZUZpbGUoJ3B5Z3VpLmpzJykKKwkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL01ha2VmaWxlIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTdlODEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorYWxsOgorCXB5dGhvbiBzZXR1cC5weSBidWlsZAorCitjbGVhbiBkaXN0Y2xlYW4gcmVhbGNsZWFuOgorCXB5dGhvbiBzZXR1cC5weSBjbGVhbgorCXJtIC1yZiAuL2J1aWxkCisKK2luc3RhbGw6CisJcHl0aG9uIHNldHVwLnB5ICRACisKK2RlcCBkb2M6CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9fcGpzdWEuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9fcGpzdWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2I3MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL19wanN1YS5jCkBAIC0wLDAgKzEsNDYxNSBAQAorLyogJElkOiBfcGpzdWEuYyA0NjA5IDIwMTMtMTAtMDIgMDM6MTk6NTRaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgIl9wanN1YS5oIgorCisjZGVmaW5lIFRISVNfRklMRSAgICAibWFpbi5jIgorI2RlZmluZSBQT09MX1NJWkUgICAgNTEyCisjZGVmaW5lIFNORF9ERVZfTlVNICA2NAorI2RlZmluZSBTTkRfTkFNRV9MRU4gIDY0CisKKy8qIExJQiBCQVNFICovCisKK3N0YXRpYyBQeU9iamVjdCogZ19vYmpfbG9nX2NiOworc3RhdGljIGxvbmcgZ190aHJlYWRfaWQ7CitzdGF0aWMgc3RydWN0IHB5X3RocmVhZF9kZXNjCit7CisgICAgc3RydWN0IHB5X3RocmVhZF9kZXNjICpuZXh0OworICAgIHBqX3RocmVhZF9kZXNjCSAgIGRlc2M7Cit9ICpweV90aHJlYWRfZGVzYzsKKworLyoKKyAqIFRoZSBnbG9iYWwgY2FsbGJhY2sgb2JqZWN0LgorICovCitzdGF0aWMgUHlPYmpfcGpzdWFfY2FsbGJhY2sgKiBnX29ial9jYWxsYmFjazsKKworLyogU2V0IHRoaXMgdG8gMSBpZiBhbGwgdGhyZWFkcyBhcmUgY3JlYXRlZCBieSBQeXRob24gKi8KKyNkZWZpbmUgTk9fUEpTSVBfVEhSRUFEIDEKKworI2lmIE5PX1BKU0lQX1RIUkVBRAorIyAgIGRlZmluZSBFTlRFUl9QWVRIT04oKQorIyAgIGRlZmluZSBMRUFWRV9QWVRIT04oKQorI2Vsc2UKKyMgICBkZWZpbmUgRU5URVJfUFlUSE9OKCkgICBQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKQorIyAgIGRlZmluZSBMRUFWRV9QWVRIT04oKSAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSkKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGNsZWFyX3B5X3RocmVhZF9kZXNjKHZvaWQpCit7CisgICAgd2hpbGUgKHB5X3RocmVhZF9kZXNjKSB7CisJc3RydWN0IHB5X3RocmVhZF9kZXNjICpuZXh0ID0gcHlfdGhyZWFkX2Rlc2MtPm5leHQ7CisJZnJlZShweV90aHJlYWRfZGVzYyk7CisJcHlfdGhyZWFkX2Rlc2MgPSBuZXh0OworICAgIH0KK30KKworCisvKgorICogY2JfbG9nX2NiCisgKiBkZWNsYXJlcyBtZXRob2QgZm9yIHJlY29uZmlndXJpbmcgbG9nZ2luZyBwcm9jZXNzIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2JfbG9nX2NiKGludCBsZXZlbCwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwkKKyAgICAvKiBJZ25vcmUgaWYgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgZnJvbSBhbGllbiB0aHJlYWQgY29udGV4dCwKKyAgICAgKiBvciBvdGhlcndpc2UgaXQgd2lsbCBjcmFzaCBQeXRob24uCisgICAgICovCisgICAgaWYgKHBqX3RocmVhZF9sb2NhbF9nZXQoZ190aHJlYWRfaWQpID09IDApCisJcmV0dXJuOworCisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfbG9nX2NiKSkgeworCVB5T2JqZWN0ICpwYXJhbV9kYXRhOworCisJRU5URVJfUFlUSE9OKCk7CisKKwlwYXJhbV9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgbGVuKTsKKworICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCisgICAgICAgICAgICBnX29ial9sb2dfY2IsIAorCSAgICAiaU9pIiwKKwkgICAgbGV2ZWwsCisgICAgICAgICAgICBwYXJhbV9kYXRhLCAKKwkgICAgbGVuLCAKKwkgICAgTlVMTAorICAgICAgICApOworCisJUHlfREVDUkVGKHBhcmFtX2RhdGEpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisvKgorICogY2Jfb25fY2FsbF9zdGF0ZQorICogZGVjbGFyZXMgbWV0aG9kIG9uX2NhbGxfc3RhdGUgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX3N0YXRlKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgcGpzaXBfZXZlbnQgKmUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhlKTsKKworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3N0YXRlKSkgewkKKyAgICAgICAgUHlPYmplY3QgKiBvYmo7CisKKwlFTlRFUl9QWVRIT04oKTsKKworCW9iaiA9IFB5X0J1aWxkVmFsdWUoIiIpOworCQkKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfc3RhdGUsCisJICAgICJpTyIsCisJICAgIGNhbGxfaWQsCisJICAgIG9iaiwKKwkgICAgTlVMTAorICAgICAgICApOworCisJUHlfREVDUkVGKG9iaik7CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGNiX29uX2luY29taW5nX2NhbGwKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9pbmNvbWluZ19jYWxsIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25faW5jb21pbmdfY2FsbChwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkJcGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX2luY29taW5nX2NhbGwpKSB7CisJUHlPYmpfcGpzaXBfcnhfZGF0YSAqb2JqOworCQorCUVOVEVSX1BZVEhPTigpOworCQorCW9iaiA9IChQeU9ial9wanNpcF9yeF9kYXRhKikKKwkgICAgICBQeU9ial9wanNpcF9yeF9kYXRhX25ldygmUHlUeXBfcGpzaXBfcnhfZGF0YSwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlQeU9ial9wanNpcF9yeF9kYXRhX2ltcG9ydChvYmosIHJkYXRhKTsKKworCVB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2luY29taW5nX2NhbGwsCisJICAgICJpaU8iLAorCSAgICBhY2NfaWQsCisJICAgIGNhbGxfaWQsCisJICAgIG9iaiwKKwkgICAgTlVMTAorCSk7CisKKwlQeV9ERUNSRUYob2JqKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fY2FsbF9tZWRpYV9zdGF0ZQorICogZGVjbGFyZXMgbWV0aG9kIG9uX2NhbGxfbWVkaWFfc3RhdGUgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX21lZGlhX3N0YXRlKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fY2FsbF9tZWRpYV9zdGF0ZSkpIHsKKworCUVOVEVSX1BZVEhPTigpOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfbWVkaWFfc3RhdGUsCisJICAgICJpIiwKKwkgICAgY2FsbF9pZCwKKwkgICAgTlVMTAorCSk7CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIGNiX29uX2R0bWZfZGlnaXQoKQorICogQ2FsbGJhY2sgZnJvbSBQSlNVQS1MSUIgb24gcmVjZWl2aW5nIERUTUYgZGlnaXQKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fZHRtZl9kaWdpdChwanN1YV9jYWxsX2lkIGNhbGxfaWQsIGludCBkaWdpdCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fZHRtZl9kaWdpdCkpIHsKKwljaGFyIGRpZ2l0X3N0clsxMF07CisKKwlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworCXBqX2Fuc2lfc25wcmludGYoZGlnaXRfc3RyLCBzaXplb2YoZGlnaXRfc3RyKSwgIiVjIiwgZGlnaXQpOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2R0bWZfZGlnaXQsCisJICAgICJpcyIsCisJICAgIGNhbGxfaWQsCisJICAgIGRpZ2l0X3N0ciwKKwkgICAgTlVMTAorCSk7CisKKwlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIH0KK30KKworCisvKgorICogTm90aWZ5IGFwcGxpY2F0aW9uIG9uIGNhbGwgYmVpbmcgdHJhbnNmZXJlZC4KKyAqICFtb2RpZmllZCBAMDYxMjA2CisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdChwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkJICAgICAgICBjb25zdCBwal9zdHJfdCAqZHN0LAorCQkJCSAgICAgICAgcGpzaXBfc3RhdHVzX2NvZGUgKmNvZGUpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCkpIHsKKwlQeU9iamVjdCAqcmV0LCAqcGFyYW1fZHN0OworCWludCBjZDsKKworCUVOVEVSX1BZVEhPTigpOworCisJcGFyYW1fZHN0ID0gUHlTdHJpbmdfRnJvbVBKKGRzdCk7CisKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCQkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCwKKwkJICAgICJpT2kiLAorCQkgICAgY2FsbF9pZCwKKwkJICAgIHBhcmFtX2RzdCwKKwkJICAgICpjb2RlLAorCQkgICAgTlVMTAorCQkpOworCisJUHlfREVDUkVGKHBhcmFtX2RzdCk7CisKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkgICAgaWYgKHJldCAhPSBQeV9Ob25lKSB7CisJCWlmIChQeUFyZ19QYXJzZShyZXQsImkiLCZjZCkpIHsKKwkJICAgICpjb2RlID0gY2Q7CisJCX0KKwkgICAgfQorCSAgICBQeV9ERUNSRUYocmV0KTsKKwl9CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIE5vdGlmeSBhcHBsaWNhdGlvbiBvZiB0aGUgc3RhdHVzIG9mIHByZXZpb3VzbHkgc2VudCBjYWxsCisgKiB0cmFuc2ZlciByZXF1ZXN0LiBBcHBsaWNhdGlvbiBjYW4gbW9uaXRvciB0aGUgc3RhdHVzIG9mIHRoZQorICogY2FsbCB0cmFuc2ZlciByZXF1ZXN0LCBmb3IgZXhhbXBsZSB0byBkZWNpZGUgd2hldGhlciB0byAKKyAqIHRlcm1pbmF0ZSBleGlzdGluZyBjYWxsLgorICogIW1vZGlmaWVkIEAwNjEyMDYKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fY2FsbF90cmFuc2Zlcl9zdGF0dXMoIHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwKKwkJCQkJaW50IHN0YXR1c19jb2RlLAorCQkJCQljb25zdCBwal9zdHJfdCAqc3RhdHVzX3RleHQsCisJCQkJCXBqX2Jvb2xfdCBmaW5hbCwKKwkJCQkJcGpfYm9vbF90ICpwX2NvbnQpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKSkgeworCVB5T2JqZWN0ICpyZXQsICpwYXJhbV9yZWFzb247CisKKwlFTlRFUl9QWVRIT04oKTsKKworCXBhcmFtX3JlYXNvbiA9IFB5U3RyaW5nX0Zyb21QSihzdGF0dXNfdGV4dCk7CisKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCQkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfdHJhbnNmZXJfc3RhdHVzLAorCQkgICAgImlpT2lpIiwKKwkJICAgIGNhbGxfaWQsCisJCSAgICBzdGF0dXNfY29kZSwKKwkJICAgIHBhcmFtX3JlYXNvbiwKKwkJICAgIGZpbmFsLAorCQkgICAgKnBfY29udCwKKwkJICAgIE5VTEwKKwkJKTsKKworCVB5X0RFQ1JFRihwYXJhbV9yZWFzb24pOworCisJaWYgKHJldCAhPSBOVUxMKSB7CisJICAgIGlmIChyZXQgIT0gUHlfTm9uZSkgeworCQlpbnQgY250OworCQlpZiAoUHlBcmdfUGFyc2UocmV0LCJpIiwmY250KSkgeworCQkgICAgKnBfY29udCA9IGNudDsKKwkJfQorCSAgICB9CisJICAgIFB5X0RFQ1JFRihyZXQpOworCX0KKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogTm90aWZ5IGFwcGxpY2F0aW9uIGFib3V0IGluY29taW5nIElOVklURSB3aXRoIFJlcGxhY2VzIGhlYWRlci4KKyAqIEFwcGxpY2F0aW9uIG1heSByZWplY3QgdGhlIHJlcXVlc3QgYnkgc2V0dGluZyBub24tMnh4IGNvZGUuCisgKiAhbW9kaWZpZWQgQDA2MTIwNgorICovCitzdGF0aWMgdm9pZCBjYl9vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCggcGpzdWFfY2FsbF9pZCBjYWxsX2lkLAorCQkJCQlwanNpcF9yeF9kYXRhICpyZGF0YSwKKwkJCQkJaW50ICpzdF9jb2RlLAorCQkJCQlwal9zdHJfdCAqc3RfdGV4dCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHJkYXRhKTsKKworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCkpIHsKKwlQeU9iamVjdCAqcmV0LCAqcGFyYW1fcmVhc29uLCAqcGFyYW1fcmRhdGE7CisJaW50IGNkOworCisJRU5URVJfUFlUSE9OKCk7CisKKwlwYXJhbV9yZWFzb24gPSBQeVN0cmluZ19Gcm9tUEooc3RfdGV4dCk7CisJcGFyYW1fcmRhdGEgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKworICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCisJCSAgICBnX29ial9jYWxsYmFjay0+b25fY2FsbF9yZXBsYWNlX3JlcXVlc3QsCisJCSAgICAiaU9pTyIsCisJCSAgICBjYWxsX2lkLAorCQkgICAgcGFyYW1fcmRhdGEsCisJCSAgICAqc3RfY29kZSwKKwkJICAgIHBhcmFtX3JlYXNvbiwKKwkJICAgIE5VTEwKKwkJKTsKKworCVB5X0RFQ1JFRihwYXJhbV9yZGF0YSk7CisJUHlfREVDUkVGKHBhcmFtX3JlYXNvbik7CisKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkgICAgaWYgKHJldCAhPSBQeV9Ob25lKSB7CisJCVB5T2JqZWN0ICogdHh0OworCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShyZXQsImlPIiwmY2QsICZ0eHQpKSB7CisJCSAgICAqc3RfY29kZSA9IGNkOworCQkgICAgKnN0X3RleHQgPSBQeVN0cmluZ19Ub1BKKHR4dCk7CisJCX0KKwkgICAgfQorCSAgICBQeV9ERUNSRUYocmV0KTsKKwl9CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKworLyoKKyAqIE5vdGlmeSBhcHBsaWNhdGlvbiB0aGF0IGFuIGV4aXN0aW5nIGNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aAorICogYSBuZXcgY2FsbC4gVGhpcyBoYXBwZW5zIHdoZW4gUEpTVUEtQVBJIHJlY2VpdmVzIGluY29taW5nIElOVklURQorICogcmVxdWVzdCB3aXRoIFJlcGxhY2VzIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQgY2Jfb25fY2FsbF9yZXBsYWNlZChwanN1YV9jYWxsX2lkIG9sZF9jYWxsX2lkLAorCQkJCXBqc3VhX2NhbGxfaWQgbmV3X2NhbGxfaWQpCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfcmVwbGFjZWQpKSB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorICAgICAgICAgICAgZ19vYmpfY2FsbGJhY2stPm9uX2NhbGxfcmVwbGFjZWQsCisJICAgICJpaSIsCisJICAgIG9sZF9jYWxsX2lkLAorCSAgICBuZXdfY2FsbF9pZCwKKwkgICAgTlVMTAorICAgICAgICApOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBjYl9vbl9yZWdfc3RhdGUKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9yZWdfc3RhdGUgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9yZWdfc3RhdGUocGpzdWFfYWNjX2lkIGFjY19pZCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fcmVnX3N0YXRlKSkgeworCUVOVEVSX1BZVEhPTigpOworCisgICAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkgICAgZ19vYmpfY2FsbGJhY2stPm9uX3JlZ19zdGF0ZSwKKwkgICAgImkiLAorCSAgICBhY2NfaWQsCisJICAgIE5VTEwKKwkpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisvKiAKKyAqIGNiX29uX2luY29taW5nX3N1YnNjcmliZQorICovCitzdGF0aWMgdm9pZCBjYl9vbl9pbmNvbWluZ19zdWJzY3JpYmUoIHBqc3VhX2FjY19pZCBhY2NfaWQsCisJCQkJICAgICAgcGpzdWFfc3J2X3ByZXMgKnNydl9wcmVzLAorCQkJCSAgICAgIHBqc3VhX2J1ZGR5X2lkIGJ1ZGR5X2lkLAorCQkJCSAgICAgIGNvbnN0IHBqX3N0cl90ICpmcm9tLAorCQkJCSAgICAgIHBqc2lwX3J4X2RhdGEgKnJkYXRhLAorCQkJCSAgICAgIHBqc2lwX3N0YXR1c19jb2RlICpjb2RlLAorCQkJCSAgICAgIHBqX3N0cl90ICpyZWFzb24sCisJCQkJICAgICAgcGpzdWFfbXNnX2RhdGEgKm1zZ19kYXRhKQoreworICAgIHN0YXRpYyBjaGFyIHJlYXNvbl9idWZbNjRdOworCisgICAgUEpfVU5VU0VEX0FSRyhyZGF0YSk7CisgICAgUEpfVU5VU0VEX0FSRyhtc2dfZGF0YSk7CisKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25faW5jb21pbmdfc3Vic2NyaWJlKSkgeworCVB5T2JqZWN0ICpyZXQsICpwYXJhbV9mcm9tLCAqcGFyYW1fY29udGFjdCwgKnBhcmFtX3Nydl9wcmVzOworCXBqc2lwX2NvbnRhY3RfaGRyICpjb250YWN0X2hkcjsKKwlwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisJRU5URVJfUFlUSE9OKCk7CisKKwlwYXJhbV9mcm9tID0gUHlTdHJpbmdfRnJvbVBKKGZyb20pOworCXBhcmFtX3Nydl9wcmVzID0gUHlMb25nX0Zyb21Mb25nKChsb25nKXNydl9wcmVzKTsKKworCWNvbnRhY3RfaGRyID0gKHBqc2lwX2NvbnRhY3RfaGRyKikKKwkJICAgICAgcGpzaXBfbXNnX2ZpbmRfaGRyKHJkYXRhLT5tc2dfaW5mby5tc2csIFBKU0lQX0hfQ09OVEFDVCwKKwkJCQkJIE5VTEwpOworCWlmIChjb250YWN0X2hkcikgeworCSAgICBjaGFyICpjb250YWN0OworCSAgICBpbnQgbGVuOworCisJICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCA1MTIsIDUxMik7CisJICAgIGNvbnRhY3QgPSAoY2hhciopIHBqX3Bvb2xfYWxsb2MocG9vbCwgUEpTSVBfTUFYX1VSTF9TSVpFKzEpOworCSAgICBsZW4gPSBwanNpcF91cmlfcHJpbnQoUEpTSVBfVVJJX0lOX0NPTlRBQ1RfSERSLCBjb250YWN0X2hkci0+dXJpLCAKKwkJCQkgIGNvbnRhY3QsIFBKU0lQX01BWF9VUkxfU0laRSk7CisJICAgIGlmIChsZW4gPCAxKQorCQlsZW4gPSAwOworCSAgICBjb250YWN0W2xlbl0gPSAnXDAnOworCisJICAgIHBhcmFtX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb250YWN0LCBsZW4pOworCX0gZWxzZSB7CisJICAgIHBhcmFtX2NvbnRhY3QgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKwl9CisKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCQkgICAgZ19vYmpfY2FsbGJhY2stPm9uX2luY29taW5nX3N1YnNjcmliZSwKKwkJICAgICJpaU9PTyIsCisJCSAgICBhY2NfaWQsCisJCSAgICBidWRkeV9pZCwKKwkJICAgIHBhcmFtX2Zyb20sCisJCSAgICBwYXJhbV9jb250YWN0LAorCQkgICAgcGFyYW1fc3J2X3ByZXMsCisJCSAgICBOVUxMCisJCSk7CisKKwlpZiAocG9vbCkKKwkgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisJUHlfREVDUkVGKHBhcmFtX2Zyb20pOworCVB5X0RFQ1JFRihwYXJhbV9jb250YWN0KTsKKwlQeV9ERUNSRUYocGFyYW1fc3J2X3ByZXMpOworCisJaWYgKHJldCAmJiBQeVR1cGxlX0NoZWNrKHJldCkpIHsKKwkgICAgaWYgKFB5VHVwbGVfU2l6ZShyZXQpID49IDEpCisJCSpjb2RlID0gKGludClQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHJldCwgMCkpOworCSAgICBpZiAoUHlUdXBsZV9TaXplKHJldCkgPj0gMikgeworCQlpZiAoUHlUdXBsZV9HZXRJdGVtKHJldCwgMSkgIT0gUHlfTm9uZSkgeworCQkgICAgcGpfc3RyX3QgdG1wOworCQkgICAgdG1wID0gUHlTdHJpbmdfVG9QSihQeVR1cGxlX0dldEl0ZW0ocmV0LCAxKSk7CisJCSAgICByZWFzb24tPnB0ciA9IHJlYXNvbl9idWY7CisJCSAgICBwal9zdHJuY3B5KHJlYXNvbiwgJnRtcCwgc2l6ZW9mKHJlYXNvbl9idWYpKTsKKwkJfSBlbHNlIHsKKwkJICAgIHJlYXNvbi0+c2xlbiA9IDA7CisJCX0KKwkgICAgfQorCSAgICBQeV9YREVDUkVGKHJldCk7CisJfSBlbHNlIGlmIChyZXQpIHsKKwkgICAgUHlfWERFQ1JFRihyZXQpOworCX0KKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworLyoKKyAqIGNiX29uX2J1ZGR5X3N0YXRlCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fYnVkZHkgc3RhdGUgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBjYl9vbl9idWRkeV9zdGF0ZShwanN1YV9idWRkeV9pZCBidWRkeV9pZCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fYnVkZHlfc3RhdGUpKSB7CisJRU5URVJfUFlUSE9OKCk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCSAgICBnX29ial9jYWxsYmFjay0+b25fYnVkZHlfc3RhdGUsCisJICAgICJpIiwKKwkgICAgYnVkZHlfaWQsCisJICAgIE5VTEwKKwkpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisvKgorICogY2Jfb25fcGFnZXIKKyAqIGRlY2xhcmVzIG1ldGhvZCBvbl9wYWdlciBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX3BhZ2VyKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgY29uc3QgcGpfc3RyX3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal9zdHJfdCAqdG8sIGNvbnN0IHBqX3N0cl90ICpjb250YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfc3RyX3QgKm1pbWVfdHlwZSwgY29uc3QgcGpfc3RyX3QgKmJvZHksCisJCQlwanNpcF9yeF9kYXRhICpyZGF0YSwgcGpzdWFfYWNjX2lkIGFjY19pZCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHJkYXRhKTsKKworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl9wYWdlcikpIHsKKwlQeU9iamVjdCAqcGFyYW1fZnJvbSwgKnBhcmFtX3RvLCAqcGFyYW1fY29udGFjdCwgKnBhcmFtX21pbWVfdHlwZSwKKwkJICpwYXJhbV9ib2R5OworCisJRU5URVJfUFlUSE9OKCk7CisKKwlwYXJhbV9mcm9tID0gUHlTdHJpbmdfRnJvbVBKKGZyb20pOworCXBhcmFtX3RvID0gUHlTdHJpbmdfRnJvbVBKKHRvKTsKKwlwYXJhbV9jb250YWN0ID0gUHlTdHJpbmdfRnJvbVBKKGNvbnRhY3QpOworCXBhcmFtX21pbWVfdHlwZSA9IFB5U3RyaW5nX0Zyb21QSihtaW1lX3R5cGUpOworCXBhcmFtX2JvZHkgPSBQeVN0cmluZ19Gcm9tUEooYm9keSk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKAorCQlnX29ial9jYWxsYmFjay0+b25fcGFnZXIsCisJCSJpT09PT09pIiwKKwkJY2FsbF9pZCwKKwkJcGFyYW1fZnJvbSwKKwkJcGFyYW1fdG8sCisJCXBhcmFtX2NvbnRhY3QsCisJCXBhcmFtX21pbWVfdHlwZSwKKwkJcGFyYW1fYm9keSwgCisJCWFjY19pZCwKKwkJTlVMTAorCSAgICApOworCisJUHlfREVDUkVGKHBhcmFtX2JvZHkpOworCVB5X0RFQ1JFRihwYXJhbV9taW1lX3R5cGUpOworCVB5X0RFQ1JFRihwYXJhbV9jb250YWN0KTsKKwlQeV9ERUNSRUYocGFyYW1fdG8pOworCVB5X0RFQ1JFRihwYXJhbV9mcm9tKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fcGFnZXJfc3RhdHVzCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fcGFnZXJfc3RhdHVzIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fcGFnZXJfc3RhdHVzKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgY29uc3QgcGpfc3RyX3QgKnRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal9zdHJfdCAqYm9keSwgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwanNpcF9zdGF0dXNfY29kZSBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3N0cl90ICpyZWFzb24sCisJCQkJcGpzaXBfdHhfZGF0YSAqdGRhdGEsCisJCQkJcGpzaXBfcnhfZGF0YSAqcmRhdGEsCisJCQkJcGpzdWFfYWNjX2lkIGFjY19pZCkKK3sKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhnX29ial9jYWxsYmFjay0+b25fcGFnZXIpKSB7CisJUHlPYmplY3QgKnBhcmFtX2NhbGxfaWQsICpwYXJhbV90bywgKnBhcmFtX2JvZHksCisJCSAqcGFyYW1fdXNlcl9kYXRhLCAqcGFyYW1fc3RhdHVzLCAqcGFyYW1fcmVhc29uLAorCQkgKnBhcmFtX2FjY19pZDsKKworCUVOVEVSX1BZVEhPTigpOworCisJUEpfVU5VU0VEX0FSRyh0ZGF0YSk7CisJUEpfVU5VU0VEX0FSRyhyZGF0YSk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKwkJZ19vYmpfY2FsbGJhY2stPm9uX3BhZ2VyX3N0YXR1cywKKwkJcGFyYW1fY2FsbF9pZAk9IFB5X0J1aWxkVmFsdWUoImkiLGNhbGxfaWQpLAorCQlwYXJhbV90bwk9IFB5U3RyaW5nX0Zyb21QSih0byksCisJCXBhcmFtX2JvZHkJPSBQeVN0cmluZ19Gcm9tUEooYm9keSksIAorCQlwYXJhbV91c2VyX2RhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwgdXNlcl9kYXRhKSwKKwkJcGFyYW1fc3RhdHVzCT0gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKSwKKwkJcGFyYW1fcmVhc29uCT0gUHlTdHJpbmdfRnJvbVBKKHJlYXNvbiksCisJCXBhcmFtX2FjY19pZAk9IFB5X0J1aWxkVmFsdWUoImkiLGFjY19pZCksCisJCU5VTEwKKwkgICAgKTsKKworCVB5X0RFQ1JFRihwYXJhbV9jYWxsX2lkKTsKKwlQeV9ERUNSRUYocGFyYW1fdG8pOworCVB5X0RFQ1JFRihwYXJhbV9ib2R5KTsKKwlQeV9ERUNSRUYocGFyYW1fdXNlcl9kYXRhKTsKKwlQeV9ERUNSRUYocGFyYW1fc3RhdHVzKTsKKwlQeV9ERUNSRUYocGFyYW1fcmVhc29uKTsKKwlQeV9ERUNSRUYocGFyYW1fYWNjX2lkKTsKKworCUxFQVZFX1BZVEhPTigpOworICAgIH0KK30KKworCisvKgorICogY2Jfb25fdHlwaW5nCisgKiBkZWNsYXJlcyBtZXRob2Qgb25fdHlwaW5nIGZvciBjYWxsYmFjayBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY2Jfb25fdHlwaW5nKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgY29uc3QgcGpfc3RyX3QgKmZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfc3RyX3QgKnRvLCBjb25zdCBwal9zdHJfdCAqY29udGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3QgaXNfdHlwaW5nLCBwanNpcF9yeF9kYXRhICpyZGF0YSwKKwkJCSAgICBwanN1YV9hY2NfaWQgYWNjX2lkKQoreworICAgIGlmIChQeUNhbGxhYmxlX0NoZWNrKGdfb2JqX2NhbGxiYWNrLT5vbl90eXBpbmcpKSB7CisJUHlPYmplY3QgKnBhcmFtX2NhbGxfaWQsICpwYXJhbV9mcm9tLCAqcGFyYW1fdG8sICpwYXJhbV9jb250YWN0LAorCQkgKnBhcmFtX2lzX3R5cGluZywgKnBhcmFtX2FjY19pZDsKKworCUVOVEVSX1BZVEhPTigpOworCisJUEpfVU5VU0VEX0FSRyhyZGF0YSk7CisKKyAgICAgICAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKwkJZ19vYmpfY2FsbGJhY2stPm9uX3R5cGluZywKKwkJcGFyYW1fY2FsbF9pZAk9IFB5X0J1aWxkVmFsdWUoImkiLGNhbGxfaWQpLAorCQlwYXJhbV9mcm9tCT0gUHlTdHJpbmdfRnJvbVBKKGZyb20pLAorCQlwYXJhbV90bwk9IFB5U3RyaW5nX0Zyb21QSih0byksCisJCXBhcmFtX2NvbnRhY3QJPSBQeVN0cmluZ19Gcm9tUEooY29udGFjdCksCisJCXBhcmFtX2lzX3R5cGluZyA9IFB5X0J1aWxkVmFsdWUoImkiLGlzX3R5cGluZyksCisJCXBhcmFtX2FjY19pZAk9IFB5X0J1aWxkVmFsdWUoImkiLGFjY19pZCksCisJCU5VTEwKKwkgICAgKTsKKworCVB5X0RFQ1JFRihwYXJhbV9jYWxsX2lkKTsKKwlQeV9ERUNSRUYocGFyYW1fZnJvbSk7CisJUHlfREVDUkVGKHBhcmFtX3RvKTsKKwlQeV9ERUNSRUYocGFyYW1fY29udGFjdCk7CisJUHlfREVDUkVGKHBhcmFtX2lzX3R5cGluZyk7IAorCVB5X0RFQ1JFRihwYXJhbV9hY2NfaWQpOworCisJTEVBVkVfUFlUSE9OKCk7CisgICAgfQorfQorCisKKy8qCisgKiBvbl9td2lfaW5mbworICovCitzdGF0aWMgdm9pZCBjYl9vbl9td2lfaW5mbyhwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9td2lfaW5mbyAqbXdpX2luZm8pCit7CisgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZ19vYmpfY2FsbGJhY2stPm9uX213aV9pbmZvKSkgeworCVB5T2JqZWN0ICpwYXJhbV9hY2NfaWQsICpwYXJhbV9ib2R5OworCXBqX3N0cl90IGJvZHk7CisKKwlFTlRFUl9QWVRIT04oKTsKKworCWJvZHkucHRyID0gbXdpX2luZm8tPnJkYXRhLT5tc2dfaW5mby5tc2ctPmJvZHktPmRhdGE7CisJYm9keS5zbGVuID0gbXdpX2luZm8tPnJkYXRhLT5tc2dfaW5mby5tc2ctPmJvZHktPmxlbjsKKworICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorCQlnX29ial9jYWxsYmFjay0+b25fbXdpX2luZm8sCisJCXBhcmFtX2FjY19pZAk9IFB5X0J1aWxkVmFsdWUoImkiLGFjY19pZCksCisJCXBhcmFtX2JvZHkJPSBQeVN0cmluZ19Gcm9tUEooJmJvZHkpLAorCQlOVUxMCisJICAgICk7CisKKwlQeV9ERUNSRUYocGFyYW1fYWNjX2lkKTsKKwlQeV9ERUNSRUYocGFyYW1fYm9keSk7CisKKwlMRUFWRV9QWVRIT04oKTsKKyAgICB9Cit9CisKKy8qIAorICogdHJhbnNsYXRlX2hkcgorICogaW50ZXJuYWwgZnVuY3Rpb24gCisgKiB0cmFuc2xhdGUgZnJvbSBoZHJfbGlzdCB0byBwanNpcF9nZW5lcmljX3N0cmluZ19oZHIKKyAqLwordm9pZCB0cmFuc2xhdGVfaGRyKHBqX3Bvb2xfdCAqcG9vbCwgcGpzaXBfaGRyICpoZHIsIFB5T2JqZWN0ICpweV9oZHJfbGlzdCkKK3sKKyAgICBwal9saXN0X2luaXQoaGRyKTsKKworICAgIGlmIChQeUxpc3RfQ2hlY2socHlfaGRyX2xpc3QpKSB7CisJaW50IGk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8UHlMaXN0X1NpemUocHlfaGRyX2xpc3QpOyArK2kpICB7IAorICAgICAgICAgICAgcGpfc3RyX3QgaG5hbWUsIGh2YWx1ZTsKKwkgICAgcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyICogbmV3X2hkcjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICogdHVwbGUgPSBQeUxpc3RfR2V0SXRlbShweV9oZHJfbGlzdCwgaSk7CisKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHR1cGxlKSkgeworCQlpZiAoUHlUdXBsZV9TaXplKHR1cGxlKSA+PSAxKQorCQkgICAgaG5hbWUgPSBQeVN0cmluZ19Ub1BKKFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwwKSk7CisJCWVsc2UKKwkJICAgIGhuYW1lLnNsZW4gPSAwOworCQlpZiAoUHlUdXBsZV9TaXplKHR1cGxlKSA+PSAyKQorCQkgICAgaHZhbHVlID0gUHlTdHJpbmdfVG9QSihQeVR1cGxlX0dldEl0ZW0odHVwbGUsMSkpOworCQllbHNlCisJCSAgICBodmFsdWUuc2xlbiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworCQlobmFtZS5wdHIgPSAiIjsKKwkJaG5hbWUuc2xlbiA9IDA7CisJCWh2YWx1ZS5wdHIgPSAiIjsKKwkJaHZhbHVlLnNsZW4gPSAwOworICAgICAgICAgICAgfSAgCisgICAgICAgICAgICBuZXdfaGRyID0gcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyX2NyZWF0ZShwb29sLCAmaG5hbWUsICZodmFsdWUpOworICAgICAgICAgICAgcGpfbGlzdF9wdXNoX2JhY2soKHBqX2xpc3RfdHlwZSAqKWhkciwgKHBqX2xpc3RfdHlwZSAqKW5ld19oZHIpOworCX0gICAgIAorICAgIH0KK30KKworLyoKKyAqIHB5X3Bqc3VhX3RocmVhZF9yZWdpc3RlcgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RocmVhZF9yZWdpc3RlcihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CQorICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgUHlPYmplY3QgKnB5X2Rlc2M7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZDsKKyAgICBzdHJ1Y3QgcHlfdGhyZWFkX2Rlc2MgKnRocmVhZF9kZXNjOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJzTyIsICZuYW1lLCAmcHlfZGVzYykpIHsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0aHJlYWRfZGVzYyA9IChzdHJ1Y3QgcHlfdGhyZWFkX2Rlc2MqKQorCQkgIG1hbGxvYyhzaXplb2Yoc3RydWN0IHB5X3RocmVhZF9kZXNjKSk7CisgICAgdGhyZWFkX2Rlc2MtPm5leHQgPSBweV90aHJlYWRfZGVzYzsKKyAgICBweV90aHJlYWRfZGVzYyA9IHRocmVhZF9kZXNjOworCisgICAgc3RhdHVzID0gcGpfdGhyZWFkX3JlZ2lzdGVyKG5hbWUsIHRocmVhZF9kZXNjLT5kZXNjLCAmdGhyZWFkKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlzdGF0dXMgPSBwal90aHJlYWRfbG9jYWxfc2V0KGdfdGhyZWFkX2lkLCAodm9pZCopMSk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2xvZ2dpbmdfY29uZmlnX2RlZmF1bHQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9sb2dnaW5nX2NvbmZpZ19kZWZhdWx0KFB5T2JqZWN0ICpwU2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKm9iajsJCisgICAgcGpzdWFfbG9nZ2luZ19jb25maWcgY2ZnOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICBwanN1YV9sb2dnaW5nX2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyopIAorCSAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbmV3KCZQeVR5cF9wanN1YV9sb2dnaW5nX2NvbmZpZywgCisJCQkJCSBOVUxMLCBOVUxMKTsKKyAgICBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0KilvYmo7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2NvbmZpZ19kZWZhdWx0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZmlnX2RlZmF1bHQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgUHlPYmpfcGpzdWFfY29uZmlnICpvYmo7CisgICAgcGpzdWFfY29uZmlnIGNmZzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgcGpzdWFfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisgICAgb2JqID0gKFB5T2JqX3Bqc3VhX2NvbmZpZyAqKSBQeU9ial9wanN1YV9jb25maWdfbmV3KCZQeVR5cF9wanN1YV9jb25maWcsIAorCQkJCQkJCU5VTEwsIE5VTEwpOworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKworICAgIHJldHVybiAoUHlPYmplY3QqKW9iajsKK30KKworCisvKgorICogcHlfcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQKKyAqLworc3RhdGljIFB5T2JqZWN0ICogcHlfcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQoUHlPYmplY3QgKnBTZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZyAqb2JqOworICAgIHBqc3VhX21lZGlhX2NvbmZpZyBjZmc7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIHBqc3VhX21lZGlhX2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV9tZWRpYV9jb25maWcgKikKKwkgIFB5VHlwZV9HZW5lcmljTmV3KCZQeVR5cF9wanN1YV9tZWRpYV9jb25maWcsIE5VTEwsIE5VTEwpOworICAgIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKworICAgIHJldHVybiAoUHlPYmplY3QgKilvYmo7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX21zZ19kYXRhX2luaXQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9tc2dfZGF0YV9pbml0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5T2JqX3Bqc3VhX21zZ19kYXRhX25ldygmUHlUeXBfcGpzdWFfbXNnX2RhdGEsIAorCQkJCQkJTlVMTCwgTlVMTCk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmcKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9yZWNvbmZpZ3VyZV9sb2dnaW5nKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCSAgICAgIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBQeU9iamVjdCAqbG9nT2JqOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiTyIsICZsb2dPYmopKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChsb2dPYmogIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnICpsb2c7CisJcGpzdWFfbG9nZ2luZ19jb25maWcgY2ZnOworCisgICAgICAgIGxvZyA9IChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyopbG9nT2JqOworICAgICAgICBjZmcubXNnX2xvZ2dpbmcgPSBsb2ctPm1zZ19sb2dnaW5nOworICAgICAgICBjZmcubGV2ZWwgPSBsb2ctPmxldmVsOworICAgICAgICBjZmcuY29uc29sZV9sZXZlbCA9IGxvZy0+Y29uc29sZV9sZXZlbDsKKyAgICAgICAgY2ZnLmRlY29yID0gbG9nLT5kZWNvcjsKKyAgICAgICAgY2ZnLmxvZ19maWxlbmFtZSA9IFB5U3RyaW5nX1RvUEoobG9nLT5sb2dfZmlsZW5hbWUpOworICAgICAgICBQeV9YREVDUkVGKGdfb2JqX2xvZ19jYik7CisgICAgICAgIGdfb2JqX2xvZ19jYiA9IGxvZy0+Y2I7CisgICAgICAgIFB5X0lOQ1JFRihnX29ial9sb2dfY2IpOworICAgICAgICBjZmcuY2IgPSAmY2JfbG9nX2NiOworICAgICAgICBzdGF0dXMgPSBwanN1YV9yZWNvbmZpZ3VyZV9sb2dnaW5nKCZjZmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmcoTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX3BlcnJvcgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3BlcnJvcihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBjb25zdCBjaGFyICpzZW5kZXI7CisgICAgY29uc3QgY2hhciAqdGl0bGU7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJzc2kiLCAmc2VuZGVyLCAmdGl0bGUsICZzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICBwanN1YV9wZXJyb3Ioc2VuZGVyLCB0aXRsZSwgc3RhdHVzKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIiKTsKK30KKworCisvKgorICogcHlfcGpzdWFfY3JlYXRlCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY3JlYXRlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgc3RhdHVzID0gcGpzdWFfY3JlYXRlKCk7CisgICAgCisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSAgeworCXN0YXR1cyA9IHBqX3RocmVhZF9sb2NhbF9hbGxvYygmZ190aHJlYWRfaWQpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkgICAgc3RhdHVzID0gcGpfdGhyZWFkX2xvY2FsX3NldChnX3RocmVhZF9pZCwgKHZvaWQqKTEpOworCisJcGpfYXRleGl0KCZjbGVhcl9weV90aHJlYWRfZGVzYyk7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLHN0YXR1cyk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2luaXQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9pbml0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqb191YV9jZmcsICpvX2xvZ19jZmcsICpvX21lZGlhX2NmZzsKKyAgICBwanN1YV9jb25maWcgY2ZnX3VhLCAqcF9jZmdfdWE7CisgICAgcGpzdWFfbG9nZ2luZ19jb25maWcgY2ZnX2xvZywgKnBfY2ZnX2xvZzsKKyAgICBwanN1YV9tZWRpYV9jb25maWcgY2ZnX21lZGlhLCAqcF9jZmdfbWVkaWE7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9PTyIsICZvX3VhX2NmZywgJm9fbG9nX2NmZywgJm9fbWVkaWFfY2ZnKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcGpzdWFfY29uZmlnX2RlZmF1bHQoJmNmZ191YSk7CisgICAgcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCgmY2ZnX2xvZyk7CisgICAgcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQoJmNmZ19tZWRpYSk7CisKKyAgICBpZiAob191YV9jZmcgIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX2NvbmZpZyAqb2JqX3VhX2NmZyA9IChQeU9ial9wanN1YV9jb25maWcqKW9fdWFfY2ZnOworCisJUHlPYmpfcGpzdWFfY29uZmlnX2V4cG9ydCgmY2ZnX3VhLCBvYmpfdWFfY2ZnKTsKKworCVB5X1hERUNSRUYoZ19vYmpfY2FsbGJhY2spOworICAgIAlnX29ial9jYWxsYmFjayA9IG9ial91YV9jZmctPmNiOworICAgIAlQeV9JTkNSRUYoZ19vYmpfY2FsbGJhY2spOworCisgICAgCWNmZ191YS5jYi5vbl9jYWxsX3N0YXRlID0gJmNiX29uX2NhbGxfc3RhdGU7CisgICAgCWNmZ191YS5jYi5vbl9pbmNvbWluZ19jYWxsID0gJmNiX29uX2luY29taW5nX2NhbGw7CisgICAgCWNmZ191YS5jYi5vbl9jYWxsX21lZGlhX3N0YXRlID0gJmNiX29uX2NhbGxfbWVkaWFfc3RhdGU7CisJY2ZnX3VhLmNiLm9uX2R0bWZfZGlnaXQgPSAmY2Jfb25fZHRtZl9kaWdpdDsKKyAgICAJY2ZnX3VhLmNiLm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCA9ICZjYl9vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3Q7CisgICAgCWNmZ191YS5jYi5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyA9ICZjYl9vbl9jYWxsX3RyYW5zZmVyX3N0YXR1czsKKyAgICAJY2ZnX3VhLmNiLm9uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0ID0gJmNiX29uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0OworICAgIAljZmdfdWEuY2Iub25fY2FsbF9yZXBsYWNlZCA9ICZjYl9vbl9jYWxsX3JlcGxhY2VkOworICAgIAljZmdfdWEuY2Iub25fcmVnX3N0YXRlID0gJmNiX29uX3JlZ19zdGF0ZTsKKwljZmdfdWEuY2Iub25faW5jb21pbmdfc3Vic2NyaWJlID0gJmNiX29uX2luY29taW5nX3N1YnNjcmliZTsKKyAgICAJY2ZnX3VhLmNiLm9uX2J1ZGR5X3N0YXRlID0gJmNiX29uX2J1ZGR5X3N0YXRlOworICAgIAljZmdfdWEuY2Iub25fcGFnZXIyID0gJmNiX29uX3BhZ2VyOworICAgIAljZmdfdWEuY2Iub25fcGFnZXJfc3RhdHVzMiA9ICZjYl9vbl9wYWdlcl9zdGF0dXM7CisgICAgCWNmZ191YS5jYi5vbl90eXBpbmcyID0gJmNiX29uX3R5cGluZzsKKwljZmdfdWEuY2Iub25fbXdpX2luZm8gPSAmY2Jfb25fbXdpX2luZm87CisKKyAgICAgICAgcF9jZmdfdWEgPSAmY2ZnX3VhOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9jZmdfdWEgPSBOVUxMOworICAgIH0KKworICAgIGlmIChvX2xvZ19jZmcgIT0gUHlfTm9uZSkgIHsKKwlQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyAqIG9ial9sb2c7CisKKyAgICAgICAgb2JqX2xvZyA9IChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyAqKW9fbG9nX2NmZzsKKyAgICAgICAgCisgICAgICAgIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX2V4cG9ydCgmY2ZnX2xvZywgb2JqX2xvZyk7CisKKyAgICAgICAgUHlfWERFQ1JFRihnX29ial9sb2dfY2IpOworICAgICAgICBnX29ial9sb2dfY2IgPSBvYmpfbG9nLT5jYjsKKyAgICAgICAgUHlfSU5DUkVGKGdfb2JqX2xvZ19jYik7CisKKyAgICAgICAgY2ZnX2xvZy5jYiA9ICZjYl9sb2dfY2I7CisgICAgICAgIHBfY2ZnX2xvZyA9ICZjZmdfbG9nOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9jZmdfbG9nID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAob19tZWRpYV9jZmcgIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19leHBvcnQoJmNmZ19tZWRpYSwgCisJCQkJICAgICAgICAoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnKilvX21lZGlhX2NmZyk7CisJcF9jZmdfbWVkaWEgPSAmY2ZnX21lZGlhOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9jZmdfbWVkaWEgPSBOVUxMOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2luaXQocF9jZmdfdWEsIHBfY2ZnX2xvZywgcF9jZmdfbWVkaWEpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisKKy8qCisgKiBweV9wanN1YV9zdGFydAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3N0YXJ0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgc3RhdHVzID0gcGpzdWFfc3RhcnQoKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2Rlc3Ryb3kKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9kZXN0cm95KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgc3RhdHVzID0gcGpzdWFfZGVzdHJveSgpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworCisvKgorICogcHlfcGpzdWFfaGFuZGxlX2V2ZW50cworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2hhbmRsZV9ldmVudHMoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgbXNlYzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZtc2VjKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobXNlYyA8IDApCisJbXNlYyA9IDA7CisKKyNpZiAhTk9fUEpTSVBfVEhSRUFECisgICAgLyogU2luY2UgaGFuZGxlX2V2ZW50cygpIHdpbGwgYmxvY2ssIHdlIG11c3Qgd3JhcCBpdCB3aXRoIEFMTE9XX1RIUkVBRFMKKyAgICAgKiBjb25zdHJ1Y3QsIG9yIG90aGVyd2lzZSBtYW55IFB5dGhvbiBibG9ja2luZyBmdW5jdGlvbnMgKHN1Y2ggYXMKKyAgICAgKiB0aW1lLnNsZWVwKCksIHJlYWRsaW5lKCksIGV0Yy4pIG1heSBoYW5nL2Jsb2NrIGluZGVmaW5pdGVseS4KKyAgICAgKiBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9jdXJyZW50L2FwaS90aHJlYWRzLmh0bWwgZm9yIG1vcmUgaW5mby4KKyAgICAgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisjZW5kaWYKKworICAgIHJldCA9IHBqc3VhX2hhbmRsZV9ldmVudHMobXNlYyk7CisKKyNpZiAhTk9fUEpTSVBfVEhSRUFECisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyNlbmRpZgorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcmV0KTsKK30KKworCisvKgorICogcHlfcGpzdWFfdmVyaWZ5X3NpcF91cmwKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV92ZXJpZnlfc2lwX3VybChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgY29uc3QgY2hhciAqdXJsOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJzIiwgJnVybCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfdmVyaWZ5X3NpcF91cmwodXJsKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKworLyoKKyAqIGZ1bmN0aW9uIGRvYworICovCisKK3N0YXRpYyBjaGFyIHBqc3VhX3RocmVhZF9yZWdpc3Rlcl9kb2NbXSA9CisgICAgImludCBfcGpzdWEudGhyZWFkX3JlZ2lzdGVyKHN0cmluZyBuYW1lLCBpbnRbXSBkZXNjKSI7CitzdGF0aWMgY2hhciBwanN1YV9wZXJyb3JfZG9jW10gPQorICAgICJ2b2lkIF9wanN1YS5wZXJyb3IgKHN0cmluZyBzZW5kZXIsIHN0cmluZyB0aXRsZSwgaW50IHN0YXR1cykgIgorICAgICJEaXNwbGF5IGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZS4gUGFyYW1ldGVyczogIgorICAgICJzZW5kZXI6IFRoZSBsb2cgc2VuZGVyIGZpZWxkOyAgIgorICAgICJ0aXRsZTogTWVzc2FnZSB0aXRsZSBmb3IgdGhlIGVycm9yOyAiCisgICAgInN0YXR1czogU3RhdHVzIGNvZGUuIjsKKworc3RhdGljIGNoYXIgcGpzdWFfY3JlYXRlX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jcmVhdGUgKHZvaWQpICIKKyAgICAiSW5zdGFudGlhdGUgcGpzdWEgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9uICIKKyAgICAibXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGZ1bmN0aW9ucywgdG8gbWFrZSBzdXJlICIKKyAgICAidGhhdCB0aGUgdW5kZXJseWluZyBsaWJyYXJpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBPbmNlIHRoaXMgIgorICAgICJmdW5jdGlvbiBoYXMgcmV0dXJuZWQgc3VjY2VzcywgYXBwbGljYXRpb24gbXVzdCBjYWxsIHBqc3VhX2Rlc3Ryb3koKSAiCisgICAgImJlZm9yZSBxdWl0dGluZy4iOworCitzdGF0aWMgY2hhciBwanN1YV9pbml0X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5pbml0IChfcGpzdWEuQ29uZmlnIG9ial91YV9jZmcsICIKKyAgICAgICAgIl9wanN1YS5Mb2dnaW5nX0NvbmZpZyBsb2dfY2ZnLCBfcGpzdWEuTWVkaWFfQ29uZmlnIG1lZGlhX2NmZykgIgorICAgICJJbml0aWFsaXplIHBqc3VhIHdpdGggdGhlIHNwZWNpZmllZCBzZXR0aW5ncy4gQWxsIHRoZSBzZXR0aW5ncyBhcmUgIgorICAgICJvcHRpb25hbCwgYW5kIHRoZSBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgY29uZmlnIGlzIG5vdCAiCisgICAgInNwZWNpZmllZC4gUGFyYW1ldGVyczogIgorICAgICJvYmpfdWFfY2ZnIDogVXNlciBhZ2VudCBjb25maWd1cmF0aW9uOyAgIgorICAgICJsb2dfY2ZnIDogT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uOyAiCisgICAgIm1lZGlhX2NmZyA6IE9wdGlvbmFsIG1lZGlhIGNvbmZpZ3VyYXRpb24uIjsKKworc3RhdGljIGNoYXIgcGpzdWFfc3RhcnRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnN0YXJ0ICh2b2lkKSAiCisgICAgIkFwcGxpY2F0aW9uIGlzIHJlY29tbWVuZGVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBhbGwgIgorICAgICJpbml0aWFsaXphdGlvbiBpcyBkb25lLCBzbyB0aGF0IHRoZSBsaWJyYXJ5IGNhbiBkbyBhZGRpdGlvbmFsIGNoZWNraW5nICIKKyAgICAic2V0IHVwIGFkZGl0aW9uYWwiOworCitzdGF0aWMgY2hhciBwanN1YV9kZXN0cm95X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5kZXN0cm95ICh2b2lkKSAiCisgICAgIkRlc3Ryb3kgcGpzdWEgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIFBKU1VBIGlzIGNyZWF0ZWQuIFRvICIKKyAgICAibWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uICIKKyAgICAic2V2ZXJhbCB0aW1lcyB3aXRoIG5vIGRhbmdlci4iOworCitzdGF0aWMgY2hhciBwanN1YV9oYW5kbGVfZXZlbnRzX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5oYW5kbGVfZXZlbnRzIChpbnQgbXNlY190aW1lb3V0KSAiCisgICAgIlBvbGwgcGpzdWEgZm9yIGV2ZW50cywgYW5kIGlmIG5lY2Vzc2FyeSBibG9jayB0aGUgY2FsbGVyIHRocmVhZCBmb3IgdGhlICIKKyAgICAic3BlY2lmaWVkIG1heGltdW0gaW50ZXJ2YWwgKGluIG1pbGlzZWNvbmRzKSBQYXJhbWV0ZXJzOiAiCisgICAgIm1zZWNfdGltZW91dDogTWF4aW11bSB0aW1lIHRvIHdhaXQsIGluIG1pbGlzZWNvbmRzLiAiCisgICAgIlJldHVybnM6IFRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQgZHVyaW5nIHRoZSBwb2xsLiAiCisgICAgIk5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBlcnJvciwgYW5kIGFwcGxpY2F0aW9uIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgIgorICAgICJhcyAoZXJyID0gLXJldHVybl92YWx1ZSkuIjsKKworc3RhdGljIGNoYXIgcGpzdWFfdmVyaWZ5X3NpcF91cmxfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnZlcmlmeV9zaXBfdXJsIChzdHJpbmcgY191cmwpICIKKyAgICAiVmVyaWZ5IHRoYXQgdmFsaWQgU0lQIHVybCBpcyBnaXZlbiBQYXJhbWV0ZXJzOiAiCisgICAgImNfdXJsOiBUaGUgVVJMLCBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLiI7CisKK3N0YXRpYyBjaGFyIHBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmdfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnJlY29uZmlndXJlX2xvZ2dpbmcgKF9wanN1YS5Mb2dnaW5nX0NvbmZpZyBjKSAiCisgICAgIkFwcGxpY2F0aW9uIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgYW55IHRpbWUgKGFmdGVyIHBqc3VhX2NyZWF0ZSgpLCBvZiAiCisgICAgImNvdXJzZSkgdG8gY2hhbmdlIGxvZ2dpbmcgc2V0dGluZ3MuIFBhcmFtZXRlcnM6ICIKKyAgICAiYzogTG9nZ2luZyBjb25maWd1cmF0aW9uLiI7CisKK3N0YXRpYyBjaGFyIHBqc3VhX2xvZ2dpbmdfY29uZmlnX2RlZmF1bHRfZG9jW10gPQorICAgICJfcGpzdWEuTG9nZ2luZ19Db25maWcgX3Bqc3VhLmxvZ2dpbmdfY29uZmlnX2RlZmF1bHQgICgpICAiCisgICAgIlVzZSB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgbG9nZ2luZyBjb25maWcuIjsKKworc3RhdGljIGNoYXIgcGpzdWFfY29uZmlnX2RlZmF1bHRfZG9jW10gPQorICAgICJfcGpzdWEuQ29uZmlnIF9wanN1YS5jb25maWdfZGVmYXVsdCAoKS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gIgorICAgICJpbml0aWFsaXplIHBqc3VhIGNvbmZpZy4gIjsKKworc3RhdGljIGNoYXIgcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHRfZG9jW10gPQorICAgICJfcGpzdWEuTWVkaWFfQ29uZmlnIF9wanN1YS5tZWRpYV9jb25maWdfZGVmYXVsdCAoKS4gIgorICAgICJVc2UgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIG1lZGlhIGNvbmZpZy4iOworCitzdGF0aWMgY2hhciBwanN1YV9tc2dfZGF0YV9pbml0X2RvY1tdID0KKyAgICAiX3Bqc3VhLk1zZ19EYXRhIHZvaWQgX3Bqc3VhLm1zZ19kYXRhX2luaXQgKCkgIgorICAgICJJbml0aWFsaXplIG1lc3NhZ2UgZGF0YSAiOworICAgICAgICAKKworLyogRU5EIE9GIExJQiBCQVNFICovCisKKy8qIExJQiBUUkFOU1BPUlQgKi8KKworLyoKKyAqIHB5X3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkJICAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKm9iajsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIGNmZzsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnKikKKwkgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3KCZQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnLAorCQkJCQkgICBOVUxMLCBOVUxMKTsKKyAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2ltcG9ydChvYmosICZjZmcpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3RyYW5zcG9ydF9jcmVhdGUKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV90cmFuc3BvcnRfY3JlYXRlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBpbnQgdHlwZTsKKyAgICBQeU9iamVjdCAqcENmZzsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIGNmZzsKKyAgICBwanN1YV90cmFuc3BvcnRfaWQgaWQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlPIiwgJnR5cGUsICZwQ2ZnKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocENmZyAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqb2JqOworCisgICAgICAgIG9iaiA9IChQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnKilwQ2ZnOworCVB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZXhwb3J0KCZjZmcsIG9iaik7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9jcmVhdGUodHlwZSwgJmNmZywgJmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfY3JlYXRlKHR5cGUsIE5VTEwsICZpZCk7CisgICAgfQorICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfZW51bV90cmFuc3BvcnRzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV90cmFuc3BvcnRzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBwanN1YV90cmFuc3BvcnRfaWQgaWRbUEpTSVBfTUFYX1RSQU5TUE9SVFNdOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGMgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICBzdGF0dXMgPSBwanN1YV9lbnVtX3RyYW5zcG9ydHMoaWQsICZjKTsKKyAgICAKKyAgICBsaXN0ID0gUHlMaXN0X05ldyhjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7ICAgICAKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoUHlPYmplY3QqKWxpc3Q7Cit9CisKKy8qCisgKiBweV9wanN1YV90cmFuc3BvcnRfZ2V0X2luZm8KKyAqICFtb2RpZmllZCBAIDA1MTIwNgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3RyYW5zcG9ydF9nZXRfaW5mbyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IGlkOworICAgIHBqc3VhX3RyYW5zcG9ydF9pbmZvIGluZm87CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX3RyYW5zcG9ydF9nZXRfaW5mbyhpZCwgJmluZm8pOwkKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbyAqb2JqOworICAgICAgICBvYmogPSAoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8gKikgCisJICAgICAgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fbmV3KCZQeVR5cF9wanN1YV90cmFuc3BvcnRfaW5mbywgCisJCQkJCSAgICAgTlVMTCwgTlVMTCk7CisJUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9faW1wb3J0KG9iaiwgJmluZm8pOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilvYmo7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIiIpOworICAgIH0KK30KKworLyoKKyAqIHB5X3Bqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfdHJhbnNwb3J0X3NldF9lbmFibGUoUHlPYmplY3QgKnBTZWxmLCAKKwkJCQkJICAgICAgIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IGlkOworICAgIGludCBlbmFibGVkOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZpZCwgJmVuYWJsZWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfc2V0X2VuYWJsZShpZCwgZW5hYmxlZCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV90cmFuc3BvcnRfY2xvc2UKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV90cmFuc3BvcnRfY2xvc2UoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBpZDsKKyAgICBpbnQgZm9yY2U7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmlkLCAmZm9yY2UpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgc3RhdHVzID0gcGpzdWFfdHJhbnNwb3J0X2Nsb3NlKGlkLCBmb3JjZSk7CQorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworc3RhdGljIGNoYXIgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0X2RvY1tdID0KKyAgICAiX3Bqc3VhLlRyYW5zcG9ydF9Db25maWcgX3Bqc3VhLnRyYW5zcG9ydF9jb25maWdfZGVmYXVsdCAoKSAiCisgICAgIkNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIFVEUCBjb25maWcgd2l0aCBkZWZhdWx0IHZhbHVlcy4iOworc3RhdGljIGNoYXIgcGpzdWFfdHJhbnNwb3J0X2NyZWF0ZV9kb2NbXSA9CisgICAgImludCwgaW50IF9wanN1YS50cmFuc3BvcnRfY3JlYXRlIChpbnQgdHlwZSwgIgorICAgICJfcGpzdWEuVHJhbnNwb3J0X0NvbmZpZyBjZmcpICIKKyAgICAiQ3JlYXRlIFNJUCB0cmFuc3BvcnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2VudW1fdHJhbnNwb3J0c19kb2NbXSA9CisgICAgImludFtdIF9wanN1YS5lbnVtX3RyYW5zcG9ydHMgKCkgIgorICAgICJFbnVtZXJhdGUgYWxsIHRyYW5zcG9ydHMgY3VycmVudGx5IGNyZWF0ZWQgaW4gdGhlIHN5c3RlbS4iOworc3RhdGljIGNoYXIgcGpzdWFfdHJhbnNwb3J0X2dldF9pbmZvX2RvY1tdID0KKyAgICAidm9pZCBfcGpzdWEudHJhbnNwb3J0X2dldF9pbmZvICIKKyAgICAiKF9wanN1YS5UcmFuc3BvcnRfSUQgaWQsIF9wanN1YS5UcmFuc3BvcnRfSW5mbyBpbmZvKSAiCisgICAgIkdldCBpbmZvcm1hdGlvbiBhYm91dCB0cmFuc3BvcnRzLiI7CitzdGF0aWMgY2hhciBwanN1YV90cmFuc3BvcnRfc2V0X2VuYWJsZV9kb2NbXSA9CisgICAgInZvaWQgX3Bqc3VhLnRyYW5zcG9ydF9zZXRfZW5hYmxlICIKKyAgICAiKF9wanN1YS5UcmFuc3BvcnRfSUQgaWQsIGludCBlbmFibGVkKSAiCisgICAgIkRpc2FibGUgYSB0cmFuc3BvcnQgb3IgcmUtZW5hYmxlIGl0LiAiCisgICAgIkJ5IGRlZmF1bHQgdHJhbnNwb3J0IGlzIGFsd2F5cyBlbmFibGVkIGFmdGVyIGl0IGlzIGNyZWF0ZWQuICIKKyAgICAiRGlzYWJsaW5nIGEgdHJhbnNwb3J0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNsb3NlIHRoZSBzb2NrZXQsICIKKyAgICAiaXQgd2lsbCBvbmx5IGRpc2NhcmQgaW5jb21pbmcgbWVzc2FnZXMgYW5kIHByZXZlbnQgdGhlIHRyYW5zcG9ydCAiCisgICAgImZyb20gYmVpbmcgdXNlZCB0byBzZW5kIG91dGdvaW5nIG1lc3NhZ2VzLiI7CitzdGF0aWMgY2hhciBwanN1YV90cmFuc3BvcnRfY2xvc2VfZG9jW10gPQorICAgICJ2b2lkIF9wanN1YS50cmFuc3BvcnRfY2xvc2UgKF9wanN1YS5UcmFuc3BvcnRfSUQgaWQsIGludCBmb3JjZSkgIgorICAgICJDbG9zZSB0aGUgdHJhbnNwb3J0LiBJZiB0cmFuc3BvcnQgaXMgZm9yY2VmdWxseSBjbG9zZWQsICIKKyAgICAiaXQgd2lsbCBiZSBpbW1lZGlhdGVseSBjbG9zZWQsIGFuZCBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgIgorICAgICJ0aGF0IGFyZSB1c2luZyB0aGUgdHJhbnNwb3J0IG1heSBub3QgdGVybWluYXRlIHByb3Blcmx5LiAiCisgICAgIk90aGVyd2lzZSwgdGhlIHN5c3RlbSB3aWxsIHdhaXQgdW50aWwgYWxsIHRyYW5zYWN0aW9ucyBhcmUgY2xvc2VkICIKKyAgICAid2hpbGUgcHJldmVudGluZyBuZXcgdXNlcnMgZnJvbSB1c2luZyB0aGUgdHJhbnNwb3J0LCBhbmQgd2lsbCBjbG9zZSAiCisgICAgInRoZSB0cmFuc3BvcnQgd2hlbiBpdCBpcyBzYWZlIHRvIGRvIHNvLiI7CisKKy8qIEVORCBPRiBMSUIgVFJBTlNQT1JUICovCisKKy8qIExJQiBBQ0NPVU5UICovCisKKworLyoKKyAqIHB5X3Bqc3VhX2FjY19jb25maWdfZGVmYXVsdAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19jb25maWdfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBQeU9ial9wanN1YV9hY2NfY29uZmlnICpvYmo7CisgICAgcGpzdWFfYWNjX2NvbmZpZyBjZmc7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIiIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqc3VhX2FjY19jb25maWdfZGVmYXVsdCgmY2ZnKTsKKyAgICBvYmogPSAoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyAqKQorCSAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19uZXcoJlB5VHlwX3Bqc3VhX2FjY19jb25maWcsIAorCQkJCSAgICAgTlVMTCwgTlVMTCk7CisgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2dldF9jb3VudAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19nZXRfY291bnQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgaW50IGNvdW50OworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICBjb3VudCA9IHBqc3VhX2FjY19nZXRfY291bnQoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGNvdW50KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19pc192YWxpZAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19pc192YWxpZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlkOworICAgIGludCBpc192YWxpZDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaXNfdmFsaWQgPSBwanN1YV9hY2NfaXNfdmFsaWQoaWQpOwkKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGlzX3ZhbGlkKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfZGVmYXVsdAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19zZXRfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlkOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdGF0dXMgPSBwanN1YV9hY2Nfc2V0X2RlZmF1bHQoaWQpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19nZXRfZGVmYXVsdAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19nZXRfZGVmYXVsdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlkOworCQorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgaWQgPSBwanN1YV9hY2NfZ2V0X2RlZmF1bHQoKTsKKwkKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGlkKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19hZGQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfYWRkKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaXNfZGVmYXVsdDsKKyAgICBQeU9iamVjdCAqcENmZzsKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9pIiwgJnBDZmcsICZpc19kZWZhdWx0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgaWYgKHBDZmcgIT0gUHlfTm9uZSkgeworCXBqc3VhX2FjY19jb25maWcgY2ZnOworCVB5T2JqX3Bqc3VhX2FjY19jb25maWcgKmFjOworCisJcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgICAgICBhYyA9IChQeU9ial9wanN1YV9hY2NfY29uZmlnICopcENmZzsKKyAgICAgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19leHBvcnQoJmNmZywgYWMpOworICAgICAgICBzdGF0dXMgPSBwanN1YV9hY2NfYWRkKCZjZmcsIGlzX2RlZmF1bHQsICZhY2NfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFBKX0VJTlZBTDsKKwlhY2NfaWQgPSBQSlNVQV9JTlZBTElEX0lEOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBzdGF0dXMsIGFjY19pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfYWRkX2xvY2FsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2FkZF9sb2NhbChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlzX2RlZmF1bHQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBzdGF0dXM7CisJCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZ0aWQsICZpc19kZWZhdWx0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisJCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX2FkZF9sb2NhbCh0aWQsIGlzX2RlZmF1bHQsICZhY2NfaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgYWNjX2lkKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfdXNlcl9kYXRhCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX3NldF91c2VyX2RhdGEoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBhY2NfaWQ7CisgICAgUHlPYmplY3QgKnBVc2VyRGF0YSwgKm9sZF91c2VyX2RhdGE7CisgICAgaW50IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU8iLCAmYWNjX2lkLCAmcFVzZXJEYXRhKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvbGRfdXNlcl9kYXRhID0gKFB5T2JqZWN0KikgcGpzdWFfYWNjX2dldF91c2VyX2RhdGEoYWNjX2lkKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2FjY19zZXRfdXNlcl9kYXRhKGFjY19pZCwgKHZvaWQqKXBVc2VyRGF0YSk7CisKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlQeV9YSU5DUkVGKHBVc2VyRGF0YSk7CisJUHlfWERFQ1JFRihvbGRfdXNlcl9kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfZ2V0X3VzZXJfZGF0YQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19nZXRfdXNlcl9kYXRhKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgYWNjX2lkOworICAgIFB5T2JqZWN0ICp1c2VyX2RhdGE7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYWNjX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1c2VyX2RhdGEgPSAoUHlPYmplY3QqKSBwanN1YV9hY2NfZ2V0X3VzZXJfZGF0YShhY2NfaWQpOworCisgICAgcmV0dXJuIHVzZXJfZGF0YSA/IFB5X0J1aWxkVmFsdWUoIk8iLCB1c2VyX2RhdGEpIDogUHlfQnVpbGRWYWx1ZSgiIik7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfZGVsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX2RlbChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGFjY19pZDsKKyAgICBQeU9iamVjdCAqdXNlcl9kYXRhOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYWNjX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1c2VyX2RhdGEgPSAoUHlPYmplY3QqKSBwanN1YV9hY2NfZ2V0X3VzZXJfZGF0YShhY2NfaWQpOworICAgIFB5X1hERUNSRUYodXNlcl9kYXRhKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2FjY19kZWwoYWNjX2lkKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19tb2RpZnkKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfbW9kaWZ5KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgUHlPYmplY3QgKnBDZmc7CisgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyAqIGFjOworICAgIGludCBhY2NfaWQ7CisgICAgaW50IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU8iLCAmYWNjX2lkLCAmcENmZykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBDZmcgIT0gUHlfTm9uZSkgeworCXBqc3VhX2FjY19jb25maWcgY2ZnOwkKKworCXBqc3VhX2FjY19jb25maWdfZGVmYXVsdCgmY2ZnKTsKKyAgICAgICAgYWMgPSAoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyopcENmZzsKKyAgICAgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19leHBvcnQoJmNmZywgYWMpOworCisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2FjY19tb2RpZnkoYWNjX2lkLCAmY2ZnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBQSl9FSU5WQUw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1cyhQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkJUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaXNfb25saW5lOwkKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBzdGF0dXM7CQorCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZhY2NfaWQsICZpc19vbmxpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICBzdGF0dXMgPSBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMoYWNjX2lkLCBpc19vbmxpbmUpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1czIKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQkgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgaXNfb25saW5lOwkKKyAgICBpbnQgYWNjX2lkOworICAgIGludCBhY3Rpdml0eV9pZDsKKyAgICBjb25zdCBjaGFyICphY3Rpdml0eV90ZXh0ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpycGlkX2lkID0gTlVMTDsKKyAgICBwanJwaWRfZWxlbWVudCBycGlkOworICAgIHBqX3N0YXR1c190IHN0YXR1czsJCisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpaXNzIiwgJmFjY19pZCwgJmlzX29ubGluZSwKKwkJCSAgJmFjdGl2aXR5X2lkLCAmYWN0aXZpdHlfdGV4dCwgJnJwaWRfaWQpKSAKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqX2J6ZXJvKCZycGlkLCBzaXplb2YocnBpZCkpOworICAgIHJwaWQudHlwZSA9IFBKUlBJRF9FTEVNRU5UX1RZUEVfUEVSU09OOworICAgIHJwaWQuYWN0aXZpdHkgPSBhY3Rpdml0eV9pZDsKKyAgICBpZiAoYWN0aXZpdHlfdGV4dCkKKwlycGlkLm5vdGUgPSBwal9zdHIoKGNoYXIqKWFjdGl2aXR5X3RleHQpOworCisgICAgaWYgKHJwaWRfaWQpCisJcnBpZC5pZCA9IHBqX3N0cigoY2hhciopcnBpZF9pZCk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyKGFjY19pZCwgaXNfb25saW5lLCAmcnBpZCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2Nfc2V0X3JlZ2lzdHJhdGlvbgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19zZXRfcmVnaXN0cmF0aW9uKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCSAgICAgICBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCByZW5ldzsJCisgICAgaW50IGFjY19pZDsKKyAgICBpbnQgc3RhdHVzOwkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmYWNjX2lkLCAmcmVuZXcpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICBzdGF0dXMgPSBwanN1YV9hY2Nfc2V0X3JlZ2lzdHJhdGlvbihhY2NfaWQsIHJlbmV3KTsKKwkKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9hY2NfZ2V0X2luZm8KKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9hY2NfZ2V0X2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgYWNjX2lkOworICAgIFB5T2JqX3Bqc3VhX2FjY19pbmZvICogb2JqOworICAgIHBqc3VhX2FjY19pbmZvIGluZm87CisgICAgaW50IHN0YXR1czsJCisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYWNjX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZCwgJmluZm8pOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCW9iaiA9IChQeU9ial9wanN1YV9hY2NfaW5mbyopCisJICAgICAgUHlPYmpfcGpzdWFfYWNjX2luZm9fbmV3KCZQeVR5cF9wanN1YV9hY2NfaW5mbywgTlVMTCwgTlVMTCk7CisJUHlPYmpfcGpzdWFfYWNjX2luZm9faW1wb3J0KG9iaiwgJmluZm8pOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilvYmo7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgfQorfQorCisvKgorICogcHlfcGpzdWFfZW51bV9hY2NzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV9hY2NzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBwanN1YV9hY2NfaWQgaWRbUEpTVUFfTUFYX0FDQ107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaWQpOworICAgIHN0YXR1cyA9IHBqc3VhX2VudW1fYWNjcyhpZCwgJmMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwljID0gMDsKKyAgICAKKyAgICBsaXN0ID0gUHlMaXN0X05ldyhjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X0J1aWxkVmFsdWUoImkiLCBpZFtpXSkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0KilsaXN0OworfQorCisvKgorICogcHlfcGpzdWFfYWNjX2VudW1faW5mbworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2FjY19lbnVtX2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIHBqc3VhX2FjY19pbmZvIGluZm9bUEpTVUFfTUFYX0FDQ107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiIikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBjID0gUEpfQVJSQVlfU0laRShpbmZvKTsKKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfZW51bV9pbmZvKGluZm8sICZjKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJYyA9IDA7CisKKyAgICBsaXN0ID0gUHlMaXN0X05ldyhjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisgICAgICAgIFB5T2JqX3Bqc3VhX2FjY19pbmZvICpvYmo7CisgICAgICAgIG9iaiA9IChQeU9ial9wanN1YV9hY2NfaW5mbyAqKQorCSAgICAgIFB5T2JqX3Bqc3VhX2FjY19pbmZvX25ldygmUHlUeXBfcGpzdWFfYWNjX2luZm8sIE5VTEwsIE5VTEwpOworCisJUHlPYmpfcGpzdWFfYWNjX2luZm9faW1wb3J0KG9iaiwgJmluZm9baV0pOworCisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIChQeU9iamVjdCopb2JqKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChQeU9iamVjdCopbGlzdDsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2FjY19zZXRfdHJhbnNwb3J0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX3NldF90cmFuc3BvcnQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgYWNjX2lkLCB0cmFuc3BvcnRfaWQ7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZhY2NfaWQsICZ0cmFuc3BvcnRfaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfYWNjX3NldF90cmFuc3BvcnQoYWNjX2lkLCB0cmFuc3BvcnRfaWQpOworICAgIAorICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworCisvKgorICogcHlfcGpzdWFfYWNjX3ByZXNfbm90aWZ5CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYWNjX3ByZXNfbm90aWZ5KFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCSAgUHlPYmplY3QgKnBBcmdzKQoreworICAgIGludCBhY2NfaWQsIHN0YXRlOworICAgIFB5T2JqZWN0ICphcmdfcHJlcywgKmFyZ19tc2dfZGF0YSwgKmFyZ19yZWFzb247CisgICAgdm9pZCAqc3J2X3ByZXM7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgcGpfc3RyX3QgcmVhc29uOworICAgIHBqX2Jvb2xfdCB3aXRoX2JvZHk7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlPaU9PIiwgJmFjY19pZCwgJmFyZ19wcmVzLCAKKwkJCSAgJnN0YXRlLCAmYXJnX3JlYXNvbiwgJmFyZ19tc2dfZGF0YSkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHNydl9wcmVzID0gKHZvaWQqKSBQeUxvbmdfQXNMb25nKGFyZ19wcmVzKTsKKyAgICB3aXRoX2JvZHkgPSAoc3RhdGUgIT0gUEpTSVBfRVZTVUJfU1RBVEVfVEVSTUlOQVRFRCk7CisKKyAgICBpZiAoYXJnX3JlYXNvbiAmJiBQeVN0cmluZ19DaGVjayhhcmdfcmVhc29uKSkgeworCXJlYXNvbiA9IFB5U3RyaW5nX1RvUEooYXJnX3JlYXNvbik7CisgICAgfSBlbHNlIHsKKwlyZWFzb24gPSBwal9zdHIoIiIpOworICAgIH0KKworICAgIHBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKyAgICBpZiAoYXJnX21zZ19kYXRhICYmIGFyZ19tc2dfZGF0YSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5T2JqX3Bqc3VhX21zZ19kYXRhICpvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilhcmdfbXNnX2RhdGE7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX1RvUEoob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX1RvUEoob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9wcmVzX25vdGlmeShhY2NfaWQsIChwanN1YV9zcnZfcHJlcyopc3J2X3ByZXMsCisJCQkgICAgICAgKHBqc2lwX2V2c3ViX3N0YXRlKXN0YXRlLCBOVUxMLAorCQkJICAgICAgICZyZWFzb24sIHdpdGhfYm9keSwgJm1zZ19kYXRhKTsKKyAgICAKKyAgICBpZiAocG9vbCkgeworCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19jb25maWdfZGVmYXVsdF9kb2NbXSA9CisgICAgIl9wanN1YS5BY2NfQ29uZmlnIF9wanN1YS5hY2NfY29uZmlnX2RlZmF1bHQgKCkgIgorICAgICJDYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhY2NvdW50IGNvbmZpZyB3aXRoIGRlZmF1bHQgdmFsdWVzLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZ2V0X2NvdW50X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5hY2NfZ2V0X2NvdW50ICgpICIKKyAgICAiR2V0IG51bWJlciBvZiBjdXJyZW50IGFjY291bnRzLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfaXNfdmFsaWRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmFjY19pc192YWxpZCAoaW50IGFjY19pZCkgICIKKyAgICAiQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBhY2NvdW50IElEIGlzIHZhbGlkLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2Nfc2V0X2RlZmF1bHRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmFjY19zZXRfZGVmYXVsdCAoaW50IGFjY19pZCkgIgorICAgICJTZXQgZGVmYXVsdCBhY2NvdW50IHRvIGJlIHVzZWQgd2hlbiBpbmNvbWluZyAiCisgICAgImFuZCBvdXRnb2luZyByZXF1ZXN0cyBkb2Vzbid0IG1hdGNoIGFueSBhY2NvdW50cy4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX2dldF9kZWZhdWx0X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5hY2NfZ2V0X2RlZmF1bHQgKCkgIgorICAgICJHZXQgZGVmYXVsdCBhY2NvdW50LiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfYWRkX2RvY1tdID0KKyAgICAiaW50LCBpbnQgX3Bqc3VhLmFjY19hZGQgKF9wanN1YS5BY2NfQ29uZmlnIGNmZywgIgorICAgICJpbnQgaXNfZGVmYXVsdCkgIgorICAgICJBZGQgYSBuZXcgYWNjb3VudCB0byBwanN1YS4gUEpTVUEgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgIgorICAgICIod2l0aCBwanN1YV9pbml0KCkpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2FjY19hZGRfbG9jYWxfZG9jW10gPQorICAgICJpbnQsaW50IF9wanN1YS5hY2NfYWRkX2xvY2FsIChpbnQgdGlkLCAiCisgICAgImludCBpc19kZWZhdWx0KSAiCisgICAgIkFkZCBhIGxvY2FsIGFjY291bnQuIEEgbG9jYWwgYWNjb3VudCBpcyB1c2VkIHRvIGlkZW50aWZ5ICIKKyAgICAibG9jYWwgZW5kcG9pbnQgaW5zdGVhZCBvZiBhIHNwZWNpZmljIHVzZXIsIGFuZCBmb3IgdGhpcyByZWFzb24sICIKKyAgICAiYSB0cmFuc3BvcnQgSUQgaXMgbmVlZGVkIHRvIG9idGFpbiB0aGUgbG9jYWwgYWRkcmVzcyBpbmZvcm1hdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX2RlbF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuYWNjX2RlbCAoaW50IGFjY19pZCkgIgorICAgICJEZWxldGUgYWNjb3VudC4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX21vZGlmeV9kb2NbXSA9CisgICAgImludCBfcGpzdWEuYWNjX21vZGlmeSAoaW50IGFjY19pZCwgX3Bqc3VhLkFjY19Db25maWcgY2ZnKSAiCisgICAgIk1vZGlmeSBhY2NvdW50IGluZm9ybWF0aW9uLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXNfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmFjY19zZXRfb25saW5lX3N0YXR1czIoaW50IGFjY19pZCwgaW50IGlzX29ubGluZSkgIgorICAgICJNb2RpZnkgYWNjb3VudCdzIHByZXNlbmNlIHN0YXR1cyB0byBiZSBhZHZlcnRpc2VkICIKKyAgICAidG8gcmVtb3RlL3ByZXNlbmNlIHN1YnNjcmliZXJzLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMyX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5hY2Nfc2V0X29ubGluZV9zdGF0dXMgKGludCBhY2NfaWQsIGludCBpc19vbmxpbmUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCBhY3Rpdml0eV9pZCwgc3RyaW5nIGFjdGl2aXR5X3RleHQpICIKKyAgICAiTW9kaWZ5IGFjY291bnQncyBwcmVzZW5jZSBzdGF0dXMgdG8gYmUgYWR2ZXJ0aXNlZCAiCisgICAgInRvIHJlbW90ZS9wcmVzZW5jZSBzdWJzY3JpYmVycy4iOworc3RhdGljIGNoYXIgcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb25fZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmFjY19zZXRfcmVnaXN0cmF0aW9uIChpbnQgYWNjX2lkLCBpbnQgcmVuZXcpICIKKyAgICAiVXBkYXRlIHJlZ2lzdHJhdGlvbiBvciBwZXJmb3JtIHVucmVnaXN0cmF0aW9uLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZ2V0X2luZm9fZG9jW10gPQorICAgICJfcGpzdWEuQWNjX0luZm8gX3Bqc3VhLmFjY19nZXRfaW5mbyAoaW50IGFjY19pZCkgIgorICAgICJHZXQgYWNjb3VudCBpbmZvcm1hdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9hY2NzX2RvY1tdID0KKyAgICAiaW50W10gX3Bqc3VhLmVudW1fYWNjcyAoKSAiCisgICAgIkVudW0gYWNjb3VudHMgYWxsIGFjY291bnQgaWRzLiI7CitzdGF0aWMgY2hhciBwanN1YV9hY2NfZW51bV9pbmZvX2RvY1tdID0KKyAgICAiX3Bqc3VhLkFjY19JbmZvW10gX3Bqc3VhLmFjY19lbnVtX2luZm8gKCkgIgorICAgICJFbnVtIGFjY291bnRzIGluZm8uIjsKKworLyogRU5EIE9GIExJQiBBQ0NPVU5UICovCisKKy8qIExJQiBCVUREWSAqLworCisKKworLyoKKyAqIHB5X3Bqc3VhX2J1ZGR5X2NvbmZpZ19kZWZhdWx0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYnVkZHlfY29uZmlnX2RlZmF1bHQoUHlPYmplY3QgKnBTZWxmLCAKKwkJCQkJICAgICAgIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICpvYmo7CQorICAgIHBqc3VhX2J1ZGR5X2NvbmZpZyBjZmc7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIHBqc3VhX2J1ZGR5X2NvbmZpZ19kZWZhdWx0KCZjZmcpOworICAgIG9iaiA9IChQeU9ial9wanN1YV9idWRkeV9jb25maWcgKikgCisJICBQeU9ial9wanN1YV9idWRkeV9jb25maWdfbmV3KCZQeVR5cF9wanN1YV9idWRkeV9jb25maWcsIE5VTEwsIE5VTEwpOworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19pbXBvcnQob2JqLCAmY2ZnKTsKKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOworfQorCisvKgorICogcHlfcGpzdWFfZ2V0X2J1ZGR5X2NvdW50CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZ2V0X2J1ZGR5X2NvdW50KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcGpzdWFfZ2V0X2J1ZGR5X2NvdW50KCkpOworfQorCisvKgorICogcHlfcGpzdWFfYnVkZHlfaXNfdmFsaWQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9pc192YWxpZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGlkOworICAgIGludCBpc192YWxpZDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlzX3ZhbGlkID0gcGpzdWFfYnVkZHlfaXNfdmFsaWQoaWQpOworCQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaXNfdmFsaWQpOworfQorCisvKgorICogcHlfcGpzdWFfZW51bV9idWRkaWVzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfZW51bV9idWRkaWVzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBwanN1YV9idWRkeV9pZCBpZFtQSlNVQV9NQVhfQlVERElFU107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaWQpOworICAgIHN0YXR1cyA9IHBqc3VhX2VudW1fYnVkZGllcyhpZCwgJmMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwljID0gMDsKKworICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoUHlPYmplY3QqKWxpc3Q7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9maW5kCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYnVkZHlfZmluZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgUHlPYmplY3QgKnBVUkk7CisgICAgcGpfc3RyX3QgdXJpOworICAgIHBqc3VhX2J1ZGR5X2lkIGJ1ZGR5X2lkOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPIiwgJnBVUkkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socFVSSSkpCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBQSlNVQV9JTlZBTElEX0lEKTsKKworICAgIHVyaSA9IFB5U3RyaW5nX1RvUEoocFVSSSk7CisgICAgYnVkZHlfaWQgPSBwanN1YV9idWRkeV9maW5kKCZ1cmkpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBidWRkeV9pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9nZXRfaW5mbworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2J1ZGR5X2dldF9pbmZvKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGJ1ZGR5X2lkOworICAgIHBqc3VhX2J1ZGR5X2luZm8gaW5mbzsKKyAgICBpbnQgc3RhdHVzOwkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZidWRkeV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfZ2V0X2luZm8oYnVkZHlfaWQsICZpbmZvKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlQeU9ial9wanN1YV9idWRkeV9pbmZvICpvYmo7CisKKwlvYmogPSAoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqKQorCSAgICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19uZXcoJlB5VHlwX3Bqc3VhX2J1ZGR5X2luZm8sIAorCQkJCQkgICBOVUxMLCBOVUxMKTsKKwlQeU9ial9wanN1YV9idWRkeV9pbmZvX2ltcG9ydChvYmosICZpbmZvKTsJCisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKW9iajsKKyAgICB9IGVsc2UgeworCXJldHVybiBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICB9Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9hZGQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9hZGQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgCisgICAgUHlPYmplY3QgKnBDZmc7CisgICAgaW50IGJ1ZGR5X2lkOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk8iLCAmcENmZykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBDZmcgIT0gUHlfTm9uZSkgeworCXBqc3VhX2J1ZGR5X2NvbmZpZyBjZmc7CisJUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICpiYzsKKworICAgICAgICBiYyA9IChQeU9ial9wanN1YV9idWRkeV9jb25maWcgKilwQ2ZnOworCisJcGpzdWFfYnVkZHlfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisgICAgICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19leHBvcnQoJmNmZywgYmMpOyAgCisgICAgCisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2J1ZGR5X2FkZCgmY2ZnLCAmYnVkZHlfaWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gUEpfRUlOVkFMOworCWJ1ZGR5X2lkID0gUEpTVUFfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgc3RhdHVzLCBidWRkeV9pZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9kZWwKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9idWRkeV9kZWwoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBidWRkeV9pZDsKKyAgICBpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICp1c2VyX2RhdGE7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYnVkZHlfaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVzZXJfZGF0YSA9IChQeU9iamVjdCopIHBqc3VhX2J1ZGR5X2dldF91c2VyX2RhdGEoYnVkZHlfaWQpOworICAgIFB5X1hERUNSRUYodXNlcl9kYXRhKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2J1ZGR5X2RlbChidWRkeV9pZCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9zZXRfdXNlcl9kYXRhCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYnVkZHlfc2V0X3VzZXJfZGF0YShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGJ1ZGR5X2lkOworICAgIGludCBzdGF0dXM7CisgICAgUHlPYmplY3QgKnVzZXJfZGF0YSwgKm9sZF91c2VyX2RhdGE7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlPIiwgJmJ1ZGR5X2lkLCAmdXNlcl9kYXRhKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXBqc3VhX2J1ZGR5X2lzX3ZhbGlkKGJ1ZGR5X2lkKSkgeworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgMCk7CisgICAgfQorCisgICAgb2xkX3VzZXJfZGF0YSA9IChQeU9iamVjdCopIHBqc3VhX2J1ZGR5X2dldF91c2VyX2RhdGEoYnVkZHlfaWQpOworCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfc2V0X3VzZXJfZGF0YShidWRkeV9pZCwgKHZvaWQqKXVzZXJfZGF0YSk7CisKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwlQeV9YSU5DUkVGKHVzZXJfZGF0YSk7CisJUHlfWERFQ1JFRihvbGRfdXNlcl9kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9idWRkeV9nZXRfdXNlcl9kYXRhCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYnVkZHlfZ2V0X3VzZXJfZGF0YShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IGJ1ZGR5X2lkOworICAgIFB5T2JqZWN0ICp1c2VyX2RhdGE7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmYnVkZHlfaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVzZXJfZGF0YSA9IChQeU9iamVjdCopIHBqc3VhX2J1ZGR5X2dldF91c2VyX2RhdGEoYnVkZHlfaWQpOworCisgICAgcmV0dXJuIHVzZXJfZGF0YT8gUHlfQnVpbGRWYWx1ZSgiTyIsIHVzZXJfZGF0YSkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2J1ZGR5X3N1YnNjcmliZV9wcmVzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXMoUHlPYmplY3QgKnBTZWxmLCAKKwkJCQkJICAgICAgIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBpbnQgYnVkZHlfaWQ7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgc3Vic2NyaWJlOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZidWRkeV9pZCwgJnN1YnNjcmliZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXMoYnVkZHlfaWQsIHN1YnNjcmliZSk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9wcmVzX2R1bXAKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wcmVzX2R1bXAoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCB2ZXJib3NlOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJnZlcmJvc2UpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqc3VhX3ByZXNfZHVtcCh2ZXJib3NlKTsJCisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiIik7Cit9CisKKy8qCisgKiBweV9wanN1YV9pbV9zZW5kCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfaW1fc2VuZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgYWNjX2lkOworICAgIHBqX3N0cl90ICptaW1lX3R5cGUsIHRtcF9taW1lX3R5cGU7CisgICAgcGpfc3RyX3QgdG8sIGNvbnRlbnQ7CisgICAgUHlPYmplY3QgKnBUbzsKKyAgICBQeU9iamVjdCAqcE1pbWVUeXBlOworICAgIFB5T2JqZWN0ICpwQ29udGVudDsKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqcE1zZ0RhdGE7CisgICAgaW50IHVzZXJfZGF0YTsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpT09PT2kiLCAmYWNjX2lkLCAKKwkJJnBUbywgJnBNaW1lVHlwZSwgJnBDb250ZW50LCAmcE1zZ0RhdGEsICZ1c2VyX2RhdGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBNaW1lVHlwZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIG1pbWVfdHlwZSA9ICZ0bXBfbWltZV90eXBlOworCXRtcF9taW1lX3R5cGUgPSBQeVN0cmluZ19Ub1BKKHBNaW1lVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWltZV90eXBlID0gTlVMTDsKKyAgICB9CisKKyAgICB0byA9IFB5U3RyaW5nX1RvUEoocFRvKTsKKyAgICBjb250ZW50ID0gUHlTdHJpbmdfVG9QSihwQ29udGVudCk7CisKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKyAgICBpZiAocE1zZ0RhdGEgIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX21zZ19kYXRhICpvbWQ7CisKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopcE1zZ0RhdGE7CisJbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisJbXNnX2RhdGEubXNnX2JvZHkgPSBQeVN0cmluZ19Ub1BKKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInB5dG1wIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfaW1fc2VuZChhY2NfaWQsICZ0bywgbWltZV90eXBlLCAmY29udGVudCwgCisJCQkgICAmbXNnX2RhdGEsICh2b2lkKikobG9uZyl1c2VyX2RhdGEpOworICAgIGlmIChwb29sKQorCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2ltX3R5cGluZworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2ltX3R5cGluZyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgYWNjX2lkOworICAgIHBqX3N0cl90IHRvOworICAgIFB5T2JqZWN0ICpwVG87CisgICAgaW50IGlzX3R5cGluZzsKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqcE1zZ0RhdGE7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9pTyIsICZhY2NfaWQsICZwVG8sICZpc190eXBpbmcsIAorCQkJICAmcE1zZ0RhdGEpKSAKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICB0byA9IFB5U3RyaW5nX1RvUEoocFRvKTsKKworICAgIHBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKworICAgIGlmIChwTXNnRGF0YSAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfbXNnX2RhdGEgKm9tZDsKKworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilwTXNnRGF0YTsKKwltc2dfZGF0YS5jb250ZW50X3R5cGUgPSBQeVN0cmluZ19Ub1BKKG9tZC0+Y29udGVudF90eXBlKTsKKwltc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX1RvUEoob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2ltX3R5cGluZyhhY2NfaWQsICZ0bywgaXNfdHlwaW5nLCAmbXNnX2RhdGEpOworCisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9jb25maWdfZGVmYXVsdF9kb2NbXSA9CisgICAgIl9wanN1YS5CdWRkeV9Db25maWcgX3Bqc3VhLmJ1ZGR5X2NvbmZpZ19kZWZhdWx0ICgpICIKKyAgICAiU2V0IGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBidWRkeSBjb25maWcuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2dldF9idWRkeV9jb3VudF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuZ2V0X2J1ZGR5X2NvdW50ICgpICIKKyAgICAiR2V0IHRvdGFsIG51bWJlciBvZiBidWRkaWVzLiI7CitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9pc192YWxpZF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuYnVkZHlfaXNfdmFsaWQgKGludCBidWRkeV9pZCkgIgorICAgICJDaGVjayBpZiBidWRkeSBJRCBpcyB2YWxpZC4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9idWRkaWVzX2RvY1tdID0KKyAgICAiaW50W10gX3Bqc3VhLmVudW1fYnVkZGllcyAoKSAiCisgICAgIkVudW0gYnVkZHkgSURzLiI7CitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9nZXRfaW5mb19kb2NbXSA9CisgICAgIl9wanN1YS5CdWRkeV9JbmZvIF9wanN1YS5idWRkeV9nZXRfaW5mbyAoaW50IGJ1ZGR5X2lkKSAiCisgICAgIkdldCBkZXRhaWxlZCBidWRkeSBpbmZvLiI7CitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9hZGRfZG9jW10gPQorICAgICJpbnQsaW50IF9wanN1YS5idWRkeV9hZGQgKF9wanN1YS5CdWRkeV9Db25maWcgY2ZnKSAiCisgICAgIkFkZCBuZXcgYnVkZHkuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2J1ZGR5X2RlbF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuYnVkZHlfZGVsIChpbnQgYnVkZHlfaWQpICIKKyAgICAiRGVsZXRlIGJ1ZGR5LiI7CitzdGF0aWMgY2hhciBwanN1YV9idWRkeV9zdWJzY3JpYmVfcHJlc19kb2NbXSA9CisgICAgImludCBfcGpzdWEuYnVkZHlfc3Vic2NyaWJlX3ByZXMgKGludCBidWRkeV9pZCwgaW50IHN1YnNjcmliZSkgIgorICAgICJFbmFibGUvZGlzYWJsZSBidWRkeSdzIHByZXNlbmNlIG1vbml0b3JpbmcuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3ByZXNfZHVtcF9kb2NbXSA9CisgICAgInZvaWQgX3Bqc3VhLnByZXNfZHVtcCAoaW50IHZlcmJvc2UpICIKKyAgICAiRHVtcCBwcmVzZW5jZSBzdWJzY3JpcHRpb25zIHRvIGxvZyBmaWxlLiI7CitzdGF0aWMgY2hhciBwanN1YV9pbV9zZW5kX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5pbV9zZW5kIChpbnQgYWNjX2lkLCBzdHJpbmcgdG8sIHN0cmluZyBtaW1lX3R5cGUsICIKKyAgICAic3RyaW5nIGNvbnRlbnQsIF9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSwgaW50IHVzZXJfZGF0YSkgIgorICAgICJTZW5kIGluc3RhbnQgbWVzc2FnaW5nIG91dHNpZGUgZGlhbG9nLCB1c2luZyB0aGUgc3BlY2lmaWVkIGFjY291bnQgIgorICAgICJmb3Igcm91dGUgc2V0IGFuZCBhdXRoZW50aWNhdGlvbi4iOworc3RhdGljIGNoYXIgcGpzdWFfaW1fdHlwaW5nX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5pbV90eXBpbmcgKGludCBhY2NfaWQsIHN0cmluZyB0bywgaW50IGlzX3R5cGluZywgIgorICAgICJfcGpzdWEuTXNnX0RhdGEgbXNnX2RhdGEpICIKKyAgICAiU2VuZCB0eXBpbmcgaW5kaWNhdGlvbiBvdXRzaWRlIGRpYWxvZy4iOworCisvKiBFTkQgT0YgTElCIEJVRERZICovCisKKy8qIExJQiBNRURJQSAqLworCisKKy8qCisgKiBweV9wanN1YV9jb25mX2dldF9tYXhfcG9ydHMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2dldF9tYXhfcG9ydHMoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBwanN1YV9jb25mX2dldF9tYXhfcG9ydHMoKSk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2dldF9hY3RpdmVfcG9ydHMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2dldF9hY3RpdmVfcG9ydHMoUHlPYmplY3QgKnBTZWxmLCAKKwkJCQkJCVB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0cygpKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fY29uZl9wb3J0cworICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2VudW1fY29uZl9wb3J0cyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgcGpzdWFfY29uZl9wb3J0X2lkIGlkW1BKU1VBX01BWF9DT05GX1BPUlRTXTsKKyAgICB1bnNpZ25lZCBjLCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICBjID0gUEpfQVJSQVlfU0laRShpZCk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9jb25mX3BvcnRzKGlkLCAmYyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWMgPSAwOworICAgIAorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfQnVpbGRWYWx1ZSgiaSIsIGlkW2ldKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAoUHlPYmplY3QqKWxpc3Q7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2dldF9wb3J0X2luZm8KKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2dldF9wb3J0X2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8gKnJldDsKKyAgICBwanN1YV9jb25mX3BvcnRfaW5mbyBpbmZvOworICAgIGludCBzdGF0dXM7CQorICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2dldF9wb3J0X2luZm8oaWQsICZpbmZvKTsKKyAgICByZXQgPSAoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8gKikKKwkgIGNvbmZfcG9ydF9pbmZvX25ldygmUHlUeXBfcGpzdWFfY29uZl9wb3J0X2luZm8sIE5VTEwsIE5VTEwpOworICAgIHJldC0+Yml0c19wZXJfc2FtcGxlID0gaW5mby5iaXRzX3Blcl9zYW1wbGU7CisgICAgcmV0LT5jaGFubmVsX2NvdW50ID0gaW5mby5jaGFubmVsX2NvdW50OworICAgIHJldC0+Y2xvY2tfcmF0ZSA9IGluZm8uY2xvY2tfcmF0ZTsKKyAgICByZXQtPm5hbWUgPSBQeVN0cmluZ19Gcm9tUEooJmluZm8ubmFtZSk7CisgICAgcmV0LT5zYW1wbGVzX3Blcl9mcmFtZSA9IGluZm8uc2FtcGxlc19wZXJfZnJhbWU7CisgICAgcmV0LT5zbG90X2lkID0gaW5mby5zbG90X2lkOworICAgIFB5X1hERUNSRUYocmV0LT5saXN0ZW5lcnMpOworICAgIHJldC0+bGlzdGVuZXJzID0gUHlMaXN0X05ldyhpbmZvLmxpc3RlbmVyX2NudCk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm8ubGlzdGVuZXJfY250OyBpKyspIHsKKwlQeU9iamVjdCAqaXRlbSA9IFB5X0J1aWxkVmFsdWUoImkiLGluZm8ubGlzdGVuZXJzW2ldKTsKKwlQeUxpc3RfU2V0SXRlbShyZXQtPmxpc3RlbmVycywgaSwgaXRlbSk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QqKXJldDsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NvbmZfcmVtb3ZlX3BvcnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX3JlbW92ZV9wb3J0KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGlkOworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZpZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX3JlbW92ZV9wb3J0KGlkKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2Nvbm5lY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2Nvbm5lY3QoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc291cmNlLCBzaW5rOworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmc291cmNlLCAmc2luaykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Nvbm5lY3Qoc291cmNlLCBzaW5rKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX2Rpc2Nvbm5lY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb25mX2Rpc2Nvbm5lY3QoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc291cmNlLCBzaW5rOworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmc291cmNlLCAmc2luaykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2Rpc2Nvbm5lY3Qoc291cmNlLCBzaW5rKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb25mX3NldF90eF9sZXZlbAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NvbmZfc2V0X3R4X2xldmVsKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHNsb3Q7CisgICAgZmxvYXQgbGV2ZWw7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpZiIsICZzbG90LCAmbGV2ZWwpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9hZGp1c3RfdHhfbGV2ZWwoc2xvdCwgbGV2ZWwpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NvbmZfc2V0X3J4X2xldmVsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9zZXRfcnhfbGV2ZWwoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc2xvdDsKKyAgICBmbG9hdCBsZXZlbDsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlmIiwgJnNsb3QsICZsZXZlbCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jb25mX2FkanVzdF9yeF9sZXZlbChzbG90LCBsZXZlbCk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY29uZl9nZXRfc2lnbmFsX2xldmVsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29uZl9nZXRfc2lnbmFsX2xldmVsKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCQlQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc2xvdDsKKyAgICB1bnNpZ25lZCB0eF9sZXZlbCwgcnhfbGV2ZWw7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJnNsb3QpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfY29uZl9nZXRfc2lnbmFsX2xldmVsKHNsb3QsICZ0eF9sZXZlbCwgJnJ4X2xldmVsKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWZmIiwgc3RhdHVzLCAoZmxvYXQpKHR4X2xldmVsLzI1NS4wKSwgCisJCQkgKGZsb2F0KShyeF9sZXZlbC8yNTUuMCkpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWVyX2NyZWF0ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3BsYXllcl9jcmVhdGUoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgaW50IG9wdGlvbnM7CisgICAgUHlPYmplY3QgKnBGaWxlbmFtZTsKKyAgICBwal9zdHJfdCBmaWxlbmFtZTsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9pIiwgJnBGaWxlbmFtZSwgJm9wdGlvbnMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZpbGVuYW1lID0gUHlTdHJpbmdfVG9QSihwRmlsZW5hbWUpOworICAgIHN0YXR1cyA9IHBqc3VhX3BsYXllcl9jcmVhdGUoJmZpbGVuYW1lLCBvcHRpb25zLCAmaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWxpc3RfY3JlYXRlCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcGxheWxpc3RfY3JlYXRlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGlkOworICAgIGludCBvcHRpb25zOworICAgIFB5T2JqZWN0ICpwTGFiZWwsICpwRmlsZUxpc3Q7CisgICAgcGpfc3RyX3QgbGFiZWw7CisgICAgaW50IGNvdW50OworICAgIHBqX3N0cl90IGZpbGVzWzY0XTsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9PaSIsICZwTGFiZWwsICZwRmlsZUxpc3QsICZvcHRpb25zKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsYWJlbCA9IFB5U3RyaW5nX1RvUEoocExhYmVsKTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhwRmlsZUxpc3QpKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIFBKX0VJTlZBTCwgUEpTVUFfSU5WQUxJRF9JRCk7CisKKyAgICBjb3VudCA9IDA7CisgICAgZm9yIChjb3VudD0wOyBjb3VudDxQeUxpc3RfU2l6ZShwRmlsZUxpc3QpICYmIAorCQkgIGNvdW50PFBKX0FSUkFZX1NJWkUoZmlsZXMpOyArK2NvdW50KSAKKyAgICB7CisJZmlsZXNbY291bnRdID0gUHlTdHJpbmdfVG9QSihQeUxpc3RfR2V0SXRlbShwRmlsZUxpc3QsIGNvdW50KSk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfcGxheWxpc3RfY3JlYXRlKGZpbGVzLCBjb3VudCwgJmxhYmVsLCBvcHRpb25zLCAmaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHN0YXR1cywgaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydChQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkgICAgICAgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgCisgICAgaW50IGlkLCBwb3J0X2lkOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgcG9ydF9pZCA9IHBqc3VhX3BsYXllcl9nZXRfY29uZl9wb3J0KGlkKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBvcnRfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWVyX3NldF9wb3MKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wbGF5ZXJfc2V0X3BvcyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBpZDsKKyAgICBpbnQgc2FtcGxlczsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpIiwgJmlkLCAmc2FtcGxlcykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBpZiAoc2FtcGxlcyA8IDApCisJc2FtcGxlcyA9IDA7CisKKyAgICBzdGF0dXMgPSBwanN1YV9wbGF5ZXJfc2V0X3BvcyhpZCwgc2FtcGxlcyk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfcGxheWVyX2Rlc3Ryb3kKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9wbGF5ZXJfZGVzdHJveShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBpZDsKKyAgICBpbnQgc3RhdHVzOwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfcGxheWVyX2Rlc3Ryb3koaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX3JlY29yZGVyX2NyZWF0ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3JlY29yZGVyX2NyZWF0ZShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBpZCwgb3B0aW9uczsKKyAgICBpbnQgbWF4X3NpemU7CisgICAgUHlPYmplY3QgKnBGaWxlbmFtZSwgKnBFbmNQYXJhbTsKKyAgICBwal9zdHJfdCBmaWxlbmFtZTsKKyAgICBpbnQgZW5jX3R5cGU7CisgICAgCisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPaU9paSIsICZwRmlsZW5hbWUsICZlbmNfdHlwZSwgJnBFbmNQYXJhbSwKKwkJCSAgJm1heF9zaXplLCAmb3B0aW9ucykpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX1RvUEoocEZpbGVuYW1lKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX3JlY29yZGVyX2NyZWF0ZSgmZmlsZW5hbWUsIGVuY190eXBlLCBOVUxMLCBtYXhfc2l6ZSwKKwkJCQkgICBvcHRpb25zLCAmaWQpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgc3RhdHVzLCBpZCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfcmVjb3JkZXJfZ2V0X2NvbmZfcG9ydChQeU9iamVjdCAqcFNlbGYsIAorCQkJCQkJIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIAorICAgIGludCBpZCwgcG9ydF9pZDsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHBvcnRfaWQgPSBwanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0KGlkKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBvcnRfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfcmVjb3JkZXJfZGVzdHJveQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3JlY29yZGVyX2Rlc3Ryb3koUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgaWQ7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmlkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX3JlY29yZGVyX2Rlc3Ryb3koaWQpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fc25kX2RldnMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9lbnVtX3NuZF9kZXZzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIHBqbWVkaWFfc25kX2Rldl9pbmZvIGluZm9bU05EX0RFVl9OVU1dOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGMgPSBQSl9BUlJBWV9TSVpFKGluZm8pOworICAgIHN0YXR1cyA9IHBqc3VhX2VudW1fc25kX2RldnMoaW5mbywgJmMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwljID0gMDsKKyAgICAKKyAgICByZXQgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspICB7CisgICAgICAgIFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvICogb2JqOworCisgICAgICAgIG9iaiA9IChQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbyAqKQorCSAgICAgIHBqbWVkaWFfc25kX2Rldl9pbmZvX25ldygmUHlUeXBfcGptZWRpYV9zbmRfZGV2X2luZm8sIAorCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgb2JqLT5kZWZhdWx0X3NhbXBsZXNfcGVyX3NlYyA9IGluZm9baV0uZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWM7CisgICAgICAgIG9iai0+aW5wdXRfY291bnQgPSBpbmZvW2ldLmlucHV0X2NvdW50OworICAgICAgICBvYmotPm91dHB1dF9jb3VudCA9IGluZm9baV0ub3V0cHV0X2NvdW50OworICAgICAgICBvYmotPm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZm9baV0ubmFtZSk7CisKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0ocmV0LCBpLCAoUHlPYmplY3QgKilvYmopOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0KilyZXQ7Cit9CisKKy8qCisgKiBweV9wanN1YV9nZXRfc25kX2RldgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2dldF9zbmRfZGV2KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhcHR1cmVfZGV2LCBwbGF5YmFja19kZXY7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9nZXRfc25kX2RldigmY2FwdHVyZV9kZXYsICZwbGF5YmFja19kZXYpOworICAgIAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIGNhcHR1cmVfZGV2LCBwbGF5YmFja19kZXYpOworfQorCisvKgorICogcHlfcGpzdWFfc2V0X3NuZF9kZXYKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9zZXRfc25kX2RldihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2OworICAgIGludCBzdGF0dXM7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWkiLCAmY2FwdHVyZV9kZXYsICZwbGF5YmFja19kZXYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfc2V0X3NuZF9kZXYoY2FwdHVyZV9kZXYsIHBsYXliYWNrX2Rldik7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfc2V0X251bGxfc25kX2RldgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX3NldF9udWxsX3NuZF9kZXYoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc3RhdHVzOwkKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgc3RhdHVzID0gcGpzdWFfc2V0X251bGxfc25kX2RldigpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfc2V0X2VjCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfc2V0X2VjKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IG9wdGlvbnM7CisgICAgaW50IHRhaWxfbXM7CisgICAgaW50IHN0YXR1czsJCisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaSIsICZ0YWlsX21zLCAmb3B0aW9ucykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKworICAgIHN0YXR1cyA9IHBqc3VhX3NldF9lYyh0YWlsX21zLCBvcHRpb25zKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9nZXRfZWNfdGFpbAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2dldF9lY190YWlsKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHN0YXR1czsJCisgICAgdW5zaWduZWQgdGFpbF9tczsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgc3RhdHVzID0gcGpzdWFfZ2V0X2VjX3RhaWwoJnRhaWxfbXMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwl0YWlsX21zID0gMDsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHRhaWxfbXMpOworfQorCisvKgorICogcHlfcGpzdWFfZW51bV9jb2RlY3MKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9lbnVtX2NvZGVjcyhQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBwanN1YV9jb2RlY19pbmZvIGluZm9bUEpNRURJQV9DT0RFQ19NR1JfTUFYX0NPREVDU107CisgICAgdW5zaWduZWQgYywgaTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworICAgIFBKX1VOVVNFRF9BUkcocEFyZ3MpOworCisgICAgYyA9IFBKX0FSUkFZX1NJWkUoaW5mbyk7CisgICAgc3RhdHVzID0gcGpzdWFfZW51bV9jb2RlY3MoaW5mbywgJmMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwljID0gMDsKKyAgICAKKyAgICByZXQgPSBQeUxpc3RfTmV3KGMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspICB7CisgICAgICAgIFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8gKiBvYmo7CisgICAgICAgIG9iaiA9IChQeU9ial9wanN1YV9jb2RlY19pbmZvICopCisJICAgICAgY29kZWNfaW5mb19uZXcoJlB5VHlwX3Bqc3VhX2NvZGVjX2luZm8sIE5VTEwsIE5VTEwpOworICAgICAgICBvYmotPmNvZGVjX2lkID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvW2ldLmNvZGVjX2lkKTsKKyAgICAgICAgb2JqLT5wcmlvcml0eSA9IGluZm9baV0ucHJpb3JpdHk7CisKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0ocmV0LCBpLCAoUHlPYmplY3QgKilvYmopOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QqKXJldDsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBzdGF0dXM7CQorICAgIFB5T2JqZWN0ICpwQ29kZWNJZDsKKyAgICBwal9zdHJfdCBjb2RlY19pZDsKKyAgICBpbnQgcHJpb3JpdHk7CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPaSIsICZwQ29kZWNJZCwgJnByaW9yaXR5KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb2RlY19pZCA9IFB5U3RyaW5nX1RvUEoocENvZGVjSWQpOworICAgIGlmIChwcmlvcml0eSA8IDApCisJcHJpb3JpdHkgPSAwOworICAgIGlmIChwcmlvcml0eSA+IDI1NSkKKwlwcmlvcml0eSA9IDI1NTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX3NldF9wcmlvcml0eSgmY29kZWNfaWQsIChwal91aW50OF90KXByaW9yaXR5KTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jb2RlY19nZXRfcGFyYW0KKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jb2RlY19nZXRfcGFyYW0oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgc3RhdHVzOwkKKyAgICBQeU9iamVjdCAqcENvZGVjSWQ7CisgICAgcGpfc3RyX3QgY29kZWNfaWQ7CisgICAgcGptZWRpYV9jb2RlY19wYXJhbSBwYXJhbTsKKyAgICBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtICpyZXQ7CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJPIiwgJnBDb2RlY0lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorCisgICAgY29kZWNfaWQgPSBQeVN0cmluZ19Ub1BKKHBDb2RlY0lkKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX2dldF9wYXJhbSgmY29kZWNfaWQsICZwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCIiKTsKKworICAgIHJldCA9IChQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtICopCisJICBwam1lZGlhX2NvZGVjX3BhcmFtX25ldygmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbSwgTlVMTCwgTlVMTCk7CisKKyAgICByZXQtPmluZm8tPmF2Z19icHMgPSBwYXJhbS5pbmZvLmF2Z19icHM7CisgICAgcmV0LT5pbmZvLT5jaGFubmVsX2NudCA9IHBhcmFtLmluZm8uY2hhbm5lbF9jbnQ7CisgICAgcmV0LT5pbmZvLT5jbG9ja19yYXRlID0gcGFyYW0uaW5mby5jbG9ja19yYXRlOworICAgIHJldC0+aW5mby0+ZnJtX3B0aW1lID0gcGFyYW0uaW5mby5mcm1fcHRpbWU7CisgICAgcmV0LT5pbmZvLT5wY21fYml0c19wZXJfc2FtcGxlID0gcGFyYW0uaW5mby5wY21fYml0c19wZXJfc2FtcGxlOworICAgIHJldC0+aW5mby0+cHQgPSBwYXJhbS5pbmZvLnB0OworICAgIHJldC0+c2V0dGluZy0+Y25nID0gcGFyYW0uc2V0dGluZy5jbmc7CisgICAgLy9yZXQtPnNldHRpbmctPmRlY19mbXRwX21vZGUgPSBwYXJhbS5zZXR0aW5nLmRlY19mbXRwX21vZGU7CisgICAgLy9yZXQtPnNldHRpbmctPmVuY19mbXRwX21vZGUgPSBwYXJhbS5zZXR0aW5nLmVuY19mbXRwX21vZGU7CisgICAgcmV0LT5zZXR0aW5nLT5mcm1fcGVyX3BrdCA9IHBhcmFtLnNldHRpbmcuZnJtX3Blcl9wa3Q7CisgICAgcmV0LT5zZXR0aW5nLT5wZW5oID0gcGFyYW0uc2V0dGluZy5wZW5oOworICAgIHJldC0+c2V0dGluZy0+cGxjID0gcGFyYW0uc2V0dGluZy5wbGM7CisgICAgcmV0LT5zZXR0aW5nLT52YWQgPSBwYXJhbS5zZXR0aW5nLnZhZDsKKworICAgIHJldHVybiAoUHlPYmplY3QqKXJldDsKK30KKworCisvKgorICogcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IHN0YXR1czsJCisgICAgUHlPYmplY3QgKnBDb2RlY0lkLCAqcENvZGVjUGFyYW07CisgICAgcGpfc3RyX3QgY29kZWNfaWQ7CisgICAgcGptZWRpYV9jb2RlY19wYXJhbSBwYXJhbTsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgIk9PIiwgJnBDb2RlY0lkLCAmcENvZGVjUGFyYW0pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisKKyAgICBjb2RlY19pZCA9IFB5U3RyaW5nX1RvUEoocENvZGVjSWQpOworCisgICAgaWYgKHBDb2RlY1BhcmFtICE9IFB5X05vbmUpIHsKKwlQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtICpvYmo7CisKKyAgICAgICAgb2JqID0gKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW0gKilwQ29kZWNQYXJhbTsKKworICAgICAgICBwYXJhbS5pbmZvLmF2Z19icHMgPSBvYmotPmluZm8tPmF2Z19icHM7CisgICAgICAgIHBhcmFtLmluZm8uY2hhbm5lbF9jbnQgPSBvYmotPmluZm8tPmNoYW5uZWxfY250OworICAgICAgICBwYXJhbS5pbmZvLmNsb2NrX3JhdGUgPSBvYmotPmluZm8tPmNsb2NrX3JhdGU7CisgICAgICAgIHBhcmFtLmluZm8uZnJtX3B0aW1lID0gb2JqLT5pbmZvLT5mcm1fcHRpbWU7CisgICAgICAgIHBhcmFtLmluZm8ucGNtX2JpdHNfcGVyX3NhbXBsZSA9IG9iai0+aW5mby0+cGNtX2JpdHNfcGVyX3NhbXBsZTsKKyAgICAgICAgcGFyYW0uaW5mby5wdCA9IG9iai0+aW5mby0+cHQ7CisgICAgICAgIHBhcmFtLnNldHRpbmcuY25nID0gb2JqLT5zZXR0aW5nLT5jbmc7CisgICAgICAgIC8vcGFyYW0uc2V0dGluZy5kZWNfZm10cF9tb2RlID0gb2JqLT5zZXR0aW5nLT5kZWNfZm10cF9tb2RlOworICAgICAgICAvL3BhcmFtLnNldHRpbmcuZW5jX2ZtdHBfbW9kZSA9IG9iai0+c2V0dGluZy0+ZW5jX2ZtdHBfbW9kZTsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5mcm1fcGVyX3BrdCA9IG9iai0+c2V0dGluZy0+ZnJtX3Blcl9wa3Q7CisgICAgICAgIHBhcmFtLnNldHRpbmcucGVuaCA9IG9iai0+c2V0dGluZy0+cGVuaDsKKyAgICAgICAgcGFyYW0uc2V0dGluZy5wbGMgPSBvYmotPnNldHRpbmctPnBsYzsKKyAgICAgICAgcGFyYW0uc2V0dGluZy52YWQgPSBvYmotPnNldHRpbmctPnZhZDsKKyAgICAgICAgc3RhdHVzID0gcGpzdWFfY29kZWNfc2V0X3BhcmFtKCZjb2RlY19pZCwgJnBhcmFtKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IHBqc3VhX2NvZGVjX3NldF9wYXJhbSgmY29kZWNfaWQsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9nZXRfbWF4X3BvcnRzX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jb25mX2dldF9tYXhfcG9ydHMgKCkgIgorICAgICJHZXQgbWF4aW51bSBudW1iZXIgb2YgY29uZmVyZW5jZSBwb3J0cy4iOworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9nZXRfYWN0aXZlX3BvcnRzX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jb25mX2dldF9hY3RpdmVfcG9ydHMgKCkgIgorICAgICJHZXQgY3VycmVudCBudW1iZXIgb2YgYWN0aXZlIHBvcnRzIGluIHRoZSBicmlkZ2UuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2VudW1fY29uZl9wb3J0c19kb2NbXSA9CisgICAgImludFtdIF9wanN1YS5lbnVtX2NvbmZfcG9ydHMgKCkgIgorICAgICJFbnVtZXJhdGUgYWxsIGNvbmZlcmVuY2UgcG9ydHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZfZ2V0X3BvcnRfaW5mb19kb2NbXSA9CisgICAgIl9wanN1YS5Db25mX1BvcnRfSW5mbyBfcGpzdWEuY29uZl9nZXRfcG9ydF9pbmZvIChpbnQgaWQpICIKKyAgICAiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgY29uZmVyZW5jZSBwb3J0IjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZfcmVtb3ZlX3BvcnRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNvbmZfcmVtb3ZlX3BvcnQgKGludCBpZCkgIgorICAgICJSZW1vdmUgYXJiaXRyYXJ5IHNsb3QgZnJvbSB0aGUgY29uZmVyZW5jZSBicmlkZ2UuICIKKyAgICAiQXBwbGljYXRpb24gc2hvdWxkIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uICIKKyAgICAiaWYgaXQgcmVnaXN0ZXJlZCB0aGUgcG9ydCBtYW51YWxseS4iOworc3RhdGljIGNoYXIgcGpzdWFfY29uZl9jb25uZWN0X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jb25mX2Nvbm5lY3QgKGludCBzb3VyY2UsIGludCBzaW5rKSAiCisgICAgIkVzdGFibGlzaCB1bmlkaXJlY3Rpb25hbCBtZWRpYSBmbG93IGZyb20gc291Y2UgdG8gc2luay4gIgorICAgICJPbmUgc291cmNlIG1heSB0cmFuc21pdCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMvc2luay4gIgorICAgICJBbmQgaWYgbXVsdGlwbGUgc291cmNlcyBhcmUgdHJhbnNtaXR0aW5nIHRvIHRoZSBzYW1lIHNpbmssICIKKyAgICAidGhlIG1lZGlhIHdpbGwgYmUgbWl4ZWQgdG9nZXRoZXIuIFNvdXJjZSBhbmQgc2luayBtYXkgcmVmZXIgIgorICAgICJ0byB0aGUgc2FtZSBJRCwgZWZmZWN0aXZlbHkgbG9vcGluZyB0aGUgbWVkaWEuICIKKyAgICAiSWYgYmlkaXJlY3Rpb25hbCBtZWRpYSBmbG93IGlzIGRlc2lyZWQsIGFwcGxpY2F0aW9uICIKKyAgICAibmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHR3aWNlLCB3aXRoIHRoZSBzZWNvbmQgIgorICAgICJvbmUgaGF2aW5nIHRoZSBhcmd1bWVudHMgcmV2ZXJzZWQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NvbmZfZGlzY29ubmVjdF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuY29uZl9kaXNjb25uZWN0IChpbnQgc291cmNlLCBpbnQgc2luaykgIgorICAgICJEaXNjb25uZWN0IG1lZGlhIGZsb3cgZnJvbSB0aGUgc291cmNlIHRvIGRlc3RpbmF0aW9uIHBvcnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3BsYXllcl9jcmVhdGVfZG9jW10gPQorICAgICJpbnQsIGludCBfcGpzdWEucGxheWVyX2NyZWF0ZSAoc3RyaW5nIGZpbGVuYW1lLCBpbnQgb3B0aW9ucykgIgorICAgICJDcmVhdGUgYSBmaWxlIHBsYXllciwgYW5kIGF1dG9tYXRpY2FsbHkgY29ubmVjdCAiCisgICAgInRoaXMgcGxheWVyIHRvIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4iOworc3RhdGljIGNoYXIgcGpzdWFfcGxheWVyX2dldF9jb25mX3BvcnRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnBsYXllcl9nZXRfY29uZl9wb3J0IChpbnQpICIKKyAgICAiR2V0IGNvbmZlcmVuY2UgcG9ydCBJRCBhc3NvY2lhdGVkIHdpdGggcGxheWVyLiI7CitzdGF0aWMgY2hhciBwanN1YV9wbGF5ZXJfc2V0X3Bvc19kb2NbXSA9CisgICAgImludCBfcGpzdWEucGxheWVyX3NldF9wb3MgKGludCBpZCwgaW50IHNhbXBsZXMpICIKKyAgICAiU2V0IHBsYXliYWNrIHBvc2l0aW9uLiI7CitzdGF0aWMgY2hhciBwanN1YV9wbGF5ZXJfZGVzdHJveV9kb2NbXSA9CisgICAgImludCBfcGpzdWEucGxheWVyX2Rlc3Ryb3kgKGludCBpZCkgIgorICAgICJDbG9zZSB0aGUgZmlsZSwgcmVtb3ZlIHRoZSBwbGF5ZXIgZnJvbSB0aGUgYnJpZGdlLCAiCisgICAgImFuZCBmcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgcGxheWVyLiI7CitzdGF0aWMgY2hhciBwanN1YV9yZWNvcmRlcl9jcmVhdGVfZG9jW10gPQorICAgICJpbnQsIGludCBfcGpzdWEucmVjb3JkZXJfY3JlYXRlIChzdHJpbmcgZmlsZW5hbWUsICIKKyAgICAiaW50IGVuY190eXBlLCBpbnQgZW5jX3BhcmFtLCBpbnQgbWF4X3NpemUsIGludCBvcHRpb25zKSAiCisgICAgIkNyZWF0ZSBhIGZpbGUgcmVjb3JkZXIsIGFuZCBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgdGhpcyByZWNvcmRlciAiCisgICAgInRvIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4gVGhlIHJlY29yZGVyIGN1cnJlbnRseSBzdXBwb3J0cyByZWNvcmRpbmcgIgorICAgICJXQVYgZmlsZSwgYW5kIG9uIFdpbmRvd3MsIE1QMyBmaWxlLiBUaGUgdHlwZSBvZiB0aGUgcmVjb3JkZXIgdG8gdXNlICIKKyAgICAiaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIChlLmcuICcud2F2JyBvciAnLm1wMycpLiI7CitzdGF0aWMgY2hhciBwanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5yZWNvcmRlcl9nZXRfY29uZl9wb3J0IChpbnQgaWQpICIKKyAgICAiR2V0IGNvbmZlcmVuY2UgcG9ydCBhc3NvY2lhdGVkIHdpdGggcmVjb3JkZXIuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3JlY29yZGVyX2Rlc3Ryb3lfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnJlY29yZGVyX2Rlc3Ryb3kgKGludCBpZCkgIgorICAgICJEZXN0cm95IHJlY29yZGVyICh0aGlzIHdpbGwgY29tcGxldGUgcmVjb3JkaW5nKS4iOworc3RhdGljIGNoYXIgcGpzdWFfZW51bV9zbmRfZGV2c19kb2NbXSA9CisgICAgIl9wanN1YS5QSk1lZGlhX1NuZF9EZXZfSW5mb1tdIF9wanN1YS5lbnVtX3NuZF9kZXZzIChpbnQgY291bnQpICIKKyAgICAiRW51bSBzb3VuZCBkZXZpY2VzLiI7CitzdGF0aWMgY2hhciBwanN1YV9nZXRfc25kX2Rldl9kb2NbXSA9CisgICAgImludCwgaW50IF9wanN1YS5nZXRfc25kX2RldiAoKSAiCisgICAgIkdldCBjdXJyZW50bHkgYWN0aXZlIHNvdW5kIGRldmljZXMuICIKKyAgICAiSWYgc291bmQgZGV2aWNlcyBoYXMgbm90IGJlZW4gY3JlYXRlZCAiCisgICAgIihmb3IgZXhhbXBsZSB3aGVuIHBqc3VhX3N0YXJ0KCkgaXMgbm90IGNhbGxlZCksICIKKyAgICAiaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAiCisgICAgIlBKX1NVQ0NFU1Mgd2l0aCAtMSBhcyBkZXZpY2UgSURzLiI7CitzdGF0aWMgY2hhciBwanN1YV9zZXRfc25kX2Rldl9kb2NbXSA9CisgICAgImludCBfcGpzdWEuc2V0X3NuZF9kZXYgKGludCBjYXB0dXJlX2RldiwgaW50IHBsYXliYWNrX2RldikgIgorICAgICJTZWxlY3Qgb3IgY2hhbmdlIHNvdW5kIGRldmljZS4gQXBwbGljYXRpb24gbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiAiCisgICAgImF0IGFueSB0aW1lIHRvIHJlcGxhY2UgY3VycmVudCBzb3VuZCBkZXZpY2UuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX3NldF9udWxsX3NuZF9kZXZfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnNldF9udWxsX3NuZF9kZXYgKCkgIgorICAgICJTZXQgcGpzdWEgdG8gdXNlIG51bGwgc291bmQgZGV2aWNlLiBUaGUgbnVsbCBzb3VuZCBkZXZpY2Ugb25seSAiCisgICAgInByb3ZpZGVzIHRoZSB0aW1pbmcgbmVlZGVkIGJ5IHRoZSBjb25mZXJlbmNlIGJyaWRnZSwgYW5kIHdpbGwgbm90ICIKKyAgICAiaW50ZXJyYWN0IHdpdGggYW55IGhhcmR3YXJlLiI7CitzdGF0aWMgY2hhciBwanN1YV9zZXRfZWNfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLnNldF9lYyAoaW50IHRhaWxfbXMsIGludCBvcHRpb25zKSAiCisgICAgIkNvbmZpZ3VyZSB0aGUgZWNobyBjYW5jZWxsZXIgdGFpbCBsZW5ndGggb2YgdGhlIHNvdW5kIHBvcnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2dldF9lY190YWlsX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5nZXRfZWNfdGFpbCAoKSAiCisgICAgIkdldCBjdXJyZW50IGVjaG8gY2FuY2VsbGVyIHRhaWwgbGVuZ3RoLiI7CitzdGF0aWMgY2hhciBwanN1YV9lbnVtX2NvZGVjc19kb2NbXSA9CisgICAgIl9wanN1YS5Db2RlY19JbmZvW10gX3Bqc3VhLmVudW1fY29kZWNzICgpICIKKyAgICAiRW51bSBhbGwgc3VwcG9ydGVkIGNvZGVjcyBpbiB0aGUgc3lzdGVtLiI7CitzdGF0aWMgY2hhciBwanN1YV9jb2RlY19zZXRfcHJpb3JpdHlfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNvZGVjX3NldF9wcmlvcml0eSAoc3RyaW5nIGlkLCBpbnQgcHJpb3JpdHkpICIKKyAgICAiQ2hhbmdlIGNvZGVjIHByaW9yaXR5LiI7CitzdGF0aWMgY2hhciBwanN1YV9jb2RlY19nZXRfcGFyYW1fZG9jW10gPQorICAgICJfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbSBfcGpzdWEuY29kZWNfZ2V0X3BhcmFtIChzdHJpbmcgaWQpICIKKyAgICAiR2V0IGNvZGVjIHBhcmFtZXRlcnMiOworc3RhdGljIGNoYXIgcGpzdWFfY29kZWNfc2V0X3BhcmFtX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jb2RlY19zZXRfcGFyYW0gKHN0cmluZyBpZCwgIgorICAgICJfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbSBwYXJhbSkgIgorICAgICJTZXQgY29kZWMgcGFyYW1ldGVycy4iOworCisvKiBFTkQgT0YgTElCIE1FRElBICovCisKKy8qIExJQiBDQUxMICovCisKKy8qCisgKiBweV9wanN1YV9jYWxsX2dldF9tYXhfY291bnQKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX2dldF9tYXhfY291bnQoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY291bnQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGNvdW50ID0gcGpzdWFfY2FsbF9nZXRfbWF4X2NvdW50KCk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBjb3VudCk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2dldF9jb3VudAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZ2V0X2NvdW50KFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNvdW50OwkKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGNvdW50ID0gcGpzdWFfY2FsbF9nZXRfY291bnQoKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGNvdW50KTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2VudW1fY2FsbHMKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9lbnVtX2NhbGxzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIHBqc3VhX3RyYW5zcG9ydF9pZCBpZFtQSlNVQV9NQVhfQ0FMTFNdOworICAgIHVuc2lnbmVkIGMsIGk7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKyAgICBQSl9VTlVTRURfQVJHKHBBcmdzKTsKKworICAgIGMgPSBQSl9BUlJBWV9TSVpFKGlkKTsKKyAgICBzdGF0dXMgPSBwanN1YV9lbnVtX2NhbGxzKGlkLCAmYyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWMgPSAwOworICAgIAorICAgIHJldCA9IFB5TGlzdF9OZXcoYyk7CisgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykgIHsgICAgIAorICAgICAgICBQeUxpc3RfU2V0SXRlbShyZXQsIGksIFB5X0J1aWxkVmFsdWUoImkiLCBpZFtpXSkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKFB5T2JqZWN0KilyZXQ7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX21ha2VfY2FsbAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfbWFrZV9jYWxsKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBhY2NfaWQ7CisgICAgcGpfc3RyX3QgZHN0X3VyaTsKKyAgICBQeU9iamVjdCAqcERzdFVyaSwgKnBNc2dEYXRhLCAqcFVzZXJEYXRhOworCXBqc3VhX2NhbGxfc2V0dGluZyBvcHRpb247CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgaW50IGNhbGxfaWQ7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisJcGpzdWFfY2FsbF9zZXR0aW5nX2RlZmF1bHQoJm9wdGlvbik7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9JT08iLCAmYWNjX2lkLCAmcERzdFVyaSwgJm9wdGlvbi5mbGFnLCAKKwkJCSAgJnBVc2VyRGF0YSwgJnBNc2dEYXRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkKKyAgICBkc3RfdXJpID0gUHlTdHJpbmdfVG9QSihwRHN0VXJpKTsKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKyAgICBpZiAocE1zZ0RhdGEgIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX21zZ19kYXRhICogb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKXBNc2dEYXRhOworCisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX1RvUEoob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX1RvUEoob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICB9CisKKyAgICBQeV9YSU5DUkVGKHBVc2VyRGF0YSk7CisKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX21ha2VfY2FsbChhY2NfaWQsICZkc3RfdXJpLCAKKwkJCQkgICZvcHRpb24sICh2b2lkKilwVXNlckRhdGEsIAorCQkJCSAgJm1zZ19kYXRhLCAmY2FsbF9pZCk7CQorICAgIGlmIChwb29sICE9IE5VTEwpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIAorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgIAlQeV9YREVDUkVGKHBVc2VyRGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgc3RhdHVzLCBjYWxsX2lkKTsJCit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2lzX2FjdGl2ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfaXNfYWN0aXZlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IGlzX2FjdGl2ZTsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmY2FsbF9pZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBpc19hY3RpdmUgPSBwanN1YV9jYWxsX2lzX2FjdGl2ZShjYWxsX2lkKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGlzX2FjdGl2ZSk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2hhc19tZWRpYQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfaGFzX21lZGlhKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IGhhc19tZWRpYTsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmY2FsbF9pZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKyAgICAKKyAgICBoYXNfbWVkaWEgPSBwanN1YV9jYWxsX2hhc19tZWRpYShjYWxsX2lkKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaGFzX21lZGlhKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydAorICovCitzdGF0aWMgUHlPYmplY3QqIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYWxsX2lkOworICAgIGludCBwb3J0X2lkOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpIiwgJmNhbGxfaWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBvcnRfaWQgPSBwanN1YV9jYWxsX2dldF9jb25mX3BvcnQoY2FsbF9pZCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBvcnRfaWQpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9nZXRfaW5mbworICovCitzdGF0aWMgUHlPYmplY3QqIHB5X3Bqc3VhX2NhbGxfZ2V0X2luZm8oUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBpbnQgc3RhdHVzOworICAgIFB5T2JqX3Bqc3VhX2NhbGxfaW5mbyAqcmV0OworICAgIHBqc3VhX2NhbGxfaW5mbyBpbmZvOworICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZjYWxsX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfZ2V0X2luZm8oY2FsbF9pZCwgJmluZm8pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiIik7CisKKyAgICByZXQgPSAoUHlPYmpfcGpzdWFfY2FsbF9pbmZvICopY2FsbF9pbmZvX25ldygmUHlUeXBfcGpzdWFfY2FsbF9pbmZvLAorCQkJCQkJIE5VTEwsIE5VTEwpOworICAgIHJldC0+YWNjX2lkID0gaW5mby5hY2NfaWQ7CisgICAgUHlfWERFQ1JFRihyZXQtPmNhbGxfaWQpOworICAgIHJldC0+Y2FsbF9pZCA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby5jYWxsX2lkKTsKKyAgICByZXQtPmNvbmZfc2xvdCA9IGluZm8uY29uZl9zbG90OworICAgIHJldC0+Y29ubmVjdF9kdXJhdGlvbiA9IGluZm8uY29ubmVjdF9kdXJhdGlvbi5zZWMgKiAxMDAwICsKKwkJCSAgICBpbmZvLmNvbm5lY3RfZHVyYXRpb24ubXNlYzsKKyAgICByZXQtPnRvdGFsX2R1cmF0aW9uID0gaW5mby50b3RhbF9kdXJhdGlvbi5zZWMgKiAxMDAwICsKKwkJCSAgaW5mby50b3RhbF9kdXJhdGlvbi5tc2VjOworICAgIHJldC0+aWQgPSBpbmZvLmlkOworICAgIHJldC0+bGFzdF9zdGF0dXMgPSBpbmZvLmxhc3Rfc3RhdHVzOworICAgIFB5X1hERUNSRUYocmV0LT5sYXN0X3N0YXR1c190ZXh0KTsKKyAgICByZXQtPmxhc3Rfc3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tUEooJmluZm8ubGFzdF9zdGF0dXNfdGV4dCk7CisgICAgUHlfWERFQ1JFRihyZXQtPmxvY2FsX2NvbnRhY3QpOworICAgIHJldC0+bG9jYWxfY29udGFjdCA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby5sb2NhbF9jb250YWN0KTsKKyAgICBQeV9YREVDUkVGKHJldC0+bG9jYWxfaW5mbyk7CisgICAgcmV0LT5sb2NhbF9pbmZvID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLmxvY2FsX2luZm8pOworICAgIFB5X1hERUNSRUYocmV0LT5yZW1vdGVfY29udGFjdCk7CisgICAgcmV0LT5yZW1vdGVfY29udGFjdCA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby5yZW1vdGVfY29udGFjdCk7CisgICAgUHlfWERFQ1JFRihyZXQtPnJlbW90ZV9pbmZvKTsKKyAgICByZXQtPnJlbW90ZV9pbmZvID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLnJlbW90ZV9pbmZvKTsKKyAgICByZXQtPm1lZGlhX2RpciA9IGluZm8ubWVkaWFfZGlyOworICAgIHJldC0+bWVkaWFfc3RhdHVzID0gaW5mby5tZWRpYV9zdGF0dXM7CisgICAgcmV0LT5yb2xlID0gaW5mby5yb2xlOworICAgIHJldC0+c3RhdGUgPSBpbmZvLnN0YXRlOworICAgIFB5X1hERUNSRUYocmV0LT5zdGF0ZV90ZXh0KTsKKyAgICByZXQtPnN0YXRlX3RleHQgPSBQeVN0cmluZ19Gcm9tUEooJmluZm8uc3RhdGVfdGV4dCk7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0KilyZXQ7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX3NldF91c2VyX2RhdGEKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX3NldF91c2VyX2RhdGEoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBQeU9iamVjdCAqcFVzZXJEYXRhLCAqb2xkX3VzZXJfZGF0YTsKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpTyIsICZjYWxsX2lkLCAmcFVzZXJEYXRhKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvbGRfdXNlcl9kYXRhID0gKFB5T2JqZWN0KikgcGpzdWFfY2FsbF9nZXRfdXNlcl9kYXRhKGNhbGxfaWQpOworCisgICAgaWYgKG9sZF91c2VyX2RhdGEgPT0gcFVzZXJEYXRhKSB7CisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBQSl9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBQeV9YSU5DUkVGKHBVc2VyRGF0YSk7CisgICAgUHlfWERFQ1JFRihvbGRfdXNlcl9kYXRhKTsKKworICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2V0X3VzZXJfZGF0YShjYWxsX2lkLCAodm9pZCopcFVzZXJEYXRhKTsKKyAgICAKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAJUHlfWERFQ1JFRihwVXNlckRhdGEpOworICAgIH0KKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfZ2V0X3VzZXJfZGF0YQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZ2V0X3VzZXJfZGF0YShQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCQorICAgIGludCBjYWxsX2lkOworICAgIFB5T2JqZWN0ICp1c2VyX2RhdGE7CQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZjYWxsX2lkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CQorICAgIAorICAgIHVzZXJfZGF0YSA9IChQeU9iamVjdCopcGpzdWFfY2FsbF9nZXRfdXNlcl9kYXRhKGNhbGxfaWQpOworICAgIHJldHVybiB1c2VyX2RhdGEgPyBQeV9CdWlsZFZhbHVlKCJPIiwgdXNlcl9kYXRhKSA6IFB5X0J1aWxkVmFsdWUoIiIpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9hbnN3ZXIKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX2Fuc3dlcihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBwal9zdHJfdCAqIHJlYXNvbiwgdG1wX3JlYXNvbjsKKyAgICBQeU9iamVjdCAqcFJlYXNvbjsKKyAgICB1bnNpZ25lZCBjb2RlOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICogb21kT2JqOworICAgIHBqX3Bvb2xfdCAqIHBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpSU9PIiwgJmNhbGxfaWQsICZjb2RlLCAmcFJlYXNvbiwgJm9tZE9iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBSZWFzb24gPT0gUHlfTm9uZSkgeworICAgICAgICByZWFzb24gPSBOVUxMOworICAgIH0gZWxzZSB7CisJcmVhc29uID0gJnRtcF9yZWFzb247CisgICAgICAgIHRtcF9yZWFzb24gPSBQeVN0cmluZ19Ub1BKKHBSZWFzb24pOworICAgIH0KKworICAgIHBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIHsKKwlQeU9ial9wanN1YV9tc2dfZGF0YSAqb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX2Fuc3dlcihjYWxsX2lkLCBjb2RlLCByZWFzb24sICZtc2dfZGF0YSk7CQorCisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9oYW5ndXAKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX2hhbmd1cChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBwal9zdHJfdCAqcmVhc29uLCB0bXBfcmVhc29uOworICAgIFB5T2JqZWN0ICpwUmVhc29uOworICAgIHVuc2lnbmVkIGNvZGU7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKm9tZE9iajsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpSU9PIiwgJmNhbGxfaWQsICZjb2RlLCAmcFJlYXNvbiwgCisJCQkgICZvbWRPYmopKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHBSZWFzb24gPT0gUHlfTm9uZSkgeworICAgICAgICByZWFzb24gPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlYXNvbiA9ICZ0bXBfcmVhc29uOworICAgICAgICB0bXBfcmVhc29uID0gUHlTdHJpbmdfVG9QSihwUmVhc29uKTsKKyAgICB9CisKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKSAgeworCVB5T2JqX3Bqc3VhX21zZ19kYXRhICpvbWQ7CisKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUgPSBQeVN0cmluZ19Ub1BKKG9tZC0+Y29udGVudF90eXBlKTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkgPSBQeVN0cmluZ19Ub1BKKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInB5dG1wIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgfQorICAgIAorICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfaGFuZ3VwKGNhbGxfaWQsIGNvZGUsIHJlYXNvbiwgJm1zZ19kYXRhKTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX3NldF9ob2xkCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9zZXRfaG9sZChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsgICAgCisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKm9tZE9iajsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpTyIsICZjYWxsX2lkLCAmb21kT2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfbXNnX2RhdGEgKm9tZDsgICAgCisKKyAgICAgICAgb21kID0gKFB5T2JqX3Bqc3VhX21zZ19kYXRhICopb21kT2JqOworICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUgPSBQeVN0cmluZ19Ub1BKKG9tZC0+Y29udGVudF90eXBlKTsKKyAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkgPSBQeVN0cmluZ19Ub1BKKG9tZC0+bXNnX2JvZHkpOworICAgICAgICBwb29sID0gcGpzdWFfcG9vbF9jcmVhdGUoInB5dG1wIiwgUE9PTF9TSVpFLCBQT09MX1NJWkUpOworICAgICAgICB0cmFuc2xhdGVfaGRyKHBvb2wsICZtc2dfZGF0YS5oZHJfbGlzdCwgb21kLT5oZHJfbGlzdCk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9zZXRfaG9sZChjYWxsX2lkLCAmbXNnX2RhdGEpOworCisgICAgaWYgKHBvb2wpCisgICAgICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIixzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9yZWludml0ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfcmVpbnZpdGUoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGNhbGxfaWQ7CisgICAgaW50IHVuaG9sZDsKKyAgICBwanN1YV9tc2dfZGF0YSBtc2dfZGF0YTsKKyAgICBQeU9iamVjdCAqb21kT2JqOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlpTyIsICZjYWxsX2lkLCAmdW5ob2xkLCAmb21kT2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfbXNnX2RhdGEgKm9tZDsKKworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilvbWRPYmo7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX1RvUEoob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX1RvUEoob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3JlaW52aXRlKGNhbGxfaWQsIHVuaG9sZCwgJm1zZ19kYXRhKTsKKworICAgIGlmIChwb29sKQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX3VwZGF0ZQorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfdXBkYXRlKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBjYWxsX2lkOyAgICAKKyAgICBpbnQgb3B0aW9uOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICpvbWRPYmo7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaWlPIiwgJmNhbGxfaWQsICZvcHRpb24sICZvbWRPYmopKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIHsKKwlQeU9ial9wanN1YV9tc2dfZGF0YSAqb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfdXBkYXRlKGNhbGxfaWQsIG9wdGlvbiwgJm1zZ19kYXRhKTsJCisKKyAgICBpZiAocG9vbCkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9zZW5kX3JlcXVlc3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX3NlbmRfcmVxdWVzdChQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsgICAgCisgICAgUHlPYmplY3QgKnBNZXRob2Q7CisgICAgcGpfc3RyX3QgbWV0aG9kOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICpvbWRPYmo7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9PIiwgJmNhbGxfaWQsICZwTWV0aG9kLCAmb21kT2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHBNZXRob2QpKSB7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWV0aG9kID0gUHlTdHJpbmdfVG9QSihwTWV0aG9kKTsKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIHsKKwlQeU9ial9wanN1YV9tc2dfZGF0YSAqb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2VuZF9yZXF1ZXN0KGNhbGxfaWQsICZtZXRob2QsICZtc2dfZGF0YSk7CQorCisgICAgaWYgKHBvb2wpCisgICAgICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKK30KKworLyoKKyAqIHB5X3Bqc3VhX2NhbGxfeGZlcgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfeGZlcihQeU9iamVjdCAqcFNlbGYsIFB5T2JqZWN0ICpwQXJncykKK3sgICAgCisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBwal9zdHJfdCBkZXN0OworICAgIFB5T2JqZWN0ICpwRHN0VXJpOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIFB5T2JqZWN0ICpvbWRPYmo7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9PIiwgJmNhbGxfaWQsICZwRHN0VXJpLCAmb21kT2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHBEc3RVcmkpKQorCXJldHVybiBOVUxMOworCisgICAgZGVzdCA9IFB5U3RyaW5nX1RvUEoocERzdFVyaSk7CisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworCisgICAgaWYgKG9tZE9iaiAhPSBQeV9Ob25lKSB7CisJUHlPYmpfcGpzdWFfbXNnX2RhdGEgKm9tZDsKKworICAgICAgICBvbWQgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKilvbWRPYmo7CisgICAgICAgIG1zZ19kYXRhLmNvbnRlbnRfdHlwZSA9IFB5U3RyaW5nX1RvUEoob21kLT5jb250ZW50X3R5cGUpOworICAgICAgICBtc2dfZGF0YS5tc2dfYm9keSA9IFB5U3RyaW5nX1RvUEoob21kLT5tc2dfYm9keSk7CisgICAgICAgIHBvb2wgPSBwanN1YV9wb29sX2NyZWF0ZSgicHl0bXAiLCBQT09MX1NJWkUsIFBPT0xfU0laRSk7CisgICAgICAgIHRyYW5zbGF0ZV9oZHIocG9vbCwgJm1zZ19kYXRhLmhkcl9saXN0LCBvbWQtPmhkcl9saXN0KTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3hmZXIoY2FsbF9pZCwgJmRlc3QsICZtc2dfZGF0YSk7CisKKyAgICBpZiAocG9vbCkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBjYWxsX2lkOworICAgIGludCBkZXN0X2NhbGxfaWQ7CisgICAgdW5zaWduZWQgb3B0aW9uczsgICAgCisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKm9tZE9iajsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaUlPIiwgJmNhbGxfaWQsICZkZXN0X2NhbGxfaWQsIAorCQkJICAmb3B0aW9ucywgJm9tZE9iaikpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwanN1YV9tc2dfZGF0YV9pbml0KCZtc2dfZGF0YSk7CisKKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIHsKKwlQeU9ial9wanN1YV9tc2dfZGF0YSAqb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfeGZlcl9yZXBsYWNlcyhjYWxsX2lkLCBkZXN0X2NhbGxfaWQsIG9wdGlvbnMsIAorCQkJCSAgICAgICZtc2dfZGF0YSk7CisKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2RpYWxfZHRtZgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfZGlhbF9kdG1mKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgaW50IGNhbGxfaWQ7CisgICAgUHlPYmplY3QgKnBEaWdpdHM7CisgICAgcGpfc3RyX3QgZGlnaXRzOworICAgIGludCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImlPIiwgJmNhbGxfaWQsICZwRGlnaXRzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHBEaWdpdHMpKQorCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgUEpfRUlOVkFMKTsKKworICAgIGRpZ2l0cyA9IFB5U3RyaW5nX1RvUEoocERpZ2l0cyk7CisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9kaWFsX2R0bWYoY2FsbF9pZCwgJmRpZ2l0cyk7CisgICAgCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9zZW5kX2ltCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9zZW5kX2ltKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBjYWxsX2lkOworICAgIHBqX3N0cl90IGNvbnRlbnQ7CisgICAgcGpfc3RyX3QgKiBtaW1lX3R5cGUsIHRtcF9taW1lX3R5cGU7CisgICAgUHlPYmplY3QgKnBNaW1lVHlwZSwgKnBDb250ZW50LCAqb21kT2JqOworICAgIHBqc3VhX21zZ19kYXRhIG1zZ19kYXRhOworICAgIGludCB1c2VyX2RhdGE7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaU9PT2kiLCAmY2FsbF9pZCwgJnBNaW1lVHlwZSwgJnBDb250ZW50LCAKKwkJCSAgJm9tZE9iaiwgJnVzZXJfZGF0YSkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHBDb250ZW50KSkKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIFBKX0VJTlZBTCk7CisKKyAgICBjb250ZW50ID0gUHlTdHJpbmdfVG9QSihwQ29udGVudCk7CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2socE1pbWVUeXBlKSkgeworICAgICAgICBtaW1lX3R5cGUgPSAmdG1wX21pbWVfdHlwZTsKKyAgICAgICAgdG1wX21pbWVfdHlwZSA9IFB5U3RyaW5nX1RvUEoocE1pbWVUeXBlKTsKKyAgICB9IGVsc2UgeworCW1pbWVfdHlwZSA9IE5VTEw7ICAgCisgICAgfQorCisgICAgcGpzdWFfbXNnX2RhdGFfaW5pdCgmbXNnX2RhdGEpOworICAgIGlmIChvbWRPYmogIT0gUHlfTm9uZSkgeworCVB5T2JqX3Bqc3VhX21zZ19kYXRhICogb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBwanN1YV9jYWxsX3NlbmRfaW0oY2FsbF9pZCwgbWltZV90eXBlLCAmY29udGVudCwgCisJCQkJJm1zZ19kYXRhLCAodm9pZCopKGxvbmcpdXNlcl9kYXRhKTsKKworICAgIGlmIChwb29sKQorICAgICAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZAorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2NhbGxfc2VuZF90eXBpbmdfaW5kKFB5T2JqZWN0ICpwU2VsZiwgCisJCQkJCSAgICAgICBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAorICAgIGludCBzdGF0dXM7CisgICAgaW50IGNhbGxfaWQ7ICAgIAorICAgIGludCBpc190eXBpbmc7CisgICAgcGpzdWFfbXNnX2RhdGEgbXNnX2RhdGE7CisgICAgUHlPYmplY3QgKm9tZE9iajsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaU8iLCAmY2FsbF9pZCwgJmlzX3R5cGluZywgJm9tZE9iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCQorICAgIHBqc3VhX21zZ19kYXRhX2luaXQoJm1zZ19kYXRhKTsKKyAgICBpZiAob21kT2JqICE9IFB5X05vbmUpIHsKKwlQeU9ial9wanN1YV9tc2dfZGF0YSAqb21kOworCisgICAgICAgIG9tZCA9IChQeU9ial9wanN1YV9tc2dfZGF0YSAqKW9tZE9iajsKKyAgICAgICAgbXNnX2RhdGEuY29udGVudF90eXBlID0gUHlTdHJpbmdfVG9QSihvbWQtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIG1zZ19kYXRhLm1zZ19ib2R5ID0gUHlTdHJpbmdfVG9QSihvbWQtPm1zZ19ib2R5KTsKKyAgICAgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweXRtcCIsIFBPT0xfU0laRSwgUE9PTF9TSVpFKTsKKyAgICAgICAgdHJhbnNsYXRlX2hkcihwb29sLCAmbXNnX2RhdGEuaGRyX2xpc3QsIG9tZC0+aGRyX2xpc3QpOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc3VhX2NhbGxfc2VuZF90eXBpbmdfaW5kKGNhbGxfaWQsIGlzX3R5cGluZywgJm1zZ19kYXRhKTsJCisKKyAgICBpZiAocG9vbCkKKyAgICAgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworfQorCisvKgorICogcHlfcGpzdWFfY2FsbF9oYW5ndXBfYWxsCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpzdWFfY2FsbF9oYW5ndXBfYWxsKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreyAgICAJCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisgICAgUEpfVU5VU0VEX0FSRyhwQXJncyk7CisKKyAgICBwanN1YV9jYWxsX2hhbmd1cF9hbGwoKTsKKyAgICAKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiIik7Cit9CisKKy8qCisgKiBweV9wanN1YV9jYWxsX2R1bXAKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wanN1YV9jYWxsX2R1bXAoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7ICAgIAkKKyAgICBpbnQgY2FsbF9pZDsKKyAgICBpbnQgd2l0aF9tZWRpYTsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIFB5T2JqZWN0ICpwSW5kZW50OworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBjaGFyICppbmRlbnQ7CisgICAgdW5zaWduZWQgbWF4bGVuOyAgICAKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhwU2VsZik7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUocEFyZ3MsICJpaUlPIiwgJmNhbGxfaWQsICZ3aXRoX21lZGlhLCAKKwkJCSAgJm1heGxlbiwgJnBJbmRlbnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQkKKworICAgIGJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKG1heGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgaW5kZW50ID0gUHlTdHJpbmdfQXNTdHJpbmcocEluZGVudCk7CisgICAgCisgICAgc3RhdHVzID0gcGpzdWFfY2FsbF9kdW1wKGNhbGxfaWQsIHdpdGhfbWVkaWEsIGJ1ZmZlciwgbWF4bGVuLCBpbmRlbnQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorCisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIGZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilyZXQ7Cit9CisKKworLyoKKyAqIHB5X3Bqc3VhX2R1bXAKKyAqIER1bXAgYXBwbGljYXRpb24gc3RhdGVzLgorICovCitzdGF0aWMgUHlPYmplY3QgKnB5X3Bqc3VhX2R1bXAoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgaW50IGRldGFpbDsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAiaSIsICZkZXRhaWwpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0JCisKKyAgICBwanN1YV9kdW1wKGRldGFpbCk7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiIik7Cit9CisKKworLyoKKyAqIHB5X3BqX3N0cmVycm9yCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqcHlfcGpfc3RyZXJyb3IoUHlPYmplY3QgKnBTZWxmLCBQeU9iamVjdCAqcEFyZ3MpCit7CisgICAgaW50IGVycjsKKyAgICBjaGFyIGVycl9tc2dbUEpfRVJSX01TR19TSVpFXTsKKyAgICBwal9zdHJfdCByZXQ7CisKKyAgICBQSl9VTlVTRURfQVJHKHBTZWxmKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShwQXJncywgImkiLCAmZXJyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0ID0gcGpfc3RyZXJyb3IoZXJyLCBlcnJfbXNnLCBzaXplb2YoZXJyX21zZykpOworICAgIAorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShlcnJfbXNnLCByZXQuc2xlbik7Cit9CisKKworLyoKKyAqIHB5X3BqX3BhcnNlX3NpbXBsZV9zaXAKKyAqLworc3RhdGljIFB5T2JqZWN0ICpweV9wal9wYXJzZV9zaW1wbGVfc2lwKFB5T2JqZWN0ICpwU2VsZiwgUHlPYmplY3QgKnBBcmdzKQoreworICAgIGNvbnN0IGNoYXIgKmFyZ191cmk7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIGNoYXIgdG1wW1BKU0lQX01BWF9VUkxfU0laRV07CisgICAgcGpzaXBfdXJpICp1cmk7CisgICAgcGpzaXBfc2lwX3VyaSAqc2lwX3VyaTsKKyAgICBQeU9iamVjdCAqcmV0LCAqaXRlbTsKKworICAgIFBKX1VOVVNFRF9BUkcocFNlbGYpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBBcmdzLCAicyIsICZhcmdfdXJpKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgc3RybmNweSh0bXAsIGFyZ191cmksIHNpemVvZih0bXApKTsKKyAgICB0bXBbc2l6ZW9mKHRtcCktMV0gPSAnXDAnOworCisgICAgcG9vbCA9IHBqc3VhX3Bvb2xfY3JlYXRlKCJweV9wal9wYXJzZV9zaW1wbGVfc2lwIiwgNTEyLCA1MTIpOworICAgIHVyaSA9IHBqc2lwX3BhcnNlX3VyaShwb29sLCB0bXAsIHN0cmxlbih0bXApLCAwKTsKKyAgICAKKyAgICBpZiAodXJpID09IE5VTEwgfHwgKCFQSlNJUF9VUklfU0NIRU1FX0lTX1NJUCh1cmkpICYmCisJCQkhUEpTSVBfVVJJX1NDSEVNRV9JU19TSVBTKHVyaSkpKSB7CisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCXJldHVybiBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICB9CisgICAgCisgICAgcmV0ID0gUHlUdXBsZV9OZXcoNSk7CisgICAgc2lwX3VyaSA9IChwanNpcF9zaXBfdXJpKikgcGpzaXBfdXJpX2dldF91cmkodXJpKTsKKworICAgIC8qIFNjaGVtZSAqLworICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tUEoocGpzaXBfdXJpX2dldF9zY2hlbWUodXJpKSk7CisgICAgUHlUdXBsZV9TZXRJdGVtKHJldCwgMCwgaXRlbSk7CisKKyAgICAvKiBVc2VybmFtZSAqLworICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tUEooJnNpcF91cmktPnVzZXIpOworICAgIFB5VHVwbGVfU2V0SXRlbShyZXQsIDEsIGl0ZW0pOworCisgICAgLyogSG9zdCAqLworICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tUEooJnNpcF91cmktPmhvc3QpOworICAgIFB5VHVwbGVfU2V0SXRlbShyZXQsIDIsIGl0ZW0pOworCisgICAgLyogUG9ydCAqLworICAgIGlmIChzaXBfdXJpLT5wb3J0ID09IDUwNjApIHsKKwlzaXBfdXJpLT5wb3J0ID0gMDsKKyAgICB9CisgICAgaXRlbSA9IFB5X0J1aWxkVmFsdWUoImkiLCBzaXBfdXJpLT5wb3J0KTsKKyAgICBQeVR1cGxlX1NldEl0ZW0ocmV0LCAzLCBpdGVtKTsKKworICAgIC8qIFRyYW5zcG9ydCAqLworICAgIGlmIChwal9zdHJpY21wMigmc2lwX3VyaS0+dHJhbnNwb3J0X3BhcmFtLCAidWRwIikpIHsKKwlzaXBfdXJpLT50cmFuc3BvcnRfcGFyYW0ucHRyID0gIiI7CisJc2lwX3VyaS0+dHJhbnNwb3J0X3BhcmFtLnNsZW4gPSAwOworICAgIH0KKyAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVBKKCZzaXBfdXJpLT50cmFuc3BvcnRfcGFyYW0pOworICAgIFB5VHVwbGVfU2V0SXRlbShyZXQsIDQsIGl0ZW0pOworCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9nZXRfbWF4X2NvdW50X2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX2dldF9tYXhfY291bnQgKCkgIgorICAgICJHZXQgbWF4aW11bSBudW1iZXIgb2YgY2FsbHMgY29uZmlndXJlZCBpbiBwanN1YS4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9nZXRfY291bnRfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfZ2V0X2NvdW50ICgpICIKKyAgICAiR2V0IG51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGNhbGxzLiI7CitzdGF0aWMgY2hhciBwanN1YV9lbnVtX2NhbGxzX2RvY1tdID0KKyAgICAiaW50W10gX3Bqc3VhLmVudW1fY2FsbHMgKCkgIgorICAgICJHZXQgbWF4aW11bSBudW1iZXIgb2YgY2FsbHMgY29uZmlndXJlZCBpbiBwanN1YS4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9tYWtlX2NhbGxfZG9jW10gPQorICAgICJpbnQsaW50IF9wanN1YS5jYWxsX21ha2VfY2FsbCAoaW50IGFjY19pZCwgc3RyaW5nIGRzdF91cmksIGludCBvcHRpb25zLCIKKyAgICAiaW50IHVzZXJfZGF0YSwgX3Bqc3VhLk1zZ19EYXRhIG1zZ19kYXRhKSAiCisgICAgIk1ha2Ugb3V0Z29pbmcgY2FsbCB0byB0aGUgc3BlY2lmaWVkIFVSSSB1c2luZyB0aGUgc3BlY2lmaWVkIGFjY291bnQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfaXNfYWN0aXZlX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX2lzX2FjdGl2ZSAoaW50IGNhbGxfaWQpICIKKyAgICAiQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjYWxsIGhhcyBhY3RpdmUgSU5WSVRFIHNlc3Npb24gYW5kIHRoZSBJTlZJVEUgIgorICAgICJzZXNzaW9uIGhhcyBub3QgYmVlbiBkaXNjb25uZWN0ZWQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfaGFzX21lZGlhX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX2hhc19tZWRpYSAoaW50IGNhbGxfaWQpICIKKyAgICAiQ2hlY2sgaWYgY2FsbCBoYXMgYW4gYWN0aXZlIG1lZGlhIHNlc3Npb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuY2FsbF9nZXRfY29uZl9wb3J0IChpbnQgY2FsbF9pZCkgIgorICAgICJHZXQgdGhlIGNvbmZlcmVuY2UgcG9ydCBpZGVudGlmaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGwuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfZ2V0X2luZm9fZG9jW10gPQorICAgICJfcGpzdWEuQ2FsbF9JbmZvIF9wanN1YS5jYWxsX2dldF9pbmZvIChpbnQgY2FsbF9pZCkgIgorICAgICJPYnRhaW4gZGV0YWlsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgY2FsbC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9zZXRfdXNlcl9kYXRhX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX3NldF91c2VyX2RhdGEgKGludCBjYWxsX2lkLCBpbnQgdXNlcl9kYXRhKSAiCisgICAgIkF0dGFjaCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIHRvIHRoZSBjYWxsLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2dldF91c2VyX2RhdGFfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfZ2V0X3VzZXJfZGF0YSAoaW50IGNhbGxfaWQpICIKKyAgICAiR2V0IHVzZXIgZGF0YSBhdHRhY2hlZCB0byB0aGUgY2FsbC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9hbnN3ZXJfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfYW5zd2VyIChpbnQgY2FsbF9pZCwgaW50IGNvZGUsIHN0cmluZyByZWFzb24sICIKKyAgICAiX3Bqc3VhLk1zZ19EYXRhIG1zZ19kYXRhKSAiCisgICAgIlNlbmQgcmVzcG9uc2UgdG8gaW5jb21pbmcgSU5WSVRFIHJlcXVlc3QuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfaGFuZ3VwX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX2hhbmd1cCAoaW50IGNhbGxfaWQsIGludCBjb2RlLCBzdHJpbmcgcmVhc29uLCAiCisgICAgIl9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJIYW5ndXAgY2FsbCBieSB1c2luZyBtZXRob2QgdGhhdCBpcyBhcHByb3ByaWF0ZSBhY2NvcmRpbmcgIgorICAgICJ0byB0aGUgY2FsbCBzdGF0ZS4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9zZXRfaG9sZF9kb2NbXSA9CisgICAgImludCBfcGpzdWEuY2FsbF9zZXRfaG9sZCAoaW50IGNhbGxfaWQsIF9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJQdXQgdGhlIHNwZWNpZmllZCBjYWxsIG9uIGhvbGQuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfcmVpbnZpdGVfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfcmVpbnZpdGUgKGludCBjYWxsX2lkLCBpbnQgdW5ob2xkLCAiCisgICAgIl9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJTZW5kIHJlLUlOVklURSAodG8gcmVsZWFzZSBob2xkKS4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF94ZmVyX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX3hmZXIgKGludCBjYWxsX2lkLCBzdHJpbmcgZGVzdCwgIgorICAgICJfcGpzdWEuTXNnX0RhdGEgbXNnX2RhdGEpICIKKyAgICAiSW5pdGlhdGUgY2FsbCB0cmFuc2ZlciB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICIKKyAgICAiVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgUkVGRVIgcmVxdWVzdCB0byBpbnN0cnVjdCByZW1vdGUgY2FsbCBwYXJ0eSAiCisgICAgInRvIGluaXRpYXRlIGEgbmV3IElOVklURSBzZXNzaW9uIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24vdGFyZ2V0LiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX3hmZXJfcmVwbGFjZXNfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfeGZlcl9yZXBsYWNlcyAoaW50IGNhbGxfaWQsIGludCBkZXN0X2NhbGxfaWQsICIKKyAgICAiaW50IG9wdGlvbnMsIF9wanN1YS5Nc2dfRGF0YSBtc2dfZGF0YSkgIgorICAgICJJbml0aWF0ZSBhdHRlbmRlZCBjYWxsIHRyYW5zZmVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBSRUZFUiByZXF1ZXN0ICIKKyAgICAidG8gaW5zdHJ1Y3QgcmVtb3RlIGNhbGwgcGFydHkgdG8gaW5pdGlhdGUgbmV3IElOVklURSBzZXNzaW9uIHRvIHRoZSBVUkwgIgorICAgICJvZiBkZXN0X2NhbGxfaWQuIFRoZSBwYXJ0eSBhdCBkZXN0X2NhbGxfaWQgdGhlbiBzaG91bGQgJ3JlcGxhY2UnIHRoZSBjYWxsIgorICAgICJ3aXRoIHVzIHdpdGggdGhlIG5ldyBjYWxsIGZyb20gdGhlIFJFRkVSIHJlY2lwaWVudC4iOworc3RhdGljIGNoYXIgcGpzdWFfY2FsbF9kaWFsX2R0bWZfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfZGlhbF9kdG1mIChpbnQgY2FsbF9pZCwgc3RyaW5nIGRpZ2l0cykgIgorICAgICJTZW5kIERUTUYgZGlnaXRzIHRvIHJlbW90ZSB1c2luZyBSRkMgMjgzMyBwYXlsb2FkIGZvcm1hdHMuIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfc2VuZF9pbV9kb2NbXSA9CisgICAgImludCBfcGpzdWEuY2FsbF9zZW5kX2ltIChpbnQgY2FsbF9pZCwgc3RyaW5nIG1pbWVfdHlwZSwgc3RyaW5nIGNvbnRlbnQsIgorICAgICJfcGpzdWEuTXNnX0RhdGEgbXNnX2RhdGEsIGludCB1c2VyX2RhdGEpICIKKyAgICAiU2VuZCBpbnN0YW50IG1lc3NhZ2luZyBpbnNpZGUgSU5WSVRFIHNlc3Npb24uIjsKK3N0YXRpYyBjaGFyIHBqc3VhX2NhbGxfc2VuZF90eXBpbmdfaW5kX2RvY1tdID0KKyAgICAiaW50IF9wanN1YS5jYWxsX3NlbmRfdHlwaW5nX2luZCAoaW50IGNhbGxfaWQsIGludCBpc190eXBpbmcsICIKKyAgICAiX3Bqc3VhLk1zZ19EYXRhIG1zZ19kYXRhKSAiCisgICAgIlNlbmQgSU0gdHlwaW5nIGluZGljYXRpb24gaW5zaWRlIElOVklURSBzZXNzaW9uLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2hhbmd1cF9hbGxfZG9jW10gPQorICAgICJ2b2lkIF9wanN1YS5jYWxsX2hhbmd1cF9hbGwgKCkgIgorICAgICJUZXJtaW5hdGUgYWxsIGNhbGxzLiI7CitzdGF0aWMgY2hhciBwanN1YV9jYWxsX2R1bXBfZG9jW10gPQorICAgICJpbnQgX3Bqc3VhLmNhbGxfZHVtcCAoaW50IGNhbGxfaWQsIGludCB3aXRoX21lZGlhLCBpbnQgbWF4bGVuLCAiCisgICAgInN0cmluZyBpbmRlbnQpICIKKyAgICAiRHVtcCBjYWxsIGFuZCBtZWRpYSBzdGF0aXN0aWNzIHRvIHN0cmluZy4iOworCisvKiBFTkQgT0YgTElCIENBTEwgKi8KKworLyoKKyAqIE1hcCBvZiBmdW5jdGlvbiBuYW1lcyB0byBmdW5jdGlvbnMKKyAqLworc3RhdGljIFB5TWV0aG9kRGVmIHB5X3Bqc3VhX21ldGhvZHNbXSA9Cit7CisgICAgeworICAgICAgICAidGhyZWFkX3JlZ2lzdGVyIiwgcHlfcGpzdWFfdGhyZWFkX3JlZ2lzdGVyLCBNRVRIX1ZBUkFSR1MsIAorICAgICAgICAgcGpzdWFfdGhyZWFkX3JlZ2lzdGVyX2RvYworICAgIH0sCisgICAgeworICAgIAkicGVycm9yIiwgcHlfcGpzdWFfcGVycm9yLCBNRVRIX1ZBUkFSR1MsIHBqc3VhX3BlcnJvcl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJImNyZWF0ZSIsIHB5X3Bqc3VhX2NyZWF0ZSwgTUVUSF9WQVJBUkdTLCBwanN1YV9jcmVhdGVfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJpbml0IiwgcHlfcGpzdWFfaW5pdCwgTUVUSF9WQVJBUkdTLCBwanN1YV9pbml0X2RvYworICAgIH0sCisgICAgeworICAgIAkic3RhcnQiLCBweV9wanN1YV9zdGFydCwgTUVUSF9WQVJBUkdTLCBwanN1YV9zdGFydF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJImRlc3Ryb3kiLCBweV9wanN1YV9kZXN0cm95LCBNRVRIX1ZBUkFSR1MsIHBqc3VhX2Rlc3Ryb3lfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJoYW5kbGVfZXZlbnRzIiwgcHlfcGpzdWFfaGFuZGxlX2V2ZW50cywgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9oYW5kbGVfZXZlbnRzX2RvYworICAgIH0sCisgICAgeworICAgIAkidmVyaWZ5X3NpcF91cmwiLCBweV9wanN1YV92ZXJpZnlfc2lwX3VybCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV92ZXJpZnlfc2lwX3VybF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJInJlY29uZmlndXJlX2xvZ2dpbmciLCBweV9wanN1YV9yZWNvbmZpZ3VyZV9sb2dnaW5nLCBNRVRIX1ZBUkFSR1MsCisgICAgCXBqc3VhX3JlY29uZmlndXJlX2xvZ2dpbmdfZG9jCisgICAgfSwKKyAgICB7CisgICAgCSJsb2dnaW5nX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCwKKyAgICAJTUVUSF9WQVJBUkdTLCBwanN1YV9sb2dnaW5nX2NvbmZpZ19kZWZhdWx0X2RvYworICAgIH0sCisgICAgeworICAgIAkiY29uZmlnX2RlZmF1bHQiLCBweV9wanN1YV9jb25maWdfZGVmYXVsdCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAJIm1lZGlhX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHQsIE1FVEhfVkFSQVJHUywKKyAgICAJcGpzdWFfbWVkaWFfY29uZmlnX2RlZmF1bHRfZG9jCisgICAgfSwKKyAgICAKKyAgICAKKyAgICB7CisgICAgCSJtc2dfZGF0YV9pbml0IiwgcHlfcGpzdWFfbXNnX2RhdGFfaW5pdCwgTUVUSF9WQVJBUkdTLAorICAgIAlwanN1YV9tc2dfZGF0YV9pbml0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAidHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0LCAKKyAgICAgICAgTUVUSF9WQVJBUkdTLHBqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInRyYW5zcG9ydF9jcmVhdGUiLCBweV9wanN1YV90cmFuc3BvcnRfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3RyYW5zcG9ydF9jcmVhdGVfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0cmFuc3BvcnRfZW51bV90cmFuc3BvcnRzIiwgcHlfcGpzdWFfZW51bV90cmFuc3BvcnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2VudW1fdHJhbnNwb3J0c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInRyYW5zcG9ydF9nZXRfaW5mbyIsIHB5X3Bqc3VhX3RyYW5zcG9ydF9nZXRfaW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm9fZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0cmFuc3BvcnRfc2V0X2VuYWJsZSIsIHB5X3Bqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3RyYW5zcG9ydF9zZXRfZW5hYmxlX2RvYworICAgIH0sCisgICAgeworICAgICAgICJ0cmFuc3BvcnRfY2xvc2UiLCBweV9wanN1YV90cmFuc3BvcnRfY2xvc2UsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfdHJhbnNwb3J0X2Nsb3NlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2NvbmZpZ19kZWZhdWx0IiwgcHlfcGpzdWFfYWNjX2NvbmZpZ19kZWZhdWx0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19nZXRfY291bnQiLCBweV9wanN1YV9hY2NfZ2V0X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19nZXRfY291bnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfaXNfdmFsaWQiLCBweV9wanN1YV9hY2NfaXNfdmFsaWQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2lzX3ZhbGlkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3NldF9kZWZhdWx0IiwgcHlfcGpzdWFfYWNjX3NldF9kZWZhdWx0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19zZXRfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19nZXRfZGVmYXVsdCIsIHB5X3Bqc3VhX2FjY19nZXRfZGVmYXVsdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfZ2V0X2RlZmF1bHRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfYWRkIiwgcHlfcGpzdWFfYWNjX2FkZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfYWRkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2FkZF9sb2NhbCIsIHB5X3Bqc3VhX2FjY19hZGRfbG9jYWwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2FkZF9sb2NhbF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19kZWwiLCBweV9wanN1YV9hY2NfZGVsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19kZWxfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2Nfc2V0X3VzZXJfZGF0YSIsIHB5X3Bqc3VhX2FjY19zZXRfdXNlcl9kYXRhLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICJBY2NvY2lhdGUgdXNlciBkYXRhIHdpdGggdGhlIGFjY291bnQiCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfZ2V0X3VzZXJfZGF0YSIsIHB5X3Bqc3VhX2FjY19nZXRfdXNlcl9kYXRhLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICJHZXQgYWNjb3VudCdzIHVzZXIgZGF0YSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19tb2RpZnkiLCBweV9wanN1YV9hY2NfbW9kaWZ5LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2FjY19tb2RpZnlfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2Nfc2V0X29ubGluZV9zdGF0dXMiLCBweV9wanN1YV9hY2Nfc2V0X29ubGluZV9zdGF0dXMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3NldF9vbmxpbmVfc3RhdHVzMiIsIHB5X3Bqc3VhX2FjY19zZXRfb25saW5lX3N0YXR1czIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX3NldF9vbmxpbmVfc3RhdHVzMl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImFjY19zZXRfcmVnaXN0cmF0aW9uIiwgcHlfcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb24sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX3NldF9yZWdpc3RyYXRpb25fZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfZ2V0X2luZm8iLCBweV9wanN1YV9hY2NfZ2V0X2luZm8sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYWNjX2dldF9pbmZvX2RvYworICAgIH0sCisgICAgeworCSJhY2NfcHJlc19ub3RpZnkiLCBweV9wanN1YV9hY2NfcHJlc19ub3RpZnksIE1FVEhfVkFSQVJHUywKKwkiQWNjZXB0IG9yIHJlamVjdCBzdWJzY3JpcHRpb24gcmVxdWVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVudW1fYWNjcyIsIHB5X3Bqc3VhX2VudW1fYWNjcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2FjY3NfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY2NfZW51bV9pbmZvIiwgcHlfcGpzdWFfYWNjX2VudW1faW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9hY2NfZW51bV9pbmZvX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3NldF90cmFuc3BvcnQiLCBweV9wanN1YV9hY2Nfc2V0X3RyYW5zcG9ydCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAiTG9jayB0cmFuc3BvcnQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgdHJhbnNwb3J0IgorICAgIH0sCisgICAgeworICAgICAgICAiYnVkZHlfY29uZmlnX2RlZmF1bHQiLCBweV9wanN1YV9idWRkeV9jb25maWdfZGVmYXVsdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9idWRkeV9jb25maWdfZGVmYXVsdF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImdldF9idWRkeV9jb3VudCIsIHB5X3Bqc3VhX2dldF9idWRkeV9jb3VudCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9nZXRfYnVkZHlfY291bnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJidWRkeV9pc192YWxpZCIsIHB5X3Bqc3VhX2J1ZGR5X2lzX3ZhbGlkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2J1ZGR5X2lzX3ZhbGlkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9idWRkaWVzIiwgcHlfcGpzdWFfZW51bV9idWRkaWVzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2VudW1fYnVkZGllc19kb2MKKyAgICB9LCAgICAKKyAgICB7CisgICAgICAgICJidWRkeV9maW5kIiwgcHlfcGpzdWFfYnVkZHlfZmluZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAiRmluZCBidWRkeSB3aXRoIHRoZSBzcGVjaWZpZWQgVVJJIgorICAgIH0sICAgIAorICAgIHsKKyAgICAgICAgImJ1ZGR5X2dldF9pbmZvIiwgcHlfcGpzdWFfYnVkZHlfZ2V0X2luZm8sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYnVkZHlfZ2V0X2luZm9fZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJidWRkeV9hZGQiLCBweV9wanN1YV9idWRkeV9hZGQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYnVkZHlfYWRkX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiYnVkZHlfZGVsIiwgcHlfcGpzdWFfYnVkZHlfZGVsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2J1ZGR5X2RlbF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImJ1ZGR5X3NldF91c2VyX2RhdGEiLCBweV9wanN1YV9idWRkeV9zZXRfdXNlcl9kYXRhLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICJBc3NvY2lhdGUgdXNlciBkYXRhIHRvIHRoZSBidWRkeSBvYmplY3QiCisgICAgfSwKKyAgICB7CisgICAgICAgICJidWRkeV9nZXRfdXNlcl9kYXRhIiwgcHlfcGpzdWFfYnVkZHlfZ2V0X3VzZXJfZGF0YSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAiR2V0IGJ1ZGR5IHVzZXIgZGF0YSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImJ1ZGR5X3N1YnNjcmliZV9wcmVzIiwgcHlfcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfYnVkZHlfc3Vic2NyaWJlX3ByZXNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJwcmVzX2R1bXAiLCBweV9wanN1YV9wcmVzX2R1bXAsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfcHJlc19kdW1wX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiaW1fc2VuZCIsIHB5X3Bqc3VhX2ltX3NlbmQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfaW1fc2VuZF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImltX3R5cGluZyIsIHB5X3Bqc3VhX2ltX3R5cGluZywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9pbV90eXBpbmdfZG9jCisgICAgfSwKKyAgICAgICAgeworICAgICAgICAiY29uZl9nZXRfbWF4X3BvcnRzIiwgcHlfcGpzdWFfY29uZl9nZXRfbWF4X3BvcnRzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfZ2V0X21heF9wb3J0c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNvbmZfZ2V0X2FjdGl2ZV9wb3J0cyIsIHB5X3Bqc3VhX2NvbmZfZ2V0X2FjdGl2ZV9wb3J0cywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jb25mX2dldF9hY3RpdmVfcG9ydHNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJlbnVtX2NvbmZfcG9ydHMiLCBweV9wanN1YV9lbnVtX2NvbmZfcG9ydHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZW51bV9jb25mX3BvcnRzX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9nZXRfcG9ydF9pbmZvIiwgcHlfcGpzdWFfY29uZl9nZXRfcG9ydF9pbmZvLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfZ2V0X3BvcnRfaW5mb19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNvbmZfcmVtb3ZlX3BvcnQiLCBweV9wanN1YV9jb25mX3JlbW92ZV9wb3J0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfcmVtb3ZlX3BvcnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb25mX2Nvbm5lY3QiLCBweV9wanN1YV9jb25mX2Nvbm5lY3QsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29uZl9jb25uZWN0X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9kaXNjb25uZWN0IiwgcHlfcGpzdWFfY29uZl9kaXNjb25uZWN0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvbmZfZGlzY29ubmVjdF9kb2MKKyAgICB9LAorICAgIHsKKwkiY29uZl9zZXRfdHhfbGV2ZWwiLCBweV9wanN1YV9jb25mX3NldF90eF9sZXZlbCwgTUVUSF9WQVJBUkdTLAorCSJBZGp1c3QgdGhlIHNpZ25hbCBsZXZlbCB0byBiZSB0cmFuc21pdHRlZCBmcm9tIHRoZSBicmlkZ2UgdG8gdGhlIiAKKwkiIHNwZWNpZmllZCBwb3J0IGJ5IG1ha2luZyBpdCBsb3VkZXIgb3IgcXVpZXRlciIKKyAgICB9LAorICAgIHsKKwkiY29uZl9zZXRfcnhfbGV2ZWwiLCBweV9wanN1YV9jb25mX3NldF9yeF9sZXZlbCwgTUVUSF9WQVJBUkdTLAorCSJBZGp1c3QgdGhlIHNpZ25hbCBsZXZlbCB0byBiZSByZWNlaXZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydCAodG8iCisJIiB0aGUgYnJpZGdlKSBieSBtYWtpbmcgaXQgbG91ZGVyIG9yIHF1aWV0ZXIiCisgICAgfSwKKyAgICB7CisJImNvbmZfZ2V0X3NpZ25hbF9sZXZlbCIsIHB5X3Bqc3VhX2NvbmZfZ2V0X3NpZ25hbF9sZXZlbCwgTUVUSF9WQVJBUkdTLAorCSJHZXQgbGFzdCBzaWduYWwgbGV2ZWwgdHJhbnNtaXR0ZWQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQiCisgICAgfSwKKyAgICB7CisgICAgICAgICJwbGF5ZXJfY3JlYXRlIiwgcHlfcGpzdWFfcGxheWVyX2NyZWF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9wbGF5ZXJfY3JlYXRlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAicGxheWxpc3RfY3JlYXRlIiwgcHlfcGpzdWFfcGxheWxpc3RfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICJDcmVhdGUgV0FWIHBsYXlsaXN0IgorICAgIH0sCisgICAgeworICAgICAgICAicGxheWVyX2dldF9jb25mX3BvcnQiLCBweV9wanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9wbGF5ZXJfZ2V0X2NvbmZfcG9ydF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInBsYXllcl9zZXRfcG9zIiwgcHlfcGpzdWFfcGxheWVyX3NldF9wb3MsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfcGxheWVyX3NldF9wb3NfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJwbGF5ZXJfZGVzdHJveSIsIHB5X3Bqc3VhX3BsYXllcl9kZXN0cm95LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3BsYXllcl9kZXN0cm95X2RvYworICAgIH0sCisgICAgeworICAgICAgICAicmVjb3JkZXJfY3JlYXRlIiwgcHlfcGpzdWFfcmVjb3JkZXJfY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3JlY29yZGVyX2NyZWF0ZV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInJlY29yZGVyX2dldF9jb25mX3BvcnQiLCBweV9wanN1YV9yZWNvcmRlcl9nZXRfY29uZl9wb3J0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3JlY29yZGVyX2dldF9jb25mX3BvcnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJyZWNvcmRlcl9kZXN0cm95IiwgcHlfcGpzdWFfcmVjb3JkZXJfZGVzdHJveSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9yZWNvcmRlcl9kZXN0cm95X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9zbmRfZGV2cyIsIHB5X3Bqc3VhX2VudW1fc25kX2RldnMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZW51bV9zbmRfZGV2c19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImdldF9zbmRfZGV2IiwgcHlfcGpzdWFfZ2V0X3NuZF9kZXYsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZ2V0X3NuZF9kZXZfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJzZXRfc25kX2RldiIsIHB5X3Bqc3VhX3NldF9zbmRfZGV2LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX3NldF9zbmRfZGV2X2RvYworICAgIH0sCisgICAgeworICAgICAgICAic2V0X251bGxfc25kX2RldiIsIHB5X3Bqc3VhX3NldF9udWxsX3NuZF9kZXYsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfc2V0X251bGxfc25kX2Rldl9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgInNldF9lYyIsIHB5X3Bqc3VhX3NldF9lYywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9zZXRfZWNfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJnZXRfZWNfdGFpbCIsIHB5X3Bqc3VhX2dldF9lY190YWlsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2dldF9lY190YWlsX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9jb2RlY3MiLCBweV9wanN1YV9lbnVtX2NvZGVjcywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9lbnVtX2NvZGVjc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNvZGVjX3NldF9wcmlvcml0eSIsIHB5X3Bqc3VhX2NvZGVjX3NldF9wcmlvcml0eSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jb2RlY19zZXRfcHJpb3JpdHlfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb2RlY19nZXRfcGFyYW0iLCBweV9wanN1YV9jb2RlY19nZXRfcGFyYW0sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY29kZWNfZ2V0X3BhcmFtX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY29kZWNfc2V0X3BhcmFtIiwgcHlfcGpzdWFfY29kZWNfc2V0X3BhcmFtLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NvZGVjX3NldF9wYXJhbV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X21heF9jb3VudCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X21heF9jb3VudCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9tYXhfY291bnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2dldF9jb3VudCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfZ2V0X2NvdW50X2RvYworICAgIH0sCisgICAgeworICAgICAgICAiZW51bV9jYWxscyIsIHB5X3Bqc3VhX2VudW1fY2FsbHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfZW51bV9jYWxsc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfbWFrZV9jYWxsIiwgcHlfcGpzdWFfY2FsbF9tYWtlX2NhbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9tYWtlX2NhbGxfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2lzX2FjdGl2ZSIsIHB5X3Bqc3VhX2NhbGxfaXNfYWN0aXZlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfaXNfYWN0aXZlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9oYXNfbWVkaWEiLCBweV9wanN1YV9jYWxsX2hhc19tZWRpYSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2hhc19tZWRpYV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X2NvbmZfcG9ydCIsIHB5X3Bqc3VhX2NhbGxfZ2V0X2NvbmZfcG9ydCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9jb25mX3BvcnRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2dldF9pbmZvIiwgcHlfcGpzdWFfY2FsbF9nZXRfaW5mbywgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF9pbmZvX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9zZXRfdXNlcl9kYXRhIiwgcHlfcGpzdWFfY2FsbF9zZXRfdXNlcl9kYXRhLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfc2V0X3VzZXJfZGF0YV9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZ2V0X3VzZXJfZGF0YSIsIHB5X3Bqc3VhX2NhbGxfZ2V0X3VzZXJfZGF0YSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2dldF91c2VyX2RhdGFfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2Fuc3dlciIsIHB5X3Bqc3VhX2NhbGxfYW5zd2VyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfYW5zd2VyX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9oYW5ndXAiLCBweV9wanN1YV9jYWxsX2hhbmd1cCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2hhbmd1cF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfc2V0X2hvbGQiLCBweV9wanN1YV9jYWxsX3NldF9ob2xkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfc2V0X2hvbGRfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX3JlaW52aXRlIiwgcHlfcGpzdWFfY2FsbF9yZWludml0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX3JlaW52aXRlX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF91cGRhdGUiLCBweV9wanN1YV9jYWxsX3VwZGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAiU2VuZCBVUERBVEUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX3hmZXIiLCBweV9wanN1YV9jYWxsX3hmZXIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF94ZmVyX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF94ZmVyX3JlcGxhY2VzIiwgcHlfcGpzdWFfY2FsbF94ZmVyX3JlcGxhY2VzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHBqc3VhX2NhbGxfeGZlcl9yZXBsYWNlc19kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfZGlhbF9kdG1mIiwgcHlfcGpzdWFfY2FsbF9kaWFsX2R0bWYsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9kaWFsX2R0bWZfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX3NlbmRfaW0iLCBweV9wanN1YV9jYWxsX3NlbmRfaW0sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9zZW5kX2ltX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9zZW5kX3R5cGluZ19pbmQiLCBweV9wanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX3NlbmRfdHlwaW5nX2luZF9kb2MKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNhbGxfaGFuZ3VwX2FsbCIsIHB5X3Bqc3VhX2NhbGxfaGFuZ3VwX2FsbCwgTUVUSF9WQVJBUkdTLAorICAgICAgICBwanN1YV9jYWxsX2hhbmd1cF9hbGxfZG9jCisgICAgfSwKKyAgICB7CisgICAgICAgICJjYWxsX2R1bXAiLCBweV9wanN1YV9jYWxsX2R1bXAsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgcGpzdWFfY2FsbF9kdW1wX2RvYworICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9zZW5kX3JlcXVlc3QiLCBweV9wanN1YV9jYWxsX3NlbmRfcmVxdWVzdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAiU2VuZCBhcmJpdHJhcnkgcmVxdWVzdCIKKyAgICB9LAorICAgIHsKKwkiZHVtcCIsIHB5X3Bqc3VhX2R1bXAsIE1FVEhfVkFSQVJHUywgIkR1bXAgYXBwbGljYXRpb24gc3RhdGUiCisgICAgfSwKKyAgICB7CisJInN0cmVycm9yIiwgcHlfcGpfc3RyZXJyb3IsIE1FVEhfVkFSQVJHUywgIkdldCBlcnJvciBtZXNzYWdlIgorICAgIH0sCisgICAgeworCSJwYXJzZV9zaW1wbGVfdXJpIiwgcHlfcGpfcGFyc2Vfc2ltcGxlX3NpcCwgTUVUSF9WQVJBUkdTLCAiUGFyc2UgVVJJIgorICAgIH0sCisKKyAgICAKKyAgICB7TlVMTCwgTlVMTH0gLyogZW5kIG9mIGZ1bmN0aW9uIGxpc3QgKi8KK307CisKKworCisvKgorICogTWFwcGluZyBDIHN0cnVjdHMgZnJvbSBhbmQgdG8gUHl0aG9uIG9iamVjdHMgJiBpbml0aWFsaXppbmcgb2JqZWN0CisgKi8KK0RMX0VYUE9SVCh2b2lkKQoraW5pdF9wanN1YSh2b2lkKQoreworICAgIFB5T2JqZWN0KiBtID0gTlVMTDsKKyNkZWZpbmUgQUREX0NPTlNUQU5UKG1vZCxuYW1lKQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2QsI25hbWUsbmFtZSkKKworICAgIAorICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfY2FsbGJhY2spIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2NvbmZpZykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX21zZ19kYXRhKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeVR5cF9wanN1YV9tZWRpYV9jb25maWcudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeVR5cF9wanNpcF9jcmVkX2luZm8udHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzaXBfY3JlZF9pbmZvKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeVR5cF9wanNpcF9yeF9kYXRhLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc2lwX3J4X2RhdGEpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogTElCIFRSQU5TUE9SVCAqLworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2luZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8qIEVORCBPRiBMSUIgVFJBTlNQT1JUICovCisKKyAgICAvKiBMSUIgQUNDT1VOVCAqLworCisgICAgCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfYWNjX2NvbmZpZykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfYWNjX2luZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRU5EIE9GIExJQiBBQ0NPVU5UICovCisKKyAgICAvKiBMSUIgQlVERFkgKi8KKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2J1ZGR5X2NvbmZpZykgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfYnVkZHlfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBFTkQgT0YgTElCIEJVRERZICovCisKKyAgICAvKiBMSUIgTUVESUEgKi8KKyAgCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGpzdWFfY29kZWNfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cF9wam1lZGlhX3NuZF9kZXZfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8udHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW0pIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRU5EIE9GIExJQiBNRURJQSAqLworCisgICAgLyogTElCIENBTEwgKi8KKworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwX3Bqc3VhX2NhbGxfaW5mbykgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBFTkQgT0YgTElCIENBTEwgKi8KKworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygKKyAgICAgICAgIl9wanN1YSIsIHB5X3Bqc3VhX21ldGhvZHMsICJQSlNVQS1saWIgbW9kdWxlIGZvciBweXRob24iCisgICAgKTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfY2FsbGJhY2spOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ2FsbGJhY2siLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfY2FsbGJhY2spOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9jb25maWcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29uZmlnIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX2NvbmZpZyk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX21lZGlhX2NvbmZpZyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZWRpYV9Db25maWciLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfbWVkaWFfY29uZmlnKTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTG9nZ2luZ19Db25maWciLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcpOworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9tc2dfZGF0YSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNc2dfRGF0YSIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9tc2dfZGF0YSk7CisKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc2lwX2NyZWRfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQanNpcF9DcmVkX0luZm8iLAorICAgICAgICAoUHlPYmplY3QgKikmUHlUeXBfcGpzaXBfY3JlZF9pbmZvCisgICAgKTsKKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzaXBfcnhfZGF0YSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQanNpcF9SeF9EYXRhIiwKKyAgICAgICAgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc2lwX3J4X2RhdGEKKyAgICApOworCisgICAgLyogTElCIFRSQU5TUE9SVCAqLworCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QKKyAgICAgICAgKG0sICJUcmFuc3BvcnRfQ29uZmlnIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcpOworICAgIAorICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVHJhbnNwb3J0X0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2luZm8pOworICAgIAorCisgICAgLyogRU5EIE9GIExJQiBUUkFOU1BPUlQgKi8KKworICAgIC8qIExJQiBBQ0NPVU5UICovCisKKyAgICAKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2FjY19jb25maWcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWNjX0NvbmZpZyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9hY2NfY29uZmlnKTsKKyAgICBQeV9JTkNSRUYoJlB5VHlwX3Bqc3VhX2FjY19pbmZvKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFjY19JbmZvIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX2FjY19pbmZvKTsKKworICAgIC8qIEVORCBPRiBMSUIgQUNDT1VOVCAqLworCisgICAgLyogTElCIEJVRERZICovCisgICAgCisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9idWRkeV9jb25maWcpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQnVkZHlfQ29uZmlnIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX2J1ZGR5X2NvbmZpZyk7CisgICAgUHlfSU5DUkVGKCZQeVR5cF9wanN1YV9idWRkeV9pbmZvKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJ1ZGR5X0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfYnVkZHlfaW5mbyk7CisKKyAgICAvKiBFTkQgT0YgTElCIEJVRERZICovCisKKyAgICAvKiBMSUIgTUVESUEgKi8KKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfY29kZWNfaW5mbyk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb2RlY19JbmZvIiwgKFB5T2JqZWN0ICopJlB5VHlwX3Bqc3VhX2NvZGVjX2luZm8pOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfY29uZl9wb3J0X2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29uZl9Qb3J0X0luZm8iLCAoUHlPYmplY3QgKikmUHlUeXBfcGpzdWFfY29uZl9wb3J0X2luZm8pOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGptZWRpYV9zbmRfZGV2X2luZm8pOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUEpNZWRpYV9TbmRfRGV2X0luZm8iLCAKKwkoUHlPYmplY3QgKikmUHlUeXBfcGptZWRpYV9zbmRfZGV2X2luZm8pOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBKTWVkaWFfQ29kZWNfUGFyYW1fSW5mbyIsIAorCShQeU9iamVjdCAqKSZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8pOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBKTWVkaWFfQ29kZWNfUGFyYW1fU2V0dGluZyIsIAorCShQeU9iamVjdCAqKSZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcpOworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGptZWRpYV9jb2RlY19wYXJhbSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQSk1lZGlhX0NvZGVjX1BhcmFtIiwgCisJKFB5T2JqZWN0ICopJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW0pOworCisgICAgLyogRU5EIE9GIExJQiBNRURJQSAqLworCisgICAgLyogTElCIENBTEwgKi8KKworICAgIFB5X0lOQ1JFRigmUHlUeXBfcGpzdWFfY2FsbF9pbmZvKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNhbGxfSW5mbyIsIChQeU9iamVjdCAqKSZQeVR5cF9wanN1YV9jYWxsX2luZm8pOworCisgICAgLyogRU5EIE9GIExJQiBDQUxMICovCisKKworICAgIC8qCisgICAgICogQWRkIHZhcmlvdXMgY29uc3RhbnRzLgorICAgICAqLworICAgIC8qIFNraXAgaXQuLiAqLworCisjdW5kZWYgQUREX0NPTlNUQU5UCit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vX3Bqc3VhLmRlZiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9fcGpzdWEuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTUwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vX3Bqc3VhLmRlZgpAQCAtMCwwICsxLDIgQEAKK0VYUE9SVFMKKwlpbml0X3Bqc3VhCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vX3Bqc3VhLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vX3Bqc3VhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3YjQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9fcGpzdWEuaApAQCAtMCwwICsxLDM3MTggQEAKKy8qICRJZDogX3Bqc3VhLmggNDYwOSAyMDEzLTEwLTAyIDAzOjE5OjU0WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QWV9QSlNVQV9IX18KKyNkZWZpbmUgX19QWV9QSlNVQV9IX18KKworI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPgorI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YS5oPgorCisKK1BKX0lOTElORShwal9zdHJfdCkgUHlTdHJpbmdfVG9QSihjb25zdCBQeU9iamVjdCAqb2JqKQoreworICAgIHBqX3N0cl90IHN0cjsKKworICAgIGlmIChvYmogJiYgUHlTdHJpbmdfQ2hlY2sob2JqKSkgeworCXN0ci5wdHIgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKKwlzdHIuc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7CisgICAgfSBlbHNlIHsKKwlzdHIucHRyID0gTlVMTDsKKwlzdHIuc2xlbiA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30KKworUEpfSU5MSU5FKFB5T2JqZWN0KikgUHlTdHJpbmdfRnJvbVBKKGNvbnN0IHBqX3N0cl90ICpzdHIpCit7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0ci0+cHRyLCBzdHItPnNsZW4pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanNpcF9jcmVkX2luZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIFB5T2JqZWN0ICpyZWFsbTsKKyAgICBQeU9iamVjdCAqc2NoZW1lOworICAgIFB5T2JqZWN0ICp1c2VybmFtZTsKKyAgICBpbnQJICAgICAgZGF0YV90eXBlOworICAgIFB5T2JqZWN0ICpkYXRhOworICAgIAorfSBQeU9ial9wanNpcF9jcmVkX2luZm87CisKKy8qCisgKiBjcmVkX2luZm9fZGVhbGxvYworICogZGVsZXRlcyBhIGNyZWQgaW5mbyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanNpcF9jcmVkX2luZm9fZGVsZXRlKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlYWxtKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnNjaGVtZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT51c2VybmFtZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kYXRhKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzaXBfY3JlZF9pbmZvX2ltcG9ydChQeU9ial9wanNpcF9jcmVkX2luZm8gKm9iaiwKKwkJCQkJIGNvbnN0IHBqc2lwX2NyZWRfaW5mbyAqY2ZnKQoreworICAgIFB5X1hERUNSRUYob2JqLT5yZWFsbSk7CisgICAgb2JqLT5yZWFsbSA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5yZWFsbSk7CisgICAgUHlfWERFQ1JFRihvYmotPnNjaGVtZSk7CisgICAgb2JqLT5zY2hlbWUgPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+c2NoZW1lKTsKKyAgICBQeV9YREVDUkVGKG9iai0+dXNlcm5hbWUpOworICAgIG9iai0+dXNlcm5hbWUgPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+dXNlcm5hbWUpOworICAgIG9iai0+ZGF0YV90eXBlID0gY2ZnLT5kYXRhX3R5cGU7CisgICAgUHlfWERFQ1JFRihvYmotPmRhdGEpOworICAgIG9iai0+ZGF0YSA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgUHlPYmpfcGpzaXBfY3JlZF9pbmZvX2V4cG9ydChwanNpcF9jcmVkX2luZm8gKmNmZywKKwkJCQkJIFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyAqb2JqKQoreworICAgIGNmZy0+cmVhbG0JPSBQeVN0cmluZ19Ub1BKKG9iai0+cmVhbG0pOworICAgIGNmZy0+c2NoZW1lCT0gUHlTdHJpbmdfVG9QSihvYmotPnNjaGVtZSk7CisgICAgY2ZnLT51c2VybmFtZSA9IFB5U3RyaW5nX1RvUEoob2JqLT51c2VybmFtZSk7CisgICAgY2ZnLT5kYXRhX3R5cGUgPSBvYmotPmRhdGFfdHlwZTsKKyAgICBjZmctPmRhdGEJPSBQeVN0cmluZ19Ub1BKKG9iai0+ZGF0YSk7Cit9CisKKworLyoKKyAqIGNyZWRfaW5mb19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBjcmVkX2luZm8gb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzaXBfY3JlZF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanNpcF9jcmVkX2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnJlYWxtID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPnNjaGVtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBzZWxmLT51c2VybmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPmRhdGFfdHlwZSA9IFBKU0lQX0NSRURfREFUQV9QTEFJTl9QQVNTV0Q7CisgICAgICAgIHNlbGYtPmRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzaXBfY3JlZF9pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgInJlYWxtIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbywgcmVhbG0pLCAwLAorICAgICAgICAiUmVhbG0iCisgICAgfSwKKyAgICB7CisgICAgICAgICJzY2hlbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzaXBfY3JlZF9pbmZvLCBzY2hlbWUpLCAwLAorICAgICAgICAiU2NoZW1lIgorICAgIH0sCisgICAgeworICAgICAgICAidXNlcm5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzaXBfY3JlZF9pbmZvLCB1c2VybmFtZSksIDAsCisgICAgICAgICJVc2VyIG5hbWUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJkYXRhIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbywgZGF0YSksIDAsCisgICAgICAgICJUaGUgZGF0YSwgd2hpY2ggY2FuIGJlIGEgcGxhaW50ZXh0IHBhc3N3b3JkIG9yIGEgaGFzaGVkIGRpZ2VzdCwgIgorCSJkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGRhdGFfdHlwZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImRhdGFfdHlwZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanNpcF9jcmVkX2luZm8sIGRhdGFfdHlwZSksIDAsCisgICAgICAgICJUeXBlIG9mIGRhdGEiCisgICAgfSwKKyAgICAKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisvKgorICogUHlUeXBfcGpzaXBfY3JlZF9pbmZvCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzaXBfY3JlZF9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9wanN1YS5QanNpcF9DcmVkX0luZm8iLCAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanNpcF9jcmVkX2luZm9fZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIlBKU0lQIGNyZWRlbnRpYWwgaW5mb3JtYXRpb24iLCAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19tZW1iZXJzLCAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanNpcF9jcmVkX2luZm9fbmV3LCAgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3Bqc3VhX2NhbGxiYWNrCisgKiBDL3B5dGhvbiB0eXBld3JhcHBlciBmb3IgY2FsbGJhY2sgc3RydWN0CisgKi8KK3R5cGVkZWYgc3RydWN0IFB5T2JqX3Bqc3VhX2NhbGxiYWNrCit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgUHlPYmplY3QgKiBvbl9jYWxsX3N0YXRlOworICAgIFB5T2JqZWN0ICogb25faW5jb21pbmdfY2FsbDsKKyAgICBQeU9iamVjdCAqIG9uX2NhbGxfbWVkaWFfc3RhdGU7CisgICAgUHlPYmplY3QgKiBvbl9kdG1mX2RpZ2l0OworICAgIFB5T2JqZWN0ICogb25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0OworICAgIFB5T2JqZWN0ICogb25fY2FsbF90cmFuc2Zlcl9zdGF0dXM7CisgICAgUHlPYmplY3QgKiBvbl9jYWxsX3JlcGxhY2VfcmVxdWVzdDsKKyAgICBQeU9iamVjdCAqIG9uX2NhbGxfcmVwbGFjZWQ7CisgICAgUHlPYmplY3QgKiBvbl9yZWdfc3RhdGU7CisgICAgUHlPYmplY3QgKiBvbl9pbmNvbWluZ19zdWJzY3JpYmU7CisgICAgUHlPYmplY3QgKiBvbl9idWRkeV9zdGF0ZTsKKyAgICBQeU9iamVjdCAqIG9uX3BhZ2VyOworICAgIFB5T2JqZWN0ICogb25fcGFnZXJfc3RhdHVzOworICAgIFB5T2JqZWN0ICogb25fdHlwaW5nOworICAgIFB5T2JqZWN0ICogb25fbXdpX2luZm87Cit9IFB5T2JqX3Bqc3VhX2NhbGxiYWNrOworCisKKy8qCisgKiBQeU9ial9wanN1YV9jYWxsYmFja19kZWxldGUKKyAqIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9jYWxsYmFja19kZWxldGUoUHlPYmpfcGpzdWFfY2FsbGJhY2sqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9jYWxsX3N0YXRlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2luY29taW5nX2NhbGwpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fY2FsbF9tZWRpYV9zdGF0ZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9kdG1mX2RpZ2l0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9jYWxsX3JlcGxhY2VkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX3JlZ19zdGF0ZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9pbmNvbWluZ19zdWJzY3JpYmUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fYnVkZHlfc3RhdGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fcGFnZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25fcGFnZXJfc3RhdHVzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9uX3R5cGluZyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vbl9td2lfaW5mbyk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV9jYWxsYmFja19uZXcKKyAqICogZGVjbGFyZXMgY29uc3RydWN0b3IgZm9yIGNhbGxiYWNrIHN0cnVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanN1YV9jYWxsYmFja19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgUHlPYmplY3QgKmFyZ3MsCisJCQkJCSAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NhbGxiYWNrICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9jYWxsYmFjayAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+b25fY2FsbF9zdGF0ZSA9IFB5X0J1aWxkVmFsdWUoIiIpOworICAgICAgICBzZWxmLT5vbl9pbmNvbWluZ19jYWxsID0gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgICAgIHNlbGYtPm9uX2NhbGxfbWVkaWFfc3RhdGUgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICAgICAgc2VsZi0+b25fZHRtZl9kaWdpdCA9IFB5X0J1aWxkVmFsdWUoIiIpOworICAgICAgICBzZWxmLT5vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICAgICAgc2VsZi0+b25fY2FsbF90cmFuc2Zlcl9zdGF0dXMgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICAgICAgc2VsZi0+b25fY2FsbF9yZXBsYWNlX3JlcXVlc3QgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICAgICAgc2VsZi0+b25fY2FsbF9yZXBsYWNlZCA9IFB5X0J1aWxkVmFsdWUoIiIpOworICAgICAgICBzZWxmLT5vbl9yZWdfc3RhdGUgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKyAgICAgICAgc2VsZi0+b25faW5jb21pbmdfc3Vic2NyaWJlID0gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgICAgIHNlbGYtPm9uX2J1ZGR5X3N0YXRlID0gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgICAgIHNlbGYtPm9uX3BhZ2VyID0gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgICAgIHNlbGYtPm9uX3BhZ2VyX3N0YXR1cyA9IFB5X0J1aWxkVmFsdWUoIiIpOworICAgICAgICBzZWxmLT5vbl90eXBpbmcgPSBQeV9CdWlsZFZhbHVlKCIiKTsKKwlzZWxmLT5vbl9td2lfaW5mbyA9IFB5X0J1aWxkVmFsdWUoIiIpOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV9jYWxsYmFja19tZW1iZXJzCisgKiBkZWNsYXJlcyBhdmFpbGFibGUgZnVuY3Rpb25zIGZvciBjYWxsYmFjayBvYmplY3QKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2NhbGxiYWNrX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAib25fY2FsbF9zdGF0ZSIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF9zdGF0ZSksIDAsIAorCSJOb3RpZnkgYXBwbGljYXRpb24gd2hlbiBpbnZpdGUgc3RhdGUgaGFzIGNoYW5nZWQuIEFwcGxpY2F0aW9uIG1heSAiCisgICAgICAgICJ0aGVuIHF1ZXJ5IHRoZSBjYWxsIGluZm8gdG8gZ2V0IHRoZSBkZXRhaWwgY2FsbCBzdGF0ZXMuIgorICAgIH0sCisgICAgeworICAgICAgICAib25faW5jb21pbmdfY2FsbCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25faW5jb21pbmdfY2FsbCksIDAsCisgICAgICAgICJOb3RpZnkgYXBwbGljYXRpb24gb24gaW5jb21pbmcgY2FsbC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9jYWxsX21lZGlhX3N0YXRlIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9jYWxsX21lZGlhX3N0YXRlKSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiB3aGVuIG1lZGlhIHN0YXRlIGluIHRoZSBjYWxsIGhhcyBjaGFuZ2VkLiBOb3JtYWwgIgorICAgICAgICAiYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBjYWxsYmFjaywgZS5nLiB0byBjb25uZWN0ICIKKyAgICAgICAgInRoZSBjYWxsJ3MgbWVkaWEgdG8gc291bmQgZGV2aWNlLiIKKyAgICB9LAorICAgIHsKKwkib25fZHRtZl9kaWdpdCIsIFRfT0JKRUNUX0VYLAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9kdG1mX2RpZ2l0KSwgMCwKKwkiTm90aWZ5IGFwcGxpY2F0aW9uIHVwb24gcmVjZWl2aW5nIGluY29taW5nIERUTUYgZGlnaXQuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0IiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIG9uIGNhbGwgYmVpbmcgdHJhbnNmZXJlZC4gIgorCSJBcHBsaWNhdGlvbiBjYW4gZGVjaWRlIHRvIGFjY2VwdC9yZWplY3QgdHJhbnNmZXIgcmVxdWVzdCAiCisJImJ5IHNldHRpbmcgdGhlIGNvZGUgKGRlZmF1bHQgaXMgMjAwKS4gV2hlbiB0aGlzIGNhbGxiYWNrICIKKwkiaXMgbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFjY2VwdCB0aGUgIgorCSJ0cmFuc2Zlci4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF90cmFuc2Zlcl9zdGF0dXMpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIG9mIHRoZSBzdGF0dXMgb2YgcHJldmlvdXNseSBzZW50IGNhbGwgIgorICAgICAgICAidHJhbnNmZXIgcmVxdWVzdC4gQXBwbGljYXRpb24gY2FuIG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgIgorICAgICAgICAiY2FsbCB0cmFuc2ZlciByZXF1ZXN0LCBmb3IgZXhhbXBsZSB0byBkZWNpZGUgd2hldGhlciB0byAiCisgICAgICAgICJ0ZXJtaW5hdGUgZXhpc3RpbmcgY2FsbC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9jYWxsX3JlcGxhY2VfcmVxdWVzdCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fY2FsbF9yZXBsYWNlX3JlcXVlc3QpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIGFib3V0IGluY29taW5nIElOVklURSB3aXRoIFJlcGxhY2VzIGhlYWRlci4gIgorICAgICAgICAiQXBwbGljYXRpb24gbWF5IHJlamVjdCB0aGUgcmVxdWVzdCBieSBzZXR0aW5nIG5vbi0yeHggY29kZS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9jYWxsX3JlcGxhY2VkIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9jYWxsX3JlcGxhY2VkKSwgMCwKKwkiTm90aWZ5IGFwcGxpY2F0aW9uIHRoYXQgYW4gZXhpc3RpbmcgY2FsbCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoICIKKwkiYSBuZXcgY2FsbC4gVGhpcyBoYXBwZW5zIHdoZW4gUEpTVUEtQVBJIHJlY2VpdmVzIGluY29taW5nIElOVklURSAiCisJInJlcXVlc3Qgd2l0aCBSZXBsYWNlcyBoZWFkZXIuIgorCSIgIgorCSJBZnRlciB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCwgbm9ybWFsbHkgUEpTVUEtQVBJIHdpbGwgZGlzY29ubmVjdCAiCisJIm9sZF9jYWxsX2lkIGFuZCBlc3RhYmxpc2ggbmV3X2NhbGxfaWQuIgorICAgIH0sCisgICAgeworICAgICAgICAib25fcmVnX3N0YXRlIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9yZWdfc3RhdGUpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIHdoZW4gcmVnaXN0cmF0aW9uIHN0YXR1cyBoYXMgY2hhbmdlZC4gQXBwbGljYXRpb24gIgorICAgICAgICAibWF5IHRoZW4gcXVlcnkgdGhlIGFjY291bnQgaW5mbyB0byBnZXQgdGhlIHJlZ2lzdHJhdGlvbiBkZXRhaWxzLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX2luY29taW5nX3N1YnNjcmliZSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25faW5jb21pbmdfc3Vic2NyaWJlKSwgMCwKKyAgICAgICAgIk5vdGlmaWNhdGlvbiB3aGVuIGluY29taW5nIFNVQlNDUklCRSByZXF1ZXN0IGlzIHJlY2VpdmVkLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX2J1ZGR5X3N0YXRlIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxiYWNrLCBvbl9idWRkeV9zdGF0ZSksIDAsCisgICAgICAgICJOb3RpZnkgYXBwbGljYXRpb24gd2hlbiB0aGUgYnVkZHkgc3RhdGUgaGFzIGNoYW5nZWQuIEFwcGxpY2F0aW9uIG1heSAiCisgICAgICAgICJ0aGVuIHF1ZXJ5IHRoZSBidWRkeSBpbnRvIHRvIGdldCB0aGUgZGV0YWlscy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9wYWdlciIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fcGFnZXIpLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIG9uIGluY29taW5nIHBhZ2VyIChpLmUuIE1FU1NBR0UgcmVxdWVzdCkuICIKKyAgICAgICAgIkFyZ3VtZW50IGNhbGxfaWQgd2lsbCBiZSAtMSBpZiBNRVNTQUdFIHJlcXVlc3QgaXMgbm90IHJlbGF0ZWQgdG8gYW4gIgorICAgICAgICAiZXhpc3RpbmcgY2FsbC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9wYWdlcl9zdGF0dXMiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbGJhY2ssIG9uX3BhZ2VyX3N0YXR1cyksIDAsCisgICAgICAgICJOb3RpZnkgYXBwbGljYXRpb24gYWJvdXQgdGhlIGRlbGl2ZXJ5IHN0YXR1cyBvZiBvdXRnb2luZyBwYWdlciAiCisgICAgICAgICJyZXF1ZXN0LiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9uX3R5cGluZyIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fdHlwaW5nKSwgMCwKKyAgICAgICAgIk5vdGlmeSBhcHBsaWNhdGlvbiBhYm91dCB0eXBpbmcgaW5kaWNhdGlvbi4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJvbl9td2lfaW5mbyIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsYmFjaywgb25fbXdpX2luZm8pLCAwLAorICAgICAgICAiTm90aWZ5IGFwcGxpY2F0aW9uIGFib3V0IE1XSSBpbmRpY2F0aW9uLiIKKyAgICB9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX2NhbGxiYWNrCisgKiBjYWxsYmFjayBjbGFzcyBkZWZpbml0aW9uCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfY2FsbGJhY2sgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsCQkJCQkvKm9iX3NpemUqLworICAgICJfcGpzdWEuQ2FsbGJhY2siLAkJLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfY2FsbGJhY2spLAkvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwJCQkJCS8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc3VhX2NhbGxiYWNrX2RlbGV0ZSwgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgCS8qdHBfZmxhZ3MqLworICAgICJUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYXBwbGljYXRpb24gY2FsbGJhY2sgIgorICAgICJ0byByZWNlaXZlIHZhcmlvdXMgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tICIKKyAgICAiUEpTVUEtQVBJIiwJCQkvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAJCQkvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfY2FsbGJhY2tfbWVtYmVycywgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgIAkJCS8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIHRwX2FsbG9jICovCisgICAgUHlPYmpfcGpzdWFfY2FsbGJhY2tfbmV3LCAgICAgICAgICAgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnCisgKiBDL1B5dGhvbiB3cmFwcGVyIGZvciBwanN1YV9tZWRpYV9jb25maWcgb2JqZWN0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgdW5zaWduZWQgY2xvY2tfcmF0ZTsKKyAgICB1bnNpZ25lZCBzbmRfY2xvY2tfcmF0ZTsKKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50OworICAgIHVuc2lnbmVkIGF1ZGlvX2ZyYW1lX3B0aW1lOworICAgIGludAkgICAgIHNuZF9hdXRvX2Nsb3NlX3RpbWU7CisgICAgdW5zaWduZWQgbWF4X21lZGlhX3BvcnRzOworICAgIGludAkgICAgIGhhc19pb3F1ZXVlOworICAgIHVuc2lnbmVkIHRocmVhZF9jbnQ7CisgICAgdW5zaWduZWQgcXVhbGl0eTsKKyAgICB1bnNpZ25lZCBwdGltZTsKKyAgICBpbnQJICAgICBub192YWQ7CisgICAgdW5zaWduZWQgaWxiY19tb2RlOworICAgIHVuc2lnbmVkIHR4X2Ryb3BfcGN0OworICAgIHVuc2lnbmVkIHJ4X2Ryb3BfcGN0OworICAgIHVuc2lnbmVkIGVjX29wdGlvbnM7CisgICAgdW5zaWduZWQgZWNfdGFpbF9sZW47CisgICAgaW50CSAgICAgamJfbWluOworICAgIGludAkgICAgIGpiX21heDsKKyAgICBpbnQJICAgICBlbmFibGVfaWNlOworICAgIGludAkgICAgIGVuYWJsZV90dXJuOworICAgIFB5T2JqZWN0ICp0dXJuX3NlcnZlcjsKKyAgICBpbnQJICAgICB0dXJuX2Nvbm5fdHlwZTsKKyAgICBQeU9iamVjdCAqdHVybl9yZWFsbTsKKyAgICBQeU9iamVjdCAqdHVybl91c2VybmFtZTsKKyAgICBpbnQJICAgICB0dXJuX3Bhc3N3ZF90eXBlOworICAgIFB5T2JqZWN0ICp0dXJuX3Bhc3N3ZDsKK30gUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnOworCisKKy8qCisgKiBQeU9ial9wanN1YV9tZWRpYV9jb25maWdfbWVtYmVycworICogZGVjbGFyZXMgYXR0cmlidXRlcyBhY2Nlc3NpYmxlIGZyb20gYm90aCBDIGFuZCBQeXRob24gZm9yIG1lZGlhX2NvbmZpZyBmaWxlCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV9tZWRpYV9jb25maWdfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJjbG9ja19yYXRlIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgY2xvY2tfcmF0ZSksIDAsCisgICAgICAgICJDbG9jayByYXRlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiBJZiB2YWx1ZSBpcyB6ZXJvLCAiCisgICAgICAgICJkZWZhdWx0IGNsb2NrIHJhdGUgd2lsbCBiZSB1c2VkICgxNktIeikuIgorICAgIH0sCisgICAgeworICAgICAgICAic25kX2Nsb2NrX3JhdGUiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBzbmRfY2xvY2tfcmF0ZSksIDAsCisgICAgICAgICJTcGVjaWZ5IGRpZmZlcmVudCBjbG9jayByYXRlIG9mIHNvdW5kIGRldmljZSwgb3RoZXJ3aXNlIDAuIgorICAgIH0sCisgICAgeworICAgICAgICAiY2hhbm5lbF9jb3VudCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIGNoYW5uZWxfY291bnQpLCAwLAorICAgICAgICAiU3BlY2lmeSBjaGFubmVsIGNvdW50IChkZWZhdWx0IDEpLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImF1ZGlvX2ZyYW1lX3B0aW1lIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgYXVkaW9fZnJhbWVfcHRpbWUpLCAwLAorICAgICAgICAiQXVkaW8gZnJhbWUgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJzbmRfYXV0b19jbG9zZV90aW1lIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgc25kX2F1dG9fY2xvc2VfdGltZSksIDAsCisgICAgICAgICJTb3VuZCBpZGxlIHRpbWUgYmVmb3JlIGl0J3MgY2xvc2VkLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1heF9tZWRpYV9wb3J0cyIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIG1heF9tZWRpYV9wb3J0cyksIDAsCisgICAgICAgICJTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIG1lZGlhIHBvcnRzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlICIKKyAgICAgICAgImNvbmZlcmVuY2UgYnJpZGdlLiBTaW5jZSBhbGwgbWVkaWEgdGVybWluYXRlIGluIHRoZSBicmlkZ2UgKGNhbGxzLCAiCisgICAgICAgICJmaWxlIHBsYXllciwgZmlsZSByZWNvcmRlciwgZXRjKSwgdGhlIHZhbHVlIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvICIKKyAgICAgICAgInN1cHBvcnQgYWxsIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSAiCisgICAgICAgICJjb21wdXRhdGlvbnMgYXJlIHBlcmZvcm1lZC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJoYXNfaW9xdWV1ZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIGhhc19pb3F1ZXVlKSwgMCwKKyAgICAgICAgIlNwZWNpZnkgd2hldGhlciB0aGUgbWVkaWEgbWFuYWdlciBzaG91bGQgbWFuYWdlIGl0cyBvd24gaW9xdWV1ZSBmb3IgIgorICAgICAgICAidGhlIFJUUC9SVENQIHNvY2tldHMuIElmIHllcywgaW9xdWV1ZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGF0IGxlYXN0ICIKKyAgICAgICAgIm9uZSB3b3JrZXIgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZCB0b28uIElmIG5vLCB0aGUgUlRQL1JUQ1Agc29ja2V0cyAiCisgICAgICAgICJ3aWxsIHNoYXJlIHRoZSBzYW1lIGlvcXVldWUgYXMgU0lQIHNvY2tldHMsIGFuZCBubyB3b3JrZXIgdGhyZWFkIGlzICIKKyAgICAgICAgIm5lZWRlZC4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0aHJlYWRfY250IiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdGhyZWFkX2NudCksIDAsCisgICAgICAgICJTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdG8gaGFuZGxlIGluY29taW5nIFJUUCBwYWNrZXRzLiAiCisgICAgICAgICJBIHZhbHVlIG9mIG9uZSBpcyByZWNvbW1lbmRlZCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIgorICAgIH0sCisgICAgeworICAgICAgICAicXVhbGl0eSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIHF1YWxpdHkpLCAwLAorICAgICAgICAiVGhlIG1lZGlhIHF1YWxpdHkgYWxzbyBzZXRzIHNwZWV4IGNvZGVjIHF1YWxpdHkvY29tcGxleGl0eSB0byB0aGUgIgorICAgICAgICAibnVtYmVyLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB0aW1lIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgcHRpbWUpLCAwLAorICAgICAgICAiU3BlY2lmeSBkZWZhdWx0IHB0aW1lLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm5vX3ZhZCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIG5vX3ZhZCksIDAsCisgICAgICAgICJEaXNhYmxlIFZBRD8iCisgICAgfSwKKyAgICB7CisgICAgICAgICJpbGJjX21vZGUiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBpbGJjX21vZGUpLCAwLAorICAgICAgICAiaUxCQyBtb2RlICgyMCBvciAzMCkuIgorICAgIH0sCisgICAgeworICAgICAgICAidHhfZHJvcF9wY3QiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCB0eF9kcm9wX3BjdCksIDAsCisgICAgICAgICJQZXJjZW50YWdlIG9mIFJUUCBwYWNrZXQgdG8gZHJvcCBpbiBUWCBkaXJlY3Rpb24gKHRvIHNpbXVsYXRlIHBhY2tldCAiCisgICAgICAgICJsb3N0KS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJyeF9kcm9wX3BjdCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIHJ4X2Ryb3BfcGN0KSwgMCwKKyAgICAgICAgIlBlcmNlbnRhZ2Ugb2YgUlRQIHBhY2tldCB0byBkcm9wIGluIFJYIGRpcmVjdGlvbiAodG8gc2ltdWxhdGUgcGFja2V0ICIKKyAgICAgICAgImxvc3QpLiJ9LAorICAgIHsKKyAgICAgICAgImVjX29wdGlvbnMiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBlY19vcHRpb25zKSwgMCwKKyAgICAgICAgIkVjaG8gY2FuY2VsbGVyIG9wdGlvbnMgKHNlZSBwam1lZGlhX2VjaG9fY3JlYXRlKCkpIgorICAgIH0sCisgICAgeworICAgICAgICAiZWNfdGFpbF9sZW4iLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBlY190YWlsX2xlbiksIDAsCisgICAgICAgICJFY2hvIGNhbmNlbGxlciB0YWlsIGxlbmd0aCwgaW4gbWlsaXNlY29uZHMuIgorICAgIH0sCisgICAgeworICAgICAgICAiamJfbWluIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgamJfbWluKSwgMCwKKyAgICAgICAgIkppdHRlciBidWZmZXIgbWluaW11bSBzaXplIGluIG1pbGxpc2Vjb25kcy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJqYl9tYXgiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCBqYl9tYXgpLCAwLAorICAgICAgICAiSml0dGVyIGJ1ZmZlciBtYXhpbXVtIHNpemUgaW4gbWlsbGlzZWNvbmRzLiIKKyAgICB9LAorICAgIHsKKwkiZW5hYmxlX2ljZSIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgZW5hYmxlX2ljZSksIDAsCisgICAgICAgICJFbmFibGUgSUNFLiIKKyAgICB9LAorICAgIHsKKwkiZW5hYmxlX3R1cm4iLCBUX0lOVCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tZWRpYV9jb25maWcsIGVuYWJsZV90dXJuKSwgMCwKKyAgICAgICAgIkVuYWJsZSBUVVJOLiIKKyAgICB9LAorICAgIHsKKyAgICAJInR1cm5fc2VydmVyIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdHVybl9zZXJ2ZXIpLCAwLAorICAgIAkiU3BlY2lmeSB0aGUgVFVSTiBzZXJ2ZXIuIgorICAgIH0sCisgICAgeworCSJ0dXJuX2Nvbm5fdHlwZSIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdHVybl9jb25uX3R5cGUpLCAwLAorICAgICAgICAiU3BlY2lmeSBUVVJOIGNvbm5lY3Rpb24gdHlwZS4iCisgICAgfSwKKyAgICB7CisgICAgCSJ0dXJuX3JlYWxtIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdHVybl9yZWFsbSksIDAsCisgICAgCSJTcGVjaWZ5IHRoZSBUVVJOIHJlYWxtLiIKKyAgICB9LAorICAgIHsKKyAgICAJInR1cm5fdXNlcm5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCB0dXJuX3VzZXJuYW1lKSwgMCwKKyAgICAJIlNwZWNpZnkgdGhlIFRVUk4gdXNlcm5hbWUuIgorICAgIH0sCisgICAgeworCSJ0dXJuX3Bhc3N3ZF90eXBlIiwgVF9JTlQsCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnLCB0dXJuX3Bhc3N3ZF90eXBlKSwgMCwKKyAgICAgICAgIlNwZWNpZnkgVFVSTiBwYXNzd29yZCB0eXBlLiIKKyAgICB9LAorICAgIHsKKyAgICAJInR1cm5fcGFzc3dkIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZywgdHVybl9wYXNzd2QpLCAwLAorICAgIAkiU3BlY2lmeSB0aGUgVFVSTiBwYXNzd29yZC4iCisgICAgfSwKKworICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworc3RhdGljIFB5T2JqZWN0ICpQeU9ial9wanN1YV9tZWRpYV9jb25maWdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgICAgIFB5T2JqZWN0ICphcmdzLCAKKwkJCQkJICAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9tZWRpYV9jb25maWcqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKwlzZWxmLT50dXJuX3NlcnZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPnR1cm5fcmVhbG0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT50dXJuX3VzZXJuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJc2VsZi0+dHVybl9wYXNzd2QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX2RlbGV0ZShQeU9ial9wanN1YV9tZWRpYV9jb25maWcgKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dHVybl9zZXJ2ZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+dHVybl9yZWFsbSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT50dXJuX3VzZXJuYW1lKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnR1cm5fcGFzc3dkKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnICpvYmosCisJCQkJCSAgICBjb25zdCBwanN1YV9tZWRpYV9jb25maWcgKmNmZykKK3sKKyAgICBvYmotPmNsb2NrX3JhdGUJICAgID0gY2ZnLT5jbG9ja19yYXRlOworICAgIG9iai0+c25kX2Nsb2NrX3JhdGUJICAgID0gY2ZnLT5zbmRfY2xvY2tfcmF0ZTsKKyAgICBvYmotPmNoYW5uZWxfY291bnQJICAgID0gY2ZnLT5jaGFubmVsX2NvdW50OworICAgIG9iai0+YXVkaW9fZnJhbWVfcHRpbWUgID0gY2ZnLT5hdWRpb19mcmFtZV9wdGltZTsKKyAgICBvYmotPnNuZF9hdXRvX2Nsb3NlX3RpbWU9IGNmZy0+c25kX2F1dG9fY2xvc2VfdGltZTsKKyAgICBvYmotPm1heF9tZWRpYV9wb3J0cyAgICA9IGNmZy0+bWF4X21lZGlhX3BvcnRzOworICAgIG9iai0+aGFzX2lvcXVldWUJICAgID0gY2ZnLT5oYXNfaW9xdWV1ZTsKKyAgICBvYmotPnRocmVhZF9jbnQJICAgID0gY2ZnLT50aHJlYWRfY250OworICAgIG9iai0+cXVhbGl0eQkgICAgPSBjZmctPnF1YWxpdHk7CisgICAgb2JqLT5wdGltZQkJICAgID0gY2ZnLT5wdGltZTsKKyAgICBvYmotPm5vX3ZhZAkJICAgID0gY2ZnLT5ub192YWQ7CisgICAgb2JqLT5pbGJjX21vZGUJICAgID0gY2ZnLT5pbGJjX21vZGU7CisgICAgb2JqLT5qYl9taW4JCSAgICA9IGNmZy0+amJfbWluX3ByZTsKKyAgICBvYmotPmpiX21heAkJICAgID0gY2ZnLT5qYl9tYXg7CisgICAgb2JqLT50eF9kcm9wX3BjdAkgICAgPSBjZmctPnR4X2Ryb3BfcGN0OworICAgIG9iai0+cnhfZHJvcF9wY3QJICAgID0gY2ZnLT5yeF9kcm9wX3BjdDsKKyAgICBvYmotPmVjX29wdGlvbnMJICAgID0gY2ZnLT5lY19vcHRpb25zOworICAgIG9iai0+ZWNfdGFpbF9sZW4JICAgID0gY2ZnLT5lY190YWlsX2xlbjsKKyAgICBvYmotPmVuYWJsZV9pY2UJICAgID0gY2ZnLT5lbmFibGVfaWNlOworICAgIG9iai0+ZW5hYmxlX3R1cm4JICAgID0gY2ZnLT5lbmFibGVfdHVybjsKKyAgICBQeV9YREVDUkVGKG9iai0+dHVybl9zZXJ2ZXIpOworICAgIG9iai0+dHVybl9zZXJ2ZXIJICAgID0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPnR1cm5fc2VydmVyKTsKKyAgICBvYmotPnR1cm5fY29ubl90eXBlCSAgICA9IGNmZy0+dHVybl9jb25uX3R5cGU7CisgICAgaWYgKGNmZy0+dHVybl9hdXRoX2NyZWQudHlwZSA9PSBQSl9TVFVOX0FVVEhfQ1JFRF9TVEFUSUMpIHsKKwljb25zdCBwal9zdHVuX2F1dGhfY3JlZCAqY3JlZCA9ICZjZmctPnR1cm5fYXV0aF9jcmVkOworCisJUHlfWERFQ1JFRihvYmotPnR1cm5fcmVhbG0pOworCW9iai0+dHVybl9yZWFsbQk9IFB5U3RyaW5nX0Zyb21QSigmY3JlZC0+ZGF0YS5zdGF0aWNfY3JlZC5yZWFsbSk7CisJUHlfWERFQ1JFRihvYmotPnR1cm5fdXNlcm5hbWUpOworCW9iai0+dHVybl91c2VybmFtZSA9IFB5U3RyaW5nX0Zyb21QSigmY3JlZC0+ZGF0YS5zdGF0aWNfY3JlZC51c2VybmFtZSk7CisJb2JqLT50dXJuX3Bhc3N3ZF90eXBlID0gY3JlZC0+ZGF0YS5zdGF0aWNfY3JlZC5kYXRhX3R5cGU7CisJUHlfWERFQ1JFRihvYmotPnR1cm5fcGFzc3dkKTsKKwlvYmotPnR1cm5fcGFzc3dkID0gUHlTdHJpbmdfRnJvbVBKKCZjcmVkLT5kYXRhLnN0YXRpY19jcmVkLmRhdGEpOworICAgIH0gZWxzZSB7CisJUHlfWERFQ1JFRihvYmotPnR1cm5fcmVhbG0pOworCW9iai0+dHVybl9yZWFsbQk9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCVB5X1hERUNSRUYob2JqLT50dXJuX3VzZXJuYW1lKTsKKwlvYmotPnR1cm5fdXNlcm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlvYmotPnR1cm5fcGFzc3dkX3R5cGUgPSAwOworCVB5X1hERUNSRUYob2JqLT50dXJuX3Bhc3N3ZCk7CisJb2JqLT50dXJuX3Bhc3N3ZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX2V4cG9ydChwanN1YV9tZWRpYV9jb25maWcgKmNmZywKKwkJCQkJICAgIGNvbnN0IFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZyAqb2JqKQoreworICAgIGNmZy0+Y2xvY2tfcmF0ZQkgICAgPSBvYmotPmNsb2NrX3JhdGU7CisgICAgY2ZnLT5zbmRfY2xvY2tfcmF0ZQkgICAgPSBvYmotPnNuZF9jbG9ja19yYXRlOworICAgIGNmZy0+Y2hhbm5lbF9jb3VudAkgICAgPSBvYmotPmNoYW5uZWxfY291bnQ7CisgICAgY2ZnLT5hdWRpb19mcmFtZV9wdGltZSAgPSBvYmotPmF1ZGlvX2ZyYW1lX3B0aW1lOworICAgIGNmZy0+c25kX2F1dG9fY2xvc2VfdGltZT1vYmotPnNuZF9hdXRvX2Nsb3NlX3RpbWU7CisgICAgY2ZnLT5tYXhfbWVkaWFfcG9ydHMgICAgPSBvYmotPm1heF9tZWRpYV9wb3J0czsKKyAgICBjZmctPmhhc19pb3F1ZXVlCSAgICA9IG9iai0+aGFzX2lvcXVldWU7CisgICAgY2ZnLT50aHJlYWRfY250CSAgICA9IG9iai0+dGhyZWFkX2NudDsKKyAgICBjZmctPnF1YWxpdHkJICAgID0gb2JqLT5xdWFsaXR5OworICAgIGNmZy0+cHRpbWUJCSAgICA9IG9iai0+cHRpbWU7CisgICAgY2ZnLT5ub192YWQJCSAgICA9IG9iai0+bm9fdmFkOworICAgIGNmZy0+amJfbWluX3ByZQkgICAgPSBvYmotPmpiX21pbjsKKyAgICBjZmctPmpiX21heAkJICAgID0gb2JqLT5qYl9tYXg7CisgICAgY2ZnLT5pbGJjX21vZGUJICAgID0gb2JqLT5pbGJjX21vZGU7CisgICAgY2ZnLT50eF9kcm9wX3BjdAkgICAgPSBvYmotPnR4X2Ryb3BfcGN0OworICAgIGNmZy0+cnhfZHJvcF9wY3QJICAgID0gb2JqLT5yeF9kcm9wX3BjdDsKKyAgICBjZmctPmVjX29wdGlvbnMJICAgID0gb2JqLT5lY19vcHRpb25zOworICAgIGNmZy0+ZWNfdGFpbF9sZW4JICAgID0gb2JqLT5lY190YWlsX2xlbjsKKyAgICBjZmctPmVuYWJsZV9pY2UJICAgID0gb2JqLT5lbmFibGVfaWNlOworICAgIGNmZy0+ZW5hYmxlX3R1cm4JICAgID0gb2JqLT5lbmFibGVfdHVybjsKKworICAgIGlmIChjZmctPmVuYWJsZV90dXJuKSB7CisJY2ZnLT50dXJuX3NlcnZlciA9IFB5U3RyaW5nX1RvUEoob2JqLT50dXJuX3NlcnZlcik7CisJY2ZnLT50dXJuX2Nvbm5fdHlwZSA9IG9iai0+dHVybl9jb25uX3R5cGU7CisJY2ZnLT50dXJuX2F1dGhfY3JlZC50eXBlID0gUEpfU1RVTl9BVVRIX0NSRURfU1RBVElDOworCWNmZy0+dHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC5yZWFsbSA9IFB5U3RyaW5nX1RvUEoob2JqLT50dXJuX3JlYWxtKTsKKwljZmctPnR1cm5fYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQudXNlcm5hbWUgPSBQeVN0cmluZ19Ub1BKKG9iai0+dHVybl91c2VybmFtZSk7CisJY2ZnLT50dXJuX2F1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGFfdHlwZT0gb2JqLT50dXJuX3Bhc3N3ZF90eXBlOworCWNmZy0+dHVybl9hdXRoX2NyZWQuZGF0YS5zdGF0aWNfY3JlZC5kYXRhID0gUHlTdHJpbmdfVG9QSihvYmotPnR1cm5fcGFzc3dkKTsKKyAgICB9Cit9CisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX21lZGlhX2NvbmZpZworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX21lZGlhX2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuTWVkaWFfQ29uZmlnIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX21lZGlhX2NvbmZpZyksLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJNZWRpYSBDb25maWcgb2JqZWN0cyIsICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX21lbWJlcnMsIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlPYmpfcGpzdWFfbWVkaWFfY29uZmlnX25ldywgICAvKiB0cF9uZXcgKi8KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfY29uZmlnCisgKiBhdHRyaWJ1dGUgbGlzdCBmb3IgY29uZmlnIG9iamVjdAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHVuc2lnbmVkCQkgIG1heF9jYWxsczsKKyAgICB1bnNpZ25lZAkJICB0aHJlYWRfY250OworICAgIFB5T2JqZWN0CQkgKm91dGJvdW5kX3Byb3h5OworICAgIFB5T2JqZWN0CSAgICAgICAgICpzdHVuX2RvbWFpbjsKKyAgICBQeU9iamVjdAkJICpzdHVuX2hvc3Q7CisgICAgUHlMaXN0T2JqZWN0CSAqbmFtZXNlcnZlcjsKKyAgICBQeU9ial9wanN1YV9jYWxsYmFjayAqY2I7CisgICAgUHlPYmplY3QJCSAqdXNlcl9hZ2VudDsKK30gUHlPYmpfcGpzdWFfY29uZmlnOworCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2NvbmZpZ19kZWxldGUoUHlPYmpfcGpzdWFfY29uZmlnKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+b3V0Ym91bmRfcHJveHkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3R1bl9kb21haW4pOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3R1bl9ob3N0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm5hbWVzZXJ2ZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y2IpOworICAgIFB5X1hERUNSRUYoc2VsZi0+dXNlcl9hZ2VudCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfY29uZmlnICpvYmosCisJCQkJICAgICAgY29uc3QgcGpzdWFfY29uZmlnICpjZmcpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIG9iai0+bWF4X2NhbGxzCT0gY2ZnLT5tYXhfY2FsbHM7CisgICAgb2JqLT50aHJlYWRfY250CT0gY2ZnLT50aHJlYWRfY250OworICAgIFB5X1hERUNSRUYob2JqLT5vdXRib3VuZF9wcm94eSk7CisgICAgaWYgKGNmZy0+b3V0Ym91bmRfcHJveHlfY250KQorCW9iai0+b3V0Ym91bmRfcHJveHkgPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+b3V0Ym91bmRfcHJveHlbMF0pOworICAgIGVsc2UKKwlvYmotPm91dGJvdW5kX3Byb3h5ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisKKyAgICBQeV9YREVDUkVGKG9iai0+c3R1bl9kb21haW4pOworICAgIG9iai0+c3R1bl9kb21haW4JPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+c3R1bl9kb21haW4pOworICAgIFB5X1hERUNSRUYob2JqLT5zdHVuX2hvc3QpOworICAgIG9iai0+c3R1bl9ob3N0CT0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPnN0dW5faG9zdCk7CisgICAgUHlfWERFQ1JFRihvYmotPm5hbWVzZXJ2ZXIpOworICAgIG9iai0+bmFtZXNlcnZlciA9IChQeUxpc3RPYmplY3QgKilQeUxpc3RfTmV3KDApOworICAgIGZvciAoaT0wOyBpPGNmZy0+bmFtZXNlcnZlcl9jb3VudDsgKytpKSB7CisJUHlPYmplY3QgKiBzdHI7CisJc3RyID0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPm5hbWVzZXJ2ZXJbaV0pOworCVB5TGlzdF9BcHBlbmQoKFB5T2JqZWN0ICopb2JqLT5uYW1lc2VydmVyLCBzdHIpOworICAgIH0KKyAgICBQeV9YREVDUkVGKG9iai0+dXNlcl9hZ2VudCk7CisgICAgb2JqLT51c2VyX2FnZW50CT0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPnVzZXJfYWdlbnQpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2NvbmZpZ19leHBvcnQocGpzdWFfY29uZmlnICpjZmcsCisJCQkJICAgICAgUHlPYmpfcGpzdWFfY29uZmlnICpvYmopCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGNmZy0+bWF4X2NhbGxzCT0gb2JqLT5tYXhfY2FsbHM7CisgICAgY2ZnLT50aHJlYWRfY250CT0gb2JqLT50aHJlYWRfY250OworICAgIGlmIChQeVN0cmluZ19TaXplKG9iai0+b3V0Ym91bmRfcHJveHkpID4gMCkgeworCWNmZy0+b3V0Ym91bmRfcHJveHlfY250ID0gMTsKKwljZmctPm91dGJvdW5kX3Byb3h5WzBdID0gUHlTdHJpbmdfVG9QSihvYmotPm91dGJvdW5kX3Byb3h5KTsKKyAgICB9IGVsc2UgeworCWNmZy0+b3V0Ym91bmRfcHJveHlfY250ID0gMDsKKyAgICB9CisgICAgY2ZnLT5uYW1lc2VydmVyX2NvdW50ID0gUHlMaXN0X1NpemUoKFB5T2JqZWN0KilvYmotPm5hbWVzZXJ2ZXIpOworICAgIGlmIChjZmctPm5hbWVzZXJ2ZXJfY291bnQgPiBQSl9BUlJBWV9TSVpFKGNmZy0+bmFtZXNlcnZlcikpCisJY2ZnLT5uYW1lc2VydmVyX2NvdW50ID0gUEpfQVJSQVlfU0laRShjZmctPm5hbWVzZXJ2ZXIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjZmctPm5hbWVzZXJ2ZXJfY291bnQ7IGkrKykgeworCVB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dldEl0ZW0oKFB5T2JqZWN0ICopb2JqLT5uYW1lc2VydmVyLGkpOworICAgICAgICBjZmctPm5hbWVzZXJ2ZXJbaV0gPSBQeVN0cmluZ19Ub1BKKGl0ZW0pOworICAgIH0KKyAgICBjZmctPnN0dW5fZG9tYWluCT0gUHlTdHJpbmdfVG9QSihvYmotPnN0dW5fZG9tYWluKTsKKyAgICBjZmctPnN0dW5faG9zdAk9IFB5U3RyaW5nX1RvUEoob2JqLT5zdHVuX2hvc3QpOworICAgIGNmZy0+dXNlcl9hZ2VudAk9IFB5U3RyaW5nX1RvUEoob2JqLT51c2VyX2FnZW50KTsKKworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqUHlPYmpfcGpzdWFfY29uZmlnX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQlQeU9iamVjdCAqYXJncywgCisJCQkJCVB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfY29uZmlnICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT51c2VyX2FnZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPm91dGJvdW5kX3Byb3h5ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJc2VsZi0+c3R1bl9kb21haW4gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5zdHVuX2hvc3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgc2VsZi0+Y2IgPSAoUHlPYmpfcGpzdWFfY2FsbGJhY2sgKikKKwkJICAgUHlUeXBlX0dlbmVyaWNOZXcoJlB5VHlwX3Bqc3VhX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2NvbmZpZ19tZW1iZXJzCisgKiBhdHRyaWJ1dGUgbGlzdCBhY2Nlc3NpYmxlIGZyb20gUHl0aG9uL0MKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2NvbmZpZ19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAJIm1heF9jYWxscyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIG1heF9jYWxscyksIDAsCisgICAgCSJNYXhpbXVtIGNhbGxzIHRvIHN1cHBvcnQgKGRlZmF1bHQ6IDQpICIKKyAgICB9LAorICAgIHsKKyAgICAJInRocmVhZF9jbnQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZmlnLCB0aHJlYWRfY250KSwgMCwKKyAgICAJIk51bWJlciBvZiB3b3JrZXIgdGhyZWFkcy4gTm9ybWFsbHkgYXBwbGljYXRpb24gd2lsbCB3YW50IHRvIGhhdmUgYXQgIgorICAgIAkibGVhc3Qgb25lIHdvcmtlciB0aHJlYWQsIHVubGVzcyB3aGVuIGl0IHdhbnRzIHRvIHBvbGwgdGhlIGxpYnJhcnkgIgorICAgIAkicGVyaW9kaWNhbGx5LCB3aGljaCBpbiB0aGlzIGNhc2UgdGhlIHdvcmtlciB0aHJlYWQgY2FuIGJlIHNldCB0byAiCisgICAgCSJ6ZXJvLiIKKyAgICB9LAorICAgIHsKKyAgICAJIm91dGJvdW5kX3Byb3h5IiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgb3V0Ym91bmRfcHJveHkpLCAwLAorICAgIAkiU0lQIFVSTCBvZiB0aGUgb3V0Ym91bmQgcHJveHkgKG9wdGlvbmFsKSIKKyAgICB9LAorICAgIHsKKyAgICAJInN0dW5fZG9tYWluIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgc3R1bl9kb21haW4pLCAwLAorICAgIAkiRG9tYWluIG9mIHRoZSBTVFVOIHNlcnZlciAob3B0aW9uYWwpLiBTVFVOIHNlcnZlciB3aWxsIGJlIHJlc29sdmVkICIKKwkidXNpbmcgRE5TIFNSViByZXNvbHV0aW9uIG9ubHkgd2hlbiBuYW1lc2VydmVyIGlzIGNvbmZpZ3VyZWQuICIKKwkiQWx0ZXJuYXRpdmVseSwgaWYgRE5TIFNSViByZXNvbHV0aW9uIGZvciBTVFVOIGlzIG5vdCBkZXNpcmVkLCAiCisJImFwcGxpY2F0aW9uIGNhbiBzcGVjaWZ5IHRoZSBTVFVOIHNlcnZlciBob3N0bmFtZSBvciBJUCBhZGRyZXNzICIKKwkiaW4gc3R1bl9ob3N0IGF0dHJpYnV0ZS4iCisgICAgfSwKKyAgICB7CisgICAgCSJzdHVuX2hvc3QiLCBUX09CSkVDVF9FWCwKKyAgICAJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZmlnLCBzdHVuX2hvc3QpLCAwLAorICAgIAkiSG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgU1RVTiBzZXJ2ZXIgKG9wdGlvbmFsKS4iCisgICAgfSwKKyAgICB7CisgICAgCSJuYW1lc2VydmVyIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgbmFtZXNlcnZlciksIDAsCisgICAgCSJJUCBhZGRyZXNzIG9mIHRoZSBuYW1lc2VydmVyLiIKKyAgICB9LAorICAgIHsKKyAgICAJImNiIiwgVF9PQkpFQ1RfRVgsIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvbmZpZywgY2IpLCAwLAorICAgIAkiQXBwbGljYXRpb24gY2FsbGJhY2suIgorICAgIH0sCisgICAgeworICAgIAkidXNlcl9hZ2VudCIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihQeU9ial9wanN1YV9jb25maWcsIHVzZXJfYWdlbnQpLCAwLAorICAgIAkiVXNlciBhZ2VudCBzdHJpbmcgKGRlZmF1bHQgZW1wdHkpIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfY29uZmlnCisgKiB0eXBlIHdyYXBwZXIgZm9yIGNvbmZpZyBjbGFzcworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2NvbmZpZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLkNvbmZpZyIsICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfY29uZmlnKSwvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzdWFfY29uZmlnX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDb25maWcgb2JqZWN0IiwgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2NvbmZpZ19tZW1iZXJzLC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9jb25maWdfbmV3LCAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcKKyAqIGNvbmZpZ3VyYXRpb24gY2xhc3MgZm9yIGxvZ2dpbmdfY29uZmlnIG9iamVjdAorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIGludAkJIG1zZ19sb2dnaW5nOworICAgIHVuc2lnbmVkCSBsZXZlbDsKKyAgICB1bnNpZ25lZAkgY29uc29sZV9sZXZlbDsKKyAgICB1bnNpZ25lZAkgZGVjb3I7CisgICAgUHlPYmplY3QJKmxvZ19maWxlbmFtZTsKKyAgICBQeU9iamVjdAkqY2I7Cit9IFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnOworCisKKy8qCisgKiBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19kZWxldGUKKyAqIGRlbGV0ZXMgYSBsb2dnaW5nIGNvbmZpZyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19kZWxldGUoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sb2dfZmlsZW5hbWUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y2IpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19pbXBvcnQoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKm9iaiwKKwkJCQkJICAgICAgY29uc3QgcGpzdWFfbG9nZ2luZ19jb25maWcgKmNmZykKK3sKKyAgICBvYmotPm1zZ19sb2dnaW5nCT0gY2ZnLT5tc2dfbG9nZ2luZzsKKyAgICBvYmotPmxldmVsCQk9IGNmZy0+bGV2ZWw7CisgICAgb2JqLT5jb25zb2xlX2xldmVsCT0gY2ZnLT5jb25zb2xlX2xldmVsOworICAgIG9iai0+ZGVjb3IJCT0gY2ZnLT5kZWNvcjsKKyAgICBQeV9YREVDUkVGKG9iai0+bG9nX2ZpbGVuYW1lKTsKKyAgICBvYmotPmxvZ19maWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5sb2dfZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19leHBvcnQocGpzdWFfbG9nZ2luZ19jb25maWcgKmNmZywKKwkJCQkJICAgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcgKm9iaikKK3sKKyAgICBjZmctPm1zZ19sb2dnaW5nCT0gb2JqLT5tc2dfbG9nZ2luZzsKKyAgICBjZmctPmxldmVsCQk9IG9iai0+bGV2ZWw7CisgICAgY2ZnLT5jb25zb2xlX2xldmVsCT0gb2JqLT5jb25zb2xlX2xldmVsOworICAgIGNmZy0+ZGVjb3IJCT0gb2JqLT5kZWNvcjsKKyAgICBjZmctPmxvZ19maWxlbmFtZQk9IFB5U3RyaW5nX1RvUEoob2JqLT5sb2dfZmlsZW5hbWUpOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBsb2dnaW5nX2NvbmZpZyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCQkgUHlPYmplY3QgKmFyZ3MsCisJCQkJCSAgICAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+bG9nX2ZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPmNiID0gUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgIAkibXNnX2xvZ2dpbmciLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcsIG1zZ19sb2dnaW5nKSwgMCwKKyAgICAJIkxvZyBpbmNvbWluZyBhbmQgb3V0Z29pbmcgU0lQIG1lc3NhZ2U/IFllcyEiCisgICAgfSwKKyAgICB7CisgICAgCSJsZXZlbCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZywgbGV2ZWwpLCAwLAorICAgIAkiSW5wdXQgdmVyYm9zaXR5IGxldmVsLiBWYWx1ZSA1IGlzIHJlYXNvbmFibGUuIgorICAgIH0sCisgICAgeworICAgIAkiY29uc29sZV9sZXZlbCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZywgY29uc29sZV9sZXZlbCksCisgICAgCTAsICJWZXJib3NpdHkgbGV2ZWwgZm9yIGNvbnNvbGUuIFZhbHVlIDQgaXMgcmVhc29uYWJsZS4iCisgICAgfSwKKyAgICB7CisgICAgCSJkZWNvciIsIFRfSU5ULCAKKwkgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcsIGRlY29yKSwgMCwKKyAgICAJIkxvZyBkZWNvcmF0aW9uIgorICAgIH0sCisgICAgeworICAgIAkibG9nX2ZpbGVuYW1lIiwgVF9PQkpFQ1RfRVgsCisgICAgCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnLCBsb2dfZmlsZW5hbWUpLCAwLAorICAgIAkiT3B0aW9uYWwgbG9nIGZpbGVuYW1lIgorICAgIH0sCisgICAgeworICAgIAkiY2IiLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWcsIGNiKSwgMCwKKyAgICAJIk9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byB3cml0ZSBsb2cgdG8gYXBwbGljYXRpb24gIgorICAgIAkic3BlY2lmaWMgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvcmxvZyBtZXNzYWdlcyBvbiAiCisgICAgCSJpbnB1dCB2ZXJib3NpdHkgbGV2ZWwuIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX2xvZ2dpbmdfY29uZmlnCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfbG9nZ2luZ19jb25maWcgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLkxvZ2dpbmdfQ29uZmlnIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9sb2dnaW5nX2NvbmZpZ19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiTG9nZ2luZyBDb25maWcgb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfbG9nZ2luZ19jb25maWdfbWVtYmVycywvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2xvZ2dpbmdfY29uZmlnX25ldywgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfbXNnX2RhdGEKKyAqIHR5cGV3cmFwcGVyIGZvciBNZXNzYWdlRGF0YSBjbGFzcworICogIW1vZGlmaWVkIEAgMDYxMjA2CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgUHlPYmplY3QgKiBoZHJfbGlzdDsKKyAgICBQeU9iamVjdCAqIGNvbnRlbnRfdHlwZTsKKyAgICBQeU9iamVjdCAqIG1zZ19ib2R5OworfSBQeU9ial9wanN1YV9tc2dfZGF0YTsKKworCisvKgorICogUHlPYmpfcGpzdWFfbXNnX2RhdGFfZGVsZXRlCisgKiBkZWxldGVzIGEgbXNnX2RhdGEKKyAqICFtb2RpZmllZCBAIDA2MTIwNgorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9tc2dfZGF0YV9kZWxldGUoUHlPYmpfcGpzdWFfbXNnX2RhdGEqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5oZHJfbGlzdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb250ZW50X3R5cGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bXNnX2JvZHkpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfbXNnX2RhdGFfbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgbXNnX2RhdGEgb2JqZWN0CisgKiAhbW9kaWZpZWQgQCAwNjEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfbXNnX2RhdGFfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YSAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGpzdWFfbXNnX2RhdGEgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmhkcl9saXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgc2VsZi0+Y29udGVudF90eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPm1zZ19ib2R5ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX21zZ19kYXRhX21lbWJlcnMKKyAqICFtb2RpZmllZCBAIDA2MTIwNgorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfbXNnX2RhdGFfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJoZHJfbGlzdCIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9tc2dfZGF0YSwgaGRyX2xpc3QpLCAwLCAKKwkiQWRkaXRpb25hbCBtZXNzYWdlIGhlYWRlcnMgYXMgbGlua2VkIGxpc3Qgb2Ygc3RyaW5ncy4iCisgICAgfSwgCisgICAgeworCSJjb250ZW50X3R5cGUiLCBUX09CSkVDVF9FWCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfbXNnX2RhdGEsIGNvbnRlbnRfdHlwZSksIDAsIAorCSJNSU1FIHR5cGUgb2Ygb3B0aW9uYWwgbWVzc2FnZSBib2R5LiIKKyAgICB9LAorICAgIHsKKyAgICAJIm1zZ19ib2R5IiwgVF9PQkpFQ1RfRVgsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX21zZ19kYXRhLCBtc2dfYm9keSksIDAsCisgICAgCSJPcHRpb25hbCBtZXNzYWdlIGJvZHkuIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGpzdWFfbXNnX2RhdGEKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9tc2dfZGF0YSA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLk1zZ19EYXRhIiwgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfbXNnX2RhdGEpLCAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9tc2dfZGF0YV9kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAibXNnX2RhdGEgb2JqZWN0cyIsICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQeU9ial9wanN1YV9tc2dfZGF0YV9tZW1iZXJzLCAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlPYmpfcGpzdWFfbXNnX2RhdGFfbmV3LCAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZworICogVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gZm9yIGNyZWF0aW5nIFVEUCB0cmFuc3BvcnRzIGZvciBib3RoIFNJUAorICogYW5kIG1lZGlhLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIHVuc2lnbmVkCXBvcnQ7CisgICAgUHlPYmplY3QgICAqcHVibGljX2FkZHI7CisgICAgUHlPYmplY3QgICAqYm91bmRfYWRkcjsKKyAgICBwal9xb3NfdHlwZSAgcW9zX3R5cGU7CisgICAgcGpfdWludDhfdCAgcW9zX3BhcmFtc19mbGFnczsKKyAgICBwal91aW50OF90ICBxb3NfcGFyYW1zX2RzY3BfdmFsOworICAgIHBqX3VpbnQ4X3QgIHFvc19wYXJhbXNfc29fcHJpbzsKKyAgICBwal9xb3Nfd21tX3ByaW8gIHFvc19wYXJhbXNfd21tX3ByaW87CisKK30gUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZzsKKworCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWxldGUKKyAqIGRlbGV0ZXMgYSB0cmFuc3BvcnQgY29uZmlnIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZGVsZXRlKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5wdWJsaWNfYWRkcik7ICAgIAorICAgIFB5X1hERUNSRUYoc2VsZi0+Ym91bmRfYWRkcik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZXhwb3J0KHBqc3VhX3RyYW5zcG9ydF9jb25maWcgKmNmZywKKwkJCQkJCVB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKm9iaikKK3sKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnX2RlZmF1bHQoY2ZnKTsKKyAgICBjZmctPnB1YmxpY19hZGRyCT0gUHlTdHJpbmdfVG9QSihvYmotPnB1YmxpY19hZGRyKTsKKyAgICBjZmctPmJvdW5kX2FkZHIJPSBQeVN0cmluZ19Ub1BKKG9iai0+Ym91bmRfYWRkcik7CisgICAgY2ZnLT5wb3J0CQk9IG9iai0+cG9ydDsKKyAgICBjZmctPnFvc190eXBlCT0gb2JqLT5xb3NfdHlwZTsKKyAgICBjZmctPnFvc19wYXJhbXMuZmxhZ3MJPSBvYmotPnFvc19wYXJhbXNfZmxhZ3M7CisgICAgY2ZnLT5xb3NfcGFyYW1zLmRzY3BfdmFsCT0gb2JqLT5xb3NfcGFyYW1zX2RzY3BfdmFsOworICAgIGNmZy0+cW9zX3BhcmFtcy5zb19wcmlvCT0gb2JqLT5xb3NfcGFyYW1zX3NvX3ByaW87CisgICAgY2ZnLT5xb3NfcGFyYW1zLndtbV9wcmlvCT0gb2JqLT5xb3NfcGFyYW1zX3dtbV9wcmlvOworfQorCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2ltcG9ydChQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnICpvYmosCisJCQkJCQljb25zdCBwanN1YV90cmFuc3BvcnRfY29uZmlnICpjZmcpCit7CisgICAgUHlfWERFQ1JFRihvYmotPnB1YmxpY19hZGRyKTsgICAgCisgICAgb2JqLT5wdWJsaWNfYWRkciA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5wdWJsaWNfYWRkcik7CisKKyAgICBQeV9YREVDUkVGKG9iai0+Ym91bmRfYWRkcik7ICAgIAorICAgIG9iai0+Ym91bmRfYWRkciA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5ib3VuZF9hZGRyKTsKKworICAgIG9iai0+cG9ydAkJPSBjZmctPnBvcnQ7CisgICAgb2JqLT5xb3NfdHlwZQk9IGNmZy0+cW9zX3R5cGU7CisgICAgb2JqLT5xb3NfcGFyYW1zX2ZsYWdzCT0gY2ZnLT5xb3NfcGFyYW1zLmZsYWdzOworICAgIG9iai0+cW9zX3BhcmFtc19kc2NwX3ZhbAk9IGNmZy0+cW9zX3BhcmFtcy5kc2NwX3ZhbDsKKyAgICBvYmotPnFvc19wYXJhbXNfc29fcHJpbwk9IGNmZy0+cW9zX3BhcmFtcy5zb19wcmlvOworICAgIG9iai0+cW9zX3BhcmFtc193bW1fcHJpbwk9IGNmZy0+cW9zX3BhcmFtcy53bW1fcHJpbzsKKworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX25ldworICogY29uc3RydWN0b3IgZm9yIHRyYW5zcG9ydF9jb25maWcgb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCQkgICBQeU9iamVjdCAqYXJncywKKwkJCQkJCSAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnB1YmxpY19hZGRyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPmJvdW5kX2FkZHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAicG9ydCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBwb3J0KSwgMCwKKyAgICAgICAgIlVEUCBwb3J0IG51bWJlciB0byBiaW5kIGxvY2FsbHkuIFRoaXMgc2V0dGluZyBNVVNUIGJlIHNwZWNpZmllZCAiCisgICAgICAgICJldmVuIHdoZW4gZGVmYXVsdCBwb3J0IGlzIGRlc2lyZWQuIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCB0aGUgIgorICAgICAgICAidHJhbnNwb3J0IHdpbGwgYmUgYm91bmQgdG8gYW55IGF2YWlsYWJsZSBwb3J0LCBhbmQgYXBwbGljYXRpb24gIgorICAgICAgICAiY2FuIHF1ZXJ5IHRoZSBwb3J0IGJ5IHF1ZXJ5aW5nIHRoZSB0cmFuc3BvcnQgaW5mby4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJwdWJsaWNfYWRkciIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBwdWJsaWNfYWRkciksIDAsCisgICAgICAgICJPcHRpb25hbCBhZGRyZXNzIHRvIGFkdmVydGlzZSBhcyB0aGUgYWRkcmVzcyBvZiB0aGlzIHRyYW5zcG9ydC4gIgorICAgICAgICAiQXBwbGljYXRpb24gY2FuIHNwZWNpZnkgYW55IGFkZHJlc3Mgb3IgaG9zdG5hbWUgZm9yIHRoaXMgZmllbGQsICIKKyAgICAgICAgImZvciBleGFtcGxlIGl0IGNhbiBwb2ludCB0byBvbmUgb2YgdGhlIGludGVyZmFjZSBhZGRyZXNzIGluIHRoZSAiCisgICAgICAgICJzeXN0ZW0sIG9yIGl0IGNhbiBwb2ludCB0byB0aGUgcHVibGljIGFkZHJlc3Mgb2YgYSBOQVQgcm91dGVyICIKKyAgICAgICAgIndoZXJlIHBvcnQgbWFwcGluZ3MgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoZSBhcHBsaWNhdGlvbi4iCQkKKyAgICB9LCAgICAKKyAgICB7CisgICAgICAgICJib3VuZF9hZGRyIiwgVF9PQkpFQ1RfRVgsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBib3VuZF9hZGRyKSwgMCwKKyAgICAgICAgIk9wdGlvbmFsIGFkZHJlc3Mgd2hlcmUgdGhlIHNvY2tldCBzaG91bGQgYmUgYm91bmQgdG8uIFRoaXMgb3B0aW9uICIKKyAgICAgICAgIlNIT1VMRCBvbmx5IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgYmluZCB0aGUgc29ja2V0IHRvIHBhcnRpY3VsYXIgIgorICAgICAgICAiaW50ZXJmYWNlIChpbnN0ZWFkIG9mIDAuMC4wLjApLCBhbmQgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHNldCB0aGUgIgorICAgICAgICAicHVibGlzaGVkIGFkZHJlc3Mgb2YgYSB0cmFuc3BvcnQgKHRoZSBwdWJsaWNfYWRkciBmaWVsZCBzaG91bGQgYmUgIgorICAgICAgICAidXNlZCBmb3IgdGhhdCBwdXJwb3NlKS4iCQkKKyAgICB9LCAgICAKKyAgICB7CisgICAgICAgICJxb3NfdHlwZSIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBxb3NfdHlwZSksIDAsCisgICAgICAgICJIaWdoIGxldmVsIHRyYWZmaWMgY2xhc3NpZmljYXRpb24uIgorICAgICAgICAiRW51bWVyYXRvcjoiCisgICAgICAgICIgIDA6IFBKX1FPU19UWVBFX0JFU1RfRUZGT1JUIgorICAgICAgICAiICAgICAgIEJlc3QgZWZmb3J0IHRyYWZmaWMgKGRlZmF1bHQgdmFsdWUpLiBBbnkgUW9TIGZ1bmN0aW9uIGNhbGxzIHdpdGggIgorICAgICAgICAiICAgICAgIHNwZWNpZnlpbmcgdGhpcyB2YWx1ZSBhcmUgZWZmZWN0aXZlbHkgbm8tb3AiCisgICAgICAgICIgIDE6IFBKX1FPU19UWVBFX0JBQ0tHUk9VTkQiCisgICAgICAgICIgICAgICAgQmFja2dyb3VuZCB0cmFmZmljLiIKKyAgICAgICAgIiAgMjogUEpfUU9TX1RZUEVfVklERU8iCisgICAgICAgICIgICAgICAgVmlkZW8gdHJhZmZpYy4iCisgICAgICAgICIgIDM6IFBKX1FPU19UWVBFX1ZPSUNFIgorICAgICAgICAiICAgICAgIFZvaWNlIHRyYWZmaWMuIgorICAgICAgICAiICA0OiBQSl9RT1NfVFlQRV9DT05UUk9MIgorICAgICAgICAiICAgICAgIENvbnRyb2wgdHJhZmZpYy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJxb3NfcGFyYW1zX2ZsYWdzIiwgVF9JTlQsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcsIHFvc19wYXJhbXNfZmxhZ3MpLCAwLAorICAgICAgICAiRGV0ZXJtaW5lcyB3aGljaCB2YWx1ZXMgdG8gc2V0LCBiaXRtYXNrIG9mIHBqX3Fvc19mbGFnLiIKKyAgICAgICAgIiAgIFBKX1FPU19QQVJBTV9IQVNfRFNDUCA9IDEiCisgICAgICAgICIgICBQSl9RT1NfUEFSQU1fSEFTX1NPX1BSSU8gPSAyIgorICAgICAgICAiICAgUEpfUU9TX1BBUkFNX0hBU19XTU0gPSA0IgorICAgIH0sCisgICAgeworICAgICAgICAicW9zX3BhcmFtc19kc2NwX3ZhbCIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBxb3NfcGFyYW1zX2RzY3BfdmFsKSwgMCwKKyAgICAgICAgIlRoZSA2IGJpdHMgRFNDUCB2YWx1ZSB0byBzZXQuIgorICAgICAgICAiRXhhbXBsZTogNDY9RUYsIDI2PUFGMzEsIDI0PUNTMy4uLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInFvc19wYXJhbXNfc29fcHJpbyIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnLCBxb3NfcGFyYW1zX3NvX3ByaW8pLCAwLAorICAgICAgICAiU29ja2V0IFNPX1BSSU9SSVRZIHZhbHVlLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInFvc19wYXJhbXNfd21tX3ByaW8iLCBUX0lOVCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZywgcW9zX3BhcmFtc193bW1fcHJpbyksIDAsCisgICAgICAgICJTdGFuZGFyZCBXTU0gcHJpb3JpdGllcy4iCisgICAgICAgICJFbnVtZXJhdG9yOiIKKyAgICAgICAgIiAgMDogUEpfUU9TX1dNTV9QUklPX0JVTEtfRUZGT1JUIgorICAgICAgICAiICAgICAgIEJ1bGsgZWZmb3J0IHByaW9yaXR5IgorICAgICAgICAiICAxOiBQSl9RT1NfV01NX1BSSU9fQlVMSyIKKyAgICAgICAgIiAgICAgICBCdWxrIHByaW9yaXR5LiIKKyAgICAgICAgIiAgMjogUEpfUU9TX1dNTV9QUklPX1ZJREVPIgorICAgICAgICAiICAgICAgIFZpZGVvIHByaW9yaXR5IgorICAgICAgICAiICAzOiBQSl9RT1NfV01NX1BSSU9fVk9JQ0UiCisgICAgICAgICIgICAgICAgVm9pY2UgcHJpb3JpdHkuIgorICAgIH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV90cmFuc3BvcnRfY29uZmlnID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9wanN1YS5UcmFuc3BvcnRfQ29uZmlnIiwgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJUcmFuc3BvcnQgc2V0dGluZyIsCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbWVtYmVycywvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfbmV3LC8qIHRwX25ldyAqLworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbworICogVHJhbnNwb3J0IGluZm8KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBpbnQJCSBpZDsKKyAgICBpbnQJCSB0eXBlOworICAgIFB5T2JqZWN0CSp0eXBlX25hbWU7CisgICAgUHlPYmplY3QJKmluZm87CisgICAgdW5zaWduZWQJIGZsYWc7CisgICAgUHlPYmplY3QJKmFkZHI7CisgICAgdW5zaWduZWQJIHBvcnQ7CisgICAgdW5zaWduZWQJIHVzYWdlX2NvdW50OworfSBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbzsKKworCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fZGVsZXRlCisgKiBkZWxldGVzIGEgdHJhbnNwb3J0IGluZm8gZnJvbSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fZGVsZXRlKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dHlwZV9uYW1lKTsgCisgICAgUHlfWERFQ1JFRihzZWxmLT5pbmZvKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFkZHIpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19pbXBvcnQoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8gKm9iaiwKKwkJCQkJICAgICAgY29uc3QgcGpzdWFfdHJhbnNwb3J0X2luZm8gKmluZm8pCit7CisgICAgb2JqLT5pZAkgICAgPSBpbmZvLT5pZDsKKyAgICBvYmotPnR5cGUJICAgID0gaW5mby0+dHlwZTsKKyAgICBvYmotPnR5cGVfbmFtZSAgPSBQeVN0cmluZ19Gcm9tUEooJmluZm8tPnR5cGVfbmFtZSk7CisgICAgb2JqLT5pbmZvCSAgICA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby0+aW5mbyk7CisgICAgb2JqLT5mbGFnCSAgICA9IGluZm8tPmZsYWc7CisgICAgb2JqLT5hZGRyCSAgICA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby0+bG9jYWxfbmFtZS5ob3N0KTsKKyAgICBvYmotPnBvcnQJICAgID0gaW5mby0+bG9jYWxfbmFtZS5wb3J0OworICAgIG9iai0+dXNhZ2VfY291bnQ9IGluZm8tPnVzYWdlX2NvdW50OworfQorCisvKgorICogUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgdHJhbnNwb3J0X2luZm8gb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQkJIFB5T2JqZWN0ICphcmdzLAorCQkJCQkJIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpCisgICAgeworICAgICAgICBzZWxmLT50eXBlX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgc2VsZi0+aW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOyAKKyAgICAgICAgc2VsZi0+YWRkciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBpZCksIDAsCisgICAgICAgICJQSlNVQSB0cmFuc3BvcnQgaWRlbnRpZmljYXRpb24uIgorICAgIH0sCisgICAgeworICAgICAgICAidHlwZSIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbywgdHlwZSksIDAsCisgICAgICAgICJUcmFuc3BvcnQgdHlwZS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0eXBlX25hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8sIHR5cGVfbmFtZSksIDAsCisgICAgICAgICJUcmFuc3BvcnQgdHlwZSBuYW1lLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImluZm8iLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8sIGluZm8pLCAwLAorICAgICAgICAiVHJhbnNwb3J0IHN0cmluZyBpbmZvL2Rlc2NyaXB0aW9uLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImZsYWciLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm8sIGZsYWcpLCAwLAorICAgICAgICAiVHJhbnNwb3J0IGZsYWcgKHNlZSAjI3Bqc2lwX3RyYW5zcG9ydF9mbGFnc19lKS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJhZGRyIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBhZGRyKSwgMCwKKyAgICAgICAgIlB1Ymxpc2hlZCBhZGRyZXNzIChvciB0cmFuc3BvcnQgYWRkcmVzcyBuYW1lKS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJwb3J0IiwgVF9JTlQsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvLCBwb3J0KSwgMCwKKyAgICAgICAgIlB1Ymxpc2hlZCBwb3J0IG51bWJlci4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJ1c2FnZV9jb3VudCIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbywgdXNhZ2VfY291bnQpLCAwLAorICAgICAgICAiQ3VycmVudCBudW1iZXIgb2Ygb2JqZWN0cyBjdXJyZW50bHkgcmVmZXJlbmNpbmcgdGhpcyB0cmFuc3BvcnQuIgorICAgIH0sICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX3RyYW5zcG9ydF9pbmZvCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2luZm8gPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLlRyYW5zcG9ydF9JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV90cmFuc3BvcnRfaW5mb19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiVHJhbnNwb3J0IEluZm8gb2JqZWN0cyIsICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2luZm9fbWVtYmVycywgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9pbmZvX25ldywgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBQeU9ial9wanN1YV9hY2NfY29uZmlnCisgKiBBY2MgQ29uZmlnCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgaW50CQkgICAgIHByaW9yaXR5OwkKKyAgICBQeU9iamVjdAkgICAgKmlkOworICAgIFB5T2JqZWN0CSAgICAqcmVnX3VyaTsKKyAgICBpbnQJCSAgICAgcHVibGlzaF9lbmFibGVkOworICAgIGludAkJICAgICBtd2lfZW5hYmxlZDsKKyAgICBQeU9iamVjdAkgICAgKmZvcmNlX2NvbnRhY3Q7CisgICAgUHlMaXN0T2JqZWN0ICAgICpwcm94eTsKKyAgICB1bnNpZ25lZAkgICAgIHJlZ190aW1lb3V0OworICAgIHVuc2lnbmVkCSAgICAgcmVnX2RlbGF5X2JlZm9yZV9yZWZyZXNoOworICAgIFB5TGlzdE9iamVjdCAgICAqY3JlZF9pbmZvOworICAgIGludAkJICAgICB0cmFuc3BvcnRfaWQ7CisgICAgaW50CQkgICAgIGF1dGhfaW5pdGlhbF9zZW5kOworICAgIFB5T2JqZWN0CSAgICAqYXV0aF9pbml0aWFsX2FsZ29yaXRobTsKKyAgICBQeU9iamVjdAkgICAgKnBpZGZfdHVwbGVfaWQ7CisgICAgUHlPYmplY3QJICAgICpjb250YWN0X3BhcmFtczsKKyAgICBQeU9iamVjdAkgICAgKmNvbnRhY3RfdXJpX3BhcmFtczsKKyAgICBpbnQJCSAgICAgcmVxdWlyZV8xMDByZWw7CisgICAgaW50CQkgICAgIHVzZV90aW1lcjsKKyAgICB1bnNpZ25lZAkgICAgIHRpbWVyX3NlOworICAgIHVuc2lnbmVkCSAgICAgdGltZXJfbWluX3NlOworICAgIGludAkJICAgICBhbGxvd19jb250YWN0X3Jld3JpdGU7CisgICAgaW50CQkgICAgIGthX2ludGVydmFsOworICAgIFB5T2JqZWN0CSAgICAqa2FfZGF0YTsKKyAgICB1bnNpZ25lZAkgICAgIHVzZV9zcnRwOworICAgIHVuc2lnbmVkCSAgICAgc3J0cF9zZWN1cmVfc2lnbmFsaW5nOworICAgIFB5T2JqZWN0CSAgICAqcnRwX3RyYW5zcG9ydF9jZmc7Cit9IFB5T2JqX3Bqc3VhX2FjY19jb25maWc7CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfZGVsZXRlCisgKiBkZWxldGVzIGEgYWNjX2NvbmZpZyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9hY2NfY29uZmlnX2RlbGV0ZShQeU9ial9wanN1YV9hY2NfY29uZmlnKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+aWQpOyAKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlZ191cmkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Zm9yY2VfY29udGFjdCk7CQorICAgIFB5X1hERUNSRUYoc2VsZi0+cHJveHkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y3JlZF9pbmZvKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmF1dGhfaW5pdGlhbF9hbGdvcml0aG0pOworICAgIFB5X1hERUNSRUYoc2VsZi0+cGlkZl90dXBsZV9pZCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb250YWN0X3BhcmFtcyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb250YWN0X3VyaV9wYXJhbXMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+a2FfZGF0YSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5ydHBfdHJhbnNwb3J0X2NmZyk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfaW1wb3J0KFB5T2JqX3Bqc3VhX2FjY19jb25maWcgKm9iaiwKKwkJCQkJICBjb25zdCBwanN1YV9hY2NfY29uZmlnICpjZmcpCit7CisgICAgUHlPYmpfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZyAqdGNvbmY7CisgICAgdW5zaWduZWQgaTsKKworICAgIG9iai0+cHJpb3JpdHkgICA9IGNmZy0+cHJpb3JpdHk7CisgICAgUHlfWERFQ1JFRihvYmotPmlkKTsKKyAgICBvYmotPmlkCSAgICA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5pZCk7CisgICAgUHlfWERFQ1JFRihvYmotPnJlZ191cmkpOworICAgIG9iai0+cmVnX3VyaSAgICA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5yZWdfdXJpKTsKKyAgICBvYmotPnB1Ymxpc2hfZW5hYmxlZCA9IGNmZy0+cHVibGlzaF9lbmFibGVkOworICAgIG9iai0+bXdpX2VuYWJsZWQgPSBjZmctPm13aV9lbmFibGVkOworICAgIFB5X1hERUNSRUYob2JqLT5mb3JjZV9jb250YWN0KTsKKyAgICBvYmotPmZvcmNlX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+Zm9yY2VfY29udGFjdCk7CisgICAgUHlfWERFQ1JFRihvYmotPnByb3h5KTsKKyAgICBvYmotPnByb3h5ID0gKFB5TGlzdE9iamVjdCAqKVB5TGlzdF9OZXcoMCk7CisgICAgZm9yIChpPTA7IGk8Y2ZnLT5wcm94eV9jbnQ7ICsraSkgeworCVB5T2JqZWN0ICogc3RyOworCXN0ciA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5wcm94eVtpXSk7CisJUHlMaXN0X0FwcGVuZCgoUHlPYmplY3QgKilvYmotPnByb3h5LCBzdHIpOworICAgIH0KKworICAgIG9iai0+cmVnX3RpbWVvdXQgPSBjZmctPnJlZ190aW1lb3V0OworICAgIG9iai0+cmVnX2RlbGF5X2JlZm9yZV9yZWZyZXNoID0gY2ZnLT5yZWdfZGVsYXlfYmVmb3JlX3JlZnJlc2g7CisKKyAgICBQeV9YREVDUkVGKG9iai0+Y3JlZF9pbmZvKTsKKyAgICBvYmotPmNyZWRfaW5mbyA9IChQeUxpc3RPYmplY3QgKilQeUxpc3RfTmV3KDApOworICAgIGZvciAoaT0wOyBpPGNmZy0+Y3JlZF9jb3VudDsgKytpKSB7CisJUHlPYmpfcGpzaXBfY3JlZF9pbmZvICogY2k7CisKKwljaSA9IChQeU9ial9wanNpcF9jcmVkX2luZm8gKikKKwkgICAgIFB5T2JqX3Bqc2lwX2NyZWRfaW5mb19uZXcoJlB5VHlwX3Bqc2lwX2NyZWRfaW5mbyxOVUxMLE5VTEwpOworCVB5T2JqX3Bqc2lwX2NyZWRfaW5mb19pbXBvcnQoY2ksICZjZmctPmNyZWRfaW5mb1tpXSk7CisJUHlMaXN0X0FwcGVuZCgoUHlPYmplY3QgKilvYmotPmNyZWRfaW5mbywgKFB5T2JqZWN0ICopY2kpOworICAgIH0KKworICAgIG9iai0+dHJhbnNwb3J0X2lkID0gY2ZnLT50cmFuc3BvcnRfaWQ7CisKKyAgICBvYmotPmF1dGhfaW5pdGlhbF9zZW5kID0gY2ZnLT5hdXRoX3ByZWYuaW5pdGlhbF9hdXRoOworICAgIFB5X1hERUNSRUYob2JqLT5hdXRoX2luaXRpYWxfYWxnb3JpdGhtKTsKKyAgICBvYmotPmF1dGhfaW5pdGlhbF9hbGdvcml0aG0gPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+YXV0aF9wcmVmLmFsZ29yaXRobSk7CisgICAgUHlfWERFQ1JFRihvYmotPnBpZGZfdHVwbGVfaWQpOworICAgIG9iai0+cGlkZl90dXBsZV9pZCA9IFB5U3RyaW5nX0Zyb21QSigmY2ZnLT5waWRmX3R1cGxlX2lkKTsKKyAgICBQeV9YREVDUkVGKG9iai0+Y29udGFjdF9wYXJhbXMpOworICAgIG9iai0+Y29udGFjdF9wYXJhbXMgPSBQeVN0cmluZ19Gcm9tUEooJmNmZy0+Y29udGFjdF9wYXJhbXMpOworICAgIFB5X1hERUNSRUYob2JqLT5jb250YWN0X3VyaV9wYXJhbXMpOworICAgIG9iai0+Y29udGFjdF91cmlfcGFyYW1zID0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPmNvbnRhY3RfdXJpX3BhcmFtcyk7CisgICAgb2JqLT5yZXF1aXJlXzEwMHJlbCA9IGNmZy0+cmVxdWlyZV8xMDByZWw7CisgICAgb2JqLT51c2VfdGltZXIgPSBjZmctPnVzZV90aW1lcjsKKyAgICBvYmotPnRpbWVyX3NlID0gY2ZnLT50aW1lcl9zZXR0aW5nLnNlc3NfZXhwaXJlczsKKyAgICBvYmotPnRpbWVyX21pbl9zZSA9IGNmZy0+dGltZXJfc2V0dGluZy5taW5fc2U7CisgICAgb2JqLT5hbGxvd19jb250YWN0X3Jld3JpdGUgPSBjZmctPmFsbG93X2NvbnRhY3RfcmV3cml0ZTsKKyAgICBvYmotPmthX2ludGVydmFsID0gY2ZnLT5rYV9pbnRlcnZhbDsKKyAgICBQeV9YREVDUkVGKG9iai0+a2FfZGF0YSk7CisgICAgb2JqLT5rYV9kYXRhID0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPmthX2RhdGEpOworICAgIG9iai0+dXNlX3NydHAgPSBjZmctPnVzZV9zcnRwOworICAgIG9iai0+c3J0cF9zZWN1cmVfc2lnbmFsaW5nID0gY2ZnLT5zcnRwX3NlY3VyZV9zaWduYWxpbmc7CisKKyAgICBQeV9YREVDUkVGKG9iai0+cnRwX3RyYW5zcG9ydF9jZmcpOworICAgIHRjb25mID0gKFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWcqKQorCSAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX25ldygmUHlUeXBfcGpzdWFfdHJhbnNwb3J0X2NvbmZpZywKKwkJCQkJICAgICBOVUxMLCBOVUxMKTsKKyAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnX2ltcG9ydCh0Y29uZiwgJmNmZy0+cnRwX2NmZyk7CisgICAgb2JqLT5ydHBfdHJhbnNwb3J0X2NmZyA9IChQeU9iamVjdCAqKSB0Y29uZjsKK30KKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19leHBvcnQocGpzdWFfYWNjX2NvbmZpZyAqY2ZnLAorCQkJCQkgIFB5T2JqX3Bqc3VhX2FjY19jb25maWcgKm9iaikKK3sKKyAgICBQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnICp0Y29uZjsKKyAgICB1bnNpZ25lZCBpOworCisgICAgY2ZnLT5wcmlvcml0eSAgID0gb2JqLT5wcmlvcml0eTsKKyAgICBjZmctPmlkCSAgICA9IFB5U3RyaW5nX1RvUEoob2JqLT5pZCk7CisgICAgY2ZnLT5yZWdfdXJpICAgID0gUHlTdHJpbmdfVG9QSihvYmotPnJlZ191cmkpOworICAgIGNmZy0+cHVibGlzaF9lbmFibGVkID0gb2JqLT5wdWJsaXNoX2VuYWJsZWQ7CisgICAgY2ZnLT5td2lfZW5hYmxlZCA9IG9iai0+bXdpX2VuYWJsZWQ7CisgICAgY2ZnLT5mb3JjZV9jb250YWN0ID0gUHlTdHJpbmdfVG9QSihvYmotPmZvcmNlX2NvbnRhY3QpOworCisgICAgY2ZnLT5wcm94eV9jbnQgPSBQeUxpc3RfU2l6ZSgoUHlPYmplY3QqKW9iai0+cHJveHkpOworICAgIGlmIChjZmctPnByb3h5X2NudCA+IFBKX0FSUkFZX1NJWkUoY2ZnLT5wcm94eSkpCisJY2ZnLT5wcm94eV9jbnQgPSBQSl9BUlJBWV9TSVpFKGNmZy0+cHJveHkpOworICAgIGZvciAoaSA9IDA7IGkgPCBjZmctPnByb3h5X2NudDsgaSsrKSB7CisJUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR2V0SXRlbSgoUHlPYmplY3QgKilvYmotPnByb3h5LCBpKTsKKyAgICAgICAgY2ZnLT5wcm94eVtpXSA9IFB5U3RyaW5nX1RvUEooaXRlbSk7CisgICAgfQorCisgICAgY2ZnLT5yZWdfdGltZW91dCA9IG9iai0+cmVnX3RpbWVvdXQ7CisgICAgY2ZnLT5yZWdfZGVsYXlfYmVmb3JlX3JlZnJlc2ggPSBvYmotPnJlZ19kZWxheV9iZWZvcmVfcmVmcmVzaDsKKworICAgIGNmZy0+Y3JlZF9jb3VudCA9IFB5TGlzdF9TaXplKChQeU9iamVjdCopb2JqLT5jcmVkX2luZm8pOworICAgIGlmIChjZmctPmNyZWRfY291bnQgPiBQSl9BUlJBWV9TSVpFKGNmZy0+Y3JlZF9pbmZvKSkKKwljZmctPmNyZWRfY291bnQgPSBQSl9BUlJBWV9TSVpFKGNmZy0+Y3JlZF9pbmZvKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2ZnLT5jcmVkX2NvdW50OyBpKyspIHsKKwlQeU9ial9wanNpcF9jcmVkX2luZm8gKmNpOworCWNpID0gKFB5T2JqX3Bqc2lwX2NyZWRfaW5mbyopCisJICAgICBQeUxpc3RfR2V0SXRlbSgoUHlPYmplY3QgKilvYmotPmNyZWRfaW5mbywgaSk7CisJUHlPYmpfcGpzaXBfY3JlZF9pbmZvX2V4cG9ydCgmY2ZnLT5jcmVkX2luZm9baV0sIGNpKTsKKyAgICB9CisKKyAgICBjZmctPnRyYW5zcG9ydF9pZCA9IG9iai0+dHJhbnNwb3J0X2lkOworICAgIGNmZy0+YXV0aF9wcmVmLmluaXRpYWxfYXV0aCA9IG9iai0+YXV0aF9pbml0aWFsX3NlbmQ7CisgICAgY2ZnLT5hdXRoX3ByZWYuYWxnb3JpdGhtID0gUHlTdHJpbmdfVG9QSihvYmotPmF1dGhfaW5pdGlhbF9hbGdvcml0aG0pOworICAgIGNmZy0+cGlkZl90dXBsZV9pZCA9IFB5U3RyaW5nX1RvUEoob2JqLT5waWRmX3R1cGxlX2lkKTsKKyAgICBjZmctPmNvbnRhY3RfcGFyYW1zID0gUHlTdHJpbmdfVG9QSihvYmotPmNvbnRhY3RfcGFyYW1zKTsKKyAgICBjZmctPmNvbnRhY3RfdXJpX3BhcmFtcyA9IFB5U3RyaW5nX1RvUEoob2JqLT5jb250YWN0X3VyaV9wYXJhbXMpOworICAgIGNmZy0+cmVxdWlyZV8xMDByZWwgPSBvYmotPnJlcXVpcmVfMTAwcmVsOworICAgIGNmZy0+dXNlX3RpbWVyID0gb2JqLT51c2VfdGltZXI7CisgICAgY2ZnLT50aW1lcl9zZXR0aW5nLnNlc3NfZXhwaXJlcyA9IG9iai0+dGltZXJfc2U7CisgICAgY2ZnLT50aW1lcl9zZXR0aW5nLm1pbl9zZSA9IG9iai0+dGltZXJfbWluX3NlOworICAgIGNmZy0+YWxsb3dfY29udGFjdF9yZXdyaXRlID0gb2JqLT5hbGxvd19jb250YWN0X3Jld3JpdGU7CisgICAgY2ZnLT5rYV9pbnRlcnZhbCA9IG9iai0+a2FfaW50ZXJ2YWw7CisgICAgY2ZnLT5rYV9kYXRhID0gUHlTdHJpbmdfVG9QSihvYmotPmthX2RhdGEpOworICAgIGNmZy0+dXNlX3NydHAgPSBvYmotPnVzZV9zcnRwOworICAgIGNmZy0+c3J0cF9zZWN1cmVfc2lnbmFsaW5nID0gb2JqLT5zcnRwX3NlY3VyZV9zaWduYWxpbmc7CisKKyAgICB0Y29uZiA9IChQeU9ial9wanN1YV90cmFuc3BvcnRfY29uZmlnKilvYmotPnJ0cF90cmFuc3BvcnRfY2ZnOworICAgIFB5T2JqX3Bqc3VhX3RyYW5zcG9ydF9jb25maWdfZXhwb3J0KCZjZmctPnJ0cF9jZmcsIHRjb25mKTsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBhY2NfY29uZmlnIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanN1YV9hY2NfY29uZmlnX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQkgICAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2FjY19jb25maWcgKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2FjY19jb25maWcgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmlkID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIHNlbGYtPnJlZ191cmkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgc2VsZi0+Zm9yY2VfY29udGFjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPnByb3h5ID0gKFB5TGlzdE9iamVjdCAqKVB5TGlzdF9OZXcoMCk7CisJc2VsZi0+Y3JlZF9pbmZvID0gKFB5TGlzdE9iamVjdCAqKVB5TGlzdF9OZXcoMCk7CisJc2VsZi0+YXV0aF9pbml0aWFsX2FsZ29yaXRobSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPnBpZGZfdHVwbGVfaWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5jb250YWN0X3BhcmFtcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPmNvbnRhY3RfdXJpX3BhcmFtcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPmthX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworCisKKy8qCisgKiBQeU9ial9wanN1YV9hY2NfY29uZmlnX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJwcmlvcml0eSIsIFRfSU5ULCBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBwcmlvcml0eSksIDAsCisgICAgICAgICJBY2NvdW50IHByaW9yaXR5LCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIG9yZGVyIG9mIG1hdGNoaW5nICIKKyAgICAgICAgImluY29taW5nL291dGdvaW5nIHJlcXVlc3RzLiBUaGUgaGlnaGVyIHRoZSBudW1iZXIgbWVhbnMgdGhlIGhpZ2hlciAiCisgICAgICAgICJ0aGUgcHJpb3JpdHkgaXMsIGFuZCB0aGUgYWNjb3VudCB3aWxsIGJlIG1hdGNoZWQgZmlyc3QuICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImlkIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIGlkKSwgMCwKKyAgICAgICAgIlRoZSBmdWxsIFNJUCBVUkwgZm9yIHRoZSBhY2NvdW50LiAiCisgICAgICAgICJUaGUgdmFsdWUgY2FuIHRha2UgbmFtZSBhZGRyZXNzIG9yIFVSTCBmb3JtYXQsICIKKyAgICAgICAgImFuZCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgJ3NpcDphY2NvdW50QHNlcnZpY2Vwcm92aWRlcicuICIKKyAgICAgICAgIlRoaXMgZmllbGQgaXMgbWFuZGF0b3J5LiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInJlZ191cmkiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcmVnX3VyaSksIDAsCisgICAgICAgICJUaGlzIGlzIHRoZSBVUkwgdG8gYmUgcHV0IGluIHRoZSByZXF1ZXN0IFVSSSBmb3IgdGhlIHJlZ2lzdHJhdGlvbiwgIgorICAgICAgICAiYW5kIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSAnc2lwOnNlcnZpY2Vwcm92aWRlcicuICIKKyAgICAgICAgIlRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiByZWdpc3RyYXRpb24gaXMgZGVzaXJlZC4gIgorICAgICAgICAiSWYgdGhlIHZhbHVlIGlzIGVtcHR5LCBubyBhY2NvdW50IHJlZ2lzdHJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gIgorICAgIH0sCisgICAgeworICAgICAgICAicHVibGlzaF9lbmFibGVkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBwdWJsaXNoX2VuYWJsZWQpLCAwLAorICAgICAgICAiUHVibGlzaCBwcmVzZW5jZT8gIgorICAgIH0sCisgICAgeworICAgICAgICAibXdpX2VuYWJsZWQiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIG13aV9lbmFibGVkKSwgMCwKKyAgICAgICAgIkVuYWJsZSBNV0kgc3Vic2NyaXB0aW9uICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImZvcmNlX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgZm9yY2VfY29udGFjdCksIDAsCisgICAgICAgICJPcHRpb25hbCBVUkkgdG8gYmUgcHV0IGFzIENvbnRhY3QgZm9yIHRoaXMgYWNjb3VudC4gIgorICAgICAgICAiSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGZpZWxkIGlzIGxlZnQgZW1wdHksICIKKyAgICAgICAgInNvIHRoYXQgdGhlIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5ICIKKyAgICAgICAgImJhc2VkIG9uIHRoZSB0cmFuc3BvcnQgYWRkcmVzcy4gIgorICAgIH0sCisgICAgeworICAgICAgICAicHJveHkiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcHJveHkpLCAwLAorICAgICAgICAiT3B0aW9uYWwgVVJJIG9mIHRoZSBwcm94aWVzIHRvIGJlIHZpc2l0ZWQgZm9yIGFsbCBvdXRnb2luZyByZXF1ZXN0cyAiCisJInRoYXQgYXJlIHVzaW5nIHRoaXMgYWNjb3VudCAoUkVHSVNURVIsIElOVklURSwgZXRjKS4gQXBwbGljYXRpb24gbmVlZCAiCisJInRvIHNwZWNpZnkgdGhlc2UgcHJveGllcyBpZiB0aGUgc2VydmljZSBwcm92aWRlciByZXF1aXJlcyAiCisJInRoYXQgcmVxdWVzdHMgZGVzdGluZWQgdG93YXJkcyBpdHMgbmV0d29yayBzaG91bGQgZ28gdGhyb3VnaCBjZXJ0YWluICIKKwkicHJveGllcyBmaXJzdCAoZm9yIGV4YW1wbGUsIGJvcmRlciBjb250cm9sbGVycykuIgorICAgIH0sCisgICAgeworICAgICAgICAicmVnX3RpbWVvdXQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcmVnX3RpbWVvdXQpLCAwLAorICAgICAgICAiT3B0aW9uYWwgaW50ZXJ2YWwgZm9yIHJlZ2lzdHJhdGlvbiwgaW4gc2Vjb25kcy4gIgorICAgICAgICAiSWYgdGhlIHZhbHVlIGlzIHplcm8sIGRlZmF1bHQgaW50ZXJ2YWwgd2lsbCBiZSB1c2VkICIKKyAgICAgICAgIihQSlNVQV9SRUdfSU5URVJWQUwsIDU1IHNlY29uZHMpLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJyZWdfZGVsYXlfYmVmb3JlX3JlZnJlc2giLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgcmVnX2RlbGF5X2JlZm9yZV9yZWZyZXNoKSwgMCwKKyAgICAgICAgIlNwZWNpZnkgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHJlZnJlc2ggdGhlIGNsaWVudCByZWdpc3RyYXRpb24iCisgICAgICAgICJiZWZvcmUgdGhlIHJlZ2lzdHJhdGlvbiBleHBpcmVzLiIKKyAgICAgICAgIihQSlNJUF9SRUdJU1RFUl9DTElFTlRfREVMQVlfQkVGT1JFX1JFRlJFU0gsIDUgc2Vjb25kcykuICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNyZWRfaW5mbyIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBjcmVkX2luZm8pLCAwLAorICAgICAgICAiQXJyYXkgb2YgY3JlZGVudGlhbHMuIElmIHJlZ2lzdHJhdGlvbiBpcyBkZXNpcmVkLCBub3JtYWxseSB0aGVyZSAiCisJInNob3VsZCBiZSBhdCBsZWFzdCBvbmUgY3JlZGVudGlhbCBzcGVjaWZpZWQsIHRvIHN1Y2Nlc3NmdWxseSAiCisJImF1dGhlbnRpY2F0ZSBhZ2FpbnN0IHRoZSBzZXJ2aWNlIHByb3ZpZGVyLiBNb3JlIGNyZWRlbnRpYWxzIGNhbiAiCisJImJlIHNwZWNpZmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlICIKKwkiY2hhbGxlbmdlZCBieSB0aGUgcHJveGllcyBpbiB0aGUgcm91dGUgc2V0LiIKKyAgICB9LAorICAgIHsKKwkidHJhbnNwb3J0X2lkIiwgVF9JTlQsCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgdHJhbnNwb3J0X2lkKSwgMCwKKwkiT3B0aW9uYWxseSBiaW5kIHRoaXMgYWNjb3VudCB0byBzcGVjaWZpYyB0cmFuc3BvcnQuIFRoaXMgbm9ybWFsbHkgaXMiCisJIiBub3QgYSBnb29kIGlkZWEsIGFzIGFjY291bnQgc2hvdWxkIGJlIGFibGUgdG8gc2VuZCByZXF1ZXN0cyB1c2luZyIKKwkiIGFueSBhdmFpbGFibGUgdHJhbnNwb3J0cyBhY2NvcmRpbmcgdG8gdGhlIGRlc3RpbmF0aW9uLiBCdXQgc29tZSIKKwkiIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIGhhdmUgZXhwbGljaXQgY29udHJvbCBvdmVyIHRoZSB0cmFuc3BvcnQgdG8iCisJIiB1c2UsIHNvIGluIHRoYXQgY2FzZSBpdCBjYW4gc2V0IHRoaXMgZmllbGQuIgorICAgIH0sCisgICAgeworCSJhdXRoX2luaXRpYWxfc2VuZCIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIGF1dGhfaW5pdGlhbF9zZW5kKSwgMCwKKwkiU2VuZCBlbXB0eSBpbml0aWFsIGF1dGhvcml6YXRpb24gaGVhZGVyLiIKKyAgICB9LAorICAgIHsKKwkiYXV0aF9pbml0aWFsX2FsZ29yaXRobSIsIFRfT0JKRUNUX0VYLAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIGF1dGhfaW5pdGlhbF9hbGdvcml0aG0pLCAwLAorCSJTcGVjaWZ5IGFsZ29yaXRobSBpbiBlbXB0eSBpbml0aWFsIGF1dGhvcml6YXRpb24gaGVhZGVyLiIKKyAgICB9LAorICAgIHsKKwkicGlkZl90dXBsZV9pZCIsIFRfT0JKRUNUX0VYLAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIHBpZGZfdHVwbGVfaWQpLCAwLAorCSJQSURGIHR1cGxlIGlkLiIKKyAgICB9LAorICAgIHsKKwkiY29udGFjdF9wYXJhbXMiLCBUX09CSkVDVF9FWCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBjb250YWN0X3BhcmFtcyksIDAsCisJIkFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgQ29udGFjdCBoZWFkZXIuIgorICAgIH0sCisgICAgeworCSJjb250YWN0X3VyaV9wYXJhbXMiLCBUX09CSkVDVF9FWCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBjb250YWN0X3VyaV9wYXJhbXMpLCAwLAorCSJBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIENvbnRhY3QgVVJJLiIKKyAgICB9LAorICAgIHsKKwkicmVxdWlyZV8xMDByZWwiLCBUX0lOVCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCByZXF1aXJlXzEwMHJlbCksIDAsCisJIlJlcXVpcmUgcmVsaWFibGUgcHJvdmlzaW9uYWwgcmVzcG9uc2UuIgorICAgIH0sCisgICAgeworCSJ1c2VfdGltZXIiLCBUX0lOVCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCB1c2VfdGltZXIpLCAwLAorCSJVc2UgU0lQIHNlc3Npb24gdGltZXJzPyAoZGVmYXVsdD0xKSIKKwkiMDppbmFjdGl2ZSwgMTpvcHRpb25hbCwgMjptYW5kYXRvcnksIDM6YWx3YXlzIgorICAgIH0sCisgICAgeworCSJ0aW1lcl9zZSIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIHRpbWVyX3NlKSwgMCwKKwkiU2Vzc2lvbiB0aW1lciBleHBpcmF0aW9uIHBlcmlvZCwgaW4gc2Vjb25kcy4iCisgICAgfSwKKyAgICB7CisJInRpbWVyX21pbl9zZSIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIHRpbWVyX21pbl9zZSksIDAsCisJIlNlc3Npb24gdGltZXIgbWluaW11bSBleHBpcmF0aW9uIHBlcmlvZCwgaW4gc2Vjb25kcy4iCisgICAgfSwKKyAgICB7CisJImFsbG93X2NvbnRhY3RfcmV3cml0ZSIsIFRfSU5ULAorCW9mZnNldG9mKFB5T2JqX3Bqc3VhX2FjY19jb25maWcsIGFsbG93X2NvbnRhY3RfcmV3cml0ZSksIDAsCisJIlJlLVJFR0lTVEVSIGlmIGJlaGluZCBzeW1tZXRyaWMgTkFULiIKKyAgICB9LAorICAgIHsKKwkia2FfaW50ZXJ2YWwiLCBUX0lOVCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBrYV9pbnRlcnZhbCksIDAsCisJIktlZXAtYWxpdmUgaW50ZXJ2YWwuIgorICAgIH0sCisgICAgeworCSJrYV9kYXRhIiwgVF9PQkpFQ1RfRVgsCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywga2FfZGF0YSksIDAsCisJIktlZXAtYWxpdmUgZGF0YS4iCisgICAgfSwKKyAgICB7CisJInVzZV9zcnRwIiwgVF9JTlQsCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZywgdXNlX3NydHApLCAwLAorCSJTcGVjaWZ5IFNSVFAgdXNhZ2UuIgorICAgIH0sCisgICAgeworCSJzcnRwX3NlY3VyZV9zaWduYWxpbmciLCBUX0lOVCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBzcnRwX3NlY3VyZV9zaWduYWxpbmcpLCAwLAorCSJTcGVjaWZ5IGlmIFNSVFAgcmVxdWlyZXMgc2VjdXJlIHNpZ25hbGluZyB0byBiZSB1c2VkLiIKKyAgICB9LAorICAgIHsKKwkicnRwX3RyYW5zcG9ydF9jZmciLCBUX09CSkVDVF9FWCwKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfY29uZmlnLCBydHBfdHJhbnNwb3J0X2NmZyksIDAsCisJIlRyYW5zcG9ydCBjb25maWd1cmF0aW9uIGZvciBSVFAuIgorICAgIH0sCisKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfYWNjX2NvbmZpZworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2FjY19jb25maWcgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLkFjY19Db25maWciLAkgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGpzdWFfYWNjX2NvbmZpZyksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc3VhX2FjY19jb25maWdfZGVsZXRlLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkFjY291bnQgc2V0dGluZ3MiLAkJICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlPYmpfcGpzdWFfYWNjX2NvbmZpZ19tZW1iZXJzLCAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc3VhX2FjY19jb25maWdfbmV3LCAgICAgLyogdHBfbmV3ICovCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfYWNjX2luZm8KKyAqIEFjYyBJbmZvCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovCisgICAgaW50CQkgaWQ7CQorICAgIGludAkJIGlzX2RlZmF1bHQ7CisgICAgUHlPYmplY3QJKmFjY191cmk7CisgICAgaW50CQkgaGFzX3JlZ2lzdHJhdGlvbjsKKyAgICBpbnQJCSBleHBpcmVzOworICAgIGludAkJIHN0YXR1czsKKyAgICBQeU9iamVjdAkqc3RhdHVzX3RleHQ7CisgICAgaW50CQkgb25saW5lX3N0YXR1czsJCisgICAgUHlPYmplY3QJKm9ubGluZV9zdGF0dXNfdGV4dDsKK30gUHlPYmpfcGpzdWFfYWNjX2luZm87CisKKworLyoKKyAqIFB5T2JqX3Bqc3VhX2FjY19pbmZvX2RlbGV0ZQorICogZGVsZXRlcyBhIGFjY19pbmZvIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2FjY19pbmZvX2RlbGV0ZShQeU9ial9wanN1YV9hY2NfaW5mbyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFjY191cmkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhdHVzX3RleHQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b25saW5lX3N0YXR1c190ZXh0KTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYWNjX2luZm9faW1wb3J0KFB5T2JqX3Bqc3VhX2FjY19pbmZvICpvYmosCisJCQkJCWNvbnN0IHBqc3VhX2FjY19pbmZvICppbmZvKQoreworICAgIG9iai0+aWQJICAgID0gaW5mby0+aWQ7CisgICAgb2JqLT5pc19kZWZhdWx0ID0gaW5mby0+aXNfZGVmYXVsdDsKKyAgICBQeV9YREVDUkVGKG9iai0+YWNjX3VyaSk7CisgICAgb2JqLT5hY2NfdXJpICAgID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLT5hY2NfdXJpKTsKKyAgICBvYmotPmhhc19yZWdpc3RyYXRpb24gPSBpbmZvLT5oYXNfcmVnaXN0cmF0aW9uOworICAgIG9iai0+ZXhwaXJlcyAgICA9IGluZm8tPmV4cGlyZXM7CisgICAgb2JqLT5zdGF0dXMJICAgID0gaW5mby0+c3RhdHVzOworICAgIFB5X1hERUNSRUYob2JqLT5zdGF0dXNfdGV4dCk7CisgICAgb2JqLT5zdGF0dXNfdGV4dD0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLT5zdGF0dXNfdGV4dCk7CisgICAgb2JqLT5vbmxpbmVfc3RhdHVzID0gaW5mby0+b25saW5lX3N0YXR1czsKKyAgICBQeV9YREVDUkVGKG9iai0+b25saW5lX3N0YXR1c190ZXh0KTsKKyAgICBvYmotPm9ubGluZV9zdGF0dXNfdGV4dCA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby0+b25saW5lX3N0YXR1c190ZXh0KTsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfYWNjX2luZm9fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgYWNjX2luZm8gb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIFB5T2JqX3Bqc3VhX2FjY19pbmZvX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIAorCQkJCQkgICBQeU9iamVjdCAqYXJncywKKwkJCQkJICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmpfcGpzdWFfYWNjX2luZm8gKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2FjY19pbmZvICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5hY2NfdXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJc2VsZi0+c3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5vbmxpbmVfc3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworLyoKKyAqIGFjY19pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGFjY19pbmZvX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAiaWQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGlkKSwgMCwKKyAgICAgICAgIlRoZSBhY2NvdW50IElELiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImlzX2RlZmF1bHQiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGlzX2RlZmF1bHQpLCAwLAorICAgICAgICAiRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgYWNjb3VudC4gIgorICAgIH0sCisgICAgeworICAgICAgICAiYWNjX3VyaSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgYWNjX3VyaSksIDAsCisgICAgICAgICJBY2NvdW50IFVSSSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImhhc19yZWdpc3RyYXRpb24iLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGhhc19yZWdpc3RyYXRpb24pLCAwLAorICAgICAgICAiRmxhZyB0byB0ZWxsIHdoZXRoZXIgdGhpcyBhY2NvdW50IGhhcyByZWdpc3RyYXRpb24gc2V0dGluZyAiCisgICAgICAgICIocmVnX3VyaSBpcyBub3QgZW1wdHkpLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImV4cGlyZXMiLCBUX0lOVCwgCisJb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYWNjX2luZm8sIGV4cGlyZXMpLCAwLAorICAgICAgICAiQW4gdXAgdG8gZGF0ZSBleHBpcmF0aW9uIGludGVydmFsIGZvciBhY2NvdW50IHJlZ2lzdHJhdGlvbiBzZXNzaW9uLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInN0YXR1cyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgc3RhdHVzKSwgMCwKKyAgICAgICAgIkxhc3QgcmVnaXN0cmF0aW9uIHN0YXR1cyBjb2RlLiBJZiBzdGF0dXMgY29kZSBpcyB6ZXJvLCAiCisgICAgICAgICJ0aGUgYWNjb3VudCBpcyBjdXJyZW50bHkgbm90IHJlZ2lzdGVyZWQuIEFueSBvdGhlciB2YWx1ZSBpbmRpY2F0ZXMgIgorICAgICAgICAidGhlIFNJUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVnaXN0cmF0aW9uLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgc3RhdHVzX3RleHQpLCAwLAorICAgICAgICAiU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMuIgorICAgIH0sCisgICAgeworICAgICAgICAib25saW5lX3N0YXR1cyIsIFRfSU5ULCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgb25saW5lX3N0YXR1cyksIDAsCisgICAgICAgICJQcmVzZW5jZSBvbmxpbmUgc3RhdHVzIGZvciB0aGlzIGFjY291bnQuICIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm9ubGluZV9zdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLCAKKwlvZmZzZXRvZihQeU9ial9wanN1YV9hY2NfaW5mbywgb25saW5lX3N0YXR1c190ZXh0KSwgMCwKKyAgICAgICAgIlByZXNlbmNlIG9ubGluZSBzdGF0dXMgdGV4dC4iCisgICAgfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKKworCisvKgorICogUHlUeXBfcGpzdWFfYWNjX2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9hY2NfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuQWNjX0luZm8iLAkJICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX2FjY19pbmZvKSwgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9hY2NfaW5mb19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiQWNjb3VudCBpbmZvIiwJCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGFjY19pbmZvX21lbWJlcnMsCQkgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9hY2NfaW5mb19uZXcsICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnCisgKiBCdWRkeSBDb25maWcKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogVHlwZS1zcGVjaWZpYyBmaWVsZHMgZ28gaGVyZS4gKi8KKyAgICBQeU9iamVjdAkqdXJpOworICAgIGludAkJIHN1YnNjcmliZTsKK30gUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnOworCisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9jb25maWdfZGVsZXRlCisgKiBkZWxldGVzIGEgYnVkZHlfY29uZmlnIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19kZWxldGUoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dXJpKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX2ltcG9ydChQeU9ial9wanN1YV9idWRkeV9jb25maWcgKm9iaiwKKwkJCQkJICAgIGNvbnN0IHBqc3VhX2J1ZGR5X2NvbmZpZyAqY2ZnKQoreworICAgIFB5X1hERUNSRUYob2JqLT51cmkpOworICAgIG9iai0+dXJpID0gUHlTdHJpbmdfRnJvbVBKKCZjZmctPnVyaSk7CisgICAgb2JqLT5zdWJzY3JpYmUgPSBjZmctPnN1YnNjcmliZTsKK30KKworCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9idWRkeV9jb25maWdfZXhwb3J0KHBqc3VhX2J1ZGR5X2NvbmZpZyAqY2ZnLAorCQkJCQkgICAgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnICpvYmopCit7CisgICAgY2ZnLT51cmkgPSBQeVN0cmluZ19Ub1BKKG9iai0+dXJpKTsKKyAgICBjZmctPnN1YnNjcmliZSA9IG9iai0+c3Vic2NyaWJlOworICAgIGNmZy0+dXNlcl9kYXRhID0gTlVMTDsKK30KKworCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX25ldworICogY29uc3RydWN0b3IgZm9yIGJ1ZGR5X2NvbmZpZyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICpQeU9ial9wanN1YV9idWRkeV9jb25maWdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgICAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9idWRkeV9jb25maWcgKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+dXJpID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19tZW1iZXJzW10gPQoreworICAgIAorICAgIHsKKyAgICAgICAgInVyaSIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9jb25maWcsIHVyaSksIDAsCisgICAgICAgICJUQnVkZHkgVVJMIG9yIG5hbWUgYWRkcmVzcy4iICAgICAgICAKKyAgICB9LAorICAgIAorICAgIHsKKyAgICAgICAgInN1YnNjcmliZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnLCBzdWJzY3JpYmUpLCAwLAorICAgICAgICAiU3BlY2lmeSB3aGV0aGVyIHByZXNlbmNlIHN1YnNjcmlwdGlvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuICIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV9idWRkeV9jb25maWcKKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9idWRkeV9jb25maWcgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLkJ1ZGR5X0NvbmZpZyIsICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9idWRkeV9jb25maWcpLC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKVB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiQnVkZHkgY29uZmlnIiwJCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2NvbmZpZ19tZW1iZXJzLC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlPYmpfcGpzdWFfYnVkZHlfY29uZmlnX25ldywgICAvKiB0cF9uZXcgKi8KKworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogUHlPYmpfcGpzdWFfYnVkZHlfaW5mbworICogQnVkZHkgSW5mbworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICBpbnQJCSBpZDsKKyAgICBQeU9iamVjdAkqdXJpOworICAgIFB5T2JqZWN0CSpjb250YWN0OworICAgIGludAkJIHN0YXR1czsKKyAgICBQeU9iamVjdAkqc3RhdHVzX3RleHQ7CisgICAgaW50CQkgbW9uaXRvcl9wcmVzOworICAgIGludAkJIGFjdGl2aXR5OworICAgIGludAkJIHN1Yl9zdGF0ZTsKKyAgICBQeU9iamVjdAkqc3ViX3Rlcm1fcmVhc29uOworfSBQeU9ial9wanN1YV9idWRkeV9pbmZvOworCisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9pbmZvX2RlbGV0ZQorICogZGVsZXRlcyBhIGJ1ZGR5X2luZm8gZnJvbSBtZW1vcnkKKyAqICFtb2RpZmllZCBAIDA3MTIwNgorICovCitzdGF0aWMgdm9pZCBQeU9ial9wanN1YV9idWRkeV9pbmZvX2RlbGV0ZShQeU9ial9wanN1YV9idWRkeV9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+dXJpKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNvbnRhY3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhdHVzX3RleHQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3ViX3Rlcm1fcmVhc29uKTsKKyAgICAKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19pbXBvcnQoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbyAqb2JqLAorCQkJCQkgIGNvbnN0IHBqc3VhX2J1ZGR5X2luZm8gKmluZm8pCit7CisgICAgb2JqLT5pZCA9IGluZm8tPmlkOworICAgIFB5X1hERUNSRUYob2JqLT51cmkpOworICAgIG9iai0+dXJpID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLT51cmkpOworICAgIFB5X1hERUNSRUYob2JqLT5jb250YWN0KTsKKyAgICBvYmotPmNvbnRhY3QgPSBQeVN0cmluZ19Gcm9tUEooJmluZm8tPmNvbnRhY3QpOworICAgIG9iai0+c3RhdHVzID0gaW5mby0+c3RhdHVzOworICAgIFB5X1hERUNSRUYob2JqLT5zdGF0dXNfdGV4dCk7CisgICAgb2JqLT5zdGF0dXNfdGV4dCA9IFB5U3RyaW5nX0Zyb21QSigmaW5mby0+c3RhdHVzX3RleHQpOworICAgIG9iai0+bW9uaXRvcl9wcmVzID0gaW5mby0+bW9uaXRvcl9wcmVzOworICAgIG9iai0+YWN0aXZpdHkgPSBpbmZvLT5ycGlkLmFjdGl2aXR5OworICAgIG9iai0+c3ViX3N0YXRlID0gaW5mby0+c3ViX3N0YXRlOworICAgIFB5X1hERUNSRUYob2JqLT5zdWJfdGVybV9yZWFzb24pOworICAgIG9iai0+c3ViX3Rlcm1fcmVhc29uID0gUHlTdHJpbmdfRnJvbVBKKCZpbmZvLT5zdWJfdGVybV9yZWFzb24pOworfQorCisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9pbmZvX25ldworICogY29uc3RydWN0b3IgZm9yIGJ1ZGR5X2luZm8gb2JqZWN0CisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIFB5T2JqZWN0ICogUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICAgICBQeU9iamVjdCAqYXJncywKKwkJCQkJICAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9idWRkeV9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9idWRkeV9pbmZvICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT51cmkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5jb250YWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJc2VsZi0+c3RhdHVzX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5zdWJfdGVybV9yZWFzb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qCisgKiBQeU9ial9wanN1YV9idWRkeV9pbmZvX21lbWJlcnMKKyAqICFtb2RpZmllZCBAIDA3MTIwNgorICovCitzdGF0aWMgUHlNZW1iZXJEZWYgUHlPYmpfcGpzdWFfYnVkZHlfaW5mb19tZW1iZXJzW10gPQoreworICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBpZCksIDAsCisgICAgICAgICJUaGUgYnVkZHkgSUQuIgorICAgIH0sCisgICAgeworICAgICAgICAidXJpIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm8sIHVyaSksIDAsCisgICAgICAgICJUaGUgZnVsbCBVUkkgb2YgdGhlIGJ1ZGR5LCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uICIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAiY29udGFjdCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBjb250YWN0KSwgMCwKKyAgICAgICAgIkJ1ZGR5J3MgQ29udGFjdCwgb25seSBhdmFpbGFibGUgd2hlbiBwcmVzZW5jZSBzdWJzY3JpcHRpb24gIgorICAgICAgICAiaGFzIGJlZW4gZXN0YWJsaXNoZWQgdG8gdGhlIGJ1ZGR5LiIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAic3RhdHVzIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBzdGF0dXMpLCAwLAorICAgICAgICAiQnVkZHkncyBvbmxpbmUgc3RhdHVzLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0dXNfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBzdGF0dXNfdGV4dCksIDAsCisgICAgICAgICJUZXh0IHRvIGRlc2NyaWJlIGJ1ZGR5J3Mgb25saW5lIHN0YXR1cy4iICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1vbml0b3JfcHJlcyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbywgbW9uaXRvcl9wcmVzKSwgMCwKKyAgICAgICAgIkZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgbW9uaXRvciB0aGUgcHJlc2VuY2UgaW5mb3JtYXRpb24gIgorICAgICAgICAiZm9yIHRoaXMgYnVkZHkgKG5vcm1hbGx5IHllcywgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQpLiAiCisgICAgfSwKKyAgICB7CisgICAgICAgICJhY3Rpdml0eSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbywgYWN0aXZpdHkpLCAwLAorICAgICAgICAiQWN0aXZpdHkgdHlwZS4gIgorICAgIH0sCisgICAgeworICAgICAgICAic3ViX3N0YXRlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9idWRkeV9pbmZvLCBzdWJfc3RhdGUpLCAwLAorICAgICAgICAiU3Vic2NyaXB0aW9uIHN0YXRlLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInN1Yl90ZXJtX3JlYXNvbiIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfYnVkZHlfaW5mbywgc3ViX3Rlcm1fcmVhc29uKSwgMCwKKyAgICAgICAgIlN1YnNjcmlwdGlvbiB0ZXJtaW5hdGlvbiByZWFzb24uIgorICAgIH0sCisgICAgCisgICAgCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX2J1ZGR5X2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wanN1YV9idWRkeV9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9wanN1YS5CdWRkeV9JbmZvIiwJICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm8pLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9ial9wanN1YV9idWRkeV9pbmZvX2RlbGV0ZSwvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJCdWRkeSBJbmZvIG9iamVjdCIsCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFB5T2JqX3Bqc3VhX2J1ZGR5X2luZm9fbWVtYmVycywgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeU9ial9wanN1YV9idWRkeV9pbmZvX25ldywgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogUHlPYmpfcGpzdWFfY29kZWNfaW5mbworICogQ29kZWMgSW5mbworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICAKKyAgICBQeU9iamVjdCAqIGNvZGVjX2lkOworICAgIHBqX3VpbnQ4X3QgcHJpb3JpdHk7ICAgIAorfSBQeU9ial9wanN1YV9jb2RlY19pbmZvOworCisKKy8qCisgKiBjb2RlY19pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBjb2RlY19pbmZvIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIGNvZGVjX2luZm9fZGVhbGxvYyhQeU9ial9wanN1YV9jb2RlY19pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29kZWNfaWQpOyAgICAKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworLyoKKyAqIGNvZGVjX2luZm9fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgY29kZWNfaW5mbyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogY29kZWNfaW5mb19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8gKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmNvZGVjX2lkID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogY29kZWNfaW5mb19tZW1iZXJzCisgKiAhbW9kaWZpZWQgQCAwNzEyMDYKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGNvZGVjX2luZm9fbWVtYmVyc1tdID0KK3sgICAgCisgICAgeworICAgICAgICAiY29kZWNfaWQiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29kZWNfaW5mbywgY29kZWNfaWQpLCAwLAorICAgICAgICAiQ29kZWMgdW5pcXVlIGlkZW50aWZpY2F0aW9uLiIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAicHJpb3JpdHkiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NvZGVjX2luZm8sIHByaW9yaXR5KSwgMCwKKyAgICAgICAgIkNvZGVjIHByaW9yaXR5IChpbnRlZ2VyIDAtMjU1KS4iCisgICAgfSwKKworICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKy8qCisgKiBQeVR5cF9wanN1YV9jb2RlY19pbmZvCisgKi8KK3N0YXRpYyBQeVR5cGVPYmplY3QgUHlUeXBfcGpzdWFfY29kZWNfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuQ29kZWNfSW5mbyIsCSAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9jb2RlY19pbmZvKSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpY29kZWNfaW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDb2RlYyBJbmZvIiwJCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvZGVjX2luZm9fbWVtYmVycywJCSAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvZGVjX2luZm9fbmV3LAkJICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8KKyAqIENvbmYgUG9ydCBJbmZvCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovIAorICAgIAorICAgIGludAkJIHNsb3RfaWQ7CisgICAgUHlPYmplY3QJKm5hbWU7CisgICAgdW5zaWduZWQJIGNsb2NrX3JhdGU7CisgICAgdW5zaWduZWQJIGNoYW5uZWxfY291bnQ7CisgICAgdW5zaWduZWQJIHNhbXBsZXNfcGVyX2ZyYW1lOworICAgIHVuc2lnbmVkCSBiaXRzX3Blcl9zYW1wbGU7CisgICAgUHlPYmplY3QJKmxpc3RlbmVyczsKKworfSBQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbzsKKworCisvKgorICogY29uZl9wb3J0X2luZm9fZGVhbGxvYworICogZGVsZXRlcyBhIGNvbmZfcG9ydF9pbmZvIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIGNvbmZfcG9ydF9pbmZvX2RlYWxsb2MoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8qIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5uYW1lKTsgICAgCisgICAgUHlfWERFQ1JFRihzZWxmLT5saXN0ZW5lcnMpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworCisvKgorICogY29uZl9wb3J0X2luZm9fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgY29uZl9wb3J0X2luZm8gb2JqZWN0CisgKi8KK3N0YXRpYyBQeU9iamVjdCAqIGNvbmZfcG9ydF9pbmZvX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqX3Bqc3VhX2NvbmZfcG9ydF9pbmZvICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPmxpc3RlbmVycyA9IFB5TGlzdF9OZXcoMCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogY29uZl9wb3J0X2luZm9fbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgY29uZl9wb3J0X2luZm9fbWVtYmVyc1tdID0KK3sgICAKKyAgICB7CisgICAgICAgICJzbG90X2lkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbywgc2xvdF9pZCksIDAsCisgICAgICAgICJDb25mZXJlbmNlIHBvcnQgbnVtYmVyLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm5hbWUiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIG5hbWUpLCAwLAorICAgICAgICAiUG9ydCBuYW1lIiAgICAgICAgCisgICAgfSwKKyAgICB7CisgICAgICAgICJjbG9ja19yYXRlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbywgY2xvY2tfcmF0ZSksIDAsCisgICAgICAgICJDbG9jayByYXRlIgorICAgIH0sCisgICAgeworICAgICAgICAiY2hhbm5lbF9jb3VudCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY29uZl9wb3J0X2luZm8sIGNoYW5uZWxfY291bnQpLCAwLAorICAgICAgICAiTnVtYmVyIG9mIGNoYW5uZWxzLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInNhbXBsZXNfcGVyX2ZyYW1lIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbywgc2FtcGxlc19wZXJfZnJhbWUpLCAwLAorICAgICAgICAiU2FtcGxlcyBwZXIgZnJhbWUgIgorICAgIH0sCisgICAgeworICAgICAgICAiYml0c19wZXJfc2FtcGxlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbywgYml0c19wZXJfc2FtcGxlKSwgMCwKKyAgICAgICAgIkJpdHMgcGVyIHNhbXBsZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImxpc3RlbmVycyIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbywgbGlzdGVuZXJzKSwgMCwKKyAgICAgICAgIkFycmF5IG9mIGxpc3RlbmVycyAoaW4gb3RoZXIgd29yZHMsIHBvcnRzIHdoZXJlIHRoaXMgcG9ydCAiCisJImlzIHRyYW5zbWl0dGluZyB0byIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworCisKKy8qCisgKiBQeVR5cF9wanN1YV9jb25mX3BvcnRfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2NvbmZfcG9ydF9pbmZvID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9wanN1YS5Db25mX1BvcnRfSW5mbyIsCSAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9jb25mX3BvcnRfaW5mbyksICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3Rvciljb25mX3BvcnRfaW5mb19kZWFsbG9jLC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIkNvbmYgUG9ydCBJbmZvIG9iamVjdHMiLCAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvbmZfcG9ydF9pbmZvX21lbWJlcnMsICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjb25mX3BvcnRfaW5mb19uZXcsICAgICAgICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvCisgKiBQSk1lZGlhIFNuZCBEZXYgSW5mbworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICAgICAgCisgICAgdW5zaWduZWQgIGlucHV0X2NvdW50OworICAgIHVuc2lnbmVkICBvdXRwdXRfY291bnQ7CisgICAgdW5zaWduZWQgIGRlZmF1bHRfc2FtcGxlc19wZXJfc2VjOyAgICAKKyAgICBQeU9iamVjdCAqbmFtZTsKKworfSBQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbzsKKworLyoKKyAqIHBqbWVkaWFfc25kX2Rldl9pbmZvX2RlYWxsb2MKKyAqIGRlbGV0ZXMgYSBwam1lZGlhX3NuZF9kZXZfaW5mbyBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBwam1lZGlhX3NuZF9kZXZfaW5mb19kZWFsbG9jKFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvKiBzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+bmFtZSk7ICAgICAgICAKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKy8qCisgKiBwam1lZGlhX3NuZF9kZXZfaW5mb19uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBwam1lZGlhX3NuZF9kZXZfaW5mbyBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogcGptZWRpYV9zbmRfZGV2X2luZm9fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgCisJCQkJCSAgIFB5T2JqZWN0ICphcmdzLAorCQkJCQkgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wam1lZGlhX3NuZF9kZXZfaW5mbyAqc2VsZjsKKworICAgIFBKX1VOVVNFRF9BUkcoYXJncyk7CisgICAgUEpfVU5VU0VEX0FSRyhrd2RzKTsKKworICAgIHNlbGYgPSAoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8gKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsJCisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogcGptZWRpYV9zbmRfZGV2X2luZm9fbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgcGptZWRpYV9zbmRfZGV2X2luZm9fbWVtYmVyc1tdID0KK3sKKyAgICB7CisgICAgICAgICJpbnB1dF9jb3VudCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8sIGlucHV0X2NvdW50KSwgMCwKKyAgICAgICAgIk1heCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMiCisgICAgfSwKKyAgICB7CisgICAgICAgICJvdXRwdXRfY291bnQiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvLCBvdXRwdXRfY291bnQpLCAwLAorICAgICAgICAiTWF4IG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMiCisgICAgfSwKKyAgICB7CisgICAgICAgICJkZWZhdWx0X3NhbXBsZXNfcGVyX3NlYyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8sIGRlZmF1bHRfc2FtcGxlc19wZXJfc2VjKSwgMCwKKyAgICAgICAgIkRlZmF1bHQgc2FtcGxpbmcgcmF0ZS4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJuYW1lIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfc25kX2Rldl9pbmZvLCBuYW1lKSwgMCwKKyAgICAgICAgIkRldmljZSBuYW1lIiAgICAgICAgCisgICAgfSwKKyAgICAgICAgCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisvKgorICogUHlUeXBfcGptZWRpYV9zbmRfZGV2X2luZm8KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wam1lZGlhX3NuZF9kZXZfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuUEpNZWRpYV9TbmRfRGV2X0luZm8iLCAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlPYmpfcGptZWRpYV9zbmRfZGV2X2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpcGptZWRpYV9zbmRfZGV2X2luZm9fZGVhbGxvYywvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJQSk1lZGlhIFNuZCBEZXYgSW5mbyBvYmplY3QiLCAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBwam1lZGlhX3NuZF9kZXZfaW5mb19tZW1iZXJzLCAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgcGptZWRpYV9zbmRfZGV2X2luZm9fbmV3LCAgICAgICAvKiB0cF9uZXcgKi8KKworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8KKyAqIFBKTWVkaWEgQ29kZWMgUGFyYW0gSW5mbworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICAKKyAgICB1bnNpZ25lZAljbG9ja19yYXRlOworICAgIHVuc2lnbmVkCWNoYW5uZWxfY250OworICAgIHBqX3VpbnQzMl90IGF2Z19icHM7CisgICAgcGpfdWludDE2X3QgZnJtX3B0aW1lOworICAgIHBqX3VpbnQ4X3QgIHBjbV9iaXRzX3Blcl9zYW1wbGU7CisgICAgcGpfdWludDhfdCAgcHQ7CQorCit9IFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbzsKKworCisKKy8qCisgKiBwam1lZGlhX2NvZGVjX3BhcmFtX2luZm9fbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAiY2xvY2tfcmF0ZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBjbG9ja19yYXRlKSwgMCwKKyAgICAgICAgIlNhbXBsaW5nIHJhdGUgaW4gSHoiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjaGFubmVsX2NudCIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBjaGFubmVsX2NudCksIDAsCisgICAgICAgICJDaGFubmVsIGNvdW50IgorICAgIH0sCisgICAgeworICAgICAgICAiYXZnX2JwcyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBhdmdfYnBzKSwgMCwKKyAgICAgICAgIkF2ZXJhZ2UgYmFuZHdpZHRoIGluIGJpdHMvc2VjIgorICAgIH0sCisgICAgeworICAgICAgICAiZnJtX3B0aW1lIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8sIGZybV9wdGltZSksIDAsCisgICAgICAgICJCYXNlIGZyYW1lIHB0aW1lIGluIG1zZWMuIgorICAgIH0sCisgICAgeworICAgICAgICAicGNtX2JpdHNfcGVyX3NhbXBsZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9pbmZvLCBwY21fYml0c19wZXJfc2FtcGxlKSwgMCwKKyAgICAgICAgIkJpdHMvc2FtcGxlIGluIHRoZSBQQ00gc2lkZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInB0IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8sIHB0KSwgMCwKKyAgICAgICAgIlBheWxvYWQgdHlwZSIKKyAgICB9LAorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworLyoKKyAqIFB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbV9JbmZvIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwJCQkJICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIlBKTWVkaWEgQ29kZWMgUGFyYW0gSW5mbyBvYmplY3RzIiwvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW1faW5mb19tZW1iZXJzLC8qIHRwX21lbWJlcnMgKi8KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcKKyAqIFBKTWVkaWEgQ29kZWMgUGFyYW0gU2V0dGluZworICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLyAKKyAgICBwal91aW50OF90ICBmcm1fcGVyX3BrdDsgCisgICAgdW5zaWduZWQgICAgdmFkOworICAgIHVuc2lnbmVkICAgIGNuZzsKKyAgICB1bnNpZ25lZCAgICBwZW5oOworICAgIHVuc2lnbmVkICAgIHBsYzsKKyNpZiAwCisgICAgcGpfdWludDhfdCAgZW5jX2ZtdHBfbW9kZTsKKyAgICBwal91aW50OF90ICBkZWNfZm10cF9tb2RlOyAKKyNlbmRpZgorCit9IFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZzsKKworCisKKy8qCisgKiBwam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmdfbWVtYmVycworICovCitzdGF0aWMgUHlNZW1iZXJEZWYgcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAiZnJtX3Blcl9wa3QiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZywgZnJtX3Blcl9wa3QpLCAwLAorICAgICAgICAiTnVtYmVyIG9mIGZyYW1lcyBwZXIgcGFja2V0IgorICAgIH0sCisgICAgeworICAgICAgICAidmFkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIHZhZCksIDAsCisgICAgICAgICJWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciIKKyAgICB9LAorICAgIHsKKyAgICAgICAgImNuZyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLCBjbmcpLCAwLAorICAgICAgICAiQ29tZm9ydCBOb2lzZSBHZW5lcmF0b3IiCisgICAgfSwKKyAgICB7CisgICAgICAgICJwZW5oIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIHBlbmgpLCAwLAorICAgICAgICAiUGVyY2VwdHVhbCBFbmhhbmNlbWVudCIKKyAgICB9LAorICAgIHsKKyAgICAgICAgInBsYyIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nLCBwbGMpLCAwLAorICAgICAgICAiUGFja2V0IGxvc3MgY29uY2VhbG1lbnQiCisgICAgfSwKKyNpZiAwCS8vIG5vIGxvbmdlciB2YWxpZCB3aXRoIGxhdGVzdCBtb2RpZmljYXRpb24gaW4gY29kZWMKKyAgICB7CisgICAgICAgICJlbmNfZm10cF9tb2RlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIGVuY19mbXRwX21vZGUpLCAwLAorICAgICAgICAiTW9kZSBwYXJhbSBpbiBmbXRwIChkZWY6MCkiCisgICAgfSwKKyAgICB7CisgICAgICAgICJkZWNfZm10cF9tb2RlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcsIGRlY19mbXRwX21vZGUpLCAwLAorICAgICAgICAiTW9kZSBwYXJhbSBpbiBmbXRwIChkZWY6MCkiCisgICAgfSwKKyNlbmRpZgorICAgIAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworLyoKKyAqIFB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuUEpNZWRpYV9Db2RlY19QYXJhbV9TZXR0aW5nIiwvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtX3NldHRpbmcpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgMCwJCQkJICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgIlBKTWVkaWEgQ29kZWMgUGFyYW0gU2V0dGluZyIsICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZ19tZW1iZXJzLC8qIHRwX21lbWJlcnMgKi8KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8qCisgKiBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtCisgKiBQSk1lZGlhIENvZGVjIFBhcmFtCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovIAorICAgIAorICAgIFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbyAqIGluZm87CisgICAgUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbV9zZXR0aW5nICogc2V0dGluZzsKKworfSBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtOworCisvKgorICogcGptZWRpYV9jb2RlY19wYXJhbV9kZWFsbG9jCisgKiBkZWxldGVzIGEgcGptZWRpYV9jb2RlY19wYXJhbSBmcm9tIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBwam1lZGlhX2NvZGVjX3BhcmFtX2RlYWxsb2MoUHlPYmpfcGptZWRpYV9jb2RlY19wYXJhbSogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmluZm8pOyAgICAgICAgCisgICAgUHlfWERFQ1JFRihzZWxmLT5zZXR0aW5nKTsgICAgICAgIAorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworLyoKKyAqIHBqbWVkaWFfY29kZWNfcGFyYW1fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgcGptZWRpYV9jb2RlY19wYXJhbSBvYmplY3QKKyAqLworc3RhdGljIFB5T2JqZWN0ICogcGptZWRpYV9jb2RlY19wYXJhbV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCAKKwkJCQkJICBQeU9iamVjdCAqYXJncywKKwkJCQkJICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5pbmZvID0gKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1faW5mbyAqKQorCQkgICAgIFB5VHlwZV9HZW5lcmljTmV3KCZQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtX2luZm8sIAorCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKwlzZWxmLT5zZXR0aW5nID0gKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZyAqKQorCQkJUHlUeXBlX0dlbmVyaWNOZXcoJlB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW1fc2V0dGluZywKKwkJCQkJICBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qCisgKiBwam1lZGlhX2NvZGVjX3BhcmFtX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIHBqbWVkaWFfY29kZWNfcGFyYW1fbWVtYmVyc1tdID0KK3sgICAKKyAgICAKKyAgICB7CisgICAgICAgICJpbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3BqbWVkaWFfY29kZWNfcGFyYW0sIGluZm8pLCAwLAorICAgICAgICAiVGhlICdpbmZvJyBwYXJ0IG9mIGNvZGVjIHBhcmFtIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgY29kZWMsIgorICAgICAgICAiIGFuZCB0aGUgdmFsdWUgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkIGJ5IGFwcGxpY2F0aW9uLiIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAic2V0dGluZyIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtLCBzZXR0aW5nKSwgMCwgCisgICAgICAgICJUaGUgJ3NldHRpbmcnIHBhcnQgb2YgY29kZWMgcGFyYW0gZGVzY3JpYmVzIHZhcmlvdXMgc2V0dGluZ3MgdG8gYmUgIgorICAgICAgICAiYXBwbGllZCB0byB0aGUgY29kZWMuIFdoZW4gdGhlIGNvZGVjIHBhcmFtIGlzIHJldHJpZXZlZCBmcm9tIHRoZSAiCisgICAgICAgICJjb2RlYyBvciBjb2RlYyBmYWN0b3J5LCB0aGUgdmFsdWVzIG9mIHRoZXNlIHdpbGwgYmUgZmlsbGVkIGJ5ICIKKyAgICAgICAgInRoZSBjYXBhYmlsaXR5IG9mIHRoZSBjb2RlYy4gQW55IGZlYXR1cmVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSAiCisgICAgICAgICJ0aGUgY29kZWMgKGUuZy4gdmFkIG9yIHBsYykgd2lsbCBiZSB0dXJuZWQgb24sIHNvIHRoYXQgYXBwbGljYXRpb24gIgorICAgICAgICAiY2FuIHF1ZXJ5IHdoaWNoIGNhcGFiaWxpdGllcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYy4gIgorICAgICAgICAiQXBwbGljYXRpb24gbWF5IGNoYW5nZSB0aGUgc2V0dGluZ3MgaGVyZSBiZWZvcmUgaW5zdGFudGlhdGluZyAiCisgICAgICAgICJ0aGUgY29kZWMvc3RyZWFtLiIgICAgICAgIAorICAgIH0sCisgICAgCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworLyoKKyAqIFB5VHlwX3BqbWVkaWFfY29kZWNfcGFyYW0KKyAqLworc3RhdGljIFB5VHlwZU9iamVjdCBQeVR5cF9wam1lZGlhX2NvZGVjX3BhcmFtID0KK3sKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIl9wanN1YS5QSk1lZGlhX0NvZGVjX1BhcmFtIiwgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wam1lZGlhX2NvZGVjX3BhcmFtKSwvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3Rvcilwam1lZGlhX2NvZGVjX3BhcmFtX2RlYWxsb2MsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiUEpNZWRpYSBDb2RlYyBQYXJhbSIsCSAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW1fbWVtYmVycywgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBwam1lZGlhX2NvZGVjX3BhcmFtX25ldywgICAgICAgIC8qIHRwX25ldyAqLworCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIFB5T2JqX3Bqc3VhX2NhbGxfaW5mbworICogQ2FsbCBJbmZvCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIC8qIFR5cGUtc3BlY2lmaWMgZmllbGRzIGdvIGhlcmUuICovIAorICAgIAorICAgIGludAkJIGlkOworICAgIGludAkJIHJvbGU7CisgICAgaW50CQkgYWNjX2lkOworICAgIFB5T2JqZWN0CSpsb2NhbF9pbmZvOworICAgIFB5T2JqZWN0CSpsb2NhbF9jb250YWN0OworICAgIFB5T2JqZWN0CSpyZW1vdGVfaW5mbzsKKyAgICBQeU9iamVjdAkqcmVtb3RlX2NvbnRhY3Q7CisgICAgUHlPYmplY3QJKmNhbGxfaWQ7CisgICAgaW50CQkgc3RhdGU7CisgICAgUHlPYmplY3QJKnN0YXRlX3RleHQ7CisgICAgaW50CQkgbGFzdF9zdGF0dXM7CisgICAgUHlPYmplY3QJKmxhc3Rfc3RhdHVzX3RleHQ7CisgICAgaW50CQkgbWVkaWFfc3RhdHVzOworICAgIGludAkJIG1lZGlhX2RpcjsKKyAgICBpbnQJCSBjb25mX3Nsb3Q7CisgICAgaW50CQkgY29ubmVjdF9kdXJhdGlvbjsKKyAgICBpbnQJCSB0b3RhbF9kdXJhdGlvbjsKKworfSBQeU9ial9wanN1YV9jYWxsX2luZm87CisKKworLyoKKyAqIGNhbGxfaW5mb19kZWFsbG9jCisgKiBkZWxldGVzIGEgY2FsbF9pbmZvIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIGNhbGxfaW5mb19kZWFsbG9jKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbyogc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmxvY2FsX2luZm8pOworICAgIFB5X1hERUNSRUYoc2VsZi0+bG9jYWxfY29udGFjdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yZW1vdGVfaW5mbyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yZW1vdGVfY29udGFjdCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jYWxsX2lkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlX3RleHQpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdGF0dXNfdGV4dCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworfQorCisKKy8qCisgKiBjYWxsX2luZm9fbmV3CisgKiBjb25zdHJ1Y3RvciBmb3IgY2FsbF9pbmZvIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBjYWxsX2luZm9fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9ial9wanN1YV9jYWxsX2luZm8gKnNlbGY7CisKKyAgICBQSl9VTlVTRURfQVJHKGFyZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoa3dkcyk7CisKKyAgICBzZWxmID0gKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbyAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+bG9jYWxfaW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPmxvY2FsX2NvbnRhY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5yZW1vdGVfaW5mbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPnJlbW90ZV9jb250YWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJc2VsZi0+Y2FsbF9pZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworCXNlbGYtPnN0YXRlX3RleHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKwlzZWxmLT5sYXN0X3N0YXR1c190ZXh0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCisvKgorICogY2FsbF9pbmZvX21lbWJlcnMKKyAqLworc3RhdGljIFB5TWVtYmVyRGVmIGNhbGxfaW5mb19tZW1iZXJzW10gPQoreyAgIAorICAgIHsKKyAgICAgICAgImlkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGlkKSwgMCwKKyAgICAgICAgIkNhbGwgaWRlbnRpZmljYXRpb24iCisgICAgfSwKKyAgICB7CisgICAgICAgICJyb2xlIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHJvbGUpLCAwLAorICAgICAgICAiSW5pdGlhbCBjYWxsIHJvbGUgKFVBQyA9PSBjYWxsZXIpIgorICAgIH0sCisgICAgeworICAgICAgICAiYWNjX2lkIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGFjY19pZCksIDAsCisgICAgICAgICJUaGUgYWNjb3VudCBJRCB3aGVyZSB0aGlzIGNhbGwgYmVsb25ncy4iCisgICAgfSwKKyAgICB7CisgICAgICAgICJsb2NhbF9pbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbG9jYWxfaW5mbyksIDAsCisgICAgICAgICJMb2NhbCBVUkkiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgImxvY2FsX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBsb2NhbF9jb250YWN0KSwgMCwKKyAgICAgICAgIkxvY2FsIENvbnRhY3QiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgInJlbW90ZV9pbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgcmVtb3RlX2luZm8pLCAwLAorICAgICAgICAiUmVtb3RlIFVSSSIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAicmVtb3RlX2NvbnRhY3QiLCBUX09CSkVDVF9FWCwKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCByZW1vdGVfY29udGFjdCksIDAsCisgICAgICAgICJSZW1vdGUgQ29udGFjdCIgICAgICAgIAorICAgIH0sCisgICAgeworICAgICAgICAiY2FsbF9pZCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGNhbGxfaWQpLCAwLAorICAgICAgICAiRGlhbG9nIENhbGwtSUQgc3RyaW5nIiAgICAgICAgCisgICAgfSwKKyAgICB7CisgICAgICAgICJzdGF0ZSIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBzdGF0ZSksIDAsCisgICAgICAgICJDYWxsIHN0YXRlIgorICAgIH0sCisgICAgeworICAgICAgICAic3RhdGVfdGV4dCIsIFRfT0JKRUNUX0VYLAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHN0YXRlX3RleHQpLCAwLAorICAgICAgICAiVGV4dCBkZXNjcmliaW5nIHRoZSBzdGF0ZSAiICAgICAgICAKKyAgICB9LAorICAgIHsKKyAgICAgICAgImxhc3Rfc3RhdHVzIiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGxhc3Rfc3RhdHVzKSwgMCwKKyAgICAgICAgIkxhc3Qgc3RhdHVzIGNvZGUgaGVhcmQsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGNhdXNlIGNvZGUiCisgICAgfSwKKyAgICB7CisgICAgICAgICJsYXN0X3N0YXR1c190ZXh0IiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbGFzdF9zdGF0dXNfdGV4dCksIDAsCisgICAgICAgICJUaGUgcmVhc29uIHBocmFzZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMuIiAgICAgICAgCisgICAgfSwKKyAgICB7CisgICAgICAgICJtZWRpYV9zdGF0dXMiLCBUX0lOVCwgCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgbWVkaWFfc3RhdHVzKSwgMCwKKyAgICAgICAgIkNhbGwgbWVkaWEgc3RhdHVzLiIKKyAgICB9LAorICAgIHsKKyAgICAgICAgIm1lZGlhX2RpciIsIFRfSU5ULCAKKyAgICAgICAgb2Zmc2V0b2YoUHlPYmpfcGpzdWFfY2FsbF9pbmZvLCBtZWRpYV9kaXIpLCAwLAorICAgICAgICAiTWVkaWEgZGlyZWN0aW9uIgorICAgIH0sCisgICAgeworICAgICAgICAiY29uZl9zbG90IiwgVF9JTlQsIAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIGNvbmZfc2xvdCksIDAsCisgICAgICAgICJUaGUgY29uZmVyZW5jZSBwb3J0IG51bWJlciBmb3IgdGhlIGNhbGwiCisgICAgfSwKKyAgICB7CisgICAgICAgICJjb25uZWN0X2R1cmF0aW9uIiwgVF9JTlQsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc3VhX2NhbGxfaW5mbywgY29ubmVjdF9kdXJhdGlvbiksIDAsCisgICAgICAgICJVcC10by1kYXRlIGNhbGwgY29ubmVjdGVkIGR1cmF0aW9uKHplcm8gd2hlbiBjYWxsIGlzIG5vdCBlc3RhYmxpc2hlZCkiCisgICAgfSwKKyAgICB7CisgICAgICAgICJ0b3RhbF9kdXJhdGlvbiIsIFRfSU5ULAorICAgICAgICBvZmZzZXRvZihQeU9ial9wanN1YV9jYWxsX2luZm8sIHRvdGFsX2R1cmF0aW9uKSwgMCwKKyAgICAgICAgIlRvdGFsIGNhbGwgZHVyYXRpb24sIGluY2x1ZGluZyBzZXQtdXAgdGltZSIgICAgICAgIAorICAgIH0sCisgICAgCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCisKKworLyoKKyAqIFB5VHlwX3Bqc3VhX2NhbGxfaW5mbworICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc3VhX2NhbGxfaW5mbyA9Cit7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJfcGpzdWEuQ2FsbF9JbmZvIiwJCSAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeU9ial9wanN1YV9jYWxsX2luZm8pLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpY2FsbF9pbmZvX2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgICJDYWxsIEluZm8iLAkJICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY2FsbF9pbmZvX21lbWJlcnMsCQkgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjYWxsX2luZm9fbmV3LAkJICAgIC8qIHRwX25ldyAqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIFB5T2JqX3Bqc2lwX3J4X2RhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisKKyAgICAvKiBUeXBlLXNwZWNpZmljIGZpZWxkcyBnbyBoZXJlLiAqLworICAgIFB5T2JqZWN0ICptc2dfaW5mb19idWZmZXI7ICAvLyBzdHJpbmcKKyAgICBQeU9iamVjdCAqbXNnX2luZm9faW5mbzsJLy8gc3RyaW5nCisKK30gUHlPYmpfcGpzaXBfcnhfZGF0YTsKKworLyoKKyAqIFB5T2JqX3Bqc2lwX3J4X2RhdGFfZGVhbGxvYworICogZGVsZXRlcyByeF9kYXRhIGZyb20gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIFB5T2JqX3Bqc2lwX3J4X2RhdGFfZGVsZXRlKFB5T2JqX3Bqc2lwX3J4X2RhdGEqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5tc2dfaW5mb19idWZmZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bXNnX2luZm9faW5mbyk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKKworc3RhdGljIHZvaWQgUHlPYmpfcGpzaXBfcnhfZGF0YV9pbXBvcnQoUHlPYmpfcGpzaXBfcnhfZGF0YSAqb2JqLCBwanNpcF9yeF9kYXRhICpyeF9kYXRhKQoreworICAgIFB5X1hERUNSRUYob2JqLT5tc2dfaW5mb19idWZmZXIpOworICAgIG9iai0+bXNnX2luZm9fYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhyeF9kYXRhLT5tc2dfaW5mby5tc2dfYnVmKTsKKyAgICBQeV9YREVDUkVGKG9iai0+bXNnX2luZm9faW5mbyk7CisgICAgb2JqLT5tc2dfaW5mb19pbmZvID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwanNpcF9yeF9kYXRhX2dldF9pbmZvKHJ4X2RhdGEpKTsKK30KKworCisvKgorICogUHlPYmpfcGpzaXBfcnhfZGF0YV9uZXcKKyAqIGNvbnN0cnVjdG9yIGZvciBQeU9ial9wanNpcF9yeF9kYXRhIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKiBQeU9ial9wanNpcF9yeF9kYXRhX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlQeU9ial9wanNpcF9yeF9kYXRhICpzZWxmOworCisgICAgUEpfVU5VU0VEX0FSRyhhcmdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGt3ZHMpOworCisgICAgc2VsZiA9IChQeU9ial9wanNpcF9yeF9kYXRhICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5tc2dfaW5mb19idWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgc2VsZi0+bXNnX2luZm9faW5mbyAgID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKworCisvKgorICogUHlPYmpfcGpzaXBfcnhfZGF0YV9tZW1iZXJzCisgKi8KK3N0YXRpYyBQeU1lbWJlckRlZiBQeU9ial9wanNpcF9yeF9kYXRhX21lbWJlcnNbXSA9Cit7CisgICAgeworICAgICAgICAibXNnX2luZm9fYnVmZmVyIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX3J4X2RhdGEsIG1zZ19pbmZvX2J1ZmZlciksIDAsCisgICAgICAgICJFbnRpcmUgU0lQLU1lc3NhZ2UiCisgICAgfSwKKyAgICB7CisgICAgICAgICJtc2dfaW5mb19pbmZvIiwgVF9PQkpFQ1RfRVgsCisgICAgICAgIG9mZnNldG9mKFB5T2JqX3Bqc2lwX3J4X2RhdGEsIG1zZ19pbmZvX2luZm8pLCAwLAorICAgICAgICAiTWVzc2FnZSBJbmZvIgorICAgIH0sCisKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisvKgorICogUHlUeXBfcGpzaXBfcnhfZGF0YQorICovCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5VHlwX3Bqc2lwX3J4X2RhdGEgPQoreworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3Bqc3VhLlBqc2lwX1J4X0RhdGEiLAkJCS8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5T2JqX3Bqc2lwX3J4X2RhdGEpLCAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpUHlPYmpfcGpzaXBfcnhfZGF0YV9kZWxldGUsLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICAiUEpTSVAgcmVxdWVzdCBkYXRhIGluZm9ybWF0aW9uIiwgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQeU9ial9wanNpcF9yeF9kYXRhX21lbWJlcnMsICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5T2JqX3Bqc2lwX3J4X2RhdGFfbmV3LCAgICAgIC8qIHRwX25ldyAqLworCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNlbmRpZgkvKiBfX1BZX1BKU1VBX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vaGVscGVyLm1hayBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9oZWxwZXIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZmRmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vaGVscGVyLm1hawpAQCAtMCwwICsxLDE3IEBACitpbmNsdWRlIC4uLy4uLy4uL2J1aWxkLm1haworCitsaWJfZGlyOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfTERGTEFHUylgOyBkbyBcCisJCWVjaG8gJCR0b2tlbiB8IGdyZXAgJ1wtTCcgfCBzZWQgJ3MvLUwvLyc7IFwKKwlkb25lCisKK2luY19kaXI6CisJQGZvciB0b2tlbiBpbiBgZWNobyAkKEFQUF9DRkxBR1MpYDsgZG8gXAorCQllY2hvICQkdG9rZW4gfCBncmVwICdcLUknIHwgc2VkICdzLy1JLy8nOyBcCisJZG9uZQorCitsaWJzOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfTERMSUJTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCAnXC1sJyB8IHNlZCAncy8tbC8vJzsgXAorCWRvbmUKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3Bqc3VhLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3Bqc3VhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2MyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vcGpzdWEucHkKQEAgLTAsMCArMSwyOTQ2IEBACisjICRJZDogcGpzdWEucHkgNDYxMSAyMDEzLTEwLTA4IDA0OjQ4OjExWiBiZW5ueWxwICQKKyMKKyMgT2JqZWN0IG9yaWVudGVkIFBKU1VBIHdyYXBwZXIuCisjCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorIworCisiIiJNdWx0aW1lZGlhIGNvbW11bmljYXRpb24gY2xpZW50IGxpYnJhcnkgYmFzZWQgb24gU0lQIHByb3RvY29sLgorCitUaGlzIGltcGxlbWVudHMgYSBmdWxseSBmZWF0dXJlZCBtdWx0aW1lZGlhIGNvbW11bmljYXRpb24gY2xpZW50IAorbGlicmFyeSBiYXNlZCBvbiBQSlNJUCBzdGFjayAoaHR0cDovL3d3dy5wanNpcC5vcmcpCisKKworMS4gRkVBVFVSRVMKKworICAtIFNlc3Npb24gSW5pdGlhdGlvbiBQcm90b2NvbCAoU0lQKSBmZWF0dXJlczoKKyAgICAgLSBCYXNpYyByZWdpc3RyYXRpb24gYW5kIGNhbGwKKyAgICAgLSBNdWx0aXBsZSBhY2NvdW50cworICAgICAtIENhbGwgaG9sZCwgYXR0ZW5kZWQgYW5kIHVuYXR0ZW5kZWQgY2FsbCB0cmFuc2ZlcgorICAgICAtIFByZXNlbmNlCisgICAgIC0gSW5zdGFudCBtZXNzYWdpbmcKKyAgICAgLSBNdWx0aXBsZSBTSVAgYWNjb3VudHMKKyAgLSBNZWRpYSBmZWF0dXJlczoKKyAgICAgLSBBdWRpbworICAgICAtIENvbmZlcmVuY2luZworICAgICAtIE5hcnJvd2JhbmQgYW5kIHdpZGViYW5kCisgICAgIC0gQ29kZWNzOiBQQ01BLCBQQ01VLCBHU00sIGlMQkMsIFNwZWV4LCBHLjcyMiwgTDE2CisgICAgIC0gUlRQL1JUQ1AKKyAgICAgLSBTZWN1cmUgUlRQIChTUlRQKQorICAgICAtIFdBViBwbGF5YmFjaywgcmVjb3JkaW5nLCBhbmQgcGxheWxpc3QKKyAgLSBOQVQgdHJhdmVyc2FsIGZlYXR1cmVzCisgICAgIC0gU3ltbWV0cmljIFJUUAorICAgICAtIFNUVU4KKyAgICAgLSBUVVJOCisgICAgIC0gSUNFCisgCisKKzIuIFVTSU5HCisKK1NlZSBodHRwOi8vd3d3LnBqc2lwLm9yZy90cmFjL3dpa2kvUHl0aG9uX1NJUF9UdXRvcmlhbCBmb3IgYSBtb3JlIHRob3JvdWdoCit0dXRvcmlhbC4gVGhlIHBhcmFncmFwaHMgYmVsb3cgZXhwbGFpbiBiYXNpYyB0YXNrcyBvbiB1c2luZyB0aGlzIG1vZHVsZS4KKworCisiIiIKK2ltcG9ydCBfcGpzdWEKK2ltcG9ydCB0aHJlYWQKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgdGltZQorCitjbGFzcyBFcnJvcjoKKyAgICAiIiJFcnJvciBleGNlcHRpb24gY2xhc3MuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBvcF9uYW1lICAtLSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCBnZW5lcmF0ZWQgdGhpcyBlcnJvci4KKyAgICBvYmogICAgICAtLSB0aGUgb2JqZWN0IHRoYXQgZ2VuZXJhdGVkIHRoaXMgZXJyb3IuCisgICAgZXJyX2NvZGUgLS0gdGhlIGVycm9yIGNvZGUuCisKKyAgICAiIiIKKyAgICBvcF9uYW1lID0gIiIKKyAgICBvYmogPSBOb25lCisgICAgZXJyX2NvZGUgPSAtMQorICAgIF9lcnJfbXNnID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcF9uYW1lLCBvYmosIGVycl9jb2RlLCBlcnJfbXNnPSIiKToKKyAgICAgICAgc2VsZi5vcF9uYW1lID0gb3BfbmFtZQorICAgICAgICBzZWxmLm9iaiA9IG9iagorICAgICAgICBzZWxmLmVycl9jb2RlID0gZXJyX2NvZGUKKyAgICAgICAgc2VsZi5fZXJyX21zZyA9IGVycl9tc2cKKworICAgIGRlZiBlcnJfbXNnKHNlbGYpOgorICAgICAgICAiUmV0cmlldmUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4iCisgICAgICAgIGlmIHNlbGYuX2Vycl9tc2cgIT0gIiI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXJyX21zZworICAgICAgICBzZWxmLl9lcnJfbXNnID0gTGliLnN0cmVycm9yKHNlbGYuZXJyX2NvZGUpCisgICAgICAgIHJldHVybiBzZWxmLl9lcnJfbXNnCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJPYmplY3Q6ICIgKyBzdHIoc2VsZi5vYmopICsgIiwgb3BlcmF0aW9uPSIgKyBzZWxmLm9wX25hbWUgKyBcCisgICAgICAgICAgICAgICAiLCBlcnJvcj0iICsgc2VsZi5lcnJfbXNnKCkKKworIyAKKyMgQ29uc3RhbnRzCisjCisKK2NsYXNzIFRyYW5zcG9ydFR5cGU6CisgICAgIiIiU0lQIHRyYW5zcG9ydCB0eXBlIGNvbnN0YW50cy4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKyAgICBVTlNQRUNJRklFRCAtLSB0cmFuc3BvcnQgdHlwZSBpcyB1bmtub3duIG9yIHVuc3BlY2lmaWVkCisgICAgVURQICAgICAgICAgLS0gVURQIHRyYW5zcG9ydAorICAgIFRDUCAgICAgICAgIC0tIFRDUCB0cmFuc3BvcnQKKyAgICBUTFMgICAgICAgICAtLSBUTFMgdHJhbnNwb3J0CisgICAgSVBWNiAgICAgICAgLS0gdGhpcyBpcyBub3QgYSB0cmFuc3BvcnQgdHlwZSBidXQgcmF0aGVyIGEgZmxhZworICAgICAgICAgICAgICAgICAgIHRvIHNlbGVjdCB0aGUgSVB2NiB2ZXJzaW9uIG9mIGEgdHJhbnNwb3J0CisgICAgVURQX0lQVjYgICAgLS0gSVB2NiBVRFAgdHJhbnNwb3J0CisgICAgVENQX0lQVjYgICAgLS0gSVB2NiBUQ1AgdHJhbnNwb3J0CisgICAgIiIiCisgICAgVU5TUEVDSUZJRUQgPSAwCisgICAgVURQID0gMQorICAgIFRDUCA9IDIKKyAgICBUTFMgPSAzCisgICAgSVBWNiA9IDEyOAorICAgIFVEUF9JUFY2ID0gVURQICsgSVBWNgorICAgIFRDUF9JUFY2ID0gVENQICsgSVBWNgorCitjbGFzcyBUcmFuc3BvcnRGbGFnOgorICAgICIiIlRyYW5zcG9ydCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB0cmFuc3BvcnQuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisgICAgCisgICAgUkVMSUFCTEUgICAgLS0gdHJhbnNwb3J0IGlzIHJlbGlhYmxlLgorICAgIFNFQ1VSRSAgICAgIC0tIHRyYW5zcG9ydCBpcyBzZWN1cmUuCisgICAgREFUQUdSQU0gICAgLS0gdHJhbnNwb3J0IGlzIGRhdGFncmFtIGJhc2VkLgorICAgIAorICAgICIiIgorICAgIFJFTElBQkxFID0gMQorICAgIFNFQ1VSRSA9IDIKKyAgICBEQVRBR1JBTSA9IDQKKworY2xhc3MgQ2FsbFJvbGU6CisgICAgIiIiQ2FsbCByb2xlIGNvbnN0YW50cy4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIENBTExFUiAgLS0gcm9sZSBpcyBjYWxsZXIKKyAgICBDQUxMRUUgIC0tIHJvbGUgaXMgY2FsbGVlCisKKyAgICAiIiIKKyAgICBDQUxMRVIgPSAwCisgICAgQ0FMTEVFID0gMQorCitjbGFzcyBDYWxsU3RhdGU6CisgICAgIiIiQ2FsbCBzdGF0ZSBjb25zdGFudHMuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBOVUxMICAgICAgICAgICAgLS0gY2FsbCBpcyBub3QgaW5pdGlhbGl6ZWQuCisgICAgQ0FMTElORyAgICAgICAgIC0tIGluaXRpYWwgSU5WSVRFIGlzIHNlbnQuCisgICAgSU5DT01JTkcgICAgICAgIC0tIGluaXRpYWwgSU5WSVRFIGlzIHJlY2VpdmVkLgorICAgIEVBUkxZICAgICAgICAgICAtLSBwcm92aXNpb25hbCByZXNwb25zZSBoYXMgYmVlbiBzZW50IG9yIHJlY2VpdmVkLgorICAgIENPTk5FQ1RJTkcgICAgICAtLSAyMDAvT0sgcmVzcG9uc2UgaGFzIGJlZW4gc2VudCBvciByZWNlaXZlZC4KKyAgICBDT05GSVJNRUQgICAgICAgLS0gQUNLIGhhcyBiZWVuIHNlbnQgb3IgcmVjZWl2ZWQuCisgICAgRElTQ09OTkVDVEVEICAgIC0tIGNhbGwgaXMgZGlzY29ubmVjdGVkLgorICAgICIiIgorICAgIE5VTEwgPSAwCisgICAgQ0FMTElORyA9IDEKKyAgICBJTkNPTUlORyA9IDIKKyAgICBFQVJMWSA9IDMKKyAgICBDT05ORUNUSU5HID0gNAorICAgIENPTkZJUk1FRCA9IDUKKyAgICBESVNDT05ORUNURUQgPSA2CisKKworY2xhc3MgTWVkaWFTdGF0ZToKKyAgICAiIiJDYWxsIG1lZGlhIHN0YXRlIGNvbnN0YW50cy4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIE5VTEwgICAgICAgIC0tIG1lZGlhIGlzIG5vdCBhdmFpbGFibGUuCisgICAgQUNUSVZFICAgICAgLS0gbWVkaWEgaXMgYWN0aXZlLgorICAgIExPQ0FMX0hPTEQgIC0tIG1lZGlhIGlzIHB1dCBvbi1ob2xkIGJ5IGxvY2FsIHBhcnR5LgorICAgIFJFTU9URV9IT0xEIC0tIG1lZGlhIGlzIHB1dCBvbi1ob2xkIGJ5IHJlbW90ZSBwYXJ0eS4KKyAgICBFUlJPUiAgICAgICAtLSBtZWRpYSBlcnJvciAoZS5nLiBJQ0UgbmVnb3RpYXRpb24gZmFpbHVyZSkuCisgICAgIiIiCisgICAgTlVMTCA9IDAKKyAgICBBQ1RJVkUgPSAxCisgICAgTE9DQUxfSE9MRCA9IDIKKyAgICBSRU1PVEVfSE9MRCA9IDMKKyAgICBFUlJPUiA9IDQKKworCitjbGFzcyBNZWRpYURpcjoKKyAgICAiIiJNZWRpYSBkaXJlY3Rpb24gY29uc3RhbnRzLgorICAgIAorICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorCisgICAgTlVMTCAgICAgICAgICAgICAgLS0gbWVkaWEgaXMgbm90IGFjdGl2ZQorICAgIEVOQ09ESU5HICAgICAgICAgIC0tIG1lZGlhIGlzIGFjdGl2ZSBpbiB0cmFuc21pdC9lbmNvZGluZyBkaXJlY3Rpb24gb25seS4KKyAgICBERUNPRElORyAgICAgICAgICAtLSBtZWRpYSBpcyBhY3RpdmUgaW4gcmVjZWl2ZS9kZWNvZGluZyBkaXJlY3Rpb24gb25seQorICAgIEVOQ09ESU5HX0RFQ09ESU5HIC0tIG1lZGlhIGlzIGFjdGl2ZSBpbiBib3RoIGRpcmVjdGlvbnMuCisgICAgIiIiCisgICAgTlVMTCA9IDAKKyAgICBFTkNPRElORyA9IDEKKyAgICBERUNPRElORyA9IDIKKyAgICBFTkNPRElOR19ERUNPRElORyA9IDMKKworCitjbGFzcyBQcmVzZW5jZUFjdGl2aXR5OgorICAgICIiIlByZXNlbmNlIGFjdGl2aXRpZXMgY29uc3RhbnRzLgorICAgIAorICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorCisgICAgVU5LTk9XTiAtLSB0aGUgcGVyc29uIGFjdGl2aXR5IGlzIHVua25vd24KKyAgICBBV0FZICAgIC0tIHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGF3YXkKKyAgICBCVVNZICAgIC0tIHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGVuZ2FnaW5nIGluIG90aGVyIGFjdGl2aXR5CisgICAgIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBBV0FZID0gMQorICAgIEJVU1kgPSAyCisKKworY2xhc3MgU3Vic2NyaXB0aW9uU3RhdGU6CisgICAgIiIiUHJlc2VuY2Ugc3Vic2NyaXB0aW9uIHN0YXRlIGNvbnN0YW50cy4KKworICAgICIiIgorICAgIE5VTEwgPSAwCisgICAgU0VOVCA9IDEKKyAgICBBQ0NFUFRFRCA9IDIKKyAgICBQRU5ESU5HID0gMworICAgIEFDVElWRSA9IDQKKyAgICBURVJNSU5BVEVEID0gNQorICAgIFVOS05PV04gPSA2CisKKworY2xhc3MgVFVSTkNvbm5UeXBlOgorICAgICIiIlRoZXNlIGNvbnN0YW50cyBzcGVjaWZpZXMgdGhlIGNvbm5lY3Rpb24gdHlwZSB0byBUVVJOIHNlcnZlci4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKyAgICBVRFAgICAgIC0tIHVzZSBVRFAgdHJhbnNwb3J0LgorICAgIFRDUCAgICAgLS0gdXNlIFRDUCB0cmFuc3BvcnQuCisgICAgVExTICAgICAtLSB1c2UgVExTIHRyYW5zcG9ydC4KKyAgICAiIiIKKyAgICBVRFAgPSAxNworICAgIFRDUCA9IDYKKyAgICBUTFMgPSAyNTUKKworCitjbGFzcyBVQUNvbmZpZzoKKyAgICAiIiJVc2VyIGFnZW50IGNvbmZpZ3VyYXRpb24gdG8gYmUgc3BlY2lmaWVkIGluIExpYi5pbml0KCkuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBtYXhfY2FsbHMgICAtLSBtYXhpbXVtIG51bWJlciBvZiBjYWxscyB0byBiZSBzdXBwb3J0ZWQuCisgICAgbmFtZXNlcnZlciAgLS0gbGlzdCBvZiBuYW1lc2VydmVyIGhvc3RuYW1lcyBvciBJUCBhZGRyZXNzZXMuIE5hbWVzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGNvbmZpZ3VyZWQgaWYgRE5TIFNSViByZXNvbHV0aW9uIGlzIGRlc2lyZWQuCisgICAgc3R1bl9kb21haW4gLS0gaWYgbmFtZXNlcnZlciBpcyBjb25maWd1cmVkLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5CisgICAgICAgICAgICAgICAgICAgdGhlIFNUVU4gc2VydmVyIHdpdGggRE5TIFNSVi4KKyAgICBzdHVuX2hvc3QgICAtLSB0aGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgU1RVTiBzZXJ2ZXIuIFRoaXMgd2lsbAorICAgICAgICAgICAgICAgICAgIGFsc28gYmUgdXNlZCBpZiBETlMgU1JWIHJlc29sdXRpb24gZm9yIHN0dW5fZG9tYWluIGZhaWxzLgorICAgIHVzZXJfYWdlbnQgIC0tIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgdXNlciBhZ2VudCBuYW1lLgorICAgICIiIgorICAgIG1heF9jYWxscyA9IDQKKyAgICBuYW1lc2VydmVyID0gW10KKyAgICBzdHVuX2RvbWFpbiA9ICIiCisgICAgc3R1bl9ob3N0ID0gIiIKKyAgICB1c2VyX2FnZW50ID0gInBqc2lwIHB5dGhvbiIKKyAgICAKKyAgICBkZWYgX2N2dF9mcm9tX3Bqc3VhKHNlbGYsIGNmZyk6CisgICAgICAgIHNlbGYubWF4X2NhbGxzID0gY2ZnLm1heF9jYWxscworICAgICAgICBzZWxmLnRocmVhZF9jbnQgPSBjZmcudGhyZWFkX2NudAorICAgICAgICBzZWxmLm5hbWVzZXJ2ZXIgPSBjZmcubmFtZXNlcnZlcgorICAgICAgICBzZWxmLnN0dW5fZG9tYWluID0gY2ZnLnN0dW5fZG9tYWluCisgICAgICAgIHNlbGYuc3R1bl9ob3N0ID0gY2ZnLnN0dW5faG9zdAorICAgICAgICBzZWxmLnVzZXJfYWdlbnQgPSBjZmcudXNlcl9hZ2VudAorCisgICAgZGVmIF9jdnRfdG9fcGpzdWEoc2VsZik6CisgICAgICAgIGNmZyA9IF9wanN1YS5jb25maWdfZGVmYXVsdCgpCisgICAgICAgIGNmZy5tYXhfY2FsbHMgPSBzZWxmLm1heF9jYWxscworICAgICAgICBjZmcudGhyZWFkX2NudCA9IDAKKyAgICAgICAgY2ZnLm5hbWVzZXJ2ZXIgPSBzZWxmLm5hbWVzZXJ2ZXIKKyAgICAgICAgY2ZnLnN0dW5fZG9tYWluID0gc2VsZi5zdHVuX2RvbWFpbgorICAgICAgICBjZmcuc3R1bl9ob3N0ID0gc2VsZi5zdHVuX2hvc3QKKyAgICAgICAgY2ZnLnVzZXJfYWdlbnQgPSBzZWxmLnVzZXJfYWdlbnQKKyAgICAgICAgcmV0dXJuIGNmZworCisKK2NsYXNzIExvZ0NvbmZpZzoKKyAgICAiIiJMb2dnaW5nIGNvbmZpZ3VyYXRpb24gdG8gYmUgc3BlY2lmaWVkIGluIExpYi5pbml0KCkuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBtc2dfbG9nZ2luZyAgIC0tIHNwZWNpZnkgaWYgU0lQIG1lc3NhZ2VzIHNob3VsZCBiZSBsb2dnZWQuIFNldCB0bworICAgICAgICAgICAgICAgICAgICAgVHJ1ZS4KKyAgICBsZXZlbCAgICAgICAgIC0tIHNwZWNpZnkgdGhlIGlucHV0IHZlcmJvc2l0eSBsZXZlbC4KKyAgICBjb25zb2xlX2xldmVsIC0tIHNwZWNpZnkgdGhlIG91dHB1dCB2ZXJib3NpdHkgbGV2ZWwuCisgICAgZGVjb3IgICAgICAgICAtLSBzcGVjaWZ5IGxvZyBkZWNvcmF0aW9uLgorICAgIGZpbGVuYW1lICAgICAgLS0gc3BlY2lmeSB0aGUgbG9nIGZpbGVuYW1lLgorICAgIGNhbGxiYWNrICAgICAgLS0gc3BlY2lmeSBjYWxsYmFjayB0byBiZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGxvZ2dpbmcKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLiBTYW1wbGUgZnVuY3Rpb246CisKKyAgICAgICAgICAgICAgICAgICAgIGRlZiBsb2dfY2IobGV2ZWwsIHN0ciwgbGVuKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHN0ciwKKworICAgICIiIgorICAgIG1zZ19sb2dnaW5nID0gVHJ1ZQorICAgIGxldmVsID0gNQorICAgIGNvbnNvbGVfbGV2ZWwgPSA1CisgICAgZGVjb3IgPSAwCisgICAgZmlsZW5hbWUgPSAiIgorICAgIGNhbGxiYWNrID0gTm9uZQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXZlbD0tMSwgZmlsZW5hbWU9IiIsIGNhbGxiYWNrPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnNvbGVfbGV2ZWw9LTEpOgorICAgICAgICBzZWxmLl9jdnRfZnJvbV9wanN1YShfcGpzdWEubG9nZ2luZ19jb25maWdfZGVmYXVsdCgpKQorICAgICAgICBpZiBsZXZlbCAhPSAtMToKKyAgICAgICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbAorICAgICAgICBpZiBmaWxlbmFtZSAhPSAiIjoKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBpZiBjYWxsYmFjayAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIGlmIGNvbnNvbGVfbGV2ZWwgIT0gLTE6CisgICAgICAgICAgICBzZWxmLmNvbnNvbGVfbGV2ZWwgPSBjb25zb2xlX2xldmVsCisKKyAgICBkZWYgX2N2dF9mcm9tX3Bqc3VhKHNlbGYsIGNmZyk6CisgICAgICAgIHNlbGYubXNnX2xvZ2dpbmcgPSBjZmcubXNnX2xvZ2dpbmcKKyAgICAgICAgc2VsZi5sZXZlbCA9IGNmZy5sZXZlbAorICAgICAgICBzZWxmLmNvbnNvbGVfbGV2ZWwgPSBjZmcuY29uc29sZV9sZXZlbAorICAgICAgICBzZWxmLmRlY29yID0gY2ZnLmRlY29yCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBjZmcubG9nX2ZpbGVuYW1lCisgICAgICAgIHNlbGYuY2FsbGJhY2sgPSBjZmcuY2IKKworICAgIGRlZiBfY3Z0X3RvX3Bqc3VhKHNlbGYpOgorICAgICAgICBjZmcgPSBfcGpzdWEubG9nZ2luZ19jb25maWdfZGVmYXVsdCgpCisgICAgICAgIGNmZy5tc2dfbG9nZ2luZyA9IHNlbGYubXNnX2xvZ2dpbmcKKyAgICAgICAgY2ZnLmxldmVsID0gc2VsZi5sZXZlbAorICAgICAgICBjZmcuY29uc29sZV9sZXZlbCA9IHNlbGYuY29uc29sZV9sZXZlbAorICAgICAgICBjZmcuZGVjb3IgPSBzZWxmLmRlY29yCisgICAgICAgIGNmZy5sb2dfZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgIGNmZy5jYiA9IHNlbGYuY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuIGNmZworCisKK2NsYXNzIE1lZGlhQ29uZmlnOgorICAgICIiIk1lZGlhIGNvbmZpZ3VyYXRpb24gdG8gYmUgc3BlY2lmaWVkIGluIExpYi5pbml0KCkuCisgICAgCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisgICAgCisgICAgY2xvY2tfcmF0ZSAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSBjb3JlIGNsb2NrIHJhdGUgb2YgdGhlIGF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zdCBub3RhYmx5IHRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAgICBzbmRfY2xvY2tfcmF0ZSAgICAgIC0tIG9wdGlvbmFsbHkgc3BlY2lmeSBkaWZmZXJlbnQgY2xvY2sgcmF0ZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VuZCBkZXZpY2UuCisgICAgc25kX2F1dG9fY2xvc2VfdGltZSAtLSBzcGVjaWZ5IHRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZCBkZXZpY2Ugc2hvdWxkIGJlIGNsb3NlZCBhZnRlciBpbmFjdGl2aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QuCisgICAgY2hhbm5lbF9jb3VudCAgICAgICAtLSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gb3BlbiB0aGUgc291bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBhbmQgdGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICAgIGF1ZGlvX2ZyYW1lX3B0aW1lICAgLS0gc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIGF1ZGlvIGZyYW1lcyBpbiBtaWxsaXNlY29uZC4KKyAgICBtYXhfbWVkaWFfcG9ydHMgICAgIC0tIHNwZWNpZnkgbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gcG9ydHMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgY29uZmVyZW5jZSBicmlkZ2UuCisgICAgcXVhbGl0eSAgICAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSBhdWRpbyBxdWFsaXR5IHNldHRpbmcgKDEtMTApCisgICAgcHRpbWUgICAgICAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSBhdWRpbyBwYWNrZXQgbGVuZ3RoIG9mIHRyYW5zbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFAgcGFja2V0LgorICAgIG5vX3ZhZCAgICAgICAgICAgICAgLS0gZGlzYWJsZSBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAoVkFEKSBvciBTaWxlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlY3RvciAoU0QpCisgICAgaWxiY19tb2RlICAgICAgICAgICAtLSBzcGVjaWZ5IGlMQkMgY29kZWMgbW9kZSAobXVzdCBiZSAzMCBmb3Igbm93KQorICAgIHR4X2Ryb3BfcGN0ICAgICAgICAgLS0gcmFuZG9tbHkgZHJvcCB0cmFuc21pdHRlZCBSVFAgcGFja2V0cyAoZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0aW9uKS4gTnVtYmVyIGlzIGluIHBlcmNlbnQuCisgICAgcnhfZHJvcF9wY3QgICAgICAgICAtLSByYW5kb21seSBkcm9wIHJlY2VpdmVkIFJUUCBwYWNrZXRzIChmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsYXRpb24pLiBOdW1iZXIgaXMgaW4gcGVyY2VudC4KKyAgICBlY19vcHRpb25zICAgICAgICAgIC0tIEVjaG8gQ2FuY2VsbGVyIG9wdGlvbiAoc3BlY2lmeSB6ZXJvKS4KKyAgICBlY190YWlsX2xlbiAgICAgICAgIC0tIHNwZWNpZnkgRWNobyBDYW5jZWxsZXIgdGFpbCBsZW5ndGggaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgemVybyB3aWxsIGRpc2FibGUgdGhlIGVjaG8gY2FuY2VsbGVyLgorICAgIGpiX21pbiAgICAgICAgICAgICAgLS0gc3BlY2lmeSB0aGUgbWluaW11bSBqaXR0ZXIgYnVmZmVyIHNpemUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcy4gUHV0IC0xIGZvciBkZWZhdWx0LgorICAgIGpiX21heCAgICAgICAgICAgICAgLS0gc3BlY2lmeSB0aGUgbWF4aW11bSBqaXR0ZXIgYnVmZmVyIHNpemUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcy4gUHV0IC0xIGZvciBkZWZhdWx0LgorICAgIGVuYWJsZV9pY2UgICAgICAgICAgLS0gZW5hYmxlIEludGVyYWN0aXZlIENvbm5lY3Rpdml0eSBFc3RhYmxpc2htZW50IChJQ0UpCisgICAgZW5hYmxlX3R1cm4gICAgICAgICAtLSBlbmFibGUgVFVSTiByZWxheS4gVFVSTiBzZXJ2ZXIgc2V0dGluZ3MgbXVzdCBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25maWd1cmVkLgorICAgIHR1cm5fc2VydmVyICAgICAgICAgLS0gc3BlY2lmeSB0aGUgZG9tYWluIG9yIGhvc3RuYW1lIG9yIElQIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUVVJOIHNlcnZlciwgaW4gImhvc3RbOnBvcnRdIiBmb3JtYXQuCisgICAgdHVybl9jb25uX3R5cGUgICAgICAtLSBzcGVjaWZ5IGNvbm5lY3Rpb24gdHlwZSB0byB0aGUgVFVSTiBzZXJ2ZXIsIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUVVJOQ29ublR5cGUgY29uc3RhbnQuCisgICAgdHVybl9jcmVkICAgICAgICAgICAtLSBzcGVjaWZ5IEF1dGhDcmVkIGZvciB0aGUgVFVSTiBjcmVkZW50aWFsLgorICAgICIiIgorICAgIGNsb2NrX3JhdGUgPSAxNjAwMAorICAgIHNuZF9jbG9ja19yYXRlID0gMAorICAgIHNuZF9hdXRvX2Nsb3NlX3RpbWUgPSA1CisgICAgY2hhbm5lbF9jb3VudCA9IDEKKyAgICBhdWRpb19mcmFtZV9wdGltZSA9IDIwCisgICAgbWF4X21lZGlhX3BvcnRzID0gMzIKKyAgICBxdWFsaXR5ID0gNgorICAgIHB0aW1lID0gMAorICAgIG5vX3ZhZCA9IEZhbHNlCisgICAgaWxiY19tb2RlID0gMzAKKyAgICB0eF9kcm9wX3BjdCA9IDAKKyAgICByeF9kcm9wX3BjdCA9IDAKKyAgICBlY19vcHRpb25zID0gMAorICAgIGVjX3RhaWxfbGVuID0gMjU2CisgICAgamJfbWluID0gLTEKKyAgICBqYl9tYXggPSAtMQorICAgIGVuYWJsZV9pY2UgPSBUcnVlCisgICAgZW5hYmxlX3R1cm4gPSBGYWxzZQorICAgIHR1cm5fc2VydmVyID0gIiIKKyAgICB0dXJuX2Nvbm5fdHlwZSA9IFRVUk5Db25uVHlwZS5VRFAKKyAgICB0dXJuX2NyZWQgPSBOb25lCisgICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZGVmYXVsdCA9IF9wanN1YS5tZWRpYV9jb25maWdfZGVmYXVsdCgpCisgICAgICAgIHNlbGYuX2N2dF9mcm9tX3Bqc3VhKGRlZmF1bHQpCisKKyAgICBkZWYgX2N2dF9mcm9tX3Bqc3VhKHNlbGYsIGNmZyk6CisgICAgICAgIHNlbGYuY2xvY2tfcmF0ZSA9IGNmZy5jbG9ja19yYXRlCisgICAgICAgIHNlbGYuc25kX2Nsb2NrX3JhdGUgPSBjZmcuc25kX2Nsb2NrX3JhdGUKKyAgICAgICAgc2VsZi5zbmRfYXV0b19jbG9zZV90aW1lID0gY2ZnLnNuZF9hdXRvX2Nsb3NlX3RpbWUKKyAgICAgICAgc2VsZi5jaGFubmVsX2NvdW50ID0gY2ZnLmNoYW5uZWxfY291bnQKKyAgICAgICAgc2VsZi5hdWRpb19mcmFtZV9wdGltZSA9IGNmZy5hdWRpb19mcmFtZV9wdGltZQorICAgICAgICBzZWxmLm1heF9tZWRpYV9wb3J0cyA9IGNmZy5tYXhfbWVkaWFfcG9ydHMKKyAgICAgICAgc2VsZi5xdWFsaXR5ID0gY2ZnLnF1YWxpdHkKKyAgICAgICAgc2VsZi5wdGltZSA9IGNmZy5wdGltZQorICAgICAgICBzZWxmLm5vX3ZhZCA9IGNmZy5ub192YWQKKyAgICAgICAgc2VsZi5pbGJjX21vZGUgPSBjZmcuaWxiY19tb2RlCisgICAgICAgIHNlbGYudHhfZHJvcF9wY3QgPSBjZmcudHhfZHJvcF9wY3QKKyAgICAgICAgc2VsZi5yeF9kcm9wX3BjdCA9IGNmZy5yeF9kcm9wX3BjdAorICAgICAgICBzZWxmLmVjX29wdGlvbnMgPSBjZmcuZWNfb3B0aW9ucworICAgICAgICBzZWxmLmVjX3RhaWxfbGVuID0gY2ZnLmVjX3RhaWxfbGVuCisgICAgICAgIHNlbGYuamJfbWluID0gY2ZnLmpiX21pbgorICAgICAgICBzZWxmLmpiX21heCA9IGNmZy5qYl9tYXgKKyAgICAgICAgc2VsZi5lbmFibGVfaWNlID0gY2ZnLmVuYWJsZV9pY2UKKyAgICAgICAgc2VsZi5lbmFibGVfdHVybiA9IGNmZy5lbmFibGVfdHVybgorICAgICAgICBzZWxmLnR1cm5fc2VydmVyID0gY2ZnLnR1cm5fc2VydmVyCisgICAgICAgIHNlbGYudHVybl9jb25uX3R5cGUgPSBjZmcudHVybl9jb25uX3R5cGUKKyAgICAgICAgaWYgY2ZnLnR1cm5fdXNlcm5hbWU6CisgICAgICAgICAgICBzZWxmLnR1cm5fY3JlZCA9IEF1dGhDcmVkKGNmZy50dXJuX3JlYWxtLCBjZmcudHVybl91c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnR1cm5fcGFzc3dkLCBjZmcudHVybl9wYXNzd2RfdHlwZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudHVybl9jcmVkID0gTm9uZQorCisgICAgZGVmIF9jdnRfdG9fcGpzdWEoc2VsZik6CisgICAgICAgIGNmZyA9IF9wanN1YS5tZWRpYV9jb25maWdfZGVmYXVsdCgpCisgICAgICAgIGNmZy5jbG9ja19yYXRlID0gc2VsZi5jbG9ja19yYXRlCisgICAgICAgIGNmZy5zbmRfY2xvY2tfcmF0ZSA9IHNlbGYuc25kX2Nsb2NrX3JhdGUKKyAgICAgICAgY2ZnLnNuZF9hdXRvX2Nsb3NlX3RpbWUgPSBzZWxmLnNuZF9hdXRvX2Nsb3NlX3RpbWUKKyAgICAgICAgY2ZnLmNoYW5uZWxfY291bnQgPSBzZWxmLmNoYW5uZWxfY291bnQKKyAgICAgICAgY2ZnLmF1ZGlvX2ZyYW1lX3B0aW1lID0gc2VsZi5hdWRpb19mcmFtZV9wdGltZQorICAgICAgICBjZmcubWF4X21lZGlhX3BvcnRzID0gc2VsZi5tYXhfbWVkaWFfcG9ydHMKKyAgICAgICAgY2ZnLnF1YWxpdHkgPSBzZWxmLnF1YWxpdHkKKyAgICAgICAgY2ZnLnB0aW1lID0gc2VsZi5wdGltZQorICAgICAgICBjZmcubm9fdmFkID0gc2VsZi5ub192YWQKKyAgICAgICAgY2ZnLmlsYmNfbW9kZSA9IHNlbGYuaWxiY19tb2RlCisgICAgICAgIGNmZy50eF9kcm9wX3BjdCA9IHNlbGYudHhfZHJvcF9wY3QKKyAgICAgICAgY2ZnLnJ4X2Ryb3BfcGN0ID0gc2VsZi5yeF9kcm9wX3BjdAorICAgICAgICBjZmcuZWNfb3B0aW9ucyA9IHNlbGYuZWNfb3B0aW9ucworICAgICAgICBjZmcuZWNfdGFpbF9sZW4gPSBzZWxmLmVjX3RhaWxfbGVuCisgICAgICAgIGNmZy5qYl9taW4gPSBzZWxmLmpiX21pbgorICAgICAgICBjZmcuamJfbWF4ID0gc2VsZi5qYl9tYXgKKyAgICAgICAgY2ZnLmVuYWJsZV9pY2UgPSBzZWxmLmVuYWJsZV9pY2UKKyAgICAgICAgY2ZnLmVuYWJsZV90dXJuID0gc2VsZi5lbmFibGVfdHVybgorICAgICAgICBjZmcudHVybl9zZXJ2ZXIgPSBzZWxmLnR1cm5fc2VydmVyCisgICAgICAgIGNmZy50dXJuX2Nvbm5fdHlwZSA9IHNlbGYudHVybl9jb25uX3R5cGUKKyAgICAgICAgaWYgc2VsZi50dXJuX2NyZWQ6CisgICAgICAgICAgICBjZmcudHVybl9yZWFsbSA9IHNlbGYudHVybl9jcmVkLnJlYWxtCisgICAgICAgICAgICBjZmcudHVybl91c2VybmFtZSA9IHNlbGYudHVybl9jcmVkLnVzZXJuYW1lCisgICAgICAgICAgICBjZmcudHVybl9wYXNzd2RfdHlwZSA9IHNlbGYudHVybl9jcmVkLnBhc3N3ZF90eXBlCisgICAgICAgICAgICBjZmcudHVybl9wYXNzd2QgPSBzZWxmLnR1cm5fY3JlZC5wYXNzd2QKKyAgICAgICAgcmV0dXJuIGNmZworCisKK2NsYXNzIFRyYW5zcG9ydENvbmZpZzoKKyAgICAiIiJTSVAgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gY2xhc3MuCisgICAgCisgICAgTWVtYmVyIGNvbmZpZ3VyYXRpb246CisKKyAgICBwb3J0ICAgICAgICAtLSBwb3J0IG51bWJlci4KKyAgICBib3VuZF9hZGRyICAtLSBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGFkZHJlc3MgdG8gYmluZCB0aGUgc29ja2V0IHRvLgorICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgZW1wdHkgdG8gYmluZCB0byBJTkFERFJfQU5ZLgorICAgIHB1YmxpY19hZGRyIC0tIG9wdGlvbmFsbHkgb3ZlcnJpZGUgdGhlIHB1Ymxpc2hlZCBhZGRyZXNzIGZvciB0aGlzCisgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LiBJZiBlbXB0eSwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZ2V0CisgICAgICAgICAgICAgICAgICAgdGhlIHB1YmxpYyBhZGRyZXNzIGZyb20gU1RVTiBvciBmcm9tIHRoZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgIGxvY2FsIGludGVyZmFjZS4gRm9ybWF0IGlzICJob3N0OnBvcnQiLgorICAgIHFvc190eXBlICAgIC0tIEhpZ2ggbGV2ZWwgdHJhZmZpYyBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICBFbnVtZXJhdG9yOgorICAgICAgICAgICAgICAgICAgICAgMDogUEpfUU9TX1RZUEVfQkVTVF9FRkZPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmVzdCBlZmZvcnQgdHJhZmZpYyAoZGVmYXVsdCB2YWx1ZSkuIEFueSBRb1MgZnVuY3Rpb24gY2FsbHMgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeWluZyB0aGlzIHZhbHVlIGFyZSBlZmZlY3RpdmVseSBuby1vcAorICAgICAgICAgICAgICAgICAgICAgMTogUEpfUU9TX1RZUEVfQkFDS0dST1VORAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kIHRyYWZmaWMuCisgICAgICAgICAgICAgICAgICAgICAyOiBQSl9RT1NfVFlQRV9WSURFTworICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyB0cmFmZmljLgorICAgICAgICAgICAgICAgICAgICAgMzogUEpfUU9TX1RZUEVfVk9JQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgdHJhZmZpYy4KKyAgICAgICAgICAgICAgICAgICAgIDQ6IFBKX1FPU19UWVBFX0NPTlRST0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCB0cmFmZmljLgorICAgIHFvc19wYXJhbXNfZmxhZ3MgICAgLS0gRGV0ZXJtaW5lcyB3aGljaCB2YWx1ZXMgdG8gc2V0LCBiaXRtYXNrIG9mIHBqX3Fvc19mbGFnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSl9RT1NfUEFSQU1fSEFTX0RTQ1AgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBKX1FPU19QQVJBTV9IQVNfU09fUFJJTyA9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfUU9TX1BBUkFNX0hBU19XTU0gPSA0CisgICAgcW9zX3BhcmFtc19kc2NwX3ZhbCAtLSBUaGUgNiBiaXRzIERTQ1AgdmFsdWUgdG8gc2V0LgorICAgIHFvc19wYXJhbXNfc29fcHJpbyAgLS0gU29ja2V0IFNPX1BSSU9SSVRZIHZhbHVlLgorICAgIHFvc19wYXJhbXNfd21tX3ByaW8gLS0gU3RhbmRhcmQgV01NIHByaW9yaXRpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFBKX1FPU19XTU1fUFJJT19CVUxLX0VGRk9SVDogQnVsayBlZmZvcnQgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFBKX1FPU19XTU1fUFJJT19CVUxLOiBCdWxrIHByaW9yaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogUEpfUU9TX1dNTV9QUklPX1ZJREVPOiBWaWRlbyBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogUEpfUU9TX1dNTV9QUklPX1ZPSUNFOiBWb2ljZSBwcmlvcml0eS4KKyAgICAiIiIKKyAgICBwb3J0ID0gMAorICAgIGJvdW5kX2FkZHIgPSAiIgorICAgIHB1YmxpY19hZGRyID0gIiIKKyAgICAKKyAgICBxb3NfdHlwZSA9IDAKKyAgICBxb3NfcGFyYW1zX2ZsYWdzID0gMAorICAgIHFvc19wYXJhbXNfZHNjcF92YWwgPSAwCisgICAgcW9zX3BhcmFtc19zb19wcmlvID0gMAorICAgIHFvc19wYXJhbXNfd21tX3ByaW8gPSAwCisgICAgCisgICAgCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydD0wLCAKKyAgICAgICAgICAgICAgICAgYm91bmRfYWRkcj0iIiwgcHVibGljX2FkZHI9IiIpOgorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuYm91bmRfYWRkciA9IGJvdW5kX2FkZHIKKyAgICAgICAgc2VsZi5wdWJsaWNfYWRkciA9IHB1YmxpY19hZGRyCisKKyAgICBkZWYgX2N2dF9mcm9tX3Bqc3VhKHNlbGYsIGNmZyk6CisgICAgICAgIHNlbGYucG9ydCA9IGNmZy5wb3J0CisgICAgICAgIHNlbGYuYm91bmRfYWRkciA9IGNmZy5ib3VuZF9hZGRyCisgICAgICAgIHNlbGYucHVibGljX2FkZHIgPSBjZmcucHVibGljX2FkZHIKKyAgICAgICAgc2VsZi5xb3NfdHlwZSA9IGNmZy5xb3NfdHlwZQorICAgICAgICBzZWxmLnFvc19wYXJhbXNfZmxhZ3MgPSBjZmcucW9zX3BhcmFtc19mbGFncworICAgICAgICBzZWxmLnFvc19wYXJhbXNfZHNjcF92YWwgPSBjZmcucW9zX3BhcmFtc19kc2NwX3ZhbAorICAgICAgICBzZWxmLnFvc19wYXJhbXNfc29fcHJpbyA9IGNmZy5xb3NfcGFyYW1zX3NvX3ByaW8KKyAgICAgICAgc2VsZi5xb3NfcGFyYW1zX3dtbV9wcmlvID0gY2ZnLnFvc19wYXJhbXNfd21tX3ByaW8KKworICAgIGRlZiBfY3Z0X3RvX3Bqc3VhKHNlbGYpOgorICAgICAgICBjZmcgPSBfcGpzdWEudHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCkKKyAgICAgICAgY2ZnLnBvcnQgPSBzZWxmLnBvcnQKKyAgICAgICAgY2ZnLmJvdW5kX2FkZHIgPSBzZWxmLmJvdW5kX2FkZHIKKyAgICAgICAgY2ZnLnB1YmxpY19hZGRyID0gc2VsZi5wdWJsaWNfYWRkcgorICAgICAgICBjZmcucW9zX3R5cGUgPSBzZWxmLnFvc190eXBlCisgICAgICAgIGNmZy5xb3NfcGFyYW1zX2ZsYWdzID0gc2VsZi5xb3NfcGFyYW1zX2ZsYWdzCisgICAgICAgIGNmZy5xb3NfcGFyYW1zX2RzY3BfdmFsID0gc2VsZi5xb3NfcGFyYW1zX2RzY3BfdmFsCisgICAgICAgIGNmZy5xb3NfcGFyYW1zX3NvX3ByaW8gPSBzZWxmLnFvc19wYXJhbXNfc29fcHJpbworICAgICAgICBjZmcucW9zX3BhcmFtc193bW1fcHJpbyA9IHNlbGYucW9zX3BhcmFtc193bW1fcHJpbworCisgICAgICAgIHJldHVybiBjZmcKKworCitjbGFzcyBUcmFuc3BvcnRJbmZvOgorICAgICIiIlNJUCB0cmFuc3BvcnQgaW5mby4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIHR5cGUgICAgICAgIC0tIHRyYW5zcG9ydCB0eXBlLCBmcm9tIFRyYW5zcG9ydFR5cGUgY29uc3RhbnRzLgorICAgIGRlc2NyaXB0aW9uIC0tIGxvbmdlciBkZXNjcmlwdGlvbiBmb3IgdGhpcyB0cmFuc3BvcnQuCisgICAgaXNfcmVsaWFibGUgLS0gVHJ1ZSBpZiB0cmFuc3BvcnQgaXMgcmVsaWFibGUuCisgICAgaXNfc2VjdXJlICAgLS0gVHJ1ZSBpZiB0cmFuc3BvcnQgaXMgc2VjdXJlLgorICAgIGlzX2RhdGFncmFtIC0tIFRydWUgaWYgdHJhbnNwb3J0IGlzIGRhdGFncmFtIGJhc2VkLgorICAgIGhvc3QgICAgICAgIC0tIHRoZSBJUCBhZGRyZXNzIG9mIHRoaXMgdHJhbnNwb3J0LgorICAgIHBvcnQgICAgICAgIC0tIHRoZSBwb3J0IG51bWJlci4KKyAgICByZWZfY250ICAgICAtLSBudW1iZXIgb2Ygb2JqZWN0cyByZWZlcmVuY2luZyB0aGlzIHRyYW5zcG9ydC4KKyAgICAiIiIKKyAgICB0eXBlID0gIiIKKyAgICBkZXNjcmlwdGlvbiA9ICIiCisgICAgaXNfcmVsaWFibGUgPSBGYWxzZQorICAgIGlzX3NlY3VyZSA9IEZhbHNlCisgICAgaXNfZGF0YWdyYW0gPSBGYWxzZQorICAgIGhvc3QgPSAiIgorICAgIHBvcnQgPSAwCisgICAgcmVmX2NudCA9IDAKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGkpOgorICAgICAgICBzZWxmLnR5cGUgPSB0aS50eXBlX25hbWUKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IHRpLmluZm8KKyAgICAgICAgc2VsZi5pc19yZWxpYWJsZSA9ICh0aS5mbGFnICYgVHJhbnNwb3J0RmxhZy5SRUxJQUJMRSkKKyAgICAgICAgc2VsZi5pc19zZWN1cmUgPSAodGkuZmxhZyAmIFRyYW5zcG9ydEZsYWcuU0VDVVJFKQorICAgICAgICBzZWxmLmlzX2RhdGFncmFtID0gKHRpLmZsYWcgJiBUcmFuc3BvcnRGbGFnLkRBVEFHUkFNKQorICAgICAgICBzZWxmLmhvc3QgPSB0aS5hZGRyCisgICAgICAgIHNlbGYucG9ydCA9IHRpLnBvcnQKKyAgICAgICAgc2VsZi5yZWZfY250ID0gdGkudXNhZ2VfY291bnQKKyAgICAKKyAgICAKK2NsYXNzIFRyYW5zcG9ydDoKKyAgICAiU0lQIHRyYW5zcG9ydCBjbGFzcy4iCisgICAgX2lkID0gLTEKKyAgICBfbGliID0gTm9uZQorICAgIF9vYmpfbmFtZSA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGliLCBpZCk6CisgICAgICAgIHNlbGYuX2xpYiA9IHdlYWtyZWYucHJveHkobGliKQorICAgICAgICBzZWxmLl9pZCA9IGlkCisgICAgICAgIHNlbGYuX29ial9uYW1lID0gIntUcmFuc3BvcnQgIiArIHNlbGYuaW5mbygpLmRlc2NyaXB0aW9uICsgIn0iCisgICAgICAgIF9UcmFjZSgoc2VsZiwgJ2NyZWF0ZWQnKSkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBfVHJhY2UoKHNlbGYsICdkZXN0cm95ZWQnKSkKKyAgICAgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9vYmpfbmFtZQorCisgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICIiIkdldCBUcmFuc3BvcnRJbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliLmF1dG9fbG9jaygpCisgICAgICAgIHRpID0gX3Bqc3VhLnRyYW5zcG9ydF9nZXRfaW5mbyhzZWxmLl9pZCkKKyAgICAgICAgaWYgbm90IHRpOgorICAgICAgICAgICAgc2VsZi5fbGliLl9lcnJfY2hlY2soImluZm8oKSIsIHNlbGYsIC0xLCAiSW52YWxpZCB0cmFuc3BvcnQiKQorICAgICAgICByZXR1cm4gVHJhbnNwb3J0SW5mbyh0aSkKKworICAgIGRlZiBlbmFibGUoc2VsZik6CisgICAgICAgICIiIkVuYWJsZSB0aGlzIHRyYW5zcG9ydC4iIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS50cmFuc3BvcnRfc2V0X2VuYWJsZShzZWxmLl9pZCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5fbGliLl9lcnJfY2hlY2soImVuYWJsZSgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGRpc2FibGUoc2VsZik6CisgICAgICAgICIiIkRpc2FibGUgdGhpcyB0cmFuc3BvcnQuIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEudHJhbnNwb3J0X3NldF9lbmFibGUoc2VsZi5faWQsIDApCisgICAgICAgIHNlbGYuX2xpYi5fZXJyX2NoZWNrKCJkaXNhYmxlKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZm9yY2U9RmFsc2UpOgorICAgICAgICAiIiJDbG9zZSBhbmQgZGVzdHJveSB0aGlzIHRyYW5zcG9ydC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBmb3JjZSAgIC0tIGZvcmNlIGRlbGV0aW9uIG9mIHRoaXMgdHJhbnNwb3J0IChub3QgcmVjb21tZW5kZWQpLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS50cmFuc3BvcnRfY2xvc2Uoc2VsZi5faWQsIGZvcmNlKQorICAgICAgICBzZWxmLl9saWIuX2Vycl9jaGVjaygiY2xvc2UoKSIsIHNlbGYsIGVycikKKworCitjbGFzcyBTSVBVcmk6CisgICAgIiIiSGVscGVyIGNsYXNzIHRvIHBhcnNlIHRoZSBtb3N0IGltcG9ydGFudCBjb21wb25lbnRzIG9mIFNJUCBVUkkuCisKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIHNjaGVtZSAgICAtLSBVUkkgc2NoZW1lICgic2lwIiBvciAic2lwcyIpCisgICAgdXNlciAgICAgIC0tIHVzZXIgcGFydCBvZiB0aGUgVVJJIChtYXkgYmUgZW1wdHkpCisgICAgaG9zdCAgICAgIC0tIGhvc3QgbmFtZSBwYXJ0CisgICAgcG9ydCAgICAgIC0tIG9wdGlvbmFsIHBvcnQgbnVtYmVyICh6ZXJvIGlmIHBvcnQgaXMgbm90IHNwZWNpZmllZCkuCisgICAgdHJhbnNwb3J0IC0tIHRyYW5zcG9ydCBwYXJhbWV0ZXIsIG9yIGVtcHR5IGlmIHRyYW5zcG9ydCBpcyBub3QKKyAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLgorCisgICAgIiIiCisgICAgc2NoZW1lID0gIiIKKyAgICB1c2VyID0gIiIKKyAgICBob3N0ID0gIiIKKyAgICBwb3J0ID0gMAorICAgIHRyYW5zcG9ydCA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJpPU5vbmUpOgorICAgICAgICBpZiB1cmk6CisgICAgICAgICAgICBzZWxmLmRlY29kZSh1cmkpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIHVyaSk6CisgICAgICAgICIiIlBhcnNlIFNJUCBVUkwuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgdXJpIC0tIHRoZSBVUkkgc3RyaW5nLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNjaGVtZSwgc2VsZi51c2VyLCBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi50cmFuc3BvcnQgPSBcCisgICAgICAgICAgICBfcGpzdWEucGFyc2Vfc2ltcGxlX3VyaSh1cmkpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYpOgorICAgICAgICAiIiJFbmNvZGUgdGhpcyBvYmplY3QgaW50byBTSVAgVVJJIHN0cmluZy4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBVUkkgc3RyaW5nLgorCisgICAgICAgICIiIgorICAgICAgICBvdXRwdXQgPSBzZWxmLnNjaGVtZSArICI6IgorICAgICAgICBpZiBzZWxmLnVzZXIgYW5kIGxlbihzZWxmLnVzZXIpOgorICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgc2VsZi51c2VyICsgIkAiCisgICAgICAgIG91dHB1dCA9IG91dHB1dCArIHNlbGYuaG9zdAorICAgICAgICBpZiBzZWxmLnBvcnQ6CisgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyAiOiIgKyBvdXRwdXQoc2VsZi5wb3J0KQorICAgICAgICBpZiBzZWxmLnRyYW5zcG9ydDoKKyAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArICI7dHJhbnNwb3J0PSIgKyBzZWxmLnRyYW5zcG9ydAorICAgICAgICByZXR1cm4gb3V0cHV0CisKKworY2xhc3MgQXV0aENyZWQ6CisgICAgIiIiQXV0aGVudGljYXRpb24gY3JlZGVudGlhbCBmb3IgU0lQIG9yIFRVUk4gYWNjb3VudC4KKyAgICAKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIHNjaGVtZSAgICAgIC0tIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSAoZGVmYXVsdCBpcyAiRGlnZXN0IikKKyAgICByZWFsbSAgICAgICAtLSByZWFsbQorICAgIHVzZXJuYW1lICAgIC0tIHVzZXJuYW1lCisgICAgcGFzc3dkX3R5cGUgLS0gcGFzc3dvcmQgZW5jb2RpbmcgKHplcm8gZm9yIHBsYWluLXRleHQpCisgICAgcGFzc3dkICAgICAgLS0gdGhlIHBhc3N3b3JkCisgICAgIiIiCisgICAgc2NoZW1lID0gIkRpZ2VzdCIKKyAgICByZWFsbSA9ICIqIgorICAgIHVzZXJuYW1lID0gIiIKKyAgICBwYXNzd2RfdHlwZSA9IDAKKyAgICBwYXNzd2QgPSAiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dkLCBzY2hlbWU9IkRpZ2VzdCIsIHBhc3N3ZF90eXBlPTApOgorICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQorICAgICAgICBzZWxmLnJlYWxtID0gcmVhbG0KKyAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCisgICAgICAgIHNlbGYucGFzc3dkX3R5cGUgPSBwYXNzd2RfdHlwZQorICAgICAgICBzZWxmLnBhc3N3ZCA9IHBhc3N3ZAorCisKK2NsYXNzIEFjY291bnRDb25maWc6CisgICAgIiIiIFRoaXMgZGVzY3JpYmVzIGFjY291bnQgY29uZmlndXJhdGlvbiB0byBjcmVhdGUgYW4gYWNjb3VudC4KKworICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorCisgICAgcHJpb3JpdHkgICAgICAgICAgICAgICAgLS0gYWNjb3VudCBwcmlvcml0eSBmb3IgbWF0Y2hpbmcgaW5jb21pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy4KKyAgICBpZCAgICAgICAgICAgICAgICAgICAgICAtLSBTSVAgVVJJIG9mIHRoaXMgYWNjb3VudC4gVGhpcyBzZXR0aW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5LgorICAgIGZvcmNlX2NvbnRhY3QgICAgICAgICAgIC0tIGZvcmNlIHRvIHVzZSB0aGlzIFVSSSBhcyBDb250YWN0IFVSSS4gU2V0dGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZC4KKyAgICByZWdfdXJpICAgICAgICAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSByZWdpc3RyYXIgVVJJLiBNYW5kYXRvcnkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gaXMgcmVxdWlyZWQuCisgICAgcmVnX3RpbWVvdXQgICAgICAgICAgICAgLS0gc3BlY2lmeSB0aGUgU0lQIHJlZ2lzdHJhdGlvbiByZWZyZXNoIGludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2Vjb25kcy4KKyAgICByZXF1aXJlXzEwMHJlbCAgICAgICAgICAtLSBzcGVjaWZ5IGlmIHJlbGlhYmxlIHByb3Zpc2lvbmFsIHJlc3BvbnNlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZW5mb3JjZWQgKHdpdGggUmVxdWlyZSBoZWFkZXIpLgorICAgIHB1Ymxpc2hfZW5hYmxlZCAgICAgICAgIC0tIHNwZWNpZnkgaWYgUFVCTElTSCBzaG91bGQgYmUgdXNlZC4gV2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIHRoZSBQVUJMSVNIIHdpbGwgYmUgc2VudCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXIuCisgICAgcGlkZl90dXBsZV9pZCAgICAgICAgICAgLS0gb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB0dXBsZSBJRCBpbiBvdXRnb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJREYgZG9jdW1lbnQuCisgICAgcHJveHkgICAgICAgICAgICAgICAgICAgLS0gbGlzdCBvZiBwcm94eSBVUkkuCisgICAgYXV0aF9jcmVkICAgICAgICAgICAgICAgLS0gbGlzdCBvZiBBdXRoQ3JlZCBjb250YWluaW5nIGNyZWRlbnRpYWxzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHJlZ2lzdHJhcnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3hpZXMuCisgICAgYXV0aF9pbml0aWFsX3NlbmQgICAgICAgLS0gc3BlY2lmeSBpZiBlbXB0eSBBdXRob3JpemF0aW9uIGhlYWRlciBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50LiBNYXkgYmUgbmVlZGVkIGZvciBJTVMuCisgICAgYXV0aF9pbml0aWFsX2FsZ29yaXRobSAgLS0gd2hlbiBhdXRoX2luaXRpYWxfc2VuZCBpcyBlbmFibGVkLCBvcHRpb25hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXMgYXJlICJtZDUiLCAiYWthdjEtbWQ1Iiwgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWthdjItbWQ1Ii4gCisgICAgdHJhbnNwb3J0X2lkICAgICAgICAgICAgLS0gb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB0cmFuc3BvcnQgSUQgdG8gYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgYWNjb3VudC4gU2hvdWxkbid0IGJlIG5lZWRlZCB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BlY2lmaWMgcmVxdWlyZW1lbnRzIChlLmcuIGluIG11bHRpLWhvbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW8pLgorICAgIGFsbG93X2NvbnRhY3RfcmV3cml0ZSAgIC0tIHNwZWNpZnkgd2hldGhlciB0aGUgYWNjb3VudCBzaG91bGQgbGVhcm4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFjdCBhZGRyZXNzIGZyb20gUkVHSVNURVIgcmVzcG9uc2UgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0aGUgcmVnaXN0cmF0aW9uIGFjY29yZGluZ2x5LiBEZWZhdWx0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZS4KKyAgICBrYV9pbnRlcnZhbCAgICAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSBpbnRlcnZhbCB0byBzZW5kIE5BVCBrZWVwLWFsaXZlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC4KKyAgICBrYV9kYXRhICAgICAgICAgICAgICAgICAtLSBzcGVjaWZ5IHRoZSBOQVQga2VlcC1hbGl2ZSBwYWNrZXQgY29udGVudHMuCisgICAgdXNlX3NydHAgICAgICAgICAgICAgICAgLS0gc3BlY2lmeSB0aGUgU1JUUCB1c2FnZSBwb2xpY3kuIFZhbGlkIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZTogMD1kaXNhYmxlLCAxPW9wdGlvbmFsLCAyPW1hbmRhdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIDAuCisgICAgc3J0cF9zZWN1cmVfc2lnbmFsaW5nICAgLS0gc3BlY2lmeSB0aGUgc2lnbmFsaW5nIHNlY3VyaXR5IGxldmVsIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgU1JUUC4gVmFsaWQgdmFsdWVzIGFyZTogMD1ubyBzZWN1cmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGlzIHJlcXVpcmVkLCAxPWhvcC1ieS1ob3Agc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IHN1Y2ggYXMgVExTIGlzIHJlcXVpcmVkLCAyPWVuZC10by0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgc2VjdXJlIHRyYW5zcG9ydCBpcyByZXF1aXJlZCAoaS5lLiAic2lwcyIpLgorICAgIHJ0cF90cmFuc3BvcnRfY2ZnICAgICAgIC0tIHRoZSBydHAtdHJhbnNwb3J0LWNvbmZpZ3VyYXRpb24gdGhhdCBpcyB1c2VkZSwgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcnRwLWNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQuCisgICAgIiIiCisgICAgcHJpb3JpdHkgPSAwCisgICAgaWQgPSAiIgorICAgIGZvcmNlX2NvbnRhY3QgPSAiIgorICAgIHJlZ191cmkgPSAiIgorICAgIHJlZ190aW1lb3V0ID0gMAorICAgIHJlcXVpcmVfMTAwcmVsID0gRmFsc2UKKyAgICBwdWJsaXNoX2VuYWJsZWQgPSBGYWxzZQorICAgIHBpZGZfdHVwbGVfaWQgPSAiIgorICAgIHByb3h5ID0gW10KKyAgICBhdXRoX2NyZWQgPSBbXQorICAgIGF1dGhfaW5pdGlhbF9zZW5kID0gRmFsc2UKKyAgICBhdXRoX2luaXRpYWxfYWxnb3JpdGhtID0gIiIKKyAgICB0cmFuc3BvcnRfaWQgPSAtMQorICAgIGFsbG93X2NvbnRhY3RfcmV3cml0ZSA9IFRydWUKKyAgICBrYV9pbnRlcnZhbCA9IDE1CisgICAga2FfZGF0YSA9ICJcclxuIgorICAgIHVzZV9zcnRwID0gMAorICAgIHNydHBfc2VjdXJlX3NpZ25hbGluZyA9IDEKKyAgICBydHBfdHJhbnNwb3J0X2NmZyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkb21haW49IiIsIHVzZXJuYW1lPSIiLCBwYXNzd29yZD0iIiwgCisgICAgICAgICAgICAgICAgIGRpc3BsYXk9IiIsIHJlZ2lzdHJhcj0iIiwgcHJveHk9IiIpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uc3RydWN0IGFjY291bnQgY29uZmlnLiBJZiBkb21haW4gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCAKKyAgICAgICAgYSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBidWlsdC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgZG9tYWluICAgIC0tIGRvbWFpbiBuYW1lIG9mIHRoZSBzZXJ2ZXIuCisgICAgICAgIHVzZXJuYW1lICAtLSB1c2VyIG5hbWUuCisgICAgICAgIHBhc3N3b3JkICAtLSBwbGFpbi10ZXh0IHBhc3N3b3JkLgorICAgICAgICBkaXNwbGF5ICAgLS0gb3B0aW9uYWwgZGlzcGxheSBuYW1lIGZvciB0aGUgdXNlciBuYW1lLgorICAgICAgICByZWdpc3RyYXIgLS0gdGhlIHJlZ2lzdHJhciBVUkkuIElmIGRvbWFpbiBuYW1lIGlzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgYW5kIHRoaXMgYXJndW1lbnQgaXMgZW1wdHksIHRoZSByZWdpc3RyYXIgVVJJCisgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGRvbWFpbiBuYW1lLgorICAgICAgICBwcm94eSAgICAgLS0gdGhlIHByb3h5IFVSSS4gSWYgZG9tYWluIG5hbWUgaXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBhcmd1bWVudCBpcyBlbXB0eSwgdGhlIHByb3h5IFVSSQorICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBkb21haW4gbmFtZS4KKworICAgICAgICAiIiIKKyAgICAgICAgZGVmYXVsdCA9IF9wanN1YS5hY2NfY29uZmlnX2RlZmF1bHQoKQorICAgICAgICBzZWxmLl9jdnRfZnJvbV9wanN1YShkZWZhdWx0KQorICAgICAgICBpZiBkb21haW4hPSIiOgorICAgICAgICAgICAgc2VsZi5idWlsZF9jb25maWcoZG9tYWluLCB1c2VybmFtZSwgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LCByZWdpc3RyYXIsIHByb3h5KQorICAgICAgICBzZWxmLnJ0cF90cmFuc3BvcnRfY2ZnID0gVHJhbnNwb3J0Q29uZmlnKCkKKworICAgIGRlZiBidWlsZF9jb25maWcoc2VsZiwgZG9tYWluLCB1c2VybmFtZSwgcGFzc3dvcmQsIGRpc3BsYXk9IiIsCisgICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXI9IiIsIHByb3h5PSIiLCBydHBfdHJhbnNwb3J0X2NmZyA9IE5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uc3RydWN0IGFjY291bnQgY29uZmlnLiBJZiBkb21haW4gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCAKKyAgICAgICAgYSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBidWlsdC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgZG9tYWluICAgIC0tIGRvbWFpbiBuYW1lIG9mIHRoZSBzZXJ2ZXIuCisgICAgICAgIHVzZXJuYW1lICAtLSB1c2VyIG5hbWUuCisgICAgICAgIHBhc3N3b3JkICAtLSBwbGFpbi10ZXh0IHBhc3N3b3JkLgorICAgICAgICBkaXNwbGF5ICAgLS0gb3B0aW9uYWwgZGlzcGxheSBuYW1lIGZvciB0aGUgdXNlciBuYW1lLgorICAgICAgICByZWdpc3RyYXIgLS0gdGhlIHJlZ2lzdHJhciBVUkkuIElmIGRvbWFpbiBuYW1lIGlzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgYW5kIHRoaXMgYXJndW1lbnQgaXMgZW1wdHksIHRoZSByZWdpc3RyYXIgVVJJCisgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGRvbWFpbiBuYW1lLgorICAgICAgICBwcm94eSAgICAgLS0gdGhlIHByb3h5IFVSSS4gSWYgZG9tYWluIG5hbWUgaXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICBhbmQgdGhpcyBhcmd1bWVudCBpcyBlbXB0eSwgdGhlIHByb3h5IFVSSQorICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBkb21haW4gbmFtZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgZGlzcGxheSAhPSAiIjoKKyAgICAgICAgICAgIGRpc3BsYXkgPSBkaXNwbGF5ICsgIiAiCisgICAgICAgIHVzZXJwYXJ0ID0gdXNlcm5hbWUKKyAgICAgICAgaWYgdXNlcnBhcnQgIT0gIiI6CisgICAgICAgICAgICB1c2VycGFydCA9IHVzZXJwYXJ0ICsgIkAiCisgICAgICAgIHNlbGYuaWQgPSBkaXNwbGF5ICsgIjxzaXA6IiArIHVzZXJwYXJ0ICsgZG9tYWluICsgIj4iCisgICAgICAgIHNlbGYucmVnX3VyaSA9IHJlZ2lzdHJhcgorICAgICAgICBpZiBzZWxmLnJlZ191cmkgPT0gIiI6CisgICAgICAgICAgICBzZWxmLnJlZ191cmkgPSAic2lwOiIgKyBkb21haW4KKyAgICAgICAgaWYgcHJveHkgPT0gIiI6CisgICAgICAgICAgICBwcm94eSA9ICJzaXA6IiArIGRvbWFpbiArICI7bHIiCisgICAgICAgIGlmIHByb3h5LmZpbmQoIjtsciIpID09IC0xOgorICAgICAgICAgICAgcHJveHkgPSBwcm94eSArICI7bHIiCisgICAgICAgIHNlbGYucHJveHkuYXBwZW5kKHByb3h5KQorICAgICAgICBpZiB1c2VybmFtZSAhPSAiIjoKKyAgICAgICAgICAgIHNlbGYuYXV0aF9jcmVkLmFwcGVuZChBdXRoQ3JlZCgiKiIsIHVzZXJuYW1lLCBwYXNzd29yZCkpCisgICAgICAgIAorICAgICAgICBpZiAocnRwX3RyYW5zcG9ydF9jZmcgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5ydHBfdHJhbnNwb3J0X2NmZyA9IHJ0cF90cmFuc3BvcnRfY2ZnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ0cF90cmFuc3BvcnRfY2ZnID0gVHJhbnNwb3J0Q29uZmlnKCkKKyAgICAKKyAgICBkZWYgX2N2dF9mcm9tX3Bqc3VhKHNlbGYsIGNmZyk6CisgICAgICAgIHNlbGYucHJpb3JpdHkgPSBjZmcucHJpb3JpdHkKKyAgICAgICAgc2VsZi5pZCA9IGNmZy5pZAorICAgICAgICBzZWxmLmZvcmNlX2NvbnRhY3QgPSBjZmcuZm9yY2VfY29udGFjdAorICAgICAgICBzZWxmLnJlZ191cmkgPSBjZmcucmVnX3VyaQorICAgICAgICBzZWxmLnJlZ190aW1lb3V0ID0gY2ZnLnJlZ190aW1lb3V0CisgICAgICAgIHNlbGYucmVxdWlyZV8xMDByZWwgPSBjZmcucmVxdWlyZV8xMDByZWwKKyAgICAgICAgc2VsZi5wdWJsaXNoX2VuYWJsZWQgPSBjZmcucHVibGlzaF9lbmFibGVkCisgICAgICAgIHNlbGYucGlkZl90dXBsZV9pZCA9IGNmZy5waWRmX3R1cGxlX2lkCisgICAgICAgIHNlbGYucHJveHkgPSBjZmcucHJveHkKKyAgICAgICAgZm9yIGNyZWQgaW4gY2ZnLmNyZWRfaW5mbzoKKyAgICAgICAgICAgIHNlbGYuYXV0aF9jcmVkLmFwcGVuZChBdXRoQ3JlZChjcmVkLnJlYWxtLCBjcmVkLnVzZXJuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkLmRhdGEsIGNyZWQuc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWQuZGF0YV90eXBlKSkKKyAgICAgICAgc2VsZi5hdXRoX2luaXRpYWxfc2VuZCA9IGNmZy5hdXRoX2luaXRpYWxfc2VuZAorICAgICAgICBzZWxmLmF1dGhfaW5pdGlhbF9hbGdvcml0aG0gPSBjZmcuYXV0aF9pbml0aWFsX2FsZ29yaXRobQorICAgICAgICBzZWxmLnRyYW5zcG9ydF9pZCA9IGNmZy50cmFuc3BvcnRfaWQKKyAgICAgICAgc2VsZi5hbGxvd19jb250YWN0X3Jld3JpdGUgPSBjZmcuYWxsb3dfY29udGFjdF9yZXdyaXRlCisgICAgICAgIHNlbGYua2FfaW50ZXJ2YWwgPSBjZmcua2FfaW50ZXJ2YWwKKyAgICAgICAgc2VsZi5rYV9kYXRhID0gY2ZnLmthX2RhdGEKKyAgICAgICAgc2VsZi51c2Vfc3J0cCA9IGNmZy51c2Vfc3J0cAorICAgICAgICBzZWxmLnNydHBfc2VjdXJlX3NpZ25hbGluZyA9IGNmZy5zcnRwX3NlY3VyZV9zaWduYWxpbmcKKyAgICAgICAgaWYgKHNlbGYucnRwX3RyYW5zcG9ydF9jZmcgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5ydHBfdHJhbnNwb3J0X2NmZy5fY3Z0X2Zyb21fcGpzdWEoY2ZnLnJ0cF90cmFuc3BvcnRfY2ZnKQorCisgICAgZGVmIF9jdnRfdG9fcGpzdWEoc2VsZik6CisgICAgICAgIGNmZyA9IF9wanN1YS5hY2NfY29uZmlnX2RlZmF1bHQoKQorICAgICAgICBjZmcucHJpb3JpdHkgPSBzZWxmLnByaW9yaXR5CisgICAgICAgIGNmZy5pZCA9IHNlbGYuaWQKKyAgICAgICAgY2ZnLmZvcmNlX2NvbnRhY3QgPSBzZWxmLmZvcmNlX2NvbnRhY3QKKyAgICAgICAgY2ZnLnJlZ191cmkgPSBzZWxmLnJlZ191cmkKKyAgICAgICAgY2ZnLnJlZ190aW1lb3V0ID0gc2VsZi5yZWdfdGltZW91dAorICAgICAgICBjZmcucmVxdWlyZV8xMDByZWwgPSBzZWxmLnJlcXVpcmVfMTAwcmVsCisgICAgICAgIGNmZy5wdWJsaXNoX2VuYWJsZWQgPSBzZWxmLnB1Ymxpc2hfZW5hYmxlZAorICAgICAgICBjZmcucGlkZl90dXBsZV9pZCA9IHNlbGYucGlkZl90dXBsZV9pZAorICAgICAgICBjZmcucHJveHkgPSBzZWxmLnByb3h5CisgICAgICAgIGZvciBjcmVkIGluIHNlbGYuYXV0aF9jcmVkOgorICAgICAgICAgICAgYyA9IF9wanN1YS5QanNpcF9DcmVkX0luZm8oKQorICAgICAgICAgICAgYy5yZWFsbSA9IGNyZWQucmVhbG0KKyAgICAgICAgICAgIGMuc2NoZW1lID0gY3JlZC5zY2hlbWUKKyAgICAgICAgICAgIGMudXNlcm5hbWUgPSBjcmVkLnVzZXJuYW1lCisgICAgICAgICAgICBjLmRhdGFfdHlwZSA9IGNyZWQucGFzc3dkX3R5cGUKKyAgICAgICAgICAgIGMuZGF0YSA9IGNyZWQucGFzc3dkCisgICAgICAgICAgICBjZmcuY3JlZF9pbmZvLmFwcGVuZChjKQorICAgICAgICAgICAgCisgICAgICAgIGNmZy5hdXRoX2luaXRpYWxfc2VuZCA9IHNlbGYuYXV0aF9pbml0aWFsX3NlbmQKKyAgICAgICAgY2ZnLmF1dGhfaW5pdGlhbF9hbGdvcml0aG0gPSBzZWxmLmF1dGhfaW5pdGlhbF9hbGdvcml0aG0KKyAgICAgICAgY2ZnLnRyYW5zcG9ydF9pZCA9IHNlbGYudHJhbnNwb3J0X2lkCisgICAgICAgIGNmZy5hbGxvd19jb250YWN0X3Jld3JpdGUgPSBzZWxmLmFsbG93X2NvbnRhY3RfcmV3cml0ZQorICAgICAgICBjZmcua2FfaW50ZXJ2YWwgPSBzZWxmLmthX2ludGVydmFsCisgICAgICAgIGNmZy5rYV9kYXRhID0gc2VsZi5rYV9kYXRhCisgICAgICAgIGNmZy51c2Vfc3J0cCA9IHNlbGYudXNlX3NydHAKKyAgICAgICAgY2ZnLnNydHBfc2VjdXJlX3NpZ25hbGluZyA9IHNlbGYuc3J0cF9zZWN1cmVfc2lnbmFsaW5nCisKKyAgICAgICAgaWYgKHNlbGYucnRwX3RyYW5zcG9ydF9jZmcgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgY2ZnLnJ0cF90cmFuc3BvcnRfY2ZnID0gc2VsZi5ydHBfdHJhbnNwb3J0X2NmZy5fY3Z0X3RvX3Bqc3VhKCkKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjZmcKKyAKKyAKKyMgQWNjb3VudCBpbmZvcm1hdGlvbgorY2xhc3MgQWNjb3VudEluZm86CisgICAgIiIiVGhpcyBkZXNjcmliZXMgQWNjb3VudCBpbmZvLiBBcHBsaWNhdGlvbiByZXRyaXZlcyBhY2NvdW50IGluZm8KKyAgICB3aXRoIEFjY291bnQuaW5mbygpLgorCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBpc19kZWZhdWx0ICAgICAgLS0gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBkZWZhdWx0IGFjY291bnQuCisgICAgdXJpICAgICAgICAgICAgIC0tIHRoZSBhY2NvdW50IFVSSS4KKyAgICByZWdfYWN0aXZlICAgICAgLS0gVHJ1ZSBpZiByZWdpc3RyYXRpb24gaXMgYWN0aXZlIGZvciB0aGlzIGFjY291bnQuCisgICAgcmVnX2V4cGlyZXMgICAgIC0tIGNvbnRhaW5zIHRoZSBjdXJyZW50IHJlZ2lzdHJhdGlvbiBleHBpcmF0aW9uIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWNvbmRzLgorICAgIHJlZ19zdGF0dXMgICAgICAtLSB0aGUgcmVnaXN0cmF0aW9uIHN0YXR1cy4gSWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICA3MDAsIGl0IHNwZWNpZmllcyBTSVAgc3RhdHVzIGNvZGUuIFZhbHVlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHNwZWNpZmllcyB0aGUgZXJyb3IgY29kZS4KKyAgICByZWdfcmVhc29uICAgICAgLS0gY29udGFpbnMgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMgdGV4dCAoZS5nLiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgbWVzc2FnZSkuCisgICAgb25saW5lX3N0YXR1cyAgIC0tIHRoZSBhY2NvdW50J3MgcHJlc2VuY2Ugb25saW5lIHN0YXR1cywgVHJ1ZSBpZiBpdCdzIAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoaW5nIGl0c2VsZiBhcyBvbmxpbmUuCisgICAgb25saW5lX3RleHQgICAgIC0tIHRoZSBhY2NvdW50J3MgcHJlc2VuY2Ugc3RhdHVzIHRleHQuCisKKyAgICAiIiIKKyAgICBpc19kZWZhdWx0ID0gRmFsc2UKKyAgICB1cmkgPSAiIgorICAgIHJlZ19hY3RpdmUgPSBGYWxzZQorICAgIHJlZ19leHBpcmVzID0gLTEKKyAgICByZWdfc3RhdHVzID0gMAorICAgIHJlZ19yZWFzb24gPSAiIgorICAgIG9ubGluZV9zdGF0dXMgPSBGYWxzZQorICAgIG9ubGluZV90ZXh0ID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhaSk6CisgICAgICAgIHNlbGYuaXNfZGVmYXVsdCA9IGFpLmlzX2RlZmF1bHQKKyAgICAgICAgc2VsZi51cmkgPSBhaS5hY2NfdXJpCisgICAgICAgIHNlbGYucmVnX2FjdGl2ZSA9IGFpLmhhc19yZWdpc3RyYXRpb24KKyAgICAgICAgc2VsZi5yZWdfZXhwaXJlcyA9IGFpLmV4cGlyZXMKKyAgICAgICAgc2VsZi5yZWdfc3RhdHVzID0gYWkuc3RhdHVzCisgICAgICAgIHNlbGYucmVnX3JlYXNvbiA9IGFpLnN0YXR1c190ZXh0CisgICAgICAgIHNlbGYub25saW5lX3N0YXR1cyA9IGFpLm9ubGluZV9zdGF0dXMKKyAgICAgICAgc2VsZi5vbmxpbmVfdGV4dCA9IGFpLm9ubGluZV9zdGF0dXNfdGV4dAorCisjIEFjY291bnQgY2FsbGJhY2sKK2NsYXNzIEFjY291bnRDYWxsYmFjazoKKyAgICAiIiJDbGFzcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb24gYWNjb3VudCdzIGV2ZW50cy4KKworICAgIERlcml2ZSBhIGNsYXNzIGZyb20gdGhpcyBjbGFzcyBhbmQgcmVnaXN0ZXIgaXQgdG8gdGhlIEFjY291bnQgb2JqZWN0CisgICAgdXNpbmcgQWNjb3VudC5zZXRfY2FsbGJhY2soKSB0byBzdGFydCByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIEFjY291bnQKKyAgICBvYmplY3QuCisKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIGFjY291bnQgICAgIC0tIHRoZSBBY2NvdW50IG9iamVjdC4KKworICAgICIiIgorICAgIGFjY291bnQgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWNjb3VudD1Ob25lKToKKyAgICAgICAgc2VsZi5fc2V0X2FjY291bnQoYWNjb3VudCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX3NldF9hY2NvdW50KHNlbGYsIGFjY291bnQpOgorICAgICAgICBpZiBhY2NvdW50OgorICAgICAgICAgICAgc2VsZi5hY2NvdW50ID0gd2Vha3JlZi5wcm94eShhY2NvdW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hY2NvdW50ID0gTm9uZQorCisgICAgZGVmIG9uX3JlZ19zdGF0ZShzZWxmKToKKyAgICAgICAgIiIiTm90aWZpY2F0aW9uIHRoYXQgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25faW5jb21pbmdfY2FsbChzZWxmLCBjYWxsKToKKyAgICAgICAgIiIiTm90aWZpY2F0aW9uIGFib3V0IGluY29taW5nIGNhbGwuCisKKyAgICAgICAgQXBwbGljYXRpb24gc2hvdWxkIGltcGxlbWVudCBvbmUgb2Ygb25faW5jb21pbmdfY2FsbCgpIG9yCisJb25faW5jb21pbmdfY2FsbDIoKSwgb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bworICAgICAgICByZWplY3QgdGhlIGNhbGwgd2l0aCBkZWZhdWx0IHN0YXR1cyBjb2RlLiBOb3RlIHRoYXQgaWYgYm90aCBhcmUKKwlpbXBsZW1lbnRlZCwgb25seSBvbl9pbmNvbWluZ19jYWxsMigpIHdpbGwgYmUgY2FsbGVkLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBjYWxsICAgIC0tIHRoZSBuZXcgaW5jb21pbmcgY2FsbAorICAgICAgICAiIiIKKyAgICAgICAgY2FsbC5oYW5ndXAoKQorCisgICAgZGVmIG9uX2luY29taW5nX2NhbGwyKHNlbGYsIGNhbGwsIHJkYXRhKToKKyAgICAgICAgIiIiTm90aWZpY2F0aW9uIGFib3V0IGluY29taW5nIGNhbGwsIHdpdGggcmVjZWl2ZWQgU0lQIG1lc3NhZ2UgaW5mby4KKworICAgICAgICBBcHBsaWNhdGlvbiBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiBvbl9pbmNvbWluZ19jYWxsKCkgb3IKKwlvbl9pbmNvbWluZ19jYWxsMigpLCBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCisgICAgICAgIHJlamVjdCB0aGUgY2FsbCB3aXRoIGRlZmF1bHQgc3RhdHVzIGNvZGUuIE5vdGUgdGhhdCBpZiBib3RoIGFyZQorCWltcGxlbWVudGVkLCBvbmx5IG9uX2luY29taW5nX2NhbGwyKCkgd2lsbCBiZSBjYWxsZWQuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGNhbGwgICAgLS0gdGhlIG5ldyBpbmNvbWluZyBjYWxsCisgICAgICAgIHJkYXRhICAgLS0gdGhlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgIiIiCisgICAgICAgIGNhbGwuaGFuZ3VwKCkKKwkKKyAgICBkZWYgb25faW5jb21pbmdfc3Vic2NyaWJlKHNlbGYsIGJ1ZGR5LCBmcm9tX3VyaSwgY29udGFjdF91cmksIHByZXNfb2JqKToKKyAgICAgICAgIiIiTm90aWZpY2F0aW9uIHdoZW4gaW5jb21pbmcgU1VCU0NSSUJFIHJlcXVlc3QgaXMgcmVjZWl2ZWQuIAorICAgICAgICAKKyAgICAgICAgQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIGNhbGxiYWNrIHRvIGF1dGhvcml6ZSB0aGUgaW5jb21pbmcgCisgICAgICAgIHN1YnNjcmliZSByZXF1ZXN0IChlLmcuIGFzayB1c2VyIHBlcm1pc3Npb24gaWYgdGhlIHJlcXVlc3QgCisgICAgICAgIHNob3VsZCBiZSBncmFudGVkKQorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBidWRkeSAgICAgICAtLSBUaGUgYnVkZHkgb2JqZWN0LCBpZiBidWRkeSBpcyBmb3VuZC4gT3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBpcyBOb25lLgorICAgICAgICBmcm9tX3VyaSAgICAtLSBUaGUgVVJJIHN0cmluZyBvZiB0aGUgc2VuZGVyLgorICAgICAgICBwcmVzX29iaiAgICAtLSBPcGFxdWUgcHJlc2VuY2Ugc3Vic2NyaXB0aW9uIG9iamVjdCwgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJ5IEFjY291bnQucHJlc19ub3RpZnkoKQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIFR1cGxlIChjb2RlLCByZWFzb24pLCB3aGVyZToKKyAgICAgICAgICAgICBjb2RlOiAgICAgIFRoZSBzdGF0dXMgY29kZS4gSWYgY29kZSBpcyA+PSAzMDAsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBpcyByZWplY3RlZC4gSWYgY29kZSBpcyAyMDAsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBpcyBhY2NlcHRlZCBhbmQgTk9USUZZIHdpbGwgYmUgc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseS4gSWYgY29kZSBpcyAyMDIsIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGFjY2VwdCBvciByZWplY3QgdGhlIHJlcXVlc3QgbGF0ZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudC5wcmVzc19ub3RpZnkoKS4KKyAgICAgICAgICAgICByZWFzb246ICAgIE9wdGlvbmFsIHJlYXNvbiBwaHJhc2UsIG9yIE5vbmUgdG8gdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCByZWFzb2ggcGhyYXNlIGZvciB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKDIwMCwgTm9uZSkKKworICAgIGRlZiBvbl9wYWdlcihzZWxmLCBmcm9tX3VyaSwgY29udGFjdCwgbWltZV90eXBlLCBib2R5KToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiB0aGF0IGluY29taW5nIGluc3RhbnQgbWVzc2FnZSBpcyByZWNlaXZlZCBvbgorICAgICAgICB0aGlzIGFjY291bnQuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGZyb21fdXJpICAgLS0gc2VuZGVyJ3MgVVJJCisgICAgICAgIGNvbnRhY3QgICAgLS0gc2VuZGVyJ3MgQ29udGFjdCBVUkkKKyAgICAgICAgbWltZV90eXBlICAtLSBNSU1FIHR5cGUgb2YgdGhlIGluc3RhbnQgbWVzc2FnZSBib2R5CisgICAgICAgIGJvZHkgICAgICAgLS0gdGhlIGluc3RhbnQgbWVzc2FnZSBib2R5CisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBvbl9wYWdlcl9zdGF0dXMoc2VsZiwgdG9fdXJpLCBib2R5LCBpbV9pZCwgY29kZSwgcmVhc29uKToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiBhYm91dCB0aGUgZGVsaXZlcnkgc3RhdHVzIG9mIHByZXZpb3VzbHkgc2VudAorICAgICAgICBpbnN0YW50IG1lc3NhZ2UuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHRvX3VyaSAgLS0gdGhlIGRlc3RpbmF0aW9uIFVSSSBvZiB0aGUgbWVzc2FnZQorICAgICAgICBib2R5ICAgIC0tIHRoZSBtZXNzYWdlIGJvZHkKKyAgICAgICAgaW1faWQgICAtLSBtZXNzYWdlIElECisgICAgICAgIGNvZGUgICAgLS0gU0lQIHN0YXR1cyBjb2RlCisgICAgICAgIHJlYXNvbiAgLS0gU0lQIHJlYXNvbiBwaHJhc2UKKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX3R5cGluZyhzZWxmLCBmcm9tX3VyaSwgY29udGFjdCwgaXNfdHlwaW5nKToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiB0aGF0IHJlbW90ZSBpcyB0eXBpbmcgb3Igc3RvcCB0eXBpbmcuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGJ1ZGR5ICAgICAtLSBCdWRkeSBvYmplY3QgZm9yIHRoZSBzZW5kZXIsIGlmIGZvdW5kLiBPdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2lsbCBiZSBOb25lCisgICAgICAgIGZyb21fdXJpICAtLSBzZW5kZXIncyBVUkkgb2YgdGhlIGluZGljYXRpb24KKyAgICAgICAgY29udGFjdCAgIC0tIHNlbmRlcidzIGNvbnRhY3QgVVJJCisgICAgICAgIGlzX3R5cGluZyAtLSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgcmVtb3RlIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgdHlwaW5nIGFuIGluc3RhbnQgbWVzc2FnZS4KKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX213aV9pbmZvKHNlbGYsIGJvZHkpOgorICAgICAgICAiIiIKKyAgICAgICAgTm90aWZpY2F0aW9uIGFib3V0IGNoYW5nZSBpbiBNZXNzYWdlIFN1bW1hcnkgLyBNZXNzYWdlIFdhaXRpbmcKKwlJbmRpY2F0aW9uIChSRkMgMzg0Mikgc3RhdHVzLiBNV0kgc3Vic2NyaXB0aW9uIG11c3QgYmUgZW5hYmxlZAorCWluIHRoZSBhY2NvdW50IGNvbmZpZyB0byByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBib2R5ICAgICAgLS0gU3RyaW5nIGNvbnRhaW5pbmcgbWVzc2FnZSBib2R5IGFzIHJlY2VpdmVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgTk9USUZZIHJlcXVlc3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCisKK2NsYXNzIEFjY291bnQ6CisgICAgIiIiVGhpcyBkZXNjcmliZXMgU0lQIGFjY291bnQgY2xhc3MuCisKKyAgICBQSlNVQSBhY2NvdW50cyBwcm92aWRlIGlkZW50aXR5IChvciBpZGVudGl0aWVzKSBvZiB0aGUgdXNlciB3aG8gaXMgCisgICAgY3VycmVudGx5IHVzaW5nIHRoZSBhcHBsaWNhdGlvbi4gSW4gU0lQIHRlcm1zLCB0aGUgaWRlbnRpdHkgaXMgdXNlZCAKKyAgICBhcyB0aGUgRnJvbSBoZWFkZXIgaW4gb3V0Z29pbmcgcmVxdWVzdHMuCisKKyAgICBBY2NvdW50IG1heSBvciBtYXkgbm90IGhhdmUgY2xpZW50IHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVkIHdpdGggaXQuIAorICAgIEFuIGFjY291bnQgaXMgYWxzbyBhc3NvY2lhdGVkIHdpdGggcm91dGUgc2V0IGFuZCBzb21lIGF1dGhlbnRpY2F0aW9uIAorICAgIGNyZWRlbnRpYWxzLCB3aGljaCBhcmUgdXNlZCB3aGVuIHNlbmRpbmcgU0lQIHJlcXVlc3QgbWVzc2FnZXMgdXNpbmcgCisgICAgdGhlIGFjY291bnQuIEFuIGFjY291bnQgYWxzbyBoYXMgcHJlc2VuY2UncyBvbmxpbmUgc3RhdHVzLCB3aGljaCAKKyAgICB3aWxsIGJlIHJlcG9ydGVkIHRvIHJlbW90ZSBwZWVyIHdoZW4gdGhleSBzdWJzY3JpYmUgdG8gdGhlIGFjY291bnQncyAKKyAgICBwcmVzZW5jZSwgb3Igd2hpY2ggaXMgcHVibGlzaGVkIHRvIGEgcHJlc2VuY2Ugc2VydmVyIGlmIHByZXNlbmNlIAorICAgIHB1YmxpY2F0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBhY2NvdW50LgorCisgICAgQWNjb3VudCBpcyBjcmVhdGVkIHdpdGggTGliLmNyZWF0ZV9hY2NvdW50KCkuIEF0IGxlYXN0IG9uZSBhY2NvdW50IAorICAgIE1VU1QgYmUgY3JlYXRlZC4gSWYgbm8gdXNlciBhc3NvY2lhdGlvbiBpcyByZXF1aXJlZCwgYXBwbGljYXRpb24gY2FuIAorICAgIGNyZWF0ZSBhIHVzZXJsZXNzIGFjY291bnQgYnkgY2FsbGluZyBMaWIuY3JlYXRlX2FjY291bnRfZm9yX3RyYW5zcG9ydCgpLgorICAgIEEgdXNlcmxlc3MgYWNjb3VudCBpZGVudGlmaWVzIGxvY2FsIGVuZHBvaW50IGluc3RlYWQgb2YgYSBwYXJ0aWN1bGFyIAorICAgIHVzZXIsIGFuZCBpdCBjb3JyZXNwb25kIHdpdGggYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydCBpbnN0YW5jZS4KKworICAgIEFsc28gb25lIGFjY291bnQgbXVzdCBiZSBzZXQgYXMgdGhlIGRlZmF1bHQgYWNjb3VudCwgd2hpY2ggaXMgdXNlZCBhcyAKKyAgICB0aGUgYWNjb3VudCB0byB1c2Ugd2hlbiBQSlNVQSBmYWlscyB0byBtYXRjaCBhIHJlcXVlc3Qgd2l0aCBhbnkgb3RoZXIKKyAgICBhY2NvdW50cy4KKworICAgICIiIgorICAgIF9pZCA9IC0xICAgICAgICAKKyAgICBfbGliID0gTm9uZQorICAgIF9jYiA9IEFjY291bnRDYWxsYmFjayhOb25lKQorICAgIF9vYmpfbmFtZSA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGliLCBpZCwgY2I9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCB0aGlzIGNsYXNzLiBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBieSBMaWIgY2xhc3MgYW5kCisgICAgICAgIG5vdCBieSBhcHBsaWNhdGlvbi4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgbGliIC0tIHRoZSBMaWIgaW5zdGFuY2UuCisgICAgICAgIGlkICAtLSB0aGUgcGpzdWEgYWNjb3VudCBJRC4KKyAgICAgICAgY2IgIC0tIEFjY291bnRDYWxsYmFjayBpbnN0YW5jZSB0byByZWNlaXZlIGV2ZW50cyBmcm9tIHRoaXMgQWNjb3VudC4KKyAgICAgICAgICAgICAgIElmIGNhbGxiYWNrIGlzIG5vdCBzcGVjaWZpZWQgaGVyZSwgaXQgbXVzdCBiZSBzZXQgbGF0ZXIKKyAgICAgICAgICAgICAgIHVzaW5nIHNldF9jYWxsYmFjaygpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5faWQgPSBpZAorICAgICAgICBzZWxmLl9saWIgPSB3ZWFrcmVmLnJlZihsaWIpCisgICAgICAgIHNlbGYuX29ial9uYW1lID0gIntBY2NvdW50ICIgKyBzZWxmLmluZm8oKS51cmkgKyAifSIKKyAgICAgICAgc2VsZi5zZXRfY2FsbGJhY2soY2IpCisgICAgICAgIF9wanN1YS5hY2Nfc2V0X3VzZXJfZGF0YShzZWxmLl9pZCwgc2VsZikKKyAgICAgICAgX1RyYWNlKChzZWxmLCAnY3JlYXRlZCcpKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2lkICE9IC0xOgorICAgICAgICAgICAgX3Bqc3VhLmFjY19zZXRfdXNlcl9kYXRhKHNlbGYuX2lkLCAwKQorICAgICAgICBfVHJhY2UoKHNlbGYsICdkZXN0cm95ZWQnKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb2JqX25hbWUKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICAiIiJSZXRyaWV2ZSBBY2NvdW50SW5mbyBmb3IgdGhpcyBhY2NvdW50LgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgYWkgPSBfcGpzdWEuYWNjX2dldF9pbmZvKHNlbGYuX2lkKQorICAgICAgICBpZiBhaT09Tm9uZToKKyAgICAgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soImluZm8oKSIsIHNlbGYsIC0xLCAiSW52YWxpZCBhY2NvdW50IikKKyAgICAgICAgcmV0dXJuIEFjY291bnRJbmZvKGFpKQorCisgICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgaWYgdGhpcyBhY2NvdW50IGlzIHN0aWxsIHZhbGlkLgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICByZXR1cm4gX3Bqc3VhLmFjY19pc192YWxpZChzZWxmLl9pZCkKKworICAgIGRlZiBzZXRfY2FsbGJhY2soc2VsZiwgY2IpOgorICAgICAgICAiIiJSZWdpc3RlciBjYWxsYmFjayB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGlzIG9iamVjdC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBjYiAgLS0gQWNjb3VudENhbGxiYWNrIGluc3RhbmNlLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBjYjoKKyAgICAgICAgICAgIHNlbGYuX2NiID0gY2IKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NiID0gQWNjb3VudENhbGxiYWNrKHNlbGYpCisgICAgICAgIHNlbGYuX2NiLl9zZXRfYWNjb3VudChzZWxmKQorCisgICAgZGVmIHNldF9kZWZhdWx0KHNlbGYpOgorICAgICAgICAiIiIgU2V0IHRoaXMgYWNjb3VudCBhcyBkZWZhdWx0IGFjY291bnQgdG8gc2VuZCBvdXRnb2luZyByZXF1ZXN0cworICAgICAgICBhbmQgYXMgdGhlIGFjY291bnQgdG8gcmVjZWl2ZSBpbmNvbWluZyByZXF1ZXN0cyB3aGVuIG1vcmUgZXhhY3QKKyAgICAgICAgbWF0Y2hpbmcgY3JpdGVyaWEgZmFpbHMuCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuYWNjX3NldF9kZWZhdWx0KHNlbGYuX2lkKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJzZXRfZGVmYXVsdCgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGlzX2RlZmF1bHQoc2VsZik6CisgICAgICAgICIiIiBDaGVjayBpZiB0aGlzIGFjY291bnQgaXMgdGhlIGRlZmF1bHQgYWNjb3VudC4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZGVmX2lkID0gX3Bqc3VhLmFjY19nZXRfZGVmYXVsdCgpCisgICAgICAgIHJldHVybiBzZWxmLmlzX3ZhbGlkKCkgYW5kIGRlZl9pZD09c2VsZi5faWQKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgICIiIiBEZWxldGUgdGhpcyBhY2NvdW50LgorICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5hY2Nfc2V0X3VzZXJfZGF0YShzZWxmLl9pZCwgMCkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygiZGVsZXRlKCkiLCBzZWxmLCBlcnIpCisgICAgICAgIGVyciA9IF9wanN1YS5hY2NfZGVsKHNlbGYuX2lkKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJkZWxldGUoKSIsIHNlbGYsIGVycikKKyAgICAgICAgc2VsZi5faWQgPSAtMQorCisgICAgZGVmIHNldF9iYXNpY19zdGF0dXMoc2VsZiwgaXNfb25saW5lKToKKyAgICAgICAgIiIiIFNldCBiYXNpYyBwcmVzZW5jZSBzdGF0dXMgb2YgdGhpcyBhY2NvdW50LgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgIGlzX29ubGluZSAgIC0tIGJvb2xlYW4gdG8gaW5kaWNhdGUgYmFzaWMgcHJlc2VuY2UgYXZhaWxhYmlsaXR5LgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuYWNjX3NldF9vbmxpbmVfc3RhdHVzKHNlbGYuX2lkLCBpc19vbmxpbmUpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInNldF9iYXNpY19zdGF0dXMoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiBzZXRfcHJlc2VuY2Vfc3RhdHVzKHNlbGYsIGlzX29ubGluZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHk9UHJlc2VuY2VBY3Rpdml0eS5VTktOT1dOLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzX3RleHQ9IiIsIHJwaWRfaWQ9IiIpOgorICAgICAgICAiIiIgU2V0IHByZXNlbmNlIHN0YXR1cyBvZiB0aGlzIGFjY291bnQuIAorICAgICAgICAKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGlzX29ubGluZSAgIC0tIGJvb2xlYW4gdG8gaW5kaWNhdGUgYmFzaWMgcHJlc2VuY2UgYXZhaWxhYmlsaXR5CisgICAgICAgIGFjdGl2aXR5ICAgIC0tIHZhbHVlIGZyb20gUHJlc2VuY2VBY3Rpdml0eQorICAgICAgICBwcmVzX3RleHQgICAtLSBvcHRpb25hbCBzdHJpbmcgdG8gY29udmV5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5IChzdWNoIGFzICJPbiB0aGUgcGhvbmUiKQorICAgICAgICBycGlkX2lkICAgICAtLSBvcHRpb25hbCBzdHJpbmcgdG8gYmUgcGxhY2VkIGFzIFJQSUQgSUQuIAorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuYWNjX3NldF9vbmxpbmVfc3RhdHVzMihzZWxmLl9pZCwgaXNfb25saW5lLCBhY3Rpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc190ZXh0LCBycGlkX2lkKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJzZXRfcHJlc2VuY2Vfc3RhdHVzKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgc2V0X3JlZ2lzdHJhdGlvbihzZWxmLCByZW5ldyk6CisgICAgICAgICIiIk1hbnVhbGx5IHJlbmV3IHJlZ2lzdHJhdGlvbiBvciB1bnJlZ2lzdGVyIGZyb20gdGhlIHNlcnZlci4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICByZW5ldyAgIC0tIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciByZWdpc3RyYXRpb24gaXMgcmVuZXdlZC4KKyAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdmFsdWUgZm9yIEZhbHNlIHdpbGwgdHJpZ2dlciB1bnJlZ2lzdHJhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmFjY19zZXRfcmVnaXN0cmF0aW9uKHNlbGYuX2lkLCByZW5ldykKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygic2V0X3JlZ2lzdHJhdGlvbigpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIHNldF90cmFuc3BvcnQoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgIiIiU2V0IHRoaXMgYWNjb3VudCB0byBvbmx5IHVzZSB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydCB0byBzZW5kCisgICAgICAgIG91dGdvaW5nIHJlcXVlc3RzLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgIHRyYW5zcG9ydCAgIC0tIFRyYW5zcG9ydCBvYmplY3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5hY2Nfc2V0X3RyYW5zcG9ydChzZWxmLl9pZCwgdHJhbnNwb3J0Ll9pZCkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygic2V0X3RyYW5zcG9ydCgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIG1ha2VfY2FsbChzZWxmLCBkc3RfdXJpLCBjYj1Ob25lLCBoZHJfbGlzdD1Ob25lKToKKyAgICAgICAgIiIiTWFrZSBvdXRnb2luZyBjYWxsIHRvIHRoZSBzcGVjaWZpZWQgVVJJLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBkc3RfdXJpICAtLSBEZXN0aW5hdGlvbiBTSVAgVVJJLgorICAgICAgICBjYiAgICAgICAtLSBDYWxsQ2FsbGJhY2sgaW5zdGFuY2UgdG8gYmUgaW5zdGFsbGVkIHRvIHRoZSBuZXdseQorICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIENhbGwgb2JqZWN0LiBJZiB0aGlzIENhbGxDYWxsYmFjayBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIChpLmUuIE5vbmUgaXMgZ2l2ZW4pLCBpdCBtdXN0IGJlIGluc3RhbGxlZAorICAgICAgICAgICAgICAgICAgICBsYXRlciB1c2luZyBjYWxsLnNldF9jYWxsYmFjaygpLgorICAgICAgICBoZHJfbGlzdCAtLSBPcHRpb25hbCBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIG91dGdvaW5nCisgICAgICAgICAgICAgICAgICAgIElOVklURQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIENhbGwgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBjYWxsID0gQ2FsbChzZWxmLl9saWIoKSwgLTEsIGNiKQorICAgICAgICBlcnIsIGNpZCA9IF9wanN1YS5jYWxsX21ha2VfY2FsbChzZWxmLl9pZCwgZHN0X3VyaSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwsIExpYi5fY3JlYXRlX21zZ19kYXRhKGhkcl9saXN0KSkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygibWFrZV9jYWxsKCkiLCBzZWxmLCBlcnIpCisgICAgICAgIGNhbGwuYXR0YWNoX3RvX2lkKGNpZCkKKyAgICAgICAgcmV0dXJuIGNhbGwKKworICAgIGRlZiBhZGRfYnVkZHkoc2VsZiwgdXJpLCBjYj1Ob25lKToKKyAgICAgICAgIiIiQWRkIG5ldyBidWRkeS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICB1cmkgICAgIC0tIFNJUCBVUkkgb2YgdGhlIGJ1ZGR5CisgICAgICAgIGNiICAgICAgLS0gQnVkZHlDYWxsYmFjayBpbnN0YW5jZSB0byBiZSBpbnN0YWxsZWQgdG8gdGhlIG5ld2x5CisgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBCdWRkeSBvYmplY3QuIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgIChpLmUuIE5vbmUgaXMgZ2l2ZW4pLCBpdCBtdXN0IGJlIGluc3RhbGxlZCBsYXRlciB1c2luZworICAgICAgICAgICAgICAgICAgIGJ1ZGR5LnNldF9jYWxsYmFjaygpLgorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIEJ1ZGR5IG9iamVjdAorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgYnVkZHlfY2ZnID0gX3Bqc3VhLmJ1ZGR5X2NvbmZpZ19kZWZhdWx0KCkKKyAgICAgICAgYnVkZHlfY2ZnLnVyaSA9IHVyaQorICAgICAgICBidWRkeV9jZmcuc3Vic2NyaWJlID0gRmFsc2UKKyAgICAgICAgZXJyLCBidWRkeV9pZCA9IF9wanN1YS5idWRkeV9hZGQoYnVkZHlfY2ZnKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJhZGRfYnVkZHkoKSIsIHNlbGYsIGVycikKKyAgICAgICAgYnVkZHkgPSBCdWRkeShzZWxmLl9saWIoKSwgYnVkZHlfaWQsIHNlbGYsIGNiKQorICAgICAgICByZXR1cm4gYnVkZHkKKworICAgIGRlZiBwcmVzX25vdGlmeShzZWxmLCBwcmVzX29iaiwgc3RhdGUsIHJlYXNvbj0iIiwgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIlNlbmQgTk9USUZZIHRvIGluZm9ybSBhY2NvdW50IHByZXNlbmNlIHN0YXR1cyBvciB0byB0ZXJtaW5hdGUKKyAgICAgICAgc2VydmVyIHNpZGUgcHJlc2VuY2Ugc3Vic2NyaXB0aW9uLgorICAgICAgICAKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHByZXNfb2JqICAgIC0tIFRoZSBzdWJzY3JpcHRpb24gb2JqZWN0IGZyb20gb25faW5jb21pbmdfc3Vic2NyaWJlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sKKyAgICAgICAgc3RhdGUgICAgICAgLS0gU3Vic2NyaXB0aW9uIHN0YXRlLCBmcm9tIFN1YnNjcmlwdGlvblN0YXRlCisgICAgICAgIHJlYXNvbiAgICAgIC0tIE9wdGlvbmFsIHJlYXNvbiBwaHJhc2UuCisgICAgICAgIGhkcl9saXN0ICAgIC0tIE9wdGlvbmFsIGhlYWRlciBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgX3Bqc3VhLmFjY19wcmVzX25vdGlmeShzZWxmLl9pZCwgcHJlc19vYmosIHN0YXRlLCByZWFzb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYi5fY3JlYXRlX21zZ19kYXRhKGhkcl9saXN0KSkKKyAgICAKKyAgICBkZWYgc2VuZF9wYWdlcihzZWxmLCB1cmksIHRleHQsIGltX2lkPTAsIGNvbnRlbnRfdHlwZT0idGV4dC9wbGFpbiIsIFwKKyAgICAgICAgICAgICAgICAgICBoZHJfbGlzdD1Ob25lKToKKyAgICAgICAgIiIiU2VuZCBpbnN0YW50IG1lc3NhZ2UgdG8gYXJiaXRyYXJ5IFVSSS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgdGV4dCAgICAgICAgIC0tIEluc3RhbnQgbWVzc2FnZSB0byBiZSBzZW50CisgICAgICAgIHVyaSAgICAgICAgICAtLSBVUkkgdG8gc2VuZCB0aGUgSW5zdGFudCBNZXNzYWdlIHRvLgorICAgICAgICBpbV9pZCAgICAgICAgLS0gT3B0aW9uYWwgaW5zdGFudCBtZXNzYWdlIElEIHRvIGlkZW50aWZ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbnQgbWVzc2FnZSB3aGVuIGRlbGl2ZXJ5IHN0YXR1cyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkLgorICAgICAgICBjb250ZW50X3R5cGUgLS0gTUlNRSB0eXBlIGlkZW50aWZ5aW5nIHRoZSBpbnN0YW50IG1lc3NhZ2UKKyAgICAgICAgaGRyX2xpc3QgICAgIC0tIE9wdGlvbmFsIGxpc3Qgb2YgaGVhZGVycyB0byBiZSBzZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuaW1fc2VuZChzZWxmLl9pZCwgdXJpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwgdGV4dCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1faWQpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInNlbmRfcGFnZXIoKSIsIHNlbGYsIGVycikKKworY2xhc3MgQ2FsbENhbGxiYWNrOgorICAgICIiIkNsYXNzIHRvIHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9uIGZyb20gQ2FsbCBvYmplY3RzLiAKKworICAgIFVzZSBDYWxsLnNldF9jYWxsYmFjaygpIG1ldGhvZCB0byBpbnN0YWxsIGluc3RhbmNlIG9mIHRoaXMgY2FsbGJhY2sgCisgICAgY2xhc3MgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgb2JqZWN0LgorCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBjYWxsICAgIC0tIHRoZSBDYWxsIG9iamVjdC4KKworICAgICIiIgorICAgIGNhbGwgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FsbD1Ob25lKToKKyAgICAgICAgc2VsZi5fc2V0X2NhbGwoY2FsbCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX3NldF9jYWxsKHNlbGYsIGNhbGwpOgorICAgICAgICBpZiBjYWxsOgorICAgICAgICAgICAgc2VsZi5jYWxsID0gd2Vha3JlZi5wcm94eShjYWxsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jYWxsID0gTm9uZQorCisgICAgZGVmIG9uX3N0YXRlKHNlbGYpOgorICAgICAgICAiIiJOb3RpZmljYXRpb24gdGhhdCB0aGUgY2FsbCdzIHN0YXRlIGhhcyBjaGFuZ2VkLgorCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25fbWVkaWFfc3RhdGUoc2VsZik6CisgICAgICAgICIiIk5vdGlmaWNhdGlvbiB0aGF0IHRoZSBjYWxsJ3MgbWVkaWEgc3RhdGUgaGFzIGNoYW5nZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBvbl9kdG1mX2RpZ2l0KHNlbGYsIGRpZ2l0cyk6CisgICAgICAgICIiIk5vdGlmaWNhdGlvbiBvbiBpbmNvbWluZyBEVE1GIGRpZ2l0cy4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBkaWdpdHMgIC0tIHN0cmluZyBjb250YWluaW5nIHRoZSByZWNlaXZlZCBkaWdpdHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBvbl90cmFuc2Zlcl9yZXF1ZXN0KHNlbGYsIGRzdCwgY29kZSk6CisgICAgICAgICIiIk5vdGlmaWNhdGlvbiB0aGF0IGNhbGwgaXMgYmVpbmcgdHJhbnNmZXJlZCBieSByZW1vdGUgcGFydHkuIAorCisgICAgICAgIEFwcGxpY2F0aW9uIGNhbiBkZWNpZGUgdG8gYWNjZXB0L3JlamVjdCB0cmFuc2ZlciByZXF1ZXN0IGJ5IHJldHVybmluZworICAgICAgICBjb2RlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1MDAuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFjY2VwdCAKKyAgICAgICAgdGhlIHRyYW5zZmVyIGJ5IHJldHVybmluZyAyMDIuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGRzdCAgICAgLS0gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uIFVSSQorICAgICAgICBjb2RlICAgIC0tIHRoZSBzdWdnZXN0ZWQgc3RhdHVzIGNvZGUgdG8gcmV0dXJuIHRvIGFjY2VwdCB0aGUgcmVxdWVzdC4KKworICAgICAgICBSZXR1cm46CisgICAgICAgIHRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDIwMiB0byBhY2NlcHQgdGhlIHJlcXVlc3QsIG9yIDMwMC02OTkgdG8KKyAgICAgICAgcmVqZWN0IHRoZSByZXF1ZXN0LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY29kZQorCisgICAgZGVmIG9uX3RyYW5zZmVyX3N0YXR1cyhzZWxmLCBjb2RlLCByZWFzb24sIGZpbmFsLCBjb250KToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHByZXZpb3VzIGNhbGwgdHJhbnNmZXIgcmVxdWVzdC4gCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGNvZGUgICAgLS0gU0lQIHN0YXR1cyBjb2RlIHRvIGluZGljYXRlIGNvbXBsZXRpb24gc3RhdHVzLgorICAgICAgICB0ZXh0ICAgIC0tIFNJUCBzdGF0dXMgcmVhc29uIHBocmFzZS4KKyAgICAgICAgZmluYWwgICAtLSBpZiBUcnVlIHRoZW4gdGhpcyBpcyBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlcgorICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBzZW50IGZvciB0aGlzIGNhbGwgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMuCisgICAgICAgIGNvbnQgICAgLS0gc3VnZ2VzdGVkIHJldHVybiB2YWx1ZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGZhbHNlIHRoZW4gbm8gZnVydGhlciBub3RpZmljYXRpb24gd2lsbAorICAgICAgICBiZSBzZW50IGZvciB0aGUgdHJhbnNmZXIgcmVxdWVzdCBmb3IgdGhpcyBjYWxsLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY29udAorCisgICAgZGVmIG9uX3JlcGxhY2VfcmVxdWVzdChzZWxmLCBjb2RlLCByZWFzb24pOgorICAgICAgICAiIiJOb3RpZmljYXRpb24gd2hlbiBpbmNvbWluZyBJTlZJVEUgd2l0aCBSZXBsYWNlcyBoZWFkZXIgaXMgcmVjZWl2ZWQuIAorCisgICAgICAgIEFwcGxpY2F0aW9uIG1heSByZWplY3QgdGhlIHJlcXVlc3QgYnkgcmV0dXJuaW5nIHZhbHVlIGdyZWF0aGVyIHRoYW4KKyAgICAgICAgb3IgZXF1YWwgdG8gNTAwLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhY2NlcHQgdGhlIHJlcXVlc3QuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGNvZGUgICAgLS0gZGVmYXVsdCBzdGF0dXMgY29kZSB0byByZXR1cm4KKyAgICAgICAgcmVhc29uICAtLSBkZWZhdWx0IHJlYXNvbiBwaHJhc2UgdG8gcmV0dXJuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiAoY29kZSwgcmVhc29uKSB0dXBsZS4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGNvZGUsIHJlYXNvbgorCisgICAgZGVmIG9uX3JlcGxhY2VkKHNlbGYsIG5ld19jYWxsKToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgY2FsbCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggbmV3X2NhbGwuIAorICAgICAgICBBZnRlciB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCwgdGhpcyBjYWxsIHdpbGwgYmUgZGlzY29ubmVjdGVkLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBuZXdfY2FsbCAgICAtLSB0aGUgbmV3IGNhbGwgdGhhdCB3aWxsIHJlcGxhY2UgdGhpcyBjYWxsLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX3BhZ2VyKHNlbGYsIG1pbWVfdHlwZSwgYm9keSk6CisgICAgICAgICIiIgorICAgICAgICBOb3RpZmljYXRpb24gdGhhdCBpbmNvbWluZyBpbnN0YW50IG1lc3NhZ2UgaXMgcmVjZWl2ZWQgb24KKyAgICAgICAgdGhpcyBjYWxsLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBtaW1lX3R5cGUgIC0tIE1JTUUgdHlwZSBvZiB0aGUgaW5zdGFudCBtZXNzYWdlIGJvZHkuCisgICAgICAgIGJvZHkgICAgICAgLS0gdGhlIGluc3RhbnQgbWVzc2FnZSBib2R5LgorCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25fcGFnZXJfc3RhdHVzKHNlbGYsIGJvZHksIGltX2lkLCBjb2RlLCByZWFzb24pOgorICAgICAgICAiIiIKKyAgICAgICAgTm90aWZpY2F0aW9uIGFib3V0IHRoZSBkZWxpdmVyeSBzdGF0dXMgb2YgcHJldmlvdXNseSBzZW50CisgICAgICAgIGluc3RhbnQgbWVzc2FnZS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgYm9keSAgICAtLSBtZXNzYWdlIGJvZHkKKyAgICAgICAgaW1faWQgICAtLSBtZXNzYWdlIElECisgICAgICAgIGNvZGUgICAgLS0gU0lQIHN0YXR1cyBjb2RlCisgICAgICAgIHJlYXNvbiAgLS0gU0lQIHJlYXNvbiBwaHJhc2UKKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX3R5cGluZyhzZWxmLCBpc190eXBpbmcpOgorICAgICAgICAiIiIKKyAgICAgICAgTm90aWZpY2F0aW9uIHRoYXQgcmVtb3RlIGlzIHR5cGluZyBvciBzdG9wIHR5cGluZy4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgaXNfdHlwaW5nIC0tIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciByZW1vdGUgaXMgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICB0eXBpbmcgYW4gaW5zdGFudCBtZXNzYWdlLgorCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgQ2FsbEluZm86CisgICAgIiIiVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCBDYWxsLgorCisgICAgQXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoaXMgaW5mb3JtYXRpb24gd2l0aCBDYWxsLmluZm8oKS4KKworICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorCisgICAgcm9sZSAgICAgICAgICAgIC0tIENhbGxSb2xlCisgICAgYWNjb3VudCAgICAgICAgIC0tIEFjY291bnQgb2JqZWN0LgorICAgIHVyaSAgICAgICAgICAgICAtLSBTSVAgVVJJIG9mIGxvY2FsIGFjY291bnQuCisgICAgY29udGFjdCAgICAgICAgIC0tIGxvY2FsIENvbnRhY3QgVVJJLgorICAgIHJlbW90ZV91cmkgICAgICAtLSByZW1vdGUgU0lQIFVSSS4KKyAgICByZW1vdGVfY29udGFjdCAgLS0gcmVtb3RlIENvbnRhY3QgVVJJCisgICAgc2lwX2NhbGxfaWQgICAgIC0tIGNhbGwncyBDYWxsLUlEIGlkZW50aWZpY2F0aW9uCisgICAgc3RhdGUgICAgICAgICAgIC0tIENhbGxTdGF0ZQorICAgIHN0YXRlX3RleHQgICAgICAtLSBzdGF0ZSB0ZXh0LgorICAgIGxhc3RfY29kZSAgICAgICAtLSBsYXN0IFNJUCBzdGF0dXMgY29kZQorICAgIGxhc3RfcmVhc29uICAgICAtLSB0ZXh0IHBocmFzZSBmb3IgbGFzdF9jb2RlCisgICAgbWVkaWFfc3RhdGUgICAgIC0tIE1lZGlhU3RhdGUKKyAgICBtZWRpYV9kaXIgICAgICAgLS0gTWVkaWFEaXIKKyAgICBjb25mX3Nsb3QgICAgICAgLS0gY29uZmVyZW5jZSBzbG90IG51bWJlciBmb3IgdGhpcyBjYWxsLgorICAgIGNhbGxfdGltZSAgICAgICAtLSBjYWxsJ3MgY29ubmVjdGVkIGR1cmF0aW9uIGluIHNlY29uZHMuCisgICAgdG90YWxfdGltZSAgICAgIC0tIHRvdGFsIGNhbGwgZHVyYXRpb24gaW4gc2Vjb25kcy4KKyAgICAiIiIKKyAgICByb2xlID0gQ2FsbFJvbGUuQ0FMTEVSCisgICAgYWNjb3VudCA9IE5vbmUKKyAgICB1cmkgPSAiIgorICAgIGNvbnRhY3QgPSAiIgorICAgIHJlbW90ZV91cmkgPSAiIgorICAgIHJlbW90ZV9jb250YWN0ID0gIiIKKyAgICBzaXBfY2FsbF9pZCA9ICIiCisgICAgc3RhdGUgPSBDYWxsU3RhdGUuTlVMTAorICAgIHN0YXRlX3RleHQgPSAiIgorICAgIGxhc3RfY29kZSA9IDAKKyAgICBsYXN0X3JlYXNvbiA9ICIiCisgICAgbWVkaWFfc3RhdGUgPSBNZWRpYVN0YXRlLk5VTEwKKyAgICBtZWRpYV9kaXIgPSBNZWRpYURpci5OVUxMCisgICAgY29uZl9zbG90ID0gLTEKKyAgICBjYWxsX3RpbWUgPSAwCisgICAgdG90YWxfdGltZSA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaWI9Tm9uZSwgY2k9Tm9uZSk6CisgICAgICAgIGlmIGxpYiBhbmQgY2k6CisgICAgICAgICAgICBzZWxmLl9jdnRfZnJvbV9wanN1YShsaWIsIGNpKQorCisgICAgZGVmIF9jdnRfZnJvbV9wanN1YShzZWxmLCBsaWIsIGNpKToKKyAgICAgICAgc2VsZi5yb2xlID0gY2kucm9sZQorICAgICAgICBzZWxmLmFjY291bnQgPSBsaWIuX2xvb2t1cF9hY2NvdW50KGNpLmFjY19pZCkKKyAgICAgICAgc2VsZi51cmkgPSBjaS5sb2NhbF9pbmZvCisgICAgICAgIHNlbGYuY29udGFjdCA9IGNpLmxvY2FsX2NvbnRhY3QKKyAgICAgICAgc2VsZi5yZW1vdGVfdXJpID0gY2kucmVtb3RlX2luZm8KKyAgICAgICAgc2VsZi5yZW1vdGVfY29udGFjdCA9IGNpLnJlbW90ZV9jb250YWN0CisgICAgICAgIHNlbGYuc2lwX2NhbGxfaWQgPSBjaS5jYWxsX2lkCisgICAgICAgIHNlbGYuc3RhdGUgPSBjaS5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlX3RleHQgPSBjaS5zdGF0ZV90ZXh0CisgICAgICAgIHNlbGYubGFzdF9jb2RlID0gY2kubGFzdF9zdGF0dXMKKyAgICAgICAgc2VsZi5sYXN0X3JlYXNvbiA9IGNpLmxhc3Rfc3RhdHVzX3RleHQKKyAgICAgICAgc2VsZi5tZWRpYV9zdGF0ZSA9IGNpLm1lZGlhX3N0YXR1cworICAgICAgICBzZWxmLm1lZGlhX2RpciA9IGNpLm1lZGlhX2RpcgorICAgICAgICBzZWxmLmNvbmZfc2xvdCA9IGNpLmNvbmZfc2xvdAorICAgICAgICBzZWxmLmNhbGxfdGltZSA9IGNpLmNvbm5lY3RfZHVyYXRpb24gLyAxMDAwCisgICAgICAgIHNlbGYudG90YWxfdGltZSA9IGNpLnRvdGFsX2R1cmF0aW9uIC8gMTAwMAorCisKK2NsYXNzIENhbGw6CisgICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIFNJUCBjYWxsLgorCisgICAgQXBwbGljYXRpb24gaW5pdGlhdGVzIG91dGdvaW5nIGNhbGwgd2l0aCBBY2NvdW50Lm1ha2VfY2FsbCgpLCBhbmQKKyAgICBpbmNvbWluZyBjYWxscyBhcmUgcmVwb3J0ZWQgaW4gQWNjb3VudENhbGxiYWNrLm9uX2luY29taW5nX2NhbGwoKS4KKyAgICAiIiIKKyAgICBfaWQgPSAtMQorICAgIF9jYiA9IE5vbmUKKyAgICBfbGliID0gTm9uZQorICAgIF9vYmpfbmFtZSA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGliLCBjYWxsX2lkLCBjYj1Ob25lKToKKyAgICAgICAgc2VsZi5fbGliID0gd2Vha3JlZi5yZWYobGliKQorICAgICAgICBzZWxmLnNldF9jYWxsYmFjayhjYikKKyAgICAgICAgc2VsZi5hdHRhY2hfdG9faWQoY2FsbF9pZCkKKyAgICAgICAgX1RyYWNlKChzZWxmLCAnY3JlYXRlZCcpKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2lkICE9IC0xOgorICAgICAgICAgICAgX3Bqc3VhLmNhbGxfc2V0X3VzZXJfZGF0YShzZWxmLl9pZCwgMCkKKyAgICAgICAgX1RyYWNlKChzZWxmLCAnZGVzdHJveWVkJykpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX29ial9uYW1lCisKKyAgICBkZWYgYXR0YWNoX3RvX2lkKHNlbGYsIGNhbGxfaWQpOgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBpZiBzZWxmLl9pZCAhPSAtMToKKyAgICAgICAgICAgIF9wanN1YS5jYWxsX3NldF91c2VyX2RhdGEoc2VsZi5faWQsIDApCisgICAgICAgIHNlbGYuX2lkID0gY2FsbF9pZAorICAgICAgICBpZiBzZWxmLl9pZCAhPSAtMToKKyAgICAgICAgICAgIF9wanN1YS5jYWxsX3NldF91c2VyX2RhdGEoc2VsZi5faWQsIHNlbGYpCisgICAgICAgICAgICBzZWxmLl9vYmpfbmFtZSA9ICJ7Q2FsbCAiICsgc2VsZi5pbmZvKCkucmVtb3RlX3VyaSArICJ9IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fb2JqX25hbWUgPSAie0NhbGwgb2JqZWN0fSIKKworICAgIGRlZiBzZXRfY2FsbGJhY2soc2VsZiwgY2IpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IGNhbGxiYWNrIG9iamVjdCB0byByZXRyaWV2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhpcyBjYWxsLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBjYiAgLS0gQ2FsbENhbGxiYWNrIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY2I6CisgICAgICAgICAgICBzZWxmLl9jYiA9IGNiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jYiA9IENhbGxDYWxsYmFjayhzZWxmKQorICAgICAgICBzZWxmLl9jYi5fc2V0X2NhbGwoc2VsZikKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSBDYWxsSW5mby4KKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGNpID0gX3Bqc3VhLmNhbGxfZ2V0X2luZm8oc2VsZi5faWQpCisgICAgICAgIGlmIG5vdCBjaToKKyAgICAgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soImluZm8iLCBzZWxmLCAtMSwgIkludmFsaWQgY2FsbCIpCisgICAgICAgIGNhbGxfaW5mbyA9IENhbGxJbmZvKHNlbGYuX2xpYigpLCBjaSkKKyAgICAgICAgcmV0dXJuIGNhbGxfaW5mbworCisgICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgaWYgdGhpcyBjYWxsIGlzIHN0aWxsIHZhbGlkLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgcmV0dXJuIF9wanN1YS5jYWxsX2lzX2FjdGl2ZShzZWxmLl9pZCkKKworICAgIGRlZiBkdW1wX3N0YXR1cyhzZWxmLCB3aXRoX21lZGlhPVRydWUsIGluZGVudD0iIiwgbWF4X2xlbj0xMDI0KToKKyAgICAgICAgIiIiCisgICAgICAgIER1bXAgdGhlIGNhbGwgc3RhdHVzLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgcmV0dXJuIF9wanN1YS5jYWxsX2R1bXAoc2VsZi5faWQsIHdpdGhfbWVkaWEsIG1heF9sZW4sIGluZGVudCkKKworICAgIGRlZiBhbnN3ZXIoc2VsZiwgY29kZT0yMDAsIHJlYXNvbj0iIiwgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBTZW5kIHByb3Zpc2lvbmFsIG9yIGZpbmFsIHJlc3BvbnNlIHRvIGluY29taW5nIGNhbGwuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGNvZGUgICAgIC0tIFNJUCBzdGF0dXMgY29kZS4KKyAgICAgICAgcmVhc29uICAgLS0gUmVhc29uIHBocmFzZS4gUHV0IGVtcHR5IHRvIHNlbmQgZGVmYXVsdCByZWFzb24KKyAgICAgICAgICAgICAgICAgICAgcGhyYXNlIGZvciB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGhkcl9saXN0IC0tIE9wdGlvbmFsIGxpc3Qgb2YgaGVhZGVycyB0byBiZSBzZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgIElOVklURSByZXNwb25zZS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmNhbGxfYW5zd2VyKHNlbGYuX2lkLCBjb2RlLCByZWFzb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCkpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soImFuc3dlcigpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGhhbmd1cChzZWxmLCBjb2RlPTYwMywgcmVhc29uPSIiLCBoZHJfbGlzdD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlcm1pbmF0ZSB0aGUgY2FsbC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgY29kZSAgICAgLS0gU0lQIHN0YXR1cyBjb2RlLgorICAgICAgICByZWFzb24gICAtLSBSZWFzb24gcGhyYXNlLiBQdXQgZW1wdHkgdG8gc2VuZCBkZWZhdWx0IHJlYXNvbgorICAgICAgICAgICAgICAgICAgICBwaHJhc2UgZm9yIHRoZSBzdGF0dXMgY29kZS4KKyAgICAgICAgaGRyX2xpc3QgLS0gT3B0aW9uYWwgbGlzdCBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmNhbGxfaGFuZ3VwKHNlbGYuX2lkLCBjb2RlLCByZWFzb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCkpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soImhhbmd1cCgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGhvbGQoc2VsZiwgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBQdXQgdGhlIGNhbGwgb24gaG9sZC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgaGRyX2xpc3QgLS0gT3B0aW9uYWwgbGlzdCBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5jYWxsX3NldF9ob2xkKHNlbGYuX2lkLCBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCkpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soImhvbGQoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiB1bmhvbGQoc2VsZiwgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZWxlYXNlIHRoZSBjYWxsIGZyb20gaG9sZC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgaGRyX2xpc3QgLS0gT3B0aW9uYWwgbGlzdCBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmNhbGxfcmVpbnZpdGUoc2VsZi5faWQsIFRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYi5fY3JlYXRlX21zZ19kYXRhKGhkcl9saXN0KSkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygidW5ob2xkKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgcmVpbnZpdGUoc2VsZiwgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBTZW5kIHJlLUlOVklURSBhbmQgb3B0aW9uYWxseSBvZmZlciBuZXcgY29kZWNzIHRvIHVzZS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgaGRyX2xpc3QgICAtLSBPcHRpb25hbCBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5jYWxsX3JlaW52aXRlKHNlbGYuX2lkLCBUcnVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCkpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInJlaW52aXRlKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGhkcl9saXN0PU5vbmUsIG9wdGlvbnM9MCk6CisgICAgICAgICIiIgorICAgICAgICBTZW5kIFVQREFURSBhbmQgb3B0aW9uYWxseSBvZmZlciBuZXcgY29kZWNzIHRvIHVzZS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgaGRyX2xpc3QgICAtLSBPcHRpb25hbCBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICAgIG9wdGlvbnMgICAgLS0gTXVzdCBiZSB6ZXJvIGZvciBub3cuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5jYWxsX3VwZGF0ZShzZWxmLl9pZCwgb3B0aW9ucywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYi5fY3JlYXRlX21zZ19kYXRhKGhkcl9saXN0KSkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygidXBkYXRlKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgdHJhbnNmZXIoc2VsZiwgZGVzdF91cmksIGhkcl9saXN0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgVHJhbnNmZXIgdGhlIGNhbGwgdG8gbmV3IGRlc3RpbmF0aW9uLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBkZXN0X3VyaSAtLSBTcGVjaWZ5IHRoZSBTSVAgVVJJIHRvIHRyYW5zZmVyIHRoZSBjYWxsIHRvLgorICAgICAgICBoZHJfbGlzdCAtLSBPcHRpb25hbCBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY2FsbF94ZmVyKHNlbGYuX2lkLCBkZXN0X3VyaSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCkpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInRyYW5zZmVyKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgdHJhbnNmZXJfdG9fY2FsbChzZWxmLCBjYWxsLCBoZHJfbGlzdD1Ob25lLCBvcHRpb25zPTApOgorICAgICAgICAiIiIKKyAgICAgICAgQXR0ZW5kZWQgY2FsbCB0cmFuc2Zlci4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgY2FsbCAgICAgLS0gVGhlIENhbGwgb2JqZWN0IHRvIHRyYW5zZmVyIGNhbGwgdG8uCisgICAgICAgIGhkcl9saXN0IC0tIE9wdGlvbmFsIGxpc3Qgb2YgaGVhZGVycyB0byBiZSBzZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCisgICAgICAgIG9wdGlvbnMgIC0tIE11c3QgYmUgemVybyBmb3Igbm93LgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY2FsbF94ZmVyX3JlcGxhY2VzKHNlbGYuX2lkLCBjYWxsLl9pZCwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpYi5fY3JlYXRlX21zZ19kYXRhKGhkcl9saXN0KSkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygidHJhbnNmZXJfdG9fY2FsbCgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGRpYWxfZHRtZihzZWxmLCBkaWdpdHMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VuZCBEVE1GIGRpZ2l0cyB3aXRoIFJUUCBldmVudCBwYWNrYWdlLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBkaWdpdHMgIC0tIERUTUYgZGlnaXQgc3RyaW5nLgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY2FsbF9kaWFsX2R0bWYoc2VsZi5faWQsIGRpZ2l0cykKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygiZGlhbF9kdG1mKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgc2VuZF9yZXF1ZXN0KHNlbGYsIG1ldGhvZCwgaGRyX2xpc3Q9Tm9uZSwgY29udGVudF90eXBlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBib2R5PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VuZCBhcmJpdHJhcnkgcmVxdWVzdCB0byByZW1vdGUgY2FsbC4gCisgICAgICAgIAorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSB0byBzZW5kIElORk8gcmVxdWVzdC4gTm90ZSB0aGF0IHRoaXMgCisgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byBzZW5kIHJlcXVlc3QgdGhhdCB3aWxsIGNoYW5nZSB0aGUgCisgICAgICAgIGNhbGwgc3RhdGUgc3VjaCBhcyBDQU5DRUwgb3IgQllFLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBtZXRob2QgICAgICAgLS0gU0lQIG1ldGhvZCBuYW1lLgorICAgICAgICBoZHJfbGlzdCAgICAgLS0gT3B0aW9uYWwgaGVhZGVyIGxpc3QgdG8gYmUgc2VudCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAgICBjb250ZW50X3R5cGUgLS0gQ29udGVudCB0eXBlIHRvIGRlc2NyaWJlIHRoZSBib2R5LCBpZiB0aGUgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudAorICAgICAgICBib2R5ICAgICAgICAgLS0gT3B0aW9uYWwgU0lQIG1lc3NhZ2UgYm9keS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgaWYgaGRyX2xpc3Qgb3IgYm9keToKKyAgICAgICAgICAgIG1zZ19kYXRhID0gX3Bqc3VhLk1zZ19EYXRhKCkKKyAgICAgICAgICAgIGlmIGhkcl9saXN0OgorICAgICAgICAgICAgICAgIG1zZ19kYXRhLmhkcl9saXN0ID0gaGRyX2xpc3QKKyAgICAgICAgICAgIGlmIGNvbnRlbnRfdHlwZToKKyAgICAgICAgICAgICAgICBtc2dfZGF0YS5jb250ZW50X3R5cGUgPSBjb250ZW50X3R5cGUKKyAgICAgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICAgICAgbXNnX2RhdGEubXNnX2JvZHkgPSBib2R5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2dfZGF0YSA9IE5vbmUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZXJyID0gX3Bqc3VhLmNhbGxfc2VuZF9yZXF1ZXN0KHNlbGYuX2lkLCBtZXRob2QsIG1zZ19kYXRhKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJzZW5kX3JlcXVlc3QoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiBzZW5kX3BhZ2VyKHNlbGYsIHRleHQsIGltX2lkPTAsIGNvbnRlbnRfdHlwZT0idGV4dC9wbGFpbiIsIAorICAgIAkJICAgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIlNlbmQgaW5zdGFudCBtZXNzYWdlIGluc2lkZSBhIGNhbGwuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHRleHQgICAgICAgICAtLSBJbnN0YW50IG1lc3NhZ2UgdG8gYmUgc2VudAorICAgICAgICBpbV9pZCAgICAgICAgLS0gT3B0aW9uYWwgaW5zdGFudCBtZXNzYWdlIElEIHRvIGlkZW50aWZ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbnQgbWVzc2FnZSB3aGVuIGRlbGl2ZXJ5IHN0YXR1cyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkLgorICAgICAgICBjb250ZW50X3R5cGUgLS0gTUlNRSB0eXBlIGlkZW50aWZ5aW5nIHRoZSBpbnN0YW50IG1lc3NhZ2UKKyAgICAgICAgaGRyX2xpc3QgICAgIC0tIE9wdGlvbmFsIGxpc3Qgb2YgaGVhZGVycyB0byBiZSBzZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY2FsbF9zZW5kX2ltKHNlbGYuX2lkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwgdGV4dCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1faWQpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInNlbmRfcGFnZXIoKSIsIHNlbGYsIGVycikKKworICAKK2NsYXNzIEJ1ZGR5SW5mbzoKKyAgICAiIiJUaGlzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IEJ1ZGR5LiBBcHBsaWNhdGlvbiBtYXkgCisgICAgcmV0cmlldmUgdGhpcyBpbmZvcm1hdGlvbiBieSBjYWxsaW5nIEJ1ZGR5LmluZm8oKS4KKworICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorCisgICAgdXJpICAgICAgICAgICAgIC0tIHRoZSBCdWRkeSBVUkkuCisgICAgY29udGFjdCAgICAgICAgIC0tIHRoZSBCdWRkeSBDb250YWN0IFVSSSwgaWYgYXZhaWxhYmxlLgorICAgIG9ubGluZV9zdGF0dXMgICAtLSB0aGUgcHJlc2VuY2Ugb25saW5lIHN0YXR1cy4KKyAgICBvbmxpbmVfdGV4dCAgICAgLS0gdGhlIHByZXNlbmNlIG9ubGluZSBzdGF0dXMgdGV4dC4KKyAgICBhY3Rpdml0eSAgICAgICAgLS0gdGhlIFByZXNlbmNlQWN0aXZpdHkKKyAgICBzdWJzY3JpYmVkICAgICAgLS0gc3BlY2lmeSB3aGV0aGVyIGJ1ZGR5J3MgcHJlc2VuY2Ugc3RhdHVzIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzdWJzY3JpYmVkLgorICAgIHN1Yl9zdGF0ZSAgICAgICAtLSBTdWJzY3JpcHRpb25TdGF0ZQorICAgIHN1Yl90ZXJtX3JlYXNvbiAtLSBUaGUgdGVybWluYXRpb24gcmVhc29uIHN0cmluZyBvZiB0aGUgbGFzdCBwcmVzZW5jZQorICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gdG8gdGhpcyBidWRkeSwgaWYgYW55LgorICAgICIiIgorICAgIHVyaSA9ICIiCisgICAgY29udGFjdCA9ICIiCisgICAgb25saW5lX3N0YXR1cyA9IDAKKyAgICBvbmxpbmVfdGV4dCA9ICIiCisgICAgYWN0aXZpdHkgPSBQcmVzZW5jZUFjdGl2aXR5LlVOS05PV04KKyAgICBzdWJzY3JpYmVkID0gRmFsc2UKKyAgICBzdWJfc3RhdGUgPSBTdWJzY3JpcHRpb25TdGF0ZS5OVUxMCisgICAgc3ViX3Rlcm1fcmVhc29uID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwanN1YV9iaT1Ob25lKToKKyAgICAgICAgaWYgcGpzdWFfYmk6CisgICAgICAgICAgICBzZWxmLl9jdnRfZnJvbV9wanN1YShwanN1YV9iaSkKKworICAgIGRlZiBfY3Z0X2Zyb21fcGpzdWEoc2VsZiwgaW5mKToKKyAgICAgICAgc2VsZi51cmkgPSBpbmYudXJpCisgICAgICAgIHNlbGYuY29udGFjdCA9IGluZi5jb250YWN0CisgICAgICAgIHNlbGYub25saW5lX3N0YXR1cyA9IGluZi5zdGF0dXMKKyAgICAgICAgc2VsZi5vbmxpbmVfdGV4dCA9IGluZi5zdGF0dXNfdGV4dAorICAgICAgICBzZWxmLmFjdGl2aXR5ID0gaW5mLmFjdGl2aXR5CisgICAgICAgIHNlbGYuc3Vic2NyaWJlZCA9IGluZi5tb25pdG9yX3ByZXMKKyAgICAgICAgc2VsZi5zdWJfc3RhdGUgPSBpbmYuc3ViX3N0YXRlCisgICAgICAgIHNlbGYuc3ViX3Rlcm1fcmVhc29uID0gaW5mLnN1Yl90ZXJtX3JlYXNvbgorCisKK2NsYXNzIEJ1ZGR5Q2FsbGJhY2s6CisgICAgIiIiVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgYWJvdXQgQnVkZHkncworICAgIHByZXNlbmNlIHN0YXR1cyBjaGFuZ2UuIEFwcGxpY2F0aW9uIG5lZWRzIHRvIGRlcml2ZSBhIGNsYXNzIGZyb20KKyAgICB0aGlzIGNsYXNzLCBhbmQgcmVnaXN0ZXIgdGhlIGluc3RhbmNlIHdpdGggQnVkZHkuc2V0X2NhbGxiYWNrKCkuCisKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKworICAgIGJ1ZGR5ICAgLS0gdGhlIEJ1ZGR5IG9iamVjdC4KKyAgICAiIiIKKyAgICBidWRkeSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWRkeT1Ob25lKToKKyAgICAgICAgc2VsZi5fc2V0X2J1ZGR5KGJ1ZGR5KQorCisgICAgZGVmIF9zZXRfYnVkZHkoc2VsZiwgYnVkZHkpOgorICAgICAgICBpZiBidWRkeToKKyAgICAgICAgICAgIHNlbGYuYnVkZHkgPSB3ZWFrcmVmLnByb3h5KGJ1ZGR5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWRkeSA9IE5vbmUKKworICAgIGRlZiBvbl9zdGF0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWNhdGlvbiB0aGF0IGJ1ZGR5J3MgcHJlc2VuY2Ugc3RhdGUgaGFzIGNoYW5nZWQuIEFwcGxpY2F0aW9uCisgICAgICAgIG1heSB0aGVuIHJldHJpZXZlIHRoZSBuZXcgc3RhdHVzIHdpdGggQnVkZHkuaW5mbygpIGZ1bmN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworICAgCisgICAgZGVmIG9uX3BhZ2VyKHNlbGYsIG1pbWVfdHlwZSwgYm9keSk6CisgICAgICAgICIiIk5vdGlmaWNhdGlvbiB0aGF0IGluY29taW5nIGluc3RhbnQgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tCisgICAgICAgIHRoaXMgYnVkZHkuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIG1pbWVfdHlwZSAgLS0gTUlNRSB0eXBlIG9mIHRoZSBpbnN0YW50IG1lc3NhZ2UgYm9keQorICAgICAgICBib2R5ICAgICAgIC0tIHRoZSBpbnN0YW50IG1lc3NhZ2UgYm9keQorCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25fcGFnZXJfc3RhdHVzKHNlbGYsIGJvZHksIGltX2lkLCBjb2RlLCByZWFzb24pOgorICAgICAgICAiIiJOb3RpZmljYXRpb24gYWJvdXQgdGhlIGRlbGl2ZXJ5IHN0YXR1cyBvZiBwcmV2aW91c2x5IHNlbnQKKyAgICAgICAgaW5zdGFudCBtZXNzYWdlLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBib2R5ICAgIC0tIHRoZSBtZXNzYWdlIGJvZHkKKyAgICAgICAgaW1faWQgICAtLSBtZXNzYWdlIElECisgICAgICAgIGNvZGUgICAgLS0gU0lQIHN0YXR1cyBjb2RlCisgICAgICAgIHJlYXNvbiAgLS0gU0lQIHJlYXNvbiBwaHJhc2UKKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX3R5cGluZyhzZWxmLCBpc190eXBpbmcpOgorICAgICAgICAiIiJOb3RpZmljYXRpb24gdGhhdCByZW1vdGUgaXMgdHlwaW5nIG9yIHN0b3AgdHlwaW5nLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBpc190eXBpbmcgLS0gYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIHJlbW90ZSBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgIHR5cGluZyBhbiBpbnN0YW50IG1lc3NhZ2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCitjbGFzcyBCdWRkeToKKyAgICAiIiJBIEJ1ZGR5IHJlcHJlc2VudHMgcGVyc29uIG9yIHJlbW90ZSBhZ2VudC4KKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIHN1YnNjcmliZSB0byBidWRkeSdzIHByZXNlbmNlIGFuZAorICAgIHRvIHNlbmQgb3IgcmVjZWl2ZSBpbnN0YW50IG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZGR5LgorICAgICIiIgorICAgIF9pZCA9IC0xCisgICAgX2xpYiA9IE5vbmUKKyAgICBfY2IgPSBOb25lCisgICAgX29ial9uYW1lID0gIiIKKyAgICBfYWNjID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpYiwgaWQsIGFjY291bnQsIGNiKToKKyAgICAgICAgc2VsZi5faWQgPSBpZAorICAgICAgICBzZWxmLl9saWIgPSB3ZWFrcmVmLnJlZihsaWIpCisgICAgICAgIHNlbGYuX2FjYyA9IHdlYWtyZWYucmVmKGFjY291bnQpCisgICAgICAgIHNlbGYuX29ial9uYW1lID0gIntCdWRkeSAiICsgc2VsZi5pbmZvKCkudXJpICsgIn0iCisgICAgICAgIHNlbGYuc2V0X2NhbGxiYWNrKGNiKQorICAgICAgICBfcGpzdWEuYnVkZHlfc2V0X3VzZXJfZGF0YShzZWxmLl9pZCwgc2VsZikKKyAgICAgICAgX1RyYWNlKChzZWxmLCAnY3JlYXRlZCcpKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2lkICE9IC0xOgorICAgICAgICAgICAgX3Bqc3VhLmJ1ZGR5X3NldF91c2VyX2RhdGEoc2VsZi5faWQsIDApCisgICAgICAgIF9UcmFjZSgoc2VsZiwgJ2Rlc3Ryb3llZCcpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9vYmpfbmFtZQorCisgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYnVkZHkgaW5mbyBhcyBCdWRkeUluZm8uCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLl9saWIoKS5hdXRvX2xvY2soKQorICAgICAgICByZXR1cm4gQnVkZHlJbmZvKF9wanN1YS5idWRkeV9nZXRfaW5mbyhzZWxmLl9pZCkpCisKKyAgICBkZWYgc2V0X2NhbGxiYWNrKHNlbGYsIGNiKToKKyAgICAgICAgIiIiSW5zdGFsbCBjYWxsYmFjayB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGlzIG9iamVjdC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBjYiAgLS0gQnVkZHlDYWxsYmFjayBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNiOgorICAgICAgICAgICAgc2VsZi5fY2IgPSBjYgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY2IgPSBCdWRkeUNhbGxiYWNrKHNlbGYpCisgICAgICAgIHNlbGYuX2NiLl9zZXRfYnVkZHkoc2VsZikKKworICAgIGRlZiBzdWJzY3JpYmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTdWJzY3JpYmUgdG8gYnVkZHkncyBwcmVzZW5jZSBzdGF0dXMgbm90aWZpY2F0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmJ1ZGR5X3N1YnNjcmliZV9wcmVzKHNlbGYuX2lkLCBUcnVlKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJzdWJzY3JpYmUoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiB1bnN1YnNjcmliZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFVuc3Vic2NyaWJlIGZyb20gYnVkZHkncyBwcmVzZW5jZSBzdGF0dXMgbm90aWZpY2F0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmJ1ZGR5X3N1YnNjcmliZV9wcmVzKHNlbGYuX2lkLCBGYWxzZSkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygidW5zdWJzY3JpYmUoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgdGhpcyBidWRkeSBmcm9tIHRoZSBidWRkeSBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgaWYgc2VsZi5faWQgIT0gLTE6CisgICAgICAgICAgICBfcGpzdWEuYnVkZHlfc2V0X3VzZXJfZGF0YShzZWxmLl9pZCwgMCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmJ1ZGR5X2RlbChzZWxmLl9pZCkKKyAgICAgICAgc2VsZi5fbGliKCkuX2Vycl9jaGVjaygiZGVsZXRlKCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgc2VuZF9wYWdlcihzZWxmLCB0ZXh0LCBpbV9pZD0wLCBjb250ZW50X3R5cGU9InRleHQvcGxhaW4iLCBcCisgICAgICAgICAgICAgICAgICAgaGRyX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIlNlbmQgaW5zdGFudCBtZXNzYWdlIHRvIHJlbW90ZSBidWRkeS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgdGV4dCAgICAgICAgIC0tIEluc3RhbnQgbWVzc2FnZSB0byBiZSBzZW50CisgICAgICAgIGltX2lkICAgICAgICAtLSBPcHRpb25hbCBpbnN0YW50IG1lc3NhZ2UgSUQgdG8gaWRlbnRpZnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudCBtZXNzYWdlIHdoZW4gZGVsaXZlcnkgc3RhdHVzIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBpcyBjYWxsZWQuCisgICAgICAgIGNvbnRlbnRfdHlwZSAtLSBNSU1FIHR5cGUgaWRlbnRpZnlpbmcgdGhlIGluc3RhbnQgbWVzc2FnZQorICAgICAgICBoZHJfbGlzdCAgICAgLS0gT3B0aW9uYWwgbGlzdCBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuX2xpYigpLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5pbV9zZW5kKHNlbGYuX2FjYygpLl9pZCwgc2VsZi5pbmZvKCkudXJpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwgdGV4dCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWIuX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1faWQpCisgICAgICAgIHNlbGYuX2xpYigpLl9lcnJfY2hlY2soInNlbmRfcGFnZXIoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiBzZW5kX3R5cGluZ19pbmQoc2VsZiwgaXNfdHlwaW5nPVRydWUsIGhkcl9saXN0PU5vbmUpOgorICAgICAgICAiIiJTZW5kIHR5cGluZyBpbmRpY2F0aW9uIHRvIHJlbW90ZSBidWRkeS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBpc190eXBpbmcgLS0gYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0ZXIgdXNlciBpcyB0eXBpbmcuCisgICAgICAgIGhkcl9saXN0ICAtLSBPcHRpb25hbCBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5fbGliKCkuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmltX3R5cGluZyhzZWxmLl9hY2MoKS5faWQsIHNlbGYuaW5mbygpLnVyaSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R5cGluZywgTGliLl9jcmVhdGVfbXNnX2RhdGEoaGRyX2xpc3QpKQorICAgICAgICBzZWxmLl9saWIoKS5fZXJyX2NoZWNrKCJzZW5kX3R5cGluZ19pbmQoKSIsIHNlbGYsIGVycikKKworCisKKyMgU291bmQgZGV2aWNlIGluZm8KK2NsYXNzIFNvdW5kRGV2aWNlSW5mbzoKKyAgICAiIiJUaGlzIGRlc2NyaWJlZCB0aGUgc291bmQgZGV2aWNlIGluZm8uCisKKyAgICBNZW1iZXIgZG9jdW1lbnRhdGlvbjoKKyAgICBuYW1lICAgICAgICAgICAgICAgIC0tIGRldmljZSBuYW1lLgorICAgIGlucHV0X2NoYW5uZWxzICAgICAgLS0gbnVtYmVyIG9mIGNhcHR1cmUgY2hhbm5lbHMgc3VwcG9ydGVkLgorICAgIG91dHB1dF9jaGFubmVscyAgICAgLS0gbnVtYmVyIG9mIHBsYXliYWNrIGNoYW5uZWxzIHN1cHBvcnRlZC4KKyAgICBkZWZhdWx0X2Nsb2NrX3JhdGUgIC0tIGRlZmF1bHQgc2FtcGxpbmcgcmF0ZS4KKyAgICAiIiIKKyAgICBuYW1lID0gIiIKKyAgICBpbnB1dF9jaGFubmVscyA9IDAKKyAgICBvdXRwdXRfY2hhbm5lbHMgPSAwCisgICAgZGVmYXVsdF9jbG9ja19yYXRlID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNkaSk6CisgICAgICAgIHNlbGYubmFtZSA9IHNkaS5uYW1lCisgICAgICAgIHNlbGYuaW5wdXRfY2hhbm5lbHMgPSBzZGkuaW5wdXRfY291bnQKKyAgICAgICAgc2VsZi5vdXRwdXRfY2hhbm5lbHMgPSBzZGkub3V0cHV0X2NvdW50CisgICAgICAgIHNlbGYuZGVmYXVsdF9jbG9ja19yYXRlID0gc2RpLmRlZmF1bHRfc2FtcGxlc19wZXJfc2VjCisKKworIyBDb2RlYyBpbmZvCitjbGFzcyBDb2RlY0luZm86CisgICAgIiIiVGhpcyBkZXNjcmliZXMgY29kZWMgaW5mby4KKworICAgIE1lbWJlciBkb2N1bWVudGF0aW9uOgorICAgIG5hbWUgICAgICAgICAgICAtLSBjb2RlYyBuYW1lCisgICAgcHJpb3JpdHkgICAgICAgIC0tIGNvZGVjIHByaW9yaXR5ICgwLTI1NSkKKyAgICBjbG9ja19yYXRlICAgICAgLS0gY2xvY2sgcmF0ZQorICAgIGNoYW5uZWxfY291bnQgICAtLSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICBhdmdfYnBzICAgICAgICAgLS0gYXZlcmFnZSBiYW5kd2lkdGggaW4gYml0cyBwZXIgc2Vjb25kCisgICAgZnJtX3B0aW1lICAgICAgIC0tIGJhc2UgZnJhbWUgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcworICAgIHB0aW1lICAgICAgICAgICAtLSBSVFAgZnJhbWUgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcy4KKyAgICBwdCAgICAgICAgICAgICAgLS0gcGF5bG9hZCB0eXBlLgorICAgIHZhZF9lbmFibGVkICAgICAtLSBzcGVjaWZ5IGlmIFZvaWNlIEFjdGl2aXR5IERldGVjdGlvbiBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KKyAgICBwbGNfZW5hYmxlZCAgICAgLS0gc3BlY2lmeSBpZiBQYWNrZXQgTG9zdCBDb25jZWFsbWVudCBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KKyAgICAiIiIKKyAgICBuYW1lID0gIiIKKyAgICBwcmlvcml0eSA9IDAKKyAgICBjbG9ja19yYXRlID0gMAorICAgIGNoYW5uZWxfY291bnQgPSAwCisgICAgYXZnX2JwcyA9IDAKKyAgICBmcm1fcHRpbWUgPSAwCisgICAgcHRpbWUgPSAwCisgICAgcHQgPSAwCisgICAgdmFkX2VuYWJsZWQgPSBGYWxzZQorICAgIHBsY19lbmFibGVkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlY19pbmZvLCBjb2RlY19wYXJhbSk6CisgICAgICAgIHNlbGYubmFtZSA9IGNvZGVjX2luZm8uY29kZWNfaWQKKyAgICAgICAgc2VsZi5wcmlvcml0eSA9IGNvZGVjX2luZm8ucHJpb3JpdHkKKyAgICAgICAgc2VsZi5jbG9ja19yYXRlID0gY29kZWNfcGFyYW0uaW5mby5jbG9ja19yYXRlCisgICAgICAgIHNlbGYuY2hhbm5lbF9jb3VudCA9IGNvZGVjX3BhcmFtLmluZm8uY2hhbm5lbF9jbnQKKyAgICAgICAgc2VsZi5hdmdfYnBzID0gY29kZWNfcGFyYW0uaW5mby5hdmdfYnBzCisgICAgICAgIHNlbGYuZnJtX3B0aW1lID0gY29kZWNfcGFyYW0uaW5mby5mcm1fcHRpbWUKKyAgICAgICAgc2VsZi5wdGltZSA9IGNvZGVjX3BhcmFtLmluZm8uZnJtX3B0aW1lICogXAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfcGFyYW0uc2V0dGluZy5mcm1fcGVyX3BrdAorICAgICAgICBzZWxmLnB0aW1lID0gY29kZWNfcGFyYW0uaW5mby5wdAorICAgICAgICBzZWxmLnZhZF9lbmFibGVkID0gY29kZWNfcGFyYW0uc2V0dGluZy52YWQKKyAgICAgICAgc2VsZi5wbGNfZW5hYmxlZCA9IGNvZGVjX3BhcmFtLnNldHRpbmcucGxjCisKKyAgICBkZWYgX2N2dF90b19wanN1YShzZWxmKToKKyAgICAgICAgY2kgPSBfcGpzdWEuQ29kZWNfSW5mbygpCisgICAgICAgIGNpLmNvZGVjX2lkID0gc2VsZi5uYW1lCisgICAgICAgIGNpLnByaW9yaXR5ID0gc2VsZi5wcmlvcml0eQorICAgICAgICByZXR1cm4gY2kKKworCisjIENvZGVjIHBhcmFtZXRlcgorY2xhc3MgQ29kZWNQYXJhbWV0ZXI6CisgICAgIiIiVGhpcyBzcGVjaWZpZXMgdmFyaW91cyBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGNvZGVjLgorCisgICAgTWVtYmVyIGRvY3VtZW50YXRpb246CisKKyAgICBwdGltZSAgICAgICAtLSBzcGVjaWZ5IHRoZSBvdXRnb2luZyBSVFAgcGFja2V0IGxlbmd0aCBpbiBtaWxsaXNlY29uZHMuCisgICAgdmFkX2VuYWJsZWQgLS0gc3BlY2lmeSBpZiBWQUQgc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgcGxjX2VuYWJsZWQgLS0gc3BlY2lmeSBpZiBQTEMgc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgIiIiCisgICAgcHRpbWUgPSAwCisgICAgdmFkX2VuYWJsZWQgPSBGYWxzZQorICAgIHBsY19lbmFibGVkID0gRmFsc2UKKyAgICBfY29kZWNfcGFyYW0gPSBOb25lCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGVjX3BhcmFtKToKKyAgICAgICAgc2VsZi5wdGltZSA9IGNvZGVjX3BhcmFtLmluZm8uZnJtX3B0aW1lICogXAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfcGFyYW0uc2V0dGluZy5mcm1fcGVyX3BrdAorICAgICAgICBzZWxmLnZhZF9lbmFibGVkID0gY29kZWNfcGFyYW0uc2V0dGluZy52YWQKKyAgICAgICAgc2VsZi5wbGNfZW5hYmxlZCA9IGNvZGVjX3BhcmFtLnNldHRpbmcucGxjCisgICAgICAgIHNlbGYuX2NvZGVjX3BhcmFtID0gY29kZWNfcGFyYW0KKworICAgIGRlZiBfY3Z0X3RvX3Bqc3VhKHNlbGYpOgorICAgICAgICBzZWxmLl9jb2RlY19wYXJhbS5zZXR0aW5nLmZybV9wZXJfcGt0ID0gc2VsZi5wdGltZSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvZGVjX3BhcmFtLmluZm8uZnJtX3B0aW1lCisgICAgICAgIHNlbGYuX2NvZGVjX3BhcmFtLnNldHRpbmcudmFkID0gc2VsZi52YWRfZW5hYmxlZAorICAgICAgICBzZWxmLl9jb2RlY19wYXJhbS5zZXR0aW5nLnBsYyA9IHNlbGYucGxjX2VuYWJsZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvZGVjX3BhcmFtCisKKworIyBMaWJyYXJ5IG11dGV4CitjbGFzcyBfTGliTXV0ZXg6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxjayk6CisgICAgICAgIHNlbGYuX2xjayA9IGxjaworICAgICAgICBzZWxmLl9sY2suYWNxdWlyZSgpCisJI19UcmFjZSgoJ2xvY2sgYWNxdWlyZWQnLCkpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbGNrLnJlbGVhc2UoKQorCSAgICAjX1RyYWNlKCgnbG9jayByZWxlYXNlZCcsKSkKKyAgICAgICAgZXhjZXB0OgorCSAgICAjX1RyYWNlKCgnbG9jayByZWxlYXNlIGVycm9yJywpKQorICAgICAgICAgICAgcGFzcworCisKKyMgUEpTVUEgTGlicmFyeQorX2xpYiA9IE5vbmUKK2VuYWJsZV90cmFjZSA9IEZhbHNlCisKK2NsYXNzIExpYjoKKyAgICAiIiJMaWJyYXJ5IGluc3RhbmNlLgorICAgIAorICAgICIiIgorICAgIF9xdWl0ID0gRmFsc2UKKyAgICBfaGFzX3RocmVhZCA9IEZhbHNlCisgICAgX2xvY2sgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGdsb2JhbCBfbGliCisgICAgICAgIGlmIF9saWI6CisgICAgICAgICAgICByYWlzZSBFcnJvcigiX19pbml0KClfXyIsIE5vbmUsIC0xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJMaWJyYXJ5IGluc3RhbmNlIGFscmVhZHkgZXhpc3QiKQorCisgICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY3JlYXRlKCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJfcGpzdWEuY3JlYXRlKCkiLCBOb25lLCBlcnIpCisgICAgICAgIF9saWIgPSBzZWxmCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgX3Bqc3VhLmRlc3Ryb3koKQorICAgICAgICBkZWwgc2VsZi5fbG9jaworICAgICAgICBfVHJhY2UoKCdMaWIgZGVzdHJveWVkJywpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGliIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpbnN0YW5jZSgpOgorICAgICAgICAiIiJSZXR1cm4gc2luZ2xldG9uIGluc3RhbmNlIG9mIExpYi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBfbGliCisKKyAgICBkZWYgaW5pdChzZWxmLCB1YV9jZmc9Tm9uZSwgbG9nX2NmZz1Ob25lLCBtZWRpYV9jZmc9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHBqc3VhIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9ucy4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgdWFfY2ZnICAgICAgLS0gb3B0aW9uYWwgVUFDb25maWcgaW5zdGFuY2UKKyAgICAgICAgbG9nX2NmZyAgICAgLS0gb3B0aW9uYWwgTG9nQ29uZmlnIGluc3RhbmNlCisgICAgICAgIG1lZGlhX2NmZyAgIC0tIG9wdGlvbmFsIE1lZGlhQ29uZmlnIGluc3RhbmNlCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCB1YV9jZmc6IHVhX2NmZyA9IFVBQ29uZmlnKCkKKyAgICAgICAgaWYgbm90IGxvZ19jZmc6IGxvZ19jZmcgPSBMb2dDb25maWcoKQorICAgICAgICBpZiBub3QgbWVkaWFfY2ZnOiBtZWRpYV9jZmcgPSBNZWRpYUNvbmZpZygpCisKKyAgICAgICAgcHlfdWFfY2ZnID0gdWFfY2ZnLl9jdnRfdG9fcGpzdWEoKQorICAgICAgICBweV91YV9jZmcuY2Iub25fY2FsbF9zdGF0ZSA9IF9jYl9vbl9jYWxsX3N0YXRlCisgICAgICAgIHB5X3VhX2NmZy5jYi5vbl9pbmNvbWluZ19jYWxsID0gX2NiX29uX2luY29taW5nX2NhbGwKKyAgICAgICAgcHlfdWFfY2ZnLmNiLm9uX2NhbGxfbWVkaWFfc3RhdGUgPSBfY2Jfb25fY2FsbF9tZWRpYV9zdGF0ZQorICAgICAgICBweV91YV9jZmcuY2Iub25fZHRtZl9kaWdpdCA9IF9jYl9vbl9kdG1mX2RpZ2l0CisgICAgICAgIHB5X3VhX2NmZy5jYi5vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QgPSBfY2Jfb25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0CisgICAgICAgIHB5X3VhX2NmZy5jYi5vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyA9IF9jYl9vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cworICAgICAgICBweV91YV9jZmcuY2Iub25fY2FsbF9yZXBsYWNlX3JlcXVlc3QgPSBfY2Jfb25fY2FsbF9yZXBsYWNlX3JlcXVlc3QKKyAgICAgICAgcHlfdWFfY2ZnLmNiLm9uX2NhbGxfcmVwbGFjZWQgPSBfY2Jfb25fY2FsbF9yZXBsYWNlZAorICAgICAgICBweV91YV9jZmcuY2Iub25fcmVnX3N0YXRlID0gX2NiX29uX3JlZ19zdGF0ZQorICAgICAgICBweV91YV9jZmcuY2Iub25faW5jb21pbmdfc3Vic2NyaWJlID0gX2NiX29uX2luY29taW5nX3N1YnNjcmliZQorICAgICAgICBweV91YV9jZmcuY2Iub25fYnVkZHlfc3RhdGUgPSBfY2Jfb25fYnVkZHlfc3RhdGUKKyAgICAgICAgcHlfdWFfY2ZnLmNiLm9uX3BhZ2VyID0gX2NiX29uX3BhZ2VyCisgICAgICAgIHB5X3VhX2NmZy5jYi5vbl9wYWdlcl9zdGF0dXMgPSBfY2Jfb25fcGFnZXJfc3RhdHVzCisgICAgICAgIHB5X3VhX2NmZy5jYi5vbl90eXBpbmcgPSBfY2Jfb25fdHlwaW5nCisJcHlfdWFfY2ZnLmNiLm9uX213aV9pbmZvID0gX2NiX29uX213aV9pbmZvOworCisgICAgICAgIGVyciA9IF9wanN1YS5pbml0KHB5X3VhX2NmZywgbG9nX2NmZy5fY3Z0X3RvX3Bqc3VhKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9jZmcuX2N2dF90b19wanN1YSgpKQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soImluaXQoKSIsIHNlbGYsIGVycikKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoZSBsaWJyYXJ5LCBhbmQgcGpzdWEuIiIiCisgICAgICAgIGdsb2JhbCBfbGliCisgICAgICAgIGlmIHNlbGYuX2hhc190aHJlYWQ6CisgICAgICAgICAgICBzZWxmLl9xdWl0ID0gMQorICAgICAgICAgICAgbG9vcCA9IDAKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuX3F1aXQgIT0gMiBhbmQgbG9vcCA8IDQwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9ldmVudHMoNSkKKyAgICAgICAgICAgICAgICBsb29wID0gbG9vcCArIDEKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDUwKQorICAgICAgICBfcGpzdWEuZGVzdHJveSgpCisgICAgICAgIF9saWIgPSBOb25lCisKKyAgICBkZWYgc3RhcnQoc2VsZiwgd2l0aF90aHJlYWQ9VHJ1ZSk6CisgICAgICAgICIiIlN0YXJ0IHRoZSBsaWJyYXJ5LiAKKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICB3aXRoX3RocmVhZCAtLSBzcGVjaWZ5IHdoZXRoZXIgdGhlIG1vZHVsZSBzaG91bGQgY3JlYXRlIHdvcmtlcgorICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJzdGFydCgpIiwgc2VsZiwgZXJyKQorICAgICAgICBzZWxmLl9oYXNfdGhyZWFkID0gd2l0aF90aHJlYWQKKyAgICAgICAgaWYgc2VsZi5faGFzX3RocmVhZDoKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXcoX3dvcmtlcl90aHJlYWRfbWFpbiwgKDAsKSkKKworICAgIGRlZiBoYW5kbGVfZXZlbnRzKHNlbGYsIHRpbWVvdXQ9NTApOgorICAgICAgICAiIiJQb2xsIHRoZSBldmVudHMgZnJvbSB1bmRlcmx5aW5nIHBqc3VhIGxpYnJhcnkuCisgICAgICAgIAorICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IHBvbGwgdGhlIHN0YWNrIHBlcmlvZGljYWxseSBpZiB3b3JrZXIgdGhyZWFkCisgICAgICAgIGlzIGRpc2FibGUgd2hlbiBzdGFydGluZyB0aGUgbGlicmFyeS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICB0aW1lb3V0IC0tIGluIG1pbGxpc2Vjb25kcy4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICByZXR1cm4gX3Bqc3VhLmhhbmRsZV9ldmVudHModGltZW91dCkKKworICAgIGRlZiB0aHJlYWRfcmVnaXN0ZXIoc2VsZiwgbmFtZSk6CisJIiIiUmVnaXN0ZXIgZXh0ZXJuYWwgdGhyZWFkcyAodGhyZWFkcyB0aGF0IGFyZSBub3QgY3JlYXRlZCBieSBQSlNJUCwKKwlzdWNoIGFzIHRocmVhZHMgdGhhdCBhcmUgY3JlYXRlZCBieSBQeXRob24gQVBJKSB0byBQSlNJUC4KKworCVRoZSBjYWxsIG11c3QgYmUgbWFkZSBmcm9tIHRoZSBuZXcgdGhyZWFkIGJlZm9yZSBjYWxsaW5nIGFueSBwamxpYiAKKwlmdW5jdGlvbnMuCisKKwlLZXl3b3JkIGFyZ3VtZW50czoKKwluYW1lCS0tIE5vbiBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgdGhyZWFkCisJIiIiCisJZHVtbXkgPSAxCisJZXJyID0gX3Bqc3VhLnRocmVhZF9yZWdpc3RlcihuYW1lLCBkdW1teSkKKwlzZWxmLl9lcnJfY2hlY2soInRocmVhZF9yZWdpc3RlcigpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIHZlcmlmeV9zaXBfdXJsKHNlbGYsIHNpcF91cmwpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHZhbGlkIFVSSS4gCisgICAgICAgIAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICBzaXBfdXJsIC0tIHRoZSBVUkwgc3RyaW5nLgorICAgICAgICAKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgMCBpcyB0aGUgdGhlIFVSSSBpcyB2YWxpZCwgb3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBlcnJvciAKKyAgICAgICAgICAgIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgcmV0dXJuIF9wanN1YS52ZXJpZnlfc2lwX3VybChzaXBfdXJsKQorCisgICAgZGVmIGNyZWF0ZV90cmFuc3BvcnQoc2VsZiwgdHlwZSwgY2ZnPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgU0lQIHRyYW5zcG9ydCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuIAorICAgICAgICAKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHR5cGUgICAgLS0gdHJhbnNwb3J0IHR5cGUgZnJvbSBUcmFuc3BvcnRUeXBlIGNvbnN0YW50LgorICAgICAgICBjZmcgICAgIC0tIFRyYW5zcG9ydENvbmZpZyBpbnN0YW5jZQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIFRyYW5zcG9ydCBvYmplY3QKKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBpZiBub3QgY2ZnOiBjZmc9VHJhbnNwb3J0Q29uZmlnKCkKKyAgICAgICAgZXJyLCB0cF9pZCA9IF9wanN1YS50cmFuc3BvcnRfY3JlYXRlKHR5cGUsIGNmZy5fY3Z0X3RvX3Bqc3VhKCkpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygiY3JlYXRlX3RyYW5zcG9ydCgpIiwgc2VsZiwgZXJyKQorICAgICAgICByZXR1cm4gVHJhbnNwb3J0KHNlbGYsIHRwX2lkKQorCisgICAgZGVmIGNyZWF0ZV9hY2NvdW50KHNlbGYsIGFjY19jb25maWcsIHNldF9kZWZhdWx0PVRydWUsIGNiPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgbmV3IGxvY2FsIHBqc3VhIGFjY291bnQgdXNpbmcgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBhY2NfY29uZmlnICAtLSBBY2NvdW50Q29uZmlnCisgICAgICAgIHNldF9kZWZhdWx0IC0tIGJvb2xlYW4gdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGlzIGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGFjY291bnQuCisgICAgICAgIGNiICAgICAgICAgIC0tIEFjY291bnRDYWxsYmFjayBpbnN0YW5jZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBBY2NvdW50IGluc3RhbmNlCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyLCBhY2NfaWQgPSBfcGpzdWEuYWNjX2FkZChhY2NfY29uZmlnLl9jdnRfdG9fcGpzdWEoKSwgc2V0X2RlZmF1bHQpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygiY3JlYXRlX2FjY291bnQoKSIsIHNlbGYsIGVycikKKyAgICAgICAgcmV0dXJuIEFjY291bnQoc2VsZiwgYWNjX2lkLCBjYikKKworICAgIGRlZiBjcmVhdGVfYWNjb3VudF9mb3JfdHJhbnNwb3J0KHNlbGYsIHRyYW5zcG9ydCwgc2V0X2RlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYj1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IGxvY2FsIHBqc3VhIHRyYW5zcG9ydCBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHRyYW5zcG9ydCAgIC0tIHRoZSBUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICAgIHNldF9kZWZhdWx0IC0tIGJvb2xlYW4gdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGlzIGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGFjY291bnQuCisgICAgICAgIGNiICAgICAgICAgIC0tIEFjY291bnRDYWxsYmFjayBpbnN0YW5jZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBBY2NvdW50IGluc3RhbmNlCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyLCBhY2NfaWQgPSBfcGpzdWEuYWNjX2FkZF9sb2NhbCh0cmFuc3BvcnQuX2lkLCBzZXRfZGVmYXVsdCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJjcmVhdGVfYWNjb3VudF9mb3JfdHJhbnNwb3J0KCkiLCBzZWxmLCBlcnIpCisgICAgICAgIHJldHVybiBBY2NvdW50KHNlbGYsIGFjY19pZCwgY2IpCisKKyAgICBkZWYgaGFuZ3VwX2FsbChzZWxmKToKKyAgICAgICAgIiIiSGFuZ3VwIGFsbCBjYWxscy4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBfcGpzdWEuY2FsbF9oYW5ndXBfYWxsKCkKKworICAgICMgU291bmQgZGV2aWNlIEFQSQorCisgICAgZGVmIGVudW1fc25kX2RldihzZWxmKToKKyAgICAgICAgIiIiRW51bWVyYXRlIHNvdW5kIGRldmljZXMgaW4gdGhlIHN5c3RlbS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBsaXN0IG9mIFNvdW5kRGV2aWNlSW5mby4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHNwZWNpZmllcworICAgICAgICAgICAgdGhlIGRldmljZSBJRCBmb3IgdGhlIGRldmljZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgc2RpX2xpc3QgPSBfcGpzdWEuZW51bV9zbmRfZGV2cygpCisgICAgICAgIGluZm8gPSBbXQorICAgICAgICBmb3Igc2RpIGluIHNkaV9saXN0OgorICAgICAgICAgICAgaW5mby5hcHBlbmQoU291bmREZXZpY2VJbmZvKHNkaSkpCisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICBkZWYgZ2V0X3NuZF9kZXYoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgZGV2aWNlIElEcyBvZiBjdXJyZW50IHNvdW5kIGRldmljZXMgdXNlZCBieSBwanN1YS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICAoY2FwdHVyZV9kZXZfaWQsIHBsYXliYWNrX2Rldl9pZCkgdHVwbGUKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgcmV0dXJuIF9wanN1YS5nZXRfc25kX2RldigpCisKKyAgICBkZWYgc2V0X3NuZF9kZXYoc2VsZiwgY2FwdHVyZV9kZXYsIHBsYXliYWNrX2Rldik6CisgICAgICAgICIiIkNoYW5nZSB0aGUgY3VycmVudCBzb3VuZCBkZXZpY2VzLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBjYXB0dXJlX2RldiAgLS0gdGhlIGRldmljZSBJRCBvZiBjYXB0dXJlIGRldmljZSB0byBiZSB1c2VkCisgICAgICAgIHBsYXliYWNrX2RldiAtLSB0aGUgZGV2aWNlIElEIG9mIHBsYXliYWNrIGRldmljZSB0byBiZSB1c2VkLgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5zZXRfc25kX2RldihjYXB0dXJlX2RldiwgcGxheWJhY2tfZGV2KQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInNldF9jdXJyZW50X3NvdW5kX2RldmljZXMoKSIsIHNlbGYsIGVycikKKyAgICAKKyAgICBkZWYgc2V0X251bGxfc25kX2RldihzZWxmKToKKyAgICAgICAgIiIiRGlzYWJsZSB0aGUgc291bmQgZGV2aWNlcy4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHN5c3RlbQorICAgICAgICBkb2VzIG5vdCBoYXZlIHNvdW5kIGRldmljZSBpbnN0YWxsZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLnNldF9udWxsX3NuZF9kZXYoKQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInNldF9udWxsX3NuZF9kZXYoKSIsIHNlbGYsIGVycikKKworICAgIAorICAgICMgQ29uZmVyZW5jZSBicmlkZ2UKKworICAgIGRlZiBjb25mX2dldF9tYXhfcG9ydHMoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY29uZmVyZW5jZSBicmlkZ2UgY2FwYWNpdHkuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgY29uZmVyZW5jZSBicmlkZ2UgY2FwYWNpdHkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgcmV0dXJuIF9wanN1YS5jb25mX2dldF9tYXhfcG9ydHMoKQorCisgICAgZGVmIGNvbmZfY29ubmVjdChzZWxmLCBzcmNfc2xvdCwgZHN0X3Nsb3QpOgorICAgICAgICAiIiJFc3RhYmxpc2ggdW5pZGlyZWN0aW9uYWwgbWVkaWEgZmxvdyBmcm9tIHNvdWNlIHRvIHNpbmsuIAorICAgICAgICAKKyAgICAgICAgT25lIHNvdXJjZSBtYXkgdHJhbnNtaXQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zL3NpbmsuIEFuZCBpZiAKKyAgICAgICAgbXVsdGlwbGUgc291cmNlcyBhcmUgdHJhbnNtaXR0aW5nIHRvIHRoZSBzYW1lIHNpbmssIHRoZSBtZWRpYSAKKyAgICAgICAgd2lsbCBiZSBtaXhlZCB0b2dldGhlci4gU291cmNlIGFuZCBzaW5rIG1heSByZWZlciB0byB0aGUgc2FtZSBJRCwgCisgICAgICAgIGVmZmVjdGl2ZWx5IGxvb3BpbmcgdGhlIG1lZGlhLgorCisgICAgICAgIElmIGJpZGlyZWN0aW9uYWwgbWVkaWEgZmxvdyBpcyBkZXNpcmVkLCBhcHBsaWNhdGlvbiBuZWVkcyB0byBjYWxsCisgICAgICAgIHRoaXMgZnVuY3Rpb24gdHdpY2UsIHdpdGggdGhlIHNlY29uZCBvbmUgaGF2aW5nIHRoZSBhcmd1bWVudHMgCisgICAgICAgIHJldmVyc2VkLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBzcmNfc2xvdCAgICAtLSBpbnRlZ2VyIHRvIGlkZW50aWZ5IHRoZSBjb25mZXJlbmNlIHNsb3QgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UvdHJhbnNtaXR0ZXIuCisgICAgICAgIGRzdF9zbG90ICAgIC0tIGludGVnZXIgdG8gaWRlbnRpZnkgdGhlIGNvbmZlcmVuY2Ugc2xvdCBudW1iZXIgb2YgICAgCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbi9yZWNlaXZlci4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY29uZl9jb25uZWN0KHNyY19zbG90LCBkc3Rfc2xvdCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJjb25mX2Nvbm5lY3QoKSIsIHNlbGYsIGVycikKKyAgICAKKyAgICBkZWYgY29uZl9kaXNjb25uZWN0KHNlbGYsIHNyY19zbG90LCBkc3Rfc2xvdCk6CisgICAgICAgICIiIkRpc2Nvbm5lY3QgbWVkaWEgZmxvdyBmcm9tIHRoZSBzb3VyY2UgdG8gZGVzdGluYXRpb24gcG9ydC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgc3JjX3Nsb3QgICAgLS0gaW50ZWdlciB0byBpZGVudGlmeSB0aGUgY29uZmVyZW5jZSBzbG90IG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlL3RyYW5zbWl0dGVyLgorICAgICAgICBkc3Rfc2xvdCAgICAtLSBpbnRlZ2VyIHRvIGlkZW50aWZ5IHRoZSBjb25mZXJlbmNlIHNsb3QgbnVtYmVyIG9mICAgIAorICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVzdGluYXRpb24vcmVjZWl2ZXIuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLmNvbmZfZGlzY29ubmVjdChzcmNfc2xvdCwgZHN0X3Nsb3QpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygiY29uZl9kaXNjb25uZWN0KCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgY29uZl9zZXRfdHhfbGV2ZWwoc2VsZiwgc2xvdCwgbGV2ZWwpOgorICAgICAgICAiIiJBZGp1c3QgdGhlIHNpZ25hbCBsZXZlbCB0byBiZSB0cmFuc21pdHRlZCBmcm9tIHRoZSBicmlkZ2UgdG8gCisgICAgICAgIHRoZSBzcGVjaWZpZWQgcG9ydCBieSBtYWtpbmcgaXQgbG91ZGVyIG9yIHF1aWV0ZXIuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHNsb3QgICAgICAgIC0tIGludGVnZXIgdG8gaWRlbnRpZnkgdGhlIGNvbmZlcmVuY2Ugc2xvdCBudW1iZXIuCisgICAgICAgIGxldmVsICAgICAgIC0tIFNpZ25hbCBsZXZlbCBhZGp1c3RtZW50LiBWYWx1ZSAxLjAgbWVhbnMgbm8gbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0bWVudCwgd2hpbGUgdmFsdWUgMCBtZWFucyB0byBtdXRlIHRoZSBwb3J0LgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY29uZl9zZXRfdHhfbGV2ZWwoc2xvdCwgbGV2ZWwpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygiY29uZl9zZXRfdHhfbGV2ZWwoKSIsIHNlbGYsIGVycikKKyAgICAgICAgCisgICAgZGVmIGNvbmZfc2V0X3J4X2xldmVsKHNlbGYsIHNsb3QsIGxldmVsKToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSBzaWduYWwgbGV2ZWwgdG8gYmUgcmVjZWl2ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQKKyAgICAgICAgKHRvIHRoZSBicmlkZ2UpIGJ5IG1ha2luZyBpdCBsb3VkZXIgb3IgcXVpZXRlci4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgc2xvdCAgICAgICAgLS0gaW50ZWdlciB0byBpZGVudGlmeSB0aGUgY29uZmVyZW5jZSBzbG90IG51bWJlci4KKyAgICAgICAgbGV2ZWwgICAgICAgLS0gU2lnbmFsIGxldmVsIGFkanVzdG1lbnQuIFZhbHVlIDEuMCBtZWFucyBubyBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RtZW50LCB3aGlsZSB2YWx1ZSAwIG1lYW5zIHRvIG11dGUgdGhlIHBvcnQuCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5jb25mX3NldF9yeF9sZXZlbChzbG90LCBsZXZlbCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJjb25mX3NldF9yeF9sZXZlbCgpIiwgc2VsZiwgZXJyKQorICAgICAgICAKKyAgICBkZWYgY29uZl9nZXRfc2lnbmFsX2xldmVsKHNlbGYsIHNsb3QpOgorICAgICAgICAiIiJHZXQgbGFzdCBzaWduYWwgbGV2ZWwgdHJhbnNtaXR0ZWQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgCisgICAgICAgIHNwZWNpZmllZCBwb3J0LiBUaGUgc2lnbmFsIGxldmVscyBhcmUgZmxvYXQgdmFsdWVzIGZyb20gMC4wIHRvIDEuMCwKKyAgICAgICAgd2l0aCAwLjAgaW5kaWNhdGVzIG5vIHNpZ25hbCwgYW5kIDEuMCBpbmRpY2F0ZXMgdGhlIGxvdWRlc3Qgc2lnbmFsCisgICAgICAgIGxldmVsLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBzbG90ICAgICAgICAtLSBpbnRlZ2VyIHRvIGlkZW50aWZ5IHRoZSBjb25mZXJlbmNlIHNsb3QgbnVtYmVyLgorCisgICAgICAgIFJldHVybiB2YWx1ZToKKyAgICAgICAgICAgICh0eF9sZXZlbCwgcnhfbGV2ZWwpIHR1cGxlLgorICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIsIHR4X2xldmVsLCByeF9sZXZlbCA9IF9wanN1YS5jb25mX2dldF9zaWduYWxfbGV2ZWwoc2xvdCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJjb25mX2dldF9zaWduYWxfbGV2ZWwoKSIsIHNlbGYsIGVycikKKyAgICAgICAgcmV0dXJuICh0eF9sZXZlbCwgcnhfbGV2ZWwpCisgICAgICAgIAorCisKKyAgICAjIENvZGVjcyBBUEkKKworICAgIGRlZiBlbnVtX2NvZGVjcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgY29kZWNzIHN1cHBvcnRlZCBieSBwanN1YS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBsaXN0IG9mIENvZGVjSW5mbworCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIGNpX2xpc3QgPSBfcGpzdWEuZW51bV9jb2RlY3MoKQorICAgICAgICBjb2RlY19pbmZvID0gW10KKyAgICAgICAgZm9yIGNpIGluIGNpX2xpc3Q6CisgICAgICAgICAgICBjcCA9IF9wanN1YS5jb2RlY19nZXRfcGFyYW0oY2kuY29kZWNfaWQpCisgICAgICAgICAgICBpZiBjcDoKKyAgICAgICAgICAgICAgICBjb2RlY19pbmZvLmFwcGVuZChDb2RlY0luZm8oY2ksIGNwKSkKKyAgICAgICAgcmV0dXJuIGNvZGVjX2luZm8KKworICAgIGRlZiBzZXRfY29kZWNfcHJpb3JpdHkoc2VsZiwgbmFtZSwgcHJpb3JpdHkpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGNvZGVjIHByaW9yaXR5LgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBuYW1lICAgICAtLSBDb2RlYyBuYW1lCisgICAgICAgIHByaW9yaXR5IC0tIENvZGVjIHByaW9yaXR5LCB3aGljaCByYW5nZSBpcyAwLTI1NS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEuY29kZWNfc2V0X3ByaW9yaXR5KG5hbWUsIHByaW9yaXR5KQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInNldF9jb2RlY19wcmlvcml0eSgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGdldF9jb2RlY19wYXJhbWV0ZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBjb2RlYyBwYXJhbWV0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIG5hbWUgICAgLS0gY29kZWMgbmFtZS4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBjcCA9IF9wanN1YS5jb2RlY19nZXRfcGFyYW0obmFtZSkKKyAgICAgICAgaWYgbm90IGNwOgorICAgICAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJnZXRfY29kZWNfcGFyYW1ldGVyKCkiLCBzZWxmLCAtMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29kZWMgbmFtZSIpCisgICAgICAgIHJldHVybiBDb2RlY1BhcmFtZXRlcihjcCkKKworICAgIGRlZiBzZXRfY29kZWNfcGFyYW1ldGVyKHNlbGYsIG5hbWUsIHBhcmFtKToKKyAgICAgICAgIiIiTW9kaWZ5IGNvZGVjIHBhcmFtZXRlciBmb3IgdGhlIHNwZWNpZmllZCBjb2RlYy4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgbmFtZSAgICAtLSBjb2RlYyBuYW1lCisgICAgICAgIHBhcmFtICAgLS0gY29kZWMgcGFyYW1ldGVyLgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5jb2RlY19zZXRfcGFyYW0obmFtZSwgcGFyYW0uX2N2dF90b19wanN1YSgpKQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInNldF9jb2RlY19wYXJhbWV0ZXIoKSIsIHNlbGYsIGVycikKKyAgICAKKyAgICAjIFdBViBwbGF5YmFjayBhbmQgcmVjb3JkaW5nCisKKyAgICBkZWYgY3JlYXRlX3BsYXllcihzZWxmLCBmaWxlbmFtZSwgbG9vcD1GYWxzZSk6CisgICAgICAgICIiIkNyZWF0ZSBXQVYgZmlsZSBwbGF5ZXIuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgZmlsZW5hbWUgICAgLS0gV0FWIGZpbGUgbmFtZQorICAgICAgICBsb29wICAgICAgICAtLSBib29sZWFuIHRvIHNwZWNpZnkgd2hldGhlciBwbGF5YmFjayBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSByZXN0YXJ0IHVwb24gRU9GCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIFdBViBwbGF5ZXIgSUQKKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBvcHQgPSAwCisgICAgICAgIGlmIG5vdCBsb29wOgorICAgICAgICAgICAgb3B0ID0gb3B0ICsgMQorICAgICAgICBlcnIsIHBsYXllcl9pZCA9IF9wanN1YS5wbGF5ZXJfY3JlYXRlKGZpbGVuYW1lLCBvcHQpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygiY3JlYXRlX3BsYXllcigpIiwgc2VsZiwgZXJyKQorICAgICAgICByZXR1cm4gcGxheWVyX2lkCisgICAgICAgIAorICAgIGRlZiBwbGF5ZXJfZ2V0X3Nsb3Qoc2VsZiwgcGxheWVyX2lkKToKKyAgICAgICAgIiIiR2V0IHRoZSBjb25mZXJlbmNlIHBvcnQgSUQgZm9yIHRoZSBzcGVjaWZpZWQgcGxheWVyLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBwbGF5ZXJfaWQgIC0tIHRoZSBXQVYgcGxheWVyIElECisgICAgICAgIAorICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBDb25mZXJlbmNlIHNsb3QgbnVtYmVyIGZvciB0aGUgcGxheWVyCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgc2xvdCA9IF9wanN1YS5wbGF5ZXJfZ2V0X2NvbmZfcG9ydChwbGF5ZXJfaWQpCisgICAgICAgIGlmIHNsb3QgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYuX2Vycl9jaGVjaygicGxheWVyX2dldF9zbG90KCkiLCBzZWxmLCAtMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHBsYXllciBpZCIpCisgICAgICAgIHJldHVybiBzbG90CisKKyAgICBkZWYgcGxheWVyX3NldF9wb3Moc2VsZiwgcGxheWVyX2lkLCBwb3MpOgorICAgICAgICAiIiJTZXQgV0FWIHBsYXliYWNrIHBvc2l0aW9uLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBwbGF5ZXJfaWQgICAtLSBXQVYgcGxheWVyIElECisgICAgICAgIHBvcyAgICAgICAgIC0tIHBsYXliYWNrIHBvc2l0aW9uLCBpbiBzYW1wbGVzCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyID0gX3Bqc3VhLnBsYXllcl9zZXRfcG9zKHBsYXllcl9pZCwgcG9zKQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInBsYXllcl9zZXRfcG9zKCkiLCBzZWxmLCBlcnIpCisgICAgICAgIAorICAgIGRlZiBwbGF5ZXJfZGVzdHJveShzZWxmLCBwbGF5ZXJfaWQpOgorICAgICAgICAiIiJEZXN0cm95IHRoZSBXQVYgcGxheWVyLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBwbGF5ZXJfaWQgICAtLSB0aGUgV0FWIHBsYXllciBJRC4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEucGxheWVyX2Rlc3Ryb3kocGxheWVyX2lkKQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soInBsYXllcl9kZXN0cm95KCkiLCBzZWxmLCBlcnIpCisKKyAgICBkZWYgY3JlYXRlX3BsYXlsaXN0KHNlbGYsIGZpbGVsaXN0LCBsYWJlbD0icGxheWxpc3QiLCBsb29wPVRydWUpOgorICAgICAgICAiIiJDcmVhdGUgV0FWIHBsYXlsaXN0LgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICBmaWxlbGlzdCAgICAtLSBMaXN0IG9mIFdBViBmaWxlIG5hbWVzLgorICAgICAgICBsYWJlbCAgICAgICAtLSBPcHRpb25hbCBuYW1lIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBwbGF5bGlzdAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgKHVzZWZ1bCBmb3IgbG9nZ2luZykKKyAgICAgICAgbG9vcCAgICAgICAgLS0gYm9vbGVhbiB0byBzcGVjaWZ5IHdoZXRoZXIgcGxheWJhY2sgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB1cG9uIEVPRgorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIHBsYXlsaXN0X2lkCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIG9wdCA9IDAKKyAgICAgICAgaWYgbm90IGxvb3A6CisgICAgICAgICAgICBvcHQgPSBvcHQgKyAxCisgICAgICAgIGVyciwgcGxheWxpc3RfaWQgPSBfcGpzdWEucGxheWxpc3RfY3JlYXRlKGxhYmVsLCBmaWxlbGlzdCwgb3B0KQorICAgICAgICBzZWxmLl9lcnJfY2hlY2soImNyZWF0ZV9wbGF5bGlzdCgpIiwgc2VsZiwgZXJyKQorICAgICAgICByZXR1cm4gcGxheWxpc3RfaWQgCisKKyAgICBkZWYgcGxheWxpc3RfZ2V0X3Nsb3Qoc2VsZiwgcGxheWxpc3RfaWQpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbmZlcmVuY2UgcG9ydCBJRCBmb3IgdGhlIHNwZWNpZmllZCBwbGF5bGlzdC4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgcGxheWxpc3RfaWQgIC0tIHRoZSBXQVYgcGxheWxpc3QgSUQKKyAgICAgICAgCisgICAgICAgIFJldHVybjoKKyAgICAgICAgICAgIENvbmZlcmVuY2Ugc2xvdCBudW1iZXIgZm9yIHRoZSBwbGF5bGlzdAorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIHNsb3QgPSBfcGpzdWEucGxheWVyX2dldF9jb25mX3BvcnQocGxheWxpc3RfaWQpCisgICAgICAgIGlmIHNsb3QgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYuX2Vycl9jaGVjaygicGxheWxpc3RfZ2V0X3Nsb3QoKSIsIHNlbGYsIC0xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGxheWxpc3QgaWQiKQorICAgICAgICByZXR1cm4gc2xvdAorCisgICAgZGVmIHBsYXlsaXN0X2Rlc3Ryb3koc2VsZiwgcGxheWxpc3RfaWQpOgorICAgICAgICAiIiJEZXN0cm95IHRoZSBXQVYgcGxheWxpc3QuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHBsYXlsaXN0X2lkICAgLS0gdGhlIFdBViBwbGF5bGlzdCBJRC4KKworICAgICAgICAiIiIKKyAgICAgICAgbGNrID0gc2VsZi5hdXRvX2xvY2soKQorICAgICAgICBlcnIgPSBfcGpzdWEucGxheWVyX2Rlc3Ryb3kocGxheWxpc3RfaWQpCisgICAgICAgIHNlbGYuX2Vycl9jaGVjaygicGxheWxpc3RfZGVzdHJveSgpIiwgc2VsZiwgZXJyKQorCisgICAgZGVmIGNyZWF0ZV9yZWNvcmRlcihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkNyZWF0ZSBXQVYgZmlsZSByZWNvcmRlci4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBmaWxlbmFtZSAgICAtLSBXQVYgZmlsZSBuYW1lCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgV0FWIHJlY29yZGVyIElECisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgZXJyLCByZWNfaWQgPSBfcGpzdWEucmVjb3JkZXJfY3JlYXRlKGZpbGVuYW1lLCAwLCBOb25lLCAtMSwgMCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJjcmVhdGVfcmVjb3JkZXIoKSIsIHNlbGYsIGVycikKKyAgICAgICAgcmV0dXJuIHJlY19pZAorICAgICAgICAKKyAgICBkZWYgcmVjb3JkZXJfZ2V0X3Nsb3Qoc2VsZiwgcmVjX2lkKToKKyAgICAgICAgIiIiR2V0IHRoZSBjb25mZXJlbmNlIHBvcnQgSUQgZm9yIHRoZSBzcGVjaWZpZWQgcmVjb3JkZXIuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIHJlY19pZCAgLS0gdGhlIFdBViByZWNvcmRlciBJRAorICAgICAgICAKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgQ29uZmVyZW5jZSBzbG90IG51bWJlciBmb3IgdGhlIHJlY29yZGVyCisKKyAgICAgICAgIiIiCisgICAgICAgIGxjayA9IHNlbGYuYXV0b19sb2NrKCkKKyAgICAgICAgc2xvdCA9IF9wanN1YS5yZWNvcmRlcl9nZXRfY29uZl9wb3J0KHJlY19pZCkKKyAgICAgICAgaWYgc2xvdCA8IDE6CisgICAgICAgICAgICBzZWxmLl9lcnJfY2hlY2soInJlY29yZGVyX2dldF9zbG90KCkiLCBzZWxmLCAtMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVjb3JkZXIgaWQiKQorICAgICAgICByZXR1cm4gc2xvdAorCisgICAgZGVmIHJlY29yZGVyX2Rlc3Ryb3koc2VsZiwgcmVjX2lkKToKKyAgICAgICAgIiIiRGVzdHJveSB0aGUgV0FWIHJlY29yZGVyLgorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgICByZWNfaWQgICAtLSB0aGUgV0FWIHJlY29yZGVyIElELgorCisgICAgICAgICIiIgorICAgICAgICBsY2sgPSBzZWxmLmF1dG9fbG9jaygpCisgICAgICAgIGVyciA9IF9wanN1YS5yZWNvcmRlcl9kZXN0cm95KHJlY19pZCkKKyAgICAgICAgc2VsZi5fZXJyX2NoZWNrKCJyZWNvcmRlcl9kZXN0cm95KCkiLCBzZWxmLCBlcnIpCisKKworICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0cmVycm9yKGVycik6CisgICAgICAgIHJldHVybiBfcGpzdWEuc3RyZXJyb3IoZXJyKQorICAgIAorICAgIGRlZiBfZXJyX2NoZWNrKHNlbGYsIG9wX25hbWUsIG9iaiwgZXJyX2NvZGUsIGVycl9tc2c9IiIpOgorICAgICAgICBpZiBlcnJfY29kZSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3Iob3BfbmFtZSwgb2JqLCBlcnJfY29kZSwgZXJyX21zZykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9tc2dfZGF0YShoZHJfbGlzdCk6CisgICAgICAgIGlmIG5vdCBoZHJfbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIG1zZ19kYXRhID0gX3Bqc3VhLk1zZ19EYXRhKCkKKyAgICAgICAgbXNnX2RhdGEuaGRyX2xpc3QgPSBoZHJfbGlzdAorICAgICAgICByZXR1cm4gbXNnX2RhdGEKKyAgICAKKyAgICBkZWYgYXV0b19sb2NrKHNlbGYpOgorICAgICAgICByZXR1cm4gX0xpYk11dGV4KHNlbGYuX2xvY2spCisKKyAgICAjIEludGVybmFsIGRpY3Rpb25hcnkgbWFuaXB1bGF0aW9uIGZvciBjYWxscywgYWNjb3VudHMsIGFuZCBidWRkaWVzCisKKyAgICBkZWYgX2xvb2t1cF9jYWxsKHNlbGYsIGNhbGxfaWQpOgorICAgICAgICByZXR1cm4gX3Bqc3VhLmNhbGxfZ2V0X3VzZXJfZGF0YShjYWxsX2lkKQorCisgICAgZGVmIF9sb29rdXBfYWNjb3VudChzZWxmLCBhY2NfaWQpOgorICAgICAgICByZXR1cm4gX3Bqc3VhLmFjY19nZXRfdXNlcl9kYXRhKGFjY19pZCkKKworICAgIGRlZiBfbG9va3VwX2J1ZGR5KHNlbGYsIGJ1ZGR5X2lkLCB1cmk9Tm9uZSk6CisgICAgICAgIGlmIGJ1ZGR5X2lkICE9IC0xOgorICAgICAgICAgICAgYnVkZHkgPSBfcGpzdWEuYnVkZHlfZ2V0X3VzZXJfZGF0YShidWRkeV9pZCkKKyAgICAgICAgZWxpZiB1cmk6CisgICAgICAgICAgICBidWRkeV9pZCA9IF9wanN1YS5idWRkeV9maW5kKHVyaSkKKyAgICAgICAgICAgIGlmIGJ1ZGR5X2lkICE9IC0xOgorICAgICAgICAgICAgICAgIGJ1ZGR5ID0gX3Bqc3VhLmJ1ZGR5X2dldF91c2VyX2RhdGEoYnVkZHlfaWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1ZGR5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVkZHkgPSBOb25lCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGJ1ZGR5IAorCisgICAgIyBBY2NvdW50IGFsbGJhY2tzCisKKyAgICBkZWYgX2NiX29uX3JlZ19zdGF0ZShzZWxmLCBhY2NfaWQpOgorICAgICAgICBhY2MgPSBzZWxmLl9sb29rdXBfYWNjb3VudChhY2NfaWQpCisgICAgICAgIGlmIGFjYzoKKyAgICAgICAgICAgIGFjYy5fY2Iub25fcmVnX3N0YXRlKCkKKworICAgIGRlZiBfY2Jfb25faW5jb21pbmdfc3Vic2NyaWJlKHNlbGYsIGFjY19pZCwgYnVkZHlfaWQsIGZyb21fdXJpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0X3VyaSwgcHJlc19vYmopOgorICAgICAgICBhY2MgPSBzZWxmLl9sb29rdXBfYWNjb3VudChhY2NfaWQpCisgICAgICAgIGlmIGFjYzoKKyAgICAgICAgICAgIGJ1ZGR5ID0gc2VsZi5fbG9va3VwX2J1ZGR5KGJ1ZGR5X2lkKQorICAgICAgICAgICAgcmV0dXJuIGFjYy5fY2Iub25faW5jb21pbmdfc3Vic2NyaWJlKGJ1ZGR5LCBmcm9tX3VyaSwgY29udGFjdF91cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc19vYmopCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKDQwNCwgTm9uZSkKKworICAgIGRlZiBfY2Jfb25faW5jb21pbmdfY2FsbChzZWxmLCBhY2NfaWQsIGNhbGxfaWQsIHJkYXRhKToKKyAgICAgICAgYWNjID0gc2VsZi5fbG9va3VwX2FjY291bnQoYWNjX2lkKQorICAgICAgICBpZiBhY2M6CisgICAgICAgICAgICBpZiAnb25faW5jb21pbmdfY2FsbDInIGluIGFjYy5fY2IuX19jbGFzc19fLl9fZGljdF9fOgorICAgICAgICAgICAgICAgIGFjYy5fY2Iub25faW5jb21pbmdfY2FsbDIoIENhbGwoc2VsZiwgY2FsbF9pZCksIHJkYXRhICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWNjLl9jYi5vbl9pbmNvbWluZ19jYWxsKCBDYWxsKHNlbGYsIGNhbGxfaWQpICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9wanN1YS5jYWxsX2hhbmd1cChjYWxsX2lkLCA2MDMsIE5vbmUsIE5vbmUpCisKKyAgICAjIENhbGwgY2FsbGJhY2tzIAorCisgICAgZGVmIF9jYl9vbl9jYWxsX3N0YXRlKHNlbGYsIGNhbGxfaWQpOgorICAgICAgICBjYWxsID0gc2VsZi5fbG9va3VwX2NhbGwoY2FsbF9pZCkKKyAgICAgICAgaWYgY2FsbDoKKyAgICAgICAgICAgIGlmIGNhbGwuX2lkID09IC0xOgorICAgICAgICAgICAgICAgIGNhbGwuYXR0YWNoX3RvX2lkKGNhbGxfaWQpCisgICAgICAgICAgICBkb25lID0gKGNhbGwuaW5mbygpLnN0YXRlID09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpCisgICAgICAgICAgICBjYWxsLl9jYi5vbl9zdGF0ZSgpCisgICAgICAgICAgICBpZiBkb25lOgorICAgICAgICAgICAgICAgIF9wanN1YS5jYWxsX3NldF91c2VyX2RhdGEoY2FsbF9pZCwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfY2Jfb25fY2FsbF9tZWRpYV9zdGF0ZShzZWxmLCBjYWxsX2lkKToKKyAgICAgICAgY2FsbCA9IHNlbGYuX2xvb2t1cF9jYWxsKGNhbGxfaWQpCisgICAgICAgIGlmIGNhbGw6CisgICAgICAgICAgICBjYWxsLl9jYi5vbl9tZWRpYV9zdGF0ZSgpCisKKyAgICBkZWYgX2NiX29uX2R0bWZfZGlnaXQoc2VsZiwgY2FsbF9pZCwgZGlnaXRzKToKKyAgICAgICAgY2FsbCA9IHNlbGYuX2xvb2t1cF9jYWxsKGNhbGxfaWQpCisgICAgICAgIGlmIGNhbGw6CisgICAgICAgICAgICBjYWxsLl9jYi5vbl9kdG1mX2RpZ2l0KGRpZ2l0cykKKworICAgIGRlZiBfY2Jfb25fY2FsbF90cmFuc2Zlcl9yZXF1ZXN0KHNlbGYsIGNhbGxfaWQsIGRzdCwgY29kZSk6CisgICAgICAgIGNhbGwgPSBzZWxmLl9sb29rdXBfY2FsbChjYWxsX2lkKQorICAgICAgICBpZiBjYWxsOgorICAgICAgICAgICAgcmV0dXJuIGNhbGwuX2NiLm9uX3RyYW5zZmVyX3JlcXVlc3QoZHN0LCBjb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDYwMworCisgICAgZGVmIF9jYl9vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyhzZWxmLCBjYWxsX2lkLCBjb2RlLCB0ZXh0LCBmaW5hbCwgY29udCk6CisgICAgICAgIGNhbGwgPSBzZWxmLl9sb29rdXBfY2FsbChjYWxsX2lkKQorICAgICAgICBpZiBjYWxsOgorICAgICAgICAgICAgcmV0dXJuIGNhbGwuX2NiLm9uX3RyYW5zZmVyX3N0YXR1cyhjb2RlLCB0ZXh0LCBmaW5hbCwgY29udCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjb250CisKKyAgICBkZWYgX2NiX29uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0KHNlbGYsIGNhbGxfaWQsIHJkYXRhLCBjb2RlLCByZWFzb24pOgorICAgICAgICBjYWxsID0gc2VsZi5fbG9va3VwX2NhbGwoY2FsbF9pZCkKKyAgICAgICAgaWYgY2FsbDoKKyAgICAgICAgICAgIHJldHVybiBjYWxsLl9jYi5vbl9yZXBsYWNlX3JlcXVlc3QoY29kZSwgcmVhc29uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNvZGUsIHJlYXNvbgorCisgICAgZGVmIF9jYl9vbl9jYWxsX3JlcGxhY2VkKHNlbGYsIG9sZF9jYWxsX2lkLCBuZXdfY2FsbF9pZCk6CisgICAgICAgIG9sZF9jYWxsID0gc2VsZi5fbG9va3VwX2NhbGwob2xkX2NhbGxfaWQpCisgICAgICAgIG5ld19jYWxsID0gc2VsZi5fbG9va3VwX2NhbGwobmV3X2NhbGxfaWQpCisgICAgICAgIGlmIG9sZF9jYWxsIGFuZCBuZXdfY2FsbDoKKyAgICAgICAgICAgIG9sZF9jYWxsLl9jYi5vbl9yZXBsYWNlZChuZXdfY2FsbCkKKworICAgIGRlZiBfY2Jfb25fcGFnZXIoc2VsZiwgY2FsbF9pZCwgZnJvbV91cmksIHRvX3VyaSwgY29udGFjdCwgbWltZV90eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgIGJvZHksIGFjY19pZCk6CisgICAgICAgIGNhbGwgPSBOb25lCisgICAgICAgIGlmIGNhbGxfaWQgIT0gLTE6CisgICAgICAgICAgICBjYWxsID0gc2VsZi5fbG9va3VwX2NhbGwoY2FsbF9pZCkKKyAgICAgICAgaWYgY2FsbDoKKyAgICAgICAgICAgIGNhbGwuX2NiLm9uX3BhZ2VyKG1pbWVfdHlwZSwgYm9keSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFjYyA9IHNlbGYuX2xvb2t1cF9hY2NvdW50KGFjY19pZCkKKyAgICAgICAgICAgIGJ1ZGR5ID0gc2VsZi5fbG9va3VwX2J1ZGR5KC0xLCBmcm9tX3VyaSkKKyAgICAgICAgICAgIGlmIGJ1ZGR5OgorICAgICAgICAgICAgICAgIGJ1ZGR5Ll9jYi5vbl9wYWdlcihtaW1lX3R5cGUsIGJvZHkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFjYy5fY2Iub25fcGFnZXIoZnJvbV91cmksIGNvbnRhY3QsIG1pbWVfdHlwZSwgYm9keSkKKworICAgIGRlZiBfY2Jfb25fcGFnZXJfc3RhdHVzKHNlbGYsIGNhbGxfaWQsIHRvX3VyaSwgYm9keSwgdXNlcl9kYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCByZWFzb24sIGFjY19pZCk6CisgICAgICAgIGNhbGwgPSBOb25lCisgICAgICAgIGlmIGNhbGxfaWQgIT0gLTE6CisgICAgICAgICAgICBjYWxsID0gc2VsZi5fbG9va3VwX2NhbGwoY2FsbF9pZCkKKyAgICAgICAgaWYgY2FsbDoKKyAgICAgICAgICAgIGNhbGwuX2NiLm9uX3BhZ2VyX3N0YXR1cyhib2R5LCB1c2VyX2RhdGEsIGNvZGUsIHJlYXNvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFjYyA9IHNlbGYuX2xvb2t1cF9hY2NvdW50KGFjY19pZCkKKyAgICAgICAgICAgIGJ1ZGR5ID0gc2VsZi5fbG9va3VwX2J1ZGR5KC0xLCB0b191cmkpCisgICAgICAgICAgICBpZiBidWRkeToKKyAgICAgICAgICAgICAgICBidWRkeS5fY2Iub25fcGFnZXJfc3RhdHVzKGJvZHksIHVzZXJfZGF0YSwgY29kZSwgcmVhc29uKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhY2MuX2NiLm9uX3BhZ2VyX3N0YXR1cyh0b191cmksIGJvZHksIHVzZXJfZGF0YSwgY29kZSwgcmVhc29uKQorCisgICAgZGVmIF9jYl9vbl90eXBpbmcoc2VsZiwgY2FsbF9pZCwgZnJvbV91cmksIHRvX3VyaSwgY29udGFjdCwgaXNfdHlwaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICBhY2NfaWQpOgorICAgICAgICBjYWxsID0gTm9uZQorICAgICAgICBpZiBjYWxsX2lkICE9IC0xOgorICAgICAgICAgICAgY2FsbCA9IHNlbGYuX2xvb2t1cF9jYWxsKGNhbGxfaWQpCisgICAgICAgIGlmIGNhbGw6CisgICAgICAgICAgICBjYWxsLl9jYi5vbl90eXBpbmcoaXNfdHlwaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWNjID0gc2VsZi5fbG9va3VwX2FjY291bnQoYWNjX2lkKQorICAgICAgICAgICAgYnVkZHkgPSBzZWxmLl9sb29rdXBfYnVkZHkoLTEsIGZyb21fdXJpKQorICAgICAgICAgICAgaWYgYnVkZHk6CisgICAgICAgICAgICAgICAgYnVkZHkuX2NiLm9uX3R5cGluZyhpc190eXBpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFjYy5fY2Iub25fdHlwaW5nKGZyb21fdXJpLCBjb250YWN0LCBpc190eXBpbmcpCisKKyAgICBkZWYgX2NiX29uX213aV9pbmZvKHNlbGYsIGFjY19pZCwgYm9keSk6CisgICAgICAgIGFjYyA9IHNlbGYuX2xvb2t1cF9hY2NvdW50KGFjY19pZCkKKyAgICAgICAgaWYgYWNjOgorICAgICAgICAgICAgcmV0dXJuIGFjYy5fY2Iub25fbXdpX2luZm8oYm9keSkKKworICAgIGRlZiBfY2Jfb25fYnVkZHlfc3RhdGUoc2VsZiwgYnVkZHlfaWQpOgorICAgICAgICBidWRkeSA9IHNlbGYuX2xvb2t1cF9idWRkeShidWRkeV9pZCkKKyAgICAgICAgaWYgYnVkZHk6CisgICAgICAgICAgICBidWRkeS5fY2Iub25fc3RhdGUoKQorCisjCisjIEludGVybmFsCisjCisKK2RlZiBfY2Jfb25fY2FsbF9zdGF0ZShjYWxsX2lkLCBlKToKKyAgICBfbGliLl9jYl9vbl9jYWxsX3N0YXRlKGNhbGxfaWQpCisKK2RlZiBfY2Jfb25faW5jb21pbmdfY2FsbChhY2NfaWQsIGNhbGxfaWQsIHJkYXRhKToKKyAgICBfbGliLl9jYl9vbl9pbmNvbWluZ19jYWxsKGFjY19pZCwgY2FsbF9pZCwgcmRhdGEpCisKK2RlZiBfY2Jfb25fY2FsbF9tZWRpYV9zdGF0ZShjYWxsX2lkKToKKyAgICBfbGliLl9jYl9vbl9jYWxsX21lZGlhX3N0YXRlKGNhbGxfaWQpCisKK2RlZiBfY2Jfb25fZHRtZl9kaWdpdChjYWxsX2lkLCBkaWdpdHMpOgorICAgIF9saWIuX2NiX29uX2R0bWZfZGlnaXQoY2FsbF9pZCwgZGlnaXRzKQorCitkZWYgX2NiX29uX2NhbGxfdHJhbnNmZXJfcmVxdWVzdChjYWxsX2lkLCBkc3QsIGNvZGUpOgorICAgIHJldHVybiBfbGliLl9jYl9vbl9jYWxsX3RyYW5zZmVyX3JlcXVlc3QoY2FsbF9pZCwgZHN0LCBjb2RlKQorCitkZWYgX2NiX29uX2NhbGxfdHJhbnNmZXJfc3RhdHVzKGNhbGxfaWQsIGNvZGUsIHJlYXNvbiwgZmluYWwsIGNvbnQpOgorICAgIHJldHVybiBfbGliLl9jYl9vbl9jYWxsX3RyYW5zZmVyX3N0YXR1cyhjYWxsX2lkLCBjb2RlLCByZWFzb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwsIGNvbnQpCitkZWYgX2NiX29uX2NhbGxfcmVwbGFjZV9yZXF1ZXN0KGNhbGxfaWQsIHJkYXRhLCBjb2RlLCByZWFzb24pOgorICAgIHJldHVybiBfbGliLl9jYl9vbl9jYWxsX3JlcGxhY2VfcmVxdWVzdChjYWxsX2lkLCByZGF0YSwgY29kZSwgcmVhc29uKQorCitkZWYgX2NiX29uX2NhbGxfcmVwbGFjZWQob2xkX2NhbGxfaWQsIG5ld19jYWxsX2lkKToKKyAgICBfbGliLl9jYl9vbl9jYWxsX3JlcGxhY2VkKG9sZF9jYWxsX2lkLCBuZXdfY2FsbF9pZCkKKworZGVmIF9jYl9vbl9yZWdfc3RhdGUoYWNjX2lkKToKKyAgICBfbGliLl9jYl9vbl9yZWdfc3RhdGUoYWNjX2lkKQorCitkZWYgX2NiX29uX2luY29taW5nX3N1YnNjcmliZShhY2NfaWQsIGJ1ZGR5X2lkLCBmcm9tX3VyaSwgY29udGFjdF91cmksIHByZXMpOgorICAgIHJldHVybiBfbGliLl9jYl9vbl9pbmNvbWluZ19zdWJzY3JpYmUoYWNjX2lkLCBidWRkeV9pZCwgZnJvbV91cmksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdF91cmksIHByZXMpCisKK2RlZiBfY2Jfb25fYnVkZHlfc3RhdGUoYnVkZHlfaWQpOgorICAgIF9saWIuX2NiX29uX2J1ZGR5X3N0YXRlKGJ1ZGR5X2lkKQorCitkZWYgX2NiX29uX3BhZ2VyKGNhbGxfaWQsIGZyb21fdXJpLCB0bywgY29udGFjdCwgbWltZV90eXBlLCBib2R5LCBhY2NfaWQpOgorICAgIF9saWIuX2NiX29uX3BhZ2VyKGNhbGxfaWQsIGZyb21fdXJpLCB0bywgY29udGFjdCwgbWltZV90eXBlLCBib2R5LCBhY2NfaWQpCisKK2RlZiBfY2Jfb25fcGFnZXJfc3RhdHVzKGNhbGxfaWQsIHRvLCBib2R5LCB1c2VyX2RhdGEsIHN0YXR1cywgcmVhc29uLCBhY2NfaWQpOgorICAgIF9saWIuX2NiX29uX3BhZ2VyX3N0YXR1cyhjYWxsX2lkLCB0bywgYm9keSwgdXNlcl9kYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCByZWFzb24sIGFjY19pZCkKKworZGVmIF9jYl9vbl90eXBpbmcoY2FsbF9pZCwgZnJvbV91cmksIHRvLCBjb250YWN0LCBpc190eXBpbmcsIGFjY19pZCk6CisgICAgX2xpYi5fY2Jfb25fdHlwaW5nKGNhbGxfaWQsIGZyb21fdXJpLCB0bywgY29udGFjdCwgaXNfdHlwaW5nLCBhY2NfaWQpCisKK2RlZiBfY2Jfb25fbXdpX2luZm8oYWNjX2lkLCBib2R5KToKKyAgICBfbGliLl9jYl9vbl9td2lfaW5mbyhhY2NfaWQsIGJvZHkpCisKKyMgV29ya2VyIHRocmVhZAorZGVmIF93b3JrZXJfdGhyZWFkX21haW4oYXJnKToKKyAgICBnbG9iYWwgX2xpYgorICAgIF9UcmFjZSgoJ3dvcmtlciB0aHJlYWQgc3RhcnRlZC4uJywpKQorICAgIHRocmVhZF9kZXNjID0gMDsKKyAgICBlcnIgPSBfcGpzdWEudGhyZWFkX3JlZ2lzdGVyKCJweXRob24gd29ya2VyIiwgdGhyZWFkX2Rlc2MpCisgICAgX2xpYi5fZXJyX2NoZWNrKCJ0aHJlYWRfcmVnaXN0ZXIoKSIsIF9saWIsIGVycikKKyAgICB3aGlsZSBfbGliIGFuZCBfbGliLl9xdWl0ID09IDA6CisgICAgICAgIF9saWIuaGFuZGxlX2V2ZW50cygxKQorCXRpbWUuc2xlZXAoMC4wNTApCisgICAgaWYgX2xpYjoKKyAgICAgICAgX2xpYi5fcXVpdCA9IDIKKyAgICBfVHJhY2UoKCd3b3JrZXIgdGhyZWFkIGV4aXRlZC4uJywpKQorCitkZWYgX1RyYWNlKGFyZ3MpOgorICAgIGdsb2JhbCBlbmFibGVfdHJhY2UKKyAgICBpZiBlbmFibGVfdHJhY2U6CisgICAgICAgIHByaW50ICIqKiAiLAorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBwcmludCBhcmcsCisgICAgICAgIHByaW50ICIgKioiCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9zYW1wbGVzL2NhbGwucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9jYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9jYWxsLnB5CkBAIC0wLDAgKzEsMTY5IEBACisjICRJZDogY2FsbC5weSAyMTcxIDIwMDgtMDctMjQgMDk6MDE6MzNaIGJlbm55bHAgJAorIworIyBTSVAgY2FsbCBzYW1wbGUuCisjCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorIworaW1wb3J0IHN5cworaW1wb3J0IHBqc3VhIGFzIHBqCisKK0xPR19MRVZFTD0zCitjdXJyZW50X2NhbGwgPSBOb25lCisKKyMgTG9nZ2luZyBjYWxsYmFjaworZGVmIGxvZ19jYihsZXZlbCwgc3RyLCBsZW4pOgorICAgIHByaW50IHN0ciwKKworCisjIENhbGxiYWNrIHRvIHJlY2VpdmUgZXZlbnRzIGZyb20gYWNjb3VudAorY2xhc3MgTXlBY2NvdW50Q2FsbGJhY2socGouQWNjb3VudENhbGxiYWNrKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhY2NvdW50PU5vbmUpOgorICAgICAgICBwai5BY2NvdW50Q2FsbGJhY2suX19pbml0X18oc2VsZiwgYWNjb3VudCkKKworICAgICMgTm90aWZpY2F0aW9uIG9uIGluY29taW5nIGNhbGwKKyAgICBkZWYgb25faW5jb21pbmdfY2FsbChzZWxmLCBjYWxsKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnRfY2FsbCAKKyAgICAgICAgaWYgY3VycmVudF9jYWxsOgorICAgICAgICAgICAgY2FsbC5hbnN3ZXIoNDg2LCAiQnVzeSIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIAorICAgICAgICBwcmludCAiSW5jb21pbmcgY2FsbCBmcm9tICIsIGNhbGwuaW5mbygpLnJlbW90ZV91cmkKKyAgICAgICAgcHJpbnQgIlByZXNzICdhJyB0byBhbnN3ZXIiCisKKyAgICAgICAgY3VycmVudF9jYWxsID0gY2FsbAorCisgICAgICAgIGNhbGxfY2IgPSBNeUNhbGxDYWxsYmFjayhjdXJyZW50X2NhbGwpCisgICAgICAgIGN1cnJlbnRfY2FsbC5zZXRfY2FsbGJhY2soY2FsbF9jYikKKworICAgICAgICBjdXJyZW50X2NhbGwuYW5zd2VyKDE4MCkKKworICAgICAgICAKKyMgQ2FsbGJhY2sgdG8gcmVjZWl2ZSBldmVudHMgZnJvbSBDYWxsCitjbGFzcyBNeUNhbGxDYWxsYmFjayhwai5DYWxsQ2FsbGJhY2spOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbGw9Tm9uZSk6CisgICAgICAgIHBqLkNhbGxDYWxsYmFjay5fX2luaXRfXyhzZWxmLCBjYWxsKQorCisgICAgIyBOb3RpZmljYXRpb24gd2hlbiBjYWxsIHN0YXRlIGhhcyBjaGFuZ2VkCisgICAgZGVmIG9uX3N0YXRlKHNlbGYpOgorICAgICAgICBnbG9iYWwgY3VycmVudF9jYWxsCisgICAgICAgIHByaW50ICJDYWxsIHdpdGgiLCBzZWxmLmNhbGwuaW5mbygpLnJlbW90ZV91cmksCisgICAgICAgIHByaW50ICJpcyIsIHNlbGYuY2FsbC5pbmZvKCkuc3RhdGVfdGV4dCwKKyAgICAgICAgcHJpbnQgImxhc3QgY29kZSA9Iiwgc2VsZi5jYWxsLmluZm8oKS5sYXN0X2NvZGUsIAorICAgICAgICBwcmludCAiKCIgKyBzZWxmLmNhbGwuaW5mbygpLmxhc3RfcmVhc29uICsgIikiCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLmNhbGwuaW5mbygpLnN0YXRlID09IHBqLkNhbGxTdGF0ZS5ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBjdXJyZW50X2NhbGwgPSBOb25lCisgICAgICAgICAgICBwcmludCAnQ3VycmVudCBjYWxsIGlzJywgY3VycmVudF9jYWxsCisKKyAgICAjIE5vdGlmaWNhdGlvbiB3aGVuIGNhbGwncyBtZWRpYSBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAgICBkZWYgb25fbWVkaWFfc3RhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2FsbC5pbmZvKCkubWVkaWFfc3RhdGUgPT0gcGouTWVkaWFTdGF0ZS5BQ1RJVkU6CisgICAgICAgICAgICAjIENvbm5lY3QgdGhlIGNhbGwgdG8gc291bmQgZGV2aWNlCisgICAgICAgICAgICBjYWxsX3Nsb3QgPSBzZWxmLmNhbGwuaW5mbygpLmNvbmZfc2xvdAorICAgICAgICAgICAgcGouTGliLmluc3RhbmNlKCkuY29uZl9jb25uZWN0KGNhbGxfc2xvdCwgMCkKKyAgICAgICAgICAgIHBqLkxpYi5pbnN0YW5jZSgpLmNvbmZfY29ubmVjdCgwLCBjYWxsX3Nsb3QpCisgICAgICAgICAgICBwcmludCAiTWVkaWEgaXMgbm93IGFjdGl2ZSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJNZWRpYSBpcyBpbmFjdGl2ZSIKKworIyBGdW5jdGlvbiB0byBtYWtlIGNhbGwKK2RlZiBtYWtlX2NhbGwodXJpKToKKyAgICB0cnk6CisgICAgICAgIHByaW50ICJNYWtpbmcgY2FsbCB0byIsIHVyaQorICAgICAgICByZXR1cm4gYWNjLm1ha2VfY2FsbCh1cmksIGNiPU15Q2FsbENhbGxiYWNrKCkpCisgICAgZXhjZXB0IHBqLkVycm9yLCBlOgorICAgICAgICBwcmludCAiRXhjZXB0aW9uOiAiICsgc3RyKGUpCisgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIAorCisjIENyZWF0ZSBsaWJyYXJ5IGluc3RhbmNlCitsaWIgPSBwai5MaWIoKQorCit0cnk6CisgICAgIyBJbml0IGxpYnJhcnkgd2l0aCBkZWZhdWx0IGNvbmZpZyBhbmQgc29tZSBjdXN0b21pemVkCisgICAgIyBsb2dnaW5nIGNvbmZpZy4KKyAgICBsaWIuaW5pdChsb2dfY2ZnID0gcGouTG9nQ29uZmlnKGxldmVsPUxPR19MRVZFTCwgY2FsbGJhY2s9bG9nX2NiKSkKKworICAgICMgQ3JlYXRlIFVEUCB0cmFuc3BvcnQgd2hpY2ggbGlzdGVucyB0byBhbnkgYXZhaWxhYmxlIHBvcnQKKyAgICB0cmFuc3BvcnQgPSBsaWIuY3JlYXRlX3RyYW5zcG9ydChwai5UcmFuc3BvcnRUeXBlLlVEUCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGouVHJhbnNwb3J0Q29uZmlnKDApKQorICAgIHByaW50ICJcbkxpc3RlbmluZyBvbiIsIHRyYW5zcG9ydC5pbmZvKCkuaG9zdCwgCisgICAgcHJpbnQgInBvcnQiLCB0cmFuc3BvcnQuaW5mbygpLnBvcnQsICJcbiIKKyAgICAKKyAgICAjIFN0YXJ0IHRoZSBsaWJyYXJ5CisgICAgbGliLnN0YXJ0KCkKKworICAgICMgQ3JlYXRlIGxvY2FsIGFjY291bnQKKyAgICBhY2MgPSBsaWIuY3JlYXRlX2FjY291bnRfZm9yX3RyYW5zcG9ydCh0cmFuc3BvcnQsIGNiPU15QWNjb3VudENhbGxiYWNrKCkpCisKKyAgICAjIElmIGFyZ3VtZW50IGlzIHNwZWNpZmllZCB0aGVuIG1ha2UgY2FsbCB0byB0aGUgVVJJCisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgICAgIGxjayA9IGxpYi5hdXRvX2xvY2soKQorICAgICAgICBjdXJyZW50X2NhbGwgPSBtYWtlX2NhbGwoc3lzLmFyZ3ZbMV0pCisgICAgICAgIHByaW50ICdDdXJyZW50IGNhbGwgaXMnLCBjdXJyZW50X2NhbGwKKyAgICAgICAgZGVsIGxjaworCisgICAgbXlfc2lwX3VyaSA9ICJzaXA6IiArIHRyYW5zcG9ydC5pbmZvKCkuaG9zdCArIFwKKyAgICAgICAgICAgICAgICAgIjoiICsgc3RyKHRyYW5zcG9ydC5pbmZvKCkucG9ydCkKKworICAgICMgTWVudSBsb29wCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcHJpbnQgIk15IFNJUCBVUkkgaXMiLCBteV9zaXBfdXJpCisgICAgICAgIHByaW50ICJNZW51OiAgbT1tYWtlIGNhbGwsIGg9aGFuZ3VwIGNhbGwsIGE9YW5zd2VyIGNhbGwsIHE9cXVpdCIKKworICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbi5yZWFkbGluZSgpLnJzdHJpcCgiXHJcbiIpCisgICAgICAgIGlmIGlucHV0ID09ICJtIjoKKyAgICAgICAgICAgIGlmIGN1cnJlbnRfY2FsbDoKKyAgICAgICAgICAgICAgICBwcmludCAiQWxyZWFkeSBoYXZlIGFub3RoZXIgY2FsbCIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJpbnQgIkVudGVyIGRlc3RpbmF0aW9uIFVSSSB0byBjYWxsOiAiLCAKKyAgICAgICAgICAgIGlucHV0ID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkucnN0cmlwKCJcclxuIikKKyAgICAgICAgICAgIGlmIGlucHV0ID09ICIiOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsY2sgPSBsaWIuYXV0b19sb2NrKCkKKyAgICAgICAgICAgIGN1cnJlbnRfY2FsbCA9IG1ha2VfY2FsbChpbnB1dCkKKyAgICAgICAgICAgIGRlbCBsY2sKKworICAgICAgICBlbGlmIGlucHV0ID09ICJoIjoKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50X2NhbGw6CisgICAgICAgICAgICAgICAgcHJpbnQgIlRoZXJlIGlzIG5vIGNhbGwiCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGN1cnJlbnRfY2FsbC5oYW5ndXAoKQorCisgICAgICAgIGVsaWYgaW5wdXQgPT0gImEiOgorICAgICAgICAgICAgaWYgbm90IGN1cnJlbnRfY2FsbDoKKyAgICAgICAgICAgICAgICBwcmludCAiVGhlcmUgaXMgbm8gY2FsbCIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgY3VycmVudF9jYWxsLmFuc3dlcigyMDApCisKKyAgICAgICAgZWxpZiBpbnB1dCA9PSAicSI6CisgICAgICAgICAgICBicmVhaworCisgICAgIyBTaHV0ZG93biB0aGUgbGlicmFyeQorICAgIHRyYW5zcG9ydCA9IE5vbmUKKyAgICBhY2MuZGVsZXRlKCkKKyAgICBhY2MgPSBOb25lCisgICAgbGliLmRlc3Ryb3koKQorICAgIGxpYiA9IE5vbmUKKworZXhjZXB0IHBqLkVycm9yLCBlOgorICAgIHByaW50ICJFeGNlcHRpb246ICIgKyBzdHIoZSkKKyAgICBsaWIuZGVzdHJveSgpCisgICAgbGliID0gTm9uZQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9wcmVzZW5jZS5weSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3B5dGhvbi9zYW1wbGVzL3ByZXNlbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWFlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9wcmVzZW5jZS5weQpAQCAtMCwwICsxLDE3NSBAQAorIyAkSWQ6IHByZXNlbmNlLnB5IDIxNzEgMjAwOC0wNy0yNCAwOTowMTozM1ogYmVubnlscCAkCisjCisjIFByZXNlbmNlIGFuZCBpbnN0YW50IG1lc3NhZ2luZworIworIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2ltcG9ydCBzeXMKK2ltcG9ydCBwanN1YSBhcyBwagorCitMT0dfTEVWRUwgPSAzCitwZW5kaW5nX3ByZXMgPSBOb25lCitwZW5kaW5nX3VyaSA9IE5vbmUKKworZGVmIGxvZ19jYihsZXZlbCwgc3RyLCBsZW4pOgorICAgIHByaW50IHN0ciwKKworY2xhc3MgTXlBY2NvdW50Q2FsbGJhY2socGouQWNjb3VudENhbGxiYWNrKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWNjb3VudD1Ob25lKToKKyAgICAgICAgcGouQWNjb3VudENhbGxiYWNrLl9faW5pdF9fKHNlbGYsIGFjY291bnQpCisKKyAgICBkZWYgb25faW5jb21pbmdfc3Vic2NyaWJlKHNlbGYsIGJ1ZGR5LCBmcm9tX3VyaSwgY29udGFjdF91cmksIHByZXMpOgorICAgICAgICBnbG9iYWwgcGVuZGluZ19wcmVzLCBwZW5kaW5nX3VyaQorICAgICAgICAjIEFsbG93IGJ1ZGR5IHRvIHN1YnNjcmliZSB0byBvdXIgcHJlc2VuY2UKKyAgICAgICAgaWYgYnVkZHk6CisgICAgICAgICAgICByZXR1cm4gKDIwMCwgTm9uZSkKKyAgICAgICAgcHJpbnQgJ0luY29taW5nIFNVQlNDUklCRSByZXF1ZXN0IGZyb20nLCBmcm9tX3VyaQorICAgICAgICBwcmludCAnUHJlc3MgIkEiIHRvIGFjY2VwdCBhbmQgYWRkLCAiUiIgdG8gcmVqZWN0IHRoZSByZXF1ZXN0JworICAgICAgICBwZW5kaW5nX3ByZXMgPSBwcmVzCisgICAgICAgIHBlbmRpbmdfdXJpID0gZnJvbV91cmkKKyAgICAgICAgcmV0dXJuICgyMDIsIE5vbmUpCisKKworY2xhc3MgTXlCdWRkeUNhbGxiYWNrKHBqLkJ1ZGR5Q2FsbGJhY2spOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWRkeT1Ob25lKToKKyAgICAgICAgcGouQnVkZHlDYWxsYmFjay5fX2luaXRfXyhzZWxmLCBidWRkeSkKKworICAgIGRlZiBvbl9zdGF0ZShzZWxmKToKKyAgICAgICAgcHJpbnQgIkJ1ZGR5Iiwgc2VsZi5idWRkeS5pbmZvKCkudXJpLCAiaXMiLAorICAgICAgICBwcmludCBzZWxmLmJ1ZGR5LmluZm8oKS5vbmxpbmVfdGV4dAorCisgICAgZGVmIG9uX3BhZ2VyKHNlbGYsIG1pbWVfdHlwZSwgYm9keSk6CisgICAgICAgIHByaW50ICJJbnN0YW50IG1lc3NhZ2UgZnJvbSIsIHNlbGYuYnVkZHkuaW5mbygpLnVyaSwgCisgICAgICAgIHByaW50ICIoIiwgbWltZV90eXBlLCAiKToiCisgICAgICAgIHByaW50IGJvZHkKKworICAgIGRlZiBvbl9wYWdlcl9zdGF0dXMoc2VsZiwgYm9keSwgaW1faWQsIGNvZGUsIHJlYXNvbik6CisgICAgICAgIGlmIGNvZGUgPj0gMzAwOgorICAgICAgICAgICAgcHJpbnQgIk1lc3NhZ2UgZGVsaXZlcnkgZmFpbGVkIGZvciBtZXNzYWdlIiwKKyAgICAgICAgICAgIHByaW50IGJvZHksICJ0byIsIHNlbGYuYnVkZHkuaW5mbygpLnVyaSwgIjoiLCByZWFzb24KKworICAgIGRlZiBvbl90eXBpbmcoc2VsZiwgaXNfdHlwaW5nKToKKyAgICAgICAgaWYgaXNfdHlwaW5nOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5idWRkeS5pbmZvKCkudXJpLCAiaXMgdHlwaW5nIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5idWRkeS5pbmZvKCkudXJpLCAic3RvcHMgdHlwaW5nIgorCisKK2xpYiA9IHBqLkxpYigpCisKK3RyeToKKyAgICAjIEluaXQgbGlicmFyeSB3aXRoIGRlZmF1bHQgY29uZmlnIGFuZCBzb21lIGN1c3RvbWl6ZWQKKyAgICAjIGxvZ2dpbmcgY29uZmlnLgorICAgIGxpYi5pbml0KGxvZ19jZmcgPSBwai5Mb2dDb25maWcobGV2ZWw9TE9HX0xFVkVMLCBjYWxsYmFjaz1sb2dfY2IpKQorCisgICAgIyBDcmVhdGUgVURQIHRyYW5zcG9ydCB3aGljaCBsaXN0ZW5zIHRvIGFueSBhdmFpbGFibGUgcG9ydAorICAgIHRyYW5zcG9ydCA9IGxpYi5jcmVhdGVfdHJhbnNwb3J0KHBqLlRyYW5zcG9ydFR5cGUuVURQLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwai5UcmFuc3BvcnRDb25maWcoMCkpCisgICAgcHJpbnQgIlxuTGlzdGVuaW5nIG9uIiwgdHJhbnNwb3J0LmluZm8oKS5ob3N0LCAKKyAgICBwcmludCAicG9ydCIsIHRyYW5zcG9ydC5pbmZvKCkucG9ydCwgIlxuIgorICAgIAorICAgICMgU3RhcnQgdGhlIGxpYnJhcnkKKyAgICBsaWIuc3RhcnQoKQorCisgICAgIyBDcmVhdGUgbG9jYWwgYWNjb3VudAorICAgIGFjYyA9IGxpYi5jcmVhdGVfYWNjb3VudF9mb3JfdHJhbnNwb3J0KHRyYW5zcG9ydCwgY2I9TXlBY2NvdW50Q2FsbGJhY2soKSkKKyAgICBhY2Muc2V0X2Jhc2ljX3N0YXR1cyhUcnVlKQorICAgIAorICAgIG15X3NpcF91cmkgPSAic2lwOiIgKyB0cmFuc3BvcnQuaW5mbygpLmhvc3QgKyBcCisgICAgICAgICAgICAgICAgICI6IiArIHN0cih0cmFuc3BvcnQuaW5mbygpLnBvcnQpCisKKyAgICBidWRkeSA9IE5vbmUKKworICAgICMgTWVudSBsb29wCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcHJpbnQgIk15IFNJUCBVUkkgaXMiLCBteV9zaXBfdXJpCisgICAgICAgIHByaW50ICJNZW51OiAgYT1hZGQgYnVkZHksIGQ9ZGVsZXRlIGJ1ZGR5LCB0PXRvZ2dsZSIsIFwKKyAgICAgICAgICAgICAgIiBvbmxpbmUgc3RhdHVzLCBpPXNlbmQgSU0sIHE9cXVpdCIKKworICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbi5yZWFkbGluZSgpLnJzdHJpcCgiXHJcbiIpCisgICAgICAgIGlmIGlucHV0ID09ICJhIjoKKyAgICAgICAgICAgICMgQWRkIGJ1ZGR5CisgICAgICAgICAgICBwcmludCAiRW50ZXIgYnVkZHkgVVJJOiAiLCAKKyAgICAgICAgICAgIGlucHV0ID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkucnN0cmlwKCJcclxuIikKKyAgICAgICAgICAgIGlmIGlucHV0ID09ICIiOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGJ1ZGR5ID0gYWNjLmFkZF9idWRkeShpbnB1dCwgY2I9TXlCdWRkeUNhbGxiYWNrKCkpCisgICAgICAgICAgICBidWRkeS5zdWJzY3JpYmUoKQorCisgICAgICAgIGVsaWYgaW5wdXQgPT0gInQiOgorICAgICAgICAgICAgYWNjLnNldF9iYXNpY19zdGF0dXMobm90IGFjYy5pbmZvKCkub25saW5lX3N0YXR1cykKKworICAgICAgICBlbGlmIGlucHV0ID09ICJpIjoKKyAgICAgICAgICAgIGlmIG5vdCBidWRkeToKKyAgICAgICAgICAgICAgICBwcmludCAiQWRkIGJ1ZGR5IGZpcnN0IgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGJ1ZGR5LnNlbmRfdHlwaW5nX2luZChUcnVlKQorCisgICAgICAgICAgICBwcmludCAiVHlwZSB0aGUgbWVzc2FnZTogIiwgCisgICAgICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbi5yZWFkbGluZSgpLnJzdHJpcCgiXHJcbiIpCisgICAgICAgICAgICBpZiBpbnB1dCA9PSAiIjoKKyAgICAgICAgICAgICAgICBidWRkeS5zZW5kX3R5cGluZ19pbmQoRmFsc2UpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnVkZHkuc2VuZF9wYWdlcihpbnB1dCkKKyAgICAgICAgCisgICAgICAgIGVsaWYgaW5wdXQgPT0gImQiOgorICAgICAgICAgICAgaWYgYnVkZHk6CisgICAgICAgICAgICAgICAgYnVkZHkuZGVsZXRlKCkKKyAgICAgICAgICAgICAgICBidWRkeSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ05vIGJ1ZGR5IHdhcyBhZGRlZCcKKworICAgICAgICBlbGlmIGlucHV0ID09ICJBIjoKKyAgICAgICAgICAgIGlmIHBlbmRpbmdfcHJlczoKKyAgICAgICAgICAgICAgICBhY2MucHJlc19ub3RpZnkocGVuZGluZ19wcmVzLCBwai5TdWJzY3JpcHRpb25TdGF0ZS5BQ1RJVkUpCisgICAgICAgICAgICAgICAgYnVkZHkgPSBhY2MuYWRkX2J1ZGR5KHBlbmRpbmdfdXJpLCBjYj1NeUJ1ZGR5Q2FsbGJhY2soKSkKKyAgICAgICAgICAgICAgICBidWRkeS5zdWJzY3JpYmUoKQorICAgICAgICAgICAgICAgIHBlbmRpbmdfcHJlcyA9IE5vbmUKKyAgICAgICAgICAgICAgICBwZW5kaW5nX3VyaSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIk5vIHBlbmRpbmcgcmVxdWVzdCIKKworICAgICAgICBlbGlmIGlucHV0ID09ICJSIjoKKyAgICAgICAgICAgIGlmIHBlbmRpbmdfcHJlczoKKyAgICAgICAgICAgICAgICBhY2MucHJlc19ub3RpZnkocGVuZGluZ19wcmVzLCBwai5TdWJzY3JpcHRpb25TdGF0ZS5URVJNSU5BVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVqZWN0ZWQiKQorICAgICAgICAgICAgICAgIHBlbmRpbmdfcHJlcyA9IE5vbmUKKyAgICAgICAgICAgICAgICBwZW5kaW5nX3VyaSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIk5vIHBlbmRpbmcgcmVxdWVzdCIKKworICAgICAgICBlbGlmIGlucHV0ID09ICJxIjoKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAjIFNodXRkb3duIHRoZSBsaWJyYXJ5CisgICAgYWNjLmRlbGV0ZSgpCisgICAgYWNjID0gTm9uZQorICAgIGlmIHBlbmRpbmdfcHJlczoKKyAgICAgICAgYWNjLnByZXNfbm90aWZ5KHBlbmRpbmdfcHJlcywgcGouU3Vic2NyaXB0aW9uU3RhdGUuVEVSTUlOQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWplY3RlZCIpCisgICAgdHJhbnNwb3J0ID0gTm9uZQorICAgIGxpYi5kZXN0cm95KCkKKyAgICBsaWIgPSBOb25lCisKK2V4Y2VwdCBwai5FcnJvciwgZToKKyAgICBwcmludCAiRXhjZXB0aW9uOiAiICsgc3RyKGUpCisgICAgbGliLmRlc3Ryb3koKQorICAgIGxpYiA9IE5vbmUKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NhbXBsZXMvcmVnaXN0cmF0aW9uLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NhbXBsZXMvcmVnaXN0cmF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjcwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9yZWdpc3RyYXRpb24ucHkKQEAgLTAsMCArMSw3MCBAQAorIyAkSWQ6IHJlZ2lzdHJhdGlvbi5weSAyMTcxIDIwMDgtMDctMjQgMDk6MDE6MzNaIGJlbm55bHAgJAorIworIyBTSVAgYWNjb3VudCBhbmQgcmVnaXN0cmF0aW9uIHNhbXBsZS4gSW4gdGhpcyBzYW1wbGUsIHRoZSBwcm9ncmFtCisjIHdpbGwgYmxvY2sgdG8gd2FpdCB1bnRpbCByZWdpc3RyYXRpb24gaXMgY29tcGxldGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpbXBvcnQgcGpzdWEgYXMgcGoKK2ltcG9ydCB0aHJlYWRpbmcKKworCitkZWYgbG9nX2NiKGxldmVsLCBzdHIsIGxlbik6CisgICAgcHJpbnQgc3RyLAorCitjbGFzcyBNeUFjY291bnRDYWxsYmFjayhwai5BY2NvdW50Q2FsbGJhY2spOgorICAgIHNlbSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhY2NvdW50KToKKyAgICAgICAgcGouQWNjb3VudENhbGxiYWNrLl9faW5pdF9fKHNlbGYsIGFjY291bnQpCisKKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgc2VsZi5zZW0gPSB0aHJlYWRpbmcuU2VtYXBob3JlKDApCisgICAgICAgIHNlbGYuc2VtLmFjcXVpcmUoKQorCisgICAgZGVmIG9uX3JlZ19zdGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zZW06CisgICAgICAgICAgICBpZiBzZWxmLmFjY291bnQuaW5mbygpLnJlZ19zdGF0dXMgPj0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYuc2VtLnJlbGVhc2UoKQorCitsaWIgPSBwai5MaWIoKQorCit0cnk6CisgICAgbGliLmluaXQobG9nX2NmZyA9IHBqLkxvZ0NvbmZpZyhsZXZlbD00LCBjYWxsYmFjaz1sb2dfY2IpKQorICAgIGxpYi5jcmVhdGVfdHJhbnNwb3J0KHBqLlRyYW5zcG9ydFR5cGUuVURQLCBwai5UcmFuc3BvcnRDb25maWcoNTA4MCkpCisgICAgbGliLnN0YXJ0KCkKKworICAgIGFjYyA9IGxpYi5jcmVhdGVfYWNjb3VudChwai5BY2NvdW50Q29uZmlnKCJwanNpcC5vcmciLCAiYmVubnlscCIsICIqKioiKSkKKworICAgIGFjY19jYiA9IE15QWNjb3VudENhbGxiYWNrKGFjYykKKyAgICBhY2Muc2V0X2NhbGxiYWNrKGFjY19jYikKKyAgICBhY2NfY2Iud2FpdCgpCisKKyAgICBwcmludCAiXG4iCisgICAgcHJpbnQgIlJlZ2lzdHJhdGlvbiBjb21wbGV0ZSwgc3RhdHVzPSIsIGFjYy5pbmZvKCkucmVnX3N0YXR1cywgXAorICAgICAgICAgICIoIiArIGFjYy5pbmZvKCkucmVnX3JlYXNvbiArICIpIgorICAgIHByaW50ICJcblByZXNzIEVOVEVSIHRvIHF1aXQiCisgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKworICAgIGxpYi5kZXN0cm95KCkKKyAgICBsaWIgPSBOb25lCisKK2V4Y2VwdCBwai5FcnJvciwgZToKKyAgICBwcmludCAiRXhjZXB0aW9uOiAiICsgc3RyKGUpCisgICAgbGliLmRlc3Ryb3koKQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2FtcGxlcy9zaW1wbGVjYWxsLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NhbXBsZXMvc2ltcGxlY2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFjMjhmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NhbXBsZXMvc2ltcGxlY2FsbC5weQpAQCAtMCwwICsxLDg4IEBACisjICRJZDogc2ltcGxlY2FsbC5weSAyMTcxIDIwMDgtMDctMjQgMDk6MDE6MzNaIGJlbm55bHAgJAorIworIyBTSVAgYWNjb3VudCBhbmQgcmVnaXN0cmF0aW9uIHNhbXBsZS4gSW4gdGhpcyBzYW1wbGUsIHRoZSBwcm9ncmFtCisjIHdpbGwgYmxvY2sgdG8gd2FpdCB1bnRpbCByZWdpc3RyYXRpb24gaXMgY29tcGxldGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgc3lzCitpbXBvcnQgcGpzdWEgYXMgcGoKKworIyBMb2dnaW5nIGNhbGxiYWNrCitkZWYgbG9nX2NiKGxldmVsLCBzdHIsIGxlbik6CisgICAgcHJpbnQgc3RyLAorCisjIENhbGxiYWNrIHRvIHJlY2VpdmUgZXZlbnRzIGZyb20gQ2FsbAorY2xhc3MgTXlDYWxsQ2FsbGJhY2socGouQ2FsbENhbGxiYWNrKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FsbD1Ob25lKToKKyAgICAgICAgcGouQ2FsbENhbGxiYWNrLl9faW5pdF9fKHNlbGYsIGNhbGwpCisKKyAgICAjIE5vdGlmaWNhdGlvbiB3aGVuIGNhbGwgc3RhdGUgaGFzIGNoYW5nZWQKKyAgICBkZWYgb25fc3RhdGUoc2VsZik6CisgICAgICAgIHByaW50ICJDYWxsIGlzICIsIHNlbGYuY2FsbC5pbmZvKCkuc3RhdGVfdGV4dCwKKyAgICAgICAgcHJpbnQgImxhc3QgY29kZSA9Iiwgc2VsZi5jYWxsLmluZm8oKS5sYXN0X2NvZGUsIAorICAgICAgICBwcmludCAiKCIgKyBzZWxmLmNhbGwuaW5mbygpLmxhc3RfcmVhc29uICsgIikiCisgICAgICAgIAorICAgICMgTm90aWZpY2F0aW9uIHdoZW4gY2FsbCdzIG1lZGlhIHN0YXRlIGhhcyBjaGFuZ2VkLgorICAgIGRlZiBvbl9tZWRpYV9zdGF0ZShzZWxmKToKKyAgICAgICAgZ2xvYmFsIGxpYgorICAgICAgICBpZiBzZWxmLmNhbGwuaW5mbygpLm1lZGlhX3N0YXRlID09IHBqLk1lZGlhU3RhdGUuQUNUSVZFOgorICAgICAgICAgICAgIyBDb25uZWN0IHRoZSBjYWxsIHRvIHNvdW5kIGRldmljZQorICAgICAgICAgICAgY2FsbF9zbG90ID0gc2VsZi5jYWxsLmluZm8oKS5jb25mX3Nsb3QKKyAgICAgICAgICAgIGxpYi5jb25mX2Nvbm5lY3QoY2FsbF9zbG90LCAwKQorICAgICAgICAgICAgbGliLmNvbmZfY29ubmVjdCgwLCBjYWxsX3Nsb3QpCisgICAgICAgICAgICBwcmludCAiSGVsbG8gd29ybGQsIEkgY2FuIHRhbGshIgorCisKKyMgQ2hlY2sgY29tbWFuZCBsaW5lIGFyZ3VtZW50CitpZiBsZW4oc3lzLmFyZ3YpICE9IDI6CisgICAgcHJpbnQgIlVzYWdlOiBzaW1wbGVjYWxsLnB5IDxkc3QtVVJJPiIKKyAgICBzeXMuZXhpdCgxKQorCit0cnk6CisgICAgIyBDcmVhdGUgbGlicmFyeSBpbnN0YW5jZQorICAgIGxpYiA9IHBqLkxpYigpCisKKyAgICAjIEluaXQgbGlicmFyeSB3aXRoIGRlZmF1bHQgY29uZmlnCisgICAgbGliLmluaXQobG9nX2NmZyA9IHBqLkxvZ0NvbmZpZyhsZXZlbD0zLCBjYWxsYmFjaz1sb2dfY2IpKQorCisgICAgIyBDcmVhdGUgVURQIHRyYW5zcG9ydCB3aGljaCBsaXN0ZW5zIHRvIGFueSBhdmFpbGFibGUgcG9ydAorICAgIHRyYW5zcG9ydCA9IGxpYi5jcmVhdGVfdHJhbnNwb3J0KHBqLlRyYW5zcG9ydFR5cGUuVURQKQorICAgIAorICAgICMgU3RhcnQgdGhlIGxpYnJhcnkKKyAgICBsaWIuc3RhcnQoKQorCisgICAgIyBDcmVhdGUgbG9jYWwvdXNlci1sZXNzIGFjY291bnQKKyAgICBhY2MgPSBsaWIuY3JlYXRlX2FjY291bnRfZm9yX3RyYW5zcG9ydCh0cmFuc3BvcnQpCisKKyAgICAjIE1ha2UgY2FsbAorICAgIGNhbGwgPSBhY2MubWFrZV9jYWxsKHN5cy5hcmd2WzFdLCBNeUNhbGxDYWxsYmFjaygpKQorCisgICAgIyBXYWl0IGZvciBFTlRFUiBiZWZvcmUgcXVpdHRpbmcKKyAgICBwcmludCAiUHJlc3MgPEVOVEVSPiB0byBxdWl0IgorICAgIGlucHV0ID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkucnN0cmlwKCJcclxuIikKKworICAgICMgV2UncmUgZG9uZSwgc2h1dGRvd24gdGhlIGxpYnJhcnkKKyAgICBsaWIuZGVzdHJveSgpCisgICAgbGliID0gTm9uZQorCitleGNlcHQgcGouRXJyb3IsIGU6CisgICAgcHJpbnQgIkV4Y2VwdGlvbjogIiArIHN0cihlKQorICAgIGxpYi5kZXN0cm95KCkKKyAgICBsaWIgPSBOb25lCisgICAgc3lzLmV4aXQoMSkKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NldHVwLXZjLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NldHVwLXZjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjE0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2V0dXAtdmMucHkKQEAgLTAsMCArMSw4MCBAQAorIyAkSWQ6IHNldHVwLXZjLnB5IDQxMjIgMjAxMi0wNS0xNCAxMTowNDo0NlogYmVubnlscCAkCisjCisjIHBqc3VhIFNldHVwIHNjcmlwdCBmb3IgVmlzdWFsIFN0dWRpbworIworIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKyMgRmluZCB2ZXJzaW9uCitwal92ZXJzaW9uPSIiCitwal92ZXJzaW9uX21ham9yPSIiCitwal92ZXJzaW9uX21pbm9yPSIiCitwal92ZXJzaW9uX3Jldj0iIgorcGpfdmVyc2lvbl9zdWZmaXg9IiIKK2YgPSBvcGVuKCcuLi8uLi8uLi92ZXJzaW9uLm1haycsICdyJykKK2ZvciBsaW5lIGluIGY6CisgICAgaWYgbGluZS5maW5kKCJleHBvcnQgUEpfVkVSU0lPTl9NQUpPUiIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9tYWpvcj0gdG9rZW5zWzFdLnN0cmlwKCkKKyAgICBlbGlmIGxpbmUuZmluZCgiZXhwb3J0IFBKX1ZFUlNJT05fTUlOT1IiKSAhPSAtMToKKyAgICAJdG9rZW5zPWxpbmUuc3BsaXQoIj0iKQorCWlmIGxlbih0b2tlbnMpPjE6CisJCXBqX3ZlcnNpb25fbWlub3I9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLmZpbmQoImV4cG9ydCBQSl9WRVJTSU9OX1JFViIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9yZXY9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLmZpbmQoImV4cG9ydCBQSl9WRVJTSU9OX1NVRkZJWCIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9zdWZmaXg9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisKK2YuY2xvc2UoKQoraWYgbm90IHBqX3ZlcnNpb25fbWFqb3I6CisgICAgcHJpbnQgJ1VuYWJsZSB0byBnZXQgUEpfVkVSU0lPTl9NQUpPUicKKyAgICBzeXMuZXhpdCgxKQorCitwal92ZXJzaW9uID0gcGpfdmVyc2lvbl9tYWpvciArICIuIiArIHBqX3ZlcnNpb25fbWlub3IKK2lmIHBqX3ZlcnNpb25fcmV2OgorCXBqX3ZlcnNpb24gKz0gIi4iICsgcGpfdmVyc2lvbl9yZXYKK2lmIHBqX3ZlcnNpb25fc3VmZml4OgorCXBqX3ZlcnNpb24gKz0gIi0iICsgcGpfdmVyc2lvbl9zdWZmaXgKKworI3ByaW50ICdQSl9WRVJTSU9OID0gIicrIHBqX3ZlcnNpb24gKyAnIicKKworCisjIENoZWNrIHRoYXQgZXh0ZW5zaW9uIGhhcyBiZWVuIGJ1aWx0CitpZiBub3Qgb3MuYWNjZXNzKCcuLi8uLi9saWIvX3Bqc3VhLnB5ZCcsIG9zLlJfT0spOgorICAgIHByaW50ICdFcnJvcjogZmlsZSAiLi4vLi4vbGliL19wanN1YS5weWQiIGRvZXMgbm90IGV4aXN0IScKKyAgICBwcmludCAnJworICAgIHByaW50ICdQbGVhc2UgYnVpbGQgdGhlIGV4dGVuc2lvbiB3aXRoIFZpc3VhbCBTdHVkaW8gZmlyc3QnCisgICAgcHJpbnQgJ0ZvciBtb3JlIGluZm8sIHNlZSBodHRwOi8vdHJhYy5wanNpcC5vcmcvcmVwb3Mvd2lraS9QeXRob25fU0lQX1R1dG9yaWFsJworICAgIHN5cy5leGl0KDEpCisKK3NldHVwKG5hbWU9InBqc3VhIiwKKyAgICAgIHZlcnNpb249cGpfdmVyc2lvbiwKKyAgICAgIGRlc2NyaXB0aW9uPSdTSVAgVXNlciBBZ2VudCBMaWJyYXJ5IGJhc2VkIG9uIFBKU0lQJywKKyAgICAgIHVybD0naHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3dpa2kvUHl0aG9uX1NJUF9UdXRvcmlhbCcsCisgICAgICBkYXRhX2ZpbGVzPVsoJ2xpYi9zaXRlLXBhY2thZ2VzJywgWycuLi8uLi9saWIvX3Bqc3VhLnB5ZCddKV0sCisgICAgICBweV9tb2R1bGVzPVsicGpzdWEiXQorICAgICApCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NldHVwLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvcHl0aG9uL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWVkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9weXRob24vc2V0dXAucHkKQEAgLTAsMCArMSwxMTQgQEAKKyMgJElkOiBzZXR1cC5weSA0MjMyIDIwMTItMDgtMjAgMDY6MDE6NDFaIG1pbmcgJAorIworIyBwanN1YSBTZXR1cCBzY3JpcHQuCisjCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorIworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcGxhdGZvcm0KKworIyBmaW5kIHBqc2lwIHZlcnNpb24KK3BqX3ZlcnNpb249IiIKK3BqX3ZlcnNpb25fbWFqb3I9IiIKK3BqX3ZlcnNpb25fbWlub3I9IiIKK3BqX3ZlcnNpb25fcmV2PSIiCitwal92ZXJzaW9uX3N1ZmZpeD0iIgorZiA9IG9wZW4oJy4uLy4uLy4uL3ZlcnNpb24ubWFrJywgJ3InKQorZm9yIGxpbmUgaW4gZjoKKyAgICBpZiBsaW5lLmZpbmQoImV4cG9ydCBQSl9WRVJTSU9OX01BSk9SIikgIT0gLTE6CisgICAgCXRva2Vucz1saW5lLnNwbGl0KCI9IikKKwlpZiBsZW4odG9rZW5zKT4xOgorCQlwal92ZXJzaW9uX21ham9yPSB0b2tlbnNbMV0uc3RyaXAoKQorICAgIGVsaWYgbGluZS5maW5kKCJleHBvcnQgUEpfVkVSU0lPTl9NSU5PUiIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9taW5vcj0gbGluZS5zcGxpdCgiPSIpWzFdLnN0cmlwKCkKKyAgICBlbGlmIGxpbmUuZmluZCgiZXhwb3J0IFBKX1ZFUlNJT05fUkVWIikgIT0gLTE6CisgICAgCXRva2Vucz1saW5lLnNwbGl0KCI9IikKKwlpZiBsZW4odG9rZW5zKT4xOgorCQlwal92ZXJzaW9uX3Jldj0gbGluZS5zcGxpdCgiPSIpWzFdLnN0cmlwKCkKKyAgICBlbGlmIGxpbmUuZmluZCgiZXhwb3J0IFBKX1ZFUlNJT05fU1VGRklYIikgIT0gLTE6CisgICAgCXRva2Vucz1saW5lLnNwbGl0KCI9IikKKwlpZiBsZW4odG9rZW5zKT4xOgorCQlwal92ZXJzaW9uX3N1ZmZpeD0gbGluZS5zcGxpdCgiPSIpWzFdLnN0cmlwKCkKKworZi5jbG9zZSgpCitpZiBub3QgcGpfdmVyc2lvbl9tYWpvcjoKKyAgICBwcmludCAnVW5hYmxlIHRvIGdldCBQSl9WRVJTSU9OX01BSk9SJworICAgIHN5cy5leGl0KDEpCisKK3BqX3ZlcnNpb24gPSBwal92ZXJzaW9uX21ham9yICsgIi4iICsgcGpfdmVyc2lvbl9taW5vcgoraWYgcGpfdmVyc2lvbl9yZXY6CisJcGpfdmVyc2lvbiArPSAiLiIgKyBwal92ZXJzaW9uX3JldgoraWYgcGpfdmVyc2lvbl9zdWZmaXg6CisJcGpfdmVyc2lvbiArPSAiLSIgKyBwal92ZXJzaW9uX3N1ZmZpeAorCisjcHJpbnQgJ1BKX1ZFUlNJT04gPSAiJysgcGpfdmVyc2lvbiArICciJworCisKKyMgRmlsbCBpbiBwal9pbmNfZGlycworcGpfaW5jX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC1mIGhlbHBlci5tYWsgaW5jX2RpciIpCitmb3IgbGluZSBpbiBmOgorICAgIHBqX2luY19kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJfZGlycworcGpfbGliX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC1mIGhlbHBlci5tYWsgbGliX2RpciIpCitmb3IgbGluZSBpbiBmOgorICAgIHBqX2xpYl9kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJzCitwal9saWJzID0gW10KK2YgPSBvcy5wb3BlbigibWFrZSAtZiBoZWxwZXIubWFrIGxpYnMiKQorZm9yIGxpbmUgaW4gZjoKKyAgICBwal9saWJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgTWFjIE9TIFggZGVwZWRlbmNpZXMKK2lmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdEYXJ3aW4nOgorICAgIGV4dHJhX2xpbmtfYXJncyA9IFsiLWZyYW1ld29yayIsICJDb3JlRm91bmRhdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAiLWZyYW1ld29yayIsICJBdWRpb1Rvb2xib3giXQorICAgIHZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0uc3BsaXQoIi4iKSAgICAKKyAgICAjIE9TIFggTGlvbiAoMTAuNy54KSBvciBhYm92ZSBzdXBwb3J0CisgICAgaWYgdmVyc2lvblswXSA9PSAnMTAnIGFuZCBpbnQodmVyc2lvblsxXSkgPj0gNzoKKyAgICAgICAgZXh0cmFfbGlua19hcmdzICs9IFsiLWZyYW1ld29yayIsICJBdWRpb1VuaXQiXQorZWxzZToKKyAgICBleHRyYV9saW5rX2FyZ3MgPSBbXQorCisKK3NldHVwKG5hbWU9InBqc3VhIiwgCisgICAgICB2ZXJzaW9uPXBqX3ZlcnNpb24sCisgICAgICBkZXNjcmlwdGlvbj0nU0lQIFVzZXIgQWdlbnQgTGlicmFyeSBiYXNlZCBvbiBQSlNJUCcsCisgICAgICB1cmw9J2h0dHA6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy93aWtpL1B5dGhvbl9TSVBfVHV0b3JpYWwnLAorICAgICAgZXh0X21vZHVsZXMgPSBbRXh0ZW5zaW9uKCJfcGpzdWEiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl9wanN1YS5jIl0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3M9WygnUEpfQVVUT0NPTkYnLCAnMScpLF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPXBqX2luY19kaXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9cGpfbGliX2RpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1wal9saWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1leHRyYV9saW5rX2FyZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgIHB5X21vZHVsZXM9WyJwanN1YSJdCisgICAgICkKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2FlY3Rlc3QuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvYWVjdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTFmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2FlY3Rlc3QuYwpAQCAtMCwwICsxLDMwNCBAQAorLyogJElkOiBhZWN0ZXN0LmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19hZWN0ZXN0X2MgU2FtcGxlczogQUVDIFRlc3QgKGFlY3Rlc3QuYykKKyAqCisgKiBQbGF5IGEgZmlsZSB0byBzcGVha2VyLCBydW4gQUVDLCBhbmQgcmVjb3JkIHRoZSBtaWNyb3Bob25lIGlucHV0CisgKiB0byBzZWUgaWYgZWNobyBpcyBjb21pbmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvYWVjdGVzdC5jCisgKgorICogXGluY2x1ZGVsaW5lbm8gYWVjdGVzdC5jCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgkvKiBwal9nZXRvcHQgKi8KKyNpbmNsdWRlIDxwamxpYi5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJhZWN0ZXN0LmMiCisjZGVmaW5lIFBUSU1FCSAgICAyMAorI2RlZmluZSBUQUlMX0xFTkdUSCAyMDAKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyIgRklMRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBhZWN0ZXN0LmMJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIFBVUlBPU0UJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBUZXN0IHRoZSBBRUMgZWZmZWN0aXZlbmVzcy4JCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIFVTQUdFCQkgICAgCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgIGFlY3Rlc3QgW29wdGlvbnNdIDxQTEFZLldBVj4gPFJFQy5XQVY+IDxPVVRQVVQuV0FWPgkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgIDxQTEFZLldBVj4gICBpcyB0aGUgc2lnbmFsIHBsYXllZCB0byB0aGUgc3BlYWtlci4JCSAgICBcbiIKKyIgIDxSRUMuV0FWPiAgICBpcyB0aGUgc2lnbmFsIGNhcHR1cmVkIGZyb20gdGhlIG1pY3JvcGhvbmUuCSAgICBcbiIKKyIgIDxPVVRQVVQuV0FWPiBpcyB0aGUgb3V0cHV0IGZpbGUgdG8gc3RvcmUgdGhlIHRlc3QgcmVzdWx0CSAgICBcbiIKKyJcbiIKKyIgb3B0aW9uczpcbiIKKyIgIC1kICBUaGUgZGVsYXkgYmV0d2VlbiBwbGF5YmFjayBhbmQgY2FwdHVyZSBpbiBtcywgYXQgbGVhc3QgMjUgbXMuXG4iCisiICAgICAgRGVmYXVsdCBpcyAyNSBtcy4gU2VlIG5vdGUgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorIiAgLWwgIFNldCB0aGUgZWNobyB0YWlsIGxlbmd0aCBpbiBtcy4gRGVmYXVsdCBpcyAyMDAgbXMJICAgIFxuIgorIiAgLXIgIFNldCByZXBlYXQgY291bnQgKGRlZmF1bHQ9MSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyIgIC1hICBBbGdvcml0aG06IDA9ZGVmYXVsdCwgMT1zcGVleCwgMz1lY2hvIHN1cHByZXNzCQkgICAgXG4iCisiICAtaSAgSW50ZXJhY3RpdmUJCQkJCQkgICAgXG4iCisiXG4iCisiIE5vdGUgdGhhdCBmb3IgdGhlIEFFQyBpbnRlcm5hbCBidWZmZXJpbmcgbWVjaGFuaXNtLCBpdCBpcyByZXF1aXJlZFxuIgorIiB0aGF0IHRoZSBlY2hvZWQgc2lnbmFsIChpbiBSRUMuV0FWKSBpcyBkZWxheWVkIGZyb20gdGhlICAgICAgICAgICBcbiIKKyIgY29ycmVzcG9uZGluZyByZWZlcmVuY2Ugc2lnbmFsIChpbiBQTEFZLldBVikgYXQgbGVhc3QgYXMgbXVjaCBhcyAgXG4iCisiIGZyYW1lIHRpbWUgKyBQSk1FRElBX1dTT0xBX0RFTEFZX01TRUMuIEluIHRoaXMgYXBwbGljYXRpb24sIGZyYW1lIFxuIgorIiB0aW1lIGlzIDIwIG1zIGFuZCBkZWZhdWx0IFBKTUVESUFfV1NPTEFfREVMQVlfTVNFQyBpcyA1IG1zLCBoZW5jZSBcbiIKKyIgMjUgbXMgZGVsYXkgaXMgdGhlIG1pbmltdW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iOworCisvKiAKKyAqIFNhbXBsZSBzZXNzaW9uOgorICoKKyAqIC1kIDEwMCAtYSAxIC4uL2Jpbi9vcmlnOC53YXYgLi4vYmluL2VjaG84LndhdiAuLi9iaW4vcmVzdWx0OC53YXYgCisgKi8KKworc3RhdGljIHZvaWQgYXBwX3BlcnJvcihjb25zdCBjaGFyICpzZW5kZXIsIGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdCkKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgcGpfc3RyZXJyb3Ioc3QsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgIFBKX0xPRygzLChzZW5kZXIsICIlczogJXMiLCB0aXRsZSwgZXJybXNnKSk7Cit9CisKKworLyoKKyAqIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCBjcDsKKyAgICBwam1lZGlhX2VuZHB0ICptZWRfZW5kcHQ7CisgICAgcGpfcG9vbF90CSAgKnBvb2w7CisgICAgcGptZWRpYV9wb3J0ICAqd2F2X3BsYXk7CisgICAgcGptZWRpYV9wb3J0ICAqd2F2X3JlYzsKKyAgICBwam1lZGlhX3BvcnQgICp3YXZfb3V0OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwam1lZGlhX2VjaG9fc3RhdGUgKmVjOworICAgIHBqbWVkaWFfZnJhbWUgcGxheV9mcmFtZSwgcmVjX2ZyYW1lOworICAgIHVuc2lnbmVkIG9wdCA9IDA7CisgICAgdW5zaWduZWQgbGF0ZW5jeV9tcyA9IDI1OworICAgIHVuc2lnbmVkIHRhaWxfbXMgPSBUQUlMX0xFTkdUSDsKKyAgICBwal90aW1lc3RhbXAgdDAsIHQxOworICAgIGludCBpLCByZXBlYXQ9MSwgaW50ZXJhY3RpdmU9MCwgYzsKKworICAgIHBqX29wdGluZCA9IDA7CisgICAgd2hpbGUgKChjPXBqX2dldG9wdChhcmdjLCBhcmd2LCAiZDpsOmE6cjppIikpICE9LTEpIHsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdkJzoKKwkgICAgbGF0ZW5jeV9tcyA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGxhdGVuY3lfbXMgPCAyNSkgeworCQlwdXRzKCJJbnZhbGlkIGRlbGF5Iik7CisJCXB1dHMoZGVzYyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAnbCc6CisJICAgIHRhaWxfbXMgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ2EnOgorCSAgICB7CisJCWludCBhbGcgPSBhdG9pKHBqX29wdGFyZyk7CisJCXN3aXRjaCAoYWxnKSB7CisJCWNhc2UgMDoKKwkJICAgIG9wdCA9IDA7CisJCWNhc2UgMToKKwkJICAgIG9wdCA9IFBKTUVESUFfRUNIT19TUEVFWDsKKwkJICAgIGJyZWFrOworCQljYXNlIDM6CisJCSAgICBvcHQgPSBQSk1FRElBX0VDSE9fU0lNUExFOworCQkgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICBwdXRzKCJJbnZhbGlkIGFsZ29yaXRobSIpOworCQkgICAgcHV0cyhkZXNjKTsKKwkJICAgIHJldHVybiAxOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAncic6CisJICAgIHJlcGVhdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKHJlcGVhdCA8IDEpIHsKKwkJcHV0cygiSW52YWxpZCByZXBlYXQgY291bnQiKTsKKwkJcHV0cyhkZXNjKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAnaSc6CisJICAgIGludGVyYWN0aXZlID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChhcmdjIC0gcGpfb3B0aW5kICE9IDMpIHsKKwlwdXRzKCJFcnJvcjogbWlzc2luZyBhcmd1bWVudChzKSIpOworCXB1dHMoZGVzYyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogTXVzdCBpbml0IFBKTElCIGZpcnN0OiAqLworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludC4KKyAgICAgKiBUaGlzIHdpbGwgaW1wbGljaXRseSBpbml0aWFsaXplIFBKTUVESUEgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIENyZWF0ZSBtZW1vcnkgcG9vbCBmb3Igb3VyIGZpbGUgcGxheWVyICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJ3YXYiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICAvKiBPcGVuIHdhdl9wbGF5ICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKHBvb2wsIGFyZ3ZbcGpfb3B0aW5kXSwgUFRJTUUsIAorCQkJCQkgICAgUEpNRURJQV9GSUxFX05PX0xPT1AsIDAsIAorCQkJCQkgICAgJndhdl9wbGF5KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIG9wZW5pbmcgcGxheWJhY2sgV0FWIGZpbGUiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKyAgICAKKyAgICAvKiBPcGVuIHJlY29yZGVkIHdhdiAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfd2F2X3BsYXllcl9wb3J0X2NyZWF0ZShwb29sLCBhcmd2W3BqX29wdGluZCsxXSwgUFRJTUUsIAorCQkJCQkgICAgUEpNRURJQV9GSUxFX05PX0xPT1AsIDAsIAorCQkJCQkgICAgJndhdl9yZWMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igb3BlbmluZyByZWNvcmRlZCBXQVYgZmlsZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogcGxheSBhbmQgcmVjIFdBVnMgbXVzdCBoYXZlIHRoZSBzYW1lIGNsb2NrIHJhdGUgKi8KKyAgICBpZiAoUEpNRURJQV9QSUFfU1JBVEUoJndhdl9wbGF5LT5pbmZvKSAhPSBQSk1FRElBX1BJQV9TUkFURSgmd2F2X3JlYy0+aW5mbykpIHsKKwlwdXRzKCJFcnJvcjogY2xvY2sgcmF0ZSBtaXNtYXRjaCBpbiB0aGUgV0FWIGZpbGVzIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogLi4gYW5kIGNoYW5uZWwgY291bnQgKi8KKyAgICBpZiAoUEpNRURJQV9QSUFfQ0NOVCgmd2F2X3BsYXktPmluZm8pICE9IFBKTUVESUFfUElBX0NDTlQoJndhdl9yZWMtPmluZm8pKSB7CisJcHV0cygiRXJyb3I6IGNsb2NrIHJhdGUgbWlzbWF0Y2ggaW4gdGhlIFdBViBmaWxlcyIpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIENyZWF0ZSBvdXRwdXQgd2F2ICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfY3JlYXRlKHBvb2wsIGFyZ3ZbcGpfb3B0aW5kKzJdLAorCQkJCQkgICAgUEpNRURJQV9QSUFfU1JBVEUoJndhdl9wbGF5LT5pbmZvKSwKKwkJCQkJICAgIFBKTUVESUFfUElBX0NDTlQoJndhdl9wbGF5LT5pbmZvKSwKKwkJCQkJICAgIFBKTUVESUFfUElBX1NQRigmd2F2X3BsYXktPmluZm8pLAorCQkJCQkgICAgUEpNRURJQV9QSUFfQklUUygmd2F2X3BsYXktPmluZm8pLAorCQkJCQkgICAgMCwgMCwgJndhdl9vdXQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgV0FWIGZpbGUiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIENyZWF0ZSBlY2hvIGNhbmNlbGxlciAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZWNob19jcmVhdGUyKHBvb2wsIFBKTUVESUFfUElBX1NSQVRFKCZ3YXZfcGxheS0+aW5mbyksCisJCQkJICBQSk1FRElBX1BJQV9DQ05UKCZ3YXZfcGxheS0+aW5mbyksCisJCQkJICBQSk1FRElBX1BJQV9TUEYoJndhdl9wbGF5LT5pbmZvKSwKKwkJCQkgIHRhaWxfbXMsIGxhdGVuY3lfbXMsCisJCQkJICBvcHQsICZlYyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjcmVhdGluZyBFQyIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICAvKiBQcm9jZXNzaW5nIGxvb3AgKi8KKyAgICBwbGF5X2ZyYW1lLmJ1ZiA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgUEpNRURJQV9QSUFfU1BGKCZ3YXZfcGxheS0+aW5mbyk8PDEpOworICAgIHJlY19mcmFtZS5idWYgPSBwal9wb29sX2FsbG9jKHBvb2wsIFBKTUVESUFfUElBX1NQRigmd2F2X3BsYXktPmluZm8pPDwxKTsKKyAgICBwal9nZXRfdGltZXN0YW1wKCZ0MCk7CisgICAgZm9yIChpPTA7IGkgPCByZXBlYXQ7ICsraSkgeworCWZvciAoOzspIHsKKwkgICAgcGxheV9mcmFtZS5zaXplID0gUEpNRURJQV9QSUFfU1BGKCZ3YXZfcGxheS0+aW5mbykgPDwgMTsKKwkgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2dldF9mcmFtZSh3YXZfcGxheSwgJnBsYXlfZnJhbWUpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWJyZWFrOworCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfZWNob19wbGF5YmFjayhlYywgKHNob3J0KilwbGF5X2ZyYW1lLmJ1Zik7CisKKwkgICAgcmVjX2ZyYW1lLnNpemUgPSBQSk1FRElBX1BJQV9TUEYoJndhdl9wbGF5LT5pbmZvKSA8PCAxOworCSAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKHdhdl9yZWMsICZyZWNfZnJhbWUpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWJyZWFrOworCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfZWNob19jYXB0dXJlKGVjLCAoc2hvcnQqKXJlY19mcmFtZS5idWYsIDApOworCisJICAgIC8vc3RhdHVzID0gcGptZWRpYV9lY2hvX2NhbmNlbChlYywgKHNob3J0KilyZWNfZnJhbWUuYnVmLCAKKwkgICAgLy8JCQkgICAgIChzaG9ydCopcGxheV9mcmFtZS5idWYsIDAsIE5VTEwpOworCisJICAgIHBqbWVkaWFfcG9ydF9wdXRfZnJhbWUod2F2X291dCwgJnJlY19mcmFtZSk7CisJfQorCisJcGptZWRpYV93YXZfcGxheWVyX3BvcnRfc2V0X3Bvcyh3YXZfcGxheSwgMCk7CisJcGptZWRpYV93YXZfcGxheWVyX3BvcnRfc2V0X3Bvcyh3YXZfcmVjLCAwKTsKKyAgICB9CisgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOworCisgICAgaSA9IChpbnQpcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfZ2V0X3Bvcyh3YXZfb3V0KSAvIHNpemVvZihwal9pbnQxNl90KSAqIDEwMDAgLyAKKwkgKFBKTUVESUFfUElBX1NSQVRFKCZ3YXZfb3V0LT5pbmZvKSAqIFBKTUVESUFfUElBX0NDTlQoJndhdl9vdXQtPmluZm8pKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUHJvY2Vzc2VkICUzZC4lMDNkcyBhdWRpbyIsCisJICAgICAgaSAvIDEwMDAsIGkgJSAxMDAwKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkNvbXBsZXRlZCBpbiAldSBtc2VjXG4iLCBwal9lbGFwc2VkX21zZWMoJnQwLCAmdDEpKSk7CisKKyAgICAvKiBEZXN0cm95IGZpbGUgcG9ydChzKSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfcG9ydF9kZXN0cm95KCB3YXZfcGxheSApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworICAgIHN0YXR1cyA9IHBqbWVkaWFfcG9ydF9kZXN0cm95KCB3YXZfcmVjICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2Rlc3Ryb3koIHdhdl9vdXQgKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIERlc3Ryb3kgZWMgKi8KKyAgICBwam1lZGlhX2VjaG9fZGVzdHJveShlYyk7CisKKyAgICAvKiBSZWxlYXNlIGFwcGxpY2F0aW9uIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UoIHBvb2wgKTsKKworICAgIC8qIERlc3Ryb3kgbWVkaWEgZW5kcG9pbnQuICovCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KCBtZWRfZW5kcHQgKTsKKworICAgIC8qIERlc3Ryb3kgcG9vbCBmYWN0b3J5ICovCisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZjcCApOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisgICAgaWYgKGludGVyYWN0aXZlKSB7CisJY2hhciBzWzEwXSwgKmR1bW15OworCXB1dHMoIkVOVEVSIHRvIHF1aXQiKTsKKwlkdW1teSA9IGZnZXRzKHMsIHNpemVvZihzKSwgc3RkaW4pOworICAgIH0KKworICAgIC8qIERvbmUuICovCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvYXVkZGVtby5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9hdWRkZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlMzU2MgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvYXVkZGVtby5jCkBAIC0wLDAgKzEsNTgyIEBACisvKiAkSWQ6IGF1ZGRlbW8uYyAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqbWVkaWEtYXVkaW9kZXYvYXVkaW9kZXYuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvdGVzdC5oPgorI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKworI2RlZmluZSBUSElTX0ZJTEUJImF1ZGRlbW8uYyIKKyNkZWZpbmUgTUFYX0RFVklDRVMJNjQKKyNkZWZpbmUgV0FWX0ZJTEUJImF1ZGRlbW8ud2F2IgorCisKK3N0YXRpYyB1bnNpZ25lZCBkZXZfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgcGxheWJhY2tfbGF0ID0gUEpNRURJQV9TTkRfREVGQVVMVF9QTEFZX0xBVEVOQ1k7CitzdGF0aWMgdW5zaWduZWQgY2FwdHVyZV9sYXQgPSBQSk1FRElBX1NORF9ERUZBVUxUX1JFQ19MQVRFTkNZOworCitzdGF0aWMgdm9pZCBhcHBfcGVycm9yKGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKworICAgIHBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CQorICAgIHByaW50ZiggIiVzOiAlcyAoZXJyPSVkKVxuIiwKKwkgICAgdGl0bGUsIGVycm1zZywgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgbGlzdF9kZXZpY2VzKHZvaWQpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgZGV2X2NvdW50ID0gcGptZWRpYV9hdWRfZGV2X2NvdW50KCk7CisgICAgaWYgKGRldl9jb3VudCA9PSAwKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIk5vIGRldmljZXMgZm91bmQiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJGb3VuZCAlZCBkZXZpY2VzOiIsIGRldl9jb3VudCkpOworCisgICAgZm9yIChpPTA7IGk8ZGV2X2NvdW50OyArK2kpIHsKKwlwam1lZGlhX2F1ZF9kZXZfaW5mbyBpbmZvOworCisJc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKGksICZpbmZvKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGNvbnRpbnVlOworCisJUEpfTE9HKDMsKFRISVNfRklMRSwiICUyZDogJXMgWyVzXSAoJWQvJWQpIiwKKwkgICAgICAgICAgaSwgaW5mby5kcml2ZXIsIGluZm8ubmFtZSwgaW5mby5pbnB1dF9jb3VudCwgaW5mby5vdXRwdXRfY291bnQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZWNvZGVfY2Fwcyh1bnNpZ25lZCBjYXBzKQoreworICAgIHN0YXRpYyBjaGFyIHRleHRbMjAwXTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgdGV4dFswXSA9ICdcMCc7CisKKyAgICBmb3IgKGk9MDsgaTwzMTsgKytpKSB7CisJaWYgKCgxIDw8IGkpICYgY2FwcykgeworCSAgICBjb25zdCBjaGFyICpjYXBuYW1lOworCSAgICBjYXBuYW1lID0gcGptZWRpYV9hdWRfZGV2X2NhcF9uYW1lKChwam1lZGlhX2F1ZF9kZXZfY2FwKSgxIDw8IGkpLCAKKwkJCQkJICAgICAgIE5VTEwpOworCSAgICBzdHJjYXQodGV4dCwgY2FwbmFtZSk7CisJICAgIHN0cmNhdCh0ZXh0LCAiICIpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gdGV4dDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kZXZfaW5mbyh1bnNpZ25lZCBpbmRleCkKK3sKKyNkZWZpbmUgSCAgICIlLTIwcyIKKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5mbyBpbmZvOworICAgIGNoYXIgZm9ybWF0c1syMDBdOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChpbmRleCA+PSBkZXZfY291bnQpIHsKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IGludmFsaWQgaW5kZXggJXUiLCBpbmRleCkpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX2F1ZF9kZXZfZ2V0X2luZm8oaW5kZXgsICZpbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwam1lZGlhX2F1ZF9kZXZfZ2V0X2luZm8oKSBlcnJvciIsIHN0YXR1cyk7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiRGV2aWNlIGF0IGluZGV4ICV1OiIsIGluZGV4KSk7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikpOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsIEgiOiAldSAoMHgleCkiLCAiSUQiLCBpbmRleCwgaW5kZXgpKTsKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgSCI6ICVzIiwgIk5hbWUiLCBpbmZvLm5hbWUpKTsKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgSCI6ICVzIiwgIkRyaXZlciIsIGluZm8uZHJpdmVyKSk7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsIEgiOiAldSIsICJJbnB1dCBjaGFubmVscyIsIGluZm8uaW5wdXRfY291bnQpKTsKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgSCI6ICV1IiwgIk91dHB1dCBjaGFubmVscyIsIGluZm8ub3V0cHV0X2NvdW50KSk7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsIEgiOiAlcyIsICJDYXBhYmlsaXRpZXMiLCBkZWNvZGVfY2FwcyhpbmZvLmNhcHMpKSk7CisKKyAgICBmb3JtYXRzWzBdID0gJ1wwJzsKKyAgICBpZiAoaW5mby5jYXBzICYgUEpNRURJQV9BVURfREVWX0NBUF9FWFRfRk9STUFUKSB7CisJdW5zaWduZWQgaTsKKworCWZvciAoaT0wOyBpPGluZm8uZXh0X2ZtdF9jbnQ7ICsraSkgeworCSAgICBjaGFyIGJpdHJhdGVbMzJdOworCisJICAgIHN3aXRjaCAoaW5mby5leHRfZm10W2ldLmlkKSB7CisJICAgIGNhc2UgUEpNRURJQV9GT1JNQVRfTDE2OgorCQlzdHJjYXQoZm9ybWF0cywgIkwxNi8iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpNRURJQV9GT1JNQVRfUENNQToKKwkJc3RyY2F0KGZvcm1hdHMsICJQQ01BLyIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX0ZPUk1BVF9QQ01VOgorCQlzdHJjYXQoZm9ybWF0cywgIlBDTVUvIik7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfRk9STUFUX0FNUjoKKwkJc3RyY2F0KGZvcm1hdHMsICJBTVIvIik7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfRk9STUFUX0c3Mjk6CisJCXN0cmNhdChmb3JtYXRzLCAiRzcyOS8iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpNRURJQV9GT1JNQVRfSUxCQzoKKwkJc3RyY2F0KGZvcm1hdHMsICJJTEJDLyIpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJc3RyY2F0KGZvcm1hdHMsICJ1bmtub3duLyIpOworCQlicmVhazsKKwkgICAgfQorCSAgICBzcHJpbnRmKGJpdHJhdGUsICIldSIsIGluZm8uZXh0X2ZtdFtpXS5kZXQuYXVkLmF2Z19icHMpOworCSAgICBzdHJjYXQoZm9ybWF0cywgYml0cmF0ZSk7CisJICAgIHN0cmNhdChmb3JtYXRzLCAiICIpOworCX0KKyAgICB9CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsIEgiOiAlcyIsICJFeHRlbmRlZCBmb3JtYXRzIiwgZm9ybWF0cykpOworCisjdW5kZWYgSAorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2RldmljZShwam1lZGlhX2RpciBkaXIsIHVuc2lnbmVkIHJlY19pZCwgdW5zaWduZWQgcGxheV9pZCwgCisJCQl1bnNpZ25lZCBjbG9ja19yYXRlLCB1bnNpZ25lZCBwdGltZSwgCisJCQl1bnNpZ25lZCBjaG51bSkKK3sKKyAgICBwam1lZGlhX2F1ZF9wYXJhbSBwYXJhbTsKKyAgICBwam1lZGlhX2F1ZF90ZXN0X3Jlc3VsdHMgcmVzdWx0OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChkaXIgJiBQSk1FRElBX0RJUl9DQVBUVVJFKSB7CisJc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2RlZmF1bHRfcGFyYW0ocmVjX2lkLCAmcGFyYW0pOworICAgIH0gZWxzZSB7CisJc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2RlZmF1bHRfcGFyYW0ocGxheV9pZCwgJnBhcmFtKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwam1lZGlhX2F1ZF9kZXZfZGVmYXVsdF9wYXJhbSgpIiwgc3RhdHVzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcGFyYW0uZGlyID0gZGlyOworICAgIHBhcmFtLnJlY19pZCA9IHJlY19pZDsKKyAgICBwYXJhbS5wbGF5X2lkID0gcGxheV9pZDsKKyAgICBwYXJhbS5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKyAgICBwYXJhbS5jaGFubmVsX2NvdW50ID0gY2hudW07CisgICAgcGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgPSBjbG9ja19yYXRlICogY2hudW0gKiBwdGltZSAvIDEwMDA7CisKKyAgICAvKiBMYXRlbmN5IHNldHRpbmdzICovCisgICAgcGFyYW0uZmxhZ3MgfD0gKFBKTUVESUFfQVVEX0RFVl9DQVBfSU5QVVRfTEFURU5DWSB8IAorCQkgICAgUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfTEFURU5DWSk7CisgICAgcGFyYW0uaW5wdXRfbGF0ZW5jeV9tcyA9IGNhcHR1cmVfbGF0OworICAgIHBhcmFtLm91dHB1dF9sYXRlbmN5X21zID0gcGxheWJhY2tfbGF0OworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlBlcmZvcm1pbmcgdGVzdC4uIikpOworCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfdGVzdCgmcGFyYW0sICZyZXN1bHQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIlRlc3QgaGFzIGNvbXBsZXRlZCB3aXRoIGVycm9yIiwgc3RhdHVzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkRvbmUuIFJlc3VsdDoiKSk7CisKKyAgICBpZiAoZGlyICYgUEpNRURJQV9ESVJfQ0FQVFVSRSkgeworCWlmIChyZXN1bHQucmVjLmZyYW1lX2NudD09MCkgeworCSAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IG5vIGZyYW1lcyBjYXB0dXJlZCEiKSk7CisJfSBlbHNlIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgJS0yMHM6IGludGVydmFsIChtaW4vbWF4L2F2Zy9kZXYpPSV1LyV1LyV1LyV1LCBidXJzdD0ldSIsCisJCSAgICAgICJSZWNvcmRpbmcgcmVzdWx0IiwKKwkJICAgICAgcmVzdWx0LnJlYy5taW5faW50ZXJ2YWwsCisJCSAgICAgIHJlc3VsdC5yZWMubWF4X2ludGVydmFsLAorCQkgICAgICByZXN1bHQucmVjLmF2Z19pbnRlcnZhbCwKKwkJICAgICAgcmVzdWx0LnJlYy5kZXZfaW50ZXJ2YWwsCisJCSAgICAgIHJlc3VsdC5yZWMubWF4X2J1cnN0KSk7CisJfQorICAgIH0KKworICAgIGlmIChkaXIgJiBQSk1FRElBX0RJUl9QTEFZQkFDSykgeworCWlmIChyZXN1bHQucGxheS5mcmFtZV9jbnQ9PTApIHsKKwkgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBubyBwbGF5YmFjayEiKSk7CisJfSBlbHNlIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgJS0yMHM6IGludGVydmFsIChtaW4vbWF4L2F2Zy9kZXYpPSV1LyV1LyV1LyV1LCBidXJzdD0ldSIsCisJCSAgICAgICJQbGF5YmFjayByZXN1bHQiLAorCQkgICAgICByZXN1bHQucGxheS5taW5faW50ZXJ2YWwsCisJCSAgICAgIHJlc3VsdC5wbGF5Lm1heF9pbnRlcnZhbCwKKwkJICAgICAgcmVzdWx0LnBsYXkuYXZnX2ludGVydmFsLAorCQkgICAgICByZXN1bHQucGxheS5kZXZfaW50ZXJ2YWwsCisJCSAgICAgIHJlc3VsdC5wbGF5Lm1heF9idXJzdCkpOworCX0KKyAgICB9CisKKyAgICBpZiAoZGlyPT1QSk1FRElBX0RJUl9DQVBUVVJFX1BMQVlCQUNLKSB7CisJaWYgKHJlc3VsdC5yZWNfZHJpZnRfcGVyX3NlYyA9PSAwKSB7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgTm8gY2xvY2sgZHJpZnQgZGV0ZWN0ZWQiKSk7CisJfSBlbHNlIHsKKwkgICAgY29uc3QgY2hhciAqd2hpY2ggPSByZXN1bHQucmVjX2RyaWZ0X3Blcl9zZWM+PTAgPyAiZmFzdGVyIiA6ICJzbG93ZXIiOworCSAgICB1bnNpZ25lZCBkcmlmdCA9IHJlc3VsdC5yZWNfZHJpZnRfcGVyX3NlYz49MCA/IAorCQkJCXJlc3VsdC5yZWNfZHJpZnRfcGVyX3NlYyA6CisJCQkJLXJlc3VsdC5yZWNfZHJpZnRfcGVyX3NlYzsKKworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiIENsb2NrIGRyaWZ0cyBkZXRlY3RlZC4gQ2FwdHVyZSBkZXZpY2UgIgorCQkJCSAiaXMgcnVubmluZyAlZCBzYW1wbGVzIHBlciBzZWNvbmQgJXMgIgorCQkJCSAidGhhbiB0aGUgcGxheWJhY2sgZGV2aWNlIiwKKwkJCQkgZHJpZnQsIHdoaWNoKSk7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgcGpfc3RhdHVzX3Qgd2F2X3JlY19jYih2b2lkICp1c2VyX2RhdGEsIHBqbWVkaWFfZnJhbWUgKmZyYW1lKQoreworICAgIHJldHVybiBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKChwam1lZGlhX3BvcnQqKXVzZXJfZGF0YSwgZnJhbWUpOworfQorCitzdGF0aWMgdm9pZCByZWNvcmQodW5zaWduZWQgcmVjX2luZGV4LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHBqbWVkaWFfcG9ydCAqd2F2ID0gTlVMTDsKKyAgICBwam1lZGlhX2F1ZF9wYXJhbSBwYXJhbTsKKyAgICBwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0gPSBOVUxMOworICAgIGNoYXIgbGluZVsxMF0sICpkdW1teTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKwlmaWxlbmFtZSA9IFdBVl9GSUxFOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKHBqbWVkaWFfYXVkX3N1YnN5c19nZXRfcG9vbF9mYWN0b3J5KCksICJ3YXYiLAorCQkJICAxMDAwLCAxMDAwLCBOVUxMKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X2NyZWF0ZShwb29sLCBmaWxlbmFtZSwgMTYwMDAsIAorCQkJCQkgICAgMSwgMzIwLCAxNiwgMCwgMCwgJndhdik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiRXJyb3IgY3JlYXRpbmcgV0FWIGZpbGUiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKHJlY19pbmRleCwgJnBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwam1lZGlhX2F1ZF9kZXZfZGVmYXVsdF9wYXJhbSgpIiwgc3RhdHVzKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBwYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFOworICAgIHBhcmFtLmNsb2NrX3JhdGUgPSBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKTsKKyAgICBwYXJhbS5zYW1wbGVzX3Blcl9mcmFtZSA9IFBKTUVESUFfUElBX1NQRigmd2F2LT5pbmZvKTsKKyAgICBwYXJhbS5jaGFubmVsX2NvdW50ID0gUEpNRURJQV9QSUFfQ0NOVCgmd2F2LT5pbmZvKTsKKyAgICBwYXJhbS5iaXRzX3Blcl9zYW1wbGUgPSBQSk1FRElBX1BJQV9CSVRTKCZ3YXYtPmluZm8pOworCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3RyZWFtX2NyZWF0ZSgmcGFyYW0sICZ3YXZfcmVjX2NiLCBOVUxMLCB3YXYsCisJCQkJICAgICAgICZzdHJtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBvcGVuaW5nIHRoZSBzb3VuZCBkZXZpY2UiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9zdGFydChzdHJtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBzdGFydGluZyB0aGUgc291bmQgZGV2aWNlIiwgc3RhdHVzKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUmVjb3JkaW5nIHN0YXJ0ZWQsIHByZXNzIEVOVEVSIHRvIHN0b3AiKSk7CisgICAgZHVtbXkgPSBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKTsKKworb25fcmV0dXJuOgorICAgIGlmIChzdHJtKSB7CisJcGptZWRpYV9hdWRfc3RyZWFtX3N0b3Aoc3RybSk7CisJcGptZWRpYV9hdWRfc3RyZWFtX2Rlc3Ryb3koc3RybSk7CisgICAgfQorICAgIGlmICh3YXYpCisJcGptZWRpYV9wb3J0X2Rlc3Ryb3kod2F2KTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7Cit9CisKKworc3RhdGljIHBqX3N0YXR1c190IHdhdl9wbGF5X2NiKHZvaWQgKnVzZXJfZGF0YSwgcGptZWRpYV9mcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUoKHBqbWVkaWFfcG9ydCopdXNlcl9kYXRhLCBmcmFtZSk7Cit9CisKKworc3RhdGljIHZvaWQgcGxheV9maWxlKHVuc2lnbmVkIHBsYXlfaW5kZXgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisgICAgcGptZWRpYV9wb3J0ICp3YXYgPSBOVUxMOworICAgIHBqbWVkaWFfYXVkX3BhcmFtIHBhcmFtOworICAgIHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSA9IE5VTEw7CisgICAgY2hhciBsaW5lWzEwXSwgKmR1bW15OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorCWZpbGVuYW1lID0gV0FWX0ZJTEU7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUocGptZWRpYV9hdWRfc3Vic3lzX2dldF9wb29sX2ZhY3RvcnkoKSwgIndhdiIsCisJCQkgIDEwMDAsIDEwMDAsIE5VTEwpOworCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKHBvb2wsIGZpbGVuYW1lLCAyMCwgMCwgMCwgJndhdik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiRXJyb3Igb3BlbmluZyBXQVYgZmlsZSIsIHN0YXR1cyk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2RlZmF1bHRfcGFyYW0ocGxheV9pbmRleCwgJnBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwam1lZGlhX2F1ZF9kZXZfZGVmYXVsdF9wYXJhbSgpIiwgc3RhdHVzKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBwYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9QTEFZQkFDSzsKKyAgICBwYXJhbS5jbG9ja19yYXRlID0gUEpNRURJQV9QSUFfU1JBVEUoJndhdi0+aW5mbyk7CisgICAgcGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgPSBQSk1FRElBX1BJQV9TUEYoJndhdi0+aW5mbyk7CisgICAgcGFyYW0uY2hhbm5lbF9jb3VudCA9IFBKTUVESUFfUElBX0NDTlQoJndhdi0+aW5mbyk7CisgICAgcGFyYW0uYml0c19wZXJfc2FtcGxlID0gUEpNRURJQV9QSUFfQklUUygmd2F2LT5pbmZvKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoJnBhcmFtLCBOVUxMLCAmd2F2X3BsYXlfY2IsIHdhdiwKKwkJCQkgICAgICAgJnN0cm0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIG9wZW5pbmcgdGhlIHNvdW5kIGRldmljZSIsIHN0YXR1cyk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3RyZWFtX3N0YXJ0KHN0cm0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIHN0YXJ0aW5nIHRoZSBzb3VuZCBkZXZpY2UiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJQbGF5YmFjayBzdGFydGVkLCBwcmVzcyBFTlRFUiB0byBzdG9wIikpOworICAgIGR1bW15ID0gZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbik7CisKK29uX3JldHVybjoKKyAgICBpZiAoc3RybSkgeworCXBqbWVkaWFfYXVkX3N0cmVhbV9zdG9wKHN0cm0pOworCXBqbWVkaWFfYXVkX3N0cmVhbV9kZXN0cm95KHN0cm0pOworICAgIH0KKyAgICBpZiAod2F2KQorCXBqbWVkaWFfcG9ydF9kZXN0cm95KHdhdik7CisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X21lbnUodm9pZCkKK3sKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJBdWRpbyBkZW1vIG1lbnU6Iik7CisgICAgcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIHB1dHMoIiAgbCAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgZGV2aWNlcyIpOworICAgIHB1dHMoIiAgUiAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2ggZGV2aWNlcyIpOworICAgIHB1dHMoIiAgaSBJRCAgICAgICAgICAgICAgICAgICAgIFNob3cgZGV2aWNlIGluZm8gZm9yIGRldmljZSBJRCIpOworICAgIHB1dHMoIiAgdCBSSUQgUElEIENSIFBUSU0gW0NIXSAgIFBlcmZvcm0gdGVzdCBvbiB0aGUgZGV2aWNlOiIpOworICAgIHB1dHMoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklEOiAgcmVjb3JkIGRldmljZSBJRCAoLTEgZm9yIG5vKSIpOworICAgIHB1dHMoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElEOiAgcGxheWJhY2sgZGV2aWNlIElEICgtMSBmb3Igbm8pIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUjogICBjbG9jayByYXRlIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVElNOiBwdGltZSBpbiBtcyIpOworICAgIHB1dHMoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g6ICAgIyBvZiBjaGFubmVscyIpOworICAgIHB1dHMoIiAgciBSSUQgW0ZJTEVdICAgICAgICAgICAgIFJlY29yZCBjYXB0dXJlIGRldmljZSBSSUQgdG8gV0FWIGZpbGUiKTsKKyAgICBwdXRzKCIgIHAgUElEIFtGSUxFXSAgICAgICAgICAgICBQbGF5YmFjayBXQVYgZmlsZSB0byBkZXZpY2UgSUQgUElEIik7CisgICAgcHV0cygiICBkIFtSTEFUIFBMQVRdICAgICAgICAgICAgR2V0L3NldCBzb3VuZCBkZXZpY2UgbGF0ZW5jaWVzIChpbiBtcyk6Iik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IG5vIHBhcmFtIHRvIGdldCBjdXJyZW50IGxhdGVuY2llcyBzZXR0aW5nIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTEFUOiByZWNvcmQgbGF0ZW5jeSAoLTEgZm9yIGRlZmF1bHQpIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEFUOiBwbGF5YmFjayBsYXRlbmN5ICgtMSBmb3IgZGVmYXVsdCkiKTsKKyAgICBwdXRzKCIgIHYgICAgICAgICAgICAgICAgICAgICAgICBUb2dnbGUgbG9nIHZlcmJvc2l0eSIpOworICAgIHB1dHMoIiAgcSAgICAgICAgICAgICAgICAgICAgICAgIFF1aXQiKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwcmludGYoIkVudGVyIHNlbGVjdGlvbjogIik7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGpfYm9vbF90IGRvbmUgPSBQSl9GQUxTRTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBJbml0IHBqbGliICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzPT1QSl9TVUNDRVNTLCAxKTsKKyAgICAKKyAgICBwal9sb2dfc2V0X2RlY29yKFBKX0xPR19IQVNfTkVXTElORSk7CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBhIHBvb2wgZmFjdG9yeSBiZWZvcmUgd2UgY2FuIGFsbG9jYXRlIGFueSBtZW1vcnkuICovCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N1YnN5c19pbml0KCZjcC5mYWN0b3J5KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwam1lZGlhX2F1ZF9zdWJzeXNfaW5pdCgpIiwgc3RhdHVzKTsKKwlwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmY3ApOworCXBqX3NodXRkb3duKCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgbGlzdF9kZXZpY2VzKCk7CisKKyAgICB3aGlsZSAoIWRvbmUpIHsKKwljaGFyIGxpbmVbODBdOworCisJcHJpbnRfbWVudSgpOworCisJaWYgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pPT1OVUxMKQorCSAgICBicmVhazsKKworCXN3aXRjaCAobGluZVswXSkgeworCWNhc2UgJ2wnOgorCSAgICBsaXN0X2RldmljZXMoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdSJzoKKwkgICAgcGptZWRpYV9hdWRfZGV2X3JlZnJlc2goKTsKKwkgICAgcHV0cygiQXVkaW8gZGV2aWNlIGxpc3QgcmVmcmVzaGVkLiIpOworCSAgICBicmVhazsKKworCWNhc2UgJ2knOgorCSAgICB7CisJCXVuc2lnbmVkIGRldl9pbmRleDsKKwkJaWYgKHNzY2FuZihsaW5lKzIsICIldSIsICZkZXZfaW5kZXgpICE9IDEpIHsKKwkJICAgIHB1dHMoImVycm9yOiBkZXZpY2UgSUQgcmVxdWlyZWQiKTsKKwkJICAgIGJyZWFrOworCQl9CisJCXNob3dfZGV2X2luZm8oZGV2X2luZGV4KTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgJ3QnOgorCSAgICB7CisJCXBqbWVkaWFfZGlyIGRpcjsKKwkJaW50IHJlY19pZCwgcGxheV9pZDsKKwkJdW5zaWduZWQgY2xvY2tfcmF0ZSwgcHRpbWUsIGNobnVtOworCQlpbnQgY250OworCisJCWNudCA9IHNzY2FuZihsaW5lKzIsICIlZCAlZCAldSAldSAldSIsICZyZWNfaWQsICZwbGF5X2lkLCAKKwkJCSAgICAgJmNsb2NrX3JhdGUsICZwdGltZSwgJmNobnVtKTsKKwkJaWYgKGNudCA8IDQpIHsKKwkJICAgIHB1dHMoImVycm9yOiBub3QgZW5vdWdoIHBhcmFtZXRlcnMiKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChjbG9ja19yYXRlIDwgODAwMCB8fCBjbG9ja19yYXRlID4gMTI4MDAwKSB7CisJCSAgICBwdXRzKCJlcnJvcjogaW52YWxpZCBjbG9jayByYXRlIik7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAocHRpbWUgPCAxMCB8fCBwdGltZSA+IDUwMCkgeworCQkgICAgcHV0cygiZXJyb3I6IGludmFsaWQgcHRpbWUiKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChjbnQ9PTUpIHsKKwkJICAgIGlmIChjaG51bSA8IDEgfHwgY2hudW0gPiA0KSB7CisJCQlwdXRzKCJlcnJvcjogaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMiKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgY2hudW0gPSAxOworCQl9CisKKwkJaWYgKHJlY19pZCA+PSAwICYmIHJlY19pZCA8IChpbnQpZGV2X2NvdW50KSB7CisJCSAgICBpZiAocGxheV9pZCA+PSAwICYmIHBsYXlfaWQgPCAoaW50KWRldl9jb3VudCkKKwkJCWRpciA9IFBKTUVESUFfRElSX0NBUFRVUkVfUExBWUJBQ0s7CisJCSAgICBlbHNlCisJCQlkaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFOworCQl9IGVsc2UgaWYgKHBsYXlfaWQgPj0gMCAmJiBwbGF5X2lkIDwgKGludClkZXZfY291bnQpIHsKKwkJICAgIGRpciA9IFBKTUVESUFfRElSX1BMQVlCQUNLOworCQl9IGVsc2UgeworCQkgICAgcHV0cygiZXJyb3I6IGF0IGxlYXN0IG9uZSB2YWxpZCBkZXZpY2UgaW5kZXggcmVxdWlyZWQiKTsKKwkJICAgIGJyZWFrOworCQl9CisKKwkJdGVzdF9kZXZpY2UoZGlyLCByZWNfaWQsIHBsYXlfaWQsIGNsb2NrX3JhdGUsIHB0aW1lLCBjaG51bSk7CisJCQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAncic6CisJICAgIC8qIHJlY29yZCAqLworCSAgICB7CisJCWludCBpbmRleDsKKwkJY2hhciBmaWxlbmFtZVs4MF07CisJCWludCBjb3VudDsKKworCQljb3VudCA9IHNzY2FuZihsaW5lKzIsICIlZCAlcyIsICZpbmRleCwgZmlsZW5hbWUpOworCQlpZiAoY291bnQ9PTEpCisJCSAgICByZWNvcmQoaW5kZXgsIE5VTEwpOworCQllbHNlIGlmIChjb3VudD09MikKKwkJICAgIHJlY29yZChpbmRleCwgZmlsZW5hbWUpOworCQllbHNlCisJCSAgICBwdXRzKCJlcnJvcjogaW52YWxpZCBjb21tYW5kIHN5bnRheCIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAncCc6CisJICAgIC8qIHBsYXliYWNrICovCisJICAgIHsKKwkJaW50IGluZGV4OworCQljaGFyIGZpbGVuYW1lWzgwXTsKKwkJaW50IGNvdW50OworCisJCWNvdW50ID0gc3NjYW5mKGxpbmUrMiwgIiVkICVzIiwgJmluZGV4LCBmaWxlbmFtZSk7CisJCWlmIChjb3VudD09MSkKKwkJICAgIHBsYXlfZmlsZShpbmRleCwgTlVMTCk7CisJCWVsc2UgaWYgKGNvdW50PT0yKQorCQkgICAgcGxheV9maWxlKGluZGV4LCBmaWxlbmFtZSk7CisJCWVsc2UKKwkJICAgIHB1dHMoImVycm9yOiBpbnZhbGlkIGNvbW1hbmQgc3ludGF4Iik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgICAgLyogbGF0ZW5jaWVzICovCisJICAgIHsKKwkJaW50IHJlY19sYXQsIHBsYXlfbGF0OworCisJCWlmIChzc2NhbmYobGluZSsyLCAiJWQgJWQiLCAmcmVjX2xhdCwgJnBsYXlfbGF0KSA9PSAyKSB7CisJCSAgICBjYXB0dXJlX2xhdCA9ICh1bnNpZ25lZCkgCisJCQkgKHJlY19sYXQ+PTA/IHJlY19sYXQ6UEpNRURJQV9TTkRfREVGQVVMVF9SRUNfTEFURU5DWSk7CisJCSAgICBwbGF5YmFja19sYXQgPSAodW5zaWduZWQpCisJCQkgKHBsYXlfbGF0ID49IDA/IHBsYXlfbGF0IDogUEpNRURJQV9TTkRfREVGQVVMVF9QTEFZX0xBVEVOQ1kpOworCQkgICAgcHJpbnRmKCJSZWNvcmRpbmcgbGF0ZW5jeT0ldW1zLCBwbGF5YmFjayBsYXRlbmN5PSV1bXMiLAorCQkJICAgY2FwdHVyZV9sYXQsIHBsYXliYWNrX2xhdCk7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGYoIkN1cnJlbnQgbGF0ZW5jaWVzOiByZWNvcmQ9JXVtcywgcGxheWJhY2s9JXVtcyIsCisJCQkgICBjYXB0dXJlX2xhdCwgcGxheWJhY2tfbGF0KTsKKwkJfQorCQlwdXRzKCIiKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgJ3YnOgorCSAgICBpZiAocGpfbG9nX2dldF9sZXZlbCgpIDw9IDMpIHsKKwkJcGpfbG9nX3NldF9sZXZlbCg1KTsKKwkJcHV0cygiTG9nZ2luZyBzZXQgdG8gZGV0YWlsIik7CisJICAgIH0gZWxzZSB7CisJCXBqX2xvZ19zZXRfbGV2ZWwoMyk7CisJCXB1dHMoIkxvZ2dpbmcgc2V0IHRvIHF1aWV0Iik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdxJzoKKwkgICAgZG9uZSA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmY3ApOworICAgIHBqX3NodXRkb3duKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9hdmlwbGF5LmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2F2aXBsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThhMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9hdmlwbGF5LmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qICRJZDogYXZpcGxheS5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2NvbnZlcnRlci5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidXRpbC5oIgorCisvKioKKyAqIFxwYWdlIHBhZ2VfcGptZWRpYV9zYW1wbGVzX2F2aXBsYXlfYyBTYW1wbGVzOiBQbGF5aW5nIEFWSSBGaWxlIHRvCisgKiBWaWRlbyBhbmQgU291bmQgRGV2aWNlcworICoKKyAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHRvIHVzZSB0aGUgQHJlZiBQSk1FRElBX0ZJTEVfUExBWSwKKyAqIEByZWYgUEpNRURfU05EX1BPUlQsIGFuZCBAcmVmIFBKTUVESUFfVklEX1BPUlQuIEluIHRoaXMgZXhhbXBsZSwgd2UKKyAqIG9wZW4gdGhlIGZpbGUsIHZpZGVvLCBhbmQgc291bmQgZGV2aWNlcywgdGhlbiBjb25uZWN0IHRoZSBmaWxlIHRvIGJvdGgKKyAqIHZpZGVvIGFuZCBzb3VuZCBkZXZpY2VzIHRvIHBsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9hdmlwbGF5LmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBhdmlwbGF5LmMKKyAqLworCisKKy8qCisgKiBhdmlwbGF5LmMKKyAqCisgKiBQVVJQT1NFOgorICogIFBsYXkgYSBBVkkgZmlsZSB0byB2aWRlbyBhbmQgc291bmQgZGV2aWNlcy4KKyAqCisgKiBVU0FHRToKKyAqICBhdmlwbGF5IEZJTEUuQVZJCisgKi8KKworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19WSURFTykgJiYgKFBKTUVESUFfSEFTX1ZJREVPICE9IDApCisKKworLyogRm9yIGxvZ2dpbmcgcHVycG9zZS4gKi8KKyNkZWZpbmUgVEhJU19GSUxFICAgImF2aXBsYXkuYyIKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyIgRklMRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBhdmlwbGF5LmMJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIFBVUlBPU0UJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBEZW1vbnN0cmF0ZSBob3cgdG8gcGxheSBhIEFWSSBmaWxlLgkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiBVU0FHRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBhdmlwbGF5IEZJTEUuQVZJCQkJCQkJICAgIFxuIjsKKworc3RydWN0IGNvZGVjX2ZtdCB7CisgICAgcGpfdWludDMyX3QgICAgICAgICBwam1lZGlhX2lkOworICAgIGNvbnN0IGNoYXIgICAgICAgICAqY29kZWNfaWQ7CisgICAgLyogRG8gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkZWNvZGVkIGZyYW1lPyAqLworICAgIHBqX2Jvb2xfdCAgICAgICAgICAgbmVlZF9jb252ZXJzaW9uOworICAgIC8qIElmIGNvbnZlcnNpb24gaXMgbmVlZGVkLCBkc3RfZm10IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gZm9ybWF0ICovCisgICAgcGptZWRpYV9mb3JtYXRfaWQgICBkc3RfZm10OworfSBjb2RlY19mbXRzW10gPSB7e1BKTUVESUFfRk9STUFUX01KUEVHLCAibWpwZWciLAorICAgICAgICAgICAgICAgICAgIFBKX1RSVUUgLCBQSk1FRElBX0ZPUk1BVF9JNDIwfSwKKyAgICAgICAgICAgICAgICAgIHtQSk1FRElBX0ZPUk1BVF9IMjYzICwgImgyNjMiICwKKyAgICAgICAgICAgICAgICAgICBQSl9GQUxTRSwgMH0sCisgICAgICAgICAgICAgICAgICB7UEpNRURJQV9GT1JNQVRfTVBFRzQsICJtcDR2In0sIAorICAgICAgICAgICAgICAgICAge1BKTUVESUFfRk9STUFUX0gyNjQgLCAiaDI2NCJ9CisgICAgICAgICAgICAgICAgIH07CisKK3R5cGVkZWYgc3RydWN0IGF2aV9wb3J0X3QKK3sKKyAgICBwam1lZGlhX3ZpZF9wb3J0ICAgKnZpZF9wb3J0OworICAgIHBqbWVkaWFfc25kX3BvcnQgICAqc25kX3BvcnQ7CisgICAgcGpfYm9vbF90ICAgICAgICAgICBpc19ydW5uaW5nOworICAgIHBqX2Jvb2xfdCAgICAgICAgICAgaXNfcXVpdHRpbmc7Cit9IGF2aV9wb3J0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGNvZGVjX3BvcnRfZGF0YV90Cit7CisgICAgcGptZWRpYV92aWRfY29kZWMgICAqY29kZWM7CisgICAgcGptZWRpYV9wb3J0ICAgICAgICAqc3JjX3BvcnQ7CisgICAgcGpfdWludDhfdCAgICAgICAgICAqZW5jX2J1ZjsKKyAgICBwal9zaXplX3QgICAgICAgICAgICBlbmNfYnVmX3NpemU7CisgICAgCisgICAgcGptZWRpYV9jb252ZXJ0ZXIgICAqY29udjsKK30gY29kZWNfcG9ydF9kYXRhX3Q7CisKK3N0YXRpYyBwal9zdGF0dXNfdCBhdmlfZXZlbnRfY2IocGptZWRpYV9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBhdmlfcG9ydF90ICphcCA9IChhdmlfcG9ydF90ICopdXNlcl9kYXRhOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICBjYXNlIFBKTUVESUFfRVZFTlRfV05EX0NMT1NFRDoKKyAgICAgICAgYXAtPmlzX3F1aXR0aW5nID0gUEpfVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQSk1FRElBX0VWRU5UX01PVVNFX0JUTl9ET1dOOgorICAgICAgICBpZiAoYXAtPmlzX3J1bm5pbmcpIHsKKyAgICAgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc3RvcChhcC0+dmlkX3BvcnQpOworICAgICAgICAgICAgaWYgKGFwLT5zbmRfcG9ydCkKKyAgICAgICAgICAgICAgICBwam1lZGlhX2F1ZF9zdHJlYW1fc3RvcCgKKyAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9zbmRfcG9ydF9nZXRfc25kX3N0cmVhbShhcC0+c25kX3BvcnQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQoYXAtPnZpZF9wb3J0KTsKKyAgICAgICAgICAgIGlmIChhcC0+c25kX3BvcnQpCisgICAgICAgICAgICAgICAgcGptZWRpYV9hdWRfc3RyZWFtX3N0YXJ0KAorICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3NuZF9wb3J0X2dldF9zbmRfc3RyZWFtKGFwLT5zbmRfcG9ydCkpOworICAgICAgICB9CisgICAgICAgIGFwLT5pc19ydW5uaW5nID0gIWFwLT5pc19ydW5uaW5nOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisgICAgCisgICAgLyogV2UgaGFuZGxlZCB0aGUgZXZlbnQgb24gb3VyIG93biwgc28gcmV0dXJuIG5vbi1QSl9TVUNDRVNTIGhlcmUgKi8KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjb2RlY19nZXRfZnJhbWUocGptZWRpYV9wb3J0ICpwb3J0LAorCQkJICAgICAgICAgICBwam1lZGlhX2ZyYW1lICpmcmFtZSkKK3sKKyAgICBjb2RlY19wb3J0X2RhdGFfdCAqcG9ydF9kYXRhID0gKGNvZGVjX3BvcnRfZGF0YV90Kilwb3J0LT5wb3J0X2RhdGEucGRhdGE7CisgICAgcGptZWRpYV92aWRfY29kZWMgKmNvZGVjID0gcG9ydF9kYXRhLT5jb2RlYzsKKyAgICBwam1lZGlhX2ZyYW1lIGVuY19mcmFtZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgZW5jX2ZyYW1lLmJ1ZiA9IHBvcnRfZGF0YS0+ZW5jX2J1ZjsKKyAgICBlbmNfZnJhbWUuc2l6ZSA9IHBvcnRfZGF0YS0+ZW5jX2J1Zl9zaXplOworICAgIAorICAgIGlmIChwb3J0X2RhdGEtPmNvbnYpIHsKKyAgICAgICAgcGpfc2l6ZV90IGZyYW1lX3NpemUgPSBmcmFtZS0+c2l6ZTsKKwkKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2dldF9mcmFtZShwb3J0X2RhdGEtPnNyY19wb3J0LCBmcmFtZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZ290byBvbl9lcnJvcjsKKwkKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfZGVjb2RlKGNvZGVjLCAxLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClmcmFtZS0+c2l6ZSwgJmVuY19mcmFtZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZ290byBvbl9lcnJvcjsKKwkKKyAgICAgICAgZnJhbWUtPnNpemUgPSBmcmFtZV9zaXplOworICAgICAgICBzdGF0dXMgPSBwam1lZGlhX2NvbnZlcnRlcl9jb252ZXJ0KHBvcnRfZGF0YS0+Y29udiwgJmVuY19mcmFtZSwgZnJhbWUpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIGdvdG8gb25fZXJyb3I7CisJCisgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKHBvcnRfZGF0YS0+c3JjX3BvcnQsICZlbmNfZnJhbWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZ290byBvbl9lcnJvcjsKKyAgICAKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19kZWNvZGUoY29kZWMsIDEsICZlbmNfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClmcmFtZS0+c2l6ZSwgZnJhbWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZ290byBvbl9lcnJvcjsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAKK29uX2Vycm9yOgorICAgIHBqX3BlcnJvcigzLCBUSElTX0ZJTEUsIHN0YXR1cywgImNvZGVjX2dldF9mcmFtZSgpIGVycm9yIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdmlwbGF5KHBqX3Bvb2xfdCAqcG9vbCwgY29uc3QgY2hhciAqZm5hbWUpCit7CisgICAgcGptZWRpYV92aWRfcG9ydCAqcmVuZGVyZXI9TlVMTDsKKyAgICBwam1lZGlhX3ZpZF9wb3J0X3BhcmFtIHBhcmFtOworICAgIGNvbnN0IHBqbWVkaWFfdmlkZW9fZm9ybWF0X2luZm8gKnZmaTsKKyAgICBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9kZXRhaWwgKnZmZDsKKyAgICBwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCA9IE5VTEw7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCByYyA9IDA7CisgICAgcGptZWRpYV9hdmlfc3RyZWFtcyAqYXZpX3N0cmVhbXM7CisgICAgcGptZWRpYV9hdmlfc3RyZWFtICp2aWRfc3RyZWFtLCAqYXVkX3N0cmVhbTsKKyAgICBwam1lZGlhX3BvcnQgKnZpZF9wb3J0ID0gTlVMTCwgKmF1ZF9wb3J0ID0gTlVMTDsKKyAgICBwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWM9TlVMTDsKKyAgICBhdmlfcG9ydF90IGF2aV9wb3J0OworICAgIAorICAgIHBqX2J6ZXJvKCZhdmlfcG9ydCwgc2l6ZW9mKGF2aV9wb3J0KSk7CisgICAgCisgICAgc3RhdHVzID0gcGptZWRpYV9hdmlfcGxheWVyX2NyZWF0ZV9zdHJlYW1zKHBvb2wsIGZuYW1lLCAwLCAmYXZpX3N0cmVhbXMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCVBKX1BFUlJPUigyLCgiIiwgc3RhdHVzLCAiICAgIEVycm9yIHBsYXlpbmcgJXMiLCBmbmFtZSkpOworCXJjID0gMjEwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgCisgICAgdmlkX3N0cmVhbSA9IHBqbWVkaWFfYXZpX3N0cmVhbXNfZ2V0X3N0cmVhbV9ieV9tZWRpYShhdmlfc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSk1FRElBX1RZUEVfVklERU8pOworICAgIHZpZF9wb3J0ID0gcGptZWRpYV9hdmlfc3RyZWFtX2dldF9wb3J0KHZpZF9zdHJlYW0pOworICAgIAorICAgIGlmICh2aWRfcG9ydCkgeworICAgICAgICBwam1lZGlhX3ZpZF9wb3J0X3BhcmFtX2RlZmF1bHQoJnBhcmFtKTsKKwkKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfZGV2X2RlZmF1bHRfcGFyYW0ocG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0udmlkcGFyYW0pOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAJICAgIHJjID0gMjIwOyBnb3RvIG9uX3JldHVybjsKKyAgICAgICAgfQorCQorICAgICAgICAvKiBDcmVhdGUgcmVuZGVyZXIsIHNldCBpdCB0byBhY3RpdmUgICovCisgICAgICAgIHBhcmFtLmFjdGl2ZSA9IFBKX1RSVUU7CisgICAgICAgIHBhcmFtLnZpZHBhcmFtLmRpciA9IFBKTUVESUFfRElSX1JFTkRFUjsKKyAgICAgICAgdmZkID0gcGptZWRpYV9mb3JtYXRfZ2V0X3ZpZGVvX2Zvcm1hdF9kZXRhaWwoJnZpZF9wb3J0LT5pbmZvLmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVFJVRSk7CisgICAgICAgIHBqbWVkaWFfZm9ybWF0X2luaXRfdmlkZW8oJnBhcmFtLnZpZHBhcmFtLmZtdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkX3BvcnQtPmluZm8uZm10LmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmZC0+c2l6ZS53LCB2ZmQtPnNpemUuaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZmQtPmZwcy5udW0sIHZmZC0+ZnBzLmRlbnVtKTsKKwkKKyAgICAgICAgdmZpID0gcGptZWRpYV9nZXRfdmlkZW9fZm9ybWF0X2luZm8oCisgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9tZ3JfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgIHZpZF9wb3J0LT5pbmZvLmZtdC5pZCk7CisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGZyYW1lIGlzIGVuY29kZWQgKi8KKyAgICAgICAgaWYgKCF2ZmkgfHwgdmZpLT5icHAgPT0gMCkgeworICAgICAgICAgICAgLyogWWVzLCBwcmVwYXJlIGNvZGVjICovCisgICAgICAgICAgICBwal9zdHJfdCBjb2RlY19pZF9zdDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGluZm9fY250ID0gMSwgaSwgazsKKyAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKmNvZGVjX2luZm87CisgICAgICAgICAgICBwal9zdHJfdCBwb3J0X25hbWUgPSB7ImNvZGVjIiwgNX07CisgICAgICAgICAgICBwal91aW50OF90ICplbmNfYnVmID0gTlVMTDsKKyAgICAgICAgICAgIHBqX3NpemVfdCBlbmNfYnVmX3NpemUgPSAwOworICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2luZm8gcmRyX2luZm87CisgICAgICAgICAgICBwam1lZGlhX3BvcnQgY29kZWNfcG9ydDsKKyAgICAgICAgICAgIGNvZGVjX3BvcnRfZGF0YV90IGNvZGVjX3BvcnRfZGF0YTsKKyAgICAgICAgICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNvZGVjX3BhcmFtOworICAgICAgICAgICAgc3RydWN0IGNvZGVjX2ZtdCAqY29kZWNwID0gTlVMTDsKKwkgICAgCisgICAgICAgICAgICAvKiBMb29rdXAgY29kZWMgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoY29kZWNfZm10cykvc2l6ZW9mKGNvZGVjX2ZtdHNbMF0pOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkX3BvcnQtPmluZm8uZm10LmlkID09IGNvZGVjX2ZtdHNbaV0ucGptZWRpYV9pZCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlY3AgPSAmY29kZWNfZm10c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb2RlY3ApIHsKKyAgICAgICAgICAgICAgICByYyA9IDI0MjsgZ290byBvbl9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwal9jc3RyKCZjb2RlY19pZF9zdCwgY29kZWNwLT5jb2RlY19pZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfaWRfc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX2NudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByYyA9IDI0NTsgZ290byBvbl9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZ2V0X2RlZmF1bHRfcGFyYW0oTlVMTCwgY29kZWNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfcGFyYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmMgPSAyNDY7IGdvdG8gb25fcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICAKKyAgICAgICAgICAgIHBqbWVkaWFfZm9ybWF0X2NvcHkoJmNvZGVjX3BhcmFtLmVuY19mbXQsICZwYXJhbS52aWRwYXJhbS5mbXQpOworCisgICAgICAgICAgICBwam1lZGlhX3ZpZF9kZXZfZ2V0X2luZm8ocGFyYW0udmlkcGFyYW0ucmVuZF9pZCwgJnJkcl9pbmZvKTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGNvZGVjX2luZm8tPmRlY19mbXRfaWRfY250OyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazxyZHJfaW5mby5mbXRfY250OyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjX2luZm8tPmRlY19mbXRfaWRbaV09PShpbnQpcmRyX2luZm8uZm10W2tdLmlkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS52aWRwYXJhbS5mbXQuaWQgPSBjb2RlY19pbmZvLT5kZWNfZm10X2lkW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGNvZGVjX2luZm8tPmRlY19mbXRfaWRfY250OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICAgIAorICAgICAgICAgICAgLyogT3BlbiBjb2RlYyAqLworICAgICAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2FsbG9jX2NvZGVjKE5VTEwsIGNvZGVjX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJjID0gMjUwOyBnb3RvIG9uX3JldHVybjsKKyAgICAgICAgICAgIH0KKwkgICAgCisgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19pbml0KGNvZGVjLCBwb29sKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJjID0gMjUxOyBnb3RvIG9uX3JldHVybjsKKyAgICAgICAgICAgIH0KKwkgICAgCisgICAgICAgICAgICBwam1lZGlhX2Zvcm1hdF9jb3B5KCZjb2RlY19wYXJhbS5kZWNfZm10LCAmcGFyYW0udmlkcGFyYW0uZm10KTsKKyAgICAgICAgICAgIGNvZGVjX3BhcmFtLmRpciA9IFBKTUVESUFfRElSX0RFQ09ESU5HOworICAgICAgICAgICAgY29kZWNfcGFyYW0ucGFja2luZyA9IFBKTUVESUFfVklEX1BBQ0tJTkdfV0hPTEU7CisgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9jb2RlY19vcGVuKGNvZGVjLCAmY29kZWNfcGFyYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmMgPSAyNTI7IGdvdG8gb25fcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICAKKyAgICAgICAgICAgIC8qIEFsbG9jIGVuY29kaW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgZW5jX2J1Zl9zaXplID0gIGNvZGVjX3BhcmFtLmRlY19mbXQuZGV0LnZpZC5zaXplLncgKgorCSAgICBjb2RlY19wYXJhbS5kZWNfZm10LmRldC52aWQuc2l6ZS5oICogNAorCSAgICArIDE2OyAvKjwgcGFkZGluZywganVzdCBpbiBjYXNlICovCisgICAgICAgICAgICBlbmNfYnVmID0gcGpfcG9vbF9hbGxvYyhwb29sLGVuY19idWZfc2l6ZSk7CisJICAgIAorICAgICAgICAgICAgLyogSW5pdCBjb2RlYyBwb3J0ICovCisgICAgICAgICAgICBwal9iemVybygmY29kZWNfcG9ydCwgc2l6ZW9mKGNvZGVjX3BvcnQpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfcG9ydF9pbmZvX2luaXQyKCZjb2RlY19wb3J0LmluZm8sICZwb3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSk1FRElBX0RJUl9FTkNPRElORywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfcGFyYW0uZGVjX2ZtdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByYyA9IDI2MDsgZ290byBvbl9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwal9iemVybygmY29kZWNfcG9ydF9kYXRhLCBzaXplb2YoY29kZWNfcG9ydF9kYXRhKSk7CisgICAgICAgICAgICBjb2RlY19wb3J0X2RhdGEuY29kZWMgPSBjb2RlYzsKKyAgICAgICAgICAgIGNvZGVjX3BvcnRfZGF0YS5zcmNfcG9ydCA9IHZpZF9wb3J0OworICAgICAgICAgICAgY29kZWNfcG9ydF9kYXRhLmVuY19idWYgPSBlbmNfYnVmOworICAgICAgICAgICAgY29kZWNfcG9ydF9kYXRhLmVuY19idWZfc2l6ZSA9IGVuY19idWZfc2l6ZTsKKwkgICAgCisgICAgICAgICAgICBjb2RlY19wb3J0LmdldF9mcmFtZSA9ICZjb2RlY19nZXRfZnJhbWU7CisgICAgICAgICAgICBjb2RlY19wb3J0LnBvcnRfZGF0YS5wZGF0YSA9ICZjb2RlY19wb3J0X2RhdGE7CisJICAgIAorICAgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGRlY29kZWQgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChjb2RlY3AtPm5lZWRfY29udmVyc2lvbikgeworICAgICAgICAgICAgICAgIHBqbWVkaWFfY29udmVyc2lvbl9wYXJhbSBjb252X3BhcmFtOworCQkKKyAgICAgICAgICAgICAgICBwam1lZGlhX2Zvcm1hdF9jb3B5KCZjb252X3BhcmFtLnNyYywgJnBhcmFtLnZpZHBhcmFtLmZtdCk7CisgICAgICAgICAgICAgICAgcGptZWRpYV9mb3JtYXRfY29weSgmY29udl9wYXJhbS5kc3QsICZwYXJhbS52aWRwYXJhbS5mbXQpOworICAgICAgICAgICAgICAgIGNvbnZfcGFyYW0uZHN0LmlkID0gY29kZWNwLT5kc3RfZm10OworICAgICAgICAgICAgICAgIHBhcmFtLnZpZHBhcmFtLmZtdC5pZCA9IGNvbnZfcGFyYW0uZHN0LmlkOworCQkKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX2NvbnZlcnRlcl9jcmVhdGUoTlVMTCwgcG9vbCwgJmNvbnZfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19wb3J0X2RhdGEuY29udik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gMjcwOyBnb3RvIG9uX3JldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICAgIAorICAgICAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9jcmVhdGUocG9vbCwgJnBhcmFtLCAmcmVuZGVyZXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmMgPSAyMzA7IGdvdG8gb25fcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICAKKyAgICAgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChyZW5kZXJlciwgJmNvZGVjX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfRkFMU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9jcmVhdGUocG9vbCwgJnBhcmFtLCAmcmVuZGVyZXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmMgPSAyMzA7IGdvdG8gb25fcmV0dXJuOworICAgICAgICAgICAgfQorCSAgICAKKyAgICAgICAgICAgIC8qIENvbm5lY3QgYXZpIHBvcnQgdG8gcmVuZGVyZXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChyZW5kZXJlciwgdmlkX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfRkFMU0UpOworICAgICAgICB9CisJCisgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgcmMgPSAyNDA7IGdvdG8gb25fcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGF1ZF9zdHJlYW0gPSBwam1lZGlhX2F2aV9zdHJlYW1zX2dldF9zdHJlYW1fYnlfbWVkaWEoYXZpX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9UWVBFX0FVRElPKTsKKyAgICBhdWRfcG9ydCA9IHBqbWVkaWFfYXZpX3N0cmVhbV9nZXRfcG9ydChhdWRfc3RyZWFtKTsKKyAgICAKKyAgICBpZiAoYXVkX3BvcnQpIHsKKyAgICAgICAgLyogQ3JlYXRlIHNvdW5kIHBsYXllciBwb3J0LiAqLworICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2NyZWF0ZV9wbGF5ZXIoIAorCQkgcG9vbCwJCQkJICAgIC8qIHBvb2wJCSAgICAqLworCQkgLTEsCQkJCSAgICAvKiB1c2UgZGVmYXVsdCBkZXYuCSAgICAqLworCQkgUEpNRURJQV9QSUFfU1JBVEUoJmF1ZF9wb3J0LT5pbmZvKSwvKiBjbG9jayByYXRlLgkgICAgKi8KKwkJIFBKTUVESUFfUElBX0NDTlQoJmF1ZF9wb3J0LT5pbmZvKSwgLyogIyBvZiBjaGFubmVscy4JICAgICovCisJCSBQSk1FRElBX1BJQV9TUEYoJmF1ZF9wb3J0LT5pbmZvKSwgIC8qIHNhbXBsZXMgcGVyIGZyYW1lLiAgICovCisJCSBQSk1FRElBX1BJQV9CSVRTKCZhdWRfcG9ydC0+aW5mbyksIC8qIGJpdHMgcGVyIHNhbXBsZS4JICAgICovCisJCSAwLAkJCQkgICAgLyogb3B0aW9ucwkJICAgICovCisJCSAmc25kX3BvcnQJCQkgICAgLyogcmV0dXJuZWQgcG9ydAkgICAgKi8KKwkJICk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgcmMgPSAzMTA7IGdvdG8gb25fcmV0dXJuOworICAgICAgICB9CisJCisgICAgICAgIC8qIENvbm5lY3QgZmlsZSBwb3J0IHRvIHRoZSBzb3VuZCBwbGF5ZXIuCisgICAgICAgICAqIFN0cmVhbSBwbGF5aW5nIHdpbGwgY29tbWVuY2UgaW1tZWRpYXRlbHkuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Nvbm5lY3Qoc25kX3BvcnQsIGF1ZF9wb3J0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICByYyA9IDMzMDsgZ290byBvbl9yZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKHZpZF9wb3J0KSB7CisgICAgICAgIHBqbWVkaWFfdmlkX2Rldl9jYiBjYjsKKwkKKyAgICAgICAgcGpfYnplcm8oJmNiLCBzaXplb2YoY2IpKTsKKyAgICAgICAgYXZpX3BvcnQuc25kX3BvcnQgPSBzbmRfcG9ydDsKKyAgICAgICAgYXZpX3BvcnQudmlkX3BvcnQgPSByZW5kZXJlcjsKKyAgICAgICAgYXZpX3BvcnQuaXNfcnVubmluZyA9IFBKX1RSVUU7CisgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc2V0X2NiKHJlbmRlcmVyLCAmY2IsICZhdmlfcG9ydCk7CisKKyAgICAgICAgLyogc3Vic2NyaWJlIGV2ZW50cyAqLworICAgICAgICBwam1lZGlhX2V2ZW50X3N1YnNjcmliZShOVUxMLCAmYXZpX2V2ZW50X2NiLCAmYXZpX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyKTsKKworICAgICAgICBpZiAoc25kX3BvcnQpIHsKKyAgICAgICAgICAgIC8qIFN5bmNocm9uaXplIHZpZGVvIHJlbmRlcmluZyBhbmQgYXVkaW8gcGxheWJhY2sgKi8KKyAgICAgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc2V0X2Nsb2NrX3NyYygKKyAgICAgICAgICAgICAgICByZW5kZXJlciwKKyAgICAgICAgICAgICAgICBwam1lZGlhX3NuZF9wb3J0X2dldF9jbG9ja19zcmMoCisgICAgICAgICAgICAgICAgICAgIHNuZF9wb3J0LCBQSk1FRElBX0RJUl9QTEFZQkFDSykpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCisgICAgICAgIC8qIFN0YXJ0IHZpZGVvIHN0cmVhbWluZy4uICovCisgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQocmVuZGVyZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJjID0gMjcwOyBnb3RvIG9uX3JldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB3aGlsZSAoIWF2aV9wb3J0LmlzX3F1aXR0aW5nKSB7CisgICAgICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworICAgIH0KKworb25fcmV0dXJuOgorICAgIGlmIChzbmRfcG9ydCkgeworICAgICAgICBwam1lZGlhX3NuZF9wb3J0X2Rpc2Nvbm5lY3Qoc25kX3BvcnQpOworICAgICAgICAvKiBXaXRob3V0IHRoaXMgc2xlZXAsIFdpbmRvd3MvRGlyZWN0U291bmQgd2lsbCByZXBldGVhZGx5CisgICAgICAgICAqIHBsYXkgdGhlIGxhc3QgZnJhbWUgZHVyaW5nIGRlc3Ryb3kuCisgICAgICAgICAqLworICAgICAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKyAgICAgICAgcGptZWRpYV9zbmRfcG9ydF9kZXN0cm95KHNuZF9wb3J0KTsKKyAgICB9CisgICAgaWYgKHJlbmRlcmVyKSB7CisgICAgICAgIHBqbWVkaWFfZXZlbnRfdW5zdWJzY3JpYmUoTlVMTCwgJmF2aV9ldmVudF9jYiwgJmF2aV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyKTsKKyAgICAgICAgcGptZWRpYV92aWRfcG9ydF9kZXN0cm95KHJlbmRlcmVyKTsKKyAgICB9CisgICAgaWYgKGF1ZF9wb3J0KQorICAgICAgICBwam1lZGlhX3BvcnRfZGVzdHJveShhdWRfcG9ydCk7CisgICAgaWYgKHZpZF9wb3J0KQorICAgICAgICBwam1lZGlhX3BvcnRfZGVzdHJveSh2aWRfcG9ydCk7CisgICAgaWYgKGNvZGVjKSB7CisgICAgICAgIHBqbWVkaWFfdmlkX2NvZGVjX2Nsb3NlKGNvZGVjKTsKKyAgICAgICAgcGptZWRpYV92aWRfY29kZWNfbWdyX2RlYWxsb2NfY29kZWMoTlVMTCwgY29kZWMpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBtYWluX2Z1bmMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIGludCByYyA9IDA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgCXB1dHMoIkVycm9yOiBmaWxlbmFtZSByZXF1aXJlZCIpOworCXB1dHMoZGVzYyk7CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICAvKiBNdXN0IGluaXQgUEpMSUIgZmlyc3Q6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogTXVzdCBjcmVhdGUgYSBwb29sIGZhY3RvcnkgYmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSBhbnkgbWVtb3J5LiAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeSwgMCk7CisKKyAgICAvKiBDcmVhdGUgbWVtb3J5IHBvb2wgZm9yIG91ciBmaWxlIHBsYXllciAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggJmNwLmZhY3RvcnksCSAgICAvKiBwb29sIGZhY3RvcnkJICAgICovCisJCQkgICAiQVZJIiwJICAgIC8qIHBvb2wgbmFtZS4JICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5pdCBzaXplCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluY3JlbWVudCBzaXplCSAgICAqLworCQkJICAgTlVMTAkJICAgIC8qIGNhbGxiYWNrIG9uIGVycm9yICAgICovCisJCQkgICApOworCisgICAgcGptZWRpYV92aWRlb19mb3JtYXRfbWdyX2NyZWF0ZShwb29sLCA2NCwgMCwgTlVMTCk7CisgICAgcGptZWRpYV9jb252ZXJ0ZXJfbWdyX2NyZWF0ZShwb29sLCBOVUxMKTsKKyAgICBwam1lZGlhX2V2ZW50X21ncl9jcmVhdGUocG9vbCwgMCwgTlVMTCk7CisgICAgcGptZWRpYV92aWRfY29kZWNfbWdyX2NyZWF0ZShwb29sLCBOVUxMKTsKKyAgICAKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9kZXZfc3Vic3lzX2luaXQoJmNwLmZhY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgZ290byBvbl9yZXR1cm47CisgICAgCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3Vic3lzX2luaXQoJmNwLmZhY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgCisjaWYgUEpNRURJQV9IQVNfRkZNUEVHX1ZJRF9DT0RFQworICAgIHN0YXR1cyA9IHBqbWVkaWFfY29kZWNfZmZtcGVnX3ZpZF9pbml0KE5VTEwsICZjcC5mYWN0b3J5KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47ICAgIAorI2VuZGlmCisKKyAgICByYyA9IGF2aXBsYXkocG9vbCwgYXJndlsxXSk7CisgICAgCisgICAgLyogCisgICAgICogRmlsZSBzaG91bGQgYmUgcGxheWluZyBhbmQgbG9vcGluZyBub3cgCisgICAgICovCisKKyAgICAvKiBXaXRob3V0IHRoaXMgc2xlZXAsIFdpbmRvd3MvRGlyZWN0U291bmQgd2lsbCByZXBldGVhZGx5CisgICAgICogcGxheSB0aGUgbGFzdCBmcmFtZSBkdXJpbmcgZGVzdHJveS4KKyAgICAgKi8KKyAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKworb25fcmV0dXJuOiAgICAKKyNpZiBQSk1FRElBX0hBU19GRk1QRUdfVklEX0NPREVDCisgICAgcGptZWRpYV9jb2RlY19mZm1wZWdfdmlkX2RlaW5pdCgpOworI2VuZGlmCisgICAgcGptZWRpYV9hdWRfc3Vic3lzX3NodXRkb3duKCk7CisgICAgcGptZWRpYV92aWRfZGV2X3N1YnN5c19zaHV0ZG93bigpOworICAgIAorICAgIHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9kZXN0cm95KHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9pbnN0YW5jZSgpKTsKKyAgICBwam1lZGlhX2NvbnZlcnRlcl9tZ3JfZGVzdHJveShwam1lZGlhX2NvbnZlcnRlcl9tZ3JfaW5zdGFuY2UoKSk7CisgICAgcGptZWRpYV9ldmVudF9tZ3JfZGVzdHJveShwam1lZGlhX2V2ZW50X21ncl9pbnN0YW5jZSgpKTsKKyAgICBwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZGVzdHJveShwam1lZGlhX3ZpZF9jb2RlY19tZ3JfaW5zdGFuY2UoKSk7ICAgIAorICAgIAorICAgIC8qIFJlbGVhc2UgYXBwbGljYXRpb24gcG9vbCAqLworICAgIHBqX3Bvb2xfcmVsZWFzZSggcG9vbCApOworCisgICAgLyogRGVzdHJveSBwb29sIGZhY3RvcnkgKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSggJmNwICk7CisKKyAgICAvKiBTaHV0ZG93biBQSkxJQiAqLworICAgIHBqX3NodXRkb3duKCk7CisKKyAgICAvKiBEb25lLiAqLworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHJldHVybiBwal9ydW5fYXBwKCZtYWluX2Z1bmMsIGFyZ2MsIGFyZ3YsIDApOworfQorCisjZWxzZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIFBKX1VOVVNFRF9BUkcoYXJnYyk7CisgICAgUEpfVU5VU0VEX0FSRyhhcmd2KTsKKyAgICBwdXRzKCJFcnJvcjogdGhpcyBzYW1wbGUgcmVxdWlyZXMgdmlkZW8gY2FwYWJpbGl0eSAoUEpNRURJQV9IQVNfVklERU8gPT0gMSkiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNlbmRpZiAvKiBQSk1FRElBX0hBU19WSURFTyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9jbGlkZW1vLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2NsaWRlbW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUzMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9jbGlkZW1vLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qICRJZCQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qCisgKiBTYW1wbGUgQ0xJIGFwcGxpY2F0aW9uCisgKi8KKyNpbmNsdWRlIDxwamxpYi11dGlsL2NsaS5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwvY2xpX2ltcC5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwvY2xpX2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsL2NsaV90ZWxuZXQuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsL2Vycm5vLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2RlZmluZSBUSElTX0ZJTEUJImNsaWRlbW8uYyIKKworLyogU2V0IHRoaXMgdG8gMSBpZiB5b3Ugd2FudCB0byBsZXQgdGhlIHN5c3RlbSBhc3NpZ24gYSBwb3J0CisgKiBmb3IgdGhlIENMSSB0ZWxuZXQgZGFlbW9uLgorICogRGVmYXVsdDogMQorICovCisjZGVmaW5lIFVTRV9SQU5ET01fUE9SVCAxCisKK3N0cnVjdCBjbWRfeG1sX3QgeworICAgIGNoYXIgKiB4bWw7CisgICAgcGpfY2xpX2NtZF9oYW5kbGVyIGhhbmRsZXI7Cit9OworCisvKgorICogRGVjbGFyYXRpb24gb2Ygc3lzdGVtIHNwZWNpZmljIG1haW4gbG9vcCwgd2hpY2ggd2lsbCBiZSBkZWZpbmVkIGluCisgKiBhIHNlcGFyYXRlIGZpbGUuCisgKi8KK3BqX3N0YXR1c190IGFwcF9tYWluKHBqX2NsaV90ICpjbGkpOworCisjZGVmaW5lIHByaW50X21zZyhhcmcpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgdW5zaWduZWQgZCA9IHBqX2xvZ19nZXRfZGVjb3IoKTsgXAorICAgICAgICBwal9sb2dfc2V0X2RlY29yKDApOyBcCisgICAgICAgIFBKX0xPRygxLCBhcmcpOyBcCisgICAgICAgIHBqX2xvZ19zZXRfZGVjb3IoZCk7IFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgcGpfY2xpX3QgKmNsaSA9IE5VTEw7CisKKy8qIEhhbmRsZXIgZm9yIHNheWhlbGxvIGNvbW1hbmQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzYXloZWxsbyhwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBwcmludF9tc2coKCIiLCAiSGVsbG8gJS4qcyFcclxuIiwgCisgICAgICAgICAgICAgIChpbnQpY3ZhbC0+YXJndlsxXS5zbGVuLCBjdmFsLT5hcmd2WzFdLnB0cikpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBIYW5kbGVyIGZvciBzYXlieWUgY29tbWFuZCAqLworc3RhdGljIHBqX3N0YXR1c190IHNheWJ5ZShwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBwcmludF9tc2coKCIiLCAiQnllICUuKnMhXHJcbiIsCisgICAgICAgICAgICAgIChpbnQpY3ZhbC0+YXJndlsxXS5zbGVuLCBjdmFsLT5hcmd2WzFdLnB0cikpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBIYW5kbGVyIGZvciBzYXkgY29tbWFuZCAqLworc3RhdGljIHBqX3N0YXR1c190IHNheShwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBwcmludF9tc2coKCIiLCAiJS4qcyAlLipzXHJcbiIsCisgICAgICAgICAgICAgIChpbnQpY3ZhbC0+YXJndlsxXS5zbGVuLCBjdmFsLT5hcmd2WzFdLnB0ciwKKyAgICAgICAgICAgICAgKGludCljdmFsLT5hcmd2WzJdLnNsZW4sIGN2YWwtPmFyZ3ZbMl0ucHRyKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBxdWl0X2FwcChwal9jbGlfY21kX3ZhbCAqY3ZhbCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGN2YWwpOworICAgIHBqX2NsaV9xdWl0KGN2YWwtPnNlc3MtPmZlLT5jbGksIGN2YWwtPnNlc3MsIFBKX0ZBTFNFKTsKKworICAgIHJldHVybiBQSl9DTElfRUVYSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jb2RlY19saXN0KHBqX2NsaV9keW5fY2hvaWNlX3BhcmFtICpwYXJhbSkKK3sKKyAgICBpZiAocGFyYW0tPmFyZ19pZCA9PSAzKSB7CisJcGFyYW0tPmNudCA9IDI7CisJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbMF0udmFsdWUsICJpTGJjIik7CisJcGpfc3RyZHVwMihwYXJhbS0+cG9vbCwgJnBhcmFtLT5jaG9pY2VbMF0uZGVzYywgImlMYmMgQ29kZWMiKTsKKwlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVsxXS52YWx1ZSwgImc3MjkiKTsKKwlwal9zdHJkdXAyKHBhcmFtLT5wb29sLCAmcGFyYW0tPmNob2ljZVsxXS5kZXNjLCAiZzcyOSBDb2RlYyIpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBjbWRfeG1sX3QgY21kX3htbHNbXSA9IHsKKyAgICB7IjxDTUQgbmFtZT0nc2F5aGVsbG8nIGlkPScxJyBzYz0nICAsaCAsICwsIHNoICAsJyBkZXNjPSdXaWxsIHNheSBoZWxsbyc+IgorICAgICAiICAgIDxBUkcgbmFtZT0nd2hvbScgdHlwZT0ndGV4dCcgZGVzYz0nV2hvbSB0byBzYXkgaGVsbG8gdG8nLz4iCisgICAgICI8L0NNRD4iLAorICAgICAmc2F5aGVsbG99LAorICAgIHsiPENNRCBuYW1lPSdzYXlieWUnIGlkPScyJyBzYz0nYixzYicgZGVzYz0nV2lsbCBzYXkgYnllJz4iCisgICAgICIgICAgPEFSRyBuYW1lPSd3aG9tJyB0eXBlPSd0ZXh0JyBkZXNjPSdXaG9tIHRvIHNheSBieWUgdG8nLz4iCisgICAgICI8L0NNRD4iLAorICAgICAmc2F5YnllfSwKKyAgICB7IjxDTUQgbmFtZT0nc2F5bXNnJyBpZD0nMycgc2M9J3MnIGRlc2M9J1dpbGwgc2F5IHNvbWV0aGluZyc+IgorICAgICAiICAgIDxBUkcgbmFtZT0nbXNnJyB0eXBlPSd0ZXh0JyBkZXNjPSdNZXNzYWdlIHRvIHNheScvPiIKKyAgICAgIiAgICA8QVJHIG5hbWU9J3dob20nIHR5cGU9J3RleHQnIGRlc2M9J1dob20gdG8gc2F5IHRvJy8+IgorICAgICAiPC9DTUQ+IiwKKyAgICAgJnNheX0sCisgICAgeyI8Q01EIG5hbWU9J3ZpZCcgaWQ9JzEnIGRlc2M9J1ZpZGVvIENvbW1hbmQnPiIKKyAgICAgIiAgIDxDTUQgbmFtZT0naGVscCcgaWQ9JzInIGRlc2M9J1Nob3cgSGVscCcgLz4iCisgICAgICIgICA8Q01EIG5hbWU9J2VuYWJsZScgaWQ9JzMnIGRlc2M9J0VuYWJsZSBWaWRlbycgLz4iCisgICAgICIgICA8Q01EIG5hbWU9J2Rpc2FibGUnIGlkPSc0JyBkZXNjPSdEaXNhYmxlIFZpZGVvJyAvPiIKKyAgICAgIiAgIDxDTUQgbmFtZT0nY2FsbCcgaWQ9JzUnIGRlc2M9J1ZpZGVvIGNhbGwnID4iCisgICAgICIgICAgICAgICAgICA8Q01EIG5hbWU9J2FkZCcgaWQ9JzYnIGRlc2M9J0FkZCBDYWxsJyAvPiIKKyAgICAgIiAgICAgICAgICAgIDxDTUQgbmFtZT0nY2FwJyBpZD0nNycgZGVzYz0nQ2FwdHVyZSBDYWxsJyA+IgorICAgICAiICAgICAgICAgICAgICAgPEFSRyBuYW1lPSdzdHJlYW1ubycgdHlwZT0naW50JyBkZXNjPSdTdHJlYW0gTm8nIGlkPScxJy8+IgorICAgICAiICAgICAgICAgICAgICAgPEFSRyBuYW1lPSdkZXZpZCcgdHlwZT0naW50JyBkZXNjPSdEZXZpY2UgSWQnIGlkPScyJy8+IgorICAgICAiICAgICAgICAgICAgPC9DTUQ+IgorICAgICAiICAgPC9DTUQ+IiAgICAgCisgICAgICI8L0NNRD4iLAorICAgICBOVUxMfSwKKyAgICB7IjxDTUQgbmFtZT0nZGlzYWJsZV9jb2RlYycgaWQ9JzgnIGRlc2M9J0Rpc2FibGUgY29kZWMnPiIKKyAgICAgIgk8QVJHIG5hbWU9J2NvZGVjX2xpc3QnIHR5cGU9J2Nob2ljZScgaWQ9JzMnIGRlc2M9J0NvZGVjIGxpc3QnPiIKKyAgICAgIgkgICAgPENIT0lDRSB2YWx1ZT0nZzcxMScgZGVzYz0nRzcxMSBDb2RlYycvPiIKKyAgICAgIgkgICAgPENIT0lDRSB2YWx1ZT0nZzcyMicgZGVzYz0nRzcyMiBDb2RlYycvPiIKKyAgICAgIgk8L0FSRz4iCisgICAgICI8L0NNRD4iLAorICAgICBOVUxMfSwKKyAgICB7IjxDTUQgbmFtZT0ncXVpdF9hcHAnIGlkPSc5OTknIHNjPSdxYScgZGVzYz0nUXVpdCB0aGUgYXBwbGljYXRpb24nPiIKKyAgICAgIjwvQ01EPiIsCisgICAgICZxdWl0X2FwcH0sCit9OworCitzdGF0aWMgdm9pZCBsb2dfd3JpdGVyKGludCBsZXZlbCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworICAgIGlmIChjbGkpCisgICAgICAgIHBqX2NsaV93cml0ZV9sb2coY2xpLCBsZXZlbCwgYnVmZmVyLCBsZW4pOworfQorCitpbnQgbWFpbigpCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqX2NsaV9jZmcgY2xpX2NmZzsKKyAgICBwal9jbGlfdGVsbmV0X2NmZyB0Y2ZnOworICAgIHBqX3N0cl90IHhtbDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IGk7ICAgICAgICAKKworICAgIHBqX2luaXQoKTsKKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsIE5VTEwsIDApOworICAgIHBqbGliX3V0aWxfaW5pdCgpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgQ0xJIGFwcC4KKyAgICAgKi8KKyAgICBwal9jbGlfY2ZnX2RlZmF1bHQoJmNsaV9jZmcpOworICAgIGNsaV9jZmcucGYgPSAmY3AuZmFjdG9yeTsKKyAgICBjbGlfY2ZnLm5hbWUgPSBwal9zdHIoIm15Y2xpYXBwIik7CisgICAgY2xpX2NmZy50aXRsZSA9IHBqX3N0cigiTXkgQ0xJIEFwcGxpY2F0aW9uIik7CisKKyAgICBzdGF0dXMgPSBwal9jbGlfY3JlYXRlKCZjbGlfY2ZnLCAmY2xpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyIHNvbWUgY29tbWFuZHMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjbWRfeG1scykvc2l6ZW9mKGNtZF94bWxzWzBdKTsgaSsrKSB7CisgICAgICAgIHhtbCA9IHBqX3N0cihjbWRfeG1sc1tpXS54bWwpOwkKKyAgICAgICAgc3RhdHVzID0gcGpfY2xpX2FkZF9jbWRfZnJvbV94bWwoY2xpLCBOVUxMLCAmeG1sLCAKKwkgICAgY21kX3htbHNbaV0uaGFuZGxlciwgTlVMTCwgZ2V0X2NvZGVjX2xpc3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogU3RhcnQgdGVsbmV0IGRhZW1vbgorICAgICAqLworICAgIHBqX2NsaV90ZWxuZXRfY2ZnX2RlZmF1bHQoJnRjZmcpOworLy8gICAgdGNmZy5wYXNzd2QgPSBwal9zdHIoInBqc2lwIik7CisjaWYgVVNFX1JBTkRPTV9QT1JUCisgICAgdGNmZy5wb3J0ID0gMDsKKyNlbHNlCisgICAgdGNmZy5wb3J0ID0gMjIzMzsKKyNlbmRpZiAgICAKKyAgICB0Y2ZnLnByb21wdF9zdHIgPSBwal9zdHIoIkNvb2xXYXRlciUgIik7CisgICAgc3RhdHVzID0gcGpfY2xpX3RlbG5ldF9jcmVhdGUoY2xpLCAmdGNmZywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBSdW4gdGhlIHN5c3RlbSBzcGVjaWZpYyBtYWluIGxvb3AuCisgICAgICovCisgICAgc3RhdHVzID0gYXBwX21haW4oY2xpKTsKKworb25fcmV0dXJuOgorCisgICAgLyoKKyAgICAgKiBEZXN0cm95CisgICAgICovCisgICAgcGpfY2xpX2Rlc3Ryb3koY2xpKTsKKyAgICBjbGkgPSBOVUxMOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjcCk7CisgICAgcGpfc2h1dGRvd24oKTsKKworICAgIHJldHVybiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgPyAxIDogMCk7Cit9CisKKworLyp4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCBtYWluX2NvbnNvbGUuYyB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4ICovCisvKgorICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGFwcF9tYWluKCkgZm9yIGNvbnNvbGUgdGFyZ2V0cworICovCitwal9zdGF0dXNfdCBhcHBfbWFpbihwal9jbGlfdCAqY2xpKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal9jbGlfc2VzcyAqc2VzczsKKyAgICBwal9jbGlfY29uc29sZV9jZmcgY29uc29sZV9jZmc7CisKKyAgICBwal9jbGlfY29uc29sZV9jZmdfZGVmYXVsdCgmY29uc29sZV9jZmcpOworICAgIGNvbnNvbGVfY2ZnLnByb21wdF9zdHIgPSBwal9zdHIoIkhvdFdhdGVyPiAiKTsKKyAgICAKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgY29uc29sZSBmcm9udCBlbmQKKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwal9jbGlfY29uc29sZV9jcmVhdGUoY2xpLCAmY29uc29sZV9jZmcsICZzZXNzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHBqX2xvZ19zZXRfbG9nX2Z1bmMoJmxvZ193cml0ZXIpOworCisgICAgLyoKKyAgICAgKiBNYWluIGxvb3AuCisgICAgICovCisgICAgZm9yICg7OykgeworCWNoYXIgY21kbGluZVtQSl9DTElfTUFYX0NNREJVRl07CisgICAgICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgICAgICBzdGF0dXMgPSBwal9jbGlfY29uc29sZV9wcm9jZXNzKHNlc3MsICZjbWRsaW5lWzBdLCBzaXplb2YoY21kbGluZSkpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgYnJlYWs7CisKKwkvL3BqX2Fuc2lfc3RyY3B5KGNtZGxpbmUsICJzYXloZWxsbyB7VGVsdXUgSW5jLn0iKTsJCisJaWYgKHN0YXR1cyA9PSBQSl9DTElfRUVYSVQpIHsKKwkgICAgLyogZXhpdCBpcyBjYWxsZWQgKi8KKwkgICAgYnJlYWs7CisJfSBlbHNlIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICAvKiBTb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgY21kbGluZSAqLworCSAgICBQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJFeGVjIGVycm9yIikpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvY29uZmJlbmNoLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2NvbmZiZW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MWFlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2NvbmZiZW5jaC5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiAkSWQ6IGNvbmZiZW5jaC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisKKy8qKgorICogXHBhZ2UgcGFnZV9wam1lZGlhX3NhbXBsZXNfY29uZmJlbmNoX2MgU2FtcGxlczogQmVuY2htYXJraW5nIENvbmZlcmVuY2UgQnJpZGdlCisgKgorICogQmVuY2htYXJraW5nIHBqbWVkaWEgKGNvbmZlcmVuY2UgYnJpZGdlK3Jlc2FtcGxlKS4gRm9yIG15IHVzZSBvbmx5LAorICogYW5kIGl0IG9ubHkgd29ya3MgaW4gV2luMzIuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvY29uZmJlbmNoLmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBjb25mYmVuY2guYworICovCisKKworI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CS8qIHBqX2dldG9wdCAqLworI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CS8qIGF0b2koKSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKiBGb3IgbG9nZ2luZyBwdXJwb3NlLiAqLworI2RlZmluZSBUSElTX0ZJTEUgICAiY29uZnNhbXBsZS5jIgorCisKKy8qIENvbmZpZ3VyYWJsZToKKyAqICAgTEFSR0VfU0VUIHdpbGwgY3JlYXRlIGluIHRvdGFsIG9mIGFib3V0IDIzMiBwb3J0cy4KKyAqICAgSEFTX1JFU0FNUExFIHdpbGwgYWN0aXZhdGUgcmVzYW1wbGluZyBvbiBhYm91dCBoYWxmCisgKiAgICAgdGhlIHBvcnQuCisgKi8KKyNkZWZpbmUgVEVTVF9TRVQJICAgIExBUkdFX1NFVAorI2RlZmluZSBIQVNfUkVTQU1QTEUJICAgIDAKKworCisjZGVmaW5lIFNNQUxMX1NFVAkgICAgMTYKKyNkZWZpbmUgTEFSR0VfU0VUCSAgICAxMDAKKworCisjZGVmaW5lIFBPUlRfQ09VTlQJICAgIDI1NAorI2RlZmluZSBDTE9DS19SQVRFCSAgICAxNjAwMAorI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRSAgIChDTE9DS19SQVRFLzEwMCkKKyNpZiBIQVNfUkVTQU1QTEUKKyMgIGRlZmluZSBTSU5FX0NMT0NLCSAgICAzMjAwMAorI2Vsc2UKKyMgIGRlZmluZSBTSU5FX0NMT0NLCSAgICBDTE9DS19SQVRFCisjZW5kaWYKKyNkZWZpbmUgU0lORV9QVElNRQkgICAgMjAKKyNkZWZpbmUgRFVSQVRJT04JICAgIDEwCisKKyNkZWZpbmUgU0lORV9DT1VOVAkgICAgVEVTVF9TRVQKKyNkZWZpbmUgTlVMTF9DT1VOVAkgICAgVEVTVF9TRVQKKyNkZWZpbmUgSURMRV9DT1VOVAkgICAgMzIKKworCitzdGF0aWMgdm9pZCBhcHBfcGVycm9yKGNvbnN0IGNoYXIgKnNlbmRlciwgY29uc3QgY2hhciAqdGl0bGUsIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBQSl9MT0coMSwoc2VuZGVyLCAiJXM6ICVzIiwgdGl0bGUsIGVycm1zZykpOworfQorCisKK3N0cnVjdCBUaW1lcworeworICAgIEZJTEVUSU1FCSAgICBrZXJuZWxfdGltZTsKKyAgICBVTEFSR0VfSU5URUdFUiAgdV9rZXJuZWxfdGltZTsKKyAgICBGSUxFVElNRQkgICAgdXNlcl90aW1lOworICAgIFVMQVJHRV9JTlRFR0VSICB1X3VzZXJfdGltZTsKKyAgICBVTEFSR0VfSU5URUdFUiAgdV90b3RhbDsKK307CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Moc3RydWN0IFRpbWVzICp0KQoreworICAgIHBqX21lbWNweSgmdC0+dV9rZXJuZWxfdGltZSwgJnQtPmtlcm5lbF90aW1lLCBzaXplb2YoRklMRVRJTUUpKTsKKyAgICBwal9tZW1jcHkoJnQtPnVfdXNlcl90aW1lLCAmdC0+dXNlcl90aW1lLCBzaXplb2YoRklMRVRJTUUpKTsKKyAgICB0LT51X3RvdGFsLlF1YWRQYXJ0ID0gdC0+dV9rZXJuZWxfdGltZS5RdWFkUGFydCArIHQtPnVfdXNlcl90aW1lLlF1YWRQYXJ0OworfQorCitzdGF0aWMgdm9pZCBiZW5jaG1hcmsodm9pZCkKK3sKKyAgICBGSUxFVElNRSBjcmVhdGlvbl90aW1lLCBleGl0X3RpbWU7CisgICAgc3RydWN0IFRpbWVzIHN0YXJ0LCBlbmQ7CisgICAgRFdPUkQgdHMsIHRlOworICAgIExBUkdFX0lOVEVHRVIgZWxhcHNlZDsKKyAgICBCT09MIHJjOworICAgIGludCBpOworICAgIGRvdWJsZSBwY3Q7CisKKyAgICBwdXRzKCJUZXN0IHN0YXJ0ZWQhIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgdHMgPSBHZXRUaWNrQ291bnQoKTsKKyAgICByYyA9IEdldFByb2Nlc3NUaW1lcyhHZXRDdXJyZW50UHJvY2VzcygpLCAmY3JlYXRpb25fdGltZSwgJmV4aXRfdGltZSwKKwkJCSAmc3RhcnQua2VybmVsX3RpbWUsICZzdGFydC51c2VyX3RpbWUpOworICAgIGZvciAoaT1EVVJBVElPTjsgaT4wOyAtLWkpIHsKKwlwcmludGYoIlxyJWQgIiwgaSk7IGZmbHVzaChzdGRvdXQpOworCXBqX3RocmVhZF9zbGVlcCgxMDAwKTsKKyAgICB9CisgICAgcmMgPSBHZXRQcm9jZXNzVGltZXMoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmNyZWF0aW9uX3RpbWUsICZleGl0X3RpbWUsCisJCQkgJmVuZC5rZXJuZWxfdGltZSwgJmVuZC51c2VyX3RpbWUpOworICAgIHRlID0gR2V0VGlja0NvdW50KCk7CisKKyAgICBwcm9jZXNzKCZzdGFydCk7CisgICAgcHJvY2VzcygmZW5kKTsKKworICAgIGVsYXBzZWQuUXVhZFBhcnQgPSBlbmQudV90b3RhbC5RdWFkUGFydCAtIHN0YXJ0LnVfdG90YWwuUXVhZFBhcnQ7CisKKyAgICBwY3QgPSBlbGFwc2VkLlF1YWRQYXJ0ICogMTAwLjAgLyAoKHRlLXRzKSoxMDAwMC4wKTsKKworICAgIHByaW50ZigiQ1BVIHVzYWdlPSU2LjRmJSVcbiIsIHBjdCk7IGZmbHVzaChzdGRvdXQpOworfQorCisKKworLyogU3RydWN0IGF0dGFjaGVkIHRvIHNpbmUgZ2VuZXJhdG9yICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHBqX2ludDE2X3QJKnNhbXBsZXM7CS8qIFNpbmUgc2FtcGxlcy4gICAgKi8KK30gcG9ydF9kYXRhOworCisKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHRvIGZlZWQgbW9yZSBzYW1wbGVzICovCitzdGF0aWMgcGpfc3RhdHVzX3Qgc2luZV9nZXRfZnJhbWUoIHBqbWVkaWFfcG9ydCAqcG9ydCwgCisJCQkJICAgcGptZWRpYV9mcmFtZSAqZnJhbWUpCit7CisgICAgcG9ydF9kYXRhICpzaW5lID0gcG9ydC0+cG9ydF9kYXRhLnBkYXRhOworICAgIHBqX2ludDE2X3QgKnNhbXBsZXMgPSBmcmFtZS0+YnVmOworICAgIHVuc2lnbmVkIGksIGxlZnQsIHJpZ2h0OworICAgIHBqX3NpemVfdCBjb3VudDsKKworICAgIC8qIEdldCBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIGNvdW50ID0gZnJhbWUtPnNpemUgLyAyIC8gUEpNRURJQV9QSUFfQ0NOVCgmcG9ydC0+aW5mbyk7CisKKyAgICBsZWZ0ID0gMDsKKyAgICByaWdodCA9IDA7CisKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJKnNhbXBsZXMrKyA9IHNpbmUtPnNhbXBsZXNbbGVmdF07CisJKytsZWZ0OworCisJaWYgKFBKTUVESUFfUElBX0NDTlQoJnBvcnQtPmluZm8pID09IDIpIHsKKwkgICAgKnNhbXBsZXMrKyA9IHNpbmUtPnNhbXBsZXNbcmlnaHRdOworCSAgICByaWdodCArPSAyOyAvKiBoaWdoZXIgcGl0Y2ggc28gd2UgY2FuIGRpc3Rpbmd1aXNoIGxlZnQgYW5kIHJpZ2h0LiAqLworCSAgICBpZiAocmlnaHQgPj0gY291bnQpCisJCXJpZ2h0ID0gMDsKKwl9CisgICAgfQorCisgICAgLyogTXVzdCBzZXQgZnJhbWUtPnR5cGUgY29ycmVjdGx5LCBvdGhlcndpc2UgdGhlIHNvdW5kIGRldmljZQorICAgICAqIHdpbGwgcmVmdXNlIHRvIHBsYXkuCisgICAgICovCisgICAgZnJhbWUtPnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgICgzLjE0MTU5MjY1KQorI2VuZGlmCisKKy8qCisgKiBDcmVhdGUgYSBtZWRpYSBwb3J0IHRvIGdlbmVyYXRlIHNpbmUgd2F2ZSBzYW1wbGVzLgorICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY3JlYXRlX3NpbmVfcG9ydChwal9wb29sX3QgKnBvb2wsCisJCQkJICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGUsCisJCQkJICAgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJICAgIHBqbWVkaWFfcG9ydCAqKnBfcG9ydCkKK3sKKyAgICBwam1lZGlhX3BvcnQgKnBvcnQ7CisgICAgdW5zaWduZWQgaTsKKyAgICB1bnNpZ25lZCBjb3VudDsKKyAgICBwal9zdHJfdCBwb3J0X25hbWU7CisgICAgcG9ydF9kYXRhICpzaW5lOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIGNoYW5uZWxfY291bnQgPiAwICYmIGNoYW5uZWxfY291bnQgPD0gMiwgCisJCSAgICAgUEpfRUlOVkFMKTsKKworICAgIHBvcnQgPSBwal9wb29sX3phbGxvYyhwb29sLCBzaXplb2YocGptZWRpYV9wb3J0KSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb3J0ICE9IE5VTEwsIFBKX0VOT01FTSk7CisKKyAgICAvKiBGaWxsIGluIHBvcnQgaW5mby4gKi8KKyAgICBwb3J0X25hbWUgPSBwal9zdHIoInNpbmUgZ2VuZXJhdG9yIik7CisgICAgcGptZWRpYV9wb3J0X2luZm9faW5pdCgmcG9ydC0+aW5mbywgJnBvcnRfbmFtZSwKKwkJCSAgIDEyMzQ1LCBzYW1wbGluZ19yYXRlLCBjaGFubmVsX2NvdW50LCAxNiwgCisJCQkgICBzYW1wbGluZ19yYXRlICogU0lORV9QVElNRSAvIDEwMDAgKiBjaGFubmVsX2NvdW50KTsKKyAgICAKKyAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGZlZWQgZnJhbWUgKi8KKyAgICBwb3J0LT5nZXRfZnJhbWUgPSAmc2luZV9nZXRfZnJhbWU7CisKKyAgICAvKiBDcmVhdGUgc2luZSBwb3J0IGRhdGEgKi8KKyAgICBwb3J0LT5wb3J0X2RhdGEucGRhdGEgPSBzaW5lID0gcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBvcnRfZGF0YSkpOworCisgICAgLyogQ3JlYXRlIHNhbXBsZXMgKi8KKyAgICBjb3VudCA9IFBKTUVESUFfUElBX1NQRigmcG9ydC0+aW5mbykgLyBjaGFubmVsX2NvdW50OworICAgIHNpbmUtPnNhbXBsZXMgPSBwal9wb29sX2FsbG9jKHBvb2wsIGNvdW50ICogc2l6ZW9mKHBqX2ludDE2X3QpKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNpbmUtPnNhbXBsZXMgIT0gTlVMTCwgUEpfRU5PTUVNKTsKKworICAgIC8qIGluaXRpYWxpc2Ugc2ludXNvaWRhbCB3YXZldGFibGUgKi8KKyAgICBmb3IoIGk9MDsgaTxjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIHNpbmUtPnNhbXBsZXNbaV0gPSAocGpfaW50MTZfdCkgKDEwMDAwLjAgKiAKKwkJc2luKCgoZG91YmxlKWkvKGRvdWJsZSljb3VudCkgKiBNX1BJICogOC4pICk7CisgICAgfQorCisgICAgKnBfcG9ydCA9IHBvcnQ7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworaW50IG1haW4oKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCBjcDsKKyAgICBwam1lZGlhX2VuZHB0ICptZWRfZW5kcHQ7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqbWVkaWFfY29uZiAqY29uZjsKKyAgICBpbnQgaTsKKyAgICBwam1lZGlhX3BvcnQgKnNpbmVfcG9ydFtTSU5FX0NPVU5UXSwgKm51bGxfcG9ydCwgKmNvbmZfcG9ydDsKKyAgICBwam1lZGlhX3BvcnQgKm51bGxzW05VTExfQ09VTlRdOworICAgIHVuc2lnbmVkIG51bGxfc2xvdHNbTlVMTF9DT1VOVF07CisgICAgcGptZWRpYV9tYXN0ZXJfcG9ydCAqbWFzdGVyX3BvcnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisKKyAgICBwal9sb2dfc2V0X2xldmVsKDMpOworCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoICZjcC5mYWN0b3J5LAkgICAgLyogcG9vbCBmYWN0b3J5CSAgICAqLworCQkJICAgIndhdiIsCSAgICAvKiBwb29sIG5hbWUuCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluaXQgc2l6ZQkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbmNyZW1lbnQgc2l6ZQkgICAgKi8KKwkJCSAgIE5VTEwJCSAgICAvKiBjYWxsYmFjayBvbiBlcnJvciAgICAqLworCQkJICAgKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisKKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvbmZfY3JlYXRlKCBwb29sLAorCQkJCSAgUE9SVF9DT1VOVCwKKwkJCQkgIENMT0NLX1JBVEUsCisJCQkJICAxLCBTQU1QTEVTX1BFUl9GUkFNRSwgMTYsCisJCQkJICBQSk1FRElBX0NPTkZfTk9fREVWSUNFLAorCQkJCSAgJmNvbmYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBjb25mZXJlbmNlIGJyaWRnZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcHJpbnRmKCJSZXNhbXBsaW5nIGlzICVzXG4iLCAoSEFTX1JFU0FNUExFPyJhY3RpdmUiOiJkaXNhYmxlZCIpKTsKKworICAgIC8qIENyZWF0ZSBOdWxsIHBvcnRzICovCisgICAgcHJpbnRmKCJDcmVhdGluZyAlZCBudWxsIHBvcnRzLi5cbiIsIE5VTExfQ09VTlQpOworICAgIGZvciAoaT0wOyBpPE5VTExfQ09VTlQ7ICsraSkgeworCXN0YXR1cyA9IHBqbWVkaWFfbnVsbF9wb3J0X2NyZWF0ZShwb29sLCBDTE9DS19SQVRFLCAxLCBTQU1QTEVTX1BFUl9GUkFNRSoyLCAxNiwgJm51bGxzW2ldKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCXN0YXR1cyA9IHBqbWVkaWFfY29uZl9hZGRfcG9ydChjb25mLCBwb29sLCBudWxsc1tpXSwgTlVMTCwgJm51bGxfc2xvdHNbaV0pOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBzaW5lIHBvcnRzLiAqLworICAgIHByaW50ZigiQ3JlYXRpbmcgJWQgc2luZSBnZW5lcmF0b3IgcG9ydHMuLlxuIiwgU0lORV9DT1VOVCk7CisgICAgZm9yIChpPTA7IGk8U0lORV9DT1VOVDsgKytpKSB7CisJdW5zaWduZWQgaiwgc2xvdDsKKworCS8qIExvYWQgdGhlIFdBViBmaWxlIHRvIGZpbGUgcG9ydC4gKi8KKwlzdGF0dXMgPSBjcmVhdGVfc2luZV9wb3J0KHBvb2wsIFNJTkVfQ0xPQ0ssIDEsICZzaW5lX3BvcnRbaV0pOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisJLyogQWRkIHRoZSBmaWxlIHBvcnQgdG8gY29uZmVyZW5jZSBicmlkZ2UgKi8KKwlzdGF0dXMgPSBwam1lZGlhX2NvbmZfYWRkX3BvcnQoIGNvbmYsCQkvKiBUaGUgYnJpZGdlCSAgICAqLworCQkJCQlwb29sLAkJLyogcG9vbAkJICAgICovCisJCQkJCXNpbmVfcG9ydFtpXSwJLyogcG9ydCB0byBjb25uZWN0ICAqLworCQkJCQlOVUxMLAkJLyogVXNlIHBvcnQncyBuYW1lICAqLworCQkJCQkmc2xvdAkJLyogcHRyIGZvciBzbG90ICMgICAqLworCQkJCQkpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBhZGQgY29uZmVyZW5jZSBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJc3RhdHVzID0gcGptZWRpYV9jb25mX2Nvbm5lY3RfcG9ydChjb25mLCBzbG90LCAwLCAwKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCWZvciAoaj0wOyBqPE5VTExfQ09VTlQ7ICsraikgeworCSAgICBzdGF0dXMgPSBwam1lZGlhX2NvbmZfY29ubmVjdF9wb3J0KGNvbmYsIHNsb3QsIG51bGxfc2xvdHNbal0sIDApOworCSAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKwl9CisgICAgfQorCisgICAgLyogQ3JlYXRlIGlkbGUgcG9ydHMgKi8KKyAgICBwcmludGYoIkNyZWF0aW5nICVkIGlkbGUgcG9ydHMuLlxuIiwgSURMRV9DT1VOVCk7CisgICAgZm9yIChpPTA7IGk8SURMRV9DT1VOVDsgKytpKSB7CisJcGptZWRpYV9wb3J0ICpkdW1teTsKKwlzdGF0dXMgPSBwam1lZGlhX251bGxfcG9ydF9jcmVhdGUocG9vbCwgQ0xPQ0tfUkFURSwgMSwgU0FNUExFU19QRVJfRlJBTUUsIDE2LCAmZHVtbXkpOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCXN0YXR1cyA9IHBqbWVkaWFfY29uZl9hZGRfcG9ydChjb25mLCBwb29sLCBkdW1teSwgTlVMTCwgTlVMTCk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIG51bGwgcG9ydCAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfbnVsbF9wb3J0X2NyZWF0ZShwb29sLCBDTE9DS19SQVRFLCAxLCBTQU1QTEVTX1BFUl9GUkFNRSwgMTYsCisJCQkJICAgICAgJm51bGxfcG9ydCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICBjb25mX3BvcnQgPSBwam1lZGlhX2NvbmZfZ2V0X21hc3Rlcl9wb3J0KGNvbmYpOworCisgICAgLyogQ3JlYXRlIG1hc3RlciBwb3J0ICovCisgICAgc3RhdHVzID0gcGptZWRpYV9tYXN0ZXJfcG9ydF9jcmVhdGUocG9vbCwgbnVsbF9wb3J0LCBjb25mX3BvcnQsIDAsICZtYXN0ZXJfcG9ydCk7CisKKworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfc3RhcnQobWFzdGVyX3BvcnQpOworCisgICAgcHV0cygiV2FpdGluZyB0byBzZXR0bGUuLiIpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICBwal90aHJlYWRfc2xlZXAoNTAwMCk7CisKKworICAgIGJlbmNobWFyaygpOworCisKKyAgICAvKiBEb25lLiAqLworICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvY29uZnNhbXBsZS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9jb25mc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliM2E5YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvY29uZnNhbXBsZS5jCkBAIC0wLDAgKzEsNjA5IEBACisvKiAkSWQ6IGNvbmZzYW1wbGUuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CS8qIHBqX2dldG9wdCAqLworI2luY2x1ZGUgPHBqbGliLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYXRvaSgpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInV0aWwuaCIKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19jb25mc2FtcGxlX2MgU2FtcGxlczogVXNpbmcgQ29uZmVyZW5jZSBCcmlkZ2UKKyAqCisgKiBTYW1wbGUgdG8gbWl4IG11bHRpcGxlIGZpbGVzIGluIHRoZSBjb25mZXJlbmNlIGJyaWRnZSBhbmQgcGxheSB0aGUKKyAqIHJlc3VsdCB0byBzb3VuZCBkZXZpY2UuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvY29uZnNhbXBsZS5jCisgKgorICogXGluY2x1ZGVsaW5lbm8gY29uZnNhbXBsZS5jCisgKi8KKworCisvKiBGb3IgbG9nZ2luZyBwdXJwb3NlLiAqLworI2RlZmluZSBUSElTX0ZJTEUgICAiY29uZnNhbXBsZS5jIgorCisKKy8qIFNoYWxsIHdlIHB1dCByZWNvcmRlciBpbiB0aGUgY29uZmVyZW5jZSAqLworI2RlZmluZSBSRUNPUkRFUiAgICAxCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyAiIEZJTEU6CQkJCQkJCQkgICAgXG4iCisgIgkJCQkJCQkJCSAgICBcbiIKKyAiICBjb25mc2FtcGxlLmMJCQkJCQkJICAgIFxuIgorICIJCQkJCQkJCQkgICAgXG4iCisgIiBQVVJQT1NFOgkJCQkJCQkJICAgIFxuIgorICIJCQkJCQkJCQkgICAgXG4iCisgIiAgRGVtb25zdHJhdGUgaG93IHRvIHVzZSBjb25mZXJlbmNlIGJyaWRnZS4JCQkJICAgIFxuIgorICIJCQkJCQkJCQkgICAgXG4iCisgIiBVU0FHRToJCQkJCQkJCSAgICBcbiIKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgIGNvbmZzYW1wbGUgW29wdGlvbnNdIFtmaWxlMS53YXZdIFtmaWxlMi53YXZdIC4uLgkJCSAgICBcbiIKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgb3B0aW9uczoJCQkJCQkJCSAgICBcbiIKKyBTTkRfVVNBR0UKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgIGZpbGVOLndhdiBhcmUgb3B0aW9uYWwgV0FWIGZpbGVzIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgY29uZmVyZW5jZSAgICAgIFxuIgorICIgIGJyaWRnZS4gVGhlIFdBViBmaWxlcyBNVVNUIGhhdmUgc2luZ2xlIGNoYW5uZWwgKG1vbm8pIGFuZCAxNiBiaXQgUENNICAgIFxuIgorICIgIHNhbXBsZXMuIEl0IGNhbiBoYXZlIGFyYml0cmFyeSBzYW1wbGluZyByYXRlLgkJCSAgICBcbiIKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgREVTQ1JJUFRJT046CQkJCQkJCQkgICAgXG4iCisgIgkJCQkJCQkJCSAgICBcbiIKKyAiICBIZXJlIHdlIGNyZWF0ZSBhIGNvbmZlcmVuY2UgYnJpZGdlLCB3aXRoIGF0IGxlYXN0IG9uZSBwb3J0IChwb3J0IHplcm8gICBcbiIKKyAiICBpcyBhbHdheXMgY3JlYXRlZCBmb3IgdGhlIHNvdW5kIGRldmljZSkuCQkJCSAgICBcbiIKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgIElmIFdBViBmaWxlcyBhcmUgc3BlY2lmaWVkLCB0aGUgV0FWIGZpbGUgcGxheWVyIHBvcnRzIHdpbGwgYmUgY29ubmVjdGVkIFxuIgorICIgIHRvIHNsb3Qgc3RhcnRpbmcgZnJvbSBudW1iZXIgb25lIGluIHRoZSBicmlkZ2UuIFRoZSBXQVYgZmlsZXMgY2FuIGhhdmUgIFxuIgorICIgIGFyYml0cmFyeSBzYW1wbGluZyByYXRlOyB0aGUgYnJpZGdlIHdpbGwgY29udmVydCBpdCB0byBpdHMgY2xvY2sgcmF0ZS4gIFxuIgorICIgIEhvd2V2ZXIsIHRoZSBmaWxlcyBNVVNUIGhhdmUgYSBzaW5nbGUgYXVkaW8gY2hhbm5lbCBvbmx5IChpLmUuIG1vbm8pLiAgXG4iOworCisKKyAKKy8qIAorICogUHJvdG90eXBlczogCisgKi8KKworLyogTGlzdCB0aGUgcG9ydHMgaW4gdGhlIGNvbmZlcmVuY2UgYnJpZGdlICovCitzdGF0aWMgdm9pZCBjb25mX2xpc3QocGptZWRpYV9jb25mICpjb25mLCBwal9ib29sX3QgZGV0YWlsKTsKKworLyogRGlzcGxheSBWVSBtZXRlciAqLworc3RhdGljIHZvaWQgbW9uaXRvcl9sZXZlbChwam1lZGlhX2NvbmYgKmNvbmYsIGludCBzbG90LCBpbnQgZGlyLCBpbnQgZHVyKTsKKworCisvKiBTaG93IHVzYWdlICovCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIHB1dHMoIiIpOworICAgIHB1dHMoZGVzYyk7Cit9CisKKworCisvKiBJbnB1dCBzaW1wbGUgc3RyaW5nICovCitzdGF0aWMgcGpfYm9vbF90IGlucHV0KGNvbnN0IGNoYXIgKnRpdGxlLCBjaGFyICpidWYsIHBqX3NpemVfdCBsZW4pCit7CisgICAgY2hhciAqcDsKKworICAgIHByaW50ZigiJXMgKGVtcHR5IHRvIGNhbmNlbCk6ICIsIHRpdGxlKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKGZnZXRzKGJ1ZiwgKGludClsZW4sIHN0ZGluKSA9PSBOVUxMKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIC8qIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lcy4gKi8KKyAgICBmb3IgKHA9YnVmOyA7ICsrcCkgeworCWlmICgqcD09J1xyJyB8fCAqcD09J1xuJykgKnA9J1wwJzsKKwllbHNlIGlmICghKnApIGJyZWFrOworICAgIH0KKworICAgIGlmICghKmJ1ZikKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWluKCkKKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgZGV2X2lkID0gLTE7CisgICAgaW50IGNsb2NrX3JhdGUgPSBDTE9DS19SQVRFOworICAgIGludCBjaGFubmVsX2NvdW50ID0gTkNIQU5ORUxTOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZSA9IE5TQU1QTEVTOworICAgIGludCBiaXRzX3Blcl9zYW1wbGUgPSBOQklUUzsKKworICAgIHBqX2NhY2hpbmdfcG9vbCBjcDsKKyAgICBwam1lZGlhX2VuZHB0ICptZWRfZW5kcHQ7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqbWVkaWFfY29uZiAqY29uZjsKKworICAgIGludCBpLCBwb3J0X2NvdW50LCBmaWxlX2NvdW50OworICAgIHBqbWVkaWFfcG9ydCAqKmZpbGVfcG9ydDsJLyogQXJyYXkgb2YgZmlsZSBwb3J0cyAqLworICAgIHBqbWVkaWFfcG9ydCAqcmVjX3BvcnQgPSBOVUxMOyAgLyogV2F2IHdyaXRlciBwb3J0ICovCisKKyAgICBjaGFyIHRtcFsxMF07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisKKyAgICAvKiBNdXN0IGluaXQgUEpMSUIgZmlyc3Q6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogR2V0IGNvbW1hbmQgbGluZSBvcHRpb25zLiAqLworICAgIGlmIChnZXRfc25kX29wdGlvbnMoVEhJU19GSUxFLCBhcmdjLCBhcmd2LCAmZGV2X2lkLCAmY2xvY2tfcmF0ZSwKKwkJCSZjaGFubmVsX2NvdW50LCAmc2FtcGxlc19wZXJfZnJhbWUsICZiaXRzX3Blcl9zYW1wbGUpKQorICAgIHsKKwl1c2FnZSgpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludC4KKyAgICAgKiBUaGlzIHdpbGwgaW1wbGljaXRseSBpbml0aWFsaXplIFBKTUVESUEgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIENyZWF0ZSBtZW1vcnkgcG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoICZjcC5mYWN0b3J5LAkgICAgLyogcG9vbCBmYWN0b3J5CSAgICAqLworCQkJICAgIndhdiIsCSAgICAvKiBwb29sIG5hbWUuCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluaXQgc2l6ZQkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbmNyZW1lbnQgc2l6ZQkgICAgKi8KKwkJCSAgIE5VTEwJCSAgICAvKiBjYWxsYmFjayBvbiBlcnJvciAgICAqLworCQkJICAgKTsKKworCisgICAgZmlsZV9jb3VudCA9IGFyZ2MgLSBwal9vcHRpbmQ7CisgICAgcG9ydF9jb3VudCA9IGZpbGVfY291bnQgKyAxICsgUkVDT1JERVI7CisKKyAgICAvKiBDcmVhdGUgdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiAKKyAgICAgKiBXaXRoIGRlZmF1bHQgb3B0aW9ucyAoemVybyksIHRoZSBicmlkZ2Ugd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiBzb3VuZCBjYXB0dXJlIGFuZCBwbGF5YmFjayBkZXZpY2UgYW5kIGNvbm5lY3QgdGhlbSB0byBzbG90IHplcm8uCisgICAgICovCisgICAgc3RhdHVzID0gcGptZWRpYV9jb25mX2NyZWF0ZSggcG9vbCwJICAgIC8qIHBvb2wgdG8gdXNlCSAgICAqLworCQkJCSAgcG9ydF9jb3VudCwvKiBudW1iZXIgb2YgcG9ydHMJICAgICovCisJCQkJICBjbG9ja19yYXRlLAorCQkJCSAgY2hhbm5lbF9jb3VudCwKKwkJCQkgIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCSAgYml0c19wZXJfc2FtcGxlLAorCQkJCSAgMCwJICAgIC8qIG9wdGlvbnMJCSAgICAqLworCQkJCSAgJmNvbmYJICAgIC8qIHJlc3VsdAkJICAgICovCisJCQkJICApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBjb25mZXJlbmNlIGJyaWRnZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisjaWYgUkVDT1JERVIKKyAgICBzdGF0dXMgPSBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9jcmVhdGUoICBwb29sLCAiY29uZnJlY29yZC53YXYiLAorCQkJCQkgICAgICBjbG9ja19yYXRlLCBjaGFubmVsX2NvdW50LAorCQkJCQkgICAgICBzYW1wbGVzX3Blcl9mcmFtZSwgCisJCQkJCSAgICAgIGJpdHNfcGVyX3NhbXBsZSwgMCwgMCwgCisJCQkJCSAgICAgICZyZWNfcG9ydCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIFdBViB3cml0ZXIiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIHBqbWVkaWFfY29uZl9hZGRfcG9ydChjb25mLCBwb29sLCByZWNfcG9ydCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworCisgICAgLyogQ3JlYXRlIGZpbGUgcG9ydHMuICovCisgICAgZmlsZV9wb3J0ID0gcGpfcG9vbF9hbGxvYyhwb29sLCBmaWxlX2NvdW50ICogc2l6ZW9mKHBqbWVkaWFfcG9ydCopKTsKKworICAgIGZvciAoaT0wOyBpPGZpbGVfY291bnQ7ICsraSkgeworCisJLyogTG9hZCB0aGUgV0FWIGZpbGUgdG8gZmlsZSBwb3J0LiAqLworCXN0YXR1cyA9IHBqbWVkaWFfd2F2X3BsYXllcl9wb3J0X2NyZWF0ZSggCisJCQlwb29sLAkJICAgIC8qIHBvb2wuCSAgICAqLworCQkJYXJndltpK3BqX29wdGluZF0sICAvKiBmaWxlbmFtZQkgICAgKi8KKwkJCTAsCQkgICAgLyogdXNlIGRlZmF1bHQgcHRpbWUgKi8KKwkJCTAsCQkgICAgLyogZmxhZ3MJICAgICovCisJCQkwLAkJICAgIC8qIGJ1ZiBzaXplCSAgICAqLworCQkJJmZpbGVfcG9ydFtpXQkgICAgLyogcmVzdWx0CSAgICAqLworCQkJKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgY2hhciB0aXRsZVs4MF07CisJICAgIHBqX2Fuc2lfc3ByaW50Zih0aXRsZSwgIlVuYWJsZSB0byB1c2UgJXMiLCBhcmd2W2krcGpfb3B0aW5kXSk7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCB0aXRsZSwgc3RhdHVzKTsKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJLyogQWRkIHRoZSBmaWxlIHBvcnQgdG8gY29uZmVyZW5jZSBicmlkZ2UgKi8KKwlzdGF0dXMgPSBwam1lZGlhX2NvbmZfYWRkX3BvcnQoIGNvbmYsCQkvKiBUaGUgYnJpZGdlCSAgICAqLworCQkJCQlwb29sLAkJLyogcG9vbAkJICAgICovCisJCQkJCWZpbGVfcG9ydFtpXSwJLyogcG9ydCB0byBjb25uZWN0ICAqLworCQkJCQlOVUxMLAkJLyogVXNlIHBvcnQncyBuYW1lICAqLworCQkJCQlOVUxMCQkvKiBwdHIgZm9yIHNsb3QgIyAgICovCisJCQkJCSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGFkZCBjb25mZXJlbmNlIHBvcnQiLCBzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisKKyAgICAvKiAKKyAgICAgKiBBbGwgcG9ydHMgYXJlIHNldCB1cCBpbiB0aGUgY29uZmVyZW5jZSBicmlkZ2UuCisgICAgICogQnV0IGF0IHRoaXMgcG9pbnQsIG5vIG1lZGlhIHdpbGwgYmUgZmxvd2luZyBzaW5jZSBubyBwb3J0cyBhcmUKKyAgICAgKiAiY29ubmVjdGVkIi4gVXNlciBtdXN0IGNvbm5lY3QgdGhlIHBvcnQgbWFudWFsbHkuCisgICAgICovCisKKworICAgIC8qIER1bXAgbWVtb3J5IHVzYWdlICovCisgICAgZHVtcF9wb29sX3VzYWdlKFRISVNfRklMRSwgJmNwKTsKKworICAgIC8qIFNsZWVwIHRvIGFsbG93IGxvZyBtZXNzYWdlcyB0byBmbHVzaCAqLworICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworCisKKyAgICAvKgorICAgICAqIFVJIE1lbnU6IAorICAgICAqLworICAgIGZvciAoOzspIHsKKwljaGFyIHRtcDFbMTBdOworCWNoYXIgdG1wMlsxMF07CisJY2hhciAqZXJyOworCWludCBzcmMsIGRzdCwgbGV2ZWwsIGR1cjsKKworCXB1dHMoIiIpOworCWNvbmZfbGlzdChjb25mLCAwKTsKKwlwdXRzKCIiKTsKKwlwdXRzKCJNZW51OiIpOworCXB1dHMoIiAgcyAgICBTaG93IHBvcnRzIGRldGFpbHMiKTsKKwlwdXRzKCIgIGMgICAgQ29ubmVjdCBvbmUgcG9ydCB0byBhbm90aGVyIik7CisJcHV0cygiICBkICAgIERpc2Nvbm5lY3QgcG9ydCBjb25uZWN0aW9uIik7CisJcHV0cygiICB0ICAgIEFkanVzdCBzaWduYWwgbGV2ZWwgdHJhbnNtaXR0ZWQgKHR4KSB0byBhIHBvcnQiKTsKKwlwdXRzKCIgIHIgICAgQWRqdXN0IHNpZ25hbCBsZXZlbCByZWNlaXZlZCAocngpIGZyb20gYSBwb3J0Iik7CisJcHV0cygiICB2ICAgIERpc3BsYXkgVlUgbWV0ZXIgZm9yIGEgcGFydGljdWxhciBwb3J0Iik7CisJcHV0cygiICBxICAgIFF1aXQiKTsKKwlwdXRzKCIiKTsKKwkKKwlwcmludGYoIkVudGVyIHNlbGVjdGlvbjogIik7IGZmbHVzaChzdGRvdXQpOworCisJaWYgKGZnZXRzKHRtcCwgc2l6ZW9mKHRtcCksIHN0ZGluKSA9PSBOVUxMKQorCSAgICBicmVhazsKKworCXN3aXRjaCAodG1wWzBdKSB7CisJY2FzZSAncyc6CisJICAgIHB1dHMoIiIpOworCSAgICBjb25mX2xpc3QoY29uZiwgMSk7CisJICAgIGJyZWFrOworCisJY2FzZSAnYyc6CisJICAgIHB1dHMoIiIpOworCSAgICBwdXRzKCJDb25uZWN0IHNvdXJjZSBwb3J0IHRvIGRlc3RpbmF0aW9uIHBvcnQiKTsKKwkgICAgaWYgKCFpbnB1dCgiRW50ZXIgc291cmNlIHBvcnQgbnVtYmVyIiwgdG1wMSwgc2l6ZW9mKHRtcDEpKSApCisJCWNvbnRpbnVlOworCSAgICBzcmMgPSBzdHJ0b2wodG1wMSwgJmVyciwgMTApOworCSAgICBpZiAoKmVyciB8fCBzcmMgPCAwIHx8IHNyYyA+PSBwb3J0X2NvdW50KSB7CisJCXB1dHMoIkludmFsaWQgc2xvdCBudW1iZXIiKTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBpZiAoIWlucHV0KCJFbnRlciBkZXN0aW5hdGlvbiBwb3J0IG51bWJlciIsIHRtcDIsIHNpemVvZih0bXAyKSkgKQorCQljb250aW51ZTsKKwkgICAgZHN0ID0gc3RydG9sKHRtcDIsICZlcnIsIDEwKTsKKwkgICAgaWYgKCplcnIgfHwgZHN0IDwgMCB8fCBkc3QgPj0gcG9ydF9jb3VudCkgeworCQlwdXRzKCJJbnZhbGlkIHNsb3QgbnVtYmVyIik7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgc3RhdHVzID0gcGptZWRpYV9jb25mX2Nvbm5lY3RfcG9ydChjb25mLCBzcmMsIGRzdCwgMCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjb25uZWN0aW5nIHBvcnQiLCBzdGF0dXMpOworCSAgICAKKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgICAgcHV0cygiIik7CisJICAgIHB1dHMoIkRpc2Nvbm5lY3QgcG9ydCBjb25uZWN0aW9uIik7CisJICAgIGlmICghaW5wdXQoIkVudGVyIHNvdXJjZSBwb3J0IG51bWJlciIsIHRtcDEsIHNpemVvZih0bXAxKSkgKQorCQljb250aW51ZTsKKwkgICAgc3JjID0gc3RydG9sKHRtcDEsICZlcnIsIDEwKTsKKwkgICAgaWYgKCplcnIgfHwgc3JjIDwgMCB8fCBzcmMgPj0gcG9ydF9jb3VudCkgeworCQlwdXRzKCJJbnZhbGlkIHNsb3QgbnVtYmVyIik7CisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgICAgaWYgKCFpbnB1dCgiRW50ZXIgZGVzdGluYXRpb24gcG9ydCBudW1iZXIiLCB0bXAyLCBzaXplb2YodG1wMikpICkKKwkJY29udGludWU7CisJICAgIGRzdCA9IHN0cnRvbCh0bXAyLCAmZXJyLCAxMCk7CisJICAgIGlmICgqZXJyIHx8IGRzdCA8IDAgfHwgZHN0ID49IHBvcnRfY291bnQpIHsKKwkJcHV0cygiSW52YWxpZCBzbG90IG51bWJlciIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfY29uZl9kaXNjb25uZWN0X3BvcnQoY29uZiwgc3JjLCBkc3QpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgY29ubmVjdGluZyBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgCisKKwkgICAgYnJlYWs7CisKKwljYXNlICd0JzoKKwkgICAgcHV0cygiIik7CisJICAgIHB1dHMoIkFkanVzdCB0cmFuc21pdCBsZXZlbCBvZiBhIHBvcnQiKTsKKwkgICAgaWYgKCFpbnB1dCgiRW50ZXIgcG9ydCBudW1iZXIiLCB0bXAxLCBzaXplb2YodG1wMSkpICkKKwkJY29udGludWU7CisJICAgIHNyYyA9IHN0cnRvbCh0bXAxLCAmZXJyLCAxMCk7CisJICAgIGlmICgqZXJyIHx8IHNyYyA8IDAgfHwgc3JjID49IHBvcnRfY291bnQpIHsKKwkJcHV0cygiSW52YWxpZCBzbG90IG51bWJlciIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIGlmICghaW5wdXQoIkVudGVyIGxldmVsICgtMTI4IHRvID4xMjcsIDAgZm9yIG5vcm1hbCkiLCAKKwkJCSAgICAgIHRtcDIsIHNpemVvZih0bXAyKSkgKQorCQljb250aW51ZTsKKwkgICAgbGV2ZWwgPSBzdHJ0b2wodG1wMiwgJmVyciwgMTApOworCSAgICBpZiAoKmVyciB8fCBsZXZlbCA8IC0xMjgpIHsKKwkJcHV0cygiSW52YWxpZCBsZXZlbCIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfY29uZl9hZGp1c3RfdHhfbGV2ZWwoIGNvbmYsIHNyYywgbGV2ZWwpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgYWRqdXN0aW5nIGxldmVsIiwgc3RhdHVzKTsKKwkgICAgYnJlYWs7CisKKworCWNhc2UgJ3InOgorCSAgICBwdXRzKCIiKTsKKwkgICAgcHV0cygiQWRqdXN0IHJlY2VpdmUgbGV2ZWwgb2YgYSBwb3J0Iik7CisJICAgIGlmICghaW5wdXQoIkVudGVyIHBvcnQgbnVtYmVyIiwgdG1wMSwgc2l6ZW9mKHRtcDEpKSApCisJCWNvbnRpbnVlOworCSAgICBzcmMgPSBzdHJ0b2wodG1wMSwgJmVyciwgMTApOworCSAgICBpZiAoKmVyciB8fCBzcmMgPCAwIHx8IHNyYyA+PSBwb3J0X2NvdW50KSB7CisJCXB1dHMoIkludmFsaWQgc2xvdCBudW1iZXIiKTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBpZiAoIWlucHV0KCJFbnRlciBsZXZlbCAoLTEyOCB0byA+MTI3LCAwIGZvciBub3JtYWwpIiwgCisJCQkgICAgICB0bXAyLCBzaXplb2YodG1wMikpICkKKwkJY29udGludWU7CisJICAgIGxldmVsID0gc3RydG9sKHRtcDIsICZlcnIsIDEwKTsKKwkgICAgaWYgKCplcnIgfHwgbGV2ZWwgPCAtMTI4KSB7CisJCXB1dHMoIkludmFsaWQgbGV2ZWwiKTsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBzdGF0dXMgPSBwam1lZGlhX2NvbmZfYWRqdXN0X3J4X2xldmVsKCBjb25mLCBzcmMsIGxldmVsKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIGFkanVzdGluZyBsZXZlbCIsIHN0YXR1cyk7CisJICAgIGJyZWFrOworCisJY2FzZSAndic6CisJICAgIHB1dHMoIiIpOworCSAgICBwdXRzKCJEaXNwbGF5IFZVIG1ldGVyIik7CisJICAgIGlmICghaW5wdXQoIkVudGVyIHBvcnQgbnVtYmVyIHRvIG1vbml0b3IiLCB0bXAxLCBzaXplb2YodG1wMSkpICkKKwkJY29udGludWU7CisJICAgIHNyYyA9IHN0cnRvbCh0bXAxLCAmZXJyLCAxMCk7CisJICAgIGlmICgqZXJyIHx8IHNyYyA8IDAgfHwgc3JjID49IHBvcnRfY291bnQpIHsKKwkJcHV0cygiSW52YWxpZCBzbG90IG51bWJlciIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIGlmICghaW5wdXQoIkVudGVyIHIgZm9yIHJ4IGxldmVsIG9yIHQgZm9yIHR4IGxldmVsIiwgdG1wMiwgc2l6ZW9mKHRtcDIpKSkKKwkJY29udGludWU7CisJICAgIGlmICh0bXAyWzBdICE9ICdyJyAmJiB0bXAyWzBdICE9ICd0JykgeworCQlwdXRzKCJJbnZhbGlkIG9wdGlvbiIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIGlmICghaW5wdXQoIkR1cmF0aW9uIHRvIG1vbml0b3IgKGluIHNlY29uZHMpIiwgdG1wMSwgc2l6ZW9mKHRtcDEpKSApCisJCWNvbnRpbnVlOworCSAgICBkdXIgPSBzdHJ0b2wodG1wMSwgJmVyciwgMTApOworCSAgICBpZiAoKmVycikgeworCQlwdXRzKCJJbnZhbGlkIGR1cmF0aW9uIG51bWJlciIpOworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIG1vbml0b3JfbGV2ZWwoY29uZiwgc3JjLCB0bXAyWzBdLCBkdXIpOworCSAgICBicmVhazsKKworCWNhc2UgJ3EnOgorCSAgICBnb3RvIG9uX3F1aXQ7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGYoIkludmFsaWQgaW5wdXQgY2hhcmFjdGVyICclYydcbiIsIHRtcFswXSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKK29uX3F1aXQ6CisgICAgCisgICAgLyogU3RhcnQgZGVpbml0aWFsaXphdGlvbjogKi8KKworICAgIC8qIERlc3Ryb3kgY29uZmVyZW5jZSBicmlkZ2UgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvbmZfZGVzdHJveSggY29uZiApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBEZXN0cm95IGZpbGUgcG9ydHMgKi8KKyAgICBmb3IgKGk9MDsgaTxmaWxlX2NvdW50OyArK2kpIHsKKwlzdGF0dXMgPSBwam1lZGlhX3BvcnRfZGVzdHJveSggZmlsZV9wb3J0W2ldKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IHJlY29yZGVyIHBvcnQgKi8KKyAgICBpZiAocmVjX3BvcnQpCisJcGptZWRpYV9wb3J0X2Rlc3Ryb3kocmVjX3BvcnQpOworCisgICAgLyogUmVsZWFzZSBhcHBsaWNhdGlvbiBwb29sICovCisgICAgcGpfcG9vbF9yZWxlYXNlKCBwb29sICk7CisKKyAgICAvKiBEZXN0cm95IG1lZGlhIGVuZHBvaW50LiAqLworICAgIHBqbWVkaWFfZW5kcHRfZGVzdHJveSggbWVkX2VuZHB0ICk7CisKKyAgICAvKiBEZXN0cm95IHBvb2wgZmFjdG9yeSAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCAmY3AgKTsKKworICAgIC8qIFNodXRkb3duIFBKTElCICovCisgICAgcGpfc2h1dGRvd24oKTsKKworICAgIC8qIERvbmUuICovCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIExpc3QgdGhlIHBvcnRzIGluIGNvbmZlcmVuY2UgYnJpZGdlCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZfbGlzdChwam1lZGlhX2NvbmYgKmNvbmYsIGludCBkZXRhaWwpCit7CisgICAgZW51bSB7IE1BWF9QT1JUUyA9IDMyIH07CisgICAgdW5zaWduZWQgaSwgY291bnQ7CisgICAgcGptZWRpYV9jb25mX3BvcnRfaW5mbyBpbmZvW01BWF9QT1JUU107CisKKyAgICBwcmludGYoIkNvbmZlcmVuY2UgcG9ydHM6XG4iKTsKKworICAgIGNvdW50ID0gUEpfQVJSQVlfU0laRShpbmZvKTsKKyAgICBwam1lZGlhX2NvbmZfZ2V0X3BvcnRzX2luZm8oY29uZiwgJmNvdW50LCBpbmZvKTsKKworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwljaGFyIHR4bGlzdFs0Kk1BWF9QT1JUU107CisJdW5zaWduZWQgajsKKwlwam1lZGlhX2NvbmZfcG9ydF9pbmZvICpwb3J0X2luZm8gPSAmaW5mb1tpXTsJCisJCisJdHhsaXN0WzBdID0gJ1wwJzsKKwlmb3IgKGo9MDsgajxwb3J0X2luZm8tPmxpc3RlbmVyX2NudDsgKytqKSB7CisJICAgIGNoYXIgc1sxMF07CisJICAgIHBqX2Fuc2lfc3ByaW50ZihzLCAiIyVkICIsIHBvcnRfaW5mby0+bGlzdGVuZXJfc2xvdHNbal0pOworCSAgICBwal9hbnNpX3N0cmNhdCh0eGxpc3QsIHMpOworCisJfQorCisJaWYgKHR4bGlzdFswXSA9PSAnXDAnKSB7CisJICAgIHR4bGlzdFswXSA9ICctJzsKKwkgICAgdHhsaXN0WzFdID0gJ1wwJzsKKwl9CisKKwlpZiAoIWRldGFpbCkgeworCSAgICBwcmludGYoIlBvcnQgIyUwMmQgJS0yNS4qcyAgdHJhbnNtaXR0aW5nIHRvOiAlc1xuIiwgCisJCSAgIHBvcnRfaW5mby0+c2xvdCwgCisJCSAgIChpbnQpcG9ydF9pbmZvLT5uYW1lLnNsZW4sIAorCQkgICBwb3J0X2luZm8tPm5hbWUucHRyLAorCQkgICB0eGxpc3QpOworCX0gZWxzZSB7CisJICAgIHVuc2lnbmVkIHR4X2xldmVsLCByeF9sZXZlbDsKKworCSAgICBwam1lZGlhX2NvbmZfZ2V0X3NpZ25hbF9sZXZlbChjb25mLCBwb3J0X2luZm8tPnNsb3QsCisJCQkJCSAgJnR4X2xldmVsLCAmcnhfbGV2ZWwpOworCisJICAgIHByaW50ZigiUG9ydCAjJTAyZDpcbiIKKwkJICAgIiAgTmFtZSAgICAgICAgICAgICAgICAgICAgOiAlLipzXG4iCisJCSAgICIgIFNhbXBsaW5nIHJhdGUgICAgICAgICAgIDogJWQgSHpcbiIKKwkJICAgIiAgU2FtcGxlcyBwZXIgZnJhbWUgICAgICAgOiAlZFxuIgorCQkgICAiICBGcmFtZSB0aW1lICAgICAgICAgICAgICA6ICVkIG1zXG4iCisJCSAgICIgIFNpZ25hbCBsZXZlbCBhZGp1c3RtZW50IDogdHg9JWQsIHJ4PSVkXG4iCisJCSAgICIgIEN1cnJlbnQgc2lnbmFsIGxldmVsICAgIDogdHg9JXUsIHJ4PSV1XG4iCisJCSAgICIgIFRyYW5zbWl0dGluZyB0byBwb3J0cyAgIDogJXNcblxuIiwKKwkJICAgcG9ydF9pbmZvLT5zbG90LAorCQkgICAoaW50KXBvcnRfaW5mby0+bmFtZS5zbGVuLAorCQkgICBwb3J0X2luZm8tPm5hbWUucHRyLAorCQkgICBwb3J0X2luZm8tPmNsb2NrX3JhdGUsCisJCSAgIHBvcnRfaW5mby0+c2FtcGxlc19wZXJfZnJhbWUsCisJCSAgIHBvcnRfaW5mby0+c2FtcGxlc19wZXJfZnJhbWUqMTAwMC9wb3J0X2luZm8tPmNsb2NrX3JhdGUsCisJCSAgIHBvcnRfaW5mby0+dHhfYWRqX2xldmVsLAorCQkgICBwb3J0X2luZm8tPnJ4X2Fkal9sZXZlbCwKKwkJICAgdHhfbGV2ZWwsCisJCSAgIHJ4X2xldmVsLAorCQkgICB0eGxpc3QpOworCX0KKworICAgIH0KKyAgICBwdXRzKCIiKTsKK30KKworCisvKgorICogRGlzcGxheSBWVSBtZXRlcgorICovCitzdGF0aWMgdm9pZCBtb25pdG9yX2xldmVsKHBqbWVkaWFfY29uZiAqY29uZiwgaW50IHNsb3QsIGludCBkaXIsIGludCBkdXIpCit7CisgICAgZW51bSB7IFNMRUVQID0gMjAsIFNBTVBfQ05UID0gMn07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBpLCB0b3RhbF9jb3VudDsKKyAgICB1bnNpZ25lZCBsZXZlbCwgc2FtcF9jbnQ7CisKKworICAgIHB1dHMoIiIpOworICAgIHByaW50ZigiRGlzcGxheWluZyBWVSBtZXRlciBmb3IgcG9ydCAlZCBmb3IgYWJvdXQgJWQgc2Vjb25kc1xuIiwKKwkgICBzbG90LCBkdXIpOworCisgICAgdG90YWxfY291bnQgPSBkdXIgKiAxMDAwIC8gU0xFRVA7CisKKyAgICBsZXZlbCA9IDA7CisgICAgc2FtcF9jbnQgPSAwOworCisgICAgZm9yIChpPTA7IGk8dG90YWxfY291bnQ7ICsraSkgeworCXVuc2lnbmVkIHR4X2xldmVsLCByeF9sZXZlbDsKKwlpbnQgaiwgbGVuZ3RoOworCWNoYXIgbWV0ZXJbMjFdOworCisJLyogUG9sbCB0aGUgdm9sdW1lIGV2ZXJ5IDIwIG1zZWMgKi8KKwlzdGF0dXMgPSBwam1lZGlhX2NvbmZfZ2V0X3NpZ25hbF9sZXZlbChjb25mLCBzbG90LCAKKwkJCQkJICAgICAgICZ0eF9sZXZlbCwgJnJ4X2xldmVsKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gcmVhZCBsZXZlbCIsIHN0YXR1cyk7CisJICAgIHJldHVybjsKKwl9CisKKwlsZXZlbCArPSAoZGlyPT0ncicgPyByeF9sZXZlbCA6IHR4X2xldmVsKTsKKwkrK3NhbXBfY250OworCisJLyogQWNjdW11bGF0ZSB1bnRpbCB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzICovCisJaWYgKHNhbXBfY250IDwgU0FNUF9DTlQpIHsKKwkgICAgcGpfdGhyZWFkX3NsZWVwKFNMRUVQKTsKKwkgICAgY29udGludWU7CisJfQorCisJLyogR2V0IGF2ZXJhZ2UgKi8KKwlsZXZlbCA9IGxldmVsIC8gc2FtcF9jbnQ7CisKKwkvKiBEcmF3IGJhciAqLworCWxlbmd0aCA9IDIwICogbGV2ZWwgLyAyNTU7CisJZm9yIChqPTA7IGo8bGVuZ3RoOyArK2opCisJICAgIG1ldGVyW2pdID0gJyMnOworCWZvciAoOyBqPDIwOyArK2opCisJICAgIG1ldGVyW2pdID0gJyAnOworCW1ldGVyWzIwXSA9ICdcMCc7CisKKwlwcmludGYoIlBvcnQgIyUwMmQgJWN4IGxldmVsOiBbJXNdICVkICBcciIsCisJICAgICAgIHNsb3QsIGRpciwgbWV0ZXIsIGxldmVsKTsKKworCS8qIE5leHQuLiAqLworCXNhbXBfY250ID0gMDsKKwlsZXZlbCA9IDA7CisKKwlwal90aHJlYWRfc2xlZXAoU0xFRVApOworICAgIH0KKworICAgIHB1dHMoIiIpOworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2RlYnVnLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvZGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjhjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2RlYnVnLmNwcApAQCAtMCwwICsxLDMyIEBACisvKiAkSWQ6IGRlYnVnLmNwcCA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoKKyAqIFBVUlBPU0U6CisgKiAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBhbGxvdyBkZWJ1Z2dpbmcgb2YgYSBzYW1wbGUgYXBwbGljYXRpb24KKyAqICAgdXNpbmcgTVNWQyBJREUuCisgKi8KKworLyogVG8gZGVidWcgYSBzYW1wbGUgYXBwbGljYXRpb24sIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlIGhlcmUuCisgKiBFLmcuOgorICogICNpbmNsdWRlICJwbGF5ZmlsZS5jIgorICovCisjaW5jbHVkZSAiaWNlZGVtby5jIgorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2VuY2RlYy5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9lbmNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVkOTkwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9lbmNkZWMuYwpAQCAtMCwwICsxLDI2MyBAQAorLyogJElkOiBlbmNkZWMuYyAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisgLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19lbmNkZWNfYyBTYW1wbGVzOiBFbmNvZGluZyBhbmQgRGVjb2RpbmcKKyAqCisgKiBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIGNvZGVjLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwanNpcC1hcHBzL3NyYy9zYW1wbGVzL2VuY2RlYy5jCisgKgorICogXGluY2x1ZGVsaW5lbm8gZW5jZGVjLmMKKyAqLworCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJlbmNkZWMuYyIKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyAiIGVuY2RlYwkJCQkJCQkJXG4iCisgIgkJCQkJCQkJCVxuIgorICIgUFVSUE9TRToJCQkJCQkJCVxuIgorICIgIEVuY29kZSBpbnB1dCBXQVYgd2l0aCBhIGNvZGVjLCBhbmQgZGVjb2RlIHRoZSByZXN1bHQgdG8gYW5vdGhlciBXQVYgXG4iCisgIlxuIgorICJcbiIKKyAiIFVTQUdFOgkJCQkJCQkJXG4iCisgIiAgZW5jZGVjIGNvZGVjIGlucHV0LndhdiBvdXRwdXQud2F2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiXG4iCisgIlxuIgorICIgd2hlcmU6XG4iCisgIiAgY29kZWMgICAgICAgICBTZXQgdGhlIGNvZGVjIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiICBpbnB1dC53YXYgICAgIFNldCB0aGUgaW5wdXQgV0FWIGZpbGVuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICIgIG91dHB1dC53YXYgICAgU2V0IHRoZSBvdXRwdXQgV0FWIGZpbGVuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAiXG4iCis7CisKKy8vI3VuZGVmIFBKX1RSQUNFCisvLyNkZWZpbmUgUEpfVFJBQ0UgMQorCisjaWZuZGVmIFBKX1RSQUNFCisjCWRlZmluZSBQSl9UUkFDRSAwCisjZW5kaWYKKworI2lmIFBKX1RSQUNFCisjICAgZGVmaW5lIFRSQUNFXyhleHByKQkgICAgUEpfTE9HKDQsZXhwcikKKyNlbHNlCisjICAgZGVmaW5lIFRSQUNFXyhleHByKQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgZXJyKGNvbnN0IGNoYXIgKm9wLCBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgIFBKX0xPRygzLCgiIiwgIiVzIGVycm9yOiAlcyIsIG9wLCBlcnJtc2cpKTsKK30KKworI2RlZmluZSBDSEVDSyhvcCkgICBkbyB7IFwKKwkJCXN0YXR1cyA9IG9wOyBcCisJCQlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsgXAorCQkJICAgIGVycigjb3AsIHN0YXR1cyk7IFwKKwkJCSAgICByZXR1cm4gc3RhdHVzOyBcCisJCQl9IFwKKwkJICAgIH0gXAorCQkgICAgd2hpbGUgKDApCisKK3N0YXRpYyBwam1lZGlhX2VuZHB0ICptZXB0Oworc3RhdGljIHVuc2lnbmVkIGZpbGVfbXNlY19kdXJhdGlvbjsKKworc3RhdGljIHBqX3N0YXR1c190IGVuY19kZWNfdGVzdChjb25zdCBjaGFyICpjb2RlY19pZCwKKwkJCQljb25zdCBjaGFyICpmaWxlaW4sCisJCQkgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVvdXQpCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqbWVkaWFfY29kZWNfbWdyICpjbTsKKyAgICBwam1lZGlhX2NvZGVjICpjb2RlYzsKKyAgICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKnBjaTsKKyAgICBwam1lZGlhX2NvZGVjX3BhcmFtIHBhcmFtOworICAgIHVuc2lnbmVkIGNudCwgc2FtcGxlc19wZXJfZnJhbWU7CisgICAgcGpfc3RyX3QgdG1wOworICAgIHBqbWVkaWFfcG9ydCAqd2F2aW4sICp3YXZvdXQ7CisgICAgdW5zaWduZWQgbG9zdF9wY3Q7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisjZGVmaW5lIFQgICBmaWxlX21zZWNfZHVyYXRpb24vMTAwMCwgZmlsZV9tc2VjX2R1cmF0aW9uJTEwMDAKKyAgICAKKyAgICBwb29sID0gcGptZWRpYV9lbmRwdF9jcmVhdGVfcG9vbChtZXB0LCAiZW5jZGVjIiwgMTAwMCwgMTAwMCk7CisKKyAgICBjbSA9IHBqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncihtZXB0KTsKKworI2lmZGVmIExPU1RfUENUCisgICAgbG9zdF9wY3QgPSBMT1NUX1BDVDsKKyNlbHNlCisgICAgbG9zdF9wY3QgPSAwOworI2VuZGlmCisgICAgCisgICAgY250ID0gMTsKKyAgICBDSEVDSyggcGptZWRpYV9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQoY20sIHBqX2NzdHIoJnRtcCwgY29kZWNfaWQpLCAKKwkJCQkJICAgICAgICZjbnQsICZwY2ksIE5VTEwpICk7CisgICAgQ0hFQ0soIHBqbWVkaWFfY29kZWNfbWdyX2dldF9kZWZhdWx0X3BhcmFtKGNtLCBwY2ksICZwYXJhbSkgKTsKKworICAgIHNhbXBsZXNfcGVyX2ZyYW1lID0gcGFyYW0uaW5mby5jbG9ja19yYXRlICogcGFyYW0uaW5mby5mcm1fcHRpbWUgLyAxMDAwOworCisgICAgLyogQ29udHJvbCBWQUQgKi8KKyAgICBwYXJhbS5zZXR0aW5nLnZhZCA9IDE7CisKKyAgICAvKiBPcGVuIHdhdiBmb3IgcmVhZGluZyAqLworICAgIENIRUNLKCBwam1lZGlhX3dhdl9wbGF5ZXJfcG9ydF9jcmVhdGUocG9vbCwgZmlsZWluLCAKKwkJCQkJICBwYXJhbS5pbmZvLmZybV9wdGltZSwgCisJCQkJCSAgUEpNRURJQV9GSUxFX05PX0xPT1AsIDAsICZ3YXZpbikgKTsKKworICAgIC8qIE9wZW4gd2F2IGZvciB3cml0aW5nICovCisgICAgQ0hFQ0soIHBqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X2NyZWF0ZShwb29sLCBmaWxlb3V0LAorCQkJCQkgIHBhcmFtLmluZm8uY2xvY2tfcmF0ZSwgCisJCQkJCSAgcGFyYW0uaW5mby5jaGFubmVsX2NudCwKKwkJCQkJICBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICAxNiwgMCwgMCwgJndhdm91dCkgKTsKKworICAgIC8qIEFsbG9jIGNvZGVjICovCisgICAgQ0hFQ0soIHBqbWVkaWFfY29kZWNfbWdyX2FsbG9jX2NvZGVjKGNtLCBwY2ksICZjb2RlYykgKTsKKyAgICBDSEVDSyggcGptZWRpYV9jb2RlY19pbml0KGNvZGVjLCBwb29sKSApOworICAgIENIRUNLKCBwam1lZGlhX2NvZGVjX29wZW4oY29kZWMsICZwYXJhbSkgKTsKKyAgICAKKyAgICBmb3IgKDs7KSB7CisJcGptZWRpYV9mcmFtZSBmcm1fcGNtLCBmcm1fYml0LCBvdXRfZnJtLCBmcmFtZXNbNF07CisJcGpfaW50MTZfdCBwY21idWZbMzIwXTsKKwlwal90aW1lc3RhbXAgdHM7CisJcGpfdWludDhfdCBiaXRzdHJlYW1bMTYwXTsKKworCWZybV9wY20uYnVmID0gKGNoYXIqKXBjbWJ1ZjsKKwlmcm1fcGNtLnNpemUgPSBzYW1wbGVzX3Blcl9mcmFtZSAqIDI7CisKKwkvKiBSZWFkIGZyb20gV0FWICovCisJaWYgKHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUod2F2aW4sICZmcm1fcGNtKSAhPSBQSl9TVUNDRVNTKQorCSAgICBicmVhazsKKwlpZiAoZnJtX3BjbS50eXBlICE9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTykKKwkgICAgYnJlYWs7OworCisJLyogVXBkYXRlIGR1cmF0aW9uICovCisJZmlsZV9tc2VjX2R1cmF0aW9uICs9IHNhbXBsZXNfcGVyX2ZyYW1lICogMTAwMCAvIAorCQkJICAgICAgcGFyYW0uaW5mby5jbG9ja19yYXRlOworCisJLyogRW5jb2RlICovCisJZnJtX2JpdC5idWYgPSBiaXRzdHJlYW07CisJZnJtX2JpdC5zaXplID0gc2l6ZW9mKGJpdHN0cmVhbSk7CisJQ0hFQ0socGptZWRpYV9jb2RlY19lbmNvZGUoY29kZWMsICZmcm1fcGNtLCBzaXplb2YoYml0c3RyZWFtKSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZybV9iaXQpKTsKKworCS8qIE9uIERUWCwgd3JpdGUgemVybyBmcmFtZSB0byB3YXZvdXQgdG8gbWFpbnRhaW4gZHVyYXRpb24gKi8KKwlpZiAoZnJtX2JpdC5zaXplID09IDAgfHwgZnJtX2JpdC50eXBlICE9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTykgeworCSAgICBvdXRfZnJtLmJ1ZiA9IChjaGFyKilwY21idWY7CisJICAgIG91dF9mcm0uc2l6ZSA9IDE2MDsKKwkgICAgQ0hFQ0soIHBqbWVkaWFfcG9ydF9wdXRfZnJhbWUod2F2b3V0LCAmb3V0X2ZybSkgKTsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIlZC4lMDNkIHJlYWQ6ICV1LCBlbmM6ICV1IiwKKwkJICAgIFQsIGZybV9wY20uc2l6ZSwgZnJtX2JpdC5zaXplKSk7CisJICAgIGNvbnRpbnVlOworCX0KKwkKKwkvKiBQYXJzZSB0aGUgYml0c3RyZWFtIChub3QgcmVhbGx5IG5lY2Vzc2FyeSBmb3IgdGhpcyBjYXNlCisJICogc2luY2Ugd2UgYWx3YXlzIGRlY29kZSAxIGZyYW1lLCBidXQgaXQncyBzdGlsbCBnb29kCisJICogZm9yIHRlc3RpbmcpCisJICovCisJdHMudTY0ID0gMDsKKwljbnQgPSBQSl9BUlJBWV9TSVpFKGZyYW1lcyk7CisJQ0hFQ0soIHBqbWVkaWFfY29kZWNfcGFyc2UoY29kZWMsIGJpdHN0cmVhbSwgZnJtX2JpdC5zaXplLCAmdHMsICZjbnQsIAorCQkJICAgICAgICAgICBmcmFtZXMpICk7CisJQ0hFQ0soIChjbnQ9PTEgPyBQSl9TVUNDRVNTIDogLTEpICk7CisKKwkvKiBEZWNvZGUgb3Igc2ltdWxhdGUgcGFja2V0IGxvc3MgKi8KKwlvdXRfZnJtLmJ1ZiA9IChjaGFyKilwY21idWY7CisJb3V0X2ZybS5zaXplID0gc2l6ZW9mKHBjbWJ1Zik7CisJCisJaWYgKChwal9yYW5kKCkgJSAxMDApIDwgKGludClsb3N0X3BjdCkgeworCSAgICAvKiBTaW11bGF0ZSBsb3NzICovCisJICAgIENIRUNLKCBwam1lZGlhX2NvZGVjX3JlY292ZXIoY29kZWMsIHNpemVvZihwY21idWYpLCAmb3V0X2ZybSkgKTsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIlZC4lMDNkIFBhY2tldCBsb3N0IiwgVCkpOworCX0gZWxzZSB7CisJICAgIC8qIERlY29kZSAqLworCSAgICBDSEVDSyggcGptZWRpYV9jb2RlY19kZWNvZGUoY29kZWMsICZmcmFtZXNbMF0sIHNpemVvZihwY21idWYpLCAKKwkJCQkgICAgICZvdXRfZnJtKSApOworCX0KKworCS8qIFdyaXRlIHRvIFdBViAqLworCUNIRUNLKCBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKHdhdm91dCwgJm91dF9mcm0pICk7CisKKwlUUkFDRV8oKFRISVNfRklMRSwgIiVkLiUwM2QgcmVhZDogJXUsIGVuYzogJXUsIGRlYy93cml0ZTogJXUiLAorCQlULCBmcm1fcGNtLnNpemUsIGZybV9iaXQuc2l6ZSwgb3V0X2ZybS5zaXplKSk7CisgICAgfQorCisgICAgLyogQ2xvc2Ugd2F2cyAqLworICAgIHBqbWVkaWFfcG9ydF9kZXN0cm95KHdhdm91dCk7CisgICAgcGptZWRpYV9wb3J0X2Rlc3Ryb3kod2F2aW4pOworCisgICAgLyogQ2xvc2UgY29kZWMgKi8KKyAgICBwam1lZGlhX2NvZGVjX2Nsb3NlKGNvZGVjKTsKKyAgICBwam1lZGlhX2NvZGVjX21ncl9kZWFsbG9jX2NvZGVjKGNtLCBjb2RlYyk7CisKKyAgICAvKiBSZWxlYXNlIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCBjcDsKKyAgICBwal90aW1lX3ZhbCB0MCwgdDE7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKGFyZ2MgIT0gNCkgeworCXB1dHMoZGVzYyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgQ0hFQ0soIHBqX2luaXQoKSApOworICAgIAorICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgTlVMTCwgMCk7CisKKyAgICBDSEVDSyggcGptZWRpYV9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIE5VTEwsIDEsICZtZXB0KSApOworCisgICAgLyogUmVnaXN0ZXIgYWxsIGNvZGVjcyAqLworICAgIENIRUNLKCBwam1lZGlhX2NvZGVjX3JlZ2lzdGVyX2F1ZGlvX2NvZGVjcyhtZXB0LCBOVUxMKSApOworCisgICAgcGpfZ2V0dGltZW9mZGF5KCZ0MCk7CisgICAgc3RhdHVzID0gZW5jX2RlY190ZXN0KGFyZ3ZbMV0sIGFyZ3ZbMl0sIGFyZ3ZbM10pOworICAgIHBqX2dldHRpbWVvZmRheSgmdDEpOworICAgIFBKX1RJTUVfVkFMX1NVQih0MSwgdDApOworCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KG1lcHQpOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjcCk7CisgICAgcGpfc2h1dGRvd24oKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCXB1dHMoIiIpOworCXB1dHMoIlN1Y2Nlc3MiKTsKKwlwcmludGYoIkR1cmF0aW9uOiAlZHMuJTAzZFxuIiwgZmlsZV9tc2VjX2R1cmF0aW9uLzEwMDAsIAorCQkJCSAgICAgICBmaWxlX21zZWNfZHVyYXRpb24lMTAwMCk7CisJcHJpbnRmKCJUaW1lOiAlbGRzLiUwM2xkXG4iLCB0MS5zZWMsIHQxLm1zZWMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2Zvb3RwcmludC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9mb290cHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFiYTFlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9mb290cHJpbnQuYwpAQCAtMCwwICsxLDY1NCBAQAorLyogJElkOiBmb290cHJpbnQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKioKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBzaG93IHRoZSB0eXBpY2FsIGZvb3RwcmludCBvZgorICogdGhlIGFwcGxpY2F0aW9uIHdoZW4gdmFyaW91cyBQSlNJUC9QSk1FRElBIGNvbXBvbmVudHMgYXJlIHVzZWQuCisgKgorICogVGhpcyBmaWxlIHdpbGwgbm90IGJlIGJ1aWxkIGFzIHNhbXBsZXMsIGJ1dCBpbnN0ZWFkIGl0IGlzIGJ1aWxkCisgKiBieSBnZXQtZm9vdHByaW50LnB5IFB5dGhvbiBzY3JpcHQgaW4gcGpzaXAtYXBwcy9idWlsZCBkaXJlY3RvcnkuCisgKi8KKworI2luY2x1ZGUgPHBqc2lwX3VhLmg+CisjaW5jbHVkZSA8cGpzaXBfc2ltcGxlLmg+CisjaW5jbHVkZSA8cGpzaXAuaD4KKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHBqbmF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBBbGwgZmxhZ3M6ICovCisjaWYgMAorI2RlZmluZSBIQVNfUEpMSUIKKworI2RlZmluZSBIQVNfUEpMSUJfU1RVTgorI2RlZmluZSBIQVNfUEpMSUJfR0VUT1BUCisjZGVmaW5lIEhBU19QSkxJQl9YTUwKKyNkZWZpbmUgSEFTX1BKTElCX1NDQU5ORVIKKyNkZWZpbmUgSEFTX1BKTElCX0ROUworI2RlZmluZSBIQVNfUEpMSUJfUkVTT0xWRVIKKyNkZWZpbmUgSEFTX1BKTElCX1NSVl9SRVNPTFZFUgorCisjZGVmaW5lIEhBU19QSkxJQl9DUkMzMgorI2RlZmluZSBIQVNfUEpMSUJfSE1BQ19NRDUKKyNkZWZpbmUgSEFTX1BKTElCX0hNQUNfU0hBMQorCisjZGVmaW5lIEhBU19QSlNJUF9DT1JFX01TR19FTEVNCisjZGVmaW5lIEhBU19QSlNJUF9DT1JFCisjZGVmaW5lIEhBU19QSlNJUF9DT1JFX01TR19VVElMCisKKyNkZWZpbmUgSEFTX1BKU0lQX1VEUF9UUkFOU1BPUlQKKyNkZWZpbmUgSEFTX1BKU0lQX1RDUF9UUkFOU1BPUlQKKyNkZWZpbmUgSEFTX1BKU0lQX1RMU19UUkFOU1BPUlQKKyNkZWZpbmUgSEFTX1BKU0lQX1RSQU5TQUNUSU9OCisjZGVmaW5lIEhBU19QSlNJUF9VQV9MQVlFUgorI2RlZmluZSBIQVNfUEpNRURJQV9TRFAKKyNkZWZpbmUgSEFTX1BKTUVESUFfU0RQX05FR09USUFUT1IKKyNkZWZpbmUgSEFTX1BKU0lQX0FVVEhfQ0xJRU5UCisjZGVmaW5lIEhBU19QSlNJUF9JTlZfU0VTU0lPTgorI2RlZmluZSBIQVNfUEpTSVBfUkVHQworI2RlZmluZSBIQVNfUEpTSVBfRVZFTlRfRlJBTUVXT1JLCisjZGVmaW5lIEhBU19QSlNJUF9DQUxMX1RSQU5TRkVSCisjZGVmaW5lIEhBU19QSlNJUF9QUkVTRU5DRQorI2RlZmluZSBIQVNfUEpTSVBfSVNfQ09NUE9TSU5HCisKKyNkZWZpbmUgSEFTX1BKTkFUSF9TVFVOCisjZGVmaW5lIEhBU19QSk5BVEhfSUNFCisKKyNkZWZpbmUgSEFTX1BKTUVESUEKKyNkZWZpbmUgSEFTX1BKTUVESUFfU05EX0RFVgorI2RlZmluZSBIQVNfUEpNRURJQV9FQworI2RlZmluZSBIQVNfUEpNRURJQV9TTkRfUE9SVAorI2RlZmluZSBIQVNfUEpNRURJQV9SRVNBTVBMRQorI2RlZmluZSBIQVNfUEpNRURJQV9TSUxFTkNFX0RFVAorI2RlZmluZSBIQVNfUEpNRURJQV9QTEMKKyNkZWZpbmUgSEFTX1BKTUVESUFfQ09ORkVSRU5DRQorI2RlZmluZSBIQVNfUEpNRURJQV9NQVNURVJfUE9SVAorI2RlZmluZSBIQVNfUEpNRURJQV9SVFAKKyNkZWZpbmUgSEFTX1BKTUVESUFfUlRDUAorI2RlZmluZSBIQVNfUEpNRURJQV9KQlVGCisjZGVmaW5lIEhBU19QSk1FRElBX1NUUkVBTQorI2RlZmluZSBIQVNfUEpNRURJQV9UT05FR0VOCisjZGVmaW5lIEhBU19QSk1FRElBX1VEUF9UUkFOU1BPUlQKKyNkZWZpbmUgSEFTX1BKTUVESUFfRklMRV9QTEFZRVIKKyNkZWZpbmUgSEFTX1BKTUVESUFfRklMRV9DQVBUVVJFCisjZGVmaW5lIEhBU19QSk1FRElBX01FTV9QTEFZRVIKKyNkZWZpbmUgSEFTX1BKTUVESUFfTUVNX0NBUFRVUkUKKyNkZWZpbmUgSEFTX1BKTUVESUFfSUNFCisKKyNkZWZpbmUgSEFTX1BKTUVESUFfRzcxMV9DT0RFQworI2RlZmluZSBIQVNfUEpNRURJQV9HU01fQ09ERUMKKyNkZWZpbmUgSEFTX1BKTUVESUFfU1BFRVhfQ09ERUMKKyNkZWZpbmUgSEFTX1BKTUVESUFfSUxCQ19DT0RFQworI2VuZGlmCisKKworaW50IGR1bW15X2Z1bmN0aW9uKCkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgCisgICAgc3ByaW50ZihOVUxMLCAiJWQiLCAwKTsKKyAgICByYW5kKCk7CisgICAgCisjaWZkZWYgSEFTX1BKTElCCisgICAgcGpfaW5pdCgpOworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgTlVMTCwgMCk7CisgICAgcGpfYXJyYXlfZXJhc2UoTlVMTCwgMCwgMCwgMCk7CisgICAgcGpfY3JlYXRlX3VuaXF1ZV9zdHJpbmcoTlVMTCwgTlVMTCk7CisgICAgcGpfaGFzaF9jcmVhdGUoTlVMTCwgMCk7CisgICAgcGpfaGFzaF9nZXQoTlVMTCwgTlVMTCwgMCwgTlVMTCk7CisgICAgcGpfaGFzaF9zZXQoTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgcGpfaW9xdWV1ZV9jcmVhdGUoTlVMTCwgMCwgTlVMTCk7CisgICAgcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX3Bvb2xfYWxsb2MoTlVMTCwgMCk7CisgICAgcGpfdGltZXJfaGVhcF9jcmVhdGUoTlVMTCwgMCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSkxJQl9TVFVOCisgICAgcGpzdHVuX2dldF9tYXBwZWRfYWRkcigmY3AuZmFjdG9yeSwgMCwgTlVMTCwgTlVMTCwgODAsIE5VTEwsIDgwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTElCX0dFVE9QVAorICAgIHBqX2dldG9wdF9sb25nKDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisgICAgCisjaWZkZWYgSEFTX1BKTElCX1hNTAorICAgIHBqX3htbF9wYXJzZShOVUxMLCBOVUxMLCAxMDApOworICAgIHBqX3htbF9wcmludChOVUxMLCBOVUxMLCAxMCwgUEpfRkFMU0UpOworICAgIHBqX3htbF9jbG9uZShOVUxMLCBOVUxMKTsKKyAgICBwal94bWxfbm9kZV9uZXcoTlVMTCwgTlVMTCk7CisgICAgcGpfeG1sX2F0dHJfbmV3KE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX3htbF9hZGRfbm9kZShOVUxMLCBOVUxMKTsKKyAgICBwal94bWxfYWRkX2F0dHIoTlVMTCwgTlVMTCk7CisgICAgcGpfeG1sX2ZpbmRfbm9kZShOVUxMLCBOVUxMKTsKKyAgICBwal94bWxfZmluZF9uZXh0X25vZGUoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpfeG1sX2ZpbmRfYXR0cihOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwal94bWxfZmluZChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTElCX1NDQU5ORVIKKyAgICBwal9jaXNfYnVmX2luaXQoTlVMTCk7CisgICAgcGpfY2lzX2luaXQoTlVMTCwgTlVMTCk7CisgICAgcGpfY2lzX2R1cChOVUxMLCBOVUxMKTsKKyAgICBwal9jaXNfYWRkX2FscGhhKE5VTEwpOworICAgIHBqX2Npc19hZGRfc3RyKE5VTEwsIE5VTEwpOworCisgICAgcGpfc2Nhbl9pbml0KE5VTEwsIE5VTEwsIDAsIDAsIE5VTEwpOworICAgIHBqX3NjYW5fZmluaShOVUxMKTsKKyAgICBwal9zY2FuX3BlZWsoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpfc2Nhbl9wZWVrX24oTlVMTCwgMCwgTlVMTCk7CisgICAgcGpfc2Nhbl9wZWVrX3VudGlsKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX3NjYW5fZ2V0KE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX3NjYW5fZ2V0X3VuZXNjYXBlKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX3NjYW5fZ2V0X3F1b3RlKE5VTEwsIDAsIDAsIE5VTEwpOworICAgIHBqX3NjYW5fZ2V0X24oTlVMTCwgMCwgTlVMTCk7CisgICAgcGpfc2Nhbl9nZXRfY2hhcihOVUxMKTsKKyAgICBwal9zY2FuX2dldF91bnRpbChOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwal9zY2FuX3N0cmNtcChOVUxMLCBOVUxMLCAwKTsKKyAgICBwal9zY2FuX3N0cmljbXAoTlVMTCwgTlVMTCwgMCk7CisgICAgcGpfc2Nhbl9zdHJpY21wX2FsbnVtKE5VTEwsIE5VTEwsIDApOworICAgIHBqX3NjYW5fZ2V0X25ld2xpbmUoTlVMTCk7CisgICAgcGpfc2Nhbl9yZXN0b3JlX3N0YXRlKE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpMSUJfRE5TCisgICAgcGpfZG5zX21ha2VfcXVlcnkoTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgcGpfZG5zX3BhcnNlX3BhY2tldChOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICBwal9kbnNfcGFja2V0X2R1cChOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTElCX1JFU09MVkVSCisgICAgcGpfZG5zX3Jlc29sdmVyX2NyZWF0ZShOVUxMLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwal9kbnNfcmVzb2x2ZXJfc2V0X25zKE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgIHBqX2Ruc19yZXNvbHZlcl9oYW5kbGVfZXZlbnRzKE5VTEwsIE5VTEwpOworICAgIHBqX2Ruc19yZXNvbHZlcl9kZXN0cm95KE5VTEwsIDApOworICAgIHBqX2Ruc19yZXNvbHZlcl9zdGFydF9xdWVyeShOVUxMLCBOVUxMLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwal9kbnNfcmVzb2x2ZXJfY2FuY2VsX3F1ZXJ5KE5VTEwsIDApOworICAgIHBqX2Ruc19yZXNvbHZlcl9hZGRfZW50cnkoTlVMTCwgTlVMTCwgMCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSkxJQl9TUlZfUkVTT0xWRVIKKyAgICBwal9kbnNfc3J2X3Jlc29sdmUoTlVMTCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgUEpfRkFMU0UsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpMSUJfQ1JDMzIKKyAgICBwal9jcmMzMl9pbml0KE5VTEwpOworICAgIHBqX2NyYzMyX3VwZGF0ZShOVUxMLCBOVUxMLCAwKTsKKyAgICBwal9jcmMzMl9maW5hbChOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTElCX0hNQUNfTUQ1CisgICAgcGpfaG1hY19tZDUoTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSkxJQl9ITUFDX1NIQTEKKyAgICBwal9obWFjX3NoYTEoTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk5BVEhfU1RVTgorICAgIHBqX3N0dW5fc2Vzc2lvbl9jcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCwgUEpfRkFMU0UsIE5VTEwpOworICAgIHBqX3N0dW5fc2Vzc2lvbl9kZXN0cm95KE5VTEwpOworICAgIHBqX3N0dW5fc2Vzc2lvbl9zZXRfY3JlZGVudGlhbChOVUxMLCBOVUxMKTsKKyAgICBwal9zdHVuX3Nlc3Npb25fY3JlYXRlX3JlcShOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBwal9zdHVuX3Nlc3Npb25fY3JlYXRlX2luZChOVUxMLCAwLCBOVUxMKTsKKyAgICBwal9zdHVuX3Nlc3Npb25fY3JlYXRlX3JlcyhOVUxMLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgICBwal9zdHVuX3Nlc3Npb25fc2VuZF9tc2coTlVMTCwgUEpfRkFMU0UsIE5VTEwsIDAsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpOQVRIX0lDRQorICAgIHBqX2ljZV9zdHJhbnNfY3JlYXRlKE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX2ljZV9zdHJhbnNfc2V0X3N0dW5fZG9tYWluKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqX2ljZV9zdHJhbnNfY3JlYXRlX2NvbXAoTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgcGpfaWNlX3N0cmFuc19hZGRfY2FuZChOVUxMLCAwLCBQSl9JQ0VfQ0FORF9UWVBFX0hPU1QsIDAsIE5VTEwsIFBKX0ZBTFNFKTsKKyAgICBwal9pY2Vfc3RyYW5zX2luaXRfaWNlKE5VTEwsIFBKX0lDRV9TRVNTX1JPTEVfQ09OVFJPTExFRCwgTlVMTCwgTlVMTCk7CisgICAgcGpfaWNlX3N0cmFuc19zdGFydF9pY2UoTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7CisgICAgcGpfaWNlX3N0cmFuc19zdG9wX2ljZShOVUxMKTsKKyAgICBwal9pY2Vfc3RyYW5zX3NlbmR0byhOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX0NPUkVfTVNHX0VMRU0KKyAgICAvKiBQYXJhbWV0ZXIgY29udGFpbmVyICovCisgICAgcGpzaXBfcGFyYW1fZmluZChOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9wYXJhbV9wcmludF9vbihOVUxMLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAwKTsKKworICAgIC8qIFNJUCBVUkkgKi8KKyAgICBwanNpcF9zaXBfdXJpX2NyZWF0ZShOVUxMLCAwKTsKKyAgICBwanNpcF9uYW1lX2FkZHJfY3JlYXRlKE5VTEwpOworCisgICAgLyogVEVMIFVSSSAqLworICAgIHBqc2lwX3RlbF91cmlfY3JlYXRlKE5VTEwpOworCisgICAgLyogTWVzc2FnZSBhbmQgaGVhZGVycyAqLworICAgIHBqc2lwX21zZ19jcmVhdGUoTlVMTCwgUEpTSVBfUkVRVUVTVF9NU0cpOworICAgIHBqc2lwX21zZ19wcmludChOVUxMLCBOVUxMLCAwKTsKKyAgICBwanNpcF9hY2NlcHRfaGRyX2NyZWF0ZShOVUxMKTsKKyAgICBwanNpcF9hbGxvd19oZHJfY3JlYXRlKE5VTEwpOworICAgIHBqc2lwX2NpZF9oZHJfY3JlYXRlKE5VTEwpOworICAgIHBqc2lwX2NsZW5faGRyX2NyZWF0ZShOVUxMKTsKKyAgICBwanNpcF9jc2VxX2hkcl9jcmVhdGUoTlVMTCk7CisgICAgcGpzaXBfY29udGFjdF9oZHJfY3JlYXRlKE5VTEwpOworICAgIHBqc2lwX2N0eXBlX2hkcl9jcmVhdGUoTlVMTCk7CisgICAgcGpzaXBfZXhwaXJlc19oZHJfY3JlYXRlKE5VTEwsIDApOworICAgIHBqc2lwX2Zyb21faGRyX2NyZWF0ZShOVUxMKTsKKyAgICBwanNpcF9tYXhfZndkX2hkcl9jcmVhdGUoTlVMTCwgMCk7CisgICAgcGpzaXBfbWluX2V4cGlyZXNfaGRyX2NyZWF0ZShOVUxMLCAwKTsKKyAgICBwanNpcF9ycl9oZHJfY3JlYXRlKE5VTEwpOworICAgIHBqc2lwX3JlcXVpcmVfaGRyX2NyZWF0ZShOVUxMKTsKKyAgICBwanNpcF9yZXRyeV9hZnRlcl9oZHJfY3JlYXRlKE5VTEwsIDApOworICAgIHBqc2lwX3N1cHBvcnRlZF9oZHJfY3JlYXRlKE5VTEwpOworICAgIHBqc2lwX3Vuc3VwcG9ydGVkX2hkcl9jcmVhdGUoTlVMTCk7CisgICAgcGpzaXBfdmlhX2hkcl9jcmVhdGUoTlVMTCk7CisgICAgcGpzaXBfd2FybmluZ19oZHJfY3JlYXRlKE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCisgICAgcGpzaXBfcGFyc2VfdXJpKE5VTEwsIE5VTEwsIDAsIDApOworICAgIHBqc2lwX3BhcnNlX21zZyhOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICBwanNpcF9wYXJzZV9yZGF0YShOVUxMLCAwLCBOVUxMKTsKKyAgICBwanNpcF9maW5kX21zZyhOVUxMLCAwLCAwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX0NPUkUKKyAgICBwanNpcF9lbmRwdF9jcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICBwanNpcF90cG1ncl9jcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfdHBtZ3JfZGVzdHJveShOVUxMKTsKKyAgICBwanNpcF90cmFuc3BvcnRfc2VuZChOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKworCisjZW5kaWYKKworI2lmZGVmIEhBU19QSlNJUF9DT1JFX01TR19VVElMCisgICAgcGpzaXBfZW5kcHRfY3JlYXRlX3JlcXVlc3QoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCSAgICAgICAtMSwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZW5kcHRfY3JlYXRlX3JlcXVlc3RfZnJvbV9oZHIoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgLTEsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZShOVUxMLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZW5kcHRfY3JlYXRlX2FjayhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9lbmRwdF9jcmVhdGVfY2FuY2VsKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2dldF9yZXF1ZXN0X2Rlc3QoTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZW5kcHRfc2VuZF9yZXF1ZXN0X3N0YXRlbGVzcyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9nZXRfcmVzcG9uc2VfYWRkcihOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9lbmRwdF9zZW5kX3Jlc3BvbnNlKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKE5VTEwsIE5VTEwsIC0xLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX1VEUF9UUkFOU1BPUlQKKyAgICBwanNpcF91ZHBfdHJhbnNwb3J0X3N0YXJ0KE5VTEwsIE5VTEwsIE5VTEwsIDEsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpTSVBfVENQX1RSQU5TUE9SVAorICAgIHBqc2lwX3RjcF90cmFuc3BvcnRfc3RhcnQoTlVMTCwgTlVMTCwgMSwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSlNJUF9UTFNfVFJBTlNQT1JUCisgICAgcGpzaXBfdGxzX3RyYW5zcG9ydF9zdGFydChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX1RSQU5TQUNUSU9OCisgICAgcGpzaXBfdHN4X2xheWVyX2luaXRfbW9kdWxlKE5VTEwpOworCisgICAgcGpzaXBfdHN4X2xheWVyX2Rlc3Ryb3koKTsKKyAgICBwanNpcF90c3hfY3JlYXRlX3VhYyhOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF90c3hfY3JlYXRlX3VhcyhOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF90c3hfcmVjdl9tc2coTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfdHN4X3NlbmRfbXNnKE5VTEwsIE5VTEwpOworICAgIHBqc2lwX3RzeF90ZXJtaW5hdGUoTlVMTCwgMjAwKTsKKworICAgIHBqc2lwX2VuZHB0X3NlbmRfcmVxdWVzdChOVUxMLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZW5kcHRfcmVzcG9uZChOVUxMLCBOVUxMLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX1NEUAorICAgIHBqbWVkaWFfc2RwX3BhcnNlKE5VTEwsIE5VTEwsIDEwMjQsIE5VTEwpOworICAgIHBqbWVkaWFfc2RwX3ByaW50KE5VTEwsIE5VTEwsIDEwMjQpOworICAgIHBqbWVkaWFfc2RwX3ZhbGlkYXRlKE5VTEwpOworICAgIHBqbWVkaWFfc2RwX3Nlc3Npb25fY2xvbmUoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zZHBfc2Vzc2lvbl9jbXAoTlVMTCwgTlVMTCwgMCk7CisgICAgcGptZWRpYV9zZHBfYXR0cl90b19ydHBtYXAoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zZHBfYXR0cl9nZXRfZm10cChOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX3NkcF9hdHRyX2dldF9ydGNwKE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfc2RwX2Nvbm5fY2xvbmUoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zZHBfbWVkaWFfY2xvbmUoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zZHBfbWVkaWFfZmluZF9hdHRyKE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9TRFBfTkVHT1RJQVRPUgorICAgIHBqbWVkaWFfc2RwX25lZ19jcmVhdGVfd19sb2NhbF9vZmZlcihOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX3NkcF9uZWdfY3JlYXRlX3dfcmVtb3RlX29mZmVyKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfc2RwX25lZ19nZXRfc3RhdGUoTlVMTCk7CisgICAgcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZShOVUxMLCBOVUxMLCBQSl9GQUxTRSk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSlNJUF9VQV9MQVlFUgorICAgIHBqc2lwX3VhX2luaXRfbW9kdWxlKE5VTEwsIE5VTEwpOworICAgIHBqc2lwX3VhX2Rlc3Ryb3koKTsKKyAgICBwanNpcF9kbGdfY3JlYXRlX3VhYyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9kbGdfY3JlYXRlX3VhcyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9kbGdfdGVybWluYXRlKE5VTEwpOworICAgIHBqc2lwX2RsZ19zZXRfcm91dGVfc2V0KE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2RsZ19jcmVhdGVfcmVxdWVzdChOVUxMLCBOVUxMLCAtMSwgTlVMTCk7CisgICAgcGpzaXBfZGxnX3NlbmRfcmVxdWVzdChOVUxMLCBOVUxMLCAtMSwgTlVMTCk7CisgICAgcGpzaXBfZGxnX2NyZWF0ZV9yZXNwb25zZShOVUxMLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZGxnX21vZGlmeV9yZXNwb25zZShOVUxMLCBOVUxMLCAtMSwgTlVMTCk7CisgICAgcGpzaXBfZGxnX3NlbmRfcmVzcG9uc2UoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZGxnX3Jlc3BvbmQoTlVMTCwgTlVMTCwgLTEsIE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpTSVBfQVVUSF9DTElFTlQKKyAgICBwanNpcF9hdXRoX2NsdF9pbml0KE5VTEwsIE5VTEwsIE5VTEwsIDApOworICAgIHBqc2lwX2F1dGhfY2x0X2Nsb25lKE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2F1dGhfY2x0X3NldF9jcmVkZW50aWFscyhOVUxMLCAwLCBOVUxMKTsKKyAgICBwanNpcF9hdXRoX2NsdF9pbml0X3JlcShOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9hdXRoX2NsdF9yZWluaXRfcmVxKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpTSVBfSU5WX1NFU1NJT04KKyAgICBwanNpcF9pbnZfdXNhZ2VfaW5pdChOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9pbnZfY3JlYXRlX3VhYyhOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICBwanNpcF9pbnZfdmVyaWZ5X3JlcXVlc3QoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfaW52X2NyZWF0ZV91YXMoTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7CisgICAgcGpzaXBfaW52X3Rlcm1pbmF0ZShOVUxMLCAyMDAsIFBKX0ZBTFNFKTsKKyAgICBwanNpcF9pbnZfaW52aXRlKE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2ludl9pbml0aWFsX2Fuc3dlcihOVUxMLCBOVUxMLCAyMDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2ludl9hbnN3ZXIoTlVMTCwgMjAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9pbnZfZW5kX3Nlc3Npb24oTlVMTCwgMjAwLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9pbnZfcmVpbnZpdGUoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfaW52X3VwZGF0ZShOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9pbnZfc2VuZF9tc2coTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfZGxnX2dldF9pbnZfc2Vzc2lvbihOVUxMKTsKKyAgICAvL3Bqc2lwX3RzeF9nZXRfaW52X3Nlc3Npb24oTlVMTCk7CisgICAgcGpzaXBfaW52X3N0YXRlX25hbWUoUEpTSVBfSU5WX1NUQVRFX05VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpTSVBfUkVHQworICAgIC8vcGpzaXBfcmVnY19nZXRfbW9kdWxlKCk7CisgICAgcGpzaXBfcmVnY19jcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfcmVnY19kZXN0cm95KE5VTEwpOworICAgIHBqc2lwX3JlZ2NfZ2V0X2luZm8oTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfcmVnY19nZXRfcG9vbChOVUxMKTsKKyAgICBwanNpcF9yZWdjX2luaXQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCwgNjAwKTsKKyAgICBwanNpcF9yZWdjX3NldF9jcmVkZW50aWFscyhOVUxMLCAxLCBOVUxMKTsKKyAgICBwanNpcF9yZWdjX3NldF9yb3V0ZV9zZXQoTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfcmVnY19yZWdpc3RlcihOVUxMLCBQSl9UUlVFLCBOVUxMKTsKKyAgICBwanNpcF9yZWdjX3VucmVnaXN0ZXIoTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfcmVnY191cGRhdGVfY29udGFjdChOVUxMLCAxMCwgTlVMTCk7CisgICAgcGpzaXBfcmVnY191cGRhdGVfZXhwaXJlcyhOVUxMLCA2MDApOworICAgIHBqc2lwX3JlZ2Nfc2VuZChOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX0VWRU5UX0ZSQU1FV09SSworICAgIHBqc2lwX2V2c3ViX2luaXRfbW9kdWxlKE5VTEwpOworICAgIHBqc2lwX2V2c3ViX2luc3RhbmNlKCk7CisgICAgcGpzaXBfZXZzdWJfcmVnaXN0ZXJfcGtnKE5VTEwsIE5VTEwsIDMwLCAxMCwgTlVMTCk7CisgICAgcGpzaXBfZXZzdWJfY3JlYXRlX3VhYyhOVUxMLCBOVUxMLCBOVUxMLCAxMCwgTlVMTCk7CisgICAgcGpzaXBfZXZzdWJfY3JlYXRlX3VhcyhOVUxMLCBOVUxMLCBOVUxMLCAxMCwgTlVMTCk7CisgICAgcGpzaXBfZXZzdWJfdGVybWluYXRlKE5VTEwsIFBKX0ZBTFNFKTsKKyAgICBwanNpcF9ldnN1Yl9nZXRfc3RhdGUoTlVMTCk7CisgICAgcGpzaXBfZXZzdWJfZ2V0X3N0YXRlX25hbWUoTlVMTCk7CisgICAgcGpzaXBfZXZzdWJfaW5pdGlhdGUoTlVMTCwgTlVMTCwgLTEsIE5VTEwpOworICAgIHBqc2lwX2V2c3ViX2FjY2VwdChOVUxMLCBOVUxMLCAyMDAsIE5VTEwpOworICAgIHBqc2lwX2V2c3ViX25vdGlmeShOVUxMLCBQSlNJUF9FVlNVQl9TVEFURV9BQ1RJVkUsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2V2c3ViX2N1cnJlbnRfbm90aWZ5KE5VTEwsIE5VTEwpOworICAgIHBqc2lwX2V2c3ViX3NlbmRfcmVxdWVzdChOVUxMLCBOVUxMKTsKKyAgICBwanNpcF90c3hfZ2V0X2V2c3ViKE5VTEwpOworICAgIHBqc2lwX2V2c3ViX3NldF9tb2RfZGF0YShOVUxMLCAxLCBOVUxMKTsKKyAgICBwanNpcF9ldnN1Yl9nZXRfbW9kX2RhdGEoTlVMTCwgMSk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSlNJUF9DQUxMX1RSQU5TRkVSCisgICAgcGpzaXBfeGZlcl9pbml0X21vZHVsZShOVUxMKTsKKyAgICBwanNpcF94ZmVyX2NyZWF0ZV91YWMoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfeGZlcl9jcmVhdGVfdWFzKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqc2lwX3hmZXJfaW5pdGlhdGUoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfeGZlcl9hY2NlcHQoTlVMTCwgTlVMTCwgMjAwLCBOVUxMKTsKKyAgICBwanNpcF94ZmVyX25vdGlmeShOVUxMLCBQSlNJUF9FVlNVQl9TVEFURV9BQ1RJVkUsIDIwMCwgTlVMTCwgTlVMTCk7CisgICAgcGpzaXBfeGZlcl9jdXJyZW50X25vdGlmeShOVUxMLCBOVUxMKTsKKyAgICBwanNpcF94ZmVyX3NlbmRfcmVxdWVzdChOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKU0lQX1BSRVNFTkNFCisgICAgcGpzaXBfcHJlc19pbml0X21vZHVsZShOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9wcmVzX2luc3RhbmNlKCk7CisgICAgcGpzaXBfcHJlc19jcmVhdGVfdWFjKE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgIHBqc2lwX3ByZXNfY3JlYXRlX3VhcyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9wcmVzX3Rlcm1pbmF0ZShOVUxMLCBQSl9GQUxTRSk7CisgICAgcGpzaXBfcHJlc19pbml0aWF0ZShOVUxMLCAxMDAsIE5VTEwpOworICAgIHBqc2lwX3ByZXNfYWNjZXB0KE5VTEwsIE5VTEwsIDIwMCwgTlVMTCk7CisgICAgcGpzaXBfcHJlc19ub3RpZnkoTlVMTCwgUEpTSVBfRVZTVUJfU1RBVEVfQUNUSVZFLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9wcmVzX2N1cnJlbnRfbm90aWZ5KE5VTEwsIE5VTEwpOworICAgIHBqc2lwX3ByZXNfc2VuZF9yZXF1ZXN0KE5VTEwsIE5VTEwpOworICAgIHBqc2lwX3ByZXNfZ2V0X3N0YXR1cyhOVUxMLCBOVUxMKTsKKyAgICBwanNpcF9wcmVzX3NldF9zdGF0dXMoTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSlNJUF9JU19DT01QT1NJTkcKKyAgICBwanNpcF9pc2NvbXBvc2luZ19jcmVhdGVfeG1sKE5VTEwsIFBKX1RSVUUsIE5VTEwsIE5VTEwsIDApOworICAgIHBqc2lwX2lzY29tcG9zaW5nX2NyZWF0ZV9ib2R5KE5VTEwsIFBKX1RSVUUsIE5VTEwsIE5VTEwsIDApOworICAgIHBqc2lwX2lzY29tcG9zaW5nX3BhcnNlKE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQQorICAgIHBqbWVkaWFfZW5kcHRfY3JlYXRlKE5VTEwsIE5VTEwsIDEsIE5VTEwpOworICAgIHBqbWVkaWFfZW5kcHRfZGVzdHJveShOVUxMKTsKKyAgICBwam1lZGlhX2VuZHB0X2NyZWF0ZV9zZHAoTlVMTCwgTlVMTCwgMSwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX0VDCisgICAgcGptZWRpYV9lY2hvX2NyZWF0ZShOVUxMLCAwLCAwLCAwLCAwLCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX2VjaG9fZGVzdHJveShOVUxMKTsKKyAgICBwam1lZGlhX2VjaG9fcGxheWJhY2soTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9lY2hvX2NhcHR1cmUoTlVMTCwgTlVMTCwgMCk7CisgICAgcGptZWRpYV9lY2hvX2NhbmNlbChOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfU05EX0RFVgorICAgIHBqbWVkaWFfc25kX2luaXQoTlVMTCk7CisgICAgcGptZWRpYV9zbmRfZ2V0X2Rldl9jb3VudCgpOworICAgIHBqbWVkaWFfc25kX2dldF9kZXZfaW5mbygwKTsKKyAgICBwam1lZGlhX3NuZF9vcGVuKC0xLCAtMSwgODAwMCwgMSwgODAsIDE2LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX3NuZF9vcGVuX3JlYygtMSwgODAwMCwgMSwgMTYwLCAxNiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zbmRfb3Blbl9wbGF5ZXIoLTEsIDgwMDAsIDEsIDE2MCwgMTYsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfc25kX3N0cmVhbV9zdGFydChOVUxMKTsKKyAgICBwam1lZGlhX3NuZF9zdHJlYW1fc3RvcChOVUxMKTsKKyAgICBwam1lZGlhX3NuZF9zdHJlYW1fY2xvc2UoTlVMTCk7CisgICAgcGptZWRpYV9zbmRfZGVpbml0KCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX1NORF9QT1JUCisgICAgcGptZWRpYV9zbmRfcG9ydF9jcmVhdGUoTlVMTCwgLTEsIC0xLCA4MDAwLCAxLCAxODAsIDE2LCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX3NuZF9wb3J0X2NyZWF0ZV9yZWMoTlVMTCwgLTEsIDgwMDAsIDEsIDE2MCwgMTYsIDAsIE5VTEwpOworICAgIHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlX3BsYXllcihOVUxMLCAtMSwgODAwMCwgMSwgMTYwLCAxNiwgMCwgTlVMTCk7CisgICAgcGptZWRpYV9zbmRfcG9ydF9kZXN0cm95KE5VTEwpOworICAgIHBqbWVkaWFfc25kX3BvcnRfZ2V0X3NuZF9zdHJlYW0oTlVMTCk7CisgICAgcGptZWRpYV9zbmRfcG9ydF9jb25uZWN0KE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfc25kX3BvcnRfZ2V0X3BvcnQoTlVMTCk7CisgICAgcGptZWRpYV9zbmRfcG9ydF9kaXNjb25uZWN0KE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9SRVNBTVBMRQorICAgIHBqbWVkaWFfcmVzYW1wbGVfY3JlYXRlKE5VTEwsIFBKX1RSVUUsIFBKX1RSVUUsIDAsIDAsIDAsIDAsIE5VTEwpOworICAgIHBqbWVkaWFfcmVzYW1wbGVfcnVuKE5VTEwsIE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9TSUxFTkNFX0RFVAorICAgIHBqbWVkaWFfc2lsZW5jZV9kZXRfY3JlYXRlKE5VTEwsIDgwMDAsIDgwLCBOVUxMKTsKKyAgICBwam1lZGlhX3NpbGVuY2VfZGV0X2RldGVjdChOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX3NpbGVuY2VfZGV0X2FwcGx5KE5VTEwsIDApOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9QTEMKKyAgICBwam1lZGlhX3BsY19jcmVhdGUoTlVMTCwgODAwMCwgODAsIDAsIE5VTEwpOworICAgIHBqbWVkaWFfcGxjX3NhdmUoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9wbGNfZ2VuZXJhdGUoTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX0NPTkZFUkVOQ0UKKyAgICBwam1lZGlhX2NvbmZfY3JlYXRlKE5VTEwsIDEwLCA4MDAwLCAxLCAxNjAsIDE2LCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX2NvbmZfZGVzdHJveShOVUxMKTsKKyAgICBwam1lZGlhX2NvbmZfZ2V0X21hc3Rlcl9wb3J0KE5VTEwpOworICAgIHBqbWVkaWFfY29uZl9hZGRfcG9ydChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX2NvbmZfY29uZmlndXJlX3BvcnQoTlVMTCwgMSwgMCwgMCk7CisgICAgcGptZWRpYV9jb25mX2Nvbm5lY3RfcG9ydChOVUxMLCAwLCAwLCAwKTsKKyAgICBwam1lZGlhX2NvbmZfZGlzY29ubmVjdF9wb3J0KE5VTEwsIDAsIDApOworICAgIHBqbWVkaWFfY29uZl9yZW1vdmVfcG9ydChOVUxMLCAwKTsKKyAgICBwam1lZGlhX2NvbmZfZW51bV9wb3J0cyhOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX2NvbmZfZ2V0X3BvcnRfaW5mbyhOVUxMLCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX2NvbmZfZ2V0X3BvcnRzX2luZm8oTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9jb25mX2dldF9zaWduYWxfbGV2ZWwoTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9jb25mX2FkanVzdF9yeF9sZXZlbChOVUxMLCAwLCAwKTsKKyAgICBwam1lZGlhX2NvbmZfYWRqdXN0X3R4X2xldmVsKE5VTEwsIDAsIDApOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9NQVNURVJfUE9SVAorICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfY3JlYXRlKE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfc3RhcnQoTlVMTCk7CisgICAgcGptZWRpYV9tYXN0ZXJfcG9ydF9zdG9wKE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfc2V0X3Vwb3J0KE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfZ2V0X3Vwb3J0KE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfc2V0X2Rwb3J0KE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfZ2V0X2Rwb3J0KE5VTEwpOworICAgIHBqbWVkaWFfbWFzdGVyX3BvcnRfZGVzdHJveShOVUxMLCBQSl9GQUxTRSk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX1JUUAorICAgIHBqbWVkaWFfcnRwX3Nlc3Npb25faW5pdChOVUxMLCAwLCAwKTsKKyAgICBwam1lZGlhX3J0cF9lbmNvZGVfcnRwKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfcnRwX2RlY29kZV9ydHAoTlVMTCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9ydHBfc2Vzc2lvbl91cGRhdGUoTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX1JUQ1AKKyAgICBwam1lZGlhX3J0Y3BfaW5pdChOVUxMLCBOVUxMLCAwLCAwLCAwKTsKKyAgICBwam1lZGlhX3J0Y3BfZ2V0X250cF90aW1lKE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfcnRjcF9maW5pKE5VTEwpOworICAgIHBqbWVkaWFfcnRjcF9yeF9ydHAoTlVMTCwgMCwgMCwgMCk7CisgICAgcGptZWRpYV9ydGNwX3R4X3J0cChOVUxMLCAwKTsKKyAgICBwam1lZGlhX3J0Y3BfcnhfcnRjcChOVUxMLCBOVUxMLCAwKTsKKyAgICBwam1lZGlhX3J0Y3BfYnVpbGRfcnRjcChOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfSkJVRgorICAgIHBqbWVkaWFfamJ1Zl9jcmVhdGUoTlVMTCwgTlVMTCwgMCwgMCwgMCwgTlVMTCk7CisgICAgcGptZWRpYV9qYnVmX3NldF9maXhlZChOVUxMLCAwKTsKKyAgICBwam1lZGlhX2pidWZfc2V0X2FkYXB0aXZlKE5VTEwsIDAsIDAsIDApOworICAgIHBqbWVkaWFfamJ1Zl9kZXN0cm95KE5VTEwpOworICAgIHBqbWVkaWFfamJ1Zl9wdXRfZnJhbWUoTlVMTCwgTlVMTCwgMCwgMCk7CisgICAgcGptZWRpYV9qYnVmX2dldF9mcmFtZShOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfU1RSRUFNCisgICAgcGptZWRpYV9zdHJlYW1fY3JlYXRlKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfc3RyZWFtX2Rlc3Ryb3koTlVMTCk7CisgICAgcGptZWRpYV9zdHJlYW1fZ2V0X3BvcnQoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zdHJlYW1fZ2V0X3RyYW5zcG9ydChOVUxMKTsKKyAgICBwam1lZGlhX3N0cmVhbV9zdGFydChOVUxMKTsKKyAgICBwam1lZGlhX3N0cmVhbV9nZXRfc3RhdChOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX3N0cmVhbV9wYXVzZShOVUxMLCBQSk1FRElBX0RJUl9FTkNPRElORyk7CisgICAgcGptZWRpYV9zdHJlYW1fcmVzdW1lKE5VTEwsIFBKTUVESUFfRElSX0VOQ09ESU5HKTsKKyAgICBwam1lZGlhX3N0cmVhbV9kaWFsX2R0bWYoTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9zdHJlYW1fY2hlY2tfZHRtZihOVUxMKTsKKyAgICBwam1lZGlhX3N0cmVhbV9nZXRfZHRtZihOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfVE9ORUdFTgorICAgIHBqbWVkaWFfdG9uZWdlbl9jcmVhdGUoTlVMTCwgMCwgMCwgMCwgMCwgMCwgTlVMTCk7CisgICAgcGptZWRpYV90b25lZ2VuX2lzX2J1c3koTlVMTCk7CisgICAgcGptZWRpYV90b25lZ2VuX3N0b3AoTlVMTCk7CisgICAgcGptZWRpYV90b25lZ2VuX3BsYXkoTlVMTCwgMCwgTlVMTCwgMCk7CisgICAgcGptZWRpYV90b25lZ2VuX3BsYXlfZGlnaXRzKE5VTEwsIDAsIE5VTEwsIDApOworICAgIHBqbWVkaWFfdG9uZWdlbl9nZXRfZGlnaXRfbWFwKE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfdG9uZWdlbl9zZXRfZGlnaXRfbWFwKE5VTEwsIE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9VRFBfVFJBTlNQT1JUCisgICAgcGptZWRpYV90cmFuc3BvcnRfdWRwX2NyZWF0ZShOVUxMLCBOVUxMLCAwLCAwLCBOVUxMKTsKKyAgICBwam1lZGlhX3RyYW5zcG9ydF91ZHBfY2xvc2UoTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX0ZJTEVfUExBWUVSCisgICAgcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKE5VTEwsIE5VTEwsIDAsIDAsIDAsIE5VTEwpOworICAgIHBqbWVkaWFfd2F2X3BsYXllcl9wb3J0X3NldF9wb3MoTlVMTCwgMCk7CisgICAgcGptZWRpYV93YXZfcGxheWVyX3BvcnRfZ2V0X3BvcyhOVUxMKTsKKyAgICBwam1lZGlhX3dhdl9wbGF5ZXJfc2V0X2VvZl9jYihOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfRklMRV9DQVBUVVJFCisgICAgcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfY3JlYXRlKE5VTEwsIE5VTEwsIDgwMDAsIDEsIDgwLCAxNiwgMCwgMCwgTlVMTCk7CisgICAgcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfZ2V0X3BvcyhOVUxMKTsKKyAgICBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9zZXRfY2IoTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX01FTV9QTEFZRVIKKyAgICBwam1lZGlhX21lbV9wbGF5ZXJfY3JlYXRlKE5VTEwsIE5VTEwsIDEwMDAsIDgwMDAsIDEsIDgwLCAxNiwgMCwgTlVMTCk7CisjZW5kaWYKKworI2lmZGVmIEhBU19QSk1FRElBX01FTV9DQVBUVVJFCisgICAgcGptZWRpYV9tZW1fY2FwdHVyZV9jcmVhdGUoTlVMTCwgTlVMTCwgMTAwMCwgODAwMCwgMSwgODAsIDE2LCAwLCBOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgSEFTX1BKTUVESUFfSUNFCisgICAgcGptZWRpYV9pY2VfY3JlYXRlKE5VTEwsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfaWNlX2Rlc3Ryb3koTlVMTCk7CisgICAgcGptZWRpYV9pY2Vfc3RhcnRfaW5pdChOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBwam1lZGlhX2ljZV9pbml0X2ljZShOVUxMLCBQSl9JQ0VfU0VTU19ST0xFX0NPTlRST0xMRUQsIE5VTEwsIE5VTEwpOworICAgIHBqbWVkaWFfaWNlX21vZGlmeV9zZHAoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcGptZWRpYV9pY2Vfc3RhcnRfaWNlKE5VTEwsIE5VTEwsIE5VTEwsIDApOworICAgIHBqbWVkaWFfaWNlX3N0b3BfaWNlKE5VTEwpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9HNzExX0NPREVDCisgICAgcGptZWRpYV9jb2RlY19nNzExX2luaXQoTlVMTCk7CisgICAgcGptZWRpYV9jb2RlY19nNzExX2RlaW5pdCgpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9HU01fQ09ERUMKKyAgICBwam1lZGlhX2NvZGVjX2dzbV9pbml0KE5VTEwpOworICAgIHBqbWVkaWFfY29kZWNfZ3NtX2RlaW5pdCgpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9TUEVFWF9DT0RFQworICAgIHBqbWVkaWFfY29kZWNfc3BlZXhfaW5pdChOVUxMLCAwLCAwLCAwKTsKKyAgICBwam1lZGlhX2NvZGVjX3NwZWV4X2RlaW5pdCgpOworI2VuZGlmCisKKyNpZmRlZiBIQVNfUEpNRURJQV9JTEJDX0NPREVDCisgICAgcGptZWRpYV9jb2RlY19pbGJjX2luaXQoTlVMTCwgMCk7CisgICAgcGptZWRpYV9jb2RlY19pbGJjX2RlaW5pdCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgdGVzdF9tYWluKCkKK3sKKyAgICByZXR1cm4gZHVtbXlfZnVuY3Rpb24oKTsKK30KKworI2lmIGRlZmluZWQoUEpfUlRFTVMpICYmIFBKX1JURU1TIT0wCisjICBpbmNsdWRlICIuLi8uLi9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX3J0ZW1zLmMiCisjZWxzZQoraW50IG1haW4oKQoreworICByZXR1cm4gdGVzdF9tYWluKCk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9odHRwZGVtby5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9odHRwZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2h0dHBkZW1vLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qICRJZDogaHR0cGRlbW8uYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX2h0dHBkZW1vX2MgU2FtcGxlczogSFRUUCBDbGllbnQgZGVtbworICoKKyAqIFRoaXMgZmlsZSBpcyBwanNpcC1hcHBzL3NyYy9zYW1wbGVzL2h0dHBkZW1vLmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBodHRwZGVtby5jCisgKi8KKworI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwvaHR0cF9jbGllbnQuaD4KKyNpbmNsdWRlIDxwanNpcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam5hdGguaD4KKyNpbmNsdWRlIDxwanNpcF9zaW1wbGUuaD4KKworc3RhdGljIHBqX3RpbWVyX2hlYXBfdCAqdGltZXJfaGVhcDsKK3N0YXRpYyBwal9pb3F1ZXVlX3QgKmlvcXVldWU7CitzdGF0aWMgcGpfcG9vbF90ICpwb29sOworc3RhdGljIHBqX2h0dHBfcmVxICpodHRwX3JlcTsKK3N0YXRpYyBwal9wb29sX2ZhY3RvcnkgKm1lbTsKK3N0YXRpYyBGSUxFICpmID0gTlVMTDsKKworLy8jZGVmaW5lIFZFUkJPU0UKKyNkZWZpbmUgVEhJU19GSUxFCSAgICAiaHR0cF9kZW1vIgorCitzdGF0aWMgdm9pZCBvbl9yZXNwb25zZShwal9odHRwX3JlcSAqaHR0cF9yZXEsIGNvbnN0IHBqX2h0dHBfcmVzcCAqcmVzcCkKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfVU5VU0VEX0FSRyhodHRwX3JlcSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiUuKnMgJWQgJS4qcyIsIChpbnQpcmVzcC0+dmVyc2lvbi5zbGVuLCByZXNwLT52ZXJzaW9uLnB0ciwKKwkJCQkgICAgICAgICAgIHJlc3AtPnN0YXR1c19jb2RlLAorCQkJCSAgICAgICAgICAgKGludClyZXNwLT5yZWFzb24uc2xlbiwgcmVzcC0+cmVhc29uLnB0cikpOworCisgICAgZm9yIChpPTA7IGk8cmVzcC0+aGVhZGVycy5jb3VudDsgKytpKSB7CisJY29uc3QgcGpfaHR0cF9oZWFkZXJfZWxtdCAqaCA9ICZyZXNwLT5oZWFkZXJzLmhlYWRlcltpXTsKKworCWlmICghcGpfc3RyaWNtcDIoJmgtPm5hbWUsICJDb250ZW50LUxlbmd0aCIpIHx8CisJICAgICFwal9zdHJpY21wMigmaC0+bmFtZSwgIkNvbnRlbnQtVHlwZSIpKQorCXsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiUuKnM6ICUuKnMiLAorCQkgICAgICAoaW50KWgtPm5hbWUuc2xlbiwgaC0+bmFtZS5wdHIsCisJCSAgICAgIChpbnQpaC0+dmFsdWUuc2xlbiwgaC0+dmFsdWUucHRyKSk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgb25fc2VuZF9kYXRhKHBqX2h0dHBfcmVxICpodHRwX3JlcSwgdm9pZCAqKmRhdGEsIHBqX3NpemVfdCAqc2l6ZSkKK3sKKwlQSl9VTlVTRURfQVJHKGh0dHBfcmVxKTsKKwlQSl9VTlVTRURfQVJHKHNpemUpOworCVBKX1VOVVNFRF9BUkcoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2RhdGFfcmVhZChwal9odHRwX3JlcSAqaHJlcSwgdm9pZCAqZGF0YSwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhocmVxKTsKKworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBmd3JpdGUoZGF0YSwgMSwgc2l6ZSwgZik7CisgICAgICAgIGZmbHVzaChmKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiRGF0YSByZWNlaXZlZDogJWQgYnl0ZXMiLCBzaXplKSk7CisgICAgICAgIHByaW50ZigiJS4qc1xuIiwgKGludClzaXplLCAoY2hhciAqKWRhdGEpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvbl9jb21wbGV0ZShwal9odHRwX3JlcSAqaHJlcSwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfaHR0cF9yZXNwICpyZXNwKQoreworICAgIFBKX1VOVVNFRF9BUkcoaHJlcSk7CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgUEpfUEVSUk9SKDEsIChUSElTX0ZJTEUsIHN0YXR1cywgIkhUVFAgcmVxdWVzdCBjb21wbGV0ZWQgd2l0aCBlcnJvciIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkRhdGEgY29tcGxldGVkOiAlZCBieXRlcyIsIHJlc3AtPnNpemUpKTsKKyAgICBpZiAocmVzcC0+c2l6ZSA+IDAgJiYgcmVzcC0+ZGF0YSkgeworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCIlLipzXG4iLCAoaW50KXJlc3AtPnNpemUsIChjaGFyICopcmVzcC0+ZGF0YSk7CisjZW5kaWYKKyAgICB9Cit9CisKK3BqX3N0YXR1c190IGdldFVSTChjb25zdCBjaGFyICpjdXJsKQoreworICAgIHBqX3N0cl90IHVybDsKKyAgICBwal9odHRwX3JlcV9jYWxsYmFjayBoY2I7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcGpfYnplcm8oJmhjYiwgc2l6ZW9mKGhjYikpOworICAgIGhjYi5vbl9jb21wbGV0ZSA9ICZvbl9jb21wbGV0ZTsKKyAgICBoY2Iub25fZGF0YV9yZWFkID0gJm9uX2RhdGFfcmVhZDsKKyAgICBoY2Iub25fc2VuZF9kYXRhID0gJm9uX3NlbmRfZGF0YTsKKyAgICBoY2Iub25fcmVzcG9uc2UgPSAmb25fcmVzcG9uc2U7CisKKyAgICAvKiBDcmVhdGUgcG9vbCwgdGltZXIsIGFuZCBpb3F1ZXVlICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgODE5MiwgNDA5NiwgTlVMTCk7CisgICAgaWYgKHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIDE2LCAmdGltZXJfaGVhcCkpCisgICAgICAgIHJldHVybiAtMzE7CisgICAgaWYgKHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIDE2LCAmaW9xdWV1ZSkpCisgICAgICAgIHJldHVybiAtMzI7CisKKyAgICBwal9zdHJkdXAyKHBvb2wsICZ1cmwsIGN1cmwpOworCisgICAgaWYgKChzdGF0dXMgPSBwal9odHRwX3JlcV9jcmVhdGUocG9vbCwgJnVybCwgdGltZXJfaGVhcCwgaW9xdWV1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmaGNiLCAmaHR0cF9yZXEpKSAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgaWYgKChzdGF0dXMgPSBwal9odHRwX3JlcV9zdGFydChodHRwX3JlcSkpICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICB3aGlsZSAocGpfaHR0cF9yZXFfaXNfcnVubmluZyhodHRwX3JlcSkpIHsKKyAgICAgICAgcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgNTB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworCXBqX3RpbWVyX2hlYXBfcG9sbCh0aW1lcl9oZWFwLCBOVUxMKTsKKyAgICB9CisKKyAgICBwal9odHRwX3JlcV9kZXN0cm95KGh0dHBfcmVxKTsKKyAgICBwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWV1ZSk7CisgICAgcGpfdGltZXJfaGVhcF9kZXN0cm95KHRpbWVyX2hlYXApOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorLyoKKyAqIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCBjcDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoYXJnYyA8IDIgfHwgYXJnYyA+IDMpIHsKKwlwdXRzKCJVc2FnZTogaHR0cGRlbW8gVVJMIFtvdXRwdXQtZmlsZW5hbWVdIik7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcGpfbG9nX3NldF9sZXZlbCg1KTsKKworICAgIHBqX2luaXQoKTsKKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsIE5VTEwsIDApOworICAgIG1lbSA9ICZjcC5mYWN0b3J5OworICAgIHBqbGliX3V0aWxfaW5pdCgpOworCisgICAgaWYgKGFyZ2MgPiAyKQorCWYgPSBmb3Blbihhcmd2WzJdLCAid2IiKTsKKyAgICBlbHNlCisJZiA9IHN0ZG91dDsKKworICAgIHN0YXR1cyA9IGdldFVSTChhcmd2WzFdKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgUEpfUEVSUk9SKDEsIChUSElTX0ZJTEUsIHN0YXR1cywgIkVycm9yIikpOworICAgIH0KKworICAgIGlmIChmICE9IHN0ZG91dCkKKwlmY2xvc2UoZik7CisKKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmY3ApOworICAgIHBqX3NodXRkb3duKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2ljZWRlbW8uYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvaWNlZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmJhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2ljZWRlbW8uYwpAQCAtMCwwICsxLDEyNzIgQEAKKy8qICRJZDogaWNlZGVtby5jIDQ2MjQgMjAxMy0xMC0yMSAwNjozNzozMFogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbmF0aC5oPgorCisKKyNkZWZpbmUgVEhJU19GSUxFICAgImljZWRlbW8uYyIKKworLyogRm9yIHRoaXMgZGVtbyBhcHAsIGNvbmZpZ3VyZSBsb25nZXIgU1RVTiBrZWVwLWFsaXZlIHRpbWUKKyAqIHNvIHRoYXQgaXQgZG9lcyd0IGNsdXR0ZXIgdGhlIHNjcmVlbiBvdXRwdXQuCisgKi8KKyNkZWZpbmUgS0FfSU5URVJWQUwgMzAwCisKKworLyogVGhpcyBpcyBvdXIgZ2xvYmFsIHZhcmlhYmxlcyAqLworc3RhdGljIHN0cnVjdCBhcHBfdAoreworICAgIC8qIENvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBzdG9yZWQgaGVyZSAqLworICAgIHN0cnVjdCBvcHRpb25zCisgICAgeworCXVuc2lnbmVkICAgIGNvbXBfY250OworCXBqX3N0cl90ICAgIG5zOworCWludAkgICAgbWF4X2hvc3Q7CisJcGpfYm9vbF90ICAgcmVndWxhcjsKKwlwal9zdHJfdCAgICBzdHVuX3NydjsKKwlwal9zdHJfdCAgICB0dXJuX3NydjsKKwlwal9ib29sX3QgICB0dXJuX3RjcDsKKwlwal9zdHJfdCAgICB0dXJuX3VzZXJuYW1lOworCXBqX3N0cl90ICAgIHR1cm5fcGFzc3dvcmQ7CisJcGpfYm9vbF90ICAgdHVybl9maW5nZXJwcmludDsKKwljb25zdCBjaGFyICpsb2dfZmlsZTsKKyAgICB9IG9wdDsKKworICAgIC8qIE91ciBnbG9iYWwgdmFyaWFibGVzICovCisgICAgcGpfY2FjaGluZ19wb29sCSBjcDsKKyAgICBwal9wb29sX3QJCSpwb29sOworICAgIHBqX3RocmVhZF90CQkqdGhyZWFkOworICAgIHBqX2Jvb2xfdAkJIHRocmVhZF9xdWl0X2ZsYWc7CisgICAgcGpfaWNlX3N0cmFuc19jZmcJIGljZV9jZmc7CisgICAgcGpfaWNlX3N0cmFucwkqaWNlc3Q7CisgICAgRklMRQkJKmxvZ19maG5kOworCisgICAgLyogVmFyaWFibGVzIHRvIHN0b3JlIHBhcnNlZCByZW1vdGUgSUNFIGluZm8gKi8KKyAgICBzdHJ1Y3QgcmVtX2luZm8KKyAgICB7CisJY2hhcgkJIHVmcmFnWzgwXTsKKwljaGFyCQkgcHdkWzgwXTsKKwl1bnNpZ25lZAkgY29tcF9jbnQ7CisJcGpfc29ja2FkZHIJIGRlZl9hZGRyW1BKX0lDRV9NQVhfQ09NUF07CisJdW5zaWduZWQJIGNhbmRfY250OworCXBqX2ljZV9zZXNzX2NhbmQgY2FuZFtQSl9JQ0VfU1RfTUFYX0NBTkRdOworICAgIH0gcmVtOworCit9IGljZWRlbW87CisKKy8qIFV0aWxpdHkgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19wZXJyb3IoY29uc3QgY2hhciAqdGl0bGUsIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiJXM6ICVzIiwgdGl0bGUsIGVycm1zZykpOworfQorCisvKiBVdGlsaXR5OiBkaXNwbGF5IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgYXBwbGljYXRpb24gKHVzdWFsbHkKKyAqIGJlY2F1c2Ugb2YgZmF0YWwgZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkIGVycl9leGl0KGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJaWNlZGVtb19wZXJyb3IodGl0bGUsIHN0YXR1cyk7CisgICAgfQorICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJTaHV0dGluZyBkb3duLi4iKSk7CisKKyAgICBpZiAoaWNlZGVtby5pY2VzdCkKKwlwal9pY2Vfc3RyYW5zX2Rlc3Ryb3koaWNlZGVtby5pY2VzdCk7CisgICAgCisgICAgcGpfdGhyZWFkX3NsZWVwKDUwMCk7CisKKyAgICBpY2VkZW1vLnRocmVhZF9xdWl0X2ZsYWcgPSBQSl9UUlVFOworICAgIGlmIChpY2VkZW1vLnRocmVhZCkgeworCXBqX3RocmVhZF9qb2luKGljZWRlbW8udGhyZWFkKTsKKwlwal90aHJlYWRfZGVzdHJveShpY2VkZW1vLnRocmVhZCk7CisgICAgfQorCisgICAgaWYgKGljZWRlbW8uaWNlX2NmZy5zdHVuX2NmZy5pb3F1ZXVlKQorCXBqX2lvcXVldWVfZGVzdHJveShpY2VkZW1vLmljZV9jZmcuc3R1bl9jZmcuaW9xdWV1ZSk7CisKKyAgICBpZiAoaWNlZGVtby5pY2VfY2ZnLnN0dW5fY2ZnLnRpbWVyX2hlYXApCisJcGpfdGltZXJfaGVhcF9kZXN0cm95KGljZWRlbW8uaWNlX2NmZy5zdHVuX2NmZy50aW1lcl9oZWFwKTsKKworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZpY2VkZW1vLmNwKTsKKworICAgIHBqX3NodXRkb3duKCk7CisKKyAgICBpZiAoaWNlZGVtby5sb2dfZmhuZCkgeworCWZjbG9zZShpY2VkZW1vLmxvZ19maG5kKTsKKwlpY2VkZW1vLmxvZ19maG5kID0gTlVMTDsKKyAgICB9CisKKyAgICBleGl0KHN0YXR1cyAhPSBQSl9TVUNDRVNTKTsKK30KKworI2RlZmluZSBDSEVDSyhleHByKQlzdGF0dXM9ZXhwcjsgXAorCQkJaWYgKHN0YXR1cyE9UEpfU1VDQ0VTUykgeyBcCisJCQkgICAgZXJyX2V4aXQoI2V4cHIsIHN0YXR1cyk7IFwKKwkJCX0KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBldmVudHMgZnJvbSBib3RoIHRpbWVyIGFuZCBpb3F1ZXVlIChmb3IKKyAqIG5ldHdvcmsgZXZlbnRzKS4gSXQgaXMgaW52b2tlZCBieSB0aGUgd29ya2VyIHRocmVhZC4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGhhbmRsZV9ldmVudHModW5zaWduZWQgbWF4X21zZWMsIHVuc2lnbmVkICpwX2NvdW50KQoreworICAgIGVudW0geyBNQVhfTkVUX0VWRU5UUyA9IDEgfTsKKyAgICBwal90aW1lX3ZhbCBtYXhfdGltZW91dCA9IHswLCAwfTsKKyAgICBwal90aW1lX3ZhbCB0aW1lb3V0ID0geyAwLCAwfTsKKyAgICB1bnNpZ25lZCBjb3VudCA9IDAsIG5ldF9ldmVudF9jb3VudCA9IDA7CisgICAgaW50IGM7CisKKyAgICBtYXhfdGltZW91dC5tc2VjID0gbWF4X21zZWM7CisKKyAgICAvKiBQb2xsIHRoZSB0aW1lciB0byBydW4gaXQgYW5kIGFsc28gdG8gcmV0cmlldmUgdGhlIGVhcmxpZXN0IGVudHJ5LiAqLworICAgIHRpbWVvdXQuc2VjID0gdGltZW91dC5tc2VjID0gMDsKKyAgICBjID0gcGpfdGltZXJfaGVhcF9wb2xsKCBpY2VkZW1vLmljZV9jZmcuc3R1bl9jZmcudGltZXJfaGVhcCwgJnRpbWVvdXQgKTsKKyAgICBpZiAoYyA+IDApCisJY291bnQgKz0gYzsKKworICAgIC8qIHRpbWVyX2hlYXBfcG9sbCBzaG91bGQgbmV2ZXIgZXZlciByZXR1cm5zIG5lZ2F0aXZlIHZhbHVlLCBvciBvdGhlcndpc2UKKyAgICAgKiBpb3F1ZXVlX3BvbGwoKSB3aWxsIGJsb2NrIGZvcmV2ZXIhCisgICAgICovCisgICAgcGpfYXNzZXJ0KHRpbWVvdXQuc2VjID49IDAgJiYgdGltZW91dC5tc2VjID49IDApOworICAgIGlmICh0aW1lb3V0Lm1zZWMgPj0gMTAwMCkgdGltZW91dC5tc2VjID0gOTk5OworCisgICAgLyogY29tcGFyZSB0aGUgdmFsdWUgd2l0aCB0aGUgdGltZW91dCB0byB3YWl0IGZyb20gdGltZXIsIGFuZCB1c2UgdGhlIAorICAgICAqIG1pbmltdW0gdmFsdWUuIAorICAgICovCisgICAgaWYgKFBKX1RJTUVfVkFMX0dUKHRpbWVvdXQsIG1heF90aW1lb3V0KSkKKwl0aW1lb3V0ID0gbWF4X3RpbWVvdXQ7CisKKyAgICAvKiBQb2xsIGlvcXVldWUuIAorICAgICAqIFJlcGVhdCBwb2xsaW5nIHRoZSBpb3F1ZXVlIHdoaWxlIHdlIGhhdmUgaW1tZWRpYXRlIGV2ZW50cywgYmVjYXVzZQorICAgICAqIHRpbWVyIGhlYXAgbWF5IHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBldmVudHMsIHNvIGlmIHdlIG9ubHkgcHJvY2VzcworICAgICAqIG9uZSBuZXR3b3JrIGV2ZW50cyBhdCBhIHRpbWUgKHN1Y2ggYXMgd2hlbiBJT0NQIGJhY2tlbmQgaXMgdXNlZCksCisgICAgICogdGhlIGlvcXVldWUgbWF5IGhhdmUgdHJvdWJsZSBrZWVwaW5nIHVwIHdpdGggdGhlIHJlcXVlc3QgcmF0ZS4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCBmb3IgZWFjaCBzZW5kKCkgcmVxdWVzdCwgb25lIG5ldHdvcmsgZXZlbnQgd2lsbCBiZQorICAgICAqICAgcmVwb3J0ZWQgYnkgaW9xdWV1ZSBmb3IgdGhlIHNlbmQoKSBjb21wbGV0aW9uLiBJZiB3ZSBkb24ndCBwb2xsCisgICAgICogICB0aGUgaW9xdWV1ZSBvZnRlbiBlbm91Z2gsIHRoZSBzZW5kKCkgY29tcGxldGlvbiB3aWxsIG5vdCBiZQorICAgICAqICAgcmVwb3J0ZWQgaW4gdGltZWx5IG1hbm5lci4KKyAgICAgKi8KKyAgICBkbyB7CisJYyA9IHBqX2lvcXVldWVfcG9sbCggaWNlZGVtby5pY2VfY2ZnLnN0dW5fY2ZnLmlvcXVldWUsICZ0aW1lb3V0KTsKKwlpZiAoYyA8IDApIHsKKwkgICAgcGpfc3RhdHVzX3QgZXJyID0gcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisJICAgIHBqX3RocmVhZF9zbGVlcChQSl9USU1FX1ZBTF9NU0VDKHRpbWVvdXQpKTsKKwkgICAgaWYgKHBfY291bnQpCisJCSpwX2NvdW50ID0gY291bnQ7CisJICAgIHJldHVybiBlcnI7CisJfSBlbHNlIGlmIChjID09IDApIHsKKwkgICAgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgbmV0X2V2ZW50X2NvdW50ICs9IGM7CisJICAgIHRpbWVvdXQuc2VjID0gdGltZW91dC5tc2VjID0gMDsKKwl9CisgICAgfSB3aGlsZSAoYyA+IDAgJiYgbmV0X2V2ZW50X2NvdW50IDwgTUFYX05FVF9FVkVOVFMpOworCisgICAgY291bnQgKz0gbmV0X2V2ZW50X2NvdW50OworICAgIGlmIChwX2NvdW50KQorCSpwX2NvdW50ID0gY291bnQ7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKworfQorCisvKgorICogVGhpcyBpcyB0aGUgd29ya2VyIHRocmVhZCB0aGF0IHBvbGxzIGV2ZW50IGluIHRoZSBiYWNrZ3JvdW5kLgorICovCitzdGF0aWMgaW50IGljZWRlbW9fd29ya2VyX3RocmVhZCh2b2lkICp1bnVzZWQpCit7CisgICAgUEpfVU5VU0VEX0FSRyh1bnVzZWQpOworCisgICAgd2hpbGUgKCFpY2VkZW1vLnRocmVhZF9xdWl0X2ZsYWcpIHsKKwloYW5kbGVfZXZlbnRzKDUwMCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB0aGF0IGlzIHJlZ2lzdGVyZWQgdG8gdGhlIElDRSBzdHJlYW0gdHJhbnNwb3J0IHRvCisgKiByZWNlaXZlIG5vdGlmaWNhdGlvbiBhYm91dCBpbmNvbWluZyBkYXRhLiBCeSAiZGF0YSIgaXQgbWVhbnMgYXBwbGljYXRpb24KKyAqIGRhdGEgc3VjaCBhcyBSVFAvUlRDUCwgYW5kIG5vdCBwYWNrZXRzIHRoYXQgYmVsb25nIHRvIElDRSBzaWduYWxpbmcgKHN1Y2gKKyAqIGFzIFNUVU4gY29ubmVjdGl2aXR5IGNoZWNrcyBvciBUVVJOIHNpZ25hbGluZykuCisgKi8KK3N0YXRpYyB2b2lkIGNiX29uX3J4X2RhdGEocGpfaWNlX3N0cmFucyAqaWNlX3N0LAorCQkJICB1bnNpZ25lZCBjb21wX2lkLCAKKwkJCSAgdm9pZCAqcGt0LCBwal9zaXplX3Qgc2l6ZSwKKwkJCSAgY29uc3QgcGpfc29ja2FkZHJfdCAqc3JjX2FkZHIsCisJCQkgIHVuc2lnbmVkIHNyY19hZGRyX2xlbikKK3sKKyAgICBjaGFyIGlwc3RyW1BKX0lORVQ2X0FERFJTVFJMRU4rMTBdOworCisgICAgUEpfVU5VU0VEX0FSRyhpY2Vfc3QpOworICAgIFBKX1VOVVNFRF9BUkcoc3JjX2FkZHJfbGVuKTsKKyAgICBQSl9VTlVTRURfQVJHKHBrdCk7CisKKyAgICAvLyBEb24ndCBkbyB0aGlzISBJdCB3aWxsIHJ1aW4gdGhlIHBhY2tldCBidWZmZXIgaW4gY2FzZSBUQ1AgaXMgdXNlZCEKKyAgICAvLygoY2hhciopcGt0KVtzaXplXSA9ICdcMCc7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ29tcG9uZW50ICVkOiByZWNlaXZlZCAlZCBieXRlcyBkYXRhIGZyb20gJXM6IFwiJS4qc1wiIiwKKwkgICAgICBjb21wX2lkLCBzaXplLAorCSAgICAgIHBqX3NvY2thZGRyX3ByaW50KHNyY19hZGRyLCBpcHN0ciwgc2l6ZW9mKGlwc3RyKSwgMyksCisJICAgICAgKHVuc2lnbmVkKXNpemUsCisJICAgICAgKGNoYXIqKXBrdCkpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdGhhdCBpcyByZWdpc3RlcmVkIHRvIHRoZSBJQ0Ugc3RyZWFtIHRyYW5zcG9ydCB0bworICogcmVjZWl2ZSBub3RpZmljYXRpb24gYWJvdXQgSUNFIHN0YXRlIHByb2dyZXNzaW9uLgorICovCitzdGF0aWMgdm9pZCBjYl9vbl9pY2VfY29tcGxldGUocGpfaWNlX3N0cmFucyAqaWNlX3N0LCAKKwkJCSAgICAgICBwal9pY2Vfc3RyYW5zX29wIG9wLAorCQkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjb25zdCBjaGFyICpvcG5hbWUgPSAKKwkob3A9PVBKX0lDRV9TVFJBTlNfT1BfSU5JVD8gImluaXRpYWxpemF0aW9uIiA6CisJICAgIChvcD09UEpfSUNFX1NUUkFOU19PUF9ORUdPVElBVElPTiA/ICJuZWdvdGlhdGlvbiIgOiAidW5rbm93bl9vcCIpKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJJQ0UgJXMgc3VjY2Vzc2Z1bCIsIG9wbmFtZSkpOworICAgIH0gZWxzZSB7CisJY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKworCXBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIklDRSAlcyBmYWlsZWQ6ICVzIiwgb3BuYW1lLCBlcnJtc2cpKTsKKwlwal9pY2Vfc3RyYW5zX2Rlc3Ryb3koaWNlX3N0KTsKKwlpY2VkZW1vLmljZXN0ID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIGxvZyBjYWxsYmFjayB0byB3cml0ZSB0byBmaWxlICovCitzdGF0aWMgdm9pZCBsb2dfZnVuYyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisgICAgcGpfbG9nX3dyaXRlKGxldmVsLCBkYXRhLCBsZW4pOworICAgIGlmIChpY2VkZW1vLmxvZ19maG5kKSB7CisJaWYgKGZ3cml0ZShkYXRhLCBsZW4sIDEsIGljZWRlbW8ubG9nX2ZobmQpICE9IDEpCisJICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiBJdCBpcyBjYWxsZWQKKyAqIG9uY2UgKGFuZCBvbmx5IG9uY2UpIGR1cmluZyBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBieSAKKyAqIG1haW4oKS4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGljZWRlbW9faW5pdCh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChpY2VkZW1vLm9wdC5sb2dfZmlsZSkgeworCWljZWRlbW8ubG9nX2ZobmQgPSBmb3BlbihpY2VkZW1vLm9wdC5sb2dfZmlsZSwgImEiKTsKKwlwal9sb2dfc2V0X2xvZ19mdW5jKCZsb2dfZnVuYyk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyaWVzIGJlZm9yZSBhbnl0aGluZyBlbHNlICovCisgICAgQ0hFQ0soIHBqX2luaXQoKSApOworICAgIENIRUNLKCBwamxpYl91dGlsX2luaXQoKSApOworICAgIENIRUNLKCBwam5hdGhfaW5pdCgpICk7CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBwb29sIGZhY3RvcnksIHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9ucyBjb21lIGZyb20gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmaWNlZGVtby5jcCwgTlVMTCwgMCk7CisKKyAgICAvKiBJbml0IG91ciBJQ0Ugc2V0dGluZ3Mgd2l0aCBudWxsIHZhbHVlcyAqLworICAgIHBqX2ljZV9zdHJhbnNfY2ZnX2RlZmF1bHQoJmljZWRlbW8uaWNlX2NmZyk7CisKKyAgICBpY2VkZW1vLmljZV9jZmcuc3R1bl9jZmcucGYgPSAmaWNlZGVtby5jcC5mYWN0b3J5OworCisgICAgLyogQ3JlYXRlIGFwcGxpY2F0aW9uIG1lbW9yeSBwb29sICovCisgICAgaWNlZGVtby5wb29sID0gcGpfcG9vbF9jcmVhdGUoJmljZWRlbW8uY3AuZmFjdG9yeSwgImljZWRlbW8iLCAKKwkJCQkgIDUxMiwgNTEyLCBOVUxMKTsKKworICAgIC8qIENyZWF0ZSB0aW1lciBoZWFwIGZvciB0aW1lciBzdHVmZiAqLworICAgIENIRUNLKCBwal90aW1lcl9oZWFwX2NyZWF0ZShpY2VkZW1vLnBvb2wsIDEwMCwgCisJCQkJJmljZWRlbW8uaWNlX2NmZy5zdHVuX2NmZy50aW1lcl9oZWFwKSApOworCisgICAgLyogYW5kIGNyZWF0ZSBpb3F1ZXVlIGZvciBuZXR3b3JrIEkvTyBzdHVmZiAqLworICAgIENIRUNLKCBwal9pb3F1ZXVlX2NyZWF0ZShpY2VkZW1vLnBvb2wsIDE2LCAKKwkJCSAgICAgJmljZWRlbW8uaWNlX2NmZy5zdHVuX2NmZy5pb3F1ZXVlKSApOworCisgICAgLyogc29tZXRoaW5nIG11c3QgcG9sbCB0aGUgdGltZXIgaGVhcCBhbmQgaW9xdWV1ZSwgCisgICAgICogdW5sZXNzIHdlJ3JlIG9uIFN5bWJpYW4gd2hlcmUgdGhlIHRpbWVyIGhlYXAgYW5kIGlvcXVldWUgcnVuCisgICAgICogb24gdGhlbXNlbHZlcy4KKyAgICAgKi8KKyAgICBDSEVDSyggcGpfdGhyZWFkX2NyZWF0ZShpY2VkZW1vLnBvb2wsICJpY2VkZW1vIiwgJmljZWRlbW9fd29ya2VyX3RocmVhZCwKKwkJCSAgICBOVUxMLCAwLCAwLCAmaWNlZGVtby50aHJlYWQpICk7CisKKyAgICBpY2VkZW1vLmljZV9jZmcuYWYgPSBwal9BRl9JTkVUKCk7CisKKyAgICAvKiBDcmVhdGUgRE5TIHJlc29sdmVyIGlmIG5hbWVzZXJ2ZXIgaXMgc2V0ICovCisgICAgaWYgKGljZWRlbW8ub3B0Lm5zLnNsZW4pIHsKKwlDSEVDSyggcGpfZG5zX3Jlc29sdmVyX2NyZWF0ZSgmaWNlZGVtby5jcC5mYWN0b3J5LCAKKwkJCQkgICAgICAicmVzb2x2ZXIiLCAKKwkJCQkgICAgICAwLCAKKwkJCQkgICAgICBpY2VkZW1vLmljZV9jZmcuc3R1bl9jZmcudGltZXJfaGVhcCwKKwkJCQkgICAgICBpY2VkZW1vLmljZV9jZmcuc3R1bl9jZmcuaW9xdWV1ZSwgCisJCQkJICAgICAgJmljZWRlbW8uaWNlX2NmZy5yZXNvbHZlcikgKTsKKworCUNIRUNLKCBwal9kbnNfcmVzb2x2ZXJfc2V0X25zKGljZWRlbW8uaWNlX2NmZy5yZXNvbHZlciwgMSwgCisJCQkJICAgICAgJmljZWRlbW8ub3B0Lm5zLCBOVUxMKSApOworICAgIH0KKworICAgIC8qIC09IFN0YXJ0IGluaXRpYWxpemluZyBJQ0Ugc3RyZWFtIHRyYW5zcG9ydCBjb25maWcgPS0gKi8KKworICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGhvc3QgY2FuZGlkYXRlcyAqLworICAgIGlmIChpY2VkZW1vLm9wdC5tYXhfaG9zdCAhPSAtMSkKKwlpY2VkZW1vLmljZV9jZmcuc3R1bi5tYXhfaG9zdF9jYW5kcyA9IGljZWRlbW8ub3B0Lm1heF9ob3N0OworCisgICAgLyogTm9taW5hdGlvbiBzdHJhdGVneSAqLworICAgIGlmIChpY2VkZW1vLm9wdC5yZWd1bGFyKQorCWljZWRlbW8uaWNlX2NmZy5vcHQuYWdncmVzc2l2ZSA9IFBKX0ZBTFNFOworICAgIGVsc2UKKwlpY2VkZW1vLmljZV9jZmcub3B0LmFnZ3Jlc3NpdmUgPSBQSl9UUlVFOworCisgICAgLyogQ29uZmlndXJlIFNUVU4vc3JmbHggY2FuZGlkYXRlIHJlc29sdXRpb24gKi8KKyAgICBpZiAoaWNlZGVtby5vcHQuc3R1bl9zcnYuc2xlbikgeworCWNoYXIgKnBvczsKKworCS8qIENvbW1hbmQgbGluZSBvcHRpb24gbWF5IGNvbnRhaW4gcG9ydCBudW1iZXIgKi8KKwlpZiAoKHBvcz1wal9zdHJjaHIoJmljZWRlbW8ub3B0LnN0dW5fc3J2LCAnOicpKSAhPSBOVUxMKSB7CisJICAgIGljZWRlbW8uaWNlX2NmZy5zdHVuLnNlcnZlci5wdHIgPSBpY2VkZW1vLm9wdC5zdHVuX3Nydi5wdHI7CisJICAgIGljZWRlbW8uaWNlX2NmZy5zdHVuLnNlcnZlci5zbGVuID0gKHBvcyAtIGljZWRlbW8ub3B0LnN0dW5fc3J2LnB0cik7CisKKwkgICAgaWNlZGVtby5pY2VfY2ZnLnN0dW4ucG9ydCA9IChwal91aW50MTZfdClhdG9pKHBvcysxKTsKKwl9IGVsc2UgeworCSAgICBpY2VkZW1vLmljZV9jZmcuc3R1bi5zZXJ2ZXIgPSBpY2VkZW1vLm9wdC5zdHVuX3NydjsKKwkgICAgaWNlZGVtby5pY2VfY2ZnLnN0dW4ucG9ydCA9IFBKX1NUVU5fUE9SVDsKKwl9CisKKwkvKiBGb3IgdGhpcyBkZW1vIGFwcCwgY29uZmlndXJlIGxvbmdlciBTVFVOIGtlZXAtYWxpdmUgdGltZQorCSAqIHNvIHRoYXQgaXQgZG9lcyd0IGNsdXR0ZXIgdGhlIHNjcmVlbiBvdXRwdXQuCisJICovCisJaWNlZGVtby5pY2VfY2ZnLnN0dW4uY2ZnLmthX2ludGVydmFsID0gS0FfSU5URVJWQUw7CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIFRVUk4gY2FuZGlkYXRlICovCisgICAgaWYgKGljZWRlbW8ub3B0LnR1cm5fc3J2LnNsZW4pIHsKKwljaGFyICpwb3M7CisKKwkvKiBDb21tYW5kIGxpbmUgb3B0aW9uIG1heSBjb250YWluIHBvcnQgbnVtYmVyICovCisJaWYgKChwb3M9cGpfc3RyY2hyKCZpY2VkZW1vLm9wdC50dXJuX3NydiwgJzonKSkgIT0gTlVMTCkgeworCSAgICBpY2VkZW1vLmljZV9jZmcudHVybi5zZXJ2ZXIucHRyID0gaWNlZGVtby5vcHQudHVybl9zcnYucHRyOworCSAgICBpY2VkZW1vLmljZV9jZmcudHVybi5zZXJ2ZXIuc2xlbiA9IChwb3MgLSBpY2VkZW1vLm9wdC50dXJuX3Nydi5wdHIpOworCisJICAgIGljZWRlbW8uaWNlX2NmZy50dXJuLnBvcnQgPSAocGpfdWludDE2X3QpYXRvaShwb3MrMSk7CisJfSBlbHNlIHsKKwkgICAgaWNlZGVtby5pY2VfY2ZnLnR1cm4uc2VydmVyID0gaWNlZGVtby5vcHQudHVybl9zcnY7CisJICAgIGljZWRlbW8uaWNlX2NmZy50dXJuLnBvcnQgPSBQSl9TVFVOX1BPUlQ7CisJfQorCisJLyogVFVSTiBjcmVkZW50aWFsICovCisJaWNlZGVtby5pY2VfY2ZnLnR1cm4uYXV0aF9jcmVkLnR5cGUgPSBQSl9TVFVOX0FVVEhfQ1JFRF9TVEFUSUM7CisJaWNlZGVtby5pY2VfY2ZnLnR1cm4uYXV0aF9jcmVkLmRhdGEuc3RhdGljX2NyZWQudXNlcm5hbWUgPSBpY2VkZW1vLm9wdC50dXJuX3VzZXJuYW1lOworCWljZWRlbW8uaWNlX2NmZy50dXJuLmF1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGFfdHlwZSA9IFBKX1NUVU5fUEFTU1dEX1BMQUlOOworCWljZWRlbW8uaWNlX2NmZy50dXJuLmF1dGhfY3JlZC5kYXRhLnN0YXRpY19jcmVkLmRhdGEgPSBpY2VkZW1vLm9wdC50dXJuX3Bhc3N3b3JkOworCisJLyogQ29ubmVjdGlvbiB0eXBlIHRvIFRVUk4gc2VydmVyICovCisJaWYgKGljZWRlbW8ub3B0LnR1cm5fdGNwKQorCSAgICBpY2VkZW1vLmljZV9jZmcudHVybi5jb25uX3R5cGUgPSBQSl9UVVJOX1RQX1RDUDsKKwllbHNlCisJICAgIGljZWRlbW8uaWNlX2NmZy50dXJuLmNvbm5fdHlwZSA9IFBKX1RVUk5fVFBfVURQOworCisJLyogRm9yIHRoaXMgZGVtbyBhcHAsIGNvbmZpZ3VyZSBsb25nZXIga2VlcC1hbGl2ZSB0aW1lCisJICogc28gdGhhdCBpdCBkb2VzJ3QgY2x1dHRlciB0aGUgc2NyZWVuIG91dHB1dC4KKwkgKi8KKwlpY2VkZW1vLmljZV9jZmcudHVybi5hbGxvY19wYXJhbS5rYV9pbnRlcnZhbCA9IEtBX0lOVEVSVkFMOworICAgIH0KKworICAgIC8qIC09IFRoYXQncyBpdCBmb3Igbm93LCBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSA9LSAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBDcmVhdGUgSUNFIHN0cmVhbSB0cmFuc3BvcnQgaW5zdGFuY2UsIGludm9rZWQgZnJvbSB0aGUgbWVudS4KKyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19jcmVhdGVfaW5zdGFuY2Uodm9pZCkKK3sKKyAgICBwal9pY2Vfc3RyYW5zX2NiIGljZWNiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChpY2VkZW1vLmljZXN0ICE9IE5VTEwpIHsKKwlwdXRzKCJJQ0UgaW5zdGFuY2UgYWxyZWFkeSBjcmVhdGVkLCBkZXN0cm95IGl0IGZpcnN0Iik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIGNhbGxiYWNrICovCisgICAgcGpfYnplcm8oJmljZWNiLCBzaXplb2YoaWNlY2IpKTsKKyAgICBpY2VjYi5vbl9yeF9kYXRhID0gY2Jfb25fcnhfZGF0YTsKKyAgICBpY2VjYi5vbl9pY2VfY29tcGxldGUgPSBjYl9vbl9pY2VfY29tcGxldGU7CisKKyAgICAvKiBjcmVhdGUgdGhlIGluc3RhbmNlICovCisgICAgc3RhdHVzID0gcGpfaWNlX3N0cmFuc19jcmVhdGUoImljZWRlbW8iLAkJICAgIC8qIG9iamVjdCBuYW1lICAqLworCQkJCSZpY2VkZW1vLmljZV9jZmcsCSAgICAvKiBzZXR0aW5ncwkgICAgKi8KKwkJCQlpY2VkZW1vLm9wdC5jb21wX2NudCwJICAgIC8qIGNvbXBfY250CSAgICAqLworCQkJCU5VTEwsCQkJICAgIC8qIHVzZXIgZGF0YSAgICAqLworCQkJCSZpY2VjYiwJCQkgICAgLyogY2FsbGJhY2sJICAgICovCisJCQkJJmljZWRlbW8uaWNlc3QpCQkgICAgLyogaW5zdGFuY2UgcHRyICovCisJCQkJOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlpY2VkZW1vX3BlcnJvcigiZXJyb3IgY3JlYXRpbmcgaWNlIiwgc3RhdHVzKTsKKyAgICBlbHNlCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIklDRSBpbnN0YW5jZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCIpKTsKK30KKworLyogVXRpbGl0eSB0byBudWxsaWZ5IHBhcnNlZCByZW1vdGUgaW5mbyAqLworc3RhdGljIHZvaWQgcmVzZXRfcmVtX2luZm8odm9pZCkKK3sKKyAgICBwal9iemVybygmaWNlZGVtby5yZW0sIHNpemVvZihpY2VkZW1vLnJlbSkpOworfQorCisKKy8qCisgKiBEZXN0cm95IElDRSBzdHJlYW0gdHJhbnNwb3J0IGluc3RhbmNlLCBpbnZva2VkIGZyb20gdGhlIG1lbnUuCisgKi8KK3N0YXRpYyB2b2lkIGljZWRlbW9fZGVzdHJveV9pbnN0YW5jZSh2b2lkKQoreworICAgIGlmIChpY2VkZW1vLmljZXN0ID09IE5VTEwpIHsKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IE5vIElDRSBpbnN0YW5jZSwgY3JlYXRlIGl0IGZpcnN0IikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9pY2Vfc3RyYW5zX2Rlc3Ryb3koaWNlZGVtby5pY2VzdCk7CisgICAgaWNlZGVtby5pY2VzdCA9IE5VTEw7CisKKyAgICByZXNldF9yZW1faW5mbygpOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIklDRSBpbnN0YW5jZSBkZXN0cm95ZWQiKSk7Cit9CisKKworLyoKKyAqIENyZWF0ZSBJQ0Ugc2Vzc2lvbiwgaW52b2tlZCBmcm9tIHRoZSBtZW51LgorICovCitzdGF0aWMgdm9pZCBpY2VkZW1vX2luaXRfc2Vzc2lvbih1bnNpZ25lZCByb2xlY2hhcikKK3sKKyAgICBwal9pY2Vfc2Vzc19yb2xlIHJvbGUgPSAocGpfdG9sb3dlcigocGpfdWludDhfdClyb2xlY2hhcik9PSdvJyA/IAorCQkJCVBKX0lDRV9TRVNTX1JPTEVfQ09OVFJPTExJTkcgOiAKKwkJCQlQSl9JQ0VfU0VTU19ST0xFX0NPTlRST0xMRUQpOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChpY2VkZW1vLmljZXN0ID09IE5VTEwpIHsKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IE5vIElDRSBpbnN0YW5jZSwgY3JlYXRlIGl0IGZpcnN0IikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAocGpfaWNlX3N0cmFuc19oYXNfc2VzcyhpY2VkZW1vLmljZXN0KSkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogU2Vzc2lvbiBhbHJlYWR5IGNyZWF0ZWQiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX2ljZV9zdHJhbnNfaW5pdF9pY2UoaWNlZGVtby5pY2VzdCwgcm9sZSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWljZWRlbW9fcGVycm9yKCJlcnJvciBjcmVhdGluZyBzZXNzaW9uIiwgc3RhdHVzKTsKKyAgICBlbHNlCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIklDRSBzZXNzaW9uIGNyZWF0ZWQiKSk7CisKKyAgICByZXNldF9yZW1faW5mbygpOworfQorCisKKy8qCisgKiBTdG9wL2Rlc3Ryb3kgSUNFIHNlc3Npb24sIGludm9rZWQgZnJvbSB0aGUgbWVudS4KKyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19zdG9wX3Nlc3Npb24odm9pZCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoaWNlZGVtby5pY2VzdCA9PSBOVUxMKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBObyBJQ0UgaW5zdGFuY2UsIGNyZWF0ZSBpdCBmaXJzdCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwal9pY2Vfc3RyYW5zX2hhc19zZXNzKGljZWRlbW8uaWNlc3QpKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBObyBJQ0Ugc2Vzc2lvbiwgaW5pdGlhbGl6ZSBmaXJzdCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfaWNlX3N0cmFuc19zdG9wX2ljZShpY2VkZW1vLmljZXN0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJaWNlZGVtb19wZXJyb3IoImVycm9yIHN0b3BwaW5nIHNlc3Npb24iLCBzdGF0dXMpOworICAgIGVsc2UKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiSUNFIHNlc3Npb24gc3RvcHBlZCIpKTsKKworICAgIHJlc2V0X3JlbV9pbmZvKCk7Cit9CisKKyNkZWZpbmUgUFJJTlQoLi4uKQkgICAgXAorCXByaW50ZWQgPSBwal9hbnNpX3NucHJpbnRmKHAsIG1heGxlbiAtIChwLWJ1ZmZlciksICBcCisJCQkJICAgX19WQV9BUkdTX18pOyBcCisJaWYgKHByaW50ZWQgPD0gMCB8fCBwcmludGVkID49IChpbnQpKG1heGxlbiAtIChwLWJ1ZmZlcikpKSBcCisJICAgIHJldHVybiAtUEpfRVRPT1NNQUxMOyBcCisJcCArPSBwcmludGVkCisKKworLyogVXRpbGl0eSB0byBjcmVhdGUgYT1jYW5kaWRhdGUgU0RQIGF0dHJpYnV0ZSAqLworc3RhdGljIGludCBwcmludF9jYW5kKGNoYXIgYnVmZmVyW10sIHVuc2lnbmVkIG1heGxlbiwKKwkJICAgICAgY29uc3QgcGpfaWNlX3Nlc3NfY2FuZCAqY2FuZCkKK3sKKyAgICBjaGFyIGlwYWRkcltQSl9JTkVUNl9BRERSU1RSTEVOXTsKKyAgICBjaGFyICpwID0gYnVmZmVyOworICAgIGludCBwcmludGVkOworCisgICAgUFJJTlQoImE9Y2FuZGlkYXRlOiUuKnMgJXUgVURQICV1ICVzICV1IHR5cCAiLAorCSAgKGludCljYW5kLT5mb3VuZGF0aW9uLnNsZW4sCisJICBjYW5kLT5mb3VuZGF0aW9uLnB0ciwKKwkgICh1bnNpZ25lZCljYW5kLT5jb21wX2lkLAorCSAgY2FuZC0+cHJpbywKKwkgIHBqX3NvY2thZGRyX3ByaW50KCZjYW5kLT5hZGRyLCBpcGFkZHIsIAorCQkJICAgIHNpemVvZihpcGFkZHIpLCAwKSwKKwkgICh1bnNpZ25lZClwal9zb2NrYWRkcl9nZXRfcG9ydCgmY2FuZC0+YWRkcikpOworCisgICAgUFJJTlQoIiVzXG4iLAorCSAgcGpfaWNlX2dldF9jYW5kX3R5cGVfbmFtZShjYW5kLT50eXBlKSk7CisKKyAgICBpZiAocCA9PSBidWZmZXIrbWF4bGVuKQorCXJldHVybiAtUEpfRVRPT1NNQUxMOworCisgICAgKnAgPSAnXDAnOworCisgICAgcmV0dXJuIChpbnQpKHAtYnVmZmVyKTsKK30KKworLyogCisgKiBFbmNvZGUgSUNFIGluZm9ybWF0aW9uIGluIFNEUC4KKyAqLworc3RhdGljIGludCBlbmNvZGVfc2Vzc2lvbihjaGFyIGJ1ZmZlcltdLCB1bnNpZ25lZCBtYXhsZW4pCit7CisgICAgY2hhciAqcCA9IGJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBjb21wOworICAgIGludCBwcmludGVkOworICAgIHBqX3N0cl90IGxvY2FsX3VmcmFnLCBsb2NhbF9wd2Q7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogV3JpdGUgImR1bW15IiBTRFAgdj0sIG89LCBzPSwgYW5kIHQ9IGxpbmVzICovCisgICAgUFJJTlQoInY9MFxubz0tIDM0MTQ5NTM5NzggMzQxNDk1Mzk3OCBJTiBJUDQgbG9jYWxob3N0XG5zPWljZVxudD0wIDBcbiIpOworCisgICAgLyogR2V0IHVmcmFnIGFuZCBwd2QgZnJvbSBjdXJyZW50IHNlc3Npb24gKi8KKyAgICBwal9pY2Vfc3RyYW5zX2dldF91ZnJhZ19wd2QoaWNlZGVtby5pY2VzdCwgJmxvY2FsX3VmcmFnLCAmbG9jYWxfcHdkLAorCQkJCU5VTEwsIE5VTEwpOworCisgICAgLyogV3JpdGUgdGhlIGE9aWNlLXVmcmFnIGFuZCBhPWljZS1wd2QgYXR0cmlidXRlcyAqLworICAgIFBSSU5UKCJhPWljZS11ZnJhZzolLipzXG5hPWljZS1wd2Q6JS4qc1xuIiwKKwkgICAoaW50KWxvY2FsX3VmcmFnLnNsZW4sCisJICAgbG9jYWxfdWZyYWcucHRyLAorCSAgIChpbnQpbG9jYWxfcHdkLnNsZW4sCisJICAgbG9jYWxfcHdkLnB0cik7CisKKyAgICAvKiBXcml0ZSBlYWNoIGNvbXBvbmVudCAqLworICAgIGZvciAoY29tcD0wOyBjb21wPGljZWRlbW8ub3B0LmNvbXBfY250OyArK2NvbXApIHsKKwl1bnNpZ25lZCBqLCBjYW5kX2NudDsKKwlwal9pY2Vfc2Vzc19jYW5kIGNhbmRbUEpfSUNFX1NUX01BWF9DQU5EXTsKKwljaGFyIGlwYWRkcltQSl9JTkVUNl9BRERSU1RSTEVOXTsKKworCS8qIEdldCBkZWZhdWx0IGNhbmRpZGF0ZSBmb3IgdGhlIGNvbXBvbmVudCAqLworCXN0YXR1cyA9IHBqX2ljZV9zdHJhbnNfZ2V0X2RlZl9jYW5kKGljZWRlbW8uaWNlc3QsIGNvbXArMSwgJmNhbmRbMF0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIC1zdGF0dXM7CisKKwkvKiBXcml0ZSB0aGUgZGVmYXVsdCBhZGRyZXNzICovCisJaWYgKGNvbXA9PTApIHsKKwkgICAgLyogRm9yIGNvbXBvbmVudCAxLCBkZWZhdWx0IGFkZHJlc3MgaXMgaW4gbT0gYW5kIGM9IGxpbmVzICovCisJICAgIFBSSU5UKCJtPWF1ZGlvICVkIFJUUC9BVlAgMFxuIgorCQkgICJjPUlOIElQNCAlc1xuIiwKKwkJICAoaW50KXBqX3NvY2thZGRyX2dldF9wb3J0KCZjYW5kWzBdLmFkZHIpLAorCQkgIHBqX3NvY2thZGRyX3ByaW50KCZjYW5kWzBdLmFkZHIsIGlwYWRkciwKKwkJCQkgICAgc2l6ZW9mKGlwYWRkciksIDApKTsKKwl9IGVsc2UgaWYgKGNvbXA9PTEpIHsKKwkgICAgLyogRm9yIGNvbXBvbmVudCAyLCBkZWZhdWx0IGFkZHJlc3MgaXMgaW4gYT1ydGNwIGxpbmUgKi8KKwkgICAgUFJJTlQoImE9cnRjcDolZCBJTiBJUDQgJXNcbiIsCisJCSAgKGludClwal9zb2NrYWRkcl9nZXRfcG9ydCgmY2FuZFswXS5hZGRyKSwKKwkJICBwal9zb2NrYWRkcl9wcmludCgmY2FuZFswXS5hZGRyLCBpcGFkZHIsCisJCQkJICAgIHNpemVvZihpcGFkZHIpLCAwKSk7CisJfSBlbHNlIHsKKwkgICAgLyogRm9yIG90aGVyIGNvbXBvbmVudHMsIHdlJ2xsIGp1c3QgaW52ZW50IHRoaXMuLiAqLworCSAgICBQUklOVCgiYT1YaWNlLWRlZmNhbmQ6JWQgSU4gSVA0ICVzXG4iLAorCQkgIChpbnQpcGpfc29ja2FkZHJfZ2V0X3BvcnQoJmNhbmRbMF0uYWRkciksCisJCSAgcGpfc29ja2FkZHJfcHJpbnQoJmNhbmRbMF0uYWRkciwgaXBhZGRyLAorCQkJCSAgICBzaXplb2YoaXBhZGRyKSwgMCkpOworCX0KKworCS8qIEVudW1lcmF0ZSBhbGwgY2FuZGlkYXRlcyBmb3IgdGhpcyBjb21wb25lbnQgKi8KKwljYW5kX2NudCA9IFBKX0FSUkFZX1NJWkUoY2FuZCk7CisJc3RhdHVzID0gcGpfaWNlX3N0cmFuc19lbnVtX2NhbmRzKGljZWRlbW8uaWNlc3QsIGNvbXArMSwKKwkJCQkJICAmY2FuZF9jbnQsIGNhbmQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIC1zdGF0dXM7CisKKwkvKiBBbmQgZW5jb2RlIHRoZSBjYW5kaWRhdGVzIGFzIFNEUCAqLworCWZvciAoaj0wOyBqPGNhbmRfY250OyArK2opIHsKKwkgICAgcHJpbnRlZCA9IHByaW50X2NhbmQocCwgbWF4bGVuIC0gKHVuc2lnbmVkKShwLWJ1ZmZlciksICZjYW5kW2pdKTsKKwkgICAgaWYgKHByaW50ZWQgPCAwKQorCQlyZXR1cm4gLVBKX0VUT09TTUFMTDsKKwkgICAgcCArPSBwcmludGVkOworCX0KKyAgICB9CisKKyAgICBpZiAocCA9PSBidWZmZXIrbWF4bGVuKQorCXJldHVybiAtUEpfRVRPT1NNQUxMOworCisgICAgKnAgPSAnXDAnOworICAgIHJldHVybiAoaW50KShwIC0gYnVmZmVyKTsKK30KKworCisvKgorICogU2hvdyBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIElDRSBzdHJlYW0gdHJhbnNwb3J0LiBUaGlzIGlzCisgKiBpbnZva2VkIGZyb20gdGhlIG1lbnUuCisgKi8KK3N0YXRpYyB2b2lkIGljZWRlbW9fc2hvd19pY2Uodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZmZXJbMTAwMF07CisgICAgaW50IGxlbjsKKworICAgIGlmIChpY2VkZW1vLmljZXN0ID09IE5VTEwpIHsKKwlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IE5vIElDRSBpbnN0YW5jZSwgY3JlYXRlIGl0IGZpcnN0IikpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwdXRzKCJHZW5lcmFsIGluZm8iKTsKKyAgICBwdXRzKCItLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBwcmludGYoIkNvbXBvbmVudCBjb3VudCAgICA6ICVkXG4iLCBpY2VkZW1vLm9wdC5jb21wX2NudCk7CisgICAgcHJpbnRmKCJTdGF0dXMgICAgICAgICAgICAgOiAiKTsKKyAgICBpZiAocGpfaWNlX3N0cmFuc19zZXNzX2lzX2NvbXBsZXRlKGljZWRlbW8uaWNlc3QpKQorCXB1dHMoIm5lZ290aWF0aW9uIGNvbXBsZXRlIik7CisgICAgZWxzZSBpZiAocGpfaWNlX3N0cmFuc19zZXNzX2lzX3J1bm5pbmcoaWNlZGVtby5pY2VzdCkpCisJcHV0cygibmVnb3RpYXRpb24gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICBlbHNlIGlmIChwal9pY2Vfc3RyYW5zX2hhc19zZXNzKGljZWRlbW8uaWNlc3QpKQorCXB1dHMoInNlc3Npb24gcmVhZHkiKTsKKyAgICBlbHNlCisJcHV0cygic2Vzc2lvbiBub3QgY3JlYXRlZCIpOworCisgICAgaWYgKCFwal9pY2Vfc3RyYW5zX2hhc19zZXNzKGljZWRlbW8uaWNlc3QpKSB7CisJcHV0cygiQ3JlYXRlIHRoZSBzZXNzaW9uIGZpcnN0IHRvIHNlZSBtb3JlIGluZm8iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCJOZWdvdGlhdGVkIGNvbXBfY250OiAlZFxuIiwgCisJICAgcGpfaWNlX3N0cmFuc19nZXRfcnVubmluZ19jb21wX2NudChpY2VkZW1vLmljZXN0KSk7CisgICAgcHJpbnRmKCJSb2xlICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkgICBwal9pY2Vfc3RyYW5zX2dldF9yb2xlKGljZWRlbW8uaWNlc3QpPT1QSl9JQ0VfU0VTU19ST0xFX0NPTlRST0xMRUQgPworCSAgICJjb250cm9sbGVkIiA6ICJjb250cm9sbGluZyIpOworCisgICAgbGVuID0gZW5jb2RlX3Nlc3Npb24oYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgaWYgKGxlbiA8IDApCisJZXJyX2V4aXQoIm5vdCBlbm91Z2ggYnVmZmVyIHRvIHNob3cgSUNFIHN0YXR1cyIsIC1sZW4pOworCisgICAgcHV0cygiIik7CisgICAgcHJpbnRmKCJMb2NhbCBTRFAgKHBhc3RlIHRoaXMgdG8gcmVtb3RlIGhvc3QpOlxuIgorCSAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSAgICIlc1xuIiwgYnVmZmVyKTsKKworCisgICAgcHV0cygiIik7CisgICAgcHV0cygiUmVtb3RlIGluZm86XG4iCisJICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgaWYgKGljZWRlbW8ucmVtLmNhbmRfY250PT0wKSB7CisJcHV0cygiTm8gcmVtb3RlIGluZm8geWV0Iik7CisgICAgfSBlbHNlIHsKKwl1bnNpZ25lZCBpOworCisJcHJpbnRmKCJSZW1vdGUgdWZyYWcgICAgICAgOiAlc1xuIiwgaWNlZGVtby5yZW0udWZyYWcpOworCXByaW50ZigiUmVtb3RlIHBhc3N3b3JkICAgIDogJXNcbiIsIGljZWRlbW8ucmVtLnB3ZCk7CisJcHJpbnRmKCJSZW1vdGUgY2FuZC4gY250LiAgOiAlZFxuIiwgaWNlZGVtby5yZW0uY2FuZF9jbnQpOworCisJZm9yIChpPTA7IGk8aWNlZGVtby5yZW0uY2FuZF9jbnQ7ICsraSkgeworCSAgICBsZW4gPSBwcmludF9jYW5kKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZpY2VkZW1vLnJlbS5jYW5kW2ldKTsKKwkgICAgaWYgKGxlbiA8IDApCisJCWVycl9leGl0KCJub3QgZW5vdWdoIGJ1ZmZlciB0byBzaG93IElDRSBzdGF0dXMiLCAtbGVuKTsKKworCSAgICBwcmludGYoIiAgJXMiLCBidWZmZXIpOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIElucHV0IGFuZCBwYXJzZSBTRFAgZnJvbSB0aGUgcmVtb3RlIChjb250YWluaW5nIHJlbW90ZSdzIElDRSBpbmZvcm1hdGlvbikgCisgKiBhbmQgc2F2ZSBpdCB0byBnbG9iYWwgdmFyaWFibGVzLgorICovCitzdGF0aWMgdm9pZCBpY2VkZW1vX2lucHV0X3JlbW90ZSh2b2lkKQoreworICAgIGNoYXIgbGluZWJ1Zls4MF07CisgICAgdW5zaWduZWQgbWVkaWFfY250ID0gMDsKKyAgICB1bnNpZ25lZCBjb21wMF9wb3J0ID0gMDsKKyAgICBjaGFyICAgICBjb21wMF9hZGRyWzgwXTsKKyAgICBwal9ib29sX3QgZG9uZSA9IFBKX0ZBTFNFOworCisgICAgcHV0cygiUGFzdGUgU0RQIGZyb20gcmVtb3RlIGhvc3QsIGVuZCB3aXRoIGVtcHR5IGxpbmUiKTsKKworICAgIHJlc2V0X3JlbV9pbmZvKCk7CisKKyAgICBjb21wMF9hZGRyWzBdID0gJ1wwJzsKKworICAgIHdoaWxlICghZG9uZSkgeworCXBqX3NpemVfdCBsZW47CisJY2hhciAqbGluZTsKKworCXByaW50ZigiPiIpOworCWlmIChzdGRvdXQpIGZmbHVzaChzdGRvdXQpOworCisJaWYgKGZnZXRzKGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgc3RkaW4pPT1OVUxMKQorCSAgICBicmVhazsKKworCWxlbiA9IHN0cmxlbihsaW5lYnVmKTsKKwl3aGlsZSAobGVuICYmIChsaW5lYnVmW2xlbi0xXSA9PSAnXHInIHx8IGxpbmVidWZbbGVuLTFdID09ICdcbicpKQorCSAgICBsaW5lYnVmWy0tbGVuXSA9ICdcMCc7CisKKwlsaW5lID0gbGluZWJ1ZjsKKwl3aGlsZSAobGVuICYmIHBqX2lzc3BhY2UoKmxpbmUpKQorCSAgICArK2xpbmUsIC0tbGVuOworCisJaWYgKGxlbj09MCkKKwkgICAgYnJlYWs7CisKKwkvKiBJZ25vcmUgc3Vic2VxdWVudCBtZWRpYSBkZXNjcmlwdG9ycyAqLworCWlmIChtZWRpYV9jbnQgPiAxKQorCSAgICBjb250aW51ZTsKKworCXN3aXRjaCAobGluZVswXSkgeworCWNhc2UgJ20nOgorCSAgICB7CisJCWludCBjbnQ7CisJCWNoYXIgbWVkaWFbMzJdLCBwb3J0c3RyWzMyXTsKKworCQkrK21lZGlhX2NudDsKKwkJaWYgKG1lZGlhX2NudCA+IDEpIHsKKwkJICAgIHB1dHMoIk1lZGlhIGxpbmUgaWdub3JlZCIpOworCQkgICAgYnJlYWs7CisJCX0KKworCQljbnQgPSBzc2NhbmYobGluZSsyLCAiJXMgJXMgUlRQLyIsIG1lZGlhLCBwb3J0c3RyKTsKKwkJaWYgKGNudCAhPSAyKSB7CisJCSAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3IgcGFyc2luZyBtZWRpYSBsaW5lIikpOworCQkgICAgZ290byBvbl9lcnJvcjsKKwkJfQorCisJCWNvbXAwX3BvcnQgPSBhdG9pKHBvcnRzdHIpOworCQkKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICdjJzoKKwkgICAgeworCQlpbnQgY250OworCQljaGFyIGNbMzJdLCBuZXRbMzJdLCBpcFs4MF07CisJCQorCQljbnQgPSBzc2NhbmYobGluZSsyLCAiJXMgJXMgJXMiLCBjLCBuZXQsIGlwKTsKKwkJaWYgKGNudCAhPSAzKSB7CisJCSAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3IgcGFyc2luZyBjb25uZWN0aW9uIGxpbmUiKSk7CisJCSAgICBnb3RvIG9uX2Vycm9yOworCQl9CisKKwkJc3RyY3B5KGNvbXAwX2FkZHIsIGlwKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICdhJzoKKwkgICAgeworCQljaGFyICphdHRyID0gc3RydG9rKGxpbmUrMiwgIjogXHRcclxuIik7CisJCWlmIChzdHJjbXAoYXR0ciwgImljZS11ZnJhZyIpPT0wKSB7CisJCSAgICBzdHJjcHkoaWNlZGVtby5yZW0udWZyYWcsIGF0dHIrc3RybGVuKGF0dHIpKzEpOworCQl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLCAiaWNlLXB3ZCIpPT0wKSB7CisJCSAgICBzdHJjcHkoaWNlZGVtby5yZW0ucHdkLCBhdHRyK3N0cmxlbihhdHRyKSsxKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXR0ciwgInJ0Y3AiKT09MCkgeworCQkgICAgY2hhciAqdmFsID0gYXR0citzdHJsZW4oYXR0cikrMTsKKwkJICAgIGludCBhZiwgY250OworCQkgICAgaW50IHBvcnQ7CisJCSAgICBjaGFyIG5ldFszMl0sIGlwWzY0XTsKKwkJICAgIHBqX3N0cl90IHRtcF9hZGRyOworCQkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJCSAgICBjbnQgPSBzc2NhbmYodmFsLCAiJWQgSU4gJXMgJXMiLCAmcG9ydCwgbmV0LCBpcCk7CisJCSAgICBpZiAoY250ICE9IDMpIHsKKwkJCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvciBwYXJzaW5nIHJ0Y3AgYXR0cmlidXRlIikpOworCQkJZ290byBvbl9lcnJvcjsKKwkJICAgIH0KKworCQkgICAgaWYgKHN0cmNocihpcCwgJzonKSkKKwkJCWFmID0gcGpfQUZfSU5FVDYoKTsKKwkJICAgIGVsc2UKKwkJCWFmID0gcGpfQUZfSU5FVCgpOworCisJCSAgICBwal9zb2NrYWRkcl9pbml0KGFmLCAmaWNlZGVtby5yZW0uZGVmX2FkZHJbMV0sIE5VTEwsIDApOworCQkgICAgdG1wX2FkZHIgPSBwal9zdHIoaXApOworCQkgICAgc3RhdHVzID0gcGpfc29ja2FkZHJfc2V0X3N0cl9hZGRyKGFmLCAmaWNlZGVtby5yZW0uZGVmX2FkZHJbMV0sCisJCQkJCQkgICAgICAmdG1wX2FkZHIpOworCQkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCQlQSl9MT0coMSwoVEhJU19GSUxFLCAiSW52YWxpZCBJUCBhZGRyZXNzIikpOworCQkJZ290byBvbl9lcnJvcjsKKwkJICAgIH0KKwkJICAgIHBqX3NvY2thZGRyX3NldF9wb3J0KCZpY2VkZW1vLnJlbS5kZWZfYWRkclsxXSwgKHBqX3VpbnQxNl90KXBvcnQpOworCisJCX0gZWxzZSBpZiAoc3RyY21wKGF0dHIsICJjYW5kaWRhdGUiKT09MCkgeworCQkgICAgY2hhciAqc2RwY2FuZCA9IGF0dHIrc3RybGVuKGF0dHIpKzE7CisJCSAgICBpbnQgYWYsIGNudDsKKwkJICAgIGNoYXIgZm91bmRhdGlvblszMl0sIHRyYW5zcG9ydFsxMl0sIGlwYWRkcls4MF0sIHR5cGVbMzJdOworCQkgICAgcGpfc3RyX3QgdG1wYWRkcjsKKwkJICAgIGludCBjb21wX2lkLCBwcmlvLCBwb3J0OworCQkgICAgcGpfaWNlX3Nlc3NfY2FuZCAqY2FuZDsKKwkJICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCQkgICAgY250ID0gc3NjYW5mKHNkcGNhbmQsICIlcyAlZCAlcyAlZCAlcyAlZCB0eXAgJXMiLAorCQkJCSBmb3VuZGF0aW9uLAorCQkJCSAmY29tcF9pZCwKKwkJCQkgdHJhbnNwb3J0LAorCQkJCSAmcHJpbywKKwkJCQkgaXBhZGRyLAorCQkJCSAmcG9ydCwKKwkJCQkgdHlwZSk7CisJCSAgICBpZiAoY250ICE9IDcpIHsKKwkJCVBKX0xPRygxLCAoVEhJU19GSUxFLCAiZXJyb3I6IEludmFsaWQgSUNFIGNhbmRpZGF0ZSBsaW5lIikpOworCQkJZ290byBvbl9lcnJvcjsKKwkJICAgIH0KKworCQkgICAgY2FuZCA9ICZpY2VkZW1vLnJlbS5jYW5kW2ljZWRlbW8ucmVtLmNhbmRfY250XTsKKwkJICAgIHBqX2J6ZXJvKGNhbmQsIHNpemVvZigqY2FuZCkpOworCQkgICAgCisJCSAgICBpZiAoc3RyY21wKHR5cGUsICJob3N0Iik9PTApCisJCQljYW5kLT50eXBlID0gUEpfSUNFX0NBTkRfVFlQRV9IT1NUOworCQkgICAgZWxzZSBpZiAoc3RyY21wKHR5cGUsICJzcmZseCIpPT0wKQorCQkJY2FuZC0+dHlwZSA9IFBKX0lDRV9DQU5EX1RZUEVfU1JGTFg7CisJCSAgICBlbHNlIGlmIChzdHJjbXAodHlwZSwgInJlbGF5Iik9PTApCisJCQljYW5kLT50eXBlID0gUEpfSUNFX0NBTkRfVFlQRV9SRUxBWUVEOworCQkgICAgZWxzZSB7CisJCQlQSl9MT0coMSwgKFRISVNfRklMRSwgIkVycm9yOiBpbnZhbGlkIGNhbmRpZGF0ZSB0eXBlICclcyciLCAKKwkJCQkgICB0eXBlKSk7CisJCQlnb3RvIG9uX2Vycm9yOworCQkgICAgfQorCisJCSAgICBjYW5kLT5jb21wX2lkID0gKHBqX3VpbnQ4X3QpY29tcF9pZDsKKwkJICAgIHBqX3N0cmR1cDIoaWNlZGVtby5wb29sLCAmY2FuZC0+Zm91bmRhdGlvbiwgZm91bmRhdGlvbik7CisJCSAgICBjYW5kLT5wcmlvID0gcHJpbzsKKwkJICAgIAorCQkgICAgaWYgKHN0cmNocihpcGFkZHIsICc6JykpCisJCQlhZiA9IHBqX0FGX0lORVQ2KCk7CisJCSAgICBlbHNlCisJCQlhZiA9IHBqX0FGX0lORVQoKTsKKworCQkgICAgdG1wYWRkciA9IHBqX3N0cihpcGFkZHIpOworCQkgICAgcGpfc29ja2FkZHJfaW5pdChhZiwgJmNhbmQtPmFkZHIsIE5VTEwsIDApOworCQkgICAgc3RhdHVzID0gcGpfc29ja2FkZHJfc2V0X3N0cl9hZGRyKGFmLCAmY2FuZC0+YWRkciwgJnRtcGFkZHIpOworCQkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCQlQSl9MT0coMSwoVEhJU19GSUxFLCAiRXJyb3I6IGludmFsaWQgSVAgYWRkcmVzcyAnJXMnIiwKKwkJCQkgIGlwYWRkcikpOworCQkJZ290byBvbl9lcnJvcjsKKwkJICAgIH0KKworCQkgICAgcGpfc29ja2FkZHJfc2V0X3BvcnQoJmNhbmQtPmFkZHIsIChwal91aW50MTZfdClwb3J0KTsKKworCQkgICAgKytpY2VkZW1vLnJlbS5jYW5kX2NudDsKKworCQkgICAgaWYgKGNhbmQtPmNvbXBfaWQgPiBpY2VkZW1vLnJlbS5jb21wX2NudCkKKwkJCWljZWRlbW8ucmVtLmNvbXBfY250ID0gY2FuZC0+Y29tcF9pZDsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoaWNlZGVtby5yZW0uY2FuZF9jbnQ9PTAgfHwKKwlpY2VkZW1vLnJlbS51ZnJhZ1swXT09MCB8fAorCWljZWRlbW8ucmVtLnB3ZFswXT09MCB8fAorCWljZWRlbW8ucmVtLmNvbXBfY250ID09IDApCisgICAgeworCVBKX0xPRygxLCAoVEhJU19GSUxFLCAiRXJyb3I6IG5vdCBlbm91Z2ggaW5mbyIpKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIGlmIChjb21wMF9wb3J0PT0wIHx8IGNvbXAwX2FkZHJbMF09PSdcMCcpIHsKKwlQSl9MT0coMSwgKFRISVNfRklMRSwgIkVycm9yOiBkZWZhdWx0IGFkZHJlc3MgZm9yIGNvbXBvbmVudCAwIG5vdCBmb3VuZCIpKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0gZWxzZSB7CisJaW50IGFmOworCXBqX3N0cl90IHRtcF9hZGRyOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCWlmIChzdHJjaHIoY29tcDBfYWRkciwgJzonKSkKKwkgICAgYWYgPSBwal9BRl9JTkVUNigpOworCWVsc2UKKwkgICAgYWYgPSBwal9BRl9JTkVUKCk7CisKKwlwal9zb2NrYWRkcl9pbml0KGFmLCAmaWNlZGVtby5yZW0uZGVmX2FkZHJbMF0sIE5VTEwsIDApOworCXRtcF9hZGRyID0gcGpfc3RyKGNvbXAwX2FkZHIpOworCXN0YXR1cyA9IHBqX3NvY2thZGRyX3NldF9zdHJfYWRkcihhZiwgJmljZWRlbW8ucmVtLmRlZl9hZGRyWzBdLAorCQkJCQkgICZ0bXBfYWRkcik7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygxLChUSElTX0ZJTEUsICJJbnZhbGlkIElQIGFkZHJlc3MgaW4gYz0gbGluZSIpKTsKKwkgICAgZ290byBvbl9lcnJvcjsKKwl9CisJcGpfc29ja2FkZHJfc2V0X3BvcnQoJmljZWRlbW8ucmVtLmRlZl9hZGRyWzBdLCAocGpfdWludDE2X3QpY29tcDBfcG9ydCk7CisgICAgfQorCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJEb25lLCAlZCByZW1vdGUgY2FuZGlkYXRlKHMpIGFkZGVkIiwgCisJICAgICAgIGljZWRlbW8ucmVtLmNhbmRfY250KSk7CisgICAgcmV0dXJuOworCitvbl9lcnJvcjoKKyAgICByZXNldF9yZW1faW5mbygpOworfQorCisKKy8qCisgKiBTdGFydCBJQ0UgbmVnb3RpYXRpb24hIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIHRoZSBtZW51LgorICovCitzdGF0aWMgdm9pZCBpY2VkZW1vX3N0YXJ0X25lZ28odm9pZCkKK3sKKyAgICBwal9zdHJfdCBydWZyYWcsIHJwd2Q7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKGljZWRlbW8uaWNlc3QgPT0gTlVMTCkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogTm8gSUNFIGluc3RhbmNlLCBjcmVhdGUgaXQgZmlyc3QiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICghcGpfaWNlX3N0cmFuc19oYXNfc2VzcyhpY2VkZW1vLmljZXN0KSkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogTm8gSUNFIHNlc3Npb24sIGluaXRpYWxpemUgZmlyc3QiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChpY2VkZW1vLnJlbS5jYW5kX2NudCA9PSAwKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBObyByZW1vdGUgaW5mbywgaW5wdXQgcmVtb3RlIGluZm8gZmlyc3QiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJTdGFydGluZyBJQ0UgbmVnb3RpYXRpb24uLiIpKTsKKworICAgIHN0YXR1cyA9IHBqX2ljZV9zdHJhbnNfc3RhcnRfaWNlKGljZWRlbW8uaWNlc3QsIAorCQkJCSAgICAgcGpfY3N0cigmcnVmcmFnLCBpY2VkZW1vLnJlbS51ZnJhZyksCisJCQkJICAgICBwal9jc3RyKCZycHdkLCBpY2VkZW1vLnJlbS5wd2QpLAorCQkJCSAgICAgaWNlZGVtby5yZW0uY2FuZF9jbnQsCisJCQkJICAgICBpY2VkZW1vLnJlbS5jYW5kKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJaWNlZGVtb19wZXJyb3IoIkVycm9yIHN0YXJ0aW5nIElDRSIsIHN0YXR1cyk7CisgICAgZWxzZQorCVBKX0xPRygzLChUSElTX0ZJTEUsICJJQ0UgbmVnb3RpYXRpb24gc3RhcnRlZCIpKTsKK30KKworCisvKgorICogU2VuZCBhcHBsaWNhdGlvbiBkYXRhIHRvIHJlbW90ZSBhZ2VudC4KKyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19zZW5kX2RhdGEodW5zaWduZWQgY29tcF9pZCwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoaWNlZGVtby5pY2VzdCA9PSBOVUxMKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBObyBJQ0UgaW5zdGFuY2UsIGNyZWF0ZSBpdCBmaXJzdCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwal9pY2Vfc3RyYW5zX2hhc19zZXNzKGljZWRlbW8uaWNlc3QpKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBObyBJQ0Ugc2Vzc2lvbiwgaW5pdGlhbGl6ZSBmaXJzdCIpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICBpZiAoIXBqX2ljZV9zdHJhbnNfc2Vzc19pc19jb21wbGV0ZShpY2VkZW1vLmljZXN0KSkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogSUNFIG5lZ290aWF0aW9uIGhhcyBub3QgYmVlbiBzdGFydGVkIG9yIGlzIGluIHByb2dyZXNzIikpOworCXJldHVybjsKKyAgICB9CisgICAgKi8KKworICAgIGlmIChjb21wX2lkPDF8fGNvbXBfaWQ+cGpfaWNlX3N0cmFuc19nZXRfcnVubmluZ19jb21wX2NudChpY2VkZW1vLmljZXN0KSkgeworCVBKX0xPRygxLChUSElTX0ZJTEUsICJFcnJvcjogaW52YWxpZCBjb21wb25lbnQgSUQiKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX2ljZV9zdHJhbnNfc2VuZHRvKGljZWRlbW8uaWNlc3QsIGNvbXBfaWQsIGRhdGEsIHN0cmxlbihkYXRhKSwKKwkJCQkgICZpY2VkZW1vLnJlbS5kZWZfYWRkcltjb21wX2lkLTFdLAorCQkJCSAgcGpfc29ja2FkZHJfZ2V0X2xlbigmaWNlZGVtby5yZW0uZGVmX2FkZHJbY29tcF9pZC0xXSkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlpY2VkZW1vX3BlcnJvcigiRXJyb3Igc2VuZGluZyBkYXRhIiwgc3RhdHVzKTsKKyAgICBlbHNlCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIkRhdGEgc2VudCIpKTsKK30KKworCisvKgorICogRGlzcGxheSBoZWxwIGZvciB0aGUgbWVudS4KKyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19oZWxwX21lbnUodm9pZCkKK3sKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCItPSBIZWxwIG9uIHVzaW5nIElDRSBhbmQgdGhpcyBpY2VkZW1vIHByb2dyYW0gPS0iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIElDRSBpbiBwam5hdGggd2l0aG91dCBoYXZpbmdcbiIKKwkgInRvIHVzZSB0aGUgU0lQIHByb3RvY29sLiBUbyB1c2UgdGhpcyBhcHBsaWNhdGlvbiwgeW91IHdpbGwgbmVlZCB0byBydW5cbiIKKwkgInR3byBpbnN0YW5jZXMgb2YgdGhpcyBhcHBsaWNhdGlvbiwgdG8gc2ltdWxhdGUgdHdvIElDRSBhZ2VudHMuXG4iKTsKKworICAgIHB1dHMoIkJhc2ljIElDRSBmbG93OlxuIgorCSAiIGNyZWF0ZSBpbnN0YW5jZSBbbWVudSBcImNcIl1cbiIKKwkgIiByZXBlYXQgdGhlc2Ugc3RlcHMgYXMgd2FudGVkOlxuIgorCSAiICAgLSBpbml0IHNlc3Npb24gYXMgb2ZmZXJlciBvciBhbnN3ZXJlciBbbWVudSBcImlcIl1cbiIKKwkgIiAgIC0gZGlzcGxheSBvdXIgU0RQIFttZW51IFwic1wiXVxuIgorCSAiICAgLSBcInNlbmRcIiBvdXIgU0RQIGZyb20gdGhlIFwic2hvd1wiIG91dHB1dCBhYm92ZSB0byByZW1vdGUsIGJ5XG4iCisJICIgICAgIGNvcHktcGFzdGluZyB0aGUgU0RQIHRvIHRoZSBvdGhlciBpY2VkZW1vIGFwcGxpY2F0aW9uXG4iCisJICIgICAtIHBhcnNlIHJlbW90ZSBTRFAsIGJ5IHBhc3RpbmcgU0RQIGdlbmVyYXRlZCBieSB0aGUgb3RoZXIgaWNlZGVtb1xuIgorCSAiICAgICBpbnN0YW5jZSBbbWVudSBcInJcIl1cbiIKKwkgIiAgIC0gYmVnaW4gSUNFIG5lZ290aWF0aW9uIGluIG91ciBlbmQgW21lbnUgXCJiXCJdLCBhbmQgXG4iCisJICIgICAtIGltbWVkaWF0ZWx5IGJlZ2luIElDRSBuZWdvdGlhdGlvbiBpbiB0aGUgb3RoZXIgaWNlZGVtbyBpbnN0YW5jZVxuIgorCSAiICAgLSBJQ0UgbmVnb3RpYXRpb24gd2lsbCBydW4sIGFuZCByZXN1bHQgd2lsbCBiZSBwcmludGVkIHRvIHNjcmVlblxuIgorCSAiICAgLSBzZW5kIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVtb3RlIFttZW51IFwieFwiXVxuIgorCSAiICAgLSBlbmQvc3RvcCBJQ0Ugc2Vzc2lvbiBbbWVudSBcImVcIl1cbiIKKwkgIiBkZXN0cm95IGluc3RhbmNlIFttZW51IFwiZFwiXVxuIgorCSAiIik7CisKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJUaGlzIGNvbmNsdWRlcyB0aGUgaGVscCBzY3JlZW4uIik7CisgICAgcHV0cygiIik7Cit9CisKKworLyoKKyAqIERpc3BsYXkgY29uc29sZSBtZW51CisgKi8KK3N0YXRpYyB2b2lkIGljZWRlbW9fcHJpbnRfbWVudSh2b2lkKQoreworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOworICAgIHB1dHMoInwgICAgICAgICAgICAgICAgICAgIE0gRSBOIFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoIistLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOworICAgIHB1dHMoInwgYyB8IGNyZWF0ZSAgICAgICAgICAgQ3JlYXRlIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgZCB8IGRlc3Ryb3kgICAgICAgICAgRGVzdHJveSB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgaSB8IGluaXQgb3xhICAgICAgICAgSW5pdGlhbGl6ZSBJQ0Ugc2Vzc2lvbiBhcyBvZmZlcmVyIG9yIGFuc3dlcmVyICAgfCIpOworICAgIHB1dHMoInwgZSB8IHN0b3AgICAgICAgICAgICAgRW5kL3N0b3AgSUNFIHNlc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgcyB8IHNob3cgICAgICAgICAgICAgRGlzcGxheSBsb2NhbCBJQ0UgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgciB8IHJlbW90ZSAgICAgICAgICAgSW5wdXQgcmVtb3RlIElDRSBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgYiB8IHN0YXJ0ICAgICAgICAgICAgQmVnaW4gSUNFIG5lZ290aWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgeCB8IHNlbmQgPGNvbXBpZD4gLi4gU2VuZCBkYXRhIHRvIHJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoIistLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOworICAgIHB1dHMoInwgaCB8ICBoZWxwICAgICAgICAgICAgKiBIZWxwISAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoInwgcSB8ICBxdWl0ICAgICAgICAgICAgUXVpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIpOworICAgIHB1dHMoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOworfQorCisKKy8qCisgKiBNYWluIGNvbnNvbGUgbG9vcC4KKyAqLworc3RhdGljIHZvaWQgaWNlZGVtb19jb25zb2xlKHZvaWQpCit7CisgICAgcGpfYm9vbF90IGFwcF9xdWl0ID0gUEpfRkFMU0U7CisKKyAgICB3aGlsZSAoIWFwcF9xdWl0KSB7CisJY2hhciBpbnB1dFs4MF0sICpjbWQ7CisJY29uc3QgY2hhciAqU0VQID0gIiBcdFxyXG4iOworCXBqX3NpemVfdCBsZW47CisKKwlpY2VkZW1vX3ByaW50X21lbnUoKTsKKworCXByaW50ZigiSW5wdXQ6ICIpOworCWlmIChzdGRvdXQpIGZmbHVzaChzdGRvdXQpOworCisJcGpfYnplcm8oaW5wdXQsIHNpemVvZihpbnB1dCkpOworCWlmIChmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pID09IE5VTEwpCisJICAgIGJyZWFrOworCisJbGVuID0gc3RybGVuKGlucHV0KTsKKwl3aGlsZSAobGVuICYmIChpbnB1dFtsZW4tMV09PSdccicgfHwgaW5wdXRbbGVuLTFdPT0nXG4nKSkKKwkgICAgaW5wdXRbLS1sZW5dID0gJ1wwJzsKKworCWNtZCA9IHN0cnRvayhpbnB1dCwgU0VQKTsKKwlpZiAoIWNtZCkKKwkgICAgY29udGludWU7CisKKwlpZiAoc3RyY21wKGNtZCwgImNyZWF0ZSIpPT0wIHx8IHN0cmNtcChjbWQsICJjIik9PTApIHsKKworCSAgICBpY2VkZW1vX2NyZWF0ZV9pbnN0YW5jZSgpOworCisJfSBlbHNlIGlmIChzdHJjbXAoY21kLCAiZGVzdHJveSIpPT0wIHx8IHN0cmNtcChjbWQsICJkIik9PTApIHsKKworCSAgICBpY2VkZW1vX2Rlc3Ryb3lfaW5zdGFuY2UoKTsKKworCX0gZWxzZSBpZiAoc3RyY21wKGNtZCwgImluaXQiKT09MCB8fCBzdHJjbXAoY21kLCAiaSIpPT0wKSB7CisKKwkgICAgY2hhciAqcm9sZSA9IHN0cnRvayhOVUxMLCBTRVApOworCSAgICBpZiAocm9sZSkKKwkJaWNlZGVtb19pbml0X3Nlc3Npb24oKnJvbGUpOworCSAgICBlbHNlCisJCXB1dHMoImVycm9yOiBSb2xlIHJlcXVpcmVkIik7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChjbWQsICJzdG9wIik9PTAgfHwgc3RyY21wKGNtZCwgImUiKT09MCkgeworCisJICAgIGljZWRlbW9fc3RvcF9zZXNzaW9uKCk7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChjbWQsICJzaG93Iik9PTAgfHwgc3RyY21wKGNtZCwgInMiKT09MCkgeworCisJICAgIGljZWRlbW9fc2hvd19pY2UoKTsKKworCX0gZWxzZSBpZiAoc3RyY21wKGNtZCwgInJlbW90ZSIpPT0wIHx8IHN0cmNtcChjbWQsICJyIik9PTApIHsKKworCSAgICBpY2VkZW1vX2lucHV0X3JlbW90ZSgpOworCisJfSBlbHNlIGlmIChzdHJjbXAoY21kLCAic3RhcnQiKT09MCB8fCBzdHJjbXAoY21kLCAiYiIpPT0wKSB7CisKKwkgICAgaWNlZGVtb19zdGFydF9uZWdvKCk7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChjbWQsICJzZW5kIik9PTAgfHwgc3RyY21wKGNtZCwgIngiKT09MCkgeworCisJICAgIGNoYXIgKmNvbXAgPSBzdHJ0b2soTlVMTCwgU0VQKTsKKworCSAgICBpZiAoIWNvbXApIHsKKwkJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiBjb21wb25lbnQgSUQgcmVxdWlyZWQiKSk7CisJICAgIH0gZWxzZSB7CisJCWNoYXIgKmRhdGEgPSBjb21wICsgc3RybGVuKGNvbXApICsgMTsKKwkJaWYgKCFkYXRhKQorCQkgICAgZGF0YSA9ICIiOworCQlpY2VkZW1vX3NlbmRfZGF0YShhdG9pKGNvbXApLCBkYXRhKTsKKwkgICAgfQorCisJfSBlbHNlIGlmIChzdHJjbXAoY21kLCAiaGVscCIpPT0wIHx8IHN0cmNtcChjbWQsICJoIik9PTApIHsKKworCSAgICBpY2VkZW1vX2hlbHBfbWVudSgpOworCisJfSBlbHNlIGlmIChzdHJjbXAoY21kLCAicXVpdCIpPT0wIHx8IHN0cmNtcChjbWQsICJxIik9PTApIHsKKworCSAgICBhcHBfcXVpdCA9IFBKX1RSVUU7CisKKwl9IGVsc2UgeworCisJICAgIHByaW50ZigiSW52YWxpZCBjb21tYW5kICclcydcbiIsIGNtZCk7CisKKwl9CisgICAgfQorfQorCisKKy8qCisgKiBEaXNwbGF5IHByb2dyYW0gdXNhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGljZWRlbW9fdXNhZ2UoKQoreworICAgIHB1dHMoIlVzYWdlOiBpY2VkZW1vIFtvcHRvbnNdIik7CisgICAgcHJpbnRmKCJpY2VkZW1vIHYlcyBieSBwanNpcC5vcmdcbiIsIHBqX2dldF92ZXJzaW9uKCkpOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIkdlbmVyYWwgb3B0aW9uczoiKTsKKyAgICBwdXRzKCIgLS1jb21wLWNudCwgLWMgTiAgICAgICAgICBDb21wb25lbnQgY291bnQgKGRlZmF1bHQ9MSkiKTsKKyAgICBwdXRzKCIgLS1uYW1lc2VydmVyLCAtbiBJUCAgICAgICBDb25maWd1cmUgbmFtZXNlcnZlciB0byBhY3RpdmF0ZSBETlMgU1JWIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiIpOworICAgIHB1dHMoIiAtLW1heC1ob3N0LCAtSCBOICAgICAgICAgIFNldCBtYXggbnVtYmVyIG9mIGhvc3QgY2FuZGlkYXRlcyB0byBOIik7CisgICAgcHV0cygiIC0tcmVndWxhciwgLVIgICAgICAgICAgICAgVXNlIHJlZ3VsYXIgbm9taW5hdGlvbiAoZGVmYXVsdCBhZ2dyZXNzaXZlKSIpOworICAgIHB1dHMoIiAtLWxvZy1maWxlLCAtTCBGSUxFICAgICAgIFNhdmUgb3V0cHV0IHRvIGxvZyBGSUxFIik7CisgICAgcHV0cygiIC0taGVscCwgLWggICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHNjcmVlbi4iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJTVFVOIHJlbGF0ZWQgb3B0aW9uczoiKTsKKyAgICBwdXRzKCIgLS1zdHVuLXNydiwgLXMgSE9TVERPTSAgICBFbmFibGUgc3JmbHggY2FuZGlkYXRlIGJ5IHJlc29sdmluZyB0byBTVFVOIHNlcnZlci4iKTsKKyAgICBwdXRzKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NURE9NIG1heSBiZSBhIFwiaG9zdF9vcl9pcFs6cG9ydF1cIiBvciBhIGRvbWFpbiIpOworICAgIHB1dHMoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaWYgRE5TIFNSViByZXNvbHV0aW9uIGlzIHVzZWQuIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiVFVSTiByZWxhdGVkIG9wdGlvbnM6Iik7CisgICAgcHV0cygiIC0tdHVybi1zcnYsIC10IEhPU1RET00gICAgRW5hYmxlIHJlbGF5ZWQgY2FuZGlkYXRlIGJ5IHVzaW5nIHRoaXMgVFVSTiBzZXJ2ZXIuIik7CisgICAgcHV0cygiICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9TVERPTSBtYXkgYmUgYSBcImhvc3Rfb3JfaXBbOnBvcnRdXCIgb3IgYSBkb21haW4iKTsKKyAgICBwdXRzKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIGlmIEROUyBTUlYgcmVzb2x1dGlvbiBpcyB1c2VkLiIpOworICAgIHB1dHMoIiAtLXR1cm4tdGNwLCAtVCAgICAgICAgICAgIFVzZSBUQ1AgdG8gY29ubmVjdCB0byBUVVJOIHNlcnZlciIpOworICAgIHB1dHMoIiAtLXR1cm4tdXNlcm5hbWUsIC11IFVJRCAgIFNldCBUVVJOIHVzZXJuYW1lIG9mIHRoZSBjcmVkZW50aWFsIHRvIFVJRCIpOworICAgIHB1dHMoIiAtLXR1cm4tcGFzc3dvcmQsIC1wIFBXRCAgIFNldCBwYXNzd29yZCBvZiB0aGUgY3JlZGVudGlhbCB0byBXUFdEIik7CisgICAgcHV0cygiIC0tdHVybi1maW5nZXJwcmludCwgLUYgICAgVXNlIGZpbmdlcnByaW50IGZvciBvdXRnb2luZyBUVVJOIHJlcXVlc3RzIik7CisgICAgcHV0cygiIik7Cit9CisKKworLyoKKyAqIEFuZCBoZXJlJ3MgdGhlIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHN0cnVjdCBwal9nZXRvcHRfb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCXsgImNvbXAtY250IiwgICAgICAgICAgIDEsIDAsICdjJ30sCisJeyAibmFtZXNlcnZlciIsCQkxLCAwLCAnbid9LAorCXsgIm1heC1ob3N0IiwJCTEsIDAsICdIJ30sCisJeyAiaGVscCIsCQkwLCAwLCAnaCd9LAorCXsgInN0dW4tc3J2IiwJCTEsIDAsICdzJ30sCisJeyAidHVybi1zcnYiLAkJMSwgMCwgJ3QnfSwKKwl7ICJ0dXJuLXRjcCIsCQkwLCAwLCAnVCd9LAorCXsgInR1cm4tdXNlcm5hbWUiLAkxLCAwLCAndSd9LAorCXsgInR1cm4tcGFzc3dvcmQiLAkxLCAwLCAncCd9LAorCXsgInR1cm4tZmluZ2VycHJpbnQiLAkwLCAwLCAnRid9LAorCXsgInJlZ3VsYXIiLAkJMCwgMCwgJ1InfSwKKwl7ICJsb2ctZmlsZSIsCQkxLCAwLCAnTCd9LAorICAgIH07CisgICAgaW50IGMsIG9wdF9pZDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpY2VkZW1vLm9wdC5jb21wX2NudCA9IDE7CisgICAgaWNlZGVtby5vcHQubWF4X2hvc3QgPSAtMTsKKworICAgIHdoaWxlKChjPXBqX2dldG9wdF9sb25nKGFyZ2MsYXJndiwgImM6bjpzOnQ6dTpwOkg6TDpoVEZSIiwgbG9uZ19vcHRpb25zLCAmb3B0X2lkKSkhPS0xKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnYyc6CisJICAgIGljZWRlbW8ub3B0LmNvbXBfY250ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoaWNlZGVtby5vcHQuY29tcF9jbnQgPCAxIHx8IGljZWRlbW8ub3B0LmNvbXBfY250ID49IFBKX0lDRV9NQVhfQ09NUCkgeworCQlwdXRzKCJJbnZhbGlkIGNvbXBvbmVudCBjb3VudCB2YWx1ZSIpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICduJzoKKwkgICAgaWNlZGVtby5vcHQubnMgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnSCc6CisJICAgIGljZWRlbW8ub3B0Lm1heF9ob3N0ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdoJzoKKwkgICAgaWNlZGVtb191c2FnZSgpOworCSAgICByZXR1cm4gMDsKKwljYXNlICdzJzoKKwkgICAgaWNlZGVtby5vcHQuc3R1bl9zcnYgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAndCc6CisJICAgIGljZWRlbW8ub3B0LnR1cm5fc3J2ID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ1QnOgorCSAgICBpY2VkZW1vLm9wdC50dXJuX3RjcCA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCWNhc2UgJ3UnOgorCSAgICBpY2VkZW1vLm9wdC50dXJuX3VzZXJuYW1lID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgICBpY2VkZW1vLm9wdC50dXJuX3Bhc3N3b3JkID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ0YnOgorCSAgICBpY2VkZW1vLm9wdC50dXJuX2ZpbmdlcnByaW50ID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnUic6CisJICAgIGljZWRlbW8ub3B0LnJlZ3VsYXIgPSBQSl9UUlVFOworCSAgICBicmVhazsKKwljYXNlICdMJzoKKwkgICAgaWNlZGVtby5vcHQubG9nX2ZpbGUgPSBwal9vcHRhcmc7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHByaW50ZigiQXJndW1lbnQgXCIlc1wiIGlzIG5vdCB2YWxpZC4gVXNlIC1oIHRvIHNlZSBoZWxwIiwKKwkJICAgYXJndltwal9vcHRpbmRdKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAgIHN0YXR1cyA9IGljZWRlbW9faW5pdCgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gMTsKKworICAgIGljZWRlbW9fY29uc29sZSgpOworCisgICAgZXJyX2V4aXQoIlF1aXR0aW5nLi4iLCBQSl9TVUNDRVNTKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvaW52dGVzdGVyLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2ludnRlc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWI0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2ludnRlc3Rlci5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiAkSWQ6IGludnRlc3Rlci5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKy8qKgorICogaW52dGVzdGVyLmMKKyAqCisgKiBTZW5kIElOVklURS9yZS1JTlZJVEUgd2l0aG91dCBTRFAuCisgKi8KKworCisvKiBJbmNsdWRlIGFsbCBoZWFkZXJzLiAqLworI2luY2x1ZGUgPHBqc2lwLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFCSJpbnZ0ZXN0ZXIuYyIKKworI2RlZmluZSBQT1JUCQk1MDA2MAorI2RlZmluZSBQT1JUX1NUUgkiOjUwMDYwIgorI2RlZmluZSBTQU1FX0JSQU5DSAkwCisjZGVmaW5lIEFDS19IQVNfU0RQCTEKKworc3RhdGljIHBqc2lwX2VuZHBvaW50ICpzaXBfZW5kcHQ7CitzdGF0aWMgcGpfYm9vbF90ICAgICAgIHF1aXRfZmxhZzsKK3N0YXRpYyBwanNpcF9kaWFsb2cgICAqZGxnOworCisKKy8qIENhbGxiYWNrIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cy4gKi8KK3N0YXRpYyB2b2lkIG9uX3RzeF9zdGF0ZShwanNpcF90cmFuc2FjdGlvbiAqdHN4LCBwanNpcF9ldmVudCAqZXZlbnQpOworCitzdGF0aWMgcGpzaXBfbW9kdWxlIG1vZF9hcHAgPQoreworICAgIE5VTEwsIE5VTEwsCQkJICAgIC8qIHByZXYsIG5leHQuCQkqLworICAgIHsgIm1vZC1hcHAiLCA3IH0sCQkgICAgLyogTmFtZS4JCQkqLworICAgIC0xLAkJCQkgICAgLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTiwgLyogUHJpb3JpdHkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIGxvYWQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RhcnQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RvcCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiB1bmxvYWQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fcnhfcmVxdWVzdCgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3J4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVxdWVzdC4JCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVzcG9uc2UoKQkJKi8KKyAgICAmb25fdHN4X3N0YXRlCQkgICAgLyogb25fdHN4X3N0YXRlKCkJCSovCit9OworCisKKy8qIFdvcmtlciB0aHJlYWQgKi8KK3N0YXRpYyBpbnQgd29ya2VyX3RocmVhZCh2b2lkICphcmcpCit7CisgICAgUEpfVU5VU0VEX0FSRyhhcmcpOworCisgICAgd2hpbGUgKCFxdWl0X2ZsYWcpIHsKKwlwal90aW1lX3ZhbCB0aW1lb3V0ID0gezAsIDUwMH07CisJcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50cyhzaXBfZW5kcHQsICZ0aW1lb3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogU2VuZCByZXF1ZXN0ICovCitzdGF0aWMgdm9pZCBzZW5kX3JlcXVlc3QoY29uc3QgcGpzaXBfbWV0aG9kICptZXRob2QsCisJCQkgaW50IGNzZXEsCisJCQkgY29uc3QgcGpfc3RyX3QgKmJyYW5jaCwKKwkJCSBwal9ib29sX3Qgd2l0aF9vZmZlcikKK3sKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdHJfdCBkdW1teV9zZHBfc3RyID0gCisgICAgeworCSJ2PTBcclxuIgorCSJvPS0gMzM2MDg0MjA3MSAzMzYwODQyMDcxIElOIElQNCAxOTIuMTY4LjAuNjhcclxuIgorCSJzPXBqbWVkaWFcclxuIgorCSJjPUlOIElQNCAxOTIuMTY4LjAuNjhcclxuIgorCSJ0PTAgMFxyXG4iCisJIm09YXVkaW8gNDAwMCBSVFAvQVZQIDAgMTAxXHJcbiIKKwkiYT1ydGNwOjQwMDEgSU4gSVA0IDE5Mi4xNjguMC42OFxyXG4iCisJImE9cnRwbWFwOjAgUENNVS84MDAwXHJcbiIKKwkiYT1zZW5kcmVjdlxyXG4iCisJImE9cnRwbWFwOjEwMSB0ZWxlcGhvbmUtZXZlbnQvODAwMFxyXG4iCisJImE9Zm10cDoxMDEgMC0xNVxyXG4iLAorCTAKKyAgICB9OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfcmVxdWVzdChkbGcsIG1ldGhvZCwgY3NlcSwgJnRkYXRhKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgaWYgKGJyYW5jaCkgeworCXBqc2lwX3ZpYV9oZHIgKnZpYTsKKworCXZpYSA9IChwanNpcF92aWFfaGRyKikgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfVklBLCBOVUxMKTsKKwlwal9zdHJkdXAodGRhdGEtPnBvb2wsICZ2aWEtPmJyYW5jaF9wYXJhbSwgYnJhbmNoKTsKKyAgICB9CisKKyAgICBpZiAod2l0aF9vZmZlcikgeworCXBqc2lwX21zZ19ib2R5ICpib2R5OworCXBqX3N0cl90IG1pbWVfYXBwbGljYXRpb24gPSB7ICJhcHBsaWNhdGlvbiIsIDExfTsKKwlwal9zdHJfdCBtaW1lX3NkcCA9IHsic2RwIiwgM307CisKKworCWR1bW15X3NkcF9zdHIuc2xlbiA9IHBqX2Fuc2lfc3RybGVuKGR1bW15X3NkcF9zdHIucHRyKTsKKwlib2R5ID0gcGpzaXBfbXNnX2JvZHlfY3JlYXRlKHRkYXRhLT5wb29sLCAKKwkJCQkgICAgICZtaW1lX2FwcGxpY2F0aW9uLCAmbWltZV9zZHAsIAorCQkJCSAgICAgJmR1bW15X3NkcF9zdHIpOworCXRkYXRhLT5tc2ctPmJvZHkgPSBib2R5OworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19zZW5kX3JlcXVlc3QoZGxnLCB0ZGF0YSwgLTEsIE5VTEwpOworICAgIHBqX2Fzc2VydChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7Cit9CisKKy8qIENhbGxiYWNrIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cy4gKi8KK3N0YXRpYyB2b2lkIG9uX3RzeF9zdGF0ZShwanNpcF90cmFuc2FjdGlvbiAqdHN4LCBwanNpcF9ldmVudCAqZXZlbnQpCit7CisgICAgaWYgKHRzeC0+cm9sZSA9PSBQSlNJUF9ST0xFX1VBQykgeworCWlmICh0c3gtPm1ldGhvZC5pZCA9PSBQSlNJUF9JTlZJVEVfTUVUSE9EICYmIHRzeC0+c3RhdGUgPT0gUEpTSVBfVFNYX1NUQVRFX1RFUk1JTkFURUQpIHsKKyNpZiBTQU1FX0JSQU5DSAorCSAgICBzZW5kX3JlcXVlc3QoJnBqc2lwX2Fja19tZXRob2QsIHRzeC0+Y3NlcSwgJnRzeC0+YnJhbmNoLCBBQ0tfSEFTX1NEUCk7CisjZWxzZQorCSAgICBzZW5kX3JlcXVlc3QoJnBqc2lwX2Fja19tZXRob2QsIHRzeC0+Y3NlcSwgTlVMTCwgQUNLX0hBU19TRFApOworI2VuZGlmCisJfQorCisgICAgfSBlbHNlIHsKKwlpZiAoZXZlbnQtPnR5cGUgPT0gUEpTSVBfRVZFTlRfUlhfTVNHICYmIHRzeC0+c3RhdGUgPT0gUEpTSVBfVFNYX1NUQVRFX1RSWUlORykgeworCSAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKworCSAgICBwanNpcF9kbGdfY3JlYXRlX3Jlc3BvbnNlKGRsZywgZXZlbnQtPmJvZHkudHN4X3N0YXRlLnNyYy5yZGF0YSwKKwkJCQkgICAgICAyMDAsIE5VTEwsICZ0ZGF0YSk7CisJICAgIHBqc2lwX2RsZ19zZW5kX3Jlc3BvbnNlKGRsZywgdHN4LCB0ZGF0YSk7CisJfQorICAgIH0KK30KKworLyogbWFrZSBjYWxsICovCit2b2lkIG1ha2VfY2FsbChjaGFyICp1cmksIHBqX2Jvb2xfdCB3aXRoX29mZmVyKQoreworICAgIHBqX3N0cl90IGxvY2FsID0gcGpfc3RyKCJzaXA6bG9jYWxob3N0IiBQT1JUX1NUUik7CisgICAgcGpfc3RyX3QgcmVtb3RlID0gcGpfc3RyKHVyaSk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpzaXBfZGxnX2NyZWF0ZV91YWMocGpzaXBfdWFfaW5zdGFuY2UoKSwKKwkJCQkgICZsb2NhbCwgJmxvY2FsLCAmcmVtb3RlLCAmcmVtb3RlLCAmZGxnKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgcGpzaXBfZGxnX2luY19sb2NrKGRsZyk7CisKKyAgICBzdGF0dXMgPSBwanNpcF9kbGdfYWRkX3VzYWdlKGRsZywgJm1vZF9hcHAsIE5VTEwpOworICAgIHBqX2Fzc2VydChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7CisKKyAgICBwanNpcF9kbGdfaW5jX3Nlc3Npb24oZGxnLCAmbW9kX2FwcCk7CisKKyAgICBzZW5kX3JlcXVlc3QoJnBqc2lwX2ludml0ZV9tZXRob2QsIC0xLCBOVUxMLCB3aXRoX29mZmVyKTsKKworICAgIHBqc2lwX2RsZ19kZWNfbG9jayhkbGcpOworfQorCisvKiByZWludml0ZSAqLwordm9pZCByZWludml0ZShwal9ib29sX3Qgd2l0aF9vZmZlcikKK3sKKyAgICBzZW5kX3JlcXVlc3QoJnBqc2lwX2ludml0ZV9tZXRob2QsIC0xLCBOVUxMLCB3aXRoX29mZmVyKTsKK30KKworLyogaGFuZ3VwIGNhbGwgKi8KK3ZvaWQgaGFuZ3VwKHZvaWQpCit7CisgICAgc2VuZF9yZXF1ZXN0KCZwanNpcF9ieWVfbWV0aG9kLCAtMSwgTlVMTCwgUEpfRkFMU0UpOworICAgIHBqc2lwX2RsZ19kZWNfc2Vzc2lvbihkbGcsICZtb2RfYXBwKTsKK30KKworLyoKKyAqIG1haW4oKQorICoKKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIGlmIChhcmdjICE9IDIpIHsKKwlwdXRzKCJFcnJvcjogZGVzdGluYXRpb24gVVJMIG5lZWRlZCIpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIFRoZW4gaW5pdCBQSkxJQi1VVElMOiAqLworICAgIHN0YXR1cyA9IHBqbGliX3V0aWxfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogTXVzdCBjcmVhdGUgYSBwb29sIGZhY3RvcnkgYmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSBhbnkgbWVtb3J5LiAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeSwgMCk7CisKKworICAgIC8qIENyZWF0ZSB0aGUgZW5kcG9pbnQ6ICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCAic2lwc3RhdGVsZXNzIiwgCisJCQkJJnNpcF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiAKKyAgICAgKiBBZGQgVURQIHRyYW5zcG9ydCwgd2l0aCBoYXJkLWNvZGVkIHBvcnQgCisgICAgICovCisgICAgeworCXBqX3NvY2thZGRyX2luIGFkZHI7CisKKwlhZGRyLnNpbl9mYW1pbHkgPSBwal9BRl9JTkVUKCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwOworCWFkZHIuc2luX3BvcnQgPSBwal9odG9ucyhQT1JUKTsKKworCXN0YXR1cyA9IHBqc2lwX3VkcF90cmFuc3BvcnRfc3RhcnQoIHNpcF9lbmRwdCwgJmFkZHIsIE5VTEwsIDEsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAgICAgIkVycm9yIHN0YXJ0aW5nIFVEUCB0cmFuc3BvcnQgKHBvcnQgaW4gdXNlPykiKSk7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBwanNpcF90c3hfbGF5ZXJfaW5pdF9tb2R1bGUoc2lwX2VuZHB0KTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgc3RhdHVzID0gcGpzaXBfdWFfaW5pdF9tb2R1bGUoc2lwX2VuZHB0LCBOVUxMKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyoKKyAgICAgKiBSZWdpc3RlciBvdXIgbW9kdWxlIHRvIHJlY2VpdmUgaW5jb21pbmcgcmVxdWVzdHMuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKCBzaXBfZW5kcHQsICZtb2RfYXBwKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHBvb2wgPSBwanNpcF9lbmRwdF9jcmVhdGVfcG9vbChzaXBfZW5kcHQsICIiLCAxMDAwLCAxMDAwKTsKKworICAgIHN0YXR1cyA9IHBqX3RocmVhZF9jcmVhdGUocG9vbCwgIiIsICZ3b3JrZXJfdGhyZWFkLCBOVUxMLCAwLCAwLCAmdGhyZWFkKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHByaW50ZigiRGVzdGluYXRpb24gVVJMOiAlc1xuIiwgYXJndlsxXSk7CisKKyAgICBmb3IgKDs7KSB7CisJY2hhciBsaW5lWzEwXTsKKworCWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pOworCisJc3dpdGNoIChsaW5lWzBdKSB7CisJY2FzZSAnbSc6CisJICAgIG1ha2VfY2FsbChhcmd2WzFdLCBQSl9GQUxTRSk7CisJICAgIGJyZWFrOworCWNhc2UgJ00nOgorCSAgICBtYWtlX2NhbGwoYXJndlsxXSwgUEpfVFJVRSk7CisJICAgIGJyZWFrOworCWNhc2UgJ3InOgorCSAgICByZWludml0ZShQSl9GQUxTRSk7CisJICAgIGJyZWFrOworCWNhc2UgJ1InOgorCSAgICByZWludml0ZShQSl9UUlVFKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnaCc6CisJICAgIGhhbmd1cCgpOworCSAgICBicmVhazsKKwljYXNlICdxJzoKKwkgICAgZ290byBvbl9xdWl0OworCX0KKyAgICB9CisKK29uX3F1aXQ6CisgICAgcXVpdF9mbGFnID0gMTsKKyAgICBwal90aHJlYWRfam9pbih0aHJlYWQpOworCisgICAgcGpzaXBfZW5kcHRfZGVzdHJveShzaXBfZW5kcHQpOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjcCk7CisgICAgcGpfc2h1dGRvd24oKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9qYnNpbS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9qYnNpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGY2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2pic2ltLmMKQEAgLTAsMCArMSwxMTQxIEBACisvKiAkSWQ6IGpic2ltLmMgMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKy8qIGpic2ltOgorCisgICAgVGhpcyBwcm9ncmFtIGVtdWxhdGVzIHZhcmlvdXMgc3lzdGVtIGFuZCBuZXR3b3JrIGltcGFpcm1lbnQKKyAgICBjb25kaXRpb25zIGFzIHdlbGwgYXMgYXBwbGljYXRpb24gcGFyYW1ldGVycyBhbmQgYXBwbHkgaXQgdG8KKyAgICBhbiBpbnB1dCBXQVYgZmlsZS4gVGhlIG91dHB1dCBpcyBhbm90aGVyIFdBViBmaWxlIGFzIHdlbGwgYXMKKyAgICBhIGRldGFpbGVkIGxvZyBmaWxlIChpbiBDU1YgZm9ybWF0KSBmb3IgdHJvdWJsZXNob290aW5nLgorICovCisKKworLyogSW5jbHVkZSBQSk1FRElBIGFuZCBQSkxJQiAqLworI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFICAgImpic2ltLmMiCisKKy8qIFRpbWVyIHJlc29sdXRpb24gaW4gbXMgKG11c3QgYmUgTk9OWkVSTyEpICovCisjZGVmaW5lIFdBTExfQ0xPQ0tfVElDSwkgICAgMQorCisvKiBEZWZhdWx0cyBzZXR0aW5ncyAqLworI2RlZmluZSBDT0RFQwkJIlBDTVUiCisjZGVmaW5lIExPR19GSUxFCSJqYnNpbS5jc3YiCisjZGVmaW5lIFdBVl9SRUYJCSIuLi8uLi90ZXN0cy9wanN1YS93YXZzL2lucHV0Ljgud2F2IgorI2RlZmluZSBXQVZfT1VUCQkiamJzaW0ud2F2IgorI2RlZmluZSBEVVJBVElPTgk2MAorI2RlZmluZSBEVFgJCVBKX1RSVUUKKyNkZWZpbmUgUExDCQlQSl9UUlVFCisjZGVmaW5lIE1JTl9MT1NUX0JVUlNUCTAKKyNkZWZpbmUgTUFYX0xPU1RfQlVSU1QJMjAKKyNkZWZpbmUgTE9TU19DT1JSCTAKKyNkZWZpbmUgTE9TU19FWFRSQQkyCisjZGVmaW5lIFNJTEVOVAkJMQorCisvKgorICAgVGVzdCBzZXR1cDoKKworICAgSW5wdXQgV0FWIC0tPiBUWCBTdHJlYW0gLS0+IExvb3AgdHJhbnNwb3J0IC0tPiBSWCBTdHJlYW0gLS0+IE91dCBXQVYKKyAqLworCisvKiBTdHJlYW0gc2V0dGluZ3MgKi8KK3N0cnVjdCBzdHJlYW1fY2ZnCit7CisgICAgY29uc3QgY2hhcgkqbmFtZTsJCS8qIGZvciBsb2dnaW5nIHB1cnBvc2VzICovCisgICAgcGptZWRpYV9kaXIJIGRpcjsJCS8qIHN0cmVhbSBkaXJlY3Rpb24JKi8KKyAgICBwal9zdHJfdAkgY29kZWM7CQkvKiBjb2RlYyBuYW1lCQkqLworICAgIHVuc2lnbmVkCSBwdGltZTsJCS8qIHplcm8gZm9yIGRlZmF1bHQJKi8KKyAgICBwal9ib29sX3QJIGR0eDsJCS8qIERUWCBlbmFibGVkPwkJKi8KKyAgICBwal9ib29sX3QJIHBsYzsJCS8qIFBMQyBlbmFibGVkPwkJKi8KK307CisKKy8qIFN0cmVhbSBpbnN0YW5jZS4gV2Ugd2lsbCBpbnN0YW50aWF0ZSB0d28gc3RyZWFtcywgVFggYW5kIFJYICovCitzdHJ1Y3Qgc3RyZWFtCit7CisgICAgcGpfcG9vbF90CQkqcG9vbDsKKyAgICBwam1lZGlhX3N0cmVhbQkqc3RybTsKKyAgICBwam1lZGlhX3BvcnQJKnBvcnQ7CisKKyAgICAvKgorICAgICAqIFJ1bm5pbmcgc3RhdGVzOiAKKyAgICAgKi8KKyAgICB1bmlvbiB7CisJLyogVFggc3RyZWFtIHN0YXRlICovCisJc3RydWN0IHsKKwkgICAgcGpfdGltZV92YWwJbmV4dF9zY2hlZHVsZTsJLyogVGltZSB0byBzZW5kIG5leHQgcGFja2V0ICovCisJICAgIHVuc2lnbmVkCXRvdGFsX3R4OwkvKiAjIG9mIFRYIHBhY2tldHMgc28gZmFyICAgKi8KKwkgICAgaW50CQl0b3RhbF9sb3N0OwkvKiAjIG9mIGRyb3BwZWQgcGt0cyBzbyBmYXIgKi8KKwkgICAgdW5zaWduZWQJY3VyX2xvc3RfYnVyc3Q7CS8qIGN1cnJlbnQgIyBvZiBsb3N0IGJ1cnN0cyAqLworCSAgICB1bnNpZ25lZAlkcm9wX3Byb2I7CS8qIGRyb3AgcHJvYmFiaWxpdHkgdmFsdWUgICAqLworCQkJCSAgICAgICAgCisJfSB0eDsKKworCS8qIFJYIHN0cmVhbSBzdGF0ZSAqLworCXN0cnVjdCB7CisJICAgIHBqX3RpbWVfdmFsCW5leHRfc2NoZWR1bGU7CS8qIFRpbWUgdG8gZmV0Y2ggbmV4dCBwa3QgICAqLworCX0gcng7CisgICAgfSBzdGF0ZTsKK307CisKKy8qIAorICogTG9nZ2luZyAKKyAqLworCisvKiBFdmVudHMgbmFtZXMgKi8KKyNkZWZpbmUgRVZFTlRfTE9HCSIiCisjZGVmaW5lIEVWRU5UX1RYCSJUWC9QVVQiCisjZGVmaW5lIEVWRU5UX1RYX0RST1AJIioqKiBMT1NTICoqKiIKKyNkZWZpbmUgRVZFTlRfR0VUX1BSRQkiR0VUIChwcmUpIgorI2RlZmluZSBFVkVOVF9HRVRfUE9TVAkiR0VUIChwb3N0KSIKKworCisvKiBMb2dnaW5nIGVudHJ5ICovCitzdHJ1Y3QgbG9nX2VudHJ5Cit7CisgICAgcGpfdGltZV92YWwJCQkgd2FsbF9jbG9jazsJLyogV2FsbCBjbG9jayB0aW1lCSAgICAqLworICAgIGNvbnN0IGNoYXIJCQkqZXZlbnQ7CQkvKiBFdmVudCBuYW1lCQkgICAgKi8KKyAgICBwam1lZGlhX2piX3N0YXRlCQkqamJfc3RhdGU7CS8qIEpCIHN0YXRlLCBvcHRpb25hbAkgICAgKi8KKyAgICBwam1lZGlhX3J0Y3Bfc3RhdAkJKnN0YXQ7CQkvKiBTdHJlYW0gc3RhdCwgb3B0aW9uYWwgICAgKi8KKyAgICBjb25zdCBjaGFyCQkJKmxvZzsJCS8qIExvZyBtZXNzYWdlLCBvcHRpb25hbCAgICAqLworfTsKKworLyogVGVzdCBzZXR0aW5ncywgdGFrZW4gZnJvbSBjb21tYW5kIGxpbmUgKi8KK3N0cnVjdCB0ZXN0X2NmZworeworICAgIC8qIEdlbmVyYWwgb3B0aW9ucyAqLworICAgIHBqX2Jvb2xfdAkgICAgIHNpbGVudDsJCS8qIFdyaXRlIGxpdHRsZSB0byBzdGRvdXQgICAqLworICAgIGNvbnN0IGNoYXIJICAgICpsb2dfZmlsZTsJCS8qIFRoZSBvdXRwdXQgbG9nIGZpbGUJICAgICovCisKKyAgICAvKiBUZXN0IHNldHRpbmdzICovCisgICAgcGpfc3RyX3QJICAgICBjb2RlYzsJCS8qIENvZGVjIHRvIGJlIHVzZWQJICAgICovCisgICAgdW5zaWduZWQJICAgICBkdXJhdGlvbl9tc2VjOwkvKiBUZXN0IGR1cmF0aW9uCSAgICAqLworCisgICAgLyogVHJhbnNtaXR0ZXIgc2V0dGluZyAqLworICAgIGNvbnN0IGNoYXIJICAgICp0eF93YXZfaW47CQkvKiBJbnB1dC9yZWZlcmVuY2UgV0FWCSAgICAqLworICAgIHVuc2lnbmVkCSAgICAgdHhfcHRpbWU7CQkvKiBUWCBzdHJlYW0gcHRpbWUJICAgICovCisgICAgdW5zaWduZWQJICAgICB0eF9taW5faml0dGVyOwkvKiBNaW5pbXVtIGppdHRlciBpbiBtcwkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgIHR4X21heF9qaXR0ZXI7CS8qIE1heCBqaXR0ZXIgaW4gbXMJICAgICovCisgICAgdW5zaWduZWQJICAgICB0eF9kdHg7CQkvKiBEVFggZW5hYmxlZD8JCSAgICAqLworICAgIHVuc2lnbmVkCSAgICAgdHhfcGN0X2F2Z19sb3N0OwkvKiBBdmVyYWdlIGxvc3MgaW4gcGVyY2VudCAgKi8KKyAgICB1bnNpZ25lZAkgICAgIHR4X21pbl9sb3N0X2J1cnN0OwkvKiBNaW4gbG9zdCBidXJzdCBpbiAjcGt0ICAgKi8KKyAgICB1bnNpZ25lZAkgICAgIHR4X21heF9sb3N0X2J1cnN0OwkvKiBNYXggbG9zdCBidXJzdCBpbiAjcGt0ICAgKi8KKyAgICB1bnNpZ25lZAkgICAgIHR4X3BjdF9sb3NzX2NvcnI7CS8qIExvc3MgY29ycmVsYXRpb24gaW4gcGN0ICAqLworCisgICAgLyogUmVjZWl2ZXIgc2V0dGluZyAqLworICAgIGNvbnN0IGNoYXIJICAgICpyeF93YXZfb3V0OwkvKiBPdXRwdXQgV0FWIGZpbGUJICAgICovCisgICAgdW5zaWduZWQJICAgICByeF9wdGltZTsJCS8qIFJYIHN0cmVhbSBwdGltZQkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgIHJ4X3NuZF9idXJzdDsJLyogUlggc291bmQgYnVyc3QJICAgICovCisgICAgcGpfYm9vbF90CSAgICAgcnhfcGxjOwkJLyogUlggUExDIGVuYWJsZWQ/CSAgICAqLworICAgIGludAkJICAgICByeF9qYl9pbml0OwkvKiBpZiA+IDAgd2lsbCBlbmFibGUgcHJlZmV0Y2ggKG1zKSAqLworICAgIGludAkJICAgICByeF9qYl9taW5fcHJlOwkvKiBKQiBtaW5pbXVtIHByZWZldGNoIChtcykgKi8KKyAgICBpbnQJCSAgICAgcnhfamJfbWF4X3ByZTsJLyogSkIgbWF4aW11bSBwcmVmZXRjaCAobXMpICovCisgICAgaW50CQkgICAgIHJ4X2piX21heDsJCS8qIEpCIG1heGltdW0gc2l6ZSAobXMpCSAgICAqLworfTsKKworLyoKKyAqIEdsb2JhbCB2YXIKKyAqLworc3RydWN0IGdsb2JhbF9hcHAKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wJIGNwOworICAgIHBqX3Bvb2xfdAkJKnBvb2w7CisgICAgcGpfaW50MTZfdAkJKmZyYW1lYnVmOworICAgIHBqbWVkaWFfZW5kcHQJKmVuZHB0OworICAgIHBqbWVkaWFfdHJhbnNwb3J0CSpsb29wOworCisgICAgcGpfb3NoYW5kbGVfdAkgbG9nX2ZkOworCisgICAgc3RydWN0IHRlc3RfY2ZnCSBjZmc7CisKKyAgICBzdHJ1Y3Qgc3RyZWFtCSp0eDsKKyAgICBwam1lZGlhX3BvcnQJKnR4X3dhdjsKKworICAgIHN0cnVjdCBzdHJlYW0JKnJ4OworICAgIHBqbWVkaWFfcG9ydAkqcnhfd2F2OworCisgICAgcGpfdGltZV92YWwJCSB3YWxsX2Nsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBnbG9iYWxfYXBwIGdfYXBwOworCisKKyNpZm5kZWYgTUFYCisjICAgZGVmaW5lIE1BWChhLGIpCShhPGIgPyBiIDogYSkKKyNlbmRpZgorCisjaWZuZGVmIE1JTgorIyAgIGRlZmluZSBNSU4oYSxiKQkoYTxiID8gYSA6IGIpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb2dnaW5nCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2xvZyhzdHJ1Y3QgbG9nX2VudHJ5ICplbnRyeSwgcGpfYm9vbF90IHRvX3N0ZG91dCkKK3sKKyAgICAvKiBGb3JtYXQgKENTVik6ICovCisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gIlRJTUU7RVZFTlQ7I1JYIHBhY2tldHM7I3BhY2tldHMgbG9zdDsjSkIgcHJlZmV0Y2g7I0pCIHNpemU7I0pCRElTQ0FSRDsjSkJFTVBUWTtMb2cgTWVzc2FnZSI7CisgICAgc3RhdGljIGNoYXIgbG9nWzIwMDBdOworICAgIGVudW0geyBEID0gMjAgfTsKKyAgICBjaGFyIHNfamJwcmVmZXRjaFtEXSwKKwkgc19qYnNpemVbRF0sCisJIHNfcnhwa3RbRF0sCisJIHNfbG9zc3BrdFtEXSwKKwkgc19qYmRpc2NhcmRbRF0sCisJIHNfamJlbXB0eVtEXTsKKyAgICBzdGF0aWMgcGpfYm9vbF90IGhlYWRlcl93cml0dGVuOworCisgICAgaWYgKCFoZWFkZXJfd3JpdHRlbikgeworCXBqX2Fuc2lfc25wcmludGYobG9nLCBzaXplb2YobG9nKSwKKwkJCSAiJXNcbiIsIGZvcm1hdCk7CisJaWYgKGdfYXBwLmxvZ19mZCAhPSBOVUxMKSB7CisJICAgIHBqX3NzaXplX3Qgc2l6ZSA9IHN0cmxlbihsb2cpOworCSAgICBwal9maWxlX3dyaXRlKGdfYXBwLmxvZ19mZCwgbG9nLCAmc2l6ZSk7CisJfQorCWlmICh0b19zdGRvdXQgJiYgIWdfYXBwLmNmZy5zaWxlbnQpCisJICAgIHByaW50ZigiJXMiLCBsb2cpOworCWhlYWRlcl93cml0dGVuID0gUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoZW50cnktPmpiX3N0YXRlKSB7CisJc3ByaW50ZihzX2picHJlZmV0Y2gsICIlZCIsIGVudHJ5LT5qYl9zdGF0ZS0+cHJlZmV0Y2gpOworCXNwcmludGYoc19qYnNpemUsICIlZCIsIGVudHJ5LT5qYl9zdGF0ZS0+c2l6ZSk7CisJc3ByaW50ZihzX2piZGlzY2FyZCwgIiVkIiwgZW50cnktPmpiX3N0YXRlLT5kaXNjYXJkKTsKKwlzcHJpbnRmKHNfamJlbXB0eSwgIiVkIiwgZW50cnktPmpiX3N0YXRlLT5lbXB0eSk7CisgICAgfSBlbHNlIHsKKwlzdHJjcHkoc19qYnByZWZldGNoLCAiIik7CisJc3RyY3B5KHNfamJzaXplLCAiIik7CisJc3RyY3B5KHNfamJkaXNjYXJkLCAiIik7CisJc3RyY3B5KHNfamJlbXB0eSwgIiIpOworICAgIH0KKworICAgIGlmIChlbnRyeS0+c3RhdCkgeworCXNwcmludGYoc19yeHBrdCwgIiVkIiwgZW50cnktPnN0YXQtPnJ4LnBrdCk7CisJc3ByaW50ZihzX2xvc3Nwa3QsICIlZCIsIGVudHJ5LT5zdGF0LT5yeC5sb3NzKTsKKyAgICB9IGVsc2UgeworCXN0cmNweShzX3J4cGt0LCAiIik7CisJc3RyY3B5KHNfbG9zc3BrdCwgIiIpOworICAgIH0KKworICAgIGlmIChlbnRyeS0+bG9nID09IE5VTEwpCisJZW50cnktPmxvZyA9ICIiOworCisgICAgcGpfYW5zaV9zbnByaW50Zihsb2csIHNpemVvZihsb2cpLAorCQkgICAgICInJWQuJTAzZDsiCSAgICAvKiB0aW1lICovCisJCSAgICAgIiVzOyIJICAgIC8qIGV2ZW50ICovCisJCSAgICAgIiVzOyIJICAgIC8qIHJ4cGt0ICovCisJCSAgICAgIiVzOyIJICAgIC8qIGpiIHByZWZldGNoICovCisJCSAgICAgIiVzOyIJICAgIC8qIGpic2l6ZSAqLworCQkgICAgICIlczsiCSAgICAvKiBsb3NzcGt0ICovCisJCSAgICAgIiVzOyIJICAgIC8qIGpiZGlzY2FyZCAqLworCQkgICAgICIlczsiCSAgICAvKiBqYmVtcHR5ICovCisJCSAgICAgIiVzXG4iCSAgICAvKiBsb2dtc2cgKi8sCisKKwkJICAgICAoaW50KWVudHJ5LT53YWxsX2Nsb2NrLnNlYywgKGludCllbnRyeS0+d2FsbF9jbG9jay5tc2VjLCAvKiB0aW1lICovCisJCSAgICAgZW50cnktPmV2ZW50LAorCQkgICAgIHNfcnhwa3QsCisJCSAgICAgc19sb3NzcGt0LAorCQkgICAgIHNfamJwcmVmZXRjaCwKKwkJICAgICBzX2pic2l6ZSwKKwkJICAgICBzX2piZGlzY2FyZCwKKwkJICAgICBzX2piZW1wdHksCisJCSAgICAgZW50cnktPmxvZworCQkgICAgICk7CisgICAgaWYgKGdfYXBwLmxvZ19mZCAhPSBOVUxMKSB7CisJcGpfc3NpemVfdCBzaXplID0gc3RybGVuKGxvZyk7CisJcGpfZmlsZV93cml0ZShnX2FwcC5sb2dfZmQsIGxvZywgJnNpemUpOworICAgIH0KKworICAgIGlmICh0b19zdGRvdXQgJiYgIWdfYXBwLmNmZy5zaWxlbnQpCisJcHJpbnRmKCIlcyIsIGxvZyk7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ19jYihpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisgICAgc3RydWN0IGxvZ19lbnRyeSBlbnRyeTsKKworICAgIC8qIFdyaXRlIHRvIHN0ZG91dCAqLworICAgIHBqX2xvZ193cml0ZShsZXZlbCwgZGF0YSwgbGVuKTsKKyAgICBwdXRzKCIiKTsKKworICAgIC8qIEFsc28gYWRkIHRvIENTViBmaWxlICovCisgICAgcGpfYnplcm8oJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKyAgICBlbnRyeS5ldmVudCA9IEVWRU5UX0xPRzsKKyAgICBlbnRyeS5sb2cgPSBkYXRhOworICAgIGVudHJ5LndhbGxfY2xvY2sgPSBnX2FwcC53YWxsX2Nsb2NrOworICAgIHdyaXRlX2xvZygmZW50cnksIFBKX0ZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgamJzaW1fcGVycm9yKGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKworICAgIHBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIiVzOiAlcyIsIHRpdGxlLCBlcnJtc2cpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdHJlYW0KKyAqLworCitzdGF0aWMgdm9pZCBzdHJlYW1fZGVzdHJveShzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCit7CisgICAgaWYgKHN0cmVhbS0+c3RybSkKKwlwam1lZGlhX3N0cmVhbV9kZXN0cm95KHN0cmVhbS0+c3RybSk7CisgICAgaWYgKHN0cmVhbS0+cG9vbCkKKwlwal9wb29sX3JlbGVhc2Uoc3RyZWFtLT5wb29sKTsKK30KKworc3RhdGljIHBqX3N0YXR1c190IHN0cmVhbV9pbml0KGNvbnN0IHN0cnVjdCBzdHJlYW1fY2ZnICpjZmcsIHN0cnVjdCBzdHJlYW0gKipwX3N0cmVhbSkKK3sKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgcGptZWRpYV9jb2RlY19tZ3IgKmNtOworICAgIHVuc2lnbmVkIGNvdW50OworICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqY2k7CisgICAgcGptZWRpYV9zdHJlYW1faW5mbyBzaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBDcmVhdGUgaW5zdGFuY2UgKi8KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoJmdfYXBwLmNwLmZhY3RvcnksIGNmZy0+bmFtZSwgNTEyLCA1MTIsIE5VTEwpOworICAgIHN0cmVhbSA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgc3RydWN0IHN0cmVhbSk7CisgICAgc3RyZWFtLT5wb29sID0gcG9vbDsKKyAgICAKKyAgICAvKiBDcmVhdGUgc3RyZWFtIGluZm8gKi8KKyAgICBwal9iemVybygmc2ksIHNpemVvZihzaSkpOworICAgIHNpLnR5cGUgPSBQSk1FRElBX1RZUEVfQVVESU87CisgICAgc2kucHJvdG8gPSBQSk1FRElBX1RQX1BST1RPX1JUUF9BVlA7CisgICAgc2kuZGlyID0gY2ZnLT5kaXI7CisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmc2kucmVtX2FkZHIuaXB2NCwgTlVMTCwgNDAwMCk7CS8qIGR1bW15ICovCisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmc2kucmVtX3J0Y3AuaXB2NCwgTlVMTCwgNDAwMSk7CS8qIGR1bW15ICovCisKKyAgICAvKiBBcHBseSBKQiBzZXR0aW5ncyBpZiB0aGlzIGlzIFJYIGRpcmVjdGlvbiAqLworICAgIGlmIChjZmctPmRpciA9PSBQSk1FRElBX0RJUl9ERUNPRElORykgeworCXNpLmpiX2luaXQgPSBnX2FwcC5jZmcucnhfamJfaW5pdDsKKwlzaS5qYl9taW5fcHJlID0gZ19hcHAuY2ZnLnJ4X2piX21pbl9wcmU7CisJc2kuamJfbWF4X3ByZSA9IGdfYXBwLmNmZy5yeF9qYl9tYXhfcHJlOworCXNpLmpiX21heCA9IGdfYXBwLmNmZy5yeF9qYl9tYXg7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBjb2RlYyBpbmZvIGFuZCBwYXJhbSAqLworICAgIGNtID0gcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKGdfYXBwLmVuZHB0KTsKKyAgICBjb3VudCA9IDE7CisgICAgc3RhdHVzID0gcGptZWRpYV9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQoY20sICZjZmctPmNvZGVjLCAmY291bnQsICZjaSwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJamJzaW1fcGVycm9yKCJVbmFibGUgdG8gZmluZCBjb2RlYyIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICBwal9tZW1jcHkoJnNpLmZtdCwgY2ksIHNpemVvZigqY2kpKTsKKworICAgIHNpLnBhcmFtID0gUEpfUE9PTF9BTExPQ19UKHBvb2wsIHN0cnVjdCBwam1lZGlhX2NvZGVjX3BhcmFtKTsKKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbShjbSwgJnNpLmZtdCwgc2kucGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWpic2ltX3BlcnJvcigiVW5hYmxlIHRvIGdldCBjb2RlYyBkZWZhdWx0cyIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICBzaS50eF9wdCA9IHNpLmZtdC5wdDsKKworICAgIC8qIEFwcGx5IHB0aW1lIHNldHRpbmcgKi8KKyAgICBpZiAoY2ZnLT5wdGltZSkgeworCXNpLnBhcmFtLT5zZXR0aW5nLmZybV9wZXJfcGt0ID0gKHBqX3VpbnQ4X3QpCisJCQkJCSgoY2ZnLT5wdGltZSArIHNpLnBhcmFtLT5pbmZvLmZybV9wdGltZSAtIDEpIC8KKwkJCQkJIHNpLnBhcmFtLT5pbmZvLmZybV9wdGltZSk7CisgICAgfQorICAgIC8qIEFwcGx5IERUWCBzZXR0aW5nICovCisgICAgc2kucGFyYW0tPnNldHRpbmcudmFkID0gY2ZnLT5kdHg7CisKKyAgICAvKiBBcHBseSBQTEMgc2V0dGluZyAqLworICAgIHNpLnBhcmFtLT5zZXR0aW5nLnBsYyA9IGNmZy0+cGxjOworCisgICAgLyogQ3JlYXRlIHN0cmVhbSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc3RyZWFtX2NyZWF0ZShnX2FwcC5lbmRwdCwgcG9vbCwgJnNpLCBnX2FwcC5sb29wLCBOVUxMLCAmc3RyZWFtLT5zdHJtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlqYnNpbV9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIHN0cmVhbSIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3N0cmVhbV9nZXRfcG9ydChzdHJlYW0tPnN0cm0sICZzdHJlYW0tPnBvcnQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWpic2ltX3BlcnJvcigiRXJyb3IgcmV0cmlldmluZyBzdHJlYW0iLCBzdGF0dXMpOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogU3RhcnQgc3RyZWFtICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zdHJlYW1fc3RhcnQoc3RyZWFtLT5zdHJtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlqYnNpbV9wZXJyb3IoIkVycm9yIHN0YXJ0aW5nIHN0cmVhbSIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvKiBEb25lICovCisgICAgKnBfc3RyZWFtID0gc3RyZWFtOworICAgIHJldHVybiBQSl9TVUNDRVNTOworCitvbl9lcnJvcjoKKyAgICBpZiAoc3RyZWFtKSB7CisJc3RyZWFtX2Rlc3Ryb3koc3RyZWFtKTsKKyAgICB9IGVsc2UgeworCWlmIChwb29sKQorCSAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgdGVzdCBzZXNzaW9uCisgKi8KK3N0YXRpYyB2b2lkIHRlc3RfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChnX2FwcC50eCkKKwlzdHJlYW1fZGVzdHJveShnX2FwcC50eCk7CisgICAgaWYgKGdfYXBwLnR4X3dhdikKKwlwam1lZGlhX3BvcnRfZGVzdHJveShnX2FwcC50eF93YXYpOworICAgIGlmIChnX2FwcC5yeCkKKwlzdHJlYW1fZGVzdHJveShnX2FwcC5yeCk7CisgICAgaWYgKGdfYXBwLnJ4X3dhdikKKwlwam1lZGlhX3BvcnRfZGVzdHJveShnX2FwcC5yeF93YXYpOworICAgIGlmIChnX2FwcC5sb29wKQorCXBqbWVkaWFfdHJhbnNwb3J0X2Nsb3NlKGdfYXBwLmxvb3ApOworICAgIGlmIChnX2FwcC5lbmRwdCkKKwlwam1lZGlhX2VuZHB0X2Rlc3Ryb3koIGdfYXBwLmVuZHB0ICk7CisgICAgaWYgKGdfYXBwLmxvZ19mZCkgeworCXBqX2xvZ19zZXRfbG9nX2Z1bmMoJnBqX2xvZ193cml0ZSk7CisJcGpfbG9nX3NldF9kZWNvcihwal9sb2dfZ2V0X2RlY29yKCkgfCBQSl9MT0dfSEFTX05FV0xJTkUpOworCXBqX2ZpbGVfY2xvc2UoZ19hcHAubG9nX2ZkKTsKKwlnX2FwcC5sb2dfZmQgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZ19hcHAucG9vbCkKKwlwal9wb29sX3JlbGVhc2UoZ19hcHAucG9vbCk7CisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZnX2FwcC5jcCApOworICAgIHBqX3NodXRkb3duKCk7Cit9CisKKworc3RhdGljIHBqX3N0YXR1c190IHRlc3RfaW5pdCh2b2lkKQoreworICAgIHN0cnVjdCBzdHJlYW1fY2ZnIHN0cm1fY2ZnOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmZ19hcHAuY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogUG9vbCAqLworICAgIGdfYXBwLnBvb2wgPSBwal9wb29sX2NyZWF0ZSgmZ19hcHAuY3AuZmFjdG9yeSwgImdfYXBwIiwgNTEyLCA1MTIsIE5VTEwpOworCisgICAgLyogTG9nIGZpbGUgKi8KKyAgICBpZiAoZ19hcHAuY2ZnLmxvZ19maWxlKSB7CisJc3RhdHVzID0gcGpfZmlsZV9vcGVuKGdfYXBwLnBvb2wsIGdfYXBwLmNmZy5sb2dfZmlsZSwgCisJCQkgICAgICBQSl9PX1dST05MWSwKKwkJCSAgICAgICZnX2FwcC5sb2dfZmQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBqYnNpbV9wZXJyb3IoIkVycm9yIHdyaXRpbmcgb3V0cHV0IGZpbGUiLCBzdGF0dXMpOworCSAgICBnb3RvIG9uX2Vycm9yOworCX0KKworCXBqX2xvZ19zZXRfZGVjb3IoUEpfTE9HX0hBU19TRU5ERVIgfCBQSl9MT0dfSEFTX0NPTE9SIHwgUEpfTE9HX0hBU19MRVZFTF9URVhUKTsKKwlwal9sb2dfc2V0X2xvZ19mdW5jKCZsb2dfY2IpOworICAgIH0KKworICAgIC8qIAorICAgICAqIEluaXRpYWxpemUgbWVkaWEgZW5kcG9pbnQuCisgICAgICogVGhpcyB3aWxsIGltcGxpY2l0bHkgaW5pdGlhbGl6ZSBQSk1FRElBIHRvby4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmZ19hcHAuY3AuZmFjdG9yeSwgTlVMTCwgMCwgJmdfYXBwLmVuZHB0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlqYnNpbV9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIG1lZGlhIGVuZHBvaW50Iiwgc3RhdHVzKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIGNvZGVjcyAqLworICAgIHBqbWVkaWFfY29kZWNfcmVnaXN0ZXJfYXVkaW9fY29kZWNzKGdfYXBwLmVuZHB0LCBOVUxMKTsKKworICAgIC8qIENyZWF0ZSB0aGUgbG9vcCB0cmFuc3BvcnQgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9sb29wX2NyZWF0ZShnX2FwcC5lbmRwdCwgJmdfYXBwLmxvb3ApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWpic2ltX3BlcnJvcigiRXJyb3IgY3JlYXRpbmcgbG9vcCB0cmFuc3BvcnQiLCBzdGF0dXMpOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRyYW5zbWl0dGVyIHN0cmVhbSAqLworICAgIHBqX2J6ZXJvKCZzdHJtX2NmZywgc2l6ZW9mKHN0cm1fY2ZnKSk7CisgICAgc3RybV9jZmcubmFtZSA9ICJ0eCI7CisgICAgc3RybV9jZmcuZGlyID0gUEpNRURJQV9ESVJfRU5DT0RJTkc7CisgICAgc3RybV9jZmcuY29kZWMgPSBnX2FwcC5jZmcuY29kZWM7CisgICAgc3RybV9jZmcucHRpbWUgPSBnX2FwcC5jZmcudHhfcHRpbWU7CisgICAgc3RybV9jZmcuZHR4ID0gZ19hcHAuY2ZnLnR4X2R0eDsKKyAgICBzdHJtX2NmZy5wbGMgPSBQSl9UUlVFOworICAgIHN0YXR1cyA9IHN0cmVhbV9pbml0KCZzdHJtX2NmZywgJmdfYXBwLnR4KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIAorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBDcmVhdGUgdHJhbnNtaXR0ZXIgV0FWICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKGdfYXBwLnBvb2wsIAorCQkJCQkgICAgZ19hcHAuY2ZnLnR4X3dhdl9pbiwKKwkJCQkJICAgIGdfYXBwLmNmZy50eF9wdGltZSwKKwkJCQkJICAgIDAsCisJCQkJCSAgICAwLAorCQkJCQkgICAgJmdfYXBwLnR4X3dhdik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJamJzaW1fcGVycm9yKCJFcnJvciByZWFkaW5nIGlucHV0IFdBViBmaWxlIiwgc3RhdHVzKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSBzdHJlYW0gYW5kIFdBViBwYXJhbWV0ZXJzIG1hdGNoICovCisgICAgaWYgKFBKTUVESUFfUElBX1NSQVRFKCZnX2FwcC50eF93YXYtPmluZm8pICE9IFBKTUVESUFfUElBX1NSQVRFKCZnX2FwcC50eC0+cG9ydC0+aW5mbykgfHwKKwlQSk1FRElBX1BJQV9DQ05UKCZnX2FwcC50eF93YXYtPmluZm8pICE9IFBKTUVESUFfUElBX0NDTlQoJmdfYXBwLnR4LT5wb3J0LT5pbmZvKSkKKyAgICB7CisJamJzaW1fcGVycm9yKCJFcnJvcjogSW5wdXQgV0FWIGZpbGUgaGFzIGRpZmZlcmVudCBjbG9jayByYXRlICIKKwkJICAgICAib3IgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYW4gdGhlIGNvZGVjIiwgUEpfU1VDQ0VTUyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKworICAgIC8qIENyZWF0ZSByZWNlaXZlciAqLworICAgIHBqX2J6ZXJvKCZzdHJtX2NmZywgc2l6ZW9mKHN0cm1fY2ZnKSk7CisgICAgc3RybV9jZmcubmFtZSA9ICJyeCI7CisgICAgc3RybV9jZmcuZGlyID0gUEpNRURJQV9ESVJfREVDT0RJTkc7CisgICAgc3RybV9jZmcuY29kZWMgPSBnX2FwcC5jZmcuY29kZWM7CisgICAgc3RybV9jZmcucHRpbWUgPSBnX2FwcC5jZmcucnhfcHRpbWU7CisgICAgc3RybV9jZmcuZHR4ID0gUEpfVFJVRTsKKyAgICBzdHJtX2NmZy5wbGMgPSBnX2FwcC5jZmcucnhfcGxjOworICAgIHN0YXR1cyA9IHN0cmVhbV9pbml0KCZzdHJtX2NmZywgJmdfYXBwLnJ4KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIAorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBDcmVhdGUgcmVjZWl2ZXIgV0FWICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfY3JlYXRlKGdfYXBwLnBvb2wsIAorCQkJCQkgICAgZ19hcHAuY2ZnLnJ4X3dhdl9vdXQsCisJCQkJCSAgICBQSk1FRElBX1BJQV9TUkFURSgmZ19hcHAucngtPnBvcnQtPmluZm8pLAorCQkJCQkgICAgUEpNRURJQV9QSUFfQ0NOVCgmZ19hcHAucngtPnBvcnQtPmluZm8pLAorCQkJCQkgICAgUEpNRURJQV9QSUFfU1BGKCZnX2FwcC5yeC0+cG9ydC0+aW5mbyksCisJCQkJCSAgICBQSk1FRElBX1BJQV9CSVRTKCZnX2FwcC5yeC0+cG9ydC0+aW5mbyksCisJCQkJCSAgICAwLAorCQkJCQkgICAgMCwKKwkJCQkJICAgICZnX2FwcC5yeF93YXYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWpic2ltX3BlcnJvcigiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IFdBViBmaWxlIiwgc3RhdHVzKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworCisgICAgLyogRnJhbWUgYnVmZmVyICovCisgICAgZ19hcHAuZnJhbWVidWYgPSAocGpfaW50MTZfdCopCisJCSAgICAgcGpfcG9vbF9hbGxvYyhnX2FwcC5wb29sLAorCQkJCSAgIE1BWChQSk1FRElBX1BJQV9TUEYoJmdfYXBwLnJ4LT5wb3J0LT5pbmZvKSwKKwkJCQkgICAgICAgUEpNRURJQV9QSUFfU1BGKCZnX2FwcC50eC0+cG9ydC0+aW5mbykpICogc2l6ZW9mKHBqX2ludDE2X3QpKTsKKworCisgICAgLyogU2V0IHRoZSByZWNlaXZlciBpbiB0aGUgbG9vcCB0cmFuc3BvcnQgKi8KKyAgICBwam1lZGlhX3RyYW5zcG9ydF9sb29wX2Rpc2FibGVfcngoZ19hcHAubG9vcCwgZ19hcHAudHgtPnN0cm0sIFBKX1RSVUUpOworCisgICAgLyogRG9uZSAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworCitvbl9lcnJvcjoKKyAgICB0ZXN0X2Rlc3Ryb3koKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBydW5fb25lX2ZyYW1lKHBqbWVkaWFfcG9ydCAqc3JjLCBwam1lZGlhX3BvcnQgKmRzdCwKKwkJCSAgcGpfYm9vbF90ICpoYXNfZnJhbWUpCit7CisgICAgcGptZWRpYV9mcmFtZSBmcmFtZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwal9iemVybygmZnJhbWUsIHNpemVvZihmcmFtZSkpOworICAgIGZyYW1lLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisgICAgZnJhbWUuYnVmID0gZ19hcHAuZnJhbWVidWY7CisgICAgZnJhbWUuc2l6ZSA9IFBKTUVESUFfUElBX1NQRigmZHN0LT5pbmZvKSAqIDI7CisgICAgCisgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2dldF9mcmFtZShzcmMsICZmcmFtZSk7CisgICAgcGpfYXNzZXJ0KHN0YXR1cyA9PSBQSl9TVUNDRVNTKTsKKworICAgIGlmIChzdGF0dXMhPSBQSl9TVUNDRVNTIHx8IGZyYW1lLnR5cGUgIT0gUEpNRURJQV9GUkFNRV9UWVBFX0FVRElPKSB7CisJZnJhbWUuYnVmID0gZ19hcHAuZnJhbWVidWY7CisJcGptZWRpYV96ZXJvX3NhbXBsZXMoZ19hcHAuZnJhbWVidWYsIFBKTUVESUFfUElBX1NQRigmc3JjLT5pbmZvKSk7CisJZnJhbWUuc2l6ZSA9IFBKTUVESUFfUElBX1NQRigmc3JjLT5pbmZvKSAqIDI7CisJaWYgKGhhc19mcmFtZSkKKwkgICAgKmhhc19mcmFtZSA9IFBKX0ZBTFNFOworICAgIH0gZWxzZSB7CisJaWYgKGhhc19mcmFtZSkKKwkgICAgKmhhc19mcmFtZSA9IFBKX1RSVUU7CisgICAgfQorCisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKGRzdCwgJmZyYW1lKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworfQorCisKKy8qIFRoaXMgaXMgdGhlIHRyYW5zbWlzc2lvbiAidGljayIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZXZlcnkgInRpY2siIG1pbGxpc2Vjb25kcywgYW5kCisgKiBpdCB3aWxsIGRldGVybWluZSB3aGV0aGVyIHRvIHRyYW5zbWl0IHBhY2tldChzKSAob3IgdG8gZHJvcCBpdCkuCisgKi8KK3N0YXRpYyB2b2lkIHR4X3RpY2soY29uc3QgcGpfdGltZV92YWwgKnQpCit7CisgICAgc3RydWN0IHN0cmVhbSAqc3RybSA9IGdfYXBwLnR4OworICAgIHN0YXRpYyBjaGFyIGxvZ19tc2dbMTIwXTsKKyAgICBwam1lZGlhX3BvcnQgKnBvcnQgPSBnX2FwcC50eC0+cG9ydDsKKyAgICBsb25nIHBrdF9pbnRlcnZhbDsgCisKKyAgICAvKiBwYWNrZXQgaW50ZXJ2YWwsIHdpdGhvdXQgaml0dGVyICovCisgICAgcGt0X2ludGVydmFsID0gUEpNRURJQV9QSUFfU1BGKCZwb3J0LT5pbmZvKSAqIDEwMDAgLworCQkgICBQSk1FRElBX1BJQV9TUkFURSgmcG9ydC0+aW5mbyk7CisKKyAgICB3aGlsZSAoUEpfVElNRV9WQUxfR1RFKCp0LCBzdHJtLT5zdGF0ZS50eC5uZXh0X3NjaGVkdWxlKSkgeworCXN0cnVjdCBsb2dfZW50cnkgZW50cnk7CisJcGpfYm9vbF90IGRyb3BfdGhpc19wa3QgPSBQSl9GQUxTRTsKKwlpbnQgaml0dGVyOworCisJLyogSW5pdCBsb2cgZW50cnkgKi8KKwlwal9iemVybygmZW50cnksIHNpemVvZihlbnRyeSkpOworCWVudHJ5LndhbGxfY2xvY2sgPSAqdDsKKworCS8qIAorCSAqIERldGVybWluZSB3aGV0aGVyIHRvIGRyb3AgdGhpcyBwYWNrZXQgCisJICovCisJaWYgKHN0cm0tPnN0YXRlLnR4LmN1cl9sb3N0X2J1cnN0KSB7CisJICAgIC8qIFdlIGFyZSBjdXJyZW50bHkgZHJvcHBpbmcgcGFja2V0ICovCisKKwkgICAgLyogTWFrZSBpdCBjb21wbHkgdG8gbWluaW11bSBsb3N0IGJ1cnN0ICovCisJICAgIGlmIChzdHJtLT5zdGF0ZS50eC5jdXJfbG9zdF9idXJzdCA8IGdfYXBwLmNmZy50eF9taW5fbG9zdF9idXJzdCkgeworCQlkcm9wX3RoaXNfcGt0ID0gUEpfVFJVRTsKKwkgICAgfQorCisJICAgIC8qIENvcnJlbGF0ZSB0aGUgbmV4dCBwYWNrZXQgbG9zcyAqLworCSAgICBpZiAoIWRyb3BfdGhpc19wa3QgJiYgCisJCXN0cm0tPnN0YXRlLnR4LmN1cl9sb3N0X2J1cnN0IDwgZ19hcHAuY2ZnLnR4X21heF9sb3N0X2J1cnN0ICYmCisJCU1BWChzdHJtLT5zdGF0ZS50eC50b3RhbF9sb3N0LUxPU1NfRVhUUkEsMCkgKiAxMDAgLyBNQVgoc3RybS0+c3RhdGUudHgudG90YWxfdHgsMSkgPCBnX2FwcC5jZmcudHhfcGN0X2F2Z19sb3N0CisJICAgICAgICkgCisJICAgIHsKKwkJc3RybS0+c3RhdGUudHguZHJvcF9wcm9iID0gKChnX2FwcC5jZmcudHhfcGN0X2xvc3NfY29yciAqIHN0cm0tPnN0YXRlLnR4LmRyb3BfcHJvYikgKworCQkJCQkgICAgICgoMTAwLWdfYXBwLmNmZy50eF9wY3RfbG9zc19jb3JyKSAqIChwal9yYW5kKCklMTAwKSkKKwkJCQkJICAgKSAvIDEwMDsKKwkJaWYgKHN0cm0tPnN0YXRlLnR4LmRyb3BfcHJvYiA+PSAxMDApCisJCSAgICBzdHJtLT5zdGF0ZS50eC5kcm9wX3Byb2IgPSA5OTsKKworCQlpZiAoc3RybS0+c3RhdGUudHguZHJvcF9wcm9iID49IDEwMCAtIGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QpCisJCSAgICBkcm9wX3RoaXNfcGt0ID0gUEpfVFJVRTsKKwkgICAgfQorCX0KKworCS8qIElmIHdlJ3JlIG5vdCBkcm9wcGluZyBwYWNrZXQgdGhlbiB1c2UgcmFuZG9tbHkgZGlzdHJpYnV0ZWQgbG9zcyAqLworCWlmICghZHJvcF90aGlzX3BrdCAmJgorCSAgICBNQVgoc3RybS0+c3RhdGUudHgudG90YWxfbG9zdC1MT1NTX0VYVFJBLDApICogMTAwIC8gTUFYKHN0cm0tPnN0YXRlLnR4LnRvdGFsX3R4LDEpIDwgZ19hcHAuY2ZnLnR4X3BjdF9hdmdfbG9zdCkKKwl7CisJICAgIHN0cm0tPnN0YXRlLnR4LmRyb3BfcHJvYiA9IHBqX3JhbmQoKSAlIDEwMDsKKworCSAgICBpZiAoc3RybS0+c3RhdGUudHguZHJvcF9wcm9iID49IDEwMCAtIGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QpCisJCWRyb3BfdGhpc19wa3QgPSBQSl9UUlVFOworCX0KKworCWlmIChkcm9wX3RoaXNfcGt0KSB7CisJICAgIC8qIERyb3AgdGhlIGZyYW1lICovCisJICAgIHBqbWVkaWFfdHJhbnNwb3J0X3NpbXVsYXRlX2xvc3QoZ19hcHAubG9vcCwgUEpNRURJQV9ESVJfRU5DT0RJTkcsIDEwMCk7CisJICAgIHJ1bl9vbmVfZnJhbWUoZ19hcHAudHhfd2F2LCBnX2FwcC50eC0+cG9ydCwgTlVMTCk7CisJICAgIHBqbWVkaWFfdHJhbnNwb3J0X3NpbXVsYXRlX2xvc3QoZ19hcHAubG9vcCwgUEpNRURJQV9ESVJfRU5DT0RJTkcsIDApOworCisJICAgIGVudHJ5LmV2ZW50ID0gRVZFTlRfVFhfRFJPUDsKKwkgICAgZW50cnkubG9nID0gIioqIFRoaXMgcGFja2V0IHdhcyBsb3N0ICoqIjsKKworCSAgICArK3N0cm0tPnN0YXRlLnR4LnRvdGFsX2xvc3Q7CisJICAgICsrc3RybS0+c3RhdGUudHguY3VyX2xvc3RfYnVyc3Q7CisKKwl9IGVsc2UgeworCSAgICBwam1lZGlhX3J0Y3Bfc3RhdCBzdGF0OworCSAgICBwam1lZGlhX2piX3N0YXRlIGpzdGF0ZTsKKwkgICAgdW5zaWduZWQgbGFzdF9kaXNjYXJkOworCisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X2pidWYoZ19hcHAucngtPnN0cm0sICZqc3RhdGUpOworCSAgICBsYXN0X2Rpc2NhcmQgPSBqc3RhdGUuZGlzY2FyZDsKKworCSAgICBydW5fb25lX2ZyYW1lKGdfYXBwLnR4X3dhdiwgZ19hcHAudHgtPnBvcnQsIE5VTEwpOworCisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0KGdfYXBwLnJ4LT5zdHJtLCAmc3RhdCk7CisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X2pidWYoZ19hcHAucngtPnN0cm0sICZqc3RhdGUpOworCisJICAgIGVudHJ5LmV2ZW50ID0gRVZFTlRfVFg7CisJICAgIGVudHJ5LmpiX3N0YXRlID0gJmpzdGF0ZTsKKwkgICAgZW50cnkuc3RhdCA9ICZzdGF0OworCSAgICBlbnRyeS5sb2cgPSBsb2dfbXNnOworCisJICAgIGlmIChqc3RhdGUuZGlzY2FyZCA+IGxhc3RfZGlzY2FyZCkKKwkJc3RyY2F0KGxvZ19tc2csICIqKiBOb3RlOiBwYWNrZXQgd2FzIGRpc2NhcmRlZCBieSBqaXR0ZXIgYnVmZmVyICoqIik7CisKKwkgICAgc3RybS0+c3RhdGUudHguY3VyX2xvc3RfYnVyc3QgPSAwOworCX0KKworCXdyaXRlX2xvZygmZW50cnksIFBKX1RSVUUpOworCisJKytzdHJtLT5zdGF0ZS50eC50b3RhbF90eDsKKworCS8qIENhbGN1bGF0ZSBuZXh0IHNjaGVkdWxlICovCisJc3RybS0+c3RhdGUudHgubmV4dF9zY2hlZHVsZS5zZWMgPSAwOworCXN0cm0tPnN0YXRlLnR4Lm5leHRfc2NoZWR1bGUubXNlYyA9IChzdHJtLT5zdGF0ZS50eC50b3RhbF90eCArIDEpICogcGt0X2ludGVydmFsOworCisJLyogQXBwbHkgaml0dGVyICovCisJaWYgKGdfYXBwLmNmZy50eF9tYXhfaml0dGVyIHx8IGdfYXBwLmNmZy50eF9taW5faml0dGVyKSB7CisKKwkgICAgaWYgKGdfYXBwLmNmZy50eF9tYXhfaml0dGVyID09IGdfYXBwLmNmZy50eF9taW5faml0dGVyKSB7CisJCS8qIEZpeGVkIGppdHRlciAqLworCQlzd2l0Y2ggKHBqX3JhbmQoKSAlIDMpIHsKKwkJY2FzZSAwOgorCQkgICAgaml0dGVyID0gMCAtIGdfYXBwLmNmZy50eF9taW5faml0dGVyOworCQkgICAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICAgIGppdHRlciA9IGdfYXBwLmNmZy50eF9taW5faml0dGVyOworCQkgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICBqaXR0ZXIgPSAwOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaW50IGppdHRlcl9yYW5nZTsKKwkJaml0dGVyX3JhbmdlID0gKGdfYXBwLmNmZy50eF9tYXhfaml0dGVyLWdfYXBwLmNmZy50eF9taW5faml0dGVyKSoyOworCQlqaXR0ZXIgPSBwal9yYW5kKCkgJSBqaXR0ZXJfcmFuZ2U7CisJCWlmIChqaXR0ZXIgPCBqaXR0ZXJfcmFuZ2UvMikgeworCQkgICAgaml0dGVyID0gMCAtIGdfYXBwLmNmZy50eF9taW5faml0dGVyIC0gKGppdHRlci8yKTsKKwkJfSBlbHNlIHsKKwkJICAgIGppdHRlciA9IGdfYXBwLmNmZy50eF9taW5faml0dGVyICsgKGppdHRlci8yKTsKKwkJfQorCSAgICB9CisKKwl9IGVsc2UgeworCSAgICBqaXR0ZXIgPSAwOworCX0KKworCXBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmc3RybS0+c3RhdGUudHgubmV4dF9zY2hlZHVsZSk7CisKKwlzcHJpbnRmKGxvZ19tc2csICIqKiBQYWNrZXQgIyV1IHRpY2sgaXMgYXQgJWQuJTAzZCwgJWQgbXMgaml0dGVyIGFwcGxpZWQgKioiLCAKKwkJc3RybS0+c3RhdGUudHgudG90YWxfdHgrMSwKKwkJKGludClzdHJtLT5zdGF0ZS50eC5uZXh0X3NjaGVkdWxlLnNlYywgKGludClzdHJtLT5zdGF0ZS50eC5uZXh0X3NjaGVkdWxlLm1zZWMsCisJCWppdHRlcik7CisKKwlzdHJtLT5zdGF0ZS50eC5uZXh0X3NjaGVkdWxlLm1zZWMgKz0gaml0dGVyOworCXBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmc3RybS0+c3RhdGUudHgubmV4dF9zY2hlZHVsZSk7CisKKyAgICB9IC8qIHdoaWxlICovCit9CisKKworLyogVGhpcyBpcyB0aGUgUlggInRpY2siLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGV2ZXJ5ICJ0aWNrIiBtaWxsaXNlY29uZHMsIGFuZAorICogaXQgd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0byBjYWxsIGdldF9mcmFtZSgpIGZyb20gdGhlIFJYIHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgcnhfdGljayhjb25zdCBwal90aW1lX3ZhbCAqdCkKK3sKKyAgICBzdHJ1Y3Qgc3RyZWFtICpzdHJtID0gZ19hcHAucng7CisgICAgcGptZWRpYV9wb3J0ICpwb3J0ID0gZ19hcHAucngtPnBvcnQ7CisgICAgbG9uZyBwa3RfaW50ZXJ2YWw7CisKKyAgICBwa3RfaW50ZXJ2YWwgPSBQSk1FRElBX1BJQV9TUEYoJnBvcnQtPmluZm8pICogMTAwMCAvCisJCSAgIFBKTUVESUFfUElBX1NSQVRFKCZwb3J0LT5pbmZvKSAqCisJCSAgIGdfYXBwLmNmZy5yeF9zbmRfYnVyc3Q7CisKKyAgICBpZiAoUEpfVElNRV9WQUxfR1RFKCp0LCBzdHJtLT5zdGF0ZS5yeC5uZXh0X3NjaGVkdWxlKSkgeworCXVuc2lnbmVkIGk7CisJZm9yIChpPTA7IGk8Z19hcHAuY2ZnLnJ4X3NuZF9idXJzdDsgKytpKSB7CisJICAgIHN0cnVjdCBsb2dfZW50cnkgZW50cnk7CisJICAgIHBqbWVkaWFfcnRjcF9zdGF0IHN0YXQ7CisJICAgIHBqbWVkaWFfamJfc3RhdGUganN0YXRlOworCSAgICBwal9ib29sX3QgaGFzX2ZyYW1lOworCSAgICBjaGFyIG1zZ1sxMjBdOworCSAgICB1bnNpZ25lZCBsYXN0X2VtcHR5OworCisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0KGdfYXBwLnJ4LT5zdHJtLCAmc3RhdCk7CisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X2pidWYoZ19hcHAucngtPnN0cm0sICZqc3RhdGUpOworCSAgICBsYXN0X2VtcHR5ID0ganN0YXRlLmVtcHR5OworCisJICAgIC8qIFByZSBHRVQgZXZlbnQgKi8KKwkgICAgcGpfYnplcm8oJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwkgICAgZW50cnkuZXZlbnQgPSBFVkVOVF9HRVRfUFJFOworCSAgICBlbnRyeS53YWxsX2Nsb2NrID0gKnQ7CisJICAgIGVudHJ5LnN0YXQgPSAmc3RhdDsKKwkgICAgZW50cnkuamJfc3RhdGUgPSAmanN0YXRlOworCisJICAgIHdyaXRlX2xvZygmZW50cnksIFBKX1RSVUUpOworCisJICAgIC8qIEdFVCAqLworCSAgICBydW5fb25lX2ZyYW1lKGdfYXBwLnJ4LT5wb3J0LCBnX2FwcC5yeF93YXYsICZoYXNfZnJhbWUpOworCisJICAgIC8qIFBvc3QgR0VUIGV2ZW50ICovCisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0KGdfYXBwLnJ4LT5zdHJtLCAmc3RhdCk7CisJICAgIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X2pidWYoZ19hcHAucngtPnN0cm0sICZqc3RhdGUpOworCisJICAgIHBqX2J6ZXJvKCZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJICAgIGVudHJ5LmV2ZW50ID0gRVZFTlRfR0VUX1BPU1Q7CisJICAgIGVudHJ5LndhbGxfY2xvY2sgPSAqdDsKKwkgICAgZW50cnkuc3RhdCA9ICZzdGF0OworCSAgICBlbnRyeS5qYl9zdGF0ZSA9ICZqc3RhdGU7CisKKwkgICAgbXNnWzBdID0gJ1wwJzsKKwkgICAgZW50cnkubG9nID0gbXNnOworCisJICAgIGlmIChqc3RhdGUuZW1wdHkgPiBsYXN0X2VtcHR5KQorCQlzdHJjYXQobXNnLCAiKiogSkJVRiB3YXMgZW1wdHkgKioiKTsKKwkgICAgaWYgKCFoYXNfZnJhbWUpCisJCXN0cmNhdChtc2csICIqKiBOVUxMIGZyYW1lIHdhcyByZXR1cm5lZCAqKiIpOworCisJICAgIHdyaXRlX2xvZygmZW50cnksIFBKX1RSVUUpOworCisJfQorCisKKwlzdHJtLT5zdGF0ZS5yeC5uZXh0X3NjaGVkdWxlLm1zZWMgKz0gcGt0X2ludGVydmFsOworCXBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmc3RybS0+c3RhdGUucngubmV4dF9zY2hlZHVsZSk7CisgICAgfQorCSAgICAKK30KKworc3RhdGljIHZvaWQgdGVzdF9sb29wKGxvbmcgZHVyYXRpb24pCit7CisgICAgZ19hcHAud2FsbF9jbG9jay5zZWMgPSAwOworICAgIGdfYXBwLndhbGxfY2xvY2subXNlYyA9IDA7CisKKyAgICB3aGlsZSAoUEpfVElNRV9WQUxfTVNFQyhnX2FwcC53YWxsX2Nsb2NrKSA8PSBkdXJhdGlvbikgeworCisJLyogUnVuIFRYIHRpY2sgKi8KKwl0eF90aWNrKCZnX2FwcC53YWxsX2Nsb2NrKTsKKworCS8qIFJ1biBSWCB0aWNrICovCisJcnhfdGljaygmZ19hcHAud2FsbF9jbG9jayk7CisKKwkvKiBJbmNyZW1lbnQgdGljayAqLworCWdfYXBwLndhbGxfY2xvY2subXNlYyArPSBXQUxMX0NMT0NLX1RJQ0s7CisJcGpfdGltZV92YWxfbm9ybWFsaXplKCZnX2FwcC53YWxsX2Nsb2NrKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB1c2FnZSgpCisgKi8KK2VudW0geworICAgIE9QVF9DT0RFQwkgICAgPSAnYycsCisgICAgT1BUX0lOUFVUCSAgICA9ICdpJywKKyAgICBPUFRfT1VUUFVUCSAgICA9ICdvJywKKyAgICBPUFRfRFVSQVRJT04gICAgPSAnZCcsCisgICAgT1BUX0xPR19GSUxFICAgID0gJ2wnLAorICAgIE9QVF9MT1NTCSAgICA9ICd4JywKKyAgICBPUFRfTUlOX0pJVFRFUiAgPSAnaicsCisgICAgT1BUX01BWF9KSVRURVIgID0gJ0onLAorICAgIE9QVF9TTkRfQlVSU1QgICA9ICdiJywKKyAgICBPUFRfVFhfUFRJTUUgICAgPSAndCcsCisgICAgT1BUX1JYX1BUSU1FICAgID0gJ3InLAorICAgIE9QVF9OT19WQUQJICAgID0gJ1UnLAorICAgIE9QVF9OT19QTEMJICAgID0gJ3AnLAorICAgIE9QVF9KQl9QUkVGRVRDSCA9ICdQJywgCisgICAgT1BUX0pCX01JTl9QUkUgID0gJ20nLAorICAgIE9QVF9KQl9NQVhfUFJFICA9ICdNJywKKyAgICBPUFRfSkJfTUFYCSAgICA9ICdYJywKKyAgICBPUFRfSEVMUAkgICAgPSAnaCcsCisgICAgT1BUX01JTl9MT1NUX0JVUlNUID0gMSwKKyAgICBPUFRfTUFYX0xPU1RfQlVSU1QsCisgICAgT1BUX0xPU1NfQ09SUiwKK307CisKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKyAgICBwcmludGYoImpic2ltIC0gU3lzdGVtIGFuZCBuZXR3b3JrIGltcGFpcm1lbnRzIHNpbXVsYXRvclxuIik7CisgICAgcHJpbnRmKCJDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSlcbiIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlRoaXMgcHJvZ3JhbSBlbXVsYXRlcyB2YXJpb3VzIHN5c3RlbSBhbmQgbmV0d29yayBpbXBhaXJtZW50XG4iKTsKKyAgICBwcmludGYoImNvbmRpdGlvbnMgYXMgd2VsbCBhcyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGFuZCBhcHBseSBpdCB0b1xuIik7CisgICAgcHJpbnRmKCJhbiBpbnB1dCBXQVYgZmlsZS4gVGhlIG91dHB1dCBpcyBhbm90aGVyIFdBViBmaWxlIGFzIHdlbGwgYXNcbiIpOworICAgIHByaW50ZigiYSBkZXRhaWxlZCBsb2cgZmlsZSAoaW4gQ1NWIGZvcm1hdCkgZm9yIHRyb3VibGVzaG9vdGluZy5cbiIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlVzYWdlOlxuIik7CisgICAgcHJpbnRmKCIgamJzaW0gW09QVElPTlNdXG4iKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJHZW5lcmFsIE9QVElPTlM6XG4iKTsKKyAgICBwcmludGYoIiAgLS1jb2RlYywgLSVjIE5BTUUgICAgICAgU2V0IHRoZSBhdWRpbyBjb2RlY1xuIiwgT1BUX0NPREVDKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlc1xuIiwgQ09ERUMpOworICAgIHByaW50ZigiICAtLWlucHV0LCAtJWMgRklMRSAgICAgICBTZXQgV0FWIHJlZmVyZW5jZSBmaWxlIHRvIEZJTEVcbiIsIE9QVF9JTlBVVCk7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogIiBXQVZfUkVGICJcbiIpOworICAgIHByaW50ZigiICAtLW91dHB1dCwgLSVjIEZJTEUgICAgICBTZXQgV0FWIG91dHB1dCBmaWxlIHRvIEZJTEVcbiIsIE9QVF9PVVRQVVQpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICIgV0FWX09VVCAiXG4iKTsKKyAgICBwcmludGYoIiAgLS1kdXJhdGlvbiwgLSVjIFNFQyAgICAgU2V0IHRlc3QgZHVyYXRpb24gdG8gU0VDIHNlY29uZHNcbiIsIE9QVF9EVVJBVElPTik7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogJWRcbiIsIERVUkFUSU9OKTsKKyAgICBwcmludGYoIiAgLS1sb2ctZmlsZSwgLSVjIEZJTEUgICAgU2F2ZSBzaW11bGF0aW9uIGxvZyBmaWxlIHRvIEZJTEVcbiIsIE9QVF9MT0dfRklMRSk7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRklMRSB3aWxsIGJlIGluIENTViBmb3JtYXQgd2l0aCBzZW1pY29sb24gc2VwYXJhdG9yXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAlc1xuIiwgTE9HX0ZJTEUpOworICAgIHByaW50ZigiICAtLWhlbHAsIC1oICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBzY3JlZW5cbiIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlNpbXVsYXRpb24gT1BUSU9OUzpcbiIpOworICAgIHByaW50ZigiICAtLWxvc3MsIC0lYyBQQ1QgICAgICAgICBTZXQgcGFja2V0IGF2ZXJhZ2UgbG9zcyB0byBQQ1QgcGVyY2VudFxuIiwgT1BUX0xPU1MpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDBcbiIpOworICAgIHByaW50ZigiICAtLWxvc3MtY29yciBQQ1QgICAgICAgIFNldCB0aGUgbG9zcyBjb3JyZWxhdGlvbiB0byBQQ1QgcGVyY2VudC4gRGVmYXVsdDogMFxuIik7CisgICAgcHJpbnRmKCIgIC0tbWluLWxvc3QtYnVyc3QgTiAgICAgU2V0IG1pbmltdW0gcGFja2V0IGxvc3QgYnVyc3QgKGRlZmF1bHQ6JWQpXG4iLCBNSU5fTE9TVF9CVVJTVCk7CisgICAgcHJpbnRmKCIgIC0tbWF4LWxvc3QtYnVyc3QgTiAgICAgU2V0IG1heGltdW0gcGFja2V0IGxvc3QgYnVyc3QgKGRlZmF1bHQ6JWQpXG4iLCBNQVhfTE9TVF9CVVJTVCk7CisgICAgcHJpbnRmKCIgIC0tbWluLWppdHRlciwgLSVjIE1TRUMgIFNldCBtaW5pbXVtIG5ldHdvcmsgaml0dGVyIHRvIE1TRUNcbiIsIE9QVF9NSU5fSklUVEVSKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAwXG4iKTsKKyAgICBwcmludGYoIiAgLS1tYXgtaml0dGVyLCAtJWMgTVNFQyAgU2V0IG1heGltdW0gbmV0d29yayBqaXR0ZXIgdG8gTVNFQ1xuIiwgT1BUX01BWF9KSVRURVIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDBcbiIpOworICAgIHByaW50ZigiICAtLXNuZC1idXJzdCwgLSVjIFZBTCAgICBTZXQgUlggc291bmQgYnVyc3QgdmFsdWUgdG8gVkFMIGZyYW1lcy5cbiIsIE9QVF9TTkRfQlVSU1QpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDFcbiIpOworICAgIHByaW50ZigiICAtLXR4LXB0aW1lLCAtJWMgTVNFQyAgICBTZXQgdHJhbnNtaXR0ZXIgcHRpbWUgdG8gTVNFQ1xuIiwgT1BUX1RYX1BUSU1FKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAwIChub3Qgc2V0LCB1c2UgZGVmYXVsdClcbiIpOworICAgIHByaW50ZigiICAtLXJ4LXB0aW1lLCAtJWMgTVNFQyAgICBTZXQgcmVjZWl2ZXIgcHRpbWUgdG8gTVNFQ1xuIiwgT1BUX1JYX1BUSU1FKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAwIChub3Qgc2V0LCB1c2UgZGVmYXVsdClcbiIpOworICAgIHByaW50ZigiICAtLW5vLXZhZCwgLSVjICAgICAgICAgICBEaXNhYmxlIFZBRC9EVFggaW4gdHJhbnNtaXR0ZXJcbiIsIE9QVF9OT19WQUQpOworICAgIHByaW50ZigiICAtLW5vLXBsYywgLSVjICAgICAgICAgICBEaXNhYmxlIFBMQyBpbiByZWNlaXZlclxuIiwgT1BUX05PX1BMQyk7CisgICAgcHJpbnRmKCIgIC0tamItcHJlZmV0Y2gsIC0lYyAgICAgIEVuYWJsZSBwcmVmZXRjaCBidWZmZXJyaW5nIGluIGppdHRlciBidWZmZXJcbiIsIE9QVF9KQl9QUkVGRVRDSCk7CisgICAgcHJpbnRmKCIgIC0tamItbWluLXByZSwgLSVjIE1TRUMgIEppdHRlciBidWZmZXIgbWluaW11bSBwcmVmZXRjaCBkZWxheSBpbiBtc2VjXG4iLCBPUFRfSkJfTUlOX1BSRSk7CisgICAgcHJpbnRmKCIgIC0tamItbWF4LXByZSwgLSVjIE1TRUMgIEppdHRlciBidWZmZXIgbWF4aW11bSBwcmVmZXRjaCBkZWxheSBpbiBtc2VjXG4iLCBPUFRfSkJfTUFYX1BSRSk7CisgICAgcHJpbnRmKCIgIC0tamItbWF4LCAtJWMgTVNFQyAgICAgIFNldCBtYXhpbXVtIGRlbGF5IHRoYXQgY2FuIGJlIGFjY29tb2RhdGVkIGJ5IHRoZVxuIiwgT1BUX0pCX01BWCk7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyIGJ1ZmZlciBtc2VjLlxuIik7Cit9CisKKworc3RhdGljIGludCBpbml0X29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBzdHJ1Y3QgcGpfZ2V0b3B0X29wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJjb2RlYyIsCSAgICAxLCAwLCBPUFRfQ09ERUMgfSwKKwl7ICJpbnB1dCIsCSAgICAxLCAwLCBPUFRfSU5QVVQgfSwKKwl7ICJvdXRwdXQiLAkgICAgMSwgMCwgT1BUX09VVFBVVCB9LAorCXsgImR1cmF0aW9uIiwJICAgIDEsIDAsIE9QVF9EVVJBVElPTiB9LAorCXsgImxvZy1maWxlIiwJICAgIDEsIDAsIE9QVF9MT0dfRklMRX0sCisJeyAibG9zcyIsCSAgICAxLCAwLCBPUFRfTE9TUyB9LAorCXsgIm1pbi1sb3N0LWJ1cnN0IiwgMSwgMCwgT1BUX01JTl9MT1NUX0JVUlNUfSwKKwl7ICJtYXgtbG9zdC1idXJzdCIsIDEsIDAsIE9QVF9NQVhfTE9TVF9CVVJTVH0sCisJeyAibG9zcy1jb3JyIiwJICAgIDEsIDAsIE9QVF9MT1NTX0NPUlJ9LAorCXsgIm1pbi1qaXR0ZXIiLAkgICAgMSwgMCwgT1BUX01JTl9KSVRURVIgfSwKKwl7ICJtYXgtaml0dGVyIiwJICAgIDEsIDAsIE9QVF9NQVhfSklUVEVSIH0sCisJeyAic25kLWJ1cnN0IiwJICAgIDEsIDAsIE9QVF9TTkRfQlVSU1QgfSwKKwl7ICJ0eC1wdGltZSIsCSAgICAxLCAwLCBPUFRfVFhfUFRJTUUgfSwKKwl7ICJyeC1wdGltZSIsCSAgICAxLCAwLCBPUFRfUlhfUFRJTUUgfSwKKwl7ICJuby12YWQiLAkgICAgMCwgMCwgT1BUX05PX1ZBRCB9LAorCXsgIm5vLXBsYyIsCSAgICAwLCAwLCBPUFRfTk9fUExDIH0sCisJeyAiamItcHJlZmV0Y2giLCAgICAwLCAwLCBPUFRfSkJfUFJFRkVUQ0ggfSwKKwl7ICJqYi1taW4tcHJlIiwgICAgIDEsIDAsIE9QVF9KQl9NSU5fUFJFIH0sCisJeyAiamItbWF4LXByZSIsICAgICAxLCAwLCBPUFRfSkJfTUFYX1BSRSB9LAorCXsgImpiLW1heCIsCSAgICAxLCAwLCBPUFRfSkJfTUFYIH0sCisJeyAiaGVscCIsCSAgICAwLCAwLCBPUFRfSEVMUH0sCisJeyBOVUxMLCAwLCAwLCAwIH0sCisgICAgfTsKKyAgICBpbnQgYzsKKyAgICBpbnQgb3B0aW9uX2luZGV4OworICAgIGNoYXIgZm9ybWF0WzEyOF07CisKKyAgICAvKiBJbml0IGRlZmF1bHQgY29uZmlnICovCisgICAgZ19hcHAuY2ZnLmNvZGVjID0gcGpfc3RyKENPREVDKTsKKyAgICBnX2FwcC5jZmcuZHVyYXRpb25fbXNlYyA9IERVUkFUSU9OICogMTAwMDsKKyAgICBnX2FwcC5jZmcuc2lsZW50ID0gU0lMRU5UOworICAgIGdfYXBwLmNmZy5sb2dfZmlsZSA9IExPR19GSUxFOworICAgIGdfYXBwLmNmZy50eF93YXZfaW4gPSBXQVZfUkVGOworICAgIGdfYXBwLmNmZy50eF9wdGltZSA9IDA7CisgICAgZ19hcHAuY2ZnLnR4X21pbl9qaXR0ZXIgPSAwOworICAgIGdfYXBwLmNmZy50eF9tYXhfaml0dGVyID0gMDsKKyAgICBnX2FwcC5jZmcudHhfZHR4ID0gRFRYOworICAgIGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QgPSAwOworICAgIGdfYXBwLmNmZy50eF9taW5fbG9zdF9idXJzdCA9IE1JTl9MT1NUX0JVUlNUOworICAgIGdfYXBwLmNmZy50eF9tYXhfbG9zdF9idXJzdCA9IE1BWF9MT1NUX0JVUlNUOworICAgIGdfYXBwLmNmZy50eF9wY3RfbG9zc19jb3JyID0gTE9TU19DT1JSOworCisgICAgZ19hcHAuY2ZnLnJ4X3dhdl9vdXQgPSBXQVZfT1VUOworICAgIGdfYXBwLmNmZy5yeF9wdGltZSA9IDA7CisgICAgZ19hcHAuY2ZnLnJ4X3BsYyA9IFBMQzsKKyAgICBnX2FwcC5jZmcucnhfc25kX2J1cnN0ID0gMTsKKyAgICBnX2FwcC5jZmcucnhfamJfaW5pdCA9IC0xOworICAgIGdfYXBwLmNmZy5yeF9qYl9taW5fcHJlID0gLTE7CisgICAgZ19hcHAuY2ZnLnJ4X2piX21heF9wcmUgPSAtMTsKKyAgICBnX2FwcC5jZmcucnhfamJfbWF4ID0gLTE7CisKKyAgICAvKiBCdWlsZCBmb3JtYXQgKi8KKyAgICBmb3JtYXRbMF0gPSAnXDAnOworICAgIGZvciAoYz0wOyBjPFBKX0FSUkFZX1NJWkUobG9uZ19vcHRpb25zKS0xOyArK2MpIHsKKwlpZiAobG9uZ19vcHRpb25zW2NdLmhhc19hcmcpIHsKKwkgICAgY2hhciBjbWRbMTBdOworCSAgICBwal9hbnNpX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlYzoiLCBsb25nX29wdGlvbnNbY10udmFsKTsKKwkgICAgcGpfYW5zaV9zdHJjYXQoZm9ybWF0LCBjbWQpOworCX0KKyAgICB9CisgICAgZm9yIChjPTA7IGM8UEpfQVJSQVlfU0laRShsb25nX29wdGlvbnMpLTE7ICsrYykgeworCWlmIChsb25nX29wdGlvbnNbY10uaGFzX2FyZyA9PSAwKSB7CisJICAgIGNoYXIgY21kWzEwXTsKKwkgICAgcGpfYW5zaV9zbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJWMiLCBsb25nX29wdGlvbnNbY10udmFsKTsKKwkgICAgcGpfYW5zaV9zdHJjYXQoZm9ybWF0LCBjbWQpOworCX0KKyAgICB9CisKKyAgICAvKiBQYXJzZSBvcHRpb25zICovCisgICAgcGpfb3B0aW5kID0gMDsKKyAgICB3aGlsZSgoYz1wal9nZXRvcHRfbG9uZyhhcmdjLGFyZ3YsIGZvcm1hdCwgCisJCQkgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KSkhPS0xKSAKKyAgICB7CisJc3dpdGNoIChjKSB7CisJY2FzZSBPUFRfQ09ERUM6CisJICAgIGdfYXBwLmNmZy5jb2RlYyA9IHBqX3N0cihwal9vcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlIE9QVF9JTlBVVDoKKwkgICAgZ19hcHAuY2ZnLnR4X3dhdl9pbiA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfT1VUUFVUOgorCSAgICBnX2FwcC5jZmcucnhfd2F2X291dCA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfRFVSQVRJT046CisJICAgIGdfYXBwLmNmZy5kdXJhdGlvbl9tc2VjID0gYXRvaShwal9vcHRhcmcpICogMTAwMDsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTE9HX0ZJTEU6CisJICAgIGdfYXBwLmNmZy5sb2dfZmlsZSA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTE9TUzoKKwkgICAgZ19hcHAuY2ZnLnR4X3BjdF9hdmdfbG9zdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QgPiAxMDApIHsKKwkJcHV0cygiRXJyb3I6IEludmFsaWQgbG9zcyB2YWx1ZT8iKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTUlOX0xPU1RfQlVSU1Q6CisJICAgIGdfYXBwLmNmZy50eF9taW5fbG9zdF9idXJzdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTUFYX0xPU1RfQlVSU1Q6CisJICAgIGdfYXBwLmNmZy50eF9tYXhfbG9zdF9idXJzdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTE9TU19DT1JSOgorCSAgICBnX2FwcC5jZmcudHhfcGN0X2xvc3NfY29yciA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QgPiAxMDApIHsKKwkJcHV0cygiRXJyb3I6IExvc3MgY29ycmVsYXRpb24gaXMgaW4gcGVyY2VudGFnZSwgdmFsdWUgaXMgbm90IHZhbGlkPyIpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIE9QVF9NSU5fSklUVEVSOgorCSAgICBnX2FwcC5jZmcudHhfbWluX2ppdHRlciA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTUFYX0pJVFRFUjoKKwkgICAgZ19hcHAuY2ZnLnR4X21heF9qaXR0ZXIgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX1NORF9CVVJTVDoKKwkgICAgZ19hcHAuY2ZnLnJ4X3NuZF9idXJzdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfVFhfUFRJTUU6CisJICAgIGdfYXBwLmNmZy50eF9wdGltZSA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfUlhfUFRJTUU6CisJICAgIGdfYXBwLmNmZy5yeF9wdGltZSA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfTk9fVkFEOgorCSAgICBnX2FwcC5jZmcudHhfZHR4ID0gUEpfRkFMU0U7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX05PX1BMQzoKKwkgICAgZ19hcHAuY2ZnLnJ4X3BsYyA9IFBKX0ZBTFNFOworCSAgICBicmVhazsKKwljYXNlIE9QVF9KQl9QUkVGRVRDSDoKKwkgICAgZ19hcHAuY2ZnLnJ4X2piX2luaXQgPSAxOworCSAgICBicmVhazsKKwljYXNlIE9QVF9KQl9NSU5fUFJFOgorCSAgICBnX2FwcC5jZmcucnhfamJfbWluX3ByZSA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfSkJfTUFYX1BSRToKKwkgICAgZ19hcHAuY2ZnLnJ4X2piX21heF9wcmUgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0pCX01BWDoKKwkgICAgZ19hcHAuY2ZnLnJ4X2piX21heCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfSEVMUDoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBvcnBoYW5lZCBwYXJhbXMgKi8KKyAgICBpZiAocGpfb3B0aW5kIDwgYXJnYykgeworCXVzYWdlKCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogTm9ybWFsaXplIG9wdGlvbnMgKi8KKyAgICBpZiAoZ19hcHAuY2ZnLnJ4X2piX2luaXQgPCBnX2FwcC5jZmcucnhfamJfbWluX3ByZSkKKwlnX2FwcC5jZmcucnhfamJfaW5pdCA9IGdfYXBwLmNmZy5yeF9qYl9taW5fcHJlOworICAgIGVsc2UgaWYgKGdfYXBwLmNmZy5yeF9qYl9pbml0ID4gZ19hcHAuY2ZnLnJ4X2piX21heF9wcmUpCisJZ19hcHAuY2ZnLnJ4X2piX2luaXQgPSBnX2FwcC5jZmcucnhfamJfbWF4X3ByZTsKKworICAgIGlmIChnX2FwcC5jZmcudHhfbWF4X2ppdHRlciA8IGdfYXBwLmNmZy50eF9taW5faml0dGVyKQorCWdfYXBwLmNmZy50eF9tYXhfaml0dGVyID0gZ19hcHAuY2ZnLnR4X21pbl9qaXR0ZXI7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKGluaXRfb3B0aW9ucyhhcmdjLCBhcmd2KSAhPSAwKQorCXJldHVybiAxOworCisKKyAgICAvKiBJbml0ICovCisgICAgc3RhdHVzID0gdGVzdF9pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiAxOworCisgICAgLyogUHJpbnQgcGFyYW1ldGVycyAqLworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJTdGFydGluZyBzaW11bGF0aW9uLiBQYXJhbWV0ZXJzOiAiKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgQ29kZWM9JS4qcywgdHhfcHRpbWU9JWQsIHJ4X3B0aW1lPSVkIiwKKwkgICAgICAoaW50KWdfYXBwLmNmZy5jb2RlYy5zbGVuLAorCSAgICAgIGdfYXBwLmNmZy5jb2RlYy5wdHIsCisJICAgICAgZ19hcHAuY2ZnLnR4X3B0aW1lLAorCSAgICAgIGdfYXBwLmNmZy5yeF9wdGltZSkpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgTG9zcyBhdmc9JWQlJSwgbWluX2J1cnN0PSVkLCBtYXhfYnVyc3Q9JWQiLAorCSAgICAgIGdfYXBwLmNmZy50eF9wY3RfYXZnX2xvc3QsCisJICAgICAgZ19hcHAuY2ZnLnR4X21pbl9sb3N0X2J1cnN0LAorCSAgICAgIGdfYXBwLmNmZy50eF9tYXhfbG9zdF9idXJzdCkpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgVFggaml0dGVyIG1pbj0lZG1zLCBtYXg9JWRtcyIsCisJICAgICAgZ19hcHAuY2ZnLnR4X21pbl9qaXR0ZXIsIAorCSAgICAgIGdfYXBwLmNmZy50eF9tYXhfaml0dGVyKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiBSWCBqYiBpbml0OiVkbXMsIG1pbl9wcmU9JWRtcywgbWF4X3ByZT0lZG1zLCBtYXg9JWRtcyIsCisJICAgICAgZ19hcHAuY2ZnLnJ4X2piX2luaXQsCisJICAgICAgZ19hcHAuY2ZnLnJ4X2piX21pbl9wcmUsCisJICAgICAgZ19hcHAuY2ZnLnJ4X2piX21heF9wcmUsCisJICAgICAgZ19hcHAuY2ZnLnJ4X2piX21heCkpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgUlggc291bmQgYnVyc3Q6JWQgZnJhbWVzIiwKKwkgICAgICBnX2FwcC5jZmcucnhfc25kX2J1cnN0KSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiBEVFg9JWQsIFBMQz0lZCIsCisJICAgICAgZ19hcHAuY2ZnLnR4X2R0eCwgZ19hcHAuY2ZnLnJ4X3BsYykpOworCisgICAgLyogUnVuIHRlc3QgbG9vcCAqLworICAgIHRlc3RfbG9vcChnX2FwcC5jZmcuZHVyYXRpb25fbXNlYyk7CisKKyAgICAvKiBQcmludCBzdGF0aXN0aWNzICovCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlNpbXVsYXRpb24gZG9uZSIpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiIFRYIHBhY2tldHM9JXUsIGRyb3BwZWQ9JXUvJTUuMWYlJSIsCisJICAgICAgZ19hcHAudHgtPnN0YXRlLnR4LnRvdGFsX3R4LAorCSAgICAgIGdfYXBwLnR4LT5zdGF0ZS50eC50b3RhbF9sb3N0LAorCSAgICAgIChmbG9hdCkoZ19hcHAudHgtPnN0YXRlLnR4LnRvdGFsX2xvc3QgKiAxMDAuMCAvIGdfYXBwLnR4LT5zdGF0ZS50eC50b3RhbF90eCkpKTsKKworICAgIC8qIERvbmUgKi8KKyAgICB0ZXN0X2Rlc3Ryb3koKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9sYXRlbmN5LmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2xhdGVuY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFkZTFmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9sYXRlbmN5LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qICRJZDogbGF0ZW5jeS5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKiBTZWUgaHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3dpa2kvTWVhc3VyaW5nU291bmRMYXRlbmN5IG9uCisgKiBob3cgdG8gdXNlIHRoaXMgcHJvZ3JhbS4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJsYWNlbmN5LmMiCisKKworLyogVXRpbCB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgICovCitzdGF0aWMgaW50IGFwcF9wZXJyb3IoIGNvbnN0IGNoYXIgKnNlbmRlciwgY29uc3QgY2hhciAqdGl0bGUsIAorCQkgICAgICAgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBQSl9VTlVTRURfQVJHKHNlbmRlcik7CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCisgICAgcHJpbnRmKCIlczogJXMgW2NvZGU9JWRdXG4iLCB0aXRsZSwgZXJybXNnLCBzdGF0dXMpOworICAgIHJldHVybiAxOworfQorCisvKgorICogRmluZCBvdXQgbGF0ZW5jeQorICovCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9sYXRlbmN5KHBqX3Bvb2xfdCAqcG9vbCwgcGptZWRpYV9wb3J0ICp3YXYpCit7CisgICAgcGptZWRpYV9mcmFtZSBmcm07CisgICAgc2hvcnQgKmJ1ZjsKKyAgICB1bnNpZ25lZCBpLCBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBwal9zaXplX3QgcmVhZCwgbGVuOworICAgIHVuc2lnbmVkIHN0YXJ0X3BvczsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICB1bnNpZ25lZCBsYXRfc3VtID0gMCwKKwkgICAgIGxhdF9jbnQgPSAwLAorCSAgICAgbGF0X21pbiA9IDEwMDAwLAorCSAgICAgbGF0X21heCA9IDA7CisKKyAgICBzYW1wbGVzX3Blcl9mcmFtZSA9IFBKTUVESUFfUElBX1NQRigmd2F2LT5pbmZvKTsKKyAgICBmcm0uYnVmID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzYW1wbGVzX3Blcl9mcmFtZSAqIDIpOworICAgIGZybS5zaXplID0gc2FtcGxlc19wZXJfZnJhbWUgKiAyOworICAgIGxlbiA9IHBqbWVkaWFfd2F2X3BsYXllcl9nZXRfbGVuKHdhdik7CisgICAgYnVmID0gcGpfcG9vbF9hbGxvYyhwb29sLCBsZW4gKyBzYW1wbGVzX3Blcl9mcmFtZSk7CisKKyAgICByZWFkID0gMDsKKyAgICB3aGlsZSAocmVhZCA8IGxlbi8yKSB7CisJc3RhdHVzID0gcGptZWRpYV9wb3J0X2dldF9mcmFtZSh3YXYsICZmcm0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgYnJlYWs7CisKKwlwam1lZGlhX2NvcHlfc2FtcGxlcyhidWYrcmVhZCwgKHNob3J0Kilmcm0uYnVmLCBzYW1wbGVzX3Blcl9mcmFtZSk7CisJcmVhZCArPSBzYW1wbGVzX3Blcl9mcmFtZTsKKyAgICB9CisKKyAgICBpZiAocmVhZCA8IDIgKiBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKSkgeworCXB1dHMoIkVycm9yOiB0b28gc2hvcnQiKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RhcnRfcG9zID0gMDsKKyAgICB3aGlsZSAoc3RhcnRfcG9zIDwgbGVuLzIgLSBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKSkgeworCWludCBtYXhfc2lnbmFsID0gMDsKKwl1bnNpZ25lZCBtYXhfc2lnbmFsX3BvcyA9IHN0YXJ0X3BvczsKKwl1bnNpZ25lZCBtYXhfZWNob19wb3MgPSAwOworCXVuc2lnbmVkIHBvczsKKwl1bnNpZ25lZCBsYXQ7CisKKwkvKiBHZXQgdGhlIGxhcmdlc3Qgc2lnbmFsIGluIHRoZSBuZXh0IDAuN3MgKi8KKwlmb3IgKGk9c3RhcnRfcG9zOyBpPHN0YXJ0X3BvcyArIFBKTUVESUFfUElBX1NSQVRFKCZ3YXYtPmluZm8pICogNzAwIC8gMTAwMDsgKytpKSB7CisJICAgIGlmIChhYnMoYnVmW2ldKSA+IG1heF9zaWduYWwpIHsKKwkJbWF4X3NpZ25hbCA9IGFicyhidWZbaV0pOworCQltYXhfc2lnbmFsX3BvcyA9IGk7CisJICAgIH0KKwl9CisKKwkvKiBBZHZhbmNlIDEwbXMgZnJvbSBtYXhfc2lnbmFsX3BvcyAqLworCXBvcyA9IG1heF9zaWduYWxfcG9zICsgMTAgKiBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKSAvIDEwMDA7CisKKwkvKiBHZXQgdGhlIGxhcmdlc3Qgc2lnbmFsIGluIHRoZSBuZXh0IDUwMG1zICovCisJbWF4X3NpZ25hbCA9IDA7CisJbWF4X2VjaG9fcG9zID0gcG9zOworCWZvciAoaT1wb3M7IGk8cG9zK1BKTUVESUFfUElBX1NSQVRFKCZ3YXYtPmluZm8pLzI7ICsraSkgeworCSAgICBpZiAoYWJzKGJ1ZltpXSkgPiBtYXhfc2lnbmFsKSB7CisJCW1heF9zaWduYWwgPSBhYnMoYnVmW2ldKTsKKwkJbWF4X2VjaG9fcG9zID0gaTsKKwkgICAgfQorCX0KKworCWxhdCA9IChtYXhfZWNob19wb3MgLSBtYXhfc2lnbmFsX3BvcykgKiAxMDAwIC8gUEpNRURJQV9QSUFfU1JBVEUoJndhdi0+aW5mbyk7CisJCisjaWYgMAorCXByaW50ZigiTGF0ZW5jeSA9ICV1XG4iLCBsYXQpOworI2VuZGlmCisKKwlsYXRfc3VtICs9IGxhdDsKKwlsYXRfY250Kys7CisJaWYgKGxhdCA8IGxhdF9taW4pCisJICAgIGxhdF9taW4gPSBsYXQ7CisJaWYgKGxhdCA+IGxhdF9tYXgpCisJICAgIGxhdF9tYXggPSBsYXQ7CisKKwkvKiBBZHZhbmNlIG5leHQgbG9vcCAqLworCXN0YXJ0X3BvcyArPSBQSk1FRElBX1BJQV9TUkFURSgmd2F2LT5pbmZvKTsKKyAgICB9CisKKyAgICBwcmludGYoIkxhdGVuY3kgYXZlcmFnZSA9ICV1XG4iLCBsYXRfc3VtIC8gbGF0X2NudCk7CisgICAgcHJpbnRmKCJMYXRlbmN5IG1pbmltdW0gPSAldVxuIiwgbGF0X21pbik7CisgICAgcHJpbnRmKCJMYXRlbmN5IG1heGltdW0gPSAldVxuIiwgbGF0X21heCk7CisgICAgcHJpbnRmKCJOdW1iZXIgb2YgZGF0YSAgPSAldVxuIiwgbGF0X2NudCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGVudW0geyBOU0FNUExFUyA9IDE2MCwgQ09VTlQ9MTAwIH07CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX3BvcnQgKndhdjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKworICAgIC8qIFZlcmlmeSBjbWQgbGluZSBhcmd1bWVudHMuICovCisgICAgaWYgKGFyZ2MgIT0gMikgeworCXB1dHMoIkVycm9yOiBtaXNzaW5nIGFyZ3VtZW50KHMpIik7CisJcHV0cygiVXNhZ2U6IGxhdGVuY3kgUkVWLldBViIpOworCXJldHVybiAxOworICAgIH0KKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoMCk7CisKKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJ3YXYiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICBzdGF0dXMgPSBwal9yZWdpc3Rlcl9zdHJlcnJvcihQSk1FRElBX0VSUk5PX1NUQVJULCBQSl9FUlJOT19TUEFDRV9TSVpFLCAKKwkJCQkgICZwam1lZGlhX3N0cmVycm9yKTsKKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyogV2F2ICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKCAgcG9vbCwJLyogbWVtb3J5IHBvb2wJICAgICovCisJCQkJCSAgICAgIGFyZ3ZbMV0sCS8qIGZpbGUgdG8gcGxheQkgICAgKi8KKwkJCQkJICAgICAgMCwJLyogdXNlIGRlZmF1bHQgcHRpbWUqLworCQkJCQkgICAgICAwLAkvKiBmbGFncwkgICAgKi8KKwkJCQkJICAgICAgMCwJLyogZGVmYXVsdCBidWZmZXIgICAqLworCQkJCQkgICAgICAmd2F2CS8qIHJldHVybmVkIHBvcnQgICAgKi8KKwkJCQkJICAgICAgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgYXJndlsxXSwgc3RhdHVzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBjYWxjdWxhdGVfbGF0ZW5jeShwb29sLCB3YXYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gMTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfcG9ydF9kZXN0cm95KCB3YXYgKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHBqX3Bvb2xfcmVsZWFzZSggcG9vbCApOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCAmY3AgKTsKKyAgICBwal9zaHV0ZG93bigpOworCisgICAgLyogRG9uZS4gKi8KKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9sZXZlbC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9sZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmJiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL2xldmVsLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qICRJZDogbGV2ZWwuYyAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisKKy8qKgorICogXHBhZ2UgcGFnZV9wam1lZGlhX3NhbXBsZXNfbGV2ZWxfYyBTYW1wbGVzOiBSZWFkaW5nIGZyb20gV0FWIEZpbGUKKyAqCisgKiBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZSB0byB1c2UgdGhlIEByZWYgUEpNRURJQV9GSUxFX1BMQVksIHRvCisgKiBkaXJlY3RseSByZWFkIHRoZSBzYW1wbGVzIGZyb20gdGhlIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvbGV2ZWwuYworICoKKyAqIFxpbmNsdWRlbGluZW5vIGxldmVsLmMKKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXNjID0gCisgIiBGSUxFOgkJCQkJCQkJICAgIFxuIgorICIgIGxldmVsLmMJCQkJCQkJCSAgICBcbiIKKyAiCQkJCQkJCQkJICAgIFxuIgorICIgUFVSUE9TRToJCQkJCQkJCSAgICBcbiIKKyAiICBSZWFkIFBDTSBXQVYgZmlsZSBhbmQgZGlzcGxheSB0aGUgYXVkaW8gbGV2ZWwgdGhlIGZpcnN0IDEwMCBmcmFtZXMuICAgICBcbiIKKyAiICBFYWNoIGZyYW1lIGlzIGFzc3VtZWQgdG8gaGF2ZSAxNjAgc2FtcGxlcy4JCQkJICAgIFxuIgorICIJCQkJCQkJCQkgICAgXG4iCisgIiBVU0FHRToJCQkJCQkJCSAgICBcbiIKKyAiICBsZXZlbCBmaWxlLndhdgkJCQkJCQkgICAgXG4iCisgIgkJCQkJCQkJCSAgICBcbiIKKyAiICBUaGUgV0FWIGZpbGUgU0hPVUxEIGhhdmUgYSAxNmJpdCBtb25vIHNhbXBsZXMuCQkJICAgICI7CisKKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIEZvciBsb2dnaW5nIHB1cnBvc2UuICovCisjZGVmaW5lIFRISVNfRklMRSAgICJsZXZlbC5jIgorCisKKy8qIFV0aWwgdG8gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlICAqLworc3RhdGljIGludCBhcHBfcGVycm9yKCBjb25zdCBjaGFyICpzZW5kZXIsIGNvbnN0IGNoYXIgKnRpdGxlLCAKKwkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgUEpfVU5VU0VEX0FSRyhzZW5kZXIpOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKworICAgIHByaW50ZigiJXM6ICVzIFtjb2RlPSVkXVxuIiwgdGl0bGUsIGVycm1zZywgc3RhdHVzKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgZW51bSB7IE5TQU1QTEVTID0gNjQwLCBDT1VOVD0xMDAgfTsKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGptZWRpYV9lbmRwdCAqbWVkX2VuZHB0OworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX3BvcnQgKmZpbGVfcG9ydDsKKyAgICBpbnQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKworICAgIC8qIFZlcmlmeSBjbWQgbGluZSBhcmd1bWVudHMuICovCisgICAgaWYgKGFyZ2MgIT0gMikgeworCXB1dHMoIiIpOworCXB1dHMoZGVzYyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogTXVzdCBpbml0IFBKTElCIGZpcnN0OiAqLworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludC4KKyAgICAgKiBUaGlzIHdpbGwgaW1wbGljaXRseSBpbml0aWFsaXplIFBKTUVESUEgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIENyZWF0ZSBtZW1vcnkgcG9vbCBmb3Igb3VyIGZpbGUgcGxheWVyICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJ3YXYiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICAvKiBDcmVhdGUgZmlsZSBtZWRpYSBwb3J0IGZyb20gdGhlIFdBViBmaWxlICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKCAgcG9vbCwJLyogbWVtb3J5IHBvb2wJICAgICovCisJCQkJCSAgICAgIGFyZ3ZbMV0sCS8qIGZpbGUgdG8gcGxheQkgICAgKi8KKwkJCQkJICAgICAgMCwJLyogdXNlIGRlZmF1bHQgcHRpbWUqLworCQkJCQkgICAgICAwLAkvKiBmbGFncwkgICAgKi8KKwkJCQkJICAgICAgMCwJLyogZGVmYXVsdCBidWZmZXIgICAqLworCQkJCQkgICAgICAmZmlsZV9wb3J0LyogcmV0dXJuZWQgcG9ydCAgICAqLworCQkJCQkgICAgICApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHVzZSBXQVYgZmlsZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKFBKTUVESUFfUElBX1NQRigmZmlsZV9wb3J0LT5pbmZvKSA+IE5TQU1QTEVTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJXQVYgY2xvY2sgcmF0ZSBpcyB0b28gYmlnIiwgUEpfRUlOVkFMKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdXRzKCJUaW1lXHRQQ01VXHRMaW5lYXIiKTsKKyAgICBwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworICAgIGZvciAoaT0wOyBpPENPVU5UOyArK2kpIHsKKwlwal9pbnQxNl90IGZyYW1lYnVmW05TQU1QTEVTXTsKKwlwam1lZGlhX2ZyYW1lIGZybTsKKwlwal9pbnQzMl90IGxldmVsMzI7CisJdW5zaWduZWQgbXM7CisJaW50IGxldmVsOworCisJZnJtLmJ1ZiA9IGZyYW1lYnVmOworCWZybS5zaXplID0gc2l6ZW9mKGZyYW1lYnVmKTsKKwkKKwlwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKGZpbGVfcG9ydCwgJmZybSk7CisKKwlsZXZlbDMyID0gcGptZWRpYV9jYWxjX2F2Z19zaWduYWwoZnJhbWVidWYsIAorCQkJCQkgIFBKTUVESUFfUElBX1NQRigmZmlsZV9wb3J0LT5pbmZvKSk7CisJbGV2ZWwgPSBwam1lZGlhX2xpbmVhcjJ1bGF3KGxldmVsMzIpIF4gMHhGRjsKKworCW1zID0gaSAqIDEwMDAgKiBQSk1FRElBX1BJQV9TUEYoJmZpbGVfcG9ydC0+aW5mbykgLworCQlQSk1FRElBX1BJQV9TUkFURSgmZmlsZV9wb3J0LT5pbmZvKTsKKwlwcmludGYoIiUwM2QuJTAzZFx0JTdkXHQlN2RcbiIsIAorCSAgICAgICAgbXMvMTAwMCwgbXMlMTAwMCwgbGV2ZWwsIGxldmVsMzIpOworICAgIH0KKyAgICBwdXRzKCIiKTsKKyAgICAKKworICAgIC8qIERlc3Ryb3kgZmlsZSBwb3J0ICovCisgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2Rlc3Ryb3koIGZpbGVfcG9ydCApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogUmVsZWFzZSBhcHBsaWNhdGlvbiBwb29sICovCisgICAgcGpfcG9vbF9yZWxlYXNlKCBwb29sICk7CisKKyAgICAvKiBEZXN0cm95IG1lZGlhIGVuZHBvaW50LiAqLworICAgIHBqbWVkaWFfZW5kcHRfZGVzdHJveSggbWVkX2VuZHB0ICk7CisKKyAgICAvKiBEZXN0cm95IHBvb2wgZmFjdG9yeSAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCAmY3AgKTsKKworICAgIC8qIFNodXRkb3duIFBKTElCICovCisgICAgcGpfc2h1dGRvd24oKTsKKworCisgICAgLyogRG9uZS4gKi8KKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9tYWluX3J0ZW1zLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL21haW5fcnRlbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY2MDVhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9tYWluX3J0ZW1zLmMKQEAgLTAsMCArMSwxMiBAQAorCisvKiAKKyAqICAhISBPSVkgT0lZICEhCisgKgorICogIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBvbmx5IHRvIGdldCB0aGUgZXhlY3V0YWJsZSBsaW5rZWQuIEkgaGF2ZW4ndAorICogIGFjdHVhbGx5IHRyaWVkIHRvIHJ1biB0aGlzIG9uIFJURU1TISEKKyAqCisgKi8KKworI2luY2x1ZGUgIi4uLy4uL3BqbGliL3NyYy9wamxpYi10ZXN0L21haW5fcnRlbXMuYyIKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL21peC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9taXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUyMjRmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9taXguYwpAQCAtMCwwICsxLDIzNyBAQAorLyogJElkOiBtaXguYyAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisgLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19taXhfYyBTYW1wbGVzOiBNaXhpbmcgV0FWIGZpbGVzCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvbWl4LmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBtaXguYworICovCisKKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKyNpbmNsdWRlIDxwam1lZGlhLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFICAgIm1peC5jIgorCitzdGF0aWMgY29uc3QgY2hhciAqZGVzYyA9IAorICIgbWl4XG4iCisgIlxuIgorICIgUFVSUE9TRTpcbiIKKyAiICBNaXggaW5wdXQgV0FWIGZpbGVzIGFuZCBzYXZlIGl0IHRvIG91dHB1dCBXQVYuIElucHV0IFdBViBjYW4gaGF2ZVxuIgorICIgIGRpZmZlcmVudCBjbG9jayByYXRlLlxuIgorICJcbiIKKyAiXG4iCisgIiBVU0FHRTpcbiIKKyAiICBtaXggW29wdGlvbnNdIG91dHB1dC53YXYgaW5wdXQxLndhdiBbaW5wdXQyLndhdl0gLi4uXG4iCisgIlxuIgorICIgYXJndW1lbnRzOlxuIgorICIgICAgb3V0cHV0LndhdiAgICBTZXQgdGhlIG91dHB1dCBXQVYgZmlsZW5hbWUuXG4iCisgIiAgICBpbnB1dDEud2F2ICAgIFNldCB0aGUgaW5wdXQgV0FWIGZpbGVuYW1lLlxuIgorICIgICAgaW5wdXQyLndhdiAgICBTZXQgdGhlIGlucHV0IFdBViBmaWxlbmFtZS5cbiIKKyAiXG4iCisgIiBvcHRpb25zOlxuIgorICIgICAgLWMgTiAgICAgICAgICBTZXQgY2xvY2sgcmF0ZSB0byBOIEh6IChkZWZhdWx0IDE2MDAwKVxuIgorICIgICAgLWYgICAgICAgICAgICBGb3JjZSB3cml0ZSAob3ZlcndyaXRlIG91dHB1dCB3aXRob3V0IHdhcm5pbmdcbiIKKzsKKworI2RlZmluZSBNQVhfV0FWCSAgICAxNgorI2RlZmluZSBQVElNRQkgICAgMjAKKyNkZWZpbmUgQVBQRU5ECSAgICAxMDAwCisKK3N0cnVjdCB3YXZfaW5wdXQKK3sKKyAgICBjb25zdCBjaGFyCSAgICAqZm5hbWU7CisgICAgcGptZWRpYV9wb3J0ICAgICpwb3J0OworICAgIHVuc2lnbmVkCSAgICAgc2xvdDsKK307CisKK3N0YXRpYyBpbnQgZXJyX3JldChjb25zdCBjaGFyICp0aXRsZSwgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiJXMgZXJyb3I6ICVzIiwgdGl0bGUsIGVycm1zZykpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIHB1dHMoZGVzYyk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX2VuZHB0ICptZWRfZXB0OworICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUgPSAxNjAwMDsKKyAgICBpbnQgYywgZm9yY2U9MDsKKyAgICBjb25zdCBjaGFyICpvdXRfZm5hbWU7CisgICAgcGptZWRpYV9jb25mICpjb25mOworICAgIHBqbWVkaWFfcG9ydCAqd2F2b3V0OworICAgIHN0cnVjdCB3YXZfaW5wdXQgd2F2X2lucHV0W01BWF9XQVZdOworICAgIHBqX3NpemVfdCBsb25nZXN0ID0gMCwgcHJvY2Vzc2VkOworICAgIHVuc2lnbmVkIGksIGlucHV0X2NudCA9IDA7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisjZGVmaW5lIENIRUNLKG9wKSAgIGRvIHsgXAorCQkJc3RhdHVzID0gb3A7IFwKKwkJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgXAorCQkJICAgIHJldHVybiBlcnJfcmV0KCNvcCwgc3RhdHVzKTsgXAorCQkgICAgfSB3aGlsZSAoMCkKKworCisgICAgLyogUGFyc2UgYXJndW1lbnRzICovCisgICAgd2hpbGUgKChjPXBqX2dldG9wdChhcmdjLCBhcmd2LCAiYzpmIikpICE9IC0xKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnYyc6CisJICAgIGNsb2NrX3JhdGUgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGlmIChjbG9ja19yYXRlIDwgMTAwMCkgeworCQlwdXRzKCJFcnJvcjogaW52YWxpZCBjbG9jayByYXRlIik7CisJCXVzYWdlKCk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICdmJzoKKwkgICAgZm9yY2UgPSAxOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgLyogR2V0IG91dHB1dCBXQVYgbmFtZSAqLworICAgIGlmIChwal9vcHRpbmQgPT0gYXJnYykgeworCXB1dHMoIkVycm9yOiBubyBXQVYgb3V0cHV0IGlzIHNwZWNpZmllZCIpOworCXVzYWdlKCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgb3V0X2ZuYW1lID0gYXJndltwal9vcHRpbmQrK107CisgICAgaWYgKGZvcmNlPT0wICYmIHBqX2ZpbGVfZXhpc3RzKG91dF9mbmFtZSkpIHsKKwljaGFyIGluWzhdOworCisJcHJpbnRmKCJGaWxlICVzIGV4aXN0cywgb3ZlcndyaXRlPyBbWS9OXSAiLCBvdXRfZm5hbWUpOworCWZmbHVzaChzdGRvdXQpOworCWlmIChmZ2V0cyhpbiwgc2l6ZW9mKGluKSwgc3RkaW4pID09IE5VTEwpCisJICAgIHJldHVybiAxOworCWlmIChwal90b2xvd2VyKGluWzBdKSAhPSAneScpCisJICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIFNjYW4gaW5wdXQgZmlsZSBuYW1lcyAqLworICAgIGZvciAoaW5wdXRfY250PTAgOyBwal9vcHRpbmQ8YXJnYyAmJiBpbnB1dF9jbnQ8TUFYX1dBVjsgCisJICsrcGpfb3B0aW5kLCArK2lucHV0X2NudCkgCisgICAgeworCWlmICghcGpfZmlsZV9leGlzdHMoYXJndltwal9vcHRpbmRdKSkgeworCSAgICBwcmludGYoIkVycm9yOiBpbnB1dCBmaWxlICVzIGRvZXNuJ3QgZXhpc3RcbiIsCisJCSAgIGFyZ3ZbcGpfb3B0aW5kXSk7CisJICAgIHJldHVybiAxOworCX0KKwl3YXZfaW5wdXRbaW5wdXRfY250XS5mbmFtZSA9IGFyZ3ZbcGpfb3B0aW5kXTsKKwl3YXZfaW5wdXRbaW5wdXRfY250XS5wb3J0ID0gTlVMTDsKKwl3YXZfaW5wdXRbaW5wdXRfY250XS5zbG90ID0gMDsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRfY250ID09IDApIHsKKwlwdXRzKCJFcnJvcjogbm8gaW5wdXQgV0FWIGlzIHNwZWNpZmllZCIpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIEluaXRpYWxpYWxpemUgKi8KKyAgICBDSEVDSyggcGpfaW5pdCgpICk7CisgICAgQ0hFQ0soIHBqbGliX3V0aWxfaW5pdCgpICk7CisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCBOVUxMLCAwKTsKKyAgICBDSEVDSyggcGptZWRpYV9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIE5VTEwsIDEsICZtZWRfZXB0KSApOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCZjcC5mYWN0b3J5LCAibWl4IiwgMTAwMCwgMTAwMCwgTlVMTCk7CisKKyAgICAvKiBDcmVhdGUgdGhlIGJyaWRnZSAqLworICAgIENIRUNLKCBwam1lZGlhX2NvbmZfY3JlYXRlKHBvb2wsIE1BWF9XQVYrNCwgY2xvY2tfcmF0ZSwgMSwgCisJCQkgICAgICAgY2xvY2tfcmF0ZSAqIFBUSU1FIC8gMTAwMCwgMTYsIAorCQkJICAgICAgIFBKTUVESUFfQ09ORl9OT19ERVZJQ0UsICZjb25mKSApOworCisgICAgLyogQ3JlYXRlIHRoZSBXQVYgb3V0cHV0ICovCisgICAgQ0hFQ0soIHBqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X2NyZWF0ZShwb29sLCBvdXRfZm5hbWUsIGNsb2NrX3JhdGUsIDEsCisJCQkJCSAgY2xvY2tfcmF0ZSAqIFBUSU1FIC8gMTAwMCwKKwkJCQkJICAxNiwgMCwgMCwgJndhdm91dCkgKTsKKworICAgIC8qIENyZWF0ZSBhbmQgcmVnaXN0ZXIgZWFjaCBXQVYgaW5wdXQgdG8gdGhlIGJyaWRnZSAqLworICAgIGZvciAoaT0wOyBpPGlucHV0X2NudDsgKytpKSB7CisJcGpfc3NpemVfdCBsZW47CisKKwlDSEVDSyggcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKHBvb2wsIHdhdl9pbnB1dFtpXS5mbmFtZSwgMjAsCisJCQkJCSAgICAgIFBKTUVESUFfRklMRV9OT19MT09QLCAwLCAKKwkJCQkJICAgICAgJndhdl9pbnB1dFtpXS5wb3J0KSApOworCWxlbiA9IHBqbWVkaWFfd2F2X3BsYXllcl9nZXRfbGVuKHdhdl9pbnB1dFtpXS5wb3J0KTsKKwlsZW4gPSAocGpfc3NpemVfdCkobGVuICogMS4wICogY2xvY2tfcmF0ZSAvIAorCQkJICAgUEpNRURJQV9QSUFfU1JBVEUoJndhdl9pbnB1dFtpXS5wb3J0LT5pbmZvKSk7CisJaWYgKGxlbiA+IChwal9zc2l6ZV90KWxvbmdlc3QpCisJICAgIGxvbmdlc3QgPSBsZW47CisKKwlDSEVDSyggcGptZWRpYV9jb25mX2FkZF9wb3J0KGNvbmYsIHBvb2wsIHdhdl9pbnB1dFtpXS5wb3J0LAorCQkJCSAgICAgTlVMTCwgJndhdl9pbnB1dFtpXS5zbG90KSk7CisKKwlDSEVDSyggcGptZWRpYV9jb25mX2Nvbm5lY3RfcG9ydChjb25mLCB3YXZfaW5wdXRbaV0uc2xvdCwgMCwgMCkgKTsKKyAgICB9CisKKyAgICAvKiBMb29wIHJlYWRpbmcgZnJhbWUgZnJvbSB0aGUgYnJpZGdlIGFuZCB3cml0ZSBpdCB0byBXQVYgKi8KKyAgICBwcm9jZXNzZWQgPSAwOworICAgIHdoaWxlIChwcm9jZXNzZWQgPCBsb25nZXN0ICsgY2xvY2tfcmF0ZSAqIEFQUEVORCAqIDIgLyAxMDAwKSB7CisJcGpfaW50MTZfdCBmcmFtZWJ1ZltQVElNRSAqIDQ4MDAwIC8gMTAwMF07CisJcGptZWRpYV9wb3J0ICpjcCA9IHBqbWVkaWFfY29uZl9nZXRfbWFzdGVyX3BvcnQoY29uZik7CisJcGptZWRpYV9mcmFtZSBmcmFtZTsKKworCWZyYW1lLmJ1ZiA9IGZyYW1lYnVmOworCWZyYW1lLnNpemUgPSBQSk1FRElBX1BJQV9TUEYoJmNwLT5pbmZvKSAqIDI7CisJcGpfYXNzZXJ0KGZyYW1lLnNpemUgPD0gc2l6ZW9mKGZyYW1lYnVmKSk7CisJCisJQ0hFQ0soIHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUoY3AsICZmcmFtZSkgKTsKKworCWlmIChmcmFtZS50eXBlICE9IFBKTUVESUFfRlJBTUVfVFlQRV9BVURJTykgeworCSAgICBwal9iemVybyhmcmFtZS5idWYsIGZyYW1lLnNpemUpOworCSAgICBmcmFtZS50eXBlID0gUEpNRURJQV9GUkFNRV9UWVBFX0FVRElPOworCX0KKworCUNIRUNLKCBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKHdhdm91dCwgJmZyYW1lKSk7CisKKwlwcm9jZXNzZWQgKz0gZnJhbWUuc2l6ZTsKKyAgICB9CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiRG9uZS4gT3V0cHV0IGR1cmF0aW9uOiAlZC4lMDNkIiwKKwkgICAgICAocHJvY2Vzc2VkID4+IDIpL2Nsb2NrX3JhdGUsCisJICAgICAgKChwcm9jZXNzZWQgPj4gMikqMTAwMC9jbG9ja19yYXRlKSAlIDEwMDApKTsKKworICAgIC8qIFNodXRkb3duIGV2ZXJ5dGhpbmcgKi8KKyAgICBDSEVDSyggcGptZWRpYV9wb3J0X2Rlc3Ryb3kod2F2b3V0KSApOworICAgIGZvciAoaT0wOyBpPGlucHV0X2NudDsgKytpKSB7CisJQ0hFQ0soIHBqbWVkaWFfY29uZl9yZW1vdmVfcG9ydChjb25mLCB3YXZfaW5wdXRbaV0uc2xvdCkgKTsKKwlDSEVDSyggcGptZWRpYV9wb3J0X2Rlc3Ryb3kod2F2X2lucHV0W2ldLnBvcnQpICk7CisgICAgfQorCisgICAgQ0hFQ0socGptZWRpYV9jb25mX2Rlc3Ryb3koY29uZikpOworICAgIENIRUNLKHBqbWVkaWFfZW5kcHRfZGVzdHJveShtZWRfZXB0KSk7CisKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koJmNwKTsKKyAgICBwal9zaHV0ZG93bigpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcGNhcHV0aWwuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcGNhcHV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWIxNjAzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wY2FwdXRpbC5jCkBAIC0wLDAgKzEsNTQwIEBACisvKiAkSWQ6IHBjYXB1dGlsLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKlVTQUdFID0KKyJwY2FwdXRpbCBbb3B0aW9uc10gSU5QVVQgT1VUUFVUXG4iCisiXG4iCisiICBDb252ZXJ0IGNhcHR1cmVkIFJUUCBwYWNrZXRzIGluIFBDQVAgZmlsZSB0byBXQVYgZmlsZSBvciBwbGF5IGl0XG4iCisiICB0byBhdWRpbyBkZXZpY2UuXG4iCisiXG4iCisiICBJTlBVVCAgaXMgdGhlIFBDQVAgZmlsZSBuYW1lL3BhdGguXG4iCisiICBPVVRQVVQgaXMgdGhlIFdBViBmaWxlIG5hbWUvcGF0aCB0byBzdG9yZSB0aGUgb3V0cHV0LCBvciBzZXQgdG8gXCItXCIsXG4iCisiICAgICAgICAgdG8gcGxheSB0aGUgb3V0cHV0IHRvIGF1ZGlvIGRldmljZS4gVGhlIHByb2dyYW0gd2lsbCBkZWNvZGVcbiIKKyIgICAgICAgICB0aGUgUlRQIGNvbnRlbnRzIHVzaW5nIGNvZGVjIHRoYXQgaXMgYXZhaWxhYmxlIGluIFBKTUVESUEsXG4iCisiICAgICAgICAgYW5kIG9wdGlvbmFsbHkgZGVjcnlwdCB0aGUgY29udGVudCB1c2luZyB0aGUgU1JUUCBjcnlwdG8gYW5kXG4iCisiICAgICAgICAga2V5cyBiZWxvdy5cbiIKKyJcbiIKKyJPcHRpb25zIHRvIGZpbHRlciBwYWNrZXRzIGZyb20gUENBUCBmaWxlOlxuIgorIih5b3UgY2FuIGFsd2F5cyBzZWxlY3QgdGhlIHJlbGV2YW50IHBhY2tldHMgZnJvbSBXaXJlc2hhcmsgb2YgY291cnNlISlcbiIKKyIgIC0tc3JjLWlwPUlQICAgICAgICAgICAgT25seSBpbmNsdWRlIHBhY2tldHMgZnJvbSB0aGlzIHNvdXJjZSBhZGRyZXNzXG4iCisiICAtLWRzdC1pcD1JUCAgICAgICAgICAgIE9ubHkgaW5jbHVkZSBwYWNrZXRzIGRlc3RpbmVkIHRvIHRoaXMgYWRkcmVzc1xuIgorIiAgLS1zcmMtcG9ydD1wb3J0ICAgICAgICBPbmx5IGluY2x1ZGUgcGFja2V0cyBmcm9tIHRoaXMgc291cmNlIHBvcnQgbnVtYmVyXG4iCisiICAtLWRzdC1wb3J0PXBvcnQgICAgICAgIE9ubHkgaW5jbHVkZSBwYWNrZXRzIGRlc3RpbmVkIHRvIHRoaXMgcG9ydCBudW1iZXJcbiIKKyJcbiIKKyJPcHRpb25zIGZvciBSVFAgcGFja2V0IHByb2Nlc3Npbmc6XG4iCisiIgorIiAgLS1jb2RlYz1jb2RlY19pZAkgIFRoZSBjb2RlYyBJRCBmb3JtYXR0ZWQgXCJuYW1lL2Nsb2NrLXJhdGUvY2hhbm5lbC1jb3VudFwiXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBjb2RlYyB3aXRoIGR5bmFtaWMgUFQsXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgIGUuZzogXCJTcGVleC84MDAwXCJcbiIKKyIgIC0tc3J0cC1jcnlwdG89VEFHLCAtYyAgU2V0IGNyeXB0byB0byBiZSB1c2VkIHRvIGRlY3J5cHQgU1JUUCBwYWNrZXRzLiBWYWxpZFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzIGFyZTogXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NNXzEyOF9ITUFDX1NIQTFfODAgXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NNXzEyOF9ITUFDX1NIQTFfMzJcbiIKKyIgIC0tc3J0cC1rZXk9S0VZLCAtayAgICAgU2V0IHRoZSBiYXNlNjQga2V5IHRvIGRlY3J5cHQgU1JUUCBwYWNrZXRzLlxuIgorIlxuIgorIk9wdGlvbnMgZm9yIHBsYXlpbmcgdG8gYXVkaW8gZGV2aWNlOlxuIgorIiIKKyIgIC0tcGxheS1kZXYtaWQ9ZGV2X2lkICAgQXVkaW8gZGV2aWNlIElEIGZvciBwbGF5YmFjay5cbiIKKyJcbiIKKyIgIEV4YW1wbGU6XG4iCisiICAgIHBjYXB1dGlsIGZpbGUucGNhcCBvdXRwdXQud2F2XG4iCisiICAgIHBjYXB1dGlsIC1jIEFFU19DTV8xMjhfSE1BQ19TSEExXzgwIFxcXG4iCisiICAgICAgICAgICAgIC1rIFZMRE9OYnNiR2wyUHVxeSswUFY3dy91R2ZwU1BLRmV2RHB4R3N4TjMgXFxcbiIKKyIgICAgICAgICAgICAgZmlsZS5wY2FwIG91dHB1dC53YXZcbiIKKyJcbiIKKzsKKworc3RhdGljIHN0cnVjdCBhcHAKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wJIGNwOworICAgIHBqX3Bvb2xfdAkJKnBvb2w7CisgICAgcGptZWRpYV9lbmRwdAkqbWVwdDsKKyAgICBwal9wY2FwX2ZpbGUJKnBjYXA7CisgICAgcGptZWRpYV9wb3J0CSp3YXY7CisgICAgcGptZWRpYV9jb2RlYwkqY29kZWM7CisgICAgcGptZWRpYV9hdWRfc3RyZWFtICAqYXVkX3N0cm07CisgICAgdW5zaWduZWQJCSBwdDsKKyAgICBwam1lZGlhX3RyYW5zcG9ydAkqc3J0cDsKKyAgICBwam1lZGlhX3J0cF9zZXNzaW9uCSBydHBfc2VzczsKKyAgICBwal9ib29sX3QJCSBydHBfc2Vzc19pbml0OworfSBhcHA7CisKKworc3RhdGljIHZvaWQgY2xlYW51cCgpCit7CisgICAgaWYgKGFwcC5zcnRwKSBwam1lZGlhX3RyYW5zcG9ydF9jbG9zZShhcHAuc3J0cCk7CisgICAgaWYgKGFwcC53YXYpIHsKKyAgICAgICAgcGpfc3NpemVfdCBwb3MgPSBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9nZXRfcG9zKGFwcC53YXYpOworICAgICAgICBpZiAocG9zID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1zZWM7CisgICAgICAgICAgICBtc2VjID0gKHVuc2lnbmVkKXBvcyAvIDIgKiAxMDAwIC8gUEpNRURJQV9QSUFfU1JBVEUoJmFwcC53YXYtPmluZm8pOworICAgICAgICAgICAgcHJpbnRmKCJXcml0dGVuOiAlZG06JTAyZHMuJTAzZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbXNlYyAvIDEwMDAgLyA2MCwKKyAgICAgICAgICAgICAgICAgICAgKG1zZWMgLyAxMDAwKSAlIDYwLAorICAgICAgICAgICAgICAgICAgICBtc2VjICUgMTAwMCk7CisgICAgICAgIH0KKwlwam1lZGlhX3BvcnRfZGVzdHJveShhcHAud2F2KTsKKyAgICB9CisgICAgaWYgKGFwcC5wY2FwKSBwal9wY2FwX2Nsb3NlKGFwcC5wY2FwKTsKKyAgICBpZiAoYXBwLmNvZGVjKSB7CisJcGptZWRpYV9jb2RlY19tZ3IgKmNtZ3I7CisJcGptZWRpYV9jb2RlY19jbG9zZShhcHAuY29kZWMpOworCWNtZ3IgPSBwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IoYXBwLm1lcHQpOworCXBqbWVkaWFfY29kZWNfbWdyX2RlYWxsb2NfY29kZWMoY21nciwgYXBwLmNvZGVjKTsKKyAgICB9CisgICAgaWYgKGFwcC5hdWRfc3RybSkgeworCXBqbWVkaWFfYXVkX3N0cmVhbV9zdG9wKGFwcC5hdWRfc3RybSk7CisJcGptZWRpYV9hdWRfc3RyZWFtX2Rlc3Ryb3koYXBwLmF1ZF9zdHJtKTsKKyAgICB9CisgICAgaWYgKGFwcC5tZXB0KSBwam1lZGlhX2VuZHB0X2Rlc3Ryb3koYXBwLm1lcHQpOworICAgIGlmIChhcHAucG9vbCkgcGpfcG9vbF9yZWxlYXNlKGFwcC5wb29sKTsKKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmYXBwLmNwKTsKKyAgICBwal9zaHV0ZG93bigpOworfQorCitzdGF0aWMgdm9pZCBlcnJfZXhpdChjb25zdCBjaGFyICp0aXRsZSwgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisJcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwlwcmludGYoIkVycm9yOiAlczogJXNcbiIsIHRpdGxlLCBlcnJtc2cpOworICAgIH0gZWxzZSB7CisJcHJpbnRmKCJFcnJvcjogJXNcbiIsIHRpdGxlKTsKKyAgICB9CisgICAgY2xlYW51cCgpOworICAgIGV4aXQoMSk7Cit9CisKKyNkZWZpbmUgVChvcCkJICAgIGRvIHsgXAorCQkJc3RhdHVzID0gb3A7IFwKKwkJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgXAorICAgIAkJCSAgICBlcnJfZXhpdCgjb3AsIHN0YXR1cyk7IFwKKwkJICAgIH0gd2hpbGUgKDApCisKKworc3RhdGljIHZvaWQgcmVhZF9ydHAocGpfdWludDhfdCAqYnVmLCBwal9zaXplX3QgYnVmc2l6ZSwKKwkJICAgICBwam1lZGlhX3J0cF9oZHIgKipydHAsCisJCSAgICAgcGpfdWludDhfdCAqKnBheWxvYWQsCisJCSAgICAgdW5zaWduZWQgKnBheWxvYWRfc2l6ZSwKKwkJICAgICBwal9ib29sX3QgY2hlY2tfcHQpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogSW5pdCBSVFAgc2Vzc2lvbiAqLworICAgIGlmICghYXBwLnJ0cF9zZXNzX2luaXQpIHsKKwlUKHBqbWVkaWFfcnRwX3Nlc3Npb25faW5pdCgmYXBwLnJ0cF9zZXNzLCAwLCAwKSk7CisJYXBwLnJ0cF9zZXNzX2luaXQgPSBQSl9UUlVFOworICAgIH0KKworICAgIC8qIExvb3AgcmVhZGluZyB1bnRpbCB3ZSBoYXZlIGEgZ29vZCBSVFAgcGFja2V0ICovCisgICAgZm9yICg7OykgeworCXBqX3NpemVfdCBzeiA9IGJ1ZnNpemU7CisJY29uc3QgcGptZWRpYV9ydHBfaGRyICpyOworCWNvbnN0IHZvaWQgKnA7CisJcGptZWRpYV9ydHBfc3RhdHVzIHNlcV9zdDsKKworCXN0YXR1cyA9IHBqX3BjYXBfcmVhZF91ZHAoYXBwLnBjYXAsIE5VTEwsIGJ1ZiwgJnN6KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGVycl9leGl0KCJFcnJvciByZWFkaW5nIFBDQVAgZmlsZSIsIHN0YXR1cyk7CisKKwkvKiBEZWNvZGUgUlRQIHBhY2tldCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGFuIFJUUCBwYWNrZXQuCisJICogV2Ugd2lsbCBkZWNvZGUgaXQgYWdhaW4gdG8gZ2V0IHRoZSBwYXlsb2FkIGFmdGVyIHdlIGRvCisJICogU1JUUCBkZWNvZGluZworCSAqLworCXN0YXR1cyA9IHBqbWVkaWFfcnRwX2RlY29kZV9ydHAoJmFwcC5ydHBfc2VzcywgYnVmLCAoaW50KXN6LCAmciwgCisJCQkJCSZwLCBwYXlsb2FkX3NpemUpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCSAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCSAgICBwcmludGYoIk5vdCBSVFAgcGFja2V0LCBza2lwcGluZyBwYWNrZXQ6ICVzXG4iLCBlcnJtc2cpOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBEZWNyeXB0IFNSVFAgKi8KKyNpZiBQSk1FRElBX0hBU19TUlRQCisJaWYgKGFwcC5zcnRwKSB7CisJICAgIGludCBsZW4gPSAoaW50KXN6OworCSAgICBzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9zcnRwX2RlY3J5cHRfcGt0KGFwcC5zcnRwLCBQSl9UUlVFLCAKKwkJCQkJCSAgICAgICAgYnVmLCAmbGVuKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisJCXBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisJCXByaW50ZigiU1JUUCBwYWNrZXQgZGVjcnlwdGlvbiBmYWlsZWQsIHNraXBwaW5nIHBhY2tldDogJXNcbiIsIAorCQkJZXJybXNnKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgc3ogPSBsZW47CisKKwkgICAgLyogRGVjb2RlIFJUUCBwYWNrZXQgYWdhaW4gKi8KKwkgICAgc3RhdHVzID0gcGptZWRpYV9ydHBfZGVjb2RlX3J0cCgmYXBwLnJ0cF9zZXNzLCBidWYsIChpbnQpc3osICZyLAorCQkJCQkgICAgJnAsIHBheWxvYWRfc2l6ZSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQljaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCQlwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCQlwcmludGYoIk5vdCBSVFAgcGFja2V0LCBza2lwcGluZyBwYWNrZXQ6ICVzXG4iLCBlcnJtc2cpOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisJLyogVXBkYXRlIFJUUCBzZXNzaW9uICovCisJcGptZWRpYV9ydHBfc2Vzc2lvbl91cGRhdGUyKCZhcHAucnRwX3Nlc3MsIHIsICZzZXFfc3QsIFBKX0ZBTFNFKTsKKworCS8qIFNraXAgb3V0LW9mLW9yZGVyIHBhY2tldCAqLworCWlmIChzZXFfc3QuZGlmZiA9PSAwKSB7CisJICAgIHByaW50ZigiU2tpcHBpbmcgb3V0IG9mIG9yZGVyIHBhY2tldFxuIik7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIFNraXAgaWYgcGF5bG9hZCB0eXBlIGlzIGRpZmZlcmVudCAqLworCWlmIChjaGVja19wdCAmJiByLT5wdCAhPSBhcHAucHQpIHsKKwkgICAgcHJpbnRmKCJTa2lwcGluZyBSVFAgcGFja2V0IHdpdGggYmFkIHBheWxvYWQgdHlwZVxuIik7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIFNraXAgYmFkIHBhY2tldCAqLworCWlmIChzZXFfc3Quc3RhdHVzLmZsYWcuYmFkKSB7CisJICAgIHByaW50ZigiU2tpcHBpbmcgYmFkIFJUUFxuIik7CisJICAgIGNvbnRpbnVlOworCX0KKworCisJKnJ0cCA9IChwam1lZGlhX3J0cF9oZHIqKXI7CisJKnBheWxvYWQgPSAocGpfdWludDhfdCopcDsKKworCS8qIFdlIGhhdmUgZ29vZCBwYWNrZXQgKi8KKwlicmVhazsKKyAgICB9Cit9CisKK3BqbWVkaWFfZnJhbWUgcGxheV9mcm07CitzdGF0aWMgcGpfYm9vbF90IHBsYXlfZnJtX2NvcGllZCwgcGxheV9mcm1fcmVhZHk7CisKK3N0YXRpYyBwal9zdGF0dXNfdCB3YWl0X3BsYXkocGptZWRpYV9mcmFtZSAqZikKK3sKKyAgICBwbGF5X2ZybV9jb3BpZWQgPSBQSl9GQUxTRTsKKyAgICBwbGF5X2ZybSA9ICpmOworICAgIHBsYXlfZnJtX3JlYWR5ID0gUEpfVFJVRTsKKyAgICB3aGlsZSAoIXBsYXlfZnJtX2NvcGllZCkgeworCXBqX3RocmVhZF9zbGVlcCgxKTsKKyAgICB9CisgICAgcGxheV9mcm1fcmVhZHkgPSBQSl9GQUxTRTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgcGxheV9jYih2b2lkICp1c2VyX2RhdGEsIHBqbWVkaWFfZnJhbWUgKmYpCit7CisgICAgUEpfVU5VU0VEX0FSRyh1c2VyX2RhdGEpOworCisgICAgaWYgKCFwbGF5X2ZybV9yZWFkeSkgeworCVBKX0xPRygzLCAoInBsYXlfY2IoKSIsICJXYXJuaW5nISBQbGF5IGZyYW1lIG5vdCByZWFkeSIpKTsgCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgcGpfbWVtY3B5KGYtPmJ1ZiwgcGxheV9mcm0uYnVmLCBwbGF5X2ZybS5zaXplKTsKKyAgICBmLT5zaXplID0gcGxheV9mcm0uc2l6ZTsKKworICAgIHBsYXlfZnJtX2NvcGllZCA9IFBKX1RSVUU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHBjYXAyd2F2KGNvbnN0IHBqX3N0cl90ICpjb2RlYywKKwkJICAgICBjb25zdCBwal9zdHJfdCAqd2F2X2ZpbGVuYW1lLAorCQkgICAgIHBqbWVkaWFfYXVkX2Rldl9pbmRleCBkZXZfaWQsCisJCSAgICAgY29uc3QgcGpfc3RyX3QgKnNydHBfY3J5cHRvLAorCQkgICAgIGNvbnN0IHBqX3N0cl90ICpzcnRwX2tleSkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBXQVYgPSB7Ii53YXYiLCA0fTsKKyAgICBzdHJ1Y3QgcGt0CisgICAgeworCXBqX3VpbnQ4X3QJIGJ1ZmZlclszMjBdOworCXBqbWVkaWFfcnRwX2hkcgkqcnRwOworCXBqX3VpbnQ4X3QJKnBheWxvYWQ7CisJdW5zaWduZWQJIHBheWxvYWRfbGVuOworICAgIH0gcGt0MDsKKyAgICBwam1lZGlhX2NvZGVjX21nciAqY21ncjsKKyAgICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKmNpOworICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWU7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgY29kZWNzICovCisgICAgVCggcGptZWRpYV9jb2RlY19yZWdpc3Rlcl9hdWRpb19jb2RlY3MoYXBwLm1lcHQsIE5VTEwpICk7CisKKyAgICAvKiBDcmVhdGUgU1JUUCB0cmFuc3BvcnQgaXMgbmVlZGVkICovCisjaWYgUEpNRURJQV9IQVNfU1JUUAorICAgIGlmIChzcnRwX2NyeXB0by0+c2xlbikgeworCXBqbWVkaWFfc3J0cF9jcnlwdG8gY3J5cHRvOworCisJcGpfYnplcm8oJmNyeXB0bywgc2l6ZW9mKGNyeXB0bykpOworCWNyeXB0by5rZXkgPSAqc3J0cF9rZXk7CisJY3J5cHRvLm5hbWUgPSAqc3J0cF9jcnlwdG87CisJVCggcGptZWRpYV90cmFuc3BvcnRfc3J0cF9jcmVhdGUoYXBwLm1lcHQsIE5VTEwsIE5VTEwsICZhcHAuc3J0cCkgKTsKKwlUKCBwam1lZGlhX3RyYW5zcG9ydF9zcnRwX3N0YXJ0KGFwcC5zcnRwLCAmY3J5cHRvLCAmY3J5cHRvKSApOworICAgIH0KKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhzcnRwX2NyeXB0byk7CisgICAgUEpfVU5VU0VEX0FSRyhzcnRwX2tleSk7CisjZW5kaWYKKworICAgIC8qIFJlYWQgZmlyc3QgcGFja2V0ICovCisgICAgcmVhZF9ydHAocGt0MC5idWZmZXIsIHNpemVvZihwa3QwLmJ1ZmZlciksICZwa3QwLnJ0cCwgCisJICAgICAmcGt0MC5wYXlsb2FkLCAmcGt0MC5wYXlsb2FkX2xlbiwgUEpfRkFMU0UpOworCisgICAgY21nciA9IHBqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncihhcHAubWVwdCk7CisKKyAgICAvKiBHZXQgY29kZWMgaW5mbyBhbmQgcGFyYW0gZm9yIHRoZSBzcGVjaWZpZWQgcGF5bG9hZCB0eXBlICovCisgICAgYXBwLnB0ID0gcGt0MC5ydHAtPnB0OworICAgIGlmIChhcHAucHQgPj0wICYmIGFwcC5wdCA8IDk2KSB7CisJVCggcGptZWRpYV9jb2RlY19tZ3JfZ2V0X2NvZGVjX2luZm8oY21nciwgcGt0MC5ydHAtPnB0LCAmY2kpICk7CisgICAgfSBlbHNlIHsKKwl1bnNpZ25lZCBjbnQgPSAyOworCWNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqaW5mb1syXTsKKwlUKCBwam1lZGlhX2NvZGVjX21ncl9maW5kX2NvZGVjc19ieV9pZChjbWdyLCBjb2RlYywgJmNudCwgCisJCQkJCSAgICAgICBpbmZvLCBOVUxMKSApOworCWlmIChjbnQgIT0gMSkKKwkgICAgZXJyX2V4aXQoIkNvZGVjIElEIG11c3QgYmUgc3BlY2lmaWVkIGFuZCB1bmlxdWUhIiwgMCk7CisKKwljaSA9IGluZm9bMF07CisgICAgfQorICAgIFQoIHBqbWVkaWFfY29kZWNfbWdyX2dldF9kZWZhdWx0X3BhcmFtKGNtZ3IsIGNpLCAmcGFyYW0pICk7CisKKyAgICAvKiBBbGxvYyBhbmQgaW5pdCBjb2RlYyAqLworICAgIFQoIHBqbWVkaWFfY29kZWNfbWdyX2FsbG9jX2NvZGVjKGNtZ3IsIGNpLCAmYXBwLmNvZGVjKSApOworICAgIFQoIHBqbWVkaWFfY29kZWNfaW5pdChhcHAuY29kZWMsIGFwcC5wb29sKSApOworICAgIFQoIHBqbWVkaWFfY29kZWNfb3BlbihhcHAuY29kZWMsICZwYXJhbSkgKTsKKworICAgIC8qIEluaXQgYXVkaW8gZGV2aWNlIG9yIFdBViBmaWxlICovCisgICAgc2FtcGxlc19wZXJfZnJhbWUgPSBjaS0+Y2xvY2tfcmF0ZSAqIHBhcmFtLmluZm8uZnJtX3B0aW1lIC8gMTAwMDsKKyAgICBpZiAocGpfc3RyY21wMih3YXZfZmlsZW5hbWUsICItIikgPT0gMCkgeworCXBqbWVkaWFfYXVkX3BhcmFtIGF1ZF9wYXJhbTsKKworCS8qIE9wZW4gYXVkaW8gZGV2aWNlICovCisJVCggcGptZWRpYV9hdWRfZGV2X2RlZmF1bHRfcGFyYW0oZGV2X2lkLCAmYXVkX3BhcmFtKSApOworCWF1ZF9wYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9QTEFZQkFDSzsKKwlhdWRfcGFyYW0uY2hhbm5lbF9jb3VudCA9IGNpLT5jaGFubmVsX2NudDsKKwlhdWRfcGFyYW0uY2xvY2tfcmF0ZSA9IGNpLT5jbG9ja19yYXRlOworCWF1ZF9wYXJhbS5zYW1wbGVzX3Blcl9mcmFtZSA9IHNhbXBsZXNfcGVyX2ZyYW1lOworCVQoIHBqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoJmF1ZF9wYXJhbSwgTlVMTCwgJnBsYXlfY2IsIAorCQkJCSAgICAgTlVMTCwgJmFwcC5hdWRfc3RybSkgKTsKKwlUKCBwam1lZGlhX2F1ZF9zdHJlYW1fc3RhcnQoYXBwLmF1ZF9zdHJtKSApOworICAgIH0gZWxzZSBpZiAocGpfc3RyaXN0cih3YXZfZmlsZW5hbWUsICZXQVYpKSB7CisJLyogT3BlbiBXQVYgZmlsZSAqLworCVQoIHBqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X2NyZWF0ZShhcHAucG9vbCwgd2F2X2ZpbGVuYW1lLT5wdHIsCisJCQkJCSAgY2ktPmNsb2NrX3JhdGUsIGNpLT5jaGFubmVsX2NudCwKKwkJCQkJICBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICBwYXJhbS5pbmZvLnBjbV9iaXRzX3Blcl9zYW1wbGUsIDAsIDAsCisJCQkJCSAgJmFwcC53YXYpICk7CisgICAgfSBlbHNlIHsKKwllcnJfZXhpdCgiaW52YWxpZCBvdXRwdXQgZmlsZSIsIFBKX0VJTlZBTCk7CisgICAgfQorCisgICAgLyogTG9vcCByZWFkaW5nIFBDQVAgYW5kIHdyaXRpbmcgV0FWIGZpbGUgKi8KKyAgICBmb3IgKDs7KSB7CisJc3RydWN0IHBrdCBwa3QxOworCXBqX3RpbWVzdGFtcCB0czsKKwlwam1lZGlhX2ZyYW1lIGZyYW1lc1sxNl0sIHBjbV9mcmFtZTsKKwlzaG9ydCBwY21bMzIwXTsKKwl1bnNpZ25lZCBpLCBmcmFtZV9jbnQ7CisJbG9uZyBzYW1wbGVzX2NudCwgdHNfZ2FwOworCisJcGpfYXNzZXJ0KHNpemVvZihwY20pID49IHNhbXBsZXNfcGVyX2ZyYW1lKTsKKworCS8qIFBhcnNlIGZpcnN0IHBhY2tldCAqLworCXRzLnU2NCA9IDA7CisJZnJhbWVfY250ID0gUEpfQVJSQVlfU0laRShmcmFtZXMpOworCVQoIHBqbWVkaWFfY29kZWNfcGFyc2UoYXBwLmNvZGVjLCBwa3QwLnBheWxvYWQsIHBrdDAucGF5bG9hZF9sZW4sIAorCQkJCSZ0cywgJmZyYW1lX2NudCwgZnJhbWVzKSApOworCisJLyogRGVjb2RlIGFuZCB3cml0ZSB0byBXQVYgZmlsZSAqLworCXNhbXBsZXNfY250ID0gMDsKKwlmb3IgKGk9MDsgaTxmcmFtZV9jbnQ7ICsraSkgeworCSAgICBwam1lZGlhX2ZyYW1lIHBjbV9mcmFtZTsKKworCSAgICBwY21fZnJhbWUuYnVmID0gcGNtOworCSAgICBwY21fZnJhbWUuc2l6ZSA9IHNhbXBsZXNfcGVyX2ZyYW1lICogMjsKKworCSAgICBUKCBwam1lZGlhX2NvZGVjX2RlY29kZShhcHAuY29kZWMsICZmcmFtZXNbaV0sIAorCQkJCSAgICAodW5zaWduZWQpcGNtX2ZyYW1lLnNpemUsICZwY21fZnJhbWUpICk7CisJICAgIGlmIChhcHAud2F2KSB7CisJCVQoIHBqbWVkaWFfcG9ydF9wdXRfZnJhbWUoYXBwLndhdiwgJnBjbV9mcmFtZSkgKTsKKwkgICAgfQorCSAgICBpZiAoYXBwLmF1ZF9zdHJtKSB7CisJCVQoIHdhaXRfcGxheSgmcGNtX2ZyYW1lKSApOworCSAgICB9CisJICAgIHNhbXBsZXNfY250ICs9IHNhbXBsZXNfcGVyX2ZyYW1lOworCX0KKworCS8qIFJlYWQgbmV4dCBwYWNrZXQgKi8KKwlyZWFkX3J0cChwa3QxLmJ1ZmZlciwgc2l6ZW9mKHBrdDEuYnVmZmVyKSwgJnBrdDEucnRwLAorCQkgJnBrdDEucGF5bG9hZCwgJnBrdDEucGF5bG9hZF9sZW4sIFBKX1RSVUUpOworCisJLyogRmlsbCBpbiB0aGUgZ2FwIChpZiBhbnkpIGJldHdlZW4gcGt0MCBhbmQgcGt0MSAqLworCXRzX2dhcCA9IHBqX250b2hsKHBrdDEucnRwLT50cykgLSBwal9udG9obChwa3QwLnJ0cC0+dHMpIC0KKwkJIHNhbXBsZXNfY250OworCXdoaWxlICh0c19nYXAgPj0gKGxvbmcpc2FtcGxlc19wZXJfZnJhbWUpIHsKKworCSAgICBwY21fZnJhbWUuYnVmID0gcGNtOworCSAgICBwY21fZnJhbWUuc2l6ZSA9IHNhbXBsZXNfcGVyX2ZyYW1lICogMjsKKworCSAgICBpZiAoYXBwLmNvZGVjLT5vcC0+cmVjb3ZlcikgeworCQlUKCBwam1lZGlhX2NvZGVjX3JlY292ZXIoYXBwLmNvZGVjLCAodW5zaWduZWQpcGNtX2ZyYW1lLnNpemUsIAorCQkJCQkgJnBjbV9mcmFtZSkgKTsKKwkgICAgfSBlbHNlIHsKKwkJcGpfYnplcm8ocGNtX2ZyYW1lLmJ1ZiwgcGNtX2ZyYW1lLnNpemUpOworCSAgICB9CisKKwkgICAgaWYgKGFwcC53YXYpIHsKKwkJVCggcGptZWRpYV9wb3J0X3B1dF9mcmFtZShhcHAud2F2LCAmcGNtX2ZyYW1lKSApOworCSAgICB9CisJICAgIGlmIChhcHAuYXVkX3N0cm0pIHsKKwkJVCggd2FpdF9wbGF5KCZwY21fZnJhbWUpICk7CisJICAgIH0KKwkgICAgdHNfZ2FwIC09IHNhbXBsZXNfcGVyX2ZyYW1lOworCX0KKwkKKwkvKiBOZXh0ICovCisJcGt0MCA9IHBrdDE7CisJcGt0MC5ydHAgPSAocGptZWRpYV9ydHBfaGRyKilwa3QwLmJ1ZmZlcjsKKwlwa3QwLnBheWxvYWQgPSBwa3QwLmJ1ZmZlciArIChwa3QxLnBheWxvYWQgLSBwa3QxLmJ1ZmZlcik7CisgICAgfQorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfc3RyX3QgaW5wdXQsIG91dHB1dCwgc3J0cF9jcnlwdG8sIHNydHBfa2V5LCBjb2RlYzsKKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5kZXggZGV2X2lkID0gUEpNRURJQV9BVURfREVGQVVMVF9QTEFZQkFDS19ERVY7CisgICAgcGpfcGNhcF9maWx0ZXIgZmlsdGVyOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGVudW0geyAKKwlPUFRfU1JDX0lQID0gMSwgT1BUX0RTVF9JUCwgT1BUX1NSQ19QT1JULCBPUFRfRFNUX1BPUlQsCisJT1BUX0NPREVDLCBPUFRfUExBWV9ERVZfSUQKKyAgICB9OworICAgIHN0cnVjdCBwal9nZXRvcHRfb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCXsgInNydHAtY3J5cHRvIiwgICAgMSwgMCwgJ2MnIH0sCisJeyAic3J0cC1rZXkiLAkgICAgMSwgMCwgJ2snIH0sCisJeyAic3JjLWlwIiwJICAgIDEsIDAsIE9QVF9TUkNfSVAgfSwKKwl7ICJkc3QtaXAiLAkgICAgMSwgMCwgT1BUX0RTVF9JUCB9LAorCXsgInNyYy1wb3J0IiwJICAgIDEsIDAsIE9QVF9TUkNfUE9SVCB9LAorCXsgImRzdC1wb3J0IiwJICAgIDEsIDAsIE9QVF9EU1RfUE9SVCB9LAorCXsgImNvZGVjIiwJICAgIDEsIDAsIE9QVF9DT0RFQyB9LAorCXsgInBsYXktZGV2LWlkIiwgICAgMSwgMCwgT1BUX1BMQVlfREVWX0lEIH0sCisJeyBOVUxMLCAwLCAwLCAwfQorICAgIH07CisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKyAgICBjaGFyIGtleV9iaW5bMzJdOworCisgICAgc3J0cF9jcnlwdG8uc2xlbiA9IHNydHBfa2V5LnNsZW4gPSAwOworICAgIGNvZGVjLnNsZW4gPSAwOworCisgICAgcGpfcGNhcF9maWx0ZXJfZGVmYXVsdCgmZmlsdGVyKTsKKyAgICBmaWx0ZXIubGluayA9IFBKX1BDQVBfTElOS19UWVBFX0VUSDsKKyAgICBmaWx0ZXIucHJvdG8gPSBQSl9QQ0FQX1BST1RPX1RZUEVfVURQOworCisgICAgLyogUGFyc2UgYXJndW1lbnRzICovCisgICAgcGpfb3B0aW5kID0gMDsKKyAgICB3aGlsZSgoYz1wal9nZXRvcHRfbG9uZyhhcmdjLGFyZ3YsICJjOms6IiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KSkhPS0xKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnYyc6CisJICAgIHNydHBfY3J5cHRvID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ2snOgorCSAgICB7CisJCWludCBrZXlfbGVuID0gc2l6ZW9mKGtleV9iaW4pOworCQlzcnRwX2tleSA9IHBqX3N0cihwal9vcHRhcmcpOworCQlpZiAocGpfYmFzZTY0X2RlY29kZSgmc3J0cF9rZXksIChwal91aW50OF90KilrZXlfYmluLCAma2V5X2xlbikpIHsKKwkJICAgIHB1dHMoIkVycm9yOiBpbnZhbGlkIGtleSIpOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkJc3J0cF9rZXkucHRyID0ga2V5X2JpbjsKKwkJc3J0cF9rZXkuc2xlbiA9IGtleV9sZW47CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfU1JDX0lQOgorCSAgICB7CisJCXBqX3N0cl90IHQgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkJcGpfaW5fYWRkciBhID0gcGpfaW5ldF9hZGRyKCZ0KTsKKwkJZmlsdGVyLmlwX3NyYyA9IGEuc19hZGRyOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0RTVF9JUDoKKwkgICAgeworCQlwal9zdHJfdCB0ID0gcGpfc3RyKHBqX29wdGFyZyk7CisJCXBqX2luX2FkZHIgYSA9IHBqX2luZXRfYWRkcigmdCk7CisJCWZpbHRlci5pcF9kc3QgPSBhLnNfYWRkcjsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIE9QVF9TUkNfUE9SVDoKKwkgICAgZmlsdGVyLnNyY19wb3J0ID0gcGpfaHRvbnMoKHBqX3VpbnQxNl90KWF0b2kocGpfb3B0YXJnKSk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0RTVF9QT1JUOgorCSAgICBmaWx0ZXIuZHN0X3BvcnQgPSBwal9odG9ucygocGpfdWludDE2X3QpYXRvaShwal9vcHRhcmcpKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfQ09ERUM6CisJICAgIGNvZGVjID0gcGpfc3RyKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX1BMQVlfREVWX0lEOgorCSAgICBkZXZfaWQgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHB1dHMoIkVycm9yOiBpbnZhbGlkIG9wdGlvbiIpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgaWYgKHBqX29wdGluZCAhPSBhcmdjIC0gMikgeworCXB1dHMoVVNBR0UpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmICghKHNydHBfY3J5cHRvLnNsZW4pICE9ICEoc3J0cF9rZXkuc2xlbikpIHsKKwlwdXRzKCJFcnJvcjogYm90aCBTUlRQIGNyeXB0byBhbmQga2V5IG11c3QgYmUgc3BlY2lmaWVkIik7CisJcHV0cyhVU0FHRSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaW5wdXQgPSBwal9zdHIoYXJndltwal9vcHRpbmRdKTsKKyAgICBvdXRwdXQgPSBwal9zdHIoYXJndltwal9vcHRpbmQrMV0pOworICAgIAorICAgIFQoIHBqX2luaXQoKSApOworCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmFwcC5jcCwgTlVMTCwgMCk7CisgICAgYXBwLnBvb2wgPSBwal9wb29sX2NyZWF0ZSgmYXBwLmNwLmZhY3RvcnksICJwY2FwdXRpbCIsIDEwMDAsIDEwMDAsIE5VTEwpOworCisgICAgVCggcGpsaWJfdXRpbF9pbml0KCkgKTsKKyAgICBUKCBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmYXBwLmNwLmZhY3RvcnksIE5VTEwsIDAsICZhcHAubWVwdCkgKTsKKworICAgIFQoIHBqX3BjYXBfb3BlbihhcHAucG9vbCwgaW5wdXQucHRyLCAmYXBwLnBjYXApICk7CisgICAgVCggcGpfcGNhcF9zZXRfZmlsdGVyKGFwcC5wY2FwLCAmZmlsdGVyKSApOworCisgICAgcGNhcDJ3YXYoJmNvZGVjLCAmb3V0cHV0LCBkZXZfaWQsICZzcnRwX2NyeXB0bywgJnNydHBfa2V5KTsKKworICAgIGNsZWFudXAoKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wanNpcC1wZXJmLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3Bqc2lwLXBlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTAyM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wanNpcC1wZXJmLmMKQEAgLTAsMCArMSwxODU1IEBACisvKiAkSWQ6IHBqc2lwLXBlcmYuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpzaXBfcGVyZl9jIFNhbXBsZXM6IFNJUCBQZXJmb3JtYW5jZSBCZW5jaG1hcmsKKyAqCisgKiA8Yj5wanNpcC1wZXJmPC9iPiBpcyBhIGNvbXBsZXRlIHByb2dyYW0gdG8gbWVhc3VyZSB0aGUKKyAqIHBlcmZvcm1hbmNlIG9mIFBKU0lQIG9yIG90aGVyIFNJUCBlbmRwb2ludHMuIEl0IGNvbnNpc3RzIG9mIHR3bworICogcGFydHM6CisgKiAgLSB0aGUgc2VydmVyLCB0byByZXNwb25kIGluY29taW5nIHJlcXVlc3RzLCBhbmQKKyAqICAtIHRoZSBjbGllbnQsIHdobyBhY3RpdmVseSBzdWJtaXRzIHJlcXVlc3RzIGFuZCBtZWFzdXJlIHRoZQorICogICAgIHBlcmZvcm1hbmNlIG9mIHRoZSBzZXJ2ZXIuCisgKgorICogQm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBwYXJ0IGNhbiBydW4gc2ltdWx0YW5lb3VzbHksIHRvIG1lYXN1cmUgdGhlCisgKiBwZXJmb3JtYW5jZSB3aGVuIGJvdGggZW5kcG9pbnRzIGFyZSBjby1sb2NhdGVkIGluIGEgc2luZ2xlIHByb2dyYW0uCisgKiAKKyAqIFRoZSBzZXJ2ZXIgYWNjZXB0cyBib3RoIElOVklURSBhbmQgbm9uLUlOVklURSByZXF1ZXN0cy4KKyAqIFRoZSBzZXJ2ZXIgZXhwb3J0cyBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyBvZiBVUkwsIHdoaWNoIHdvdWxkCisgKiBjb250cm9sIGhvdyB0aGUgcmVxdWVzdCB3b3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZXI6CisgKiAgLSBVUkwgd2l0aCAiMCIgYXMgdGhlIHVzZXIgcGFydCB3aWxsIGJlIGhhbmRsZWQgc3RhdGVsZXNzbHkuCisgKiAgICBJdCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBJTlZJVEUgbWV0aG9kLgorICogIC0gVVJMIHdpdGggIjEiIGFzIHRoZSB1c2VyIHBhcnQgd2lsbCBiZSBoYW5kbGVkIHN0YXRlZnVsbHkuCisgKiAgICBJZiB0aGUgcmVxdWVzdCBpcyBhbiBJTlZJVEUgcmVxdWVzdCwgSU5WSVRFIHRyYW5zYWN0aW9uIHdpbGwKKyAqICAgIGJlIGNyZWF0ZWQgYW5kIDIwMC9PSyByZXNwb25zZSB3aWxsIGJlIHNlbnQsIGFsb25nIHdpdGggYSB2YWxpZAorICogICAgU0RQIGJvZHkuIEhvd2V2ZXIsIHRoZSBTRFAgaXMganVzdCBhIHN0YXRpYyB0ZXh0IGJvZHksIGFuZAorICogICAgaXMgbm90IGEgcHJvcGVyIFNEUCBnZW5lcmF0ZWQgYnkgUEpNRURJQS4KKyAqICAtIFVSTCB3aXRoICIyIiBhcyB0aGUgdXNlciBwYXJ0IGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgSU5WSVRFCisgKiAgICByZXF1ZXN0cywgYXMgaXQgd291bGQgYmUgaGFuZGxlZCA8Yj5jYWxsLXN0YXRlZnVsbHk8L2I+IGJ5IHRoZQorICogICAgc2VydmVyLiBGb3IgdGhpcyBVUkwsIHRoZSBzZXJ2ZXIgYWxzbyB3b3VsZCBnZW5lcmF0ZSBTRFAgZHluYW1pY2FsbHkKKyAqICAgIGFuZCBwZXJmb3JtIGEgcHJvcGVyIFNEUCBuZWdvdGlhdGlvbiBmb3IgdGhlIGluY29taW5nIGNhbGwuCisgKiAgICBBbHNvIGZvciBldmVyeSBjYWxsLCBzZXJ2ZXIgd2lsbCBsaW1pdCB0aGUgY2FsbCBkdXJhdGlvbiB0bworICogICAgMTAgc2Vjb25kcywgb24gd2hpY2ggdGhlIGNhbGwgd2lsbCBiZSB0ZXJtaW5hdGVkIGlmIHRoZSBjbGllbnQKKyAqICAgIGRvZXNuJ3QgaGFuZ3VwIHRoZSBjYWxsLgorICogICAgCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwanNpcC1hcHBzL3NyYy9zYW1wbGVzL3Bqc2lwLXBlcmYuYworICoKKyAqIFxpbmNsdWRlbGluZW5vIHBqc2lwLXBlcmYuYworICovCisKKy8qIEluY2x1ZGUgYWxsIGhlYWRlcnMuICovCisjaW5jbHVkZSA8cGpzaXAuaD4KKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy5oPgorI2luY2x1ZGUgPHBqc2lwX3VhLmg+CisjaW5jbHVkZSA8cGpzaXBfc2ltcGxlLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiE9MCkgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0IT0wKQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVEhJU19GSUxFCSAgICAicGpzaXAtcGVyZi5jIgorI2RlZmluZSBERUZBVUxUX0NPVU5UCSAgICAocGpzaXBfY2ZnKCktPnRzeC5tYXhfY291bnQvMj4xMDAwMD8xMDAwMDpwanNpcF9jZmcoKS0+dHN4Lm1heF9jb3VudC8yKQorI2RlZmluZSBKT0JfV0lORE9XCSAgICAxMDAwCisjZGVmaW5lIFRFUk1JTkFURV9UU1goeCxjKQorCisKKyNpZm5kZWYgQ0FDSElOR19QT09MX1NJWkUKKyMgICBkZWZpbmUgQ0FDSElOR19QT09MX1NJWkUgICAoMjU2KjEwMjQqMTAyNCkKKyNlbmRpZgorCisKKy8qIFN0YXRpYyBtZXNzYWdlIGJvZHkgZm9yIElOVklURSwgd2hlbiBzdGF0ZWZ1bCBwcm9jZXNzaW5nIGlzCisgKiBpbnZva2VkIChpbnN0ZWFkIG9mIGNhbGwtc3RhdGVmdWwsIHdoZXJlIFNEUCBpcyBnZW5lcmF0ZWQKKyAqIGR5bmFtaWNhbGx5LgorICovCitzdGF0aWMgcGpfc3RyX3QgZHVtbXlfc2RwX3N0ciA9IAoreworICAgICJ2PTBcclxuIgorICAgICJvPS0gMzM2MDg0MjA3MSAzMzYwODQyMDcxIElOIElQNCAxOTIuMTY4LjAuNjhcclxuIgorICAgICJzPXBqbWVkaWFcclxuIgorICAgICJjPUlOIElQNCAxOTIuMTY4LjAuNjhcclxuIgorICAgICJ0PTAgMFxyXG4iCisgICAgIm09YXVkaW8gNDAwMCBSVFAvQVZQIDAgOCAzIDEwMyAxMDIgMTAxXHJcbiIKKyAgICAiYT1ydGNwOjQwMDEgSU4gSVA0IDE5Mi4xNjguMC42OFxyXG4iCisgICAgImE9cnRwbWFwOjEwMyBzcGVleC8xNjAwMFxyXG4iCisgICAgImE9cnRwbWFwOjEwMiBzcGVleC84MDAwXHJcbiIKKyAgICAiYT1ydHBtYXA6MyBHU00vODAwMFxyXG4iCisgICAgImE9cnRwbWFwOjAgUENNVS84MDAwXHJcbiIKKyAgICAiYT1ydHBtYXA6OCBQQ01BLzgwMDBcclxuIgorICAgICJhPXNlbmRyZWN2XHJcbiIKKyAgICAiYT1ydHBtYXA6MTAxIHRlbGVwaG9uZS1ldmVudC84MDAwXHJcbiIKKyAgICAiYT1mbXRwOjEwMSAwLTE1XHJcbiIsCisgICAgMAorfTsKKworc3RhdGljIHBqX3N0cl90IG1pbWVfYXBwbGljYXRpb24gPSB7ICJhcHBsaWNhdGlvbiIsIDExfTsKK3N0YXRpYyBwal9zdHJfdCBtaW1lX3NkcCA9IHsic2RwIiwgM307CisKKworc3RydWN0IHNydl9zdGF0ZQoreworICAgIHVuc2lnbmVkCSAgICBzdGF0ZWxlc3NfY250OworICAgIHVuc2lnbmVkCSAgICBzdGF0ZWZ1bF9jbnQ7CisgICAgdW5zaWduZWQJICAgIGNhbGxfY250OworfTsKKworCitzdHJ1Y3QgYXBwCit7CisgICAgcGpfY2FjaGluZ19wb29sCSBjcDsKKyAgICBwal9wb29sX3QJCSpwb29sOworICAgIHBqX2Jvb2xfdAkJIHVzZV90Y3A7CisgICAgcGpfc3RyX3QJCSBsb2NhbF9hZGRyOworICAgIGludAkJCSBsb2NhbF9wb3J0OworICAgIHBqc2lwX2VuZHBvaW50CSpzaXBfZW5kcHQ7CisgICAgcGptZWRpYV9lbmRwdAkqbWVkX2VuZHB0OworICAgIHBqX3N0cl90CQkgbG9jYWxfdXJpOworICAgIHBqX3N0cl90CQkgbG9jYWxfY29udGFjdDsKKyAgICB1bnNpZ25lZAkJIHNraW5mb19jbnQ7CisgICAgcGptZWRpYV9zb2NrX2luZm8JIHNraW5mb1s4XTsKKworICAgIHBqX2Jvb2xfdAkJIHRocmVhZF9xdWl0OworICAgIHVuc2lnbmVkCQkgdGhyZWFkX2NvdW50OworICAgIHBqX3RocmVhZF90CQkqdGhyZWFkWzE2XTsKKworICAgIHBqX2Jvb2xfdAkJIHJlYWxfc2RwOworICAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKmR1bW15X3NkcDsKKworICAgIGludAkJCSBsb2dfbGV2ZWw7CisKKyAgICBzdHJ1Y3QgeworCXBqc2lwX21ldGhvZAkgICAgIG1ldGhvZDsKKwlwal9zdHJfdAkgICAgIGRzdF91cmk7CisJcGpfYm9vbF90CSAgICAgc3RhdGVsZXNzOworCXVuc2lnbmVkCSAgICAgdGltZW91dDsKKwl1bnNpZ25lZAkgICAgIGpvYl9jb3VudCwKKwkJCSAgICAgam9iX3N1Ym1pdHRlZCwgCisJCQkgICAgIGpvYl9maW5pc2hlZCwKKwkJCSAgICAgam9iX3dpbmRvdzsKKwl1bnNpZ25lZAkgICAgIHN0YXRfbWF4X3dpbmRvdzsKKwlwal90aW1lX3ZhbAkgICAgIGZpcnN0X3JlcXVlc3Q7CisJcGpfdGltZV92YWwJICAgICByZXF1ZXN0c19zZW50OworCXBqX3RpbWVfdmFsCSAgICAgbGFzdF9jb21wbGV0aW9uOworCXVuc2lnbmVkCSAgICAgdG90YWxfcmVzcG9uc2VzOworCXVuc2lnbmVkCSAgICAgcmVzcG9uc2VfY29kZXNbODAwXTsKKyAgICB9IGNsaWVudDsKKworICAgIHN0cnVjdCB7CisJcGpfYm9vbF90IHNlbmRfdHJ5aW5nOworCXBqX2Jvb2xfdCBzZW5kX3Jpbmdpbmc7CisJdW5zaWduZWQgZGVsYXk7CisJc3RydWN0IHNydl9zdGF0ZSBwcmV2X3N0YXRlOworCXN0cnVjdCBzcnZfc3RhdGUgY3VyX3N0YXRlOworICAgIH0gc2VydmVyOworCisKK30gYXBwOworCitzdHJ1Y3QgY2FsbAoreworICAgIHBqc2lwX2ludl9zZXNzaW9uCSppbnY7CisgICAgcGpfdGltZXJfZW50cnkJIGFuc190aW1lcjsKK307CisKKworc3RhdGljIHZvaWQgYXBwX3BlcnJvcihjb25zdCBjaGFyICpzZW5kZXIsIGNvbnN0IGNoYXIgKnRpdGxlLCAKKwkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBQSl9MT0coMSwoc2VuZGVyLCAiJXM6ICVzIFtjb2RlPSVkXSIsIHRpdGxlLCBlcnJtc2csIHN0YXR1cykpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RBVEVMRVNTIFNFUlZFUgorICovCitzdGF0aWMgcGpfYm9vbF90IG1vZF9zdGF0ZWxlc3Nfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSk7CisKKy8qIE1vZHVsZSB0byBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMgc3RhdGVsZXNzbHkuCisgKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX3N0YXRlbGVzc19zZXJ2ZXIgPQoreworICAgIE5VTEwsIE5VTEwsCQkJICAgIC8qIHByZXYsIG5leHQuCQkqLworICAgIHsgIm1vZC1zdGF0ZWxlc3Mtc2VydmVyIiwgMjAgfSwgLyogTmFtZS4JCQkqLworICAgIC0xLAkJCQkgICAgLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTiwgLyogUHJpb3JpdHkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIGxvYWQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RhcnQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RvcCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiB1bmxvYWQoKQkJCSovCisgICAgJm1vZF9zdGF0ZWxlc3Nfb25fcnhfcmVxdWVzdCwgICAvKiBvbl9yeF9yZXF1ZXN0KCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fcnhfcmVzcG9uc2UoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXF1ZXN0LgkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3RzeF9zdGF0ZSgpCQkqLworfTsKKworCitzdGF0aWMgcGpfYm9vbF90IG1vZF9zdGF0ZWxlc3Nfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBzdGF0ZWxlc3NfdXNlciA9IHsgIjAiLCAxIH07CisgICAgcGpzaXBfdXJpICp1cmk7CisgICAgcGpzaXBfc2lwX3VyaSAqc2lwX3VyaTsKKworICAgIHVyaSA9IHBqc2lwX3VyaV9nZXRfdXJpKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLnVyaSk7CisKKyAgICAvKiBPbmx5IHdhbnQgdG8gcmVjZWl2ZSBTSVAvU0lQUyBzY2hlbWUgKi8KKyAgICBpZiAoIVBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQKHVyaSkgJiYgIVBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQUyh1cmkpKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIHNpcF91cmkgPSAocGpzaXBfc2lwX3VyaSopIHVyaTsKKworICAgIC8qIENoZWNrIGZvciBtYXRjaGluZyB1c2VyIHBhcnQgKi8KKyAgICBpZiAocGpfc3RyY21wKCZzaXBfdXJpLT51c2VyLCAmc3RhdGVsZXNzX3VzZXIpIT0wKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIC8qCisgICAgICogWWVzLCB0aGlzIGlzIGZvciB1cy4KKyAgICAgKi8KKworICAgIC8qIElnbm9yZSBBQ0sgcmVxdWVzdCAqLworICAgIGlmIChyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QuaWQgPT0gUEpTSVBfQUNLX01FVEhPRCkKKwlyZXR1cm4gUEpfVFJVRTsKKworICAgIC8qCisgICAgICogUmVzcG9uZCBzdGF0ZWxlc3NseSB3aXRoIDIwMC9PSy4KKyAgICAgKi8KKyAgICBwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyhhcHAuc2lwX2VuZHB0LCByZGF0YSwgMjAwLCBOVUxMLAorCQkJCSAgTlVMTCwgTlVMTCk7CisgICAgYXBwLnNlcnZlci5jdXJfc3RhdGUuc3RhdGVsZXNzX2NudCsrOworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RBVEVGVUwgU0VSVkVSCisgKi8KK3N0YXRpYyBwal9ib29sX3QgbW9kX3N0YXRlZnVsX29uX3J4X3JlcXVlc3QocGpzaXBfcnhfZGF0YSAqcmRhdGEpOworCisvKiBNb2R1bGUgdG8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIHN0YXRlZnVsbHkuCisgKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX3N0YXRlZnVsX3NlcnZlciA9Cit7CisgICAgTlVMTCwgTlVMTCwJCQkgICAgLyogcHJldiwgbmV4dC4JCSovCisgICAgeyAibW9kLXN0YXRlZnVsLXNlcnZlciIsIDE5IH0sICAvKiBOYW1lLgkJCSovCisgICAgLTEsCQkJCSAgICAvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX0FQUExJQ0FUSU9OLCAvKiBQcmlvcml0eQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogbG9hZCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdGFydCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdG9wKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHVubG9hZCgpCQkJKi8KKyAgICAmbW9kX3N0YXRlZnVsX29uX3J4X3JlcXVlc3QsICAgLyogb25fcnhfcmVxdWVzdCgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3J4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVxdWVzdC4JCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVzcG9uc2UoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90c3hfc3RhdGUoKQkJKi8KK307CisKKworc3RhdGljIHBqX2Jvb2xfdCBtb2Rfc3RhdGVmdWxfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBzdGF0ZWZ1bF91c2VyID0geyAiMSIsIDEgfTsKKyAgICBwanNpcF91cmkgKnVyaTsKKyAgICBwanNpcF9zaXBfdXJpICpzaXBfdXJpOworCisgICAgdXJpID0gcGpzaXBfdXJpX2dldF91cmkocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEudXJpKTsKKworICAgIC8qIE9ubHkgd2FudCB0byByZWNlaXZlIFNJUC9TSVBTIHNjaGVtZSAqLworICAgIGlmICghUEpTSVBfVVJJX1NDSEVNRV9JU19TSVAodXJpKSAmJiAhUEpTSVBfVVJJX1NDSEVNRV9JU19TSVBTKHVyaSkpCisJcmV0dXJuIFBKX0ZBTFNFOworCisgICAgc2lwX3VyaSA9IChwanNpcF9zaXBfdXJpKikgdXJpOworCisgICAgLyogQ2hlY2sgZm9yIG1hdGNoaW5nIHVzZXIgcGFydCAqLworICAgIGlmIChwal9zdHJjbXAoJnNpcF91cmktPnVzZXIsICZzdGF0ZWZ1bF91c2VyKSE9MCkKKwlyZXR1cm4gUEpfRkFMU0U7CisKKyAgICAvKgorICAgICAqIFllcywgdGhpcyBpcyBmb3IgdXMuCisgICAgICogUmVzcG9uZCBzdGF0ZWZ1bGx5IHdpdGggMjAwL09LLgorICAgICAqLworICAgIHN3aXRjaCAocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLmlkKSB7CisgICAgY2FzZSBQSlNJUF9JTlZJVEVfTUVUSE9EOgorCXsKKwkgICAgcGpzaXBfbXNnX2JvZHkgKmJvZHk7CisKKwkgICAgaWYgKGR1bW15X3NkcF9zdHIuc2xlbiA9PSAwKQorCQlkdW1teV9zZHBfc3RyLnNsZW4gPSBwal9hbnNpX3N0cmxlbihkdW1teV9zZHBfc3RyLnB0cik7CisKKwkgICAgYm9keSA9IHBqc2lwX21zZ19ib2R5X2NyZWF0ZShyZGF0YS0+dHBfaW5mby5wb29sLCAKKwkJCQkJICZtaW1lX2FwcGxpY2F0aW9uLCAmbWltZV9zZHAsIAorCQkJCQkgJmR1bW15X3NkcF9zdHIpOworCSAgICBwanNpcF9lbmRwdF9yZXNwb25kKGFwcC5zaXBfZW5kcHQsICZtb2Rfc3RhdGVmdWxfc2VydmVyLCByZGF0YSwKKwkJCQkyMDAsIE5VTEwsIE5VTEwsIGJvZHksIE5VTEwpOworCX0KKwlicmVhazsKKyAgICBjYXNlIFBKU0lQX0FDS19NRVRIT0Q6CisJcmV0dXJuIFBKX1RSVUU7CisgICAgZGVmYXVsdDoKKwlwanNpcF9lbmRwdF9yZXNwb25kKGFwcC5zaXBfZW5kcHQsICZtb2Rfc3RhdGVmdWxfc2VydmVyLCByZGF0YSwKKwkJCSAgICAyMDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCWJyZWFrOworICAgIH0KKworICAgIGFwcC5zZXJ2ZXIuY3VyX3N0YXRlLnN0YXRlZnVsX2NudCsrOworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0FMTCBTRVJWRVIKKyAqLworc3RhdGljIHBqX2Jvb2xfdCBtb2RfY2FsbF9vbl9yeF9yZXF1ZXN0KHBqc2lwX3J4X2RhdGEgKnJkYXRhKTsKKworLyogTW9kdWxlIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBjYWxsbHkuCisgKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX2NhbGxfc2VydmVyID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2QtY2FsbC1zZXJ2ZXIiLCAxNSB9LAkgICAgLyogTmFtZS4JCQkqLworICAgIC0xLAkJCQkgICAgLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTiwgLyogUHJpb3JpdHkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIGxvYWQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RhcnQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RvcCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiB1bmxvYWQoKQkJCSovCisgICAgJm1vZF9jYWxsX29uX3J4X3JlcXVlc3QsCSAgICAvKiBvbl9yeF9yZXF1ZXN0KCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fcnhfcmVzcG9uc2UoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXF1ZXN0LgkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3RzeF9zdGF0ZSgpCQkqLworfTsKKworCitzdGF0aWMgcGpfc3RhdHVzX3Qgc2VuZF9yZXNwb25zZShwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCAKKwkJCQkgcGpzaXBfcnhfZGF0YSAqcmRhdGEsCisJCQkJIGludCBjb2RlLAorCQkJCSBwal9ib29sX3QgKmhhc19pbml0aWFsKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmICgqaGFzX2luaXRpYWwpIHsKKwlzdGF0dXMgPSBwanNpcF9pbnZfYW5zd2VyKGludiwgY29kZSwgTlVMTCwgTlVMTCwgJnRkYXRhKTsKKyAgICB9IGVsc2UgeworCXN0YXR1cyA9IHBqc2lwX2ludl9pbml0aWFsX2Fuc3dlcihpbnYsIHJkYXRhLCBjb2RlLCAKKwkJCQkJICBOVUxMLCBOVUxMLCAmdGRhdGEpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWlmICgqaGFzX2luaXRpYWwpIHsKKwkgICAgc3RhdHVzID0gcGpzaXBfaW52X2Fuc3dlcihpbnYsIFBKU0lQX1NDX05PVF9BQ0NFUFRBQkxFLCAKKwkJCQkgICAgICBOVUxMLCBOVUxMLCAmdGRhdGEpOworCX0gZWxzZSB7CisJICAgIHN0YXR1cyA9IHBqc2lwX2ludl9pbml0aWFsX2Fuc3dlcihpbnYsIHJkYXRhLCAKKwkJCQkJICAgICAgUEpTSVBfU0NfTk9UX0FDQ0VQVEFCTEUsCisJCQkJCSAgICAgIE5VTEwsIE5VTEwsICZ0ZGF0YSk7CisJfQorCisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJICAgICpoYXNfaW5pdGlhbCA9IFBKX1RSVUU7CisJICAgIHBqc2lwX2ludl9zZW5kX21zZyhpbnYsIHRkYXRhKTsgCisJfSBlbHNlIHsKKwkgICAgcGpzaXBfaW52X3Rlcm1pbmF0ZShpbnYsIDUwMCwgUEpfRkFMU0UpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0gZWxzZSB7CisJKmhhc19pbml0aWFsID0gUEpfVFJVRTsKKworCXN0YXR1cyA9IHBqc2lwX2ludl9zZW5kX21zZyhpbnYsIHRkYXRhKTsgCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqc2lwX3R4X2RhdGFfZGVjX3JlZih0ZGF0YSk7CisJICAgIHJldHVybiBzdGF0dXM7CisJfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGFuc3dlcl90aW1lcl9jYihwal90aW1lcl9oZWFwX3QgKmgsIHBqX3RpbWVyX2VudHJ5ICplbnRyeSkKK3sKKyAgICBzdHJ1Y3QgY2FsbCAqY2FsbCA9IGVudHJ5LT51c2VyX2RhdGE7CisgICAgcGpfYm9vbF90IGhhc19pbml0aWFsID0gUEpfVFJVRTsKKworICAgIFBKX1VOVVNFRF9BUkcoaCk7CisKKyAgICBlbnRyeS0+aWQgPSAwOworICAgIHNlbmRfcmVzcG9uc2UoY2FsbC0+aW52LCBOVUxMLCAyMDAsICZoYXNfaW5pdGlhbCk7Cit9CisKK3N0YXRpYyBwal9ib29sX3QgbW9kX2NhbGxfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBjYWxsX3VzZXIgPSB7ICIyIiwgMSB9OworICAgIHBqc2lwX3VyaSAqdXJpOworICAgIHBqc2lwX3NpcF91cmkgKnNpcF91cmk7CisgICAgc3RydWN0IGNhbGwgKmNhbGw7CisgICAgcGpzaXBfZGlhbG9nICpkbGc7CisgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2RwOworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqX2Jvb2xfdCBoYXNfaW5pdGlhbCA9IFBKX0ZBTFNFOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHVyaSA9IHBqc2lwX3VyaV9nZXRfdXJpKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLnVyaSk7CisKKyAgICAvKiBPbmx5IHdhbnQgdG8gcmVjZWl2ZSBTSVAvU0lQUyBzY2hlbWUgKi8KKyAgICBpZiAoIVBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQKHVyaSkgJiYgIVBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQUyh1cmkpKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIHNpcF91cmkgPSAocGpzaXBfc2lwX3VyaSopIHVyaTsKKworICAgIC8qIE9ubHkgd2FudCB0byBoYW5kbGUgSU5WSVRFIHJlcXVlc3RzLiAqLworICAgIGlmIChyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QuaWQgIT0gUEpTSVBfSU5WSVRFX01FVEhPRCkgeworCXJldHVybiBQSl9GQUxTRTsKKyAgICB9CisKKworICAgIC8qIENoZWNrIGZvciBtYXRjaGluZyB1c2VyIHBhcnQuIEluY29taW5nIHJlcXVlc3RzIHdpbGwgYmUgaGFuZGxlZCAKKyAgICAgKiBjYWxsLXN0YXRlZnVsbHkgaWY6CisgICAgICoJLSB1c2VyIHBhcnQgaXMgIjIiLCBvcgorICAgICAqICAtIHVzZXIgcGFydCBpcyBub3QgIjAiIG5vciAiMSIgYW5kIG1ldGhvZCBpcyBJTlZJVEUuCisgICAgICovCisgICAgaWYgKHBqX3N0cmNtcCgmc2lwX3VyaS0+dXNlciwgJmNhbGxfdXNlcikgPT0gMCB8fAorCXNpcF91cmktPnVzZXIuc2xlbiAhPSAxIHx8CisJKCpzaXBfdXJpLT51c2VyLnB0ciAhPSAnMCcgJiYgKnNpcF91cmktPnVzZXIucHRyICE9ICcxJykpCisgICAgeworCS8qIE1hdGNoICovCisKKyAgICB9IGVsc2UgeworCXJldHVybiBQSl9GQUxTRTsKKyAgICB9CisKKworICAgIC8qIFZlcmlmeSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuICovCisgICAgaWYgKGFwcC5yZWFsX3NkcCkgeworCXVuc2lnbmVkIG9wdGlvbnMgPSAwOworCXN0YXR1cyA9IHBqc2lwX2ludl92ZXJpZnlfcmVxdWVzdChyZGF0YSwgJm9wdGlvbnMsIE5VTEwsIE5VTEwsCisJCQkJCSAgYXBwLnNpcF9lbmRwdCwgJnRkYXRhKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKworCSAgICAvKgorCSAgICAgKiBObyB3ZSBjYW4ndCBoYW5kbGUgdGhlIGluY29taW5nIElOVklURSByZXF1ZXN0LgorCSAgICAgKi8KKworCSAgICBpZiAodGRhdGEpIHsKKwkJcGpzaXBfcmVzcG9uc2VfYWRkciByZXNfYWRkcjsKKworCQlwanNpcF9nZXRfcmVzcG9uc2VfYWRkcih0ZGF0YS0+cG9vbCwgcmRhdGEsICZyZXNfYWRkcik7CisJCXBqc2lwX2VuZHB0X3NlbmRfcmVzcG9uc2UoYXBwLnNpcF9lbmRwdCwgJnJlc19hZGRyLCB0ZGF0YSwgCisJCQkJCSAgTlVMTCwgTlVMTCk7CisKKwkgICAgfSBlbHNlIHsKKworCQkvKiBSZXNwb25kIHdpdGggNTAwIChJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IpICovCisJCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKGFwcC5zaXBfZW5kcHQsIHJkYXRhLCA1MDAsIE5VTEwsCisJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCSAgICB9CisKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfSAKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgVUFTIGRpYWxvZyAqLworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfdWFzKCBwanNpcF91YV9pbnN0YW5jZSgpLCByZGF0YSwKKwkJCQkgICAmYXBwLmxvY2FsX2NvbnRhY3QsICZkbGcpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWNvbnN0IHBqX3N0cl90IHJlYXNvbiA9IHBqX3N0cigiVW5hYmxlIHRvIGNyZWF0ZSBkaWFsb2ciKTsKKwlwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyggYXBwLnNpcF9lbmRwdCwgcmRhdGEsIAorCQkJCSAgICAgICA1MDAsICZyZWFzb24sCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKworICAgIC8qIEFsbG9jIGNhbGwgc3RydWN0dXJlLiAqLworICAgIGNhbGwgPSBwal9wb29sX3phbGxvYyhkbGctPnBvb2wsIHNpemVvZihzdHJ1Y3QgY2FsbCkpOworCisgICAgLyogQ3JlYXRlIFNEUCBmcm9tIFBKTUVESUEgKi8KKyAgICBpZiAoYXBwLnJlYWxfc2RwKSB7CisJc3RhdHVzID0gcGptZWRpYV9lbmRwdF9jcmVhdGVfc2RwKGFwcC5tZWRfZW5kcHQsIHJkYXRhLT50cF9pbmZvLnBvb2wsIAorCQkJCQkgIGFwcC5za2luZm9fY250LCBhcHAuc2tpbmZvLCAKKwkJCQkJICAmc2RwKTsKKyAgICB9IGVsc2UgeworCXNkcCA9IGFwcC5kdW1teV9zZHA7CisgICAgfQorCisgICAgLyogQ3JlYXRlIFVBUyBpbnZpdGUgc2Vzc2lvbiAqLworICAgIHN0YXR1cyA9IHBqc2lwX2ludl9jcmVhdGVfdWFzKCBkbGcsIHJkYXRhLCBzZHAsIDAsICZjYWxsLT5pbnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc2lwX2RsZ19jcmVhdGVfcmVzcG9uc2UoZGxnLCByZGF0YSwgNTAwLCBOVUxMLCAmdGRhdGEpOworCXBqc2lwX2RsZ19zZW5kX3Jlc3BvbnNlKGRsZywgcGpzaXBfcmRhdGFfZ2V0X3RzeChyZGF0YSksIHRkYXRhKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisgICAgCisgICAgLyogU2VuZCAxMDAvVHJ5aW5nIGlmIG5lZWRlZCAqLworICAgIGlmIChhcHAuc2VydmVyLnNlbmRfdHJ5aW5nKSB7CisJc3RhdHVzID0gc2VuZF9yZXNwb25zZShjYWxsLT5pbnYsIHJkYXRhLCAxMDAsICZoYXNfaW5pdGlhbCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKiBTZW5kIDE4MC9SaW5naW5nIGlmIG5lZWRlZCAqLworICAgIGlmIChhcHAuc2VydmVyLnNlbmRfcmluZ2luZykgeworCXN0YXR1cyA9IHNlbmRfcmVzcG9uc2UoY2FsbC0+aW52LCByZGF0YSwgMTgwLCAmaGFzX2luaXRpYWwpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogU2ltdWxhdGUgY2FsbCBwcm9jZXNzaW5nIGRlbGF5ICovCisgICAgaWYgKGFwcC5zZXJ2ZXIuZGVsYXkpIHsKKwlwal90aW1lX3ZhbCBkZWxheTsKKworCWNhbGwtPmFuc190aW1lci5pZCA9IDE7CisJY2FsbC0+YW5zX3RpbWVyLnVzZXJfZGF0YSA9IGNhbGw7CisJY2FsbC0+YW5zX3RpbWVyLmNiID0gJmFuc3dlcl90aW1lcl9jYjsKKwkKKwlkZWxheS5zZWMgPSAwOworCWRlbGF5Lm1zZWMgPSBhcHAuc2VydmVyLmRlbGF5OworCXBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmZGVsYXkpOworCisJcGpzaXBfZW5kcHRfc2NoZWR1bGVfdGltZXIoYXBwLnNpcF9lbmRwdCwgJmNhbGwtPmFuc190aW1lciwgJmRlbGF5KTsKKworICAgIH0gZWxzZSB7CisJLyogU2VuZCB0aGUgMjAwIHJlc3BvbnNlIGltbWVkaWF0ZWx5IC4gKi8gIAorCXN0YXR1cyA9IHNlbmRfcmVzcG9uc2UoY2FsbC0+aW52LCByZGF0YSwgMjAwLCAmaGFzX2luaXRpYWwpOworCVBKX0FTU0VSVF9PTl9GQUlMKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCByZXR1cm4gUEpfVFJVRSk7CisgICAgfQorCisgICAgLyogRG9uZSAqLworICAgIGFwcC5zZXJ2ZXIuY3VyX3N0YXRlLmNhbGxfY250Kys7CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmYXVsdCBoYW5kbGVyIHdoZW4gaW5jb21pbmcgcmVxdWVzdCBpcyBub3QgaGFuZGxlZCBieSBhbnkgb3RoZXIKKyAqIG1vZHVsZXMuCisgKi8KK3N0YXRpYyBwal9ib29sX3QgbW9kX3Jlc3BvbmRlcl9vbl9yeF9yZXF1ZXN0KHBqc2lwX3J4X2RhdGEgKnJkYXRhKTsKKworLyogTW9kdWxlIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBzdGF0ZWxlc3NseS4KKyAqLworc3RhdGljIHBqc2lwX21vZHVsZSBtb2RfcmVzcG9uZGVyID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2QtcmVzcG9uZGVyIiwgMTMgfSwJICAgIC8qIE5hbWUuCQkJKi8KKyAgICAtMSwJCQkJICAgIC8qIElkCQkJKi8KKyAgICBQSlNJUF9NT0RfUFJJT1JJVFlfQVBQTElDQVRJT04rMSwgLyogUHJpb3JpdHkJCSovCisgICAgTlVMTCwJCQkgICAgLyogbG9hZCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdGFydCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdG9wKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHVubG9hZCgpCQkJKi8KKyAgICAmbW9kX3Jlc3BvbmRlcl9vbl9yeF9yZXF1ZXN0LCAgIC8qIG9uX3J4X3JlcXVlc3QoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl9yeF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3JlcXVlc3QuCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHN4X3N0YXRlKCkJCSovCit9OworCisKK3N0YXRpYyBwal9ib29sX3QgbW9kX3Jlc3BvbmRlcl9vbl9yeF9yZXF1ZXN0KHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIGNvbnN0IHBqX3N0cl90IHJlYXNvbiA9IHBqX3N0cigiTm90IGV4cGVjdGluZyByZXF1ZXN0IGF0IHRoaXMgVVJJIik7CisKKyAgICAvKgorICAgICAqIFJlc3BvbmQgYW55IHJlcXVlc3RzIChleGNlcHQgQUNLISkgd2l0aCA1MDAuCisgICAgICovCisgICAgaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCAhPSBQSlNJUF9BQ0tfTUVUSE9EKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoYXBwLnNpcF9lbmRwdCwgcmRhdGEsIDUwMCwgJnJlYXNvbiwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmVsb3cgaXMgYSBzaW1wbGUgbW9kdWxlIHRvIGxvZyBhbGwgaW5jb21pbmcgYW5kIG91dGdvaW5nIFNJUCBtZXNzYWdlcworICovCisKKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfYm9vbF90IGxvZ2dlcl9vbl9yeF9tc2cocGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJYICVkIGJ5dGVzICVzIGZyb20gJXMgJXM6JWQ6XG4iCisJCQkgIiUuKnNcbiIKKwkJCSAiLS1lbmQgbXNnLS0iLAorCQkJIHJkYXRhLT5tc2dfaW5mby5sZW4sCisJCQkgcGpzaXBfcnhfZGF0YV9nZXRfaW5mbyhyZGF0YSksCisJCQkgcmRhdGEtPnRwX2luZm8udHJhbnNwb3J0LT50eXBlX25hbWUsCisJCQkgcmRhdGEtPnBrdF9pbmZvLnNyY19uYW1lLAorCQkJIHJkYXRhLT5wa3RfaW5mby5zcmNfcG9ydCwKKwkJCSAoaW50KXJkYXRhLT5tc2dfaW5mby5sZW4sCisJCQkgcmRhdGEtPm1zZ19pbmZvLm1zZ19idWYpKTsKKyAgICAKKyAgICAvKiBBbHdheXMgcmV0dXJuIGZhbHNlLCBvdGhlcndpc2UgbWVzc2FnZXMgd2lsbCBub3QgZ2V0IHByb2Nlc3NlZCEgKi8KKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKy8qIE5vdGlmaWNhdGlvbiBvbiBvdXRnb2luZyBtZXNzYWdlcyAqLworc3RhdGljIHBqX3N0YXR1c190IGxvZ2dlcl9vbl90eF9tc2cocGpzaXBfdHhfZGF0YSAqdGRhdGEpCit7CisgICAgCisgICAgLyogSW1wb3J0YW50IG5vdGU6CisgICAgICoJdHBfaW5mbyBmaWVsZCBpcyBvbmx5IHZhbGlkIGFmdGVyIG91dGdvaW5nIG1lc3NhZ2VzIGhhcyBwYXNzZWQKKyAgICAgKgl0cmFuc3BvcnQgbGF5ZXIuIFNvIGRvbid0IHRyeSB0byBhY2Nlc3MgdHBfaW5mbyB3aGVuIHRoZSBtb2R1bGUKKyAgICAgKgloYXMgbG93ZXIgcHJpb3JpdHkgdGhhbiB0cmFuc3BvcnQgbGF5ZXIuCisgICAgICovCisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiVFggJWQgYnl0ZXMgJXMgdG8gJXMgJXM6JWQ6XG4iCisJCQkgIiUuKnNcbiIKKwkJCSAiLS1lbmQgbXNnLS0iLAorCQkJICh0ZGF0YS0+YnVmLmN1ciAtIHRkYXRhLT5idWYuc3RhcnQpLAorCQkJIHBqc2lwX3R4X2RhdGFfZ2V0X2luZm8odGRhdGEpLAorCQkJIHRkYXRhLT50cF9pbmZvLnRyYW5zcG9ydC0+dHlwZV9uYW1lLAorCQkJIHRkYXRhLT50cF9pbmZvLmRzdF9uYW1lLAorCQkJIHRkYXRhLT50cF9pbmZvLmRzdF9wb3J0LAorCQkJIChpbnQpKHRkYXRhLT5idWYuY3VyIC0gdGRhdGEtPmJ1Zi5zdGFydCksCisJCQkgdGRhdGEtPmJ1Zi5zdGFydCkpOworCisgICAgLyogQWx3YXlzIHJldHVybiBzdWNjZXNzLCBvdGhlcndpc2UgbWVzc2FnZSB3aWxsIG5vdCBnZXQgc2VudCEgKi8KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogVGhlIG1vZHVsZSBpbnN0YW5jZS4gKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbXNnX2xvZ2dlciA9IAoreworICAgIE5VTEwsIE5VTEwsCQkJCS8qIHByZXYsIG5leHQuCQkqLworICAgIHsgIm1vZC1zaXBydHAtbG9nIiwgMTQgfSwJCS8qIE5hbWUuCQkqLworICAgIC0xLAkJCQkJLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9UUkFOU1BPUlRfTEFZRVItMSwvKiBQcmlvcml0eQkgICAgICAgICovCisgICAgTlVMTCwJCQkJLyogbG9hZCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0YXJ0KCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RvcCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHVubG9hZCgpCQkqLworICAgICZsb2dnZXJfb25fcnhfbXNnLAkJCS8qIG9uX3J4X3JlcXVlc3QoKQkqLworICAgICZsb2dnZXJfb25fcnhfbXNnLAkJCS8qIG9uX3J4X3Jlc3BvbnNlKCkJKi8KKyAgICAmbG9nZ2VyX29uX3R4X21zZywJCQkvKiBvbl90eF9yZXF1ZXN0LgkqLworICAgICZsb2dnZXJfb25fdHhfbXNnLAkJCS8qIG9uX3R4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90c3hfc3RhdGUoKQkqLworCit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0IENsaWVudC4KKyAqLworCitzdGF0aWMgcGpfYm9vbF90IG1vZF90ZXN0X29uX3J4X3Jlc3BvbnNlKHBqc2lwX3J4X2RhdGEgKnJkYXRhKTsKKworc3RhdGljIHZvaWQgY2FsbF9vbl9tZWRpYV91cGRhdGUoIHBqc2lwX2ludl9zZXNzaW9uICppbnYsCisJCQkJICBwal9zdGF0dXNfdCBzdGF0dXMpOworc3RhdGljIHZvaWQgY2FsbF9vbl9zdGF0ZV9jaGFuZ2VkKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCAKKwkJCQkgICBwanNpcF9ldmVudCAqZSk7CitzdGF0aWMgdm9pZCBjYWxsX29uX2ZvcmtlZChwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCBwanNpcF9ldmVudCAqZSk7CisKKworLyogTW9kdWxlIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBjYWxsbHkuCisgKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX3Rlc3QgPQoreworICAgIE5VTEwsIE5VTEwsCQkJICAgIC8qIHByZXYsIG5leHQuCQkqLworICAgIHsgIm1vZC10ZXN0IiwgOCB9LAkJICAgIC8qIE5hbWUuCQkJKi8KKyAgICAtMSwJCQkJICAgIC8qIElkCQkJKi8KKyAgICBQSlNJUF9NT0RfUFJJT1JJVFlfQVBQTElDQVRJT04sIC8qIFByaW9yaXR5CQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBsb2FkKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHN0YXJ0KCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHN0b3AoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogdW5sb2FkKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3J4X3JlcXVlc3QoKQkJKi8KKyAgICAmbW9kX3Rlc3Rfb25fcnhfcmVzcG9uc2UsCSAgICAvKiBvbl9yeF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3JlcXVlc3QuCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHN4X3N0YXRlKCkJCSovCit9OworCisKK3N0YXRpYyB2b2lkIHJlcG9ydF9jb21wbGV0aW9uKGludCBzdGF0dXNfY29kZSkKK3sKKyAgICBhcHAuY2xpZW50LmpvYl9maW5pc2hlZCsrOworICAgIGlmIChzdGF0dXNfY29kZSA+PSAyMDAgJiYgc3RhdHVzX2NvZGUgPCA4MDApCisJYXBwLmNsaWVudC5yZXNwb25zZV9jb2Rlc1tzdGF0dXNfY29kZV0rKzsKKyAgICBhcHAuY2xpZW50LnRvdGFsX3Jlc3BvbnNlcysrOworICAgIHBqX2dldHRpbWVvZmRheSgmYXBwLmNsaWVudC5sYXN0X2NvbXBsZXRpb24pOworfQorCisKKy8qIEhhbmRsZXIgd2hlbiByZXNwb25zZSBpcyByZWNlaXZlZC4gKi8KK3N0YXRpYyBwal9ib29sX3QgbW9kX3Rlc3Rfb25fcnhfcmVzcG9uc2UocGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgaWYgKHBqc2lwX3JkYXRhX2dldF90c3gocmRhdGEpID09IE5VTEwpIHsKKwlyZXBvcnRfY29tcGxldGlvbihyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnN0YXR1cy5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisvKgorICogQ3JlYXRlIGFwcAorICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY3JlYXRlX2FwcCh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIGluaXRpYWxpemluZyBwamxpYiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBpbml0IFBKTElCLVVUSUw6ICovCisgICAgc3RhdHVzID0gcGpsaWJfdXRpbF9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmYXBwLmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAKKwkJCSBDQUNISU5HX1BPT0xfU0laRSk7CisKKyAgICAvKiBDcmVhdGUgYXBwbGljYXRpb24gcG9vbCBmb3IgbWlzYy4gKi8KKyAgICBhcHAucG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCZhcHAuY3AuZmFjdG9yeSwgImFwcCIsIDEwMDAsIDEwMDAsIE5VTEwpOworCisgICAgLyogQ3JlYXRlIHRoZSBlbmRwb2ludDogKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGUoJmFwcC5jcC5mYWN0b3J5LCBwal9nZXRob3N0bmFtZSgpLT5wdHIsIAorCQkJCSZhcHAuc2lwX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBJbml0IFNJUCBzdGFjaworICovCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zaXAoKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IC0xOworCisgICAgLyogQWRkIFVEUC9UQ1AgdHJhbnNwb3J0LiAqLworICAgIHsKKwlwal9zb2NrYWRkcl9pbiBhZGRyOworCXBqc2lwX2hvc3RfcG9ydCBhZGRybmFtZTsKKwljb25zdCBjaGFyICp0cmFuc3BvcnRfdHlwZSA9IE5VTEw7CisKKwlwal9iemVybygmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBwal9BRl9JTkVUKCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwOworCWFkZHIuc2luX3BvcnQgPSBwal9odG9ucygocGpfdWludDE2X3QpYXBwLmxvY2FsX3BvcnQpOworCisJaWYgKGFwcC5sb2NhbF9hZGRyLnNsZW4pIHsKKwkgICAgYWRkcm5hbWUuaG9zdCA9IGFwcC5sb2NhbF9hZGRyOworCSAgICBhZGRybmFtZS5wb3J0ID0gNTA2MDsKKwl9IAorCWlmIChhcHAubG9jYWxfcG9ydCAhPSAwKQorCSAgICBhZGRybmFtZS5wb3J0ID0gYXBwLmxvY2FsX3BvcnQ7CisKKwlpZiAoMCkgeworI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCE9MAorCX0gZWxzZSBpZiAoYXBwLnVzZV90Y3ApIHsKKwkgICAgcGpfc29ja2FkZHJfaW4gbG9jYWxfYWRkcjsKKwkgICAgcGpzaXBfdHBmYWN0b3J5ICp0cGZhY3Rvcnk7CisJICAgIAorCSAgICB0cmFuc3BvcnRfdHlwZSA9ICJ0Y3AiOworCSAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZsb2NhbF9hZGRyLCAwLCAocGpfdWludDE2X3QpYXBwLmxvY2FsX3BvcnQpOworCSAgICBzdGF0dXMgPSBwanNpcF90Y3BfdHJhbnNwb3J0X3N0YXJ0KGFwcC5zaXBfZW5kcHQsICZsb2NhbF9hZGRyLAorCQkJCQkgICAgICAgYXBwLnRocmVhZF9jb3VudCwgJnRwZmFjdG9yeSk7CisJICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCQlhcHAubG9jYWxfYWRkciA9IHRwZmFjdG9yeS0+YWRkcl9uYW1lLmhvc3Q7CisJCWFwcC5sb2NhbF9wb3J0ID0gdHBmYWN0b3J5LT5hZGRyX25hbWUucG9ydDsKKwkgICAgfQorI2VuZGlmCisJfSBlbHNlIHsKKwkgICAgcGpzaXBfdHJhbnNwb3J0ICp0cDsKKworCSAgICB0cmFuc3BvcnRfdHlwZSA9ICJ1ZHAiOworCSAgICBzdGF0dXMgPSBwanNpcF91ZHBfdHJhbnNwb3J0X3N0YXJ0KGFwcC5zaXBfZW5kcHQsICZhZGRyLCAKKwkJCQkJICAgICAgIChhcHAubG9jYWxfYWRkci5zbGVuID8gJmFkZHJuYW1lOk5VTEwpLAorCQkJCQkgICAgICAgYXBwLnRocmVhZF9jb3VudCwgJnRwKTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJCWFwcC5sb2NhbF9hZGRyID0gdHAtPmxvY2FsX25hbWUuaG9zdDsKKwkJYXBwLmxvY2FsX3BvcnQgPSB0cC0+bG9jYWxfbmFtZS5wb3J0OworCSAgICB9CisKKwl9CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHN0YXJ0IHRyYW5zcG9ydCIsIHN0YXR1cyk7CisJICAgIHJldHVybiBzdGF0dXM7CisJfQorCisJYXBwLmxvY2FsX3VyaS5wdHIgPSBwal9wb29sX2FsbG9jKGFwcC5wb29sLCAxMjgpOworCWFwcC5sb2NhbF91cmkuc2xlbiA9IHBqX2Fuc2lfc3ByaW50ZihhcHAubG9jYWxfdXJpLnB0ciwgCisJCQkJICAgIAkgICAgICI8c2lwOnBqc2lwLXBlcmZAJS4qczolZDt0cmFuc3BvcnQ9JXM+IiwKKwkJCQkJICAgICAoaW50KWFwcC5sb2NhbF9hZGRyLnNsZW4sCisJCQkJCSAgICAgYXBwLmxvY2FsX2FkZHIucHRyLAorCQkJCQkgICAgIGFwcC5sb2NhbF9wb3J0LAorCQkJCQkgICAgIHRyYW5zcG9ydF90eXBlKTsKKworCWFwcC5sb2NhbF9jb250YWN0ID0gYXBwLmxvY2FsX3VyaTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBJbml0IHRyYW5zYWN0aW9uIGxheWVyLgorICAgICAqIFRoaXMgd2lsbCBjcmVhdGUvaW5pdGlhbGl6ZSB0cmFuc2FjdGlvbiBoYXNoIHRhYmxlcyBldGMuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfdHN4X2xheWVyX2luaXRfbW9kdWxlKGFwcC5zaXBfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKyAgICAvKiAgSW5pdGlhbGl6ZSBVQSBsYXllci4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF91YV9pbml0X21vZHVsZSggYXBwLnNpcF9lbmRwdCwgTlVMTCApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKyAgICAvKiBJbml0aWFsaXplIDEwMHJlbCBzdXBwb3J0ICovCisgICAgc3RhdHVzID0gcGpzaXBfMTAwcmVsX2luaXRfbW9kdWxlKGFwcC5zaXBfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKyAgICAvKiAgSW5pdCBpbnZpdGUgc2Vzc2lvbiBtb2R1bGUuICovCisgICAgeworCXBqc2lwX2ludl9jYWxsYmFjayBpbnZfY2I7CisKKwkvKiBJbml0IHRoZSBjYWxsYmFjayBmb3IgSU5WSVRFIHNlc3Npb246ICovCisJcGpfYnplcm8oJmludl9jYiwgc2l6ZW9mKGludl9jYikpOworCWludl9jYi5vbl9zdGF0ZV9jaGFuZ2VkID0gJmNhbGxfb25fc3RhdGVfY2hhbmdlZDsKKwlpbnZfY2Iub25fbmV3X3Nlc3Npb24gPSAmY2FsbF9vbl9mb3JrZWQ7CisJaW52X2NiLm9uX21lZGlhX3VwZGF0ZSA9ICZjYWxsX29uX21lZGlhX3VwZGF0ZTsKKworCS8qIEluaXRpYWxpemUgaW52aXRlIHNlc3Npb24gbW9kdWxlOiAgKi8KKwlzdGF0dXMgPSBwanNpcF9pbnZfdXNhZ2VfaW5pdChhcHAuc2lwX2VuZHB0LCAmaW52X2NiKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciBvdXIgbW9kdWxlIHRvIHJlY2VpdmUgaW5jb21pbmcgcmVxdWVzdHMuICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKCBhcHAuc2lwX2VuZHB0LCAmbW9kX3Rlc3QpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKworICAgIC8qIFJlZ2lzdGVyIHN0YXRlbGVzcyBzZXJ2ZXIgbW9kdWxlICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKCBhcHAuc2lwX2VuZHB0LCAmbW9kX3N0YXRlbGVzc19zZXJ2ZXIpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKyAgICAvKiBSZWdpc3RlciBkZWZhdWx0IHJlc3BvbmRlciBtb2R1bGUgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsICZtb2RfcmVzcG9uZGVyKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisgICAgLyogUmVnaXN0ZXIgc3RhdGVsZXNzIHNlcnZlciBtb2R1bGUgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsICZtb2Rfc3RhdGVmdWxfc2VydmVyKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisKKyAgICAvKiBSZWdpc3RlciBjYWxsIHNlcnZlciBtb2R1bGUgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsICZtb2RfY2FsbF9zZXJ2ZXIpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKworICAgIC8qIERvbmUgKi8KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogRGVzdHJveSBTSVAKKyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9hcHAoKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBhcHAudGhyZWFkX3F1aXQgPSAxOworICAgIGZvciAoaT0wOyBpPGFwcC50aHJlYWRfY291bnQ7ICsraSkgeworCWlmIChhcHAudGhyZWFkW2ldKSB7CisJICAgIHBqX3RocmVhZF9qb2luKGFwcC50aHJlYWRbaV0pOworCSAgICBwal90aHJlYWRfZGVzdHJveShhcHAudGhyZWFkW2ldKTsKKwkgICAgYXBwLnRocmVhZFtpXSA9IE5VTEw7CisJfQorICAgIH0KKworICAgIGlmIChhcHAuc2lwX2VuZHB0KSB7CisJcGpzaXBfZW5kcHRfZGVzdHJveShhcHAuc2lwX2VuZHB0KTsKKwlhcHAuc2lwX2VuZHB0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoYXBwLnBvb2wpIHsKKwlwal9wb29sX3JlbGVhc2UoYXBwLnBvb2wpOworCWFwcC5wb29sID0gTlVMTDsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiUGVhayBtZW1vcnkgc2l6ZTogJXVNQiIsCisJCQkgICAgIGFwcC5jcC5wZWFrX3VzZWRfc2l6ZSAvIDEwMDAwMDApKTsKKwlwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmYXBwLmNwKTsKKyAgICB9CisKKyAgICAvKiBTaHV0ZG93biBQSkxJQiAqLworICAgIHBqX3NodXRkb3duKCk7Cit9CisKKworLyoKKyAqIEluaXQgbWVkaWEgc3RhY2suCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X21lZGlhKCkKK3sKKyAgICB1bnNpZ25lZAlpOworICAgIHBqX3VpbnQxNl90CXJ0cF9wb3J0OworICAgIHBqX3N0YXR1c190CXN0YXR1czsKKworCisgICAgLyogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludCBzbyB0aGF0IGF0IGxlYXN0IGVycm9yIHN1YnN5c3RlbSBpcyBwcm9wZXJseQorICAgICAqIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZhcHAuY3AuZmFjdG9yeSwgCisJCQkJICBwanNpcF9lbmRwdF9nZXRfaW9xdWV1ZShhcHAuc2lwX2VuZHB0KSwgMCwgCisJCQkJICAmYXBwLm1lZF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworCisgICAgLyogTXVzdCByZWdpc3RlciBhbGwgY29kZWNzIHRvIGJlIHN1cHBvcnRlZCAqLworICAgIHBqbWVkaWFfY29kZWNfcmVnaXN0ZXJfYXVkaW9fY29kZWNzKGFwcC5tZWRfZW5kcHQsIE5VTEwpOworCisgICAgLyogSW5pdCBkdW1teSBzb2NrZXQgYWRkcmVzc2VzICovCisgICAgYXBwLnNraW5mb19jbnQgPSAwOworICAgIGZvciAoaT0wLCBydHBfcG9ydD00MDAwOyBpPFBKX0FSUkFZX1NJWkUoYXBwLnNraW5mbyk7ICsraSwgcnRwX3BvcnQrPTIpIHsKKwlwam1lZGlhX3NvY2tfaW5mbyAqc2tpbmZvOworCisJc2tpbmZvID0gJmFwcC5za2luZm9baV07CisJCisJcGpfc29ja2FkZHJfaW5faW5pdCgmc2tpbmZvLT5ydHBfYWRkcl9uYW1lLmlwdjQsICZhcHAubG9jYWxfYWRkciwKKwkJCSAgICAocGpfdWludDE2X3QpcnRwX3BvcnQpOworCXBqX3NvY2thZGRyX2luX2luaXQoJnNraW5mby0+cnRwX2FkZHJfbmFtZS5pcHY0LCAmYXBwLmxvY2FsX2FkZHIsCisJCQkgICAgKHBqX3VpbnQxNl90KShydHBfcG9ydCsxKSk7CisJYXBwLnNraW5mb19jbnQrKzsKKyAgICB9CisKKyAgICAvKiBHZW5lcmF0ZSBkdW1teSBTRFAgKi8KKyAgICBkdW1teV9zZHBfc3RyLnNsZW4gPSBwal9hbnNpX3N0cmxlbihkdW1teV9zZHBfc3RyLnB0cik7CisgICAgc3RhdHVzID0gcGptZWRpYV9zZHBfcGFyc2UoYXBwLnBvb2wsIGR1bW15X3NkcF9zdHIucHRyLCBkdW1teV9zZHBfc3RyLnNsZW4sIAorCQkJICAgICAgICZhcHAuZHVtbXlfc2RwKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIHBhcnNpbmcgZHVtbXkgU0RQIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworCisgICAgLyogRG9uZSAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIFRoaXMgaXMgbm90aWZpY2F0aW9uIGZyb20gdGhlIGNhbGwgYWJvdXQgbWVkaWEgbmVnb3RpYXRpb24KKyAqIHN0YXR1cy4gVGhpcyBpcyBjYWxsZWQgZm9yIGNsaWVudCBjYWxscyBvbmx5LgorICovCitzdGF0aWMgdm9pZCBjYWxsX29uX21lZGlhX3VwZGF0ZSggcGpzaXBfaW52X3Nlc3Npb24gKmludiwKKwkJCQkgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwanNpcF90eF9kYXRhICp0ZGF0YTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBwanNpcF9pbnZfZW5kX3Nlc3Npb24oaW52LCBQSlNJUF9TQ19VTlNVUFBPUlRFRF9NRURJQV9UWVBFLCAKKwkJCQkgICAgICAgTlVMTCwgJnRkYXRhKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MgJiYgdGRhdGEpCisJICAgIHN0YXR1cyA9IHBqc2lwX2ludl9zZW5kX21zZyhpbnYsIHRkYXRhKTsKKyAgICB9Cit9CisKKworLyogVGhpcyBpcyBub3RpZmljYXRpb24gZnJvbSB0aGUgY2FsbCB3aGVuIHRoZSBjYWxsIHN0YXRlIGhhcyBjaGFuZ2VkLgorICogVGhpcyBpcyBjYWxsZWQgZm9yIGNsaWVudCBjYWxscyBvbmx5LgorICovCitzdGF0aWMgdm9pZCBjYWxsX29uX3N0YXRlX2NoYW5nZWQoIHBqc2lwX2ludl9zZXNzaW9uICppbnYsIAorCQkJCSAgIHBqc2lwX2V2ZW50ICplKQoreworICAgIFBKX1VOVVNFRF9BUkcoZSk7CisKKyAgICAvKiBCYWlsIG91dCBpZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBjb3VudGVkIGJlZm9yZSAqLworICAgIGlmIChpbnYtPm1vZF9kYXRhW21vZF90ZXN0LmlkXSAhPSBOVUxMKQorCXJldHVybjsKKworICAgIC8qIEJhaWwgb3V0IGlmIHRoaXMgaXMgbm90IGFuIG91dGdvaW5nIGNhbGwgKi8KKyAgICBpZiAoaW52LT5yb2xlICE9IFBKU0lQX1VBQ19ST0xFKQorCXJldHVybjsKKworICAgIGlmIChpbnYtPnN0YXRlID09IFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQpIHsKKwlwanNpcF90eF9kYXRhICp0ZGF0YTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwkvL3JlcG9ydF9jb21wbGV0aW9uKDIwMCk7CisJLy9pbnYtPm1vZF9kYXRhW21vZF90ZXN0LmlkXSA9ICh2b2lkKikxOworCisJc3RhdHVzID0gcGpzaXBfaW52X2VuZF9zZXNzaW9uKGludiwgUEpTSVBfU0NfT0ssIE5VTEwsICZ0ZGF0YSk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTICYmIHRkYXRhKQorCSAgICBzdGF0dXMgPSBwanNpcF9pbnZfc2VuZF9tc2coaW52LCB0ZGF0YSk7CisKKyAgICB9IGVsc2UgaWYgKGludi0+c3RhdGUgPT0gUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworCXJlcG9ydF9jb21wbGV0aW9uKGludi0+Y2F1c2UpOworCWludi0+bW9kX2RhdGFbbW9kX3Rlc3QuaWRdID0gKHZvaWQqKShwal9zc2l6ZV90KTE7CisgICAgfQorfQorCisKKy8qIE5vdCBpbXBsZW1lbnRlZCBmb3Igbm93ICovCitzdGF0aWMgdm9pZCBjYWxsX29uX2ZvcmtlZChwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCBwanNpcF9ldmVudCAqZSkKK3sKKyAgICAvKiBEbyBub3RoaW5nICovCisgICAgUEpfVU5VU0VEX0FSRyhpbnYpOworICAgIFBKX1VOVVNFRF9BUkcoZSk7Cit9CisKKworLyoKKyAqIE1ha2Ugb3V0Z29pbmcgY2FsbC4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IG1ha2VfY2FsbChjb25zdCBwal9zdHJfdCAqZHN0X3VyaSkKK3sKKyAgICBzdHJ1Y3QgY2FsbCAqY2FsbDsKKyAgICBwanNpcF9kaWFsb2cgKmRsZzsKKyAgICBwam1lZGlhX3NkcF9zZXNzaW9uICpzZHA7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisKKyAgICAvKiBDcmVhdGUgVUFDIGRpYWxvZyAqLworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfdWFjKCBwanNpcF91YV9pbnN0YW5jZSgpLCAKKwkJCQkgICAmYXBwLmxvY2FsX3VyaSwJLyogbG9jYWwgVVJJCSAgICAqLworCQkJCSAgICZhcHAubG9jYWxfY29udGFjdCwJLyogbG9jYWwgQ29udGFjdCAgICAqLworCQkJCSAgIGRzdF91cmksCQkvKiByZW1vdGUgVVJJCSAgICAqLworCQkJCSAgIGRzdF91cmksCQkvKiByZW1vdGUgdGFyZ2V0ICAgICovCisJCQkJICAgJmRsZyk7CQkvKiBkaWFsb2cJICAgICovCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgY2FsbCAqLworICAgIGNhbGwgPSBwal9wb29sX3phbGxvYyhkbGctPnBvb2wsIHNpemVvZihzdHJ1Y3QgY2FsbCkpOworCisgICAgLyogQ3JlYXRlIFNEUCAqLworICAgIGlmIChhcHAucmVhbF9zZHApIHsKKwlzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZV9zZHAoYXBwLm1lZF9lbmRwdCwgZGxnLT5wb29sLCAxLCAKKwkJCQkJICBhcHAuc2tpbmZvLCAmc2RwKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpzaXBfZGxnX3Rlcm1pbmF0ZShkbGcpOworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKyAgICB9IGVsc2UKKwlzZHAgPSBhcHAuZHVtbXlfc2RwOworCisgICAgLyogQ3JlYXRlIHRoZSBJTlZJVEUgc2Vzc2lvbi4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfY3JlYXRlX3VhYyggZGxnLCBzZHAsIDAsICZjYWxsLT5pbnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc2lwX2RsZ190ZXJtaW5hdGUoZGxnKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworCisgICAgLyogQ3JlYXRlIGluaXRpYWwgSU5WSVRFIHJlcXVlc3QuCisgICAgICogVGhpcyBJTlZJVEUgcmVxdWVzdCB3aWxsIGNvbnRhaW4gYSBwZXJmZWN0bHkgZ29vZCByZXF1ZXN0IGFuZCAKKyAgICAgKiBhbiBTRFAgYm9keSBhcyB3ZWxsLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqc2lwX2ludl9pbnZpdGUoY2FsbC0+aW52LCAmdGRhdGEpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKworICAgIC8qIFNlbmQgaW5pdGlhbCBJTlZJVEUgcmVxdWVzdC4gCisgICAgICogRnJvbSBub3cgb24sIHRoZSBpbnZpdGUgc2Vzc2lvbidzIHN0YXRlIHdpbGwgYmUgcmVwb3J0ZWQgdG8gdXMKKyAgICAgKiB2aWEgdGhlIGludml0ZSBzZXNzaW9uIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfc2VuZF9tc2coY2FsbC0+aW52LCB0ZGF0YSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIFZlcmlmeSB0aGF0IHZhbGlkIFNJUCB1cmwgaXMgZ2l2ZW4uCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCB2ZXJpZnlfc2lwX3VybChjb25zdCBjaGFyICpjX3VybCkKK3sKKyAgICBwanNpcF91cmkgKnA7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIGNoYXIgKnVybDsKKyAgICBwal9zaXplX3QgbGVuID0gKGNfdXJsID8gcGpfYW5zaV9zdHJsZW4oY191cmwpIDogMCk7CisKKyAgICBpZiAoIWxlbikgcmV0dXJuIC0xOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCZhcHAuY3AuZmFjdG9yeSwgImNoZWNrJXAiLCAxMDI0LCAwLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpIHJldHVybiBQSl9FTk9NRU07CisKKyAgICB1cmwgPSBwal9wb29sX2FsbG9jKHBvb2wsIGxlbisxKTsKKyAgICBwal9hbnNpX3N0cmNweSh1cmwsIGNfdXJsKTsKKyAgICB1cmxbbGVuXSA9ICdcMCc7CisKKyAgICBwID0gcGpzaXBfcGFyc2VfdXJpKHBvb2wsIHVybCwgbGVuLCAwKTsKKyAgICBpZiAoIXAgfHwgcGpfc3RyaWNtcDIocGpzaXBfdXJpX2dldF9zY2hlbWUocCksICJzaXAiKSAhPSAwKQorCXAgPSBOVUxMOworCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiBwID8gMCA6IC0xOworfQorCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgcHJpbnRmKAorCSJVc2FnZTpcbiIKKwkiICAgcGpzaXAtcGVyZiBbT1BUSU9OU10gICAgICAgIC0tIHRvIHN0YXJ0IGFzIHNlcnZlclxuIgorCSIgICBwanNpcC1wZXJmIFtPUFRJT05TXSBVUkwgICAgLS0gdG8gY2FsbCBzZXJ2ZXIgKHBvc3NpYmx5IGl0c2VsZilcbiIKKwkiXG4iCisJIndoZXJlOlxuIgorCSIgICBVUkwgICAgICAgICAgICAgICAgICAgICBUaGUgU0lQIFVSTCB0byBiZSBjb250YWN0ZWQuXG4iCisJIlxuIgorCSJDbGllbnQgb3B0aW9uczpcbiIKKwkiICAgLS1tZXRob2Q9TUVUSE9ELCAtbSAgICAgU2V0IHRlc3QgbWV0aG9kIChzZXQgdG8gSU5WSVRFIGZvciBjYWxsIGJlbmNobWFyaylcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0OiBPUFRJT05TXVxuIgorCSIgICAtLWNvdW50PU4sIC1uICAgICAgICAgICBTZXQgdG90YWwgbnVtYmVyIG9mIHJlcXVlc3RzIHRvIGluaXRpYXRlXG4iCisJIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0PSVkXVxuIgorCSIgICAtLXN0YXRlbGVzcywgLXMgICAgICAgICBTZXQgdG8gb3BlcmF0ZSBpbiBzdGF0ZWxlc3MgbW9kZVxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdDogc3RhdGVmdWxdXG4iCisJIiAgIC0tdGltZW91dD1TRUMsIC10ICAgICAgIFNldCBjbGllbnQgdGltZW91dCBbZGVmYXVsdD02MCBzZWNdXG4iCisJIiAgIC0td2luZG93PUNPVU5ULCAtdyAgICAgIFNldCBtYXhpbXVtIG91dHN0YW5kaW5nIGpvYiBbZGVmYXVsdDogJWRdXG4iCisJIlxuIgorCSJTRFAgb3B0aW9ucyAoY2xpZW50IGFuZCBzZXJ2ZXIpOlxuIgorCSIgICAtLXJlYWwtc2RwICAgICAgICAgICAgICBHZW5lcmF0ZSByZWFsIFNEUCBmcm9tIHBqbWVkaWEsIGFuZCBhbHNvIHBlcmZvcm1cbiIKKwkiICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVyIFNEUCBuZWdvdGlhdGlvbiBbZGVmYXVsdDogZHVtbXldXG4iCisJIlxuIgorCSJDbGllbnQgYW5kIFNlcnZlciBvcHRpb25zOlxuIgorCSIgICAtLWxvY2FsLXBvcnQ9UE9SVCwgLXAgICBTZXQgbG9jYWwgcG9ydCBbZGVmYXVsdDogNTA2MF1cbiIKKwkiICAgLS11c2UtdGNwLCAtVCAgICAgICAgICAgVXNlIFRDUCBpbnN0ZWFkIG9mIFVEUC4gTm90ZSB0aGF0IHdoZW4gc3RhcnRlZCBhc1xuIgorCSIgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIHlvdSBtdXN0IGFkZCA7dHJhbnNwb3J0PXRjcCBwYXJhbWV0ZXIgdG8gVVJMXG4iCisJIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0OiBub11cbiIKKwkiICAgLS10aHJlYWQtY291bnQ9TiAgICAgICAgU2V0IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBbZGVmYXVsdD0xXVxuIgorCSIgICAtLXRyeWluZyAgICAgICAgICAgICAgICBTZW5kIDEwMC9UcnlpbmcgcmVzcG9uc2UgKHNlcnZlciwgZGVmYXVsdCBubylcbiIKKwkiICAgLS1yaW5naW5nICAgICAgICAgICAgICAgU2VuZCAxODAvUmluZ2luZyByZXNwb25zZSAoc2VydmVyLCBkZWZhdWx0IG5vKVxuIgorCSIgICAtLWRlbGF5PU1TLCAtZCAgICAgICAgICBEZWxheSBhbnN3ZXJpbmcgY2FsbCBieSBNUyAoc2VydmVyLCBkZWZhdWx0IG5vKVxuIgorCSJcbiIKKwkiTWlzYyBvcHRpb25zOlxuIgorCSIgICAtLWhlbHAsIC1oICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgc2NyZWVuXG4iCisJIiAgIC0tdmVyYm9zZSwgLXYgICAgICAgICAgIFZlcmJvc2UgbG9nZ2luZyAocHV0IG1vcmUgdGhhbiBvbmNlIGZvciBldmVuIG1vcmUpXG4iCisJIlxuIgorCSJXaGVuIHN0YXJ0ZWQgYXMgc2VydmVyLCBwanNpcC1wZXJmIGNhbiBiZSBjb250YWN0ZWQgb24gdGhlIGZvbGxvd2luZyBVUklzOlxuIgorCSIgICAtIHNpcDowQHNlcnZlci1hZGRyICAgICBUbyBoYW5kbGUgcmVxdWVzdHMgc3RhdGVsZXNzbHkuXG4iCisJIiAgIC0gc2lwOjFAc2VydmVyLWFkZHIgICAgIFRvIGhhbmRsZSByZXF1ZXN0cyBzdGF0ZWZ1bGx5LlxuIgorCSIgICAtIHNpcDoyQHNlcnZlci1hZGRyICAgICBUbyBoYW5kbGUgSU5WSVRFIGNhbGwuXG4iLAorCURFRkFVTFRfQ09VTlQsIEpPQl9XSU5ET1cpOworfQorCisKK3N0YXRpYyBpbnQgbXlfYXRvaShjb25zdCBjaGFyICpzKQoreworICAgIHBqX3N0cl90IHNzID0gcGpfc3RyKChjaGFyKilzKTsKKyAgICByZXR1cm4gcGpfc3RydG91bCgmc3MpOworfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBlbnVtIHsgT1BUX1RIUkVBRF9DT1VOVCA9IDEsIE9QVF9SRUFMX1NEUCwgT1BUX1RSWUlORywgT1BUX1JJTkdJTkcgfTsKKyAgICBzdHJ1Y3QgcGpfZ2V0b3B0X29wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJsb2NhbC1wb3J0IiwJICAgIDEsIDAsICdwJyB9LAorCXsgImNvdW50IiwJICAgIDEsIDAsICdjJyB9LAorCXsgInRocmVhZC1jb3VudCIsICAgMSwgMCwgT1BUX1RIUkVBRF9DT1VOVCB9LAorCXsgIm1ldGhvZCIsCSAgICAxLCAwLCAnbScgfSwKKwl7ICJoZWxwIiwJICAgIDAsIDAsICdoJyB9LAorCXsgInN0YXRlbGVzcyIsCSAgICAwLCAwLCAncycgfSwKKwl7ICJ0aW1lb3V0IiwJICAgIDEsIDAsICd0JyB9LAorCXsgInJlYWwtc2RwIiwJICAgIDAsIDAsIE9QVF9SRUFMX1NEUCB9LAorCXsgInZlcmJvc2UiLCAgICAgICAgMCwgMCwgJ3YnIH0sCisJeyAidXNlLXRjcCIsCSAgICAwLCAwLCAnVCcgfSwKKwl7ICJ3aW5kb3ciLAkgICAgMSwgMCwgJ3cnIH0sCisJeyAiZGVsYXkiLAkgICAgMSwgMCwgJ2QnIH0sCisJeyAidHJ5aW5nIiwJICAgIDAsIDAsIE9QVF9UUllJTkd9LAorCXsgInJpbmdpbmciLAkgICAgMCwgMCwgT1BUX1JJTkdJTkd9LAorCXsgTlVMTCwgMCwgMCwgMCB9LAorICAgIH07CisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKworICAgIC8qIEluaXQgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb25maWdzICovCisgICAgYXBwLmxvY2FsX3BvcnQgPSA1MDYwOworICAgIGFwcC50aHJlYWRfY291bnQgPSAxOworICAgIGFwcC5jbGllbnQuam9iX2NvdW50ID0gREVGQVVMVF9DT1VOVDsKKyAgICBhcHAuY2xpZW50Lm1ldGhvZCA9ICpwanNpcF9nZXRfb3B0aW9uc19tZXRob2QoKTsKKyAgICBhcHAuY2xpZW50LmpvYl93aW5kb3cgPSBjID0gSk9CX1dJTkRPVzsKKyAgICBhcHAuY2xpZW50LnRpbWVvdXQgPSA2MDsKKyAgICBhcHAubG9nX2xldmVsID0gMzsKKworCisgICAgLyogUGFyc2Ugb3B0aW9ucyAqLworICAgIHBqX29wdGluZCA9IDA7CisgICAgd2hpbGUoKGM9cGpfZ2V0b3B0X2xvbmcoYXJnYyxhcmd2LCAicDpjOm06dDp3OmQ6aHN2IiwgCisJCQkgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KSkhPS0xKSAKKyAgICB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAncCc6CisJICAgIGFwcC5sb2NhbF9wb3J0ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoYXBwLmxvY2FsX3BvcnQgPCAwIHx8IGFwcC5sb2NhbF9wb3J0ID4gNjU1MzUpIHsKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgIkludmFsaWQgLS1sb2NhbC1wb3J0ICVzIiwgcGpfb3B0YXJnKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgJ2MnOgorCSAgICBhcHAuY2xpZW50LmpvYl9jb3VudCA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGFwcC5jbGllbnQuam9iX2NvdW50IDwgMCkgeworCQlQSl9MT0coMywoVEhJU19GSUxFLCAiSW52YWxpZCAtLWxvY2FsLXBvcnQgJXMiLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGlmIChhcHAuY2xpZW50LmpvYl9jb3VudCA+IHBqc2lwX2NmZygpLT50c3gubWF4X2NvdW50KQorCQlQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJCSAgIldhcm5pbmc6IC0tY291bnQgdmFsdWUgKCVkKSBleGNlZWRzIG1heGltdW0gIgorCQkJICAidHJhbnNhY3Rpb24gY291bnQgKCVkKSIsIGFwcC5jbGllbnQuam9iX2NvdW50LAorCQkJICBwanNpcF9jZmcoKS0+dHN4Lm1heF9jb3VudCkpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RIUkVBRF9DT1VOVDoKKwkgICAgYXBwLnRocmVhZF9jb3VudCA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGFwcC50aHJlYWRfY291bnQgPCAxIHx8IGFwcC50aHJlYWRfY291bnQgPiAxNikgeworCQlQSl9MT0coMywoVEhJU19GSUxFLCAiSW52YWxpZCAtLXRocmVhZC1jb3VudCAlcyIsIHBqX29wdGFyZykpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICdtJzoKKwkgICAgeworCQlwal9zdHJfdCB0ZW1wID0gcGpfc3RyKChjaGFyKilwal9vcHRhcmcpOworCQlwanNpcF9tZXRob2RfaW5pdF9ucCgmYXBwLmNsaWVudC5tZXRob2QsICZ0ZW1wKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgJ2gnOgorCSAgICB1c2FnZSgpOworCSAgICByZXR1cm4gLTE7CisKKwljYXNlICdzJzoKKwkgICAgYXBwLmNsaWVudC5zdGF0ZWxlc3MgPSBQSl9UUlVFOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1JFQUxfU0RQOgorCSAgICBhcHAucmVhbF9zZHAgPSAxOworCSAgICBicmVhazsKKworCWNhc2UgJ3YnOgorCSAgICBhcHAubG9nX2xldmVsKys7CisJICAgIGJyZWFrOworCisJY2FzZSAndCc6CisJICAgIGFwcC5jbGllbnQudGltZW91dCA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGFwcC5jbGllbnQudGltZW91dCA8IDAgfHwgYXBwLmNsaWVudC50aW1lb3V0ID4gNjAwKSB7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsICJJbnZhbGlkIC0tdGltZW91dCAlcyIsIHBqX29wdGFyZykpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlICd3JzoKKwkgICAgYXBwLmNsaWVudC5qb2Jfd2luZG93ID0gbXlfYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoYXBwLmNsaWVudC5qb2Jfd2luZG93IDw9IDApIHsKKwkJUEpfTE9HKDMsKFRISVNfRklMRSwgIkludmFsaWQgLS13aW5kb3cgJXMiLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSAnVCc6CisJICAgIGFwcC51c2VfdGNwID0gUEpfVFJVRTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgICAgYXBwLnNlcnZlci5kZWxheSA9IG15X2F0b2kocGpfb3B0YXJnKTsKKwkgICAgaWYgKGFwcC5zZXJ2ZXIuZGVsYXkgPiAzNjAwKSB7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsICJJIHRoaW5rIC0tZGVsYXkgJXMgaXMgdG9vIGxvbmciLCAKKwkJCSAgcGpfb3B0YXJnKSk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX1RSWUlORzoKKwkgICAgYXBwLnNlcnZlci5zZW5kX3RyeWluZyA9IDE7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUklOR0lORzoKKwkgICAgYXBwLnNlcnZlci5zZW5kX3JpbmdpbmcgPSAxOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIFBKX0xPRygxLChUSElTX0ZJTEUsIAorCQkgICAgICAiSW52YWxpZCBhcmd1bWVudC4gVXNlIC0taGVscCB0byBzZWUgaGVscCIpKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICBpZiAocGpfb3B0aW5kICE9IGFyZ2MpIHsKKworCWlmICh2ZXJpZnlfc2lwX3VybChhcmd2W3BqX29wdGluZF0pICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIkludmFsaWQgU0lQIFVSSSAlcyIsIGFyZ3ZbcGpfb3B0aW5kXSkpOworCSAgICByZXR1cm4gLTE7CisJfQorCWFwcC5jbGllbnQuZHN0X3VyaSA9IHBqX3N0cihhcmd2W3BqX29wdGluZF0pOworCQorCXBqX29wdGluZCsrOworCisgICAgfQorCisgICAgaWYgKHBqX29wdGluZCAhPSBhcmdjKSB7CisJUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiB1bmtub3duIG9wdGlvbnMgJXMiLCBhcmd2W3BqX29wdGluZF0pKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogU2VuZCBvbmUgc3RhdGVsZXNzIHJlcXVlc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdWJtaXRfc3RhdGVsZXNzX2pvYih2b2lkKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXF1ZXN0KGFwcC5zaXBfZW5kcHQsICZhcHAuY2xpZW50Lm1ldGhvZCwgCisJCQkJCSZhcHAuY2xpZW50LmRzdF91cmksICZhcHAubG9jYWxfdXJpLAorCQkJCQkmYXBwLmNsaWVudC5kc3RfdXJpLCAmYXBwLmxvY2FsX2NvbnRhY3QsCisJCQkJCU5VTEwsIC0xLCBOVUxMLCAmdGRhdGEpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgY3JlYXRpbmcgcmVxdWVzdCIsIHN0YXR1cyk7CisJcmVwb3J0X2NvbXBsZXRpb24oNzAxKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3NlbmRfcmVxdWVzdF9zdGF0ZWxlc3MoYXBwLnNpcF9lbmRwdCwgdGRhdGEsIE5VTEwsCisJCQkJCQlOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwanNpcF90eF9kYXRhX2RlY19yZWYodGRhdGEpOworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igc2VuZGluZyBzdGF0ZWxlc3MgcmVxdWVzdCIsIHN0YXR1cyk7CisJcmVwb3J0X2NvbXBsZXRpb24oNzAxKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gY2xpZW50IHRyYW5zYWN0aW9uIHN0YXRlIGhhcyBjaGFuZ2VkICovCitzdGF0aWMgdm9pZCB0c3hfY29tcGxldGlvbl9jYih2b2lkICp0b2tlbiwgcGpzaXBfZXZlbnQgKmV2ZW50KQoreworICAgIHBqc2lwX3RyYW5zYWN0aW9uICp0c3g7CisKKyAgICBQSl9VTlVTRURfQVJHKHRva2VuKTsKKworICAgIGlmIChldmVudC0+dHlwZSAhPSBQSlNJUF9FVkVOVF9UU1hfU1RBVEUpCisJcmV0dXJuOworCisgICAgdHN4ID0gZXZlbnQtPmJvZHkudHN4X3N0YXRlLnRzeDsKKworICAgIGlmICh0c3gtPm1vZF9kYXRhW21vZF90ZXN0LmlkXSAhPSBOVUxMKSB7CisJLyogVGhpcyB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjYWxjdWxhdGVkIGJlZm9yZSAqLworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAodHN4LT5zdGF0ZT09UEpTSVBfVFNYX1NUQVRFX1RFUk1JTkFURUQpIHsKKwlyZXBvcnRfY29tcGxldGlvbih0c3gtPnN0YXR1c19jb2RlKTsKKwl0c3gtPm1vZF9kYXRhW21vZF90ZXN0LmlkXSA9ICh2b2lkKikocGpfc3NpemVfdCkxOworICAgIH0KKyAgICBlbHNlIGlmICh0c3gtPm1ldGhvZC5pZCA9PSBQSlNJUF9JTlZJVEVfTUVUSE9EICYmCisJICAgICB0c3gtPnN0YXRlID09IFBKU0lQX1RTWF9TVEFURV9DT05GSVJNRUQpIHsKKworCXJlcG9ydF9jb21wbGV0aW9uKHRzeC0+c3RhdHVzX2NvZGUpOworCXRzeC0+bW9kX2RhdGFbbW9kX3Rlc3QuaWRdID0gKHZvaWQqKShwal9zc2l6ZV90KTE7CisJCisgICAgfSBlbHNlIGlmICh0c3gtPnN0YXRlID09IFBKU0lQX1RTWF9TVEFURV9DT01QTEVURUQpIHsKKworCXJlcG9ydF9jb21wbGV0aW9uKHRzeC0+c3RhdHVzX2NvZGUpOworCXRzeC0+bW9kX2RhdGFbbW9kX3Rlc3QuaWRdID0gKHZvaWQqKShwal9zc2l6ZV90KTE7CisKKwlURVJNSU5BVEVfVFNYKHRzeCwgdHN4LT5zdGF0dXNfY29kZSk7CisgICAgfQorfQorCisKKy8qIFNlbmQgb25lIHN0YXRlZnVsIHJlcXVlc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzdWJtaXRfam9iKHZvaWQpCit7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfY3JlYXRlX3JlcXVlc3QoYXBwLnNpcF9lbmRwdCwgJmFwcC5jbGllbnQubWV0aG9kLCAKKwkJCQkJJmFwcC5jbGllbnQuZHN0X3VyaSwgJmFwcC5sb2NhbF91cmksCisJCQkJCSZhcHAuY2xpZW50LmRzdF91cmksICZhcHAubG9jYWxfY29udGFjdCwKKwkJCQkJTlVMTCwgLTEsIE5VTEwsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjcmVhdGluZyByZXF1ZXN0Iiwgc3RhdHVzKTsKKwlyZXBvcnRfY29tcGxldGlvbig3MDEpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfc2VuZF9yZXF1ZXN0KGFwcC5zaXBfZW5kcHQsIHRkYXRhLCAtMSwgTlVMTCwgCisJCQkJICAgICAgJnRzeF9jb21wbGV0aW9uX2NiKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIHNlbmRpbmcgc3RhdGVmdWwgcmVxdWVzdCIsIHN0YXR1cyk7CisJLy9zaG91bGQgaGF2ZSBiZWVuIHJlcG9ydGVkIGJ5IHRzeF9jb21wbGV0aW9uX2NiKCkuCisJLy9yZXBvcnRfY29tcGxldGlvbig3MDEpOworCS8vTm8gbG9uZ2VyIG5lY2Vzc2FyeSAocjc3NykKKwkvL3Bqc2lwX3R4X2RhdGFfZGVjX3JlZih0ZGF0YSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogQ2xpZW50IHdvcmtlciB0aHJlYWQgKi8KK3N0YXRpYyBpbnQgY2xpZW50X3RocmVhZCh2b2lkICphcmcpCit7CisgICAgcGpfdGltZV92YWwgZW5kX3RpbWUsIGxhc3RfcmVwb3J0LCBub3c7CisgICAgdW5zaWduZWQgdGhyZWFkX2luZGV4ID0gKHVuc2lnbmVkKShsb25nKShwal9zc2l6ZV90KWFyZzsKKyAgICB1bnNpZ25lZCBjeWNsZSA9IDAsIGxhc3RfY3ljbGUgPSAwOworCisgICAgcGpfdGhyZWFkX3NsZWVwKDEwMCk7CisKKyAgICBwal9nZXR0aW1lb2ZkYXkoJmVuZF90aW1lKTsKKyAgICBlbmRfdGltZS5zZWMgKz0gYXBwLmNsaWVudC50aW1lb3V0OworCisgICAgcGpfZ2V0dGltZW9mZGF5KCZsYXN0X3JlcG9ydCk7CisKKyAgICBpZiAoYXBwLmNsaWVudC5maXJzdF9yZXF1ZXN0LnNlYyA9PSAwKSB7CisJcGpfZ2V0dGltZW9mZGF5KCZhcHAuY2xpZW50LmZpcnN0X3JlcXVlc3QpOworICAgIH0KKworICAgIC8qIFN1Ym1pdCBhbGwgam9icyAqLworICAgIHdoaWxlIChhcHAuY2xpZW50LmpvYl9zdWJtaXR0ZWQgPCBhcHAuY2xpZW50LmpvYl9jb3VudCAmJiAhYXBwLnRocmVhZF9xdWl0KXsKKwlwal90aW1lX3ZhbCB0aW1lb3V0ID0geyAwLCAxIH07CisJdW5zaWduZWQgaTsKKwlpbnQgb3V0c3RhbmRpbmc7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJLyogQ2FsY3VsYXRlIGN1cnJlbnQgb3V0c3RhbmRpbmcgam9iICovCisJb3V0c3RhbmRpbmcgPSBhcHAuY2xpZW50LmpvYl9zdWJtaXR0ZWQgLSBhcHAuY2xpZW50LmpvYl9maW5pc2hlZDsKKworCS8qIFVwZGF0ZSBzdGF0cyBvbiBtYXggb3V0c3RhbmRpbmcgam9icyAqLworCWlmIChvdXRzdGFuZGluZyA+IChpbnQpYXBwLmNsaWVudC5zdGF0X21heF93aW5kb3cpCisJICAgIGFwcC5jbGllbnQuc3RhdF9tYXhfd2luZG93ID0gb3V0c3RhbmRpbmc7CisKKwkvKiBXYWl0IGlmIHRoZXJlIGFyZSBtb3JlIHBlbmRpbmcgam9icyB0aGFuIGFsbG93ZWQgaW4gdGhlCisJICogd2luZG93LiBCdXQgc3Bhd24gYSBuZXcgam9iIGFueXdheSBpZiBubyBldmVudHMgYXJlIGhhcHBlbmluZworCSAqIGFmdGVyIHdlIHdhaXQgZm9yIHNvbWUgdGltZS4KKwkgKi8KKwlmb3IgKGk9MDsgb3V0c3RhbmRpbmcgPiAoaW50KWFwcC5jbGllbnQuam9iX3dpbmRvdyAmJiBpPDEwMDA7ICsraSkgeworCSAgICBwal90aW1lX3ZhbCB3YWl0ID0geyAwLCA1MDAgfTsKKwkgICAgdW5zaWduZWQgY291bnQgPSAwOworCisJICAgIHBqc2lwX2VuZHB0X2hhbmRsZV9ldmVudHMyKGFwcC5zaXBfZW5kcHQsICZ3YWl0LCAmY291bnQpOworCSAgICBvdXRzdGFuZGluZyA9IGFwcC5jbGllbnQuam9iX3N1Ym1pdHRlZCAtIGFwcC5jbGllbnQuam9iX2ZpbmlzaGVkOworCisJICAgIGlmIChjb3VudCA9PSAwKQorCQlicmVhazsKKworCSAgICArK2N5Y2xlOworCX0KKworCisJLyogU3VibWl0IG9uZSBqb2IgKi8KKwlpZiAoYXBwLmNsaWVudC5tZXRob2QuaWQgPT0gUEpTSVBfSU5WSVRFX01FVEhPRCkgeworCSAgICBzdGF0dXMgPSBtYWtlX2NhbGwoJmFwcC5jbGllbnQuZHN0X3VyaSk7CisJfSBlbHNlIGlmIChhcHAuY2xpZW50LnN0YXRlbGVzcykgeworCSAgICBzdGF0dXMgPSBzdWJtaXRfc3RhdGVsZXNzX2pvYigpOworCX0gZWxzZSB7CisJICAgIHN0YXR1cyA9IHN1Ym1pdF9qb2IoKTsKKwl9CisKKwkrK2FwcC5jbGllbnQuam9iX3N1Ym1pdHRlZDsKKwkrK2N5Y2xlOworCisJLyogSGFuZGxlIGV2ZW50ICovCisJcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50czIoYXBwLnNpcF9lbmRwdCwgJnRpbWVvdXQsIE5VTEwpOworCisJLyogQ2hlY2sgZm9yIHRpbWUgb3V0LCBhbHNvIHByaW50IHJlcG9ydCAqLworCWlmIChjeWNsZSAtIGxhc3RfY3ljbGUgPj0gNTAwKSB7CisJICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKwkgICAgaWYgKFBKX1RJTUVfVkFMX0dURShub3csIGVuZF90aW1lKSkgeworCQlicmVhazsKKwkgICAgfQorCSAgICBsYXN0X2N5Y2xlID0gY3ljbGU7CisKKwkgICAgCisJICAgIGlmICh0aHJlYWRfaW5kZXggPT0gMCAmJiBub3cuc2VjLWxhc3RfcmVwb3J0LnNlYyA+PSAyKSB7CisJCXByaW50ZigiXHIlZCBqb2JzIHN0YXJ0ZWQsICVkIGNvbXBsZXRlZC4uLiAgICIsCisJCSAgICAgICBhcHAuY2xpZW50LmpvYl9zdWJtaXR0ZWQsIGFwcC5jbGllbnQuam9iX2ZpbmlzaGVkKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWxhc3RfcmVwb3J0ID0gbm93OworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChhcHAuY2xpZW50LnJlcXVlc3RzX3NlbnQuc2VjID09IDApIHsKKwlwal9nZXR0aW1lb2ZkYXkoJmFwcC5jbGllbnQucmVxdWVzdHNfc2VudCk7CisgICAgfQorCisKKyAgICBpZiAodGhyZWFkX2luZGV4ID09IDApIHsKKwlwcmludGYoIlxyJWQgam9icyBzdGFydGVkLCAlZCBjb21wbGV0ZWQlc1xuIiwKKwkgICAgICAgYXBwLmNsaWVudC5qb2Jfc3VibWl0dGVkLCBhcHAuY2xpZW50LmpvYl9maW5pc2hlZCwKKwkgICAgICAgKGFwcC5jbGllbnQuam9iX3N1Ym1pdHRlZCE9YXBwLmNsaWVudC5qb2JfZmluaXNoZWQgPyAKKwkJIiwgd2FpdGluZy4uLiIgOiAiLiIpICk7CisJZmZsdXNoKHN0ZG91dCk7CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBhbGwgam9icyBjb21wbGV0ZXMsIG9yIHRpbWVkIG91dCAqLworICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKyAgICB3aGlsZSAoUEpfVElNRV9WQUxfTFQobm93LCBlbmRfdGltZSkgJiYgCisJICAgYXBwLmNsaWVudC5qb2JfZmluaXNoZWQgPCBhcHAuY2xpZW50LmpvYl9jb3VudCAmJiAKKwkgICAhYXBwLnRocmVhZF9xdWl0KSAKKyAgICB7CisJcGpfdGltZV92YWwgdGltZW91dCA9IHsgMCwgMSB9OworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGk9MDsgaTwxMDAwOyArK2kpIHsKKwkgICAgdW5zaWduZWQgY291bnQ7CisJICAgIGNvdW50ID0gMDsKKwkgICAgcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50czIoYXBwLnNpcF9lbmRwdCwgJnRpbWVvdXQsICZjb3VudCk7CisJICAgIGlmIChjb3VudCA9PSAwKQorCQlicmVhazsKKwl9CisKKwlwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisgICAgfQorCisgICAgLyogV2FpdCBjb3VwbGUgb2Ygc2Vjb25kcyB0byBsZXQgam9icyBjb21wbGV0ZXMgKGUuZy4gQUNLcyB0byBiZSBzZW50KSAgKi8KKyAgICBwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisgICAgZW5kX3RpbWUgPSBub3c7CisgICAgZW5kX3RpbWUuc2VjICs9IDI7CisgICAgd2hpbGUgKFBKX1RJTUVfVkFMX0xUKG5vdywgZW5kX3RpbWUpKSAKKyAgICB7CisJcGpfdGltZV92YWwgdGltZW91dCA9IHsgMCwgMSB9OworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGk9MDsgaTwxMDAwOyArK2kpIHsKKwkgICAgdW5zaWduZWQgY291bnQ7CisJICAgIGNvdW50ID0gMDsKKwkgICAgcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50czIoYXBwLnNpcF9lbmRwdCwgJnRpbWVvdXQsICZjb3VudCk7CisJICAgIGlmIChjb3VudCA9PSAwKQorCQlicmVhazsKKwl9CisKKwlwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdvb2RfbnVtYmVyKGNoYXIgKmJ1ZiwgcGpfaW50MzJfdCB2YWwpCit7CisgICAgaWYgKHZhbCA8IDEwMDApIHsKKwlwal9hbnNpX3NwcmludGYoYnVmLCAiJWQiLCB2YWwpOworICAgIH0gZWxzZSBpZiAodmFsIDwgMTAwMDAwMCkgeworCXBqX2Fuc2lfc3ByaW50ZihidWYsICIlZC4lZEsiLCAKKwkJCXZhbCAvIDEwMDAsCisJCQkodmFsICUgMTAwMCkgLyAxMDApOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zcHJpbnRmKGJ1ZiwgIiVkLiUwMmRNIiwgCisJCQl2YWwgLyAxMDAwMDAwLAorCQkJKHZhbCAlIDEwMDAwMDApIC8gMTAwMDApOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIGludCBzZXJ2ZXJfdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBwal90aW1lX3ZhbCB0aW1lb3V0ID0geyAwLCAxIH07CisgICAgdW5zaWduZWQgdGhyZWFkX2luZGV4ID0gKHVuc2lnbmVkKShsb25nKShwal9zc2l6ZV90KWFyZzsKKyAgICBwal90aW1lX3ZhbCBsYXN0X3JlcG9ydCwgbmV4dF9yZXBvcnQ7CisKKyAgICBwal9nZXR0aW1lb2ZkYXkoJmxhc3RfcmVwb3J0KTsKKyAgICBuZXh0X3JlcG9ydCA9IGxhc3RfcmVwb3J0OworICAgIG5leHRfcmVwb3J0LnNlYysrOworCisgICAgd2hpbGUgKCFhcHAudGhyZWFkX3F1aXQpIHsKKwlwal90aW1lX3ZhbCBub3c7CisJdW5zaWduZWQgaTsKKworCWZvciAoaT0wOyBpPDEwMDsgKytpKSB7CisJICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKwkgICAgcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50czIoYXBwLnNpcF9lbmRwdCwgJnRpbWVvdXQsICZjb3VudCk7CisJICAgIGlmIChjb3VudCA9PSAwKQorCQlicmVhazsKKwl9CisKKwlpZiAodGhyZWFkX2luZGV4ID09IDApIHsKKwkgICAgcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCisJICAgIGlmIChQSl9USU1FX1ZBTF9HVEUobm93LCBuZXh0X3JlcG9ydCkpIHsKKwkJcGpfdGltZV92YWwgdG1wOworCQl1bnNpZ25lZCBtc2VjOworCQl1bnNpZ25lZCBzdGF0ZWxlc3MsIHN0YXRlZnVsLCBjYWxsOworCQljaGFyIHN0cl9zdGF0ZWxlc3NbMzJdLCBzdHJfc3RhdGVmdWxbMzJdLCBzdHJfY2FsbFszMl07CisKKwkJdG1wID0gbm93OworCQlQSl9USU1FX1ZBTF9TVUIodG1wLCBsYXN0X3JlcG9ydCk7CisJCW1zZWMgPSBQSl9USU1FX1ZBTF9NU0VDKHRtcCk7CisKKwkJbGFzdF9yZXBvcnQgPSBub3c7CisJCW5leHRfcmVwb3J0ID0gbGFzdF9yZXBvcnQ7CisJCW5leHRfcmVwb3J0LnNlYysrOworCisJCXN0YXRlbGVzcyA9IGFwcC5zZXJ2ZXIuY3VyX3N0YXRlLnN0YXRlbGVzc19jbnQgLSBhcHAuc2VydmVyLnByZXZfc3RhdGUuc3RhdGVsZXNzX2NudDsKKwkJc3RhdGVmdWwgPSBhcHAuc2VydmVyLmN1cl9zdGF0ZS5zdGF0ZWZ1bF9jbnQgLSBhcHAuc2VydmVyLnByZXZfc3RhdGUuc3RhdGVmdWxfY250OworCQljYWxsID0gYXBwLnNlcnZlci5jdXJfc3RhdGUuY2FsbF9jbnQgLSBhcHAuc2VydmVyLnByZXZfc3RhdGUuY2FsbF9jbnQ7CisKKwkJZ29vZF9udW1iZXIoc3RyX3N0YXRlbGVzcywgYXBwLnNlcnZlci5jdXJfc3RhdGUuc3RhdGVsZXNzX2NudCk7CisJCWdvb2RfbnVtYmVyKHN0cl9zdGF0ZWZ1bCwgYXBwLnNlcnZlci5jdXJfc3RhdGUuc3RhdGVmdWxfY250KTsKKwkJZ29vZF9udW1iZXIoc3RyX2NhbGwsIGFwcC5zZXJ2ZXIuY3VyX3N0YXRlLmNhbGxfY250KTsKKworCQlwcmludGYoIlRvdGFsKHJhdGUpOiBzdGF0ZWxlc3M6JXMgKCVkL3MpLCBzdGF0ZWZ1bGw6JXMgKCVkL3MpLCBjYWxsOiVzICglZC9zKSAgICAgICBcciIsCisJCSAgICAgICBzdHJfc3RhdGVsZXNzLCBzdGF0ZWxlc3MqMTAwMC9tc2VjLAorCQkgICAgICAgc3RyX3N0YXRlZnVsLCBzdGF0ZWZ1bCoxMDAwL21zZWMsCisJCSAgICAgICBzdHJfY2FsbCwgY2FsbCoxMDAwL21zZWMpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQlhcHAuc2VydmVyLnByZXZfc3RhdGUgPSBhcHAuc2VydmVyLmN1cl9zdGF0ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcmVwb3J0KGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBwdXRzKG1zZyk7CisKKyNpZiAoZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTApIHx8IChkZWZpbmVkKFBKX1dJTjY0KSAmJiBQSl9XSU42NCE9MCkKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhtc2cpOworICAgIE91dHB1dERlYnVnU3RyaW5nKCJcbiIpOworI2VuZGlmCit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBzdGF0aWMgY2hhciByZXBvcnRbMTAyNF07CisKKyAgICBwcmludGYoIlBKU0lQIFBlcmZvcm1hbmNlIE1lYXN1cmVtZW50IFRvb2wgdiVzXG4iCisgICAgICAgICAgICIoYykyMDA2IHBqc2lwLm9yZ1xuXG4iLAorCSAgIFBKX1ZFUlNJT04pOworCisgICAgaWYgKGNyZWF0ZV9hcHAoKSAhPSAwKQorCXJldHVybiAxOworCisgICAgaWYgKGluaXRfb3B0aW9ucyhhcmdjLCBhcmd2KSAhPSAwKQorCXJldHVybiAxOworCisgICAgaWYgKGluaXRfc2lwKCkgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIGlmIChpbml0X21lZGlhKCkgIT0gMCkKKwlyZXR1cm4gMTsKKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoYXBwLmxvZ19sZXZlbCk7CisKKyAgICBpZiAoYXBwLmxvZ19sZXZlbCA+IDQpIHsKKwlwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoYXBwLnNpcF9lbmRwdCwgJm1zZ19sb2dnZXIpOworICAgIH0KKworCisgICAgLyogTWlzYyBpbmZvcyAqLworICAgIGlmIChhcHAuY2xpZW50LmRzdF91cmkuc2xlbiAhPSAwKSB7CisJaWYgKGFwcC5jbGllbnQubWV0aG9kLmlkID09IFBKU0lQX0lOVklURV9NRVRIT0QpIHsKKwkgICAgaWYgKGFwcC5jbGllbnQuc3RhdGVsZXNzKSB7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsIAorCQkJICAiSW5mbzogLS1zdGF0ZWxlc3Mgb3B0aW9uIG1ha2VzIG5vIHNlbnNlIGZvciBJTlZJVEUsIgorCQkJICAiIGlnbm9yZWQuIikpOworCSAgICB9CisJfQorCisgICAgfQorCisKKworICAgIGlmIChhcHAuY2xpZW50LmRzdF91cmkuc2xlbikgeworCS8qIENsaWVudCBtb2RlICovCisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCWNoYXIgdGVzdF90eXBlWzY0XTsKKwl1bnNpZ25lZCBtc2VjX3JlcSwgbXNlY19yZXM7CisJdW5zaWduZWQgaTsKKworCS8qIEdldCB0aGUgam9iIG5hbWUgKi8KKwlpZiAoYXBwLmNsaWVudC5tZXRob2QuaWQgPT0gUEpTSVBfSU5WSVRFX01FVEhPRCkgeworCSAgICBwal9hbnNpX3N0cmNweSh0ZXN0X3R5cGUsICJJTlZJVEUgY2FsbHMiKTsKKwl9IGVsc2UgaWYgKGFwcC5jbGllbnQuc3RhdGVsZXNzKSB7CisJICAgIHBqX2Fuc2lfc3ByaW50Zih0ZXN0X3R5cGUsICJzdGF0ZWxlc3MgJS4qcyByZXF1ZXN0cyIsCisJCQkgICAgKGludClhcHAuY2xpZW50Lm1ldGhvZC5uYW1lLnNsZW4sCisJCQkgICAgYXBwLmNsaWVudC5tZXRob2QubmFtZS5wdHIpOworCX0gZWxzZSB7CisJICAgIHBqX2Fuc2lfc3ByaW50Zih0ZXN0X3R5cGUsICJzdGF0ZWZ1bCAlLipzIHJlcXVlc3RzIiwKKwkJCSAgICAoaW50KWFwcC5jbGllbnQubWV0aG9kLm5hbWUuc2xlbiwKKwkJCSAgICBhcHAuY2xpZW50Lm1ldGhvZC5uYW1lLnB0cik7CisJfQorCQorCisJcHJpbnRmKCJTZW5kaW5nICVkICVzIHRvICclLipzJyB3aXRoICVkIG1heGltdW0gb3V0c3RhbmRpbmcgam9icywgcGxlYXNlIHdhaXQuLlxuIiwgCisJCSAgYXBwLmNsaWVudC5qb2JfY291bnQsIHRlc3RfdHlwZSwKKwkJICAoaW50KWFwcC5jbGllbnQuZHN0X3VyaS5zbGVuLCBhcHAuY2xpZW50LmRzdF91cmkucHRyLAorCQkgIGFwcC5jbGllbnQuam9iX3dpbmRvdyk7CisKKwlmb3IgKGk9MDsgaTxhcHAudGhyZWFkX2NvdW50OyArK2kpIHsKKwkgICAgc3RhdHVzID0gcGpfdGhyZWFkX2NyZWF0ZShhcHAucG9vbCwgTlVMTCwgJmNsaWVudF90aHJlYWQsIAorCQkJCSAgICAgICh2b2lkKikocGpfc3NpemVfdClpLCAwLCAwLCAKKwkJCQkgICAgICAmYXBwLnRocmVhZFtpXSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBjcmVhdGUgdGhyZWFkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwl9CisKKwlmb3IgKGk9MDsgaTxhcHAudGhyZWFkX2NvdW50OyArK2kpIHsKKwkgICAgcGpfdGhyZWFkX2pvaW4oYXBwLnRocmVhZFtpXSk7CisJICAgIGFwcC50aHJlYWRbaV0gPSBOVUxMOworCX0KKworCWlmIChhcHAuY2xpZW50Lmxhc3RfY29tcGxldGlvbi5zZWMpIHsKKwkgICAgcGpfdGltZV92YWwgZHVyYXRpb247CisJICAgIGR1cmF0aW9uID0gYXBwLmNsaWVudC5sYXN0X2NvbXBsZXRpb247CisJICAgIFBKX1RJTUVfVkFMX1NVQihkdXJhdGlvbiwgYXBwLmNsaWVudC5maXJzdF9yZXF1ZXN0KTsKKwkgICAgbXNlY19yZXMgPSBQSl9USU1FX1ZBTF9NU0VDKGR1cmF0aW9uKTsKKwl9IGVsc2UgeworCSAgICBtc2VjX3JlcyA9IGFwcC5jbGllbnQudGltZW91dCAqIDEwMDA7CisJfQorCisJaWYgKG1zZWNfcmVzID09IDApIG1zZWNfcmVzID0gMTsKKworCWlmIChhcHAuY2xpZW50LnJlcXVlc3RzX3NlbnQuc2VjKSB7CisJICAgIHBqX3RpbWVfdmFsIGR1cmF0aW9uOworCSAgICBkdXJhdGlvbiA9IGFwcC5jbGllbnQucmVxdWVzdHNfc2VudDsKKwkgICAgUEpfVElNRV9WQUxfU1VCKGR1cmF0aW9uLCBhcHAuY2xpZW50LmZpcnN0X3JlcXVlc3QpOworCSAgICBtc2VjX3JlcSA9IFBKX1RJTUVfVkFMX01TRUMoZHVyYXRpb24pOworCX0gZWxzZSB7CisJICAgIG1zZWNfcmVxID0gYXBwLmNsaWVudC50aW1lb3V0ICogMTAwMDsKKwl9CisKKwlpZiAobXNlY19yZXEgPT0gMCkgbXNlY19yZXEgPSAxOworCisJaWYgKGFwcC5jbGllbnQuam9iX3N1Ym1pdHRlZCA8IGFwcC5jbGllbnQuam9iX2NvdW50KQorCSAgICBwdXRzKCJcbnRpbWVkLW91dCFcbiIpOworCWVsc2UKKwkgICAgcHV0cygiXG5kb25lLlxuIik7CisKKwlwal9hbnNpX3NucHJpbnRmKAorCSAgICByZXBvcnQsIHNpemVvZihyZXBvcnQpLAorCSAgICAiVG90YWwgJWQgJXMgc2VudCBpbiAlZCBtcyBhdCByYXRlIG9mICVkL3NlY1xuIgorCSAgICAiVG90YWwgJWQgcmVzcG9uc2VzIHJlY2VpZXZlZCBpbiAlZCBtcyBhdCByYXRlIG9mICVkL3NlYzoiLAorCSAgICBhcHAuY2xpZW50LmpvYl9zdWJtaXR0ZWQsIHRlc3RfdHlwZSwgbXNlY19yZXEsIAorCSAgICBhcHAuY2xpZW50LmpvYl9zdWJtaXR0ZWQgKiAxMDAwIC8gbXNlY19yZXEsCisJICAgIGFwcC5jbGllbnQudG90YWxfcmVzcG9uc2VzLCBtc2VjX3JlcywKKwkgICAgYXBwLmNsaWVudC50b3RhbF9yZXNwb25zZXMqMTAwMC9tc2VjX3Jlcyk7CisJd3JpdGVfcmVwb3J0KHJlcG9ydCk7CisKKwkvKiBQcmludCBkZXRhaWxlZCByZXNwb25zZSBjb2RlIHJlY2VpdmVkICovCisJcGpfYW5zaV9zcHJpbnRmKHJlcG9ydCwgIlxuRGV0YWlsZWQgcmVzcG9uc2VzIHJlY2VpdmVkOiIpOworCXdyaXRlX3JlcG9ydChyZXBvcnQpOworCisJZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShhcHAuY2xpZW50LnJlc3BvbnNlX2NvZGVzKTsgKytpKSB7CisJICAgIGNvbnN0IHBqX3N0cl90ICpyZWFzb247CisKKwkgICAgaWYgKGFwcC5jbGllbnQucmVzcG9uc2VfY29kZXNbaV0gPT0gMCkKKwkJY29udGludWU7CisKKwkgICAgcmVhc29uID0gcGpzaXBfZ2V0X3N0YXR1c190ZXh0KGkpOworCSAgICBwal9hbnNpX3NucHJpbnRmKCByZXBvcnQsIHNpemVvZihyZXBvcnQpLAorCQkJICAgICAgIiAtICVkIHJlc3BvbnNlczogICU3ZCAgICAgKCUuKnMpIiwKKwkJCSAgICAgIGksIGFwcC5jbGllbnQucmVzcG9uc2VfY29kZXNbaV0sCisJCQkgICAgICAoaW50KXJlYXNvbi0+c2xlbiwgcmVhc29uLT5wdHIpOworCSAgICB3cml0ZV9yZXBvcnQocmVwb3J0KTsKKwl9CisKKwkvKiBUb3RhbCByZXNwb25zZXMgYW5kIHJhdGUgKi8KKwlwal9hbnNpX3NucHJpbnRmKCByZXBvcnQsIHNpemVvZihyZXBvcnQpLAorCSAgICAiICAgICAgICAgICAgICAgICAgICAtLS0tLS1cbiIKKwkgICAgIiBUT1RBTCByZXNwb25zZXM6ICAlN2QgKHJhdGU9JWQvc2VjKVxuIiwKKwkgICAgYXBwLmNsaWVudC50b3RhbF9yZXNwb25zZXMsIAorCSAgICBhcHAuY2xpZW50LnRvdGFsX3Jlc3BvbnNlcyoxMDAwL21zZWNfcmVzKTsKKworCXdyaXRlX3JlcG9ydChyZXBvcnQpOworCisJcGpfYW5zaV9zcHJpbnRmKHJlcG9ydCwgIk1heGltdW0gb3V0c3RhbmRpbmcgam9iOiAlZCIsIAorCQkJYXBwLmNsaWVudC5zdGF0X21heF93aW5kb3cpOworCXdyaXRlX3JlcG9ydChyZXBvcnQpOworCisKKyAgICB9IGVsc2UgeworCS8qIFNlcnZlciBtb2RlICovCisJY2hhciBzWzEwXSwgKnVudXNlZDsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgaTsKKworCXB1dHMoInBqc2lwLXBlcmYgc3RhcnRlZCBpbiBzZXJ2ZXItbW9kZSIpOworCisJcHJpbnRmKCJSZWNlaXZpbmcgcmVxdWVzdHMgb24gdGhlIGZvbGxvd2luZyBVUklzOlxuIgorCSAgICAgICAiICBzaXA6MEAlLipzOiVkJXMgICAgZm9yIHN0YXRlbGVzcyBoYW5kbGluZ1xuIgorCSAgICAgICAiICBzaXA6MUAlLipzOiVkJXMgICAgZm9yIHN0YXRlZnVsIGhhbmRsaW5nXG4iCisJICAgICAgICIgIHNpcDoyQCUuKnM6JWQlcyAgICBmb3IgY2FsbCBoYW5kbGluZ1xuIiwKKwkgICAgICAgKGludClhcHAubG9jYWxfYWRkci5zbGVuLAorCSAgICAgICBhcHAubG9jYWxfYWRkci5wdHIsCisJICAgICAgIGFwcC5sb2NhbF9wb3J0LAorCSAgICAgICAoYXBwLnVzZV90Y3AgPyAiO3RyYW5zcG9ydD10Y3AiIDogIiIpLAorCSAgICAgICAoaW50KWFwcC5sb2NhbF9hZGRyLnNsZW4sCisJICAgICAgIGFwcC5sb2NhbF9hZGRyLnB0ciwKKwkgICAgICAgYXBwLmxvY2FsX3BvcnQsCisJICAgICAgIChhcHAudXNlX3RjcCA/ICI7dHJhbnNwb3J0PXRjcCIgOiAiIiksCisJICAgICAgIChpbnQpYXBwLmxvY2FsX2FkZHIuc2xlbiwKKwkgICAgICAgYXBwLmxvY2FsX2FkZHIucHRyLAorCSAgICAgICBhcHAubG9jYWxfcG9ydCwKKwkgICAgICAgKGFwcC51c2VfdGNwID8gIjt0cmFuc3BvcnQ9dGNwIiA6ICIiKSk7CisJcHJpbnRmKCJJTlZJVEUgd2l0aCBub24tbWF0Y2hpbmcgdXNlciBwYXJ0IHdpbGwgYmUgaGFuZGxlZCBjYWxsLXN0YXRlZnVsbHlcbiIpOworCisJZm9yIChpPTA7IGk8YXBwLnRocmVhZF9jb3VudDsgKytpKSB7CisJICAgIHN0YXR1cyA9IHBqX3RocmVhZF9jcmVhdGUoYXBwLnBvb2wsIE5VTEwsICZzZXJ2ZXJfdGhyZWFkLCAKKwkJCQkgICAgICAodm9pZCopKHBqX3NzaXplX3QpaSwgMCwgMCwgCisJCQkJICAgICAgJmFwcC50aHJlYWRbaV0pOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIHRocmVhZCIsIHN0YXR1cyk7CisJCXJldHVybiAxOworCSAgICB9CisJfQorCisJcHV0cygiXG5QcmVzcyA8RU5URVI+IHRvIHF1aXRcbiIpOworCWZmbHVzaChzdGRvdXQpOworCXVudXNlZCA9IGZnZXRzKHMsIHNpemVvZihzKSwgc3RkaW4pOworCVBKX1VOVVNFRF9BUkcodW51c2VkKTsKKworCWFwcC50aHJlYWRfcXVpdCA9IFBKX1RSVUU7CisJZm9yIChpPTA7IGk8YXBwLnRocmVhZF9jb3VudDsgKytpKSB7CisJICAgIHBqX3RocmVhZF9qb2luKGFwcC50aHJlYWRbaV0pOworCSAgICBhcHAudGhyZWFkW2ldID0gTlVMTDsKKwl9CisKKwlwdXRzKCIiKTsKKyAgICB9CisKKworICAgIGRlc3Ryb3lfYXBwKCk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wanN1YTJfZGVtby5jcHAgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3Bqc3VhMl9kZW1vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJiOGFkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wanN1YTJfZGVtby5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qICRJZDogcGpzdWEyX2RlbW8uY3BwIDQ3MDggMjAxNC0wMS0yMSAxMDo1OToyNVogbmFuYW5nICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxwanN1YTIuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxwai9maWxlX2FjY2Vzcy5oPgorCit1c2luZyBuYW1lc3BhY2UgcGo7CisKK2NsYXNzIE15QWNjb3VudDsKKworY2xhc3MgTXlDYWxsIDogcHVibGljIENhbGwKK3sKK3ByaXZhdGU6CisgICAgTXlBY2NvdW50ICpteUFjYzsKKworcHVibGljOgorICAgIE15Q2FsbChBY2NvdW50ICZhY2MsIGludCBjYWxsX2lkID0gUEpTVUFfSU5WQUxJRF9JRCkKKyAgICA6IENhbGwoYWNjLCBjYWxsX2lkKQorICAgIHsKKyAgICAgICAgbXlBY2MgPSAoTXlBY2NvdW50ICopJmFjYzsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIG9uQ2FsbFN0YXRlKE9uQ2FsbFN0YXRlUGFyYW0gJnBybSk7Cit9OworCitjbGFzcyBNeUFjY291bnQgOiBwdWJsaWMgQWNjb3VudAoreworcHVibGljOgorICAgIHN0ZDo6dmVjdG9yPENhbGwgKj4gY2FsbHM7CisgICAgCitwdWJsaWM6CisgICAgTXlBY2NvdW50KCkKKyAgICB7fQorCisgICAgfk15QWNjb3VudCgpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIioqKiBBY2NvdW50IGlzIGJlaW5nIGRlbGV0ZWQ6IE5vIG9mIGNhbGxzPSIKKyAgICAgICAgICAgICAgICAgIDw8IGNhbGxzLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVtb3ZlQ2FsbChDYWxsICpjYWxsKQorICAgIHsKKyAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxDYWxsICo+OjppdGVyYXRvciBpdCA9IGNhbGxzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gY2FsbHMuZW5kKCk7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqaXQgPT0gY2FsbCkgeworICAgICAgICAgICAgICAgIGNhbGxzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblJlZ1N0YXRlKE9uUmVnU3RhdGVQYXJhbSAmcHJtKQorICAgIHsKKwlBY2NvdW50SW5mbyBhaSA9IGdldEluZm8oKTsKKwlzdGQ6OmNvdXQgPDwgKGFpLnJlZ0lzQWN0aXZlPyAiKioqIFJlZ2lzdGVyOiBjb2RlPSIgOiAiKioqIFVucmVnaXN0ZXI6IGNvZGU9IikKKwkJICA8PCBwcm0uY29kZSA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBvbkluY29taW5nQ2FsbChPbkluY29taW5nQ2FsbFBhcmFtICZpcHJtKQorICAgIHsKKyAgICAgICAgQ2FsbCAqY2FsbCA9IG5ldyBNeUNhbGwoKnRoaXMsIGlwcm0uY2FsbElkKTsKKyAgICAgICAgQ2FsbEluZm8gY2kgPSBjYWxsLT5nZXRJbmZvKCk7CisgICAgICAgIENhbGxPcFBhcmFtIHBybTsKKyAgICAgICAgCisgICAgICAgIHN0ZDo6Y291dCA8PCAiKioqIEluY29taW5nIENhbGw6ICIgPDwgIGNpLnJlbW90ZVVyaSA8PCAiIFsiCisgICAgICAgICAgICAgICAgICA8PCBjaS5zdGF0ZVRleHQgPDwgIl0iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgCisgICAgICAgIGNhbGxzLnB1c2hfYmFjayhjYWxsKTsKKyAgICAgICAgcHJtLnN0YXR1c0NvZGUgPSAocGpzaXBfc3RhdHVzX2NvZGUpMjAwOworICAgICAgICBjYWxsLT5hbnN3ZXIocHJtKTsKKyAgICB9Cit9OworCit2b2lkIE15Q2FsbDo6b25DYWxsU3RhdGUoT25DYWxsU3RhdGVQYXJhbSAmcHJtKQoreworICAgIFBKX1VOVVNFRF9BUkcocHJtKTsKKworICAgIENhbGxJbmZvIGNpID0gZ2V0SW5mbygpOworICAgIHN0ZDo6Y291dCA8PCAiKioqIENhbGw6ICIgPDwgIGNpLnJlbW90ZVVyaSA8PCAiIFsiIDw8IGNpLnN0YXRlVGV4dAorICAgICAgICAgICAgICA8PCAiXSIgPDwgc3RkOjplbmRsOworICAgIAorICAgIGlmIChjaS5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgIG15QWNjLT5yZW1vdmVDYWxsKHRoaXMpOworICAgICAgICAvKiBEZWxldGUgdGhlIGNhbGwgKi8KKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtYWluUHJvZzEoKSB0aHJvdyhFcnJvcikKK3sKKyAgICBFbmRwb2ludCBlcDsKKworICAgIC8vIENyZWF0ZSBsaWJyYXJ5CisgICAgZXAubGliQ3JlYXRlKCk7CisKKyAgICAvLyBJbml0IGxpYnJhcnkKKyAgICBFcENvbmZpZyBlcF9jZmc7CisgICAgZXBfY2ZnLmxvZ0NvbmZpZy5sZXZlbCA9IDQ7CisgICAgZXAubGliSW5pdCggZXBfY2ZnICk7CisKKyAgICAvLyBUcmFuc3BvcnQKKyAgICBUcmFuc3BvcnRDb25maWcgdGNmZzsKKyAgICB0Y2ZnLnBvcnQgPSA1MDYwOworICAgIGVwLnRyYW5zcG9ydENyZWF0ZShQSlNJUF9UUkFOU1BPUlRfVURQLCB0Y2ZnKTsKKworICAgIC8vIFN0YXJ0IGxpYnJhcnkKKyAgICBlcC5saWJTdGFydCgpOworICAgIHN0ZDo6Y291dCA8PCAiKioqIFBKU1VBMiBTVEFSVEVEICoqKiIgPDwgc3RkOjplbmRsOworCisgICAgLy8gQWRkIGFjY291bnQKKyAgICBBY2NvdW50Q29uZmlnIGFjY19jZmc7CisgICAgYWNjX2NmZy5pZFVyaSA9ICJzaXA6dGVzdDFAcGpzaXAub3JnIjsKKyAgICBhY2NfY2ZnLnJlZ0NvbmZpZy5yZWdpc3RyYXJVcmkgPSAic2lwOnBqc2lwLm9yZyI7CisgICAgYWNjX2NmZy5zaXBDb25maWcuYXV0aENyZWRzLnB1c2hfYmFjayggQXV0aENyZWRJbmZvKCJkaWdlc3QiLCAiKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0MSIsIDAsICJ0ZXN0MSIpICk7CisgICAgc3RkOjphdXRvX3B0cjxNeUFjY291bnQ+IGFjYyhuZXcgTXlBY2NvdW50KTsKKyAgICBhY2MtPmNyZWF0ZShhY2NfY2ZnKTsKKyAgICAKKyAgICBwal90aHJlYWRfc2xlZXAoMjAwMCk7CisgICAgCisgICAgLy8gTWFrZSBvdXRnb2luZyBjYWxsCisgICAgQ2FsbCAqY2FsbCA9IG5ldyBNeUNhbGwoKmFjYyk7CisgICAgYWNjLT5jYWxscy5wdXNoX2JhY2soY2FsbCk7CisgICAgQ2FsbE9wUGFyYW0gcHJtKHRydWUpOworICAgIHBybS5vcHQuYXVkaW9Db3VudCA9IDE7CisgICAgcHJtLm9wdC52aWRlb0NvdW50ID0gMDsKKyAgICBjYWxsLT5tYWtlQ2FsbCgic2lwOnRlc3QxQHBqc2lwLm9yZyIsIHBybSk7CisgICAgCisgICAgLy8gSGFuZ3VwIGFsbCBjYWxscworICAgIHBqX3RocmVhZF9zbGVlcCg4MDAwKTsKKyAgICBlcC5oYW5ndXBBbGxDYWxscygpOworICAgIHBqX3RocmVhZF9zbGVlcCg0MDAwKTsKKyAgICAKKyAgICAvLyBEZXN0cm95IGxpYnJhcnkKKyAgICBzdGQ6OmNvdXQgPDwgIioqKiBQSlNVQTIgU0hVVFRJTkcgRE9XTiAqKioiIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBtYWluUHJvZzIoKSB0aHJvdyhFcnJvcikKK3sKKyAgICBFbmRwb2ludCBlcDsKKworICAgIC8vIENyZWF0ZSBsaWJyYXJ5CisgICAgZXAubGliQ3JlYXRlKCk7CisKKyAgICBzdHJpbmcganNvbl9zdHI7CisKKyAgICB7CisJRXBDb25maWcgZXBDZmc7CisJSnNvbkRvY3VtZW50IGpEb2M7CisKKwllcENmZy51YUNvbmZpZy5tYXhDYWxscyA9IDYxOworCWVwQ2ZnLnVhQ29uZmlnLnVzZXJBZ2VudCA9ICJKdXN0IEpTT04gVGVzdCI7CisJZXBDZmcudWFDb25maWcuc3R1blNlcnZlci5wdXNoX2JhY2soInN0dW4xLnBqc2lwLm9yZyIpOworCWVwQ2ZnLnVhQ29uZmlnLnN0dW5TZXJ2ZXIucHVzaF9iYWNrKCJzdHVuMi5wanNpcC5vcmciKTsKKwllcENmZy5sb2dDb25maWcuZmlsZW5hbWUgPSAiVEhFLkxPRyI7CisKKwlqRG9jLndyaXRlT2JqZWN0KGVwQ2ZnKTsKKwlqc29uX3N0ciA9IGpEb2Muc2F2ZVN0cmluZygpOworCXN0ZDo6Y291dCA8PCBqc29uX3N0ciA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHsKKwlFcENvbmZpZyBlcENmZzsKKwlKc29uRG9jdW1lbnQgckRvYzsKKwlzdHJpbmcgb3V0cHV0OworCisJckRvYy5sb2FkU3RyaW5nKGpzb25fc3RyKTsKKwlyRG9jLnJlYWRPYmplY3QoZXBDZmcpOworCisJSnNvbkRvY3VtZW50IHdEb2M7CisKKwl3RG9jLndyaXRlT2JqZWN0KGVwQ2ZnKTsKKwlqc29uX3N0ciA9IHdEb2Muc2F2ZVN0cmluZygpOworCXN0ZDo6Y291dCA8PCBqc29uX3N0ciA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJd0RvYy5zYXZlRmlsZSgianNvbnRlc3QuanMiKTsKKyAgICB9CisKKyAgICB7CisJRXBDb25maWcgZXBDZmc7CisJSnNvbkRvY3VtZW50IHJEb2M7CisKKwlyRG9jLmxvYWRGaWxlKCJqc29udGVzdC5qcyIpOworCXJEb2MucmVhZE9iamVjdChlcENmZyk7CisJcGpfZmlsZV9kZWxldGUoImpzb250ZXN0LmpzIik7CisgICAgfQorCisgICAgZXAubGliRGVzdHJveSgpOworfQorCisKK3ZvaWQgbWFpblByb2czKCkgdGhyb3coRXJyb3IpCit7CisgICAgRW5kcG9pbnQgZXA7CisKKyAgICAvLyBDcmVhdGUgbGlicmFyeQorICAgIGVwLmxpYkNyZWF0ZSgpOworCisgICAgLy8gSW5pdCBsaWJyYXJ5CisgICAgRXBDb25maWcgZXBfY2ZnOworICAgIGVwLmxpYkluaXQoIGVwX2NmZyApOworCisgICAgLy8gU3RhcnQgbGlicmFyeQorICAgIGVwLmxpYlN0YXJ0KCk7CisgICAgc3RkOjpjb3V0IDw8ICIqKiogUEpTVUEyIFNUQVJURUQgKioqIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBDcmVhdGUgcGxheWVyIGFuZCByZWNvcmRlcgorICAgIHsKKwlBdWRpb01lZGlhUGxheWVyIGFtcDsKKwlhbXAuY3JlYXRlUGxheWVyKCIuLi8uLi90ZXN0cy9wanN1YS93YXZzL2lucHV0LjE2LndhdiIpOworCisJQXVkaW9NZWRpYVJlY29yZGVyIGFtcjsKKwlhbXIuY3JlYXRlUmVjb3JkZXIoInJlY29yZGVyX3Rlc3Rfb3V0cHV0LndhdiIpOworCisJYW1wLnN0YXJ0VHJhbnNtaXQoZXAuYXVkRGV2TWFuYWdlcigpLmdldFBsYXliYWNrRGV2TWVkaWEoKSk7CisJYW1wLnN0YXJ0VHJhbnNtaXQoYW1yKTsKKworCXBqX3RocmVhZF9zbGVlcCg1MDAwKTsKKyAgICB9CisKKyAgICBlcC5saWJEZXN0cm95KCk7Cit9CisKKwordm9pZCBtYWluUHJvZygpIHRocm93KEVycm9yKQoreworICAgIEVuZHBvaW50IGVwOworCisgICAgLy8gQ3JlYXRlIGxpYnJhcnkKKyAgICBlcC5saWJDcmVhdGUoKTsKKworICAgIHN0cmluZyBqc29uX3N0cjsKKworICAgIHsKKwlKc29uRG9jdW1lbnQgamRvYzsKKwlBY2NvdW50Q29uZmlnIGFjY0NmZzsKKworCWFjY0NmZy5pZFVyaSA9ICJcIkp1c3QgVGVzdFwiIDxzaXA6dGVzdEBwanNpcC5vcmc+IjsKKwlhY2NDZmcucmVnQ29uZmlnLnJlZ2lzdHJhclVyaSA9ICJzaXA6cGpzaXAub3JnIjsKKwlTaXBIZWFkZXIgaDsKKwloLmhOYW1lID0gIlgtSGVhZGVyIjsKKwloLmhWYWx1ZSA9ICJVc2VyIGhlYWRlciI7CisJYWNjQ2ZnLnJlZ0NvbmZpZy5oZWFkZXJzLnB1c2hfYmFjayhoKTsKKworCWFjY0NmZy5zaXBDb25maWcucHJveGllcy5wdXNoX2JhY2soIjxzaXA6c2lwLnBqc2lwLm9yZzt0cmFuc3BvcnQ9dGNwPiIpOworCWFjY0NmZy5zaXBDb25maWcucHJveGllcy5wdXNoX2JhY2soIjxzaXA6c2lwLnBqc2lwLm9yZzt0cmFuc3BvcnQ9dGxzPiIpOworCisJYWNjQ2ZnLm1lZGlhQ29uZmlnLnRyYW5zcG9ydENvbmZpZy50bHNDb25maWcuY2lwaGVycy5wdXNoX2JhY2soMSk7CisJYWNjQ2ZnLm1lZGlhQ29uZmlnLnRyYW5zcG9ydENvbmZpZy50bHNDb25maWcuY2lwaGVycy5wdXNoX2JhY2soMik7CisJYWNjQ2ZnLm1lZGlhQ29uZmlnLnRyYW5zcG9ydENvbmZpZy50bHNDb25maWcuY2lwaGVycy5wdXNoX2JhY2soMyk7CisKKwlBdXRoQ3JlZEluZm8gYWNpOworCWFjaS5zY2hlbWUgPSAiZGlnZXN0IjsKKwlhY2kudXNlcm5hbWUgPSAidGVzdCI7CisJYWNpLmRhdGEgPSAicGFzc3dkIjsKKwlhY2kucmVhbG0gPSAiKiI7CisJYWNjQ2ZnLnNpcENvbmZpZy5hdXRoQ3JlZHMucHVzaF9iYWNrKGFjaSk7CisKKwlqZG9jLndyaXRlT2JqZWN0KGFjY0NmZyk7CisJanNvbl9zdHIgPSBqZG9jLnNhdmVTdHJpbmcoKTsKKwlzdGQ6OmNvdXQgPDwgIk9yaWdpbmFsOiIgPDwgc3RkOjplbmRsOworCXN0ZDo6Y291dCA8PCBqc29uX3N0ciA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHsKKwlKc29uRG9jdW1lbnQgcmRvYzsKKworCXJkb2MubG9hZFN0cmluZyhqc29uX3N0cik7CisJQWNjb3VudENvbmZpZyBhY2NDZmc7CisJcmRvYy5yZWFkT2JqZWN0KGFjY0NmZyk7CisKKwlKc29uRG9jdW1lbnQgd2RvYzsKKwl3ZG9jLndyaXRlT2JqZWN0KGFjY0NmZyk7CisJanNvbl9zdHIgPSB3ZG9jLnNhdmVTdHJpbmcoKTsKKworCXN0ZDo6Y291dCA8PCAiUGFyc2VkOiIgPDwgc3RkOjplbmRsOworCXN0ZDo6Y291dCA8PCBqc29uX3N0ciA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGVwLmxpYkRlc3Ryb3koKTsKK30KKworaW50IG1haW4oKQoreworICAgIGludCByZXQgPSAwOworCisgICAgLyogVGVzdCBlbmRwb2ludCBpbnN0YW50aWF0aW9uIGFuZCBkZXN0cnVjdGlvbiB3aXRob3V0IGxpYkNyZWF0ZSgpLAorICAgICAqIGxpYkluaXQoKSBldGMuCisgICAgICovCisgICAgeworCUVuZHBvaW50IGVwOworICAgIH0KKworICAgIHRyeSB7CisJbWFpblByb2czKCk7CisJc3RkOjpjb3V0IDw8ICJTdWNjZXNzIiA8PCBzdGQ6OmVuZGw7CisgICAgfSBjYXRjaCAoRXJyb3IgJiBlcnIpIHsKKwlzdGQ6OmNvdXQgPDwgIkV4Y2VwdGlvbjogIiA8PCBlcnIuaW5mbygpIDw8IHN0ZDo6ZW5kbDsKKwlyZXQgPSAxOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wbGF5ZmlsZS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wbGF5ZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGIzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3BsYXlmaWxlLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qICRJZDogcGxheWZpbGUuYyAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ1dGlsLmgiCisKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19wbGF5ZmlsZV9jIFNhbXBsZXM6IFBsYXlpbmcgV0FWIEZpbGUgdG8gU291bmQgRGV2aWNlCisgKgorICogVGhpcyBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUgdG8gdXNlIHRoZSBAcmVmIFBKTUVESUFfRklMRV9QTEFZIGFuZAorICogQHJlZiBQSk1FRF9TTkRfUE9SVC4gSW4gdGhpcyBleGFtcGxlLCB3ZSBvcGVuIGJvdGggdGhlIGZpbGUgYW5kIHNvdW5kCisgKiBkZXZpY2UsIGFuZCBjb25uZWN0IHRoZSB0d28gb2YgdGhlbSwgYW5kIHZvaWxhISBTb3VuZCB3aWxsIGJlIHBsYXlpbmcKKyAqIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KKyAqCisgKiBAc2VlIHBhZ2VfcGptZWRpYV9zYW1wbGVzX3JlY2ZpbGVfYworICoKKyAqIFRoaXMgZmlsZSBpcyBwanNpcC1hcHBzL3NyYy9zYW1wbGVzL3BsYXlmaWxlLmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBwbGF5ZmlsZS5jCisgKi8KKworCisvKgorICogcGxheWZpbGUuYworICoKKyAqIFBVUlBPU0U6CisgKiAgUGxheSBhIFdBViBmaWxlIHRvIHNvdW5kIHBsYXllciBkZXZpY2UuCisgKgorICogVVNBR0U6CisgKiAgcGxheWZpbGUgRklMRS5XQVYKKyAqCisgKiAgVGhlIFdBViBmaWxlIGNvdWxkIGhhdmUgbW9ubyBvciBzdGVyZW8gY2hhbm5lbHMgd2l0aCBhcmJpdHJhcnkKKyAqICBzYW1wbGluZyByYXRlLCBidXQgTVVTVCBjb250YWluIHVuY29tcHJlc3NlZCAoaS5lLiAxNmJpdCkgUENNLgorICoKKyAqLworCisKKy8qIEZvciBsb2dnaW5nIHB1cnBvc2UuICovCisjZGVmaW5lIFRISVNfRklMRSAgICJwbGF5ZmlsZS5jIgorCisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXNjID0gCisiIEZJTEUJCSAgICAJCQkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiAgcGxheWZpbGUuYwkgICAgCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgUFVSUE9TRQkgICAgCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgIERlbW9uc3RyYXRlIGhvdyB0byBwbGF5IGEgV0FWIGZpbGUuCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIFVTQUdFCQkgICAgCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgIHBsYXlmaWxlIEZJTEUuV0FWCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgIFRoZSBXQVYgZmlsZSBjb3VsZCBoYXZlIG1vbm8gb3Igc3RlcmVvIGNoYW5uZWxzIHdpdGggYXJiaXRyYXJ5ICAgXG4iCisiICBzYW1wbGluZyByYXRlLCBidXQgTVVTVCBjb250YWluIHVuY29tcHJlc3NlZCAoaS5lLiAxNmJpdCkgUENNLiAgIFxuIjsKKworCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGptZWRpYV9wb3J0ICpmaWxlX3BvcnQ7CisgICAgcGptZWRpYV9zbmRfcG9ydCAqc25kX3BvcnQ7CisgICAgY2hhciB0bXBbMTBdOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgIAlwdXRzKCJFcnJvcjogZmlsZW5hbWUgcmVxdWlyZWQiKTsKKwlwdXRzKGRlc2MpOworCXJldHVybiAxOworICAgIH0KKworCisgICAgLyogTXVzdCBpbml0IFBKTElCIGZpcnN0OiAqLworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludC4KKyAgICAgKiBUaGlzIHdpbGwgaW1wbGljaXRseSBpbml0aWFsaXplIFBKTUVESUEgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIENyZWF0ZSBtZW1vcnkgcG9vbCBmb3Igb3VyIGZpbGUgcGxheWVyICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJ3YXYiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICAvKiBDcmVhdGUgZmlsZSBtZWRpYSBwb3J0IGZyb20gdGhlIFdBViBmaWxlICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKCAgcG9vbCwJLyogbWVtb3J5IHBvb2wJICAgICovCisJCQkJCSAgICAgIGFyZ3ZbMV0sCS8qIGZpbGUgdG8gcGxheQkgICAgKi8KKwkJCQkJICAgICAgMjAsCS8qIHB0aW1lLgkgICAgKi8KKwkJCQkJICAgICAgMCwJLyogZmxhZ3MJICAgICovCisJCQkJCSAgICAgIDAsCS8qIGRlZmF1bHQgYnVmZmVyICAgKi8KKwkJCQkJICAgICAgJmZpbGVfcG9ydC8qIHJldHVybmVkIHBvcnQgICAgKi8KKwkJCQkJICAgICAgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byB1c2UgV0FWIGZpbGUiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIENyZWF0ZSBzb3VuZCBwbGF5ZXIgcG9ydC4gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2NyZWF0ZV9wbGF5ZXIoIAorCQkgcG9vbCwJCQkJICAgIC8qIHBvb2wJCSAgICAqLworCQkgLTEsCQkJCSAgICAvKiB1c2UgZGVmYXVsdCBkZXYuCSAgICAqLworCQkgUEpNRURJQV9QSUFfU1JBVEUoJmZpbGVfcG9ydC0+aW5mbyksLyogY2xvY2sgcmF0ZS4JICAgICovCisJCSBQSk1FRElBX1BJQV9DQ05UKCZmaWxlX3BvcnQtPmluZm8pLC8qICMgb2YgY2hhbm5lbHMuCSAgICAqLworCQkgUEpNRURJQV9QSUFfU1BGKCZmaWxlX3BvcnQtPmluZm8pLCAvKiBzYW1wbGVzIHBlciBmcmFtZS4gICAqLworCQkgUEpNRURJQV9QSUFfQklUUygmZmlsZV9wb3J0LT5pbmZvKSwvKiBiaXRzIHBlciBzYW1wbGUuCSAgICAqLworCQkgMCwJCQkJICAgIC8qIG9wdGlvbnMJCSAgICAqLworCQkgJnNuZF9wb3J0CQkJICAgIC8qIHJldHVybmVkIHBvcnQJICAgICovCisJCSApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIG9wZW4gc291bmQgZGV2aWNlIiwgc3RhdHVzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDb25uZWN0IGZpbGUgcG9ydCB0byB0aGUgc291bmQgcGxheWVyLgorICAgICAqIFN0cmVhbSBwbGF5aW5nIHdpbGwgY29tbWVuY2UgaW1tZWRpYXRlbHkuCisgICAgICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9jb25uZWN0KCBzbmRfcG9ydCwgZmlsZV9wb3J0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisKKyAgICAvKiAKKyAgICAgKiBGaWxlIHNob3VsZCBiZSBwbGF5aW5nIGFuZCBsb29waW5nIG5vdywgdXNpbmcgc291bmQgZGV2aWNlJ3MgdGhyZWFkLiAKKyAgICAgKi8KKworCisgICAgLyogU2xlZXAgdG8gYWxsb3cgbG9nIG1lc3NhZ2VzIHRvIGZsdXNoICovCisgICAgcGpfdGhyZWFkX3NsZWVwKDEwMCk7CisKKworICAgIHByaW50ZigiUGxheWluZyAlcy4uXG4iLCBhcmd2WzFdKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJQcmVzcyA8RU5URVI+IHRvIHN0b3AgcGxheWluZyBhbmQgcXVpdCIpOworCisgICAgaWYgKGZnZXRzKHRtcCwgc2l6ZW9mKHRtcCksIHN0ZGluKSA9PSBOVUxMKSB7CisJcHV0cygiRU9GIHdoaWxlIHJlYWRpbmcgc3RkaW4sIHdpbGwgcXVpdCBub3cuLiIpOworICAgIH0KKworICAgIAorICAgIC8qIFN0YXJ0IGRlaW5pdGlhbGl6YXRpb246ICovCisKKyAgICAvKiBEaXNjb25uZWN0IHNvdW5kIHBvcnQgZnJvbSBmaWxlIHBvcnQgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Rpc2Nvbm5lY3Qoc25kX3BvcnQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogV2l0aG91dCB0aGlzIHNsZWVwLCBXaW5kb3dzL0RpcmVjdFNvdW5kIHdpbGwgcmVwZXRlYWRseQorICAgICAqIHBsYXkgdGhlIGxhc3QgZnJhbWUgZHVyaW5nIGRlc3Ryb3kuCisgICAgICovCisgICAgcGpfdGhyZWFkX3NsZWVwKDEwMCk7CisKKyAgICAvKiBEZXN0cm95IHNvdW5kIGRldmljZSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfZGVzdHJveSggc25kX3BvcnQgKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogRGVzdHJveSBmaWxlIHBvcnQgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZGVzdHJveSggZmlsZV9wb3J0ICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIFJlbGVhc2UgYXBwbGljYXRpb24gcG9vbCAqLworICAgIHBqX3Bvb2xfcmVsZWFzZSggcG9vbCApOworCisgICAgLyogRGVzdHJveSBtZWRpYSBlbmRwb2ludC4gKi8KKyAgICBwam1lZGlhX2VuZHB0X2Rlc3Ryb3koIG1lZF9lbmRwdCApOworCisgICAgLyogRGVzdHJveSBwb29sIGZhY3RvcnkgKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSggJmNwICk7CisKKyAgICAvKiBTaHV0ZG93biBQSkxJQiAqLworICAgIHBqX3NodXRkb3duKCk7CisKKworICAgIC8qIERvbmUuICovCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcGxheXNpbmUuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcGxheXNpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q4OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9wbGF5c2luZS5jCkBAIC0wLDAgKzEsMzE4IEBACisvKiAkSWQ6IHBsYXlzaW5lLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19wbGF5c2luZV9jIFNhbXBsZXM6IFVzaW5nIEN1c3RvbSBQb3J0cyAoU2luZSBXYXZlIEdlbmVyYXRvcikKKyAqCisgKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIGN1c3RvbSBtZWRpYSBwb3J0IChpbiB0aGlzIGNhc2UsIGEKKyAqIHNpbmUgd2F2ZSBnZW5lcmF0b3IpIGFuZCBjb25uZWN0IGl0IHRvIHRoZSBzb3VuZCBkZXZpY2UuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcGxheXNpbmUuYworICoKKyAqIFxpbmNsdWRlbGluZW5vIHBsYXlzaW5lLmMKKyAqLworCisvKgorICogcGxheXNpbmUuYworICoKKyAqIFBVUlBPU0U6CisgKiAgRGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhbmQgdXNlIGN1c3RvbSBtZWRpYSBwb3J0IHdoaWNoCisgKiAgc2ltcGx5IGZlZWQgYSBzaW5lIHdhdiB0byB0aGUgc291bmQgcGxheWVyLgorICoKKyAqIFVTQUdFOgorICogIHBsYXlzaW5lIFtuY2hhbm5lbF0KKyAqCisgKiB3aGVyZToKKyAqICBuY2hhbm5lbCBpcyAxIGZvciBtb25vICh0aGlzIGlzIHRoZSBkZWZhdWx0KSBvciAyIGZvciBzdGVyZW8uCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CS8qIGF0b2koKSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgkvKiBzaW4oKSAgKi8KKworLyogRm9yIGxvZ2dpbmcgcHVycG9zZS4gKi8KKyNkZWZpbmUgVEhJU19GSUxFICAgInBsYXlzaW5lLmMiCisKKworLyogVXRpbCB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgICovCitzdGF0aWMgaW50IGFwcF9wZXJyb3IoIGNvbnN0IGNoYXIgKnNlbmRlciwgY29uc3QgY2hhciAqdGl0bGUsIAorCQkgICAgICAgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBQSl9VTlVTRURfQVJHKHNlbmRlcik7CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCisgICAgcHJpbnRmKCIlczogJXMgW2NvZGU9JWRdXG4iLCB0aXRsZSwgZXJybXNnLCBzdGF0dXMpOworICAgIHJldHVybiAxOworfQorCisKKy8qIFN0cnVjdCBhdHRhY2hlZCB0byBzaW5lIGdlbmVyYXRvciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBwal9pbnQxNl90CSpzYW1wbGVzOwkvKiBTaW5lIHNhbXBsZXMuICAgICovCit9IHBvcnRfZGF0YTsKKworCisvKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB0byBmZWVkIG1vcmUgc2FtcGxlcyAqLworc3RhdGljIHBqX3N0YXR1c190IHNpbmVfZ2V0X2ZyYW1lKCBwam1lZGlhX3BvcnQgKnBvcnQsIAorCQkJCSAgIHBqbWVkaWFfZnJhbWUgKmZyYW1lKQoreworICAgIHBvcnRfZGF0YSAqc2luZSA9IHBvcnQtPnBvcnRfZGF0YS5wZGF0YTsKKyAgICBwal9pbnQxNl90ICpzYW1wbGVzID0gZnJhbWUtPmJ1ZjsKKyAgICB1bnNpZ25lZCBpLCBsZWZ0LCByaWdodDsKKyAgICBwal9zaXplX3QgY291bnQ7CisKKyAgICAvKiBHZXQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICBjb3VudCA9IGZyYW1lLT5zaXplIC8gMiAvIFBKTUVESUFfUElBX0NDTlQoJnBvcnQtPmluZm8pOworCisgICAgbGVmdCA9IDA7CisgICAgcmlnaHQgPSAwOworCisgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCSpzYW1wbGVzKysgPSBzaW5lLT5zYW1wbGVzW2xlZnRdOworCSsrbGVmdDsKKworCWlmIChQSk1FRElBX1BJQV9DQ05UKCZwb3J0LT5pbmZvKSA9PSAyKSB7CisJICAgICpzYW1wbGVzKysgPSBzaW5lLT5zYW1wbGVzW3JpZ2h0XTsKKwkgICAgcmlnaHQgKz0gMjsgLyogaGlnaGVyIHBpdGNoIHNvIHdlIGNhbiBkaXN0aW5ndWlzaCBsZWZ0IGFuZCByaWdodC4gKi8KKwkgICAgaWYgKHJpZ2h0ID49IGNvdW50KQorCQlyaWdodCA9IDA7CisJfQorICAgIH0KKworICAgIC8qIE11c3Qgc2V0IGZyYW1lLT50eXBlIGNvcnJlY3RseSwgb3RoZXJ3aXNlIHRoZSBzb3VuZCBkZXZpY2UKKyAgICAgKiB3aWxsIHJlZnVzZSB0byBwbGF5LgorICAgICAqLworICAgIGZyYW1lLT50eXBlID0gUEpNRURJQV9GUkFNRV9UWVBFX0FVRElPOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAoMy4xNDE1OTI2NSkKKyNlbmRpZgorCisvKgorICogQ3JlYXRlIGEgbWVkaWEgcG9ydCB0byBnZW5lcmF0ZSBzaW5lIHdhdmUgc2FtcGxlcy4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGNyZWF0ZV9zaW5lX3BvcnQocGpfcG9vbF90ICpwb29sLAorCQkJCSAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlLAorCQkJCSAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCSAgICBwam1lZGlhX3BvcnQgKipwX3BvcnQpCit7CisgICAgcGptZWRpYV9wb3J0ICpwb3J0OworICAgIHVuc2lnbmVkIGk7CisgICAgdW5zaWduZWQgY291bnQ7CisgICAgcGpfc3RyX3QgbmFtZTsKKyAgICBwb3J0X2RhdGEgKnNpbmU7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgY2hhbm5lbF9jb3VudCA+IDAgJiYgY2hhbm5lbF9jb3VudCA8PSAyLCAKKwkJICAgICBQSl9FSU5WQUwpOworCisgICAgcG9ydCA9IHBqX3Bvb2xfemFsbG9jKHBvb2wsIHNpemVvZihwam1lZGlhX3BvcnQpKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvcnQgIT0gTlVMTCwgUEpfRU5PTUVNKTsKKworICAgIC8qIEZpbGwgaW4gcG9ydCBpbmZvLiAqLworICAgIG5hbWUgPSBwal9zdHIoInNpbmUgZ2VuZXJhdG9yIik7CisgICAgcGptZWRpYV9wb3J0X2luZm9faW5pdCgmcG9ydC0+aW5mbywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQSk1FRElBX1NJR19DTEFTU19QT1JUX0FVRCgncycsICdpJyksCisJCQkgICBzYW1wbGluZ19yYXRlLAorCQkJICAgY2hhbm5lbF9jb3VudCwKKwkJCSAgIDE2LCBzYW1wbGluZ19yYXRlICogMjAgLyAxMDAwICogY2hhbm5lbF9jb3VudCk7CisgICAgCisgICAgLyogU2V0IHRoZSBmdW5jdGlvbiB0byBmZWVkIGZyYW1lICovCisgICAgcG9ydC0+Z2V0X2ZyYW1lID0gJnNpbmVfZ2V0X2ZyYW1lOworCisgICAgLyogQ3JlYXRlIHNpbmUgcG9ydCBkYXRhICovCisgICAgcG9ydC0+cG9ydF9kYXRhLnBkYXRhID0gc2luZSA9IHBqX3Bvb2xfemFsbG9jKHBvb2wsIHNpemVvZihwb3J0X2RhdGEpKTsKKworICAgIC8qIENyZWF0ZSBzYW1wbGVzICovCisgICAgY291bnQgPSBQSk1FRElBX1BJQV9TUEYoJnBvcnQtPmluZm8pIC8gY2hhbm5lbF9jb3VudDsKKyAgICBzaW5lLT5zYW1wbGVzID0gcGpfcG9vbF9hbGxvYyhwb29sLCBjb3VudCAqIHNpemVvZihwal9pbnQxNl90KSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzaW5lLT5zYW1wbGVzICE9IE5VTEwsIFBKX0VOT01FTSk7CisKKyAgICAvKiBpbml0aWFsaXNlIHNpbnVzb2lkYWwgd2F2ZXRhYmxlICovCisgICAgZm9yKCBpPTA7IGk8Y291bnQ7IGkrKyApCisgICAgeworICAgICAgICBzaW5lLT5zYW1wbGVzW2ldID0gKHBqX2ludDE2X3QpICgxMDAwMC4wICogCisJCXNpbigoKGRvdWJsZSlpLyhkb3VibGUpY291bnQpICogTV9QSSAqIDguKSApOworICAgIH0KKworICAgICpwX3BvcnQgPSBwb3J0OworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogU2hvdyB1c2FnZSAqLworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCJVc2FnZTogcGxheXNpbmUgW25jaGFubmVsXSIpOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIndoZXJlIik7CisgICAgcHV0cygiIG5jaGFubmVsIGlzIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAoMSBmb3IgbW9ubywgb3IgMiBmb3Igc3RlcmVvKS4iKTsKKyAgICBwdXRzKCIgRGVmYXVsdCBpcyAxIChtb25vKS4iKTsKKyAgICBwdXRzKCIiKTsKK30KKworCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGptZWRpYV9wb3J0ICpzaW5lX3BvcnQ7CisgICAgcGptZWRpYV9zbmRfcG9ydCAqc25kX3BvcnQ7CisgICAgY2hhciB0bXBbMTBdOworICAgIGludCBjaGFubmVsX2NvdW50ID0gMTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoYXJnYyA9PSAyKSB7CisJY2hhbm5lbF9jb3VudCA9IGF0b2koYXJndlsxXSk7CisJaWYgKGNoYW5uZWxfY291bnQgPCAxIHx8IGNoYW5uZWxfY291bnQgPiAyKSB7CisJICAgIHB1dHMoIkVycm9yOiBpbnZhbGlkIGFyZ3VtZW50cyIpOworCSAgICB1c2FnZSgpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgLyogTXVzdCBpbml0IFBKTElCIGZpcnN0OiAqLworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSBtZWRpYSBlbmRwb2ludC4KKyAgICAgKiBUaGlzIHdpbGwgaW1wbGljaXRseSBpbml0aWFsaXplIFBKTUVESUEgdG9vLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCBOVUxMLCAxLCAmbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIENyZWF0ZSBtZW1vcnkgcG9vbCBmb3Igb3VyIHNpbmUgZ2VuZXJhdG9yICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJ3YXYiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICAvKiBDcmVhdGUgYSBtZWRpYSBwb3J0IHRvIGdlbmVyYXRlIHNpbmUgd2F2ZSBzYW1wbGVzLiAqLworICAgIHN0YXR1cyA9IGNyZWF0ZV9zaW5lX3BvcnQoIHBvb2wsCSAgICAvKiBtZW1vcnkgcG9vbAkgICAgKi8KKwkJCSAgICAgICAxMTAyNSwJICAgIC8qIHNhbXBsaW5nIHJhdGUJICAgICovCisJCQkgICAgICAgY2hhbm5lbF9jb3VudCwvKiAjIG9mIGNoYW5uZWxzCSAgICAqLworCQkJICAgICAgICZzaW5lX3BvcnQgICAvKiByZXR1cm5lZCBwb3J0CSAgICAqLworCQkgICAgICAgICAgICAgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBjcmVhdGUgc2luZSBwb3J0Iiwgc3RhdHVzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgc291bmQgcGxheWVyIHBvcnQuICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9jcmVhdGVfcGxheWVyKCAKKwkJIHBvb2wsCQkJCSAgICAvKiBwb29sCQkgICAgKi8KKwkJIC0xLAkJCQkgICAgLyogdXNlIGRlZmF1bHQgZGV2LgkgICAgKi8KKwkJIFBKTUVESUFfUElBX1NSQVRFKCZzaW5lX3BvcnQtPmluZm8pLC8qIGNsb2NrIHJhdGUuCSAgICAqLworCQkgUEpNRURJQV9QSUFfQ0NOVCgmc2luZV9wb3J0LT5pbmZvKSwvKiAjIG9mIGNoYW5uZWxzLgkgICAgKi8KKwkJIFBKTUVESUFfUElBX1NQRigmc2luZV9wb3J0LT5pbmZvKSwgLyogc2FtcGxlcyBwZXIgZnJhbWUuICAgKi8KKwkJIFBKTUVESUFfUElBX0JJVFMoJnNpbmVfcG9ydC0+aW5mbyksLyogYml0cyBwZXIgc2FtcGxlLgkgICAgKi8KKwkJIDAsCQkJCSAgICAvKiBvcHRpb25zCQkgICAgKi8KKwkJICZzbmRfcG9ydAkJCSAgICAvKiByZXR1cm5lZCBwb3J0CSAgICAqLworCQkgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIHNvdW5kIGRldmljZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQ29ubmVjdCBzaW5lIGdlbmVyYXRvciBwb3J0IHRvIHRoZSBzb3VuZCBwbGF5ZXIgCisgICAgICogU3RyZWFtIHBsYXlpbmcgd2lsbCBjb21tZW5jZSBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Nvbm5lY3QoIHNuZF9wb3J0LCBzaW5lX3BvcnQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKworICAgIC8qIAorICAgICAqIEF1ZGlvIHNob3VsZCBiZSBwbGF5aW5nIGluIGEgbG9vcCBub3csIHVzaW5nIHNvdW5kIGRldmljZSdzIHRocmVhZC4gCisgICAgICovCisKKworICAgIC8qIFNsZWVwIHRvIGFsbG93IGxvZyBtZXNzYWdlcyB0byBmbHVzaCAqLworICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworCisKKyAgICBwdXRzKCJQbGF5aW5nIHNpbmUgd2F2ZS4uIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiUHJlc3MgPEVOVEVSPiB0byBzdG9wIHBsYXlpbmcgYW5kIHF1aXQiKTsKKworICAgIGlmIChmZ2V0cyh0bXAsIHNpemVvZih0bXApLCBzdGRpbikgPT0gTlVMTCkgeworCXB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKyAgICB9CisKKyAgICAKKyAgICAvKiBTdGFydCBkZWluaXRpYWxpemF0aW9uOiAqLworCisgICAgLyogRGlzY29ubmVjdCBzb3VuZCBwb3J0IGZyb20gZmlsZSBwb3J0ICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9kaXNjb25uZWN0KHNuZF9wb3J0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIFdpdGhvdXQgdGhpcyBzbGVlcCwgV2luZG93cy9EaXJlY3RTb3VuZCB3aWxsIHJlcGV0ZWFkbHkKKyAgICAgKiBwbGF5IHRoZSBsYXN0IGZyYW1lIGR1cmluZyBkZXN0cm95LgorICAgICAqLworICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworCisgICAgLyogRGVzdHJveSBzb3VuZCBkZXZpY2UgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Rlc3Ryb3koIHNuZF9wb3J0ICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIERlc3Ryb3kgc2luZSBnZW5lcmF0b3IgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZGVzdHJveSggc2luZV9wb3J0ICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIFJlbGVhc2UgYXBwbGljYXRpb24gcG9vbCAqLworICAgIHBqX3Bvb2xfcmVsZWFzZSggcG9vbCApOworCisgICAgLyogRGVzdHJveSBtZWRpYSBlbmRwb2ludC4gKi8KKyAgICBwam1lZGlhX2VuZHB0X2Rlc3Ryb3koIG1lZF9lbmRwdCApOworCisgICAgLyogRGVzdHJveSBwb29sIGZhY3RvcnkgKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSggJmNwICk7CisKKyAgICAvKiBTaHV0ZG93biBQSkxJQiAqLworICAgIHBqX3NodXRkb3duKCk7CisKKworICAgIC8qIERvbmUuICovCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3Byb3h5LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ZmQxZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcHJveHkuaApAQCAtMCwwICsxLDU4NyBAQAorLyogJElkOiBwcm94eS5oIDQzNzAgMjAxMy0wMi0yNiAwNTozMDowMFogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGpzaXAuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworCisvKiBPcHRpb25zICovCitzdGF0aWMgc3RydWN0IGdsb2JhbF9zdHJ1Y3QKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wJIGNwOworICAgIHBqc2lwX2VuZHBvaW50CSplbmRwdDsKKyAgICBpbnQJCQkgcG9ydDsKKyAgICBwal9wb29sX3QJCSpwb29sOworCisgICAgcGpfdGhyZWFkX3QJCSp0aHJlYWQ7CisgICAgcGpfYm9vbF90CQkgcXVpdF9mbGFnOworCisgICAgcGpfYm9vbF90CQkgcmVjb3JkX3JvdXRlOworCisgICAgdW5zaWduZWQJCSBuYW1lX2NudDsKKyAgICBwanNpcF9ob3N0X3BvcnQJIG5hbWVbMTZdOworfSBnbG9iYWw7CisKKworCitzdGF0aWMgdm9pZCBhcHBfcGVycm9yKGNvbnN0IGNoYXIgKm1zZywgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgIFBKX0xPRygxLChUSElTX0ZJTEUsICIlczogJXMiLCBtc2csIGVycm1zZykpOworfQorCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgcHV0cygiT3B0aW9uczpcbiIKKwkgIlxuIgorCSAiIC1wLCAtLXBvcnQgTiAgICAgICBTZXQgbG9jYWwgbGlzdGVuZXIgcG9ydCB0byBOXG4iCisJICIgLVIsIC0tcnIgICAgICAgICAgIFBlcmZvcm0gcmVjb3JkIHJvdXRpbmdcbiIKKwkgIiAtTCwgLS1sb2ctbGV2ZWwgTiAgU2V0IGxvZyBsZXZlbCB0byBOIChkZWZhdWx0OiA0KVxuIgorCSAiIC1oLCAtLWhlbHAgICAgICAgICBTaG93IHRoaXMgaGVscCBzY3JlZW5cbiIKKwkgKTsKK30KKworCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9vcHRpb25zKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3RydWN0IHBqX2dldG9wdF9vcHRpb24gbG9uZ19vcHRbXSA9IHsKKwl7ICJwb3J0IiwJMSwgMCwgJ3AnfSwKKwl7ICJyciIsCQkwLCAwLCAnUid9LAorCXsgImxvZy1sZXZlbCIsCTEsIDAsICdMJ30sCisJeyAiaGVscCIsCTAsIDAsICdoJ30sCisJeyBOVUxMLAkJMCwgMCwgMH0KKyAgICB9OworICAgIGludCBjOworICAgIGludCBvcHRfaW5kOworCisgICAgcGpfb3B0aW5kID0gMDsKKyAgICB3aGlsZSgoYz1wal9nZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAicDpMOlJoIiwgbG9uZ19vcHQsICZvcHRfaW5kKSkhPS0xKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAncCc6CisJICAgIGdsb2JhbC5wb3J0ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBwcmludGYoIlBvcnQgaXMgc2V0IHRvICVkXG4iLCBnbG9iYWwucG9ydCk7CisJICAgIGJyZWFrOworCQorCWNhc2UgJ1InOgorCSAgICBnbG9iYWwucmVjb3JkX3JvdXRlID0gUEpfVFJVRTsKKwkgICAgcHJpbnRmKCJVc2luZyByZWNvcmQgcm91dGUgbW9kZVxuIik7CisJICAgIGJyZWFrOworCisJY2FzZSAnTCc6CisJICAgIHBqX2xvZ19zZXRfbGV2ZWwoYXRvaShwal9vcHRhcmcpKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdoJzoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIC0xOworCisJZGVmYXVsdDoKKwkgICAgcHV0cygiVW5rbm93biBvcHRpb24uIFJ1biB3aXRoIC0taGVscCBmb3IgaGVscC4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBQSlNJUCBtb2R1bGUsIHdob3NlIHNvbGUgcHVycG9zZSBpcyB0byBkaXNwbGF5CisgKiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgbWVzc2FnZXMgdG8gbG9nLiBUaGlzIG1vZHVsZSB3aWxsIGhhdmUgcHJpb3JpdHkKKyAqIGhpZ2hlciB0aGFuIHRyYW5zcG9ydCBsYXllciwgd2hpY2ggbWVhbnM6CisgKgorICogIC0gaW5jb21pbmcgbWVzc2FnZXMgd2lsbCBjb21lIHRvIHRoaXMgbW9kdWxlIGZpcnN0IGJlZm9yZSByZWFjaGluZworICogICAgdHJhbnNhY3Rpb24gbGF5ZXIuCisgKgorICogIC0gb3V0Z29pbmcgbWVzc2FnZXMgd2lsbCBjb21lIHRvIHRoaXMgbW9kdWxlIGxhc3QsIGFmdGVyIHRoZSBtZXNzYWdlCisgKiAgICBoYXMgYmVlbiAncHJpbnRlZCcgdG8gY29udGlndW91cyBidWZmZXIgYnkgdHJhbnNwb3J0IGxheWVyIGFuZAorICogICAgYXBwcm9wcmlhdGUgdHJhbnNwb3J0IGluc3RhbmNlIGhhcyBiZWVuIGRlY2lkZWQgZm9yIHRoaXMgbWVzc2FnZS4KKyAqCisgKi8KKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfYm9vbF90IGxvZ2dpbmdfb25fcnhfbXNnKHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIFBKX0xPRyg1LChUSElTX0ZJTEUsICJSWCAlZCBieXRlcyAlcyBmcm9tICVzICVzOiVkOlxuIgorCQkJICIlLipzXG4iCisJCQkgIi0tZW5kIG1zZy0tIiwKKwkJCSByZGF0YS0+bXNnX2luZm8ubGVuLAorCQkJIHBqc2lwX3J4X2RhdGFfZ2V0X2luZm8ocmRhdGEpLAorCQkJIHJkYXRhLT50cF9pbmZvLnRyYW5zcG9ydC0+dHlwZV9uYW1lLAorCQkJIHJkYXRhLT5wa3RfaW5mby5zcmNfbmFtZSwKKwkJCSByZGF0YS0+cGt0X2luZm8uc3JjX3BvcnQsCisJCQkgKGludClyZGF0YS0+bXNnX2luZm8ubGVuLAorCQkJIHJkYXRhLT5tc2dfaW5mby5tc2dfYnVmKSk7CisgICAgCisgICAgLyogQWx3YXlzIHJldHVybiBmYWxzZSwgb3RoZXJ3aXNlIG1lc3NhZ2VzIHdpbGwgbm90IGdldCBwcm9jZXNzZWQhICovCisgICAgcmV0dXJuIFBKX0ZBTFNFOworfQorCisvKiBOb3RpZmljYXRpb24gb24gb3V0Z29pbmcgbWVzc2FnZXMgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBsb2dnaW5nX29uX3R4X21zZyhwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICAKKyAgICAvKiBJbXBvcnRhbnQgbm90ZToKKyAgICAgKgl0cF9pbmZvIGZpZWxkIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgb3V0Z29pbmcgbWVzc2FnZXMgaGFzIHBhc3NlZAorICAgICAqCXRyYW5zcG9ydCBsYXllci4gU28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyB0cF9pbmZvIHdoZW4gdGhlIG1vZHVsZQorICAgICAqCWhhcyBsb3dlciBwcmlvcml0eSB0aGFuIHRyYW5zcG9ydCBsYXllci4KKyAgICAgKi8KKworICAgIFBKX0xPRyg1LChUSElTX0ZJTEUsICJUWCAlZCBieXRlcyAlcyB0byAlcyAlczolZDpcbiIKKwkJCSAiJS4qc1xuIgorCQkJICItLWVuZCBtc2ctLSIsCisJCQkgKHRkYXRhLT5idWYuY3VyIC0gdGRhdGEtPmJ1Zi5zdGFydCksCisJCQkgcGpzaXBfdHhfZGF0YV9nZXRfaW5mbyh0ZGF0YSksCisJCQkgdGRhdGEtPnRwX2luZm8udHJhbnNwb3J0LT50eXBlX25hbWUsCisJCQkgdGRhdGEtPnRwX2luZm8uZHN0X25hbWUsCisJCQkgdGRhdGEtPnRwX2luZm8uZHN0X3BvcnQsCisJCQkgKGludCkodGRhdGEtPmJ1Zi5jdXIgLSB0ZGF0YS0+YnVmLnN0YXJ0KSwKKwkJCSB0ZGF0YS0+YnVmLnN0YXJ0KSk7CisKKyAgICAvKiBBbHdheXMgcmV0dXJuIHN1Y2Nlc3MsIG90aGVyd2lzZSBtZXNzYWdlIHdpbGwgbm90IGdldCBzZW50ISAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBUaGUgbW9kdWxlIGluc3RhbmNlLiAqLworc3RhdGljIHBqc2lwX21vZHVsZSBtb2RfbXNnX2xvZ2dlciA9IAoreworICAgIE5VTEwsIE5VTEwsCQkJCS8qIHByZXYsIG5leHQuCQkqLworICAgIHsgIm1vZC1tc2ctbG9nZ2VyIiwgMTQgfSwJCS8qIE5hbWUuCQkqLworICAgIC0xLAkJCQkJLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9UUkFOU1BPUlRfTEFZRVItMSwvKiBQcmlvcml0eQkgICAgICAgICovCisgICAgTlVMTCwJCQkJLyogbG9hZCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0YXJ0KCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RvcCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHVubG9hZCgpCQkqLworICAgICZsb2dnaW5nX29uX3J4X21zZywJCQkvKiBvbl9yeF9yZXF1ZXN0KCkJKi8KKyAgICAmbG9nZ2luZ19vbl9yeF9tc2csCQkJLyogb25fcnhfcmVzcG9uc2UoKQkqLworICAgICZsb2dnaW5nX29uX3R4X21zZywJCQkvKiBvbl90eF9yZXF1ZXN0LgkqLworICAgICZsb2dnaW5nX29uX3R4X21zZywJCQkvKiBvbl90eF9yZXNwb25zZSgpCSovCisgICAgTlVMTCwJCQkJLyogb25fdHN4X3N0YXRlKCkJKi8KKworfTsKKworCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zdGFjayh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworCisgICAgLyogVGhlbiBpbml0IFBKTElCLVVUSUw6ICovCisgICAgc3RhdHVzID0gcGpsaWJfdXRpbF9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworCisgICAgLyogTXVzdCBjcmVhdGUgYSBwb29sIGZhY3RvcnkgYmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSBhbnkgbWVtb3J5LiAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZnbG9iYWwuY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogQ3JlYXRlIHRoZSBlbmRwb2ludDogKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGUoJmdsb2JhbC5jcC5mYWN0b3J5LCBOVUxMLCAmZ2xvYmFsLmVuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisgICAgLyogSW5pdCB0cmFuc2FjdGlvbiBsYXllciBmb3Igc3RhdGVmdWwgcHJveHkgb25seSAqLworI2lmIFNUQVRFRlVMCisgICAgc3RhdHVzID0gcGpzaXBfdHN4X2xheWVyX2luaXRfbW9kdWxlKGdsb2JhbC5lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIGxpc3RlbmluZyB0cmFuc3BvcnQgKi8KKyAgICB7CisJcGpfc29ja2FkZHJfaW4gYWRkcjsKKworCWFkZHIuc2luX2ZhbWlseSA9IHBqX0FGX0lORVQoKTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IDA7CisJYWRkci5zaW5fcG9ydCA9IHBqX2h0b25zKChwal91aW50MTZfdClnbG9iYWwucG9ydCk7CisKKwlzdGF0dXMgPSBwanNpcF91ZHBfdHJhbnNwb3J0X3N0YXJ0KCBnbG9iYWwuZW5kcHQsICZhZGRyLCAKKwkJCQkJICAgIE5VTEwsIDEsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgcG9vbCBmb3IgdGhlIGFwcGxpY2F0aW9uICovCisgICAgZ2xvYmFsLnBvb2wgPSBwal9wb29sX2NyZWF0ZSgmZ2xvYmFsLmNwLmZhY3RvcnksICJwcm94eWFwcCIsIAorCQkJCSA0MDAwLCA0MDAwLCBOVUxMKTsKKworICAgIC8qIFJlZ2lzdGVyIHRoZSBsb2dnZXIgbW9kdWxlICovCisgICAgcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKGdsb2JhbC5lbmRwdCwgJm1vZF9tc2dfbG9nZ2VyKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X3Byb3h5KHZvaWQpCit7CisgICAgcGpfc29ja2FkZHIgcHJpX2FkZHI7CisgICAgcGpfc29ja2FkZHIgYWRkcl9saXN0WzE2XTsKKyAgICB1bnNpZ25lZCBhZGRyX2NudCA9IFBKX0FSUkFZX1NJWkUoYWRkcl9saXN0KTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogTGlzdCBhbGwgbmFtZXMgbWF0Y2hpbmcgbG9jYWwgZW5kcG9pbnQuCisgICAgICogTm90ZSB0aGF0IFBKTElCIHZlcnNpb24gMC42IGFuZCBuZXdlciBoYXMgYSBmdW5jdGlvbiB0bworICAgICAqIGVudW1lcmF0ZSBsb2NhbCBJUCBpbnRlcmZhY2UgKHBqX2VudW1faXBfaW50ZXJmYWNlKCkpLCBzbworICAgICAqIGJ5IHVzaW5nIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGxpc3QgYWxsIElQIGludGVyZmFjZXMgaW4KKyAgICAgKiB0aGlzIGhvc3QuCisgICAgICovCisKKyAgICAvKiBUaGUgZmlyc3QgYWRkcmVzcyBpcyBpbXBvcnRhbnQgc2luY2UgdGhpcyB3b3VsZCBiZSB0aGUgb25lCisgICAgICogdG8gYmUgYWRkZWQgaW4gUmVjb3JkLVJvdXRlLgorICAgICAqLworICAgIGlmIChwal9nZXRob3N0aXAocGpfQUZfSU5FVCgpLCAmcHJpX2FkZHIpPT1QSl9TVUNDRVNTKSB7CisJcGpfc3RyZHVwMihnbG9iYWwucG9vbCwgJmdsb2JhbC5uYW1lW2dsb2JhbC5uYW1lX2NudF0uaG9zdCwKKwkJICAgcGpfaW5ldF9udG9hKHByaV9hZGRyLmlwdjQuc2luX2FkZHIpKTsKKwlnbG9iYWwubmFtZVtnbG9iYWwubmFtZV9jbnRdLnBvcnQgPSBnbG9iYWwucG9ydDsKKwlnbG9iYWwubmFtZV9jbnQrKzsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHJlc3Qgb2YgSVAgaW50ZXJmYWNlcyAqLworICAgIGlmIChwal9lbnVtX2lwX2ludGVyZmFjZShwal9BRl9JTkVUKCksICZhZGRyX2NudCwgYWRkcl9saXN0KSA9PSBQSl9TVUNDRVNTKSB7CisJZm9yIChpPTA7IGk8YWRkcl9jbnQ7ICsraSkgeworCisJICAgIGlmIChhZGRyX2xpc3RbaV0uaXB2NC5zaW5fYWRkci5zX2FkZHIgPT0gcHJpX2FkZHIuaXB2NC5zaW5fYWRkci5zX2FkZHIpCisJCWNvbnRpbnVlOworCisJICAgIHBqX3N0cmR1cDIoZ2xvYmFsLnBvb2wsICZnbG9iYWwubmFtZVtnbG9iYWwubmFtZV9jbnRdLmhvc3QsCisJCSAgICAgICBwal9pbmV0X250b2EoYWRkcl9saXN0W2ldLmlwdjQuc2luX2FkZHIpKTsKKwkgICAgZ2xvYmFsLm5hbWVbZ2xvYmFsLm5hbWVfY250XS5wb3J0ID0gZ2xvYmFsLnBvcnQ7CisJICAgIGdsb2JhbC5uYW1lX2NudCsrOworCX0KKyAgICB9CisKKyAgICAvKiBBZGQgbG9vcGJhY2sgYWRkcmVzcy4gKi8KKyNpZiBQSl9JUF9IRUxQRVJfSUdOT1JFX0xPT1BCQUNLX0lGCisgICAgZ2xvYmFsLm5hbWVbZ2xvYmFsLm5hbWVfY250XS5ob3N0ID0gcGpfc3RyKCIxMjcuMC4wLjEiKTsKKyAgICBnbG9iYWwubmFtZVtnbG9iYWwubmFtZV9jbnRdLnBvcnQgPSBnbG9iYWwucG9ydDsKKyAgICBnbG9iYWwubmFtZV9jbnQrKzsKKyNlbmRpZgorCisgICAgZ2xvYmFsLm5hbWVbZ2xvYmFsLm5hbWVfY250XS5ob3N0ID0gKnBqX2dldGhvc3RuYW1lKCk7CisgICAgZ2xvYmFsLm5hbWVbZ2xvYmFsLm5hbWVfY250XS5wb3J0ID0gZ2xvYmFsLnBvcnQ7CisgICAgZ2xvYmFsLm5hbWVfY250Kys7CisKKyAgICBnbG9iYWwubmFtZVtnbG9iYWwubmFtZV9jbnRdLmhvc3QgPSBwal9zdHIoImxvY2FsaG9zdCIpOworICAgIGdsb2JhbC5uYW1lW2dsb2JhbC5uYW1lX2NudF0ucG9ydCA9IGdsb2JhbC5wb3J0OworICAgIGdsb2JhbC5uYW1lX2NudCsrOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlByb3h5IHN0YXJ0ZWQsIGxpc3RlbmluZyBvbiBwb3J0ICVkIiwgZ2xvYmFsLnBvcnQpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiTG9jYWwgaG9zdCBhbGlhc2VzOiIpKTsKKyAgICBmb3IgKGk9MDsgaTxnbG9iYWwubmFtZV9jbnQ7ICsraSkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICIgJS4qczolZCIsIAorCQkgIChpbnQpZ2xvYmFsLm5hbWVbaV0uaG9zdC5zbGVuLAorCQkgIGdsb2JhbC5uYW1lW2ldLmhvc3QucHRyLAorCQkgIGdsb2JhbC5uYW1lW2ldLnBvcnQpKTsKKyAgICB9CisKKyAgICBpZiAoZ2xvYmFsLnJlY29yZF9yb3V0ZSkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJVc2luZyBSZWNvcmQtUm91dGUgbW9kZSIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisjaWYgUEpfSEFTX1RIUkVBRFMKK3N0YXRpYyBpbnQgd29ya2VyX3RocmVhZCh2b2lkICpwKQoreworICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwfTsKKworICAgIFBKX1VOVVNFRF9BUkcocCk7CisKKyAgICB3aGlsZSAoIWdsb2JhbC5xdWl0X2ZsYWcpIHsKKwlwanNpcF9lbmRwdF9oYW5kbGVfZXZlbnRzKGdsb2JhbC5lbmRwdCwgJmRlbGF5KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qIFV0aWxpdHkgdG8gZGV0ZXJtaW5lIGlmIFVSSSBpcyBsb2NhbCB0byB0aGlzIGhvc3QuICovCitzdGF0aWMgcGpfYm9vbF90IGlzX3VyaV9sb2NhbChjb25zdCBwanNpcF9zaXBfdXJpICp1cmkpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGk9MDsgaTxnbG9iYWwubmFtZV9jbnQ7ICsraSkgeworCWlmICgodXJpLT5wb3J0ID09IGdsb2JhbC5uYW1lW2ldLnBvcnQgfHwKKwkgICAgICh1cmktPnBvcnQ9PTAgJiYgZ2xvYmFsLm5hbWVbaV0ucG9ydD09NTA2MCkpICYmCisJICAgIHBqX3N0cmljbXAoJnVyaS0+aG9zdCwgJmdsb2JhbC5uYW1lW2ldLmhvc3QpPT0wKQorCXsKKwkgICAgLyogTWF0Y2ggKi8KKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorICAgIH0KKworICAgIC8qIERvZXNuJ3QgbWF0Y2ggKi8KKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKworLyogUHJveHkgdXRpbGl0eSB0byB2ZXJpZnkgaW5jb21pbmcgcmVxdWVzdHMuCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgdmVyaWZpY2F0aW9uIGZhaWxlZC4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IHByb3h5X3ZlcmlmeV9yZXF1ZXN0KHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIGNvbnN0IHBqX3N0cl90IFNUUl9QUk9YWV9SRVFVSVJFID0geyJQcm94eS1SZXF1aXJlIiwgMTN9OworCisgICAgLyogUkZDIDMyNjEgU2VjdGlvbiAxNi4zIFJlcXVlc3QgVmFsaWRhdGlvbiAqLworCisgICAgLyogQmVmb3JlIGFuIGVsZW1lbnQgY2FuIHByb3h5IGEgcmVxdWVzdCwgaXQgTVVTVCB2ZXJpZnkgdGhlIG1lc3NhZ2UncworICAgICAqIHZhbGlkaXR5LiAgQSB2YWxpZCBtZXNzYWdlIG11c3QgcGFzcyB0aGUgZm9sbG93aW5nIGNoZWNrczoKKyAgICAgKiAKKyAgICAgKiAxLiBSZWFzb25hYmxlIFN5bnRheAorICAgICAqIDIuIFVSSSBzY2hlbWUKKyAgICAgKiAzLiBNYXgtRm9yd2FyZHMKKyAgICAgKiA0LiAoT3B0aW9uYWwpIExvb3AgRGV0ZWN0aW9uCisgICAgICogNS4gUHJveHktUmVxdWlyZQorICAgICAqIDYuIFByb3h5LUF1dGhvcml6YXRpb24KKyAgICAgKi8KKworICAgIC8qIDEuIFJlYXNvbmFibGUgU3ludGF4LgorICAgICAqIFRoaXMgd291bGQgaGF2ZSBiZWVuIGNoZWNrZWQgYnkgdHJhbnNwb3J0IGxheWVyLgorICAgICAqLworCisgICAgLyogMi4gVVJJIHNjaGVtZS4KKyAgICAgKiBXZSBvbmx5IHdhbnQgdG8gc3VwcG9ydCAic2lwOiIvInNpcHM6IiBVUkkgc2NoZW1lIGZvciB0aGlzIHNpbXBsZSBwcm94eS4KKyAgICAgKi8KKyAgICBpZiAoIVBKU0lQX1VSSV9TQ0hFTUVfSVNfU0lQKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLnVyaSkgJiYKKwkhUEpTSVBfVVJJX1NDSEVNRV9JU19TSVBTKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLnVyaSkpCisgICAgeworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKGdsb2JhbC5lbmRwdCwgcmRhdGEsIAorCQkJCSAgICAgIFBKU0lQX1NDX1VOU1VQUE9SVEVEX1VSSV9TQ0hFTUUsIE5VTEwsCisJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFBKU0lQX0VSUk5PX0ZST01fU0lQX1NUQVRVUyhQSlNJUF9TQ19VTlNVUFBPUlRFRF9VUklfU0NIRU1FKTsKKyAgICB9CisKKyAgICAvKiAzLiBNYXgtRm9yd2FyZHMuCisgICAgICogU2VuZCBlcnJvciBpZiBNYXgtRm9yd2FyZHMgaXMgMSBvciBsb3dlci4KKyAgICAgKi8KKyAgICBpZiAocmRhdGEtPm1zZ19pbmZvLm1heF9md2QgJiYgcmRhdGEtPm1zZ19pbmZvLm1heF9md2QtPml2YWx1ZSA8PSAxKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoZ2xvYmFsLmVuZHB0LCByZGF0YSwgCisJCQkJICAgICAgUEpTSVBfU0NfVE9PX01BTllfSE9QUywgTlVMTCwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gUEpTSVBfRVJSTk9fRlJPTV9TSVBfU1RBVFVTKFBKU0lQX1NDX1RPT19NQU5ZX0hPUFMpOworICAgIH0KKworICAgIC8qIDQuIChPcHRpb25hbCkgTG9vcCBEZXRlY3Rpb24uCisgICAgICogTmFoLCB3ZSBkb24ndCBkbyB0aGF0IHdpdGggdGhpcyBzaW1wbGUgcHJveHkuCisgICAgICovCisKKyAgICAvKiA1LiBQcm94eS1SZXF1aXJlICovCisgICAgaWYgKHBqc2lwX21zZ19maW5kX2hkcl9ieV9uYW1lKHJkYXRhLT5tc2dfaW5mby5tc2csICZTVFJfUFJPWFlfUkVRVUlSRSwgCisJCQkJICAgTlVMTCkgIT0gTlVMTCkgCisgICAgeworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKGdsb2JhbC5lbmRwdCwgcmRhdGEsIAorCQkJCSAgICAgIFBKU0lQX1NDX0JBRF9FWFRFTlNJT04sIE5VTEwsCisJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFBKU0lQX0VSUk5PX0ZST01fU0lQX1NUQVRVUyhQSlNJUF9TQ19CQURfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICAvKiA2LiBQcm94eS1BdXRob3JpemF0aW9uLgorICAgICAqIE5haCwgd2UgZG9uJ3QgcmVxdWlyZSBhbnkgYXV0aG9yaXphdGlvbiB3aXRoIHRoaXMgc2FtcGxlLgorICAgICAqLworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogUHJvY2VzcyByb3V0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVxZXVzdCAqLworc3RhdGljIHBqX3N0YXR1c190IHByb3h5X3Byb2Nlc3Nfcm91dGluZyhwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICBwanNpcF9zaXBfdXJpICp0YXJnZXQ7CisgICAgcGpzaXBfcm91dGVfaGRyICpocm91dGU7CisKKyAgICAvKiBSRkMgMzI2MSBTZWN0aW9uIDE2LjQgUm91dGUgSW5mb3JtYXRpb24gUHJlcHJvY2Vzc2luZyAqLworCisgICAgdGFyZ2V0ID0gKHBqc2lwX3NpcF91cmkqKSB0ZGF0YS0+bXNnLT5saW5lLnJlcS51cmk7CisKKyAgICAvKiBUaGUgcHJveHkgTVVTVCBpbnNwZWN0IHRoZSBSZXF1ZXN0LVVSSSBvZiB0aGUgcmVxdWVzdC4gIElmIHRoZQorICAgICAqIFJlcXVlc3QtVVJJIG9mIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGEgdmFsdWUgdGhpcyBwcm94eSBwcmV2aW91c2x5CisgICAgICogcGxhY2VkIGludG8gYSBSZWNvcmQtUm91dGUgaGVhZGVyIGZpZWxkIChzZWUgU2VjdGlvbiAxNi42IGl0ZW0gNCksCisgICAgICogdGhlIHByb3h5IE1VU1QgcmVwbGFjZSB0aGUgUmVxdWVzdC1VUkkgaW4gdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbGFzdAorICAgICAqIHZhbHVlIGZyb20gdGhlIFJvdXRlIGhlYWRlciBmaWVsZCwgYW5kIHJlbW92ZSB0aGF0IHZhbHVlIGZyb20gdGhlCisgICAgICogUm91dGUgaGVhZGVyIGZpZWxkLiAgVGhlIHByb3h5IE1VU1QgdGhlbiBwcm9jZWVkIGFzIGlmIGl0IHJlY2VpdmVkCisgICAgICogdGhpcyBtb2RpZmllZCByZXF1ZXN0LgorICAgICAqLworICAgIGlmIChpc191cmlfbG9jYWwodGFyZ2V0KSkgeworCXBqc2lwX3JvdXRlX2hkciAqcjsKKwlwanNpcF9zaXBfdXJpICp1cmk7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBSb3V0ZSBoZWFkZXIgKi8KKwlyID0gaHJvdXRlID0gKHBqc2lwX3JvdXRlX2hkciopCisJCSAgICAgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfUk9VVEUsIE5VTEwpOworCWlmIChyID09IE5VTEwpIHsKKwkgICAgLyogTm8gUm91dGUgaGVhZGVyLiBUaGlzIHJlcXVlc3QgaXMgZGVzdGluZWQgZm9yIHRoaXMgcHJveHkuICovCisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0KKworCS8qIEZpbmQgdGhlIGxhc3QgUm91dGUgaGVhZGVyICovCisJd2hpbGUgKCAocj0ocGpzaXBfcm91dGVfaGRyKilwanNpcF9tc2dfZmluZF9oZHIodGRhdGEtPm1zZywgCisJCQkJCQkgICAgICAgIFBKU0lQX0hfUk9VVEUsIAorCQkJCQkJCXItPm5leHQpKSAhPSBOVUxMICkKKwl7CisJICAgIGhyb3V0ZSA9IHI7CisJfQorCisJLyogSWYgdGhlIGxhc3QgUm91dGUgaGVhZGVyIGRvZXNuJ3QgaGF2ZSAiO2xyIiBwYXJhbWV0ZXIsIHRoZW4KKwkgKiB0aGlzIGlzIGEgc3RyaWN0LXJvdXRlZCByZXF1ZXN0IGluZGVlZCwgYW5kIHdlIGZvbGxvdyB0aGUgc3RlcHMKKwkgKiBpbiBwcm9jZXNzaW5nIHN0cmljdC1yb3V0ZSByZXF1ZXN0cyBhYm92ZS4KKwkgKgorCSAqIEJ1dCBpZiBpdCBkb2VzIGNvbnRhaW4gIjtsciIgcGFyYW1ldGVyLCBza2lwIHRoZSBzdHJpY3Qtcm91dGUKKwkgKiBwcm9jZXNzaW5nLgorCSAqLworCXVyaSA9IChwanNpcF9zaXBfdXJpKikKKwkgICAgICBwanNpcF91cmlfZ2V0X3VyaSgmaHJvdXRlLT5uYW1lX2FkZHIpOworCWlmICh1cmktPmxyX3BhcmFtID09IDApIHsKKwkgICAgLyogWWVzIHRoaXMgaXMgc3RyaWN0IHJvdXRlLCBzbzoKKwkgICAgICogLSByZXBsYWNlIHJlcSBVUkkgd2l0aCB0aGUgVVJJIGluIFJvdXRlIGhlYWRlciwKKwkgICAgICogLSByZW1vdmUgdGhlIFJvdXRlIGhlYWRlciwKKwkgICAgICogLSBwcm9jZWVkIGFzIGlmIGl0IHJlY2VpdmVkIHRoaXMgbW9kaWZpZWQgcmVxdWVzdC4gCisJICAgICovCisJICAgIHRkYXRhLT5tc2ctPmxpbmUucmVxLnVyaSA9IGhyb3V0ZS0+bmFtZV9hZGRyLnVyaTsKKwkgICAgdGFyZ2V0ID0gKHBqc2lwX3NpcF91cmkqKSB0ZGF0YS0+bXNnLT5saW5lLnJlcS51cmk7CisJICAgIHBqX2xpc3RfZXJhc2UoaHJvdXRlKTsKKwl9CisgICAgfQorCisgICAgLyogSWYgdGhlIFJlcXVlc3QtVVJJIGNvbnRhaW5zIGEgbWFkZHIgcGFyYW1ldGVyLCB0aGUgcHJveHkgTVVTVCBjaGVjaworICAgICAqIHRvIHNlZSBpZiBpdHMgdmFsdWUgaXMgaW4gdGhlIHNldCBvZiBhZGRyZXNzZXMgb3IgZG9tYWlucyB0aGUgcHJveHkKKyAgICAgKiBpcyBjb25maWd1cmVkIHRvIGJlIHJlc3BvbnNpYmxlIGZvci4gIElmIHRoZSBSZXF1ZXN0LVVSSSBoYXMgYSBtYWRkcgorICAgICAqIHBhcmFtZXRlciB3aXRoIGEgdmFsdWUgdGhlIHByb3h5IGlzIHJlc3BvbnNpYmxlIGZvciwgYW5kIHRoZSByZXF1ZXN0CisgICAgICogd2FzIHJlY2VpdmVkIHVzaW5nIHRoZSBwb3J0IGFuZCB0cmFuc3BvcnQgaW5kaWNhdGVkIChleHBsaWNpdGx5IG9yIGJ5CisgICAgICogZGVmYXVsdCkgaW4gdGhlIFJlcXVlc3QtVVJJLCB0aGUgcHJveHkgTVVTVCBzdHJpcCB0aGUgbWFkZHIgYW5kIGFueQorICAgICAqIG5vbi1kZWZhdWx0IHBvcnQgb3IgdHJhbnNwb3J0IHBhcmFtZXRlciBhbmQgY29udGludWUgcHJvY2Vzc2luZyBhcyBpZgorICAgICAqIHRob3NlIHZhbHVlcyBoYWQgbm90IGJlZW4gcHJlc2VudCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBpZiAodGFyZ2V0LT5tYWRkcl9wYXJhbS5zbGVuICE9IDApIHsKKwlwanNpcF9zaXBfdXJpIG1hZGRyX3VyaTsKKworCW1hZGRyX3VyaS5ob3N0ID0gdGFyZ2V0LT5tYWRkcl9wYXJhbTsKKwltYWRkcl91cmkucG9ydCA9IGdsb2JhbC5wb3J0OworCisJaWYgKGlzX3VyaV9sb2NhbCgmbWFkZHJfdXJpKSkgeworCSAgICB0YXJnZXQtPm1hZGRyX3BhcmFtLnNsZW4gPSAwOworCSAgICB0YXJnZXQtPnBvcnQgPSAwOworCSAgICB0YXJnZXQtPnRyYW5zcG9ydF9wYXJhbS5zbGVuID0gMDsKKwl9CisgICAgfQorCisgICAgLyogSWYgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBSb3V0ZSBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoaXMgcHJveHksCisgICAgICogdGhlIHByb3h5IE1VU1QgcmVtb3ZlIHRoYXQgdmFsdWUgZnJvbSB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBocm91dGUgPSAocGpzaXBfcm91dGVfaGRyKikgCisJICAgICAgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfUk9VVEUsIE5VTEwpOworICAgIGlmIChocm91dGUgJiYgaXNfdXJpX2xvY2FsKChwanNpcF9zaXBfdXJpKilocm91dGUtPm5hbWVfYWRkci51cmkpKSB7CisJcGpfbGlzdF9lcmFzZShocm91dGUpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIFBvc3Rwcm9jZXNzIHRoZSByZXF1ZXN0IGJlZm9yZSBmb3J3YXJkaW5nIGl0ICovCitzdGF0aWMgdm9pZCBwcm94eV9wb3N0cHJvY2VzcyhwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICAvKiBPcHRpb25hbGx5IHJlY29yZC1yb3V0ZSAqLworICAgIGlmIChnbG9iYWwucmVjb3JkX3JvdXRlKSB7CisJY2hhciB1cmlidWZbMTI4XTsKKwlwal9zdHJfdCB1cmk7CisJY29uc3QgcGpfc3RyX3QgSF9SUiA9IHsgIlJlY29yZC1Sb3V0ZSIsIDEyIH07CisJcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyICpycjsKKworCXBqX2Fuc2lfc25wcmludGYodXJpYnVmLCBzaXplb2YodXJpYnVmKSwgIjxzaXA6JS4qczolZDtscj4iLAorCQkJIChpbnQpZ2xvYmFsLm5hbWVbMF0uaG9zdC5zbGVuLAorCQkJIGdsb2JhbC5uYW1lWzBdLmhvc3QucHRyLAorCQkJIGdsb2JhbC5uYW1lWzBdLnBvcnQpOworCXVyaSA9IHBqX3N0cih1cmlidWYpOworCXJyID0gcGpzaXBfZ2VuZXJpY19zdHJpbmdfaGRyX2NyZWF0ZSh0ZGF0YS0+cG9vbCwKKwkJCQkJICAgICAmSF9SUiwgJnVyaSk7CisJcGpzaXBfbXNnX2luc2VydF9maXJzdF9oZHIodGRhdGEtPm1zZywgKHBqc2lwX2hkciopcnIpOworICAgIH0KK30KKworCisvKiBDYWxjdWxhdGUgbmV3IHRhcmdldCBmb3IgdGhlIHJlcXVlc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBwcm94eV9jYWxjdWxhdGVfdGFyZ2V0KHBqc2lwX3J4X2RhdGEgKnJkYXRhLAorCQkJCQkgIHBqc2lwX3R4X2RhdGEgKnRkYXRhKQoreworICAgIHBqc2lwX3NpcF91cmkgKnRhcmdldDsKKworICAgIC8qIFJGQyAzMjYxIFNlY3Rpb24gMTYuNSBEZXRlcm1pbmluZyBSZXF1ZXN0IFRhcmdldHMgKi8KKworICAgIHRhcmdldCA9IChwanNpcF9zaXBfdXJpKikgdGRhdGEtPm1zZy0+bGluZS5yZXEudXJpOworCisgICAgLyogSWYgdGhlIFJlcXVlc3QtVVJJIG9mIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGFuIG1hZGRyIHBhcmFtZXRlciwgdGhlCisgICAgICogUmVxdWVzdC1VUkkgTVVTVCBiZSBwbGFjZWQgaW50byB0aGUgdGFyZ2V0IHNldCBhcyB0aGUgb25seSB0YXJnZXQKKyAgICAgKiBVUkksIGFuZCB0aGUgcHJveHkgTVVTVCBwcm9jZWVkIHRvIFNlY3Rpb24gMTYuNi4KKyAgICAgKi8KKyAgICBpZiAodGFyZ2V0LT5tYWRkcl9wYXJhbS5zbGVuKSB7CisJcHJveHlfcG9zdHByb2Nlc3ModGRhdGEpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworCisgICAgLyogSWYgdGhlIGRvbWFpbiBvZiB0aGUgUmVxdWVzdC1VUkkgaW5kaWNhdGVzIGEgZG9tYWluIHRoaXMgZWxlbWVudCBpcworICAgICAqIG5vdCByZXNwb25zaWJsZSBmb3IsIHRoZSBSZXF1ZXN0LVVSSSBNVVNUIGJlIHBsYWNlZCBpbnRvIHRoZSB0YXJnZXQKKyAgICAgKiBzZXQgYXMgdGhlIG9ubHkgdGFyZ2V0LCBhbmQgdGhlIGVsZW1lbnQgTVVTVCBwcm9jZWVkIHRvIHRoZSB0YXNrIG9mCisgICAgICogUmVxdWVzdCBGb3J3YXJkaW5nIChTZWN0aW9uIDE2LjYpLgorICAgICAqLworICAgIGlmICghaXNfdXJpX2xvY2FsKHRhcmdldCkpIHsKKwlwcm94eV9wb3N0cHJvY2Vzcyh0ZGF0YSk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyogSWYgdGhlIHRhcmdldCBzZXQgZm9yIHRoZSByZXF1ZXN0IGhhcyBub3QgYmVlbiBwcmVkZXRlcm1pbmVkIGFzCisgICAgICogZGVzY3JpYmVkIGFib3ZlLCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgZWxlbWVudCBpcyByZXNwb25zaWJsZSBmb3IgdGhlCisgICAgICogZG9tYWluIGluIHRoZSBSZXF1ZXN0LVVSSSwgYW5kIHRoZSBlbGVtZW50IE1BWSB1c2Ugd2hhdGV2ZXIgbWVjaGFuaXNtCisgICAgICogaXQgZGVzaXJlcyB0byBkZXRlcm1pbmUgd2hlcmUgdG8gc2VuZCB0aGUgcmVxdWVzdC4gCisgICAgICovCisKKyAgICAvKiBXZSdyZSBub3QgaW50ZXJlc3RlZCB0byByZWNlaXZlIHJlcXVlc3QgZGVzdGluZWQgdG8gdXMsIHNvCisgICAgICogcmVzcG9uZCB3aXRoIDQwNC9Ob3QgRm91bmQgKG9ubHkgaWYgcmVxdWVzdCBpcyBub3QgQUNLISkuCisgICAgICovCisgICAgaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCAhPSBQSlNJUF9BQ0tfTUVUSE9EKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoZ2xvYmFsLmVuZHB0LCByZGF0YSwKKwkJCQkgICAgICBQSlNJUF9TQ19OT1RfRk9VTkQsIE5VTEwsCisJCQkJICAgICAgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgLyogRGVsZXRlIHRoZSByZXF1ZXN0IHNpbmNlIHdlJ3JlIG5vdCBmb3J3YXJkaW5nIGl0ICovCisgICAgcGpzaXBfdHhfZGF0YV9kZWNfcmVmKHRkYXRhKTsKKworICAgIHJldHVybiBQSlNJUF9FUlJOT19GUk9NX1NJUF9TVEFUVVMoUEpTSVBfU0NfTk9UX0ZPVU5EKTsKK30KKworCisvKiBEZXN0cm95IHN0YWNrICovCitzdGF0aWMgdm9pZCBkZXN0cm95X3N0YWNrKHZvaWQpCit7CisgICAgcGpzaXBfZW5kcHRfZGVzdHJveShnbG9iYWwuZW5kcHQpOworICAgIHBqX3Bvb2xfcmVsZWFzZShnbG9iYWwucG9vbCk7CisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koJmdsb2JhbC5jcCk7CisKKyAgICBwal9zaHV0ZG93bigpOworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3JlY2ZpbGUuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcmVjZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3JlY2ZpbGUuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogJElkOiByZWNmaWxlLmMgMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19yZWNmaWxlX2MgU2FtcGxlczogQ2FwdHVyaW5nIEF1ZGlvIHRvIFdBViBGaWxlCisgKgorICogSW4gdGhpcyBleGFtcGxlLCB3ZSBjYXB0dXJlIGF1ZGlvIGZyb20gdGhlIHNvdW5kIGRldmljZSBhbmQgc2F2ZSBpdCB0bworICogV0FWRSBmaWxlLgorICoKKyAqIEBzZWUgcGFnZV9wam1lZGlhX3NhbXBsZXNfcGxheWZpbGVfYworICoKKyAqIFRoaXMgZmlsZSBpcyBwanNpcC1hcHBzL3NyYy9zYW1wbGVzL3JlY2ZpbGUuYworICoKKyAqIFxpbmNsdWRlbGluZW5vIHJlY2ZpbGUuYworICovCisKKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIEZvciBsb2dnaW5nIHB1cnBvc2UuICovCisjZGVmaW5lIFRISVNfRklMRSAgICJyZWNmaWxlLmMiCisKKworLyogQ29uZmlncyAqLworI2RlZmluZSBDTE9DS19SQVRFCSAgICA0NDEwMAorI2RlZmluZSBOQ0hBTk5FTFMJICAgIDIKKyNkZWZpbmUgU0FNUExFU19QRVJfRlJBTUUgICAoTkNIQU5ORUxTICogKENMT0NLX1JBVEUgKiAxMCAvIDEwMDApKQorI2RlZmluZSBCSVRTX1BFUl9TQU1QTEUJICAgIDE2CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyAiIEZJTEUJCQkJCSAgICBcbiIKKyAiICByZWNmaWxlLmMJCQkJICAgIFxuIgorICIJCQkJCSAgICBcbiIKKyAiIFBVUlBPU0U6CQkJCSAgICBcbiIKKyAiICBSZWNvcmQgbWljcm9waG9uZSB0byBXQVZFIGZpbGUuCSAgICBcbiIKKyAiCQkJCQkgICAgXG4iCisgIiBVU0FHRToJCQkJICAgIFxuIgorICIgIHJlY2ZpbGUgRklMRS5XQVYJCQkgICAgXG4iCisgIiI7CisKKworLyogVXRpbCB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgICovCitzdGF0aWMgaW50IGFwcF9wZXJyb3IoIGNvbnN0IGNoYXIgKnNlbmRlciwgY29uc3QgY2hhciAqdGl0bGUsIAorCQkgICAgICAgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBQSl9VTlVTRURfQVJHKHNlbmRlcik7CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCisgICAgcHJpbnRmKCIlczogJXMgW2NvZGU9JWRdXG4iLCB0aXRsZSwgZXJybXNnLCBzdGF0dXMpOworICAgIHJldHVybiAxOworfQorCisKKy8qCisgKiBtYWluKCkKKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGptZWRpYV9lbmRwdCAqbWVkX2VuZHB0OworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX3BvcnQgKmZpbGVfcG9ydDsKKyAgICBwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydDsKKyAgICBjaGFyIHRtcFsxMF07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisKKyAgICAvKiBWZXJpZnkgY21kIGxpbmUgYXJndW1lbnRzLiAqLworICAgIGlmIChhcmdjICE9IDIpIHsKKwlwdXRzKCIiKTsKKwlwdXRzKGRlc2MpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBhIHBvb2wgZmFjdG9yeSBiZWZvcmUgd2UgY2FuIGFsbG9jYXRlIGFueSBtZW1vcnkuICovCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIC8qIAorICAgICAqIEluaXRpYWxpemUgbWVkaWEgZW5kcG9pbnQuCisgICAgICogVGhpcyB3aWxsIGltcGxpY2l0bHkgaW5pdGlhbGl6ZSBQSk1FRElBIHRvby4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMSwgJm1lZF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBDcmVhdGUgbWVtb3J5IHBvb2wgZm9yIG91ciBmaWxlIHBsYXllciAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggJmNwLmZhY3RvcnksCSAgICAvKiBwb29sIGZhY3RvcnkJICAgICovCisJCQkgICAiYXBwIiwJICAgIC8qIHBvb2wgbmFtZS4JICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5pdCBzaXplCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluY3JlbWVudCBzaXplCSAgICAqLworCQkJICAgTlVMTAkJICAgIC8qIGNhbGxiYWNrIG9uIGVycm9yICAgICovCisJCQkgICApOworCisgICAgLyogQ3JlYXRlIFdBVkUgZmlsZSB3cml0ZXIgcG9ydC4gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9jcmVhdGUoICBwb29sLCBhcmd2WzFdLAorCQkJCQkgICAgICBDTE9DS19SQVRFLAorCQkJCQkgICAgICBOQ0hBTk5FTFMsCisJCQkJCSAgICAgIFNBTVBMRVNfUEVSX0ZSQU1FLAorCQkJCQkgICAgICBCSVRTX1BFUl9TQU1QTEUsCisJCQkJCSAgICAgIDAsIDAsIAorCQkJCQkgICAgICAmZmlsZV9wb3J0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIFdBViBmaWxlIGZvciB3cml0aW5nIiwgc3RhdHVzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgc291bmQgcGxheWVyIHBvcnQuICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9jcmVhdGVfcmVjKCAKKwkJIHBvb2wsCQkJCSAgICAvKiBwb29sCQkgICAgKi8KKwkJIC0xLAkJCQkgICAgLyogdXNlIGRlZmF1bHQgZGV2LgkgICAgKi8KKwkJIFBKTUVESUFfUElBX1NSQVRFKCZmaWxlX3BvcnQtPmluZm8pLC8qIGNsb2NrIHJhdGUuCSAgICAqLworCQkgUEpNRURJQV9QSUFfQ0NOVCgmZmlsZV9wb3J0LT5pbmZvKSwvKiAjIG9mIGNoYW5uZWxzLgkgICAgKi8KKwkJIFBKTUVESUFfUElBX1NQRigmZmlsZV9wb3J0LT5pbmZvKSwgLyogc2FtcGxlcyBwZXIgZnJhbWUuICAgKi8KKwkJIFBKTUVESUFfUElBX0JJVFMoJmZpbGVfcG9ydC0+aW5mbyksLyogYml0cyBwZXIgc2FtcGxlLgkgICAgKi8KKwkJIDAsCQkJCSAgICAvKiBvcHRpb25zCQkgICAgKi8KKwkJICZzbmRfcG9ydAkJCSAgICAvKiByZXR1cm5lZCBwb3J0CSAgICAqLworCQkgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIHNvdW5kIGRldmljZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQ29ubmVjdCBmaWxlIHBvcnQgdG8gdGhlIHNvdW5kIHBsYXllci4KKyAgICAgKiBTdHJlYW0gcGxheWluZyB3aWxsIGNvbW1lbmNlIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdCggc25kX3BvcnQsIGZpbGVfcG9ydCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworCisgICAgLyogCisgICAgICogUmVjb3JkaW5nIHNob3VsZCBiZSBzdGFydGVkIG5vdy4gCisgICAgICovCisKKworICAgIC8qIFNsZWVwIHRvIGFsbG93IGxvZyBtZXNzYWdlcyB0byBmbHVzaCAqLworICAgIHBqX3RocmVhZF9zbGVlcCgxMCk7CisKKworICAgIHByaW50ZigiUmVjb2RyaW5nICVzLi5cbiIsIGFyZ3ZbMV0pOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIlByZXNzIDxFTlRFUj4gdG8gc3RvcCByZWNvcmRpbmcgYW5kIHF1aXQiKTsKKworICAgIGlmIChmZ2V0cyh0bXAsIHNpemVvZih0bXApLCBzdGRpbikgPT0gTlVMTCkgeworCXB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKyAgICB9CisKKyAgICAKKyAgICAvKiBTdGFydCBkZWluaXRpYWxpemF0aW9uOiAqLworCisgICAgLyogRGVzdHJveSBzb3VuZCBkZXZpY2UgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Rlc3Ryb3koIHNuZF9wb3J0ICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIERlc3Ryb3kgZmlsZSBwb3J0ICovCisgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2Rlc3Ryb3koIGZpbGVfcG9ydCApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBSZWxlYXNlIGFwcGxpY2F0aW9uIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UoIHBvb2wgKTsKKworICAgIC8qIERlc3Ryb3kgbWVkaWEgZW5kcG9pbnQuICovCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KCBtZWRfZW5kcHQgKTsKKworICAgIC8qIERlc3Ryb3kgcG9vbCBmYWN0b3J5ICovCisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZjcCApOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisKKyAgICAvKiBEb25lLiAqLworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9yZXNhbXBsZXBsYXkuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcmVzYW1wbGVwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYjJlMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcmVzYW1wbGVwbGF5LmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qICRJZDogcmVzYW1wbGVwbGF5LmMgMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19yZXNhbXBsZXBsYXlfYyBTYW1wbGVzOiBVc2luZyBSZXNhbXBsZSBQb3J0CisgKgorICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEByZWYgUEpNRURJQV9SRVNBTVBMRV9QT1JUIHRvCisgKiBjaGFuZ2UgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIG1lZGlhIHN0cmVhbXMuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvcmVzYW1wbGVwbGF5LmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyByZXNhbXBsZXBsYXkuYworICovCisKKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbGliLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidXRpbC5oIgorCisvKiBGb3IgbG9nZ2luZyBwdXJwb3NlLiAqLworI2RlZmluZSBUSElTX0ZJTEUgICAicmVzYW1wbGVwbGF5LmMiCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyIgRklMRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICByZXNhbXBsZXBsYXkuYwkgICAgCQkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiBQVVJQT1NFCSAgICAJCQkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiAgRGVtb25zdHJhdGUgaG93IHVzZSByZXNhbXBsZSBwb3J0IHRvIHBsYXkgYSBXQVYgZmlsZSB0byBzb3VuZCAgICBcbiIKKyIgIGRldmljZSB1c2luZyBkaWZmZXJlbnQgc2FtcGxpbmcgcmF0ZS4JCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiBVU0FHRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICByZXNhbXBsZXBsYXkgW29wdGlvbnNdIEZJTEUuV0FWCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIHdoZXJlIG9wdGlvbnM6CQkJCQkJICAgIFxuIgorU05EX1VTQUdFCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiAgVGhlIFdBViBmaWxlIGNvdWxkIGhhdmUgbW9ubyBvciBzdGVyZW8gY2hhbm5lbHMgd2l0aCBhcmJpdHJhcnkgICBcbiIKKyIgIHNhbXBsaW5nIHJhdGUsIGJ1dCBNVVNUIGNvbnRhaW4gdW5jb21wcmVzc2VkIChpLmUuIDE2Yml0KSBQQ00uICAgXG4iOworCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGptZWRpYV9wb3J0ICpmaWxlX3BvcnQ7CisgICAgcGptZWRpYV9wb3J0ICpyZXNhbXBsZV9wb3J0OworICAgIHBqbWVkaWFfc25kX3BvcnQgKnNuZF9wb3J0OworICAgIGNoYXIgdG1wWzEwXTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpbnQgZGV2X2lkID0gLTE7CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBDTE9DS19SQVRFOworICAgIGludCBjaGFubmVsX2NvdW50ID0gTkNIQU5ORUxTOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZSA9IE5TQU1QTEVTOworICAgIGludCBiaXRzX3Blcl9zYW1wbGUgPSBOQklUUzsKKyAgICAvL2ludCBwdGltZTsKKyAgICAvL2ludCBkb3duX3NhbXBsZXM7CisKKyAgICAvKiBNdXN0IGluaXQgUEpMSUIgZmlyc3Q6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBHZXQgb3B0aW9ucyAqLworICAgIGlmIChnZXRfc25kX29wdGlvbnMoVEhJU19GSUxFLCBhcmdjLCBhcmd2LCAmZGV2X2lkLCAmc2FtcGxpbmdfcmF0ZSwKKwkJCSZjaGFubmVsX2NvdW50LCAmc2FtcGxlc19wZXJfZnJhbWUsICZiaXRzX3Blcl9zYW1wbGUpKQorICAgIHsKKwlwdXRzKCIiKTsKKwlwdXRzKGRlc2MpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmICghYXJndltwal9vcHRpbmRdKSB7CisJcHV0cygiRXJyb3I6IG5vIGZpbGUgaXMgc3BlY2lmaWVkIik7CisJcHV0cyhkZXNjKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBhIHBvb2wgZmFjdG9yeSBiZWZvcmUgd2UgY2FuIGFsbG9jYXRlIGFueSBtZW1vcnkuICovCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIC8qIAorICAgICAqIEluaXRpYWxpemUgbWVkaWEgZW5kcG9pbnQuCisgICAgICogVGhpcyB3aWxsIGltcGxpY2l0bHkgaW5pdGlhbGl6ZSBQSk1FRElBIHRvby4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMSwgJm1lZF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBDcmVhdGUgbWVtb3J5IHBvb2wgZm9yIG91ciBmaWxlIHBsYXllciAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggJmNwLmZhY3RvcnksCSAgICAvKiBwb29sIGZhY3RvcnkJICAgICovCisJCQkgICAiYXBwIiwJICAgIC8qIHBvb2wgbmFtZS4JICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5pdCBzaXplCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluY3JlbWVudCBzaXplCSAgICAqLworCQkJICAgTlVMTAkJICAgIC8qIGNhbGxiYWNrIG9uIGVycm9yICAgICovCisJCQkgICApOworCisgICAgLyogQ3JlYXRlIHRoZSBmaWxlIHBvcnQuICovCisgICAgc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKCBwb29sLCBhcmd2W3BqX29wdGluZF0sIDAsIDAsCisJCQkJCSAgICAgMCwgJmZpbGVfcG9ydCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gb3BlbiBmaWxlIiwgc3RhdHVzKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBGaWxlIG11c3QgaGF2ZSBzYW1lIG51bWJlciBvZiBjaGFubmVscy4gKi8KKyAgICBpZiAoUEpNRURJQV9QSUFfQ0NOVCgmZmlsZV9wb3J0LT5pbmZvKSAhPSAodW5zaWduZWQpY2hhbm5lbF9jb3VudCkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICJFcnJvcjogZmlsZSBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBjaGFubmVscy4gIgorCQkJICAgICAiUGVyaGFwcyB5b3UnZCBuZWVkIC1jIG9wdGlvbj8iKSk7CisJcGptZWRpYV9wb3J0X2Rlc3Ryb3koZmlsZV9wb3J0KTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lIHRvIGJlIHRha2VuIGZyb20gZmlsZSBwb3J0ICovCisgICAgLy9wdGltZSA9IHNhbXBsZXNfcGVyX2ZyYW1lICogMTAwMCAvIHNhbXBsaW5nX3JhdGU7CisKKyAgICAvKiBDcmVhdGUgdGhlIHJlc2FtcGxlIHBvcnQuICovCisgICAgc3RhdHVzID0gcGptZWRpYV9yZXNhbXBsZV9wb3J0X2NyZWF0ZSggcG9vbCwgZmlsZV9wb3J0LAorCQkJCQkgICBzYW1wbGluZ19yYXRlLCAwLAorCQkJCQkgICAmcmVzYW1wbGVfcG9ydCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIHJlc2FtcGxlIHBvcnQiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIENyZWF0ZSBzb3VuZCBwbGF5ZXIgcG9ydC4gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2NyZWF0ZSggCisJCSBwb29sLAkJCS8qIHBvb2wJCQkgICAgKi8KKwkJIGRldl9pZCwJCS8qIGRldmljZQkJICAgICovCisJCSBkZXZfaWQsCQkvKiBkZXZpY2UJCSAgICAqLworCQkgc2FtcGxpbmdfcmF0ZSwJCS8qIGNsb2NrIHJhdGUuCQkgICAgKi8KKwkJIGNoYW5uZWxfY291bnQsCQkvKiAjIG9mIGNoYW5uZWxzLgkgICAgKi8KKwkJIHNhbXBsZXNfcGVyX2ZyYW1lLAkvKiBzYW1wbGVzIHBlciBmcmFtZS4JICAgICovCisJCSBiaXRzX3Blcl9zYW1wbGUsCS8qIGJpdHMgcGVyIHNhbXBsZS4JICAgICovCisJCSAwLAkJCS8qIG9wdGlvbnMJCSAgICAqLworCQkgJnNuZF9wb3J0CQkvKiByZXR1cm5lZCBwb3J0CSAgICAqLworCQkgKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIHNvdW5kIGRldmljZSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQ29ubmVjdCByZXNhbXBsZSBwb3J0IHRvIHNvdW5kIGRldmljZSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdCggc25kX3BvcnQsIHJlc2FtcGxlX3BvcnQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgY29ubmVjdGluZyBzb3VuZCBwb3J0cyIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICAvKiBEdW1wIG1lbW9yeSB1c2FnZSAqLworICAgIGR1bXBfcG9vbF91c2FnZShUSElTX0ZJTEUsICZjcCk7CisKKyAgICAvKiAKKyAgICAgKiBGaWxlIHNob3VsZCBiZSBwbGF5aW5nIGFuZCBsb29waW5nIG5vdywgdXNpbmcgc291bmQgZGV2aWNlJ3MgdGhyZWFkLiAKKyAgICAgKi8KKworCisgICAgLyogU2xlZXAgdG8gYWxsb3cgbG9nIG1lc3NhZ2VzIHRvIGZsdXNoICovCisgICAgcGpfdGhyZWFkX3NsZWVwKDEwMCk7CisKKworICAgIHByaW50ZigiUGxheWluZyAlcyBhdCBzYW1wbGluZyByYXRlICVkIChvcmlnaW5hbCBmaWxlIHNhbXBsaW5nIHJhdGU9JWQpXG4iLAorCSAgIGFyZ3ZbcGpfb3B0aW5kXSwgc2FtcGxpbmdfcmF0ZSwKKwkgICBQSk1FRElBX1BJQV9TUkFURSgmZmlsZV9wb3J0LT5pbmZvKSk7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiUHJlc3MgPEVOVEVSPiB0byBzdG9wIHBsYXlpbmcgYW5kIHF1aXQiKTsKKworICAgIGlmIChmZ2V0cyh0bXAsIHNpemVvZih0bXApLCBzdGRpbikgPT0gTlVMTCkgeworCXB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKyAgICB9CisgICAgCisgICAgLyogU3RhcnQgZGVpbml0aWFsaXphdGlvbjogKi8KKworCisgICAgLyogRGVzdHJveSBzb3VuZCBkZXZpY2UgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Rlc3Ryb3koIHNuZF9wb3J0ICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIERlc3Ryb3kgcmVzYW1wbGUgcG9ydC4gCisgICAgICogVGhpcyB3aWxsIGRlc3Ryb3kgYWxsIGRvd25zdHJlYW0gcG9ydHMgKGUuZy4gdGhlIGZpbGUgcG9ydCkKKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZGVzdHJveSggcmVzYW1wbGVfcG9ydCApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBSZWxlYXNlIGFwcGxpY2F0aW9uIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UoIHBvb2wgKTsKKworICAgIC8qIERlc3Ryb3kgbWVkaWEgZW5kcG9pbnQuICovCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KCBtZWRfZW5kcHQgKTsKKworICAgIC8qIERlc3Ryb3kgcG9vbCBmYWN0b3J5ICovCisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZjcCApOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisKKyAgICAvKiBEb25lLiAqLworICAgIHJldHVybiAwOworCit9CisKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpbXBsZV9wanN1YS5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaW1wbGVfcGpzdWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE2ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaW1wbGVfcGpzdWEuYwpAQCAtMCwwICsxLDIwMSBAQAorLyogJElkOiBzaW1wbGVfcGpzdWEuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKioKKyAqIHNpbXBsZV9wanN1YS5jCisgKgorICogVGhpcyBpcyBhIHZlcnkgc2ltcGxlIGJ1dCBmdWxseSBmZWF0dXJlZCBTSVAgdXNlciBhZ2VudCwgd2l0aCB0aGUgCisgKiBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzOgorICogIC0gU0lQIHJlZ2lzdHJhdGlvbgorICogIC0gTWFraW5nIGFuZCByZWNlaXZpbmcgY2FsbAorICogIC0gQXVkaW8vbWVkaWEgdG8gc291bmQgZGV2aWNlLgorICoKKyAqIFVzYWdlOgorICogIC0gVG8gbWFrZSBvdXRnb2luZyBjYWxsLCBzdGFydCBzaW1wbGVfcGpzdWEgd2l0aCB0aGUgVVJMIG9mIHJlbW90ZQorICogICAgZGVzdGluYXRpb24gdG8gY29udGFjdC4KKyAqICAgIEUuZy46CisgKgkgc2ltcGxldWEgc2lwOnVzZXJAcmVtb3RlCisgKgorICogIC0gSW5jb21pbmcgY2FsbHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFuc3dlcmVkIHdpdGggMjAwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSB3aWxsIHF1aXQgb25jZSBpdCBoYXMgY29tcGxldGVkIGEgc2luZ2xlIGNhbGwuCisgKi8KKworI2luY2x1ZGUgPHBqc3VhLWxpYi9wanN1YS5oPgorCisjZGVmaW5lIFRISVNfRklMRQkiQVBQIgorCisjZGVmaW5lIFNJUF9ET01BSU4JImV4YW1wbGUuY29tIgorI2RlZmluZSBTSVBfVVNFUgkiYWxpY2UiCisjZGVmaW5lIFNJUF9QQVNTV0QJInNlY3JldCIKKworCisvKiBDYWxsYmFjayBjYWxsZWQgYnkgdGhlIGxpYnJhcnkgdXBvbiByZWNlaXZpbmcgaW5jb21pbmcgY2FsbCAqLworc3RhdGljIHZvaWQgb25faW5jb21pbmdfY2FsbChwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisJCQkgICAgIHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBjaTsKKworICAgIFBKX1VOVVNFRF9BUkcoYWNjX2lkKTsKKyAgICBQSl9VTlVTRURfQVJHKHJkYXRhKTsKKworICAgIHBqc3VhX2NhbGxfZ2V0X2luZm8oY2FsbF9pZCwgJmNpKTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJJbmNvbWluZyBjYWxsIGZyb20gJS4qcyEhIiwKKwkJCSAoaW50KWNpLnJlbW90ZV9pbmZvLnNsZW4sCisJCQkgY2kucmVtb3RlX2luZm8ucHRyKSk7CisKKyAgICAvKiBBdXRvbWF0aWNhbGx5IGFuc3dlciBpbmNvbWluZyBjYWxscyB3aXRoIDIwMC9PSyAqLworICAgIHBqc3VhX2NhbGxfYW5zd2VyKGNhbGxfaWQsIDIwMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qIENhbGxiYWNrIGNhbGxlZCBieSB0aGUgbGlicmFyeSB3aGVuIGNhbGwncyBzdGF0ZSBoYXMgY2hhbmdlZCAqLworc3RhdGljIHZvaWQgb25fY2FsbF9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQsIHBqc2lwX2V2ZW50ICplKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBjaTsKKworICAgIFBKX1VOVVNFRF9BUkcoZSk7CisKKyAgICBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjaSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhbGwgJWQgc3RhdGU9JS4qcyIsIGNhbGxfaWQsCisJCQkgKGludCljaS5zdGF0ZV90ZXh0LnNsZW4sCisJCQkgY2kuc3RhdGVfdGV4dC5wdHIpKTsKK30KKworLyogQ2FsbGJhY2sgY2FsbGVkIGJ5IHRoZSBsaWJyYXJ5IHdoZW4gY2FsbCdzIG1lZGlhIHN0YXRlIGhhcyBjaGFuZ2VkICovCitzdGF0aWMgdm9pZCBvbl9jYWxsX21lZGlhX3N0YXRlKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCkKK3sKKyAgICBwanN1YV9jYWxsX2luZm8gY2k7CisKKyAgICBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjaSk7CisKKyAgICBpZiAoY2kubWVkaWFfc3RhdHVzID09IFBKU1VBX0NBTExfTUVESUFfQUNUSVZFKSB7CisJLy8gV2hlbiBtZWRpYSBpcyBhY3RpdmUsIGNvbm5lY3QgY2FsbCB0byBzb3VuZCBkZXZpY2UuCisJcGpzdWFfY29uZl9jb25uZWN0KGNpLmNvbmZfc2xvdCwgMCk7CisJcGpzdWFfY29uZl9jb25uZWN0KDAsIGNpLmNvbmZfc2xvdCk7CisgICAgfQorfQorCisvKiBEaXNwbGF5IGVycm9yIGFuZCBleGl0IGFwcGxpY2F0aW9uICovCitzdGF0aWMgdm9pZCBlcnJvcl9leGl0KGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgcGpzdWFfcGVycm9yKFRISVNfRklMRSwgdGl0bGUsIHN0YXR1cyk7CisgICAgcGpzdWFfZGVzdHJveSgpOworICAgIGV4aXQoMSk7Cit9CisKKy8qCisgKiBtYWluKCkKKyAqCisgKiBhcmd2WzFdIG1heSBjb250YWluIFVSTCB0byBjYWxsLgorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqc3VhX2FjY19pZCBhY2NfaWQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogQ3JlYXRlIHBqc3VhIGZpcnN0ISAqLworICAgIHN0YXR1cyA9IHBqc3VhX2NyZWF0ZSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZXJyb3JfZXhpdCgiRXJyb3IgaW4gcGpzdWFfY3JlYXRlKCkiLCBzdGF0dXMpOworCisgICAgLyogSWYgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBpdCdzIGdvdCB0byBiZSBhIHZhbGlkIFNJUCBVUkwgKi8KKyAgICBpZiAoYXJnYyA+IDEpIHsKKwlzdGF0dXMgPSBwanN1YV92ZXJpZnlfdXJsKGFyZ3ZbMV0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZXJyb3JfZXhpdCgiSW52YWxpZCBVUkwgaW4gYXJndiIsIHN0YXR1cyk7CisgICAgfQorCisgICAgLyogSW5pdCBwanN1YSAqLworICAgIHsKKwlwanN1YV9jb25maWcgY2ZnOworCXBqc3VhX2xvZ2dpbmdfY29uZmlnIGxvZ19jZmc7CisKKwlwanN1YV9jb25maWdfZGVmYXVsdCgmY2ZnKTsKKwljZmcuY2Iub25faW5jb21pbmdfY2FsbCA9ICZvbl9pbmNvbWluZ19jYWxsOworCWNmZy5jYi5vbl9jYWxsX21lZGlhX3N0YXRlID0gJm9uX2NhbGxfbWVkaWFfc3RhdGU7CisJY2ZnLmNiLm9uX2NhbGxfc3RhdGUgPSAmb25fY2FsbF9zdGF0ZTsKKworCXBqc3VhX2xvZ2dpbmdfY29uZmlnX2RlZmF1bHQoJmxvZ19jZmcpOworCWxvZ19jZmcuY29uc29sZV9sZXZlbCA9IDQ7CisKKwlzdGF0dXMgPSBwanN1YV9pbml0KCZjZmcsICZsb2dfY2ZnLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIGVycm9yX2V4aXQoIkVycm9yIGluIHBqc3VhX2luaXQoKSIsIHN0YXR1cyk7CisgICAgfQorCisgICAgLyogQWRkIFVEUCB0cmFuc3BvcnQuICovCisgICAgeworCXBqc3VhX3RyYW5zcG9ydF9jb25maWcgY2ZnOworCisJcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCZjZmcpOworCWNmZy5wb3J0ID0gNTA2MDsKKwlzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfY3JlYXRlKFBKU0lQX1RSQU5TUE9SVF9VRFAsICZjZmcsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZXJyb3JfZXhpdCgiRXJyb3IgY3JlYXRpbmcgdHJhbnNwb3J0Iiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXphdGlvbiBpcyBkb25lLCBub3cgc3RhcnQgcGpzdWEgKi8KKyAgICBzdGF0dXMgPSBwanN1YV9zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZXJyb3JfZXhpdCgiRXJyb3Igc3RhcnRpbmcgcGpzdWEiLCBzdGF0dXMpOworCisgICAgLyogUmVnaXN0ZXIgdG8gU0lQIHNlcnZlciBieSBjcmVhdGluZyBTSVAgYWNjb3VudC4gKi8KKyAgICB7CisJcGpzdWFfYWNjX2NvbmZpZyBjZmc7CisKKwlwanN1YV9hY2NfY29uZmlnX2RlZmF1bHQoJmNmZyk7CisJY2ZnLmlkID0gcGpfc3RyKCJzaXA6IiBTSVBfVVNFUiAiQCIgU0lQX0RPTUFJTik7CisJY2ZnLnJlZ191cmkgPSBwal9zdHIoInNpcDoiIFNJUF9ET01BSU4pOworCWNmZy5jcmVkX2NvdW50ID0gMTsKKwljZmcuY3JlZF9pbmZvWzBdLnJlYWxtID0gcGpfc3RyKFNJUF9ET01BSU4pOworCWNmZy5jcmVkX2luZm9bMF0uc2NoZW1lID0gcGpfc3RyKCJkaWdlc3QiKTsKKwljZmcuY3JlZF9pbmZvWzBdLnVzZXJuYW1lID0gcGpfc3RyKFNJUF9VU0VSKTsKKwljZmcuY3JlZF9pbmZvWzBdLmRhdGFfdHlwZSA9IFBKU0lQX0NSRURfREFUQV9QTEFJTl9QQVNTV0Q7CisJY2ZnLmNyZWRfaW5mb1swXS5kYXRhID0gcGpfc3RyKFNJUF9QQVNTV0QpOworCisJc3RhdHVzID0gcGpzdWFfYWNjX2FkZCgmY2ZnLCBQSl9UUlVFLCAmYWNjX2lkKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIGVycm9yX2V4aXQoIkVycm9yIGFkZGluZyBhY2NvdW50Iiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBJZiBVUkwgaXMgc3BlY2lmaWVkLCBtYWtlIGNhbGwgdG8gdGhlIFVSTC4gKi8KKyAgICBpZiAoYXJnYyA+IDEpIHsKKwlwal9zdHJfdCB1cmkgPSBwal9zdHIoYXJndlsxXSk7CisJc3RhdHVzID0gcGpzdWFfY2FsbF9tYWtlX2NhbGwoYWNjX2lkLCAmdXJpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIGVycm9yX2V4aXQoIkVycm9yIG1ha2luZyBjYWxsIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBXYWl0IHVudGlsIHVzZXIgcHJlc3MgInEiIHRvIHF1aXQuICovCisgICAgZm9yICg7OykgeworCWNoYXIgb3B0aW9uWzEwXTsKKworCXB1dHMoIlByZXNzICdoJyB0byBoYW5ndXAgYWxsIGNhbGxzLCAncScgdG8gcXVpdCIpOworCWlmIChmZ2V0cyhvcHRpb24sIHNpemVvZihvcHRpb24pLCBzdGRpbikgPT0gTlVMTCkgeworCSAgICBwdXRzKCJFT0Ygd2hpbGUgcmVhZGluZyBzdGRpbiwgd2lsbCBxdWl0IG5vdy4uIik7CisJICAgIGJyZWFrOworCX0KKworCWlmIChvcHRpb25bMF0gPT0gJ3EnKQorCSAgICBicmVhazsKKworCWlmIChvcHRpb25bMF0gPT0gJ2gnKQorCSAgICBwanN1YV9jYWxsX2hhbmd1cF9hbGwoKTsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IHBqc3VhICovCisgICAgcGpzdWFfZGVzdHJveSgpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpbXBsZXVhLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpbXBsZXVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNjMyMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2ltcGxldWEuYwpAQCAtMCwwICsxLDEwMzAgQEAKKy8qICRJZDogc2ltcGxldWEuYyA0MDUxIDIwMTItMDQtMTMgMDg6MTY6MzBaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworCisvKioKKyAqIHNpbXBsZXVhLmMKKyAqCisgKiBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgU0lQIHVzZXIgYWdlbnQgY29tcGxldGUgd2l0aCBtZWRpYS4gVGhlIHVzZXIKKyAqIGFnZW50IHNob3VsZCBkbyBhIHByb3BlciBTRFAgbmVnb3RpYXRpb24gYW5kIHN0YXJ0IFJUUCBtZWRpYSBvbmNlCisgKiBTRFAgbmVnb3RpYXRpb24gaGFzIGNvbXBsZXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gZG9lcyBub3QgcmVnaXN0ZXIgdG8gU0lQIHNlcnZlci4KKyAqCisgKiBDYXBhYmlsaXRpZXMgdG8gYmUgZGVtb25zdHJhdGVkIGhlcmU6CisgKiAgLSBCYXNpYyBjYWxsCisgKiAgLSBTaG91bGQgc3VwcG9ydCBJUHY2IChub3QgdGVzdGVkKQorICogIC0gVURQIHRyYW5zcG9ydCBhdCBwb3J0IDUwNjAgKGhhcmQgY29kZWQpCisgKiAgLSBSVFAgc29ja2V0IGF0IHBvcnQgNDAwMCAoaGFyZCBjb2RlZCkKKyAqICAtIHByb3BlciBTRFAgbmVnb3RpYXRpb24KKyAqICAtIFBDTUEvUENNVSBjb2RlYyBvbmx5LgorICogIC0gQXVkaW8vbWVkaWEgdG8gc291bmQgZGV2aWNlLgorICoKKyAqCisgKiBVc2FnZToKKyAqICAtIFRvIG1ha2Ugb3V0Z29pbmcgY2FsbCwgc3RhcnQgc2ltcGxldWEgd2l0aCB0aGUgVVJMIG9mIHJlbW90ZQorICogICAgZGVzdGluYXRpb24gdG8gY29udGFjdC4KKyAqICAgIEUuZy46CisgKgkgc2ltcGxldWEgc2lwOnVzZXJAcmVtb3RlCisgKgorICogIC0gSW5jb21pbmcgY2FsbHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFuc3dlcmVkIHdpdGggMTgwLCB0aGVuIDIwMC4KKyAqCisgKiBUaGlzIHByb2dyYW0gZG9lcyBub3QgZGlzY29ubmVjdCBjYWxsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSB3aWxsIHF1aXQgb25jZSBpdCBoYXMgY29tcGxldGVkIGEgc2luZ2xlIGNhbGwuCisgKi8KKworLyogSW5jbHVkZSBhbGwgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxwanNpcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjLmg+CisjaW5jbHVkZSA8cGpzaXBfdWEuaD4KKyNpbmNsdWRlIDxwanNpcF9zaW1wbGUuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworLyogRm9yIGxvZ2dpbmcgcHVycG9zZS4gKi8KKyNkZWZpbmUgVEhJU19GSUxFICAgInNpbXBsZXVhLmMiCisKKyNpbmNsdWRlICJ1dGlsLmgiCisKKworLyogU2V0dGluZ3MgKi8KKyNkZWZpbmUgQUYJCXBqX0FGX0lORVQoKSAvKiBDaGFuZ2UgdG8gcGpfQUZfSU5FVDYoKSBmb3IgSVB2Ni4KKwkJCQkgICAgICAqIFBKX0hBU19JUFY2IG11c3QgYmUgZW5hYmxlZCBhbmQKKwkJCQkgICAgICAqIHlvdXIgc3lzdGVtIG11c3Qgc3VwcG9ydCBJUHY2LiAgKi8KKyNpZiAwCisjZGVmaW5lIFNJUF9QT1JUCTUwODAJICAgICAvKiBMaXN0ZW5pbmcgU0lQIHBvcnQJCSovCisjZGVmaW5lIFJUUF9QT1JUCTUwMDAJICAgICAvKiBSVFAgcG9ydAkJCSovCisjZWxzZQorI2RlZmluZSBTSVBfUE9SVAk1MDYwCSAgICAgLyogTGlzdGVuaW5nIFNJUCBwb3J0CQkqLworI2RlZmluZSBSVFBfUE9SVAk0MDAwCSAgICAgLyogUlRQIHBvcnQJCQkqLworI2VuZGlmCisKKyNkZWZpbmUgTUFYX01FRElBX0NOVAkyCSAgICAgLyogTWVkaWEgY291bnQsIHNldCB0byAxIGZvciBhdWRpbworCQkJCSAgICAgICogb25seSBvciAyIGZvciBhdWRpbyBhbmQgdmlkZW8JKi8KKworLyoKKyAqIFN0YXRpYyB2YXJpYWJsZXMuCisgKi8KKworc3RhdGljIHBqX2Jvb2xfdAkgICAgIGdfY29tcGxldGU7ICAgIC8qIFF1aXQgZmxhZy4JCSovCitzdGF0aWMgcGpzaXBfZW5kcG9pbnQJICAgICpnX2VuZHB0OwkgICAgLyogU0lQIGVuZHBvaW50LgkJKi8KK3N0YXRpYyBwal9jYWNoaW5nX3Bvb2wJICAgICBjcDsJICAgIC8qIEdsb2JhbCBwb29sIGZhY3RvcnkuCSovCisKK3N0YXRpYyBwam1lZGlhX2VuZHB0CSAgICAqZ19tZWRfZW5kcHQ7ICAgLyogTWVkaWEgZW5kcG9pbnQuCQkqLworCitzdGF0aWMgcGptZWRpYV90cmFuc3BvcnRfaW5mbyBnX21lZF90cGluZm9bTUFYX01FRElBX0NOVF07IAorCQkJCQkgICAgLyogU29ja2V0IGluZm8gZm9yIG1lZGlhCSovCitzdGF0aWMgcGptZWRpYV90cmFuc3BvcnQgICAgKmdfbWVkX3RyYW5zcG9ydFtNQVhfTUVESUFfQ05UXTsKKwkJCQkJICAgIC8qIE1lZGlhIHN0cmVhbSB0cmFuc3BvcnQJKi8KK3N0YXRpYyBwam1lZGlhX3NvY2tfaW5mbyAgICAgZ19zb2NrX2luZm9bTUFYX01FRElBX0NOVF07ICAKKwkJCQkJICAgIC8qIFNvY2tldCBpbmZvIGFycmF5CSovCisKKy8qIENhbGwgdmFyaWFibGVzOiAqLworc3RhdGljIHBqc2lwX2ludl9zZXNzaW9uICAgICpnX2ludjsJICAgIC8qIEN1cnJlbnQgaW52aXRlIHNlc3Npb24uCSovCitzdGF0aWMgcGptZWRpYV9zdHJlYW0gICAgICAgKmdfbWVkX3N0cmVhbTsgIC8qIENhbGwncyBhdWRpbyBzdHJlYW0uCSovCitzdGF0aWMgcGptZWRpYV9zbmRfcG9ydAkgICAgKmdfc25kX3BvcnQ7ICAgIC8qIFNvdW5kIGRldmljZS4JCSovCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1ZJREVPKSAmJiAoUEpNRURJQV9IQVNfVklERU8gIT0gMCkKK3N0YXRpYyBwam1lZGlhX3ZpZF9zdHJlYW0gICAqZ19tZWRfdnN0cmVhbTsgLyogQ2FsbCdzIHZpZGVvIHN0cmVhbS4JKi8KK3N0YXRpYyBwam1lZGlhX3ZpZF9wb3J0CSAgICAqZ192aWRfY2FwdHVyZXI7LyogQ2FsbCdzIHZpZGVvIGNhcHR1cmVyLgkqLworc3RhdGljIHBqbWVkaWFfdmlkX3BvcnQJICAgICpnX3ZpZF9yZW5kZXJlcjsvKiBDYWxsJ3MgdmlkZW8gcmVuZGVyZXIuCSovCisjZW5kaWYJLyogUEpNRURJQV9IQVNfVklERU8gKi8KKworLyoKKyAqIFByb3RvdHlwZXM6CisgKi8KKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gU0RQIG5lZ290aWF0aW9uIGlzIGRvbmUgaW4gdGhlIGNhbGw6ICovCitzdGF0aWMgdm9pZCBjYWxsX29uX21lZGlhX3VwZGF0ZSggcGpzaXBfaW52X3Nlc3Npb24gKmludiwKKwkJCQkgIHBqX3N0YXR1c190IHN0YXR1cyk7CisKKy8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGludml0ZSBzZXNzaW9uJ3Mgc3RhdGUgaGFzIGNoYW5nZWQ6ICovCitzdGF0aWMgdm9pZCBjYWxsX29uX3N0YXRlX2NoYW5nZWQoIHBqc2lwX2ludl9zZXNzaW9uICppbnYsIAorCQkJCSAgIHBqc2lwX2V2ZW50ICplKTsKKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gZGlhbG9nIGhhcyBmb3JrZWQ6ICovCitzdGF0aWMgdm9pZCBjYWxsX29uX2ZvcmtlZChwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCBwanNpcF9ldmVudCAqZSk7CisKKy8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMgb3V0c2lkZSBkaWFsb2dzOiAqLworc3RhdGljIHBqX2Jvb2xfdCBvbl9yeF9yZXF1ZXN0KCBwanNpcF9yeF9kYXRhICpyZGF0YSApOworCisKKworCisvKiBUaGlzIGlzIGEgUEpTSVAgbW9kdWxlIHRvIGJlIHJlZ2lzdGVyZWQgYnkgYXBwbGljYXRpb24gdG8gaGFuZGxlCisgKiBpbmNvbWluZyByZXF1ZXN0cyBvdXRzaWRlIGFueSBkaWFsb2dzL3RyYW5zYWN0aW9ucy4gVGhlIG1haW4gcHVycG9zZQorICogaGVyZSBpcyB0byBoYW5kbGUgaW5jb21pbmcgSU5WSVRFIHJlcXVlc3QgbWVzc2FnZSwgd2hlcmUgd2Ugd2lsbAorICogY3JlYXRlIGEgZGlhbG9nIGFuZCBJTlZJVEUgc2Vzc2lvbiBmb3IgaXQuCisgKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX3NpbXBsZXVhID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2Qtc2ltcGxldWEiLCAxMiB9LAkgICAgLyogTmFtZS4JCQkqLworICAgIC0xLAkJCQkgICAgLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTiwgLyogUHJpb3JpdHkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIGxvYWQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RhcnQoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogc3RvcCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiB1bmxvYWQoKQkJCSovCisgICAgJm9uX3J4X3JlcXVlc3QsCQkgICAgLyogb25fcnhfcmVxdWVzdCgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3J4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVxdWVzdC4JCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHhfcmVzcG9uc2UoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90c3hfc3RhdGUoKQkJKi8KK307CisKKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfYm9vbF90IGxvZ2dpbmdfb25fcnhfbXNnKHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJSWCAlZCBieXRlcyAlcyBmcm9tICVzICVzOiVkOlxuIgorCQkJICIlLipzXG4iCisJCQkgIi0tZW5kIG1zZy0tIiwKKwkJCSByZGF0YS0+bXNnX2luZm8ubGVuLAorCQkJIHBqc2lwX3J4X2RhdGFfZ2V0X2luZm8ocmRhdGEpLAorCQkJIHJkYXRhLT50cF9pbmZvLnRyYW5zcG9ydC0+dHlwZV9uYW1lLAorCQkJIHJkYXRhLT5wa3RfaW5mby5zcmNfbmFtZSwKKwkJCSByZGF0YS0+cGt0X2luZm8uc3JjX3BvcnQsCisJCQkgKGludClyZGF0YS0+bXNnX2luZm8ubGVuLAorCQkJIHJkYXRhLT5tc2dfaW5mby5tc2dfYnVmKSk7CisgICAgCisgICAgLyogQWx3YXlzIHJldHVybiBmYWxzZSwgb3RoZXJ3aXNlIG1lc3NhZ2VzIHdpbGwgbm90IGdldCBwcm9jZXNzZWQhICovCisgICAgcmV0dXJuIFBKX0ZBTFNFOworfQorCisvKiBOb3RpZmljYXRpb24gb24gb3V0Z29pbmcgbWVzc2FnZXMgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBsb2dnaW5nX29uX3R4X21zZyhwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICAKKyAgICAvKiBJbXBvcnRhbnQgbm90ZToKKyAgICAgKgl0cF9pbmZvIGZpZWxkIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgb3V0Z29pbmcgbWVzc2FnZXMgaGFzIHBhc3NlZAorICAgICAqCXRyYW5zcG9ydCBsYXllci4gU28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyB0cF9pbmZvIHdoZW4gdGhlIG1vZHVsZQorICAgICAqCWhhcyBsb3dlciBwcmlvcml0eSB0aGFuIHRyYW5zcG9ydCBsYXllci4KKyAgICAgKi8KKworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJUWCAlZCBieXRlcyAlcyB0byAlcyAlczolZDpcbiIKKwkJCSAiJS4qc1xuIgorCQkJICItLWVuZCBtc2ctLSIsCisJCQkgKHRkYXRhLT5idWYuY3VyIC0gdGRhdGEtPmJ1Zi5zdGFydCksCisJCQkgcGpzaXBfdHhfZGF0YV9nZXRfaW5mbyh0ZGF0YSksCisJCQkgdGRhdGEtPnRwX2luZm8udHJhbnNwb3J0LT50eXBlX25hbWUsCisJCQkgdGRhdGEtPnRwX2luZm8uZHN0X25hbWUsCisJCQkgdGRhdGEtPnRwX2luZm8uZHN0X3BvcnQsCisJCQkgKGludCkodGRhdGEtPmJ1Zi5jdXIgLSB0ZGF0YS0+YnVmLnN0YXJ0KSwKKwkJCSB0ZGF0YS0+YnVmLnN0YXJ0KSk7CisKKyAgICAvKiBBbHdheXMgcmV0dXJuIHN1Y2Nlc3MsIG90aGVyd2lzZSBtZXNzYWdlIHdpbGwgbm90IGdldCBzZW50ISAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBUaGUgbW9kdWxlIGluc3RhbmNlLiAqLworc3RhdGljIHBqc2lwX21vZHVsZSBtc2dfbG9nZ2VyID0gCit7CisgICAgTlVMTCwgTlVMTCwJCQkJLyogcHJldiwgbmV4dC4JCSovCisgICAgeyAibW9kLW1zZy1sb2ciLCAxMyB9LAkJLyogTmFtZS4JCSovCisgICAgLTEsCQkJCQkvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX1RSQU5TUE9SVF9MQVlFUi0xLC8qIFByaW9yaXR5CSAgICAgICAgKi8KKyAgICBOVUxMLAkJCQkvKiBsb2FkKCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RhcnQoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiBzdG9wKCkJCSovCisgICAgTlVMTCwJCQkJLyogdW5sb2FkKCkJCSovCisgICAgJmxvZ2dpbmdfb25fcnhfbXNnLAkJCS8qIG9uX3J4X3JlcXVlc3QoKQkqLworICAgICZsb2dnaW5nX29uX3J4X21zZywJCQkvKiBvbl9yeF9yZXNwb25zZSgpCSovCisgICAgJmxvZ2dpbmdfb25fdHhfbXNnLAkJCS8qIG9uX3R4X3JlcXVlc3QuCSovCisgICAgJmxvZ2dpbmdfb25fdHhfbXNnLAkJCS8qIG9uX3R4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90c3hfc3RhdGUoKQkqLworCit9OworCisKKy8qCisgKiBtYWluKCkKKyAqCisgKiBJZiBjYWxsZWQgd2l0aCBhcmd1bWVudCwgdHJlYXQgYXJndW1lbnQgYXMgU0lQIFVSTCB0byBiZSBjYWxsZWQuCisgKiBPdGhlcndpc2Ugd2FpdCBmb3IgaW5jb21pbmcgY2FsbHMuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICBwal9sb2dfc2V0X2xldmVsKDUpOworCisgICAgLyogVGhlbiBpbml0IFBKTElCLVVUSUw6ICovCisgICAgc3RhdHVzID0gcGpsaWJfdXRpbF9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisKKyAgICAvKiBDcmVhdGUgZ2xvYmFsIGVuZHBvaW50OiAqLworICAgIHsKKwljb25zdCBwal9zdHJfdCAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqZW5kcHRfbmFtZTsKKworCS8qIEVuZHBvaW50IE1VU1QgYmUgYXNzaWduZWQgYSBnbG9iYWxseSB1bmlxdWUgbmFtZS4KKwkgKiBUaGUgbmFtZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGhvc3RuYW1lIGluIFdhcm5pbmcgaGVhZGVyLgorCSAqLworCisJLyogRm9yIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlJ2xsIHVzZSBob3N0bmFtZSBmb3Igc2ltcGxpY2l0eSAqLworCWhvc3RuYW1lID0gcGpfZ2V0aG9zdG5hbWUoKTsKKwllbmRwdF9uYW1lID0gaG9zdG5hbWUtPnB0cjsKKworCS8qIENyZWF0ZSB0aGUgZW5kcG9pbnQ6ICovCisKKwlzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIGVuZHB0X25hbWUsIAorCQkJCSAgICAmZ19lbmRwdCk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgfQorCisKKyAgICAvKiAKKyAgICAgKiBBZGQgVURQIHRyYW5zcG9ydCwgd2l0aCBoYXJkLWNvZGVkIHBvcnQgCisgICAgICogQWx0ZXJuYXRpdmVseSwgYXBwbGljYXRpb24gY2FuIHVzZSBwanNpcF91ZHBfdHJhbnNwb3J0X2F0dGFjaCgpIHRvCisgICAgICogc3RhcnQgVURQIHRyYW5zcG9ydCwgaWYgaXQgYWxyZWFkeSBoYXMgYW4gVURQIHNvY2tldCAoZS5nLiBhZnRlciBpdAorICAgICAqIHJlc29sdmVzIHRoZSBhZGRyZXNzIHdpdGggU1RVTikuCisgICAgICovCisgICAgeworCXBqX3NvY2thZGRyIGFkZHI7CisKKwlwal9zb2NrYWRkcl9pbml0KEFGLCAmYWRkciwgTlVMTCwgKHBqX3VpbnQxNl90KVNJUF9QT1JUKTsKKwkKKwlpZiAoQUYgPT0gcGpfQUZfSU5FVCgpKSB7CisJICAgIHN0YXR1cyA9IHBqc2lwX3VkcF90cmFuc3BvcnRfc3RhcnQoIGdfZW5kcHQsICZhZGRyLmlwdjQsIE5VTEwsIAorCQkJCQkJMSwgTlVMTCk7CisJfSBlbHNlIGlmIChBRiA9PSBwal9BRl9JTkVUNigpKSB7CisJICAgIHN0YXR1cyA9IHBqc2lwX3VkcF90cmFuc3BvcnRfc3RhcnQ2KGdfZW5kcHQsICZhZGRyLmlwdjYsIE5VTEwsCisJCQkJCQkxLCBOVUxMKTsKKwl9IGVsc2UgeworCSAgICBzdGF0dXMgPSBQSl9FQUZOT1RTVVA7CisJfQorCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHN0YXJ0IFVEUCB0cmFuc3BvcnQiLCBzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisKKyAgICAvKiAKKyAgICAgKiBJbml0IHRyYW5zYWN0aW9uIGxheWVyLgorICAgICAqIFRoaXMgd2lsbCBjcmVhdGUvaW5pdGlhbGl6ZSB0cmFuc2FjdGlvbiBoYXNoIHRhYmxlcyBldGMuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfdHN4X2xheWVyX2luaXRfbW9kdWxlKGdfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIFVBIGxheWVyIG1vZHVsZS4KKyAgICAgKiBUaGlzIHdpbGwgY3JlYXRlL2luaXRpYWxpemUgZGlhbG9nIGhhc2ggdGFibGVzIGV0Yy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF91YV9pbml0X21vZHVsZSggZ19lbmRwdCwgTlVMTCApOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiAKKyAgICAgKiBJbml0IGludml0ZSBzZXNzaW9uIG1vZHVsZS4KKyAgICAgKiBUaGUgaW52aXRlIHNlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHRha2VzIGFkZGl0aW9uYWwgYXJndW1lbnQsCisgICAgICogaS5lLiBhIHN0cnVjdHVyZSBjb250YWluaW5nIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgb24gc3BlY2lmaWMKKyAgICAgKiBvY2N1cmVuY2Ugb2YgZXZlbnRzLgorICAgICAqCisgICAgICogVGhlIG9uX3N0YXRlX2NoYW5nZWQgYW5kIG9uX25ld19zZXNzaW9uIGNhbGxiYWNrcyBhcmUgbWFuZGF0b3J5LgorICAgICAqIEFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFdlIHVzZSBvbl9tZWRpYV91cGRhdGUoKSBjYWxsYmFjayBpbiB0aGlzIGFwcGxpY2F0aW9uIHRvIHN0YXJ0CisgICAgICogbWVkaWEgdHJhbnNtaXNzaW9uLgorICAgICAqLworICAgIHsKKwlwanNpcF9pbnZfY2FsbGJhY2sgaW52X2NiOworCisJLyogSW5pdCB0aGUgY2FsbGJhY2sgZm9yIElOVklURSBzZXNzaW9uOiAqLworCXBqX2J6ZXJvKCZpbnZfY2IsIHNpemVvZihpbnZfY2IpKTsKKwlpbnZfY2Iub25fc3RhdGVfY2hhbmdlZCA9ICZjYWxsX29uX3N0YXRlX2NoYW5nZWQ7CisJaW52X2NiLm9uX25ld19zZXNzaW9uID0gJmNhbGxfb25fZm9ya2VkOworCWludl9jYi5vbl9tZWRpYV91cGRhdGUgPSAmY2FsbF9vbl9tZWRpYV91cGRhdGU7CisKKwkvKiBJbml0aWFsaXplIGludml0ZSBzZXNzaW9uIG1vZHVsZTogICovCisJc3RhdHVzID0gcGpzaXBfaW52X3VzYWdlX2luaXQoZ19lbmRwdCwgJmludl9jYik7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSAxMDByZWwgc3VwcG9ydCAqLworICAgIHN0YXR1cyA9IHBqc2lwXzEwMHJlbF9pbml0X21vZHVsZShnX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisgICAgLyoKKyAgICAgKiBSZWdpc3RlciBvdXIgbW9kdWxlIHRvIHJlY2VpdmUgaW5jb21pbmcgcmVxdWVzdHMuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKCBnX2VuZHB0LCAmbW9kX3NpbXBsZXVhKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qCisgICAgICogUmVnaXN0ZXIgbWVzc2FnZSBsb2dnZXIgbW9kdWxlLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3JlZ2lzdGVyX21vZHVsZSggZ19lbmRwdCwgJm1zZ19sb2dnZXIpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIG1lZGlhIGVuZHBvaW50LgorICAgICAqIFRoaXMgd2lsbCBpbXBsaWNpdGx5IGluaXRpYWxpemUgUEpNRURJQSB0b28uCisgICAgICovCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMSwgJmdfbWVkX2VuZHB0KTsKKyNlbHNlCisgICAgc3RhdHVzID0gcGptZWRpYV9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIAorCQkJCSAgcGpzaXBfZW5kcHRfZ2V0X2lvcXVldWUoZ19lbmRwdCksIAorCQkJCSAgMCwgJmdfbWVkX2VuZHB0KTsKKyNlbmRpZgorICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogCisgICAgICogQWRkIFBDTUEvUENNVSBjb2RlYyB0byB0aGUgbWVkaWEgZW5kcG9pbnQuIAorICAgICAqLworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfRzcxMV9DT0RFQykgJiYgUEpNRURJQV9IQVNfRzcxMV9DT0RFQyE9MAorICAgIHN0YXR1cyA9IHBqbWVkaWFfY29kZWNfZzcxMV9pbml0KGdfbWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1ZJREVPKSAmJiAoUEpNRURJQV9IQVNfVklERU8gIT0gMCkKKyAgICAvKiBJbml0IHZpZGVvIHN1YnN5c3RlbSAqLworICAgIHBvb2wgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZV9wb29sKGdfbWVkX2VuZHB0LCAiVmlkZW8gc3Vic3lzdGVtIiwgNTEyLCA1MTIpOworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9jcmVhdGUocG9vbCwgNjQsIDAsIE5VTEwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworICAgIHN0YXR1cyA9IHBqbWVkaWFfY29udmVydGVyX21ncl9jcmVhdGUocG9vbCwgTlVMTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2NyZWF0ZShwb29sLCBOVUxMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9kZXZfc3Vic3lzX2luaXQoJmNwLmZhY3RvcnkpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisjICBpZiBkZWZpbmVkKFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMpICYmIFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMhPTAKKyAgICAvKiBJbml0IGZmbXBlZyB2aWRlbyBjb2RlY3MgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvZGVjX2ZmbXBlZ192aWRfaW5pdChOVUxMLCAmY3AuZmFjdG9yeSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisjICBlbmRpZiAgLyogUEpNRURJQV9IQVNfRkZNUEVHX1ZJRF9DT0RFQyAqLworCisjZW5kaWYJLyogUEpNRURJQV9IQVNfVklERU8gKi8KKyAgICAKKyAgICAvKiAKKyAgICAgKiBDcmVhdGUgbWVkaWEgdHJhbnNwb3J0IHVzZWQgdG8gc2VuZC9yZWNlaXZlIFJUUC9SVENQIHNvY2tldC4KKyAgICAgKiBPbmUgbWVkaWEgdHJhbnNwb3J0IGlzIG5lZWRlZCBmb3IgZWFjaCBjYWxsLiBBcHBsaWNhdGlvbiBtYXkKKyAgICAgKiBvcHQgdG8gcmUtdXNlIHRoZSBzYW1lIG1lZGlhIHRyYW5zcG9ydCBmb3Igc3Vic2VxdWVudCBjYWxscy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUEpfQVJSQVlfU0laRShnX21lZF90cmFuc3BvcnQpOyArK2kpIHsKKwlzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF91ZHBfY3JlYXRlMyhnX21lZF9lbmRwdCwgQUYsIE5VTEwsIE5VTEwsIAorCQkJCQkgICAgICAgUlRQX1BPUlQgKyBpKjIsIDAsIAorCQkJCQkgICAgICAgJmdfbWVkX3RyYW5zcG9ydFtpXSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBtZWRpYSB0cmFuc3BvcnQiLCBzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiAKKwkgKiBHZXQgc29ja2V0IGluZm8gKGFkZHJlc3MsIHBvcnQpIG9mIHRoZSBtZWRpYSB0cmFuc3BvcnQuIFdlIHdpbGwKKwkgKiBuZWVkIHRoaXMgaW5mbyB0byBjcmVhdGUgU0RQIChpLmUuIHRoZSBhZGRyZXNzIGFuZCBwb3J0IGluZm8gaW4KKwkgKiB0aGUgU0RQKS4KKwkgKi8KKwlwam1lZGlhX3RyYW5zcG9ydF9pbmZvX2luaXQoJmdfbWVkX3RwaW5mb1tpXSk7CisJcGptZWRpYV90cmFuc3BvcnRfZ2V0X2luZm8oZ19tZWRfdHJhbnNwb3J0W2ldLCAmZ19tZWRfdHBpbmZvW2ldKTsKKworCXBqX21lbWNweSgmZ19zb2NrX2luZm9baV0sICZnX21lZF90cGluZm9baV0uc29ja19pbmZvLAorCQkgIHNpemVvZihwam1lZGlhX3NvY2tfaW5mbykpOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgVVJMIGlzIHNwZWNpZmllZCwgdGhlbiBtYWtlIGNhbGwgaW1tZWRpYXRlbHkuCisgICAgICovCisgICAgaWYgKGFyZ2MgPiAxKSB7CisJcGpfc29ja2FkZHIgaG9zdGFkZHI7CisJY2hhciBob3N0aXBbUEpfSU5FVDZfQUREUlNUUkxFTisyXTsKKwljaGFyIHRlbXBbODBdOworCXBqX3N0cl90IGRzdF91cmkgPSBwal9zdHIoYXJndlsxXSk7CisJcGpfc3RyX3QgbG9jYWxfdXJpOworCXBqc2lwX2RpYWxvZyAqZGxnOworCXBqbWVkaWFfc2RwX3Nlc3Npb24gKmxvY2FsX3NkcDsKKwlwanNpcF90eF9kYXRhICp0ZGF0YTsKKworCWlmIChwal9nZXRob3N0aXAoQUYsICZob3N0YWRkcikgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byByZXRyaWV2ZSBsb2NhbCBob3N0IElQIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCXBqX3NvY2thZGRyX3ByaW50KCZob3N0YWRkciwgaG9zdGlwLCBzaXplb2YoaG9zdGlwKSwgMik7CisKKwlwal9hbnNpX3NwcmludGYodGVtcCwgIjxzaXA6c2ltcGxldWFjQCVzOiVkPiIsIAorCQkJaG9zdGlwLCBTSVBfUE9SVCk7CisJbG9jYWxfdXJpID0gcGpfc3RyKHRlbXApOworCisJLyogQ3JlYXRlIFVBQyBkaWFsb2cgKi8KKwlzdGF0dXMgPSBwanNpcF9kbGdfY3JlYXRlX3VhYyggcGpzaXBfdWFfaW5zdGFuY2UoKSwgCisJCQkJICAgICAgICZsb2NhbF91cmksICAvKiBsb2NhbCBVUkkgKi8KKwkJCQkgICAgICAgJmxvY2FsX3VyaSwgIC8qIGxvY2FsIENvbnRhY3QgKi8KKwkJCQkgICAgICAgJmRzdF91cmksICAgIC8qIHJlbW90ZSBVUkkgKi8KKwkJCQkgICAgICAgJmRzdF91cmksICAgIC8qIHJlbW90ZSB0YXJnZXQgKi8KKwkJCQkgICAgICAgJmRsZyk7CSAgICAvKiBkaWFsb2cgKi8KKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIFVBQyBkaWFsb2ciLCBzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBJZiB3ZSBleHBlY3QgdGhlIG91dGdvaW5nIElOVklURSB0byBiZSBjaGFsbGVuZ2VkLCB0aGVuIHdlIHNob3VsZAorCSAqIHB1dCB0aGUgY3JlZGVudGlhbHMgaW4gdGhlIGRpYWxvZyBoZXJlLCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoaXM6CisJICoKKwkgICAgeworCQlwanNpcF9jcmVkX2luZm8JY3JlZFsxXTsKKworCQljcmVkWzBdLnJlYWxtCSAgPSBwal9zdHIoInNpcC5zZXJ2ZXIucmVhbG0iKTsKKwkJY3JlZFswXS5zY2hlbWUgICAgPSBwal9zdHIoImRpZ2VzdCIpOworCQljcmVkWzBdLnVzZXJuYW1lICA9IHBqX3N0cigidGhldXNlciIpOworCQljcmVkWzBdLmRhdGFfdHlwZSA9IFBKU0lQX0NSRURfREFUQV9QTEFJTl9QQVNTV0Q7CisJCWNyZWRbMF0uZGF0YSAgICAgID0gcGpfc3RyKCJ0aGVwYXNzd29yZCIpOworCisJCXBqc2lwX2F1dGhfY2x0X3NldF9jcmVkZW50aWFscyggJmRsZy0+YXV0aF9zZXNzLCAxLCBjcmVkKTsKKwkgICAgfQorCSAqCisJICovCisKKworCS8qIEdldCB0aGUgU0RQIGJvZHkgdG8gYmUgcHV0IGluIHRoZSBvdXRnb2luZyBJTlZJVEUsIGJ5IGFza2luZworCSAqIG1lZGlhIGVuZHBvaW50IHRvIGNyZWF0ZSBvbmUgZm9yIHVzLgorCSAqLworCXN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlX3NkcCggZ19tZWRfZW5kcHQsCSAgICAvKiB0aGUgbWVkaWEgZW5kcHQJKi8KKwkJCQkJICAgZGxnLT5wb29sLAkgICAgLyogcG9vbC4JCSovCisJCQkJCSAgIE1BWF9NRURJQV9DTlQsICAgLyogIyBvZiBzdHJlYW1zCSovCisJCQkJCSAgIGdfc29ja19pbmZvLCAgICAgLyogUlRQIHNvY2sgaW5mbwkqLworCQkJCQkgICAmbG9jYWxfc2RwKTsJICAgIC8qIHRoZSBTRFAgcmVzdWx0CSovCisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworCisJLyogQ3JlYXRlIHRoZSBJTlZJVEUgc2Vzc2lvbiwgYW5kIHBhc3MgdGhlIFNEUCByZXR1cm5lZCBlYXJsaWVyCisJICogYXMgdGhlIHNlc3Npb24ncyBpbml0aWFsIGNhcGFiaWxpdHkuCisJICovCisJc3RhdHVzID0gcGpzaXBfaW52X2NyZWF0ZV91YWMoIGRsZywgbG9jYWxfc2RwLCAwLCAmZ19pbnYpOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisJLyogSWYgd2Ugd2FudCB0aGUgaW5pdGlhbCBJTlZJVEUgdG8gdHJhdmVsIHRvIHNwZWNpZmljIFNJUCBwcm94aWVzLAorCSAqIHRoZW4gd2Ugc2hvdWxkIHB1dCB0aGUgaW5pdGlhbCBkaWFsb2cncyByb3V0ZSBzZXQgaGVyZS4gVGhlIGZpbmFsCisJICogcm91dGUgc2V0IHdpbGwgYmUgdXBkYXRlZCBvbmNlIGEgZGlhbG9nIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorCSAqIFRvIHNldCB0aGUgZGlhbG9nJ3MgaW5pdGlhbCByb3V0ZSBzZXQsIHdlIGRvIGl0IHdpdGggc29tZXRoaW5nCisJICogbGlrZSB0aGlzOgorCSAqCisJICAgIHsKKwkJcGpzaXBfcm91dGVfaGRyIHJvdXRlX3NldDsKKwkJcGpzaXBfcm91dGVfaGRyICpyb3V0ZTsKKwkJY29uc3QgcGpfc3RyX3QgaG5hbWUgPSB7ICJSb3V0ZSIsIDUgfTsKKwkJY2hhciAqdXJpID0gInNpcDpwcm94eS5zZXJ2ZXI7bHIiOworCisJCXBqX2xpc3RfaW5pdCgmcm91dGVfc2V0KTsKKworCQlyb3V0ZSA9IHBqc2lwX3BhcnNlX2hkciggZGxnLT5wb29sLCAmaG5hbWUsIAorCQkJCQkgdXJpLCBzdHJsZW4odXJpKSwKKwkJCQkJIE5VTEwpOworCQlQSl9BU1NFUlRfUkVUVVJOKHJvdXRlICE9IE5VTEwsIDEpOworCQlwal9saXN0X3B1c2hfYmFjaygmcm91dGVfc2V0LCByb3V0ZSk7CisKKwkJcGpzaXBfZGxnX3NldF9yb3V0ZV9zZXQoZGxnLCAmcm91dGVfc2V0KTsKKwkgICAgfQorCSAqCisJICogTm90ZSB0aGF0IFJvdXRlIFVSSSBTSE9VTEQgaGF2ZSBhbiAiO2xyIiBwYXJhbWV0ZXIhCisJICovCisKKwkvKiBDcmVhdGUgaW5pdGlhbCBJTlZJVEUgcmVxdWVzdC4KKwkgKiBUaGlzIElOVklURSByZXF1ZXN0IHdpbGwgY29udGFpbiBhIHBlcmZlY3RseSBnb29kIHJlcXVlc3QgYW5kIAorCSAqIGFuIFNEUCBib2R5IGFzIHdlbGwuCisJICovCisJc3RhdHVzID0gcGpzaXBfaW52X2ludml0ZShnX2ludiwgJnRkYXRhKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisKKwkvKiBTZW5kIGluaXRpYWwgSU5WSVRFIHJlcXVlc3QuIAorCSAqIEZyb20gbm93IG9uLCB0aGUgaW52aXRlIHNlc3Npb24ncyBzdGF0ZSB3aWxsIGJlIHJlcG9ydGVkIHRvIHVzCisJICogdmlhIHRoZSBpbnZpdGUgc2Vzc2lvbiBjYWxsYmFja3MuCisJICovCisJc3RhdHVzID0gcGpzaXBfaW52X3NlbmRfbXNnKGdfaW52LCB0ZGF0YSk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKworICAgIH0gZWxzZSB7CisKKwkvKiBObyBVUkwgdG8gbWFrZSBjYWxsIHRvICovCisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiUmVhZHkgdG8gYWNjZXB0IGluY29taW5nIGNhbGxzLi4uIikpOworICAgIH0KKworCisgICAgLyogTG9vcCB1bnRpbCBvbmUgY2FsbCBpcyBjb21wbGV0ZWQgKi8KKyAgICBmb3IgKDshZ19jb21wbGV0ZTspIHsKKwlwal90aW1lX3ZhbCB0aW1lb3V0ID0gezAsIDEwfTsKKwlwanNpcF9lbmRwdF9oYW5kbGVfZXZlbnRzKGdfZW5kcHQsICZ0aW1lb3V0KTsKKyAgICB9CisKKyAgICAvKiBPbiBleGl0LCBkdW1wIGN1cnJlbnQgbWVtb3J5IHVzYWdlOiAqLworICAgIGR1bXBfcG9vbF91c2FnZShUSElTX0ZJTEUsICZjcCk7CisKKyAgICAvKiBEZXN0cm95IGF1ZGlvIHBvcnRzLiBEZXN0cm95IHRoZSBhdWRpbyBwb3J0IGZpcnN0CisgICAgICogYmVmb3JlIHRoZSBzdHJlYW0gc2luY2UgdGhlIGF1ZGlvIHBvcnQgaGFzIHRocmVhZHMKKyAgICAgKiB0aGF0IGdldC9wdXQgZnJhbWVzIHRvIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgaWYgKGdfc25kX3BvcnQpCisJcGptZWRpYV9zbmRfcG9ydF9kZXN0cm95KGdfc25kX3BvcnQpOworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19WSURFTykgJiYgKFBKTUVESUFfSEFTX1ZJREVPICE9IDApCisgICAgLyogRGVzdHJveSB2aWRlbyBwb3J0cyAqLworICAgIGlmIChnX3ZpZF9jYXB0dXJlcikKKwlwam1lZGlhX3ZpZF9wb3J0X2Rlc3Ryb3koZ192aWRfY2FwdHVyZXIpOworICAgIGlmIChnX3ZpZF9yZW5kZXJlcikKKwlwam1lZGlhX3ZpZF9wb3J0X2Rlc3Ryb3koZ192aWRfcmVuZGVyZXIpOworI2VuZGlmCisKKyAgICAvKiBEZXN0cm95IHN0cmVhbXMgKi8KKyAgICBpZiAoZ19tZWRfc3RyZWFtKQorCXBqbWVkaWFfc3RyZWFtX2Rlc3Ryb3koZ19tZWRfc3RyZWFtKTsKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1ZJREVPKSAmJiAoUEpNRURJQV9IQVNfVklERU8gIT0gMCkKKyAgICBpZiAoZ19tZWRfdnN0cmVhbSkKKwlwam1lZGlhX3ZpZF9zdHJlYW1fZGVzdHJveShnX21lZF92c3RyZWFtKTsKKworICAgIC8qIERlaW5pdCBmZm1wZWcgY29kZWMgKi8KKyMgICBpZiBkZWZpbmVkKFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMpICYmIFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMhPTAKKyAgICBwam1lZGlhX2NvZGVjX2ZmbXBlZ192aWRfZGVpbml0KCk7CisjICAgZW5kaWYKKworI2VuZGlmCisKKyAgICAvKiBEZXN0cm95IG1lZGlhIHRyYW5zcG9ydHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FRElBX0NOVDsgKytpKSB7CisJaWYgKGdfbWVkX3RyYW5zcG9ydFtpXSkKKwkgICAgcGptZWRpYV90cmFuc3BvcnRfY2xvc2UoZ19tZWRfdHJhbnNwb3J0W2ldKTsKKyAgICB9CisKKyAgICAvKiBEZWluaXQgcGptZWRpYSBlbmRwb2ludCAqLworICAgIGlmIChnX21lZF9lbmRwdCkKKwlwam1lZGlhX2VuZHB0X2Rlc3Ryb3koZ19tZWRfZW5kcHQpOworCisgICAgLyogRGVpbml0IHBqc2lwIGVuZHBvaW50ICovCisgICAgaWYgKGdfZW5kcHQpCisJcGpzaXBfZW5kcHRfZGVzdHJveShnX2VuZHB0KTsKKworICAgIC8qIFJlbGVhc2UgcG9vbCAqLworICAgIGlmIChwb29sKQorCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiAwOworfQorCisKKworLyoKKyAqIENhbGxiYWNrIHdoZW4gSU5WSVRFIHNlc3Npb24gc3RhdGUgaGFzIGNoYW5nZWQuCisgKiBUaGlzIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgd2hlbiB0aGUgaW52aXRlIHNlc3Npb24gbW9kdWxlIGlzIGluaXRpYWxpemVkLgorICogV2UgbW9zdGx5IHdhbnQgdG8ga25vdyB3aGVuIHRoZSBpbnZpdGUgc2Vzc2lvbiBoYXMgYmVlbiBkaXNjb25uZWN0ZWQsCisgKiBzbyB0aGF0IHdlIGNhbiBxdWl0IHRoZSBhcHBsaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgY2FsbF9vbl9zdGF0ZV9jaGFuZ2VkKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCAKKwkJCQkgICBwanNpcF9ldmVudCAqZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGUpOworCisgICAgaWYgKGludi0+c3RhdGUgPT0gUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhbGwgRElTQ09OTkVDVEVEIFtyZWFzb249JWQgKCVzKV0iLCAKKwkJICBpbnYtPmNhdXNlLAorCQkgIHBqc2lwX2dldF9zdGF0dXNfdGV4dChpbnYtPmNhdXNlKS0+cHRyKSk7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiT25lIGNhbGwgY29tcGxldGVkLCBhcHBsaWNhdGlvbiBxdWl0dGluZy4uLiIpKTsKKwlnX2NvbXBsZXRlID0gMTsKKworICAgIH0gZWxzZSB7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCBzdGF0ZSBjaGFuZ2VkIHRvICVzIiwgCisJCSAgcGpzaXBfaW52X3N0YXRlX25hbWUoaW52LT5zdGF0ZSkpKTsKKworICAgIH0KK30KKworCisvKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGRpYWxvZyBoYXMgZm9ya2VkLiAqLworc3RhdGljIHZvaWQgY2FsbF9vbl9mb3JrZWQocGpzaXBfaW52X3Nlc3Npb24gKmludiwgcGpzaXBfZXZlbnQgKmUpCit7CisgICAgLyogVG8gYmUgZG9uZS4uLiAqLworICAgIFBKX1VOVVNFRF9BUkcoaW52KTsKKyAgICBQSl9VTlVTRURfQVJHKGUpOworfQorCisKKy8qCisgKiBDYWxsYmFjayB3aGVuIGluY29taW5nIHJlcXVlc3RzIG91dHNpZGUgYW55IHRyYW5zYWN0aW9ucyBhbmQgYW55CisgKiBkaWFsb2dzIGFyZSByZWNlaXZlZC4gV2UncmUgb25seSBpbnRlcmVzdGVkIHRvIGhhbmRlIGluY29taW5nIElOVklURQorICogcmVxdWVzdCwgYW5kIHdlJ2xsIHJlamVjdCBhbnkgb3RoZXIgcmVxdWVzdHMgd2l0aCA1MDAgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyBwal9ib29sX3Qgb25fcnhfcmVxdWVzdCggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKQoreworICAgIHBqX3NvY2thZGRyIGhvc3RhZGRyOworICAgIGNoYXIgdGVtcFs4MF0sIGhvc3RpcFtQSl9JTkVUNl9BRERSU1RSTEVOXTsKKyAgICBwal9zdHJfdCBsb2NhbF91cmk7CisgICAgcGpzaXBfZGlhbG9nICpkbGc7CisgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqbG9jYWxfc2RwOworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHVuc2lnbmVkIG9wdGlvbnMgPSAwOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCisgICAgLyogCisgICAgICogUmVzcG9uZCAoc3RhdGVsZXNzbHkpIGFueSBub24tSU5WSVRFIHJlcXVlc3RzIHdpdGggNTAwIAorICAgICAqLworICAgIGlmIChyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QuaWQgIT0gUEpTSVBfSU5WSVRFX01FVEhPRCkgeworCisJaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCAhPSBQSlNJUF9BQ0tfTUVUSE9EKSB7CisJICAgIHBqX3N0cl90IHJlYXNvbiA9IHBqX3N0cigiU2ltcGxlIFVBIHVuYWJsZSB0byBoYW5kbGUgIgorCQkJCSAgICAgInRoaXMgcmVxdWVzdCIpOworCisJICAgIHBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBnX2VuZHB0LCByZGF0YSwgCisJCQkJCSAgIDUwMCwgJnJlYXNvbiwKKwkJCQkJICAgTlVMTCwgTlVMTCk7CisJfQorCXJldHVybiBQSl9UUlVFOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBSZWplY3QgSU5WSVRFIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBJTlZJVEUgc2Vzc2lvbiBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICBpZiAoZ19pbnYpIHsKKworCXBqX3N0cl90IHJlYXNvbiA9IHBqX3N0cigiQW5vdGhlciBjYWxsIGlzIGluIHByb2dyZXNzIik7CisKKwlwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyggZ19lbmRwdCwgcmRhdGEsIAorCQkJCSAgICAgICA1MDAsICZyZWFzb24sCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCXJldHVybiBQSl9UUlVFOworCisgICAgfQorCisgICAgLyogVmVyaWZ5IHRoYXQgd2UgY2FuIGhhbmRsZSB0aGUgcmVxdWVzdC4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfdmVyaWZ5X3JlcXVlc3QocmRhdGEsICZvcHRpb25zLCBOVUxMLCBOVUxMLAorCQkJCSAgICAgIGdfZW5kcHQsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCisJcGpfc3RyX3QgcmVhc29uID0gcGpfc3RyKCJTb3JyeSBTaW1wbGUgVUEgY2FuIG5vdCBoYW5kbGUgdGhpcyBJTlZJVEUiKTsKKworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBnX2VuZHB0LCByZGF0YSwgCisJCQkJICAgICAgIDUwMCwgJnJlYXNvbiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfSAKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgQ29udGFjdCBVUkkKKyAgICAgKi8KKyAgICBpZiAocGpfZ2V0aG9zdGlwKEFGLCAmaG9zdGFkZHIpICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byByZXRyaWV2ZSBsb2NhbCBob3N0IElQIiwgc3RhdHVzKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisgICAgcGpfc29ja2FkZHJfcHJpbnQoJmhvc3RhZGRyLCBob3N0aXAsIHNpemVvZihob3N0aXApLCAyKTsKKworICAgIHBqX2Fuc2lfc3ByaW50Zih0ZW1wLCAiPHNpcDpzaW1wbGV1YXNAJXM6JWQ+IiwgCisJCSAgICBob3N0aXAsIFNJUF9QT1JUKTsKKyAgICBsb2NhbF91cmkgPSBwal9zdHIodGVtcCk7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBVQVMgZGlhbG9nLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfdWFzKCBwanNpcF91YV9pbnN0YW5jZSgpLCAKKwkJCQkgICByZGF0YSwKKwkJCQkgICAmbG9jYWxfdXJpLCAvKiBjb250YWN0ICovCisJCQkJICAgJmRsZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoZ19lbmRwdCwgcmRhdGEsIDUwMCwgTlVMTCwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBHZXQgbWVkaWEgY2FwYWJpbGl0eSBmcm9tIG1lZGlhIGVuZHBvaW50OiAKKyAgICAgKi8KKworICAgIHN0YXR1cyA9IHBqbWVkaWFfZW5kcHRfY3JlYXRlX3NkcCggZ19tZWRfZW5kcHQsIHJkYXRhLT50cF9pbmZvLnBvb2wsCisJCQkJICAgICAgIE1BWF9NRURJQV9DTlQsIGdfc29ja19pbmZvLCAmbG9jYWxfc2RwKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBQSl9UUlVFKTsKKworCisgICAgLyogCisgICAgICogQ3JlYXRlIGludml0ZSBzZXNzaW9uLCBhbmQgcGFzcyBib3RoIHRoZSBVQVMgZGlhbG9nIGFuZCB0aGUgU0RQCisgICAgICogY2FwYWJpbGl0eSB0byB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfY3JlYXRlX3VhcyggZGxnLCByZGF0YSwgbG9jYWxfc2RwLCAwLCAmZ19pbnYpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIFBKX1RSVUUpOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxseSBzZW5kIDE4MCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIFRoZSB2ZXJ5IGZpcnN0IHJlc3BvbnNlIHRvIGFuIElOVklURSBtdXN0IGJlIGNyZWF0ZWQgd2l0aAorICAgICAqIHBqc2lwX2ludl9pbml0aWFsX2Fuc3dlcigpLiBTdWJzZXF1ZW50IHJlc3BvbnNlcyB0byB0aGUgc2FtZQorICAgICAqIHRyYW5zYWN0aW9uIE1VU1QgdXNlIHBqc2lwX2ludl9hbnN3ZXIoKS4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfaW5pdGlhbF9hbnN3ZXIoZ19pbnYsIHJkYXRhLCAKKwkJCQkgICAgICAxODAsIAorCQkJCSAgICAgIE5VTEwsIE5VTEwsICZ0ZGF0YSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgUEpfVFJVRSk7CisKKworICAgIC8qIFNlbmQgdGhlIDE4MCByZXNwb25zZS4gKi8gIAorICAgIHN0YXR1cyA9IHBqc2lwX2ludl9zZW5kX21zZyhnX2ludiwgdGRhdGEpOyAKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBQSl9UUlVFKTsKKworCisgICAgLyoKKyAgICAgKiBOb3cgY3JlYXRlIDIwMCByZXNwb25zZS4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfYW5zd2VyKCBnX2ludiwgCisJCQkgICAgICAgMjAwLCBOVUxMLAkvKiBzdF9jb2RlIGFuZCBzdF90ZXh0ICovCisJCQkgICAgICAgTlVMTCwJCS8qIFNEUCBhbHJlYWR5IHNwZWNpZmllZCAqLworCQkJICAgICAgICZ0ZGF0YSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgUEpfVFJVRSk7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIDIwMCByZXNwb25zZS4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfc2VuZF9tc2coZ19pbnYsIHRkYXRhKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBQSl9UUlVFKTsKKworCisgICAgLyogRG9uZS4gCisgICAgICogV2hlbiB0aGUgY2FsbCBpcyBkaXNjb25uZWN0ZWQsIGl0IHdpbGwgYmUgcmVwb3J0ZWQgdmlhIHRoZSBjYWxsYmFjay4KKyAgICAgKi8KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisgCisKKy8qCisgKiBDYWxsYmFjayB3aGVuIFNEUCBuZWdvdGlhdGlvbiBoYXMgY29tcGxldGVkLgorICogV2UgYXJlIGludGVyZXN0ZWQgd2l0aCB0aGlzIGNhbGxiYWNrIGJlY2F1c2Ugd2Ugd2FudCB0byBzdGFydCBtZWRpYQorICogYXMgc29vbiBhcyBTRFAgbmVnb3RpYXRpb24gaXMgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCBjYWxsX29uX21lZGlhX3VwZGF0ZSggcGpzaXBfaW52X3Nlc3Npb24gKmludiwKKwkJCQkgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBwam1lZGlhX3N0cmVhbV9pbmZvIHN0cmVhbV9pbmZvOworICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKmxvY2FsX3NkcDsKKyAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpyZW1vdGVfc2RwOworICAgIHBqbWVkaWFfcG9ydCAqbWVkaWFfcG9ydDsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJTRFAgbmVnb3RpYXRpb24gaGFzIGZhaWxlZCIsIHN0YXR1cyk7CisKKwkvKiBIZXJlIHdlIHNob3VsZCBkaXNjb25uZWN0IGNhbGwgaWYgd2UncmUgbm90IGluIHRoZSBtaWRkbGUgCisJICogb2YgaW5pdGlhbGl6aW5nIGFuIFVBUyBkaWFsb2cgYW5kIGlmIHRoaXMgaXMgbm90IGEgcmUtSU5WSVRFLgorCSAqLworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBHZXQgbG9jYWwgYW5kIHJlbW90ZSBTRFAuCisgICAgICogV2UgbmVlZCBib3RoIFNEUHMgdG8gY3JlYXRlIGEgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9sb2NhbChpbnYtPm5lZywgJmxvY2FsX3NkcCk7CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9yZW1vdGUoaW52LT5uZWcsICZyZW1vdGVfc2RwKTsKKworCisgICAgLyogQ3JlYXRlIHN0cmVhbSBpbmZvIGJhc2VkIG9uIHRoZSBtZWRpYSBhdWRpbyBTRFAuICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zdHJlYW1faW5mb19mcm9tX3NkcCgmc3RyZWFtX2luZm8sIGludi0+ZGxnLT5wb29sLAorCQkJCQkgIGdfbWVkX2VuZHB0LAorCQkJCQkgIGxvY2FsX3NkcCwgcmVtb3RlX3NkcCwgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gc3RyZWFtIGluZm8iLHN0YXR1cyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIElmIHJlcXVpcmVkLCB3ZSBjYW4gYWxzbyBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbiB0aGUgc3RyZWFtIGluZm8sCisgICAgICogKHN1Y2ggYXMgaml0dGVyIGJ1ZmZlciBzZXR0aW5ncywgY29kZWMgc2V0dGluZ3MsIGV0YykgYmVmb3JlIHdlCisgICAgICogY3JlYXRlIHRoZSBzdHJlYW0uCisgICAgICovCisKKyAgICAvKiBDcmVhdGUgbmV3IGF1ZGlvIG1lZGlhIHN0cmVhbSwgcGFzc2luZyB0aGUgc3RyZWFtIGluZm8sIGFuZCBhbHNvIHRoZQorICAgICAqIG1lZGlhIHNvY2tldCB0aGF0IHdlIGNyZWF0ZWQgZWFybGllci4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3N0cmVhbV9jcmVhdGUoZ19tZWRfZW5kcHQsIGludi0+ZGxnLT5wb29sLCAmc3RyZWFtX2luZm8sCisJCQkJICAgZ19tZWRfdHJhbnNwb3J0WzBdLCBOVUxMLCAmZ19tZWRfc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCBUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHN0cmVhbSIsIHN0YXR1cyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFN0YXJ0IHRoZSBhdWRpbyBzdHJlYW0gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3N0cmVhbV9zdGFydChnX21lZF9zdHJlYW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIFRISVNfRklMRSwgIlVuYWJsZSB0byBzdGFydCBhdWRpbyBzdHJlYW0iLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIG1lZGlhIHBvcnQgaW50ZXJmYWNlIG9mIHRoZSBhdWRpbyBzdHJlYW0uIAorICAgICAqIE1lZGlhIHBvcnQgaW50ZXJmYWNlIGlzIGJhc2ljbHkgYSBzdHJ1Y3QgY29udGFpbmluZyBnZXRfZnJhbWUoKSBhbmQKKyAgICAgKiBwdXRfZnJhbWUoKSBmdW5jdGlvbi4gV2l0aCB0aGlzIG1lZGlhIHBvcnQgaW50ZXJmYWNlLCB3ZSBjYW4gYXR0YWNoCisgICAgICogdGhlIHBvcnQgaW50ZXJmYWNlIHRvIGNvbmZlcmVuY2UgYnJpZGdlLCBvciBkaXJlY3RseSB0byBhIHNvdW5kCisgICAgICogcGxheWVyL3JlY29yZGVyIGRldmljZS4KKyAgICAgKi8KKyAgICBwam1lZGlhX3N0cmVhbV9nZXRfcG9ydChnX21lZF9zdHJlYW0sICZtZWRpYV9wb3J0KTsKKworICAgIC8qIENyZWF0ZSBzb3VuZCBwb3J0ICovCisgICAgcGptZWRpYV9zbmRfcG9ydF9jcmVhdGUoaW52LT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBKTUVESUFfQVVEX0RFRkFVTFRfQ0FQVFVSRV9ERVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9BVURfREVGQVVMVF9QTEFZQkFDS19ERVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9QSUFfU1JBVEUoJm1lZGlhX3BvcnQtPmluZm8pLC8qIGNsb2NrIHJhdGUJICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpNRURJQV9QSUFfQ0NOVCgmbWVkaWFfcG9ydC0+aW5mbyksLyogY2hhbm5lbCBjb3VudCAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBKTUVESUFfUElBX1NQRigmbWVkaWFfcG9ydC0+aW5mbyksIC8qIHNhbXBsZXMgcGVyIGZyYW1lKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSk1FRElBX1BJQV9CSVRTKCZtZWRpYV9wb3J0LT5pbmZvKSwvKiBiaXRzIHBlciBzYW1wbGUgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ19zbmRfcG9ydCk7CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCBUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIHNvdW5kIHBvcnQiLCBzdGF0dXMpOworCVBKX0xPRygzLChUSElTX0ZJTEUsICIlZCAlZCAlZCAlZCIsCisJCSAgICBQSk1FRElBX1BJQV9TUkFURSgmbWVkaWFfcG9ydC0+aW5mbyksLyogY2xvY2sgcmF0ZQkgICAgKi8KKwkJICAgIFBKTUVESUFfUElBX0NDTlQoJm1lZGlhX3BvcnQtPmluZm8pLC8qIGNoYW5uZWwgY291bnQgICAgKi8KKwkJICAgIFBKTUVESUFfUElBX1NQRigmbWVkaWFfcG9ydC0+aW5mbyksIC8qIHNhbXBsZXMgcGVyIGZyYW1lKi8KKwkJICAgIFBKTUVESUFfUElBX0JJVFMoJm1lZGlhX3BvcnQtPmluZm8pIC8qIGJpdHMgcGVyIHNhbXBsZSAgKi8KKwkgICAgKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChnX3NuZF9wb3J0LCBtZWRpYV9wb3J0KTsKKworCisgICAgLyogR2V0IHRoZSBtZWRpYSBwb3J0IGludGVyZmFjZSBvZiB0aGUgc2Vjb25kIHN0cmVhbSBpbiB0aGUgc2Vzc2lvbiwKKyAgICAgKiB3aGljaCBpcyB2aWRlbyBzdHJlYW0uIFdpdGggdGhpcyBtZWRpYSBwb3J0IGludGVyZmFjZSwgd2UgY2FuIGF0dGFjaAorICAgICAqIHRoZSBwb3J0IGRpcmVjdGx5IHRvIGEgcmVuZGVyZXIvY2FwdHVyZSB2aWRlbyBkZXZpY2UuCisgICAgICovCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19WSURFTykgJiYgKFBKTUVESUFfSEFTX1ZJREVPICE9IDApCisgICAgaWYgKGxvY2FsX3NkcC0+bWVkaWFfY291bnQgPiAxKSB7CisJcGptZWRpYV92aWRfc3RyZWFtX2luZm8gdnN0cmVhbV9pbmZvOworCXBqbWVkaWFfdmlkX3BvcnRfcGFyYW0gdnBvcnRfcGFyYW07CisKKwlwam1lZGlhX3ZpZF9wb3J0X3BhcmFtX2RlZmF1bHQoJnZwb3J0X3BhcmFtKTsKKworCS8qIENyZWF0ZSBzdHJlYW0gaW5mbyBiYXNlZCBvbiB0aGUgbWVkaWEgdmlkZW8gU0RQLiAqLworCXN0YXR1cyA9IHBqbWVkaWFfdmlkX3N0cmVhbV9pbmZvX2Zyb21fc2RwKCZ2c3RyZWFtX2luZm8sCisJCQkJCQkgIGludi0+ZGxnLT5wb29sLCBnX21lZF9lbmRwdCwKKwkJCQkJCSAgbG9jYWxfc2RwLCByZW1vdGVfc2RwLCAxKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsIlVuYWJsZSB0byBjcmVhdGUgdmlkZW8gc3RyZWFtIGluZm8iLHN0YXR1cyk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBJZiByZXF1aXJlZCwgd2UgY2FuIGFsc28gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4gdGhlIHN0cmVhbSBpbmZvLAorCSAqIChzdWNoIGFzIGppdHRlciBidWZmZXIgc2V0dGluZ3MsIGNvZGVjIHNldHRpbmdzLCBldGMpIGJlZm9yZSB3ZQorCSAqIGNyZWF0ZSB0aGUgdmlkZW8gc3RyZWFtLgorCSAqLworCisJLyogQ3JlYXRlIG5ldyB2aWRlbyBtZWRpYSBzdHJlYW0sIHBhc3NpbmcgdGhlIHN0cmVhbSBpbmZvLCBhbmQgYWxzbyB0aGUKKwkgKiBtZWRpYSBzb2NrZXQgdGhhdCB3ZSBjcmVhdGVkIGVhcmxpZXIuCisJICovCisJc3RhdHVzID0gcGptZWRpYV92aWRfc3RyZWFtX2NyZWF0ZShnX21lZF9lbmRwdCwgTlVMTCwgJnZzdHJlYW1faW5mbywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfbWVkX3RyYW5zcG9ydFsxXSwgTlVMTCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnX21lZF92c3RyZWFtKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvciggVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSB2aWRlbyBzdHJlYW0iLCBzdGF0dXMpOworCSAgICByZXR1cm47CisJfQorCisJLyogU3RhcnQgdGhlIHZpZGVvIHN0cmVhbSAqLworCXN0YXR1cyA9IHBqbWVkaWFfdmlkX3N0cmVhbV9zdGFydChnX21lZF92c3RyZWFtKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvciggVEhJU19GSUxFLCAiVW5hYmxlIHRvIHN0YXJ0IHZpZGVvIHN0cmVhbSIsIHN0YXR1cyk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAodnN0cmVhbV9pbmZvLmRpciAmIFBKTUVESUFfRElSX0RFQ09ESU5HKSB7CisJICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2Rldl9kZWZhdWx0X3BhcmFtKAorCQkJCWludi0+cG9vbCwgUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWLAorCQkJCSZ2cG9ydF9wYXJhbS52aWRwYXJhbSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBnZXQgZGVmYXVsdCBwYXJhbSBvZiB2aWRlbyAiCisJCQkgICAicmVuZGVyZXIgZGV2aWNlIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCSAgICB9CisKKwkgICAgLyogR2V0IHZpZGVvIHN0cmVhbSBwb3J0IGZvciBkZWNvZGluZyBkaXJlY3Rpb24gKi8KKwkgICAgcGptZWRpYV92aWRfc3RyZWFtX2dldF9wb3J0KGdfbWVkX3ZzdHJlYW0sIFBKTUVESUFfRElSX0RFQ09ESU5HLAorCQkJCQkmbWVkaWFfcG9ydCk7CisKKwkgICAgLyogU2V0IGZvcm1hdCAqLworCSAgICBwam1lZGlhX2Zvcm1hdF9jb3B5KCZ2cG9ydF9wYXJhbS52aWRwYXJhbS5mbXQsCisJCQkJJm1lZGlhX3BvcnQtPmluZm8uZm10KTsKKwkgICAgdnBvcnRfcGFyYW0udmlkcGFyYW0uZGlyID0gUEpNRURJQV9ESVJfUkVOREVSOworCSAgICB2cG9ydF9wYXJhbS5hY3RpdmUgPSBQSl9UUlVFOworCisJICAgIC8qIENyZWF0ZSByZW5kZXJlciAqLworCSAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2NyZWF0ZShpbnYtPnBvb2wsICZ2cG9ydF9wYXJhbSwgCisJCQkJCSAgICAgJmdfdmlkX3JlbmRlcmVyKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSB2aWRlbyByZW5kZXJlciBkZXZpY2UiLAorCQkJICAgc3RhdHVzKTsKKwkJcmV0dXJuOworCSAgICB9CisKKwkgICAgLyogQ29ubmVjdCByZW5kZXJlciB0byBtZWRpYV9wb3J0ICovCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChnX3ZpZF9yZW5kZXJlciwgbWVkaWFfcG9ydCwgCisJCQkJCSAgICAgIFBKX0ZBTFNFKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNvbm5lY3QgcmVuZGVyZXIgdG8gc3RyZWFtIiwKKwkJCSAgIHN0YXR1cyk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKworCS8qIENyZWF0ZSBjYXB0dXJlciAqLworCWlmICh2c3RyZWFtX2luZm8uZGlyICYgUEpNRURJQV9ESVJfRU5DT0RJTkcpIHsKKwkgICAgc3RhdHVzID0gcGptZWRpYV92aWRfZGV2X2RlZmF1bHRfcGFyYW0oCisJCQkJaW52LT5wb29sLCBQSk1FRElBX1ZJRF9ERUZBVUxUX0NBUFRVUkVfREVWLAorCQkJCSZ2cG9ydF9wYXJhbS52aWRwYXJhbSk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBnZXQgZGVmYXVsdCBwYXJhbSBvZiB2aWRlbyAiCisJCQkgICAiY2FwdHVyZSBkZXZpY2UiLCBzdGF0dXMpOworCQlyZXR1cm47CisJICAgIH0KKworCSAgICAvKiBHZXQgdmlkZW8gc3RyZWFtIHBvcnQgZm9yIGRlY29kaW5nIGRpcmVjdGlvbiAqLworCSAgICBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X3BvcnQoZ19tZWRfdnN0cmVhbSwgUEpNRURJQV9ESVJfRU5DT0RJTkcsCisJCQkJCSZtZWRpYV9wb3J0KTsKKworCSAgICAvKiBHZXQgY2FwdHVyZXIgZm9ybWF0IGZyb20gc3RyZWFtIGluZm8gKi8KKwkgICAgcGptZWRpYV9mb3JtYXRfY29weSgmdnBvcnRfcGFyYW0udmlkcGFyYW0uZm10LCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFfcG9ydC0+aW5mby5mbXQpOworCSAgICB2cG9ydF9wYXJhbS52aWRwYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFOworCSAgICB2cG9ydF9wYXJhbS5hY3RpdmUgPSBQSl9UUlVFOworCisJICAgIC8qIENyZWF0ZSBjYXB0dXJlciAqLworCSAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2NyZWF0ZShpbnYtPnBvb2wsICZ2cG9ydF9wYXJhbSwgCisJCQkJCSAgICAgJmdfdmlkX2NhcHR1cmVyKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSB2aWRlbyBjYXB0dXJlIGRldmljZSIsCisJCQkgICBzdGF0dXMpOworCQlyZXR1cm47CisJICAgIH0KKworCSAgICAvKiBDb25uZWN0IGNhcHR1cmVyIHRvIG1lZGlhX3BvcnQgKi8KKwkgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9jb25uZWN0KGdfdmlkX2NhcHR1cmVyLCBtZWRpYV9wb3J0LCAKKwkJCQkJICAgICAgUEpfRkFMU0UpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY29ubmVjdCBjYXB0dXJlciB0byBzdHJlYW0iLAorCQkJICAgc3RhdHVzKTsKKwkJcmV0dXJuOworCSAgICB9CisJfQorCisJLyogU3RhcnQgc3RyZWFtaW5nICovCisJaWYgKGdfdmlkX3JlbmRlcmVyKSB7CisJICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQoZ192aWRfcmVuZGVyZXIpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gc3RhcnQgdmlkZW8gcmVuZGVyZXIiLAorCQkJICAgc3RhdHVzKTsKKwkJcmV0dXJuOworCSAgICB9CisJfQorCWlmIChnX3ZpZF9jYXB0dXJlcikgeworCSAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X3N0YXJ0KGdfdmlkX2NhcHR1cmVyKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHN0YXJ0IHZpZGVvIGNhcHR1cmVyIiwKKwkJCSAgIHN0YXR1cyk7CisJCXJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYJLyogUEpNRURJQV9IQVNfVklERU8gKi8KKworICAgIC8qIERvbmUgd2l0aCBtZWRpYS4gKi8KK30KKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpcGVjaG8uYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTQ1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpcGVjaG8uYwpAQCAtMCwwICsxLDY4OSBAQAorLyogJElkOiBzaXBlY2hvLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKworLyoqCisgKiBzaXBlY2hvLmMKKyAqCisgKiAtIEFjY2VwdHMgaW5jb21pbmcgY2FsbHMgYW5kIGVjaG9lcyBiYWNrIFNEUCBhbmQgYW55IG1lZGlhLgorICogLSBTcGVjaWZ5IFVSSSBpbiBjbWRsaW5lIGFyZ3VtZW50IHRvIG1ha2UgY2FsbAorICogLSBBY2NlcHRzIHJlZ2lzdHJhdGlvbiB0b28hCisgKi8KKworLyogSW5jbHVkZSBhbGwgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxwanNpcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc2RwLmg+CisjaW5jbHVkZSA8cGpzaXBfdWEuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworLyogRm9yIGxvZ2dpbmcgcHVycG9zZS4gKi8KKyNkZWZpbmUgVEhJU19GSUxFICAgInNpcGVjaG8uYyIKKworI2luY2x1ZGUgInV0aWwuaCIKKworCisvKiBTZXR0aW5ncyAqLworI2RlZmluZSBNQVhfQ0FMTFMJOAorCit0eXBlZGVmIHN0cnVjdCBjYWxsX3QKK3sKKyAgICBwanNpcF9pbnZfc2Vzc2lvbgkqaW52OworfSBjYWxsX3Q7CisKK3N0YXRpYyBzdHJ1Y3QgYXBwX3QKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wJIGNwOworICAgIHBqX3Bvb2xfdAkJKnBvb2w7CisKKyAgICBwanNpcF9lbmRwb2ludAkqc2lwX2VuZHB0OworICAgIC8vcGptZWRpYV9lbmRwdAkqbWVkX2VuZHB0OworCisgICAgY2FsbF90CQkgY2FsbFtNQVhfQ0FMTFNdOworCisgICAgcGpfYm9vbF90CQkgcXVpdDsKKyAgICBwal90aHJlYWRfdAkJKndvcmtlcl90aHJlYWQ7CisKKyAgICBwal9ib29sX3QJCSBlbmFibGVfbXNnX2xvZ2dpbmc7Cit9IGFwcDsKKworLyoKKyAqIFByb3RvdHlwZXM6CisgKi8KKworc3RhdGljIHZvaWQgY2FsbF9vbl9tZWRpYV91cGRhdGUocGpzaXBfaW52X3Nlc3Npb24gKmludiwgcGpfc3RhdHVzX3Qgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGNhbGxfb25fc3RhdGVfY2hhbmdlZChwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCBwanNpcF9ldmVudCAqZSk7CitzdGF0aWMgdm9pZCBjYWxsX29uX3J4X29mZmVyKHBqc2lwX2ludl9zZXNzaW9uICppbnYsIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKm9mZmVyKTsKK3N0YXRpYyB2b2lkIGNhbGxfb25fZm9ya2VkKHBqc2lwX2ludl9zZXNzaW9uICppbnYsIHBqc2lwX2V2ZW50ICplKTsKK3N0YXRpYyBwal9ib29sX3Qgb25fcnhfcmVxdWVzdCggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKTsKKworLyogR2xvYmFscyAqLworc3RhdGljIGludCBzaXBfYWY7CitzdGF0aWMgaW50IHNpcF9wb3J0ID0gNTA2MDsKK3N0YXRpYyBwal9ib29sX3Qgc2lwX3RjcDsKKworLyogVGhpcyBpcyBhIFBKU0lQIG1vZHVsZSB0byBiZSByZWdpc3RlcmVkIGJ5IGFwcGxpY2F0aW9uIHRvIGhhbmRsZQorICogaW5jb21pbmcgcmVxdWVzdHMgb3V0c2lkZSBhbnkgZGlhbG9ncy90cmFuc2FjdGlvbnMuIFRoZSBtYWluIHB1cnBvc2UKKyAqIGhlcmUgaXMgdG8gaGFuZGxlIGluY29taW5nIElOVklURSByZXF1ZXN0IG1lc3NhZ2UsIHdoZXJlIHdlIHdpbGwKKyAqIGNyZWF0ZSBhIGRpYWxvZyBhbmQgSU5WSVRFIHNlc3Npb24gZm9yIGl0LgorICovCitzdGF0aWMgcGpzaXBfbW9kdWxlIG1vZF9zaXBlY2hvID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2Qtc2lwZWNobyIsIDExIH0sCSAgICAvKiBOYW1lLgkJCSovCisgICAgLTEsCQkJCSAgICAvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX0FQUExJQ0FUSU9OLCAvKiBQcmlvcml0eQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogbG9hZCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdGFydCgpCQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBzdG9wKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHVubG9hZCgpCQkJKi8KKyAgICAmb25fcnhfcmVxdWVzdCwJCSAgICAvKiBvbl9yeF9yZXF1ZXN0KCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fcnhfcmVzcG9uc2UoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXF1ZXN0LgkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl90eF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3RzeF9zdGF0ZSgpCQkqLworfTsKKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfYm9vbF90IGxvZ2dpbmdfb25fcnhfbXNnKHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIGlmICghYXBwLmVuYWJsZV9tc2dfbG9nZ2luZykKKwlyZXR1cm4gUEpfRkFMU0U7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUlggJWQgYnl0ZXMgJXMgZnJvbSAlcyAlczolZDpcbiIKKwkJCSAiJS4qc1xuIgorCQkJICItLWVuZCBtc2ctLSIsCisJCQkgcmRhdGEtPm1zZ19pbmZvLmxlbiwKKwkJCSBwanNpcF9yeF9kYXRhX2dldF9pbmZvKHJkYXRhKSwKKwkJCSByZGF0YS0+dHBfaW5mby50cmFuc3BvcnQtPnR5cGVfbmFtZSwKKwkJCSByZGF0YS0+cGt0X2luZm8uc3JjX25hbWUsCisJCQkgcmRhdGEtPnBrdF9pbmZvLnNyY19wb3J0LAorCQkJIChpbnQpcmRhdGEtPm1zZ19pbmZvLmxlbiwKKwkJCSByZGF0YS0+bXNnX2luZm8ubXNnX2J1ZikpOworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworLyogTm90aWZpY2F0aW9uIG9uIG91dGdvaW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfc3RhdHVzX3QgbG9nZ2luZ19vbl90eF9tc2cocGpzaXBfdHhfZGF0YSAqdGRhdGEpCit7CisgICAgaWYgKCFhcHAuZW5hYmxlX21zZ19sb2dnaW5nKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlRYICVkIGJ5dGVzICVzIHRvICVzICVzOiVkOlxuIgorCQkJICIlLipzXG4iCisJCQkgIi0tZW5kIG1zZy0tIiwKKwkJCSAodGRhdGEtPmJ1Zi5jdXIgLSB0ZGF0YS0+YnVmLnN0YXJ0KSwKKwkJCSBwanNpcF90eF9kYXRhX2dldF9pbmZvKHRkYXRhKSwKKwkJCSB0ZGF0YS0+dHBfaW5mby50cmFuc3BvcnQtPnR5cGVfbmFtZSwKKwkJCSB0ZGF0YS0+dHBfaW5mby5kc3RfbmFtZSwKKwkJCSB0ZGF0YS0+dHBfaW5mby5kc3RfcG9ydCwKKwkJCSAoaW50KSh0ZGF0YS0+YnVmLmN1ciAtIHRkYXRhLT5idWYuc3RhcnQpLAorCQkJIHRkYXRhLT5idWYuc3RhcnQpKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogVGhlIG1vZHVsZSBpbnN0YW5jZS4gKi8KK3N0YXRpYyBwanNpcF9tb2R1bGUgbXNnX2xvZ2dlciA9Cit7CisgICAgTlVMTCwgTlVMTCwJCQkJLyogcHJldiwgbmV4dC4JCSovCisgICAgeyAibW9kLW1zZy1sb2ciLCAxMyB9LAkJLyogTmFtZS4JCSovCisgICAgLTEsCQkJCQkvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX1RSQU5TUE9SVF9MQVlFUi0xLC8qIFByaW9yaXR5CSAgICAgICAgKi8KKyAgICBOVUxMLAkJCQkvKiBsb2FkKCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RhcnQoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiBzdG9wKCkJCSovCisgICAgTlVMTCwJCQkJLyogdW5sb2FkKCkJCSovCisgICAgJmxvZ2dpbmdfb25fcnhfbXNnLAkJCS8qIG9uX3J4X3JlcXVlc3QoKQkqLworICAgICZsb2dnaW5nX29uX3J4X21zZywJCQkvKiBvbl9yeF9yZXNwb25zZSgpCSovCisgICAgJmxvZ2dpbmdfb25fdHhfbXNnLAkJCS8qIG9uX3R4X3JlcXVlc3QuCSovCisgICAgJmxvZ2dpbmdfb25fdHhfbXNnLAkJCS8qIG9uX3R4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90c3hfc3RhdGUoKQkqLworCit9OworCitzdGF0aWMgaW50IHdvcmtlcl9wcm9jKHZvaWQgKmFyZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFyZyk7CisKKyAgICB3aGlsZSAoIWFwcC5xdWl0KSB7CisJcGpfdGltZV92YWwgaW50ZXJ2YWwgPSB7IDAsIDIwIH07CisJcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50cyhhcHAuc2lwX2VuZHB0LCAmaW50ZXJ2YWwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5ndXBfYWxsKHZvaWQpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGk9MDsgaTxNQVhfQ0FMTFM7ICsraSkgeworICAgIAljYWxsX3QgKmNhbGwgPSAmYXBwLmNhbGxbaV07CisKKyAgICAJaWYgKGNhbGwtPmludiAmJiBjYWxsLT5pbnYtPnN0YXRlIDw9IFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQpIHsKKyAgICAJICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICAJICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworCisgICAgCSAgICBzdGF0dXMgPSBwanNpcF9pbnZfZW5kX3Nlc3Npb24oY2FsbC0+aW52LCBQSlNJUF9TQ19CVVNZX0hFUkUsIE5VTEwsICZ0ZGF0YSk7CisgICAgCSAgICBpZiAoc3RhdHVzPT1QSl9TVUNDRVNTICYmIHRkYXRhKQorICAgIAkJcGpzaXBfaW52X3NlbmRfbXNnKGNhbGwtPmludiwgdGRhdGEpOworICAgIAl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3N0YWNrKHZvaWQpCit7CisgICAgZW51bSB7IFdBSVRfQ0xFQVIgPSA1MDAwLCBXQUlUX0lOVEVSVkFMID0gNTAwIH07CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJTaHV0dGluZyBkb3duLi4iKSk7CisKKyAgICAvKiBXYWl0IHVudGlsIGFsbCBjbGVhciAqLworICAgIGhhbmd1cF9hbGwoKTsKKyAgICBmb3IgKGk9MDsgaTxXQUlUX0NMRUFSL1dBSVRfSU5URVJWQUw7ICsraSkgeworCXVuc2lnbmVkIGo7CisKKwlmb3IgKGo9MDsgajxNQVhfQ0FMTFM7ICsraikgeworCSAgICBjYWxsX3QgKmNhbGwgPSAmYXBwLmNhbGxbal07CisJICAgIGlmIChjYWxsLT5pbnYgJiYgY2FsbC0+aW52LT5zdGF0ZSA8PSBQSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEKQorCQlicmVhazsKKwl9CisKKwlpZiAoaj09TUFYX0NBTExTKQorCSAgICByZXR1cm47CisKKwlwal90aHJlYWRfc2xlZXAoV0FJVF9JTlRFUlZBTCk7CisgICAgfQorCisgICAgYXBwLnF1aXQgPSBQSl9UUlVFOworICAgIGlmIChhcHAud29ya2VyX3RocmVhZCkgeworCXBqX3RocmVhZF9qb2luKGFwcC53b3JrZXJfdGhyZWFkKTsKKwlhcHAud29ya2VyX3RocmVhZCA9IE5VTEw7CisgICAgfQorCisgICAgLy9pZiAoYXBwLm1lZF9lbmRwdCkKKwkvL3BqbWVkaWFfZW5kcHRfZGVzdHJveShhcHAubWVkX2VuZHB0KTsKKworICAgIGlmIChhcHAuc2lwX2VuZHB0KQorCXBqc2lwX2VuZHB0X2Rlc3Ryb3koYXBwLnNpcF9lbmRwdCk7CisKKyAgICBpZiAoYXBwLnBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKGFwcC5wb29sKTsKKworICAgIGR1bXBfcG9vbF91c2FnZShUSElTX0ZJTEUsICZhcHAuY3ApOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZhcHAuY3ApOworfQorCisjZGVmaW5lIENIRUNLX1NUQVRVUygpCWRvIHsgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSByZXR1cm4gc3RhdHVzOyB9IHdoaWxlICgwKQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zdGFjaygpCit7CisgICAgcGpfc29ja2FkZHIgYWRkcjsKKyAgICBwanNpcF9pbnZfY2FsbGJhY2sgaW52X2NiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoMyk7CisKKyAgICBzdGF0dXMgPSBwamxpYl91dGlsX2luaXQoKTsKKyAgICBDSEVDS19TVEFUVVMoKTsKKworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZhcHAuY3AsIE5VTEwsIDApOworICAgIGFwcC5wb29sID0gcGpfcG9vbF9jcmVhdGUoICZhcHAuY3AuZmFjdG9yeSwgInNpcGVjaG8iLCA1MTIsIDUxMiwgMCk7CisKKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGUoJmFwcC5jcC5mYWN0b3J5LCBOVUxMLCAmYXBwLnNpcF9lbmRwdCk7CisgICAgQ0hFQ0tfU1RBVFVTKCk7CisKKyAgICBwal9sb2dfc2V0X2xldmVsKDQpOworICAgIHBqX3NvY2thZGRyX2luaXQoKHBqX3VpbnQxNl90KXNpcF9hZiwgJmFkZHIsIE5VTEwsIChwal91aW50MTZfdClzaXBfcG9ydCk7CisgICAgaWYgKHNpcF9hZiA9PSBwal9BRl9JTkVUKCkpIHsKKwlpZiAoc2lwX3RjcCkgeworCSAgICBzdGF0dXMgPSBwanNpcF90Y3BfdHJhbnNwb3J0X3N0YXJ0KCBhcHAuc2lwX2VuZHB0LCAmYWRkci5pcHY0LCAxLAorCQkJCQkJTlVMTCk7CisJfSBlbHNlIHsKKwkgICAgc3RhdHVzID0gcGpzaXBfdWRwX3RyYW5zcG9ydF9zdGFydCggYXBwLnNpcF9lbmRwdCwgJmFkZHIuaXB2NCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMSwgTlVMTCk7CisJfQorICAgIH0gZWxzZSBpZiAoc2lwX2FmID09IHBqX0FGX0lORVQ2KCkpIHsKKwkgICAgc3RhdHVzID0gcGpzaXBfdWRwX3RyYW5zcG9ydF9zdGFydDYoYXBwLnNpcF9lbmRwdCwgJmFkZHIuaXB2NiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMSwgTlVMTCk7CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSBQSl9FQUZOT1RTVVA7CisgICAgfQorCisgICAgcGpfbG9nX3NldF9sZXZlbCgzKTsKKyAgICBDSEVDS19TVEFUVVMoKTsKKworICAgIHN0YXR1cyA9IHBqc2lwX3RzeF9sYXllcl9pbml0X21vZHVsZShhcHAuc2lwX2VuZHB0KSB8fAorCSAgICAgcGpzaXBfdWFfaW5pdF9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsIE5VTEwgKTsKKyAgICBDSEVDS19TVEFUVVMoKTsKKworICAgIHBqX2J6ZXJvKCZpbnZfY2IsIHNpemVvZihpbnZfY2IpKTsKKyAgICBpbnZfY2Iub25fc3RhdGVfY2hhbmdlZCA9ICZjYWxsX29uX3N0YXRlX2NoYW5nZWQ7CisgICAgaW52X2NiLm9uX25ld19zZXNzaW9uID0gJmNhbGxfb25fZm9ya2VkOworICAgIGludl9jYi5vbl9tZWRpYV91cGRhdGUgPSAmY2FsbF9vbl9tZWRpYV91cGRhdGU7CisgICAgaW52X2NiLm9uX3J4X29mZmVyID0gJmNhbGxfb25fcnhfb2ZmZXI7CisKKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfdXNhZ2VfaW5pdChhcHAuc2lwX2VuZHB0LCAmaW52X2NiKSB8fAorCSAgICAgcGpzaXBfMTAwcmVsX2luaXRfbW9kdWxlKGFwcC5zaXBfZW5kcHQpIHx8CisJICAgICBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsICZtb2Rfc2lwZWNobykgfHwKKwkgICAgIHBqc2lwX2VuZHB0X3JlZ2lzdGVyX21vZHVsZSggYXBwLnNpcF9lbmRwdCwgJm1zZ19sb2dnZXIpIHx8CisJICAgICAvL3BqbWVkaWFfZW5kcHRfY3JlYXRlKCZhcHAuY3AuZmFjdG9yeSwKKwkJLy8JCSAgcGpzaXBfZW5kcHRfZ2V0X2lvcXVldWUoYXBwLnNpcF9lbmRwdCksCisJCS8vCQkgIDAsICZhcHAubWVkX2VuZHB0KSB8fAorICAgICAgICAgICAgIHBqX3RocmVhZF9jcmVhdGUoYXBwLnBvb2wsICJzaXBlY2hvIiwgJndvcmtlcl9wcm9jLCBOVUxMLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFwcC53b3JrZXJfdGhyZWFkKTsKKyAgICBDSEVDS19TVEFUVVMoKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGwoY2FsbF90ICpjYWxsKQoreworICAgIGNhbGwtPmludiA9IE5VTEw7Cit9CisKK3N0YXRpYyBwam1lZGlhX3NkcF9hdHRyICogZmluZF9yZW1vdmVfc2RwX2F0dHJzKHVuc2lnbmVkICpjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3NkcF9hdHRyICphdHRyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjbnRfYXR0cl90b19yZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyX3RvX3JlbW92ZVtdKQoreworICAgIHBqbWVkaWFfc2RwX2F0dHIgKmZvdW5kX2F0dHIgPSBOVUxMOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8KGludCkqY250OyArK2kpIHsKKwl1bnNpZ25lZCBqOworCWZvciAoaj0wOyBqPGNudF9hdHRyX3RvX3JlbW92ZTsgKytqKSB7CisJICAgIGlmIChwal9zdHJjbXAyKCZhdHRyW2ldLT5uYW1lLCBhdHRyX3RvX3JlbW92ZVtqXSk9PTApIHsKKwkJaWYgKCFmb3VuZF9hdHRyKSBmb3VuZF9hdHRyID0gYXR0cltpXTsKKwkJcGpfYXJyYXlfZXJhc2UoYXR0ciwgc2l6ZW9mKGF0dHJbMF0pLCAqY250LCBpKTsKKwkJLS0oKmNudCk7CisJCS0taTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kX2F0dHI7Cit9CisKK3N0YXRpYyBwam1lZGlhX3NkcF9zZXNzaW9uICpjcmVhdGVfYW5zd2VyKGludCBjYWxsX251bSwgcGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqb2ZmZXIpCit7CisgICAgY29uc3QgY2hhciogZGlyX2F0dHJzW10gPSB7ICJzZW5kcmVjdiIsICJzZW5kb25seSIsICJyZWN2b25seSIsICJpbmFjdGl2ZSIgfTsKKyAgICBjb25zdCBjaGFyICppY2VfYXR0cnNbXSA9IHsiaWNlLXB3ZCIsICJpY2UtdWZyYWciLCAiY2FuZGlkYXRlIn07CisgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqYW5zd2VyID0gcGptZWRpYV9zZHBfc2Vzc2lvbl9jbG9uZShwb29sLCBvZmZlcik7CisgICAgcGptZWRpYV9zZHBfYXR0ciAqc2Vzc19kaXJfYXR0ciA9IE5VTEw7CisgICAgdW5zaWduZWQgbWk7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZDogY3JlYXRpbmcgYW5zd2VyOiIsIGNhbGxfbnVtKSk7CisKKyAgICBhbnN3ZXItPm5hbWUgPSBwal9zdHIoInNpcGVjaG8iKTsKKyAgICBzZXNzX2Rpcl9hdHRyID0gZmluZF9yZW1vdmVfc2RwX2F0dHJzKCZhbnN3ZXItPmF0dHJfY291bnQsIGFuc3dlci0+YXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBKX0FSUkFZX1NJWkUoZGlyX2F0dHJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9hdHRycyk7CisKKyAgICBmb3IgKG1pPTA7IG1pPGFuc3dlci0+bWVkaWFfY291bnQ7ICsrbWkpIHsKKwlwam1lZGlhX3NkcF9tZWRpYSAqbSA9IGFuc3dlci0+bWVkaWFbbWldOworCXBqbWVkaWFfc2RwX2F0dHIgKm1fZGlyX2F0dHI7CisJcGptZWRpYV9zZHBfYXR0ciAqZGlyX2F0dHI7CisJY29uc3QgY2hhciAqb3VyX2RpciA9IE5VTEw7CisJcGptZWRpYV9zZHBfY29ubiAqYzsKKworCS8qIE1hdGNoIGRpcmVjdGlvbiAqLworCW1fZGlyX2F0dHIgPSBmaW5kX3JlbW92ZV9zZHBfYXR0cnMoJm0tPmF0dHJfY291bnQsIG0tPmF0dHIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSl9BUlJBWV9TSVpFKGRpcl9hdHRycyksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfYXR0cnMpOworCWRpcl9hdHRyID0gbV9kaXJfYXR0ciA/IG1fZGlyX2F0dHIgOiBzZXNzX2Rpcl9hdHRyOworCisJaWYgKGRpcl9hdHRyKSB7CisJICAgIGlmIChwal9zdHJjbXAyKCZkaXJfYXR0ci0+bmFtZSwgInNlbmRvbmx5Iik9PTApCisJCW91cl9kaXIgPSAicmVjdm9ubHkiOworCSAgICBlbHNlIGlmIChwal9zdHJjbXAyKCZkaXJfYXR0ci0+bmFtZSwgImluYWN0aXZlIik9PTApCisJCW91cl9kaXIgPSAiaW5hY3RpdmUiOworCSAgICBlbHNlIGlmIChwal9zdHJjbXAyKCZkaXJfYXR0ci0+bmFtZSwgInJlY3Zvbmx5Iik9PTApCisJCW91cl9kaXIgPSAiaW5hY3RpdmUiOworCisJICAgIGlmIChvdXJfZGlyKSB7CisJCWRpcl9hdHRyID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwam1lZGlhX3NkcF9hdHRyKTsKKwkJZGlyX2F0dHItPm5hbWUgPSBwal9zdHIoKGNoYXIqKW91cl9kaXIpOworCQltLT5hdHRyW20tPmF0dHJfY291bnQrK10gPSBkaXJfYXR0cjsKKwkgICAgfQorCX0KKworCS8qIFJlbW92ZSBJQ0UgYXR0cmlidXRlcyAqLworCWZpbmRfcmVtb3ZlX3NkcF9hdHRycygmbS0+YXR0cl9jb3VudCwgbS0+YXR0ciwgUEpfQVJSQVlfU0laRShpY2VfYXR0cnMpLCBpY2VfYXR0cnMpOworCisJLyogRG9uZSAqLworCWMgPSBtLT5jb25uID8gbS0+Y29ubiA6IGFuc3dlci0+Y29ubjsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiICBNZWRpYSAlZCwgJS4qczogJXMgPC0tPiAlLipzOiVkIiwKKwkJICBtaSwgKGludCltLT5kZXNjLm1lZGlhLnNsZW4sIG0tPmRlc2MubWVkaWEucHRyLAorCQkgIChvdXJfZGlyID8gb3VyX2RpciA6ICJzZW5kcmVjdiIpLAorCQkgIChpbnQpYy0+YWRkci5zbGVuLCBjLT5hZGRyLnB0ciwgbS0+ZGVzYy5wb3J0KSk7CisgICAgfQorCisgICAgcmV0dXJuIGFuc3dlcjsKK30KKworc3RhdGljIHZvaWQgY2FsbF9vbl9zdGF0ZV9jaGFuZ2VkKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCAKKwkJCQkgICBwanNpcF9ldmVudCAqZSkKK3sKKyAgICBjYWxsX3QgKmNhbGwgPSAoY2FsbF90KilpbnYtPm1vZF9kYXRhW21vZF9zaXBlY2hvLmlkXTsKKyAgICBpZiAoIWNhbGwpCisJcmV0dXJuOworCisgICAgUEpfVU5VU0VEX0FSRyhlKTsKKyAgICBpZiAoaW52LT5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhbGwgJWQ6IERJU0NPTk5FQ1RFRCBbcmVhc29uPSVkICglcyldIiwKKwkJICBjYWxsIC0gYXBwLmNhbGwsIGludi0+Y2F1c2UsCisJCSAgcGpzaXBfZ2V0X3N0YXR1c190ZXh0KGludi0+Y2F1c2UpLT5wdHIpKTsKKwlkZXN0cm95X2NhbGwoY2FsbCk7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAlZDogc3RhdGUgY2hhbmdlZCB0byAlcyIsCisJCSAgY2FsbCAtIGFwcC5jYWxsLCBwanNpcF9pbnZfc3RhdGVfbmFtZShpbnYtPnN0YXRlKSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2FsbF9vbl9yeF9vZmZlcihwanNpcF9pbnZfc2Vzc2lvbiAqaW52LCBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpvZmZlcikKK3sKKyAgICBjYWxsX3QgKmNhbGwgPSAoY2FsbF90KikgaW52LT5tb2RfZGF0YVttb2Rfc2lwZWNoby5pZF07CisgICAgcGpzaXBfaW52X3NldF9zZHBfYW5zd2VyKGludiwgY3JlYXRlX2Fuc3dlcigoaW50KShjYWxsIC0gYXBwLmNhbGwpLCAKKwkJCSAgICAgaW52LT5wb29sX3Byb3YsIG9mZmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxfb25fZm9ya2VkKHBqc2lwX2ludl9zZXNzaW9uICppbnYsIHBqc2lwX2V2ZW50ICplKQoreworICAgIFBKX1VOVVNFRF9BUkcoaW52KTsKKyAgICBQSl9VTlVTRURfQVJHKGUpOworfQorCitzdGF0aWMgcGpfYm9vbF90IG9uX3J4X3JlcXVlc3QoIHBqc2lwX3J4X2RhdGEgKnJkYXRhICkKK3sKKyAgICBwal9zb2NrYWRkciBob3N0YWRkcjsKKyAgICBjaGFyIHRlbXBbODBdLCBob3N0aXBbUEpfSU5FVDZfQUREUlNUUkxFTl07CisgICAgcGpfc3RyX3QgbG9jYWxfdXJpOworICAgIHBqc2lwX2RpYWxvZyAqZGxnOworICAgIHBqc2lwX3JkYXRhX3NkcF9pbmZvICpzZHBfaW5mbzsKKyAgICBwam1lZGlhX3NkcF9zZXNzaW9uICphbnN3ZXIgPSBOVUxMOworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhID0gTlVMTDsKKyAgICBjYWxsX3QgKmNhbGwgPSBOVUxMOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlJYICUuKnMgZnJvbSAlcyIsCisJICAgICAgKGludClyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QubmFtZS5zbGVuLAorCSAgICAgIHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5uYW1lLnB0ciwKKwkgICAgICByZGF0YS0+cGt0X2luZm8uc3JjX25hbWUpKTsKKworICAgIGlmIChyZGF0YS0+bXNnX2luZm8ubXNnLT5saW5lLnJlcS5tZXRob2QuaWQgPT0gUEpTSVBfUkVHSVNURVJfTUVUSE9EKSB7CisJLyogTGV0IG1lIGJlIGEgcmVnaXN0cmFyISAqLworCXBqc2lwX2hkciBoZHJfbGlzdCwgKmg7CisJcGpzaXBfbXNnICptc2c7CisJaW50IGV4cGlyZXMgPSAtMTsKKworCXBqX2xpc3RfaW5pdCgmaGRyX2xpc3QpOworCW1zZyA9IHJkYXRhLT5tc2dfaW5mby5tc2c7CisJaCA9IChwanNpcF9oZHIqKXBqc2lwX21zZ19maW5kX2hkcihtc2csIFBKU0lQX0hfRVhQSVJFUywgTlVMTCk7CisJaWYgKGgpIHsKKwkgICAgZXhwaXJlcyA9ICgocGpzaXBfZXhwaXJlc19oZHIqKWgpLT5pdmFsdWU7CisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZoZHJfbGlzdCwgcGpzaXBfaGRyX2Nsb25lKHJkYXRhLT50cF9pbmZvLnBvb2wsIGgpKTsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiBFeHBpcmVzPSVkIiwgZXhwaXJlcykpOworCX0KKwlpZiAoZXhwaXJlcyAhPSAwKSB7CisJICAgIGggPSAocGpzaXBfaGRyKilwanNpcF9tc2dfZmluZF9oZHIobXNnLCBQSlNJUF9IX0NPTlRBQ1QsIE5VTEwpOworCSAgICBpZiAoaCkKKwkJcGpfbGlzdF9wdXNoX2JhY2soJmhkcl9saXN0LCBwanNpcF9oZHJfY2xvbmUocmRhdGEtPnRwX2luZm8ucG9vbCwgaCkpOworCX0KKworCXBqc2lwX2VuZHB0X3Jlc3BvbmQoYXBwLnNpcF9lbmRwdCwgJm1vZF9zaXBlY2hvLCByZGF0YSwgMjAwLCBOVUxMLAorCSAgICAgICAgICAgICAgICAgICAgJmhkcl9saXN0LCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLmlkICE9IFBKU0lQX0lOVklURV9NRVRIT0QpIHsKKwlpZiAocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLmlkICE9IFBKU0lQX0FDS19NRVRIT0QpIHsKKwkgICAgcGpfc3RyX3QgcmVhc29uID0gcGpfc3RyKCJHbyBhd2F5Iik7CisJICAgIHBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBhcHAuc2lwX2VuZHB0LCByZGF0YSwKKwkJCQkJICAgNDAwLCAmcmVhc29uLAorCQkJCQkgICBOVUxMLCBOVUxMKTsKKwl9CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgc2RwX2luZm8gPSBwanNpcF9yZGF0YV9nZXRfc2RwX2luZm8ocmRhdGEpOworICAgIGlmICghc2RwX2luZm8gfHwgIXNkcF9pbmZvLT5zZHApIHsKKwlwal9zdHJfdCByZWFzb24gPSBwal9zdHIoIlJlcXVpcmUgdmFsaWQgb2ZmZXIiKTsKKwlwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyggYXBwLnNpcF9lbmRwdCwgcmRhdGEsCisJCQkJICAgICAgIDQwMCwgJnJlYXNvbiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8TUFYX0NBTExTOyArK2kpIHsKKwlpZiAoYXBwLmNhbGxbaV0uaW52ID09IE5VTEwpIHsKKwkgICAgY2FsbCA9ICZhcHAuY2FsbFtpXTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChpPT1NQVhfQ0FMTFMpIHsKKwlwal9zdHJfdCByZWFzb24gPSBwal9zdHIoIldlJ3JlIGZ1bGwiKTsKKwlwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyggYXBwLnNpcF9lbmRwdCwgcmRhdGEsCisJCQkJICAgICAgIFBKU0lQX1NDX0JVU1lfSEVSRSwgJnJlYXNvbiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgQ29udGFjdCBVUkkgKi8KKyAgICBzdGF0dXMgPSBwal9nZXRob3N0aXAoc2lwX2FmLCAmaG9zdGFkZHIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHJldHJpZXZlIGxvY2FsIGhvc3QgSVAiLCBzdGF0dXMpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKyAgICBwal9zb2NrYWRkcl9wcmludCgmaG9zdGFkZHIsIGhvc3RpcCwgc2l6ZW9mKGhvc3RpcCksIDIpOworICAgIHBqX2Fuc2lfc3ByaW50Zih0ZW1wLCAiPHNpcDpzaXBlY2hvQCVzOiVkPiIsIGhvc3RpcCwgc2lwX3BvcnQpOworICAgIGxvY2FsX3VyaSA9IHBqX3N0cih0ZW1wKTsKKworICAgIHN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfdWFzKCBwanNpcF91YV9pbnN0YW5jZSgpLCByZGF0YSwKKwkJCQkgICAmbG9jYWxfdXJpLCAmZGxnKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlhbnN3ZXIgPSBjcmVhdGVfYW5zd2VyKChpbnQpKGNhbGwtYXBwLmNhbGwpLCBkbGctPnBvb2wsIHNkcF9pbmZvLT5zZHApOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKyAgICAJc3RhdHVzID0gcGpzaXBfaW52X2NyZWF0ZV91YXMoIGRsZywgcmRhdGEsIGFuc3dlciwgMCwgJmNhbGwtPmludik7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorICAgIAlzdGF0dXMgPSBwanNpcF9pbnZfaW5pdGlhbF9hbnN3ZXIoY2FsbC0+aW52LCByZGF0YSwgMTAwLAorCQkJCSAgICAgICAgICBOVUxMLCBOVUxMLCAmdGRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKyAgICAJc3RhdHVzID0gcGpzaXBfaW52X3NlbmRfbXNnKGNhbGwtPmludiwgdGRhdGEpOworCisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorICAgIAlzdGF0dXMgPSBwanNpcF9pbnZfYW5zd2VyKGNhbGwtPmludiwgMTgwLCBOVUxMLAorICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorICAgIAlzdGF0dXMgPSBwanNpcF9pbnZfc2VuZF9tc2coY2FsbC0+aW52LCB0ZGF0YSk7CisKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisgICAgCXN0YXR1cyA9IHBqc2lwX2ludl9hbnN3ZXIoY2FsbC0+aW52LCAyMDAsIE5VTEwsCisgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisgICAgCXN0YXR1cyA9IHBqc2lwX2ludl9zZW5kX21zZyhjYWxsLT5pbnYsIHRkYXRhKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBhcHAuc2lwX2VuZHB0LCByZGF0YSwKKwkJCQkgICAgICAgNTAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlkZXN0cm95X2NhbGwoY2FsbCk7CisgICAgfSBlbHNlIHsKKwljYWxsLT5pbnYtPm1vZF9kYXRhW21vZF9zaXBlY2hvLmlkXSA9IGNhbGw7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxfb25fbWVkaWFfdXBkYXRlKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LAorCQkJCSAgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIFBKX1VOVVNFRF9BUkcoaW52KTsKKyAgICBQSl9VTlVTRURfQVJHKHN0YXR1cyk7Cit9CisKKworc3RhdGljIHZvaWQgdXNhZ2UoKQoreworICAgIHByaW50ZigiXG5Vc2FnZTogc2lwZWNobyBPUFRJT05TXG4iKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJ3aGVyZSBPUFRJT05TOlxuIik7CisgICAgcHJpbnRmKCIgIC0tbG9jYWwtcG9ydCwgLXAgUE9SVCAgICAgICAgQmluZCB0byBwb3J0IFBPUlQuXG4iKTsKKyAgICBwcmludGYoIiAgLS10Y3AsIC10ICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gdG8gVENQIGluc3RlYWQuXG4iKTsKKyAgICBwcmludGYoIiAgLS1pcHY2LCAtNiAgICAgICAgICAgICAgICAgICBVc2UgSVB2NiBpbnN0ZWFkLlxuIik7CisgICAgcHJpbnRmKCIgIC0taGVscCwgLWggICAgICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgcGFnZS5cbiIpOworfQorCisvKiBtYWluKCkKKyAqCisgKiBJZiBjYWxsZWQgd2l0aCBhcmd1bWVudCwgdHJlYXQgYXJndW1lbnQgYXMgU0lQIFVSTCB0byBiZSBjYWxsZWQuCisgKiBPdGhlcndpc2Ugd2FpdCBmb3IgaW5jb21pbmcgY2FsbHMuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgc3RydWN0IHBqX2dldG9wdF9vcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisgICAgICAgIHsgImxvY2FsLXBvcnQiLAkxLCAwLCAncCcgfSwKKyAgICAgICAgeyAidGNwIiwJMCwgMCwgJ3QnIH0sCisgICAgICAgIHsgImlwdjYiLAkwLCAwLCAnNicgfSwKKyAgICAgICAgeyAiaGVscCIsIAkwLCAwLCAnaCcgfQorICAgIH07CisgICAgaW50IGMsIG9wdGlvbl9pbmRleDsKKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoNSk7CisKKyAgICBwal9pbml0KCk7CisKKyAgICBzaXBfYWYgPSBwal9BRl9JTkVUKCk7CisKKyAgICBwal9vcHRpbmQgPSAwOworICAgIHdoaWxlICgoYyA9IHBqX2dldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJwOnQ2aCIsIGxvbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9uX2luZGV4KSkgIT0gLTEpCisgICAgeworCXN3aXRjaCAoYykgeworCWNhc2UgJ3AnOgorCSAgICBzaXBfcG9ydCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAndCc6CisJICAgIHNpcF90Y3AgPSBQSl9UUlVFOworCSAgICBicmVhazsKKwljYXNlICdoJzoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDA7CisJY2FzZSAnNic6CisJICAgIHNpcF9hZiA9IHBqX0FGX0lORVQ2KCk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIFBKX0xPRygxLChUSElTX0ZJTEUsCisJCSAgICAgICJBcmd1bWVudCBcIiVzXCIgaXMgbm90IHZhbGlkLiBVc2UgLS1oZWxwIHRvIHNlZSBoZWxwIiwKKwkJICAgICAgYXJndltwal9vcHRpbmQtMV0pKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICBpZiAoaW5pdF9zdGFjaygpKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBJZiBVUkwgaXMgc3BlY2lmaWVkLCB0aGVuIG1ha2UgY2FsbCBpbW1lZGlhdGVseS4gKi8KKyAgICBpZiAocGpfb3B0aW5kICE9IGFyZ2MpIHsKKwlwal9zb2NrYWRkciBob3N0YWRkcjsKKwljaGFyIGhvc3RpcFtQSl9JTkVUNl9BRERSU1RSTEVOKzJdOworCWNoYXIgdGVtcFs4MF07CisJY2FsbF90ICpjYWxsOworCXBqX3N0cl90IGRzdF91cmkgPSBwal9zdHIoYXJndltwal9vcHRpbmRdKTsKKwlwal9zdHJfdCBsb2NhbF91cmk7CisJcGpzaXBfZGlhbG9nICpkbGc7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCXBqc2lwX3R4X2RhdGEgKnRkYXRhOworCisJaWYgKHBqX2dldGhvc3RpcChzaXBfYWYsICZob3N0YWRkcikgIT0gUEpfU1VDQ0VTUykgeworCSAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHJldHJpZXZlIGxvY2FsIGhvc3QgSVAiKSk7CisJICAgIGdvdG8gb25fZXJyb3I7CisJfQorCXBqX3NvY2thZGRyX3ByaW50KCZob3N0YWRkciwgaG9zdGlwLCBzaXplb2YoaG9zdGlwKSwgMik7CisKKwlwal9hbnNpX3NwcmludGYodGVtcCwgIjxzaXA6c2lwZWNob0AlczolZD4iLAorCQkJaG9zdGlwLCBzaXBfcG9ydCk7CisJbG9jYWxfdXJpID0gcGpfc3RyKHRlbXApOworCisJY2FsbCA9ICZhcHAuY2FsbFswXTsKKworCXN0YXR1cyA9IHBqc2lwX2RsZ19jcmVhdGVfdWFjKCBwanNpcF91YV9pbnN0YW5jZSgpLAorCQkJCSAgICAgICAmbG9jYWxfdXJpLCAgLyogbG9jYWwgVVJJICovCisJCQkJICAgICAgICZsb2NhbF91cmksICAvKiBsb2NhbCBDb250YWN0ICovCisJCQkJICAgICAgICZkc3RfdXJpLCAgICAvKiByZW1vdGUgVVJJICovCisJCQkJICAgICAgICZkc3RfdXJpLCAgICAvKiByZW1vdGUgdGFyZ2V0ICovCisJCQkJICAgICAgICZkbGcpOwkgICAgLyogZGlhbG9nICovCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBVQUMgZGlhbG9nIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJc3RhdHVzID0gcGpzaXBfaW52X2NyZWF0ZV91YWMoIGRsZywgTlVMTCwgMCwgJmNhbGwtPmludik7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSBnb3RvIG9uX2Vycm9yOworCisJY2FsbC0+aW52LT5tb2RfZGF0YVttb2Rfc2lwZWNoby5pZF0gPSBjYWxsOworCisJc3RhdHVzID0gcGpzaXBfaW52X2ludml0ZShjYWxsLT5pbnYsICZ0ZGF0YSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSBnb3RvIG9uX2Vycm9yOworCisJc3RhdHVzID0gcGpzaXBfaW52X3NlbmRfbXNnKGNhbGwtPmludiwgdGRhdGEpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgZ290byBvbl9lcnJvcjsKKworCXB1dHMoIlByZXNzIEVOVEVSIHRvIHF1aXQuLi4iKTsKKyAgICB9IGVsc2UgeworCXB1dHMoIlJlYWR5IGZvciBpbmNvbWluZyBjYWxscy4gUHJlc3MgRU5URVIgdG8gcXVpdC4uLiIpOworICAgIH0KKworICAgIGZvciAoOzspIHsKKwljaGFyIHNbMTBdOworCisJcHJpbnRmKCJcbk1lbnU6XG4iCisJICAgICAgICIgIGggICAgSGFuZ3VwIGFsbCBjYWxsc1xuIgorCSAgICAgICAiICBsICAgICVzIG1lc3NhZ2UgbG9nZ2luZ1xuIgorCSAgICAgICAiICBxICAgIFF1aXRcbiIsCisJICAgICAgIChhcHAuZW5hYmxlX21zZ19sb2dnaW5nPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCisJaWYgKGZnZXRzKHMsIHNpemVvZihzKSwgc3RkaW4pID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJaWYgKHNbMF09PSdxJykKKwkgICAgYnJlYWs7CisJc3dpdGNoIChzWzBdKSB7CisJY2FzZSAnbCc6CisJICAgIGFwcC5lbmFibGVfbXNnX2xvZ2dpbmcgPSAhYXBwLmVuYWJsZV9tc2dfbG9nZ2luZzsKKwkgICAgYnJlYWs7CisJY2FzZSAnaCc6CisJICAgIGhhbmd1cF9hbGwoKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGRlc3Ryb3lfc3RhY2soKTsKKworICAgIHB1dHMoIkJ5ZSBieWUuLiIpOworICAgIHJldHVybiAwOworCitvbl9lcnJvcjoKKyAgICBwdXRzKCJBbiBlcnJvciBoYXMgb2NjdXJyZWQuIHJ1biBhIGRlYnVnZ2VyLi4iKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaXBydHAuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwcnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNDczZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwcnRwLmMKQEAgLTAsMCArMSwyMTg5IEBACisvKiAkSWQ6IHNpcHJ0cC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisKKworCisKKy8qIFVzYWdlICovCitzdGF0aWMgY29uc3QgY2hhciAqVVNBR0UgPSAKKyIgUFVSUE9TRToJCQkJCQkJCSAgICBcbiIKKyIgICBUaGlzIHByb2dyYW0gZXN0YWJsaXNoZXMgU0lQIElOVklURSBzZXNzaW9uIGFuZCBtZWRpYSwgYW5kIGNhbGN1bGF0ZSAgICBcbiIKKyIgICB0aGUgbWVkaWEgcXVhbGl0eSAocGFja2V0IGxvc3QsIGppdHRlciwgcnR0LCBldGMuKS4gVW5saWtlIG5vcm1hbAkgICAgXG4iCisiICAgcGptZWRpYSBhcHBsaWNhdGlvbnMsIHRoaXMgcHJvZ3JhbSBieXBhc3NlcyBhbGwgcGptZWRpYSBzdHJlYW0JICAgIFxuIgorIiAgIGZyYW1ld29yayBhbmQgdHJhbnNtaXQgZW5jb2RlZCBSVFAgcGFja2V0cyBtYW51YWxseSB1c2luZyBvd24gdGhyZWFkLiAgIFxuIgorIlxuIgorIiBVU0FHRTpcbiIKKyIgICBzaXBydHAgW29wdGlvbnNdICAgICAgICA9PiB0byBzdGFydCBpbiBzZXJ2ZXIgbW9kZVxuIgorIiAgIHNpcHJ0cCBbb3B0aW9uc10gVVJMICAgID0+IHRvIHN0YXJ0IGluIGNsaWVudCBtb2RlXG4iCisiXG4iCisiIFByb2dyYW0gb3B0aW9uczpcbiIKKyIgICAtLWNvdW50PU4sICAgICAgICAtYyAgICBTZXQgbnVtYmVyIG9mIGNhbGxzIHRvIGNyZWF0ZSAoZGVmYXVsdDoxKSBcbiIKKyIgICAtLWdhcD1OICAgICAgICAgICAtZyAgICBTZXQgY2FsbCBnYXBwaW5nIHRvIE4gbXNlYyAoZGVmYXVsdDowKVxuIgorIiAgIC0tZHVyYXRpb249U0VDLCAgIC1kICAgIFNldCBtYXhpbXVtIGNhbGwgZHVyYXRpb24gKGRlZmF1bHQ6dW5saW1pdGVkKSBcbiIKKyIgICAtLWF1dG8tcXVpdCwgICAgICAtcSAgICBRdWl0IHdoZW4gY2FsbHMgaGF2ZSBiZWVuIGNvbXBsZXRlZCAoZGVmYXVsdDpubylcbiIKKyIgICAtLWNhbGwtcmVwb3J0ICAgICAtUiAgICBEaXNwbGF5IHJlcG9ydCBvbiBjYWxsIHRlcm1pbmF0aW9uIChkZWZhdWx0OnllcylcbiIKKyJcbiIKKyIgQWRkcmVzcyBhbmQgcG9ydHMgb3B0aW9uczpcbiIKKyIgICAtLWxvY2FsLXBvcnQ9UE9SVCwtcCAgICBTZXQgbG9jYWwgU0lQIHBvcnQgKGRlZmF1bHQ6IDUwNjApXG4iCisiICAgLS1ydHAtcG9ydD1QT1JULCAgLXIgICAgU2V0IHN0YXJ0IG9mIFJUUCBwb3J0IChkZWZhdWx0OiA0MDAwKVxuIgorIiAgIC0taXAtYWRkcj1JUCwgICAgIC1pICAgIFNldCBsb2NhbCBJUCBhZGRyZXNzIHRvIHVzZSAob3RoZXJ3aXNlIGl0IHdpbGxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZGV0ZXJtaW5lIGxvY2FsIElQIGFkZHJlc3MgZnJvbSBob3N0bmFtZSlcbiIKKyJcbiIKKyIgTG9nZ2luZyBPcHRpb25zOlxuIgorIiAgIC0tbG9nLWxldmVsPU4sICAgIC1sICAgIFNldCBsb2cgdmVyYm9zaXR5IGxldmVsIChkZWZhdWx0PTUpXG4iCisiICAgLS1hcHAtbG9nLWxldmVsPU4gICAgICAgU2V0IGFwcCBzY3JlZW4gbG9nIHZlcmJvc2l0eSAoZGVmYXVsdD0zKVxuIgorIiAgIC0tbG9nLWZpbGU9RklMRSAgICAgICAgIFdyaXRlIGxvZyB0byBmaWxlIEZJTEVcbiIKKyIgICAtLXJlcG9ydC1maWxlPUZJTEUgICAgICBXcml0ZSByZXBvcnQgdG8gZmlsZSBGSUxFXG4iCisiXG4iCisvKiBEb24ndCBzdXBwb3J0IHRoaXMgYW55bW9yZSwgYmVjYXVzZSBjb2RlYyBpcyBwcm9wZXJseSBleGFtaW5lZCBpbgorICAgcGptZWRpYV9zZXNzaW9uX2luZm9fZnJvbV9zZHAoKSBmdW5jdGlvbi4KKworIiBDb2RlYyBPcHRpb25zOlxuIgorIiAgIC0tYS1wdD1QVCAgICAgICAgICAgICAgIFNldCBhdWRpbyBwYXlsb2FkIHR5cGUgdG8gUFQgKGRlZmF1bHQ9MClcbiIKKyIgICAtLWEtbmFtZT1OQU1FICAgICAgICAgICBTZXQgYXVkaW8gY29kZWMgbmFtZSB0byBOQU1FIChkZWZhdWx0PXBjbXUpXG4iCisiICAgLS1hLWNsb2NrPVJBVEUgICAgICAgICAgU2V0IGF1ZGlvIGNvZGVjIHJhdGUgdG8gUkFURSBIeiAoZGVmYXVsdD04MDAwSHopXG4iCisiICAgLS1hLWJpdHJhdGU9QlBTICAgICAgICAgU2V0IGF1ZGlvIGNvZGVjIGJpdHJhdGUgdG8gQlBTIChkZWZhdWx0PTY0MDAwYnBzKVxuIgorIiAgIC0tYS1wdGltZT1NUyAgICAgICAgICAgIFNldCBhdWRpbyBmcmFtZSB0aW1lIHRvIE1TIG1zZWMgKGRlZmF1bHQ9MjBtcylcbiIKKyovCis7CisKKworLyogSW5jbHVkZSBhbGwgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxwanNpcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjLmg+CisjaW5jbHVkZSA8cGpzaXBfdWEuaD4KKyNpbmNsdWRlIDxwanNpcF9zaW1wbGUuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBVbmNvbW1lbnQgdGhlc2UgdG8gZGlzYWJsZSB0aHJlYWRzLgorICogTk9URToKKyAqICAgd2hlbiB0aHJlYWRpbmcgaXMgZGlzYWJsZWQsIHNpcHJ0cCB3b24ndCB0cmFuc21pdCBhbnkKKyAqICAgUlRQIHBhY2tldHMuCisgKi8KKy8qCisjdW5kZWYgUEpfSEFTX1RIUkVBRFMKKyNkZWZpbmUgUEpfSEFTX1RIUkVBRFMgMAorKi8KKworCisjaWYgUEpfSEFTX0hJR0hfUkVTX1RJTUVSPT0wCisjICAgZXJyb3IgIkhpZ2ggcmVzb2x1dGlvbiB0aW1lciBpcyBuZWVkZWQgZm9yIHRoaXMgc2FtcGxlIgorI2VuZGlmCisKKyNkZWZpbmUgVEhJU19GSUxFCSJzaXBydHAuYyIKKyNkZWZpbmUgTUFYX0NBTExTCTEwMjQKKyNkZWZpbmUgUlRQX1NUQVJUX1BPUlQJNDAwMAorCisKKy8qIENvZGVjIGRlc2NyaXB0b3I6ICovCitzdHJ1Y3QgY29kZWMKK3sKKyAgICB1bnNpZ25lZAlwdDsKKyAgICBjaGFyKgluYW1lOworICAgIHVuc2lnbmVkCWNsb2NrX3JhdGU7CisgICAgdW5zaWduZWQJYml0X3JhdGU7CisgICAgdW5zaWduZWQJcHRpbWU7CisgICAgY2hhcioJZGVzY3JpcHRpb247Cit9OworCisKKy8qIEEgYmlkaXJlY3Rpb25hbCBtZWRpYSBzdHJlYW0gY3JlYXRlZCB3aGVuIHRoZSBjYWxsIGlzIGFjdGl2ZS4gKi8KK3N0cnVjdCBtZWRpYV9zdHJlYW0KK3sKKyAgICAvKiBTdGF0aWM6ICovCisgICAgdW5zaWduZWQJCSBjYWxsX2luZGV4OwkgICAgLyogQ2FsbCBvd25lci4JCSovCisgICAgdW5zaWduZWQJCSBtZWRpYV9pbmRleDsJICAgIC8qIE1lZGlhIGluZGV4IGluIGNhbGwuCSovCisgICAgcGptZWRpYV90cmFuc3BvcnQgICAqdHJhbnNwb3J0OwkgICAgLyogVG8gc2VuZC9yZWN2IFJUUC9SVENQCSovCisKKyAgICAvKiBBY3RpdmU/ICovCisgICAgcGpfYm9vbF90CQkgYWN0aXZlOwkgICAgLyogTm9uLXplcm8gaWYgaXMgaW4gY2FsbC4JKi8KKworICAgIC8qIEN1cnJlbnQgc3RyZWFtIGluZm86ICovCisgICAgcGptZWRpYV9zdHJlYW1faW5mbwkgc2k7CQkgICAgLyogQ3VycmVudCBzdHJlYW0gaW5mby4JKi8KKworICAgIC8qIE1vcmUgaW5mbzogKi8KKyAgICB1bnNpZ25lZAkJIGNsb2NrX3JhdGU7CSAgICAvKiBjbG9jayByYXRlCQkqLworICAgIHVuc2lnbmVkCQkgc2FtcGxlc19wZXJfZnJhbWU7IC8qIHNhbXBsZXMgcGVyIGZyYW1lCSovCisgICAgdW5zaWduZWQJCSBieXRlc19wZXJfZnJhbWU7ICAgLyogZnJhbWUgc2l6ZS4JCSovCisKKyAgICAvKiBSVFAgc2Vzc2lvbjogKi8KKyAgICBwam1lZGlhX3J0cF9zZXNzaW9uCSBvdXRfc2VzczsJICAgIC8qIG91dGdvaW5nIFJUUCBzZXNzaW9uCSovCisgICAgcGptZWRpYV9ydHBfc2Vzc2lvbgkgaW5fc2VzczsJICAgIC8qIGluY29taW5nIFJUUCBzZXNzaW9uCSovCisKKyAgICAvKiBSVENQIHN0YXRzOiAqLworICAgIHBqbWVkaWFfcnRjcF9zZXNzaW9uIHJ0Y3A7CQkgICAgLyogaW5jb21pbmcgUlRDUCBzZXNzaW9uLgkqLworCisgICAgLyogVGhyZWFkOiAqLworICAgIHBqX2Jvb2xfdAkJIHRocmVhZF9xdWl0X2ZsYWc7ICAvKiBTdG9wIG1lZGlhIHRocmVhZC4JKi8KKyAgICBwal90aHJlYWRfdAkJKnRocmVhZDsJICAgIC8qIE1lZGlhIHRocmVhZC4JCSovCit9OworCisKKy8qIFRoaXMgaXMgYSBjYWxsIHN0cnVjdHVyZSB0aGF0IGlzIGNyZWF0ZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gc3RhcnRzCisgKiBhbmQgb25seSBkZXN0cm95ZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMuCisgKi8KK3N0cnVjdCBjYWxsCit7CisgICAgdW5zaWduZWQJCSBpbmRleDsKKyAgICBwanNpcF9pbnZfc2Vzc2lvbgkqaW52OworICAgIHVuc2lnbmVkCQkgbWVkaWFfY291bnQ7CisgICAgc3RydWN0IG1lZGlhX3N0cmVhbQkgbWVkaWFbMV07CisgICAgcGpfdGltZV92YWwJCSBzdGFydF90aW1lOworICAgIHBqX3RpbWVfdmFsCQkgcmVzcG9uc2VfdGltZTsKKyAgICBwal90aW1lX3ZhbAkJIGNvbm5lY3RfdGltZTsKKworICAgIHBqX3RpbWVyX2VudHJ5CSBkX3RpbWVyOwkgICAgLyoqPCBEaXNjb25uZWN0IHRpbWVyLgkqLworfTsKKworCisvKiBBcHBsaWNhdGlvbidzIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgYXBwCit7CisgICAgdW5zaWduZWQJCSBtYXhfY2FsbHM7CisgICAgdW5zaWduZWQJCSBjYWxsX2dhcDsKKyAgICBwal9ib29sX3QJCSBjYWxsX3JlcG9ydDsKKyAgICB1bnNpZ25lZAkJIHVhY19jYWxsczsKKyAgICB1bnNpZ25lZAkJIGR1cmF0aW9uOworICAgIHBqX2Jvb2xfdAkJIGF1dG9fcXVpdDsKKyAgICB1bnNpZ25lZAkJIHRocmVhZF9jb3VudDsKKyAgICBpbnQJCQkgc2lwX3BvcnQ7CisgICAgaW50CQkJIHJ0cF9zdGFydF9wb3J0OworICAgIHBqX3N0cl90CQkgbG9jYWxfYWRkcjsKKyAgICBwal9zdHJfdAkJIGxvY2FsX3VyaTsKKyAgICBwal9zdHJfdAkJIGxvY2FsX2NvbnRhY3Q7CisgICAgCisgICAgaW50CQkJIGFwcF9sb2dfbGV2ZWw7CisgICAgaW50CQkJIGxvZ19sZXZlbDsKKyAgICBjaGFyCQkqbG9nX2ZpbGVuYW1lOworICAgIGNoYXIJCSpyZXBvcnRfZmlsZW5hbWU7CisKKyAgICBzdHJ1Y3QgY29kZWMJIGF1ZGlvX2NvZGVjOworCisgICAgcGpfc3RyX3QJCSB1cmlfdG9fY2FsbDsKKworICAgIHBqX2NhY2hpbmdfcG9vbAkgY3A7CisgICAgcGpfcG9vbF90CQkqcG9vbDsKKworICAgIHBqc2lwX2VuZHBvaW50CSpzaXBfZW5kcHQ7CisgICAgcGpfYm9vbF90CQkgdGhyZWFkX3F1aXQ7CisgICAgcGpfdGhyZWFkX3QJCSpzaXBfdGhyZWFkWzFdOworCisgICAgcGptZWRpYV9lbmRwdAkqbWVkX2VuZHB0OworICAgIHN0cnVjdCBjYWxsCQkgY2FsbFtNQVhfQ0FMTFNdOworfSBhcHA7CisKKworCisvKgorICogUHJvdG90eXBlczoKKyAqLworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBTRFAgbmVnb3RpYXRpb24gaXMgZG9uZSBpbiB0aGUgY2FsbDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fbWVkaWFfdXBkYXRlKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LAorCQkJCSAgcGpfc3RhdHVzX3Qgc3RhdHVzKTsKKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gaW52aXRlIHNlc3Npb24ncyBzdGF0ZSBoYXMgY2hhbmdlZDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fc3RhdGVfY2hhbmdlZCggcGpzaXBfaW52X3Nlc3Npb24gKmludiwgCisJCQkJICAgcGpzaXBfZXZlbnQgKmUpOworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBkaWFsb2cgaGFzIGZvcmtlZDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fZm9ya2VkKHBqc2lwX2ludl9zZXNzaW9uICppbnYsIHBqc2lwX2V2ZW50ICplKTsKKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBvdXRzaWRlIGRpYWxvZ3M6ICovCitzdGF0aWMgcGpfYm9vbF90IG9uX3J4X3JlcXVlc3QoIHBqc2lwX3J4X2RhdGEgKnJkYXRhICk7CisKKy8qIFdvcmtlciB0aHJlYWQgcHJvdG90eXBlICovCitzdGF0aWMgaW50IHNpcF93b3JrZXJfdGhyZWFkKHZvaWQgKmFyZyk7CisKKy8qIENyZWF0ZSBTRFAgZm9yIGNhbGwgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjcmVhdGVfc2RwKCBwal9wb29sX3QgKnBvb2wsCisJCQkgICAgICAgc3RydWN0IGNhbGwgKmNhbGwsCisJCQkgICAgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqKnBfc2RwKTsKKworLyogSGFuZ3VwIGNhbGwgKi8KK3N0YXRpYyB2b2lkIGhhbmd1cF9jYWxsKHVuc2lnbmVkIGluZGV4KTsKKworLyogRGVzdHJveSB0aGUgY2FsbCdzIG1lZGlhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfbWVkaWEodW5zaWduZWQgY2FsbF9pbmRleCk7CisKKy8qIERlc3Ryb3kgbWVkaWEuICovCitzdGF0aWMgdm9pZCBkZXN0cm95X21lZGlhKCk7CisKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGJ5IG1lZGlhIHRyYW5zcG9ydCBvbiByZWNlaXB0IG9mIFJUUCBwYWNrZXQuICovCitzdGF0aWMgdm9pZCBvbl9yeF9ydHAodm9pZCAqdXNlcl9kYXRhLCB2b2lkICpwa3QsIHBqX3NzaXplX3Qgc2l6ZSk7CisKKy8qIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGJ5IG1lZGlhIHRyYW5zcG9ydCBvbiByZWNlaXB0IG9mIFJUQ1AgcGFja2V0LiAqLworc3RhdGljIHZvaWQgb25fcnhfcnRjcCh2b2lkICp1c2VyX2RhdGEsIHZvaWQgKnBrdCwgcGpfc3NpemVfdCBzaXplKTsKKworLyogRGlzcGxheSBlcnJvciAqLworc3RhdGljIHZvaWQgYXBwX3BlcnJvcihjb25zdCBjaGFyICpzZW5kZXIsIGNvbnN0IGNoYXIgKnRpdGxlLCAKKwkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cyk7CisKKy8qIFByaW50IGNhbGwgKi8KK3N0YXRpYyB2b2lkIHByaW50X2NhbGwoaW50IGNhbGxfaW5kZXgpOworCisKKy8qIFRoaXMgaXMgYSBQSlNJUCBtb2R1bGUgdG8gYmUgcmVnaXN0ZXJlZCBieSBhcHBsaWNhdGlvbiB0byBoYW5kbGUKKyAqIGluY29taW5nIHJlcXVlc3RzIG91dHNpZGUgYW55IGRpYWxvZ3MvdHJhbnNhY3Rpb25zLiBUaGUgbWFpbiBwdXJwb3NlCisgKiBoZXJlIGlzIHRvIGhhbmRsZSBpbmNvbWluZyBJTlZJVEUgcmVxdWVzdCBtZXNzYWdlLCB3aGVyZSB3ZSB3aWxsCisgKiBjcmVhdGUgYSBkaWFsb2cgYW5kIElOVklURSBzZXNzaW9uIGZvciBpdC4KKyAqLworc3RhdGljIHBqc2lwX21vZHVsZSBtb2Rfc2lwcnRwID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2Qtc2lwcnRwYXBwIiwgMTMgfSwJICAgIC8qIE5hbWUuCQkJKi8KKyAgICAtMSwJCQkJICAgIC8qIElkCQkJKi8KKyAgICBQSlNJUF9NT0RfUFJJT1JJVFlfQVBQTElDQVRJT04sIC8qIFByaW9yaXR5CQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBsb2FkKCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHN0YXJ0KCkJCQkqLworICAgIE5VTEwsCQkJICAgIC8qIHN0b3AoKQkJCSovCisgICAgTlVMTCwJCQkgICAgLyogdW5sb2FkKCkJCQkqLworICAgICZvbl9yeF9yZXF1ZXN0LAkJICAgIC8qIG9uX3J4X3JlcXVlc3QoKQkJKi8KKyAgICBOVUxMLAkJCSAgICAvKiBvbl9yeF9yZXNwb25zZSgpCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3JlcXVlc3QuCQkqLworICAgIE5VTEwsCQkJICAgIC8qIG9uX3R4X3Jlc3BvbnNlKCkJCSovCisgICAgTlVMTCwJCQkgICAgLyogb25fdHN4X3N0YXRlKCkJCSovCit9OworCisKKy8qIENvZGVjIGNvbnN0YW50cyAqLworc3RydWN0IGNvZGVjIGF1ZGlvX2NvZGVjc1tdID0gCit7CisgICAgeyAwLCAgIlBDTVUiLCA4MDAwLCA2NDAwMCwgMjAsICJHLjcxMSBVTGF3IiB9LAorICAgIHsgMywgICJHU00iLCAgODAwMCwgMTMyMDAsIDIwLCAiR1NNIiB9LAorICAgIHsgNCwgICJHNzIzIiwgODAwMCwgNjQwMCwgIDMwLCAiRy43MjMuMSIgfSwKKyAgICB7IDgsICAiUENNQSIsIDgwMDAsIDY0MDAwLCAyMCwgIkcuNzExIEFMYXciIH0sCisgICAgeyAxOCwgIkc3MjkiLCA4MDAwLCA4MDAwLCAgMjAsICJHLjcyOSIgfSwKK307CisKKworLyoKKyAqIEluaXQgU0lQIHN0YWNrCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X3NpcCgpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBpbml0IFBKTElCLVVUSUw6ICovCisgICAgc3RhdHVzID0gcGpsaWJfdXRpbF9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmYXBwLmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIC8qIENyZWF0ZSBhcHBsaWNhdGlvbiBwb29sIGZvciBtaXNjLiAqLworICAgIGFwcC5wb29sID0gcGpfcG9vbF9jcmVhdGUoJmFwcC5jcC5mYWN0b3J5LCAiYXBwIiwgMTAwMCwgMTAwMCwgTlVMTCk7CisKKyAgICAvKiBDcmVhdGUgdGhlIGVuZHBvaW50OiAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZSgmYXBwLmNwLmZhY3RvcnksIHBqX2dldGhvc3RuYW1lKCktPnB0ciwgCisJCQkJJmFwcC5zaXBfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKworICAgIC8qIEFkZCBVRFAgdHJhbnNwb3J0LiAqLworICAgIHsKKwlwal9zb2NrYWRkcl9pbiBhZGRyOworCXBqc2lwX2hvc3RfcG9ydCBhZGRybmFtZTsKKwlwanNpcF90cmFuc3BvcnQgKnRwOworCisJcGpfYnplcm8oJmFkZHIsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gMDsKKwlhZGRyLnNpbl9wb3J0ID0gcGpfaHRvbnMoKHBqX3VpbnQxNl90KWFwcC5zaXBfcG9ydCk7CisKKwlpZiAoYXBwLmxvY2FsX2FkZHIuc2xlbikgeworCisJICAgIGFkZHJuYW1lLmhvc3QgPSBhcHAubG9jYWxfYWRkcjsKKwkgICAgYWRkcm5hbWUucG9ydCA9IGFwcC5zaXBfcG9ydDsKKworCSAgICBzdGF0dXMgPSBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCAmYXBwLmxvY2FsX2FkZHIsIAorCQkJCQkgKHBqX3VpbnQxNl90KWFwcC5zaXBfcG9ydCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byByZXNvbHZlIElQIGludGVyZmFjZSIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJICAgIH0KKwl9CisKKwlzdGF0dXMgPSBwanNpcF91ZHBfdHJhbnNwb3J0X3N0YXJ0KCBhcHAuc2lwX2VuZHB0LCAmYWRkciwgCisJCQkJCSAgICAoYXBwLmxvY2FsX2FkZHIuc2xlbiA/ICZhZGRybmFtZTpOVUxMKSwKKwkJCQkJICAgIDEsICZ0cCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHN0YXJ0IFVEUCB0cmFuc3BvcnQiLCBzdGF0dXMpOworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKworCVBKX0xPRygzLChUSElTX0ZJTEUsICJTSVAgVURQIGxpc3RlbmluZyBvbiAlLipzOiVkIiwKKwkJICAoaW50KXRwLT5sb2NhbF9uYW1lLmhvc3Quc2xlbiwgdHAtPmxvY2FsX25hbWUuaG9zdC5wdHIsCisJCSAgdHAtPmxvY2FsX25hbWUucG9ydCkpOworICAgIH0KKworICAgIC8qIAorICAgICAqIEluaXQgdHJhbnNhY3Rpb24gbGF5ZXIuCisgICAgICogVGhpcyB3aWxsIGNyZWF0ZS9pbml0aWFsaXplIHRyYW5zYWN0aW9uIGhhc2ggdGFibGVzIGV0Yy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF90c3hfbGF5ZXJfaW5pdF9tb2R1bGUoYXBwLnNpcF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qICBJbml0aWFsaXplIFVBIGxheWVyLiAqLworICAgIHN0YXR1cyA9IHBqc2lwX3VhX2luaXRfbW9kdWxlKCBhcHAuc2lwX2VuZHB0LCBOVUxMICk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qIEluaXRpYWxpemUgMTAwcmVsIHN1cHBvcnQgKi8KKyAgICBzdGF0dXMgPSBwanNpcF8xMDByZWxfaW5pdF9tb2R1bGUoYXBwLnNpcF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworICAgIC8qICBJbml0IGludml0ZSBzZXNzaW9uIG1vZHVsZS4gKi8KKyAgICB7CisJcGpzaXBfaW52X2NhbGxiYWNrIGludl9jYjsKKworCS8qIEluaXQgdGhlIGNhbGxiYWNrIGZvciBJTlZJVEUgc2Vzc2lvbjogKi8KKwlwal9iemVybygmaW52X2NiLCBzaXplb2YoaW52X2NiKSk7CisJaW52X2NiLm9uX3N0YXRlX2NoYW5nZWQgPSAmY2FsbF9vbl9zdGF0ZV9jaGFuZ2VkOworCWludl9jYi5vbl9uZXdfc2Vzc2lvbiA9ICZjYWxsX29uX2ZvcmtlZDsKKwlpbnZfY2Iub25fbWVkaWFfdXBkYXRlID0gJmNhbGxfb25fbWVkaWFfdXBkYXRlOworCisJLyogSW5pdGlhbGl6ZSBpbnZpdGUgc2Vzc2lvbiBtb2R1bGU6ICAqLworCXN0YXR1cyA9IHBqc2lwX2ludl91c2FnZV9pbml0KGFwcC5zaXBfZW5kcHQsICZpbnZfY2IpOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIG91ciBtb2R1bGUgdG8gcmVjZWl2ZSBpbmNvbWluZyByZXF1ZXN0cy4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGFwcC5zaXBfZW5kcHQsICZtb2Rfc2lwcnRwKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisgICAgLyogSW5pdCBjYWxscyAqLworICAgIGZvciAoaT0wOyBpPGFwcC5tYXhfY2FsbHM7ICsraSkKKwlhcHAuY2FsbFtpXS5pbmRleCA9IGk7CisKKyAgICAvKiBEb25lICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIERlc3Ryb3kgU0lQCisgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2lwKCkKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgYXBwLnRocmVhZF9xdWl0ID0gMTsKKyAgICBmb3IgKGk9MDsgaTxhcHAudGhyZWFkX2NvdW50OyArK2kpIHsKKwlpZiAoYXBwLnNpcF90aHJlYWRbaV0pIHsKKwkgICAgcGpfdGhyZWFkX2pvaW4oYXBwLnNpcF90aHJlYWRbaV0pOworCSAgICBwal90aHJlYWRfZGVzdHJveShhcHAuc2lwX3RocmVhZFtpXSk7CisJICAgIGFwcC5zaXBfdGhyZWFkW2ldID0gTlVMTDsKKwl9CisgICAgfQorCisgICAgaWYgKGFwcC5zaXBfZW5kcHQpIHsKKwlwanNpcF9lbmRwdF9kZXN0cm95KGFwcC5zaXBfZW5kcHQpOworCWFwcC5zaXBfZW5kcHQgPSBOVUxMOworICAgIH0KKworfQorCisKKy8qCisgKiBJbml0IG1lZGlhIHN0YWNrLgorICovCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9tZWRpYSgpCit7CisgICAgdW5zaWduZWQJaSwgY291bnQ7CisgICAgcGpfdWludDE2X3QJcnRwX3BvcnQ7CisgICAgcGpfc3RhdHVzX3QJc3RhdHVzOworCisKKyAgICAvKiBJbml0aWFsaXplIG1lZGlhIGVuZHBvaW50IHNvIHRoYXQgYXQgbGVhc3QgZXJyb3Igc3Vic3lzdGVtIGlzIHByb3Blcmx5CisgICAgICogaW5pdGlhbGl6ZWQuCisgICAgICovCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmYXBwLmNwLmZhY3RvcnksIE5VTEwsIDEsICZhcHAubWVkX2VuZHB0KTsKKyNlbHNlCisgICAgc3RhdHVzID0gcGptZWRpYV9lbmRwdF9jcmVhdGUoJmFwcC5jcC5mYWN0b3J5LCAKKwkJCQkgIHBqc2lwX2VuZHB0X2dldF9pb3F1ZXVlKGFwcC5zaXBfZW5kcHQpLAorCQkJCSAgMCwgJmFwcC5tZWRfZW5kcHQpOworI2VuZGlmCisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgc3RhdHVzKTsKKworCisgICAgLyogTXVzdCByZWdpc3RlciBjb2RlY3MgdG8gYmUgc3VwcG9ydGVkICovCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19HNzExX0NPREVDKSAmJiBQSk1FRElBX0hBU19HNzExX0NPREVDIT0wCisgICAgcGptZWRpYV9jb2RlY19nNzExX2luaXQoYXBwLm1lZF9lbmRwdCk7CisjZW5kaWYKKworICAgIC8qIFJUUCBwb3J0IGNvdW50ZXIgKi8KKyAgICBydHBfcG9ydCA9IChwal91aW50MTZfdCkoYXBwLnJ0cF9zdGFydF9wb3J0ICYgMHhGRkZFKTsKKworICAgIC8qIEluaXQgbWVkaWEgdHJhbnNwb3J0IGZvciBhbGwgY2FsbHMuICovCisgICAgZm9yIChpPTAsIGNvdW50PTA7IGk8YXBwLm1heF9jYWxsczsgKytpLCArK2NvdW50KSB7CisKKwl1bnNpZ25lZCBqOworCisJLyogQ3JlYXRlIHRyYW5zcG9ydCBmb3IgZWFjaCBtZWRpYSBpbiB0aGUgY2FsbCAqLworCWZvciAoaj0wOyBqPFBKX0FSUkFZX1NJWkUoYXBwLmNhbGxbMF0ubWVkaWEpOyArK2opIHsKKwkgICAgLyogUmVwZWF0IGJpbmRpbmcgbWVkaWEgc29ja2V0IHRvIG5leHQgcG9ydCB3aGVuIGZhaWxzIHRvIGJpbmQKKwkgICAgICogdG8gY3VycmVudCBwb3J0IG51bWJlci4KKwkgICAgICovCisJICAgIGludCByZXRyeTsKKworCSAgICBhcHAuY2FsbFtpXS5tZWRpYVtqXS5jYWxsX2luZGV4ID0gaTsKKwkgICAgYXBwLmNhbGxbaV0ubWVkaWFbal0ubWVkaWFfaW5kZXggPSBqOworCisJICAgIHN0YXR1cyA9IC0xOworCSAgICBmb3IgKHJldHJ5PTA7IHJldHJ5PDEwMDsgKytyZXRyeSxydHBfcG9ydCs9MikgIHsKKwkJc3RydWN0IG1lZGlhX3N0cmVhbSAqbSA9ICZhcHAuY2FsbFtpXS5tZWRpYVtqXTsKKwkJCisJCXN0YXR1cyA9IHBqbWVkaWFfdHJhbnNwb3J0X3VkcF9jcmVhdGUyKGFwcC5tZWRfZW5kcHQsIAorCQkJCQkJICAgICAgICJzaXBydHAiLAorCQkJCQkJICAgICAgICZhcHAubG9jYWxfYWRkciwKKwkJCQkJCSAgICAgICBydHBfcG9ydCwgMCwgCisJCQkJCQkgICAgICAgJm0tPnRyYW5zcG9ydCk7CisJCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCQkgICAgcnRwX3BvcnQgKz0gMjsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogRG9uZSAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworCitvbl9lcnJvcjoKKyAgICBkZXN0cm95X21lZGlhKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogRGVzdHJveSBtZWRpYS4KKyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9tZWRpYSgpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaT0wOyBpPGFwcC5tYXhfY2FsbHM7ICsraSkgeworCXVuc2lnbmVkIGo7CisJZm9yIChqPTA7IGo8UEpfQVJSQVlfU0laRShhcHAuY2FsbFswXS5tZWRpYSk7ICsraikgeworCSAgICBzdHJ1Y3QgbWVkaWFfc3RyZWFtICptID0gJmFwcC5jYWxsW2ldLm1lZGlhW2pdOworCisJICAgIGlmIChtLT50cmFuc3BvcnQpIHsKKwkJcGptZWRpYV90cmFuc3BvcnRfY2xvc2UobS0+dHJhbnNwb3J0KTsKKwkJbS0+dHJhbnNwb3J0ID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoYXBwLm1lZF9lbmRwdCkgeworCXBqbWVkaWFfZW5kcHRfZGVzdHJveShhcHAubWVkX2VuZHB0KTsKKwlhcHAubWVkX2VuZHB0ID0gTlVMTDsKKyAgICB9Cit9CisKKworLyoKKyAqIE1ha2Ugb3V0Z29pbmcgY2FsbC4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IG1ha2VfY2FsbChjb25zdCBwal9zdHJfdCAqZHN0X3VyaSkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHN0cnVjdCBjYWxsICpjYWxsOworICAgIHBqc2lwX2RpYWxvZyAqZGxnOworICAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkcDsKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKworICAgIC8qIEZpbmQgdW51c2VkIGNhbGwgc2xvdCAqLworICAgIGZvciAoaT0wOyBpPGFwcC5tYXhfY2FsbHM7ICsraSkgeworCWlmIChhcHAuY2FsbFtpXS5pbnYgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gYXBwLm1heF9jYWxscykKKwlyZXR1cm4gUEpfRVRPT01BTlk7CisKKyAgICBjYWxsID0gJmFwcC5jYWxsW2ldOworCisgICAgLyogQ3JlYXRlIFVBQyBkaWFsb2cgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9kbGdfY3JlYXRlX3VhYyggcGpzaXBfdWFfaW5zdGFuY2UoKSwgCisJCQkJICAgJmFwcC5sb2NhbF91cmksCS8qIGxvY2FsIFVSSQkgICAgKi8KKwkJCQkgICAmYXBwLmxvY2FsX2NvbnRhY3QsCS8qIGxvY2FsIENvbnRhY3QgICAgKi8KKwkJCQkgICBkc3RfdXJpLAkJLyogcmVtb3RlIFVSSQkgICAgKi8KKwkJCQkgICBkc3RfdXJpLAkJLyogcmVtb3RlIHRhcmdldCAgICAqLworCQkJCSAgICZkbGcpOwkJLyogZGlhbG9nCSAgICAqLworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSsrYXBwLnVhY19jYWxsczsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIENyZWF0ZSBTRFAgKi8KKyAgICBjcmVhdGVfc2RwKCBkbGctPnBvb2wsIGNhbGwsICZzZHApOworCisgICAgLyogQ3JlYXRlIHRoZSBJTlZJVEUgc2Vzc2lvbi4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfY3JlYXRlX3VhYyggZGxnLCBzZHAsIDAsICZjYWxsLT5pbnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc2lwX2RsZ190ZXJtaW5hdGUoZGxnKTsKKwkrK2FwcC51YWNfY2FsbHM7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIC8qIEF0dGFjaCBjYWxsIGRhdGEgdG8gaW52aXRlIHNlc3Npb24gKi8KKyAgICBjYWxsLT5pbnYtPm1vZF9kYXRhW21vZF9zaXBydHAuaWRdID0gY2FsbDsKKworICAgIC8qIE1hcmsgc3RhcnQgb2YgY2FsbCAqLworICAgIHBqX2dldHRpbWVvZmRheSgmY2FsbC0+c3RhcnRfdGltZSk7CisKKworICAgIC8qIENyZWF0ZSBpbml0aWFsIElOVklURSByZXF1ZXN0LgorICAgICAqIFRoaXMgSU5WSVRFIHJlcXVlc3Qgd2lsbCBjb250YWluIGEgcGVyZmVjdGx5IGdvb2QgcmVxdWVzdCBhbmQgCisgICAgICogYW4gU0RQIGJvZHkgYXMgd2VsbC4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfaW52aXRlKGNhbGwtPmludiwgJnRkYXRhKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCBzdGF0dXMpOworCisKKyAgICAvKiBTZW5kIGluaXRpYWwgSU5WSVRFIHJlcXVlc3QuIAorICAgICAqIEZyb20gbm93IG9uLCB0aGUgaW52aXRlIHNlc3Npb24ncyBzdGF0ZSB3aWxsIGJlIHJlcG9ydGVkIHRvIHVzCisgICAgICogdmlhIHRoZSBpbnZpdGUgc2Vzc2lvbiBjYWxsYmFja3MuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfaW52X3NlbmRfbXNnKGNhbGwtPmludiwgdGRhdGEpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBSZWNlaXZlIGluY29taW5nIGNhbGwKKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19pbmNvbWluZ19jYWxsKHBqc2lwX3J4X2RhdGEgKnJkYXRhKQoreworICAgIHVuc2lnbmVkIGksIG9wdGlvbnM7CisgICAgc3RydWN0IGNhbGwgKmNhbGw7CisgICAgcGpzaXBfZGlhbG9nICpkbGc7CisgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2RwOworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEZpbmQgZnJlZSBjYWxsIHNsb3QgKi8KKyAgICBmb3IgKGk9MDsgaTxhcHAubWF4X2NhbGxzOyArK2kpIHsKKwlpZiAoYXBwLmNhbGxbaV0uaW52ID09IE5VTEwpCisJICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpID09IGFwcC5tYXhfY2FsbHMpIHsKKwljb25zdCBwal9zdHJfdCByZWFzb24gPSBwal9zdHIoIlRvbyBtYW55IGNhbGxzIik7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoIGFwcC5zaXBfZW5kcHQsIHJkYXRhLCAKKwkJCQkgICAgICAgNTAwLCAmcmVhc29uLAorCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgY2FsbCA9ICZhcHAuY2FsbFtpXTsKKworICAgIC8qIFZlcmlmeSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuICovCisgICAgb3B0aW9ucyA9IDA7CisgICAgc3RhdHVzID0gcGpzaXBfaW52X3ZlcmlmeV9yZXF1ZXN0KHJkYXRhLCAmb3B0aW9ucywgTlVMTCwgTlVMTCwKKyAgCQkJCSAgIGFwcC5zaXBfZW5kcHQsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJLyoKKwkgKiBObyB3ZSBjYW4ndCBoYW5kbGUgdGhlIGluY29taW5nIElOVklURSByZXF1ZXN0LgorCSAqLworCWlmICh0ZGF0YSkgeworCSAgICBwanNpcF9yZXNwb25zZV9hZGRyIHJlc19hZGRyOworCSAgICAKKwkgICAgcGpzaXBfZ2V0X3Jlc3BvbnNlX2FkZHIodGRhdGEtPnBvb2wsIHJkYXRhLCAmcmVzX2FkZHIpOworCSAgICBwanNpcF9lbmRwdF9zZW5kX3Jlc3BvbnNlKGFwcC5zaXBfZW5kcHQsICZyZXNfYWRkciwgdGRhdGEsCisJCU5VTEwsIE5VTEwpOworCSAgICAKKwl9IGVsc2UgeworCSAgICAKKwkgICAgLyogUmVzcG9uZCB3aXRoIDUwMCAoSW50ZXJuYWwgU2VydmVyIEVycm9yKSAqLworCSAgICBwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyhhcHAuc2lwX2VuZHB0LCByZGF0YSwgNTAwLCBOVUxMLAorCQlOVUxMLCBOVUxMKTsKKwl9CisJCisJcmV0dXJuOworICAgIH0KKworICAgIC8qIENyZWF0ZSBVQVMgZGlhbG9nICovCisgICAgc3RhdHVzID0gcGpzaXBfZGxnX2NyZWF0ZV91YXMoIHBqc2lwX3VhX2luc3RhbmNlKCksIHJkYXRhLAorCQkJCSAgICZhcHAubG9jYWxfY29udGFjdCwgJmRsZyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJY29uc3QgcGpfc3RyX3QgcmVhc29uID0gcGpfc3RyKCJVbmFibGUgdG8gY3JlYXRlIGRpYWxvZyIpOworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBhcHAuc2lwX2VuZHB0LCByZGF0YSwgCisJCQkJICAgICAgIDUwMCwgJnJlYXNvbiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIENyZWF0ZSBTRFAgKi8KKyAgICBjcmVhdGVfc2RwKCBkbGctPnBvb2wsIGNhbGwsICZzZHApOworCisgICAgLyogQ3JlYXRlIFVBUyBpbnZpdGUgc2Vzc2lvbiAqLworICAgIHN0YXR1cyA9IHBqc2lwX2ludl9jcmVhdGVfdWFzKCBkbGcsIHJkYXRhLCBzZHAsIDAsICZjYWxsLT5pbnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqc2lwX2RsZ19jcmVhdGVfcmVzcG9uc2UoZGxnLCByZGF0YSwgNTAwLCBOVUxMLCAmdGRhdGEpOworCXBqc2lwX2RsZ19zZW5kX3Jlc3BvbnNlKGRsZywgcGpzaXBfcmRhdGFfZ2V0X3RzeChyZGF0YSksIHRkYXRhKTsKKwlyZXR1cm47CisgICAgfQorICAgIAorCisgICAgLyogQXR0YWNoIGNhbGwgZGF0YSB0byBpbnZpdGUgc2Vzc2lvbiAqLworICAgIGNhbGwtPmludi0+bW9kX2RhdGFbbW9kX3NpcHJ0cC5pZF0gPSBjYWxsOworCisgICAgLyogTWFyayBzdGFydCBvZiBjYWxsICovCisgICAgcGpfZ2V0dGltZW9mZGF5KCZjYWxsLT5zdGFydF90aW1lKTsKKworCisKKyAgICAvKiBDcmVhdGUgMjAwIHJlc3BvbnNlIC4qLworICAgIHN0YXR1cyA9IHBqc2lwX2ludl9pbml0aWFsX2Fuc3dlcihjYWxsLT5pbnYsIHJkYXRhLCAyMDAsIAorCQkJCSAgICAgIE5VTEwsIE5VTEwsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzID0gcGpzaXBfaW52X2luaXRpYWxfYW5zd2VyKGNhbGwtPmludiwgcmRhdGEsIAorCQkJCQkgIFBKU0lQX1NDX05PVF9BQ0NFUFRBQkxFLAorCQkJCQkgIE5VTEwsIE5VTEwsICZ0ZGF0YSk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICBwanNpcF9pbnZfc2VuZF9tc2coY2FsbC0+aW52LCB0ZGF0YSk7IAorCWVsc2UKKwkgICAgcGpzaXBfaW52X3Rlcm1pbmF0ZShjYWxsLT5pbnYsIDUwMCwgUEpfRkFMU0UpOworCXJldHVybjsKKyAgICB9CisKKworICAgIC8qIFNlbmQgdGhlIDIwMCByZXNwb25zZS4gKi8gIAorICAgIHN0YXR1cyA9IHBqc2lwX2ludl9zZW5kX21zZyhjYWxsLT5pbnYsIHRkYXRhKTsgCisgICAgUEpfQVNTRVJUX09OX0ZBSUwoc3RhdHVzID09IFBKX1NVQ0NFU1MsIHJldHVybik7CisKKworICAgIC8qIERvbmUgKi8KK30KKworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBkaWFsb2cgaGFzIGZvcmtlZDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fZm9ya2VkKHBqc2lwX2ludl9zZXNzaW9uICppbnYsIHBqc2lwX2V2ZW50ICplKQoreworICAgIFBKX1VOVVNFRF9BUkcoaW52KTsKKyAgICBQSl9VTlVTRURfQVJHKGUpOworCisgICAgUEpfVE9ETyggSEFORExFX0ZPUktJTkcgKTsKK30KKworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIG91dHNpZGUgZGlhbG9nczogKi8KK3N0YXRpYyBwal9ib29sX3Qgb25fcnhfcmVxdWVzdCggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKQoreworICAgIC8qIElnbm9yZSBzdHJhbmRsZWQgQUNLcyAobXVzdCBub3Qgc2VuZCByZXNwb25lICovCisgICAgaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCA9PSBQSlNJUF9BQ0tfTUVUSE9EKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIC8qIFJlc3BvbmQgKHN0YXRlbGVzc2x5KSBhbnkgbm9uLUlOVklURSByZXF1ZXN0cyB3aXRoIDUwMCAgKi8KKyAgICBpZiAocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLmlkICE9IFBKU0lQX0lOVklURV9NRVRIT0QpIHsKKwlwal9zdHJfdCByZWFzb24gPSBwal9zdHIoIlVuc3VwcG9ydGVkIE9wZXJhdGlvbiIpOworCXBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKCBhcHAuc2lwX2VuZHB0LCByZGF0YSwgCisJCQkJICAgICAgIDUwMCwgJnJlYXNvbiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogSGFuZGxlIGluY29taW5nIElOVklURSAqLworICAgIHByb2Nlc3NfaW5jb21pbmdfY2FsbChyZGF0YSk7CisKKyAgICAvKiBEb25lICovCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworLyogQ2FsbGJhY2sgdGltZXIgdG8gZGlzY29ubmVjdCBjYWxsIChsaW1pdGluZyBjYWxsIGR1cmF0aW9uKSAqLworc3RhdGljIHZvaWQgdGltZXJfZGlzY29ubmVjdF9jYWxsKCBwal90aW1lcl9oZWFwX3QgKnRpbWVyX2hlYXAsCisJCQkJICAgc3RydWN0IHBqX3RpbWVyX2VudHJ5ICplbnRyeSkKK3sKKyAgICBzdHJ1Y3QgY2FsbCAqY2FsbCA9IGVudHJ5LT51c2VyX2RhdGE7CisKKyAgICBQSl9VTlVTRURfQVJHKHRpbWVyX2hlYXApOworCisgICAgZW50cnktPmlkID0gMDsKKyAgICBoYW5ndXBfY2FsbChjYWxsLT5pbmRleCk7Cit9CisKKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gaW52aXRlIHNlc3Npb24ncyBzdGF0ZSBoYXMgY2hhbmdlZDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fc3RhdGVfY2hhbmdlZCggcGpzaXBfaW52X3Nlc3Npb24gKmludiwgCisJCQkJICAgcGpzaXBfZXZlbnQgKmUpCit7CisgICAgc3RydWN0IGNhbGwgKmNhbGwgPSBpbnYtPm1vZF9kYXRhW21vZF9zaXBydHAuaWRdOworCisgICAgUEpfVU5VU0VEX0FSRyhlKTsKKworICAgIGlmICghY2FsbCkKKwlyZXR1cm47CisKKyAgICBpZiAoaW52LT5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisJCisJcGpfdGltZV92YWwgbnVsbF90aW1lID0gezAsIDB9OworCisJaWYgKGNhbGwtPmRfdGltZXIuaWQgIT0gMCkgeworCSAgICBwanNpcF9lbmRwdF9jYW5jZWxfdGltZXIoYXBwLnNpcF9lbmRwdCwgJmNhbGwtPmRfdGltZXIpOworCSAgICBjYWxsLT5kX3RpbWVyLmlkID0gMDsKKwl9CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAjJWQgZGlzY29ubmVjdGVkLiBSZWFzb249JWQgKCUuKnMpIiwKKwkJICBjYWxsLT5pbmRleCwKKwkJICBpbnYtPmNhdXNlLAorCQkgIChpbnQpaW52LT5jYXVzZV90ZXh0LnNsZW4sCisJCSAgaW52LT5jYXVzZV90ZXh0LnB0cikpOworCisJaWYgKGFwcC5jYWxsX3JlcG9ydCkgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAjJWQgc3RhdGlzdGljczoiLCBjYWxsLT5pbmRleCkpOworCSAgICBwcmludF9jYWxsKGNhbGwtPmluZGV4KTsKKwl9CisKKworCWNhbGwtPmludiA9IE5VTEw7CisJaW52LT5tb2RfZGF0YVttb2Rfc2lwcnRwLmlkXSA9IE5VTEw7CisKKwlkZXN0cm95X2NhbGxfbWVkaWEoY2FsbC0+aW5kZXgpOworCisJY2FsbC0+c3RhcnRfdGltZSA9IG51bGxfdGltZTsKKwljYWxsLT5yZXNwb25zZV90aW1lID0gbnVsbF90aW1lOworCWNhbGwtPmNvbm5lY3RfdGltZSA9IG51bGxfdGltZTsKKworCSsrYXBwLnVhY19jYWxsczsKKworICAgIH0gZWxzZSBpZiAoaW52LT5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEKSB7CisKKwlwal90aW1lX3ZhbCB0OworCisJcGpfZ2V0dGltZW9mZGF5KCZjYWxsLT5jb25uZWN0X3RpbWUpOworCWlmIChjYWxsLT5yZXNwb25zZV90aW1lLnNlYyA9PSAwKQorCSAgICBjYWxsLT5yZXNwb25zZV90aW1lID0gY2FsbC0+Y29ubmVjdF90aW1lOworCisJdCA9IGNhbGwtPmNvbm5lY3RfdGltZTsKKwlQSl9USU1FX1ZBTF9TVUIodCwgY2FsbC0+c3RhcnRfdGltZSk7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiQ2FsbCAjJWQgY29ubmVjdGVkIGluICVkIG1zIiwgY2FsbC0+aW5kZXgsCisJCSAgUEpfVElNRV9WQUxfTVNFQyh0KSkpOworCisJaWYgKGFwcC5kdXJhdGlvbiAhPSAwKSB7CisJICAgIGNhbGwtPmRfdGltZXIuaWQgPSAxOworCSAgICBjYWxsLT5kX3RpbWVyLnVzZXJfZGF0YSA9IGNhbGw7CisJICAgIGNhbGwtPmRfdGltZXIuY2IgPSAmdGltZXJfZGlzY29ubmVjdF9jYWxsOworCisJICAgIHQuc2VjID0gYXBwLmR1cmF0aW9uOworCSAgICB0Lm1zZWMgPSAwOworCisJICAgIHBqc2lwX2VuZHB0X3NjaGVkdWxlX3RpbWVyKGFwcC5zaXBfZW5kcHQsICZjYWxsLT5kX3RpbWVyLCAmdCk7CisJfQorCisgICAgfSBlbHNlIGlmICgJaW52LT5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfRUFSTFkgfHwKKwkJaW52LT5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfQ09OTkVDVElORykgeworCisJaWYgKGNhbGwtPnJlc3BvbnNlX3RpbWUuc2VjID09IDApCisJICAgIHBqX2dldHRpbWVvZmRheSgmY2FsbC0+cmVzcG9uc2VfdGltZSk7CisKKyAgICB9Cit9CisKKworLyogVXRpbGl0eSAqLworc3RhdGljIHZvaWQgYXBwX3BlcnJvcihjb25zdCBjaGFyICpzZW5kZXIsIGNvbnN0IGNoYXIgKnRpdGxlLCAKKwkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBQSl9MT0coMywoc2VuZGVyLCAiJXM6ICVzIFtzdGF0dXM9JWRdIiwgdGl0bGUsIGVycm1zZywgc3RhdHVzKSk7Cit9CisKKworLyogV29ya2VyIHRocmVhZCBmb3IgU0lQICovCitzdGF0aWMgaW50IHNpcF93b3JrZXJfdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFyZyk7CisKKyAgICB3aGlsZSAoIWFwcC50aHJlYWRfcXVpdCkgeworCXBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7MCwgMTB9OworCXBqc2lwX2VuZHB0X2hhbmRsZV9ldmVudHMoYXBwLnNpcF9lbmRwdCwgJnRpbWVvdXQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qIEluaXQgYXBwbGljYXRpb24gb3B0aW9ucyAqLworc3RhdGljIHBqX3N0YXR1c190IGluaXRfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHN0YXRpYyBjaGFyIGlwX2FkZHJbMzJdOworICAgIHN0YXRpYyBjaGFyIGxvY2FsX3VyaVs2NF07CisKKyAgICBlbnVtIHsgT1BUX1NUQVJULAorCSAgIE9QVF9BUFBfTE9HX0xFVkVMLCBPUFRfTE9HX0ZJTEUsIAorCSAgIE9QVF9BX1BULCBPUFRfQV9OQU1FLCBPUFRfQV9DTE9DSywgT1BUX0FfQklUUkFURSwgT1BUX0FfUFRJTUUsCisJICAgT1BUX1JFUE9SVF9GSUxFIH07CisKKyAgICBzdHJ1Y3QgcGpfZ2V0b3B0X29wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJjb3VudCIsCSAgICAxLCAwLCAnYycgfSwKKwl7ICJnYXAiLCAgICAgICAgICAgIDEsIDAsICdnJyB9LAorCXsgImNhbGwtcmVwb3J0IiwgICAgMCwgMCwgJ1InIH0sCisJeyAiZHVyYXRpb24iLAkgICAgMSwgMCwgJ2QnIH0sCisJeyAiYXV0by1xdWl0IiwJICAgIDAsIDAsICdxJyB9LAorCXsgImxvY2FsLXBvcnQiLAkgICAgMSwgMCwgJ3AnIH0sCisJeyAicnRwLXBvcnQiLAkgICAgMSwgMCwgJ3InIH0sCisJeyAiaXAtYWRkciIsCSAgICAxLCAwLCAnaScgfSwKKworCXsgImxvZy1sZXZlbCIsCSAgICAxLCAwLCAnbCcgfSwKKwl7ICJhcHAtbG9nLWxldmVsIiwgIDEsIDAsIE9QVF9BUFBfTE9HX0xFVkVMIH0sCisJeyAibG9nLWZpbGUiLAkgICAgMSwgMCwgT1BUX0xPR19GSUxFIH0sCisKKwl7ICJyZXBvcnQtZmlsZSIsICAgIDEsIDAsIE9QVF9SRVBPUlRfRklMRSB9LAorCisJLyogRG9uJ3Qgc3VwcG9ydCB0aGlzIGFueW1vcmUsIHNlZSBjb21tZW50cyBpbiBVU0FHRSBhYm92ZS4KKwl7ICJhLXB0IiwJICAgIDEsIDAsIE9QVF9BX1BUIH0sCisJeyAiYS1uYW1lIiwJICAgIDEsIDAsIE9QVF9BX05BTUUgfSwKKwl7ICJhLWNsb2NrIiwJICAgIDEsIDAsIE9QVF9BX0NMT0NLIH0sCisJeyAiYS1iaXRyYXRlIiwJICAgIDEsIDAsIE9QVF9BX0JJVFJBVEUgfSwKKwl7ICJhLXB0aW1lIiwJICAgIDEsIDAsIE9QVF9BX1BUSU1FIH0sCisJKi8KKworCXsgTlVMTCwgMCwgMCwgMCB9LAorICAgIH07CisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKworICAgIC8qIEdldCBsb2NhbCBJUCBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCBJUCBhZGRyZXNzICovCisgICAgeworCWNvbnN0IHBqX3N0cl90ICpob3N0bmFtZTsKKwlwal9zb2NrYWRkcl9pbiB0bXBfYWRkcjsKKwljaGFyICphZGRyOworCisJaG9zdG5hbWUgPSBwal9nZXRob3N0bmFtZSgpOworCXBqX3NvY2thZGRyX2luX2luaXQoJnRtcF9hZGRyLCBob3N0bmFtZSwgMCk7CisJYWRkciA9IHBqX2luZXRfbnRvYSh0bXBfYWRkci5zaW5fYWRkcik7CisJcGpfYW5zaV9zdHJjcHkoaXBfYWRkciwgYWRkcik7CisgICAgfQorCisgICAgLyogSW5pdCBkZWZhdWx0cyAqLworICAgIGFwcC5tYXhfY2FsbHMgPSAxOworICAgIGFwcC50aHJlYWRfY291bnQgPSAxOworICAgIGFwcC5zaXBfcG9ydCA9IDUwNjA7CisgICAgYXBwLnJ0cF9zdGFydF9wb3J0ID0gUlRQX1NUQVJUX1BPUlQ7CisgICAgYXBwLmxvY2FsX2FkZHIgPSBwal9zdHIoaXBfYWRkcik7CisgICAgYXBwLmxvZ19sZXZlbCA9IDU7CisgICAgYXBwLmFwcF9sb2dfbGV2ZWwgPSAzOworICAgIGFwcC5sb2dfZmlsZW5hbWUgPSBOVUxMOworCisgICAgLyogRGVmYXVsdCBjb2RlY3M6ICovCisgICAgYXBwLmF1ZGlvX2NvZGVjID0gYXVkaW9fY29kZWNzWzBdOworCisgICAgLyogUGFyc2Ugb3B0aW9ucyAqLworICAgIHBqX29wdGluZCA9IDA7CisgICAgd2hpbGUoKGM9cGpfZ2V0b3B0X2xvbmcoYXJnYyxhcmd2LCAiYzpkOnA6cjppOmw6ZzpxUiIsIAorCQkJICAgIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCkpIT0tMSkgCisgICAgeworCXN3aXRjaCAoYykgeworCWNhc2UgJ2MnOgorCSAgICBhcHAubWF4X2NhbGxzID0gYXRvaShwal9vcHRhcmcpOworCSAgICBpZiAoYXBwLm1heF9jYWxscyA8IDAgfHwgYXBwLm1heF9jYWxscyA+IE1BWF9DQUxMUykgeworCQlQSl9MT0coMywoVEhJU19GSUxFLCAiSW52YWxpZCBtYXggY2FsbHMgdmFsdWUgJXMiLCBwal9vcHRhcmcpKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAnZyc6CisJICAgIGFwcC5jYWxsX2dhcCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnUic6CisJICAgIGFwcC5jYWxsX3JlcG9ydCA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCWNhc2UgJ2QnOgorCSAgICBhcHAuZHVyYXRpb24gPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ3EnOgorCSAgICBhcHAuYXV0b19xdWl0ID0gMTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdwJzoKKwkgICAgYXBwLnNpcF9wb3J0ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdyJzoKKwkgICAgYXBwLnJ0cF9zdGFydF9wb3J0ID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlICdpJzoKKwkgICAgYXBwLmxvY2FsX2FkZHIgPSBwal9zdHIocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdsJzoKKwkgICAgYXBwLmxvZ19sZXZlbCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfQVBQX0xPR19MRVZFTDoKKwkgICAgYXBwLmFwcF9sb2dfbGV2ZWwgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0xPR19GSUxFOgorCSAgICBhcHAubG9nX2ZpbGVuYW1lID0gcGpfb3B0YXJnOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX0FfUFQ6CisJICAgIGFwcC5hdWRpb19jb2RlYy5wdCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfQV9OQU1FOgorCSAgICBhcHAuYXVkaW9fY29kZWMubmFtZSA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisJY2FzZSBPUFRfQV9DTE9DSzoKKwkgICAgYXBwLmF1ZGlvX2NvZGVjLmNsb2NrX3JhdGUgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX0FfQklUUkFURToKKwkgICAgYXBwLmF1ZGlvX2NvZGVjLmJpdF9yYXRlID0gYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKwljYXNlIE9QVF9BX1BUSU1FOgorCSAgICBhcHAuYXVkaW9fY29kZWMucHRpbWUgPSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCWNhc2UgT1BUX1JFUE9SVF9GSUxFOgorCSAgICBhcHAucmVwb3J0X2ZpbGVuYW1lID0gcGpfb3B0YXJnOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHB1dHMoVVNBR0UpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgVVJMIGlzIHNwZWNpZmllZCAqLworICAgIGlmIChwal9vcHRpbmQgPCBhcmdjKQorCWFwcC51cmlfdG9fY2FsbCA9IHBqX3N0cihhcmd2W3BqX29wdGluZF0pOworCisgICAgLyogQnVpbGQgbG9jYWwgVVJJIGFuZCBjb250YWN0ICovCisgICAgcGpfYW5zaV9zcHJpbnRmKCBsb2NhbF91cmksICJzaXA6JXM6JWQiLCBhcHAubG9jYWxfYWRkci5wdHIsIGFwcC5zaXBfcG9ydCk7CisgICAgYXBwLmxvY2FsX3VyaSA9IHBqX3N0cihsb2NhbF91cmkpOworICAgIGFwcC5sb2NhbF9jb250YWN0ID0gYXBwLmxvY2FsX3VyaTsKKworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNRURJQSBTVFVGRlMKKyAqLworCisvKgorICogQ3JlYXRlIFNEUCBzZXNzaW9uIGZvciBhIGNhbGwuCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjcmVhdGVfc2RwKCBwal9wb29sX3QgKnBvb2wsCisJCQkgICAgICAgc3RydWN0IGNhbGwgKmNhbGwsCisJCQkgICAgICAgcGptZWRpYV9zZHBfc2Vzc2lvbiAqKnBfc2RwKQoreworICAgIHBqX3RpbWVfdmFsIHR2OworICAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkcDsKKyAgICBwam1lZGlhX3NkcF9tZWRpYSAqbTsKKyAgICBwam1lZGlhX3NkcF9hdHRyICphdHRyOworICAgIHBqbWVkaWFfdHJhbnNwb3J0X2luZm8gdHBpbmZvOworICAgIHN0cnVjdCBtZWRpYV9zdHJlYW0gKmF1ZGlvID0gJmNhbGwtPm1lZGlhWzBdOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHBfc2RwLCBQSl9FSU5WQUwpOworCisKKyAgICAvKiBHZXQgdHJhbnNwb3J0IGluZm8gKi8KKyAgICBwam1lZGlhX3RyYW5zcG9ydF9pbmZvX2luaXQoJnRwaW5mbyk7CisgICAgcGptZWRpYV90cmFuc3BvcnRfZ2V0X2luZm8oYXVkaW8tPnRyYW5zcG9ydCwgJnRwaW5mbyk7CisKKyAgICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYmFzaWMgU0RQIHNlc3Npb24gKi8KKyAgICBzZHAgPSBwal9wb29sX3phbGxvYyAocG9vbCwgc2l6ZW9mKHBqbWVkaWFfc2RwX3Nlc3Npb24pKTsKKworICAgIHBqX2dldHRpbWVvZmRheSgmdHYpOworICAgIHNkcC0+b3JpZ2luLnVzZXIgPSBwal9zdHIoInBqc2lwLXNpcHJ0cCIpOworICAgIHNkcC0+b3JpZ2luLnZlcnNpb24gPSBzZHAtPm9yaWdpbi5pZCA9IHR2LnNlYyArIDIyMDg5ODg4MDBVTDsKKyAgICBzZHAtPm9yaWdpbi5uZXRfdHlwZSA9IHBqX3N0cigiSU4iKTsKKyAgICBzZHAtPm9yaWdpbi5hZGRyX3R5cGUgPSBwal9zdHIoIklQNCIpOworICAgIHNkcC0+b3JpZ2luLmFkZHIgPSAqcGpfZ2V0aG9zdG5hbWUoKTsKKyAgICBzZHAtPm5hbWUgPSBwal9zdHIoInBqc2lwIik7CisKKyAgICAvKiBTaW5jZSB3ZSBvbmx5IHN1cHBvcnQgb25lIG1lZGlhIHN0cmVhbSBhdCBwcmVzZW50LCBwdXQgdGhlCisgICAgICogU0RQIGNvbm5lY3Rpb24gbGluZSBpbiB0aGUgc2Vzc2lvbiBsZXZlbC4KKyAgICAgKi8KKyAgICBzZHAtPmNvbm4gPSBwal9wb29sX3phbGxvYyAocG9vbCwgc2l6ZW9mKHBqbWVkaWFfc2RwX2Nvbm4pKTsKKyAgICBzZHAtPmNvbm4tPm5ldF90eXBlID0gcGpfc3RyKCJJTiIpOworICAgIHNkcC0+Y29ubi0+YWRkcl90eXBlID0gcGpfc3RyKCJJUDQiKTsKKyAgICBzZHAtPmNvbm4tPmFkZHIgPSBhcHAubG9jYWxfYWRkcjsKKworCisgICAgLyogU0RQIHRpbWUgYW5kIGF0dHJpYnV0ZXMuICovCisgICAgc2RwLT50aW1lLnN0YXJ0ID0gc2RwLT50aW1lLnN0b3AgPSAwOworICAgIHNkcC0+YXR0cl9jb3VudCA9IDA7CisKKyAgICAvKiBDcmVhdGUgbWVkaWEgc3RyZWFtIDA6ICovCisKKyAgICBzZHAtPm1lZGlhX2NvdW50ID0gMTsKKyAgICBtID0gcGpfcG9vbF96YWxsb2MgKHBvb2wsIHNpemVvZihwam1lZGlhX3NkcF9tZWRpYSkpOworICAgIHNkcC0+bWVkaWFbMF0gPSBtOworCisgICAgLyogU3RhbmRhcmQgbWVkaWEgaW5mbzogKi8KKyAgICBtLT5kZXNjLm1lZGlhID0gcGpfc3RyKCJhdWRpbyIpOworICAgIG0tPmRlc2MucG9ydCA9IHBqX250b2hzKHRwaW5mby5zb2NrX2luZm8ucnRwX2FkZHJfbmFtZS5pcHY0LnNpbl9wb3J0KTsKKyAgICBtLT5kZXNjLnBvcnRfY291bnQgPSAxOworICAgIG0tPmRlc2MudHJhbnNwb3J0ID0gcGpfc3RyKCJSVFAvQVZQIik7CisKKyAgICAvKiBBZGQgZm9ybWF0IGFuZCBydHBtYXAgZm9yIGVhY2ggY29kZWMuICovCisgICAgbS0+ZGVzYy5mbXRfY291bnQgPSAxOworICAgIG0tPmF0dHJfY291bnQgPSAwOworCisgICAgeworCXBqbWVkaWFfc2RwX3J0cG1hcCBydHBtYXA7CisJcGptZWRpYV9zZHBfYXR0ciAqYXR0cjsKKwljaGFyIHB0c3RyWzEwXTsKKworCXNwcmludGYocHRzdHIsICIlZCIsIGFwcC5hdWRpb19jb2RlYy5wdCk7CisJcGpfc3RyZHVwMihwb29sLCAmbS0+ZGVzYy5mbXRbMF0sIHB0c3RyKTsKKwlydHBtYXAucHQgPSBtLT5kZXNjLmZtdFswXTsKKwlydHBtYXAuY2xvY2tfcmF0ZSA9IGFwcC5hdWRpb19jb2RlYy5jbG9ja19yYXRlOworCXJ0cG1hcC5lbmNfbmFtZSA9IHBqX3N0cihhcHAuYXVkaW9fY29kZWMubmFtZSk7CisJcnRwbWFwLnBhcmFtLnNsZW4gPSAwOworCisJcGptZWRpYV9zZHBfcnRwbWFwX3RvX2F0dHIocG9vbCwgJnJ0cG1hcCwgJmF0dHIpOworCW0tPmF0dHJbbS0+YXR0cl9jb3VudCsrXSA9IGF0dHI7CisgICAgfQorCisgICAgLyogQWRkIHNlbmRyZWN2IGF0dHJpYnV0ZS4gKi8KKyAgICBhdHRyID0gcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBqbWVkaWFfc2RwX2F0dHIpKTsKKyAgICBhdHRyLT5uYW1lID0gcGpfc3RyKCJzZW5kcmVjdiIpOworICAgIG0tPmF0dHJbbS0+YXR0cl9jb3VudCsrXSA9IGF0dHI7CisKKyNpZiAxCisgICAgLyoKKyAgICAgKiBBZGQgc3VwcG9ydCB0ZWxlcGhvbnkgZXZlbnQKKyAgICAgKi8KKyAgICBtLT5kZXNjLmZtdFttLT5kZXNjLmZtdF9jb3VudCsrXSA9IHBqX3N0cigiMTIxIik7CisgICAgLyogQWRkIHJ0cG1hcC4gKi8KKyAgICBhdHRyID0gcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBqbWVkaWFfc2RwX2F0dHIpKTsKKyAgICBhdHRyLT5uYW1lID0gcGpfc3RyKCJydHBtYXAiKTsKKyAgICBhdHRyLT52YWx1ZSA9IHBqX3N0cigiMTIxIHRlbGVwaG9uZS1ldmVudC84MDAwIik7CisgICAgbS0+YXR0clttLT5hdHRyX2NvdW50KytdID0gYXR0cjsKKyAgICAvKiBBZGQgZm10cCAqLworICAgIGF0dHIgPSBwal9wb29sX3phbGxvYyhwb29sLCBzaXplb2YocGptZWRpYV9zZHBfYXR0cikpOworICAgIGF0dHItPm5hbWUgPSBwal9zdHIoImZtdHAiKTsKKyAgICBhdHRyLT52YWx1ZSA9IHBqX3N0cigiMTIxIDAtMTUiKTsKKyAgICBtLT5hdHRyW20tPmF0dHJfY291bnQrK10gPSBhdHRyOworI2VuZGlmCisKKyAgICAvKiBEb25lICovCisgICAgKnBfc2RwID0gc2RwOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworI2lmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiAhPSAwKSB8fCAoZGVmaW5lZChQSl9XSU42NCkgJiYgUEpfV0lONjQgIT0gMCkKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CitzdGF0aWMgdm9pZCBib29zdF9wcmlvcml0eSh2b2lkKQoreworICAgIFNldFByaW9yaXR5Q2xhc3MoIEdldEN1cnJlbnRQcm9jZXNzKCksIFJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTKTsKKyAgICBTZXRUaHJlYWRQcmlvcml0eShHZXRDdXJyZW50VGhyZWFkKCksIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUKTsKK30KKworI2VsaWYgZGVmaW5lZChQSl9MSU5VWCkgJiYgUEpfTElOVVggIT0gMAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3N0YXRpYyB2b2lkIGJvb3N0X3ByaW9yaXR5KHZvaWQpCit7CisjZGVmaW5lIFBPTElDWQlTQ0hFRF9GSUZPCisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHRwOworICAgIGludCBtYXhfcHJpbzsKKyAgICBpbnQgcG9saWN5OworICAgIGludCByYzsKKworICAgIGlmIChzY2hlZF9nZXRfcHJpb3JpdHlfbWluKFBPTElDWSkgPCBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KFBPTElDWSkpCisJbWF4X3ByaW8gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KFBPTElDWSktMTsKKyAgICBlbHNlCisJbWF4X3ByaW8gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KFBPTElDWSkrMTsKKworICAgIC8qCisgICAgICogQWRqdXN0IHByb2Nlc3Mgc2NoZWR1bGluZyBhbGdvcml0aG0gYW5kIHByaW9yaXR5CisgICAgICovCisgICAgcmMgPSBzY2hlZF9nZXRwYXJhbSgwLCAmdHApOworICAgIGlmIChyYyAhPSAwKSB7CisJYXBwX3BlcnJvciggVEhJU19GSUxFLCAic2NoZWRfZ2V0cGFyYW0gZXJyb3IiLAorCQkgICAgUEpfUkVUVVJOX09TX0VSUk9SKHJjKSk7CisJcmV0dXJuOworICAgIH0KKyAgICB0cC5fX3NjaGVkX3ByaW9yaXR5ID0gbWF4X3ByaW87CisKKyAgICByYyA9IHNjaGVkX3NldHNjaGVkdWxlcigwLCBQT0xJQ1ksICZ0cCk7CisgICAgaWYgKHJjICE9IDApIHsKKwlhcHBfcGVycm9yKCBUSElTX0ZJTEUsICJzY2hlZF9zZXRzY2hlZHVsZXIgZXJyb3IiLAorCQkgICAgUEpfUkVUVVJOX09TX0VSUk9SKHJjKSk7CisgICAgfQorCisgICAgUEpfTE9HKDQsIChUSElTX0ZJTEUsICJOZXcgcHJvY2VzcyBwb2xpY3k9JWQsIHByaW9yaXR5PSVkIiwKKwkgICAgICBwb2xpY3ksIHRwLl9fc2NoZWRfcHJpb3JpdHkpKTsKKworICAgIC8qCisgICAgICogQWRqdXN0IHRocmVhZCBzY2hlZHVsaW5nIGFsZ29yaXRobSBhbmQgcHJpb3JpdHkKKyAgICAgKi8KKyAgICByYyA9IHB0aHJlYWRfZ2V0c2NoZWRwYXJhbShwdGhyZWFkX3NlbGYoKSwgJnBvbGljeSwgJnRwKTsKKyAgICBpZiAocmMgIT0gMCkgeworCWFwcF9wZXJyb3IoIFRISVNfRklMRSwgInB0aHJlYWRfZ2V0c2NoZWRwYXJhbSBlcnJvciIsCisJCSAgICBQSl9SRVRVUk5fT1NfRVJST1IocmMpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDQsIChUSElTX0ZJTEUsICJPbGQgdGhyZWFkIHBvbGljeT0lZCwgcHJpb3JpdHk9JWQiLAorCSAgICAgIHBvbGljeSwgdHAuX19zY2hlZF9wcmlvcml0eSkpOworCisgICAgcG9saWN5ID0gUE9MSUNZOworICAgIHRwLl9fc2NoZWRfcHJpb3JpdHkgPSBtYXhfcHJpbzsKKworICAgIHJjID0gcHRocmVhZF9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigpLCBwb2xpY3ksICZ0cCk7CisgICAgaWYgKHJjICE9IDApIHsKKwlhcHBfcGVycm9yKCBUSElTX0ZJTEUsICJwdGhyZWFkX3NldHNjaGVkcGFyYW0gZXJyb3IiLAorCQkgICAgUEpfUkVUVVJOX09TX0VSUk9SKHJjKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRyg0LCAoVEhJU19GSUxFLCAiTmV3IHRocmVhZCBwb2xpY3k9JWQsIHByaW9yaXR5PSVkIiwKKwkgICAgICBwb2xpY3ksIHRwLl9fc2NoZWRfcHJpb3JpdHkpKTsKK30KKworI2Vsc2UKKyMgIGRlZmluZSBib29zdF9wcmlvcml0eSgpCisjZW5kaWYKKworCisvKgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgbWVkaWEgdHJhbnNwb3J0IG9uIHJlY2VpcHQgb2YgUlRQIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgb25fcnhfcnRwKHZvaWQgKnVzZXJfZGF0YSwgdm9pZCAqcGt0LCBwal9zc2l6ZV90IHNpemUpCit7CisgICAgc3RydWN0IG1lZGlhX3N0cmVhbSAqc3RybTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgY29uc3QgcGptZWRpYV9ydHBfaGRyICpoZHI7CisgICAgY29uc3Qgdm9pZCAqcGF5bG9hZDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkX2xlbjsKKworICAgIHN0cm0gPSB1c2VyX2RhdGE7CisKKyAgICAvKiBEaXNjYXJkIHBhY2tldCBpZiBtZWRpYSBpcyBpbmFjdGl2ZSAqLworICAgIGlmICghc3RybS0+YWN0aXZlKQorCXJldHVybjsKKworICAgIC8qIENoZWNrIGZvciBlcnJvcnMgKi8KKyAgICBpZiAoc2l6ZSA8IDApIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlJUUCByZWN2KCkgZXJyb3IiLCAocGpfc3RhdHVzX3QpLXNpemUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgUlRQIHBhY2tldC4gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3J0cF9kZWNvZGVfcnRwKCZzdHJtLT5pbl9zZXNzLCAKKwkJCQkgICAgcGt0LCAoaW50KXNpemUsIAorCQkJCSAgICAmaGRyLCAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIlJUUCBkZWNvZGUgZXJyb3IiLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvL1BKX0xPRyg0LChUSElTX0ZJTEUsICJSeCBzZXE9JWQiLCBwal9udG9ocyhoZHItPnNlcSkpKTsKKworICAgIC8qIFVwZGF0ZSB0aGUgUlRDUCBzZXNzaW9uLiAqLworICAgIHBqbWVkaWFfcnRjcF9yeF9ydHAoJnN0cm0tPnJ0Y3AsIHBqX250b2hzKGhkci0+c2VxKSwKKwkJCXBqX250b2hsKGhkci0+dHMpLCBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBVcGRhdGUgUlRQIHNlc3Npb24gKi8KKyAgICBwam1lZGlhX3J0cF9zZXNzaW9uX3VwZGF0ZSgmc3RybS0+aW5fc2VzcywgaGRyLCBOVUxMKTsKKworfQorCisvKgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgbWVkaWEgdHJhbnNwb3J0IG9uIHJlY2VpcHQgb2YgUlRDUCBwYWNrZXQuCisgKi8KK3N0YXRpYyB2b2lkIG9uX3J4X3J0Y3Aodm9pZCAqdXNlcl9kYXRhLCB2b2lkICpwa3QsIHBqX3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgbWVkaWFfc3RyZWFtICpzdHJtOworCisgICAgc3RybSA9IHVzZXJfZGF0YTsKKworICAgIC8qIERpc2NhcmQgcGFja2V0IGlmIG1lZGlhIGlzIGluYWN0aXZlICovCisgICAgaWYgKCFzdHJtLT5hY3RpdmUpCisJcmV0dXJuOworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChzaXplIDwgMCkgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgcmVjZWl2aW5nIFJUQ1AgcGFja2V0IiwocGpfc3RhdHVzX3QpLXNpemUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgUlRDUCBzZXNzaW9uICovCisgICAgcGptZWRpYV9ydGNwX3J4X3J0Y3AoJnN0cm0tPnJ0Y3AsIHBrdCwgc2l6ZSk7Cit9CisKKworLyogCisgKiBNZWRpYSB0aHJlYWQgCisgKgorICogVGhpcyBpcyB0aGUgdGhyZWFkIHRvIHNlbmQgYW5kIHJlY2VpdmUgYm90aCBSVFAgYW5kIFJUQ1AgcGFja2V0cy4KKyAqLworc3RhdGljIGludCBtZWRpYV90aHJlYWQodm9pZCAqYXJnKQoreworICAgIGVudW0geyBSVENQX0lOVEVSVkFMID0gNTAwMCwgUlRDUF9SQU5EID0gMjAwMCB9OworICAgIHN0cnVjdCBtZWRpYV9zdHJlYW0gKnN0cm0gPSBhcmc7CisgICAgY2hhciBwYWNrZXRbMTUwMF07CisgICAgdW5zaWduZWQgbXNlY19pbnRlcnZhbDsKKyAgICBwal90aW1lc3RhbXAgZnJlcSwgbmV4dF9ydHAsIG5leHRfcnRjcDsKKworCisgICAgLyogQm9vc3QgdGhyZWFkIHByaW9yaXR5IGlmIG5lY2Vzc2FyeSAqLworICAgIGJvb3N0X3ByaW9yaXR5KCk7CisKKyAgICAvKiBMZXQgdGhpbmdzIHNldHRsZSAqLworICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworCisgICAgbXNlY19pbnRlcnZhbCA9IHN0cm0tPnNhbXBsZXNfcGVyX2ZyYW1lICogMTAwMCAvIHN0cm0tPmNsb2NrX3JhdGU7CisgICAgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKCZmcmVxKTsKKworICAgIHBqX2dldF90aW1lc3RhbXAoJm5leHRfcnRwKTsKKyAgICBuZXh0X3J0cC51NjQgKz0gKGZyZXEudTY0ICogbXNlY19pbnRlcnZhbCAvIDEwMDApOworCisgICAgbmV4dF9ydGNwID0gbmV4dF9ydHA7CisgICAgbmV4dF9ydGNwLnU2NCArPSAoZnJlcS51NjQgKiAoUlRDUF9JTlRFUlZBTCsocGpfcmFuZCgpJVJUQ1BfUkFORCkpIC8gMTAwMCk7CisKKworICAgIHdoaWxlICghc3RybS0+dGhyZWFkX3F1aXRfZmxhZykgeworCXBqX3RpbWVzdGFtcCBub3csIGxlc3NlcjsKKwlwal90aW1lX3ZhbCB0aW1lb3V0OworCXBqX2Jvb2xfdCBzZW5kX3J0cCwgc2VuZF9ydGNwOworCisJc2VuZF9ydHAgPSBzZW5kX3J0Y3AgPSBQSl9GQUxTRTsKKworCS8qIERldGVybWluZSBob3cgbG9uZyB0byBzbGVlcCAqLworCWlmIChuZXh0X3J0cC51NjQgPCBuZXh0X3J0Y3AudTY0KSB7CisJICAgIGxlc3NlciA9IG5leHRfcnRwOworCSAgICBzZW5kX3J0cCA9IFBKX1RSVUU7CisJfSBlbHNlIHsKKwkgICAgbGVzc2VyID0gbmV4dF9ydGNwOworCSAgICBzZW5kX3J0Y3AgPSBQSl9UUlVFOworCX0KKworCXBqX2dldF90aW1lc3RhbXAoJm5vdyk7CisJaWYgKGxlc3Nlci51NjQgPD0gbm93LnU2NCkgeworCSAgICB0aW1lb3V0LnNlYyA9IHRpbWVvdXQubXNlYyA9IDA7CisJICAgIC8vcHJpbnRmKCJpbW1lZGlhdGUgIik7IGZmbHVzaChzdGRvdXQpOworCX0gZWxzZSB7CisJICAgIHBqX3VpbnQ2NF90IHRpY2tfZGVsYXk7CisJICAgIHRpY2tfZGVsYXkgPSBsZXNzZXIudTY0IC0gbm93LnU2NDsKKwkgICAgdGltZW91dC5zZWMgPSAwOworCSAgICB0aW1lb3V0Lm1zZWMgPSAocGpfdWludDMyX3QpKHRpY2tfZGVsYXkgKiAxMDAwIC8gZnJlcS51NjQpOworCSAgICBwal90aW1lX3ZhbF9ub3JtYWxpemUoJnRpbWVvdXQpOworCisJICAgIC8vcHJpbnRmKCIlZDolMDNkICIsIHRpbWVvdXQuc2VjLCB0aW1lb3V0Lm1zZWMpOyBmZmx1c2goc3Rkb3V0KTsKKwl9CisKKwkvKiBXYWl0IGZvciBuZXh0IGludGVydmFsICovCisJLy9pZiAodGltZW91dC5zZWMhPTAgJiYgdGltZW91dC5tc2VjIT0wKSB7CisJICAgIHBqX3RocmVhZF9zbGVlcChQSl9USU1FX1ZBTF9NU0VDKHRpbWVvdXQpKTsKKwkgICAgaWYgKHN0cm0tPnRocmVhZF9xdWl0X2ZsYWcpCisJCWJyZWFrOworCS8vfQorCisJcGpfZ2V0X3RpbWVzdGFtcCgmbm93KTsKKworCWlmIChzZW5kX3J0cCB8fCBuZXh0X3J0cC51NjQgPD0gbm93LnU2NCkgeworCSAgICAvKgorCSAgICAgKiBUaW1lIHRvIHNlbmQgUlRQIHBhY2tldC4KKwkgICAgICovCisJICAgIHBqX3N0YXR1c190IHN0YXR1czsKKwkgICAgY29uc3Qgdm9pZCAqcF9oZHI7CisJICAgIGNvbnN0IHBqbWVkaWFfcnRwX2hkciAqaGRyOworCSAgICBwal9zc2l6ZV90IHNpemU7CisJICAgIGludCBoZHJsZW47CisKKwkgICAgLyogRm9ybWF0IFJUUCBoZWFkZXIgKi8KKwkgICAgc3RhdHVzID0gcGptZWRpYV9ydHBfZW5jb2RlX3J0cCggJnN0cm0tPm91dF9zZXNzLCBzdHJtLT5zaS50eF9wdCwKKwkJCQkJICAgICAwLCAvKiBtYXJrZXIgYml0ICovCisJCQkJCSAgICAgc3RybS0+Ynl0ZXNfcGVyX2ZyYW1lLCAKKwkJCQkJICAgICBzdHJtLT5zYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgICAmcF9oZHIsICZoZHJsZW4pOworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKworCQkvL1BKX0xPRyg0LChUSElTX0ZJTEUsICJcdFx0VHggc2VxPSVkIiwgcGpfbnRvaHMoaGRyLT5zZXEpKSk7CisJCQorCQloZHIgPSAoY29uc3QgcGptZWRpYV9ydHBfaGRyKikgcF9oZHI7CisKKwkJLyogQ29weSBSVFAgaGVhZGVyIHRvIHBhY2tldCAqLworCQlwal9tZW1jcHkocGFja2V0LCBoZHIsIGhkcmxlbik7CisKKwkJLyogWmVybyB0aGUgcGF5bG9hZCAqLworCQlwal9iemVybyhwYWNrZXQraGRybGVuLCBzdHJtLT5ieXRlc19wZXJfZnJhbWUpOworCisJCS8qIFNlbmQgUlRQIHBhY2tldCAqLworCQlzaXplID0gaGRybGVuICsgc3RybS0+Ynl0ZXNfcGVyX2ZyYW1lOworCQlzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0cChzdHJtLT50cmFuc3BvcnQsIAorCQkJCQkJICAgIHBhY2tldCwgc2l6ZSk7CisJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igc2VuZGluZyBSVFAgcGFja2V0Iiwgc3RhdHVzKTsKKworCSAgICB9IGVsc2UgeworCQlwal9hc3NlcnQoISJSVFAgZW5jb2RlKCkgZXJyb3IiKTsKKwkgICAgfQorCisJICAgIC8qIFVwZGF0ZSBSVENQIFNSICovCisJICAgIHBqbWVkaWFfcnRjcF90eF9ydHAoICZzdHJtLT5ydGNwLCAocGpfdWludDE2X3Qpc3RybS0+Ynl0ZXNfcGVyX2ZyYW1lKTsKKworCSAgICAvKiBTY2hlZHVsZSBuZXh0IHNlbmQgKi8KKwkgICAgbmV4dF9ydHAudTY0ICs9IChtc2VjX2ludGVydmFsICogZnJlcS51NjQgLyAxMDAwKTsKKwl9CisKKworCWlmIChzZW5kX3J0Y3AgfHwgbmV4dF9ydGNwLnU2NCA8PSBub3cudTY0KSB7CisJICAgIC8qCisJICAgICAqIFRpbWUgdG8gc2VuZCBSVENQIHBhY2tldC4KKwkgICAgICovCisJICAgIHZvaWQgKnJ0Y3BfcGt0OworCSAgICBpbnQgcnRjcF9sZW47CisJICAgIHBqX3NzaXplX3Qgc2l6ZTsKKwkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJICAgIC8qIEJ1aWxkIFJUQ1AgcGFja2V0ICovCisJICAgIHBqbWVkaWFfcnRjcF9idWlsZF9ydGNwKCZzdHJtLT5ydGNwLCAmcnRjcF9wa3QsICZydGNwX2xlbik7CisKKyAgICAKKwkgICAgLyogU2VuZCBwYWNrZXQgKi8KKwkgICAgc2l6ZSA9IHJ0Y3BfbGVuOworCSAgICBzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0Y3Aoc3RybS0+dHJhbnNwb3J0LAorCQkJCQkJIHJ0Y3BfcGt0LCBzaXplKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igc2VuZGluZyBSVENQIHBhY2tldCIsIHN0YXR1cyk7CisJICAgIH0KKwkgICAgCisJICAgIC8qIFNjaGVkdWxlIG5leHQgc2VuZCAqLworICAgIAkgICAgbmV4dF9ydGNwLnU2NCArPSAoZnJlcS51NjQgKiAoUlRDUF9JTlRFUlZBTCsocGpfcmFuZCgpJVJUQ1BfUkFORCkpIC8KKwkJCSAgICAgIDEwMDApOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBTRFAgbmVnb3RpYXRpb24gaXMgZG9uZSBpbiB0aGUgY2FsbDogKi8KK3N0YXRpYyB2b2lkIGNhbGxfb25fbWVkaWFfdXBkYXRlKCBwanNpcF9pbnZfc2Vzc2lvbiAqaW52LAorCQkJCSAgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIHN0cnVjdCBjYWxsICpjYWxsOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBzdHJ1Y3QgbWVkaWFfc3RyZWFtICphdWRpbzsKKyAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbF9zZHAsICpyZW1vdGVfc2RwOworICAgIHN0cnVjdCBjb2RlYyAqY29kZWNfZGVzYyA9IE5VTEw7CisgICAgdW5zaWduZWQgaTsKKworICAgIGNhbGwgPSBpbnYtPm1vZF9kYXRhW21vZF9zaXBydHAuaWRdOworICAgIHBvb2wgPSBpbnYtPmRsZy0+cG9vbDsKKyAgICBhdWRpbyA9ICZjYWxsLT5tZWRpYVswXTsKKworICAgIC8qIElmIHRoaXMgaXMgYSBtaWQtY2FsbCBtZWRpYSB1cGRhdGUsIHRoZW4gZGVzdHJveSBleGlzdGluZyBtZWRpYSAqLworICAgIGlmIChhdWRpby0+dGhyZWFkICE9IE5VTEwpCisJZGVzdHJveV9jYWxsX21lZGlhKGNhbGwtPmluZGV4KTsKKworCisgICAgLyogRG8gbm90aGluZyBpZiBtZWRpYSBuZWdvdGlhdGlvbiBoYXMgZmFpbGVkICovCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJTRFAgbmVnb3RpYXRpb24gZmFpbGVkIiwgc3RhdHVzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgCisgICAgLyogQ2FwdHVyZSBzdHJlYW0gZGVmaW5pdGlvbiBmcm9tIHRoZSBTRFAgKi8KKyAgICBwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9sb2NhbChpbnYtPm5lZywgJmxvY2FsX3NkcCk7CisgICAgcGptZWRpYV9zZHBfbmVnX2dldF9hY3RpdmVfcmVtb3RlKGludi0+bmVnLCAmcmVtb3RlX3NkcCk7CisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3N0cmVhbV9pbmZvX2Zyb21fc2RwKCZhdWRpby0+c2ksIGludi0+cG9vbCwgYXBwLm1lZF9lbmRwdCwKKwkJCQkJICBsb2NhbF9zZHAsIHJlbW90ZV9zZHAsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgY3JlYXRpbmcgc3RyZWFtIGluZm8gZnJvbSBTRFAiLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHJlbWFpbmRlciBvZiBjb2RlYyBpbmZvcm1hdGlvbiBmcm9tIGNvZGVjIGRlc2NyaXB0b3IgKi8KKyAgICBpZiAoYXVkaW8tPnNpLmZtdC5wdCA9PSBhcHAuYXVkaW9fY29kZWMucHQpCisJY29kZWNfZGVzYyA9ICZhcHAuYXVkaW9fY29kZWM7CisgICAgZWxzZSB7CisJLyogRmluZCB0aGUgY29kZWMgZGVzY3JpcHRpb24gaW4gY29kZWMgYXJyYXkgKi8KKwlmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGF1ZGlvX2NvZGVjcyk7ICsraSkgeworCSAgICBpZiAoYXVkaW9fY29kZWNzW2ldLnB0ID09IGF1ZGlvLT5zaS5mbXQucHQpIHsKKwkJY29kZWNfZGVzYyA9ICZhdWRpb19jb2RlY3NbaV07CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYgKGNvZGVjX2Rlc2MgPT0gTlVMTCkgeworCSAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIkVycm9yOiBJbnZhbGlkIGNvZGVjIHBheWxvYWQgdHlwZSIpKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBhdWRpby0+Y2xvY2tfcmF0ZSA9IGF1ZGlvLT5zaS5mbXQuY2xvY2tfcmF0ZTsKKyAgICBhdWRpby0+c2FtcGxlc19wZXJfZnJhbWUgPSBhdWRpby0+Y2xvY2tfcmF0ZSAqIGNvZGVjX2Rlc2MtPnB0aW1lIC8gMTAwMDsKKyAgICBhdWRpby0+Ynl0ZXNfcGVyX2ZyYW1lID0gY29kZWNfZGVzYy0+Yml0X3JhdGUgKiBjb2RlY19kZXNjLT5wdGltZSAvIDEwMDAgLyA4OworCisKKyAgICBwam1lZGlhX3J0cF9zZXNzaW9uX2luaXQoJmF1ZGlvLT5vdXRfc2VzcywgYXVkaW8tPnNpLnR4X3B0LCAKKwkJCSAgICAgcGpfcmFuZCgpKTsKKyAgICBwam1lZGlhX3J0cF9zZXNzaW9uX2luaXQoJmF1ZGlvLT5pbl9zZXNzLCBhdWRpby0+c2kuZm10LnB0LCAwKTsKKyAgICBwam1lZGlhX3J0Y3BfaW5pdCgmYXVkaW8tPnJ0Y3AsICJydGNwIiwgYXVkaW8tPmNsb2NrX3JhdGUsIAorCQkgICAgICBhdWRpby0+c2FtcGxlc19wZXJfZnJhbWUsIDApOworCisKKyAgICAvKiBBdHRhY2ggbWVkaWEgdG8gdHJhbnNwb3J0ICovCisgICAgc3RhdHVzID0gcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKGF1ZGlvLT50cmFuc3BvcnQsIGF1ZGlvLCAKKwkJCQkgICAgICAmYXVkaW8tPnNpLnJlbV9hZGRyLCAKKwkJCQkgICAgICAmYXVkaW8tPnNpLnJlbV9ydGNwLCAKKwkJCQkgICAgICBzaXplb2YocGpfc29ja2FkZHJfaW4pLAorCQkJCSAgICAgICZvbl9yeF9ydHAsCisJCQkJICAgICAgJm9uX3J4X3J0Y3ApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3Igb24gcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCkiLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBTdGFydCBtZWRpYSB0aHJlYWQuICovCisgICAgYXVkaW8tPnRocmVhZF9xdWl0X2ZsYWcgPSAwOworI2lmIFBKX0hBU19USFJFQURTCisgICAgc3RhdHVzID0gcGpfdGhyZWFkX2NyZWF0ZSggaW52LT5wb29sLCAibWVkaWEiLCAmbWVkaWFfdGhyZWFkLCBhdWRpbywKKwkJCSAgICAgICAwLCAwLCAmYXVkaW8tPnRocmVhZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjcmVhdGluZyBtZWRpYSB0aHJlYWQiLCBzdGF0dXMpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNldCB0aGUgbWVkaWEgYXMgYWN0aXZlICovCisgICAgYXVkaW8tPmFjdGl2ZSA9IFBKX1RSVUU7Cit9CisKKworCisvKiBEZXN0cm95IGNhbGwncyBtZWRpYSAqLworc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX21lZGlhKHVuc2lnbmVkIGNhbGxfaW5kZXgpCit7CisgICAgc3RydWN0IG1lZGlhX3N0cmVhbSAqYXVkaW8gPSAmYXBwLmNhbGxbY2FsbF9pbmRleF0ubWVkaWFbMF07CisKKyAgICBpZiAoYXVkaW8pIHsKKwlhdWRpby0+YWN0aXZlID0gUEpfRkFMU0U7CisKKwlpZiAoYXVkaW8tPnRocmVhZCkgeworCSAgICBhdWRpby0+dGhyZWFkX3F1aXRfZmxhZyA9IDE7CisJICAgIHBqX3RocmVhZF9qb2luKGF1ZGlvLT50aHJlYWQpOworCSAgICBwal90aHJlYWRfZGVzdHJveShhdWRpby0+dGhyZWFkKTsKKwkgICAgYXVkaW8tPnRocmVhZCA9IE5VTEw7CisJICAgIGF1ZGlvLT50aHJlYWRfcXVpdF9mbGFnID0gMDsKKwl9CisKKwlwam1lZGlhX3RyYW5zcG9ydF9kZXRhY2goYXVkaW8tPnRyYW5zcG9ydCwgYXVkaW8pOworICAgIH0KK30KKworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0VSIElOVEVSRkFDRSBTVFVGRlMKKyAqLworCitzdGF0aWMgdm9pZCBjYWxsX2dldF9kdXJhdGlvbihpbnQgY2FsbF9pbmRleCwgcGpfdGltZV92YWwgKmR1cikKK3sKKyAgICBzdHJ1Y3QgY2FsbCAqY2FsbCA9ICZhcHAuY2FsbFtjYWxsX2luZGV4XTsKKyAgICBwanNpcF9pbnZfc2Vzc2lvbiAqaW52OworCisgICAgZHVyLT5zZWMgPSBkdXItPm1zZWMgPSAwOworCisgICAgaWYgKCFjYWxsKQorCXJldHVybjsKKworICAgIGludiA9IGNhbGwtPmludjsKKyAgICBpZiAoIWludikKKwlyZXR1cm47CisKKyAgICBpZiAoaW52LT5zdGF0ZSA+PSBQSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEICYmIGNhbGwtPmNvbm5lY3RfdGltZS5zZWMpIHsKKworCXBqX2dldHRpbWVvZmRheShkdXIpOworCVBKX1RJTUVfVkFMX1NVQigoKmR1ciksIGNhbGwtPmNvbm5lY3RfdGltZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnb29kX251bWJlcihjaGFyICpidWYsIHBqX2ludDMyX3QgdmFsKQoreworICAgIGlmICh2YWwgPCAxMDAwKSB7CisJcGpfYW5zaV9zcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKKyAgICB9IGVsc2UgaWYgKHZhbCA8IDEwMDAwMDApIHsKKwlwal9hbnNpX3NwcmludGYoYnVmLCAiJWQuJTAyZEsiLCAKKwkJCXZhbCAvIDEwMDAsCisJCQkodmFsICUgMTAwMCkgLyAxMDApOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zcHJpbnRmKGJ1ZiwgIiVkLiUwMmRNIiwgCisJCQl2YWwgLyAxMDAwMDAwLAorCQkJKHZhbCAlIDEwMDAwMDApIC8gMTAwMDApOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKworCitzdGF0aWMgdm9pZCBwcmludF9hdmdfc3RhdCh2b2lkKQoreworI2RlZmluZSBNSU5fKHZhcix2YWwpCSAgIGlmICgoaW50KXZhbCA8IChpbnQpdmFyKSB2YXIgPSB2YWwKKyNkZWZpbmUgTUFYXyh2YXIsdmFsKQkgICBpZiAoKGludCl2YWwgPiAoaW50KXZhcikgdmFyID0gdmFsCisjZGVmaW5lIEFWR18odmFyLHZhbCkJICAgdmFyID0gKCAoKHZhciAqIGNvdW50KSArIHZhbCkgLyAoY291bnQrMSkgKQorI2RlZmluZSBCSUdWQUwJCSAgICAweDdGRkZGRkZGTAorICAgIHN0cnVjdCBzdGF0X2VudHJ5CisgICAgeworCWludCBtaW4sIGF2ZywgbWF4OworICAgIH07CisKKyAgICBzdHJ1Y3Qgc3RhdF9lbnRyeSBjYWxsX2R1ciwgY2FsbF9wZGQ7CisgICAgcGptZWRpYV9ydGNwX3N0YXQgbWluX3N0YXQsIGF2Z19zdGF0LCBtYXhfc3RhdDsKKworICAgIGNoYXIgc3J4X21pblsxNl0sIHNyeF9hdmdbMTZdLCBzcnhfbWF4WzE2XTsKKyAgICBjaGFyIGJyeF9taW5bMTZdLCBicnhfYXZnWzE2XSwgYnJ4X21heFsxNl07CisgICAgY2hhciBzdHhfbWluWzE2XSwgc3R4X2F2Z1sxNl0sIHN0eF9tYXhbMTZdOworICAgIGNoYXIgYnR4X21pblsxNl0sIGJ0eF9hdmdbMTZdLCBidHhfbWF4WzE2XTsKKworCisgICAgdW5zaWduZWQgaSwgY291bnQ7CisKKyAgICBwal9iemVybygmY2FsbF9kdXIsIHNpemVvZihjYWxsX2R1cikpOyAKKyAgICBjYWxsX2R1ci5taW4gPSBCSUdWQUw7CisKKyAgICBwal9iemVybygmY2FsbF9wZGQsIHNpemVvZihjYWxsX3BkZCkpOyAKKyAgICBjYWxsX3BkZC5taW4gPSBCSUdWQUw7CisKKyAgICBwal9iemVybygmbWluX3N0YXQsIHNpemVvZihtaW5fc3RhdCkpOworICAgIG1pbl9zdGF0LnJ4LnBrdCA9IG1pbl9zdGF0LnR4LnBrdCA9IEJJR1ZBTDsKKyAgICBtaW5fc3RhdC5yeC5ieXRlcyA9IG1pbl9zdGF0LnR4LmJ5dGVzID0gQklHVkFMOworICAgIG1pbl9zdGF0LnJ4Lmxvc3MgPSBtaW5fc3RhdC50eC5sb3NzID0gQklHVkFMOworICAgIG1pbl9zdGF0LnJ4LmR1cCA9IG1pbl9zdGF0LnR4LmR1cCA9IEJJR1ZBTDsKKyAgICBtaW5fc3RhdC5yeC5yZW9yZGVyID0gbWluX3N0YXQudHgucmVvcmRlciA9IEJJR1ZBTDsKKyAgICBtaW5fc3RhdC5yeC5qaXR0ZXIubWluID0gbWluX3N0YXQudHguaml0dGVyLm1pbiA9IEJJR1ZBTDsKKyAgICBtaW5fc3RhdC5ydHQubWluID0gQklHVkFMOworCisgICAgcGpfYnplcm8oJmF2Z19zdGF0LCBzaXplb2YoYXZnX3N0YXQpKTsKKyAgICBwal9iemVybygmbWF4X3N0YXQsIHNpemVvZihtYXhfc3RhdCkpOworCisKKyAgICBmb3IgKGk9MCwgY291bnQ9MDsgaTxhcHAubWF4X2NhbGxzOyArK2kpIHsKKworCXN0cnVjdCBjYWxsICpjYWxsID0gJmFwcC5jYWxsW2ldOworCXN0cnVjdCBtZWRpYV9zdHJlYW0gKmF1ZGlvID0gJmNhbGwtPm1lZGlhWzBdOworCXBqX3RpbWVfdmFsIGR1cjsKKwl1bnNpZ25lZCBtc2VjX2R1cjsKKworCWlmIChjYWxsLT5pbnYgPT0gTlVMTCB8fCAKKwkgICAgY2FsbC0+aW52LT5zdGF0ZSA8IFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQgfHwKKwkgICAgY2FsbC0+Y29ubmVjdF90aW1lLnNlYyA9PSAwKSAKKwl7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIER1cmF0aW9uICovCisJY2FsbF9nZXRfZHVyYXRpb24oaSwgJmR1cik7CisJbXNlY19kdXIgPSBQSl9USU1FX1ZBTF9NU0VDKGR1cik7CisKKwlNSU5fKGNhbGxfZHVyLm1pbiwgbXNlY19kdXIpOworCU1BWF8oY2FsbF9kdXIubWF4LCBtc2VjX2R1cik7CisJQVZHXyhjYWxsX2R1ci5hdmcsIG1zZWNfZHVyKTsKKworCS8qIENvbm5lY3QgZGVsYXkgKi8KKwlpZiAoY2FsbC0+Y29ubmVjdF90aW1lLnNlYykgeworCSAgICBwal90aW1lX3ZhbCB0ID0gY2FsbC0+Y29ubmVjdF90aW1lOworCSAgICBQSl9USU1FX1ZBTF9TVUIodCwgY2FsbC0+c3RhcnRfdGltZSk7CisJICAgIG1zZWNfZHVyID0gUEpfVElNRV9WQUxfTVNFQyh0KTsKKwl9IGVsc2UgeworCSAgICBtc2VjX2R1ciA9IDEwOworCX0KKworCU1JTl8oY2FsbF9wZGQubWluLCBtc2VjX2R1cik7CisJTUFYXyhjYWxsX3BkZC5tYXgsIG1zZWNfZHVyKTsKKwlBVkdfKGNhbGxfcGRkLmF2ZywgbXNlY19kdXIpOworCisJLyogUlggU3RhdGlzdGlzYzogKi8KKworCS8qIFBhY2tldHMgKi8KKwlNSU5fKG1pbl9zdGF0LnJ4LnBrdCwgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5wa3QpOworCU1BWF8obWF4X3N0YXQucngucGt0LCBhdWRpby0+cnRjcC5zdGF0LnJ4LnBrdCk7CisJQVZHXyhhdmdfc3RhdC5yeC5wa3QsIGF1ZGlvLT5ydGNwLnN0YXQucngucGt0KTsKKworCS8qIEJ5dGVzICovCisJTUlOXyhtaW5fc3RhdC5yeC5ieXRlcywgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5ieXRlcyk7CisJTUFYXyhtYXhfc3RhdC5yeC5ieXRlcywgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5ieXRlcyk7CisJQVZHXyhhdmdfc3RhdC5yeC5ieXRlcywgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5ieXRlcyk7CisKKworCS8qIFBhY2tldCBsb3NzICovCisJTUlOXyhtaW5fc3RhdC5yeC5sb3NzLCBhdWRpby0+cnRjcC5zdGF0LnJ4Lmxvc3MpOworCU1BWF8obWF4X3N0YXQucngubG9zcywgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzKTsKKwlBVkdfKGF2Z19zdGF0LnJ4Lmxvc3MsIGF1ZGlvLT5ydGNwLnN0YXQucngubG9zcyk7CisKKwkvKiBQYWNrZXQgZHVwICovCisJTUlOXyhtaW5fc3RhdC5yeC5kdXAsIGF1ZGlvLT5ydGNwLnN0YXQucnguZHVwKTsKKwlNQVhfKG1heF9zdGF0LnJ4LmR1cCwgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5kdXApOworCUFWR18oYXZnX3N0YXQucnguZHVwLCBhdWRpby0+cnRjcC5zdGF0LnJ4LmR1cCk7CisKKwkvKiBQYWNrZXQgcmVvcmRlciAqLworCU1JTl8obWluX3N0YXQucngucmVvcmRlciwgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5yZW9yZGVyKTsKKwlNQVhfKG1heF9zdGF0LnJ4LnJlb3JkZXIsIGF1ZGlvLT5ydGNwLnN0YXQucngucmVvcmRlcik7CisJQVZHXyhhdmdfc3RhdC5yeC5yZW9yZGVyLCBhdWRpby0+cnRjcC5zdGF0LnJ4LnJlb3JkZXIpOworCisJLyogSml0dGVyICAqLworCU1JTl8obWluX3N0YXQucnguaml0dGVyLm1pbiwgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5qaXR0ZXIubWluKTsKKwlNQVhfKG1heF9zdGF0LnJ4LmppdHRlci5tYXgsIGF1ZGlvLT5ydGNwLnN0YXQucnguaml0dGVyLm1heCk7CisJQVZHXyhhdmdfc3RhdC5yeC5qaXR0ZXIubWVhbiwgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5qaXR0ZXIubWVhbik7CisKKworCS8qIFRYIFN0YXRpc3Rpc2M6ICovCisKKwkvKiBQYWNrZXRzICovCisJTUlOXyhtaW5fc3RhdC50eC5wa3QsIGF1ZGlvLT5ydGNwLnN0YXQudHgucGt0KTsKKwlNQVhfKG1heF9zdGF0LnR4LnBrdCwgYXVkaW8tPnJ0Y3Auc3RhdC50eC5wa3QpOworCUFWR18oYXZnX3N0YXQudHgucGt0LCBhdWRpby0+cnRjcC5zdGF0LnR4LnBrdCk7CisKKwkvKiBCeXRlcyAqLworCU1JTl8obWluX3N0YXQudHguYnl0ZXMsIGF1ZGlvLT5ydGNwLnN0YXQudHguYnl0ZXMpOworCU1BWF8obWF4X3N0YXQudHguYnl0ZXMsIGF1ZGlvLT5ydGNwLnN0YXQudHguYnl0ZXMpOworCUFWR18oYXZnX3N0YXQudHguYnl0ZXMsIGF1ZGlvLT5ydGNwLnN0YXQudHguYnl0ZXMpOworCisJLyogUGFja2V0IGxvc3MgKi8KKwlNSU5fKG1pbl9zdGF0LnR4Lmxvc3MsIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zcyk7CisJTUFYXyhtYXhfc3RhdC50eC5sb3NzLCBhdWRpby0+cnRjcC5zdGF0LnR4Lmxvc3MpOworCUFWR18oYXZnX3N0YXQudHgubG9zcywgYXVkaW8tPnJ0Y3Auc3RhdC50eC5sb3NzKTsKKworCS8qIFBhY2tldCBkdXAgKi8KKwlNSU5fKG1pbl9zdGF0LnR4LmR1cCwgYXVkaW8tPnJ0Y3Auc3RhdC50eC5kdXApOworCU1BWF8obWF4X3N0YXQudHguZHVwLCBhdWRpby0+cnRjcC5zdGF0LnR4LmR1cCk7CisJQVZHXyhhdmdfc3RhdC50eC5kdXAsIGF1ZGlvLT5ydGNwLnN0YXQudHguZHVwKTsKKworCS8qIFBhY2tldCByZW9yZGVyICovCisJTUlOXyhtaW5fc3RhdC50eC5yZW9yZGVyLCBhdWRpby0+cnRjcC5zdGF0LnR4LnJlb3JkZXIpOworCU1BWF8obWF4X3N0YXQudHgucmVvcmRlciwgYXVkaW8tPnJ0Y3Auc3RhdC50eC5yZW9yZGVyKTsKKwlBVkdfKGF2Z19zdGF0LnR4LnJlb3JkZXIsIGF1ZGlvLT5ydGNwLnN0YXQudHgucmVvcmRlcik7CisKKwkvKiBKaXR0ZXIgICovCisJTUlOXyhtaW5fc3RhdC50eC5qaXR0ZXIubWluLCBhdWRpby0+cnRjcC5zdGF0LnR4LmppdHRlci5taW4pOworCU1BWF8obWF4X3N0YXQudHguaml0dGVyLm1heCwgYXVkaW8tPnJ0Y3Auc3RhdC50eC5qaXR0ZXIubWF4KTsKKwlBVkdfKGF2Z19zdGF0LnR4LmppdHRlci5tZWFuLCBhdWRpby0+cnRjcC5zdGF0LnR4LmppdHRlci5tZWFuKTsKKworCisJLyogUlRUICovCisJTUlOXyhtaW5fc3RhdC5ydHQubWluLCBhdWRpby0+cnRjcC5zdGF0LnJ0dC5taW4pOworCU1BWF8obWF4X3N0YXQucnR0Lm1heCwgYXVkaW8tPnJ0Y3Auc3RhdC5ydHQubWF4KTsKKwlBVkdfKGF2Z19zdGF0LnJ0dC5tZWFuLCBhdWRpby0+cnRjcC5zdGF0LnJ0dC5tZWFuKTsKKworCSsrY291bnQ7CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDApIHsKKwlwdXRzKCJObyBhY3RpdmUgY2FsbHMiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCJUb3RhbCAlZCBjYWxsKHMpIGFjdGl2ZS5cbiIKKwkgICAiICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIFN0YXRpc3RpY3NcbiIKKwkgICAiICAgICAgICAgICAgICAgICAgICBtaW4gICAgIGF2ZyAgICAgbWF4IFxuIgorCSAgICIgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkgICAiIGNhbGwgZHVyYXRpb246ICU3ZCAlN2QgJTdkICVzXG4iCisJICAgIiBjb25uZWN0IGRlbGF5OiAlN2QgJTdkICU3ZCAlc1xuIgorCSAgICIgUlggc3RhdDpcbiIKKwkgICAiICAgICAgIHBhY2tldHM6ICU3cyAlN3MgJTdzICVzXG4iCisJICAgIiAgICAgICBwYXlsb2FkOiAlN3MgJTdzICU3cyAlc1xuIgorCSAgICIgICAgICAgICAgbG9zczogJTdkICU3ZCAlN2QgJXNcbiIKKwkgICAiICBwZXJjZW50IGxvc3M6ICU3LjNmICU3LjNmICU3LjNmICVzXG4iCisJICAgIiAgICAgICAgICAgZHVwOiAlN2QgJTdkICU3ZCAlc1xuIgorCSAgICIgICAgICAgcmVvcmRlcjogJTdkICU3ZCAlN2QgJXNcbiIKKwkgICAiICAgICAgICBqaXR0ZXI6ICU3LjNmICU3LjNmICU3LjNmICVzXG4iCisJICAgIiBUWCBzdGF0OlxuIgorCSAgICIgICAgICAgcGFja2V0czogJTdzICU3cyAlN3MgJXNcbiIKKwkgICAiICAgICAgIHBheWxvYWQ6ICU3cyAlN3MgJTdzICVzXG4iCisJICAgIiAgICAgICAgICBsb3NzOiAlN2QgJTdkICU3ZCAlc1xuIgorCSAgICIgIHBlcmNlbnQgbG9zczogJTcuM2YgJTcuM2YgJTcuM2YgJXNcbiIKKwkgICAiICAgICAgICAgICBkdXA6ICU3ZCAlN2QgJTdkICVzXG4iCisJICAgIiAgICAgICByZW9yZGVyOiAlN2QgJTdkICU3ZCAlc1xuIgorCSAgICIgICAgICAgIGppdHRlcjogJTcuM2YgJTcuM2YgJTcuM2YgJXNcbiIKKwkgICAiIFJUVCAgICAgICAgICA6ICU3LjNmICU3LjNmICU3LjNmICVzXG4iCisJICAgLAorCSAgIGNvdW50LAorCSAgIGNhbGxfZHVyLm1pbi8xMDAwLCBjYWxsX2R1ci5hdmcvMTAwMCwgY2FsbF9kdXIubWF4LzEwMDAsIAorCSAgICJzZWNvbmRzIiwKKworCSAgIGNhbGxfcGRkLm1pbiwgY2FsbF9wZGQuYXZnLCBjYWxsX3BkZC5tYXgsIAorCSAgICJtcyIsCisKKwkgICAvKiByeCAqLworCisJICAgZ29vZF9udW1iZXIoc3J4X21pbiwgbWluX3N0YXQucngucGt0KSwKKwkgICBnb29kX251bWJlcihzcnhfYXZnLCBhdmdfc3RhdC5yeC5wa3QpLAorCSAgIGdvb2RfbnVtYmVyKHNyeF9tYXgsIG1heF9zdGF0LnJ4LnBrdCksCisJICAgInBhY2tldHMiLAorCisJICAgZ29vZF9udW1iZXIoYnJ4X21pbiwgbWluX3N0YXQucnguYnl0ZXMpLAorCSAgIGdvb2RfbnVtYmVyKGJyeF9hdmcsIGF2Z19zdGF0LnJ4LmJ5dGVzKSwKKwkgICBnb29kX251bWJlcihicnhfbWF4LCBtYXhfc3RhdC5yeC5ieXRlcyksCisJICAgImJ5dGVzIiwKKworCSAgIG1pbl9zdGF0LnJ4Lmxvc3MsIGF2Z19zdGF0LnJ4Lmxvc3MsIG1heF9zdGF0LnJ4Lmxvc3MsCisJICAgInBhY2tldHMiLAorCSAgIAorCSAgIG1pbl9zdGF0LnJ4Lmxvc3MqMTAwLjAvKG1pbl9zdGF0LnJ4LnBrdCttaW5fc3RhdC5yeC5sb3NzKSwKKwkgICBhdmdfc3RhdC5yeC5sb3NzKjEwMC4wLyhhdmdfc3RhdC5yeC5wa3QrYXZnX3N0YXQucngubG9zcyksCisJICAgbWF4X3N0YXQucngubG9zcyoxMDAuMC8obWF4X3N0YXQucngucGt0K21heF9zdGF0LnJ4Lmxvc3MpLAorCSAgICIlIiwKKworCisJICAgbWluX3N0YXQucnguZHVwLCBhdmdfc3RhdC5yeC5kdXAsIG1heF9zdGF0LnJ4LmR1cCwKKwkgICAicGFja2V0cyIsCisKKwkgICBtaW5fc3RhdC5yeC5yZW9yZGVyLCBhdmdfc3RhdC5yeC5yZW9yZGVyLCBtYXhfc3RhdC5yeC5yZW9yZGVyLAorCSAgICJwYWNrZXRzIiwKKworCSAgIG1pbl9zdGF0LnJ4LmppdHRlci5taW4vMTAwMC4wLCAKKwkgICBhdmdfc3RhdC5yeC5qaXR0ZXIubWVhbi8xMDAwLjAsIAorCSAgIG1heF9zdGF0LnJ4LmppdHRlci5tYXgvMTAwMC4wLAorCSAgICJtcyIsCisJCisJICAgLyogdHggKi8KKworCSAgIGdvb2RfbnVtYmVyKHN0eF9taW4sIG1pbl9zdGF0LnR4LnBrdCksCisJICAgZ29vZF9udW1iZXIoc3R4X2F2ZywgYXZnX3N0YXQudHgucGt0KSwKKwkgICBnb29kX251bWJlcihzdHhfbWF4LCBtYXhfc3RhdC50eC5wa3QpLAorCSAgICJwYWNrZXRzIiwKKworCSAgIGdvb2RfbnVtYmVyKGJ0eF9taW4sIG1pbl9zdGF0LnR4LmJ5dGVzKSwKKwkgICBnb29kX251bWJlcihidHhfYXZnLCBhdmdfc3RhdC50eC5ieXRlcyksCisJICAgZ29vZF9udW1iZXIoYnR4X21heCwgbWF4X3N0YXQudHguYnl0ZXMpLAorCSAgICJieXRlcyIsCisKKwkgICBtaW5fc3RhdC50eC5sb3NzLCBhdmdfc3RhdC50eC5sb3NzLCBtYXhfc3RhdC50eC5sb3NzLAorCSAgICJwYWNrZXRzIiwKKwkgICAKKwkgICBtaW5fc3RhdC50eC5sb3NzKjEwMC4wLyhtaW5fc3RhdC50eC5wa3QrbWluX3N0YXQudHgubG9zcyksCisJICAgYXZnX3N0YXQudHgubG9zcyoxMDAuMC8oYXZnX3N0YXQudHgucGt0K2F2Z19zdGF0LnR4Lmxvc3MpLAorCSAgIG1heF9zdGF0LnR4Lmxvc3MqMTAwLjAvKG1heF9zdGF0LnR4LnBrdCttYXhfc3RhdC50eC5sb3NzKSwKKwkgICAiJSIsCisKKwkgICBtaW5fc3RhdC50eC5kdXAsIGF2Z19zdGF0LnR4LmR1cCwgbWF4X3N0YXQudHguZHVwLAorCSAgICJwYWNrZXRzIiwKKworCSAgIG1pbl9zdGF0LnR4LnJlb3JkZXIsIGF2Z19zdGF0LnR4LnJlb3JkZXIsIG1heF9zdGF0LnR4LnJlb3JkZXIsCisJICAgInBhY2tldHMiLAorCisJICAgbWluX3N0YXQudHguaml0dGVyLm1pbi8xMDAwLjAsIAorCSAgIGF2Z19zdGF0LnR4LmppdHRlci5tZWFuLzEwMDAuMCwgCisJICAgbWF4X3N0YXQudHguaml0dGVyLm1heC8xMDAwLjAsCisJICAgIm1zIiwKKworCSAgIC8qIHJ0dCAqLworCSAgIG1pbl9zdGF0LnJ0dC5taW4vMTAwMC4wLCAKKwkgICBhdmdfc3RhdC5ydHQubWVhbi8xMDAwLjAsIAorCSAgIG1heF9zdGF0LnJ0dC5tYXgvMTAwMC4wLAorCSAgICJtcyIKKwkgICApOworCit9CisKKworI2luY2x1ZGUgInNpcHJ0cF9yZXBvcnQuYyIKKworCitzdGF0aWMgdm9pZCBsaXN0X2NhbGxzKCkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHB1dHMoIkxpc3QgYWxsIGNhbGxzOiIpOworICAgIGZvciAoaT0wOyBpPGFwcC5tYXhfY2FsbHM7ICsraSkgeworCWlmICghYXBwLmNhbGxbaV0uaW52KQorCSAgICBjb250aW51ZTsKKwlwcmludF9jYWxsKGkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGFuZ3VwX2NhbGwodW5zaWduZWQgaW5kZXgpCit7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKGFwcC5jYWxsW2luZGV4XS5pbnYgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBzdGF0dXMgPSBwanNpcF9pbnZfZW5kX3Nlc3Npb24oYXBwLmNhbGxbaW5kZXhdLmludiwgNjAzLCBOVUxMLCAmdGRhdGEpOworICAgIGlmIChzdGF0dXM9PVBKX1NVQ0NFU1MgJiYgdGRhdGEhPU5VTEwpCisJcGpzaXBfaW52X3NlbmRfbXNnKGFwcC5jYWxsW2luZGV4XS5pbnYsIHRkYXRhKTsKK30KKworc3RhdGljIHZvaWQgaGFuZ3VwX2FsbF9jYWxscygpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGk9MDsgaTxhcHAubWF4X2NhbGxzOyArK2kpIHsKKwlpZiAoIWFwcC5jYWxsW2ldLmludikKKwkgICAgY29udGludWU7CisJaGFuZ3VwX2NhbGwoaSk7CisJcGpfdGhyZWFkX3NsZWVwKGFwcC5jYWxsX2dhcCk7CisgICAgfQorICAgIAorICAgIC8qIFdhaXQgdW50aWwgYWxsIGNhbGxzIGFyZSB0ZXJtaW5hdGVkICovCisgICAgZm9yIChpPTA7IGk8YXBwLm1heF9jYWxsczsgKytpKSB7CisJd2hpbGUgKGFwcC5jYWxsW2ldLmludikKKwkgICAgcGpfdGhyZWFkX3NsZWVwKDEwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBwal9ib29sX3Qgc2ltcGxlX2lucHV0KGNvbnN0IGNoYXIgKnRpdGxlLCBjaGFyICpidWYsIHBqX3NpemVfdCBsZW4pCit7CisgICAgY2hhciAqcDsKKworICAgIHByaW50ZigiJXMgKGVtcHR5IHRvIGNhbmNlbCk6ICIsIHRpdGxlKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKGZnZXRzKGJ1ZiwgKGludClsZW4sIHN0ZGluKSA9PSBOVUxMKQorCXJldHVybiBQSl9GQUxTRTsKKworICAgIC8qIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lcy4gKi8KKyAgICBmb3IgKHA9YnVmOyA7ICsrcCkgeworCWlmICgqcD09J1xyJyB8fCAqcD09J1xuJykgKnA9J1wwJzsKKwllbHNlIGlmICghKnApIGJyZWFrOworICAgIH0KKworICAgIGlmICghKmJ1ZikKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKk1FTlUgPQorIlxuIgorIkVudGVyIG1lbnUgY2hhcmFjdGVyOlxuIgorIiAgcyAgICBTdW1tYXJ5XG4iCisiICBsICAgIExpc3QgYWxsIGNhbGxzXG4iCisiICBoICAgIEhhbmd1cCBhIGNhbGxcbiIKKyIgIEggICAgSGFuZ3VwIGFsbCBjYWxsc1xuIgorIiAgcSAgICBRdWl0XG4iCisiXG4iOworCisKKy8qIE1haW4gc2NyZWVuIG1lbnUgKi8KK3N0YXRpYyB2b2lkIGNvbnNvbGVfbWFpbigpCit7CisgICAgY2hhciBpbnB1dDFbMTBdOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBwcmludGYoIiVzIiwgTUVOVSk7CisKKyAgICBmb3IgKDs7KSB7CisJcHJpbnRmKCI+Pj4gIik7IGZmbHVzaChzdGRvdXQpOworCWlmIChmZ2V0cyhpbnB1dDEsIHNpemVvZihpbnB1dDEpLCBzdGRpbikgPT0gTlVMTCkgeworCSAgICBwdXRzKCJFT0Ygd2hpbGUgcmVhZGluZyBzdGRpbiwgd2lsbCBxdWl0IG5vdy4uIik7CisJICAgIGJyZWFrOworCX0KKworCXN3aXRjaCAoaW5wdXQxWzBdKSB7CisKKwljYXNlICdzJzoKKwkgICAgcHJpbnRfYXZnX3N0YXQoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICdsJzoKKwkgICAgbGlzdF9jYWxscygpOworCSAgICBicmVhazsKKworCWNhc2UgJ2gnOgorCSAgICBpZiAoIXNpbXBsZV9pbnB1dCgiQ2FsbCBudW1iZXIgdG8gaGFuZ3VwIiwgaW5wdXQxLCBzaXplb2YoaW5wdXQxKSkpCisJCWJyZWFrOworCisJICAgIGkgPSBhdG9pKGlucHV0MSk7CisJICAgIGhhbmd1cF9jYWxsKGkpOworCSAgICBicmVhazsKKworCWNhc2UgJ0gnOgorCSAgICBoYW5ndXBfYWxsX2NhbGxzKCk7CisJICAgIGJyZWFrOworCisJY2FzZSAncSc6CisJICAgIGdvdG8gb25fZXhpdDsKKworCWRlZmF1bHQ6CisJICAgIHB1dHMoIkludmFsaWQgY29tbWFuZCIpOworCSAgICBwcmludGYoIiVzIiwgTUVOVSk7CisJICAgIGJyZWFrOworCX0KKworCWZmbHVzaChzdGRvdXQpOworICAgIH0KKworb25fZXhpdDoKKyAgICBoYW5ndXBfYWxsX2NhbGxzKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCZWxvdyBpcyBhIHNpbXBsZSBtb2R1bGUgdG8gbG9nIGFsbCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgU0lQIG1lc3NhZ2VzCisgKi8KKworCisvKiBOb3RpZmljYXRpb24gb24gaW5jb21pbmcgbWVzc2FnZXMgKi8KK3N0YXRpYyBwal9ib29sX3QgbG9nZ2VyX29uX3J4X21zZyhwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiUlggJWQgYnl0ZXMgJXMgZnJvbSAlczolZDpcbiIKKwkJCSAiJXNcbiIKKwkJCSAiLS1lbmQgbXNnLS0iLAorCQkJIHJkYXRhLT5tc2dfaW5mby5sZW4sCisJCQkgcGpzaXBfcnhfZGF0YV9nZXRfaW5mbyhyZGF0YSksCisJCQkgcmRhdGEtPnBrdF9pbmZvLnNyY19uYW1lLAorCQkJIHJkYXRhLT5wa3RfaW5mby5zcmNfcG9ydCwKKwkJCSByZGF0YS0+bXNnX2luZm8ubXNnX2J1ZikpOworICAgIAorICAgIC8qIEFsd2F5cyByZXR1cm4gZmFsc2UsIG90aGVyd2lzZSBtZXNzYWdlcyB3aWxsIG5vdCBnZXQgcHJvY2Vzc2VkISAqLworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworLyogTm90aWZpY2F0aW9uIG9uIG91dGdvaW5nIG1lc3NhZ2VzICovCitzdGF0aWMgcGpfc3RhdHVzX3QgbG9nZ2VyX29uX3R4X21zZyhwanNpcF90eF9kYXRhICp0ZGF0YSkKK3sKKyAgICAKKyAgICAvKiBJbXBvcnRhbnQgbm90ZToKKyAgICAgKgl0cF9pbmZvIGZpZWxkIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgb3V0Z29pbmcgbWVzc2FnZXMgaGFzIHBhc3NlZAorICAgICAqCXRyYW5zcG9ydCBsYXllci4gU28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyB0cF9pbmZvIHdoZW4gdGhlIG1vZHVsZQorICAgICAqCWhhcyBsb3dlciBwcmlvcml0eSB0aGFuIHRyYW5zcG9ydCBsYXllci4KKyAgICAgKi8KKworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJUWCAlZCBieXRlcyAlcyB0byAlczolZDpcbiIKKwkJCSAiJXNcbiIKKwkJCSAiLS1lbmQgbXNnLS0iLAorCQkJICh0ZGF0YS0+YnVmLmN1ciAtIHRkYXRhLT5idWYuc3RhcnQpLAorCQkJIHBqc2lwX3R4X2RhdGFfZ2V0X2luZm8odGRhdGEpLAorCQkJIHRkYXRhLT50cF9pbmZvLmRzdF9uYW1lLAorCQkJIHRkYXRhLT50cF9pbmZvLmRzdF9wb3J0LAorCQkJIHRkYXRhLT5idWYuc3RhcnQpKTsKKworICAgIC8qIEFsd2F5cyByZXR1cm4gc3VjY2Vzcywgb3RoZXJ3aXNlIG1lc3NhZ2Ugd2lsbCBub3QgZ2V0IHNlbnQhICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFRoZSBtb2R1bGUgaW5zdGFuY2UuICovCitzdGF0aWMgcGpzaXBfbW9kdWxlIG1zZ19sb2dnZXIgPSAKK3sKKyAgICBOVUxMLCBOVUxMLAkJCQkvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2Qtc2lwcnRwLWxvZyIsIDE0IH0sCQkvKiBOYW1lLgkJKi8KKyAgICAtMSwJCQkJCS8qIElkCQkJKi8KKyAgICBQSlNJUF9NT0RfUFJJT1JJVFlfVFJBTlNQT1JUX0xBWUVSLTEsLyogUHJpb3JpdHkJICAgICAgICAqLworICAgIE5VTEwsCQkJCS8qIGxvYWQoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiBzdGFydCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0b3AoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiB1bmxvYWQoKQkJKi8KKyAgICAmbG9nZ2VyX29uX3J4X21zZywJCQkvKiBvbl9yeF9yZXF1ZXN0KCkJKi8KKyAgICAmbG9nZ2VyX29uX3J4X21zZywJCQkvKiBvbl9yeF9yZXNwb25zZSgpCSovCisgICAgJmxvZ2dlcl9vbl90eF9tc2csCQkJLyogb25fdHhfcmVxdWVzdC4JKi8KKyAgICAmbG9nZ2VyX29uX3R4X21zZywJCQkvKiBvbl90eF9yZXNwb25zZSgpCSovCisgICAgTlVMTCwJCQkJLyogb25fdHN4X3N0YXRlKCkJKi8KKworfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uc29sZSBhcHBsaWNhdGlvbiBjdXN0b20gbG9nZ2luZzoKKyAqLworCisKK3N0YXRpYyBGSUxFICpsb2dfZmlsZTsKKworCitzdGF0aWMgdm9pZCBhcHBfbG9nX3dyaXRlcihpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyAgICAvKiBXcml0ZSB0byBib3RoIHN0ZG91dCBhbmQgZmlsZS4gKi8KKworICAgIGlmIChsZXZlbCA8PSBhcHAuYXBwX2xvZ19sZXZlbCkKKwlwal9sb2dfd3JpdGUobGV2ZWwsIGJ1ZmZlciwgbGVuKTsKKworICAgIGlmIChsb2dfZmlsZSkgeworCXBqX3NpemVfdCBjb3VudCA9IGZ3cml0ZShidWZmZXIsIGxlbiwgMSwgbG9nX2ZpbGUpOworCVBKX1VOVVNFRF9BUkcoY291bnQpOworCWZmbHVzaChsb2dfZmlsZSk7CisgICAgfQorfQorCisKK3BqX3N0YXR1c190IGFwcF9sb2dnaW5nX2luaXQodm9pZCkKK3sKKyAgICAvKiBSZWRpcmVjdCBsb2cgZnVuY3Rpb24gdG8gb3VycyAqLworCisgICAgcGpfbG9nX3NldF9sb2dfZnVuYyggJmFwcF9sb2dfd3JpdGVyICk7CisKKyAgICAvKiBJZiBvdXRwdXQgbG9nIGZpbGUgaXMgZGVzaXJlZCwgY3JlYXRlIHRoZSBmaWxlOiAqLworCisgICAgaWYgKGFwcC5sb2dfZmlsZW5hbWUpIHsKKwlsb2dfZmlsZSA9IGZvcGVuKGFwcC5sb2dfZmlsZW5hbWUsICJ3dCIpOworCWlmIChsb2dfZmlsZSA9PSBOVUxMKSB7CisJICAgIFBKX0xPRygxLChUSElTX0ZJTEUsICJVbmFibGUgdG8gb3BlbiBsb2cgZmlsZSAlcyIsIAorCQkgICAgICBhcHAubG9nX2ZpbGVuYW1lKSk7ICAgCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKwordm9pZCBhcHBfbG9nZ2luZ19zaHV0ZG93bih2b2lkKQoreworICAgIC8qIENsb3NlIGxvZ2dpbmcgZmlsZSwgaWYgYW55OiAqLworCisgICAgaWYgKGxvZ19maWxlKSB7CisJZmNsb3NlKGxvZ19maWxlKTsKKwlsb2dfZmlsZSA9IE5VTEw7CisgICAgfQorfQorCisKKy8qCisgKiBtYWluKCkKKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdCAqLworICAgIHN0YXR1cyA9IHBqX2luaXQoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIDE7CisKKyAgICAvKiBHZXQgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKyAgICBzdGF0dXMgPSBpbml0X29wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiAxOworCisgICAgLyogVmVyaWZ5IG9wdGlvbnM6ICovCisKKyAgICAvKiBBdXRvLXF1aXQgY2FuIG5vdCBiZSBzcGVjaWZpZWQgZm9yIFVBUyAqLworICAgIGlmIChhcHAuYXV0b19xdWl0ICYmIGFwcC51cmlfdG9fY2FsbC5zbGVuID09IDApIHsKKwlwcmludGYoIkVycm9yOiAtLWF1dG8tcXVpdCBvcHRpb24gb25seSB2YWxpZCBmb3Igb3V0Z29pbmcgIgorCSAgICAgICAibW9kZSAoVUFDKSBvbmx5XG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBJbml0IGxvZ2dpbmcgKi8KKyAgICBzdGF0dXMgPSBhcHBfbG9nZ2luZ19pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiAxOworCisgICAgLyogSW5pdCBTSVAgZXRjICovCisgICAgc3RhdHVzID0gaW5pdF9zaXAoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkluaXRpYWxpemF0aW9uIGhhcyBmYWlsZWQiLCBzdGF0dXMpOworCWRlc3Ryb3lfc2lwKCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgbW9kdWxlIHRvIGxvZyBpbmNvbWluZy9vdXRnb2luZyBtZXNzYWdlcyAqLworICAgIHBqc2lwX2VuZHB0X3JlZ2lzdGVyX21vZHVsZShhcHAuc2lwX2VuZHB0LCAmbXNnX2xvZ2dlcik7CisKKyAgICAvKiBJbml0IG1lZGlhICovCisgICAgc3RhdHVzID0gaW5pdF9tZWRpYSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiTWVkaWEgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwgc3RhdHVzKTsKKwlkZXN0cm95X3NpcCgpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIFN0YXJ0IHdvcmtlciB0aHJlYWRzICovCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBmb3IgKGk9MDsgaTxhcHAudGhyZWFkX2NvdW50OyArK2kpIHsKKwlwal90aHJlYWRfY3JlYXRlKCBhcHAucG9vbCwgImFwcCIsICZzaXBfd29ya2VyX3RocmVhZCwgTlVMTCwKKwkJCSAgMCwgMCwgJmFwcC5zaXBfdGhyZWFkW2ldKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIFVSTCBpcyBzcGVjaWZpZWQsIHRoZW4gbWFrZSBjYWxsIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKGFwcC51cmlfdG9fY2FsbC5zbGVuKSB7CisJdW5zaWduZWQgaTsKKworCVBKX0xPRygzLChUSElTX0ZJTEUsICJNYWtpbmcgJWQgY2FsbHMgdG8gJXMuLiIsIGFwcC5tYXhfY2FsbHMsCisJCSAgYXBwLnVyaV90b19jYWxsLnB0cikpOworCisJZm9yIChpPTA7IGk8YXBwLm1heF9jYWxsczsgKytpKSB7CisJICAgIHN0YXR1cyA9IG1ha2VfY2FsbCgmYXBwLnVyaV90b19jYWxsKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiRXJyb3IgbWFraW5nIGNhbGwiLCBzdGF0dXMpOworCQlicmVhazsKKwkgICAgfQorCSAgICBwal90aHJlYWRfc2xlZXAoYXBwLmNhbGxfZ2FwKTsKKwl9CisKKwlpZiAoYXBwLmF1dG9fcXVpdCkgeworCSAgICAvKiBXYWl0IGZvciBjYWxscyB0byBjb21wbGV0ZSAqLworCSAgICB3aGlsZSAoYXBwLnVhY19jYWxscyA8IGFwcC5tYXhfY2FsbHMpCisJCXBqX3RocmVhZF9zbGVlcCgxMDApOworCSAgICBwal90aHJlYWRfc2xlZXAoMjAwKTsKKwl9IGVsc2UgeworI2lmIFBKX0hBU19USFJFQURTCisJICAgIC8qIFN0YXJ0IHVzZXIgaW50ZXJmYWNlIGxvb3AgKi8KKwkgICAgY29uc29sZV9tYWluKCk7CisjZW5kaWYKKwl9CisKKyAgICB9IGVsc2UgeworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIlJlYWR5IGZvciBpbmNvbWluZyBjYWxscyAobWF4PSVkKSIsIAorCQkgIGFwcC5tYXhfY2FsbHMpKTsKKworI2lmIFBKX0hBU19USFJFQURTCisJLyogU3RhcnQgdXNlciBpbnRlcmZhY2UgbG9vcCAqLworCWNvbnNvbGVfbWFpbigpOworI2VuZGlmCisgICAgfQorCisjaWYgIVBKX0hBU19USFJFQURTCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlByZXNzIEN0cmwtQyB0byBxdWl0IikpOworICAgIGZvciAoOzspIHsKKwlwal90aW1lX3ZhbCB0ID0gezAsIDEwfTsKKwlwanNpcF9lbmRwdF9oYW5kbGVfZXZlbnRzKGFwcC5zaXBfZW5kcHQsICZ0KTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAvKiBTaHV0dGluZyBkb3duLi4uICovCisgICAgZGVzdHJveV9zaXAoKTsKKyAgICBkZXN0cm95X21lZGlhKCk7CisKKyAgICBpZiAoYXBwLnBvb2wpIHsKKwlwal9wb29sX3JlbGVhc2UoYXBwLnBvb2wpOworCWFwcC5wb29sID0gTlVMTDsKKwlwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmYXBwLmNwKTsKKyAgICB9CisKKyAgICBhcHBfbG9nZ2luZ19zaHV0ZG93bigpOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwcnRwX3JlcG9ydC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaXBydHBfcmVwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0M2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwcnRwX3JlcG9ydC5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiAkSWQ6IHNpcHJ0cF9yZXBvcnQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisKKy8qCisgKiBETyBOT1QgQ09NUElMRSBUSElTIEZJTEUgT04gSVRTIE9XTiEKKyAqCisgKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgc2lwcnRwLmMgdG8gaW1wbGVtZW50IHRoZSByZXBvcnRpbmcgY2FwYWJpbGl0eQorICogdG8gYSBzZXBhcmF0ZSBmaWxlLCBzbyB0aGF0IHVzZXIgY2FuIGltcGxlbWVudCBkaWZmZXJlbnQgcmVwb3J0aW5nCisgKiBmdW5jdGlvbmFsaXR5IChzdWNoIGFzIHdyaXRpbmcgdG8gWE1MIGZpbGUpLgorICovCisKKworc3RhdGljIHZvaWQgcHJpbnRfY2FsbChpbnQgY2FsbF9pbmRleCkKK3sKKyAgICBzdHJ1Y3QgY2FsbCAqY2FsbCA9ICZhcHAuY2FsbFtjYWxsX2luZGV4XTsKKyAgICBpbnQgbGVuOworICAgIHBqc2lwX2ludl9zZXNzaW9uICppbnYgPSBjYWxsLT5pbnY7CisgICAgcGpzaXBfZGlhbG9nICpkbGcgPSBpbnYtPmRsZzsKKyAgICBzdHJ1Y3QgbWVkaWFfc3RyZWFtICphdWRpbyA9ICZjYWxsLT5tZWRpYVswXTsKKyAgICBjaGFyIHVzZXJpbmZvWzEyOF07CisgICAgY2hhciBkdXJhdGlvbls4MF0sIGxhc3RfdXBkYXRlWzgwXTsKKyAgICBjaGFyIGJwc1sxNl0sIGlwYnBzWzE2XSwgcGFja2V0c1sxNl0sIGJ5dGVzWzE2XSwgaXBieXRlc1sxNl07CisgICAgdW5zaWduZWQgZGVjb3I7CisgICAgcGpfdGltZV92YWwgbm93OworCisKKyAgICBkZWNvciA9IHBqX2xvZ19nZXRfZGVjb3IoKTsKKyAgICBwal9sb2dfc2V0X2RlY29yKFBKX0xPR19IQVNfTkVXTElORSk7CisKKyAgICBwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKyAgICBpZiAoYXBwLnJlcG9ydF9maWxlbmFtZSkKKwlwdXRzKGFwcC5yZXBvcnRfZmlsZW5hbWUpOworCisgICAgLyogUHJpbnQgZHVyYXRpb24gKi8KKyAgICBpZiAoaW52LT5zdGF0ZSA+PSBQSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVEICYmIGNhbGwtPmNvbm5lY3RfdGltZS5zZWMpIHsKKworCVBKX1RJTUVfVkFMX1NVQihub3csIGNhbGwtPmNvbm5lY3RfdGltZSk7CisKKwlzcHJpbnRmKGR1cmF0aW9uLCAiIFtkdXJhdGlvbjogJTAybGQ6JTAybGQ6JTAybGQuJTAzbGRdIiwKKwkJbm93LnNlYyAvIDM2MDAsCisJCShub3cuc2VjICUgMzYwMCkgLyA2MCwKKwkJKG5vdy5zZWMgJSA2MCksCisJCW5vdy5tc2VjKTsKKworICAgIH0gZWxzZSB7CisJZHVyYXRpb25bMF0gPSAnXDAnOworICAgIH0KKworCisKKyAgICAvKiBDYWxsIG51bWJlciBhbmQgc3RhdGUgKi8KKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwKKwkgICAgICAiQ2FsbCAjJWQ6ICVzJXMiLCAKKwkgICAgICBjYWxsX2luZGV4LCBwanNpcF9pbnZfc3RhdGVfbmFtZShpbnYtPnN0YXRlKSwgCisJICAgICAgZHVyYXRpb24pKTsKKworCisKKyAgICAvKiBDYWxsIGlkZW50aWZpY2F0aW9uICovCisgICAgbGVuID0gcGpzaXBfaGRyX3ByaW50X29uKGRsZy0+cmVtb3RlLmluZm8sIHVzZXJpbmZvLCBzaXplb2YodXNlcmluZm8pKTsKKyAgICBpZiAobGVuIDwgMCkKKwlwal9hbnNpX3N0cmNweSh1c2VyaW5mbywgIjwtLXVyaSB0b28gbG9uZy0tPiIpOworICAgIGVsc2UKKwl1c2VyaW5mb1tsZW5dID0gJ1wwJzsKKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiICAgJXMiLCB1c2VyaW5mbykpOworCisKKyAgICBpZiAoY2FsbC0+aW52ID09IE5VTEwgfHwgY2FsbC0+aW52LT5zdGF0ZSA8IFBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQgfHwKKwljYWxsLT5jb25uZWN0X3RpbWUuc2VjID09IDApIAorICAgIHsKKwlwal9sb2dfc2V0X2RlY29yKGRlY29yKTsKKwlyZXR1cm47CisgICAgfQorCisKKyAgICAvKiBTaWduYWxpbmcgcXVhbGl0eSAqLworICAgIHsKKwljaGFyIHBkZFs2NF0sIGNvbm5lY3RkZWxheVs2NF07CisJcGpfdGltZV92YWwgdDsKKworCWlmIChjYWxsLT5yZXNwb25zZV90aW1lLnNlYykgeworCSAgICB0ID0gY2FsbC0+cmVzcG9uc2VfdGltZTsKKwkgICAgUEpfVElNRV9WQUxfU1VCKHQsIGNhbGwtPnN0YXJ0X3RpbWUpOworCSAgICBzcHJpbnRmKHBkZCwgImdvdCAxc3QgcmVzcG9uc2UgaW4gJWxkIG1zIiwgUEpfVElNRV9WQUxfTVNFQyh0KSk7CisJfSBlbHNlIHsKKwkgICAgcGRkWzBdID0gJ1wwJzsKKwl9CisKKwlpZiAoY2FsbC0+Y29ubmVjdF90aW1lLnNlYykgeworCSAgICB0ID0gY2FsbC0+Y29ubmVjdF90aW1lOworCSAgICBQSl9USU1FX1ZBTF9TVUIodCwgY2FsbC0+c3RhcnRfdGltZSk7CisJICAgIHNwcmludGYoY29ubmVjdGRlbGF5LCAiLCBjb25uZWN0ZWQgYWZ0ZXI6ICVsZCBtcyIsIAorCQkgICAgUEpfVElNRV9WQUxfTVNFQyh0KSk7CisJfSBlbHNlIHsKKwkgICAgY29ubmVjdGRlbGF5WzBdID0gJ1wwJzsKKwl9CisKKwlQSl9MT0coMywgKFRISVNfRklMRSwgCisJCSAgICIgICBTaWduYWxpbmcgcXVhbGl0eTogJXMlcyIsIHBkZCwgY29ubmVjdGRlbGF5KSk7CisgICAgfQorCisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwKKwkgICAgICAgIiAgIFN0cmVhbSAjMDogYXVkaW8gJS4qc0AlZEh6LCAlZG1zL2ZyYW1lLCAlc0IvcyAoJXNCL3MgK0lQIGhkcikiLAorICAgCShpbnQpYXVkaW8tPnNpLmZtdC5lbmNvZGluZ19uYW1lLnNsZW4sCisJYXVkaW8tPnNpLmZtdC5lbmNvZGluZ19uYW1lLnB0ciwKKwlhdWRpby0+Y2xvY2tfcmF0ZSwKKwlhdWRpby0+c2FtcGxlc19wZXJfZnJhbWUgKiAxMDAwIC8gYXVkaW8tPmNsb2NrX3JhdGUsCisJZ29vZF9udW1iZXIoYnBzLCBhdWRpby0+Ynl0ZXNfcGVyX2ZyYW1lICogYXVkaW8tPmNsb2NrX3JhdGUgLyBhdWRpby0+c2FtcGxlc19wZXJfZnJhbWUpLAorCWdvb2RfbnVtYmVyKGlwYnBzLCAoYXVkaW8tPmJ5dGVzX3Blcl9mcmFtZSszMikgKiBhdWRpby0+Y2xvY2tfcmF0ZSAvIGF1ZGlvLT5zYW1wbGVzX3Blcl9mcmFtZSkpKTsKKworICAgIGlmIChhdWRpby0+cnRjcC5zdGF0LnJ4LnVwZGF0ZV9jbnQgPT0gMCkKKwlzdHJjcHkobGFzdF91cGRhdGUsICJuZXZlciIpOworICAgIGVsc2UgeworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlQSl9USU1FX1ZBTF9TVUIobm93LCBhdWRpby0+cnRjcC5zdGF0LnJ4LnVwZGF0ZSk7CisJc3ByaW50ZihsYXN0X3VwZGF0ZSwgIiUwMmxkaDolMDJsZG06JTAybGQuJTAzbGRzIGFnbyIsCisJCW5vdy5zZWMgLyAzNjAwLAorCQkobm93LnNlYyAlIDM2MDApIC8gNjAsCisJCW5vdy5zZWMgJSA2MCwKKwkJbm93Lm1zZWMpOworICAgIH0KKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAKKwkgICAiICAgICAgICAgICAgICBSWCBzdGF0IGxhc3QgdXBkYXRlOiAlc1xuIgorCSAgICIgICAgICAgICAgICAgICAgIHRvdGFsICVzIHBhY2tldHMgJXNCIHJlY2VpdmVkICglc0IgK0lQIGhkciklc1xuIgorCSAgICIgICAgICAgICAgICAgICAgIHBrdCBsb3NzPSVkICglMy4xZiUlKSwgZHVwPSVkICglMy4xZiUlKSwgcmVvcmRlcj0lZCAoJTMuMWYlJSklc1xuIgorCSAgICIgICAgICAgICAgICAgICAgICAgICAgIChtc2VjKSAgICBtaW4gICAgIGF2ZyAgICAgbWF4ICAgICBsYXN0XG4iCisJICAgIiAgICAgICAgICAgICAgICAgbG9zcyBwZXJpb2Q6ICU3LjNmICU3LjNmICU3LjNmICU3LjNmJXNcbiIKKwkgICAiICAgICAgICAgICAgICAgICBqaXR0ZXIgICAgIDogJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2YlcyIsCisJICAgbGFzdF91cGRhdGUsCisJICAgZ29vZF9udW1iZXIocGFja2V0cywgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5wa3QpLAorCSAgIGdvb2RfbnVtYmVyKGJ5dGVzLCBhdWRpby0+cnRjcC5zdGF0LnJ4LmJ5dGVzKSwKKwkgICBnb29kX251bWJlcihpcGJ5dGVzLCBhdWRpby0+cnRjcC5zdGF0LnJ4LmJ5dGVzICsgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5wa3QgKiAzMiksCisJICAgIiIsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucngubG9zcyAqIDEwMC4wIC8gKGF1ZGlvLT5ydGNwLnN0YXQucngucGt0ICsgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzKSwKKwkgICBhdWRpby0+cnRjcC5zdGF0LnJ4LmR1cCwgCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5kdXAgKiAxMDAuMCAvIChhdWRpby0+cnRjcC5zdGF0LnJ4LnBrdCArIGF1ZGlvLT5ydGNwLnN0YXQucngubG9zcyksCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5yZW9yZGVyLCAKKwkgICBhdWRpby0+cnRjcC5zdGF0LnJ4LnJlb3JkZXIgKiAxMDAuMCAvIChhdWRpby0+cnRjcC5zdGF0LnJ4LnBrdCArIGF1ZGlvLT5ydGNwLnN0YXQucngubG9zcyksCisJICAgIiIsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzX3BlcmlvZC5taW4gLyAxMDAwLjAsIAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucngubG9zc19wZXJpb2QubWVhbiAvIDEwMDAuMCwgCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzX3BlcmlvZC5tYXggLyAxMDAwLjAsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5yeC5sb3NzX3BlcmlvZC5sYXN0IC8gMTAwMC4wLAorCSAgICIiLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucnguaml0dGVyLm1pbiAvIDEwMDAuMCwKKwkgICBhdWRpby0+cnRjcC5zdGF0LnJ4LmppdHRlci5tZWFuIC8gMTAwMC4wLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucnguaml0dGVyLm1heCAvIDEwMDAuMCwKKwkgICBhdWRpby0+cnRjcC5zdGF0LnJ4LmppdHRlci5sYXN0IC8gMTAwMC4wLAorCSAgICIiCisJICAgKSk7CisKKworICAgIGlmIChhdWRpby0+cnRjcC5zdGF0LnR4LnVwZGF0ZV9jbnQgPT0gMCkKKwlzdHJjcHkobGFzdF91cGRhdGUsICJuZXZlciIpOworICAgIGVsc2UgeworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlQSl9USU1FX1ZBTF9TVUIobm93LCBhdWRpby0+cnRjcC5zdGF0LnR4LnVwZGF0ZSk7CisJc3ByaW50ZihsYXN0X3VwZGF0ZSwgIiUwMmxkaDolMDJsZG06JTAybGQuJTAzbGRzIGFnbyIsCisJCW5vdy5zZWMgLyAzNjAwLAorCQkobm93LnNlYyAlIDM2MDApIC8gNjAsCisJCW5vdy5zZWMgJSA2MCwKKwkJbm93Lm1zZWMpOworICAgIH0KKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLAorCSAgICIgICAgICAgICAgICAgIFRYIHN0YXQgbGFzdCB1cGRhdGU6ICVzXG4iCisJICAgIiAgICAgICAgICAgICAgICAgdG90YWwgJXMgcGFja2V0cyAlc0Igc2VudCAoJXNCICtJUCBoZHIpJXNcbiIKKwkgICAiICAgICAgICAgICAgICAgICBwa3QgbG9zcz0lZCAoJTMuMWYlJSksIGR1cD0lZCAoJTMuMWYlJSksIHJlb3JkZXI9JWQgKCUzLjFmJSUpJXNcbiIKKwkgICAiICAgICAgICAgICAgICAgICAgICAgICAobXNlYykgICAgbWluICAgICBhdmcgICAgIG1heCAgICAgbGFzdFxuIgorCSAgICIgICAgICAgICAgICAgICAgIGxvc3MgcGVyaW9kOiAlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiVzXG4iCisJICAgIiAgICAgICAgICAgICAgICAgaml0dGVyICAgICA6ICU3LjNmICU3LjNmICU3LjNmICU3LjNmJXMiLAorCSAgIGxhc3RfdXBkYXRlLAorCSAgIGdvb2RfbnVtYmVyKHBhY2tldHMsIGF1ZGlvLT5ydGNwLnN0YXQudHgucGt0KSwKKwkgICBnb29kX251bWJlcihieXRlcywgYXVkaW8tPnJ0Y3Auc3RhdC50eC5ieXRlcyksCisJICAgZ29vZF9udW1iZXIoaXBieXRlcywgYXVkaW8tPnJ0Y3Auc3RhdC50eC5ieXRlcyArIGF1ZGlvLT5ydGNwLnN0YXQudHgucGt0ICogMzIpLAorCSAgICIiLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zcywKKwkgICBhdWRpby0+cnRjcC5zdGF0LnR4Lmxvc3MgKiAxMDAuMCAvIChhdWRpby0+cnRjcC5zdGF0LnR4LnBrdCArIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zcyksCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC50eC5kdXAsIAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHguZHVwICogMTAwLjAgLyAoYXVkaW8tPnJ0Y3Auc3RhdC50eC5wa3QgKyBhdWRpby0+cnRjcC5zdGF0LnR4Lmxvc3MpLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHgucmVvcmRlciwgCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC50eC5yZW9yZGVyICogMTAwLjAgLyAoYXVkaW8tPnJ0Y3Auc3RhdC50eC5wa3QgKyBhdWRpby0+cnRjcC5zdGF0LnR4Lmxvc3MpLAorCSAgICIiLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zc19wZXJpb2QubWluIC8gMTAwMC4wLCAKKwkgICBhdWRpby0+cnRjcC5zdGF0LnR4Lmxvc3NfcGVyaW9kLm1lYW4gLyAxMDAwLjAsIAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zc19wZXJpb2QubWF4IC8gMTAwMC4wLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQudHgubG9zc19wZXJpb2QubGFzdCAvIDEwMDAuMCwKKwkgICAiIiwKKwkgICBhdWRpby0+cnRjcC5zdGF0LnR4LmppdHRlci5taW4gLyAxMDAwLjAsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC50eC5qaXR0ZXIubWVhbiAvIDEwMDAuMCwKKwkgICBhdWRpby0+cnRjcC5zdGF0LnR4LmppdHRlci5tYXggLyAxMDAwLjAsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC50eC5qaXR0ZXIubGFzdCAvIDEwMDAuMCwKKwkgICAiIgorCSAgICkpOworCisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwKKwkgICAiICAgICAgICAgICAgIFJUVCBkZWxheSAgICAgIDogJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2Ylc1xuIiwgCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5ydHQubWluIC8gMTAwMC4wLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucnR0Lm1lYW4gLyAxMDAwLjAsCisJICAgYXVkaW8tPnJ0Y3Auc3RhdC5ydHQubWF4IC8gMTAwMC4wLAorCSAgIGF1ZGlvLT5ydGNwLnN0YXQucnR0Lmxhc3QgLyAxMDAwLjAsCisJICAgIiIKKwkgICApKTsKKworICAgIHBqX2xvZ19zZXRfZGVjb3IoZGVjb3IpOworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3NpcHN0YXRlbGVzcy5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaXBzdGF0ZWxlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU4OWE2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zaXBzdGF0ZWxlc3MuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogJElkOiBzaXBzdGF0ZWxlc3MuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKioKKyAqIHNpcGNvcmUuYworICoKKyAqIEEgc2ltcGxlIHByb2dyYW0gdG8gcmVzcG9uZCBhbnkgaW5jb21pbmcgcmVxdWVzdHMgKGV4Y2VwdCBBQ0ssIG9mIGNvdXJzZSEpCisgKiB3aXRoIGFueSBzdGF0dXMgY29kZSAodGFrZW4gZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnQsIHdpdGggdGhlIGRlZmF1bHQKKyAqIGlzIDUwMS9Ob3QgSW1wbGVtZW50ZWQpLgorICovCisKKworLyogSW5jbHVkZSBhbGwgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxwanNpcC5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorCisKKy8qIElmIHRoaXMgbWFjcm8gaXMgc2V0LCBVRFAgdHJhbnNwb3J0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXQgcG9ydCA1MDYwICovCisjZGVmaW5lIEhBU19VRFBfVFJBTlNQT1JUCisKKy8qIElmIHRoaXMgbWFjcm8gaXMgc2V0LCBUQ1AgdHJhbnNwb3J0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXQgcG9ydCA1MDYwICovCisjZGVmaW5lIEhBU19UQ1BfVFJBTlNQT1JUICAgKDEgJiYgUEpfSEFTX1RDUCkKKworLyogTG9nIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIFRISVNfRklMRQkic2lwc3RhdGVsZXNzLmMiCisKKworLyogR2xvYmFsIFNJUCBlbmRwb2ludCAqLworc3RhdGljIHBqc2lwX2VuZHBvaW50ICpzaXBfZW5kcHQ7CisKKy8qIFdoYXQgcmVzcG9uc2UgY29kZSB0byBiZSBzZW50IChkZWZhdWx0IGlzIDUwMS9Ob3QgSW1wbGVtZW50ZWQpICovCitzdGF0aWMgaW50IGNvZGUgPSBQSlNJUF9TQ19OT1RfSU1QTEVNRU5URUQ7CisKKy8qIEFkZGl0aW9uYWwgaGVhZGVyIGxpc3QgKi8KK3N0cnVjdCBwanNpcF9oZHIgaGRyX2xpc3Q7CisKKy8qIHVzYWdlKCkgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgcHV0cygiVXNhZ2U6Iik7CisgICAgcHV0cygiICBzaXBzdGF0ZWxlc3MgW2NvZGVdIFstSCBIRFJdIC4uIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiT3B0aW9uczoiKTsKKyAgICBwdXRzKCIgIGNvZGUgICAgIFNJUCBzdGF0dXMgY29kZSB0byBzZW5kIChkZWZhdWx0OiA1MDEvTm90IEltcGxlbWVudGVkIik7CisgICAgcHV0cygiICAtSCBIRFIgICBTcGVjaWZ5IGFkZGl0aW9uYWwgaGVhZGVycyB0byBzZW5kIHdpdGggcmVzcG9uc2UiKTsKKyAgICBwdXRzKCIgICAgICAgICAgIFRoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuIik7CisgICAgcHV0cygiICAgICAgICAgICBFeGFtcGxlOiIpOworICAgIHB1dHMoIiAgICAgICAgICAgICAgLUggJ0V4cGlyZXM6IDMwMCcgLUggJ0NvbnRhY3Q6IDxzaXA6bG9jYWxob3N0PiciKTsgCit9CisKKworLyogQ2FsbGJhY2sgdG8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RzLiAqLworc3RhdGljIHBqX2Jvb2xfdCBvbl9yeF9yZXF1ZXN0KCBwanNpcF9yeF9kYXRhICpyZGF0YSApCit7CisgICAgLyogUmVzcG9uZCAoc3RhdGVsZXNzbHkpIGFsbCBpbmNvbWluZyByZXF1ZXN0cyAoZXhjZXB0IEFDSyEpIAorICAgICAqIHdpdGggNTAxIChOb3QgSW1wbGVtZW50ZWQpCisgICAgICovCisgICAgaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCAhPSBQSlNJUF9BQ0tfTUVUSE9EKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoIHNpcF9lbmRwdCwgcmRhdGEsIAorCQkJCSAgICAgICBjb2RlLCBOVUxMLAorCQkJCSAgICAgICAmaGRyX2xpc3QsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisKKy8qCisgKiBtYWluKCkKKyAqCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisgICAgcGpzaXBfbW9kdWxlIG1vZF9hcHAgPQorICAgIHsKKwlOVUxMLCBOVUxMLAkJICAgIC8qIHByZXYsIG5leHQuCQkqLworCXsgIm1vZC1hcHAiLCA3IH0sCSAgICAvKiBOYW1lLgkJCSovCisJLTEsCQkJCSAgICAvKiBJZAkJKi8KKwlQSlNJUF9NT0RfUFJJT1JJVFlfQVBQTElDQVRJT04sIC8qIFByaW9yaXR5CQkqLworCU5VTEwsCQkJICAgIC8qIGxvYWQoKQkJCSovCisJTlVMTCwJCQkgICAgLyogc3RhcnQoKQkJCSovCisJTlVMTCwJCQkgICAgLyogc3RvcCgpCQkJKi8KKwlOVUxMLAkJCSAgICAvKiB1bmxvYWQoKQkJCSovCisJJm9uX3J4X3JlcXVlc3QsCQkgICAgLyogb25fcnhfcmVxdWVzdCgpCQkqLworCU5VTEwsCQkJICAgIC8qIG9uX3J4X3Jlc3BvbnNlKCkJCSovCisJTlVMTCwJCQkgICAgLyogb25fdHhfcmVxdWVzdC4JCSovCisJTlVMTCwJCQkgICAgLyogb25fdHhfcmVzcG9uc2UoKQkJKi8KKwlOVUxMLAkJCSAgICAvKiBvbl90c3hfc3RhdGUoKQkJKi8KKyAgICB9OworICAgIGludCBjOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICAKKyAgICAvKiBNdXN0IGluaXQgUEpMSUIgZmlyc3Q6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBUaGVuIGluaXQgUEpMSUItVVRJTDogKi8KKyAgICBzdGF0dXMgPSBwamxpYl91dGlsX2luaXQoKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIC8qIE11c3QgY3JlYXRlIGEgcG9vbCBmYWN0b3J5IGJlZm9yZSB3ZSBjYW4gYWxsb2NhdGUgYW55IG1lbW9yeS4gKi8KKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCgmY3AsICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3ksIDApOworCisgICAgLyogQ3JlYXRlIGdsb2JhbCBlbmRwb2ludDogKi8KKyAgICB7CisJLyogRW5kcG9pbnQgTVVTVCBiZSBhc3NpZ25lZCBhIGdsb2JhbGx5IHVuaXF1ZSBuYW1lLgorCSAqIElkZWFsbHkgd2Ugc2hvdWxkIHB1dCBob3N0bmFtZSBvciBwdWJsaWMgSVAgYWRkcmVzcywgYnV0CisJICogd2UnbGwganVzdCB1c2UgYW4gYXJiaXRyYXJ5IG5hbWUgaGVyZS4KKwkgKi8KKworCS8qIENyZWF0ZSB0aGUgZW5kcG9pbnQ6ICovCisJc3RhdHVzID0gcGpzaXBfZW5kcHRfY3JlYXRlKCZjcC5mYWN0b3J5LCAic2lwc3RhdGVsZXNzIiwgCisJCQkJICAgICZzaXBfZW5kcHQpOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworICAgIH0KKworICAgIC8qIFBhcnNlIGFyZ3VtZW50cyAqLworICAgIHBqX29wdGluZCA9IDA7CisgICAgcGpfbGlzdF9pbml0KCZoZHJfbGlzdCk7CisgICAgd2hpbGUgKChjPXBqX2dldG9wdChhcmdjLCBhcmd2ICwgIkg6IikpICE9IC0xKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnSCc6CisJICAgIGlmIChwb29sID09IE5VTEwpIHsKKwkJcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCZjcC5mYWN0b3J5LCAic2lwc3RhdGVsZXNzIiwgMTAwMCwgCisJCQkJICAgICAgMTAwMCwgTlVMTCk7CisJICAgIH0gCisJICAgIAorCSAgICBpZiAocG9vbCkgeworCQljaGFyICpuYW1lOworCQluYW1lID0gc3RydG9rKHBqX29wdGFyZywgIjoiKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkgeworCQkgICAgcHV0cygiRXJyb3I6IGludmFsaWQgaGVhZGVyIGZvcm1hdCIpOworCQkgICAgcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCSAgICBjaGFyICp2YWwgPSBzdHJ0b2soTlVMTCwgIlxyXG4iKTsKKwkJICAgIHBqc2lwX2dlbmVyaWNfc3RyaW5nX2hkciAqaDsKKwkJICAgIHBqX3N0cl90IGhuYW1lLCBodmFsdWU7CisKKwkJICAgIGhuYW1lID0gcGpfc3RyKG5hbWUpOworCQkgICAgaHZhbHVlID0gcGpfc3RyKHZhbCk7CisKKwkJICAgIGggPSBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfY3JlYXRlKHBvb2wsICZobmFtZSwgJmh2YWx1ZSk7CisKKwkJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZoZHJfbGlzdCwgaCk7CisKKwkJICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJIZWFkZXIgJXM6ICVzIGFkZGVkIiwgbmFtZSwgdmFsKSk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwdXRzKCJFcnJvcjogaW52YWxpZCBhcmd1bWVudCIpOworCSAgICB1c2FnZSgpOworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgaWYgKHBqX29wdGluZCAhPSBhcmdjKSB7CisJY29kZSA9IGF0b2koYXJndltwal9vcHRpbmRdKTsKKwlpZiAoY29kZSA8IDIwMCB8fCBjb2RlID4gNjk5KSB7CisJICAgIHB1dHMoIkVycm9yOiBpbnZhbGlkIHN0YXR1cyBjb2RlIik7CisJICAgIHVzYWdlKCk7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiUmV0dXJuaW5nICVkIHRvIGluY29taW5nIHJlcXVlc3RzIiwgY29kZSkpOworCisKKyAgICAvKiAKKyAgICAgKiBBZGQgVURQIHRyYW5zcG9ydCwgd2l0aCBoYXJkLWNvZGVkIHBvcnQgCisgICAgICovCisjaWZkZWYgSEFTX1VEUF9UUkFOU1BPUlQKKyAgICB7CisJcGpfc29ja2FkZHJfaW4gYWRkcjsKKworCWFkZHIuc2luX2ZhbWlseSA9IHBqX0FGX0lORVQoKTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IDA7CisJYWRkci5zaW5fcG9ydCA9IHBqX2h0b25zKDUwNjApOworCisJc3RhdHVzID0gcGpzaXBfdWRwX3RyYW5zcG9ydF9zdGFydCggc2lwX2VuZHB0LCAmYWRkciwgTlVMTCwgMSwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIAorCQkgICAgICAiRXJyb3Igc3RhcnRpbmcgVURQIHRyYW5zcG9ydCAocG9ydCBpbiB1c2U/KSIpKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgSEFTX1RDUF9UUkFOU1BPUlQKKyAgICAvKiAKKyAgICAgKiBBZGQgVURQIHRyYW5zcG9ydCwgd2l0aCBoYXJkLWNvZGVkIHBvcnQgCisgICAgICovCisgICAgeworCXBqX3NvY2thZGRyX2luIGFkZHI7CisKKwlhZGRyLnNpbl9mYW1pbHkgPSBwal9BRl9JTkVUKCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwOworCWFkZHIuc2luX3BvcnQgPSBwal9odG9ucyg1MDYwKTsKKworCXN0YXR1cyA9IHBqc2lwX3RjcF90cmFuc3BvcnRfc3RhcnQoc2lwX2VuZHB0LCAmYWRkciwgMSwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIAorCQkgICAgICAiRXJyb3Igc3RhcnRpbmcgVENQIHRyYW5zcG9ydCAocG9ydCBpbiB1c2U/KSIpKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBSZWdpc3RlciBvdXIgbW9kdWxlIHRvIHJlY2VpdmUgaW5jb21pbmcgcmVxdWVzdHMuCisgICAgICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfcmVnaXN0ZXJfbW9kdWxlKCBzaXBfZW5kcHQsICZtb2RfYXBwKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogRG9uZS4gTG9vcCBmb3JldmVyIHRvIGhhbmRsZSBpbmNvbWluZyBldmVudHMuICovCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIlByZXNzIEN0cmwtQyB0byBxdWl0Li4iKSk7CisKKyAgICBmb3IgKDs7KSB7CisJcGpzaXBfZW5kcHRfaGFuZGxlX2V2ZW50cyhzaXBfZW5kcHQsIE5VTEwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RhdGVmdWxfcHJveHkuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RhdGVmdWxfcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg0MzUzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zdGF0ZWZ1bF9wcm94eS5jCkBAIC0wLDAgKzEsNTg3IEBACisvKiAkSWQ6IHN0YXRlZnVsX3Byb3h5LmMgNDQyMCAyMDEzLTAzLTA1IDExOjU5OjU0WiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjZGVmaW5lIFRISVNfRklMRSAgICJzdGF0ZWZ1bF9wcm94eS5jIgorCisvKiBDb21tb24gcHJveHkgZnVuY3Rpb25zICovCisjZGVmaW5lIFNUQVRFRlVMICAgIDEKKyNpbmNsdWRlICJwcm94eS5oIgorCisKKy8qCisgKiBtb2Rfc3RhdGVmdWxfcHJveHkgaXMgdGhlIG1vZHVsZSB0byByZWNlaXZlIFNJUCByZXF1ZXN0IGFuZAorICogcmVzcG9uc2UgbWVzc2FnZSB0aGF0IGlzIG91dHNpZGUgYW55IHRyYW5zYWN0aW9uIGNvbnRleHQuCisgKi8KK3N0YXRpYyBwal9ib29sX3QgcHJveHlfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSApOworc3RhdGljIHBqX2Jvb2xfdCBwcm94eV9vbl9yeF9yZXNwb25zZShwanNpcF9yeF9kYXRhICpyZGF0YSApOworCitzdGF0aWMgcGpzaXBfbW9kdWxlIG1vZF9zdGF0ZWZ1bF9wcm94eSA9Cit7CisgICAgTlVMTCwgTlVMTCwJCQkJLyogcHJldiwgbmV4dC4JCSovCisgICAgeyAibW9kLXN0YXRlZnVsLXByb3h5IiwgMTggfSwJLyogTmFtZS4JCSovCisgICAgLTEsCQkJCQkvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX1VBX1BST1hZX0xBWUVSLAkvKiBQcmlvcml0eQkJKi8KKyAgICBOVUxMLAkJCQkvKiBsb2FkKCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RhcnQoKQkJKi8KKyAgICBOVUxMLAkJCQkvKiBzdG9wKCkJCSovCisgICAgTlVMTCwJCQkJLyogdW5sb2FkKCkJCSovCisgICAgJnByb3h5X29uX3J4X3JlcXVlc3QsCQkvKiBvbl9yeF9yZXF1ZXN0KCkJKi8KKyAgICAmcHJveHlfb25fcnhfcmVzcG9uc2UsCQkvKiBvbl9yeF9yZXNwb25zZSgpCSovCisgICAgTlVMTCwJCQkJLyogb25fdHhfcmVxdWVzdC4JKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90eF9yZXNwb25zZSgpCSovCisgICAgTlVMTCwJCQkJLyogb25fdHN4X3N0YXRlKCkJKi8KK307CisKKworLyoKKyAqIG1vZF90dSAodHU9VHJhbnNhY3Rpb24gVXNlcikgaXMgdGhlIG1vZHVsZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgorICogZnJvbSB0cmFuc2FjdGlvbiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQgdHVfb25fdHN4X3N0YXRlKHBqc2lwX3RyYW5zYWN0aW9uICp0c3gsIHBqc2lwX2V2ZW50ICpldmVudCk7CisKK3N0YXRpYyBwanNpcF9tb2R1bGUgbW9kX3R1ID0KK3sKKyAgICBOVUxMLCBOVUxMLAkJCQkvKiBwcmV2LCBuZXh0LgkJKi8KKyAgICB7ICJtb2QtdHJhbnNhY3Rpb24tdXNlciIsIDIwIH0sCS8qIE5hbWUuCQkqLworICAgIC0xLAkJCQkJLyogSWQJCQkqLworICAgIFBKU0lQX01PRF9QUklPUklUWV9BUFBMSUNBVElPTiwJLyogUHJpb3JpdHkJCSovCisgICAgTlVMTCwJCQkJLyogbG9hZCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0YXJ0KCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RvcCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHVubG9hZCgpCQkqLworICAgIE5VTEwsCQkJCS8qIG9uX3J4X3JlcXVlc3QoKQkqLworICAgIE5VTEwsCQkJCS8qIG9uX3J4X3Jlc3BvbnNlKCkJKi8KKyAgICBOVUxMLAkJCQkvKiBvbl90eF9yZXF1ZXN0LgkqLworICAgIE5VTEwsCQkJCS8qIG9uX3R4X3Jlc3BvbnNlKCkJKi8KKyAgICAmdHVfb25fdHN4X3N0YXRlLAkJCS8qIG9uX3RzeF9zdGF0ZSgpCSovCit9OworCisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgVUFDIHRyYW5zYWN0aW9uICovCitzdHJ1Y3QgdWFjX2RhdGEKK3sKKyAgICBwanNpcF90cmFuc2FjdGlvbgkqdWFzX3RzeDsKKyAgICBwal90aW1lcl9lbnRyeQkgdGltZXI7Cit9OworCisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgVUFTIHRyYW5zYWN0aW9uICovCitzdHJ1Y3QgdWFzX2RhdGEKK3sKKyAgICBwanNpcF90cmFuc2FjdGlvbgkqdWFjX3RzeDsKK307CisKKworCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zdGF0ZWZ1bF9wcm94eSh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3JlZ2lzdGVyX21vZHVsZSggZ2xvYmFsLmVuZHB0LCAmbW9kX3N0YXRlZnVsX3Byb3h5KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3JlZ2lzdGVyX21vZHVsZSggZ2xvYmFsLmVuZHB0LCAmbW9kX3R1KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgbmV3IGluY29taW5nIHJlcXVlc3RzLiAqLworc3RhdGljIHBqX2Jvb2xfdCBwcm94eV9vbl9yeF9yZXF1ZXN0KCBwanNpcF9yeF9kYXRhICpyZGF0YSApCit7CisgICAgcGpzaXBfdHJhbnNhY3Rpb24gKnVhc190c3gsICp1YWNfdHN4OworICAgIHN0cnVjdCB1YWNfZGF0YSAqdWFjX2RhdGE7CisgICAgc3RydWN0IHVhc19kYXRhICp1YXNfZGF0YTsKKyAgICBwanNpcF90eF9kYXRhICp0ZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAocmRhdGEtPm1zZ19pbmZvLm1zZy0+bGluZS5yZXEubWV0aG9kLmlkICE9IFBKU0lQX0NBTkNFTF9NRVRIT0QpIHsKKworCS8qIFZlcmlmeSBpbmNvbWluZyByZXF1ZXN0ICovCisJc3RhdHVzID0gcHJveHlfdmVyaWZ5X3JlcXVlc3QocmRhdGEpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCJSWCBpbnZhbGlkIHJlcXVlc3QiLCBzdGF0dXMpOworCSAgICByZXR1cm4gUEpfVFJVRTsKKwl9CisKKwkvKgorCSAqIFJlcXVlc3QgbG9va3Mgc2FuZSwgbmV4dCBjbG9uZSB0aGUgcmVxdWVzdCB0byBjcmVhdGUgdHJhbnNtaXQgZGF0YS4KKwkgKi8KKwlzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGVfcmVxdWVzdF9md2QoZ2xvYmFsLmVuZHB0LCByZGF0YSwgTlVMTCwKKwkJCQkJCU5VTEwsIDAsICZ0ZGF0YSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKGdsb2JhbC5lbmRwdCwgcmRhdGEsCisJCQkJCSAgUEpTSVBfU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAKKwkJCQkJICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisKKwkvKiBQcm9jZXNzIHJvdXRpbmcgKi8KKwlzdGF0dXMgPSBwcm94eV9wcm9jZXNzX3JvdXRpbmcodGRhdGEpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCJFcnJvciBwcm9jZXNzaW5nIHJvdXRlIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisJLyogQ2FsY3VsYXRlIHRhcmdldCAqLworCXN0YXR1cyA9IHByb3h5X2NhbGN1bGF0ZV90YXJnZXQocmRhdGEsIHRkYXRhKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiRXJyb3IgY2FsY3VsYXRpbmcgdGFyZ2V0Iiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisJLyogRXZlcnl0aGluZyBpcyBzZXQgdG8gZm9yd2FyZCB0aGUgcmVxdWVzdC4gKi8KKworCS8qIElmIHRoaXMgaXMgYW4gQUNLIHJlcXVlc3QsIGZvcndhcmQgc3RhdGVsZXNzbHkuCisJICogVGhpcyBoYXBwZW5zIGlmIHRoZSBwcm94eSByZWNvcmRzIHJvdXRlIGFuZCB0aGlzIEFDSworCSAqIGlzIHNlbnQgZm9yIDJ4eCByZXNwb25zZS4gQW4gQUNLIHRoYXQgaXMgc2VudCBmb3Igbm9uLTJ4eAorCSAqIGZpbmFsIHJlc3BvbnNlIHdpbGwgYmUgYWJzb3JiZWQgYnkgdHJhbnNhY3Rpb24gbGF5ZXIsIGFuZAorCSAqIGl0IHdpbGwgbm90IGJlIHJlY2VpdmVkIGJ5IG9uX3J4X3JlcXVlc3QoKSBjYWxsYmFjay4KKwkgKi8KKwlpZiAodGRhdGEtPm1zZy0+bGluZS5yZXEubWV0aG9kLmlkID09IFBKU0lQX0FDS19NRVRIT0QpIHsKKwkgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfc2VuZF9yZXF1ZXN0X3N0YXRlbGVzcyhnbG9iYWwuZW5kcHQsIHRkYXRhLCAKKwkJCQkJCQlOVUxMLCBOVUxMKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoIkVycm9yIGZvcndhcmRpbmcgcmVxdWVzdCIsIHN0YXR1cyk7CisJCXJldHVybiBQSl9UUlVFOworCSAgICB9CisKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisJLyogQ3JlYXRlIFVBQyB0cmFuc2FjdGlvbiBmb3IgZm9yd2FyZGluZyB0aGUgcmVxdWVzdC4gCisJICogU2V0IG91ciBtb2R1bGUgYXMgdGhlIHRyYW5zYWN0aW9uIHVzZXIgdG8gcmVjZWl2ZSBmdXJ0aGVyCisJICogZXZlbnRzIGZyb20gdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlzdGF0dXMgPSBwanNpcF90c3hfY3JlYXRlX3VhYygmbW9kX3R1LCB0ZGF0YSwgJnVhY190c3gpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwanNpcF90eF9kYXRhX2RlY19yZWYodGRhdGEpOworCSAgICBwanNpcF9lbmRwdF9yZXNwb25kX3N0YXRlbGVzcyhnbG9iYWwuZW5kcHQsIHJkYXRhLCAKKwkJCQkJICBQSlNJUF9TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsIAorCQkJCQkgIE5VTEwsIE5VTEwsIE5VTEwpOworCSAgICByZXR1cm4gUEpfVFJVRTsKKwl9CisKKwkvKiBDcmVhdGUgVUFTIHRyYW5zYWN0aW9uIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0ICovCisJc3RhdHVzID0gcGpzaXBfdHN4X2NyZWF0ZV91YXMoJm1vZF90dSwgcmRhdGEsICZ1YXNfdHN4KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpzaXBfdHhfZGF0YV9kZWNfcmVmKHRkYXRhKTsKKwkgICAgcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoZ2xvYmFsLmVuZHB0LCByZGF0YSwgCisJCQkJCSAgUEpTSVBfU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAKKwkJCQkJICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkgICAgcGpzaXBfdHN4X3Rlcm1pbmF0ZSh1YWNfdHN4LCBQSlNJUF9TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCSAgICByZXR1cm4gUEpfVFJVRTsKKwl9CisKKwkvKiBGZWVkIHRoZSByZXF1ZXN0IHRvIHRoZSBVQVMgdHJhbnNhY3Rpb24gdG8gZHJpdmUgaXQncyBzdGF0ZSAKKwkgKiBvdXQgb2YgTlVMTCBzdGF0ZS4gCisJICovCisJcGpzaXBfdHN4X3JlY3ZfbXNnKHVhc190c3gsIHJkYXRhKTsKKworCS8qIEF0dGFjaCBhIGRhdGEgdG8gdGhlIFVBQyB0cmFuc2FjdGlvbiwgdG8gYmUgdXNlZCB0byBmaW5kIHRoZQorCSAqIFVBUyB0cmFuc2FjdGlvbiB3aGVuIHdlIHJlY2VpdmUgcmVzcG9uc2UgaW4gdGhlIFVBQyBzaWRlLgorCSAqLworCXVhY19kYXRhID0gKHN0cnVjdCB1YWNfZGF0YSopCisJCSAgIHBqX3Bvb2xfYWxsb2ModWFjX3RzeC0+cG9vbCwgc2l6ZW9mKHN0cnVjdCB1YWNfZGF0YSkpOworCXVhY19kYXRhLT51YXNfdHN4ID0gdWFzX3RzeDsKKwl1YWNfdHN4LT5tb2RfZGF0YVttb2RfdHUuaWRdID0gKHZvaWQqKXVhY19kYXRhOworCisJLyogQXR0YWNoIGRhdGEgdG8gdGhlIFVBUyB0cmFuc2FjdGlvbiwgdG8gZmluZCB0aGUgVUFDIHRyYW5zYWN0aW9uCisJICogd2hlbiBjYW5jZWxsaW5nIElOVklURSByZXF1ZXN0LgorCSAqLworCXVhc19kYXRhID0gKHN0cnVjdCB1YXNfZGF0YSopCisJCSAgICBwal9wb29sX2FsbG9jKHVhc190c3gtPnBvb2wsIHNpemVvZihzdHJ1Y3QgdWFzX2RhdGEpKTsKKwl1YXNfZGF0YS0+dWFjX3RzeCA9IHVhY190c3g7CisJdWFzX3RzeC0+bW9kX2RhdGFbbW9kX3R1LmlkXSA9ICh2b2lkKil1YXNfZGF0YTsKKworCS8qIEV2ZXJ5dGhpbmcgaXMgc2V0dXAsIGZvcndhcmQgdGhlIHJlcXVlc3QgKi8KKwlzdGF0dXMgPSBwanNpcF90c3hfc2VuZF9tc2codWFjX3RzeCwgdGRhdGEpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwanNpcF90eF9kYXRhICplcnJfcmVzOworCisJICAgIC8qIEZhaWwgdG8gc2VuZCByZXF1ZXN0LCBmb3Igc29tZSByZWFzb24gKi8KKworCSAgICAvKiBEZXN0cm95IHRyYW5zbWl0IGRhdGEgKi8KKwkgICAgcGpzaXBfdHhfZGF0YV9kZWNfcmVmKHRkYXRhKTsKKworCSAgICAvKiBJIHRoaW5rIFVBQyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuCisJICAgICAqIGl0IGZhaWxzIHRvIHNlbmQgcmVxdWVzdCwgc28gbm8gbmVlZCB0byBkZXN0cm95IGl0LgorCSAgICBwanNpcF90c3hfdGVybWluYXRlKHVhY190c3gsIFBKU0lQX1NDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisJICAgICAqLworCisJICAgIC8qIFNlbmQgNTAwL0ludGVybmFsIFNlcnZlciBFcnJvciB0byBVQVMgdHJhbnNhY3Rpb24gKi8KKwkgICAgcGpzaXBfZW5kcHRfY3JlYXRlX3Jlc3BvbnNlKGdsb2JhbC5lbmRwdCwgcmRhdGEsCisJCQkJCTUwMCwgTlVMTCwgJmVycl9yZXMpOworCSAgICBwanNpcF90c3hfc2VuZF9tc2codWFzX3RzeCwgZXJyX3Jlcyk7CisKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisJLyogU2VuZCAxMDAvVHJ5aW5nIGlmIHRoaXMgaXMgYW4gSU5WSVRFICovCisJaWYgKHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZC5pZCA9PSBQSlNJUF9JTlZJVEVfTUVUSE9EKSB7CisJICAgIHBqc2lwX3R4X2RhdGEgKnJlczEwMDsKKworCSAgICBwanNpcF9lbmRwdF9jcmVhdGVfcmVzcG9uc2UoZ2xvYmFsLmVuZHB0LCByZGF0YSwgMTAwLCBOVUxMLCAKKwkJCQkJJnJlczEwMCk7CisJICAgIHBqc2lwX3RzeF9zZW5kX21zZyh1YXNfdHN4LCByZXMxMDApOworCX0KKworICAgIH0gZWxzZSB7CisJLyogVGhpcyBpcyBDQU5DRUwgcmVxdWVzdCAqLworCXBqc2lwX3RyYW5zYWN0aW9uICppbnZpdGVfdWFzOworCXN0cnVjdCB1YXNfZGF0YSAqdWFzX2RhdGE7CisJcGpfc3RyX3Qga2V5OworCQorCS8qIEZpbmQgdGhlIFVBUyBJTlZJVEUgdHJhbnNhY3Rpb24gKi8KKwlwanNpcF90c3hfY3JlYXRlX2tleShyZGF0YS0+dHBfaW5mby5wb29sLCAma2V5LCBQSlNJUF9VQVNfUk9MRSwKKwkJCSAgICAgcGpzaXBfZ2V0X2ludml0ZV9tZXRob2QoKSwgcmRhdGEpOworCWludml0ZV91YXMgPSBwanNpcF90c3hfbGF5ZXJfZmluZF90c3goJmtleSwgUEpfVFJVRSk7CisJaWYgKCFpbnZpdGVfdWFzKSB7CisJICAgIC8qIEludml0ZSB0cmFuc2FjdGlvbiBub3QgZm91bmQsIHJlc3BvbmQgQ0FOQ0VMIHdpdGggNDgxICovCisJICAgIHBqc2lwX2VuZHB0X3Jlc3BvbmRfc3RhdGVsZXNzKGdsb2JhbC5lbmRwdCwgcmRhdGEsIDQ4MSwgTlVMTCwKKwkJCQkJICBOVUxMLCBOVUxMKTsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorCisJLyogUmVzcG9uZCAyMDAgT0sgdG8gQ0FOQ0VMICovCisJcGpzaXBfZW5kcHRfcmVzcG9uZChnbG9iYWwuZW5kcHQsIE5VTEwsIHJkYXRhLCAyMDAsIE5VTEwsIE5VTEwsCisJCQkgICAgTlVMTCwgTlVMTCk7CisKKwkvKiBTZW5kIENBTkNFTCB0byBjYW5jZWwgdGhlIFVBQyB0cmFuc2FjdGlvbi4KKwkgKiBUaGUgVUFTIElOVklURSB0cmFuc2FjdGlvbiB3aWxsIGdldCBmaW5hbCByZXNwb25zZSB3aGVuCisJICogd2UgcmVjZWl2ZSBmaW5hbCByZXNwb25zZSBmcm9tIHRoZSBVQUMgSU5WSVRFIHRyYW5zYWN0aW9uLgorCSAqLworCXVhc19kYXRhID0gKHN0cnVjdCB1YXNfZGF0YSopIGludml0ZV91YXMtPm1vZF9kYXRhW21vZF90dS5pZF07CisJaWYgKHVhc19kYXRhLT51YWNfdHN4ICYmIHVhc19kYXRhLT51YWNfdHN4LT5zdGF0dXNfY29kZSA8IDIwMCkgeworCSAgICBwanNpcF90eF9kYXRhICpjYW5jZWw7CisKKwkgICAgcGpfZ3JwX2xvY2tfYWNxdWlyZSh1YXNfZGF0YS0+dWFjX3RzeC0+Z3JwX2xvY2spOworCisJICAgIHBqc2lwX2VuZHB0X2NyZWF0ZV9jYW5jZWwoZ2xvYmFsLmVuZHB0LCB1YXNfZGF0YS0+dWFjX3RzeC0+bGFzdF90eCwKKwkJCQkgICAgICAmY2FuY2VsKTsKKwkgICAgcGpzaXBfZW5kcHRfc2VuZF9yZXF1ZXN0KGdsb2JhbC5lbmRwdCwgY2FuY2VsLCAtMSwgTlVMTCwgTlVMTCk7CisKKwkgICAgcGpfZ3JwX2xvY2tfcmVsZWFzZSh1YXNfZGF0YS0+dWFjX3RzeC0+Z3JwX2xvY2spOworCX0KKworCS8qIFVubG9jayBVQVMgdHN4IGJlY2F1c2UgaXQgaXMgbG9ja2VkIGluIGZpbmRfdHN4KCkgKi8KKwlwal9ncnBfbG9ja19yZWxlYXNlKGludml0ZV91YXMtPmdycF9sb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGluY29taW5nIHJlc3BvbnNlIG91dHNpZGUKKyAqIGFueSB0cmFuc2FjdGlvbnMuIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSB3aGVuIDJ4eC9PSworICogZm9yIElOVklURSBpcyByZWNlaXZlZCBhbmQgdHJhbnNhY3Rpb24gd2lsbCBiZSBkZXN0cm95ZWQKKyAqIGltbWVkaWF0ZWx5LCBzbyB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHN1YnNlcXVlbnQgMnh4L09LCisgKiByZXRyYW5zbWlzc2lvbiBzdGF0ZWxlc3NseS4KKyAqLworc3RhdGljIHBqX2Jvb2xfdCBwcm94eV9vbl9yeF9yZXNwb25zZSggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqc2lwX3Jlc3BvbnNlX2FkZHIgcmVzX2FkZHI7CisgICAgcGpzaXBfdmlhX2hkciAqaHZpYTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBDcmVhdGUgcmVzcG9uc2UgdG8gYmUgZm9yd2FyZGVkIHVwc3RyZWFtIChWaWEgd2lsbCBiZSBzdHJpcHBlZCBoZXJlKSAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZV9md2QoZ2xvYmFsLmVuZHB0LCByZGF0YSwgMCwgJnRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBjcmVhdGluZyByZXNwb25zZSIsIHN0YXR1cyk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogR2V0IHRvcG1vc3QgVmlhIGhlYWRlciAqLworICAgIGh2aWEgPSAocGpzaXBfdmlhX2hkciopIHBqc2lwX21zZ19maW5kX2hkcih0ZGF0YS0+bXNnLCBQSlNJUF9IX1ZJQSwgTlVMTCk7CisgICAgaWYgKGh2aWEgPT0gTlVMTCkgeworCS8qIEludmFsaWQgcmVzcG9uc2UhIEp1c3QgZHJvcCBpdCAqLworCXBqc2lwX3R4X2RhdGFfZGVjX3JlZih0ZGF0YSk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIHRvIGZvcndhcmQgdGhlIHJlc3BvbnNlICovCisgICAgcGpfYnplcm8oJnJlc19hZGRyLCBzaXplb2YocmVzX2FkZHIpKTsKKyAgICByZXNfYWRkci5kc3RfaG9zdC50eXBlID0gUEpTSVBfVFJBTlNQT1JUX1VEUDsKKyAgICByZXNfYWRkci5kc3RfaG9zdC5mbGFnID0gCisJcGpzaXBfdHJhbnNwb3J0X2dldF9mbGFnX2Zyb21fdHlwZShQSlNJUF9UUkFOU1BPUlRfVURQKTsKKworICAgIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgaXMgVmlhJ3MgcmVjZWl2ZWQgcGFyYW0gKi8KKyAgICByZXNfYWRkci5kc3RfaG9zdC5hZGRyLmhvc3QgPSBodmlhLT5yZWN2ZF9wYXJhbTsKKyAgICBpZiAocmVzX2FkZHIuZHN0X2hvc3QuYWRkci5ob3N0LnNsZW4gPT0gMCkgeworCS8qIFNvbWVvbmUgaGFzIG1lc3NlZCB1cCBvdXIgVmlhIGhlYWRlciEgKi8KKwlyZXNfYWRkci5kc3RfaG9zdC5hZGRyLmhvc3QgPSBodmlhLT5zZW50X2J5Lmhvc3Q7CisgICAgfQorCisgICAgLyogRGVzdGluYXRpb24gcG9ydCBpcyB0aGUgcnBvcnQgKi8KKyAgICBpZiAoaHZpYS0+cnBvcnRfcGFyYW0gIT0gMCAmJiBodmlhLT5ycG9ydF9wYXJhbSAhPSAtMSkKKwlyZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPSBodmlhLT5ycG9ydF9wYXJhbTsKKworICAgIGlmIChyZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPT0gMCkgeworCS8qIFVnaCwgb3JpZ2luYWwgc2VuZGVyIGRpZG4ndCBwdXQgcnBvcnQhCisJICogQXQgYmVzdCwgY2FuIG9ubHkgc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHBvcnQgaW4gVmlhLgorCSAqLworCXJlc19hZGRyLmRzdF9ob3N0LmFkZHIucG9ydCA9IGh2aWEtPnNlbnRfYnkucG9ydDsKKyAgICB9CisKKyAgICAvKiBGb3J3YXJkIHJlc3BvbnNlICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfc2VuZF9yZXNwb25zZShnbG9iYWwuZW5kcHQsICZyZXNfYWRkciwgdGRhdGEsCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGZvcndhcmRpbmcgcmVzcG9uc2UiLCBzdGF0dXMpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKKy8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgdHJhbnNhY3Rpb24gc3RhdGUgY2hhbmdlZC4gKi8KK3N0YXRpYyB2b2lkIHR1X29uX3RzeF9zdGF0ZShwanNpcF90cmFuc2FjdGlvbiAqdHN4LCBwanNpcF9ldmVudCAqZXZlbnQpCit7CisgICAgc3RydWN0IHVhY19kYXRhICp1YWNfZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAodHN4LT5yb2xlID09IFBKU0lQX1JPTEVfVUFTKSB7CisJaWYgKHRzeC0+c3RhdGUgPT0gUEpTSVBfVFNYX1NUQVRFX1RFUk1JTkFURUQpIHsKKwkgICAgc3RydWN0IHVhc19kYXRhICp1YXNfZGF0YTsKKworCSAgICB1YXNfZGF0YSA9IChzdHJ1Y3QgdWFzX2RhdGEqKSB0c3gtPm1vZF9kYXRhW21vZF90dS5pZF07CisJICAgIGlmICh1YXNfZGF0YS0+dWFjX3RzeCkgeworCQl1YWNfZGF0YSA9IChzdHJ1Y3QgdWFjX2RhdGEqKQorCQkJICAgdWFzX2RhdGEtPnVhY190c3gtPm1vZF9kYXRhW21vZF90dS5pZF07CisJCXVhY19kYXRhLT51YXNfdHN4ID0gTlVMTDsKKwkgICAgfQorCQkgICAgICAgCisJfQorCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGRhdGEgdGhhdCB3ZSBhdHRhY2hlZCB0byB0aGUgVUFDIHRyYW5zYWN0aW9uIHByZXZpb3VzbHkgKi8KKyAgICB1YWNfZGF0YSA9IChzdHJ1Y3QgdWFjX2RhdGEqKSB0c3gtPm1vZF9kYXRhW21vZF90dS5pZF07CisKKworICAgIC8qIEhhbmRsZSBpbmNvbWluZyByZXNwb25zZSAqLworICAgIGlmIChldmVudC0+Ym9keS50c3hfc3RhdGUudHlwZSA9PSBQSlNJUF9FVkVOVF9SWF9NU0cpIHsKKworCXBqc2lwX3J4X2RhdGEgKnJkYXRhOworCXBqc2lwX3Jlc3BvbnNlX2FkZHIgcmVzX2FkZHI7CisgICAgICAgIHBqc2lwX3ZpYV9oZHIgKmh2aWE7CisJcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisKKwlyZGF0YSA9IGV2ZW50LT5ib2R5LnRzeF9zdGF0ZS5zcmMucmRhdGE7CisKKwkvKiBEbyBub3QgZm9yd2FyZCAxMDAgcmVzcG9uc2UgZm9yIElOVklURSAod2UgYWxyZWFkeSByZXNwb25kZWQKKwkgKiBJTlZJVEUgd2l0aCAxMDApCisJICovCisJaWYgKHRzeC0+bWV0aG9kLmlkID09IFBKU0lQX0lOVklURV9NRVRIT0QgJiYgCisJICAgIHJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUuc3RhdHVzLmNvZGUgPT0gMTAwKQorCXsKKwkgICAgcmV0dXJuOworCX0KKworCS8qIENyZWF0ZSByZXNwb25zZSB0byBiZSBmb3J3YXJkZWQgdXBzdHJlYW0gCisJICogKFZpYSB3aWxsIGJlIHN0cmlwcGVkIGhlcmUpIAorCSAqLworCXN0YXR1cyA9IHBqc2lwX2VuZHB0X2NyZWF0ZV9yZXNwb25zZV9md2QoZ2xvYmFsLmVuZHB0LCByZGF0YSwgMCwgCisJCQkJCQkgJnRkYXRhKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiRXJyb3IgY3JlYXRpbmcgcmVzcG9uc2UiLCBzdGF0dXMpOworCSAgICByZXR1cm47CisJfQorCisJLyogR2V0IHRvcG1vc3QgVmlhIGhlYWRlciBvZiB0aGUgbmV3IHJlc3BvbnNlICovCisJaHZpYSA9IChwanNpcF92aWFfaGRyKikgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfVklBLCAKKwkJCQkJCSAgIE5VTEwpOworCWlmIChodmlhID09IE5VTEwpIHsKKwkgICAgLyogSW52YWxpZCByZXNwb25zZSEgSnVzdCBkcm9wIGl0ICovCisJICAgIHBqc2lwX3R4X2RhdGFfZGVjX3JlZih0ZGF0YSk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3MgdG8gZm9yd2FyZCB0aGUgcmVzcG9uc2UgKi8KKwlwal9iemVybygmcmVzX2FkZHIsIHNpemVvZihyZXNfYWRkcikpOworCXJlc19hZGRyLmRzdF9ob3N0LnR5cGUgPSBQSlNJUF9UUkFOU1BPUlRfVURQOworCXJlc19hZGRyLmRzdF9ob3N0LmZsYWcgPSAKKwkgICAgcGpzaXBfdHJhbnNwb3J0X2dldF9mbGFnX2Zyb21fdHlwZShQSlNJUF9UUkFOU1BPUlRfVURQKTsKKworCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgaXMgVmlhJ3MgcmVjZWl2ZWQgcGFyYW0gKi8KKwlyZXNfYWRkci5kc3RfaG9zdC5hZGRyLmhvc3QgPSBodmlhLT5yZWN2ZF9wYXJhbTsKKwlpZiAocmVzX2FkZHIuZHN0X2hvc3QuYWRkci5ob3N0LnNsZW4gPT0gMCkgeworCSAgICAvKiBTb21lb25lIGhhcyBtZXNzZWQgdXAgb3VyIFZpYSBoZWFkZXIhICovCisJICAgIHJlc19hZGRyLmRzdF9ob3N0LmFkZHIuaG9zdCA9IGh2aWEtPnNlbnRfYnkuaG9zdDsKKwl9CisKKwkvKiBEZXN0aW5hdGlvbiBwb3J0IGlzIHRoZSBycG9ydCAqLworCWlmIChodmlhLT5ycG9ydF9wYXJhbSAhPSAwICYmIGh2aWEtPnJwb3J0X3BhcmFtICE9IC0xKQorCSAgICByZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPSBodmlhLT5ycG9ydF9wYXJhbTsKKworCWlmIChyZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPT0gMCkgeworCSAgICAvKiBVZ2gsIG9yaWdpbmFsIHNlbmRlciBkaWRuJ3QgcHV0IHJwb3J0IQorCSAgICAgKiBBdCBiZXN0LCBjYW4gb25seSBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgcG9ydCBpbiBWaWEuCisJICAgICAqLworCSAgICByZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPSBodmlhLT5zZW50X2J5LnBvcnQ7CisJfQorCisJLyogRm9yd2FyZCByZXNwb25zZSB3aXRoIHRoZSBVQVMgdHJhbnNhY3Rpb24gKi8KKwlwanNpcF90c3hfc2VuZF9tc2codWFjX2RhdGEtPnVhc190c3gsIHRkYXRhKTsKKworICAgIH0KKworICAgIC8qIElmIFVBQyB0cmFuc2FjdGlvbiBpcyB0ZXJtaW5hdGVkLCB0ZXJtaW5hdGUgdGhlIFVBUyBhcyB3ZWxsLgorICAgICAqIFRoaXMgY291bGQgaGFwcGVuIGJlY2F1c2Ugb2Y6CisgICAgICoJLSB0aW1lb3V0IG9uIHRoZSBVQUMgc2lkZQorICAgICAqICAtIHJlY2VpcHQgb2YgMnh4IHJlc3BvbnNlIHRvIElOVklURQorICAgICAqLworICAgIGlmICh0c3gtPnN0YXRlID09IFBKU0lQX1RTWF9TVEFURV9URVJNSU5BVEVEICYmIHVhY19kYXRhICYmCisJdWFjX2RhdGEtPnVhc190c3gpIAorICAgIHsKKworCXBqc2lwX3RyYW5zYWN0aW9uICp1YXNfdHN4OworCXN0cnVjdCB1YXNfZGF0YSAqdWFzX2RhdGE7CisKKwl1YXNfdHN4ID0gdWFjX2RhdGEtPnVhc190c3g7CisJdWFzX2RhdGEgPSAoc3RydWN0IHVhc19kYXRhKikgdWFzX3RzeC0+bW9kX2RhdGFbbW9kX3R1LmlkXTsKKwl1YXNfZGF0YS0+dWFjX3RzeCA9IE5VTEw7CisKKwlpZiAoZXZlbnQtPmJvZHkudHN4X3N0YXRlLnR5cGUgPT0gUEpTSVBfRVZFTlRfVElNRVIpIHsKKworCSAgICAvKiBTZW5kIDQwOC9UaW1lb3V0IGlmIHRoaXMgaXMgYW4gSU5WSVRFIHRyYW5zYWN0aW9uLCBzaW5jZQorCSAgICAgKiB3ZSBtdXN0IGhhdmUgc2VudCBwcm92aXNpb25hbCByZXNwb25zZSBiZWZvcmUuIEZvciBub24KKwkgICAgICogSU5WSVRFIHRyYW5zYWN0aW9uLCBqdXN0IGRlc3Ryb3kgaXQuCisJICAgICAqLworCSAgICBpZiAodHN4LT5tZXRob2QuaWQgPT0gUEpTSVBfSU5WSVRFX01FVEhPRCkgeworCisJCXBqc2lwX3R4X2RhdGEgKnRkYXRhID0gdWFzX3RzeC0+bGFzdF90eDsKKworCQl0ZGF0YS0+bXNnLT5saW5lLnN0YXR1cy5jb2RlID0gUEpTSVBfU0NfUkVRVUVTVF9USU1FT1VUOworCQl0ZGF0YS0+bXNnLT5saW5lLnN0YXR1cy5yZWFzb24gPSBwal9zdHIoIlJlcXVlc3QgdGltZWQgb3V0Iik7CisJCXRkYXRhLT5tc2ctPmJvZHkgPSBOVUxMOworCisJCXBqc2lwX3R4X2RhdGFfYWRkX3JlZih0ZGF0YSk7CisJCXBqc2lwX3R4X2RhdGFfaW52YWxpZGF0ZV9tc2codGRhdGEpOworCisJCXBqc2lwX3RzeF9zZW5kX21zZyh1YXNfdHN4LCB0ZGF0YSk7CisKKwkgICAgfSBlbHNlIHsKKwkJLyogRm9yIG5vbi1JTlZJVEUsIGp1c3QgZGVzdHJveSB0aGUgVUFTIHRyYW5zYWN0aW9uICovCisJCXBqc2lwX3RzeF90ZXJtaW5hdGUodWFzX3RzeCwgUEpTSVBfU0NfUkVRVUVTVF9USU1FT1VUKTsKKwkgICAgfQorCisJfSBlbHNlIGlmIChldmVudC0+Ym9keS50c3hfc3RhdGUudHlwZSA9PSBQSlNJUF9FVkVOVF9SWF9NU0cpIHsKKworCSAgICBpZiAodWFzX3RzeC0+c3RhdGUgPCBQSlNJUF9UU1hfU1RBVEVfVEVSTUlOQVRFRCkgeworCQlwanNpcF9tc2cgKm1zZzsKKwkJaW50IGNvZGU7CisKKwkJbXNnID0gZXZlbnQtPmJvZHkudHN4X3N0YXRlLnNyYy5yZGF0YS0+bXNnX2luZm8ubXNnOworCQljb2RlID0gbXNnLT5saW5lLnN0YXR1cy5jb2RlOworCisJCXVhY19kYXRhLT51YXNfdHN4ID0gTlVMTDsKKwkJcGpzaXBfdHN4X3Rlcm1pbmF0ZSh1YXNfdHN4LCBjb2RlKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyoKKyAqIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGdsb2JhbC5wb3J0ID0gNTA2MDsKKyAgICBnbG9iYWwucmVjb3JkX3JvdXRlID0gMDsKKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoNCk7CisKKyAgICBzdGF0dXMgPSBpbml0X29wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiAxOworCisgICAgc3RhdHVzID0gaW5pdF9zdGFjaygpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGluaXRpYWxpemluZyBzdGFjayIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzID0gaW5pdF9wcm94eSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGluaXRpYWxpemluZyBwcm94eSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzID0gaW5pdF9zdGF0ZWZ1bF9wcm94eSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGluaXRpYWxpemluZyBzdGF0ZWZ1bCBwcm94eSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwal90aHJlYWRfY3JlYXRlKGdsb2JhbC5wb29sLCAic3Byb3h5IiwgJndvcmtlcl90aHJlYWQsIAorCQkJICAgICAgTlVMTCwgMCwgMCwgJmdsb2JhbC50aHJlYWQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIHRocmVhZCIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgd2hpbGUgKCFnbG9iYWwucXVpdF9mbGFnKSB7CisJY2hhciBsaW5lWzEwXTsKKworCXB1dHMoIlxuIgorCSAgICAgIk1lbnU6XG4iCisJICAgICAiICBxICAgIHF1aXRcbiIKKwkgICAgICIgIGQgICAgZHVtcCBzdGF0dXNcbiIKKwkgICAgICIgIGRkICAgZHVtcCBkZXRhaWxlZCBzdGF0dXNcbiIKKwkgICAgICIiKTsKKworCWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSA9PSBOVUxMKSB7CisJICAgIHB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKwkgICAgZ2xvYmFsLnF1aXRfZmxhZyA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCX0KKworCWlmIChsaW5lWzBdID09ICdxJykgeworCSAgICBnbG9iYWwucXVpdF9mbGFnID0gUEpfVFJVRTsKKwl9IGVsc2UgaWYgKGxpbmVbMF0gPT0gJ2QnKSB7CisJICAgIHBqX2Jvb2xfdCBkZXRhaWwgPSAobGluZVsxXSA9PSAnZCcpOworCSAgICBwanNpcF9lbmRwdF9kdW1wKGdsb2JhbC5lbmRwdCwgZGV0YWlsKTsKKwkgICAgcGpzaXBfdHN4X2xheWVyX2R1bXAoZGV0YWlsKTsKKwl9CisgICAgfQorCisgICAgcGpfdGhyZWFkX2pvaW4oZ2xvYmFsLnRocmVhZCk7CisKKyNlbHNlCisgICAgcHV0cygiXG5QcmVzcyBDdHJsLUMgdG8gcXVpdFxuIik7CisgICAgZm9yICg7OykgeworCXBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDB9OworCXBqc2lwX2VuZHB0X2hhbmRsZV9ldmVudHMoZ2xvYmFsLmVuZHB0LCAmZGVsYXkpOworICAgIH0KKyNlbmRpZgorCisgICAgZGVzdHJveV9zdGFjaygpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RhdGVsZXNzX3Byb3h5LmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0YXRlbGVzc19wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjM4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0YXRlbGVzc19wcm94eS5jCkBAIC0wLDAgKzEsMjU1IEBACisvKiAkSWQ6IHN0YXRlbGVzc19wcm94eS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjZGVmaW5lIFRISVNfRklMRSAgICJzdGF0ZWxlc3NfcHJveHkuYyIKKworLyogQ29tbW9uIHByb3h5IGZ1bmN0aW9ucyAqLworI2RlZmluZSBTVEFURUZVTCAgICAwCisjaW5jbHVkZSAicHJveHkuaCIKKworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RzLiAqLworc3RhdGljIHBqX2Jvb2xfdCBvbl9yeF9yZXF1ZXN0KCBwanNpcF9yeF9kYXRhICpyZGF0YSApOworCisvKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGluY29taW5nIHJlc3BvbnNlLiAqLworc3RhdGljIHBqX2Jvb2xfdCBvbl9yeF9yZXNwb25zZSggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKTsKKworCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zdGF0ZWxlc3NfcHJveHkodm9pZCkKK3sKKyAgICBzdGF0aWMgcGpzaXBfbW9kdWxlIG1vZF9zdGF0ZWxlc3NfcHJveHkgPQorICAgIHsKKwlOVUxMLCBOVUxMLAkJCSAgICAvKiBwcmV2LCBuZXh0LgkqLworCXsgIm1vZC1zdGF0ZWxlc3MtcHJveHkiLCAxOSB9LAkgICAgLyogTmFtZS4JCSovCisJLTEsCQkJCSAgICAvKiBJZAkJKi8KKwlQSlNJUF9NT0RfUFJJT1JJVFlfVUFfUFJPWFlfTEFZRVIsICAvKiBQcmlvcml0eQkJKi8KKwlOVUxMLAkJCQkgICAgLyogbG9hZCgpCQkqLworCU5VTEwsCQkJCSAgICAvKiBzdGFydCgpCQkqLworCU5VTEwsCQkJCSAgICAvKiBzdG9wKCkJCSovCisJTlVMTCwJCQkJICAgIC8qIHVubG9hZCgpCQkqLworCSZvbl9yeF9yZXF1ZXN0LAkJCSAgICAvKiBvbl9yeF9yZXF1ZXN0KCkJKi8KKwkmb25fcnhfcmVzcG9uc2UsCQkgICAgLyogb25fcnhfcmVzcG9uc2UoKQkqLworCU5VTEwsCQkJCSAgICAvKiBvbl90eF9yZXF1ZXN0LgkqLworCU5VTEwsCQkJCSAgICAvKiBvbl90eF9yZXNwb25zZSgpCSovCisJTlVMTCwJCQkJICAgIC8qIG9uX3RzeF9zdGF0ZSgpCSovCisgICAgfTsKKworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIFJlZ2lzdGVyIG91ciBtb2R1bGUgdG8gcmVjZWl2ZSBpbmNvbWluZyByZXF1ZXN0cy4gKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUoIGdsb2JhbC5lbmRwdCwgJm1vZF9zdGF0ZWxlc3NfcHJveHkpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cy4gKi8KK3N0YXRpYyBwal9ib29sX3Qgb25fcnhfcmVxdWVzdCggcGpzaXBfcnhfZGF0YSAqcmRhdGEgKQoreworICAgIHBqc2lwX3R4X2RhdGEgKnRkYXRhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCisgICAgLyogVmVyaWZ5IGluY29taW5nIHJlcXVlc3QgKi8KKyAgICBzdGF0dXMgPSBwcm94eV92ZXJpZnlfcmVxdWVzdChyZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiUlggaW52YWxpZCByZXF1ZXN0Iiwgc3RhdHVzKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcXVlc3QgbG9va3Mgc2FuZSwgbmV4dCBjbG9uZSB0aGUgcmVxdWVzdCB0byBjcmVhdGUgdHJhbnNtaXQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGVfcmVxdWVzdF9md2QoZ2xvYmFsLmVuZHB0LCByZGF0YSwgTlVMTCwKKwkJCQkJICAgIE5VTEwsIDAsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpzaXBfZW5kcHRfcmVzcG9uZF9zdGF0ZWxlc3MoZ2xvYmFsLmVuZHB0LCByZGF0YSwKKwkJCQkgICAgICBQSlNJUF9TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsIE5VTEwsIAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKworCisgICAgLyogUHJvY2VzcyByb3V0aW5nICovCisgICAgc3RhdHVzID0gcHJveHlfcHJvY2Vzc19yb3V0aW5nKHRkYXRhKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBwcm9jZXNzaW5nIHJvdXRlIiwgc3RhdHVzKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGFyZ2V0ICovCisgICAgc3RhdHVzID0gcHJveHlfY2FsY3VsYXRlX3RhcmdldChyZGF0YSwgdGRhdGEpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNhbGN1bGF0aW5nIHRhcmdldCIsIHN0YXR1cyk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogVGFyZ2V0IGlzIHNldCwgZm9yd2FyZCB0aGUgcmVxdWVzdCAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3NlbmRfcmVxdWVzdF9zdGF0ZWxlc3MoZ2xvYmFsLmVuZHB0LCB0ZGF0YSwgCisJCQkJCQlOVUxMLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBmb3J3YXJkaW5nIHJlcXVlc3QiLCBzdGF0dXMpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKKy8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgaW5jb21pbmcgcmVzcG9uc2UuICovCitzdGF0aWMgcGpfYm9vbF90IG9uX3J4X3Jlc3BvbnNlKCBwanNpcF9yeF9kYXRhICpyZGF0YSApCit7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgcGpzaXBfcmVzcG9uc2VfYWRkciByZXNfYWRkcjsKKyAgICBwanNpcF92aWFfaGRyICpodmlhOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIENyZWF0ZSByZXNwb25zZSB0byBiZSBmb3J3YXJkZWQgdXBzdHJlYW0gKFZpYSB3aWxsIGJlIHN0cmlwcGVkIGhlcmUpICovCisgICAgc3RhdHVzID0gcGpzaXBfZW5kcHRfY3JlYXRlX3Jlc3BvbnNlX2Z3ZChnbG9iYWwuZW5kcHQsIHJkYXRhLCAwLCAmdGRhdGEpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIHJlc3BvbnNlIiwgc3RhdHVzKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKiBHZXQgdG9wbW9zdCBWaWEgaGVhZGVyICovCisgICAgaHZpYSA9IChwanNpcF92aWFfaGRyKikgcGpzaXBfbXNnX2ZpbmRfaGRyKHRkYXRhLT5tc2csIFBKU0lQX0hfVklBLCBOVUxMKTsKKyAgICBpZiAoaHZpYSA9PSBOVUxMKSB7CisJLyogSW52YWxpZCByZXNwb25zZSEgSnVzdCBkcm9wIGl0ICovCisJcGpzaXBfdHhfZGF0YV9kZWNfcmVmKHRkYXRhKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3MgdG8gZm9yd2FyZCB0aGUgcmVzcG9uc2UgKi8KKyAgICBwal9iemVybygmcmVzX2FkZHIsIHNpemVvZihyZXNfYWRkcikpOworICAgIHJlc19hZGRyLmRzdF9ob3N0LnR5cGUgPSBQSlNJUF9UUkFOU1BPUlRfVURQOworICAgIHJlc19hZGRyLmRzdF9ob3N0LmZsYWcgPSBwanNpcF90cmFuc3BvcnRfZ2V0X2ZsYWdfZnJvbV90eXBlKFBKU0lQX1RSQU5TUE9SVF9VRFApOworCisgICAgLyogRGVzdGluYXRpb24gYWRkcmVzcyBpcyBWaWEncyByZWNlaXZlZCBwYXJhbSAqLworICAgIHJlc19hZGRyLmRzdF9ob3N0LmFkZHIuaG9zdCA9IGh2aWEtPnJlY3ZkX3BhcmFtOworICAgIGlmIChyZXNfYWRkci5kc3RfaG9zdC5hZGRyLmhvc3Quc2xlbiA9PSAwKSB7CisJLyogU29tZW9uZSBoYXMgbWVzc2VkIHVwIG91ciBWaWEgaGVhZGVyISAqLworCXJlc19hZGRyLmRzdF9ob3N0LmFkZHIuaG9zdCA9IGh2aWEtPnNlbnRfYnkuaG9zdDsKKyAgICB9CisKKyAgICAvKiBEZXN0aW5hdGlvbiBwb3J0IGlzIHRoZSBycG90ICovCisgICAgaWYgKGh2aWEtPnJwb3J0X3BhcmFtICE9IDAgJiYgaHZpYS0+cnBvcnRfcGFyYW0gIT0gLTEpCisJcmVzX2FkZHIuZHN0X2hvc3QuYWRkci5wb3J0ID0gaHZpYS0+cnBvcnRfcGFyYW07CisKKyAgICBpZiAocmVzX2FkZHIuZHN0X2hvc3QuYWRkci5wb3J0ID09IDApIHsKKwkvKiBVZ2gsIG9yaWdpbmFsIHNlbmRlciBkaWRuJ3QgcHV0IHJwb3J0IQorCSAqIEF0IGJlc3QsIGNhbiBvbmx5IHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBwb3J0IGluIFZpYS4KKwkgKi8KKwlyZXNfYWRkci5kc3RfaG9zdC5hZGRyLnBvcnQgPSBodmlhLT5zZW50X2J5LnBvcnQ7CisgICAgfQorCisgICAgLyogRm9yd2FyZCByZXNwb25zZSAqLworICAgIHN0YXR1cyA9IHBqc2lwX2VuZHB0X3NlbmRfcmVzcG9uc2UoZ2xvYmFsLmVuZHB0LCAmcmVzX2FkZHIsIHRkYXRhLCAKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiRXJyb3IgZm9yd2FyZGluZyByZXNwb25zZSIsIHN0YXR1cyk7CisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworLyoKKyAqIG1haW4oKQorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGdsb2JhbC5wb3J0ID0gNTA2MDsKKyAgICBwal9sb2dfc2V0X2xldmVsKDQpOworCisgICAgc3RhdHVzID0gaW5pdF9vcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gMTsKKworICAgIHN0YXR1cyA9IGluaXRfc3RhY2soKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBpbml0aWFsaXppbmcgc3RhY2siLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIHN0YXR1cyA9IGluaXRfcHJveHkoKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBpbml0aWFsaXppbmcgcHJveHkiLCBzdGF0dXMpOworCXJldHVybiAxOworICAgIH0KKworICAgIHN0YXR1cyA9IGluaXRfc3RhdGVsZXNzX3Byb3h5KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiRXJyb3IgaW5pdGlhbGl6aW5nIHN0YXRlbGVzcyBwcm94eSIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBzdGF0dXMgPSBwal90aHJlYWRfY3JlYXRlKGdsb2JhbC5wb29sLCAic3Byb3h5IiwgJndvcmtlcl90aHJlYWQsIAorCQkJICAgICAgTlVMTCwgMCwgMCwgJmdsb2JhbC50aHJlYWQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIHRocmVhZCIsIHN0YXR1cyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgd2hpbGUgKCFnbG9iYWwucXVpdF9mbGFnKSB7CisJY2hhciBsaW5lWzEwXTsKKworCXB1dHMoIlxuIgorCSAgICAgIk1lbnU6XG4iCisJICAgICAiICBxICAgIHF1aXRcbiIKKwkgICAgICIgIGQgICAgZHVtcCBzdGF0dXNcbiIKKwkgICAgICIgIGRkICAgZHVtcCBkZXRhaWxlZCBzdGF0dXNcbiIKKwkgICAgICIiKTsKKworCWlmIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSA9PSBOVUxMKSB7CisJICAgIHB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKwkgICAgZ2xvYmFsLnF1aXRfZmxhZyA9IFBKX1RSVUU7CisJICAgIGJyZWFrOworCX0KKworCWlmIChsaW5lWzBdID09ICdxJykgeworCSAgICBnbG9iYWwucXVpdF9mbGFnID0gUEpfVFJVRTsKKwl9IGVsc2UgaWYgKGxpbmVbMF0gPT0gJ2QnKSB7CisJICAgIHBqX2Jvb2xfdCBkZXRhaWwgPSAobGluZVsxXSA9PSAnZCcpOworCSAgICBwanNpcF9lbmRwdF9kdW1wKGdsb2JhbC5lbmRwdCwgZGV0YWlsKTsKKyNpZiBTVEFURUZVTAorCSAgICBwanNpcF90c3hfbGF5ZXJfZHVtcChkZXRhaWwpOworI2VuZGlmCisJfQorICAgIH0KKworICAgIHBqX3RocmVhZF9qb2luKGdsb2JhbC50aHJlYWQpOworCisjZWxzZQorICAgIHB1dHMoIlxuUHJlc3MgQ3RybC1DIHRvIHF1aXRcbiIpOworICAgIGZvciAoOzspIHsKKwlwal90aW1lX3ZhbCBkZWxheSA9IHswLCAwfTsKKwlwanNpcF9lbmRwdF9oYW5kbGVfZXZlbnRzKGdsb2JhbC5lbmRwdCwgJmRlbGF5KTsKKyAgICB9CisjZW5kaWYKKworICAgIGRlc3Ryb3lfc3RhY2soKTsKKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0ZXJlb3Rlc3QuYyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RlcmVvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzEyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0ZXJlb3Rlc3QuYwpAQCAtMCwwICsxLDMzNiBAQAorLyogJElkOiBzdGVyZW90ZXN0LmMgMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19zdGVyZW9fYyBTYW1wbGVzOiBVc2luZyBTdGVyZW8gUG9ydAorICoKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBAcmVmIFBKTUVESUFfU1RFUkVPX1BPUlQgdG8KKyAqIGNoYW5nZSB0aGUgY2hhbm5lbCBjb3VudCBvZiB0aGUgbWVkaWEgc3RyZWFtcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zdGVyZW90ZXN0LmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyBzdGVyZW90ZXN0LmMKKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbGliLXV0aWwuaD4KKyNpbmNsdWRlIDxwamxpYi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInV0aWwuaCIKKworI2RlZmluZSBSRUNfQ0xPQ0tfUkFURQkgICAgMTYwMDAKKyNkZWZpbmUgUFRJTUUJCSAgICAyMAorCisjZGVmaW5lIE1PREVfUExBWQkgICAgMQorI2RlZmluZSBNT0RFX1JFQ09SRAkgICAgMgorCisKKy8qIEZvciBsb2dnaW5nIHB1cnBvc2UuICovCisjZGVmaW5lIFRISVNfRklMRSAgICJzdGVyZW90ZXN0LmMiCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyIgRklMRQkJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBzdGVyZW90ZXN0LmMJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiIFBVUlBPU0UJICAgIAkJCQkJCSAgICBcbiIKKyIJCSAgICAJCQkJCQkgICAgXG4iCisiICBEZW1vbnN0cmF0ZSBob3cgdXNlIHN0ZXJlbyBwb3J0IHRvIHBsYXkgYSBXQVYgZmlsZSB0byBzb3VuZAkgICAgXG4iCisiICBkZXZpY2Ugb3IgcmVjb3JkIHRvIGEgV0FWIGZpbGUgZnJvbSBzb3VuZCBkZXZpY2Ugd2l0aCBkaWZmZXJlbnQgIFxuIgorIiAgY2hhbm5lbCBjb3VudC4gICAgCQkJCQkJICAgIFxuIgorIgkJICAgIAkJCQkJCSAgICBcbiIKKyIgVVNBR0UJCSAgICAJCQkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiAgc3RlcmVvdGVzdCBbb3B0aW9uc10JV0FWCQkJCQkgICAgXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIgorIiAgT3B0aW9uczoJCQkJCQkJICAgIFxuIgorIiAgLW0sIC0tbW9kZT1OICAgICAgICAgIE9wZXJhdGlvbiBtb2RlOiAxID0gcGxheWluZywgMiA9IHJlY29yZGluZy5cbiIKKyIgIC1DLCAtLXJlYy1jaC1jbnQ9TiAgICBOdW1iZXIgb2YgY2hhbm5lbCBmb3IgcmVjb3JkaW5nIGZpbGUuCSAgICBcbiIKKyIgIC1jLCAtLXNuZC1jaC1jbnQ9TiAgICBOdW1iZXIgb2YgY2hhbm5lbCBmb3Igb3BlbmluZyBzb3VuZCBkZXZpY2UuXG4iCisiCQkgICAgCQkJCQkJICAgIFxuIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGptZWRpYV9lbmRwdCAqbWVkX2VuZHB0OworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKworICAgIHBqbWVkaWFfcG9ydCAqZmlsZV9wb3J0ID0gTlVMTDsKKyAgICBwam1lZGlhX3BvcnQgKnN0ZXJlb19wb3J0ID0gTlVMTDsKKyAgICBwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCA9IE5VTEw7CisKKyAgICBpbnQgZGV2X2lkID0gLTE7CisgICAgY2hhciB0bXBbMTBdOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGNoYXIgKndhdl9maWxlID0gTlVMTDsKKyAgICB1bnNpZ25lZCBtb2RlID0gMDsKKyAgICB1bnNpZ25lZCByZWNfY2hfY250ID0gMTsKKyAgICB1bnNpZ25lZCBzbmRfY2hfY250ID0gMjsKKworICAgIGVudW0geworCU9QVF9NT0RFCT0gJ20nLAorCU9QVF9SRUNfQ0hBTk5FTCA9ICdDJywKKwlPUFRfU05EX0NIQU5ORUwgPSAnYycsCisgICAgfTsKKworICAgIHN0cnVjdCBwal9nZXRvcHRfb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCXsgIm1vZGUiLAkgICAgMSwgMCwgT1BUX01PREUgfSwKKwl7ICJyZWMtY2gtY250IiwJICAgIDEsIDAsIE9QVF9SRUNfQ0hBTk5FTCB9LAorCXsgInNuZC1jaC1jbnQiLAkgICAgMSwgMCwgT1BUX1NORF9DSEFOTkVMIH0sCisJeyBOVUxMLCAwLCAwLCAwIH0sCisgICAgfTsKKworICAgIGludCBjOworICAgIGludCBvcHRpb25faW5kZXg7CisKKyAgICAvKiBNdXN0IGluaXQgUEpMSUIgZmlyc3Q6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogUGFyc2UgYXJndW1lbnRzICovCisgICAgcGpfb3B0aW5kID0gMDsKKyAgICB3aGlsZSgoYz1wal9nZXRvcHRfbG9uZyhhcmdjLGFyZ3YsICJtOkM6YzoiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSE9LTEpIHsKKworCXN3aXRjaCAoYykgeworCWNhc2UgT1BUX01PREU6CisJICAgIGlmIChtb2RlKSB7CisJCWFwcF9wZXJyb3IoVEhJU19GSUxFLCAiQ2Fubm90IHJlY29yZCBhbmQgcGxheSBhdCBvbmNlISIsIAorCQkJICAgUEpfRUlOVkFMKTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwkgICAgbW9kZSA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9SRUNfQ0hBTk5FTDoKKwkgICAgcmVjX2NoX2NudCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TTkRfQ0hBTk5FTDoKKwkgICAgc25kX2NoX2NudCA9IGF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGYoIkludmFsaWQgb3B0aW9ucyAlc1xuIiwgYXJndltwal9vcHRpbmRdKTsKKwkgICAgcHV0cyhkZXNjKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisgICAgfQorCisgICAgd2F2X2ZpbGUgPSBhcmd2W3BqX29wdGluZF07CisKKyAgICAvKiBWZXJpZnkgYXJndW1lbnRzLiAqLworICAgIGlmICghd2F2X2ZpbGUpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIldBViBmaWxlIG5vdCBzcGVjaWZpZWQhIiwgUEpfRUlOVkFMKTsKKwlwdXRzKGRlc2MpOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAoIXNuZF9jaF9jbnQgfHwgIXJlY19jaF9jbnQgfHwgcmVjX2NoX2NudCA+IDYpIHsKKwlhcHBfcGVycm9yKFRISVNfRklMRSwgIkludmFsaWQgb3IgdG9vIG1hbnkgY2hhbm5lbCBjb3VudCEiLCBQSl9FSU5WQUwpOworCXB1dHMoZGVzYyk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtb2RlICE9IE1PREVfUkVDT1JEICYmIG1vZGUgIT0gTU9ERV9QTEFZKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJJbnZhbGlkIG9wZXJhdGlvbiBtb2RlISIsIFBKX0VJTlZBTCk7CisJcHV0cyhkZXNjKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBhIHBvb2wgZmFjdG9yeSBiZWZvcmUgd2UgY2FuIGFsbG9jYXRlIGFueSBtZW1vcnkuICovCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIC8qIAorICAgICAqIEluaXRpYWxpemUgbWVkaWEgZW5kcG9pbnQuCisgICAgICogVGhpcyB3aWxsIGltcGxpY2l0bHkgaW5pdGlhbGl6ZSBQSk1FRElBIHRvby4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMSwgJm1lZF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBDcmVhdGUgbWVtb3J5IHBvb2wgZm9yIG91ciBmaWxlIHBsYXllciAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggJmNwLmZhY3RvcnksCSAgICAvKiBwb29sIGZhY3RvcnkJICAgICovCisJCQkgICAiYXBwIiwJICAgIC8qIHBvb2wgbmFtZS4JICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5pdCBzaXplCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluY3JlbWVudCBzaXplCSAgICAqLworCQkJICAgTlVMTAkJICAgIC8qIGNhbGxiYWNrIG9uIGVycm9yICAgICovCisJCQkgICApOworCisgICAgaWYgKG1vZGUgPT0gTU9ERV9QTEFZKSB7CisJLyogQ3JlYXRlIFdBVkUgZmlsZSBwbGF5ZXIgcG9ydC4gKi8KKwlzdGF0dXMgPSBwam1lZGlhX3dhdl9wbGF5ZXJfcG9ydF9jcmVhdGUoIHBvb2wsIHdhdl9maWxlLCBQVElNRSwgMCwKKwkJCQkJCSAwLCAmZmlsZV9wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gb3BlbiBmaWxlIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJLyogQ3JlYXRlIHNvdW5kIHBsYXllciBwb3J0LiAqLworCXN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlX3BsYXllciggCisJCSAgICAgcG9vbCwJCQkJLyogcG9vbAkJICAgICAgKi8KKwkJICAgICBkZXZfaWQsCQkJCS8qIGRldmljZSBpZC4JICAgICAgKi8KKwkJICAgICBQSk1FRElBX1BJQV9TUkFURSgmZmlsZV9wb3J0LT5pbmZvKSwvKiBjbG9jayByYXRlLgkgICAgICAqLworCQkgICAgIHNuZF9jaF9jbnQsCQkJLyogIyBvZiBjaGFubmVscy4gICAgICovCisJCSAgICAgc25kX2NoX2NudCAqIFBUSU1FICoJCS8qIHNhbXBsZXMgcGVyIGZyYW1lLiAqLworCQkgICAgIFBKTUVESUFfUElBX1NSQVRFKCZmaWxlX3BvcnQtPmluZm8pIC8gMTAwMCwKKwkJICAgICBQSk1FRElBX1BJQV9CSVRTKCZmaWxlX3BvcnQtPmluZm8pLC8qIGJpdHMgcGVyIHNhbXBsZS4gICAqLworCQkgICAgIDAsCQkJCQkvKiBvcHRpb25zCSAgICAgICovCisJCSAgICAgJnNuZF9wb3J0CQkJCS8qIHJldHVybmVkIHBvcnQgICAgICAqLworCQkgICAgICk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIG9wZW4gc291bmQgZGV2aWNlIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJaWYgKHNuZF9jaF9jbnQgIT0gUEpNRURJQV9QSUFfQ0NOVCgmZmlsZV9wb3J0LT5pbmZvKSkgeworCSAgICBzdGF0dXMgPSBwam1lZGlhX3N0ZXJlb19wb3J0X2NyZWF0ZSggcG9vbCwKKwkJCQkJCSBmaWxlX3BvcnQsCisJCQkJCQkgc25kX2NoX2NudCwKKwkJCQkJCSAwLAorCQkJCQkJICZzdGVyZW9fcG9ydCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBjcmVhdGUgc3RlcmVvIHBvcnQiLCBzdGF0dXMpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChzbmRfcG9ydCwgc3RlcmVvX3BvcnQpOworCX0gZWxzZSB7CisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChzbmRfcG9ydCwgZmlsZV9wb3J0KTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY29ubmVjdCBzb3VuZCBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisgICAgfSBlbHNlIHsKKwkvKiBDcmVhdGUgV0FWRSBmaWxlIHdyaXRlciBwb3J0LiAqLworCXN0YXR1cyA9IHBqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X2NyZWF0ZShwb29sLCB3YXZfZmlsZSwKKwkJCQkJCVJFQ19DTE9DS19SQVRFLAorCQkJCQkJcmVjX2NoX2NudCwKKwkJCQkJCXJlY19jaF9jbnQgKiBQVElNRSAqIAorCQkJCQkJUkVDX0NMT0NLX1JBVEUgLyAxMDAwLAorCQkJCQkJTkJJVFMsCisJCQkJCQkwLCAwLCAKKwkJCQkJCSZmaWxlX3BvcnQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBvcGVuIGZpbGUiLCBzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBDcmVhdGUgc291bmQgcGxheWVyIHBvcnQuICovCisJc3RhdHVzID0gcGptZWRpYV9zbmRfcG9ydF9jcmVhdGVfcmVjKCAKKwkJCSBwb29sLAkJCSAgICAvKiBwb29sCQkgICAgKi8KKwkJCSBkZXZfaWQsCQkgICAgLyogZGV2aWNlIGlkLgkgICAgKi8KKwkJCSBSRUNfQ0xPQ0tfUkFURSwJICAgIC8qIGNsb2NrIHJhdGUuCSAgICAqLworCQkJIHNuZF9jaF9jbnQsCQkgICAgLyogIyBvZiBjaGFubmVscy4JICAgICovCisJCQkgc25kX2NoX2NudCAqIFBUSU1FICogCisJCQkgUkVDX0NMT0NLX1JBVEUgLyAxMDAwLAkgICAgLyogc2FtcGxlcyBwZXIgZnJhbWUuICAgKi8KKwkJCSBOQklUUywJCQkgICAgLyogYml0cyBwZXIgc2FtcGxlLgkgICAgKi8KKwkJCSAwLAkJCSAgICAvKiBvcHRpb25zCQkgICAgKi8KKwkJCSAmc25kX3BvcnQJCSAgICAvKiByZXR1cm5lZCBwb3J0CSAgICAqLworCQkgICAgICk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIG9wZW4gc291bmQgZGV2aWNlIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJaWYgKHJlY19jaF9jbnQgIT0gc25kX2NoX2NudCkgeworCSAgICBzdGF0dXMgPSBwam1lZGlhX3N0ZXJlb19wb3J0X2NyZWF0ZSggcG9vbCwKKwkJCQkJCSBmaWxlX3BvcnQsCisJCQkJCQkgc25kX2NoX2NudCwKKwkJCQkJCSAwLAorCQkJCQkJICZzdGVyZW9fcG9ydCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKFRISVNfRklMRSwgIlVuYWJsZSB0byBjcmVhdGUgc3RlcmVvIHBvcnQiLCBzdGF0dXMpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChzbmRfcG9ydCwgc3RlcmVvX3BvcnQpOworCX0gZWxzZSB7CisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY29ubmVjdChzbmRfcG9ydCwgZmlsZV9wb3J0KTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY29ubmVjdCBzb3VuZCBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAgIC8qIER1bXAgbWVtb3J5IHVzYWdlICovCisgICAgZHVtcF9wb29sX3VzYWdlKFRISVNfRklMRSwgJmNwKTsKKworICAgIC8qIAorICAgICAqIEZpbGUgc2hvdWxkIGJlIHBsYXlpbmcgYW5kIGxvb3Bpbmcgbm93LCB1c2luZyBzb3VuZCBkZXZpY2UncyB0aHJlYWQuIAorICAgICAqLworCisKKyAgICAvKiBTbGVlcCB0byBhbGxvdyBsb2cgbWVzc2FnZXMgdG8gZmx1c2ggKi8KKyAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKworICAgIHByaW50ZigiTW9kZSA9ICVzXG4iLCAobW9kZSA9PSBNT0RFX1BMQVk/ICJwbGF5aW5nIiA6ICJyZWNvcmRpbmciKSApOworICAgIHByaW50ZigiRmlsZSAgcG9ydCBjaGFubmVsIGNvdW50ID0gJWRcbiIsIFBKTUVESUFfUElBX0NDTlQoJmZpbGVfcG9ydC0+aW5mbykpOworICAgIHByaW50ZigiU291bmQgcG9ydCBjaGFubmVsIGNvdW50ID0gJWRcbiIsIAorCSAgICBQSk1FRElBX1BJQV9DQ05UKCZwam1lZGlhX3NuZF9wb3J0X2dldF9wb3J0KHNuZF9wb3J0KS0+aW5mbykpOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIlByZXNzIDxFTlRFUj4gdG8gc3RvcCBhbmQgcXVpdCIpOworCisgICAgaWYgKGZnZXRzKHRtcCwgc2l6ZW9mKHRtcCksIHN0ZGluKSA9PSBOVUxMKSB7CisJcHV0cygiRU9GIHdoaWxlIHJlYWRpbmcgc3RkaW4sIHdpbGwgcXVpdCBub3cuLiIpOworICAgIH0KKyAgICAKKyAgICAvKiBTdGFydCBkZWluaXRpYWxpemF0aW9uOiAqLworCisKKyAgICAvKiBEZXN0cm95IHNvdW5kIGRldmljZSAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfZGVzdHJveSggc25kX3BvcnQgKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogRGVzdHJveSBzdGVyZW8gcG9ydCBhbmQgZmlsZV9wb3J0LiAKKyAgICAgKiBTdGVyZW8gcG9ydCB3aWxsIGRlc3Ryb3kgYWxsIGRvd25zdHJlYW0gcG9ydHMgKGUuZy4gdGhlIGZpbGUgcG9ydCkKKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3BvcnRfZGVzdHJveSggc3RlcmVvX3BvcnQ/IHN0ZXJlb19wb3J0IDogZmlsZV9wb3J0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogUmVsZWFzZSBhcHBsaWNhdGlvbiBwb29sICovCisgICAgcGpfcG9vbF9yZWxlYXNlKCBwb29sICk7CisKKyAgICAvKiBEZXN0cm95IG1lZGlhIGVuZHBvaW50LiAqLworICAgIHBqbWVkaWFfZW5kcHRfZGVzdHJveSggbWVkX2VuZHB0ICk7CisKKyAgICAvKiBEZXN0cm95IHBvb2wgZmFjdG9yeSAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCAmY3AgKTsKKworICAgIC8qIFNodXRkb3duIFBKTElCICovCisgICAgcGpfc2h1dGRvd24oKTsKKworCisgICAgLyogRG9uZS4gKi8KKyAgICByZXR1cm4gMDsKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zdHJlYW11dGlsLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0cmVhbXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODk5YzJhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zdHJlYW11dGlsLmMKQEAgLTAsMCArMSwxMTc2IEBACisvKiAkSWQ6IHN0cmVhbXV0aWwuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGptZWRpYV9zYW1wbGVzX3N0cmVhbXV0aWxfYyBTYW1wbGVzOiBSZW1vdGUgU3RyZWFtaW5nCisgKgorICogVGhpcyBleGFtcGxlIG1haW5seSBkZW1vbnN0cmF0ZXMgaG93IHRvIHN0cmVhbSBtZWRpYSBmaWxlIHRvIHJlbW90ZQorICogcGVlciB1c2luZyBSVFAuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RyZWFtdXRpbC5jCisgKgorICogXGluY2x1ZGVsaW5lbm8gc3RyZWFtdXRpbC5jCisgKi8KKworI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqbWVkaWEuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjLmg+CisjaW5jbHVkZSA8cGptZWRpYS90cmFuc3BvcnRfc3J0cC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CS8qIGF0b2koKSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ1dGlsLmgiCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2MgPSAKKyAiIHN0cmVhbXV0aWwJCQkJCQkJCVxuIgorICIJCQkJCQkJCQlcbiIKKyAiIFBVUlBPU0U6CQkJCQkJCQlcbiIKKyAiICBEZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHBqbWVkaWEgc3RyZWFtIGNvbXBvbmVudCB0byB0cmFuc21pdC9yZWNlaXZlIFxuIgorICIgIFJUUCBwYWNrZXRzIHRvL2Zyb20gc291bmQgZGV2aWNlLgkJICAgIAkJCVxuIgorICJcbiIKKyAiXG4iCisgIiBVU0FHRToJCQkJCQkJCVxuIgorICIgIHN0cmVhbXV0aWwgW29wdGlvbnNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIlxuIgorICJcbiIKKyAiIE9wdGlvbnM6XG4iCisgIiAgLS1jb2RlYz1DT0RFQyAgICAgICAgIFNldCB0aGUgY29kZWMgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiICAtLWxvY2FsLXBvcnQ9UE9SVCAgICAgU2V0IGxvY2FsIFJUUCBwb3J0IChkZWZhdWx0PTQwMDApCQlcbiIKKyAiICAtLXJlbW90ZT1JUDpQT1JUICAgICAgU2V0IHRoZSByZW1vdGUgcGVlci4gSWYgdGhpcyBvcHRpb24gaXMgc2V0LAlcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gd2lsbCB0cmFuc21pdCBSVFAgYXVkaW8gdG8gdGhlCVxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYWRkcmVzcy4gKGRlZmF1bHQ6IHJlY3Ygb25seSkJXG4iCisgIiAgLS1wbGF5LWZpbGU9V0FWICAgICAgIFNlbmQgYXVkaW8gZnJvbSB0aGUgV0FWIGZpbGUgaW5zdGVhZCBvZiBmcm9tCVxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291bmQgZGV2aWNlLgkJCQlcbiIKKyAiICAtLXJlY29yZC1maWxlPVdBViAgICAgUmVjb3JkIGluY29taW5nIGF1ZGlvIHRvIFdBViBmaWxlIGluc3RlYWQgb2YJXG4iCisgIiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcgaXQgdG8gc291bmQgZGV2aWNlLgkJCVxuIgorICIgIC0tc2VuZC1yZWN2ICAgICAgICAgICBTZXQgc3RyZWFtIGRpcmVjdGlvbiB0byBiaWRpcmVjdGlvbmFsLiAgICAgICAgXG4iCisgIiAgLS1zZW5kLW9ubHkgICAgICAgICAgIFNldCBzdHJlYW0gZGlyZWN0aW9uIHRvIHNlbmQgb25seQkJXG4iCisgIiAgLS1yZWN2LW9ubHkgICAgICAgICAgIFNldCBzdHJlYW0gZGlyZWN0aW9uIHRvIHJlY3Ygb25seSAoZGVmYXVsdCkgICBcbiIKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAiICAtLXVzZS1zcnRwWz1OQU1FXSAgICAgRW5hYmxlIFNSVFAgd2l0aCBjcnlwdG8gc3VpdGUgTkFNRSAgICAgICAgICAgIFxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICBlLmc6IEFFU19DTV8xMjhfSE1BQ19TSEExXzgwIChkZWZhdWx0KSwgICAgICAgXG4iCisgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NNXzEyOF9ITUFDX1NIQTFfMzIgICAgICAgICAgICAgICAgICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgb3B0aW9uIGFsb25nIHdpdGggdGhlIFRYICYgUlgga2V5cywgIFxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRlZCBvZiA2MCBoZXggZGlnaXRzIChlLmc6IEUxNDhEQS4uKSAgICAgIFxuIgorICIgIC0tc3J0cC10eC1rZXkgICAgICAgICBTUlRQIGtleSBmb3IgdHJhbnNtaXRpbmcgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIiAgLS1zcnRwLXJ4LWtleSAgICAgICAgIFNSVFAga2V5IGZvciByZWNlaXZpbmcgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyNlbmRpZgorCisgIlxuIgorOworCisKKworCisjZGVmaW5lIFRISVNfRklMRQkic3RyZWFtLmMiCisKKworCisvKiBQcm90b3R5cGUgKi8KK3N0YXRpYyB2b2lkIHByaW50X3N0cmVhbV9zdGF0KHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sIAorCQkJICAgICAgY29uc3QgcGptZWRpYV9jb2RlY19wYXJhbSAqY29kZWNfcGFyYW0pOworCisvKiBQcm90b3R5cGUgZm9yIExJQlNSVFAgdXRpbGl0eSBpbiBmaWxlIGRhdGF0eXBlcy5jICovCitpbnQgaGV4X3N0cmluZ190b19vY3RldF9zdHJpbmcoY2hhciAqcmF3LCBjaGFyICpoZXgsIGludCBsZW4pOworCisvKiAKKyAqIFJlZ2lzdGVyIGFsbCBjb2RlY3MuIAorICovCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9jb2RlY3MocGptZWRpYV9lbmRwdCAqbWVkX2VuZHB0KQoreworICAgIHJldHVybiBwam1lZGlhX2NvZGVjX3JlZ2lzdGVyX2F1ZGlvX2NvZGVjcyhtZWRfZW5kcHQsIE5VTEwpOworfQorCisKKy8qIAorICogQ3JlYXRlIHN0cmVhbSBiYXNlZCBvbiB0aGUgY29kZWMsIGRpciwgcmVtb3RlIGFkZHJlc3MsIGV0Yy4gCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBjcmVhdGVfc3RyZWFtKCBwal9wb29sX3QgKnBvb2wsCisJCQkJICBwam1lZGlhX2VuZHB0ICptZWRfZW5kcHQsCisJCQkJICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKmNvZGVjX2luZm8sCisJCQkJICBwam1lZGlhX2RpciBkaXIsCisJCQkJICBwal91aW50MTZfdCBsb2NhbF9wb3J0LAorCQkJCSAgY29uc3QgcGpfc29ja2FkZHJfaW4gKnJlbV9hZGRyLAorI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKwkJCQkgIHBqX2Jvb2xfdCB1c2Vfc3J0cCwKKwkJCQkgIGNvbnN0IHBqX3N0cl90ICpjcnlwdG9fc3VpdGUsCisJCQkJICBjb25zdCBwal9zdHJfdCAqc3J0cF90eF9rZXksCisJCQkJICBjb25zdCBwal9zdHJfdCAqc3J0cF9yeF9rZXksCisjZW5kaWYKKwkJCQkgIHBqbWVkaWFfc3RyZWFtICoqcF9zdHJlYW0gKQoreworICAgIHBqbWVkaWFfc3RyZWFtX2luZm8gaW5mbzsKKyAgICBwam1lZGlhX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorICAgIHBqbWVkaWFfdHJhbnNwb3J0ICpzcnRwX3RwID0gTlVMTDsKKyNlbmRpZgorCisKKyAgICAvKiBSZXNldCBzdHJlYW0gaW5mby4gKi8KKyAgICBwal9iemVybygmaW5mbywgc2l6ZW9mKGluZm8pKTsKKworCisgICAgLyogSW5pdGlhbGl6ZSBzdHJlYW0gaW5mbyBmb3JtYXRzICovCisgICAgaW5mby50eXBlID0gUEpNRURJQV9UWVBFX0FVRElPOworICAgIGluZm8uZGlyID0gZGlyOworICAgIHBqX21lbWNweSgmaW5mby5mbXQsIGNvZGVjX2luZm8sIHNpemVvZihwam1lZGlhX2NvZGVjX2luZm8pKTsKKyAgICBpbmZvLnR4X3B0ID0gY29kZWNfaW5mby0+cHQ7CisgICAgaW5mby5zc3JjID0gcGpfcmFuZCgpOworICAgIAorI2lmIFBKTUVESUFfSEFTX1JUQ1BfWFIgJiYgUEpNRURJQV9TVFJFQU1fRU5BQkxFX1hSCisgICAgLyogU2V0IGRlZmF1bHQgUlRDUCBYUiBlbmFibGVkL2Rpc2FibGVkICovCisgICAgaW5mby5ydGNwX3hyX2VuYWJsZWQgPSBQSl9UUlVFOworI2VuZGlmCisKKyAgICAvKiBDb3B5IHJlbW90ZSBhZGRyZXNzICovCisgICAgcGpfbWVtY3B5KCZpbmZvLnJlbV9hZGRyLCByZW1fYWRkciwgc2l6ZW9mKHBqX3NvY2thZGRyX2luKSk7CisKKyAgICAvKiBJZiByZW1vdGUgYWRkcmVzcyBpcyBub3Qgc2V0LCBzZXQgdG8gYW4gYXJiaXRyYXJ5IGFkZHJlc3MKKyAgICAgKiAob3RoZXJ3aXNlIHN0cmVhbSB3aWxsIGFzc2VydCkuCisgICAgICovCisgICAgaWYgKGluZm8ucmVtX2FkZHIuYWRkci5zYV9mYW1pbHkgPT0gMCkgeworCWNvbnN0IHBqX3N0cl90IGFkZHIgPSBwal9zdHIoIjEyNy4wLjAuMSIpOworCXBqX3NvY2thZGRyX2luX2luaXQoJmluZm8ucmVtX2FkZHIuaXB2NCwgJmFkZHIsIDApOworICAgIH0KKworICAgIC8qIENyZWF0ZSBtZWRpYSB0cmFuc3BvcnQgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF91ZHBfY3JlYXRlKG1lZF9lbmRwdCwgTlVMTCwgbG9jYWxfcG9ydCwKKwkJCQkJICAwLCAmdHJhbnNwb3J0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAgICAvKiBDaGVjayBpZiBTUlRQIGVuYWJsZWQgKi8KKyAgICBpZiAodXNlX3NydHApIHsKKwlwam1lZGlhX3NydHBfY3J5cHRvIHR4X3BsYywgcnhfcGxjOworCisJc3RhdHVzID0gcGptZWRpYV90cmFuc3BvcnRfc3J0cF9jcmVhdGUobWVkX2VuZHB0LCB0cmFuc3BvcnQsIAorCQkJCQkgICAgICAgTlVMTCwgJnNydHBfdHApOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIHN0YXR1czsKKworCXBqX2J6ZXJvKCZ0eF9wbGMsIHNpemVvZihwam1lZGlhX3NydHBfY3J5cHRvKSk7CisJcGpfYnplcm8oJnJ4X3BsYywgc2l6ZW9mKHBqbWVkaWFfc3J0cF9jcnlwdG8pKTsKKworCXR4X3BsYy5rZXkgPSAqc3J0cF90eF9rZXk7CisJdHhfcGxjLm5hbWUgPSAqY3J5cHRvX3N1aXRlOworCXJ4X3BsYy5rZXkgPSAqc3J0cF9yeF9rZXk7CisJcnhfcGxjLm5hbWUgPSAqY3J5cHRvX3N1aXRlOworCQorCXN0YXR1cyA9IHBqbWVkaWFfdHJhbnNwb3J0X3NydHBfc3RhcnQoc3J0cF90cCwgJnR4X3BsYywgJnJ4X3BsYyk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworCisJdHJhbnNwb3J0ID0gc3J0cF90cDsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIE5vdyB0aGF0IHRoZSBzdHJlYW0gaW5mbyBpcyBpbml0aWFsaXplZCwgd2UgY2FuIGNyZWF0ZSB0aGUgCisgICAgICogc3RyZWFtLgorICAgICAqLworCisgICAgc3RhdHVzID0gcGptZWRpYV9zdHJlYW1fY3JlYXRlKCBtZWRfZW5kcHQsIHBvb2wsICZpbmZvLCAKKwkJCQkgICAgdHJhbnNwb3J0LCAKKwkJCQkgICAgTlVMTCwgcF9zdHJlYW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjcmVhdGluZyBzdHJlYW0iLCBzdGF0dXMpOworCXBqbWVkaWFfdHJhbnNwb3J0X2Nsb3NlKHRyYW5zcG9ydCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiB1c2FnZSgpCisgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKCkKK3sKKyAgICBwdXRzKGRlc2MpOworfQorCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGptZWRpYV9wb3J0ICpyZWNfZmlsZV9wb3J0ID0gTlVMTCwgKnBsYXlfZmlsZV9wb3J0ID0gTlVMTDsKKyAgICBwam1lZGlhX21hc3Rlcl9wb3J0ICptYXN0ZXJfcG9ydCA9IE5VTEw7CisgICAgcGptZWRpYV9zbmRfcG9ydCAqc25kX3BvcnQgPSBOVUxMOworICAgIHBqbWVkaWFfc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgIHBqbWVkaWFfcG9ydCAqc3RyZWFtX3BvcnQ7CisgICAgY2hhciB0bXBbMTBdOworICAgIHBqX3N0YXR1c190IHN0YXR1czsgCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisgICAgLyogU1JUUCB2YXJpYWJsZXMgKi8KKyAgICBwal9ib29sX3QgdXNlX3NydHAgPSBQSl9GQUxTRTsKKyAgICBjaGFyIHRtcF90eF9rZXlbNjRdOworICAgIGNoYXIgdG1wX3J4X2tleVs2NF07CisgICAgcGpfc3RyX3QgIHNydHBfdHhfa2V5ID0ge05VTEwsIDB9OworICAgIHBqX3N0cl90ICBzcnRwX3J4X2tleSA9IHtOVUxMLCAwfTsKKyAgICBwal9zdHJfdCAgc3J0cF9jcnlwdG9fc3VpdGUgPSB7TlVMTCwgMH07CisgICAgaW50CXRtcF9rZXlfbGVuOworI2VuZGlmCisKKyAgICAvKiBEZWZhdWx0IHZhbHVlcyAqLworICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqY29kZWNfaW5mbzsKKyAgICBwam1lZGlhX2NvZGVjX3BhcmFtIGNvZGVjX3BhcmFtOworICAgIHBqbWVkaWFfZGlyIGRpciA9IFBKTUVESUFfRElSX0RFQ09ESU5HOworICAgIHBqX3NvY2thZGRyX2luIHJlbW90ZV9hZGRyOworICAgIHBqX3VpbnQxNl90IGxvY2FsX3BvcnQgPSA0MDAwOworICAgIGNoYXIgKmNvZGVjX2lkID0gTlVMTDsKKyAgICBjaGFyICpyZWNfZmlsZSA9IE5VTEw7CisgICAgY2hhciAqcGxheV9maWxlID0gTlVMTDsKKworICAgIGVudW0geworCU9QVF9DT0RFQwk9ICdjJywKKwlPUFRfTE9DQUxfUE9SVAk9ICdwJywKKwlPUFRfUkVNT1RFCT0gJ3InLAorCU9QVF9QTEFZX0ZJTEUJPSAndycsCisJT1BUX1JFQ09SRF9GSUxFCT0gJ1InLAorCU9QVF9TRU5EX1JFQ1YJPSAnYicsCisJT1BUX1NFTkRfT05MWQk9ICdzJywKKwlPUFRfUkVDVl9PTkxZCT0gJ2knLAorI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKwlPUFRfVVNFX1NSVFAJPSAnUycsCisjZW5kaWYKKwlPUFRfU1JUUF9UWF9LRVkJPSAneCcsCisJT1BUX1NSVFBfUlhfS0VZCT0gJ3knLAorCU9QVF9IRUxQCT0gJ2gnLAorICAgIH07CisKKyAgICBzdHJ1Y3QgcGpfZ2V0b3B0X29wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJjb2RlYyIsCSAgICAxLCAwLCBPUFRfQ09ERUMgfSwKKwl7ICJsb2NhbC1wb3J0IiwJICAgIDEsIDAsIE9QVF9MT0NBTF9QT1JUIH0sCisJeyAicmVtb3RlIiwJICAgIDEsIDAsIE9QVF9SRU1PVEUgfSwKKwl7ICJwbGF5LWZpbGUiLAkgICAgMSwgMCwgT1BUX1BMQVlfRklMRSB9LAorCXsgInJlY29yZC1maWxlIiwgICAgMSwgMCwgT1BUX1JFQ09SRF9GSUxFIH0sCisJeyAic2VuZC1yZWN2IiwgICAgICAwLCAwLCBPUFRfU0VORF9SRUNWIH0sCisJeyAic2VuZC1vbmx5IiwgICAgICAwLCAwLCBPUFRfU0VORF9PTkxZIH0sCisJeyAicmVjdi1vbmx5IiwgICAgICAwLCAwLCBPUFRfUkVDVl9PTkxZIH0sCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorCXsgInVzZS1zcnRwIiwJICAgIDIsIDAsIE9QVF9VU0VfU1JUUCB9LAorCXsgInNydHAtdHgta2V5IiwgICAgMSwgMCwgT1BUX1NSVFBfVFhfS0VZIH0sCisJeyAic3J0cC1yeC1rZXkiLCAgICAxLCAwLCBPUFRfU1JUUF9SWF9LRVkgfSwKKyNlbmRpZgorCXsgImhlbHAiLAkgICAgMCwgMCwgT1BUX0hFTFAgfSwKKwl7IE5VTEwsIDAsIDAsIDAgfSwKKyAgICB9OworCisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKworCisgICAgcGpfYnplcm8oJnJlbW90ZV9hZGRyLCBzaXplb2YocmVtb3RlX2FkZHIpKTsKKworCisgICAgLyogaW5pdCBQSkxJQiA6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBQYXJzZSBhcmd1bWVudHMgKi8KKyAgICBwal9vcHRpbmQgPSAwOworICAgIHdoaWxlKChjPXBqX2dldG9wdF9sb25nKGFyZ2MsYXJndiwgImgiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSE9LTEpIHsKKworCXN3aXRjaCAoYykgeworCWNhc2UgT1BUX0NPREVDOgorCSAgICBjb2RlY19pZCA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9MT0NBTF9QT1JUOgorCSAgICBsb2NhbF9wb3J0ID0gKHBqX3VpbnQxNl90KSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGlmIChsb2NhbF9wb3J0IDwgMSkgeworCQlwcmludGYoIkVycm9yOiBpbnZhbGlkIGxvY2FsIHBvcnQgJXNcbiIsIHBqX29wdGFyZyk7CisJCXJldHVybiAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVNT1RFOgorCSAgICB7CisJCXBqX3N0cl90IGlwID0gcGpfc3RyKHN0cnRvayhwal9vcHRhcmcsICI6IikpOworCQlwal91aW50MTZfdCBwb3J0ID0gKHBqX3VpbnQxNl90KSBhdG9pKHN0cnRvayhOVUxMLCAiOiIpKTsKKworCQlzdGF0dXMgPSBwal9zb2NrYWRkcl9pbl9pbml0KCZyZW1vdGVfYWRkciwgJmlwLCBwb3J0KTsKKwkJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIkludmFsaWQgcmVtb3RlIGFkZHJlc3MiLCBzdGF0dXMpOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BMQVlfRklMRToKKwkgICAgcGxheV9maWxlID0gcGpfb3B0YXJnOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1JFQ09SRF9GSUxFOgorCSAgICByZWNfZmlsZSA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TRU5EX1JFQ1Y6CisJICAgIGRpciA9IFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1NFTkRfT05MWToKKwkgICAgZGlyID0gUEpNRURJQV9ESVJfRU5DT0RJTkc7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVDVl9PTkxZOgorCSAgICBkaXIgPSBQSk1FRElBX0RJUl9ERUNPRElORzsKKwkgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisJY2FzZSBPUFRfVVNFX1NSVFA6CisJICAgIHVzZV9zcnRwID0gUEpfVFJVRTsKKwkgICAgaWYgKHBqX29wdGFyZykgeworCQlwal9zdHJzZXQoJnNydHBfY3J5cHRvX3N1aXRlLCBwal9vcHRhcmcsIHN0cmxlbihwal9vcHRhcmcpKTsKKwkgICAgfSBlbHNlIHsKKwkJc3J0cF9jcnlwdG9fc3VpdGUgPSBwal9zdHIoIkFFU19DTV8xMjhfSE1BQ19TSEExXzgwIik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TUlRQX1RYX0tFWToKKwkgICAgdG1wX2tleV9sZW4gPSBoZXhfc3RyaW5nX3RvX29jdGV0X3N0cmluZyh0bXBfdHhfa2V5LCBwal9vcHRhcmcsIAorCQkJCQkJICAgICAoaW50KXN0cmxlbihwal9vcHRhcmcpKTsKKwkgICAgcGpfc3Ryc2V0KCZzcnRwX3R4X2tleSwgdG1wX3R4X2tleSwgdG1wX2tleV9sZW4vMik7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfU1JUUF9SWF9LRVk6CisJICAgIHRtcF9rZXlfbGVuID0gaGV4X3N0cmluZ190b19vY3RldF9zdHJpbmcodG1wX3J4X2tleSwgcGpfb3B0YXJnLCAKKwkJCQkJCSAgICAgKGludClzdHJsZW4ocGpfb3B0YXJnKSk7CisJICAgIHBqX3N0cnNldCgmc3J0cF9yeF9rZXksIHRtcF9yeF9rZXksIHRtcF9rZXlfbGVuLzIpOworCSAgICBicmVhazsKKyNlbmRpZgorCisJY2FzZSBPUFRfSEVMUDoKKwkgICAgdXNhZ2UoKTsKKwkgICAgcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGYoIkludmFsaWQgb3B0aW9ucyAlc1xuIiwgYXJndltwal9vcHRpbmRdKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisgICAgfQorCisKKyAgICAvKiBWZXJpZnkgYXJndW1lbnRzLiAqLworICAgIGlmIChkaXIgJiBQSk1FRElBX0RJUl9FTkNPRElORykgeworCWlmIChyZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gMCkgeworCSAgICBwcmludGYoIkVycm9yOiByZW1vdGUgYWRkcmVzcyBtdXN0IGJlIHNldFxuIik7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgICBpZiAocGxheV9maWxlICE9IE5VTEwgJiYgZGlyICE9IFBKTUVESUFfRElSX0VOQ09ESU5HKSB7CisJcHJpbnRmKCJEaXJlY3Rpb24gaXMgc2V0IHRvIC0tc2VuZC1vbmx5IGJlY2F1c2Ugb2YgLS1wbGF5LWZpbGVcbiIpOworCWRpciA9IFBKTUVESUFfRElSX0VOQ09ESU5HOworICAgIH0KKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAgICAvKiBTUlRQIHZhbGlkYXRpb24gKi8KKyAgICBpZiAodXNlX3NydHApIHsKKwlpZiAoIXNydHBfdHhfa2V5LnNsZW4gfHwgIXNydHBfcnhfa2V5LnNsZW4pCisJeworCSAgICBwcmludGYoIkVycm9yOiBLZXkgZm9yIGVhY2ggU1JUUCBzdHJlYW0gZGlyZWN0aW9uIG11c3QgYmUgc2V0XG4iKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogTXVzdCBjcmVhdGUgYSBwb29sIGZhY3RvcnkgYmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSBhbnkgbWVtb3J5LiAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeSwgMCk7CisKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIG1lZGlhIGVuZHBvaW50LgorICAgICAqIFRoaXMgd2lsbCBpbXBsaWNpdGx5IGluaXRpYWxpemUgUEpNRURJQSB0b28uCisgICAgICovCisgICAgc3RhdHVzID0gcGptZWRpYV9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIE5VTEwsIDEsICZtZWRfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogQ3JlYXRlIG1lbW9yeSBwb29sIGZvciBhcHBsaWNhdGlvbiBwdXJwb3NlICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJhcHAiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKworICAgIC8qIFJlZ2lzdGVyIGFsbCBzdXBwb3J0ZWQgY29kZWNzICovCisgICAgc3RhdHVzID0gaW5pdF9jb2RlY3MobWVkX2VuZHB0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogRmluZCB3aGljaCBjb2RlYyB0byB1c2UuICovCisgICAgaWYgKGNvZGVjX2lkKSB7CisJdW5zaWduZWQgY291bnQgPSAxOworCXBqX3N0cl90IHN0cl9jb2RlY19pZCA9IHBqX3N0cihjb2RlY19pZCk7CisJcGptZWRpYV9jb2RlY19tZ3IgKmNvZGVjX21nciA9IHBqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncihtZWRfZW5kcHQpOworCXN0YXR1cyA9IHBqbWVkaWFfY29kZWNfbWdyX2ZpbmRfY29kZWNzX2J5X2lkKCBjb2RlY19tZ3IsCisJCQkJCQkgICAgICAmc3RyX2NvZGVjX2lkLCAmY291bnQsCisJCQkJCQkgICAgICAmY29kZWNfaW5mbywgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHByaW50ZigiRXJyb3I6IHVuYWJsZSB0byBmaW5kIGNvZGVjICVzXG4iLCBjb2RlY19pZCk7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9IGVsc2UgeworCS8qIERlZmF1bHQgdG8gcGNtdSAqLworCXBqbWVkaWFfY29kZWNfbWdyX2dldF9jb2RlY19pbmZvKCBwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IobWVkX2VuZHB0KSwKKwkJCQkJICAwLCAmY29kZWNfaW5mbyk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHN0cmVhbSBiYXNlZCBvbiBwcm9ncmFtIGFyZ3VtZW50cyAqLworICAgIHN0YXR1cyA9IGNyZWF0ZV9zdHJlYW0ocG9vbCwgbWVkX2VuZHB0LCBjb2RlY19pbmZvLCBkaXIsIGxvY2FsX3BvcnQsIAorCQkJICAgJnJlbW90ZV9hZGRyLCAKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisJCQkgICB1c2Vfc3J0cCwgJnNydHBfY3J5cHRvX3N1aXRlLCAKKwkJCSAgICZzcnRwX3R4X2tleSwgJnNydHBfcnhfa2V5LAorI2VuZGlmCisJCQkgICAmc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9leGl0OworCisgICAgLyogR2V0IGNvZGVjIGRlZmF1bHQgcGFyYW0gZm9yIGluZm8gKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSgKKwkJCQkgICAgcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKG1lZF9lbmRwdCksIAorCQkJCSAgICBjb2RlY19pbmZvLCAKKwkJCQkgICAgJmNvZGVjX3BhcmFtKTsKKyAgICAvKiBTaG91bGQgYmUgb2ssIGFzIGNyZWF0ZV9zdHJlYW0oKSBhYm92ZSBzdWNjZWVkZWQgKi8KKyAgICBwal9hc3NlcnQoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisgICAgLyogR2V0IHRoZSBwb3J0IGludGVyZmFjZSBvZiB0aGUgc3RyZWFtICovCisgICAgc3RhdHVzID0gcGptZWRpYV9zdHJlYW1fZ2V0X3BvcnQoIHN0cmVhbSwgJnN0cmVhbV9wb3J0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgaWYgKHBsYXlfZmlsZSkgeworCXVuc2lnbmVkIHdhdl9wdGltZTsKKworCXdhdl9wdGltZSA9IFBKTUVESUFfUElBX1BUSU1FKCZzdHJlYW1fcG9ydC0+aW5mbyk7CisJc3RhdHVzID0gcGptZWRpYV93YXZfcGxheWVyX3BvcnRfY3JlYXRlKHBvb2wsIHBsYXlfZmlsZSwgd2F2X3B0aW1lLAorCQkJCQkJMCwgLTEsICZwbGF5X2ZpbGVfcG9ydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIHVzZSBmaWxlIiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9leGl0OworCX0KKworCXN0YXR1cyA9IHBqbWVkaWFfbWFzdGVyX3BvcnRfY3JlYXRlKHBvb2wsIHBsYXlfZmlsZV9wb3J0LCBzdHJlYW1fcG9ydCwKKwkJCQkJICAgIDAsICZtYXN0ZXJfcG9ydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBtYXN0ZXIgcG9ydCIsIHN0YXR1cyk7CisJICAgIGdvdG8gb25fZXhpdDsKKwl9CisKKwlzdGF0dXMgPSBwam1lZGlhX21hc3Rlcl9wb3J0X3N0YXJ0KG1hc3Rlcl9wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBzdGFydGluZyBtYXN0ZXIgcG9ydCIsIHN0YXR1cyk7CisJICAgIGdvdG8gb25fZXhpdDsKKwl9CisKKwlwcmludGYoIlBsYXlpbmcgZnJvbSBXQVYgZmlsZSAlcy4uXG4iLCBwbGF5X2ZpbGUpOworCisgICAgfSBlbHNlIGlmIChyZWNfZmlsZSkgeworCisJc3RhdHVzID0gcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfY3JlYXRlKHBvb2wsIHJlY19maWxlLAorCQkJCQkgICAgICAgIFBKTUVESUFfUElBX1NSQVRFKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCSAgICAgICAgUEpNRURJQV9QSUFfQ0NOVCgmc3RyZWFtX3BvcnQtPmluZm8pLAorCQkJCQkgICAgICAgIFBKTUVESUFfUElBX1NQRigmc3RyZWFtX3BvcnQtPmluZm8pLAorCQkJCQkgICAgICAgIFBKTUVESUFfUElBX0JJVFMoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJCTAsIDAsICZyZWNfZmlsZV9wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gdXNlIGZpbGUiLCBzdGF0dXMpOworCSAgICBnb3RvIG9uX2V4aXQ7CisJfQorCisJc3RhdHVzID0gcGptZWRpYV9tYXN0ZXJfcG9ydF9jcmVhdGUocG9vbCwgc3RyZWFtX3BvcnQsIHJlY19maWxlX3BvcnQsIAorCQkJCQkgICAgMCwgJm1hc3Rlcl9wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcihUSElTX0ZJTEUsICJVbmFibGUgdG8gY3JlYXRlIG1hc3RlciBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9leGl0OworCX0KKworCXN0YXR1cyA9IHBqbWVkaWFfbWFzdGVyX3BvcnRfc3RhcnQobWFzdGVyX3BvcnQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIkVycm9yIHN0YXJ0aW5nIG1hc3RlciBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9leGl0OworCX0KKworCXByaW50ZigiUmVjb3JkaW5nIHRvIFdBViBmaWxlICVzLi5cbiIsIHJlY19maWxlKTsKKwkKKyAgICB9IGVsc2UgeworCisJLyogQ3JlYXRlIHNvdW5kIGRldmljZSBwb3J0LiAqLworCWlmIChkaXIgPT0gUEpNRURJQV9ESVJfRU5DT0RJTkdfREVDT0RJTkcpCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlKHBvb2wsIC0xLCAtMSwgCisJCQkJCVBKTUVESUFfUElBX1NSQVRFKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0NDTlQoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJUEpNRURJQV9QSUFfU1BGKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0JJVFMoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJMCwgJnNuZF9wb3J0KTsKKwllbHNlIGlmIChkaXIgPT0gUEpNRURJQV9ESVJfRU5DT0RJTkcpCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlX3JlYyhwb29sLCAtMSwgCisJCQkJCVBKTUVESUFfUElBX1NSQVRFKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0NDTlQoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJUEpNRURJQV9QSUFfU1BGKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0JJVFMoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJMCwgJnNuZF9wb3J0KTsKKwllbHNlCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlX3BsYXllcihwb29sLCAtMSwgCisJCQkJCVBKTUVESUFfUElBX1NSQVRFKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0NDTlQoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJUEpNRURJQV9QSUFfU1BGKCZzdHJlYW1fcG9ydC0+aW5mbyksCisJCQkJCVBKTUVESUFfUElBX0JJVFMoJnN0cmVhbV9wb3J0LT5pbmZvKSwKKwkJCQkJMCwgJnNuZF9wb3J0KTsKKworCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoVEhJU19GSUxFLCAiVW5hYmxlIHRvIGNyZWF0ZSBzb3VuZCBwb3J0Iiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9leGl0OworCX0KKworCS8qIENvbm5lY3Qgc291bmQgcG9ydCB0byBzdHJlYW0gKi8KKwlzdGF0dXMgPSBwam1lZGlhX3NuZF9wb3J0X2Nvbm5lY3QoIHNuZF9wb3J0LCBzdHJlYW1fcG9ydCApOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgfQorCisgICAgLyogU3RhcnQgc3RyZWFtaW5nICovCisgICAgcGptZWRpYV9zdHJlYW1fc3RhcnQoc3RyZWFtKTsKKworCisgICAgLyogRG9uZSAqLworCisgICAgaWYgKGRpciA9PSBQSk1FRElBX0RJUl9ERUNPRElORykKKwlwcmludGYoIlN0cmVhbSBpcyBhY3RpdmUsIGRpciBpcyByZWN2LW9ubHksIGxvY2FsIHBvcnQgaXMgJWRcbiIsCisJICAgICAgIGxvY2FsX3BvcnQpOworICAgIGVsc2UgaWYgKGRpciA9PSBQSk1FRElBX0RJUl9FTkNPRElORykKKwlwcmludGYoIlN0cmVhbSBpcyBhY3RpdmUsIGRpciBpcyBzZW5kLW9ubHksIHNlbmRpbmcgdG8gJXM6JWRcbiIsCisJICAgICAgIHBqX2luZXRfbnRvYShyZW1vdGVfYWRkci5zaW5fYWRkciksCisJICAgICAgIHBqX250b2hzKHJlbW90ZV9hZGRyLnNpbl9wb3J0KSk7CisgICAgZWxzZQorCXByaW50ZigiU3RyZWFtIGlzIGFjdGl2ZSwgc2VuZC9yZWN2LCBsb2NhbCBwb3J0IGlzICVkLCAiCisJICAgICAgICJzZW5kaW5nIHRvICVzOiVkXG4iLAorCSAgICAgICBsb2NhbF9wb3J0LAorCSAgICAgICBwal9pbmV0X250b2EocmVtb3RlX2FkZHIuc2luX2FkZHIpLAorCSAgICAgICBwal9udG9ocyhyZW1vdGVfYWRkci5zaW5fcG9ydCkpOworCisKKyAgICBmb3IgKDs7KSB7CisKKwlwdXRzKCIiKTsKKwlwdXRzKCJDb21tYW5kczoiKTsKKwlwdXRzKCIgIHMgICAgIERpc3BsYXkgbWVkaWEgc3RhdGlzdGljcyIpOworCXB1dHMoIiAgcSAgICAgUXVpdCIpOworCXB1dHMoIiIpOworCisJcHJpbnRmKCJDb21tYW5kOiAiKTsgZmZsdXNoKHN0ZG91dCk7CisKKwlpZiAoZmdldHModG1wLCBzaXplb2YodG1wKSwgc3RkaW4pID09IE5VTEwpIHsKKwkgICAgcHV0cygiRU9GIHdoaWxlIHJlYWRpbmcgc3RkaW4sIHdpbGwgcXVpdCBub3cuLiIpOworCSAgICBicmVhazsKKwl9CisKKwlpZiAodG1wWzBdID09ICdzJykKKwkgICAgcHJpbnRfc3RyZWFtX3N0YXQoc3RyZWFtLCAmY29kZWNfcGFyYW0pOworCWVsc2UgaWYgKHRtcFswXSA9PSAncScpCisJICAgIGJyZWFrOworCisgICAgfQorCisKKworICAgIC8qIFN0YXJ0IGRlaW5pdGlhbGl6YXRpb246ICovCitvbl9leGl0OgorCisgICAgLyogRGVzdHJveSBzb3VuZCBkZXZpY2UgKi8KKyAgICBpZiAoc25kX3BvcnQpIHsKKwlwam1lZGlhX3NuZF9wb3J0X2Rlc3Ryb3koIHNuZF9wb3J0ICk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisgICAgfQorCisgICAgLyogSWYgdGhlcmUgaXMgbWFzdGVyIHBvcnQsIHRoZW4gd2UganVzdCBuZWVkIHRvIGRlc3Ryb3kgbWFzdGVyIHBvcnQKKyAgICAgKiAoaXQgd2lsbCByZWN1cnNpdmVseSBkZXN0cm95IHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIHBvcnRzLCB3aGljaAorICAgICAqIGluIHRoaXMgY2FzZSBhcmUgZmlsZV9wb3J0IGFuZCBzdHJlYW1fcG9ydCkuCisgICAgICovCisgICAgaWYgKG1hc3Rlcl9wb3J0KSB7CisJcGptZWRpYV9tYXN0ZXJfcG9ydF9kZXN0cm95KG1hc3Rlcl9wb3J0LCBQSl9UUlVFKTsKKwlwbGF5X2ZpbGVfcG9ydCA9IE5VTEw7CisJc3RyZWFtID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IHN0cmVhbSAqLworICAgIGlmIChzdHJlYW0pIHsKKwlwam1lZGlhX3RyYW5zcG9ydCAqdHA7CisKKwl0cCA9IHBqbWVkaWFfc3RyZWFtX2dldF90cmFuc3BvcnQoc3RyZWFtKTsKKwlwam1lZGlhX3N0cmVhbV9kZXN0cm95KHN0cmVhbSk7CisJCisJcGptZWRpYV90cmFuc3BvcnRfY2xvc2UodHApOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgZmlsZSBwb3J0cyAqLworICAgIGlmIChwbGF5X2ZpbGVfcG9ydCkKKwlwam1lZGlhX3BvcnRfZGVzdHJveSggcGxheV9maWxlX3BvcnQgKTsKKyAgICBpZiAocmVjX2ZpbGVfcG9ydCkKKwlwam1lZGlhX3BvcnRfZGVzdHJveSggcmVjX2ZpbGVfcG9ydCApOworCisKKyAgICAvKiBSZWxlYXNlIGFwcGxpY2F0aW9uIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UoIHBvb2wgKTsKKworICAgIC8qIERlc3Ryb3kgbWVkaWEgZW5kcG9pbnQuICovCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KCBtZWRfZW5kcHQgKTsKKworICAgIC8qIERlc3Ryb3kgcG9vbCBmYWN0b3J5ICovCisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZjcCApOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisKKyAgICByZXR1cm4gKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSA/IDAgOiAxOworfQorCisKKworCitzdGF0aWMgY29uc3QgY2hhciAqZ29vZF9udW1iZXIoY2hhciAqYnVmLCBwal9pbnQzMl90IHZhbCkKK3sKKyAgICBpZiAodmFsIDwgMTAwMCkgeworCXBqX2Fuc2lfc3ByaW50ZihidWYsICIlZCIsIHZhbCk7CisgICAgfSBlbHNlIGlmICh2YWwgPCAxMDAwMDAwKSB7CisJcGpfYW5zaV9zcHJpbnRmKGJ1ZiwgIiVkLiVkSyIsIAorCQkJdmFsIC8gMTAwMCwKKwkJCSh2YWwgJSAxMDAwKSAvIDEwMCk7CisgICAgfSBlbHNlIHsKKwlwal9hbnNpX3NwcmludGYoYnVmLCAiJWQuJTAyZE0iLCAKKwkJCXZhbCAvIDEwMDAwMDAsCisJCQkodmFsICUgMTAwMDAwMCkgLyAxMDAwMCk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisjZGVmaW5lIFNBTVBMRVNfVE9fVVNFQyh1c2VjLCBzYW1wbGVzLCBjbG9ja19yYXRlKSBcCisgICAgZG8geyBcCisJaWYgKHNhbXBsZXMgPD0gNDI5NCkgXAorCSAgICB1c2VjID0gc2FtcGxlcyAqIDEwMDAwMDAgLyBjbG9ja19yYXRlOyBcCisJZWxzZSB7IFwKKwkgICAgdXNlYyA9IHNhbXBsZXMgKiAxMDAwIC8gY2xvY2tfcmF0ZTsgXAorCSAgICB1c2VjICo9IDEwMDA7IFwKKwl9IFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUFJJTlRfVk9JUF9NVENfVkFMKHMsIHYpIFwKKyAgICBpZiAodiA9PSAxMjcpIFwKKwlzcHJpbnRmKHMsICIobmEpIik7IFwKKyAgICBlbHNlIFwKKwlzcHJpbnRmKHMsICIlZCIsIHYpCisKKworLyoKKyAqIFByaW50IHN0cmVhbSBzdGF0aXN0aWNzCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3N0cmVhbV9zdGF0KHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkgICAgICBjb25zdCBwam1lZGlhX2NvZGVjX3BhcmFtICpjb2RlY19wYXJhbSkKK3sKKyAgICBjaGFyIGR1cmF0aW9uWzgwXSwgbGFzdF91cGRhdGVbODBdOworICAgIGNoYXIgYnBzWzE2XSwgaXBicHNbMTZdLCBwYWNrZXRzWzE2XSwgYnl0ZXNbMTZdLCBpcGJ5dGVzWzE2XTsKKyAgICBwam1lZGlhX3BvcnQgKnBvcnQ7CisgICAgcGptZWRpYV9ydGNwX3N0YXQgc3RhdDsKKyAgICBwal90aW1lX3ZhbCBub3c7CisKKworICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKyAgICBwam1lZGlhX3N0cmVhbV9nZXRfc3RhdChzdHJlYW0sICZzdGF0KTsKKyAgICBwam1lZGlhX3N0cmVhbV9nZXRfcG9ydChzdHJlYW0sICZwb3J0KTsKKworICAgIHB1dHMoIlN0cmVhbSBzdGF0aXN0aWNzOiIpOworCisgICAgLyogUHJpbnQgZHVyYXRpb24gKi8KKyAgICBQSl9USU1FX1ZBTF9TVUIobm93LCBzdGF0LnN0YXJ0KTsKKyAgICBzcHJpbnRmKGR1cmF0aW9uLCAiIER1cmF0aW9uOiAlMDJsZDolMDJsZDolMDJsZC4lMDNsZCIsCisJICAgIG5vdy5zZWMgLyAzNjAwLAorCSAgICAobm93LnNlYyAlIDM2MDApIC8gNjAsCisJICAgIChub3cuc2VjICUgNjApLAorCSAgICBub3cubXNlYyk7CisKKworICAgIHByaW50ZigiIEluZm86IGF1ZGlvICVkSHosICVkbXMvZnJhbWUsICVzQi9zICglc0IvcyArSVAgaGRyKVxuIiwKKwlQSk1FRElBX1BJQV9TUkFURSgmcG9ydC0+aW5mbyksCisJUEpNRURJQV9QSUFfUFRJTUUoJnBvcnQtPmluZm8pLAorCWdvb2RfbnVtYmVyKGJwcywgKGNvZGVjX3BhcmFtLT5pbmZvLmF2Z19icHMrNykvOCksCisJZ29vZF9udW1iZXIoaXBicHMsICgoY29kZWNfcGFyYW0tPmluZm8uYXZnX2Jwcys3KS84KSArIAorCQkJICAgKDQwICogMTAwMCAvCisJCQkgICAgY29kZWNfcGFyYW0tPnNldHRpbmcuZnJtX3Blcl9wa3QgLworCQkJICAgIGNvZGVjX3BhcmFtLT5pbmZvLmZybV9wdGltZSkpKTsKKworICAgIGlmIChzdGF0LnJ4LnVwZGF0ZV9jbnQgPT0gMCkKKwlzdHJjcHkobGFzdF91cGRhdGUsICJuZXZlciIpOworICAgIGVsc2UgeworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlQSl9USU1FX1ZBTF9TVUIobm93LCBzdGF0LnJ4LnVwZGF0ZSk7CisJc3ByaW50ZihsYXN0X3VwZGF0ZSwgIiUwMmxkaDolMDJsZG06JTAybGQuJTAzbGRzIGFnbyIsCisJCW5vdy5zZWMgLyAzNjAwLAorCQkobm93LnNlYyAlIDM2MDApIC8gNjAsCisJCW5vdy5zZWMgJSA2MCwKKwkJbm93Lm1zZWMpOworICAgIH0KKworICAgIHByaW50ZigiIFJYIHN0YXQgbGFzdCB1cGRhdGU6ICVzXG4iCisJICAgIiAgICB0b3RhbCAlcyBwYWNrZXRzICVzQiByZWNlaXZlZCAoJXNCICtJUCBoZHIpJXNcbiIKKwkgICAiICAgIHBrdCBsb3NzPSVkICglMy4xZiUlKSwgZHVwPSVkICglMy4xZiUlKSwgcmVvcmRlcj0lZCAoJTMuMWYlJSklc1xuIgorCSAgICIgICAgICAgICAgKG1zZWMpICAgIG1pbiAgICAgYXZnICAgICBtYXggICAgIGxhc3QgICAgZGV2XG4iCisJICAgIiAgICBsb3NzIHBlcmlvZDogJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2Ylc1xuIgorCSAgICIgICAgaml0dGVyICAgICA6ICU3LjNmICU3LjNmICU3LjNmICU3LjNmICU3LjNmJXNcbiIsCisJICAgbGFzdF91cGRhdGUsCisJICAgZ29vZF9udW1iZXIocGFja2V0cywgc3RhdC5yeC5wa3QpLAorCSAgIGdvb2RfbnVtYmVyKGJ5dGVzLCBzdGF0LnJ4LmJ5dGVzKSwKKwkgICBnb29kX251bWJlcihpcGJ5dGVzLCBzdGF0LnJ4LmJ5dGVzICsgc3RhdC5yeC5wa3QgKiAzMiksCisJICAgIiIsCisJICAgc3RhdC5yeC5sb3NzLAorCSAgIHN0YXQucngubG9zcyAqIDEwMC4wIC8gKHN0YXQucngucGt0ICsgc3RhdC5yeC5sb3NzKSwKKwkgICBzdGF0LnJ4LmR1cCwgCisJICAgc3RhdC5yeC5kdXAgKiAxMDAuMCAvIChzdGF0LnJ4LnBrdCArIHN0YXQucngubG9zcyksCisJICAgc3RhdC5yeC5yZW9yZGVyLCAKKwkgICBzdGF0LnJ4LnJlb3JkZXIgKiAxMDAuMCAvIChzdGF0LnJ4LnBrdCArIHN0YXQucngubG9zcyksCisJICAgIiIsCisJICAgc3RhdC5yeC5sb3NzX3BlcmlvZC5taW4gLyAxMDAwLjAsIAorCSAgIHN0YXQucngubG9zc19wZXJpb2QubWVhbiAvIDEwMDAuMCwgCisJICAgc3RhdC5yeC5sb3NzX3BlcmlvZC5tYXggLyAxMDAwLjAsCisJICAgc3RhdC5yeC5sb3NzX3BlcmlvZC5sYXN0IC8gMTAwMC4wLAorCSAgIHBqX21hdGhfc3RhdF9nZXRfc3RkZGV2KCZzdGF0LnJ4Lmxvc3NfcGVyaW9kKSAvIDEwMDAuMCwKKwkgICAiIiwKKwkgICBzdGF0LnJ4LmppdHRlci5taW4gLyAxMDAwLjAsCisJICAgc3RhdC5yeC5qaXR0ZXIubWVhbiAvIDEwMDAuMCwKKwkgICBzdGF0LnJ4LmppdHRlci5tYXggLyAxMDAwLjAsCisJICAgc3RhdC5yeC5qaXR0ZXIubGFzdCAvIDEwMDAuMCwKKwkgICBwal9tYXRoX3N0YXRfZ2V0X3N0ZGRldigmc3RhdC5yeC5qaXR0ZXIpIC8gMTAwMC4wLAorCSAgICIiCisJICAgKTsKKworCisgICAgaWYgKHN0YXQudHgudXBkYXRlX2NudCA9PSAwKQorCXN0cmNweShsYXN0X3VwZGF0ZSwgIm5ldmVyIik7CisgICAgZWxzZSB7CisJcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCVBKX1RJTUVfVkFMX1NVQihub3csIHN0YXQudHgudXBkYXRlKTsKKwlzcHJpbnRmKGxhc3RfdXBkYXRlLCAiJTAybGRoOiUwMmxkbTolMDJsZC4lMDNsZHMgYWdvIiwKKwkJbm93LnNlYyAvIDM2MDAsCisJCShub3cuc2VjICUgMzYwMCkgLyA2MCwKKwkJbm93LnNlYyAlIDYwLAorCQlub3cubXNlYyk7CisgICAgfQorCisgICAgcHJpbnRmKCIgVFggc3RhdCBsYXN0IHVwZGF0ZTogJXNcbiIKKwkgICAiICAgIHRvdGFsICVzIHBhY2tldHMgJXNCIHNlbnQgKCVzQiArSVAgaGRyKSVzXG4iCisJICAgIiAgICBwa3QgbG9zcz0lZCAoJTMuMWYlJSksIGR1cD0lZCAoJTMuMWYlJSksIHJlb3JkZXI9JWQgKCUzLjFmJSUpJXNcbiIKKwkgICAiICAgICAgICAgIChtc2VjKSAgICBtaW4gICAgIGF2ZyAgICAgbWF4ICAgICBsYXN0ICAgIGRldlxuIgorCSAgICIgICAgbG9zcyBwZXJpb2Q6ICU3LjNmICU3LjNmICU3LjNmICU3LjNmICU3LjNmJXNcbiIKKwkgICAiICAgIGppdHRlciAgICAgOiAlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiVzXG4iLAorCSAgIGxhc3RfdXBkYXRlLAorCSAgIGdvb2RfbnVtYmVyKHBhY2tldHMsIHN0YXQudHgucGt0KSwKKwkgICBnb29kX251bWJlcihieXRlcywgc3RhdC50eC5ieXRlcyksCisJICAgZ29vZF9udW1iZXIoaXBieXRlcywgc3RhdC50eC5ieXRlcyArIHN0YXQudHgucGt0ICogMzIpLAorCSAgICIiLAorCSAgIHN0YXQudHgubG9zcywKKwkgICBzdGF0LnR4Lmxvc3MgKiAxMDAuMCAvIChzdGF0LnR4LnBrdCArIHN0YXQudHgubG9zcyksCisJICAgc3RhdC50eC5kdXAsIAorCSAgIHN0YXQudHguZHVwICogMTAwLjAgLyAoc3RhdC50eC5wa3QgKyBzdGF0LnR4Lmxvc3MpLAorCSAgIHN0YXQudHgucmVvcmRlciwgCisJICAgc3RhdC50eC5yZW9yZGVyICogMTAwLjAgLyAoc3RhdC50eC5wa3QgKyBzdGF0LnR4Lmxvc3MpLAorCSAgICIiLAorCSAgIHN0YXQudHgubG9zc19wZXJpb2QubWluIC8gMTAwMC4wLCAKKwkgICBzdGF0LnR4Lmxvc3NfcGVyaW9kLm1lYW4gLyAxMDAwLjAsIAorCSAgIHN0YXQudHgubG9zc19wZXJpb2QubWF4IC8gMTAwMC4wLAorCSAgIHN0YXQudHgubG9zc19wZXJpb2QubGFzdCAvIDEwMDAuMCwKKwkgICBwal9tYXRoX3N0YXRfZ2V0X3N0ZGRldigmc3RhdC50eC5sb3NzX3BlcmlvZCkgLyAxMDAwLjAsCisJICAgIiIsCisJICAgc3RhdC50eC5qaXR0ZXIubWluIC8gMTAwMC4wLAorCSAgIHN0YXQudHguaml0dGVyLm1lYW4gLyAxMDAwLjAsCisJICAgc3RhdC50eC5qaXR0ZXIubWF4IC8gMTAwMC4wLAorCSAgIHN0YXQudHguaml0dGVyLmxhc3QgLyAxMDAwLjAsCisJICAgcGpfbWF0aF9zdGF0X2dldF9zdGRkZXYoJnN0YXQudHguaml0dGVyKSAvIDEwMDAuMCwKKwkgICAiIgorCSAgICk7CisKKworICAgIHByaW50ZigiIFJUVCBkZWxheSAgICAgOiAlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiVzXG4iLCAKKwkgICBzdGF0LnJ0dC5taW4gLyAxMDAwLjAsCisJICAgc3RhdC5ydHQubWVhbiAvIDEwMDAuMCwKKwkgICBzdGF0LnJ0dC5tYXggLyAxMDAwLjAsCisJICAgc3RhdC5ydHQubGFzdCAvIDEwMDAuMCwKKwkgICBwal9tYXRoX3N0YXRfZ2V0X3N0ZGRldigmc3RhdC5ydHQpIC8gMTAwMC4wLAorCSAgICIiCisJICAgKTsKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfUlRDUF9YUikgJiYgKFBKTUVESUFfSEFTX1JUQ1BfWFIgIT0gMCkKKyAgICAvKiBSVENQIFhSIFJlcG9ydHMgKi8KKyAgICBkbyB7CisJY2hhciBsb3NzWzE2XSwgZHVwWzE2XTsKKwljaGFyIGppdHRlcls4MF07CisJY2hhciB0b2hbODBdOworCWNoYXIgcGxjWzE2XSwgamJhWzE2XSwgamJyWzE2XTsKKwljaGFyIHNpZ25hbF9sdmxbMTZdLCBub2lzZV9sdmxbMTZdLCByZXJsWzE2XTsKKwljaGFyIHJfZmFjdG9yWzE2XSwgZXh0X3JfZmFjdG9yWzE2XSwgbW9zX2xxWzE2XSwgbW9zX2NxWzE2XTsKKwlwam1lZGlhX3J0Y3BfeHJfc3RhdCB4cl9zdGF0OworCisJaWYgKHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X3hyKHN0cmVhbSwgJnhyX3N0YXQpICE9IFBKX1NVQ0NFU1MpCisJICAgIGJyZWFrOworCisJcHV0cygiXG5FeHRlbmRlZCByZXBvcnRzOiIpOworCisJLyogU3RhdGlzdGljcyBTdW1tYXJ5ICovCisJcHV0cygiIFN0YXRpc3RpY3MgU3VtbWFyeSIpOworCisJaWYgKHhyX3N0YXQucnguc3RhdF9zdW0ubCkKKwkgICAgc3ByaW50Zihsb3NzLCAiJWQiLCB4cl9zdGF0LnJ4LnN0YXRfc3VtLmxvc3QpOworCWVsc2UKKwkgICAgc3ByaW50Zihsb3NzLCAiKG5hKSIpOworCisJaWYgKHhyX3N0YXQucnguc3RhdF9zdW0uZCkKKwkgICAgc3ByaW50ZihkdXAsICIlZCIsIHhyX3N0YXQucnguc3RhdF9zdW0uZHVwKTsKKwllbHNlCisJICAgIHNwcmludGYoZHVwLCAiKG5hKSIpOworCisJaWYgKHhyX3N0YXQucnguc3RhdF9zdW0uaikgeworCSAgICB1bnNpZ25lZCBqbWluLCBqbWF4LCBqbWVhbiwgamRldjsKKworCSAgICBTQU1QTEVTX1RPX1VTRUMoam1pbiwgeHJfc3RhdC5yeC5zdGF0X3N1bS5qaXR0ZXIubWluLCAKKwkJCSAgICBwb3J0LT5pbmZvLmZtdC5kZXQuYXVkLmNsb2NrX3JhdGUpOworCSAgICBTQU1QTEVTX1RPX1VTRUMoam1heCwgeHJfc3RhdC5yeC5zdGF0X3N1bS5qaXR0ZXIubWF4LCAKKwkJCSAgICBwb3J0LT5pbmZvLmZtdC5kZXQuYXVkLmNsb2NrX3JhdGUpOworCSAgICBTQU1QTEVTX1RPX1VTRUMoam1lYW4sIHhyX3N0YXQucnguc3RhdF9zdW0uaml0dGVyLm1lYW4sIAorCQkJICAgIHBvcnQtPmluZm8uZm10LmRldC5hdWQuY2xvY2tfcmF0ZSk7CisJICAgIFNBTVBMRVNfVE9fVVNFQyhqZGV2LCAKKwkJCSAgIHBqX21hdGhfc3RhdF9nZXRfc3RkZGV2KCZ4cl9zdGF0LnJ4LnN0YXRfc3VtLmppdHRlciksCisJCQkgICBwb3J0LT5pbmZvLmZtdC5kZXQuYXVkLmNsb2NrX3JhdGUpOworCSAgICBzcHJpbnRmKGppdHRlciwgIiU3LjNmICU3LjNmICU3LjNmICU3LjNmIiwgCisJCSAgICBqbWluLzEwMDAuMCwgam1lYW4vMTAwMC4wLCBqbWF4LzEwMDAuMCwgamRldi8xMDAwLjApOworCX0gZWxzZQorCSAgICBzcHJpbnRmKGppdHRlciwgIihyZXBvcnQgbm90IGF2YWlsYWJsZSkiKTsKKworCWlmICh4cl9zdGF0LnJ4LnN0YXRfc3VtLnQpIHsKKwkgICAgc3ByaW50Zih0b2gsICIlMTFkICUxMWQgJTExZCAlMTFkIiwgCisJCSAgICB4cl9zdGF0LnJ4LnN0YXRfc3VtLnRvaC5taW4sCisJCSAgICB4cl9zdGF0LnJ4LnN0YXRfc3VtLnRvaC5tZWFuLAorCQkgICAgeHJfc3RhdC5yeC5zdGF0X3N1bS50b2gubWF4LAorCQkgICAgcGpfbWF0aF9zdGF0X2dldF9zdGRkZXYoJnhyX3N0YXQucnguc3RhdF9zdW0udG9oKSk7CisJfSBlbHNlCisJICAgIHNwcmludGYodG9oLCAiKHJlcG9ydCBub3QgYXZhaWxhYmxlKSIpOworCisJaWYgKHhyX3N0YXQucnguc3RhdF9zdW0udXBkYXRlLnNlYyA9PSAwKQorCSAgICBzdHJjcHkobGFzdF91cGRhdGUsICJuZXZlciIpOworCWVsc2UgeworCSAgICBwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisJICAgIFBKX1RJTUVfVkFMX1NVQihub3csIHhyX3N0YXQucnguc3RhdF9zdW0udXBkYXRlKTsKKwkgICAgc3ByaW50ZihsYXN0X3VwZGF0ZSwgIiUwMmxkaDolMDJsZG06JTAybGQuJTAzbGRzIGFnbyIsCisJCSAgICBub3cuc2VjIC8gMzYwMCwKKwkJICAgIChub3cuc2VjICUgMzYwMCkgLyA2MCwKKwkJICAgIG5vdy5zZWMgJSA2MCwKKwkJICAgIG5vdy5tc2VjKTsKKwl9CisKKwlwcmludGYoIiBSWCBsYXN0IHVwZGF0ZTogJXNcbiIKKwkgICAgICAgIiAgICBiZWdpbiBzZXE9JWQsIGVuZCBzZXE9JWQlc1xuIgorCSAgICAgICAiICAgIHBrdCBsb3NzPSVzLCBkdXA9JXMlc1xuIgorCSAgICAgICAiICAgICAgICAgIChtc2VjKSAgICBtaW4gICAgIGF2ZyAgICAgbWF4ICAgICBkZXZcbiIKKwkgICAgICAgIiAgICBqaXR0ZXIgICAgIDogJXNcbiIKKwkgICAgICAgIiAgICB0b2ggICAgICAgIDogJXNcbiIsCisJICAgICAgIGxhc3RfdXBkYXRlLAorCSAgICAgICB4cl9zdGF0LnJ4LnN0YXRfc3VtLmJlZ2luX3NlcSwgeHJfc3RhdC5yeC5zdGF0X3N1bS5lbmRfc2VxLAorCSAgICAgICAiIiwKKwkgICAgICAgbG9zcywgZHVwLAorCSAgICAgICAiIiwKKwkgICAgICAgaml0dGVyLAorCSAgICAgICB0b2gKKwkgICAgICAgKTsKKworCWlmICh4cl9zdGF0LnR4LnN0YXRfc3VtLmwpCisJICAgIHNwcmludGYobG9zcywgIiVkIiwgeHJfc3RhdC50eC5zdGF0X3N1bS5sb3N0KTsKKwllbHNlCisJICAgIHNwcmludGYobG9zcywgIihuYSkiKTsKKworCWlmICh4cl9zdGF0LnR4LnN0YXRfc3VtLmQpCisJICAgIHNwcmludGYoZHVwLCAiJWQiLCB4cl9zdGF0LnR4LnN0YXRfc3VtLmR1cCk7CisJZWxzZQorCSAgICBzcHJpbnRmKGR1cCwgIihuYSkiKTsKKworCWlmICh4cl9zdGF0LnR4LnN0YXRfc3VtLmopIHsKKwkgICAgdW5zaWduZWQgam1pbiwgam1heCwgam1lYW4sIGpkZXY7CisKKwkgICAgU0FNUExFU19UT19VU0VDKGptaW4sIHhyX3N0YXQudHguc3RhdF9zdW0uaml0dGVyLm1pbiwgCisJCQkgICAgcG9ydC0+aW5mby5mbXQuZGV0LmF1ZC5jbG9ja19yYXRlKTsKKwkgICAgU0FNUExFU19UT19VU0VDKGptYXgsIHhyX3N0YXQudHguc3RhdF9zdW0uaml0dGVyLm1heCwgCisJCQkgICAgcG9ydC0+aW5mby5mbXQuZGV0LmF1ZC5jbG9ja19yYXRlKTsKKwkgICAgU0FNUExFU19UT19VU0VDKGptZWFuLCB4cl9zdGF0LnR4LnN0YXRfc3VtLmppdHRlci5tZWFuLCAKKwkJCSAgICBwb3J0LT5pbmZvLmZtdC5kZXQuYXVkLmNsb2NrX3JhdGUpOworCSAgICBTQU1QTEVTX1RPX1VTRUMoamRldiwgCisJCQkgICBwal9tYXRoX3N0YXRfZ2V0X3N0ZGRldigmeHJfc3RhdC50eC5zdGF0X3N1bS5qaXR0ZXIpLAorCQkJICAgcG9ydC0+aW5mby5mbXQuZGV0LmF1ZC5jbG9ja19yYXRlKTsKKwkgICAgc3ByaW50ZihqaXR0ZXIsICIlNy4zZiAlNy4zZiAlNy4zZiAlNy4zZiIsIAorCQkgICAgam1pbi8xMDAwLjAsIGptZWFuLzEwMDAuMCwgam1heC8xMDAwLjAsIGpkZXYvMTAwMC4wKTsKKwl9IGVsc2UKKwkgICAgc3ByaW50ZihqaXR0ZXIsICIocmVwb3J0IG5vdCBhdmFpbGFibGUpIik7CisKKwlpZiAoeHJfc3RhdC50eC5zdGF0X3N1bS50KSB7CisJICAgIHNwcmludGYodG9oLCAiJTExZCAlMTFkICUxMWQgJTExZCIsIAorCQkgICAgeHJfc3RhdC50eC5zdGF0X3N1bS50b2gubWluLAorCQkgICAgeHJfc3RhdC50eC5zdGF0X3N1bS50b2gubWVhbiwKKwkJICAgIHhyX3N0YXQudHguc3RhdF9zdW0udG9oLm1heCwKKwkJICAgIHBqX21hdGhfc3RhdF9nZXRfc3RkZGV2KCZ4cl9zdGF0LnJ4LnN0YXRfc3VtLnRvaCkpOworCX0gZWxzZQorCSAgICBzcHJpbnRmKHRvaCwgICAgIihyZXBvcnQgbm90IGF2YWlsYWJsZSkiKTsKKworCWlmICh4cl9zdGF0LnR4LnN0YXRfc3VtLnVwZGF0ZS5zZWMgPT0gMCkKKwkgICAgc3RyY3B5KGxhc3RfdXBkYXRlLCAibmV2ZXIiKTsKKwllbHNlIHsKKwkgICAgcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCSAgICBQSl9USU1FX1ZBTF9TVUIobm93LCB4cl9zdGF0LnR4LnN0YXRfc3VtLnVwZGF0ZSk7CisJICAgIHNwcmludGYobGFzdF91cGRhdGUsICIlMDJsZGg6JTAybGRtOiUwMmxkLiUwM2xkcyBhZ28iLAorCQkgICAgbm93LnNlYyAvIDM2MDAsCisJCSAgICAobm93LnNlYyAlIDM2MDApIC8gNjAsCisJCSAgICBub3cuc2VjICUgNjAsCisJCSAgICBub3cubXNlYyk7CisJfQorCisJcHJpbnRmKCIgVFggbGFzdCB1cGRhdGU6ICVzXG4iCisJICAgICAgICIgICAgYmVnaW4gc2VxPSVkLCBlbmQgc2VxPSVkJXNcbiIKKwkgICAgICAgIiAgICBwa3QgbG9zcz0lcywgZHVwPSVzJXNcbiIKKwkgICAgICAgIiAgICAgICAgICAobXNlYykgICAgbWluICAgICBhdmcgICAgIG1heCAgICAgZGV2XG4iCisJICAgICAgICIgICAgaml0dGVyICAgICA6ICVzXG4iCisJICAgICAgICIgICAgdG9oICAgICAgICA6ICVzXG4iLAorCSAgICAgICBsYXN0X3VwZGF0ZSwKKwkgICAgICAgeHJfc3RhdC50eC5zdGF0X3N1bS5iZWdpbl9zZXEsIHhyX3N0YXQudHguc3RhdF9zdW0uZW5kX3NlcSwKKwkgICAgICAgIiIsCisJICAgICAgIGxvc3MsIGR1cCwKKwkgICAgICAgIiIsCisJICAgICAgIGppdHRlciwKKwkgICAgICAgdG9oCisJICAgICAgICk7CisKKwkvKiBWb0lQIE1ldHJpY3MgKi8KKwlwdXRzKCIgVm9JUCBNZXRyaWNzIik7CisKKwlQUklOVF9WT0lQX01UQ19WQUwoc2lnbmFsX2x2bCwgeHJfc3RhdC5yeC52b2lwX210Yy5zaWduYWxfbHZsKTsKKwlQUklOVF9WT0lQX01UQ19WQUwobm9pc2VfbHZsLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLm5vaXNlX2x2bCk7CisJUFJJTlRfVk9JUF9NVENfVkFMKHJlcmwsIHhyX3N0YXQucngudm9pcF9tdGMucmVybCk7CisJUFJJTlRfVk9JUF9NVENfVkFMKHJfZmFjdG9yLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLnJfZmFjdG9yKTsKKwlQUklOVF9WT0lQX01UQ19WQUwoZXh0X3JfZmFjdG9yLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLmV4dF9yX2ZhY3Rvcik7CisJUFJJTlRfVk9JUF9NVENfVkFMKG1vc19scSwgeHJfc3RhdC5yeC52b2lwX210Yy5tb3NfbHEpOworCVBSSU5UX1ZPSVBfTVRDX1ZBTChtb3NfY3EsIHhyX3N0YXQucngudm9pcF9tdGMubW9zX2NxKTsKKworCXN3aXRjaCAoKHhyX3N0YXQucngudm9pcF9tdGMucnhfY29uZmlnPj42KSAmIDMpIHsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfUExDX0RJUzoKKwkJc3ByaW50ZihwbGMsICJESVNBQkxFRCIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfUExDX0VOSDoKKwkJc3ByaW50ZihwbGMsICJFTkhBTkNFRCIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfUExDX1NURDoKKwkJc3ByaW50ZihwbGMsICJTVEFOREFSRCIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfUExDX1VOSzoKKwkgICAgZGVmYXVsdDoKKwkJc3ByaW50ZihwbGMsICJVTktOT1dOIik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoKHhyX3N0YXQucngudm9pcF9tdGMucnhfY29uZmlnPj40KSAmIDMpIHsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfSkJfRklYRUQ6CisJCXNwcmludGYoamJhLCAiRklYRUQiKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpNRURJQV9SVENQX1hSX0pCX0FEQVBUSVZFOgorCQlzcHJpbnRmKGpiYSwgIkFEQVBUSVZFIik7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlzcHJpbnRmKGpiYSwgIlVOS05PV04iKTsKKwkJYnJlYWs7CisJfQorCisJc3ByaW50ZihqYnIsICIlZCIsIHhyX3N0YXQucngudm9pcF9tdGMucnhfY29uZmlnICYgMHgwRik7CisKKwlpZiAoeHJfc3RhdC5yeC52b2lwX210Yy51cGRhdGUuc2VjID09IDApCisJICAgIHN0cmNweShsYXN0X3VwZGF0ZSwgIm5ldmVyIik7CisJZWxzZSB7CisJICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKwkgICAgUEpfVElNRV9WQUxfU1VCKG5vdywgeHJfc3RhdC5yeC52b2lwX210Yy51cGRhdGUpOworCSAgICBzcHJpbnRmKGxhc3RfdXBkYXRlLCAiJTAybGRoOiUwMmxkbTolMDJsZC4lMDNsZHMgYWdvIiwKKwkJICAgIG5vdy5zZWMgLyAzNjAwLAorCQkgICAgKG5vdy5zZWMgJSAzNjAwKSAvIDYwLAorCQkgICAgbm93LnNlYyAlIDYwLAorCQkgICAgbm93Lm1zZWMpOworCX0KKworCXByaW50ZigiIFJYIGxhc3QgdXBkYXRlOiAlc1xuIgorCSAgICAgICAiICAgIHBhY2tldHMgICAgOiBsb3NzIHJhdGU9JWQgKCUuMmYlJSksIGRpc2NhcmQgcmF0ZT0lZCAoJS4yZiUlKVxuIgorCSAgICAgICAiICAgIGJ1cnN0ICAgICAgOiBkZW5zaXR5PSVkICglLjJmJSUpLCBkdXJhdGlvbj0lZCVzXG4iCisJICAgICAgICIgICAgZ2FwICAgICAgICA6IGRlbnNpdHk9JWQgKCUuMmYlJSksIGR1cmF0aW9uPSVkJXNcbiIKKwkgICAgICAgIiAgICBkZWxheSAgICAgIDogcm91bmQgdHJpcD0lZCVzLCBlbmQgc3lzdGVtPSVkJXNcbiIKKwkgICAgICAgIiAgICBsZXZlbCAgICAgIDogc2lnbmFsPSVzJXMsIG5vaXNlPSVzJXMsIFJFUkw9JXMlc1xuIgorCSAgICAgICAiICAgIHF1YWxpdHkgICAgOiBSIGZhY3Rvcj0lcywgZXh0IFIgZmFjdG9yPSVzXG4iCisJICAgICAgICIgICAgICAgICAgICAgICAgIE1PUyBMUT0lcywgTU9TIENRPSVzXG4iCisJICAgICAgICIgICAgY29uZmlnICAgICA6IFBMQz0lcywgSkI9JXMsIEpCIHJhdGU9JXMsIEdtaW49JWRcbiIKKwkgICAgICAgIiAgICBKQiBkZWxheSAgIDogY3VyPSVkJXMsIG1heD0lZCVzLCBhYnMgbWF4PSVkJXNcbiIsCisJICAgICAgIGxhc3RfdXBkYXRlLAorCSAgICAgICAvKiBwYWtjZXRzICovCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMubG9zc19yYXRlLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLmxvc3NfcmF0ZSoxMDAuMC8yNTYsCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMuZGlzY2FyZF9yYXRlLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLmRpc2NhcmRfcmF0ZSoxMDAuMC8yNTYsCisJICAgICAgIC8qIGJ1cnN0ICovCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMuYnVyc3RfZGVuLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLmJ1cnN0X2RlbioxMDAuMC8yNTYsCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMuYnVyc3RfZHVyLCAibXMiLAorCSAgICAgICAvKiBnYXAgKi8KKwkgICAgICAgeHJfc3RhdC5yeC52b2lwX210Yy5nYXBfZGVuLCB4cl9zdGF0LnJ4LnZvaXBfbXRjLmdhcF9kZW4qMTAwLjAvMjU2LAorCSAgICAgICB4cl9zdGF0LnJ4LnZvaXBfbXRjLmdhcF9kdXIsICJtcyIsCisJICAgICAgIC8qIGRlbGF5ICovCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMucm5kX3RyaXBfZGVsYXksICJtcyIsCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMuZW5kX3N5c19kZWxheSwgIm1zIiwKKwkgICAgICAgLyogbGV2ZWwgKi8KKwkgICAgICAgc2lnbmFsX2x2bCwgImRCIiwKKwkgICAgICAgbm9pc2VfbHZsLCAiZEIiLAorCSAgICAgICByZXJsLCAiIiwKKwkgICAgICAgLyogcXVhbGl0eSAqLworCSAgICAgICByX2ZhY3RvciwgZXh0X3JfZmFjdG9yLCBtb3NfbHEsIG1vc19jcSwKKwkgICAgICAgLyogY29uZmlnICovCisJICAgICAgIHBsYywgamJhLCBqYnIsIHhyX3N0YXQucngudm9pcF9tdGMuZ21pbiwKKwkgICAgICAgLyogSkIgZGVsYXkgKi8KKwkgICAgICAgeHJfc3RhdC5yeC52b2lwX210Yy5qYl9ub20sICJtcyIsCisJICAgICAgIHhyX3N0YXQucngudm9pcF9tdGMuamJfbWF4LCAibXMiLAorCSAgICAgICB4cl9zdGF0LnJ4LnZvaXBfbXRjLmpiX2Fic19tYXgsICJtcyIKKwkgICAgICAgKTsKKworCVBSSU5UX1ZPSVBfTVRDX1ZBTChzaWduYWxfbHZsLCB4cl9zdGF0LnR4LnZvaXBfbXRjLnNpZ25hbF9sdmwpOworCVBSSU5UX1ZPSVBfTVRDX1ZBTChub2lzZV9sdmwsIHhyX3N0YXQudHgudm9pcF9tdGMubm9pc2VfbHZsKTsKKwlQUklOVF9WT0lQX01UQ19WQUwocmVybCwgeHJfc3RhdC50eC52b2lwX210Yy5yZXJsKTsKKwlQUklOVF9WT0lQX01UQ19WQUwocl9mYWN0b3IsIHhyX3N0YXQudHgudm9pcF9tdGMucl9mYWN0b3IpOworCVBSSU5UX1ZPSVBfTVRDX1ZBTChleHRfcl9mYWN0b3IsIHhyX3N0YXQudHgudm9pcF9tdGMuZXh0X3JfZmFjdG9yKTsKKwlQUklOVF9WT0lQX01UQ19WQUwobW9zX2xxLCB4cl9zdGF0LnR4LnZvaXBfbXRjLm1vc19scSk7CisJUFJJTlRfVk9JUF9NVENfVkFMKG1vc19jcSwgeHJfc3RhdC50eC52b2lwX210Yy5tb3NfY3EpOworCisJc3dpdGNoICgoeHJfc3RhdC50eC52b2lwX210Yy5yeF9jb25maWc+PjYpICYgMykgeworCSAgICBjYXNlIFBKTUVESUFfUlRDUF9YUl9QTENfRElTOgorCQlzcHJpbnRmKHBsYywgIkRJU0FCTEVEIik7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfUlRDUF9YUl9QTENfRU5IOgorCQlzcHJpbnRmKHBsYywgIkVOSEFOQ0VEIik7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfUlRDUF9YUl9QTENfU1REOgorCQlzcHJpbnRmKHBsYywgIlNUQU5EQVJEIik7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfUlRDUF9YUl9QTENfVU5LOgorCSAgICBkZWZhdWx0OgorCQlzcHJpbnRmKHBsYywgInVua25vd24iKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICgoeHJfc3RhdC50eC52b2lwX210Yy5yeF9jb25maWc+PjQpICYgMykgeworCSAgICBjYXNlIFBKTUVESUFfUlRDUF9YUl9KQl9GSVhFRDoKKwkJc3ByaW50ZihqYmEsICJGSVhFRCIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX1JUQ1BfWFJfSkJfQURBUFRJVkU6CisJCXNwcmludGYoamJhLCAiQURBUFRJVkUiKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXNwcmludGYoamJhLCAidW5rbm93biIpOworCQlicmVhazsKKwl9CisKKwlzcHJpbnRmKGpiciwgIiVkIiwgeHJfc3RhdC50eC52b2lwX210Yy5yeF9jb25maWcgJiAweDBGKTsKKworCWlmICh4cl9zdGF0LnR4LnZvaXBfbXRjLnVwZGF0ZS5zZWMgPT0gMCkKKwkgICAgc3RyY3B5KGxhc3RfdXBkYXRlLCAibmV2ZXIiKTsKKwllbHNlIHsKKwkgICAgcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCSAgICBQSl9USU1FX1ZBTF9TVUIobm93LCB4cl9zdGF0LnR4LnZvaXBfbXRjLnVwZGF0ZSk7CisJICAgIHNwcmludGYobGFzdF91cGRhdGUsICIlMDJsZGg6JTAybGRtOiUwMmxkLiUwM2xkcyBhZ28iLAorCQkgICAgbm93LnNlYyAvIDM2MDAsCisJCSAgICAobm93LnNlYyAlIDM2MDApIC8gNjAsCisJCSAgICBub3cuc2VjICUgNjAsCisJCSAgICBub3cubXNlYyk7CisJfQorCisJcHJpbnRmKCIgVFggbGFzdCB1cGRhdGU6ICVzXG4iCisJICAgICAgICIgICAgcGFja2V0cyAgICA6IGxvc3MgcmF0ZT0lZCAoJS4yZiUlKSwgZGlzY2FyZCByYXRlPSVkICglLjJmJSUpXG4iCisJICAgICAgICIgICAgYnVyc3QgICAgICA6IGRlbnNpdHk9JWQgKCUuMmYlJSksIGR1cmF0aW9uPSVkJXNcbiIKKwkgICAgICAgIiAgICBnYXAgICAgICAgIDogZGVuc2l0eT0lZCAoJS4yZiUlKSwgZHVyYXRpb249JWQlc1xuIgorCSAgICAgICAiICAgIGRlbGF5ICAgICAgOiByb3VuZCB0cmlwPSVkJXMsIGVuZCBzeXN0ZW09JWQlc1xuIgorCSAgICAgICAiICAgIGxldmVsICAgICAgOiBzaWduYWw9JXMlcywgbm9pc2U9JXMlcywgUkVSTD0lcyVzXG4iCisJICAgICAgICIgICAgcXVhbGl0eSAgICA6IFIgZmFjdG9yPSVzLCBleHQgUiBmYWN0b3I9JXNcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgTU9TIExRPSVzLCBNT1MgQ1E9JXNcbiIKKwkgICAgICAgIiAgICBjb25maWcgICAgIDogUExDPSVzLCBKQj0lcywgSkIgcmF0ZT0lcywgR21pbj0lZFxuIgorCSAgICAgICAiICAgIEpCIGRlbGF5ICAgOiBjdXI9JWQlcywgbWF4PSVkJXMsIGFicyBtYXg9JWQlc1xuIiwKKwkgICAgICAgbGFzdF91cGRhdGUsCisJICAgICAgIC8qIHBha2NldHMgKi8KKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5sb3NzX3JhdGUsIHhyX3N0YXQudHgudm9pcF9tdGMubG9zc19yYXRlKjEwMC4wLzI1NiwKKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5kaXNjYXJkX3JhdGUsIHhyX3N0YXQudHgudm9pcF9tdGMuZGlzY2FyZF9yYXRlKjEwMC4wLzI1NiwKKwkgICAgICAgLyogYnVyc3QgKi8KKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5idXJzdF9kZW4sIHhyX3N0YXQudHgudm9pcF9tdGMuYnVyc3RfZGVuKjEwMC4wLzI1NiwKKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5idXJzdF9kdXIsICJtcyIsCisJICAgICAgIC8qIGdhcCAqLworCSAgICAgICB4cl9zdGF0LnR4LnZvaXBfbXRjLmdhcF9kZW4sIHhyX3N0YXQudHgudm9pcF9tdGMuZ2FwX2RlbioxMDAuMC8yNTYsCisJICAgICAgIHhyX3N0YXQudHgudm9pcF9tdGMuZ2FwX2R1ciwgIm1zIiwKKwkgICAgICAgLyogZGVsYXkgKi8KKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5ybmRfdHJpcF9kZWxheSwgIm1zIiwKKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5lbmRfc3lzX2RlbGF5LCAibXMiLAorCSAgICAgICAvKiBsZXZlbCAqLworCSAgICAgICBzaWduYWxfbHZsLCAiZEIiLAorCSAgICAgICBub2lzZV9sdmwsICJkQiIsCisJICAgICAgIHJlcmwsICIiLAorCSAgICAgICAvKiBxdWFsaXR5ICovCisJICAgICAgIHJfZmFjdG9yLCBleHRfcl9mYWN0b3IsIG1vc19scSwgbW9zX2NxLAorCSAgICAgICAvKiBjb25maWcgKi8KKwkgICAgICAgcGxjLCBqYmEsIGpiciwgeHJfc3RhdC50eC52b2lwX210Yy5nbWluLAorCSAgICAgICAvKiBKQiBkZWxheSAqLworCSAgICAgICB4cl9zdGF0LnR4LnZvaXBfbXRjLmpiX25vbSwgIm1zIiwKKwkgICAgICAgeHJfc3RhdC50eC52b2lwX210Yy5qYl9tYXgsICJtcyIsCisJICAgICAgIHhyX3N0YXQudHgudm9pcF9tdGMuamJfYWJzX21heCwgIm1zIgorCSAgICAgICApOworCisKKwkvKiBSVFQgZGVsYXkgKGJ5IHJlY2VpdmVyIHNpZGUpICovCisJcHJpbnRmKCIgICAgICAgICAgKG1zZWMpICAgIG1pbiAgICAgYXZnICAgICBtYXggICAgIGxhc3QgICAgZGV2XG4iKTsKKwlwcmludGYoIiBSVFQgZGVsYXkgICAgIDogJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2YgJTcuM2Ylc1xuIiwgCisJICAgICAgIHhyX3N0YXQucnR0Lm1pbiAvIDEwMDAuMCwKKwkgICAgICAgeHJfc3RhdC5ydHQubWVhbiAvIDEwMDAuMCwKKwkgICAgICAgeHJfc3RhdC5ydHQubWF4IC8gMTAwMC4wLAorCSAgICAgICB4cl9zdGF0LnJ0dC5sYXN0IC8gMTAwMC4wLAorCSAgICAgICBwal9tYXRoX3N0YXRfZ2V0X3N0ZGRldigmeHJfc3RhdC5ydHQpIC8gMTAwMC4wLAorCSAgICAgICAiIgorCSAgICAgICApOworICAgIH0gd2hpbGUgKDApOworI2VuZGlmIC8qIFBKTUVESUFfSEFTX1JUQ1BfWFIgKi8KKworfQorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0cmVycm9yLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZThjMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc3RyZXJyb3IuYwpAQCAtMCwwICsxLDcxIEBACisvKiAkSWQ6IHN0cmVycm9yLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX3N0cmVycm9yX2MgU2FtcGxlczogUHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy9zdHJlcnJvci5jCisgKgorICogXGluY2x1ZGVsaW5lbm8gc3RyZXJyb3IuYworICovCisKKworI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8cGpsaWItdXRpbC5oPgorI2luY2x1ZGUgPHBqc2lwLmg+CisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbmF0aC5oPgorI2luY2x1ZGUgPHBqc2lwX3NpbXBsZS5oPgorCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lcHQ7CisgICAgcGpzaXBfZW5kcG9pbnQgKnNpcF9lcHQ7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKyAgICBwal9zdGF0dXNfdCBjb2RlOworCisgICAgaWYgKGFyZ2MgIT0gMikgeworCXB1dHMoIlVzYWdlOiBzdHJlcnJvciBFUlJOVU0iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBwal9sb2dfc2V0X2xldmVsKDMpOworCisgICAgcGpfaW5pdCgpOworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgTlVMTCwgMCk7CisgICAgcGpsaWJfdXRpbF9pbml0KCk7CisgICAgcGpuYXRoX2luaXQoKTsKKyAgICBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMCwgJm1lZF9lcHQpOworICAgIHBqc2lwX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgImxvY2FsaG9zdCIsICZzaXBfZXB0KTsKKyAgICBwanNpcF9ldnN1Yl9pbml0X21vZHVsZShzaXBfZXB0KTsKKworICAgIGNvZGUgPSBhdG9pKGFyZ3ZbMV0pOworICAgIHBqX3N0cmVycm9yKGNvZGUsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCisgICAgcHJpbnRmKCJTdGF0dXMgJWQ6ICVzXG4iLCBjb2RlLCBlcnJtc2cpOworCisgICAgcGpfc2h1dGRvd24oKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy90b25lZ2VuLmMgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3RvbmVnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk0ODBiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy90b25lZ2VuLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qICRJZDogdG9uZWdlbi5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGptZWRpYV9zYW1wbGVzX3RvbmVnZW5fYyBTYW1wbGVzOiBTaW5lIFdhdmUvRHVhbC1Ub25lIEdlbmVyYXRpb24KKyAqCisgKiBUaGlzIGlzIGEgc2ltcGxlIHByb2dyYW0gdG8gZ2VuZXJhdGUgYSB0b25lIGFuZCB3cml0ZSB0aGUgc2FtcGxlcyB0bworICogYSByYXcgUENNIGZpbGUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGFuYWx5emUgdGhlCisgKiBxdWFsaXR5IG9mIHRoZSB0b25lcy9zaW5lIHdhdmUgZ2VuZXJhdGVkIGJ5IFBKTUVESUEgdG9uZS9zaW5lIHdhdmUKKyAqIGdlbmVyYXRvci4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy90b25lZ2VuLmMKKyAqCisgKiBcaW5jbHVkZWxpbmVubyB0b25lZ2VuLmMKKyAqLworCisKKyNpbmNsdWRlIDxwam1lZGlhLmg+CisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRSAgIDY0CisjZGVmaW5lIE9OX0RVUkFUSU9OCSAgICAxMDAKKyNkZWZpbmUgT0ZGX0RVUkFUSU9OCSAgICAxMDAKKworCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKCkKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgY3A7CisgICAgcGptZWRpYV9lbmRwdCAqbWVkX2VuZHB0OworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwam1lZGlhX3BvcnQgKnBvcnQ7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKworICAgIC8qIE11c3QgaW5pdCBQSkxJQiBmaXJzdDogKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBNdXN0IGNyZWF0ZSBhIHBvb2wgZmFjdG9yeSBiZWZvcmUgd2UgY2FuIGFsbG9jYXRlIGFueSBtZW1vcnkuICovCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5LCAwKTsKKworICAgIC8qIAorICAgICAqIEluaXRpYWxpemUgbWVkaWEgZW5kcG9pbnQuCisgICAgICogVGhpcyB3aWxsIGltcGxpY2l0bHkgaW5pdGlhbGl6ZSBQSk1FRElBIHRvby4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX2VuZHB0X2NyZWF0ZSgmY3AuZmFjdG9yeSwgTlVMTCwgMSwgJm1lZF9lbmRwdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBDcmVhdGUgbWVtb3J5IHBvb2wgZm9yIG91ciBmaWxlIHBsYXllciAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggJmNwLmZhY3RvcnksCSAgICAvKiBwb29sIGZhY3RvcnkJICAgICovCisJCQkgICAiYXBwIiwJICAgIC8qIHBvb2wgbmFtZS4JICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5pdCBzaXplCSAgICAqLworCQkJICAgNDAwMCwJICAgIC8qIGluY3JlbWVudCBzaXplCSAgICAqLworCQkJICAgTlVMTAkJICAgIC8qIGNhbGxiYWNrIG9uIGVycm9yICAgICovCisJCQkgICApOworCisgICAgc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX2NyZWF0ZShwb29sLCA4MDAwLCAxLCBTQU1QTEVTX1BFUl9GUkFNRSwgMTYsIDAsICZwb3J0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIDE7CisKKyAgICB7CisJcGptZWRpYV90b25lX2Rlc2MgdG9uZXNbM107CisKKwl0b25lc1swXS5mcmVxMSA9IDIwMDsKKwl0b25lc1swXS5mcmVxMiA9IDA7CisJdG9uZXNbMF0ub25fbXNlYyA9IE9OX0RVUkFUSU9OOworCXRvbmVzWzBdLm9mZl9tc2VjID0gT0ZGX0RVUkFUSU9OOworCisJdG9uZXNbMV0uZnJlcTEgPSA0MDA7CisJdG9uZXNbMV0uZnJlcTIgPSAwOworCXRvbmVzWzFdLm9uX21zZWMgPSBPTl9EVVJBVElPTjsKKwl0b25lc1sxXS5vZmZfbXNlYyA9IE9GRl9EVVJBVElPTjsKKworCXRvbmVzWzJdLmZyZXExID0gODAwOworCXRvbmVzWzJdLmZyZXEyID0gMDsKKwl0b25lc1syXS5vbl9tc2VjID0gT05fRFVSQVRJT047CisJdG9uZXNbMl0ub2ZmX21zZWMgPSBPRkZfRFVSQVRJT047CisKKwlzdGF0dXMgPSBwam1lZGlhX3RvbmVnZW5fcGxheShwb3J0LCAzLCB0b25lcywgMCk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXM9PVBKX1NVQ0NFU1MsIDEpOworICAgIH0KKworICAgIHsKKwlwam1lZGlhX3RvbmVfZGlnaXQgZGlnaXRzWzJdOworCisJZGlnaXRzWzBdLmRpZ2l0ID0gJzAnOworCWRpZ2l0c1swXS5vbl9tc2VjID0gT05fRFVSQVRJT047CisJZGlnaXRzWzBdLm9mZl9tc2VjID0gT0ZGX0RVUkFUSU9OOworCisJZGlnaXRzWzFdLmRpZ2l0ID0gJzAnOworCWRpZ2l0c1sxXS5vbl9tc2VjID0gT05fRFVSQVRJT047CisJZGlnaXRzWzFdLm9mZl9tc2VjID0gT0ZGX0RVUkFUSU9OOworCisJc3RhdHVzID0gcGptZWRpYV90b25lZ2VuX3BsYXlfZGlnaXRzKHBvcnQsIDIsIGRpZ2l0cywgMCk7CisJUEpfQVNTRVJUX1JFVFVSTihzdGF0dXM9PVBKX1NVQ0NFU1MsIDEpOworICAgIH0KKworICAgIHsKKwlwam1lZGlhX2ZyYW1lIGZybTsKKwlGSUxFICpmOworCXZvaWQgKmJ1ZjsKKworCWJ1ZiA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgMio4MDAwKTsKKwlmcm0uYnVmID0gYnVmOworCisJZiA9IGZvcGVuKCJ0b25lZ2VuLnBjbSIsICJ3YiIpOworCisJZm9yIChpPTA7IGk8ODAwMC9TQU1QTEVTX1BFUl9GUkFNRTsgKytpKSB7CisJICAgIHBqX3NpemVfdCBjb3VudDsKKwkgICAgcGptZWRpYV9wb3J0X2dldF9mcmFtZShwb3J0LCAmZnJtKTsKKwkgICAgY291bnQgPSBmd3JpdGUoYnVmLCBTQU1QTEVTX1BFUl9GUkFNRSwgMiwgZik7CisJICAgIGlmIChjb3VudCAhPSAyKQorCQlicmVhazsKKwl9CisKKwlwal9hc3NlcnQocGptZWRpYV90b25lZ2VuX2lzX2J1c3kocG9ydCkgPT0gMCk7CisJZmNsb3NlKGYpOworICAgIH0KKworICAgIC8qIERlbGV0ZSBwb3J0ICovCisgICAgcGptZWRpYV9wb3J0X2Rlc3Ryb3kocG9ydCk7CisKKyAgICAvKiBSZWxlYXNlIGFwcGxpY2F0aW9uIHBvb2wgKi8KKyAgICBwal9wb29sX3JlbGVhc2UoIHBvb2wgKTsKKworICAgIC8qIERlc3Ryb3kgbWVkaWEgZW5kcG9pbnQuICovCisgICAgcGptZWRpYV9lbmRwdF9kZXN0cm95KCBtZWRfZW5kcHQgKTsKKworICAgIC8qIERlc3Ryb3kgcG9vbCBmYWN0b3J5ICovCisgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koICZjcCApOworCisgICAgLyogU2h1dGRvd24gUEpMSUIgKi8KKyAgICBwal9zaHV0ZG93bigpOworCisKKyAgICAvKiBEb25lLiAqLworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy91dGlsLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgwNTZmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy91dGlsLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qICRJZDogdXRpbC5oIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgkvKiBzdHJ0b2woKSAqLworCisvKiBVdGlsIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZSAgKi8KK3N0YXRpYyBpbnQgYXBwX3BlcnJvciggY29uc3QgY2hhciAqc2VuZGVyLCBjb25zdCBjaGFyICp0aXRsZSwgCisJCSAgICAgICBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKworICAgIHBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisKKyAgICBQSl9MT0coMywoc2VuZGVyLCAiJXM6ICVzIFtjb2RlPSVkXSIsIHRpdGxlLCBlcnJtc2csIHN0YXR1cykpOworICAgIHJldHVybiAxOworfQorCisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIENMT0NLX1JBVEUJNDQxMDAKKyNkZWZpbmUgTlNBTVBMRVMJKENMT0NLX1JBVEUgKiAyMCAvIDEwMDApCisjZGVmaW5lIE5DSEFOTkVMUwkxCisjZGVmaW5lIE5CSVRTCQkxNgorCisvKgorICogQ29tbW9uIHNvdW5kIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgU05EX1VTQUdFICAgXAorIiAgLWQsIC0tZGV2PU5VTSAgICAgICAgU291bmQgZGV2aWNlIHVzZSBkZXZpY2UgaWQgTlVNIChkZWZhdWx0PS0xKQkgXG4iXAorIiAgLXIsIC0tcmF0ZT1IWiAgICAgICAgU2V0IGNsb2NrIHJhdGUgaW4gc2FtcGxlcyBwZXIgc2VjIChkZWZhdWx0PTQ0MTAwKVxuIlwKKyIgIC1jLCAtLWNoYW5uZWw9TlVNICAgIFNldCAjIG9mIGNoYW5uZWxzIChkZWZhdWx0PTEgZm9yIG1vbm8pLgkJIFxuIlwKKyIgIC1mLCAtLWZyYW1lPU5VTSAgICAgIFNldCAjIG9mIHNhbXBsZXMgcGVyIGZyYW1lIChkZWZhdWx0IGVxdWl2YWwgMjBtcylcbiJcCisiICAtYiwgLS1iaXQ9TlVNICAgICAgICBTZXQgIyBvZiBiaXRzIHBlciBzYW1wbGUgKGRlZmF1bHQ9MTYpCQkgXG4iCisKKworLyoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhbmQgbG9vayBmb3IKKyAqIGNvbW1vbiBzb3VuZCBvcHRpb25zLgorICovCitwal9zdGF0dXNfdCBnZXRfc25kX29wdGlvbnMoY29uc3QgY2hhciAqYXBwX25hbWUsCisJCQkgICAgaW50IGFyZ2MsIAorCQkJICAgIGNoYXIgKmFyZ3ZbXSwKKwkJCSAgICBpbnQgKmRldl9pZCwKKwkJCSAgICBpbnQgKmNsb2NrX3JhdGUsCisJCQkgICAgaW50ICpjaGFubmVsX2NvdW50LAorCQkJICAgIGludCAqc2FtcGxlc19wZXJfZnJhbWUsCisJCQkgICAgaW50ICpiaXRzX3Blcl9zYW1wbGUpCit7CisgICAgc3RydWN0IHBqX2dldG9wdF9vcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJeyAiZGV2IiwJMSwgMCwgJ2QnIH0sCisJeyAicmF0ZSIsCTEsIDAsICdyJyB9LAorCXsgImNoYW5uZWwiLAkxLCAwLCAnYycgfSwKKwl7ICJmcmFtZSIsCTEsIDAsICdmJyB9LAorCXsgImJpdCIsCTEsIDAsICdiJyB9LAorCXsgTlVMTCwgMCwgMCwgMCB9LAorICAgIH07CisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKyAgICBsb25nIHZhbDsKKyAgICBjaGFyICplcnI7CisKKyAgICAqc2FtcGxlc19wZXJfZnJhbWUgPSAwOworCisgICAgcGpfb3B0aW5kID0gMDsKKyAgICB3aGlsZSgoYz1wal9nZXRvcHRfbG9uZyhhcmdjLGFyZ3YsICJkOnI6YzpmOmI6IiwgCisJCQkgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KSkhPS0xKSAKKyAgICB7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdkJzoKKwkgICAgLyogZGV2aWNlICovCisJICAgIHZhbCA9IHN0cnRvbChwal9vcHRhcmcsICZlcnIsIDEwKTsKKwkgICAgaWYgKCplcnIpIHsKKwkJUEpfTE9HKDMsKGFwcF9uYW1lLCAiRXJyb3I6IGludmFsaWQgdmFsdWUgZm9yIGRldmljZSBpZCIpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICAqZGV2X2lkID0gdmFsOworCSAgICBicmVhazsKKworCWNhc2UgJ3InOgorCSAgICAvKiByYXRlICovCisJICAgIHZhbCA9IHN0cnRvbChwal9vcHRhcmcsICZlcnIsIDEwKTsKKwkgICAgaWYgKCplcnIpIHsKKwkJUEpfTE9HKDMsKGFwcF9uYW1lLCAiRXJyb3I6IGludmFsaWQgdmFsdWUgZm9yIGNsb2NrIHJhdGUiKSk7CisJCXJldHVybiBQSl9FSU5WQUw7CisJICAgIH0KKwkgICAgKmNsb2NrX3JhdGUgPSB2YWw7CisJICAgIGJyZWFrOworCisJY2FzZSAnYyc6CisJICAgIC8qIGNoYW5uZWwgY291bnQgKi8KKwkgICAgdmFsID0gc3RydG9sKHBqX29wdGFyZywgJmVyciwgMTApOworCSAgICBpZiAoKmVycikgeworCQlQSl9MT0coMywoYXBwX25hbWUsICJFcnJvcjogaW52YWxpZCBjaGFubmVsIGNvdW50IikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgICpjaGFubmVsX2NvdW50ID0gdmFsOworCSAgICBicmVhazsKKworCWNhc2UgJ2YnOgorCSAgICAvKiBmcmFtZSBjb3VudC9zYW1wbGVzIHBlciBmcmFtZSAqLworCSAgICB2YWwgPSBzdHJ0b2wocGpfb3B0YXJnLCAmZXJyLCAxMCk7CisJICAgIGlmICgqZXJyKSB7CisJCVBKX0xPRygzLChhcHBfbmFtZSwgIkVycm9yOiBpbnZhbGlkIHNhbXBsZXMgcGVyIGZyYW1lIikpOworCQlyZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgICpzYW1wbGVzX3Blcl9mcmFtZSA9IHZhbDsKKwkgICAgYnJlYWs7CisKKwljYXNlICdiJzoKKwkgICAgLyogYml0IHBlciBzYW1wbGUgKi8KKwkgICAgdmFsID0gc3RydG9sKHBqX29wdGFyZywgJmVyciwgMTApOworCSAgICBpZiAoKmVycikgeworCQlQSl9MT0coMywoYXBwX25hbWUsICJFcnJvcjogaW52YWxpZCBzYW1wbGVzIGJpdHMgcGVyIHNhbXBsZSIpKTsKKwkJcmV0dXJuIFBKX0VJTlZBTDsKKwkgICAgfQorCSAgICAqYml0c19wZXJfc2FtcGxlID0gdmFsOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIC8qIFVua25vd24gb3B0aW9ucyAqLworCSAgICBQSl9MT0coMywoYXBwX25hbWUsICJFcnJvcjogdW5rbm93biBvcHRpb25zICclYyciLCBwal9vcHRvcHQpKTsKKwkgICAgcmV0dXJuIFBKX0VJTlZBTDsKKwl9CisKKyAgICB9CisKKyAgICBpZiAoKnNhbXBsZXNfcGVyX2ZyYW1lID09IDApIHsKKwkqc2FtcGxlc19wZXJfZnJhbWUgPSAqY2xvY2tfcmF0ZSAqICpjaGFubmVsX2NvdW50ICogMjAgLyAxMDAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qIER1bXAgbWVtb3J5IHBvb2wgdXNhZ2UuICovCit2b2lkIGR1bXBfcG9vbF91c2FnZSggY29uc3QgY2hhciAqYXBwX25hbWUsIHBqX2NhY2hpbmdfcG9vbCAqY3AgKQoreworI2lmICFkZWZpbmVkKFBKX0hBU19QT09MX0FMVF9BUEkpIHx8IFBKX0hBU19QT09MX0FMVF9BUEk9PTAKKyAgICBwal9wb29sX3QgICAqcDsKKyAgICBwal9zaXplX3QgICAgdG90YWxfYWxsb2MgPSAwOworICAgIHBqX3NpemVfdCAgICB0b3RhbF91c2VkID0gMDsKKworICAgIC8qIEFjY3VtdWxhdGUgbWVtb3J5IHVzYWdlIGluIGFjdGl2ZSBsaXN0LiAqLworICAgIHAgPSBjcC0+dXNlZF9saXN0Lm5leHQ7CisgICAgd2hpbGUgKHAgIT0gKHBqX3Bvb2xfdCopICZjcC0+dXNlZF9saXN0KSB7CisJdG90YWxfYWxsb2MgKz0gcGpfcG9vbF9nZXRfY2FwYWNpdHkocCk7CisJdG90YWxfdXNlZCArPSBwal9wb29sX2dldF91c2VkX3NpemUocCk7CisJcCA9IHAtPm5leHQ7CisgICAgfQorCisgICAgUEpfTE9HKDMsIChhcHBfbmFtZSwgIlRvdGFsIHBvb2wgbWVtb3J5IGFsbG9jYXRlZD0lZCBLQiwgdXNlZD0lZCBLQiIsCisJICAgICAgIHRvdGFsX2FsbG9jIC8gMTAwMCwKKwkgICAgICAgdG90YWxfdXNlZCAvIDEwMDApKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy92aWRfc3RyZWFtdXRpbC5jIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc2FtcGxlcy92aWRfc3RyZWFtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zYW1wbGVzL3ZpZF9zdHJlYW11dGlsLmMKQEAgLTAsMCArMSw5NjggQEAKKy8qICRJZDogdmlkX3N0cmVhbXV0aWwuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisKKy8qKgorICogXHBhZ2UgcGFnZV9wam1lZGlhX3NhbXBsZXNfdmlkX3N0cmVhbXV0aWxfYyBTYW1wbGVzOiBWaWRlbyBTdHJlYW1pbmcKKyAqCisgKiBUaGlzIGV4YW1wbGUgbWFpbmx5IGRlbW9uc3RyYXRlcyBob3cgdG8gc3RyZWFtIHZpZGVvIHRvIHJlbW90ZQorICogcGVlciB1c2luZyBSVFAuCisgKgorICogVGhpcyBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvdmlkX3N0cmVhbXV0aWwuYworICoKKyAqIFxpbmNsdWRlbGluZW5vIHZpZF9zdHJlYW11dGlsLmMKKyAqLworCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwamxpYi11dGlsLmg+CisjaW5jbHVkZSA8cGptZWRpYS5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydF9zcnRwLmg+CisKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfVklERU8pICYmIChQSk1FRElBX0hBU19WSURFTyAhPSAwKQorCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYXRvaSgpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInV0aWwuaCIKKworCitzdGF0aWMgY29uc3QgY2hhciAqZGVzYyA9IAorICIgdmlkX3N0cmVhbXV0aWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIlxuIgorICIgUFVSUE9TRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIiAgRGVtb25zdHJhdGUgaG93IHRvIHVzZSBwam1lZGlhIHZpZGVvIHN0cmVhbSBjb21wb25lbnQgdG8JCVxuIgorICIgIHRyYW5zbWl0L3JlY2VpdmUgUlRQIHBhY2tldHMgdG8vZnJvbSB2aWRlbyBkZXZpY2UvZmlsZS4JCVxuIgorICJcbiIKKyAiXG4iCisgIiBVU0FHRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiICB2aWRfc3RyZWFtdXRpbCBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICJcbiIKKyAiXG4iCisgIiBPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiICAtLWNvZGVjPUNPREVDICAgICAgICAgU2V0IHRoZSBjb2RlYyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICIgIC0tbG9jYWwtcG9ydD1QT1JUICAgICBTZXQgbG9jYWwgUlRQIHBvcnQgKGRlZmF1bHQ9NDAwMCkgICAgICAgICAgICAgXG4iCisgIiAgLS1yZW1vdGU9SVA6UE9SVCAgICAgIFNldCB0aGUgcmVtb3RlIHBlZXIuIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gd2lsbCB0cmFuc21pdCBSVFAgYXVkaW8gdG8gdGhlICAgIFxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYWRkcmVzcy4gKGRlZmF1bHQ6IHJlY3Ygb25seSkgICAgICAgXG4iCisgIiAgLS1wbGF5LWZpbGU9QVZJICAgICAgIFNlbmQgdmlkZW8gZnJvbSB0aGUgQVZJIGZpbGUgaW5zdGVhZCBvZiBmcm9tICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZpZGVvIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICIgIC0tc2VuZC1yZWN2ICAgICAgICAgICBTZXQgc3RyZWFtIGRpcmVjdGlvbiB0byBiaWRpcmVjdGlvbmFsLiAgICAgICAgXG4iCisgIiAgLS1zZW5kLW9ubHkgICAgICAgICAgIFNldCBzdHJlYW0gZGlyZWN0aW9uIHRvIHNlbmQgb25seSAgICAgICAgICAgICBcbiIKKyAiICAtLXJlY3Ytb25seSAgICAgICAgICAgU2V0IHN0cmVhbSBkaXJlY3Rpb24gdG8gcmVjdiBvbmx5IChkZWZhdWx0KSAgIFxuIgorIAorICIgIC0tc2VuZC13aWR0aCAgICAgICAgICBWaWRlbyB3aWR0aCB0byBiZSBzZW50ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIiAgLS1zZW5kLWhlaWdodCAgICAgICAgIFZpZGVvIGhlaWdodCB0byBiZSBzZW50ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgLS1zZW5kLXdpZHRoIGFuZCAtLXNlbmQtaGVpZ2h0IG5vdCBhcHBsaWNhYmxlIFxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZSBzdHJlYW1pbmcgKHNlZSAtLXBsYXktZmlsZSkgICAgICAgICAgXG4iCisKKyAiICAtLXNlbmQtcHQgICAgICAgICAgICAgUGF5bG9hZCB0eXBlIGZvciBzZW5kaW5nICAgICAgICAgICAgICAgICAgICAgIFxuIgorICIgIC0tcmVjdi1wdCAgICAgICAgICAgICBQYXlsb2FkIHR5cGUgZm9yIHJlY2VpdmluZyAgICAgICAgICAgICAgICAgICAgXG4iCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisgIiAgLS11c2Utc3J0cFs9TkFNRV0gICAgIEVuYWJsZSBTUlRQIHdpdGggY3J5cHRvIHN1aXRlIE5BTUUgICAgICAgICAgICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgZS5nOiBBRVNfQ01fMTI4X0hNQUNfU0hBMV84MCAoZGVmYXVsdCksICAgICAgIFxuIgorICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DTV8xMjhfSE1BQ19TSEExXzMyICAgICAgICAgICAgICAgICAgXG4iCisgIiAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGlzIG9wdGlvbiBhbG9uZyB3aXRoIHRoZSBUWCAmIFJYIGtleXMsICBcbiIKKyAiICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ZWQgb2YgNjAgaGV4IGRpZ2l0cyAoZS5nOiBFMTQ4REEuLikgICAgIFxuIgorICIgIC0tc3J0cC10eC1rZXkgICAgICAgICBTUlRQIGtleSBmb3IgdHJhbnNtaXRpbmcgICAgICAgICAgICAgICAgICAgICAgXG4iCisgIiAgLS1zcnRwLXJ4LWtleSAgICAgICAgIFNSVFAga2V5IGZvciByZWNlaXZpbmcgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyNlbmRpZgorCisgIlxuIgorOworCisjZGVmaW5lIFRISVNfRklMRQkidmlkX3N0cmVhbXV0aWwuYyIKKworCisvKiBJZiBzZXQsIGxvY2FsIHJlbmRlcmVyIHdpbGwgYmUgY3JlYXRlZCB0byBwbGF5IG9yaWdpbmFsIGZpbGUgKi8KKyNkZWZpbmUgSEFTX0xPQ0FMX1JFTkRFUkVSX0ZPUl9QTEFZX0ZJTEUgICAgMQorCisKKy8qIERlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHJlbmRlcmVyLCBiZXR0ZXIgYmUgc2V0IHRvIG1heGltdW0KKyAqIGFjY2VwdGFibGUgc2l6ZS4KKyAqLworI2RlZmluZSBERUZfUkVOREVSRVJfV0lEVEgJCSAgICA2NDAKKyNkZWZpbmUgREVGX1JFTkRFUkVSX0hFSUdIVAkJICAgIDQ4MAorCisKKy8qIFByb3RvdHlwZSAqLworc3RhdGljIHZvaWQgcHJpbnRfc3RyZWFtX3N0YXQocGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0sCisJCQkgICAgICBjb25zdCBwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqY29kZWNfcGFyYW0pOworCisvKiBQcm90b3R5cGUgZm9yIExJQlNSVFAgdXRpbGl0eSBpbiBmaWxlIGRhdGF0eXBlcy5jICovCitpbnQgaGV4X3N0cmluZ190b19vY3RldF9zdHJpbmcoY2hhciAqcmF3LCBjaGFyICpoZXgsIGludCBsZW4pOworCisvKiAKKyAqIFJlZ2lzdGVyIGFsbCBjb2RlY3MuIAorICovCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9jb2RlY3MocGpfcG9vbF9mYWN0b3J5ICpwZikKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBUbyBzdXBwcmVzcyB3YXJuaW5nIGFib3V0IHVudXNlZCB2YXIgd2hlbiBhbGwgY29kZWNzIGFyZSBkaXNhYmxlZCAqLworICAgIFBKX1VOVVNFRF9BUkcoc3RhdHVzKTsKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfRkZNUEVHX1ZJRF9DT0RFQykgJiYgUEpNRURJQV9IQVNfRkZNUEVHX1ZJRF9DT0RFQyAhPSAwCisgICAgc3RhdHVzID0gcGptZWRpYV9jb2RlY19mZm1wZWdfdmlkX2luaXQoTlVMTCwgcGYpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIHN0YXR1cyk7CisjZW5kaWYKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiAKKyAqIFJlZ2lzdGVyIGFsbCBjb2RlY3MuIAorICovCitzdGF0aWMgdm9pZCBkZWluaXRfY29kZWNzKCkKK3sKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMpICYmIFBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMgIT0gMAorICAgIHBqbWVkaWFfY29kZWNfZmZtcGVnX3ZpZF9kZWluaXQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgY3JlYXRlX2ZpbGVfcGxheWVyKCBwal9wb29sX3QgKnBvb2wsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJCQkgICAgICAgcGptZWRpYV9wb3J0ICoqcF9wbGF5X3BvcnQpCit7CisgICAgcGptZWRpYV9hdmlfc3RyZWFtcyAqYXZpX3N0cmVhbXM7CisgICAgcGptZWRpYV9hdmlfc3RyZWFtICp2aWRfc3RyZWFtOworICAgIHBqbWVkaWFfcG9ydCAqcGxheV9wb3J0OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXZpX3BsYXllcl9jcmVhdGVfc3RyZWFtcyhwb29sLCBmaWxlX25hbWUsIDAsICZhdmlfc3RyZWFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICB2aWRfc3RyZWFtID0gcGptZWRpYV9hdmlfc3RyZWFtc19nZXRfc3RyZWFtX2J5X21lZGlhKGF2aV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBKTUVESUFfVFlQRV9WSURFTyk7CisgICAgaWYgKCF2aWRfc3RyZWFtKQorCXJldHVybiBQSl9FTk9URk9VTkQ7CisKKyAgICBwbGF5X3BvcnQgPSBwam1lZGlhX2F2aV9zdHJlYW1fZ2V0X3BvcnQodmlkX3N0cmVhbSk7CisgICAgcGpfYXNzZXJ0KHBsYXlfcG9ydCk7CisKKyAgICAqcF9wbGF5X3BvcnQgPSBwbGF5X3BvcnQ7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogCisgKiBDcmVhdGUgc3RyZWFtIGJhc2VkIG9uIHRoZSBjb2RlYywgZGlyLCByZW1vdGUgYWRkcmVzcywgZXRjLiAKKyAqLworc3RhdGljIHBqX3N0YXR1c190IGNyZWF0ZV9zdHJlYW0oIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdCwKKwkJCQkgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKmNvZGVjX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKmNvZGVjX3BhcmFtLAorCQkJCSAgcGptZWRpYV9kaXIgZGlyLAorCQkJCSAgcGpfaW50OF90IHJ4X3B0LAorCQkJCSAgcGpfaW50OF90IHR4X3B0LAorCQkJCSAgcGpfdWludDE2X3QgbG9jYWxfcG9ydCwKKwkJCQkgIGNvbnN0IHBqX3NvY2thZGRyX2luICpyZW1fYWRkciwKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisJCQkJICBwal9ib29sX3QgdXNlX3NydHAsCisJCQkJICBjb25zdCBwal9zdHJfdCAqY3J5cHRvX3N1aXRlLAorCQkJCSAgY29uc3QgcGpfc3RyX3QgKnNydHBfdHhfa2V5LAorCQkJCSAgY29uc3QgcGpfc3RyX3QgKnNydHBfcnhfa2V5LAorI2VuZGlmCisJCQkJICBwam1lZGlhX3ZpZF9zdHJlYW0gKipwX3N0cmVhbSApCit7CisgICAgcGptZWRpYV92aWRfc3RyZWFtX2luZm8gaW5mbzsKKyAgICBwam1lZGlhX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorICAgIHBqbWVkaWFfdHJhbnNwb3J0ICpzcnRwX3RwID0gTlVMTDsKKyNlbmRpZgorCisgICAgLyogUmVzZXQgc3RyZWFtIGluZm8uICovCisgICAgcGpfYnplcm8oJmluZm8sIHNpemVvZihpbmZvKSk7CisKKyAgICAvKiBJbml0aWFsaXplIHN0cmVhbSBpbmZvIGZvcm1hdHMgKi8KKyAgICBpbmZvLnR5cGUgPSBQSk1FRElBX1RZUEVfVklERU87CisgICAgaW5mby5kaXIgPSBkaXI7CisgICAgaW5mby5jb2RlY19pbmZvID0gKmNvZGVjX2luZm87CisgICAgaW5mby50eF9wdCA9ICh0eF9wdCA9PSAtMSk/IGNvZGVjX2luZm8tPnB0IDogdHhfcHQ7CisgICAgaW5mby5yeF9wdCA9IChyeF9wdCA9PSAtMSk/IGNvZGVjX2luZm8tPnB0IDogcnhfcHQ7CisgICAgaW5mby5zc3JjID0gcGpfcmFuZCgpOworICAgIGlmIChjb2RlY19wYXJhbSkKKyAgICAgICAgaW5mby5jb2RlY19wYXJhbSA9IGNvZGVjX3BhcmFtOworICAgIAorICAgIC8qIENvcHkgcmVtb3RlIGFkZHJlc3MgKi8KKyAgICBwal9tZW1jcHkoJmluZm8ucmVtX2FkZHIsIHJlbV9hZGRyLCBzaXplb2YocGpfc29ja2FkZHJfaW4pKTsKKworICAgIC8qIElmIHJlbW90ZSBhZGRyZXNzIGlzIG5vdCBzZXQsIHNldCB0byBhbiBhcmJpdHJhcnkgYWRkcmVzcworICAgICAqIChvdGhlcndpc2Ugc3RyZWFtIHdpbGwgYXNzZXJ0KS4KKyAgICAgKi8KKyAgICBpZiAoaW5mby5yZW1fYWRkci5hZGRyLnNhX2ZhbWlseSA9PSAwKSB7CisJY29uc3QgcGpfc3RyX3QgYWRkciA9IHBqX3N0cigiMTI3LjAuMC4xIik7CisJcGpfc29ja2FkZHJfaW5faW5pdCgmaW5mby5yZW1fYWRkci5pcHY0LCAmYWRkciwgMCk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIG1lZGlhIHRyYW5zcG9ydCAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfdHJhbnNwb3J0X3VkcF9jcmVhdGUobWVkX2VuZHB0LCBOVUxMLCBsb2NhbF9wb3J0LAorCQkJCQkgIDAsICZ0cmFuc3BvcnQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorICAgIC8qIENoZWNrIGlmIFNSVFAgZW5hYmxlZCAqLworICAgIGlmICh1c2Vfc3J0cCkgeworCXBqbWVkaWFfc3J0cF9jcnlwdG8gdHhfcGxjLCByeF9wbGM7CisKKwlzdGF0dXMgPSBwam1lZGlhX3RyYW5zcG9ydF9zcnRwX2NyZWF0ZShtZWRfZW5kcHQsIHRyYW5zcG9ydCwgCisJCQkJCSAgICAgICBOVUxMLCAmc3J0cF90cCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworCisJcGpfYnplcm8oJnR4X3BsYywgc2l6ZW9mKHBqbWVkaWFfc3J0cF9jcnlwdG8pKTsKKwlwal9iemVybygmcnhfcGxjLCBzaXplb2YocGptZWRpYV9zcnRwX2NyeXB0bykpOworCisJdHhfcGxjLmtleSA9ICpzcnRwX3R4X2tleTsKKwl0eF9wbGMubmFtZSA9ICpjcnlwdG9fc3VpdGU7CisJcnhfcGxjLmtleSA9ICpzcnRwX3J4X2tleTsKKwlyeF9wbGMubmFtZSA9ICpjcnlwdG9fc3VpdGU7CisJCisJc3RhdHVzID0gcGptZWRpYV90cmFuc3BvcnRfc3J0cF9zdGFydChzcnRwX3RwLCAmdHhfcGxjLCAmcnhfcGxjKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisKKwl0cmFuc3BvcnQgPSBzcnRwX3RwOworICAgIH0KKyNlbmRpZgorCisgICAgLyogTm93IHRoYXQgdGhlIHN0cmVhbSBpbmZvIGlzIGluaXRpYWxpemVkLCB3ZSBjYW4gY3JlYXRlIHRoZSAKKyAgICAgKiBzdHJlYW0uCisgICAgICovCisKKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9zdHJlYW1fY3JlYXRlKCBtZWRfZW5kcHQsIHBvb2wsICZpbmZvLCAKKwkJCQkJdHJhbnNwb3J0LCAKKwkJCQkJTlVMTCwgcF9zdHJlYW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcihUSElTX0ZJTEUsICJFcnJvciBjcmVhdGluZyBzdHJlYW0iLCBzdGF0dXMpOworCXBqbWVkaWFfdHJhbnNwb3J0X2Nsb3NlKHRyYW5zcG9ydCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK3R5cGVkZWYgc3RydWN0IHBsYXlfZmlsZV9kYXRhCit7CisgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOworICAgIHBqbWVkaWFfcG9ydCAqcGxheV9wb3J0OworICAgIHBqbWVkaWFfcG9ydCAqc3RyZWFtX3BvcnQ7CisgICAgcGptZWRpYV92aWRfY29kZWMgKmRlY29kZXI7CisgICAgcGptZWRpYV9wb3J0ICpyZW5kZXJlcjsKKyAgICB2b2lkICpyZWFkX2J1ZjsKKyAgICBwal9zaXplX3QgcmVhZF9idWZfc2l6ZTsKKyAgICB2b2lkICpkZWNfYnVmOworICAgIHBqX3NpemVfdCBkZWNfYnVmX3NpemU7Cit9IHBsYXlfZmlsZV9kYXRhOworCisKK3N0YXRpYyB2b2lkIGNsb2NrX2NiKGNvbnN0IHBqX3RpbWVzdGFtcCAqdHMsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBwbGF5X2ZpbGVfZGF0YSAqcGxheV9maWxlID0gKHBsYXlfZmlsZV9kYXRhKil1c2VyX2RhdGE7CisgICAgcGptZWRpYV9mcmFtZSByZWFkX2ZyYW1lLCB3cml0ZV9mcmFtZTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHRzKTsKKworICAgIC8qIFJlYWQgZnJhbWUgZnJvbSBmaWxlICovCisgICAgcmVhZF9mcmFtZS5idWYgPSBwbGF5X2ZpbGUtPnJlYWRfYnVmOworICAgIHJlYWRfZnJhbWUuc2l6ZSA9IHBsYXlfZmlsZS0+cmVhZF9idWZfc2l6ZTsKKyAgICBwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKHBsYXlfZmlsZS0+cGxheV9wb3J0LCAmcmVhZF9mcmFtZSk7CisKKyAgICAvKiBEZWNvZGUgZnJhbWUsIGlmIG5lZWRlZCAqLworICAgIGlmIChwbGF5X2ZpbGUtPmRlY29kZXIpIHsKKwlwam1lZGlhX3ZpZF9jb2RlYyAqZGVjb2RlciA9IHBsYXlfZmlsZS0+ZGVjb2RlcjsKKworCXdyaXRlX2ZyYW1lLmJ1ZiA9IHBsYXlfZmlsZS0+ZGVjX2J1ZjsKKwl3cml0ZV9mcmFtZS5zaXplID0gcGxheV9maWxlLT5kZWNfYnVmX3NpemU7CisJc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfZGVjb2RlKGRlY29kZXIsIDEsICZyZWFkX2ZyYW1lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpd3JpdGVfZnJhbWUuc2l6ZSwgCisJCQkJCSAgJndyaXRlX2ZyYW1lKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworCXdyaXRlX2ZyYW1lID0gcmVhZF9mcmFtZTsKKyAgICB9CisKKyAgICAvKiBEaXNwbGF5IGZyYW1lIGxvY2FsbHkgKi8KKyAgICBpZiAocGxheV9maWxlLT5yZW5kZXJlcikKKwlwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKHBsYXlfZmlsZS0+cmVuZGVyZXIsICZ3cml0ZV9mcmFtZSk7CisKKyAgICAvKiBTZW5kIGZyYW1lICovCisgICAgcGptZWRpYV9wb3J0X3B1dF9mcmFtZShwbGF5X2ZpbGUtPnN0cmVhbV9wb3J0LCAmd3JpdGVfZnJhbWUpOworfQorCisKKy8qCisgKiB1c2FnZSgpCisgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKCkKK3sKKyAgICBwdXRzKGRlc2MpOworfQorCisvKgorICogbWFpbigpCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcGpfY2FjaGluZ19wb29sIGNwOworICAgIHBqbWVkaWFfZW5kcHQgKm1lZF9lbmRwdDsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgIHBqbWVkaWFfcG9ydCAqZW5jX3BvcnQsICpkZWNfcG9ydDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7IAorCisgICAgcGptZWRpYV92aWRfcG9ydCAqY2FwdHVyZT1OVUxMLCAqcmVuZGVyZXI9TlVMTDsKKyAgICBwam1lZGlhX3ZpZF9wb3J0X3BhcmFtIHZwcDsKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAgICAvKiBTUlRQIHZhcmlhYmxlcyAqLworICAgIHBqX2Jvb2xfdCB1c2Vfc3J0cCA9IFBKX0ZBTFNFOworICAgIGNoYXIgdG1wX3R4X2tleVs2NF07CisgICAgY2hhciB0bXBfcnhfa2V5WzY0XTsKKyAgICBwal9zdHJfdCAgc3J0cF90eF9rZXkgPSB7TlVMTCwgMH07CisgICAgcGpfc3RyX3QgIHNydHBfcnhfa2V5ID0ge05VTEwsIDB9OworICAgIHBqX3N0cl90ICBzcnRwX2NyeXB0b19zdWl0ZSA9IHtOVUxMLCAwfTsKKyAgICBpbnQJdG1wX2tleV9sZW47CisjZW5kaWYKKworICAgIC8qIERlZmF1bHQgdmFsdWVzICovCisgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqY29kZWNfaW5mbzsKKyAgICBwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSBjb2RlY19wYXJhbTsKKyAgICBwam1lZGlhX2RpciBkaXIgPSBQSk1FRElBX0RJUl9ERUNPRElORzsKKyAgICBwal9zb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKKyAgICBwal91aW50MTZfdCBsb2NhbF9wb3J0ID0gNDAwMDsKKyAgICBjaGFyICpjb2RlY19pZCA9IE5VTEw7CisgICAgcGptZWRpYV9yZWN0X3NpemUgdHhfc2l6ZSA9IHswfTsKKyAgICBwal9pbnQ4X3QgcnhfcHQgPSAtMSwgdHhfcHQgPSAtMTsKKworICAgIHBsYXlfZmlsZV9kYXRhIHBsYXlfZmlsZSA9IHsgTlVMTCB9OworICAgIHBqbWVkaWFfcG9ydCAqcGxheV9wb3J0ID0gTlVMTDsKKyAgICBwam1lZGlhX3ZpZF9jb2RlYyAqcGxheV9kZWNvZGVyID0gTlVMTDsKKyAgICBwam1lZGlhX2Nsb2NrICpwbGF5X2Nsb2NrID0gTlVMTDsKKworICAgIGVudW0geworCU9QVF9DT0RFQwk9ICdjJywKKwlPUFRfTE9DQUxfUE9SVAk9ICdwJywKKwlPUFRfUkVNT1RFCT0gJ3InLAorCU9QVF9QTEFZX0ZJTEUJPSAnZicsCisJT1BUX1NFTkRfUkVDVgk9ICdiJywKKwlPUFRfU0VORF9PTkxZCT0gJ3MnLAorCU9QVF9SRUNWX09OTFkJPSAnaScsCisJT1BUX1NFTkRfV0lEVEgJPSAnVycsCisJT1BUX1NFTkRfSEVJR0hUCT0gJ0gnLAorCU9QVF9SRUNWX1BUCT0gJ3QnLAorCU9QVF9TRU5EX1BUCT0gJ1QnLAorI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKwlPUFRfVVNFX1NSVFAJPSAnUycsCisjZW5kaWYKKwlPUFRfU1JUUF9UWF9LRVkJPSAneCcsCisJT1BUX1NSVFBfUlhfS0VZCT0gJ3knLAorCU9QVF9IRUxQCT0gJ2gnLAorICAgIH07CisKKyAgICBzdHJ1Y3QgcGpfZ2V0b3B0X29wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJjb2RlYyIsCSAgICAxLCAwLCBPUFRfQ09ERUMgfSwKKwl7ICJsb2NhbC1wb3J0IiwJICAgIDEsIDAsIE9QVF9MT0NBTF9QT1JUIH0sCisJeyAicmVtb3RlIiwJICAgIDEsIDAsIE9QVF9SRU1PVEUgfSwKKwl7ICJwbGF5LWZpbGUiLAkgICAgMSwgMCwgT1BUX1BMQVlfRklMRSB9LAorCXsgInNlbmQtcmVjdiIsICAgICAgMCwgMCwgT1BUX1NFTkRfUkVDViB9LAorCXsgInNlbmQtb25seSIsICAgICAgMCwgMCwgT1BUX1NFTkRfT05MWSB9LAorCXsgInJlY3Ytb25seSIsICAgICAgMCwgMCwgT1BUX1JFQ1ZfT05MWSB9LAorCXsgInNlbmQtd2lkdGgiLCAgICAgMSwgMCwgT1BUX1NFTkRfV0lEVEggfSwKKwl7ICJzZW5kLWhlaWdodCIsICAgIDEsIDAsIE9QVF9TRU5EX0hFSUdIVCB9LAorCXsgInJlY3YtcHQiLCAgICAgICAgMSwgMCwgT1BUX1JFQ1ZfUFQgfSwKKwl7ICJzZW5kLXB0IiwgICAgICAgIDEsIDAsIE9QVF9TRU5EX1BUIH0sCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19TUlRQKSAmJiAoUEpNRURJQV9IQVNfU1JUUCAhPSAwKQorCXsgInVzZS1zcnRwIiwJICAgIDIsIDAsIE9QVF9VU0VfU1JUUCB9LAorCXsgInNydHAtdHgta2V5IiwgICAgMSwgMCwgT1BUX1NSVFBfVFhfS0VZIH0sCisJeyAic3J0cC1yeC1rZXkiLCAgICAxLCAwLCBPUFRfU1JUUF9SWF9LRVkgfSwKKyNlbmRpZgorCXsgImhlbHAiLAkgICAgMCwgMCwgT1BUX0hFTFAgfSwKKwl7IE5VTEwsIDAsIDAsIDAgfSwKKyAgICB9OworCisgICAgaW50IGM7CisgICAgaW50IG9wdGlvbl9pbmRleDsKKworCisgICAgcGpfYnplcm8oJnJlbW90ZV9hZGRyLCBzaXplb2YocmVtb3RlX2FkZHIpKTsKKworCisgICAgLyogaW5pdCBQSkxJQiA6ICovCisgICAgc3RhdHVzID0gcGpfaW5pdCgpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisKKyAgICAvKiBQYXJzZSBhcmd1bWVudHMgKi8KKyAgICBwal9vcHRpbmQgPSAwOworICAgIHdoaWxlKChjPXBqX2dldG9wdF9sb25nKGFyZ2MsYXJndiwgImgiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSE9LTEpCisgICAgeworCXN3aXRjaCAoYykgeworCWNhc2UgT1BUX0NPREVDOgorCSAgICBjb2RlY19pZCA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9MT0NBTF9QT1JUOgorCSAgICBsb2NhbF9wb3J0ID0gKHBqX3VpbnQxNl90KSBhdG9pKHBqX29wdGFyZyk7CisJICAgIGlmIChsb2NhbF9wb3J0IDwgMSkgeworCQlwcmludGYoIkVycm9yOiBpbnZhbGlkIGxvY2FsIHBvcnQgJXNcbiIsIHBqX29wdGFyZyk7CisJCXJldHVybiAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVNT1RFOgorCSAgICB7CisJCXBqX3N0cl90IGlwID0gcGpfc3RyKHN0cnRvayhwal9vcHRhcmcsICI6IikpOworCQlwal91aW50MTZfdCBwb3J0ID0gKHBqX3VpbnQxNl90KSBhdG9pKHN0cnRvayhOVUxMLCAiOiIpKTsKKworCQlzdGF0dXMgPSBwal9zb2NrYWRkcl9pbl9pbml0KCZyZW1vdGVfYWRkciwgJmlwLCBwb3J0KTsKKwkJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCSAgICBhcHBfcGVycm9yKFRISVNfRklMRSwgIkludmFsaWQgcmVtb3RlIGFkZHJlc3MiLCBzdGF0dXMpOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgT1BUX1BMQVlfRklMRToKKwkgICAgcGxheV9maWxlLmZpbGVfbmFtZSA9IHBqX29wdGFyZzsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TRU5EX1JFQ1Y6CisJICAgIGRpciA9IFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1NFTkRfT05MWToKKwkgICAgZGlyID0gUEpNRURJQV9ESVJfRU5DT0RJTkc7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfUkVDVl9PTkxZOgorCSAgICBkaXIgPSBQSk1FRElBX0RJUl9ERUNPRElORzsKKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TRU5EX1dJRFRIOgorCSAgICB0eF9zaXplLncgPSAodW5zaWduZWQpYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1NFTkRfSEVJR0hUOgorCSAgICB0eF9zaXplLmggPSAodW5zaWduZWQpYXRvaShwal9vcHRhcmcpOworCSAgICBicmVhazsKKworCWNhc2UgT1BUX1JFQ1ZfUFQ6CisJICAgIHJ4X3B0ID0gKHBqX2ludDhfdClhdG9pKHBqX29wdGFyZyk7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfU0VORF9QVDoKKwkgICAgdHhfcHQgPSAocGpfaW50OF90KWF0b2kocGpfb3B0YXJnKTsKKwkgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisJY2FzZSBPUFRfVVNFX1NSVFA6CisJICAgIHVzZV9zcnRwID0gUEpfVFJVRTsKKwkgICAgaWYgKHBqX29wdGFyZykgeworCQlwal9zdHJzZXQoJnNydHBfY3J5cHRvX3N1aXRlLCBwal9vcHRhcmcsIHN0cmxlbihwal9vcHRhcmcpKTsKKwkgICAgfSBlbHNlIHsKKwkJc3J0cF9jcnlwdG9fc3VpdGUgPSBwal9zdHIoIkFFU19DTV8xMjhfSE1BQ19TSEExXzgwIik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE9QVF9TUlRQX1RYX0tFWToKKwkgICAgdG1wX2tleV9sZW4gPSBoZXhfc3RyaW5nX3RvX29jdGV0X3N0cmluZyh0bXBfdHhfa2V5LCBwal9vcHRhcmcsIAorCQkJCQkJICAgICAoaW50KXN0cmxlbihwal9vcHRhcmcpKTsKKwkgICAgcGpfc3Ryc2V0KCZzcnRwX3R4X2tleSwgdG1wX3R4X2tleSwgdG1wX2tleV9sZW4vMik7CisJICAgIGJyZWFrOworCisJY2FzZSBPUFRfU1JUUF9SWF9LRVk6CisJICAgIHRtcF9rZXlfbGVuID0gaGV4X3N0cmluZ190b19vY3RldF9zdHJpbmcodG1wX3J4X2tleSwgcGpfb3B0YXJnLAorCQkJCQkJICAgICAoaW50KXN0cmxlbihwal9vcHRhcmcpKTsKKwkgICAgcGpfc3Ryc2V0KCZzcnRwX3J4X2tleSwgdG1wX3J4X2tleSwgdG1wX2tleV9sZW4vMik7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIE9QVF9IRUxQOgorCSAgICB1c2FnZSgpOworCSAgICByZXR1cm4gMTsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ZigiSW52YWxpZCBvcHRpb25zICVzXG4iLCBhcmd2W3BqX29wdGluZF0pOworCSAgICByZXR1cm4gMTsKKwl9CisKKyAgICB9CisKKworICAgIC8qIFZlcmlmeSBhcmd1bWVudHMuICovCisgICAgaWYgKGRpciAmIFBKTUVESUFfRElSX0VOQ09ESU5HKSB7CisJaWYgKHJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSAwKSB7CisJICAgIHByaW50ZigiRXJyb3I6IHJlbW90ZSBhZGRyZXNzIG11c3QgYmUgc2V0XG4iKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAgIGlmIChwbGF5X2ZpbGUuZmlsZV9uYW1lICE9IE5VTEwgJiYgZGlyICE9IFBKTUVESUFfRElSX0VOQ09ESU5HKSB7CisJcHJpbnRmKCJEaXJlY3Rpb24gaXMgc2V0IHRvIC0tc2VuZC1vbmx5IGJlY2F1c2Ugb2YgLS1wbGF5LWZpbGVcbiIpOworCWRpciA9IFBKTUVESUFfRElSX0VOQ09ESU5HOworICAgIH0KKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKyAgICAvKiBTUlRQIHZhbGlkYXRpb24gKi8KKyAgICBpZiAodXNlX3NydHApIHsKKwlpZiAoIXNydHBfdHhfa2V5LnNsZW4gfHwgIXNydHBfcnhfa2V5LnNsZW4pCisJeworCSAgICBwcmludGYoIkVycm9yOiBLZXkgZm9yIGVhY2ggU1JUUCBzdHJlYW0gZGlyZWN0aW9uIG11c3QgYmUgc2V0XG4iKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogTXVzdCBjcmVhdGUgYSBwb29sIGZhY3RvcnkgYmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSBhbnkgbWVtb3J5LiAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9pbml0KCZjcCwgJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeSwgMCk7CisKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIG1lZGlhIGVuZHBvaW50LgorICAgICAqIFRoaXMgd2lsbCBpbXBsaWNpdGx5IGluaXRpYWxpemUgUEpNRURJQSB0b28uCisgICAgICovCisgICAgc3RhdHVzID0gcGptZWRpYV9lbmRwdF9jcmVhdGUoJmNwLmZhY3RvcnksIE5VTEwsIDEsICZtZWRfZW5kcHQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzID09IFBKX1NVQ0NFU1MsIDEpOworCisgICAgLyogQ3JlYXRlIG1lbW9yeSBwb29sIGZvciBhcHBsaWNhdGlvbiBwdXJwb3NlICovCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKCAmY3AuZmFjdG9yeSwJICAgIC8qIHBvb2wgZmFjdG9yeQkgICAgKi8KKwkJCSAgICJhcHAiLAkgICAgLyogcG9vbCBuYW1lLgkgICAgKi8KKwkJCSAgIDQwMDAsCSAgICAvKiBpbml0IHNpemUJICAgICovCisJCQkgICA0MDAwLAkgICAgLyogaW5jcmVtZW50IHNpemUJICAgICovCisJCQkgICBOVUxMCQkgICAgLyogY2FsbGJhY2sgb24gZXJyb3IgICAgKi8KKwkJCSAgICk7CisKKyAgICAvKiBJbml0IHZpZGVvIGZvcm1hdCBtYW5hZ2VyICovCisgICAgcGptZWRpYV92aWRlb19mb3JtYXRfbWdyX2NyZWF0ZShwb29sLCA2NCwgMCwgTlVMTCk7CisKKyAgICAvKiBJbml0IHZpZGVvIGNvbnZlcnRlciBtYW5hZ2VyICovCisgICAgcGptZWRpYV9jb252ZXJ0ZXJfbWdyX2NyZWF0ZShwb29sLCBOVUxMKTsKKworICAgIC8qIEluaXQgZXZlbnQgbWFuYWdlciAqLworICAgIHBqbWVkaWFfZXZlbnRfbWdyX2NyZWF0ZShwb29sLCAwLCBOVUxMKTsKKworICAgIC8qIEluaXQgdmlkZW8gY29kZWMgbWFuYWdlciAqLworICAgIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9jcmVhdGUocG9vbCwgTlVMTCk7CisKKyAgICAvKiBJbml0IHZpZGVvIHN1YnN5c3RlbSAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9zdWJzeXNfaW5pdCgmY3AuZmFjdG9yeSk7CisKKyAgICAvKiBSZWdpc3RlciBhbGwgc3VwcG9ydGVkIGNvZGVjcyAqLworICAgIHN0YXR1cyA9IGluaXRfY29kZWNzKCZjcC5mYWN0b3J5KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworCisgICAgLyogRmluZCB3aGljaCBjb2RlYyB0byB1c2UuICovCisgICAgaWYgKGNvZGVjX2lkKSB7CisJdW5zaWduZWQgY291bnQgPSAxOworCXBqX3N0cl90IHN0cl9jb2RlY19pZCA9IHBqX3N0cihjb2RlY19pZCk7CisKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2ZpbmRfY29kZWNzX2J5X2lkKE5VTEwsCisJCQkJCQkgICAgICAgICAmc3RyX2NvZGVjX2lkLCAmY291bnQsCisJCQkJCQkgICAgICAgICAmY29kZWNfaW5mbywgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHByaW50ZigiRXJyb3I6IHVuYWJsZSB0byBmaW5kIGNvZGVjICVzXG4iLCBjb2RlY19pZCk7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgcGptZWRpYV92aWRfY29kZWNfaW5mbyBpbmZvWzFdOworICAgICAgICB1bnNpZ25lZCBjb3VudCA9IFBKX0FSUkFZX1NJWkUoaW5mbyk7CisKKwkvKiBEZWZhdWx0IHRvIGZpcnN0IGNvZGVjICovCisJcGptZWRpYV92aWRfY29kZWNfbWdyX2VudW1fY29kZWNzKE5VTEwsICZjb3VudCwgaW5mbywgTlVMTCk7CisgICAgICAgIGNvZGVjX2luZm8gPSAmaW5mb1swXTsKKyAgICB9CisKKyAgICAvKiBHZXQgY29kZWMgZGVmYXVsdCBwYXJhbSBmb3IgaW5mbyAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbShOVUxMLCBjb2RlY19pbmZvLCAKKwkJCQkgICAgICAgICAgICAgICAgICAgICAmY29kZWNfcGFyYW0pOworICAgIHBqX2Fzc2VydChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7CisgICAgCisgICAgLyogU2V0IG91dGdvaW5nIHZpZGVvIHNpemUgKi8KKyAgICBpZiAodHhfc2l6ZS53ICYmIHR4X3NpemUuaCkKKyAgICAgICAgY29kZWNfcGFyYW0uZW5jX2ZtdC5kZXQudmlkLnNpemUgPSB0eF9zaXplOworCisjaWYgREVGX1JFTkRFUkVSX1dJRFRIICYmIERFRl9SRU5ERVJFUl9IRUlHSFQKKyAgICAvKiBTZXQgaW5jb21pbmcgdmlkZW8gc2l6ZSAqLworICAgIGlmIChERUZfUkVOREVSRVJfV0lEVEggPiBjb2RlY19wYXJhbS5kZWNfZm10LmRldC52aWQuc2l6ZS53KQorCWNvZGVjX3BhcmFtLmRlY19mbXQuZGV0LnZpZC5zaXplLncgPSBERUZfUkVOREVSRVJfV0lEVEg7CisgICAgaWYgKERFRl9SRU5ERVJFUl9IRUlHSFQgPiBjb2RlY19wYXJhbS5kZWNfZm10LmRldC52aWQuc2l6ZS5oKQorCWNvZGVjX3BhcmFtLmRlY19mbXQuZGV0LnZpZC5zaXplLmggPSBERUZfUkVOREVSRVJfSEVJR0hUOworI2VuZGlmCisKKyAgICBpZiAocGxheV9maWxlLmZpbGVfbmFtZSkgeworCXBqbWVkaWFfdmlkZW9fZm9ybWF0X2RldGFpbCAqZmlsZV92ZmQ7CisgICAgICAgIHBqbWVkaWFfY2xvY2tfcGFyYW0gY2xvY2tfcGFyYW07CisgICAgICAgIGNoYXIgZm10X25hbWVbNV07CisKKwkvKiBDcmVhdGUgZmlsZSBwbGF5ZXIgKi8KKwlzdGF0dXMgPSBjcmVhdGVfZmlsZV9wbGF5ZXIocG9vbCwgcGxheV9maWxlLmZpbGVfbmFtZSwgJnBsYXlfcG9ydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2V4aXQ7CisKKwkvKiBDb2xsZWN0IGZvcm1hdCBpbmZvICovCisJZmlsZV92ZmQgPSBwam1lZGlhX2Zvcm1hdF9nZXRfdmlkZW9fZm9ybWF0X2RldGFpbCgmcGxheV9wb3J0LT5pbmZvLmZtdCwKKwkJCQkJCQkgIFBKX1RSVUUpOworCVBKX0xPRygyLCAoVEhJU19GSUxFLCAiUmVhZGluZyB2aWRlbyBzdHJlYW0gJWR4JWQgJXMgQCUuMmZmcHMiLAorCQkgICBmaWxlX3ZmZC0+c2l6ZS53LCBmaWxlX3ZmZC0+c2l6ZS5oLAorCQkgICBwam1lZGlhX2ZvdXJjY19uYW1lKHBsYXlfcG9ydC0+aW5mby5mbXQuaWQsIGZtdF9uYW1lKSwKKwkJICAgKDEuMCpmaWxlX3ZmZC0+ZnBzLm51bS9maWxlX3ZmZC0+ZnBzLmRlbnVtKSkpOworCisJLyogQWxsb2NhdGUgZmlsZSByZWFkIGJ1ZmZlciAqLworCXBsYXlfZmlsZS5yZWFkX2J1Zl9zaXplID0gUEpNRURJQV9NQVhfVklERU9fRU5DX0ZSQU1FX1NJWkU7CisJcGxheV9maWxlLnJlYWRfYnVmID0gcGpfcG9vbF96YWxsb2MocG9vbCwgcGxheV9maWxlLnJlYWRfYnVmX3NpemUpOworCisJLyogQ3JlYXRlIGRlY29kZXIsIGlmIHRoZSBmaWxlIGFuZCB0aGUgc3RyZWFtIHVzZXMgZGlmZmVyZW50IGNvZGVjICovCisJaWYgKGNvZGVjX2luZm8tPmZtdF9pZCAhPSAocGptZWRpYV9mb3JtYXRfaWQpcGxheV9wb3J0LT5pbmZvLmZtdC5pZCkgeworCSAgICBjb25zdCBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9pbmZvICpkZWNfdmZpOworCSAgICBwam1lZGlhX3ZpZGVvX2FwcGx5X2ZtdF9wYXJhbSBkZWNfdmFmcCA9IHswfTsKKwkgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqY29kZWNfaW5mbzI7CisJICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtIGNvZGVjX3BhcmFtMjsKKworCSAgICAvKiBGaW5kIGRlY29kZXIgKi8KKwkgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2dldF9jb2RlY19pbmZvMihOVUxMLAorCQkJCQkJCSAgIHBsYXlfcG9ydC0+aW5mby5mbXQuaWQsCisJCQkJCQkJICAgJmNvZGVjX2luZm8yKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlnb3RvIG9uX2V4aXQ7CisKKwkgICAgLyogSW5pdCBkZWNvZGVyICovCisJICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2NvZGVjX21ncl9hbGxvY19jb2RlYyhOVUxMLCBjb2RlY19pbmZvMiwKKwkJCQkJCSAgICAgICAmcGxheV9kZWNvZGVyKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlnb3RvIG9uX2V4aXQ7CisKKwkgICAgc3RhdHVzID0gcGxheV9kZWNvZGVyLT5vcC0+aW5pdChwbGF5X2RlY29kZXIsIHBvb2wpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWdvdG8gb25fZXhpdDsKKworCSAgICAvKiBPcGVuIGRlY29kZXIgKi8KKwkgICAgc3RhdHVzID0gcGptZWRpYV92aWRfY29kZWNfbWdyX2dldF9kZWZhdWx0X3BhcmFtKE5VTEwsIGNvZGVjX2luZm8yLAorCQkJCQkJCSAgICAgJmNvZGVjX3BhcmFtMik7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkJZ290byBvbl9leGl0OworCisJICAgIGNvZGVjX3BhcmFtMi5kaXIgPSBQSk1FRElBX0RJUl9ERUNPRElORzsKKwkgICAgc3RhdHVzID0gcGxheV9kZWNvZGVyLT5vcC0+b3BlbihwbGF5X2RlY29kZXIsICZjb2RlY19wYXJhbTIpOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJCWdvdG8gb25fZXhpdDsKKworCSAgICAvKiBHZXQgZGVjb2RlciBmb3JtYXQgaW5mbyBhbmQgYXBwbHkgcGFyYW0gKi8KKwkgICAgZGVjX3ZmaSA9IHBqbWVkaWFfZ2V0X3ZpZGVvX2Zvcm1hdF9pbmZvKE5VTEwsCisJCQkJCQkgICAgY29kZWNfaW5mbzItPmRlY19mbXRfaWRbMF0pOworCSAgICBpZiAoIWRlY192ZmkgfHwgIWRlY192ZmktPmFwcGx5X2ZtdCkgeworCQlzdGF0dXMgPSBQSl9FTk9UU1VQOworCQlnb3RvIG9uX2V4aXQ7CisJICAgIH0KKwkgICAgZGVjX3ZhZnAuc2l6ZSA9IGZpbGVfdmZkLT5zaXplOworCSAgICAoKmRlY192ZmktPmFwcGx5X2ZtdCkoZGVjX3ZmaSwgJmRlY192YWZwKTsKKworCSAgICAvKiBBbGxvY2F0ZSBidWZmZXIgdG8gcmVjZWl2ZSBkZWNvZGVyIG91dHB1dCAqLworCSAgICBwbGF5X2ZpbGUuZGVjX2J1Zl9zaXplID0gZGVjX3ZhZnAuZnJhbWVieXRlczsKKwkgICAgcGxheV9maWxlLmRlY19idWYgPSBwal9wb29sX3phbGxvYyhwb29sLCBwbGF5X2ZpbGUuZGVjX2J1Zl9zaXplKTsKKwl9CisKKwkvKiBDcmVhdGUgcGxheWVyIGNsb2NrICovCisgICAgICAgIGNsb2NrX3BhcmFtLnVzZWNfaW50ZXJ2YWwgPSBQSk1FRElBX1BUSU1FKCZmaWxlX3ZmZC0+ZnBzKTsKKyAgICAgICAgY2xvY2tfcGFyYW0uY2xvY2tfcmF0ZSA9IGNvZGVjX2luZm8tPmNsb2NrX3JhdGU7CisJc3RhdHVzID0gcGptZWRpYV9jbG9ja19jcmVhdGUyKHBvb2wsICZjbG9ja19wYXJhbSwKKwkJCQkgICAgICAgUEpNRURJQV9DTE9DS19OT19ISUdIRVNUX1BSSU8sCisJCQkJICAgICAgICZjbG9ja19jYiwgJnBsYXlfZmlsZSwgJnBsYXlfY2xvY2spOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9leGl0OworCisJLyogT3ZlcnJpZGUgc3RyZWFtIGNvZGVjIHBhcmFtIGZvciBlbmNvZGluZyBkaXJlY3Rpb24gKi8KKwljb2RlY19wYXJhbS5lbmNfZm10LmRldC52aWQuc2l6ZSA9IGZpbGVfdmZkLT5zaXplOworCWNvZGVjX3BhcmFtLmVuY19mbXQuZGV0LnZpZC5mcHMgID0gZmlsZV92ZmQtPmZwczsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfcGFyYW1fZGVmYXVsdCgmdnBwKTsKKworICAgICAgICAvKiBTZXQgYXMgYWN0aXZlIGZvciBhbGwgdmlkZW8gZGV2aWNlcyAqLworICAgICAgICB2cHAuYWN0aXZlID0gUEpfVFJVRTsKKworCS8qIENyZWF0ZSB2aWRlbyBkZXZpY2UgcG9ydC4gKi8KKyAgICAgICAgaWYgKGRpciAmIFBKTUVESUFfRElSX0VOQ09ESU5HKSB7CisgICAgICAgICAgICAvKiBDcmVhdGUgY2FwdHVyZSAqLworICAgICAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfZGV2X2RlZmF1bHRfcGFyYW0oCisJCQkJCXBvb2wsCisJCQkJCVBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVYsCisJCQkJCSZ2cHAudmlkcGFyYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICAgICAgZ290byBvbl9leGl0OworCisgICAgICAgICAgICBwam1lZGlhX2Zvcm1hdF9jb3B5KCZ2cHAudmlkcGFyYW0uZm10LCAmY29kZWNfcGFyYW0uZW5jX2ZtdCk7CisJICAgIHZwcC52aWRwYXJhbS5mbXQuaWQgPSBjb2RlY19wYXJhbS5kZWNfZm10LmlkOworICAgICAgICAgICAgdnBwLnZpZHBhcmFtLmRpciA9IFBKTUVESUFfRElSX0NBUFRVUkU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY3JlYXRlKHBvb2wsICZ2cHAsICZjYXB0dXJlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgICAgIGdvdG8gb25fZXhpdDsKKyAgICAgICAgfQorCQorICAgICAgICBpZiAoZGlyICYgUEpNRURJQV9ESVJfREVDT0RJTkcpIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSByZW5kZXJlciAqLworICAgICAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfZGV2X2RlZmF1bHRfcGFyYW0oCisJCQkJCXBvb2wsCisJCQkJCVBKTUVESUFfVklEX0RFRkFVTFRfUkVOREVSX0RFViwKKwkJCQkJJnZwcC52aWRwYXJhbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgICAgICBnb3RvIG9uX2V4aXQ7CisKKyAgICAgICAgICAgIHBqbWVkaWFfZm9ybWF0X2NvcHkoJnZwcC52aWRwYXJhbS5mbXQsICZjb2RlY19wYXJhbS5kZWNfZm10KTsKKyAgICAgICAgICAgIHZwcC52aWRwYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9SRU5ERVI7CisgICAgICAgICAgICB2cHAudmlkcGFyYW0uZGlzcF9zaXplID0gdnBwLnZpZHBhcmFtLmZtdC5kZXQudmlkLnNpemU7CisJICAgIHZwcC52aWRwYXJhbS5mbGFncyB8PSBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9XSU5ET1dfRkxBR1M7CisJICAgIHZwcC52aWRwYXJhbS53aW5kb3dfZmxhZ3MgPSBQSk1FRElBX1ZJRF9ERVZfV05EX0JPUkRFUiB8CisJCQkJCVBKTUVESUFfVklEX0RFVl9XTkRfUkVTSVpBQkxFOworCisgICAgICAgICAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2NyZWF0ZShwb29sLCAmdnBwLCAmcmVuZGVyZXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICAgICAgZ290byBvbl9leGl0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRvIGlnbm9yZSBmbXRwICovCisgICAgY29kZWNfcGFyYW0uaWdub3JlX2ZtdHAgPSBQSl9UUlVFOworCisgICAgLyogQ3JlYXRlIHN0cmVhbSBiYXNlZCBvbiBwcm9ncmFtIGFyZ3VtZW50cyAqLworICAgIHN0YXR1cyA9IGNyZWF0ZV9zdHJlYW0ocG9vbCwgbWVkX2VuZHB0LCBjb2RlY19pbmZvLCAmY29kZWNfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIHJ4X3B0LCB0eF9wdCwgbG9jYWxfcG9ydCwgJnJlbW90ZV9hZGRyLCAKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisJCQkgICB1c2Vfc3J0cCwgJnNydHBfY3J5cHRvX3N1aXRlLCAKKwkJCSAgICZzcnRwX3R4X2tleSwgJnNydHBfcnhfa2V5LAorI2VuZGlmCisJCQkgICAmc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9leGl0OworCisgICAgLyogR2V0IHRoZSBwb3J0IGludGVyZmFjZSBvZiB0aGUgc3RyZWFtICovCisgICAgc3RhdHVzID0gcGptZWRpYV92aWRfc3RyZWFtX2dldF9wb3J0KHN0cmVhbSwgUEpNRURJQV9ESVJfRU5DT0RJTkcsCisJCQkJICAgICAgICAgJmVuY19wb3J0KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyA9PSBQSl9TVUNDRVNTLCAxKTsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3N0cmVhbV9nZXRfcG9ydChzdHJlYW0sIFBKTUVESUFfRElSX0RFQ09ESU5HLAorCQkJCSAgICAgICAgICZkZWNfcG9ydCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXMgPT0gUEpfU1VDQ0VTUywgMSk7CisKKyAgICAvKiBTdGFydCBzdHJlYW1pbmcgKi8KKyAgICBzdGF0dXMgPSBwam1lZGlhX3ZpZF9zdHJlYW1fc3RhcnQoc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIGdvdG8gb25fZXhpdDsKKworICAgIC8qIFN0YXJ0IHJlbmRlcmVyICovCisgICAgaWYgKHJlbmRlcmVyKSB7CisgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChyZW5kZXJlciwgZGVjX3BvcnQsIFBKX0ZBTFNFKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2V4aXQ7CisgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQocmVuZGVyZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgICAgICAgICBnb3RvIG9uX2V4aXQ7CisgICAgfQorCisgICAgLyogU3RhcnQgY2FwdHVyZSAqLworICAgIGlmIChjYXB0dXJlKSB7CisgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChjYXB0dXJlLCBlbmNfcG9ydCwgUEpfRkFMU0UpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXhpdDsKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9zdGFydChjYXB0dXJlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICAgICAgZ290byBvbl9leGl0OworICAgIH0KKworICAgIC8qIFN0YXJ0IHBsYXlpbmcgZmlsZSAqLworICAgIGlmIChwbGF5X2ZpbGUuZmlsZV9uYW1lKSB7CisKKyNpZiBIQVNfTE9DQUxfUkVOREVSRVJfRk9SX1BMQVlfRklMRQorICAgICAgICAvKiBDcmVhdGUgbG9jYWwgcmVuZGVyZXIgKi8KKyAgICAgICAgcGptZWRpYV92aWRfcG9ydF9wYXJhbV9kZWZhdWx0KCZ2cHApOworICAgICAgICB2cHAuYWN0aXZlID0gUEpfRkFMU0U7CisgICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfdmlkX2Rldl9kZWZhdWx0X3BhcmFtKAorCQkJCXBvb2wsCisJCQkJUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWLAorCQkJCSZ2cHAudmlkcGFyYW0pOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXhpdDsKKworICAgICAgICB2cHAudmlkcGFyYW0uZGlyID0gUEpNRURJQV9ESVJfUkVOREVSOworICAgICAgICBwam1lZGlhX2Zvcm1hdF9jb3B5KCZ2cHAudmlkcGFyYW0uZm10LCAmY29kZWNfcGFyYW0uZGVjX2ZtdCk7CisJdnBwLnZpZHBhcmFtLmZtdC5kZXQudmlkLnNpemUgPSBwbGF5X3BvcnQtPmluZm8uZm10LmRldC52aWQuc2l6ZTsKKwl2cHAudmlkcGFyYW0uZm10LmRldC52aWQuZnBzID0gcGxheV9wb3J0LT5pbmZvLmZtdC5kZXQudmlkLmZwczsKKyAgICAgICAgdnBwLnZpZHBhcmFtLmRpc3Bfc2l6ZSA9IHZwcC52aWRwYXJhbS5mbXQuZGV0LnZpZC5zaXplOworCXZwcC52aWRwYXJhbS5mbGFncyB8PSBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9XSU5ET1dfRkxBR1M7CisJdnBwLnZpZHBhcmFtLndpbmRvd19mbGFncyA9IFBKTUVESUFfVklEX0RFVl9XTkRfQk9SREVSIHwKKwkJCQkgICAgUEpNRURJQV9WSURfREVWX1dORF9SRVNJWkFCTEU7CisKKwlzdGF0dXMgPSBwam1lZGlhX3ZpZF9wb3J0X2NyZWF0ZShwb29sLCAmdnBwLCAmcmVuZGVyZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXhpdDsKKyAgICAgICAgc3RhdHVzID0gcGptZWRpYV92aWRfcG9ydF9zdGFydChyZW5kZXJlcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gb25fZXhpdDsKKyNlbmRpZgorCisJLyogSW5pdCBwbGF5IGZpbGUgZGF0YSAqLworCXBsYXlfZmlsZS5wbGF5X3BvcnQgPSBwbGF5X3BvcnQ7CisJcGxheV9maWxlLnN0cmVhbV9wb3J0ID0gZW5jX3BvcnQ7CisJcGxheV9maWxlLmRlY29kZXIgPSBwbGF5X2RlY29kZXI7CisJaWYgKHJlbmRlcmVyKSB7CisJICAgIHBsYXlfZmlsZS5yZW5kZXJlciA9IHBqbWVkaWFfdmlkX3BvcnRfZ2V0X3Bhc3NpdmVfcG9ydChyZW5kZXJlcik7CisJfQorCisJc3RhdHVzID0gcGptZWRpYV9jbG9ja19zdGFydChwbGF5X2Nsb2NrKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGdvdG8gb25fZXhpdDsKKyAgICB9CisKKyAgICAvKiBEb25lICovCisKKyAgICBpZiAoZGlyID09IFBKTUVESUFfRElSX0RFQ09ESU5HKQorCXByaW50ZigiU3RyZWFtIGlzIGFjdGl2ZSwgZGlyIGlzIHJlY3Ytb25seSwgbG9jYWwgcG9ydCBpcyAlZFxuIiwKKwkgICAgICAgbG9jYWxfcG9ydCk7CisgICAgZWxzZSBpZiAoZGlyID09IFBKTUVESUFfRElSX0VOQ09ESU5HKQorCXByaW50ZigiU3RyZWFtIGlzIGFjdGl2ZSwgZGlyIGlzIHNlbmQtb25seSwgc2VuZGluZyB0byAlczolZFxuIiwKKwkgICAgICAgcGpfaW5ldF9udG9hKHJlbW90ZV9hZGRyLnNpbl9hZGRyKSwKKwkgICAgICAgcGpfbnRvaHMocmVtb3RlX2FkZHIuc2luX3BvcnQpKTsKKyAgICBlbHNlCisJcHJpbnRmKCJTdHJlYW0gaXMgYWN0aXZlLCBzZW5kL3JlY3YsIGxvY2FsIHBvcnQgaXMgJWQsICIKKwkgICAgICAgInNlbmRpbmcgdG8gJXM6JWRcbiIsCisJICAgICAgIGxvY2FsX3BvcnQsCisJICAgICAgIHBqX2luZXRfbnRvYShyZW1vdGVfYWRkci5zaW5fYWRkciksCisJICAgICAgIHBqX250b2hzKHJlbW90ZV9hZGRyLnNpbl9wb3J0KSk7CisKKyAgICBpZiAoZGlyICYgUEpNRURJQV9ESVJfRU5DT0RJTkcpCisJUEpfTE9HKDIsIChUSElTX0ZJTEUsICJTZW5kaW5nICVkeCVkICUuKnMgQCUuMmZmcHMiLAorCQkgICBjb2RlY19wYXJhbS5lbmNfZm10LmRldC52aWQuc2l6ZS53LAorCQkgICBjb2RlY19wYXJhbS5lbmNfZm10LmRldC52aWQuc2l6ZS5oLAorCQkgICBjb2RlY19pbmZvLT5lbmNvZGluZ19uYW1lLnNsZW4sCisJCSAgIGNvZGVjX2luZm8tPmVuY29kaW5nX25hbWUucHRyLAorCQkgICAoMS4wKmNvZGVjX3BhcmFtLmVuY19mbXQuZGV0LnZpZC5mcHMubnVtLworCQkgICAgY29kZWNfcGFyYW0uZW5jX2ZtdC5kZXQudmlkLmZwcy5kZW51bSkpKTsKKworICAgIGZvciAoOzspIHsKKwljaGFyIHRtcFsxMF07CisKKwlwdXRzKCIiKTsKKwlwdXRzKCJDb21tYW5kczoiKTsKKwlwdXRzKCIgIHEgICAgIFF1aXQiKTsKKwlwdXRzKCIiKTsKKworCXByaW50ZigiQ29tbWFuZDogIik7IGZmbHVzaChzdGRvdXQpOworCisJaWYgKGZnZXRzKHRtcCwgc2l6ZW9mKHRtcCksIHN0ZGluKSA9PSBOVUxMKSB7CisJICAgIHB1dHMoIkVPRiB3aGlsZSByZWFkaW5nIHN0ZGluLCB3aWxsIHF1aXQgbm93Li4iKTsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKHRtcFswXSA9PSAncScpCisJICAgIGJyZWFrOworCisgICAgfQorCisKKworICAgIC8qIFN0YXJ0IGRlaW5pdGlhbGl6YXRpb246ICovCitvbl9leGl0OgorCisgICAgLyogU3RvcCB2aWRlbyBkZXZpY2VzICovCisgICAgaWYgKGNhcHR1cmUpCisgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc3RvcChjYXB0dXJlKTsKKyAgICBpZiAocmVuZGVyZXIpCisgICAgICAgIHBqbWVkaWFfdmlkX3BvcnRfc3RvcChyZW5kZXJlcik7CisKKyAgICAvKiBTdG9wIGFuZCBkZXN0cm95IGZpbGUgY2xvY2sgKi8KKyAgICBpZiAocGxheV9jbG9jaykgeworCXBqbWVkaWFfY2xvY2tfc3RvcChwbGF5X2Nsb2NrKTsKKwlwam1lZGlhX2Nsb2NrX2Rlc3Ryb3kocGxheV9jbG9jayk7CisgICAgfQorCisgICAgLyogRGVzdHJveSBmaWxlIHJlYWRlci9wbGF5ZXIgKi8KKyAgICBpZiAocGxheV9wb3J0KQorCXBqbWVkaWFfcG9ydF9kZXN0cm95KHBsYXlfcG9ydCk7CisKKyAgICAvKiBEZXN0cm95IGZpbGUgZGVjb2RlciAqLworICAgIGlmIChwbGF5X2RlY29kZXIpIHsKKwlwbGF5X2RlY29kZXItPm9wLT5jbG9zZShwbGF5X2RlY29kZXIpOworCXBqbWVkaWFfdmlkX2NvZGVjX21ncl9kZWFsbG9jX2NvZGVjKE5VTEwsIHBsYXlfZGVjb2Rlcik7CisgICAgfQorCisgICAgLyogRGVzdHJveSB2aWRlbyBkZXZpY2VzICovCisgICAgaWYgKGNhcHR1cmUpCisJcGptZWRpYV92aWRfcG9ydF9kZXN0cm95KGNhcHR1cmUpOworICAgIGlmIChyZW5kZXJlcikKKwlwam1lZGlhX3ZpZF9wb3J0X2Rlc3Ryb3kocmVuZGVyZXIpOworCisgICAgLyogRGVzdHJveSBzdHJlYW0gKi8KKyAgICBpZiAoc3RyZWFtKSB7CisJcGptZWRpYV90cmFuc3BvcnQgKnRwOworCisJdHAgPSBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X3RyYW5zcG9ydChzdHJlYW0pOworCXBqbWVkaWFfdmlkX3N0cmVhbV9kZXN0cm95KHN0cmVhbSk7CisJCisJcGptZWRpYV90cmFuc3BvcnRfY2xvc2UodHApOworICAgIH0KKworICAgIC8qIERlaW5pdCBjb2RlY3MgKi8KKyAgICBkZWluaXRfY29kZWNzKCk7CisKKyAgICAvKiBTaHV0ZG93biB2aWRlbyBzdWJzeXN0ZW0gKi8KKyAgICBwam1lZGlhX3ZpZF9kZXZfc3Vic3lzX3NodXRkb3duKCk7CisKKyAgICAvKiBEZXN0cm95IGV2ZW50IG1hbmFnZXIgKi8KKyAgICBwam1lZGlhX2V2ZW50X21ncl9kZXN0cm95KE5VTEwpOworCisgICAgLyogUmVsZWFzZSBhcHBsaWNhdGlvbiBwb29sICovCisgICAgcGpfcG9vbF9yZWxlYXNlKCBwb29sICk7CisKKyAgICAvKiBEZXN0cm95IG1lZGlhIGVuZHBvaW50LiAqLworICAgIHBqbWVkaWFfZW5kcHRfZGVzdHJveSggbWVkX2VuZHB0ICk7CisKKyAgICAvKiBEZXN0cm95IHBvb2wgZmFjdG9yeSAqLworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCAmY3AgKTsKKworICAgIC8qIFNodXRkb3duIFBKTElCICovCisgICAgcGpfc2h1dGRvd24oKTsKKworICAgIHJldHVybiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpID8gMCA6IDE7Cit9CisKKworI2Vsc2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFyZ2MpOworICAgIFBKX1VOVVNFRF9BUkcoYXJndik7CisgICAgcHV0cygiRXJyb3I6IHRoaXMgc2FtcGxlIHJlcXVpcmVzIHZpZGVvIGNhcGFiaWxpdHkgKFBKTUVESUFfSEFTX1ZJREVPID09IDEpIik7CisgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogUEpNRURJQV9IQVNfVklERU8gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvTWFrZWZpbGUgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNWUwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL01ha2VmaWxlCkBAIC0wLDAgKzEsMzIgQEAKK2luY2x1ZGUgLi4vLi4vLi4vYnVpbGQubWFrCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgYW5kcm9pZCwkKFRBUkdFVF9OQU1FKSksKQorICAjIG5vIHB5dGhvbiBmb3IgYW5kcm9pZAorICBESVJTID0gamF2YQorZWxzZQorICBESVJTID0gcHl0aG9uIGphdmEKK2VuZGlmCisKK2V4cG9ydCBTV0lHX0ZMQUdTPS1JLi4vLi4vLi4vLi4vcGpsaWIvaW5jbHVkZSBcCisJCSAgIC1JLi4vLi4vLi4vLi4vcGpsaWItdXRpbC9pbmNsdWRlIFwKKwkJICAgLUkuLi8uLi8uLi8uLi9wam1lZGlhL2luY2x1ZGUgXAorCQkgICAtSS4uLy4uLy4uLy4uL3Bqc2lwL2luY2x1ZGUgXAorCQkgICAtSS4uLy4uLy4uLy4uL3BqbmF0aC9pbmNsdWRlIC1jKysgCitleHBvcnQgU1JDX0RJUj0uLi8uLi8uLi8uLi9wanNpcC9pbmNsdWRlCitleHBvcnQgU1JDUz0kKFNSQ19ESVIpL3Bqc3VhMi9lbmRwb2ludC5ocHAgJChTUkNfRElSKS9wanN1YTIvdHlwZXMuaHBwCisKKy5QSE9OWTogYWxsIGNsZWFuIGRlcCBkZXBlbmQgZGlzdGNsZWFuIHByaW50IHJlYWxjbGVhbiBpbnN0YWxsIHVuaW5zdGFsbAorCithbGw6IHN5bWJvbHMuaQorCithbGwgY2xlYW4gZGVwIGRlcGVuZCBkaXN0Y2xlYW4gcHJpbnQgcmVhbGNsZWFuIGluc3RhbGwgdW5pbnN0YWxsOgorCWZvciBkaXIgaW4gJChESVJTKTsgZG8gXAorCQlpZiAkKE1BS0UpICQoTUFLRV9GTEFHUykgLUMgJCRkaXIgJEA7IHRoZW4gXAorCQkgICAgdHJ1ZTsgXAorCQllbHNlIFwKKwkJICAgIGV4aXQgMTsgXAorCQlmaTsgXAorCWRvbmUKKworc3ltYm9scy5pOiBzeW1ib2xzLmxzdAorCXB5dGhvbiBpbXBvcnRzeW0ucHkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvaW1wb3J0c3ltLnB5IGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9pbXBvcnRzeW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzNzdkOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvaW1wb3J0c3ltLnB5CkBAIC0wLDAgKzEsMTkzIEBACisjICRJZDogaW1wb3J0c3ltLnB5IDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkCisjCisjIGltcG9ydHN5bS5weTogSW1wb3J0IEMgc3ltYm9sIGRlY2xzIChzdHJ1Y3RzLCBlbnVtcywgZXRjKSBhbmQgd3JpdGUgdGhlbQorIyAgICAgICAgICAgICAgIHRvIGFub3RoZXIgZmlsZSAKKyMKKyMgQ29weXJpZ2h0IChDKTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisjCitpbXBvcnQgcHljcGFyc2VyCitmcm9tIHB5Y3BhcnNlciBpbXBvcnQgY19nZW5lcmF0b3IKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCitkZWYgd2hpY2gocHJvZ3JhbSk6CisJaW1wb3J0IG9zCisJZGVmIGlzX2V4ZShmcGF0aCk6CisJCXJldHVybiBvcy5wYXRoLmlzZmlsZShmcGF0aCkgYW5kIG9zLmFjY2VzcyhmcGF0aCwgb3MuWF9PSykKKwkKKwlpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgbm90IHByb2dyYW0uZW5kc3dpdGgoIi5leGUiKToKKwkJcHJvZ3JhbSArPSAiLmV4ZSIKKworCWZwYXRoLCBmbmFtZSA9IG9zLnBhdGguc3BsaXQocHJvZ3JhbSkKKwlpZiBmcGF0aDoKKwkJaWYgaXNfZXhlKHByb2dyYW0pOgorCQkJcmV0dXJuIHByb2dyYW0KKwllbHNlOgorCQlmb3IgcGF0aCBpbiBvcy5lbnZpcm9uWyJQQVRIIl0uc3BsaXQob3MucGF0aHNlcCk6CisJCQlwYXRoID0gcGF0aC5zdHJpcCgnIicpCisJCQlleGVfZmlsZSA9IG9zLnBhdGguam9pbihwYXRoLCBwcm9ncmFtKQorCQkJaWYgaXNfZXhlKGV4ZV9maWxlKToKKwkJCQlyZXR1cm4gZXhlX2ZpbGUKKwlyZXR1cm4gTm9uZQorCisjCitQSl9ST09UX1BBVEggPSAiLi4vLi4vLi4vIgorICAgCisjIENQUCBpcyBuZWVkZWQgYnkgcHljcGFyc2VyLgorQ1BQX1BBVEggPSB3aGljaCgiY3BwIikKK2lmIG5vdCBDUFBfUEFUSDoKKwlwcmludCAnRXJyb3I6IG5lZWQgdG8gaGF2ZSBjcHAgaW4gUEFUSCcKKwlzeXMuZXhpdCgxKQorCisjIEhhcmRjb2RlZCEKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorCVBZQ1BBUlNFUl9ESVI9IkM6L2RldnMvdG9vbHMvcHljcGFyc2VyIgorZWxpZiBzeXMucGxhdGZvcm0gPT0gImxpbnV4MiI6CisJUFlDUEFSU0VSX0RJUj0iL2hvbWUvYmVubnlscC9EZXNrdG9wL29wdC9zcmMvcHljcGFyc2VyLW1hc3RlciIKK2Vsc2U6CisJUFlDUEFSU0VSX0RJUj0iL0xpYnJhcnkvUHl0aG9uLzIuNy9zaXRlLXBhY2thZ2VzL3B5Y3BhcnNlciIKKworaWYgbm90IG9zLnBhdGguZXhpc3RzKFBZQ1BBUlNFUl9ESVIgKyAnL3V0aWxzL2Zha2VfbGliY19pbmNsdWRlJyk6CisJcHJpbnQgIkVycm9yOiBjb3VsZG4ndCBmaW5kIHB5Y3BhcnNlciB1dGlscyBpbiAnJXMnIiAlIFBZUEFSU0VSX0RJUiAKKwlzeXMuZXhpdCgxKQorCisjIEhlYWRpbmcsIHRvIGJlIHBsYWNlZCBiZWZvcmUgdGhlIHNvdXJjZSBmaWxlcworQ19IRUFESU5HX1NFQ1RJT04gPSAiIiIKKyNkZWZpbmUgUEpfQVVUT0NPTkYJCTEKKyNkZWZpbmUgam1wX2J1ZgkJCWludAorI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisiIiIKKworIyBDUFAgKEMgcHJlcHJvY2Vzc29yKSBzZXR0aW5ncworQ1BQX0NGTEFHUyAgID0gWworCSctSScgKyBQWUNQQVJTRVJfRElSICsgJy91dGlscy9mYWtlX2xpYmNfaW5jbHVkZScsCisJIi1JIiArIFBKX1JPT1RfUEFUSCArICJwamxpYi9pbmNsdWRlIiwKKwkiLUkiICsgUEpfUk9PVF9QQVRIICsgInBqbGliLXV0aWwvaW5jbHVkZSIsCisJIi1JIiArIFBKX1JPT1RfUEFUSCArICJwam5hdGgvaW5jbHVkZSIsCisJIi1JIiArIFBKX1JPT1RfUEFUSCArICJwam1lZGlhL2luY2x1ZGUiLAorCSItSSIgKyBQSl9ST09UX1BBVEggKyAicGpzaXAvaW5jbHVkZSIKKwldCisKKworY2xhc3MgU3ltYm9sVmlzaXRvcihweWNwYXJzZXIuY19hc3QuTm9kZVZpc2l0b3IpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lcyk6CisJCXNlbGYubm9kZURpY3QgPSB7fQorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXNlbGYubm9kZURpY3RbbmFtZV0gPSBOb25lCisJCQorCWRlZiBfYWRkKHNlbGYsIG5vZGUpOgorCQlpZiBzZWxmLm5vZGVEaWN0Lmhhc19rZXkobm9kZS5uYW1lKToKKwkJCXNlbGYubm9kZURpY3Rbbm9kZS5uYW1lXSA9IG5vZGUKKwkJCisJZGVmIHZpc2l0X1N0cnVjdChzZWxmLCBub2RlKToKKwkJc2VsZi5fYWRkKG5vZGUpCisJCQorCWRlZiB2aXNpdF9FbnVtKHNlbGYsIG5vZGUpOgorCQlzZWxmLl9hZGQobm9kZSkKKworCWRlZiB2aXNpdF9UeXBlbmFtZShzZWxmLCBub2RlKToKKwkJc2VsZi5fYWRkKG5vZGUpCisJCQorCWRlZiB2aXNpdF9UeXBlZGVmKHNlbGYsIG5vZGUpOgorCQlzZWxmLl9hZGQobm9kZSkKKworCQkKK1RFTVBfRklMRT0idG1wc3JjLmgiCisJCQorY2xhc3MgU3ltYm9sSW1wb3J0ZXI6CisJIiIiCisJSW1wb3J0IEMgc2VsZWN0ZWQgZGVjbGFyYXRpb25zIGZyb20gQyBzb3VyY2UgZmlsZSBhbmQgbW92ZSBpdAorCXRvIGFub3RoZXIgZmlsZS4KKwkKKwlQYXJhbWV0ZXJzOgorCSAtIGxpc3RmaWxlCVBhdGggb2YgZmlsZSBjb250YWluaW5nIGxpc3Qgb2YgQyBzb3VyY2UgZmlsZQorCSAgICAgICAgICAgICAgICBhbmQgaWRlbnRpZmllciBuYW1lcyB0byBiZSBpbXBvcnRlZC4gVGhlIGZvcm1hdAorCSAgICAgICAgICAgICAgICBvZiB0aGUgbGlzdGZpbGUgaXM6CisJICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICBmaWxlbmFtZSAgICAgICAgbmFtZTEgIG5hbWUyICBuYW1lMworCSAgICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGU6CisJICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICBwai9zb2NrX3Fvcy5oCXBqX3Fvc190eXBlICBwal9xb3NfZmxhZworCSAgICAgICAgICAgICAgICBwai90eXBlcy5oCXBqX3N0YXR1c190ICBQSl9TVUNDRVNTCisJIiIiCisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlwYXNzCisJCisJZGVmIHByb2Nlc3Moc2VsZiwgbGlzdGZpbGUsIG91dGZpbGUpOgorCQkKKwkJIyBSZWFkIGxpc3RmaWxlCisJCWYgPSBvcGVuKGxpc3RmaWxlKQorCQlsaW5lcyA9IGYucmVhZGxpbmVzKCkKKwkJZi5jbG9zZSgpCisJCQorCQkjIFByb2Nlc3MgZWFjaCBsaW5lIGluIGxpc3QgZmlsZSwgd2hpbGUgZ2VuZXJhdGluZyB0aGUKKwkJIyB0ZW1wb3JhcnkgQyBmaWxlIHRvIGJlIHByb2Nlc3NlZCBieSBweWNwYXJzZXIKKwkJZiA9IG9wZW4oVEVNUF9GSUxFLCAidyIpCisJCWYud3JpdGUoQ19IRUFESU5HX1NFQ1RJT04pCisJCW5hbWVzID0gW10KKwkJZmNudCA9IDAKKwkJZm9yIGxpbmUgaW4gbGluZXM6CisJCQlzcGVjID0gbGluZS5zcGxpdCgpCisJCQlpZiBsZW4oc3BlYykgPCAyOgorCQkJCWNvbnRpbnVlCisJCQlmY250ICs9IDEKKwkJCWYud3JpdGUoIiNpbmNsdWRlIDwlcz5cbiIgJSBzcGVjWzBdKQorCQkJbmFtZXMuZXh0ZW5kKHNwZWNbMTpdKQorCQlmLmNsb3NlKCkKKwkJcHJpbnQgJ1BhcnNpbmcgJWQgc3ltYm9scyBmcm9tICVkIGZpbGVzLi4nICUgKGxlbihuYW1lcyksIGZjbnQpCisJCQorCQkjIFBhcnNlIHRoZSB0ZW1wb3JhcnkgQyBmaWxlCisJCWFzdCA9IHB5Y3BhcnNlci5wYXJzZV9maWxlKFRFTVBfRklMRSwgdXNlX2NwcD1UcnVlLCBjcHBfcGF0aD1DUFBfUEFUSCwgY3BwX2FyZ3M9Q1BQX0NGTEFHUykKKwkJb3MucmVtb3ZlKFRFTVBfRklMRSkKKwkJCisJCSMgRmlsdGVyIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB3ZSB3YW50ZWQKKwkJcHJpbnQgJ0ZpbHRlcmluZy4uJworCQl2aXNpdG9yID0gU3ltYm9sVmlzaXRvcihuYW1lcykKKwkJdmlzaXRvci52aXNpdChhc3QpCisJCisJCSMgUHJpbnQgc3ltYm9sIGRlY2xhcmF0aW9ucyB0byBvdXRmaWxlCisJCXByaW50ICdXcml0aW5nIGRlY2xhcmF0aW9ucy4uJworCQlmID0gb3BlbihvdXRmaWxlLCAndycpCisJCWYud3JpdGUoIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGltcG9ydHN5bSBzY3JpcHQsIGRvIG5vdCBtb2RpZnkhXG5cbiIpCisJCWdlbiA9IHB5Y3BhcnNlci5jX2dlbmVyYXRvci5DR2VuZXJhdG9yKCkKKwkJZm9yIG5hbWUgaW4gbmFtZXM6CisJCQlub2RlID0gdmlzaXRvci5ub2RlRGljdFtuYW1lXQorCQkJaWYgbm90IG5vZGU6CisJCQkJcHJpbnQgIiAgKiogV2FybmluZzogZGVjbGFyYXRpb24gZm9yICclcycgaXMgbm90IGZvdW5kICoqIiAlIGsKKwkJCWVsc2U6CisJCQkJcHJpbnQgIiAgd3JpdGluZyAnJXMnLi4iICUgbmFtZQorCQkJCW91dHB1dCA9IGdlbi52aXNpdChub2RlKSArICI7XG5cbiIKKwkJCQlmLndyaXRlKG91dHB1dCkKKwkJZi5jbG9zZSgpCisJCXByaW50ICJEb25lLiIKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCXByaW50ICJJbXBvcnRpbmcgc3ltYm9sczogJ3N5bWJvbHMubHN0JyAtLT4gJ3N5bWJvbHMuaSciCisJc2kgPSBTeW1ib2xJbXBvcnRlcigpCisJc2kucHJvY2Vzcygic3ltYm9scy5sc3QiLCAic3ltYm9scy5pIikKKwl0cnk6CisJCW9zLnJlbW92ZSgibGV4dGFiLnB5IikKKwlleGNlcHQgT1NFcnJvcjoKKwkJcGFzcworCXRyeToKKwkJb3MucmVtb3ZlKCJ5YWNjdGFiLnB5IikKKwlleGNlcHQgT1NFcnJvcjoKKwkJcGFzcworCQorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9NYWtlZmlsZSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQ2ODkxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTI0IEBACitpbmNsdWRlIC4uLy4uLy4uLy4uL2J1aWxkLm1haworCitpZm5lcSAoJChmaW5kc3RyaW5nIGFuZHJvaWQsJChUQVJHRVRfTkFNRSkpLCkKKyBPUz1hbmRyb2lkCitlbHNlCisgaWZuZXEgKCQoZmluZHN0cmluZyBkYXJ3aW4sJChUQVJHRVRfTkFNRSkpLCkKKyAgT1M9ZGFyd2luCisgZW5kaWYKK2VuZGlmCisKK09VVF9ESVI9b3V0cHV0CitpZmVxICgkKE9TKSxXaW5kb3dzX05UKQorICBMSUJQSlNVQTJfU089JChPVVRfRElSKS9wanN1YTIuZGxsCitlbHNlCisgIGlmZXEgKCQoT1MpLGRhcndpbikKKyAgICBMSUJQSlNVQTJfU089JChPVVRfRElSKS9saWJwanN1YTIuam5pbGliCisgIGVsc2UKKyAgICBpZmVxICgkKE9TKSxhbmRyb2lkKQorICAgICAgTElCUEpTVUEyX1NPPWFuZHJvaWQvbGlicy9hcm1lYWJpL2xpYnBqc3VhMi5zbworICAgIGVsc2UKKyAgICAgIExJQlBKU1VBMl9TTz0kKE9VVF9ESVIpL2xpYnBqc3VhMi5zbworICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCisjIEdldCBKREsgbG9jYXRpb24KK2lmZXEgKCIkKEpBVkFfSE9NRSkiLCIiKQorICAjIEdldCBqYXZhYyBsb2NhdGlvbiB0byBkZXRlcm1pbmUgSkRLIGxvY2F0aW9uCisgIEpBVkFDX1BBVEggPSAkKHNoZWxsIHdoaWNoIGphdmFjKQorICBpZmVxICgiJChKQVZBQ19QQVRIKSIsIiIpCisgICAgJChlcnJvciBDYW5ub3QgZGV0ZXJtaW5lIEpESyBsb2NhdGlvbiB1c2luZyAnd2hpY2gnIGNvbW1hbmQuIFBsZWFzZSBkZWZpbmUgSkFWQV9IT01FIGVudnZhcikKKyAgZW5kaWYKKworICBKQVZBQ19QQVRIIDo9ICQocmVhbHBhdGggJChKQVZBQ19QQVRIKSkKKyAgSkFWQV9CSU4gOj0gJChkaXIgJChKQVZBQ19QQVRIKSkKKyAgSkFWQV9IT01FIDo9ICQocGF0c3Vic3QgJS9iaW4vLCUsJChKQVZBX0JJTikpCitlbHNlCisgIGlmZXEgKGV4aXN0cywgJChzaGVsbCB0ZXN0IC1kICQoSkFWQV9IT01FKS9iaW4gJiYgZWNobyBleGlzdHMgKSkKKyAgICBKQVZBX0JJTiA6PSAkKEpBVkFfSE9NRSkvYmluCisgIGVsc2UKKyAgICBKQVZBX0JJTiA6PSAkKEpBVkFfSE9NRSkKKyAgZW5kaWYKK2VuZGlmCisKKyMgT1Mgc3BlY2lmaWMKK2lmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCisgIE1ZX0pOSV9MREZMQUdTCT0gLUwkKE1ZX0pESykvbGliIC1XbCwtLWtpbGwtYXQKK2Vsc2UKKyAgTVlfSk5JX0NGTEFHUwkgCT0gLWZQSUMKKyAgTVlfSk5JX0xERkxBR1MJPSAtTCQoTVlfSkRLKS9saWIKKyAgaWZlcSAoJChPUyksZGFyd2luKQorICAgIE1ZX0pOSV9MREZMQUdTIAk6PSAkKE1ZX0pOSV9MREZMQUdTKSAtV2wsLXNvbmFtZSxwanN1YTIuc28KKyAgZW5kaWYKKyAgaWZlcSAoJChPUyksYW5kcm9pZCkKKyAgICBNWV9KTklfQ0ZMQUdTCTo9ICQoTVlfSk5JX0NGTEFHUykgLURfX0FORFJPSURfXworICBlbmRpZgorZW5kaWYKKworIyBFbnYgc2V0dGluZ3MsIGUuZzogcGF0aCB0byBTV0lHLCBKREssIGphdmEoLmV4ZSksIGphdmFjKC5leGUpCitNWV9TV0lHCQkgPSBzd2lnCitNWV9KREsJCSA9ICQoSkFWQV9IT01FKQoraWZuZXEgKCQoZmluZHN0cmluZyBiaW4sJChKQVZBX0JJTikpLCkKKyAgTVlfSkFWQQkgPSAkKE1ZX0pESykvYmluL2phdmEKKyAgTVlfSkFWQUMJID0gJChNWV9KREspL2Jpbi9qYXZhYworZWxzZQorICBNWV9KQVZBCSA9ICQoTVlfSkRLKS9qYXZhCisgIE1ZX0pBVkFDCSA9ICQoTVlfSkRLKS9qYXZhYworZW5kaWYKK01ZX0pOSV9DRkxBR1MJIDo9ICQoTVlfSk5JX0NGTEFHUykgLUkkKE1ZX0pESykvaW5jbHVkZSAtSSQoTVlfSkRLKS9pbmNsdWRlL3dpbjMyIFwKKwkJICAgIC1JJChNWV9KREspL2luY2x1ZGUvbGludXggLUkuCisKKyMgQnVpbGQgc2V0dGluZ3MKK01ZX0NGTEFHUwkgPSAkKFBKX0NGTEFHUykgJChNWV9KTklfQ0ZMQUdTKQorTVlfTERGTEFHUwkgPSAkKFBKX0xERkxBR1MpIC1scGpzdWEyLSQoVEFSR0VUX05BTUUpICQoUEpfTERMSUJTKSAkKE1ZX0pOSV9MREZMQUdTKQorTVlfUEFDS0FHRV9OQU1FCSA9IG9yZy5wanNpcC5wanN1YTIKK2lmZXEgKCQoT1MpLGFuZHJvaWQpCisgIE1ZX1BBQ0tBR0VfUEFUSCAgPSBhbmRyb2lkL3NyYy8kKHN1YnN0IC4sLywkKE1ZX1BBQ0tBR0VfTkFNRSkpCitlbHNlCisgIE1ZX1BBQ0tBR0VfUEFUSCAgPSAkKE9VVF9ESVIpLyQoc3Vic3QgLiwvLCQoTVlfUEFDS0FHRV9OQU1FKSkKK2VuZGlmCisKK01ZX0FQUF9KQVZBID0gYW5kcm9pZC9zcmMvJChzdWJzdCAuLC8sJChNWV9QQUNLQUdFX05BTUUpKS9hcHAvTXlBcHAuamF2YQorCisuUEhPTlk6IGFsbCBqYXZhIGluc3RhbGwgdW5pbnN0YWxsCisKK2FsbDogJChMSUJQSlNVQTJfU08pIGphdmEKKworJChMSUJQSlNVQTJfU08pOiAkKE9VVF9ESVIpL3Bqc3VhMl93cmFwLm8KKwkkKFBKX0NYWCkgLXNoYXJlZCAtbyAkKExJQlBKU1VBMl9TTykgJChPVVRfRElSKS9wanN1YTJfd3JhcC5vICQoTVlfQ0ZMQUdTKSAkKE1ZX0xERkxBR1MpCisKKyQoT1VUX0RJUikvcGpzdWEyX3dyYXAubzogJChPVVRfRElSKS9wanN1YTJfd3JhcC5jcHAgTWFrZWZpbGUKKwkkKFBKX0NYWCkgLWMgJChPVVRfRElSKS9wanN1YTJfd3JhcC5jcHAgLW8gJChPVVRfRElSKS9wanN1YTJfd3JhcC5vICQoTVlfQ0ZMQUdTKSAkKE1ZX0xERkxBR1MpCisKKyQoT1VUX0RJUikvcGpzdWEyX3dyYXAuY3BwOiAuLi9wanN1YTIuaSAuLi9zeW1ib2xzLmkgJChTUkNTKQorCW1rZGlyIC1wICQoTVlfUEFDS0FHRV9QQVRIKQorCXN3aWcgJChTV0lHX0ZMQUdTKSAtamF2YSAgLXBhY2thZ2UgJChNWV9QQUNLQUdFX05BTUUpIC1vdXRkaXIgJChNWV9QQUNLQUdFX1BBVEgpIC1vICQoT1VUX0RJUikvcGpzdWEyX3dyYXAuY3BwIC4uL3Bqc3VhMi5pCisKK2NsZWFuIGRpc3RjbGVhbiByZWFsY2xlYW46CisJcm0gLXJmICQoTElCUEpTVUEyX1NPKSAkKE9VVF9ESVIpLyogJChNWV9QQUNLQUdFX1BBVEgpLyouamF2YSAkKE1ZX1BBQ0tBR0VfUEFUSCkvKi5jbGFzcworCitqYXZhOiAkKE1ZX1BBQ0tBR0VfUEFUSCkvRXJyb3IuY2xhc3MgJChNWV9QQUNLQUdFX1BBVEgpL3Rlc3QuY2xhc3MgJChNWV9QQUNLQUdFX1BBVEgpL3NhbXBsZS5jbGFzcworCiskKE1ZX1BBQ0tBR0VfUEFUSCkvRXJyb3IuY2xhc3M6ICQoTVlfUEFDS0FHRV9QQVRIKS9FcnJvci5qYXZhCisJJChNWV9KQVZBQykgLWQgJChPVVRfRElSKSAkKE1ZX1BBQ0tBR0VfUEFUSCkvKi5qYXZhICQoTVlfQVBQX0pBVkEpCisKKyQoTVlfUEFDS0FHRV9QQVRIKS90ZXN0LmNsYXNzOiB0ZXN0LmphdmEKKwkkKE1ZX0pBVkFDKSAtZCAkKE9VVF9ESVIpIC1jbGFzc3BhdGggIiQoT1VUX0RJUikiIHRlc3QuamF2YQorCQorJChNWV9QQUNLQUdFX1BBVEgpL3NhbXBsZS5jbGFzczogc2FtcGxlLmphdmEKKwkkKE1ZX0pBVkFDKSAtZCAkKE9VVF9ESVIpIC1jbGFzc3BhdGggIiQoT1VUX0RJUikiIHNhbXBsZS5qYXZhCisKK3Rlc3Q6CisJQCMgTmVlZCB0byBzcGVjaWZ5IGNsYXNzcGF0aCBhbmQgbGlicmFyeSBwYXRoLCBhbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBiZSBzZXQgdmlhCisJQCMgQ0xBU1NQQVRIIGFuZCBqYXZhLmxpYnJhcnkucGF0aCBlbnYgc2V0dGluZ3MKKwkkKE1ZX0pBVkEpIC1jcCAiJChPVVRfRElSKSIgLURqYXZhLmxpYnJhcnkucGF0aD0iJChPVVRfRElSKSIgdGVzdAorCQorc2FtcGxlOgorCUAjIE5lZWQgdG8gc3BlY2lmeSBjbGFzc3BhdGggYW5kIGxpYnJhcnkgcGF0aCwgYWx0ZXJuYXRpdmVseSwgdGhleSBjYW4gYmUgc2V0IHZpYQorCUAjIENMQVNTUEFUSCBhbmQgamF2YS5saWJyYXJ5LnBhdGggZW52IHNldHRpbmdzCisJJChNWV9KQVZBKSAtY3AgIiQoT1VUX0RJUikiIC1EamF2YS5saWJyYXJ5LnBhdGg9IiQoT1VUX0RJUikiIG9yZy5wanNpcC5wanN1YTIuYXBwLnNhbXBsZQkKKworaW5zdGFsbDoKK3VuaW5zdGFsbDoKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWI0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw0IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS42DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5YjBhZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0ib3JnLnBqc2lwLnBqc3VhMi5hcHAiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KKworICAgIDx1c2VzLXNkaworICAgICAgICBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIgorICAgICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjE1IiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRVRUSU5HUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfV0lGSV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVklCUkFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfTE9HUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbGF1bmNoZXIiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9BcHBUaGVtZSIgPgorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0ib3JnLnBqc2lwLnBqc3VhMi5hcHAuTWFpbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorCisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJvcmcucGpzaXAucGpzdWEyLmFwcC5DYWxsQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3RpdGxlX2FjdGl2aXR5X2NhbGwiID4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvaWNfbGF1bmNoZXItd2ViLnBuZyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL2ljX2xhdW5jaGVyLXdlYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4Y2JiNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL2ljX2xhdW5jaGVyLXdlYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvam5pL0FuZHJvaWQubWsgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkxMmJhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMiBAQAoraW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9idWlsZC5tYWsKKworTE9DQUxfUEFUSAk6PSAkKFBKRElSKS9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICA6PSBsaWJwanN1YTIKK0xPQ0FMX0NGTEFHUyAgICA6PSAkKEFQUF9DRkxBR1MpIC1mcnR0aSAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0xERkxBR1MgICA6PSAkKEFQUF9MREZMQUdTKQorTE9DQUxfTERMSUJTICAgIDo9ICQoQVBQX0xETElCUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAuLi9vdXRwdXQvcGpzdWEyX3dyYXAuY3BwCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5tayBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL2puaS9BcHBsaWNhdGlvbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzEyNGRkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvam5pL0FwcGxpY2F0aW9uLm1rCkBAIC0wLDAgKzEgQEAKK0FQUF9TVEwgOj0gZ251c3RsX3N0YXRpYwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcHJvZ3VhcmQtcHJvamVjdC50eHQgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9wcm9ndWFyZC1wcm9qZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZlMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcHJvZ3VhcmQtcHJvamVjdC50eHQKQEAgLTAsMCArMSwyMCBAQAorIyBUbyBlbmFibGUgUHJvR3VhcmQgaW4geW91ciBwcm9qZWN0LCBlZGl0IHByb2plY3QucHJvcGVydGllcworIyB0byBkZWZpbmUgdGhlIHByb2d1YXJkLmNvbmZpZyBwcm9wZXJ0eSBhcyBkZXNjcmliZWQgaW4gdGhhdCBmaWxlLgorIworIyBBZGQgcHJvamVjdCBzcGVjaWZpYyBQcm9HdWFyZCBydWxlcyBoZXJlLgorIyBCeSBkZWZhdWx0LCB0aGUgZmxhZ3MgaW4gdGhpcyBmaWxlIGFyZSBhcHBlbmRlZCB0byBmbGFncyBzcGVjaWZpZWQKKyMgaW4gJHtzZGsuZGlyfS90b29scy9wcm9ndWFyZC9wcm9ndWFyZC1hbmRyb2lkLnR4dAorIyBZb3UgY2FuIGVkaXQgdGhlIGluY2x1ZGUgcGF0aCBhbmQgb3JkZXIgYnkgY2hhbmdpbmcgdGhlIFByb0d1YXJkCisjIGluY2x1ZGUgcHJvcGVydHkgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgorIworIyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKyMgICBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvcHJvZ3VhcmQuaHRtbAorCisjIEFkZCBhbnkgcHJvamVjdCBzcGVjaWZpYyBrZWVwIG9wdGlvbnMgaGVyZToKKworIyBJZiB5b3VyIHByb2plY3QgdXNlcyBXZWJWaWV3IHdpdGggSlMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nCisjIGFuZCBzcGVjaWZ5IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB0aGUgSmF2YVNjcmlwdCBpbnRlcmZhY2UKKyMgY2xhc3M6CisjLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgZnFjbi5vZi5qYXZhc2NyaXB0LmludGVyZmFjZS5mb3Iud2VidmlldyB7CisjICAgcHVibGljICo7CisjfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcHJvamVjdC5wcm9wZXJ0aWVzIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcHJvamVjdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDBiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9wcm9qZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgQW5kcm9pZCBUb29scy4KKyMgRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUgLS0gWU9VUiBDSEFOR0VTIFdJTEwgQkUgRVJBU0VEIQorIworIyBUaGlzIGZpbGUgbXVzdCBiZSBjaGVja2VkIGluIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zLgorIworIyBUbyBjdXN0b21pemUgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBBbnQgYnVpbGQgc3lzdGVtIGVkaXQKKyMgImFudC5wcm9wZXJ0aWVzIiwgYW5kIG92ZXJyaWRlIHZhbHVlcyB0byBhZGFwdCB0aGUgc2NyaXB0IHRvIHlvdXIKKyMgcHJvamVjdCBzdHJ1Y3R1cmUuCisjCisjIFRvIGVuYWJsZSBQcm9HdWFyZCB0byBzaHJpbmsgYW5kIG9iZnVzY2F0ZSB5b3VyIGNvZGUsIHVuY29tbWVudCB0aGlzIChhdmFpbGFibGUgcHJvcGVydGllczogc2RrLmRpciwgdXNlci5ob21lKToKKyNwcm9ndWFyZC5jb25maWc9JHtzZGsuZGlyfS90b29scy9wcm9ndWFyZC9wcm9ndWFyZC1hbmRyb2lkLnR4dDpwcm9ndWFyZC1wcm9qZWN0LnR4dAorCisjIFByb2plY3QgdGFyZ2V0LgordGFyZ2V0PWFuZHJvaWQtMTUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xhdW5jaGVyLnBuZyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xhdW5jaGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhiNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbGF1bmNoZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xhdW5jaGVyLnBuZyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xhdW5jaGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU1NzBiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbGF1bmNoZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sYXVuY2hlci5wbmcgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvZHJhd2FibGUteGhkcGkvaWNfbGF1bmNoZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmI3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvZHJhd2FibGUteGhkcGkvaWNfbGF1bmNoZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbGF1bmNoZXIucG5nIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19sYXVuY2hlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhNjA4MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbGF1bmNoZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS9ia2cueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2RyYXdhYmxlL2JrZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwNTIzMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9kcmF3YWJsZS9ia2cueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+DQorPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+DQorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3ByZXNzZWRfY29sb3IiIC8+DQorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci9kZWZhdWx0X2NvbG9yIiAvPg0KKzwvc2VsZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2xheW91dC9hY3Rpdml0eV9jYWxsLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvYWN0aXZpdHlfY2FsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NWViMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvYWN0aXZpdHlfY2FsbC54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCINCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCINCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiDQorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIg0KKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IkBkaW1lbi9hY3Rpdml0eV92ZXJ0aWNhbF9tYXJnaW4iDQorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9hY3Rpdml0eV9ob3Jpem9udGFsX21hcmdpbiINCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9hY3Rpdml0eV9ob3Jpem9udGFsX21hcmdpbiINCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSJAZGltZW4vYWN0aXZpdHlfdmVydGljYWxfbWFyZ2luIg0KKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPg0KKw0KKyAgICA8VGV4dFZpZXcNCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdQZWVyIg0KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCINCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGVlciBVUkkiDQorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiIC8+DQorDQorICAgIDxUZXh0Vmlldw0KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0Vmlld0NhbGxTdGF0ZSINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIg0KKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYWxsIHN0YXRlIiAvPg0KKw0KKyAgICA8QnV0dG9uDQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbkFjY2VwdCINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYWNjZXB0Q2FsbCINCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQWNjZXB0IiAvPg0KKw0KKyAgICA8QnV0dG9uDQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbkhhbmd1cCINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iaGFuZ3VwQ2FsbCINCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmVqZWN0IiAvPg0KKw0KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvbGF5b3V0L2FjdGl2aXR5X21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2MwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvbGF5b3V0L2FjdGl2aXR5X21haW4ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIg0KKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiDQorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ig0KKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCINCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSJAZGltZW4vYWN0aXZpdHlfdmVydGljYWxfbWFyZ2luIg0KKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vYWN0aXZpdHlfaG9yaXpvbnRhbF9tYXJnaW4iDQorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vYWN0aXZpdHlfaG9yaXpvbnRhbF9tYXJnaW4iDQorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL2FjdGl2aXR5X3ZlcnRpY2FsX21hcmdpbiINCisgICAgdG9vbHM6Y29udGV4dD0iLk1haW5BY3Rpdml0eSIgPg0KKw0KKyAgICA8TGlzdFZpZXcNCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdFZpZXdCdWRkeSINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCINCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisgICAgCWFuZHJvaWQ6bGlzdFNlbGVjdG9yPSJAZHJhd2FibGUvYmtnIiA+DQorICAgIDwvTGlzdFZpZXc+DQorDQorICAgIDxMaW5lYXJMYXlvdXQNCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4NCisNCisgICAgICAgIDxJbWFnZUJ1dHRvbg0KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uQ2FsbCINCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im1ha2VDYWxsIg0KKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2NhbGwiIC8+DQorDQorICAgICAgICA8VGV4dFZpZXcNCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisJCQlhbmRyb2lkOnRleHQ9IiAgICIvPg0KKw0KKyAgICAgICAgPEltYWdlQnV0dG9uDQorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25BZGRCdWRkeSINCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9ImFkZEJ1ZGR5Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2FkZCIgLz4NCisgICAgICAgIA0KKyAgICAgICAgPEltYWdlQnV0dG9uDQorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25FZGl0QnVkZHkiDQorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCINCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiDQorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJlZGl0QnVkZHkiDQorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfZWRpdCIgLz4NCisgICAgICAgIA0KKyAgICAgICAgPEltYWdlQnV0dG9uDQorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25EZWxCdWRkeSINCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9ImRlbEJ1ZGR5Ig0KKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2RlbGV0ZSIgLz4NCisNCisgICAgICAgIDwvTGluZWFyTGF5b3V0Pg0KKw0KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvZGxnX2FjY291bnRfY29uZmlnLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvZGxnX2FjY291bnRfY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTExMWYxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2xheW91dC9kbGdfYWNjb3VudF9jb25maWcueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFRhYmxlTGF5b3V0DQorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCINCisgICAgYW5kcm9pZDpwYWRkaW5nID0gIjIwZHAiDQorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4NCisNCisgICAgPFRleHRWaWV3DQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHRWaWV3SW5mbyINCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCINCisgICAgCWFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMjBkcCINCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjYjBiMGIwIiA+DQorICAgIDwvVGV4dFZpZXc+DQorICAgIA0KKwk8VGFibGVSb3c+DQorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJJRCI+DQorICAgICAgICA8L1RleHRWaWV3PiAgDQorDQorCSAgICA8RWRpdFRleHQNCisJICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VkaXRUZXh0SWQiDQorCSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCINCisJICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisJICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiDQorCSAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRVcmkiID4NCisNCisJICAgICAgICA8cmVxdWVzdEZvY3VzIC8+DQorCSAgICA8L0VkaXRUZXh0Pg0KKyAgICA8L1RhYmxlUm93Pg0KKwk8VGFibGVSb3c+DQorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJSZWdpc3RyYXIiPg0KKyAgICAgICAgPC9UZXh0Vmlldz4gIA0KKwkgICAgPEVkaXRUZXh0DQorCSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lZGl0VGV4dFJlZ2lzdHJhciINCisJICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ig0KKwkgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKwkgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisJICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFVyaSIgPg0KKwkgICAgPC9FZGl0VGV4dD4NCisgICAgPC9UYWJsZVJvdz4NCisJPFRhYmxlUm93Pg0KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6dGV4dD0iUHJveHkiPg0KKyAgICAgICAgPC9UZXh0Vmlldz4gIA0KKwkgICAgPEVkaXRUZXh0DQorCSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lZGl0VGV4dFByb3h5Ig0KKwkgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiDQorCSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiDQorCSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIg0KKwkgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0VXJpIiA+DQorCSAgICA8L0VkaXRUZXh0Pg0KKyAgICA8L1RhYmxlUm93Pg0KKwk8VGFibGVSb3c+DQorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJVc2VybmFtZSI+DQorICAgICAgICA8L1RleHRWaWV3PiAgDQorDQorCSAgICA8RWRpdFRleHQNCisJICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VkaXRUZXh0VXNlcm5hbWUiDQorCSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCINCisJICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCINCisJICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiDQorCSAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHQiID4NCisNCisJICAgIDwvRWRpdFRleHQ+DQorICAgIDwvVGFibGVSb3c+DQorCTxUYWJsZVJvdz4NCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOnRleHQ9IlBhc3N3b3JkIj4NCisgICAgICAgIDwvVGV4dFZpZXc+ICANCisNCisJICAgIDxFZGl0VGV4dA0KKwkgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZWRpdFRleHRQYXNzd29yZCINCisJICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ig0KKwkgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ig0KKwkgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSINCisJICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIiA+DQorDQorCSAgICA8L0VkaXRUZXh0Pg0KKyAgICA8L1RhYmxlUm93Pg0KKzwvVGFibGVMYXlvdXQ+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL2xheW91dC9kbGdfYWRkX2J1ZGR5LnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvZGxnX2FkZF9idWRkeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzZTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9sYXlvdXQvZGxnX2FkZF9idWRkeS54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8VGFibGVMYXlvdXQNCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIg0KKyAgICBhbmRyb2lkOnBhZGRpbmcgPSAiMjBkcCINCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCINCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPg0KKwk8VGFibGVSb3c+DQorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJCdWRkeSBVUkkiPg0KKyAgICAgICAgPC9UZXh0Vmlldz4gIA0KKw0KKwkgICAgPEVkaXRUZXh0DQorCSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lZGl0VGV4dFVyaSINCisJICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiDQorCSAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRVcmkiID4NCisJICAgICAgICA8cmVxdWVzdEZvY3VzIC8+DQorCSAgICA8L0VkaXRUZXh0Pg0KKyAgICA8L1RhYmxlUm93Pg0KKwk8VGFibGVSb3c+DQorICAgICAgICA8Q2hlY2tCb3gNCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrQm94U3Vic2NyaWJlIg0KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbj0iMSINCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlN1YnNjcmliZSBwcmVzZW5jZSIgLz4NCisgICAgPC9UYWJsZVJvdz4NCis8L1RhYmxlTGF5b3V0Pg0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9tZW51L2NhbGwueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL21lbnUvY2FsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyMmE0YgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9tZW51L2NhbGwueG1sCkBAIC0wLDAgKzEsOSBAQAorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiA+DQorDQorICAgIDxpdGVtDQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zZXR0aW5ncyINCisgICAgICAgIGFuZHJvaWQ6b3JkZXJJbkNhdGVnb3J5PSIxMDAiDQorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0ibmV2ZXIiDQorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9zZXR0aW5ncyIvPg0KKw0KKzwvbWVudT4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvbWVudS9tYWluLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy9tZW51L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTQ4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvbWVudS9tYWluLnhtbApAQCAtMCwwICsxLDE0IEBACis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4NCisNCisgICAgPGl0ZW0NCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2FjY19jb25maWciDQorICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfbWFuYWdlIg0KKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbSINCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkFjY291bnQgQ29uZmlnIi8+DQorICAgIDxpdGVtDQorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9xdWl0Ig0KKyAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbCINCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iDQorICAgICAgICBhbmRyb2lkOnRpdGxlPSJRdWl0Ii8+DQorICAgIA0KKzwvbWVudT4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApAQCAtMCwwICsxLDggQEAKKzxyZXNvdXJjZXM+DQorDQorICAgIDwhLS0NCisgICAgICAgICBDdXN0b21pemUgZGltZW5zaW9ucyBvcmlnaW5hbGx5IGRlZmluZWQgaW4gcmVzL3ZhbHVlcy9kaW1lbnMueG1sIChzdWNoIGFzCisgICAgICAgICBzY3JlZW4gbWFyZ2lucykgZm9yIHN3NjAwZHAgZGV2aWNlcyAoZS5nLiA3IiB0YWJsZXRzKSBoZXJlLg0KKyAgICAtLT4NCisNCis8L3Jlc291cmNlcz4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzLXN3NzIwZHAtbGFuZC9kaW1lbnMueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy1zdzcyMGRwLWxhbmQvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGYzMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy1zdzcyMGRwLWxhbmQvZGltZW5zLnhtbApAQCAtMCwwICsxLDkgQEAKKzxyZXNvdXJjZXM+DQorDQorICAgIDwhLS0NCisgICAgICAgICBDdXN0b21pemUgZGltZW5zaW9ucyBvcmlnaW5hbGx5IGRlZmluZWQgaW4gcmVzL3ZhbHVlcy9kaW1lbnMueG1sIChzdWNoIGFzCisgICAgICAgICBzY3JlZW4gbWFyZ2lucykgZm9yIHN3NzIwZHAgZGV2aWNlcyAoZS5nLiAxMCIgdGFibGV0cykgaW4gbGFuZHNjYXBlIGhlcmUuDQorICAgIC0tPg0KKyAgICA8ZGltZW4gbmFtZT0iYWN0aXZpdHlfaG9yaXpvbnRhbF9tYXJnaW4iPjEyOGRwPC9kaW1lbj4NCisNCis8L3Jlc291cmNlcz4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzLXYxMS9zdHlsZXMueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTEvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VmNTNkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTEvc3R5bGVzLnhtbApAQCAtMCwwICsxLDExIEBACis8cmVzb3VyY2VzPg0KKw0KKyAgICA8IS0tDQorICAgICAgICBCYXNlIGFwcGxpY2F0aW9uIHRoZW1lIGZvciBBUEkgMTErLiBUaGlzIHRoZW1lIGNvbXBsZXRlbHkgcmVwbGFjZXMKKyAgICAgICAgQXBwQmFzZVRoZW1lIGZyb20gcmVzL3ZhbHVlcy9zdHlsZXMueG1sIG9uIEFQSSAxMSsgZGV2aWNlcy4NCisgICAgLS0+DQorICAgIDxzdHlsZSBuYW1lPSJBcHBCYXNlVGhlbWUiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5Ib2xvLkxpZ2h0Ij4NCisgICAgICAgIDwhLS0gQVBJIDExIHRoZW1lIGN1c3RvbWl6YXRpb25zIGNhbiBnbyBoZXJlLiAtLT4NCisgICAgPC9zdHlsZT4NCisNCis8L3Jlc291cmNlcz4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzLXYxNC9zdHlsZXMueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTQvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRkMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy12MTQvc3R5bGVzLnhtbApAQCAtMCwwICsxLDEyIEBACis8cmVzb3VyY2VzPg0KKw0KKyAgICA8IS0tDQorICAgICAgICBCYXNlIGFwcGxpY2F0aW9uIHRoZW1lIGZvciBBUEkgMTQrLiBUaGlzIHRoZW1lIGNvbXBsZXRlbHkgcmVwbGFjZXMKKyAgICAgICAgQXBwQmFzZVRoZW1lIGZyb20gQk9USCByZXMvdmFsdWVzL3N0eWxlcy54bWwgYW5kCisgICAgICAgIHJlcy92YWx1ZXMtdjExL3N0eWxlcy54bWwgb24gQVBJIDE0KyBkZXZpY2VzLg0KKyAgICAtLT4NCisgICAgPHN0eWxlIG5hbWU9IkFwcEJhc2VUaGVtZSIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLkhvbG8uTGlnaHQuRGFya0FjdGlvbkJhciI+DQorICAgICAgICA8IS0tIEFQSSAxNCB0aGVtZSBjdXN0b21pemF0aW9ucyBjYW4gZ28gaGVyZS4gLS0+DQorICAgIDwvc3R5bGU+DQorDQorPC9yZXNvdXJjZXM+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTYxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxyZXNvdXJjZXM+DQorICAgIDxjb2xvciBuYW1lPSJwcmVzc2VkX2NvbG9yIj4jQjhGMkY1PC9jb2xvcj4NCisgICAgPGNvbG9yIG5hbWU9ImRlZmF1bHRfY29sb3IiPiNFOEZFRkY8L2NvbG9yPg0KKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBlMmFlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0wLDAgKzEsNyBAQAorPHJlc291cmNlcz4NCisNCisgICAgPCEtLSBEZWZhdWx0IHNjcmVlbiBtYXJnaW5zLCBwZXIgdGhlIEFuZHJvaWQgRGVzaWduIGd1aWRlbGluZXMuIC0tPg0KKyAgICA8ZGltZW4gbmFtZT0iYWN0aXZpdHlfaG9yaXpvbnRhbF9tYXJnaW4iPjE2ZHA8L2RpbWVuPg0KKyAgICA8ZGltZW4gbmFtZT0iYWN0aXZpdHlfdmVydGljYWxfbWFyZ2luIj4xNmRwPC9kaW1lbj4NCisNCis8L3Jlc291cmNlcz4NCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWU1MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPHJlc291cmNlcz4NCisNCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+UGpzdWEyPC9zdHJpbmc+DQorICAgIDxzdHJpbmcgbmFtZT0iYWN0aW9uX3NldHRpbmdzIj5TZXR0aW5nczwvc3RyaW5nPg0KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2FjdGl2aXR5X2NhbGwiPkNhbGw8L3N0cmluZz4NCisgICAgPHN0cmluZyBuYW1lPSJoZWxsb193b3JsZCI+SGVsbG8gd29ybGQhPC9zdHJpbmc+DQorDQorPC9yZXNvdXJjZXM+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTkzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTAsMCArMSwyMCBAQAorPHJlc291cmNlcz4NCisNCisgICAgPCEtLQ0KKyAgICAgICAgQmFzZSBhcHBsaWNhdGlvbiB0aGVtZSwgZGVwZW5kZW50IG9uIEFQSSBsZXZlbC4gVGhpcyB0aGVtZSBpcyByZXBsYWNlZAorICAgICAgICBieSBBcHBCYXNlVGhlbWUgZnJvbSByZXMvdmFsdWVzLXZYWC9zdHlsZXMueG1sIG9uIG5ld2VyIGRldmljZXMuDQorICAgIC0tPg0KKyAgICA8c3R5bGUgbmFtZT0iQXBwQmFzZVRoZW1lIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTGlnaHQiPg0KKyAgICAgICAgPCEtLQ0KKyAgICAgICAgICAgIFRoZW1lIGN1c3RvbWl6YXRpb25zIGF2YWlsYWJsZSBpbiBuZXdlciBBUEkgbGV2ZWxzIGNhbiBnbyBpbgorICAgICAgICAgICAgcmVzL3ZhbHVlcy12WFgvc3R5bGVzLnhtbCwgd2hpbGUgY3VzdG9taXphdGlvbnMgcmVsYXRlZCB0bworICAgICAgICAgICAgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBjYW4gZ28gaGVyZS4NCisgICAgICAgIC0tPg0KKyAgICA8L3N0eWxlPg0KKw0KKyAgICA8IS0tIEFwcGxpY2F0aW9uIHRoZW1lLiAtLT4NCisgICAgPHN0eWxlIG5hbWU9IkFwcFRoZW1lIiBwYXJlbnQ9IkFwcEJhc2VUaGVtZSI+DQorICAgICAgICA8IS0tIEFsbCBjdXN0b21pemF0aW9ucyB0aGF0IGFyZSBOT1Qgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIEFQSS1sZXZlbCBjYW4gZ28gaGVyZS4gLS0+DQorICAgIDwvc3R5bGU+DQorDQorPC9yZXNvdXJjZXM+DQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvc3JjL29yZy9wanNpcC9wanN1YTIvYXBwL0NhbGxBY3Rpdml0eS5qYXZhIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvc3JjL29yZy9wanNpcC9wanN1YTIvYXBwL0NhbGxBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmQ4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9zcmMvb3JnL3Bqc2lwL3Bqc3VhMi9hcHAvQ2FsbEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qICRJZDogQ2FsbEFjdGl2aXR5LmphdmEgNDcwNCAyMDE0LTAxLTE2IDA1OjMwOjQ2WiBtaW5nICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCitwYWNrYWdlIG9yZy5wanNpcC5wanN1YTIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CisKK2ltcG9ydCBvcmcucGpzaXAucGpzdWEyLio7CisKK3B1YmxpYyBjbGFzcyBDYWxsQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIEhhbmRsZXIuQ2FsbGJhY2sgeworCQorCXB1YmxpYyBzdGF0aWMgSGFuZGxlciBoYW5kbGVyXzsKKworCXByaXZhdGUgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIodGhpcyk7CisJcHJpdmF0ZSBzdGF0aWMgQ2FsbEluZm8gbGFzdENhbGxJbmZvOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworCQlzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCQlzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9jYWxsKTsKKwkJCisJCWhhbmRsZXJfID0gaGFuZGxlcjsKKwkJaWYgKE1haW5BY3Rpdml0eS5jdXJyZW50Q2FsbCAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWxhc3RDYWxsSW5mbyA9IE1haW5BY3Rpdml0eS5jdXJyZW50Q2FsbC5nZXRJbmZvKCk7CisJCQkJdXBkYXRlQ2FsbFN0YXRlKGxhc3RDYWxsSW5mbyk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVwZGF0ZUNhbGxTdGF0ZShsYXN0Q2FsbEluZm8pOworCQl9CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgIAlzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAJaGFuZGxlcl8gPSBudWxsOworICAgIH0KKwkKKwlwdWJsaWMgdm9pZCBhY2NlcHRDYWxsKFZpZXcgdmlldykgeworCQlDYWxsT3BQYXJhbSBwcm0gPSBuZXcgQ2FsbE9wUGFyYW0oKTsKKwkJcHJtLnNldFN0YXR1c0NvZGUocGpzaXBfc3RhdHVzX2NvZGUuUEpTSVBfU0NfT0spOworCQl0cnkgeworCQkJTWFpbkFjdGl2aXR5LmN1cnJlbnRDYWxsLmFuc3dlcihwcm0pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQl9CisJCQorCQl2aWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBoYW5ndXBDYWxsKFZpZXcgdmlldykgeworCQloYW5kbGVyXyA9IG51bGw7CisJCWZpbmlzaCgpOworCQkKKwkJaWYgKE1haW5BY3Rpdml0eS5jdXJyZW50Q2FsbCAhPSBudWxsKSB7CisJCQlDYWxsT3BQYXJhbSBwcm0gPSBuZXcgQ2FsbE9wUGFyYW0oKTsKKwkJCXBybS5zZXRTdGF0dXNDb2RlKHBqc2lwX3N0YXR1c19jb2RlLlBKU0lQX1NDX0RFQ0xJTkUpOworCQkJdHJ5IHsKKwkJCQlNYWluQWN0aXZpdHkuY3VycmVudENhbGwuaGFuZ3VwKHBybSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJCX0KKworCQkJTWFpbkFjdGl2aXR5LmN1cnJlbnRDYWxsID0gbnVsbDsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgeworCQkKKwkJaWYgKG0ud2hhdCA9PSBNYWluQWN0aXZpdHkuTVNHX1RZUEUuQ0FMTF9TVEFURSkgeworCQkJCisJCQlsYXN0Q2FsbEluZm8gPSAoQ2FsbEluZm8pIG0ub2JqOworCQkJdXBkYXRlQ2FsbFN0YXRlKGxhc3RDYWxsSW5mbyk7CisJCQkKKwkJfSBlbHNlIHsKKwkJCQorCQkJLyogTWVzc2FnZSBub3QgaGFuZGxlZCAqLworCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCX0KKwkJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhbGxTdGF0ZShDYWxsSW5mbyBjaSkgeworCQlUZXh0VmlldyB0dlBlZXIgID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0Vmlld1BlZXIpOworCQlUZXh0VmlldyB0dlN0YXRlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0Vmlld0NhbGxTdGF0ZSk7CisJCUJ1dHRvbiBidXR0b25IYW5ndXAgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idXR0b25IYW5ndXApOworCQlCdXR0b24gYnV0dG9uQWNjZXB0ID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uQWNjZXB0KTsKKwkJU3RyaW5nIGNhbGxfc3RhdGUgPSAiIjsKKwkJCisJCWlmIChjaS5nZXRSb2xlKCkgPT0gcGpzaXBfcm9sZV9lLlBKU0lQX1JPTEVfVUFDKSB7CisJCQlidXR0b25BY2NlcHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCQl9CisJCQkJCisJCWlmIChjaS5nZXRTdGF0ZSgpLnN3aWdWYWx1ZSgpIDwgcGpzaXBfaW52X3N0YXRlLlBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQuc3dpZ1ZhbHVlKCkpCisJCXsKKwkJCWlmIChjaS5nZXRSb2xlKCkgPT0gcGpzaXBfcm9sZV9lLlBKU0lQX1JPTEVfVUFTKSB7CisJCQkJY2FsbF9zdGF0ZSA9ICJJbmNvbWluZyBjYWxsLi4iOworCQkJCS8qIERlZmF1bHQgYnV0dG9uIHRleHRzIGFyZSBhbHJlYWR5ICdBY2NlcHQnICYgJ1JlamVjdCcgKi8KKwkJCX0gZWxzZSB7CisJCQkJYnV0dG9uSGFuZ3VwLnNldFRleHQoIkNhbmNlbCIpOworCQkJCWNhbGxfc3RhdGUgPSBjaS5nZXRTdGF0ZVRleHQoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjaS5nZXRTdGF0ZSgpLnN3aWdWYWx1ZSgpID49IHBqc2lwX2ludl9zdGF0ZS5QSlNJUF9JTlZfU1RBVEVfQ09ORklSTUVELnN3aWdWYWx1ZSgpKQorCQl7CisJCQlidXR0b25BY2NlcHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCQkJY2FsbF9zdGF0ZSA9IGNpLmdldFN0YXRlVGV4dCgpOworCQkJaWYgKGNpLmdldFN0YXRlKCkgPT0gcGpzaXBfaW52X3N0YXRlLlBKU0lQX0lOVl9TVEFURV9DT05GSVJNRUQpIHsKKwkJCQlidXR0b25IYW5ndXAuc2V0VGV4dCgiSGFuZ3VwIik7CisJCQl9IGVsc2UgaWYgKGNpLmdldFN0YXRlKCkgPT0gcGpzaXBfaW52X3N0YXRlLlBKU0lQX0lOVl9TVEFURV9ESVNDT05ORUNURUQpIHsKKwkJCQlidXR0b25IYW5ndXAuc2V0VGV4dCgiT0siKTsKKwkJCQljYWxsX3N0YXRlID0gIkNhbGwgZGlzY29ubmVjdGVkOiAiICsgY2kuZ2V0TGFzdFJlYXNvbigpOworCQkJCU1haW5BY3Rpdml0eS5jdXJyZW50Q2FsbCA9IG51bGw7CisJCQl9CisJCX0KKwkJCisJCXR2UGVlci5zZXRUZXh0KGNpLmdldFJlbW90ZVVyaSgpKTsKKwkJdHZTdGF0ZS5zZXRUZXh0KGNhbGxfc3RhdGUpOworCX0KK30KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3NyYy9vcmcvcGpzaXAvcGpzdWEyL2FwcC9NYWluQWN0aXZpdHkuamF2YSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9hbmRyb2lkL3NyYy9vcmcvcGpzaXAvcGpzdWEyL2FwcC9NYWluQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTgwNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvc3JjL29yZy9wanNpcC9wanN1YTIvYXBwL01haW5BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDk3IEBACisvKiAkSWQ6IE1haW5BY3Rpdml0eS5qYXZhIDQ3MDQgMjAxNC0wMS0xNiAwNTozMDo0NlogbWluZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworcGFja2FnZSBvcmcucGpzaXAucGpzdWEyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnBqc2lwLnBqc3VhMi4qOworCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBIYW5kbGVyLkNhbGxiYWNrLCBNeUFwcE9ic2VydmVyIHsKKwlwdWJsaWMgc3RhdGljIE15QXBwIGFwcCA9IG51bGw7CisJcHVibGljIHN0YXRpYyBNeUNhbGwgY3VycmVudENhbGwgPSBudWxsOworCXB1YmxpYyBzdGF0aWMgTXlBY2NvdW50IGFjY291bnQgPSBudWxsOworCXB1YmxpYyBzdGF0aWMgQWNjb3VudENvbmZpZyBhY2NDZmcgPSBudWxsOworCQorCXByaXZhdGUgTGlzdFZpZXcgYnVkZHlMaXN0VmlldzsKKwlwcml2YXRlIFNpbXBsZUFkYXB0ZXIgYnVkZHlMaXN0QWRhcHRlcjsKKwlwcml2YXRlIGludCBidWRkeUxpc3RTZWxlY3RlZElkeCA9IC0xOworICAgIEFycmF5TGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBidWRkeUxpc3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdFJlZ1N0YXR1cyA9ICIiOworCisJcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgSGFuZGxlcih0aGlzKTsKKwlwdWJsaWMgY2xhc3MgTVNHX1RZUEUgeworCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkNPTUlOR19DQUxMID0gMTsKKwkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0FMTF9TVEFURSA9IDI7CisJCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFR19TVEFURSA9IDM7CisJCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRERZX1NUQVRFID0gNDsKKwl9CisKKwlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHB1dERhdGEoU3RyaW5nIHVyaSwgU3RyaW5nIHN0YXR1cykgeworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBpdGVtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWl0ZW0ucHV0KCJ1cmkiLCB1cmkpOworCQlpdGVtLnB1dCgic3RhdHVzIiwgc3RhdHVzKTsKKwkJcmV0dXJuIGl0ZW07CisJfQorCQorCXByaXZhdGUgdm9pZCBzaG93Q2FsbEFjdGl2aXR5KCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBDYWxsQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKwkJc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKwkJc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWN0aXZpdHlfbWFpbik7CisJCQorCQlpZiAoYXBwID09IG51bGwpIHsKKwkJCWFwcCA9IG5ldyBNeUFwcCgpOworCQkJLyogV2FpdCBmb3IgR0RCIHRvIGluaXQgKi8KKwkJCWlmICgoZ2V0QXBwbGljYXRpb25JbmZvKCkuZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19ERUJVR0dBQkxFKSAhPSAwKSB7CisJCQkJdHJ5IHsKKwkJCQkJVGhyZWFkLnNsZWVwKDUwMDApOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisJCQl9CisJCQkKKwkJICAgIGFwcC5pbml0KHRoaXMsIGdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQl9CisJCQorCSAgICBpZiAoYXBwLmFjY0xpc3Quc2l6ZSgpID09IDApIHsKKwkgICAgCWFjY0NmZyA9IG5ldyBBY2NvdW50Q29uZmlnKCk7CisJICAgIAlhY2NDZmcuc2V0SWRVcmkoInNpcDpsb2NhbGhvc3QiKTsKKwkgICAgCWFjY291bnQgPSBhcHAuYWRkQWNjKGFjY0NmZyk7CisJICAgIH0gZWxzZSB7CisJICAgIAlhY2NvdW50ID0gYXBwLmFjY0xpc3QuZ2V0KDApOworCSAgICAJYWNjQ2ZnID0gYWNjb3VudC5jZmc7CisJICAgIH0KKwkgICAgCisJCWJ1ZGR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NvdW50LmJ1ZGR5TGlzdC5zaXplKCk7IGkrKykgeworCQkJYnVkZHlMaXN0LmFkZChwdXREYXRhKGFjY291bnQuYnVkZHlMaXN0LmdldChpKS5jZmcuZ2V0VXJpKCksCisJCQkJCQkJCSAgYWNjb3VudC5idWRkeUxpc3QuZ2V0KGkpLmdldFN0YXR1c1RleHQoKSkpOworCQl9CisKKwkJU3RyaW5nW10gZnJvbSA9IHsgInVyaSIsICJzdGF0dXMiIH07CisJICAgIGludFtdIHRvID0geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9OworCSAgICBidWRkeUxpc3RBZGFwdGVyID0gbmV3IFNpbXBsZUFkYXB0ZXIodGhpcywgYnVkZHlMaXN0LCBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMiwgZnJvbSwgdG8pOworCSAgICAKKwkJYnVkZHlMaXN0VmlldyA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdFZpZXdCdWRkeSk7OworCSAgICBidWRkeUxpc3RWaWV3LnNldEFkYXB0ZXIoYnVkZHlMaXN0QWRhcHRlcik7CisJICAgIGJ1ZGR5TGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKwkgICAgCUBPdmVycmlkZQorCSAgICAJcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBmaW5hbCBWaWV3IHZpZXcsCisJICAgIAkJCWludCBwb3NpdGlvbiwgbG9uZyBpZCkgCisJICAgIAl7CisJICAgIAkJdmlldy5zZXRTZWxlY3RlZCh0cnVlKTsKKwkgICAgCQlidWRkeUxpc3RTZWxlY3RlZElkeCA9IHBvc2l0aW9uOworCSAgICAJfQorCSAgICB9KTsKKwkgICAgCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKwkJLy8gSW5mbGF0ZSB0aGUgbWVudTsgdGhpcyBhZGRzIGl0ZW1zIHRvIHRoZSBhY3Rpb24gYmFyIGlmIGl0IGlzIHByZXNlbnQuCisJCWdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51Lm1haW4sIG1lbnUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworCQlzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKwkJY2FzZSBSLmlkLmFjdGlvbl9hY2NfY29uZmlnOgorCQkJZGxnQWNjb3VudFNldHRpbmcoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUi5pZC5hY3Rpb25fcXVpdDoKKwkJCU1lc3NhZ2UgbSA9IE1lc3NhZ2Uub2J0YWluKGhhbmRsZXIsIDApOworCQkJbS5zZW5kVG9UYXJnZXQoKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0gCQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKwkJCisJCWlmIChtLndoYXQgPT0gMCkgeworCQkJCisJCQlhcHAuZGVpbml0KCk7CisJCQlmaW5pc2goKTsKKwkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7CisJCQlhbmRyb2lkLm9zLlByb2Nlc3Mua2lsbFByb2Nlc3MoYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCkpOworCQkJCisJCX0gZWxzZSBpZiAobS53aGF0ID09IE1TR19UWVBFLkNBTExfU1RBVEUpIHsKKwkJCQorCQkJQ2FsbEluZm8gY2kgPSAoQ2FsbEluZm8pIG0ub2JqOworCQkJCisJCQkvKiBGb3J3YXJkIHRoZSBtZXNzYWdlIHRvIENhbGxBY3Rpdml0eSAqLworCQkJaWYgKENhbGxBY3Rpdml0eS5oYW5kbGVyXyAhPSBudWxsKSB7CisJCQkJTWVzc2FnZSBtMiA9IE1lc3NhZ2Uub2J0YWluKENhbGxBY3Rpdml0eS5oYW5kbGVyXywgTVNHX1RZUEUuQ0FMTF9TVEFURSwgY2kpOworCQkJCW0yLnNlbmRUb1RhcmdldCgpOworCQkJfQorCQkJCisJCQlpZiAoY2kuZ2V0U3RhdGUoKSA9PSBwanNpcF9pbnZfc3RhdGUuUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJCQljdXJyZW50Q2FsbCA9IG51bGw7CisJCQkKKwkJfSBlbHNlIGlmIChtLndoYXQgPT0gTVNHX1RZUEUuQlVERFlfU1RBVEUpIHsKKwkJCQorCQkJTXlCdWRkeSBidWRkeSA9IChNeUJ1ZGR5KSBtLm9iajsKKwkJCWludCBpZHggPSBhY2NvdW50LmJ1ZGR5TGlzdC5pbmRleE9mKGJ1ZGR5KTsKKwkJCWlmIChpZHggPj0gMCkgeworCQkJCWJ1ZGR5TGlzdC5nZXQoaWR4KS5wdXQoInN0YXR1cyIsIGJ1ZGR5LmdldFN0YXR1c1RleHQoKSk7CisJCQkJYnVkZHlMaXN0QWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCQkJCS8vIFRPRE86IHNlbGVjdGlvbiBjb2xvci9tYXJrIGlzIGdvbmUgYWZ0ZXIgdGhpcywKKwkJCQkvLyAgICAgICBkb250IGtub3cgaG93IHRvIHJldHVybiBpdCBiYWNrLgorCQkJCS8vYnVkZHlMaXN0Vmlldy5zZXRTZWxlY3Rpb24oYnVkZHlMaXN0U2VsZWN0ZWRJZHgpOworCQkJCS8vYnVkZHlMaXN0Vmlldy5wZXJmb3JtSXRlbUNsaWNrKGJ1ZGR5TGlzdFZpZXcsIGJ1ZGR5TGlzdFNlbGVjdGVkSWR4LAorCQkJCS8vCQkJCQkJCSAgIGJ1ZGR5TGlzdFZpZXcuZ2V0SXRlbUlkQXRQb3NpdGlvbihidWRkeUxpc3RTZWxlY3RlZElkeCkpOworCQkJCQorCQkJCS8qIFJldHVybiBiYWNrIENhbGwgYWN0aXZpdHkgKi8KKwkJCQlub3RpZnlDYWxsU3RhdGUoY3VycmVudENhbGwpOworCQkJfQorCQkJCisJCX0gZWxzZSBpZiAobS53aGF0ID09IE1TR19UWVBFLlJFR19TVEFURSkgeworCQkJCisJCQlTdHJpbmcgbXNnX3N0ciA9IChTdHJpbmcpIG0ub2JqOworCQkJbGFzdFJlZ1N0YXR1cyA9IG1zZ19zdHI7CisJCQkKKwkJfSBlbHNlIGlmIChtLndoYXQgPT0gTVNHX1RZUEUuSU5DT01JTkdfQ0FMTCkgeworCQkJCisJCQkvKiBJbmNvbWluZyBjYWxsICovCisJCQlmaW5hbCBNeUNhbGwgY2FsbCA9IChNeUNhbGwpIG0ub2JqOworCQkJQ2FsbE9wUGFyYW0gcHJtID0gbmV3IENhbGxPcFBhcmFtKCk7CisJCQkKKwkJCS8qIE9ubHkgb25lIGNhbGwgYXQgYW55dGltZSAqLworCQkJaWYgKGN1cnJlbnRDYWxsICE9IG51bGwpIHsKKwkJCQlwcm0uc2V0U3RhdHVzQ29kZShwanNpcF9zdGF0dXNfY29kZS5QSlNJUF9TQ19CVVNZX0hFUkUpOworCQkJCXRyeSB7CisJCQkJCWNhbGwuaGFuZ3VwKHBybSk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qIEFuc3dlciB3aXRoIHJpbmdpbmcgKi8KKwkJCXBybS5zZXRTdGF0dXNDb2RlKHBqc2lwX3N0YXR1c19jb2RlLlBKU0lQX1NDX1JJTkdJTkcpOworCQkJdHJ5IHsKKwkJCQljYWxsLmFuc3dlcihwcm0pOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCQkKKwkJCWN1cnJlbnRDYWxsID0gY2FsbDsKKwkJCXNob3dDYWxsQWN0aXZpdHkoKTsKKworCQl9IGVsc2UgeworCQkJCisJCQkvKiBNZXNzYWdlIG5vdCBoYW5kbGVkICovCisJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJfQorCQkJCisJCXJldHVybiB0cnVlOworCX0KKwkKKworCXByaXZhdGUgdm9pZCBkbGdBY2NvdW50U2V0dGluZygpIHsKKwkJCisJCUxheW91dEluZmxhdGVyIGxpID0gTGF5b3V0SW5mbGF0ZXIuZnJvbSh0aGlzKTsKKwkJVmlldyB2aWV3ID0gbGkuaW5mbGF0ZShSLmxheW91dC5kbGdfYWNjb3VudF9jb25maWcsIG51bGwpOworCQkKKwkJaWYgKCFsYXN0UmVnU3RhdHVzLmlzRW1wdHkoKSkgeworCQkJVGV4dFZpZXcgdHZJbmZvID0gKFRleHRWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGV4dFZpZXdJbmZvKTsKKwkJCXR2SW5mby5zZXRUZXh0KCJMYXN0IHN0YXR1czogIiArIGxhc3RSZWdTdGF0dXMpOworCQl9CisKKwkJQWxlcnREaWFsb2cuQnVpbGRlciBhZGIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKwkJYWRiLnNldFZpZXcodmlldyk7CisJCWFkYi5zZXRUaXRsZSgiQWNjb3VudCBTZXR0aW5ncyIpOworCisJCWZpbmFsIEVkaXRUZXh0IGV0SWQgICAgPSAoRWRpdFRleHQpdmlldy5maW5kVmlld0J5SWQoUi5pZC5lZGl0VGV4dElkKTsKKwkJZmluYWwgRWRpdFRleHQgZXRSZWcgICA9IChFZGl0VGV4dCl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmVkaXRUZXh0UmVnaXN0cmFyKTsKKwkJZmluYWwgRWRpdFRleHQgZXRQcm94eSA9IChFZGl0VGV4dCl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmVkaXRUZXh0UHJveHkpOworCQlmaW5hbCBFZGl0VGV4dCBldFVzZXIgID0gKEVkaXRUZXh0KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZWRpdFRleHRVc2VybmFtZSk7CisJCWZpbmFsIEVkaXRUZXh0IGV0UGFzcyAgPSAoRWRpdFRleHQpdmlldy5maW5kVmlld0J5SWQoUi5pZC5lZGl0VGV4dFBhc3N3b3JkKTsKKwkJCisJCWV0SWQuICAgc2V0VGV4dChhY2NDZmcuZ2V0SWRVcmkoKSk7CisJCWV0UmVnLiAgc2V0VGV4dChhY2NDZmcuZ2V0UmVnQ29uZmlnKCkuZ2V0UmVnaXN0cmFyVXJpKCkpOworCQlTdHJpbmdWZWN0b3IgcHJveGllcyA9IGFjY0NmZy5nZXRTaXBDb25maWcoKS5nZXRQcm94aWVzKCk7CisJCWlmIChwcm94aWVzLnNpemUoKSA+IDApCisJCQlldFByb3h5LnNldFRleHQocHJveGllcy5nZXQoMCkpOworCQllbHNlCisJCQlldFByb3h5LnNldFRleHQoIiIpOworCQlBdXRoQ3JlZEluZm9WZWN0b3IgY3JlZHMgPSBhY2NDZmcuZ2V0U2lwQ29uZmlnKCkuZ2V0QXV0aENyZWRzKCk7CisJCWlmIChjcmVkcy5zaXplKCkgPiAwKSB7CisJCQlldFVzZXIuIHNldFRleHQoY3JlZHMuZ2V0KDApLmdldFVzZXJuYW1lKCkpOworCQkJZXRQYXNzLiBzZXRUZXh0KGNyZWRzLmdldCgwKS5nZXREYXRhKCkpOworCQl9IGVsc2UgeworCQkJZXRVc2VyLiBzZXRUZXh0KCIiKTsKKwkJCWV0UGFzcy4gc2V0VGV4dCgiIik7CisJCX0KKwkJCisJCWFkYi5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKwkJYWRiLnNldFBvc2l0aXZlQnV0dG9uKCJPSyIsCisJCQkgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworCQkJICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZyxpbnQgaWQpIHsKKwkJCSAgICAJU3RyaW5nIGFjY19pZCAJID0gZXRJZC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKwkJCSAgICAJU3RyaW5nIHJlZ2lzdHJhciA9IGV0UmVnLmdldFRleHQoKS50b1N0cmluZygpOworCQkJICAgIAlTdHJpbmcgcHJveHkgCSA9IGV0UHJveHkuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisJCQkgICAgCVN0cmluZyB1c2VybmFtZSAgPSBldFVzZXIuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisJCQkgICAgCVN0cmluZyBwYXNzd29yZCAgPSBldFBhc3MuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisJCQkgICAgCQorCQkJICAgIAlhY2NDZmcuc2V0SWRVcmkoYWNjX2lkKTsKKwkJCSAgICAJYWNjQ2ZnLmdldFJlZ0NvbmZpZygpLnNldFJlZ2lzdHJhclVyaShyZWdpc3RyYXIpOworCQkJCQlBdXRoQ3JlZEluZm9WZWN0b3IgY3JlZHMgPSBhY2NDZmcuZ2V0U2lwQ29uZmlnKCkuZ2V0QXV0aENyZWRzKCk7CisJCQkJCWNyZWRzLmNsZWFyKCk7CisJCQkJCWlmICghdXNlcm5hbWUuaXNFbXB0eSgpKSB7CisJCQkJCQljcmVkcy5hZGQobmV3IEF1dGhDcmVkSW5mbygiRGlnZXN0IiwgIioiLCB1c2VybmFtZSwgMCwgcGFzc3dvcmQpKTsKKwkJCQkJfQorCQkJCQlTdHJpbmdWZWN0b3IgcHJveGllcyA9IGFjY0NmZy5nZXRTaXBDb25maWcoKS5nZXRQcm94aWVzKCk7CisJCQkJCXByb3hpZXMuY2xlYXIoKTsKKwkJCQkJaWYgKCFwcm94eS5pc0VtcHR5KCkpIHsKKwkJCQkJCXByb3hpZXMuYWRkKHByb3h5KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLyogRmluYWxseSAqLworCQkJCQlsYXN0UmVnU3RhdHVzID0gIiI7CisJCQkJCXRyeSB7CisJCQkJCQlhY2NvdW50Lm1vZGlmeShhY2NDZmcpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJCSAgICB9CisJCQkgIH0pOworCQlhZGIuc2V0TmVnYXRpdmVCdXR0b24oIkNhbmNlbCIsCisJCQkgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworCQkJICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZyxpbnQgaWQpIHsKKwkJCQlkaWFsb2cuY2FuY2VsKCk7CisJCQkgICAgfQorCQkJICB9KTsKKworCQlBbGVydERpYWxvZyBhZCA9IGFkYi5jcmVhdGUoKTsKKwkJYWQuc2hvdygpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCBtYWtlQ2FsbChWaWV3IHZpZXcpIHsKKwkJaWYgKGJ1ZGR5TGlzdFNlbGVjdGVkSWR4ID09IC0xKQorCQkJcmV0dXJuOworCQkKKwkJLyogT25seSBvbmUgY2FsbCBhdCBhbnl0aW1lICovCisJCWlmIChjdXJyZW50Q2FsbCAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW0gPSAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pIGJ1ZGR5TGlzdFZpZXcuZ2V0SXRlbUF0UG9zaXRpb24oYnVkZHlMaXN0U2VsZWN0ZWRJZHgpOworCQlTdHJpbmcgYnVkZHlfdXJpID0gaXRlbS5nZXQoInVyaSIpOworCQkKKwkJTXlDYWxsIGNhbGwgPSBuZXcgTXlDYWxsKGFjY291bnQsIC0xKTsKKwkJQ2FsbE9wUGFyYW0gcHJtID0gbmV3IENhbGxPcFBhcmFtKCk7CisJCUNhbGxTZXR0aW5nIG9wdCA9IHBybS5nZXRPcHQoKTsKKwkJb3B0LnNldEF1ZGlvQ291bnQoMSk7CisJCW9wdC5zZXRWaWRlb0NvdW50KDApOworCisJCXRyeSB7CisJCQljYWxsLm1ha2VDYWxsKGJ1ZGR5X3VyaSwgcHJtKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWN1cnJlbnRDYWxsID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJY3VycmVudENhbGwgPSBjYWxsOworCQlzaG93Q2FsbEFjdGl2aXR5KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRsZ0FkZEVkaXRCdWRkeShCdWRkeUNvbmZpZyBpbml0aWFsKSB7CisJCWZpbmFsIEJ1ZGR5Q29uZmlnIGNmZyA9IG5ldyBCdWRkeUNvbmZpZygpOworCQlmaW5hbCBCdWRkeUNvbmZpZyBvbGRfY2ZnID0gaW5pdGlhbDsKKwkJZmluYWwgYm9vbGVhbiBpc19hZGQgPSBpbml0aWFsID09IG51bGw7CisJCQorCQlMYXlvdXRJbmZsYXRlciBsaSA9IExheW91dEluZmxhdGVyLmZyb20odGhpcyk7CisJCVZpZXcgdmlldyA9IGxpLmluZmxhdGUoUi5sYXlvdXQuZGxnX2FkZF9idWRkeSwgbnVsbCk7CisKKwkJQWxlcnREaWFsb2cuQnVpbGRlciBhZGIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKwkJYWRiLnNldFZpZXcodmlldyk7CisKKwkJZmluYWwgRWRpdFRleHQgZXRVcmkgICAgPSAoRWRpdFRleHQpdmlldy5maW5kVmlld0J5SWQoUi5pZC5lZGl0VGV4dFVyaSk7CisJCWZpbmFsIENoZWNrQm94IGNiU3VicyAgPSAoQ2hlY2tCb3gpdmlldy5maW5kVmlld0J5SWQoUi5pZC5jaGVja0JveFN1YnNjcmliZSk7CisKKwkJaWYgKGlzX2FkZCkgeworCQkJYWRiLnNldFRpdGxlKCJBZGQgQnVkZHkiKTsKKwkJfSBlbHNlIHsKKwkJCWFkYi5zZXRUaXRsZSgiRWRpdCBCdWRkeSIpOworCQkJZXRVcmkuIHNldFRleHQoaW5pdGlhbC5nZXRVcmkoKSk7CisJCQljYlN1YnMuc2V0Q2hlY2tlZChpbml0aWFsLmdldFN1YnNjcmliZSgpKTsKKwkJfQorCisJCWFkYi5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKwkJYWRiLnNldFBvc2l0aXZlQnV0dG9uKCJPSyIsCisJCQkgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworCQkJICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZyxpbnQgaWQpIHsKKwkJCSAgICAJY2ZnLnNldFVyaShldFVyaS5nZXRUZXh0KCkudG9TdHJpbmcoKSk7CisJCQkgICAgCWNmZy5zZXRTdWJzY3JpYmUoY2JTdWJzLmlzQ2hlY2tlZCgpKTsKKwkJCSAgICAJCisJCQkgICAgCWlmIChpc19hZGQpIHsKKwkJCSAgICAJCWFjY291bnQuYWRkQnVkZHkoY2ZnKTsKKwkJCQkJCWJ1ZGR5TGlzdC5hZGQocHV0RGF0YShjZmcuZ2V0VXJpKCksICIiKSk7CisJCQkJCQlidWRkeUxpc3RBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisJCQkJCQlidWRkeUxpc3RTZWxlY3RlZElkeCA9IC0xOworCQkJICAgIAl9IGVsc2UgeworCQkJICAgIAkJaWYgKCFvbGRfY2ZnLmdldFVyaSgpLmVxdWFscyhjZmcuZ2V0VXJpKCkpKSB7CisJCQkgICAgCQkJYWNjb3VudC5kZWxCdWRkeShidWRkeUxpc3RTZWxlY3RlZElkeCk7CisJCQkgICAgCQkJYWNjb3VudC5hZGRCdWRkeShjZmcpOworCQkJCQkJCWJ1ZGR5TGlzdC5yZW1vdmUoYnVkZHlMaXN0U2VsZWN0ZWRJZHgpOworCQkJCQkJCWJ1ZGR5TGlzdC5hZGQocHV0RGF0YShjZmcuZ2V0VXJpKCksICIiKSk7CisJCQkgICAgCQkJYnVkZHlMaXN0QWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCQkJICAgIAkJCWJ1ZGR5TGlzdFNlbGVjdGVkSWR4ID0gLTE7CisJCQkgICAgCQl9IGVsc2UgaWYgKG9sZF9jZmcuZ2V0U3Vic2NyaWJlKCkgIT0gY2ZnLmdldFN1YnNjcmliZSgpKSB7CisJCQkgICAgCQkJTXlCdWRkeSBidWQgPSBhY2NvdW50LmJ1ZGR5TGlzdC5nZXQoYnVkZHlMaXN0U2VsZWN0ZWRJZHgpOworCQkJCQkJCXRyeSB7CisJCQkJICAgIAkJCWJ1ZC5zdWJzY3JpYmVQcmVzZW5jZShjZmcuZ2V0U3Vic2NyaWJlKCkpOworCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQkJICAgIAkJfQorCQkJICAgIAl9CisJCQkgICAgfQorCQkJICB9KTsKKwkJYWRiLnNldE5lZ2F0aXZlQnV0dG9uKCJDYW5jZWwiLAorCQkJICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCSAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csaW50IGlkKSB7CisJCQkJZGlhbG9nLmNhbmNlbCgpOworCQkJICAgIH0KKwkJCSAgfSk7CisKKwkJQWxlcnREaWFsb2cgYWQgPSBhZGIuY3JlYXRlKCk7CisJCWFkLnNob3coKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkQnVkZHkoVmlldyB2aWV3KSB7CisJCWRsZ0FkZEVkaXRCdWRkeShudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlZGl0QnVkZHkoVmlldyB2aWV3KSB7CisJCWlmIChidWRkeUxpc3RTZWxlY3RlZElkeCA9PSAtMSkKKwkJCXJldHVybjsKKwkJCisJCUJ1ZGR5Q29uZmlnIG9sZF9jZmcgPSBhY2NvdW50LmJ1ZGR5TGlzdC5nZXQoYnVkZHlMaXN0U2VsZWN0ZWRJZHgpLmNmZzsKKwkJZGxnQWRkRWRpdEJ1ZGR5KG9sZF9jZmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBkZWxCdWRkeShWaWV3IHZpZXcpIHsKKwkJaWYgKGJ1ZGR5TGlzdFNlbGVjdGVkSWR4ID09IC0xKQorCQkJcmV0dXJuOworCQkKKwkJZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaXRlbSA9IChIYXNoTWFwPFN0cmluZywgU3RyaW5nPikgYnVkZHlMaXN0Vmlldy5nZXRJdGVtQXRQb3NpdGlvbihidWRkeUxpc3RTZWxlY3RlZElkeCk7CisJCVN0cmluZyBidWRkeV91cmkgPSBpdGVtLmdldCgidXJpIik7CisJCQorCQlEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIG9jbCA9IG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworCQkgICAgQE92ZXJyaWRlCisJCSAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworCQkgICAgICAgIHN3aXRjaCAod2hpY2gpIHsKKwkJICAgICAgICBjYXNlIERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkU6CisJCSAgICAgICAgCWFjY291bnQuZGVsQnVkZHkoYnVkZHlMaXN0U2VsZWN0ZWRJZHgpOworCQkgICAgCQlidWRkeUxpc3QucmVtb3ZlKGl0ZW0pOworCQkgICAgCQlidWRkeUxpc3RBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisJCSAgICAJCWJ1ZGR5TGlzdFNlbGVjdGVkSWR4ID0gLTE7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGNhc2UgRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9ORUdBVElWRToKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCQkgICAgfQorCQl9OworCisJCUFsZXJ0RGlhbG9nLkJ1aWxkZXIgYWRiID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisJCWFkYi5zZXRUaXRsZShidWRkeV91cmkpOworCQlhZGIuc2V0TWVzc2FnZSgiXG5EZWxldGUgdGhpcyBidWRkeT9cbiIpOworCQlhZGIuc2V0UG9zaXRpdmVCdXR0b24oIlllcyIsIG9jbCk7CisJCWFkYi5zZXROZWdhdGl2ZUJ1dHRvbigiTm8iLCBvY2wpOworCQlhZGIuc2hvdygpOworCX0KKwkKKwkKKwkvKgorCSAqID09PSBNeUFwcE9ic2VydmVyID09PQorCSAqIAorCSAqIEFzIHdlIGNhbm5vdCBkbyBVSSBmcm9tIHdvcmtlciB0aHJlYWQsIHRoZSBjYWxsYmFja3MgbW9zdGx5IGp1c3Qgc2VuZAorCSAqIGEgbWVzc2FnZSB0byBVSS9tYWluIHRocmVhZC4KKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBub3RpZnlJbmNvbWluZ0NhbGwoTXlDYWxsIGNhbGwpIHsKKwkJTWVzc2FnZSBtID0gTWVzc2FnZS5vYnRhaW4oaGFuZGxlciwgTVNHX1RZUEUuSU5DT01JTkdfQ0FMTCwgY2FsbCk7CisJCW0uc2VuZFRvVGFyZ2V0KCk7CisJfQorCisJcHVibGljIHZvaWQgbm90aWZ5UmVnU3RhdGUocGpzaXBfc3RhdHVzX2NvZGUgY29kZSwgU3RyaW5nIHJlYXNvbiwgaW50IGV4cGlyYXRpb24pIHsKKwkJU3RyaW5nIG1zZ19zdHIgPSAiIjsKKwkJaWYgKGV4cGlyYXRpb24gPT0gMCkKKwkJCW1zZ19zdHIgKz0gIlVucmVnaXN0cmF0aW9uIjsKKwkJZWxzZQorCQkJbXNnX3N0ciArPSAiUmVnaXN0cmF0aW9uIjsKKwkJCisJCWlmIChjb2RlLnN3aWdWYWx1ZSgpLzEwMCA9PSAyKQorCQkJbXNnX3N0ciArPSAiIHN1Y2Nlc3NmdWwiOworCQllbHNlCisJCQltc2dfc3RyICs9ICIgZmFpbGVkOiAiICsgcmVhc29uOworCQkKKwkJTWVzc2FnZSBtID0gTWVzc2FnZS5vYnRhaW4oaGFuZGxlciwgTVNHX1RZUEUuUkVHX1NUQVRFLCBtc2dfc3RyKTsKKwkJbS5zZW5kVG9UYXJnZXQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgbm90aWZ5Q2FsbFN0YXRlKE15Q2FsbCBjYWxsKSB7CisJCWlmIChjdXJyZW50Q2FsbCA9PSBudWxsIHx8IGNhbGwuZ2V0SWQoKSAhPSBjdXJyZW50Q2FsbC5nZXRJZCgpKQorCQkJcmV0dXJuOworCQkKKwkJQ2FsbEluZm8gY2k7CisJCXRyeSB7CisJCQljaSA9IGNhbGwuZ2V0SW5mbygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJY2kgPSBudWxsOworCQl9CisJCU1lc3NhZ2UgbSA9IE1lc3NhZ2Uub2J0YWluKGhhbmRsZXIsIE1TR19UWVBFLkNBTExfU1RBVEUsIGNpKTsKKwkJbS5zZW5kVG9UYXJnZXQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgbm90aWZ5QnVkZHlTdGF0ZShNeUJ1ZGR5IGJ1ZGR5KSB7CisJCU1lc3NhZ2UgbSA9IE1lc3NhZ2Uub2J0YWluKGhhbmRsZXIsIE1TR19UWVBFLkJVRERZX1NUQVRFLCBidWRkeSk7CisJCW0uc2VuZFRvVGFyZ2V0KCk7CisJfQorCisJLyogPT09IGVuZCBvZiBNeUFwcE9ic2VydmVyID09PT0gKi8KKworfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvc3JjL29yZy9wanNpcC9wanN1YTIvYXBwL015QXBwLmphdmEgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvYW5kcm9pZC9zcmMvb3JnL3Bqc2lwL3Bqc3VhMi9hcHAvTXlBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFhZmUxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL2FuZHJvaWQvc3JjL29yZy9wanNpcC9wanN1YTIvYXBwL015QXBwLmphdmEKQEAgLTAsMCArMSw0NDkgQEAKKy8qICRJZDogTXlBcHAuamF2YSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KK3BhY2thZ2Ugb3JnLnBqc2lwLnBqc3VhMi5hcHA7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBvcmcucGpzaXAucGpzdWEyLio7CisKKworLyogSW50ZXJmYWNlIHRvIHNlcGFyYXRlIFVJICYgZW5naW5lIGEgYml0IGJldHRlciAqLworaW50ZXJmYWNlIE15QXBwT2JzZXJ2ZXIgeworCWFic3RyYWN0IHZvaWQgbm90aWZ5UmVnU3RhdGUocGpzaXBfc3RhdHVzX2NvZGUgY29kZSwgU3RyaW5nIHJlYXNvbiwgaW50IGV4cGlyYXRpb24pOworCWFic3RyYWN0IHZvaWQgbm90aWZ5SW5jb21pbmdDYWxsKE15Q2FsbCBjYWxsKTsKKwlhYnN0cmFjdCB2b2lkIG5vdGlmeUNhbGxTdGF0ZShNeUNhbGwgY2FsbCk7CisJYWJzdHJhY3Qgdm9pZCBub3RpZnlCdWRkeVN0YXRlKE15QnVkZHkgYnVkZHkpOworfQorCisKK2NsYXNzIE15TG9nV3JpdGVyIGV4dGVuZHMgTG9nV3JpdGVyIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZShMb2dFbnRyeSBlbnRyeSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50cnkuZ2V0TXNnKCkpOworCX0KK30KKworCitjbGFzcyBNeUNhbGwgZXh0ZW5kcyBDYWxsIHsKKwlNeUNhbGwoTXlBY2NvdW50IGFjYywgaW50IGNhbGxfaWQpIHsKKwkJc3VwZXIoYWNjLCBjYWxsX2lkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvbkNhbGxTdGF0ZShPbkNhbGxTdGF0ZVBhcmFtIHBybSkgeworCQlNeUFwcC5vYnNlcnZlci5ub3RpZnlDYWxsU3RhdGUodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9uQ2FsbE1lZGlhU3RhdGUoT25DYWxsTWVkaWFTdGF0ZVBhcmFtIHBybSkgeworCQlDYWxsSW5mbyBjaTsKKwkJdHJ5IHsKKwkJCWNpID0gZ2V0SW5mbygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlDYWxsTWVkaWFJbmZvVmVjdG9yIGNtaXYgPSBjaS5nZXRNZWRpYSgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbWl2LnNpemUoKTsgaSsrKSB7CisJCQlDYWxsTWVkaWFJbmZvIGNtaSA9IGNtaXYuZ2V0KGkpOworCQkJaWYgKGNtaS5nZXRUeXBlKCkgPT0gcGptZWRpYV90eXBlLlBKTUVESUFfVFlQRV9BVURJTyAmJgorCQkJICAgIChjbWkuZ2V0U3RhdHVzKCkgPT0gcGpzdWFfY2FsbF9tZWRpYV9zdGF0dXMuUEpTVUFfQ0FMTF9NRURJQV9BQ1RJVkUgfHwKKwkJCSAgICAgY21pLmdldFN0YXR1cygpID09IHBqc3VhX2NhbGxfbWVkaWFfc3RhdHVzLlBKU1VBX0NBTExfTUVESUFfUkVNT1RFX0hPTEQpKQorCQkJeworCQkJCS8vIHVuZm9ydHVuYXRlbHksIG9uIEphdmEgdG9vLCB0aGUgcmV0dXJuZWQgTWVkaWEgY2Fubm90IGJlIGRvd25jYXN0ZWQgdG8gQXVkaW9NZWRpYSAKKwkJCQlNZWRpYSBtID0gZ2V0TWVkaWEoaSk7CisJCQkJQXVkaW9NZWRpYSBhbSA9IEF1ZGlvTWVkaWEudHlwZWNhc3RGcm9tTWVkaWEobSk7CisJCQkJCisJCQkJLy8gY29ubmVjdCBwb3J0cworCQkJCXRyeSB7CisJCQkJCU15QXBwLmVwLmF1ZERldk1hbmFnZXIoKS5nZXRDYXB0dXJlRGV2TWVkaWEoKS5zdGFydFRyYW5zbWl0KGFtKTsKKwkJCQkJYW0uc3RhcnRUcmFuc21pdChNeUFwcC5lcC5hdWREZXZNYW5hZ2VyKCkuZ2V0UGxheWJhY2tEZXZNZWRpYSgpKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKworY2xhc3MgTXlBY2NvdW50IGV4dGVuZHMgQWNjb3VudCB7CisJcHVibGljIEFycmF5TGlzdDxNeUJ1ZGR5PiBidWRkeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE15QnVkZHk+KCk7CisJcHVibGljIEFjY291bnRDb25maWcgY2ZnOworCQorCU15QWNjb3VudChBY2NvdW50Q29uZmlnIGNvbmZpZykgeworCQlzdXBlcigpOworCQljZmcgPSBjb25maWc7CisJfQorCQorCXB1YmxpYyBNeUJ1ZGR5IGFkZEJ1ZGR5KEJ1ZGR5Q29uZmlnIGJ1ZF9jZmcpCisJeworCQkvKiBDcmVhdGUgQnVkZHkgKi8KKwkJTXlCdWRkeSBidWQgPSBuZXcgTXlCdWRkeShidWRfY2ZnKTsKKwkJdHJ5IHsKKwkJCWJ1ZC5jcmVhdGUodGhpcywgYnVkX2NmZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlidWQgPSBudWxsOworCQl9CisJCQorCQlpZiAoYnVkICE9IG51bGwpIHsKKwkJCWJ1ZGR5TGlzdC5hZGQoYnVkKTsKKwkJCWlmIChidWRfY2ZnLmdldFN1YnNjcmliZSgpKQorCQkJCXRyeSB7CisJCQkJCWJ1ZC5zdWJzY3JpYmVQcmVzZW5jZSh0cnVlKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJfQorCQkKKwkJcmV0dXJuIGJ1ZDsKKwl9CisJCisJcHVibGljIHZvaWQgZGVsQnVkZHkoTXlCdWRkeSBidWRkeSkgeworCQlidWRkeUxpc3QucmVtb3ZlKGJ1ZGR5KTsKKwl9CisJCisJcHVibGljIHZvaWQgZGVsQnVkZHkoaW50IGluZGV4KSB7CisJCWJ1ZGR5TGlzdC5yZW1vdmUoaW5kZXgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvblJlZ1N0YXRlKE9uUmVnU3RhdGVQYXJhbSBwcm0pIHsKKwkJTXlBcHAub2JzZXJ2ZXIubm90aWZ5UmVnU3RhdGUocHJtLmdldENvZGUoKSwgcHJtLmdldFJlYXNvbigpLCBwcm0uZ2V0RXhwaXJhdGlvbigpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvbkluY29taW5nQ2FsbChPbkluY29taW5nQ2FsbFBhcmFtIHBybSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09IEluY29taW5nIGNhbGwgPT09PT09PT0gIik7CisJCU15Q2FsbCBjYWxsID0gbmV3IE15Q2FsbCh0aGlzLCBwcm0uZ2V0Q2FsbElkKCkpOworCQlNeUFwcC5vYnNlcnZlci5ub3RpZnlJbmNvbWluZ0NhbGwoY2FsbCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9uSW5zdGFudE1lc3NhZ2UoT25JbnN0YW50TWVzc2FnZVBhcmFtIHBybSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09IEluY29taW5nIHBhZ2VyID09PT09PT09ICIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZyb20gCQk6ICIgKyBwcm0uZ2V0RnJvbVVyaSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJUbwkJCTogIiArIHBybS5nZXRUb1VyaSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDb250YWN0CQk6ICIgKyBwcm0uZ2V0Q29udGFjdFVyaSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJNaW1ldHlwZQk6ICIgKyBwcm0uZ2V0Q29udGVudFR5cGUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQm9keQkJOiAiICsgcHJtLmdldE1zZ0JvZHkoKSk7CisJfQorfQorCisKK2NsYXNzIE15QnVkZHkgZXh0ZW5kcyBCdWRkeSB7CisJcHVibGljIEJ1ZGR5Q29uZmlnIGNmZzsKKwkKKwlNeUJ1ZGR5KEJ1ZGR5Q29uZmlnIGNvbmZpZykgeworCQlzdXBlcigpOworCQljZmcgPSBjb25maWc7CisJfQorCQorCVN0cmluZyBnZXRTdGF0dXNUZXh0KCkgeworCQlCdWRkeUluZm8gYmk7CisJCQorCQl0cnkgeworCQkJYmkgPSBnZXRJbmZvKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gIj8iOworCQl9CisJCQorCQlTdHJpbmcgc3RhdHVzID0gIiI7CisJCWlmIChiaS5nZXRTdWJTdGF0ZSgpID09IHBqc2lwX2V2c3ViX3N0YXRlLlBKU0lQX0VWU1VCX1NUQVRFX0FDVElWRSkgeworCQkJaWYgKGJpLmdldFByZXNTdGF0dXMoKS5nZXRTdGF0dXMoKSA9PSBwanN1YV9idWRkeV9zdGF0dXMuUEpTVUFfQlVERFlfU1RBVFVTX09OTElORSkgeworCQkJCXN0YXR1cyA9IGJpLmdldFByZXNTdGF0dXMoKS5nZXRTdGF0dXNUZXh0KCk7CisJCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc0VtcHR5KCkpIHsKKwkJCQkJc3RhdHVzID0gIk9ubGluZSI7CisJCQkJfQorCQkJfSBlbHNlIGlmIChiaS5nZXRQcmVzU3RhdHVzKCkuZ2V0U3RhdHVzKCkgPT0gcGpzdWFfYnVkZHlfc3RhdHVzLlBKU1VBX0JVRERZX1NUQVRVU19PRkZMSU5FKSB7CisJCQkJc3RhdHVzID0gIk9mZmxpbmUiOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSAiVW5rbm93biI7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvbkJ1ZGR5U3RhdGUoKSB7CisJCU15QXBwLm9ic2VydmVyLm5vdGlmeUJ1ZGR5U3RhdGUodGhpcyk7CisJfQorCQorfQorCisKK2NsYXNzIE15QWNjb3VudENvbmZpZyB7CisJcHVibGljIEFjY291bnRDb25maWcgYWNjQ2ZnID0gbmV3IEFjY291bnRDb25maWcoKTsKKwlwdWJsaWMgQXJyYXlMaXN0PEJ1ZGR5Q29uZmlnPiBidWRkeUNmZ3MgPSBuZXcgQXJyYXlMaXN0PEJ1ZGR5Q29uZmlnPigpOworCQorCXB1YmxpYyB2b2lkIHJlYWRPYmplY3QoQ29udGFpbmVyTm9kZSBub2RlKSB7CisJCXRyeSB7CisJCQlDb250YWluZXJOb2RlIGFjY19ub2RlID0gbm9kZS5yZWFkQ29udGFpbmVyKCJBY2NvdW50Iik7CisJCQlhY2NDZmcucmVhZE9iamVjdChhY2Nfbm9kZSk7CisJCQlDb250YWluZXJOb2RlIGJ1ZGRpZXNfbm9kZSA9IGFjY19ub2RlLnJlYWRBcnJheSgiYnVkZGllcyIpOworCQkJYnVkZHlDZmdzLmNsZWFyKCk7CisJCQl3aGlsZSAoYnVkZGllc19ub2RlLmhhc1VucmVhZCgpKSB7CisJCQkJQnVkZHlDb25maWcgYnVkX2NmZyA9IG5ldyBCdWRkeUNvbmZpZygpOyAKKwkJCQlidWRfY2ZnLnJlYWRPYmplY3QoYnVkZGllc19ub2RlKTsKKwkJCQlidWRkeUNmZ3MuYWRkKGJ1ZF9jZmcpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwl9CisJCisJcHVibGljIHZvaWQgd3JpdGVPYmplY3QoQ29udGFpbmVyTm9kZSBub2RlKSB7CisJCXRyeSB7CisJCQlDb250YWluZXJOb2RlIGFjY19ub2RlID0gbm9kZS53cml0ZU5ld0NvbnRhaW5lcigiQWNjb3VudCIpOworCQkJYWNjQ2ZnLndyaXRlT2JqZWN0KGFjY19ub2RlKTsKKwkJCUNvbnRhaW5lck5vZGUgYnVkZGllc19ub2RlID0gYWNjX25vZGUud3JpdGVOZXdBcnJheSgiYnVkZGllcyIpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidWRkeUNmZ3Muc2l6ZSgpOyBqKyspIHsKKwkJCQlidWRkeUNmZ3MuZ2V0KGopLndyaXRlT2JqZWN0KGJ1ZGRpZXNfbm9kZSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCX0KK30KKworCitjbGFzcyBNeUFwcCB7CisJc3RhdGljIHsKKwkJU3lzdGVtLmxvYWRMaWJyYXJ5KCJwanN1YTIiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IGxvYWRlZCIpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEVuZHBvaW50IGVwID0gbmV3IEVuZHBvaW50KCk7CisJcHVibGljIHN0YXRpYyBNeUFwcE9ic2VydmVyIG9ic2VydmVyOworCXB1YmxpYyBBcnJheUxpc3Q8TXlBY2NvdW50PiBhY2NMaXN0ID0gbmV3IEFycmF5TGlzdDxNeUFjY291bnQ+KCk7CisKKwlwcml2YXRlIEFycmF5TGlzdDxNeUFjY291bnRDb25maWc+IGFjY0NmZ3MgPSBuZXcgQXJyYXlMaXN0PE15QWNjb3VudENvbmZpZz4oKTsKKwlwcml2YXRlIEVwQ29uZmlnIGVwQ29uZmlnID0gbmV3IEVwQ29uZmlnKCk7CisJcHJpdmF0ZSBUcmFuc3BvcnRDb25maWcgc2lwVHBDb25maWcgPSBuZXcgVHJhbnNwb3J0Q29uZmlnKCk7CisJcHJpdmF0ZSBTdHJpbmcgYXBwRGlyOworCQorCS8qIE1haW50YWluIHJlZmVyZW5jZSB0byBsb2cgd3JpdGVyIHRvIGF2b2lkIHByZW1hdHVyZSBjbGVhbnVwIGJ5IEdDICovCisJcHJpdmF0ZSBNeUxvZ1dyaXRlciBsb2dXcml0ZXI7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBjb25maWdOYW1lID0gInBqc3VhMi5qc29uIjsKKwlwcml2YXRlIGZpbmFsIGludCBTSVBfUE9SVCAgPSA2MDAwOworCXByaXZhdGUgZmluYWwgaW50IExPR19MRVZFTCA9IDQ7CisJCisJcHVibGljIHZvaWQgaW5pdChNeUFwcE9ic2VydmVyIG9icywgU3RyaW5nIGFwcF9kaXIpIHsKKwkJaW5pdChvYnMsIGFwcF9kaXIsIGZhbHNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdChNeUFwcE9ic2VydmVyIG9icywgU3RyaW5nIGFwcF9kaXIsIGJvb2xlYW4gb3duX3dvcmtlcl90aHJlYWQpIHsKKwkJb2JzZXJ2ZXIgPSBvYnM7CisJCWFwcERpciA9IGFwcF9kaXI7CisJCQorCQkvKiBDcmVhdGUgZW5kcG9pbnQgKi8KKwkJdHJ5IHsKKwkJCWVwLmxpYkNyZWF0ZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuOworCQl9CisJCQkKKwkJCisJCS8qIExvYWQgY29uZmlnICovCisJCVN0cmluZyBjb25maWdQYXRoID0gYXBwRGlyICsgIi8iICsgY29uZmlnTmFtZTsKKwkJRmlsZSBmID0gbmV3IEZpbGUoY29uZmlnUGF0aCk7CisJCWlmIChmLmV4aXN0cygpKSB7CisJCQlsb2FkQ29uZmlnKGNvbmZpZ1BhdGgpOworCQl9IGVsc2UgeworCQkJLyogU2V0ICdkZWZhdWx0JyB2YWx1ZXMgKi8KKwkJCXNpcFRwQ29uZmlnLnNldFBvcnQoU0lQX1BPUlQpOworCQl9CisJCQorCQkvKiBPdmVycmlkZSBsb2cgbGV2ZWwgc2V0dGluZyAqLworCQllcENvbmZpZy5nZXRMb2dDb25maWcoKS5zZXRMZXZlbChMT0dfTEVWRUwpOworCQllcENvbmZpZy5nZXRMb2dDb25maWcoKS5zZXRDb25zb2xlTGV2ZWwoTE9HX0xFVkVMKTsKKwkJCisJCS8qIFNldCBsb2cgY29uZmlnLiAqLworCQlMb2dDb25maWcgbG9nX2NmZyA9IGVwQ29uZmlnLmdldExvZ0NvbmZpZygpOworCQlsb2dXcml0ZXIgPSBuZXcgTXlMb2dXcml0ZXIoKTsKKwkJbG9nX2NmZy5zZXRXcml0ZXIobG9nV3JpdGVyKTsKKwkJbG9nX2NmZy5zZXREZWNvcihsb2dfY2ZnLmdldERlY29yKCkgJiAKKwkJCQkJCSB+KHBqX2xvZ19kZWNvcmF0aW9uLlBKX0xPR19IQVNfQ1Iuc3dpZ1ZhbHVlKCkgfCAKKwkJCQkJCSAgIHBqX2xvZ19kZWNvcmF0aW9uLlBKX0xPR19IQVNfTkVXTElORS5zd2lnVmFsdWUoKSkpOworCQkKKwkJLyogU2V0IHVhIGNvbmZpZy4gKi8KKwkJVWFDb25maWcgdWFfY2ZnID0gZXBDb25maWcuZ2V0VWFDb25maWcoKTsKKwkJdWFfY2ZnLnNldFVzZXJBZ2VudCgiUGpzdWEyQW5kIiArIGVwLmxpYlZlcnNpb24oKS5nZXRGdWxsKCkpOworCQlpZiAob3duX3dvcmtlcl90aHJlYWQpIHsKKwkJCXVhX2NmZy5zZXRUaHJlYWRDbnQoMCk7CisJCQl1YV9jZmcuc2V0TWFpblRocmVhZE9ubHkodHJ1ZSk7CisJCX0KKwkJCisJCS8qIEluaXQgZW5kcG9pbnQgKi8KKwkJdHJ5IHsKKwkJCWVwLmxpYkluaXQoZXBDb25maWcpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQkvKiBDcmVhdGUgdHJhbnNwb3J0cy4gKi8KKwkJdHJ5IHsKKwkJCWVwLnRyYW5zcG9ydENyZWF0ZShwanNpcF90cmFuc3BvcnRfdHlwZV9lLlBKU0lQX1RSQU5TUE9SVF9VRFAsIHNpcFRwQ29uZmlnKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfQorCisJCXRyeSB7CisJCQllcC50cmFuc3BvcnRDcmVhdGUocGpzaXBfdHJhbnNwb3J0X3R5cGVfZS5QSlNJUF9UUkFOU1BPUlRfVENQLCBzaXBUcENvbmZpZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisJCX0KKwkJCisJCS8qIENyZWF0ZSBhY2NvdW50cy4gKi8KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NDZmdzLnNpemUoKTsgaSsrKSB7CisJCQlNeUFjY291bnRDb25maWcgbXlfY2ZnID0gYWNjQ2Zncy5nZXQoaSk7CisJCQlNeUFjY291bnQgYWNjID0gYWRkQWNjKG15X2NmZy5hY2NDZmcpOworCQkJaWYgKGFjYyA9PSBudWxsKQorCQkJCWNvbnRpbnVlOworCQkJCisJCQkvKiBBZGQgQnVkZGllcyAqLworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBteV9jZmcuYnVkZHlDZmdzLnNpemUoKTsgaisrKSB7CisJCQkJQnVkZHlDb25maWcgYnVkX2NmZyA9IG15X2NmZy5idWRkeUNmZ3MuZ2V0KGopOworCQkJCWFjYy5hZGRCdWRkeShidWRfY2ZnKTsKKwkJCX0KKwkJfQorCisJCS8qIFN0YXJ0LiAqLworCQl0cnkgeworCQkJZXAubGliU3RhcnQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwlwdWJsaWMgTXlBY2NvdW50IGFkZEFjYyhBY2NvdW50Q29uZmlnIGNmZykgeworCQlNeUFjY291bnQgYWNjID0gbmV3IE15QWNjb3VudChjZmcpOworCQl0cnkgeworCQkJYWNjLmNyZWF0ZShjZmcpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJYWNjID0gbnVsbDsKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlhY2NMaXN0LmFkZChhY2MpOworCQlyZXR1cm4gYWNjOworCX0KKwkKKwlwdWJsaWMgdm9pZCBkZWxBY2MoTXlBY2NvdW50IGFjYykgeworCQlhY2NMaXN0LnJlbW92ZShhY2MpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbG9hZENvbmZpZyhTdHJpbmcgZmlsZW5hbWUpIHsKKwkJSnNvbkRvY3VtZW50IGpzb24gPSBuZXcgSnNvbkRvY3VtZW50KCk7CisJCQorCQl0cnkgeworCQkJLyogTG9hZCBmaWxlICovCisJCQlqc29uLmxvYWRGaWxlKGZpbGVuYW1lKTsKKwkJCUNvbnRhaW5lck5vZGUgcm9vdCA9IGpzb24uZ2V0Um9vdENvbnRhaW5lcigpOworCQkJCisJCQkvKiBSZWFkIGVuZHBvaW50IGNvbmZpZyAqLworCQkJZXBDb25maWcucmVhZE9iamVjdChyb290KTsKKwkJCQorCQkJLyogUmVhZCB0cmFuc3BvcnQgY29uZmlnICovCisJCQlDb250YWluZXJOb2RlIHRwX25vZGUgPSByb290LnJlYWRDb250YWluZXIoIlNpcFRyYW5zcG9ydCIpOworCQkJc2lwVHBDb25maWcucmVhZE9iamVjdCh0cF9ub2RlKTsKKwkJCQorCQkJLyogUmVhZCBhY2NvdW50IGNvbmZpZ3MgKi8KKwkJCWFjY0NmZ3MuY2xlYXIoKTsKKwkJCUNvbnRhaW5lck5vZGUgYWNjc19ub2RlID0gcm9vdC5yZWFkQXJyYXkoImFjY291bnRzIik7CisJCQl3aGlsZSAoYWNjc19ub2RlLmhhc1VucmVhZCgpKSB7CisJCQkJTXlBY2NvdW50Q29uZmlnIGFjY19jZmcgPSBuZXcgTXlBY2NvdW50Q29uZmlnKCk7CisJCQkJYWNjX2NmZy5yZWFkT2JqZWN0KGFjY3Nfbm9kZSk7CisJCQkJYWNjQ2Zncy5hZGQoYWNjX2NmZyk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisJCX0KKwkJCisJCS8qIEZvcmNlIGRlbGV0ZSBqc29uIG5vdywgYXMgSSBmb3VuZCB0aGF0IEphdmEgc29tZWhvdyBkZXN0cm95cyBpdAorCQkgKiBhZnRlciBsaWIgaGFzIGJlZW4gZGVzdHJveWVkIGFuZCBmcm9tIG5vbi1yZWdpc3RlcmVkIHRocmVhZC4KKwkJICovCisJCWpzb24uZGVsZXRlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkQWNjQ29uZmlncygpIHsKKwkJLyogU3luYyBhY2NDZmdzIGZyb20gYWNjTGlzdCAqLworCQlhY2NDZmdzLmNsZWFyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjTGlzdC5zaXplKCk7IGkrKykgeworCQkJTXlBY2NvdW50IGFjYyA9IGFjY0xpc3QuZ2V0KGkpOworCQkJTXlBY2NvdW50Q29uZmlnIG15X2FjY19jZmcgPSBuZXcgTXlBY2NvdW50Q29uZmlnKCk7CisJCQlteV9hY2NfY2ZnLmFjY0NmZyA9IGFjYy5jZmc7CisJCQkKKwkJCW15X2FjY19jZmcuYnVkZHlDZmdzLmNsZWFyKCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjYy5idWRkeUxpc3Quc2l6ZSgpOyBqKyspIHsKKwkJCQlNeUJ1ZGR5IGJ1ZCA9IGFjYy5idWRkeUxpc3QuZ2V0KGopOworCQkJCW15X2FjY19jZmcuYnVkZHlDZmdzLmFkZChidWQuY2ZnKTsKKwkJCX0KKwkJCQorCQkJYWNjQ2Zncy5hZGQobXlfYWNjX2NmZyk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNhdmVDb25maWcoU3RyaW5nIGZpbGVuYW1lKSB7CisJCUpzb25Eb2N1bWVudCBqc29uID0gbmV3IEpzb25Eb2N1bWVudCgpOworCQkKKwkJdHJ5IHsKKwkJCS8qIFdyaXRlIGVuZHBvaW50IGNvbmZpZyAqLworCQkJanNvbi53cml0ZU9iamVjdChlcENvbmZpZyk7CisJCQkKKwkJCS8qIFdyaXRlIHRyYW5zcG9ydCBjb25maWcgKi8KKwkJCUNvbnRhaW5lck5vZGUgdHBfbm9kZSA9IGpzb24ud3JpdGVOZXdDb250YWluZXIoIlNpcFRyYW5zcG9ydCIpOworCQkJc2lwVHBDb25maWcud3JpdGVPYmplY3QodHBfbm9kZSk7CisJCQkKKwkJCS8qIFdyaXRlIGFjY291bnQgY29uZmlncyAqLworCQkJYnVpbGRBY2NDb25maWdzKCk7CisJCQlDb250YWluZXJOb2RlIGFjY3Nfbm9kZSA9IGpzb24ud3JpdGVOZXdBcnJheSgiYWNjb3VudHMiKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjQ2Zncy5zaXplKCk7IGkrKykgeworCQkJCWFjY0NmZ3MuZ2V0KGkpLndyaXRlT2JqZWN0KGFjY3Nfbm9kZSk7CisJCQl9CisJCQkKKwkJCS8qIFNhdmUgZmlsZSAqLworCQkJanNvbi5zYXZlRmlsZShmaWxlbmFtZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCisJCS8qIEZvcmNlIGRlbGV0ZSBqc29uIG5vdywgYXMgSSBmb3VuZCB0aGF0IEphdmEgc29tZWhvdyBkZXN0cm95cyBpdAorCQkgKiBhZnRlciBsaWIgaGFzIGJlZW4gZGVzdHJveWVkIGFuZCBmcm9tIG5vbi1yZWdpc3RlcmVkIHRocmVhZC4KKwkJICovCisJCWpzb24uZGVsZXRlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGRlaW5pdCgpIHsKKwkJU3RyaW5nIGNvbmZpZ1BhdGggPSBhcHBEaXIgKyAiLyIgKyBjb25maWdOYW1lOworCQlzYXZlQ29uZmlnKGNvbmZpZ1BhdGgpOworCQkKKwkJLyogVHJ5IGZvcmNlIEdDIHRvIGF2b2lkIGxhdGUgZGVzdHJveSBvZiBQSiBvYmplY3RzIGFzIHRoZXkgc2hvdWxkIGJlCisJCSAqIGRlbGV0ZWQgYmVmb3JlIGxpYiBpcyBkZXN0cm95ZWQuCisJCSAqLworCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOworCQkKKwkJLyogU2h1dGRvd24gcGpzdWEuIE5vdGUgdGhhdCBFbmRwb2ludCBkZXN0cnVjdG9yIHdpbGwgYWxzbyBpbnZva2UKKwkJICogbGliRGVzdHJveSgpLCBzbyB0aGlzIHdpbGwgYmUgYSB0ZXN0IG9mIGRvdWJsZSBsaWJEZXN0cm95KCkuCisJCSAqLworCQl0cnkgeworCQkJZXAubGliRGVzdHJveSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJCisJCS8qIEZvcmNlIGRlbGV0ZSBFbmRwb2ludCBoZXJlLCB0byBhdm9pZCBkZWxldGlvbiBmcm9tIGEgbm9uLQorCQkgKiByZWdpc3RlcmVkIHRocmVhZCAoYnkgR0M/KS4gCisJCSAqLworCQllcC5kZWxldGUoKTsKKwkJZXAgPSBudWxsOworCX0gCit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvc2FtcGxlLmphdmEgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL2phdmEvc2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS9zYW1wbGUuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyogJElkOiBzYW1wbGUuamF2YSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworIAorcGFja2FnZSBvcmcucGpzaXAucGpzdWEyLmFwcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnBqc2lwLnBqc3VhMi4qOworaW1wb3J0IG9yZy5wanNpcC5wanN1YTIuYXBwLio7CisKK2NsYXNzIE15T2JzZXJ2ZXIgaW1wbGVtZW50cyBNeUFwcE9ic2VydmVyIHsKKwlwcml2YXRlIHN0YXRpYyBNeUNhbGwgY3VycmVudENhbGwgPSBudWxsOworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeVJlZ1N0YXRlKHBqc2lwX3N0YXR1c19jb2RlIGNvZGUsIFN0cmluZyByZWFzb24sIGludCBleHBpcmF0aW9uKSB7fQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUluY29taW5nQ2FsbChNeUNhbGwgY2FsbCkgeworCQkvKiBBdXRvIGFuc3dlci4gKi8KKwkJQ2FsbE9wUGFyYW0gY2FsbF9wYXJhbSA9IG5ldyBDYWxsT3BQYXJhbSgpOworCQljYWxsX3BhcmFtLnNldFN0YXR1c0NvZGUocGpzaXBfc3RhdHVzX2NvZGUuUEpTSVBfU0NfT0spOworCQl0cnkgeworCQkJY3VycmVudENhbGwgPSBjYWxsOworCQkJY3VycmVudENhbGwuYW5zd2VyKGNhbGxfcGFyYW0pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQkJcmV0dXJuOworCQl9CQkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG5vdGlmeUNhbGxTdGF0ZShNeUNhbGwgY2FsbCkgeworCQlpZiAoY3VycmVudENhbGwgPT0gbnVsbCB8fCBjYWxsLmdldElkKCkgIT0gY3VycmVudENhbGwuZ2V0SWQoKSkKKwkJCXJldHVybjsKKwkJCisJCUNhbGxJbmZvIGNpOworCQl0cnkgeworCQkJY2kgPSBjYWxsLmdldEluZm8oKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWNpID0gbnVsbDsKKwkJfQorCQlpZiAoY2kuZ2V0U3RhdGUoKSA9PSBwanNpcF9pbnZfc3RhdGUuUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJCWN1cnJlbnRDYWxsID0gbnVsbDsJCQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBub3RpZnlCdWRkeVN0YXRlKE15QnVkZHkgYnVkZHkpIHt9CQorfQorCitjbGFzcyBNeVNodXRkb3duSG9vayBleHRlbmRzIFRocmVhZCB7CisJVGhyZWFkIHRocmVhZDsKKwlNeVNodXRkb3duSG9vayhUaHJlYWQgdGhyKSB7CisJCXRocmVhZCA9IHRocjsKKwl9CisJcHVibGljIHZvaWQgcnVuKCkgeworCQl0aHJlYWQuaW50ZXJydXB0KCk7CisJCXRyeSB7CisJCQl0aHJlYWQuam9pbigpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJOworCQl9CisJfQorfQkKKworcHVibGljIGNsYXNzIHNhbXBsZSB7CisJcHJpdmF0ZSBzdGF0aWMgTXlBcHAgYXBwID0gbmV3IE15QXBwKCk7CisJcHJpdmF0ZSBzdGF0aWMgTXlBcHBPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBNeU9ic2VydmVyKCk7CisJcHJpdmF0ZSBzdGF0aWMgTXlBY2NvdW50IGFjY291bnQgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEFjY291bnRDb25maWcgYWNjQ2ZnID0gbnVsbDsJCQkKKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJ1bldvcmtlcigpIHsKKwkJdHJ5IHsJCQkJCQorCQkJYXBwLmluaXQob2JzZXJ2ZXIsICIuIiwgdHJ1ZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisJCQlhcHAuZGVpbml0KCk7CisJCQlTeXN0ZW0uZXhpdCgtMSk7CisJCX0gCisKKwkJaWYgKGFwcC5hY2NMaXN0LnNpemUoKSA9PSAwKSB7CisJCQlhY2NDZmcgPSBuZXcgQWNjb3VudENvbmZpZygpOworCQkJYWNjQ2ZnLnNldElkVXJpKCJzaXA6bG9jYWxob3N0Iik7CisJCQlhY2NvdW50ID0gYXBwLmFkZEFjYyhhY2NDZmcpOworCisJCQlhY2NDZmcuc2V0SWRVcmkoInNpcDozMDFAcGpzaXAub3JnIik7CisJCQlBY2NvdW50U2lwQ29uZmlnIHNpcENmZyA9IGFjY0NmZy5nZXRTaXBDb25maWcoKTsJCQorCQkJQXV0aENyZWRJbmZvVmVjdG9yIGNpVmVjID0gc2lwQ2ZnLmdldEF1dGhDcmVkcygpOworCQkJY2lWZWMuYWRkKG5ldyBBdXRoQ3JlZEluZm8oIkRpZ2VzdCIsIAorCQkJCQkiKiIsCisJCQkJCSIzMDEiLAorCQkJCQkwLAorCQkJCQkicHczMDEiKSk7CisKKwkJCVN0cmluZ1ZlY3RvciBwcm94eSA9IHNpcENmZy5nZXRQcm94aWVzKCk7CisJCQlwcm94eS5hZGQoInNpcDpwanNpcC5vcmc7dHJhbnNwb3J0PXRjcCIpOwkJCQkJCQkKKworCQkJQWNjb3VudFJlZ0NvbmZpZyByZWdDZmcgPSBhY2NDZmcuZ2V0UmVnQ29uZmlnKCk7CisJCQlyZWdDZmcuc2V0UmVnaXN0cmFyVXJpKCJzaXA6cGpzaXAub3JnIik7CisJCQlhY2NvdW50ID0gYXBwLmFkZEFjYyhhY2NDZmcpOworCQl9IGVsc2UgeworCQkJYWNjb3VudCA9IGFwcC5hY2NMaXN0LmdldCgwKTsKKwkJCWFjY0NmZyA9IGFjY291bnQuY2ZnOworCQl9CQkJCQorCisJCXRyeSB7CisJCQlhY2NvdW50Lm1vZGlmeShhY2NDZmcpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30JCQkJCisKKwkJd2hpbGUgKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworCQkJTXlBcHAuZXAubGliSGFuZGxlRXZlbnRzKDEwKTsKKwkJCXRyeSB7CQkJCQkJCisJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewkJCQkJCQorCQkJCWJyZWFrOworCQkJfQkJCQkJCisJCX0KKwkJYXBwLmRlaW5pdCgpOworCX0JCisJCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKKwkJUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBNeVNodXRkb3duSG9vayhUaHJlYWQuY3VycmVudFRocmVhZCgpKSk7CisKKwkJcnVuV29ya2VyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9qYXZhL3Rlc3QuamF2YSBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS90ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxNjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvamF2YS90ZXN0LmphdmEKQEAgLTAsMCArMSwxNyBAQAoraW1wb3J0IG9yZy5wanNpcC5wanN1YTIuKjsKKworcHVibGljIGNsYXNzIHRlc3QgeworICBzdGF0aWMgeworICAgIFN5c3RlbS5sb2FkTGlicmFyeSgicGpzdWEyIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWJyYXJ5IGxvYWRlZCIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworCisJQXV0aENyZWRJbmZvIGNyZWQgPSBuZXcgQXV0aENyZWRJbmZvKCk7CisKKwljcmVkLnNldFJlYWxtKCJIZWxsbyB3b3JsZCIpOworICAgIAorCVN5c3RlbS5vdXQucHJpbnRsbihjcmVkLmdldFJlYWxtKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3Bqc3VhMi5pIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9wanN1YTIuaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M0MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9wanN1YTIuaQpAQCAtMCwwICsxLDExMSBAQAorJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBwanN1YTIKKworLy8KKy8vIFN1cHByZXNzIGZldyB3YXJuaW5ncworLy8KKyNwcmFnbWEgU1dJRyBub3dhcm49MzEyCQkvLyAzMTI6IG5lc3RlZCBzdHJ1Y3QgKGluIHR5cGVzLmgsIHNpcF9hdXRoLmgpCisKKy8vCisvLyBIZWFkZXIgc2VjdGlvbgorLy8KKyV7CisjaW5jbHVkZSAicGpzdWEyLmhwcCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgcGo7CislfQorCisjaWZkZWYgU1dJR1BZVEhPTgorICAlZmVhdHVyZSgiZGlyZWN0b3I6ZXhjZXB0IikgeworICAgIGlmKCAkZXJyb3IgIT0gTlVMTCApIHsKKyAgICAgIFB5T2JqZWN0ICpwdHlwZSwgKnB2YWx1ZSwgKnB0cmFjZWJhY2s7CisgICAgICBQeUVycl9GZXRjaCggJnB0eXBlLCAmcHZhbHVlLCAmcHRyYWNlYmFjayApOworICAgICAgUHlFcnJfUmVzdG9yZSggcHR5cGUsIHB2YWx1ZSwgcHRyYWNlYmFjayApOworICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgIC8vUHlfRXhpdCgxKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisvLyBBbGxvdyBDKysgZXhjZXB0aW9ucyB0byBiZSBoYW5kbGVkIGluIEphdmEKKyNpZmRlZiBTV0lHSkFWQQorICAldHlwZW1hcCh0aHJvd3MsIHRocm93cz0iamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHBqOjpFcnJvciB7CisgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL0V4Y2VwdGlvbiIpOworICBpZiAoZXhjZXApCisgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLmluZm8odHJ1ZSkuY19zdHIoKSk7CisgIHJldHVybiAkbnVsbDsKK30KKworICAvLyBGb3JjZSB0aGUgRXJyb3IgSmF2YSBjbGFzcyB0byBleHRlbmQgamF2YS5sYW5nLkV4Y2VwdGlvbgorICAldHlwZW1hcChqYXZhYmFzZSkgcGo6OkVycm9yICJqYXZhLmxhbmcuRXhjZXB0aW9uIjsKKworICAvLyBPdmVycmlkZSBnZXRNZXNzYWdlKCkKKyAgJXR5cGVtYXAoamF2YWNvZGUpIHBqOjpFcnJvciAleworICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIGdldFRpdGxlKCk7CisgIH0KKyV9CisjZW5kaWYKKworCisvLyBDb25zdGFudHMgZnJvbSBQSlNJUCBsaWJyYXJpZXMKKyVpbmNsdWRlICJzeW1ib2xzLmkiCisKKworLy8KKy8vIENsYXNzZXMgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQorLy8KKyVmZWF0dXJlKCJkaXJlY3RvciIpIExvZ1dyaXRlcjsKKyVmZWF0dXJlKCJkaXJlY3RvciIpIEVuZHBvaW50OyAKKyVmZWF0dXJlKCJkaXJlY3RvciIpIEFjY291bnQ7CislZmVhdHVyZSgiZGlyZWN0b3IiKSBDYWxsOworJWZlYXR1cmUoImRpcmVjdG9yIikgQnVkZHk7CislZmVhdHVyZSgiZGlyZWN0b3IiKSBGaW5kQnVkZHlNYXRjaDsKKworLy8KKy8vIFNUTCBzdHVmZi4KKy8vCislaW5jbHVkZSAic3RkX3N0cmluZy5pIgorJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKKworJXRlbXBsYXRlKFN0cmluZ1ZlY3RvcikJCQlzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz47CisldGVtcGxhdGUoSW50VmVjdG9yKSAJCQlzdGQ6OnZlY3RvcjxpbnQ+OworCisvLworLy8gSWdub3JlIHN0dWZmcyBpbiBwanN1YTIKKy8vCislaWdub3JlIGZyb21QajsKKyVpZ25vcmUgdG9QajsKKworLy8KKy8vIE5vdyBpbmNsdWRlIHRoZSBBUEkgaXRzZWxmLgorLy8KKyVpbmNsdWRlICJwanN1YTIvdHlwZXMuaHBwIgorCislaWdub3JlIHBqOjpDb250YWluZXJOb2RlOjpvcDsKKyVpZ25vcmUgcGo6OkNvbnRhaW5lck5vZGU6OmRhdGE7CislaWdub3JlIGNvbnRhaW5lcl9ub2RlX29wOworJWlnbm9yZSBjb250YWluZXJfbm9kZV9pbnRlcm5hbF9kYXRhOworJWluY2x1ZGUgInBqc3VhMi9wZXJzaXN0ZW50LmhwcCIKKworJWluY2x1ZGUgInBqc3VhMi9zaXB0eXBlcy5ocHAiCisKKyV0ZW1wbGF0ZShTaXBIZWFkZXJWZWN0b3IpCQlzdGQ6OnZlY3Rvcjxwajo6U2lwSGVhZGVyPjsKKyV0ZW1wbGF0ZShBdXRoQ3JlZEluZm9WZWN0b3IpCQlzdGQ6OnZlY3Rvcjxwajo6QXV0aENyZWRJbmZvPjsKKyV0ZW1wbGF0ZShTaXBNdWx0aXBhcnRQYXJ0VmVjdG9yKQlzdGQ6OnZlY3Rvcjxwajo6U2lwTXVsdGlwYXJ0UGFydD47CisldGVtcGxhdGUoQnVkZHlWZWN0b3IpCQkJc3RkOjp2ZWN0b3I8cGo6OkJ1ZGR5Kj47CisldGVtcGxhdGUoQXVkaW9NZWRpYVZlY3RvcikJCXN0ZDo6dmVjdG9yPHBqOjpBdWRpb01lZGlhKj47CisldGVtcGxhdGUoTWVkaWFGb3JtYXRWZWN0b3IpCQlzdGQ6OnZlY3Rvcjxwajo6TWVkaWFGb3JtYXQqPjsKKyV0ZW1wbGF0ZShBdWRpb0RldkluZm9WZWN0b3IpCQlzdGQ6OnZlY3Rvcjxwajo6QXVkaW9EZXZJbmZvKj47CisldGVtcGxhdGUoQ29kZWNJbmZvVmVjdG9yKQkJc3RkOjp2ZWN0b3I8cGo6OkNvZGVjSW5mbyo+OworCislaW5jbHVkZSAicGpzdWEyL21lZGlhLmhwcCIKKyVpbmNsdWRlICJwanN1YTIvZW5kcG9pbnQuaHBwIgorJWluY2x1ZGUgInBqc3VhMi9wcmVzZW5jZS5ocHAiCislaW5jbHVkZSAicGpzdWEyL2FjY291bnQuaHBwIgorJWluY2x1ZGUgInBqc3VhMi9jYWxsLmhwcCIKKworJXRlbXBsYXRlKENhbGxNZWRpYUluZm9WZWN0b3IpICAgICAgICAgIHN0ZDo6dmVjdG9yPHBqOjpDYWxsTWVkaWFJbmZvPjsKKworJWlnbm9yZSBwajo6SnNvbkRvY3VtZW50OjphbGxvY0VsZW1lbnQ7CislaWdub3JlIHBqOjpKc29uRG9jdW1lbnQ6OmdldFBvb2w7CislaW5jbHVkZSAicGpzdWEyL2pzb24uaHBwIgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9weXRob24vTWFrZWZpbGUgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFmOWJmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9weXRob24vTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorUFlUSE9OX1NPPV9wanN1YTIuc28KKworI1BZVEhPTl9TRVRVUF9GTEFHUyA9IC0taW5wbGFjZSAKK2lmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCisgIFBZVEhPTl9TRVRVUF9GTEFHUyArPSAtLWNvbXBpbGVyPW1pbmd3MzIKK2VuZGlmCisKK1NXSUdfRkxBR1MgKz0gLXczMTIKKworLlBIT05ZOiBhbGwgaW5zdGFsbCB1bmluc3RhbGwKKworYWxsOiAkKFBZVEhPTl9TTykKKworJChQWVRIT05fU08pOiBwanN1YTJfd3JhcC5jcHAgc2V0dXAucHkKKwlweXRob24gc2V0dXAucHkgYnVpbGQgJChQWVRIT05fU0VUVVBfRkxBR1MpCisKK3Bqc3VhMl93cmFwLmNwcDogLi4vcGpzdWEyLmkgLi4vc3ltYm9scy5pIE1ha2VmaWxlICQoU1JDUykKKwlzd2lnICQoU1dJR19GTEFHUykgLXB5dGhvbiAgLW8gcGpzdWEyX3dyYXAuY3BwIC4uL3Bqc3VhMi5pCisKK2NsZWFuIGRpc3RjbGVhbiByZWFsY2xlYW46CisJcm0gLXJmICQoUFlUSE9OX1NPKSBwanN1YTJfd3JhcC5jcHAgcGpzdWEyX3dyYXAuaCBwanN1YTIucHkgYnVpbGQgKi5weWMKKworaW5zdGFsbDoKKwlweXRob24gc2V0dXAucHkgaW5zdGFsbCAtLXVzZXIKKwordW5pbnN0YWxsOgorCXJtIC1mICQoSE9NRSkvLmxvY2FsL2xpYi9weXRob24yLjcvc2l0ZS1wYWNrYWdlcy9wanN1YTIqCisJcm0gLWYgJChIT01FKS8ubG9jYWwvbGliL3B5dGhvbjIuNy9zaXRlLXBhY2thZ2VzL19wanN1YTIqCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvcHl0aG9uL2hlbHBlci5tYWsgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi9oZWxwZXIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi9oZWxwZXIubWFrCkBAIC0wLDAgKzEsMjAgQEAKK2luY2x1ZGUgLi4vLi4vLi4vLi4vYnVpbGQubWFrCisKK2xpYl9kaXI6CisJQGZvciB0b2tlbiBpbiBgZWNobyAkKEFQUF9MREZMQUdTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBMIHwgc2VkICdzLy1MLy8nOyBcCisJZG9uZQorCitpbmNfZGlyOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfQ0ZMQUdTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBJIHwgc2VkICdzLy1JLy8nOyBcCisJZG9uZQorCitsaWJzOgorCUBmb3IgdG9rZW4gaW4gYGVjaG8gJChBUFBfTERMSUJTKWA7IGRvIFwKKwkJZWNobyAkJHRva2VuIHwgZ3JlcCBcXC1sIHwgc2VkICdzLy1sLy8nOyBcCisJZG9uZQorCit0YXJnZXRfbmFtZToKKwlAZWNobyAkKFRBUkdFVF9OQU1FKQorCQpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9weXRob24vc2V0dXAucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGNjYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9weXRob24vc2V0dXAucHkKQEAgLTAsMCArMSwxMTggQEAKKyMgJElkOiBzZXR1cC5weSA0NzA0IDIwMTQtMDEtMTYgMDU6MzA6NDZaIG1pbmcgJAorIworIyBwanN1YTIgU2V0dXAgc2NyaXB0LgorIworIyBDb3B5cmlnaHQgKEMpMjAxMiBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyMKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHBsYXRmb3JtCisKKyMgZmluZCBwanNpcCB2ZXJzaW9uCitwal92ZXJzaW9uPSIiCitwal92ZXJzaW9uX21ham9yPSIiCitwal92ZXJzaW9uX21pbm9yPSIiCitwal92ZXJzaW9uX3Jldj0iIgorcGpfdmVyc2lvbl9zdWZmaXg9IiIKK2YgPSBvcGVuKCcuLi8uLi8uLi8uLi92ZXJzaW9uLm1haycsICdyJykKK2ZvciBsaW5lIGluIGY6CisgICAgaWYgbGluZS5maW5kKCJleHBvcnQgUEpfVkVSU0lPTl9NQUpPUiIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9tYWpvcj0gdG9rZW5zWzFdLnN0cmlwKCkKKyAgICBlbGlmIGxpbmUuZmluZCgiZXhwb3J0IFBKX1ZFUlNJT05fTUlOT1IiKSAhPSAtMToKKyAgICAJdG9rZW5zPWxpbmUuc3BsaXQoIj0iKQorCWlmIGxlbih0b2tlbnMpPjE6CisJCXBqX3ZlcnNpb25fbWlub3I9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLmZpbmQoImV4cG9ydCBQSl9WRVJTSU9OX1JFViIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9yZXY9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisgICAgZWxpZiBsaW5lLmZpbmQoImV4cG9ydCBQSl9WRVJTSU9OX1NVRkZJWCIpICE9IC0xOgorICAgIAl0b2tlbnM9bGluZS5zcGxpdCgiPSIpCisJaWYgbGVuKHRva2Vucyk+MToKKwkJcGpfdmVyc2lvbl9zdWZmaXg9IGxpbmUuc3BsaXQoIj0iKVsxXS5zdHJpcCgpCisKK2YuY2xvc2UoKQoraWYgbm90IHBqX3ZlcnNpb25fbWFqb3I6CisgICAgcHJpbnQgJ1VuYWJsZSB0byBnZXQgUEpfVkVSU0lPTl9NQUpPUicKKyAgICBzeXMuZXhpdCgxKQorCitwal92ZXJzaW9uID0gcGpfdmVyc2lvbl9tYWpvciArICIuIiArIHBqX3ZlcnNpb25fbWlub3IKK2lmIHBqX3ZlcnNpb25fcmV2OgorCXBqX3ZlcnNpb24gKz0gIi4iICsgcGpfdmVyc2lvbl9yZXYKK2lmIHBqX3ZlcnNpb25fc3VmZml4OgorCXBqX3ZlcnNpb24gKz0gIi0iICsgcGpfdmVyc2lvbl9zdWZmaXgKKworI3ByaW50ICdQSl9WRVJTSU9OID0gIicrIHBqX3ZlcnNpb24gKyAnIicKKworIyBHZXQgdGFyZ2V0bmFtZQorZiA9IG9zLnBvcGVuKCJtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGhlbHBlci5tYWsgdGFyZ2V0X25hbWUiKQorcGpfdGFyZ2V0X25hbWUgPSBmLnJlYWQoKS5yc3RyaXAoIlxyXG4iKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9pbmNfZGlycworcGpfaW5jX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGhlbHBlci5tYWsgaW5jX2RpciIpCitmb3IgbGluZSBpbiBmOgorICAgIHBqX2luY19kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJfZGlycworcGpfbGliX2RpcnMgPSBbXQorZiA9IG9zLnBvcGVuKCJtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGhlbHBlci5tYWsgbGliX2RpciIpCitmb3IgbGluZSBpbiBmOgorICAgIHBqX2xpYl9kaXJzLmFwcGVuZChsaW5lLnJzdHJpcCgiXHJcbiIpKQorZi5jbG9zZSgpCisKKyMgRmlsbCBpbiBwal9saWJzCitwal9saWJzID0gWydwanN1YTItJyArIHBqX3RhcmdldF9uYW1lXQorZiA9IG9zLnBvcGVuKCJtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGhlbHBlci5tYWsgbGlicyIpCitmb3IgbGluZSBpbiBmOgorICAgIHBqX2xpYnMuYXBwZW5kKGxpbmUucnN0cmlwKCJcclxuIikpCitmLmNsb3NlKCkKKworIyBGaWxsIGluIGV4dHJhIGxpbmsgYXJncworZXh0cmFfbGlua19hcmdzID0gWyctc3RhdGljLWxpYnN0ZGMrKyddCitpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnRGFyd2luJzoKKyAgICAjIE1hYyBPUyBYIGRlcGVkZW5jaWVzCisgICAgZXh0cmFfbGlua19hcmdzICs9IFsiLWZyYW1ld29yayIsICJDb3JlRm91bmRhdGlvbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIi1mcmFtZXdvcmsiLCAiQXVkaW9Ub29sYm94IiwKKwkJCSItZnJhbWV3b3JrIiwgIlFUS2l0Il0KKyAgICAjIE9TIFggTGlvbiBzdXBwb3J0CisgICAgaWYgcGxhdGZvcm0ubWFjX3ZlcigpWzBdLnN0YXJ0c3dpdGgoIjEwLjciKToKKyAgICAgICAgZXh0cmFfbGlua19hcmdzICs9IFsiLWZyYW1ld29yayIsICJBdWRpb1VuaXQiXQorCisKK3NldHVwKG5hbWU9InBqc3VhMiIsIAorICAgICAgdmVyc2lvbj1wal92ZXJzaW9uLAorICAgICAgZGVzY3JpcHRpb249J1NJUCBVc2VyIEFnZW50IExpYnJhcnkgYmFzZWQgb24gUEpTSVAnLAorICAgICAgdXJsPSdodHRwOi8vd3d3LnBqc2lwLm9yZycsCisgICAgICBleHRfbW9kdWxlcyA9IFtFeHRlbnNpb24oIl9wanN1YTIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbInBqc3VhMl93cmFwLmNwcCJdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zPVsoJ1BKX0FVVE9DT05GJywgJzEnKSxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1wal9pbmNfZGlycywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPXBqX2xpYl9kaXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9cGpfbGlicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9ZXh0cmFfbGlua19hcmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICBweV9tb2R1bGVzPVsicGpzdWEyIl0KKyAgICAgKQorCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvcHl0aG9uL3Rlc3QucHkgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODA1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3B5dGhvbi90ZXN0LnB5CkBAIC0wLDAgKzEsMTEyIEBACitpbXBvcnQgcGpzdWEyIGFzIHBqCitpbXBvcnQgc3lzCisKKyMKKyMgQmFzaWMgZGF0YSBzdHJ1Y3R1cmUgdGVzdCwgdG8gbWFrZSBzdXJlIGJhc2ljIHN0cnVjdAorIyBhbmQgYXJyYXkgb3BlcmF0aW9ucyB3b3JrCisjCitkZWYgdWFfZGF0YV90ZXN0KCk6CisJIworCSMgQXV0aENyZWRJbmZvCisJIworCXByaW50ICJVQSBkYXRhIHR5cGVzIHRlc3QuLiIKKwl0aGVfcmVhbG0gPSAicGpzaXAub3JnIgorCWNpID0gcGouQXV0aENyZWRJbmZvKCkKKwljaS5yZWFsbSA9IHRoZV9yZWFsbQorCWNpLmRhdGFUeXBlID0gMjAKKwkKKwljaTIgPSBjaQorCWFzc2VydCBjaS5kYXRhVHlwZSA9PSAyMAorCWFzc2VydCBjaTIucmVhbG0gPT0gdGhlX3JlYWxtCisJCisJIworCSMgVWFDb25maWcKKwkjIFNlZSBoZXJlIGhvdyB3ZSBtYW5pcHVsYXRlIHN0ZDo6dmVjdG9yCisJIworCXVjID0gcGouVWFDb25maWcoKQorCXVjLm1heENhbGxzID0gMTAKKwl1Yy51c2VyQWdlbnQgPSAiUHl0aG9uIgorCXVjLm5hbWVzZXJ2ZXIgPSBwai5TdHJpbmdWZWN0b3IoWyIxMC4wLjAuMSIsICIxMC4wLjAuMiJdKQorCXVjLm5hbWVzZXJ2ZXIuYXBwZW5kKCJOUzEiKQorCQorCXVjMiA9IHVjCisJYXNzZXJ0IHVjMi5tYXhDYWxscyA9PSAxMAorCWFzc2VydCB1YzIudXNlckFnZW50ID09ICJQeXRob24iCisJYXNzZXJ0IGxlbih1YzIubmFtZXNlcnZlcikgPT0gMworCWFzc2VydCB1YzIubmFtZXNlcnZlclswXSA9PSAiMTAuMC4wLjEiCisJYXNzZXJ0IHVjMi5uYW1lc2VydmVyWzFdID09ICIxMC4wLjAuMiIKKwlhc3NlcnQgdWMyLm5hbWVzZXJ2ZXJbMl0gPT0gIk5TMSIKKworCXByaW50ICIgIER1bXBpbmcgbmFtZXNlcnZlcnM6ICIsCisJZm9yIHMgaW4gdWMyLm5hbWVzZXJ2ZXI6CisJCXByaW50IHMsCisJcHJpbnQgIiIKKworIworIyBFeGNlcHRpb24gdGVzdAorIworZGVmIHVhX3J1bl90ZXN0X2V4Y2VwdGlvbigpOgorCXByaW50ICJFeGNlcHRpb24gdGVzdC4uIgorCWVwID0gcGouRW5kcG9pbnQoKQorCWVwLmxpYkNyZWF0ZSgpCisJZ290X2V4Y2VwdGlvbiA9IEZhbHNlCisJdHJ5OgorCQllcC5uYXREZXRlY3RUeXBlKCkKKwlleGNlcHQgcGouRXJyb3IsIGU6CisJCWdvdF9leGNlcHRpb24gPSBUcnVlCisJCXByaW50ICIgIEdvdCBleGNlcHRpb246IHN0YXR1cz0ldSwgcmVhc29uPSVzLFxuICB0aXRsZT0lcyxcbiAgc3JjRmlsZT0lcywgc3JjTGluZT0lZCIgJSBcCisJCQkoZS5zdGF0dXMsIGUucmVhc29uLCBlLnRpdGxlLCBlLnNyY0ZpbGUsIGUuc3JjTGluZSkKKwkJYXNzZXJ0IGUuc3RhdHVzID09IDM3MDA1MAorCQlhc3NlcnQgZS5yZWFzb24uZmluZCgiUEpOQVRIX0VTVFVOSU5TRVJWRVIiKSA+PSAwCisJCWFzc2VydCBlLnRpdGxlID09ICJwanN1YV9kZXRlY3RfbmF0X3R5cGUoKSIKKwlhc3NlcnQgZ290X2V4Y2VwdGlvbgorCisjCisjIEN1c3RvbSBsb2cgd3JpdGVyCisjCitjbGFzcyBNeUxvZ1dyaXRlcihwai5Mb2dXcml0ZXIpOgorCWRlZiB3cml0ZShzZWxmLCBlbnRyeSk6CisJCXByaW50ICJUaGlzIGlzIFB5dGhvbjoiLCBlbnRyeS5tc2cKKwkJCisjCisjIFRlc3RpbmcgbG9nIHdyaXRlciBjYWxsYmFjaworIworZGVmIHVhX3J1bl9sb2dfdGVzdCgpOgorCXByaW50ICJMb2dnaW5nIHRlc3QuLiIKKwllcF9jZmcgPSBwai5FcENvbmZpZygpCisJCisJbHcgPSBNeUxvZ1dyaXRlcigpCisJZXBfY2ZnLmxvZ0NvbmZpZy53cml0ZXIgPSBsdworCWVwX2NmZy5sb2dDb25maWcuZGVjb3IgPSBlcF9jZmcubG9nQ29uZmlnLmRlY29yICYgfihwai5QSl9MT0dfSEFTX0NSIHwgcGouUEpfTE9HX0hBU19ORVdMSU5FKSAKKwkKKwllcCA9IHBqLkVuZHBvaW50KCkKKwllcC5saWJDcmVhdGUoKQorCWVwLmxpYkluaXQoZXBfY2ZnKQorCWVwLmxpYkRlc3Ryb3koKQorCQorIworIyBTaW1wbGUgY3JlYXRlLCBpbml0LCBzdGFydCwgYW5kIGRlc3Ryb3kgc2VxdWVuY2UKKyMKK2RlZiB1YV9ydW5fdWFfdGVzdCgpOgorCXByaW50ICJVQSB0ZXN0IHJ1bi4uIgorCWVwX2NmZyA9IHBqLkVwQ29uZmlnKCkKKwkKKwllcCA9IHBqLkVuZHBvaW50KCkKKwllcC5saWJDcmVhdGUoKQorCWVwLmxpYkluaXQoZXBfY2ZnKQorCWVwLmxpYlN0YXJ0KCkKKwkKKwlwcmludCAiKioqKioqKioqKioqKiBFbmRwb2ludCBzdGFydGVkIG9rLCBub3cgc2h1dHRpbmcgZG93bi4uLiAqKioqKioqKioqKioqIgorCWVwLmxpYkRlc3Ryb3koKQorCisjCisjIG1haW4oKQorIworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKwl1YV9kYXRhX3Rlc3QoKQorCXVhX3J1bl90ZXN0X2V4Y2VwdGlvbigpCisJdWFfcnVuX2xvZ190ZXN0KCkKKwl1YV9ydW5fdWFfdGVzdCgpCisJc3lzLmV4aXQoMCkKKworCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvc3ltYm9scy5pIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3dpZy9zeW1ib2xzLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwMWU3NwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvc3ltYm9scy5pCkBAIC0wLDAgKzEsMTMwIEBACisvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBpbXBvcnRzeW0gc2NyaXB0LCBkbyBub3QgbW9kaWZ5IQorCit0eXBlZGVmIGludCBwal9zdGF0dXNfdDsKKworZW51bSBwal9jb25zdGFudHNfIHtQSl9TVUNDRVNTID0gMCwgUEpfVFJVRSA9IDEsIFBKX0ZBTFNFID0gMH07CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBwal91aW50OF90OworCit0eXBlZGVmIGludCBwal9pbnQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGludCBwal91aW50MzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwal91aW50MTZfdDsKKworZW51bSBwal9maWxlX2FjY2VzcyB7UEpfT19SRE9OTFkgPSAweDExMDEsIFBKX09fV1JPTkxZID0gMHgxMTAyLCBQSl9PX1JEV1IgPSAweDExMDMsIFBKX09fQVBQRU5EID0gMHgxMTA4fTsKKworZW51bSBwal9sb2dfZGVjb3JhdGlvbiB7UEpfTE9HX0hBU19EQVlfTkFNRSA9IDEsIFBKX0xPR19IQVNfWUVBUiA9IDIsIFBKX0xPR19IQVNfTU9OVEggPSA0LCBQSl9MT0dfSEFTX0RBWV9PRl9NT04gPSA4LCBQSl9MT0dfSEFTX1RJTUUgPSAxNiwgUEpfTE9HX0hBU19NSUNST19TRUMgPSAzMiwgUEpfTE9HX0hBU19TRU5ERVIgPSA2NCwgUEpfTE9HX0hBU19ORVdMSU5FID0gMTI4LCBQSl9MT0dfSEFTX0NSID0gMjU2LCBQSl9MT0dfSEFTX1NQQUNFID0gNTEyLCBQSl9MT0dfSEFTX0NPTE9SID0gMTAyNCwgUEpfTE9HX0hBU19MRVZFTF9URVhUID0gMjA0OCwgUEpfTE9HX0hBU19USFJFQURfSUQgPSA0MDk2LCBQSl9MT0dfSEFTX1RIUkVBRF9TV0MgPSA4MTkyLCBQSl9MT0dfSEFTX0lOREVOVCA9IDE2Mzg0fTsKKwordHlwZWRlZiBlbnVtIHBqX3Fvc190eXBlIHtQSl9RT1NfVFlQRV9CRVNUX0VGRk9SVCwgUEpfUU9TX1RZUEVfQkFDS0dST1VORCwgUEpfUU9TX1RZUEVfVklERU8sIFBKX1FPU19UWVBFX1ZPSUNFLCBQSl9RT1NfVFlQRV9DT05UUk9MfSBwal9xb3NfdHlwZTsKKwordHlwZWRlZiBlbnVtIHBqX3Fvc19mbGFnIHtQSl9RT1NfUEFSQU1fSEFTX0RTQ1AgPSAxLCBQSl9RT1NfUEFSQU1fSEFTX1NPX1BSSU8gPSAyLCBQSl9RT1NfUEFSQU1fSEFTX1dNTSA9IDR9IHBqX3Fvc19mbGFnOworCit0eXBlZGVmIGVudW0gcGpfcW9zX3dtbV9wcmlvIHtQSl9RT1NfV01NX1BSSU9fQlVMS19FRkZPUlQsIFBKX1FPU19XTU1fUFJJT19CVUxLLCBQSl9RT1NfV01NX1BSSU9fVklERU8sIFBKX1FPU19XTU1fUFJJT19WT0lDRX0gcGpfcW9zX3dtbV9wcmlvOworCit0eXBlZGVmIHN0cnVjdCBwal9xb3NfcGFyYW1zCit7CisgIHBqX3VpbnQ4X3QgZmxhZ3M7CisgIHBqX3VpbnQ4X3QgZHNjcF92YWw7CisgIHBqX3VpbnQ4X3Qgc29fcHJpbzsKKyAgcGpfcW9zX3dtbV9wcmlvIHdtbV9wcmlvOworfSBwal9xb3NfcGFyYW1zOworCit0eXBlZGVmIGVudW0gcGpfc3NsX2NpcGhlciB7UEpfVExTX05VTExfV0lUSF9OVUxMX05VTEwgPSAweDAwMDAwMDAwLCBQSl9UTFNfUlNBX1dJVEhfTlVMTF9NRDUgPSAweDAwMDAwMDAxLCBQSl9UTFNfUlNBX1dJVEhfTlVMTF9TSEEgPSAweDAwMDAwMDAyLCBQSl9UTFNfUlNBX1dJVEhfTlVMTF9TSEEyNTYgPSAweDAwMDAwMDNCLCBQSl9UTFNfUlNBX1dJVEhfUkM0XzEyOF9NRDUgPSAweDAwMDAwMDA0LCBQSl9UTFNfUlNBX1dJVEhfUkM0XzEyOF9TSEEgPSAweDAwMDAwMDA1LCBQSl9UTFNfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSA9IDB4MDAwMDAwMEEsIFBKX1RMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMDAwMDJGLCBQSl9UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDAwMDAzNSwgUEpfVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwM0MsIFBKX1RMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwMDAwMDNELCBQSl9UTFNfREhfRFNTX1dJVEhfM0RFU19FREVfQ0JDX1NIQSA9IDB4MDAwMDAwMEQsIFBKX1RMU19ESF9SU0FfV0lUSF8zREVTX0VERV9DQkNfU0hBID0gMHgwMDAwMDAxMCwgUEpfVExTX0RIRV9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBID0gMHgwMDAwMDAxMywgUEpfVExTX0RIRV9SU0FfV0lUSF8zREVTX0VERV9DQkNfU0hBID0gMHgwMDAwMDAxNiwgUEpfVExTX0RIX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAwMDAwMzAsIFBKX1RMU19ESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMDAwMDMxLCBQSl9UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAwMDAwMzIsIFBKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDAwMDAzMywgUEpfVExTX0RIX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAwMDAwMzYsIFBKX1RMU19ESF9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMDAwMDM3LCBQSl9UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAwMDAwMzgsIFBKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDAwMDAzOSwgUEpfVExTX0RIX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwM0UsIFBKX1RMU19ESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwMDAwMDNGLCBQSl9UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwNDAsIFBKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDAwMDA2NywgUEpfVExTX0RIX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwNjgsIFBKX1RMU19ESF9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwMDAwMDY5LCBQSl9UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwNkEsIFBKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDAwMDA2QiwgUEpfVExTX0RIX2Fub25fV0lUSF9SQzRfMTI4X01ENSA9IDB4MDAwMDAwMTgsIFBKX1RMU19ESF9hbm9uX1dJVEhfM0RFU19FREVfQ0JDX1NIQSA9IDB4MDAwMDAwMUIsIFBKX1RMU19ESF9hbm9uX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDAwMDAzNCwgUEpfVExTX0RIX2Fub25fV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMDAwMDNBLCBQSl9UTFNfREhfYW5vbl9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDAwMDAwNkMsIFBKX1RMU19ESF9hbm9uX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDAwMDA2RCwgUEpfVExTX1JTQV9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1ID0gMHgwMDAwMDAwMywgUEpfVExTX1JTQV9FWFBPUlRfV0lUSF9SQzJfQ0JDXzQwX01ENSA9IDB4MDAwMDAwMDYsIFBKX1RMU19SU0FfV0lUSF9JREVBX0NCQ19TSEEgPSAweDAwMDAwMDA3LCBQSl9UTFNfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEgPSAweDAwMDAwMDA4LCBQSl9UTFNfUlNBX1dJVEhfREVTX0NCQ19TSEEgPSAweDAwMDAwMDA5LCBQSl9UTFNfREhfRFNTX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEgPSAweDAwMDAwMDBCLCBQSl9UTFNfREhfRFNTX1dJVEhfREVTX0NCQ19TSEEgPSAweDAwMDAwMDBDLCBQSl9UTFNfREhfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEgPSAweDAwMDAwMDBFLCBQSl9UTFNfREhfUlNBX1dJVEhfREVTX0NCQ19TSEEgPSAweDAwMDAwMDBGLCBQSl9UTFNfREhFX0RTU19FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBID0gMHgwMDAwMDAxMSwgUEpfVExTX0RIRV9EU1NfV0lUSF9ERVNfQ0JDX1NIQSA9IDB4MDAwMDAwMTIsIFBKX1RMU19ESEVfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEgPSAweDAwMDAwMDE0LCBQSl9UTFNfREhFX1JTQV9XSVRIX0RFU19DQkNfU0hBID0gMHgwMDAwMDAxNSwgUEpfVExTX0RIX2Fub25fRVhQT1JUX1dJVEhfUkM0XzQwX01ENSA9IDB4MDAwMDAwMTcsIFBKX1RMU19ESF9hbm9uX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEgPSAweDAwMDAwMDE5LCBQSl9UTFNfREhfYW5vbl9XSVRIX0RFU19DQkNfU0hBID0gMHgwMDAwMDAxQSwgUEpfU1NMX0ZPUlRFWlpBX0tFQV9XSVRIX05VTExfU0hBID0gMHgwMDAwMDAxQywgUEpfU1NMX0ZPUlRFWlpBX0tFQV9XSVRIX0ZPUlRFWlpBX0NCQ19TSEEgPSAweDAwMDAwMDFELCBQSl9TU0xfRk9SVEVaWkFfS0VBX1dJVEhfUkM0XzEyOF9TSEEgPSAweDAwMDAwMDFFLCBQSl9TU0xfQ0tfUkM0XzEyOF9XSVRIX01ENSA9IDB4MDAwMTAwODAsIFBKX1NTTF9DS19SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1ID0gMHgwMDAyMDA4MCwgUEpfU1NMX0NLX1JDMl8xMjhfQ0JDX1dJVEhfTUQ1ID0gMHgwMDAzMDA4MCwgUEpfU1NMX0NLX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1ID0gMHgwMDA0MDA4MCwgUEpfU1NMX0NLX0lERUFfMTI4X0NCQ19XSVRIX01ENSA9IDB4MDAwNTAwODAsIFBKX1NTTF9DS19ERVNfNjRfQ0JDX1dJVEhfTUQ1ID0gMHgwMDA2MDA0MCwgUEpfU1NMX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUgPSAweDAwMDcwMEMwfSBwal9zc2xfY2lwaGVyOworCit0eXBlZGVmIGVudW0gcGpfc3R1bl9uYXRfdHlwZSB7UEpfU1RVTl9OQVRfVFlQRV9VTktOT1dOLCBQSl9TVFVOX05BVF9UWVBFX0VSUl9VTktOT1dOLCBQSl9TVFVOX05BVF9UWVBFX09QRU4sIFBKX1NUVU5fTkFUX1RZUEVfQkxPQ0tFRCwgUEpfU1RVTl9OQVRfVFlQRV9TWU1NRVRSSUNfVURQLCBQSl9TVFVOX05BVF9UWVBFX0ZVTExfQ09ORSwgUEpfU1RVTl9OQVRfVFlQRV9TWU1NRVRSSUMsIFBKX1NUVU5fTkFUX1RZUEVfUkVTVFJJQ1RFRCwgUEpfU1RVTl9OQVRfVFlQRV9QT1JUX1JFU1RSSUNURUR9IHBqX3N0dW5fbmF0X3R5cGU7CisKK3R5cGVkZWYgZW51bSBwal90dXJuX3RwX3R5cGUge1BKX1RVUk5fVFBfVURQID0gMTcsIFBKX1RVUk5fVFBfVENQID0gNiwgUEpfVFVSTl9UUF9UTFMgPSAyNTV9IHBqX3R1cm5fdHBfdHlwZTsKKwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZXZlbnRfdHlwZSB7UEpNRURJQV9FVkVOVF9OT05FLCBQSk1FRElBX0VWRU5UX0ZNVF9DSEFOR0VEID0gKCgoJ0gnIDw8IDI0KSB8ICgnQycgPDwgMTYpKSB8ICgnTScgPDwgOCkpIHwgJ0YnLCBQSk1FRElBX0VWRU5UX1dORF9DTE9TSU5HID0gKCgoJ0wnIDw8IDI0KSB8ICgnQycgPDwgMTYpKSB8ICgnTicgPDwgOCkpIHwgJ1cnLCBQSk1FRElBX0VWRU5UX1dORF9DTE9TRUQgPSAoKCgnTycgPDwgMjQpIHwgKCdDJyA8PCAxNikpIHwgKCdOJyA8PCA4KSkgfCAnVycsIFBKTUVESUFfRVZFTlRfV05EX1JFU0laRUQgPSAoKCgnWicgPDwgMjQpIHwgKCdSJyA8PCAxNikpIHwgKCdOJyA8PCA4KSkgfCAnVycsIFBKTUVESUFfRVZFTlRfTU9VU0VfQlROX0RPV04gPSAoKCgnTicgPDwgMjQpIHwgKCdEJyA8PCAxNikpIHwgKCdTJyA8PCA4KSkgfCAnTScsIFBKTUVESUFfRVZFTlRfS0VZRlJBTUVfRk9VTkQgPSAoKCgnRicgPDwgMjQpIHwgKCdSJyA8PCAxNikpIHwgKCdGJyA8PCA4KSkgfCAnSScsIFBKTUVESUFfRVZFTlRfS0VZRlJBTUVfTUlTU0lORyA9ICgoKCdNJyA8PCAyNCkgfCAoJ1InIDw8IDE2KSkgfCAoJ0YnIDw8IDgpKSB8ICdJJywgUEpNRURJQV9FVkVOVF9PUklFTlRfQ0hBTkdFRCA9ICgoKCdUJyA8PCAyNCkgfCAoJ04nIDw8IDE2KSkgfCAoJ1InIDw8IDgpKSB8ICdPJ30gcGptZWRpYV9ldmVudF90eXBlOworCit0eXBlZGVmIGVudW0gcGptZWRpYV9zcnRwX3VzZSB7UEpNRURJQV9TUlRQX0RJU0FCTEVELCBQSk1FRElBX1NSVFBfT1BUSU9OQUwsIFBKTUVESUFfU1JUUF9NQU5EQVRPUll9IHBqbWVkaWFfc3J0cF91c2U7CisKK3R5cGVkZWYgZW51bSBwam1lZGlhX3ZpZF9zdHJlYW1fcmNfbWV0aG9kIHtQSk1FRElBX1ZJRF9TVFJFQU1fUkNfTk9ORSA9IDAsIFBKTUVESUFfVklEX1NUUkVBTV9SQ19TSU1QTEVfQkxPQ0tJTkcgPSAxfSBwam1lZGlhX3ZpZF9zdHJlYW1fcmNfbWV0aG9kOworCit0eXBlZGVmIHBqX2ludDMyX3QgcGptZWRpYV92aWRfZGV2X2luZGV4OworCitlbnVtIHBqbWVkaWFfdmlkX2Rldl9zdGRfaW5kZXgge1BKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVYgPSAtMSwgUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWID0gLTIsIFBKTUVESUFfVklEX0lOVkFMSURfREVWID0gLTN9OworCit0eXBlZGVmIGVudW0gcGptZWRpYV9hdWRfZGV2X3JvdXRlIHtQSk1FRElBX0FVRF9ERVZfUk9VVEVfREVGQVVMVCA9IDAsIFBKTUVESUFfQVVEX0RFVl9ST1VURV9MT1VEU1BFQUtFUiA9IDEsIFBKTUVESUFfQVVEX0RFVl9ST1VURV9FQVJQSUVDRSA9IDIsIFBKTUVESUFfQVVEX0RFVl9ST1VURV9CTFVFVE9PVEggPSA0fSBwam1lZGlhX2F1ZF9kZXZfcm91dGU7CisKK3R5cGVkZWYgZW51bSBwam1lZGlhX2F1ZF9kZXZfY2FwIHtQSk1FRElBX0FVRF9ERVZfQ0FQX0VYVF9GT1JNQVQgPSAxLCBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX0xBVEVOQ1kgPSAyLCBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9MQVRFTkNZID0gNCwgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORyA9IDgsIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HID0gMTYsIFBKTUVESUFfQVVEX0RFVl9DQVBfSU5QVVRfU0lHTkFMX01FVEVSID0gMzIsIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1NJR05BTF9NRVRFUiA9IDY0LCBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX1JPVVRFID0gMTI4LCBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9ST1VURSA9IDI1NiwgUEpNRURJQV9BVURfREVWX0NBUF9FQyA9IDUxMiwgUEpNRURJQV9BVURfREVWX0NBUF9FQ19UQUlMID0gMTAyNCwgUEpNRURJQV9BVURfREVWX0NBUF9WQUQgPSAyMDQ4LCBQSk1FRElBX0FVRF9ERVZfQ0FQX0NORyA9IDQwOTYsIFBKTUVESUFfQVVEX0RFVl9DQVBfUExDID0gODE5MiwgUEpNRURJQV9BVURfREVWX0NBUF9NQVggPSAxNjM4NH0gcGptZWRpYV9hdWRfZGV2X2NhcDsKKworZW51bSBwam1lZGlhX2ZpbGVfd3JpdGVyX29wdGlvbiB7UEpNRURJQV9GSUxFX1dSSVRFX1BDTSA9IDAsIFBKTUVESUFfRklMRV9XUklURV9BTEFXID0gMSwgUEpNRURJQV9GSUxFX1dSSVRFX1VMQVcgPSAyfTsKKworZW51bSBwam1lZGlhX2ZpbGVfcGxheWVyX29wdGlvbiB7UEpNRURJQV9GSUxFX05PX0xPT1AgPSAxfTsKKwordHlwZWRlZiBlbnVtIHBqbWVkaWFfdHlwZSB7UEpNRURJQV9UWVBFX05PTkUsIFBKTUVESUFfVFlQRV9BVURJTywgUEpNRURJQV9UWVBFX1ZJREVPLCBQSk1FRElBX1RZUEVfQVBQTElDQVRJT04sIFBKTUVESUFfVFlQRV9VTktOT1dOfSBwam1lZGlhX3R5cGU7CisKK3R5cGVkZWYgZW51bSBwam1lZGlhX2RpciB7UEpNRURJQV9ESVJfTk9ORSA9IDAsIFBKTUVESUFfRElSX0VOQ09ESU5HID0gMSwgUEpNRURJQV9ESVJfQ0FQVFVSRSA9IFBKTUVESUFfRElSX0VOQ09ESU5HLCBQSk1FRElBX0RJUl9ERUNPRElORyA9IDIsIFBKTUVESUFfRElSX1BMQVlCQUNLID0gUEpNRURJQV9ESVJfREVDT0RJTkcsIFBKTUVESUFfRElSX1JFTkRFUiA9IFBKTUVESUFfRElSX0RFQ09ESU5HLCBQSk1FRElBX0RJUl9FTkNPRElOR19ERUNPRElORyA9IDMsIFBKTUVESUFfRElSX0NBUFRVUkVfUExBWUJBQ0sgPSBQSk1FRElBX0RJUl9FTkNPRElOR19ERUNPRElORywgUEpNRURJQV9ESVJfQ0FQVFVSRV9SRU5ERVIgPSBQSk1FRElBX0RJUl9FTkNPRElOR19ERUNPRElOR30gcGptZWRpYV9kaXI7CisKK3R5cGVkZWYgZW51bSBwam1lZGlhX3RwX3Byb3RvIHtQSk1FRElBX1RQX1BST1RPX05PTkUgPSAwLCBQSk1FRElBX1RQX1BST1RPX1JUUF9BVlAsIFBKTUVESUFfVFBfUFJPVE9fUlRQX1NBVlAsIFBKTUVESUFfVFBfUFJPVE9fVU5LTk9XTn0gcGptZWRpYV90cF9wcm90bzsKKwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZm9ybWF0X2lkIHtQSk1FRElBX0ZPUk1BVF9MMTYgPSAwLCBQSk1FRElBX0ZPUk1BVF9QQ00gPSBQSk1FRElBX0ZPUk1BVF9MMTYsIFBKTUVESUFfRk9STUFUX1BDTUEgPSAoKCgnVycgPDwgMjQpIHwgKCdBJyA8PCAxNikpIHwgKCdMJyA8PCA4KSkgfCAnQScsIFBKTUVESUFfRk9STUFUX0FMQVcgPSBQSk1FRElBX0ZPUk1BVF9QQ01BLCBQSk1FRElBX0ZPUk1BVF9QQ01VID0gKCgoJ1cnIDw8IDI0KSB8ICgnQScgPDwgMTYpKSB8ICgnTCcgPDwgOCkpIHwgJ3UnLCBQSk1FRElBX0ZPUk1BVF9VTEFXID0gUEpNRURJQV9GT1JNQVRfUENNVSwgUEpNRURJQV9GT1JNQVRfQU1SID0gKCgoJ1InIDw8IDI0KSB8ICgnTScgPDwgMTYpKSB8ICgnQScgPDwgOCkpIHwgJyAnLCBQSk1FRElBX0ZPUk1BVF9HNzI5ID0gKCgoJzknIDw8IDI0KSB8ICgnMicgPDwgMTYpKSB8ICgnNycgPDwgOCkpIHwgJ0cnLCBQSk1FRElBX0ZPUk1BVF9JTEJDID0gKCgoJ0MnIDw8IDI0KSB8ICgnQicgPDwgMTYpKSB8ICgnTCcgPDwgOCkpIHwgJ0knLCBQSk1FRElBX0ZPUk1BVF9SR0IyNCA9ICgoKCczJyA8PCAyNCkgfCAoJ0InIDw8IDE2KSkgfCAoJ0cnIDw8IDgpKSB8ICdSJywgUEpNRURJQV9GT1JNQVRfUkdCQSA9ICgoKCdBJyA8PCAyNCkgfCAoJ0InIDw8IDE2KSkgfCAoJ0cnIDw8IDgpKSB8ICdSJywgUEpNRURJQV9GT1JNQVRfQkdSQSA9ICgoKCdBJyA8PCAyNCkgfCAoJ1InIDw8IDE2KSkgfCAoJ0cnIDw8IDgpKSB8ICdCJywgUEpNRURJQV9GT1JNQVRfUkdCMzIgPSBQSk1FRElBX0ZPUk1BVF9SR0JBLCBQSk1FRElBX0ZPUk1BVF9ESUIgPSAoKCgnICcgPDwgMjQpIHwgKCdCJyA8PCAxNikpIHwgKCdJJyA8PCA4KSkgfCAnRCcsIFBKTUVESUFfRk9STUFUX0dCUlAgPSAoKCgnUCcgPDwgMjQpIHwgKCdSJyA8PCAxNikpIHwgKCdCJyA8PCA4KSkgfCAnRycsIFBKTUVESUFfRk9STUFUX0FZVVYgPSAoKCgnVicgPDwgMjQpIHwgKCdVJyA8PCAxNikpIHwgKCdZJyA8PCA4KSkgfCAnQScsIFBKTUVESUFfRk9STUFUX1lVWTIgPSAoKCgnMicgPDwgMjQpIHwgKCdZJyA8PCAxNikpIHwgKCdVJyA8PCA4KSkgfCAnWScsIFBKTUVESUFfRk9STUFUX1VZVlkgPSAoKCgnWScgPDwgMjQpIHwgKCdWJyA8PCAxNikpIHwgKCdZJyA8PCA4KSkgfCAnVScsIFBKTUVESUFfRk9STUFUX1lWWVUgPSAoKCgnVScgPDwgMjQpIHwgKCdZJyA8PCAxNikpIHwgKCdWJyA8PCA4KSkgfCAnWScsIFBKTUVESUFfRk9STUFUX0k0MjAgPSAoKCgnMCcgPDwgMjQpIHwgKCcyJyA8PCAxNikpIHwgKCc0JyA8PCA4KSkgfCAnSScsIFBKTUVESUFfRk9STUFUX0lZVVYgPSBQSk1FRElBX0ZPUk1BVF9JNDIwLCBQSk1FRElBX0ZPUk1BVF9ZVjEyID0gKCgoJzInIDw8IDI0KSB8ICgnMScgPDwgMTYpKSB8ICgnVicgPDwgOCkpIHwgJ1knLCBQSk1FRElBX0ZPUk1BVF9JNDIyID0gKCgoJzInIDw8IDI0KSB8ICgnMicgPDwgMTYpKSB8ICgnNCcgPDwgOCkpIHwgJ0knLCBQSk1FRElBX0ZPUk1BVF9JNDIwSlBFRyA9ICgoKCcwJyA8PCAyNCkgfCAoJzInIDw8IDE2KSkgfCAoJzQnIDw8IDgpKSB8ICdKJywgUEpNRURJQV9GT1JNQVRfSTQyMkpQRUcgPSAoKCgnMicgPDwgMjQpIHwgKCcyJyA8PCAxNikpIHwgKCc0JyA8PCA4KSkgfCAnSicsIFBKTUVESUFfRk9STUFUX0gyNjEgPSAoKCgnMScgPDwgMjQpIHwgKCc2JyA8PCAxNikpIHwgKCcyJyA8PCA4KSkgfCAnSCcsIFBKTUVESUFfRk9STUFUX0gyNjMgPSAoKCgnMycgPDwgMjQpIHwgKCc2JyA8PCAxNikpIHwgKCcyJyA8PCA4KSkgfCAnSCcsIFBKTUVESUFfRk9STUFUX0gyNjNQID0gKCgoJzMnIDw8IDI0KSB8ICgnNicgPDwgMTYpKSB8ICgnMicgPDwgOCkpIHwgJ1AnLCBQSk1FRElBX0ZPUk1BVF9IMjY0ID0gKCgoJzQnIDw8IDI0KSB8ICgnNicgPDwgMTYpKSB8ICgnMicgPDwgOCkpIHwgJ0gnLCBQSk1FRElBX0ZPUk1BVF9NSlBFRyA9ICgoKCdHJyA8PCAyNCkgfCAoJ1AnIDw8IDE2KSkgfCAoJ0onIDw8IDgpKSB8ICdNJywgUEpNRURJQV9GT1JNQVRfTVBFRzFWSURFTyA9ICgoKCdWJyA8PCAyNCkgfCAoJzEnIDw8IDE2KSkgfCAoJ1AnIDw8IDgpKSB8ICdNJywgUEpNRURJQV9GT1JNQVRfTVBFRzJWSURFTyA9ICgoKCdWJyA8PCAyNCkgfCAoJzInIDw8IDE2KSkgfCAoJ1AnIDw8IDgpKSB8ICdNJywgUEpNRURJQV9GT1JNQVRfTVBFRzQgPSAoKCgnNCcgPDwgMjQpIHwgKCdHJyA8PCAxNikpIHwgKCdQJyA8PCA4KSkgfCAnTSd9IHBqbWVkaWFfZm9ybWF0X2lkOworCit0eXBlZGVmIGVudW0gcGpzaXBfY3JlZF9kYXRhX3R5cGUge1BKU0lQX0NSRURfREFUQV9QTEFJTl9QQVNTV0QgPSAwLCBQSlNJUF9DUkVEX0RBVEFfRElHRVNUID0gMSwgUEpTSVBfQ1JFRF9EQVRBX0VYVF9BS0EgPSAxNn0gcGpzaXBfY3JlZF9kYXRhX3R5cGU7CisKK3R5cGVkZWYgZW51bSBwanNpcF9kaWFsb2dfY2FwX3N0YXR1cyB7UEpTSVBfRElBTE9HX0NBUF9VTlNVUFBPUlRFRCA9IDAsIFBKU0lQX0RJQUxPR19DQVBfU1VQUE9SVEVEID0gMSwgUEpTSVBfRElBTE9HX0NBUF9VTktOT1dOID0gMn0gcGpzaXBfZGlhbG9nX2NhcF9zdGF0dXM7CisKK3R5cGVkZWYgZW51bSBwanNpcF9ldmVudF9pZF9lIHtQSlNJUF9FVkVOVF9VTktOT1dOLCBQSlNJUF9FVkVOVF9USU1FUiwgUEpTSVBfRVZFTlRfVFhfTVNHLCBQSlNJUF9FVkVOVF9SWF9NU0csIFBKU0lQX0VWRU5UX1RSQU5TUE9SVF9FUlJPUiwgUEpTSVBfRVZFTlRfVFNYX1NUQVRFLCBQSlNJUF9FVkVOVF9VU0VSfSBwanNpcF9ldmVudF9pZF9lOworCit0eXBlZGVmIGVudW0gcGpzaXBfc3RhdHVzX2NvZGUge1BKU0lQX1NDX1RSWUlORyA9IDEwMCwgUEpTSVBfU0NfUklOR0lORyA9IDE4MCwgUEpTSVBfU0NfQ0FMTF9CRUlOR19GT1JXQVJERUQgPSAxODEsIFBKU0lQX1NDX1FVRVVFRCA9IDE4MiwgUEpTSVBfU0NfUFJPR1JFU1MgPSAxODMsIFBKU0lQX1NDX09LID0gMjAwLCBQSlNJUF9TQ19BQ0NFUFRFRCA9IDIwMiwgUEpTSVBfU0NfTVVMVElQTEVfQ0hPSUNFUyA9IDMwMCwgUEpTSVBfU0NfTU9WRURfUEVSTUFORU5UTFkgPSAzMDEsIFBKU0lQX1NDX01PVkVEX1RFTVBPUkFSSUxZID0gMzAyLCBQSlNJUF9TQ19VU0VfUFJPWFkgPSAzMDUsIFBKU0lQX1NDX0FMVEVSTkFUSVZFX1NFUlZJQ0UgPSAzODAsIFBKU0lQX1NDX0JBRF9SRVFVRVNUID0gNDAwLCBQSlNJUF9TQ19VTkFVVEhPUklaRUQgPSA0MDEsIFBKU0lQX1NDX1BBWU1FTlRfUkVRVUlSRUQgPSA0MDIsIFBKU0lQX1NDX0ZPUkJJRERFTiA9IDQwMywgUEpTSVBfU0NfTk9UX0ZPVU5EID0gNDA0LCBQSlNJUF9TQ19NRVRIT0RfTk9UX0FMTE9XRUQgPSA0MDUsIFBKU0lQX1NDX05PVF9BQ0NFUFRBQkxFID0gNDA2LCBQSlNJUF9TQ19QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IDQwNywgUEpTSVBfU0NfUkVRVUVTVF9USU1FT1VUID0gNDA4LCBQSlNJUF9TQ19HT05FID0gNDEwLCBQSlNJUF9TQ19SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UgPSA0MTMsIFBKU0lQX1NDX1JFUVVFU1RfVVJJX1RPT19MT05HID0gNDE0LCBQSlNJUF9TQ19VTlNVUFBPUlRFRF9NRURJQV9UWVBFID0gNDE1LCBQSlNJUF9TQ19VTlNVUFBPUlRFRF9VUklfU0NIRU1FID0gNDE2LCBQSlNJUF9TQ19CQURfRVhURU5TSU9OID0gNDIwLCBQSlNJUF9TQ19FWFRFTlNJT05fUkVRVUlSRUQgPSA0MjEsIFBKU0lQX1NDX1NFU1NJT05fVElNRVJfVE9PX1NNQUxMID0gNDIyLCBQSlNJUF9TQ19JTlRFUlZBTF9UT09fQlJJRUYgPSA0MjMsIFBKU0lQX1NDX1RFTVBPUkFSSUxZX1VOQVZBSUxBQkxFID0gNDgwLCBQSlNJUF9TQ19DQUxMX1RTWF9ET0VTX05PVF9FWElTVCA9IDQ4MSwgUEpTSVBfU0NfTE9PUF9ERVRFQ1RFRCA9IDQ4MiwgUEpTSVBfU0NfVE9PX01BTllfSE9QUyA9IDQ4MywgUEpTSVBfU0NfQUREUkVTU19JTkNPTVBMRVRFID0gNDg0LCBQSlNJUF9BQ19BTUJJR1VPVVMgPSA0ODUsIFBKU0lQX1NDX0JVU1lfSEVSRSA9IDQ4NiwgUEpTSVBfU0NfUkVRVUVTVF9URVJNSU5BVEVEID0gNDg3LCBQSlNJUF9TQ19OT1RfQUNDRVBUQUJMRV9IRVJFID0gNDg4LCBQSlNJUF9TQ19CQURfRVZFTlQgPSA0ODksIFBKU0lQX1NDX1JFUVVFU1RfVVBEQVRFRCA9IDQ5MCwgUEpTSVBfU0NfUkVRVUVTVF9QRU5ESU5HID0gNDkxLCBQSlNJUF9TQ19VTkRFQ0lQSEVSQUJMRSA9IDQ5MywgUEpTSVBfU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwLCBQSlNJUF9TQ19OT1RfSU1QTEVNRU5URUQgPSA1MDEsIFBKU0lQX1NDX0JBRF9HQVRFV0FZID0gNTAyLCBQSlNJUF9TQ19TRVJWSUNFX1VOQVZBSUxBQkxFID0gNTAzLCBQSlNJUF9TQ19TRVJWRVJfVElNRU9VVCA9IDUwNCwgUEpTSVBfU0NfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gNTA1LCBQSlNJUF9TQ19NRVNTQUdFX1RPT19MQVJHRSA9IDUxMywgUEpTSVBfU0NfUFJFQ09ORElUSU9OX0ZBSUxVUkUgPSA1ODAsIFBKU0lQX1NDX0JVU1lfRVZFUllXSEVSRSA9IDYwMCwgUEpTSVBfU0NfREVDTElORSA9IDYwMywgUEpTSVBfU0NfRE9FU19OT1RfRVhJU1RfQU5ZV0hFUkUgPSA2MDQsIFBKU0lQX1NDX05PVF9BQ0NFUFRBQkxFX0FOWVdIRVJFID0gNjA2LCBQSlNJUF9TQ19UU1hfVElNRU9VVCA9IFBKU0lQX1NDX1JFUVVFU1RfVElNRU9VVCwgUEpTSVBfU0NfVFNYX1RSQU5TUE9SVF9FUlJPUiA9IFBKU0lQX1NDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsIFBKU0lQX1NDX19mb3JjZV8zMmJpdCA9IDB4N0ZGRkZGRkZ9IHBqc2lwX3N0YXR1c19jb2RlOworCit0eXBlZGVmIGVudW0gcGpzaXBfaGRyX2Uge1BKU0lQX0hfQUNDRVBULCBQSlNJUF9IX0FDQ0VQVF9FTkNPRElOR19VTklNUCwgUEpTSVBfSF9BQ0NFUFRfTEFOR1VBR0VfVU5JTVAsIFBKU0lQX0hfQUxFUlRfSU5GT19VTklNUCwgUEpTSVBfSF9BTExPVywgUEpTSVBfSF9BVVRIRU5USUNBVElPTl9JTkZPX1VOSU1QLCBQSlNJUF9IX0FVVEhPUklaQVRJT04sIFBKU0lQX0hfQ0FMTF9JRCwgUEpTSVBfSF9DQUxMX0lORk9fVU5JTVAsIFBKU0lQX0hfQ09OVEFDVCwgUEpTSVBfSF9DT05URU5UX0RJU1BPU0lUSU9OX1VOSU1QLCBQSlNJUF9IX0NPTlRFTlRfRU5DT0RJTkdfVU5JTVAsIFBKU0lQX0hfQ09OVEVOVF9MQU5HVUFHRV9VTklNUCwgUEpTSVBfSF9DT05URU5UX0xFTkdUSCwgUEpTSVBfSF9DT05URU5UX1RZUEUsIFBKU0lQX0hfQ1NFUSwgUEpTSVBfSF9EQVRFX1VOSU1QLCBQSlNJUF9IX0VSUk9SX0lORk9fVU5JTVAsIFBKU0lQX0hfRVhQSVJFUywgUEpTSVBfSF9GUk9NLCBQSlNJUF9IX0lOX1JFUExZX1RPX1VOSU1QLCBQSlNJUF9IX01BWF9GT1JXQVJEUywgUEpTSVBfSF9NSU1FX1ZFUlNJT05fVU5JTVAsIFBKU0lQX0hfTUlOX0VYUElSRVMsIFBKU0lQX0hfT1JHQU5JWkFUSU9OX1VOSU1QLCBQSlNJUF9IX1BSSU9SSVRZX1VOSU1QLCBQSlNJUF9IX1BST1hZX0FVVEhFTlRJQ0FURSwgUEpTSVBfSF9QUk9YWV9BVVRIT1JJWkFUSU9OLCBQSlNJUF9IX1BST1hZX1JFUVVJUkVfVU5JTVAsIFBKU0lQX0hfUkVDT1JEX1JPVVRFLCBQSlNJUF9IX1JFUExZX1RPX1VOSU1QLCBQSlNJUF9IX1JFUVVJUkUsIFBKU0lQX0hfUkVUUllfQUZURVIsIFBKU0lQX0hfUk9VVEUsIFBKU0lQX0hfU0VSVkVSX1VOSU1QLCBQSlNJUF9IX1NVQkpFQ1RfVU5JTVAsIFBKU0lQX0hfU1VQUE9SVEVELCBQSlNJUF9IX1RJTUVTVEFNUF9VTklNUCwgUEpTSVBfSF9UTywgUEpTSVBfSF9VTlNVUFBPUlRFRCwgUEpTSVBfSF9VU0VSX0FHRU5UX1VOSU1QLCBQSlNJUF9IX1ZJQSwgUEpTSVBfSF9XQVJOSU5HX1VOSU1QLCBQSlNJUF9IX1dXV19BVVRIRU5USUNBVEUsIFBKU0lQX0hfT1RIRVJ9IHBqc2lwX2hkcl9lOworCit0eXBlZGVmIGVudW0gcGpzaXBfdHJhbnNwb3J0X3R5cGVfZSB7UEpTSVBfVFJBTlNQT1JUX1VOU1BFQ0lGSUVELCBQSlNJUF9UUkFOU1BPUlRfVURQLCBQSlNJUF9UUkFOU1BPUlRfVENQLCBQSlNJUF9UUkFOU1BPUlRfVExTLCBQSlNJUF9UUkFOU1BPUlRfU0NUUCwgUEpTSVBfVFJBTlNQT1JUX0xPT1AsIFBKU0lQX1RSQU5TUE9SVF9MT09QX0RHUkFNLCBQSlNJUF9UUkFOU1BPUlRfU1RBUlRfT1RIRVIsIFBKU0lQX1RSQU5TUE9SVF9JUFY2ID0gMTI4LCBQSlNJUF9UUkFOU1BPUlRfVURQNiA9IFBKU0lQX1RSQU5TUE9SVF9VRFAgKyBQSlNJUF9UUkFOU1BPUlRfSVBWNiwgUEpTSVBfVFJBTlNQT1JUX1RDUDYgPSBQSlNJUF9UUkFOU1BPUlRfVENQICsgUEpTSVBfVFJBTlNQT1JUX0lQVjYsIFBKU0lQX1RSQU5TUE9SVF9UTFM2ID0gUEpTSVBfVFJBTlNQT1JUX1RMUyArIFBKU0lQX1RSQU5TUE9SVF9JUFY2fSBwanNpcF90cmFuc3BvcnRfdHlwZV9lOworCitlbnVtIHBqc2lwX3RyYW5zcG9ydF9mbGFnc19lIHtQSlNJUF9UUkFOU1BPUlRfUkVMSUFCTEUgPSAxLCBQSlNJUF9UUkFOU1BPUlRfU0VDVVJFID0gMiwgUEpTSVBfVFJBTlNQT1JUX0RBVEFHUkFNID0gNH07CisKK3R5cGVkZWYgZW51bSBwanNpcF90cmFuc3BvcnRfc3RhdGUge1BKU0lQX1RQX1NUQVRFX0NPTk5FQ1RFRCwgUEpTSVBfVFBfU1RBVEVfRElTQ09OTkVDVEVEfSBwanNpcF90cmFuc3BvcnRfc3RhdGU7CisKK3R5cGVkZWYgZW51bSBwanNpcF9zc2xfbWV0aG9kIHtQSlNJUF9TU0xfVU5TUEVDSUZJRURfTUVUSE9EID0gMCwgUEpTSVBfVExTVjFfTUVUSE9EID0gMzEsIFBKU0lQX1NTTFYyX01FVEhPRCA9IDIwLCBQSlNJUF9TU0xWM19NRVRIT0QgPSAzMCwgUEpTSVBfU1NMVjIzX01FVEhPRCA9IDIzfSBwanNpcF9zc2xfbWV0aG9kOworCit0eXBlZGVmIGVudW0gcGpzaXBfdHN4X3N0YXRlX2Uge1BKU0lQX1RTWF9TVEFURV9OVUxMLCBQSlNJUF9UU1hfU1RBVEVfQ0FMTElORywgUEpTSVBfVFNYX1NUQVRFX1RSWUlORywgUEpTSVBfVFNYX1NUQVRFX1BST0NFRURJTkcsIFBKU0lQX1RTWF9TVEFURV9DT01QTEVURUQsIFBKU0lQX1RTWF9TVEFURV9DT05GSVJNRUQsIFBKU0lQX1RTWF9TVEFURV9URVJNSU5BVEVELCBQSlNJUF9UU1hfU1RBVEVfREVTVFJPWUVELCBQSlNJUF9UU1hfU1RBVEVfTUFYfSBwanNpcF90c3hfc3RhdGVfZTsKKwordHlwZWRlZiBlbnVtIHBqc2lwX3JvbGVfZSB7UEpTSVBfUk9MRV9VQUMsIFBKU0lQX1JPTEVfVUFTLCBQSlNJUF9VQUNfUk9MRSA9IFBKU0lQX1JPTEVfVUFDLCBQSlNJUF9VQVNfUk9MRSA9IFBKU0lQX1JPTEVfVUFTfSBwanNpcF9yb2xlX2U7CisKK3R5cGVkZWYgZW51bSBwanNpcF9yZWRpcmVjdF9vcCB7UEpTSVBfUkVESVJFQ1RfUkVKRUNULCBQSlNJUF9SRURJUkVDVF9BQ0NFUFQsIFBKU0lQX1JFRElSRUNUX0FDQ0VQVF9SRVBMQUNFLCBQSlNJUF9SRURJUkVDVF9QRU5ESU5HLCBQSlNJUF9SRURJUkVDVF9TVE9QfSBwanNpcF9yZWRpcmVjdF9vcDsKKwordHlwZWRlZiBlbnVtIHBqcnBpZF9hY3Rpdml0eSB7UEpSUElEX0FDVElWSVRZX1VOS05PV04sIFBKUlBJRF9BQ1RJVklUWV9BV0FZLCBQSlJQSURfQUNUSVZJVFlfQlVTWX0gcGpycGlkX2FjdGl2aXR5OworCit0eXBlZGVmIGVudW0gcGpzaXBfZXZzdWJfc3RhdGUge1BKU0lQX0VWU1VCX1NUQVRFX05VTEwsIFBKU0lQX0VWU1VCX1NUQVRFX1NFTlQsIFBKU0lQX0VWU1VCX1NUQVRFX0FDQ0VQVEVELCBQSlNJUF9FVlNVQl9TVEFURV9QRU5ESU5HLCBQSlNJUF9FVlNVQl9TVEFURV9BQ1RJVkUsIFBKU0lQX0VWU1VCX1NUQVRFX1RFUk1JTkFURUQsIFBKU0lQX0VWU1VCX1NUQVRFX1VOS05PV059IHBqc2lwX2V2c3ViX3N0YXRlOworCit0eXBlZGVmIGVudW0gcGpzaXBfaW52X3N0YXRlIHtQSlNJUF9JTlZfU1RBVEVfTlVMTCwgUEpTSVBfSU5WX1NUQVRFX0NBTExJTkcsIFBKU0lQX0lOVl9TVEFURV9JTkNPTUlORywgUEpTSVBfSU5WX1NUQVRFX0VBUkxZLCBQSlNJUF9JTlZfU1RBVEVfQ09OTkVDVElORywgUEpTSVBfSU5WX1NUQVRFX0NPTkZJUk1FRCwgUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRH0gcGpzaXBfaW52X3N0YXRlOworCitlbnVtIHBqc3VhX2ludmFsaWRfaWRfY29uc3RfIHtQSlNVQV9JTlZBTElEX0lEID0gLTF9OworCit0eXBlZGVmIGVudW0gcGpzdWFfc3RhdGUge1BKU1VBX1NUQVRFX05VTEwsIFBKU1VBX1NUQVRFX0NSRUFURUQsIFBKU1VBX1NUQVRFX0lOSVQsIFBKU1VBX1NUQVRFX1NUQVJUSU5HLCBQSlNVQV9TVEFURV9SVU5OSU5HLCBQSlNVQV9TVEFURV9DTE9TSU5HfSBwanN1YV9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIHBqc3VhX3N0dW5fdXNlIHtQSlNVQV9TVFVOX1VTRV9ERUZBVUxULCBQSlNVQV9TVFVOX1VTRV9ESVNBQkxFRH0gcGpzdWFfc3R1bl91c2U7CisKK3R5cGVkZWYgZW51bSBwanN1YV9jYWxsX2hvbGRfdHlwZSB7UEpTVUFfQ0FMTF9IT0xEX1RZUEVfUkZDMzI2NCwgUEpTVUFfQ0FMTF9IT0xEX1RZUEVfUkZDMjU0M30gcGpzdWFfY2FsbF9ob2xkX3R5cGU7CisKK3R5cGVkZWYgaW50IHBqc3VhX2FjY19pZDsKKwordHlwZWRlZiBlbnVtIHBqc3VhX2Rlc3Ryb3lfZmxhZyB7UEpTVUFfREVTVFJPWV9OT19SWF9NU0cgPSAxLCBQSlNVQV9ERVNUUk9ZX05PX1RYX01TRyA9IDIsIFBKU1VBX0RFU1RST1lfTk9fTkVUV09SSyA9IFBKU1VBX0RFU1RST1lfTk9fUlhfTVNHIHwgUEpTVUFfREVTVFJPWV9OT19UWF9NU0d9IHBqc3VhX2Rlc3Ryb3lfZmxhZzsKKwordHlwZWRlZiBlbnVtIHBqc3VhXzEwMHJlbF91c2Uge1BKU1VBXzEwMFJFTF9OT1RfVVNFRCwgUEpTVUFfMTAwUkVMX01BTkRBVE9SWSwgUEpTVUFfMTAwUkVMX09QVElPTkFMfSBwanN1YV8xMDByZWxfdXNlOworCit0eXBlZGVmIGVudW0gcGpzdWFfc2lwX3RpbWVyX3VzZSB7UEpTVUFfU0lQX1RJTUVSX0lOQUNUSVZFLCBQSlNVQV9TSVBfVElNRVJfT1BUSU9OQUwsIFBKU1VBX1NJUF9USU1FUl9SRVFVSVJFRCwgUEpTVUFfU0lQX1RJTUVSX0FMV0FZU30gcGpzdWFfc2lwX3RpbWVyX3VzZTsKKwordHlwZWRlZiBlbnVtIHBqc3VhX2lwdjZfdXNlIHtQSlNVQV9JUFY2X0RJU0FCTEVELCBQSlNVQV9JUFY2X0VOQUJMRUR9IHBqc3VhX2lwdjZfdXNlOworCit0eXBlZGVmIGVudW0gcGpzdWFfYnVkZHlfc3RhdHVzIHtQSlNVQV9CVUREWV9TVEFUVVNfVU5LTk9XTiwgUEpTVUFfQlVERFlfU1RBVFVTX09OTElORSwgUEpTVUFfQlVERFlfU1RBVFVTX09GRkxJTkV9IHBqc3VhX2J1ZGR5X3N0YXR1czsKKwordHlwZWRlZiBlbnVtIHBqc3VhX2NhbGxfbWVkaWFfc3RhdHVzIHtQSlNVQV9DQUxMX01FRElBX05PTkUsIFBKU1VBX0NBTExfTUVESUFfQUNUSVZFLCBQSlNVQV9DQUxMX01FRElBX0xPQ0FMX0hPTEQsIFBKU1VBX0NBTExfTUVESUFfUkVNT1RFX0hPTEQsIFBKU1VBX0NBTExfTUVESUFfRVJST1J9IHBqc3VhX2NhbGxfbWVkaWFfc3RhdHVzOworCit0eXBlZGVmIGludCBwanN1YV92aWRfd2luX2lkOworCit0eXBlZGVmIGludCBwanN1YV9jYWxsX2lkOworCit0eXBlZGVmIGVudW0gcGpzdWFfbWVkX3RwX3N0IHtQSlNVQV9NRURfVFBfTlVMTCwgUEpTVUFfTUVEX1RQX0NSRUFUSU5HLCBQSlNVQV9NRURfVFBfSURMRSwgUEpTVUFfTUVEX1RQX0lOSVQsIFBKU1VBX01FRF9UUF9SVU5OSU5HLCBQSlNVQV9NRURfVFBfRElTQUJMRUR9IHBqc3VhX21lZF90cF9zdDsKKwordHlwZWRlZiBlbnVtIHBqc3VhX2NhbGxfdmlkX3N0cm1fb3Age1BKU1VBX0NBTExfVklEX1NUUk1fTk9fT1AsIFBKU1VBX0NBTExfVklEX1NUUk1fQURELCBQSlNVQV9DQUxMX1ZJRF9TVFJNX1JFTU9WRSwgUEpTVUFfQ0FMTF9WSURfU1RSTV9DSEFOR0VfRElSLCBQSlNVQV9DQUxMX1ZJRF9TVFJNX0NIQU5HRV9DQVBfREVWLCBQSlNVQV9DQUxMX1ZJRF9TVFJNX1NUQVJUX1RSQU5TTUlULCBQSlNVQV9DQUxMX1ZJRF9TVFJNX1NUT1BfVFJBTlNNSVQsIFBKU1VBX0NBTExfVklEX1NUUk1fU0VORF9LRVlGUkFNRX0gcGpzdWFfY2FsbF92aWRfc3RybV9vcDsKKwordHlwZWRlZiBlbnVtIHBqc3VhX3ZpZF9yZXFfa2V5ZnJhbWVfbWV0aG9kIHtQSlNVQV9WSURfUkVRX0tFWUZSQU1FX1NJUF9JTkZPID0gMSwgUEpTVUFfVklEX1JFUV9LRVlGUkFNRV9SVENQX1BMSSA9IDJ9IHBqc3VhX3ZpZF9yZXFfa2V5ZnJhbWVfbWV0aG9kOworCit0eXBlZGVmIGVudW0gcGpzdWFfY2FsbF9mbGFnIHtQSlNVQV9DQUxMX1VOSE9MRCA9IDEsIFBKU1VBX0NBTExfVVBEQVRFX0NPTlRBQ1QgPSAyLCBQSlNVQV9DQUxMX0lOQ0xVREVfRElTQUJMRURfTUVESUEgPSA0fSBwanN1YV9jYWxsX2ZsYWc7CisKK3R5cGVkZWYgZW51bSBwanN1YV9jcmVhdGVfbWVkaWFfdHJhbnNwb3J0X2ZsYWcge1BKU1VBX01FRF9UUF9DTE9TRV9NRU1CRVIgPSAxfSBwanN1YV9jcmVhdGVfbWVkaWFfdHJhbnNwb3J0X2ZsYWc7CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N3aWcvc3ltYm9scy5sc3QgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3N5bWJvbHMubHN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWMzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zd2lnL3N5bWJvbHMubHN0CkBAIC0wLDAgKzEsMzQgQEAKK3BqL3R5cGVzLmgJCQlwal9zdGF0dXNfdCBwal9jb25zdGFudHNfIHBqX3VpbnQ4X3QgcGpfaW50MzJfdCBwal91aW50MzJfdCBwal91aW50MTZfdAorcGovZmlsZV9pby5oCQkJcGpfZmlsZV9hY2Nlc3MKK3BqL2xvZy5oCQkJcGpfbG9nX2RlY29yYXRpb24KK3BqL3NvY2tfcW9zLmgJCQlwal9xb3NfdHlwZSBwal9xb3NfZmxhZyBwal9xb3Nfd21tX3ByaW8gcGpfcW9zX3BhcmFtcworcGovc3NsX3NvY2suaAkJCXBqX3NzbF9jaXBoZXIKKworcGpuYXRoL25hdF9kZXRlY3QuaCAgICAgICAgICAJcGpfc3R1bl9uYXRfdHlwZQorcGpuYXRoL3R1cm5fc2Vzc2lvbi5oICAgICAgICAgIAlwal90dXJuX3RwX3R5cGUKKworcGptZWRpYS9ldmVudC5oICAgICAgICAgICAgICAgICBwam1lZGlhX2V2ZW50X3R5cGUKK3BqbWVkaWEvdHJhbnNwb3J0X3NydHAuaAlwam1lZGlhX3NydHBfdXNlCitwam1lZGlhL3ZpZF9zdHJlYW0uaAkJcGptZWRpYV92aWRfc3RyZWFtX3JjX21ldGhvZAorcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oCXBqbWVkaWFfdmlkX2Rldl9pbmRleCBwam1lZGlhX3ZpZF9kZXZfc3RkX2luZGV4Citwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2LmggCXBqbWVkaWFfYXVkX2Rldl9yb3V0ZSBwam1lZGlhX2F1ZF9kZXZfY2FwCitwam1lZGlhL3dhdl9wb3J0LmggICAgICAgICAgICAgIHBqbWVkaWFfZmlsZV93cml0ZXJfb3B0aW9uIHBqbWVkaWFfZmlsZV9wbGF5ZXJfb3B0aW9uCitwam1lZGlhL3R5cGVzLmggICAgICAgICAgICAgICAgIHBqbWVkaWFfdHlwZSBwam1lZGlhX2RpciBwam1lZGlhX3RwX3Byb3RvCitwam1lZGlhL2Zvcm1hdC5oCQlwam1lZGlhX2Zvcm1hdF9pZAorCitwanNpcC9zaXBfYXV0aC5oCQlwanNpcF9jcmVkX2RhdGFfdHlwZQorcGpzaXAvc2lwX2RpYWxvZy5oICAgICAgICAgICAgICBwanNpcF9kaWFsb2dfY2FwX3N0YXR1cworcGpzaXAvc2lwX2V2ZW50LmggICAgICAgICAgICAgICBwanNpcF9ldmVudF9pZF9lCitwanNpcC9zaXBfbXNnLmgJCQlwanNpcF9zdGF0dXNfY29kZSBwanNpcF9oZHJfZQorcGpzaXAvc2lwX3RyYW5zcG9ydC5oCQlwanNpcF90cmFuc3BvcnRfdHlwZV9lIHBqc2lwX3RyYW5zcG9ydF9mbGFnc19lIHBqc2lwX3RyYW5zcG9ydF9zdGF0ZQorcGpzaXAvc2lwX3RyYW5zcG9ydF90bHMuaAlwanNpcF9zc2xfbWV0aG9kCitwanNpcC9zaXBfdHJhbnNhY3Rpb24uaCAgICAgICAgIHBqc2lwX3RzeF9zdGF0ZV9lCitwanNpcC9zaXBfdHlwZXMuaCAgICAgICAgICAgICAgIHBqc2lwX3JvbGVfZQorcGpzaXAvc2lwX3V0aWwuaCAgICAgICAgICAgICAgICBwanNpcF9yZWRpcmVjdF9vcAorCitwanNpcC1zaW1wbGUvcnBpZC5oICAgICAgICAgIAlwanJwaWRfYWN0aXZpdHkKK3Bqc2lwLXNpbXBsZS9ldnN1Yi5oCQlwanNpcF9ldnN1Yl9zdGF0ZQorCitwanNpcC11YS9zaXBfaW52LmggICAgICAgICAgICAgIHBqc2lwX2ludl9zdGF0ZQorCitwanN1YS1saWIvcGpzdWEuaAkJcGpzdWFfaW52YWxpZF9pZF9jb25zdF8gcGpzdWFfc3RhdGUgcGpzdWFfc3R1bl91c2UgcGpzdWFfY2FsbF9ob2xkX3R5cGUgcGpzdWFfYWNjX2lkIHBqc3VhX2Rlc3Ryb3lfZmxhZyBwanN1YV8xMDByZWxfdXNlIHBqc3VhX3NpcF90aW1lcl91c2UgcGpzdWFfaXB2Nl91c2UgcGpzdWFfYnVkZHlfc3RhdHVzIHBqc3VhX2NhbGxfbWVkaWFfc3RhdHVzIHBqc3VhX3ZpZF93aW5faWQgcGpzdWFfY2FsbF9pZCBwanN1YV9tZWRfdHBfc3QgcGpzdWFfY2FsbF92aWRfc3RybV9vcCBwanN1YV92aWRfcmVxX2tleWZyYW1lX21ldGhvZCBwanN1YV9jYWxsX2ZsYWcgcGpzdWFfY3JlYXRlX21lZGlhX3RyYW5zcG9ydF9mbGFnCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zeW1zbmR0ZXN0L2FwcF9tYWluLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N5bXNuZHRlc3QvYXBwX21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zeW1zbmR0ZXN0L2FwcF9tYWluLmNwcApAQCAtMCwwICsxLDQzNCBAQAorLyogJElkOiBhcHBfbWFpbi5jcHAgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9kZWxheWJ1Zi5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai91bmljb2RlLmg+CisjaW5jbHVkZSA8ZTMyY29ucy5oPgorCisjZGVmaW5lIFRISVNfRklMRQkJImFwcF9tYWluLmNwcCIKKyNkZWZpbmUgQ0xPQ0tfUkFURQkJODAwMAorI2RlZmluZSBDSEFOTkVMX0NPVU5UCQkxCisjZGVmaW5lIFBUSU1FCQkJMjAKKyNkZWZpbmUgU0FNUExFU19QRVJfRlJBTUUJKENMT0NLX1JBVEUqUFRJTUUvMTAwMCkKKyNkZWZpbmUgQklUU19QRVJfU0FNUExFCQkxNgorCitleHRlcm4gQ0NvbnNvbGVCYXNlKiBjb25zb2xlOworCitzdGF0aWMgcGpfY2FjaGluZ19wb29sIGNwOworc3RhdGljIHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybTsKK3N0YXRpYyB1bnNpZ25lZCByZWNfY250LCBwbGF5X2NudDsKK3N0YXRpYyBwal90aW1lX3ZhbCB0X3N0YXJ0Oworc3RhdGljIHBqbWVkaWFfYXVkX3BhcmFtIHBhcmFtOworc3RhdGljIHBqX3Bvb2xfdCAqcG9vbDsKK3N0YXRpYyBwam1lZGlhX2RlbGF5X2J1ZiAqZGVsYXlidWY7CitzdGF0aWMgY2hhciBmcmFtZV9idWZbMjU2XTsKKworc3RhdGljIHZvaWQgY29weV9mcmFtZV9leHQocGptZWRpYV9mcmFtZV9leHQgKmZfZHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfZnJhbWVfZXh0ICpmX3NyYykgCit7CisgICAgcGpfYnplcm8oZl9kc3QsIHNpemVvZigqZl9kc3QpKTsKKyAgICBpZiAoZl9zcmMtPnN1YmZyYW1lX2NudCkgeworCWZfZHN0LT5iYXNlLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfRVhURU5ERUQ7CisJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZfc3JjLT5zdWJmcmFtZV9jbnQ7ICsraSkgeworCSAgICBwam1lZGlhX2ZyYW1lX2V4dF9zdWJmcmFtZSAqc2Y7CisJICAgIHNmID0gcGptZWRpYV9mcmFtZV9leHRfZ2V0X3N1YmZyYW1lKGZfc3JjLCBpKTsKKwkgICAgcGptZWRpYV9mcmFtZV9leHRfYXBwZW5kX3N1YmZyYW1lKGZfZHN0LCBzZi0+ZGF0YSwgc2YtPmJpdGxlbiwgCisJCQkJCSAgICAgIHBhcmFtLnNhbXBsZXNfcGVyX2ZyYW1lKTsKKwl9CisgICAgfSBlbHNlIHsKKwlmX2RzdC0+YmFzZS50eXBlID0gUEpNRURJQV9GUkFNRV9UWVBFX05PTkU7CisgICAgfQorfQorCisvKiBMb2dnaW5nIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBsb2dfd3JpdGVyKGludCBsZXZlbCwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisgICAgc3RhdGljIHdjaGFyX3QgYnVmMTZbUEpfTE9HX01BWF9TSVpFXTsKKworICAgIFBKX1VOVVNFRF9BUkcobGV2ZWwpOworCisgICAgcGpfYW5zaV90b191bmljb2RlKGJ1ZiwgbGVuLCBidWYxNiwgUEpfQVJSQVlfU0laRShidWYxNikpOworCisgICAgVFB0ckMxNiBhQnVmKChjb25zdCBUVWludDE2KilidWYxNiwgKFRJbnQpbGVuKTsKKyAgICBjb25zb2xlLT5Xcml0ZShhQnVmKTsKK30KKworLyogcGVycm9yIHV0aWwgKi8KK3N0YXRpYyB2b2lkIGFwcF9wZXJyb3IoY29uc3QgY2hhciAqdGl0bGUsIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworICAgIHBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIkVycm9yOiAlczogJXMiLCB0aXRsZSwgZXJybXNnKSk7Cit9CisKKy8qIEFwcGxpY2F0aW9uIGluaXQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBhcHBfaW5pdCgpCit7CisgICAgdW5zaWduZWQgaSwgY291bnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogUmVkaXJlY3QgbG9nICovCisgICAgcGpfbG9nX3NldF9sb2dfZnVuYygodm9pZCAoKikoaW50LGNvbnN0IGNoYXIqLGludCkpICZsb2dfd3JpdGVyKTsKKyAgICBwal9sb2dfc2V0X2RlY29yKFBKX0xPR19IQVNfTkVXTElORSk7CisgICAgcGpfbG9nX3NldF9sZXZlbCgzKTsKKworICAgIC8qIEluaXQgcGpsaWIgKi8KKyAgICBzdGF0dXMgPSBwal9pbml0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgCWFwcF9wZXJyb3IoInBqX2luaXQoKSIsIHN0YXR1cyk7CisgICAgCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcGpfY2FjaGluZ19wb29sX2luaXQoJmNwLCBOVUxMLCAwKTsKKworICAgIC8qIEluaXQgc291bmQgc3Vic3lzdGVtICovCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3Vic3lzX2luaXQoJmNwLmZhY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgIAlhcHBfcGVycm9yKCJwam1lZGlhX3NuZF9pbml0KCkiLCBzdGF0dXMpOworICAgICAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSgmY3ApOworICAgIAlwal9zaHV0ZG93bigpOworICAgIAlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGNvdW50ID0gcGptZWRpYV9hdWRfZGV2X2NvdW50KCk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkRldmljZSBjb3VudDogJWQiLCBjb3VudCkpOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKyAgICAJcGptZWRpYV9hdWRfZGV2X2luZm8gaW5mbzsKKyAgICAJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgCXN0YXR1cyA9IHBqbWVkaWFfYXVkX2Rldl9nZXRfaW5mbyhpLCAmaW5mbyk7CisgICAgCXBqX2Fzc2VydChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7CisgICAgCVBKX0xPRygzLCAoVEhJU19GSUxFLCAiJWQ6ICVzICVkLyVkICVkSHoiLAorICAgIAkJICAgaSwgaW5mby5uYW1lLCBpbmZvLmlucHV0X2NvdW50LCBpbmZvLm91dHB1dF9jb3VudCwKKyAgICAJCSAgIGluZm8uZGVmYXVsdF9zYW1wbGVzX3Blcl9zZWMpKTsKKyAgICAJCisJdW5zaWduZWQgajsKKworCS8qIFByaW50IGV4dGVuZGVkIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlICovCisJUEpfTE9HKDMsIChUSElTX0ZJTEUsICIgICBFeHRlbmRlZCBmb3JtYXRzIHN1cHBvcnRlZDoiKSk7CisJZm9yIChqID0gMDsgaiA8IGluZm8uZXh0X2ZtdF9jbnQ7ICsraikgeworCSAgICBjb25zdCBjaGFyICpmbXRfbmFtZSA9IE5VTEw7CisJICAgIAorCSAgICBzd2l0Y2ggKGluZm8uZXh0X2ZtdFtqXS5pZCkgeworCSAgICBjYXNlIFBKTUVESUFfRk9STUFUX1BDTUE6CisJCWZtdF9uYW1lID0gIlBDTUEiOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX0ZPUk1BVF9QQ01VOgorCQlmbXRfbmFtZSA9ICJQQ01VIjsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpNRURJQV9GT1JNQVRfQU1SOgorCQlmbXRfbmFtZSA9ICJBTVItTkIiOworCQlicmVhazsKKwkgICAgY2FzZSBQSk1FRElBX0ZPUk1BVF9HNzI5OgorCQlmbXRfbmFtZSA9ICJHNzI5IjsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpNRURJQV9GT1JNQVRfSUxCQzoKKwkJZm10X25hbWUgPSAiSUxCQyI7CisJCWJyZWFrOworCSAgICBjYXNlIFBKTUVESUFfRk9STUFUX1BDTToKKwkJZm10X25hbWUgPSAiUENNIjsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWZtdF9uYW1lID0gIlVua25vd24iOworCQlicmVhazsKKwkgICAgfQorCSAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIiAgIC0gJXMiLCBmbXRfbmFtZSkpOworCX0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgcG9vbCAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSgmY3AuZmFjdG9yeSwgVEhJU19GSUxFLCA1MTIsIDUxMiwgTlVMTCk7CisgICAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgIAlhcHBfcGVycm9yKCJwal9wb29sX2NyZWF0ZSgpIiwgc3RhdHVzKTsKKyAgICAgICAgcGpfY2FjaGluZ19wb29sX2Rlc3Ryb3koJmNwKTsKKyAgICAJcGpfc2h1dGRvd24oKTsKKyAgICAJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBJbml0IGRlbGF5IGJ1ZmZlciAqLworICAgIHN0YXR1cyA9IHBqbWVkaWFfZGVsYXlfYnVmX2NyZWF0ZShwb29sLCBUSElTX0ZJTEUsIENMT0NLX1JBVEUsCisJCQkJICAgICAgU0FNUExFU19QRVJfRlJBTUUsIENIQU5ORUxfQ09VTlQsCisJCQkJICAgICAgMCwgMCwgJmRlbGF5YnVmKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAJYXBwX3BlcnJvcigicGptZWRpYV9kZWxheV9idWZfY3JlYXRlKCkiLCBzdGF0dXMpOworICAgICAgICAvL3BqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjcCk7CisgICAgCS8vcGpfc2h1dGRvd24oKTsKKyAgICAJLy9yZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIFNvdW5kIGNhcHR1cmUgY2FsbGJhY2sgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCByZWNfY2Iodm9pZCAqdXNlcl9kYXRhLAorCQkJICBwam1lZGlhX2ZyYW1lICpmcmFtZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHVzZXJfZGF0YSk7CisKKyAgICBpZiAocGFyYW0uZXh0X2ZtdC5pZCA9PSBQSk1FRElBX0ZPUk1BVF9QQ00pIHsKKwlwam1lZGlhX2RlbGF5X2J1Zl9wdXQoZGVsYXlidWYsIChwal9pbnQxNl90KilmcmFtZS0+YnVmKTsKKyAgICAKKwlpZiAoZnJhbWUtPnNpemUgIT0gU0FNUExFU19QRVJfRlJBTUUqMikgeworCQkgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJTaXplIGNhcHR1cmVkID0gJXUiLAorCQkJICAgICAgIGZyYW1lLT5zaXplKSk7CisJfQorICAgIH0gZWxzZSB7CisJcGptZWRpYV9mcmFtZV9leHQgKmZfc3JjID0gKHBqbWVkaWFfZnJhbWVfZXh0KilmcmFtZTsKKwlwam1lZGlhX2ZyYW1lX2V4dCAqZl9kc3QgPSAocGptZWRpYV9mcmFtZV9leHQqKWZyYW1lX2J1ZjsKKwkKKwljb3B5X2ZyYW1lX2V4dChmX2RzdCwgZl9zcmMpOworICAgIH0KKworICAgICsrcmVjX2NudDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUGxheSBjYiAqLworc3RhdGljIHBqX3N0YXR1c190IHBsYXlfY2Iodm9pZCAqdXNlcl9kYXRhLAorCQkJICAgcGptZWRpYV9mcmFtZSAqZnJhbWUpCit7CisgICAgUEpfVU5VU0VEX0FSRyh1c2VyX2RhdGEpOworCisgICAgaWYgKHBhcmFtLmV4dF9mbXQuaWQgPT0gUEpNRURJQV9GT1JNQVRfUENNKSB7CisJcGptZWRpYV9kZWxheV9idWZfZ2V0KGRlbGF5YnVmLCAocGpfaW50MTZfdCopZnJhbWUtPmJ1Zik7CisJZnJhbWUtPnNpemUgPSBTQU1QTEVTX1BFUl9GUkFNRSoyOworCWZyYW1lLT50eXBlID0gUEpNRURJQV9GUkFNRV9UWVBFX0FVRElPOworICAgIH0gZWxzZSB7CisJcGptZWRpYV9mcmFtZV9leHQgKmZfc3JjID0gKHBqbWVkaWFfZnJhbWVfZXh0KilmcmFtZV9idWY7CisJcGptZWRpYV9mcmFtZV9leHQgKmZfZHN0ID0gKHBqbWVkaWFfZnJhbWVfZXh0KilmcmFtZTsKKworCWNvcHlfZnJhbWVfZXh0KGZfZHN0LCBmX3NyYyk7CisgICAgfQorCisgICAgKytwbGF5X2NudDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogU3RhcnQgc291bmQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzbmRfc3RhcnQodW5zaWduZWQgZmxhZykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoc3RybSAhPSBOVUxMKSB7CisgICAgCWFwcF9wZXJyb3IoInNuZCBhbHJlYWR5IG9wZW4iLCBQSl9FSU5WQUxJRE9QKTsKKyAgICAJcmV0dXJuIFBKX0VJTlZBTElET1A7CisgICAgfQorCisgICAgcGptZWRpYV9hdWRfZGV2X2RlZmF1bHRfcGFyYW0oMCwgJnBhcmFtKTsKKyAgICBwYXJhbS5jaGFubmVsX2NvdW50ID0gQ0hBTk5FTF9DT1VOVDsKKyAgICBwYXJhbS5jbG9ja19yYXRlID0gQ0xPQ0tfUkFURTsKKyAgICBwYXJhbS5zYW1wbGVzX3Blcl9mcmFtZSA9IFNBTVBMRVNfUEVSX0ZSQU1FOworICAgIHBhcmFtLmRpciA9IChwam1lZGlhX2RpcikgZmxhZzsKKyAgICBwYXJhbS5leHRfZm10LmlkID0gUEpNRURJQV9GT1JNQVRfQU1SOworICAgIHBhcmFtLmV4dF9mbXQuYml0cmF0ZSA9IDEyMjAwOworICAgIHBhcmFtLm91dHB1dF9yb3V0ZSA9IFBKTUVESUFfQVVEX0RFVl9ST1VURV9MT1VEU1BFQUtFUjsKKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoJnBhcmFtLCAmcmVjX2NiLCAmcGxheV9jYiwgTlVMTCwgJnN0cm0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgIAlhcHBfcGVycm9yKCJzbmQgb3BlbiIsIHN0YXR1cyk7CisgICAgCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmVjX2NudCA9IHBsYXlfY250ID0gMDsKKyAgICBwal9nZXR0aW1lb2ZkYXkoJnRfc3RhcnQpOworCisgICAgcGptZWRpYV9kZWxheV9idWZfcmVzZXQoZGVsYXlidWYpOworCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3RyZWFtX3N0YXJ0KHN0cm0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgIAlhcHBfcGVycm9yKCJzbmQgc3RhcnQiLCBzdGF0dXMpOworICAgIAlwam1lZGlhX2F1ZF9zdHJlYW1fZGVzdHJveShzdHJtKTsKKyAgICAJc3RybSA9IE5VTEw7CisgICAgCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFN0b3Agc291bmQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzbmRfc3RvcCgpCit7CisgICAgcGpfdGltZV92YWwgbm93OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChzdHJtID09IE5VTEwpIHsKKyAgICAJYXBwX3BlcnJvcigic25kIG5vdCBvcGVuIiwgUEpfRUlOVkFMSURPUCk7CisgICAgCXJldHVybiBQSl9FSU5WQUxJRE9QOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9zdG9wKHN0cm0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworICAgIAlhcHBfcGVycm9yKCJzbmQgZmFpbGVkIHRvIHN0b3AiLCBzdGF0dXMpOworICAgIH0KKyAgICBzdGF0dXMgPSBwam1lZGlhX2F1ZF9zdHJlYW1fZGVzdHJveShzdHJtKTsKKyAgICBzdHJtID0gTlVMTDsKKworICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKyAgICBQSl9USU1FX1ZBTF9TVUIobm93LCB0X3N0YXJ0KTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICJEdXJhdGlvbjogJWQuJTAzZCIsIG5vdy5zZWMsIG5vdy5tc2VjKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkNhcHR1cmVkOiAlZCIsIHJlY19jbnQpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiUGxheWVkOiAlZCIsIHBsYXlfY250KSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBTaHV0ZG93biBhcHBsaWNhdGlvbiAqLworc3RhdGljIHZvaWQgYXBwX2ZpbmkoKQoreworICAgIGlmIChzdHJtKQorICAgIAlzbmRfc3RvcCgpOworCisgICAgcGptZWRpYV9hdWRfc3Vic3lzX3NodXRkb3duKCk7CisgICAgcGptZWRpYV9kZWxheV9idWZfZGVzdHJveShkZWxheWJ1Zik7CisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHBqX2NhY2hpbmdfcG9vbF9kZXN0cm95KCZjcCk7CisgICAgcGpfc2h1dGRvd24oKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogVGhlIGludGVycmFjdGl2ZSBjb25zb2xlIFVJCisgKi8KKyNpbmNsdWRlIDxlMzJiYXNlLmg+CisKK2NsYXNzIENvbnNvbGVVSSA6IHB1YmxpYyBDQWN0aXZlCit7CitwdWJsaWM6CisgICAgQ29uc29sZVVJKENDb25zb2xlQmFzZSAqY29uKTsKKworICAgIC8vIFJ1biBjb25zb2xlIFVJCisgICAgdm9pZCBSdW4oKTsKKworICAgIC8vIFN0b3AKKyAgICB2b2lkIFN0b3AoKTsKKworcHJvdGVjdGVkOgorICAgIC8vIENhbmNlbCBhc3luY2hyb25vdXMgcmVhZC4KKyAgICB2b2lkIERvQ2FuY2VsKCk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbjogY2FsbGVkIHdoZW4gcmVhZCBoYXMgY29tcGxldGVkLgorICAgIHZvaWQgUnVuTCgpOworCitwcml2YXRlOgorICAgIENDb25zb2xlQmFzZSAqY29uXzsKK307CisKKworQ29uc29sZVVJOjpDb25zb2xlVUkoQ0NvbnNvbGVCYXNlICpjb24pCis6IENBY3RpdmUoRVByaW9yaXR5VXNlcklucHV0KSwgY29uXyhjb24pCit7CisgICAgQ0FjdGl2ZVNjaGVkdWxlcjo6QWRkKHRoaXMpOworfQorCisvLyBSdW4gY29uc29sZSBVSQordm9pZCBDb25zb2xlVUk6OlJ1bigpCit7CisgICAgY29uXy0+UmVhZChpU3RhdHVzKTsKKyAgICBTZXRBY3RpdmUoKTsKK30KKworLy8gU3RvcCBjb25zb2xlIFVJCit2b2lkIENvbnNvbGVVSTo6U3RvcCgpCit7CisgICAgRG9DYW5jZWwoKTsKK30KKworLy8gQ2FuY2VsIGFzeW5jaHJvbm91cyByZWFkLgordm9pZCBDb25zb2xlVUk6OkRvQ2FuY2VsKCkKK3sKKyAgICBjb25fLT5SZWFkQ2FuY2VsKCk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50TWVudSgpCit7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJcblxuIgorCSAgICAiTWVudTpcbiIKKwkgICAgIiAgYSAgICBTdGFydCBiaWRpciBzb3VuZFxuIgorCSAgICAiICB0ICAgIFN0YXJ0IHJlY29yZGVyXG4iCisJICAgICIgIHAgICAgU3RhcnQgcGxheWVyXG4iCisJICAgICIgIGQgICAgU3RvcCAmIGNsb3NlIHNvdW5kXG4iCisJICAgICIgIHcgICAgUXVpdFxuIikpOworfQorCisvLyBJbXBsZW1lbnRhdGlvbjogY2FsbGVkIHdoZW4gcmVhZCBoYXMgY29tcGxldGVkLgordm9pZCBDb25zb2xlVUk6OlJ1bkwoKQoreworICAgIFRLZXlDb2RlIGtjID0gY29uXy0+S2V5Q29kZSgpOworICAgIHBqX2Jvb2xfdCByZXNjaGVkdWxlID0gUEpfVFJVRTsKKworICAgIHN3aXRjaCAoa2MpIHsKKyAgICBjYXNlICd3JzoKKwkgICAgc25kX3N0b3AoKTsKKwkgICAgQ0FjdGl2ZVNjaGVkdWxlcjo6U3RvcCgpOworCSAgICByZXNjaGVkdWxlID0gUEpfRkFMU0U7CisJICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOgorICAgIAlzbmRfc3RhcnQoUEpNRURJQV9ESVJfQ0FQVFVSRV9QTEFZQkFDSyk7CisJYnJlYWs7CisgICAgY2FzZSAndCc6CisgICAgCXNuZF9zdGFydChQSk1FRElBX0RJUl9DQVBUVVJFKTsKKwlicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICAJc25kX3N0YXJ0KFBKTUVESUFfRElSX1BMQVlCQUNLKTsKKyAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAJc25kX3N0b3AoKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiS2V5Y29kZSAnJWMnICglZCkgaXMgcHJlc3NlZCIsCisJCSAgICAgIGtjLCBrYykpOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICBQcmludE1lbnUoKTsKKworICAgIGlmIChyZXNjaGVkdWxlKQorCVJ1bigpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCBhcHBfbWFpbigpCit7CisgICAgaWYgKGFwcF9pbml0KCkgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gUnVuIHRoZSBVSQorICAgIENvbnNvbGVVSSAqY29uID0gbmV3IENvbnNvbGVVSShjb25zb2xlKTsKKworICAgIGNvbi0+UnVuKCk7CisKKyAgICBQcmludE1lbnUoKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpTdGFydCgpOworCisgICAgZGVsZXRlIGNvbjsKKworICAgIGFwcF9maW5pKCk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N5bXNuZHRlc3QvbWFpbl9zeW1iaWFuLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3N5bXNuZHRlc3QvbWFpbl9zeW1iaWFuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYwYTZjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3ltc25kdGVzdC9tYWluX3N5bWJpYW4uY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qICRJZDogbWFpbl9zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaW5jbHVkZSA8ZTMyc3RkLmg+CisjaW5jbHVkZSA8ZTMyYmFzZS5oPgorI2luY2x1ZGUgPGUzMnN0ZC5oPgorI2luY2x1ZGUgPGUzMmNvbnMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisvLyAgR2xvYmFsIFZhcmlhYmxlcworQ0NvbnNvbGVCYXNlKiBjb25zb2xlOworCisvLyBOZWVkZWQgYnkgQVBTCitUUHRyQyBBUFBfVUlEID0gX0woIkEwMDAwMDBFIik7CisKK2ludCBhcHBfbWFpbigpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTE9DQUxfQyB2b2lkIERvU3RhcnRMKCkKK3sKKyAgICBDQWN0aXZlU2NoZWR1bGVyICpzY2hlZHVsZXIgPSBuZXcgKEVMZWF2ZSkgQ0FjdGl2ZVNjaGVkdWxlcjsKKyAgICBDbGVhbnVwU3RhY2s6OlB1c2hMKHNjaGVkdWxlcik7CisgICAgQ0FjdGl2ZVNjaGVkdWxlcjo6SW5zdGFsbChzY2hlZHVsZXIpOworCisgICAgYXBwX21haW4oKTsKKworICAgIENBY3RpdmVTY2hlZHVsZXI6Okluc3RhbGwoTlVMTCk7CisgICAgQ2xlYW51cFN0YWNrOjpQb3Aoc2NoZWR1bGVyKTsKKyAgICBkZWxldGUgc2NoZWR1bGVyOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRTMyTWFpbigpCitHTERFRl9DIFRJbnQgRTMyTWFpbigpCit7CisgICAgLy8gTWFyayBoZWFwIHVzYWdlCisgICAgX19VSEVBUF9NQVJLOworCisgICAgLy8gQ3JlYXRlIGNsZWFudXAgc3RhY2sKKyAgICBDVHJhcENsZWFudXAqIGNsZWFudXAgPSBDVHJhcENsZWFudXA6Ok5ldygpOworCisgICAgLy8gQ3JlYXRlIG91dHB1dCBjb25zb2xlCisgICAgVFJBUEQoY3JlYXRlRXJyb3IsIGNvbnNvbGUgPSBDb25zb2xlOjpOZXdMKF9MKCJDb25zb2xlIiksIFRTaXplKEtDb25zRnVsbFNjcmVlbixLQ29uc0Z1bGxTY3JlZW4pKSk7CisgICAgaWYgKGNyZWF0ZUVycm9yKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3I7CisKKyAgICBUUkFQRChzdGFydEVycm9yLCBEb1N0YXJ0TCgpKTsKKworICAgIC8vY29uc29sZS0+UHJpbnRmKF9MKCJbcHJlc3MgYW55IGtleSB0byBjbG9zZV1cbiIpKTsKKyAgICAvL2NvbnNvbGUtPkdldGNoKCk7CisKKyAgICBkZWxldGUgY29uc29sZTsKKyAgICBkZWxldGUgY2xlYW51cDsKKworICAgIENsb3NlU1RETElCKCk7CisKKyAgICAvLyBNYXJrIGVuZCBvZiBoZWFwIHVzYWdlLCBkZXRlY3QgbWVtb3J5IGxlYWtzCisgICAgX19VSEVBUF9NQVJLRU5EOworICAgIHJldHVybiBLRXJyTm9uZTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3ltc25kdGVzdC9zeW1zbmR0ZXN0X3JlZy5yc3MgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy9zeW1zbmR0ZXN0L3N5bXNuZHRlc3RfcmVnLnJzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJmN2JmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvc3ltc25kdGVzdC9zeW1zbmR0ZXN0X3JlZy5yc3MKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPGFwcGluZm8ucmg+DQorDQorVUlEMiBLVWlkQXBwUmVnaXN0cmF0aW9uUmVzb3VyY2VGaWxlDQorVUlEMyAweEEwMDAwMDBFDQorDQorUkVTT1VSQ0UgQVBQX1JFR0lTVFJBVElPTl9JTkZPDQorew0KKyAgICBhcHBfZmlsZT0ic3ltc25kdGVzdCI7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS9JTlNUQUxMLlRYVCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS9JTlNUQUxMLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjk0YzkzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL0lOU1RBTEwuVFhUCkBAIC0wLDAgKzEsMzIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICB2aWRndWkKKyAgICAgICAgICAgICAgICAgICAgICAgCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIFF0IGJhc2VkIHZpZGVvIEdVSSBzYW1wbGUuIAorCitSZXF1aXJlbWVudHM6Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLSBwanNpcCBidWlsdCB3aXRoIHZpZGVvIHN1cHBvcnQKKyAgLSBRdCBTREsgdmVyc2lvbiA0LjUgb3IgYWJvdmUgKHZlcnNpb24gPDQuNSBkb2Vzbid0IGhhdmUgQ29jb2Egc3VwcG9ydCkKKworQnVpbGQgaW5zdHJ1Y3Rpb25zOgorPT09PT09PT09PT09PT09PT09PQorICAtIEJ1aWxkIHBqc2lwIGZpcnN0CisgIC0gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBhcHByb3ByaWF0ZSBwbGF0Zm9ybSBiZWxvdzoKKworICAgIFZpc3VhbCBTdHVkaW8KKyAgICAtLS0tLS0tLS0tLS0tCisgICAgICAtIFJ1biB0aGlzIHRvIGdlbmVyYXRlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlOgorICAgICAgICAgYzo+IHFtYWtlIC10cCB2YworICAgICAgLSBPcGVuIHZpZGd1aS52Y3Byb2ogYW5kIGJ1aWxkIHRoZSBhcHAKKworCisgICAgTWFjIE9TIFgKKyAgICAtLS0tLS0tLQorICAgICAgJCBxbWFrZSAtc3BlYyBtYWN4LWcrKworICAgICAgJCBtYWtlCisKKyAgICBMaW51eCAKKyAgICAtLS0tLQorICAgICAgJCBxbWFrZQorICAgICAgJCBtYWtlCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS9wai1wa2djb25maWcubWFrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3BqLXBrZ2NvbmZpZy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzOWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS9wai1wa2djb25maWcubWFrCkBAIC0wLDAgKzEsMTAgQEAKK2luY2x1ZGUgLi4vLi4vLi4vYnVpbGQubWFrCisKK2NmbGFnczoKKwlAZWNobyAkKFBKX0NGTEFHUykgJChDRkxBR1MpCisKK2N4eGZsYWdzOiBjZmxhZ3MKKworbGRmbGFnczoKKwlAZWNobyAkKFBKX0xERkxBR1MpICQoUEpfTERMSUJTKSAkKExERkxBR1MpCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS92aWRndWkuY3BwIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3ZpZGd1aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxZDU0MAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS92aWRndWkuY3BwCkBAIC0wLDAgKzEsNzM1IEBACisvKiAkSWQ6IHZpZGd1aS5jcHAgNDA2MCAyMDEyLTA0LTE3IDA5OjU1OjMwWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInZpZGd1aS5oIgorI2luY2x1ZGUgInZpZHdpbi5oIgorCisjaWYgZGVmaW5lZChQSl9XSU4zMikKKyMgICBkZWZpbmUgU0RMX01BSU5fSEFORExFRAorI2VuZGlmCisKKyNpbmNsdWRlIDxTREwuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxRTWVzc2FnZUJveD4KKworI2RlZmluZSBMT0dfRklMRQkJInZpZGd1aS5sb2ciCisjZGVmaW5lIFRISVNfRklMRQkJInZpZGd1aS5jcHAiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFNFVFRJTkdTCisvLworCisvLworLy8gVGhlc2UgY29uZmlndXJlIFNJUCByZWdpc3RyYXRpb24KKy8vCisjZGVmaW5lIFVTRV9SRUdJU1RSQVRJT04JMAorI2RlZmluZSBTSVBfRE9NQUlOCQkicGpzaXAub3JnIgorI2RlZmluZSBTSVBfVVNFUk5BTUUJCSJ2aWRndWkiCisjZGVmaW5lIFNJUF9QQVNTV09SRAkJInNlY3JldCIKKyNkZWZpbmUgU0lQX1BPUlQJCTUwODAKKyNkZWZpbmUgU0lQX1RDUAkJCTEKKworLy8KKy8vIE5BVCBoZWxwZXIgc2V0dGluZ3MKKy8vCisjZGVmaW5lIFVTRV9JQ0UJCQkxCisjZGVmaW5lIFVTRV9TVFVOCQkwCisjZGVmaW5lIFNUVU5fU1JWCQkic3R1bi5wanNpcC5vcmciCisKKy8vCisvLyBEZXZpY2VzIHNldHRpbmdzCisvLworI2RlZmluZSBERUZBVUxUX0NBUF9ERVYJCVBKTUVESUFfVklEX0RFRkFVTFRfQ0FQVFVSRV9ERVYKKy8vI2RlZmluZSBERUZBVUxUX0NBUF9ERVYJCTEKKyNkZWZpbmUgREVGQVVMVF9SRU5EX0RFVglQSk1FRElBX1ZJRF9ERUZBVUxUX1JFTkRFUl9ERVYKKworCisvLworLy8gRW5kIG9mIFNldHRpbmdzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitNYWluV2luICpNYWluV2luOjp0aGVJbnN0YW5jZV87CisKK01haW5XaW46Ok1haW5XaW4oUVdpZGdldCAqcGFyZW50KQorOiBRV2lkZ2V0KHBhcmVudCksIGFjY291bnRJZF8oLTEpLCBjdXJyZW50Q2FsbF8oLTEpLAorICBwcmV2aWV3X29uKGZhbHNlKSwgdmlkZW9fKE5VTEwpLCB2aWRlb19wcmV2XyhOVUxMKQoreworICAgIHRoZUluc3RhbmNlXyA9IHRoaXM7CisKKyAgICBpbml0TGF5b3V0KCk7CisgICAgZW1pdCBzaWduYWxDYWxsUmVsZWFzZWQoKTsKK30KKworTWFpbldpbjo6fk1haW5XaW4oKQoreworICAgIHF1aXQoKTsKKyAgICB0aGVJbnN0YW5jZV8gPSBOVUxMOworfQorCitNYWluV2luICpNYWluV2luOjppbnN0YW5jZSgpCit7CisgICAgcmV0dXJuIHRoZUluc3RhbmNlXzsKK30KKwordm9pZCBNYWluV2luOjppbml0TGF5b3V0KCkKK3sKKyAgICAvL3N0YXR1c0Jhcl8gPSBuZXcgUVN0YXR1c0Jhcih0aGlzKTsKKworICAgIC8qIG1haW4gbGF5b3V0ICovCisgICAgUUhCb3hMYXlvdXQgKmhib3hfbWFpbiA9IG5ldyBRSEJveExheW91dDsKKyAgICAvL1FWQm94TGF5b3V0ICp2Ym94X2xlZnQgPSBuZXcgUVZCb3hMYXlvdXQ7CisgICAgdmJveF9sZWZ0ID0gbmV3IFFWQm94TGF5b3V0OworICAgIFFWQm94TGF5b3V0ICp2Ym94X3JpZ2h0ID0gbmV3IFFWQm94TGF5b3V0OworICAgIGhib3hfbWFpbi0+YWRkTGF5b3V0KHZib3hfbGVmdCk7CisgICAgaGJveF9tYWluLT5hZGRMYXlvdXQodmJveF9yaWdodCk7CisKKyAgICAvKiBMZWZ0IHBhbmUgKi8KKyAgICBRSEJveExheW91dCAqaGJveF91cmwgPSBuZXcgUUhCb3hMYXlvdXQ7CisgICAgaGJveF91cmwtPmFkZFdpZGdldChuZXcgUUxhYmVsKHRyKCJVcmw6IikpKTsKKyAgICBoYm94X3VybC0+YWRkV2lkZ2V0KHVybF89bmV3IFFMaW5lRWRpdCh0cigic2lwOiIpKSwgMSk7CisgICAgdmJveF9sZWZ0LT5hZGRMYXlvdXQoaGJveF91cmwpOworCisgICAgLyogUmlnaHQgcGFuZSAqLworICAgIHZib3hfcmlnaHQtPmFkZFdpZGdldCgobG9jYWxVcmlfID0gbmV3IFFMYWJlbCkpOworICAgIHZib3hfcmlnaHQtPmFkZFdpZGdldCgodmlkRW5hYmxlZF8gPSBuZXcgUUNoZWNrQm94KHRyKCJFbmFibGUgJnZpZGVvIikpKSk7CisgICAgdmJveF9yaWdodC0+YWRkV2lkZ2V0KChwcmV2aWV3QnV0dG9uXz1uZXcgUVB1c2hCdXR0b24odHIoIlN0YXJ0ICZQcmV2aWV3IikpKSk7CisgICAgdmJveF9yaWdodC0+YWRkV2lkZ2V0KChjYWxsQnV0dG9uXz1uZXcgUVB1c2hCdXR0b24odHIoIkNhbGwiKSkpKTsKKyAgICB2Ym94X3JpZ2h0LT5hZGRXaWRnZXQoKGhhbmd1cEJ1dHRvbl89bmV3IFFQdXNoQnV0dG9uKHRyKCJIYW5ndXAiKSkpKTsKKyAgICB2Ym94X3JpZ2h0LT5hZGRXaWRnZXQoKHF1aXRCdXR0b25fPW5ldyBRUHVzaEJ1dHRvbih0cigiUXVpdCIpKSkpOworCisjaWYgUEpNRURJQV9IQVNfVklERU8KKyAgICB2aWRFbmFibGVkXy0+c2V0Q2hlY2tTdGF0ZShRdDo6Q2hlY2tlZCk7CisjZWxzZQorICAgIHZpZEVuYWJsZWRfLT5zZXRDaGVja1N0YXRlKFF0OjpVbmNoZWNrZWQpOworICAgIHZpZEVuYWJsZWRfLT5zZXRFbmFibGVkKGZhbHNlKTsKKyNlbmRpZgorCisgICAgLyogT3V0ZXN0IGxheW91dCAqLworICAgIFFWQm94TGF5b3V0ICp2Ym94X291dGVzdCA9IG5ldyBRVkJveExheW91dDsKKyAgICB2Ym94X291dGVzdC0+YWRkTGF5b3V0KGhib3hfbWFpbik7CisgICAgdmJveF9vdXRlc3QtPmFkZFdpZGdldCgoc3RhdHVzQmFyXyA9IG5ldyBRTGFiZWwpKTsKKworICAgIHNldExheW91dCh2Ym94X291dGVzdCk7CisKKyAgICBjb25uZWN0KHByZXZpZXdCdXR0b25fLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChwcmV2aWV3KCkpKTsKKyAgICBjb25uZWN0KGNhbGxCdXR0b25fLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChjYWxsKCkpKTsKKyAgICBjb25uZWN0KGhhbmd1cEJ1dHRvbl8sIFNJR05BTChjbGlja2VkKCkpLCB0aGlzLCBTTE9UKGhhbmd1cCgpKSk7CisgICAgY29ubmVjdChxdWl0QnV0dG9uXywgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1QocXVpdCgpKSk7CisgICAgLy9jb25uZWN0KHRoaXMsIFNJR05BTChjbG9zZSgpKSwgdGhpcywgU0xPVChxdWl0KCkpKTsKKyAgICBjb25uZWN0KHZpZEVuYWJsZWRfLCBTSUdOQUwoc3RhdGVDaGFuZ2VkKGludCkpLCB0aGlzLCBTTE9UKG9uVmlkRW5hYmxlZENoYW5nZWQoaW50KSkpOworCisgICAgLy8gVUkgdXBkYXRlcyBtdXN0IGJlIGRvbmUgaW4gdGhlIFVJIHRocmVhZCEKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChzaWduYWxOZXdDYWxsKGludCwgYm9vbCkpLAorCSAgICB0aGlzLCBTTE9UKG9uTmV3Q2FsbChpbnQsIGJvb2wpKSk7CisgICAgY29ubmVjdCh0aGlzLCBTSUdOQUwoc2lnbmFsQ2FsbFJlbGVhc2VkKCkpLAorCSAgICB0aGlzLCBTTE9UKG9uQ2FsbFJlbGVhc2VkKCkpKTsKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChzaWduYWxJbml0VmlkZW9XaW5kb3coKSksCisJICAgIHRoaXMsIFNMT1QoaW5pdFZpZGVvV2luZG93KCkpKTsKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChzaWduYWxTaG93U3RhdHVzKGNvbnN0IFFTdHJpbmcmKSksCisJICAgIHRoaXMsIFNMT1QoZG9TaG93U3RhdHVzKGNvbnN0IFFTdHJpbmcmKSkpOworfQorCit2b2lkIE1haW5XaW46OnF1aXQoKQoreworICAgIGRlbGV0ZSB2aWRlb19wcmV2XzsKKyAgICB2aWRlb19wcmV2XyA9IE5VTEw7CisgICAgZGVsZXRlIHZpZGVvXzsKKyAgICB2aWRlb18gPSBOVUxMOworCisgICAgcGpzdWFfZGVzdHJveSgpOworICAgIHFBcHAtPnF1aXQoKTsKK30KKwordm9pZCBNYWluV2luOjpzaG93U3RhdHVzKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiJXMiLCBtc2cpKTsKKworICAgIFFTdHJpbmcgbXNnXyA9IFFTdHJpbmc6OmZyb21VdGY4KG1zZyk7CisgICAgZW1pdCBzaWduYWxTaG93U3RhdHVzKG1zZ18pOworfQorCit2b2lkIE1haW5XaW46OmRvU2hvd1N0YXR1cyhjb25zdCBRU3RyaW5nJiBtc2cpCit7CisgICAgLy9zdGF0dXNCYXJfLT5zaG93TWVzc2FnZShtc2cpOworICAgIHN0YXR1c0Jhcl8tPnNldFRleHQobXNnKTsKK30KKwordm9pZCBNYWluV2luOjpzaG93RXJyb3IoY29uc3QgY2hhciAqdGl0bGUsIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworICAgIGNoYXIgZXJybGluZVsxMjBdOworCisgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKyAgICBzbnByaW50ZihlcnJsaW5lLCBzaXplb2YoZXJybGluZSksICIlcyBlcnJvcjogJXMiLCB0aXRsZSwgZXJybXNnKTsKKyAgICBzaG93U3RhdHVzKGVycmxpbmUpOworfQorCit2b2lkIE1haW5XaW46Om9uVmlkRW5hYmxlZENoYW5nZWQoaW50IHN0YXRlKQoreworICAgIHBqc3VhX2NhbGxfc2V0dGluZyBjYWxsX3NldHRpbmc7CisKKyAgICBpZiAoY3VycmVudENhbGxfID09IC0xKQorCXJldHVybjsKKworICAgIHBqc3VhX2NhbGxfc2V0dGluZ19kZWZhdWx0KCZjYWxsX3NldHRpbmcpOworICAgIGNhbGxfc2V0dGluZy52aWRfY250ID0gKHN0YXRlID09IFF0OjpDaGVja2VkKTsKKworICAgIHBqc3VhX2NhbGxfcmVpbnZpdGUyKGN1cnJlbnRDYWxsXywgJmNhbGxfc2V0dGluZywgTlVMTCk7Cit9CisKK3ZvaWQgTWFpbldpbjo6b25OZXdDYWxsKGludCBjaWQsIGJvb2wgaW5jb21pbmcpCit7CisgICAgcGpzdWFfY2FsbF9pbmZvIGNpOworCisgICAgcGpfYXNzZXJ0KGN1cnJlbnRDYWxsXyA9PSAtMSk7CisgICAgY3VycmVudENhbGxfID0gY2lkOworCisgICAgcGpzdWFfY2FsbF9nZXRfaW5mbyhjaWQsICZjaSk7CisgICAgdXJsXy0+c2V0VGV4dChjaS5yZW1vdGVfaW5mby5wdHIpOworICAgIHVybF8tPnNldEVuYWJsZWQoZmFsc2UpOworICAgIGhhbmd1cEJ1dHRvbl8tPnNldEVuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoaW5jb21pbmcpIHsKKwljYWxsQnV0dG9uXy0+c2V0VGV4dCh0cigiQW5zd2VyIikpOworCWNhbGxCdXR0b25fLT5zZXRFbmFibGVkKHRydWUpOworICAgIH0gZWxzZSB7CisJY2FsbEJ1dHRvbl8tPnNldEVuYWJsZWQoZmFsc2UpOworICAgIH0KKworICAgIC8vdmlkZW9fLT5zZXRUZXh0KGNpLnJlbW90ZV9jb250YWN0LnB0cik7CisgICAgLy92aWRlb18tPnNldFdpbmRvd1RpdGxlKGNpLnJlbW90ZV9jb250YWN0LnB0cik7Cit9CisKK3ZvaWQgTWFpbldpbjo6b25DYWxsUmVsZWFzZWQoKQoreworICAgIHVybF8tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgY2FsbEJ1dHRvbl8tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgY2FsbEJ1dHRvbl8tPnNldFRleHQodHIoIkNhbGwiKSk7CisgICAgaGFuZ3VwQnV0dG9uXy0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgY3VycmVudENhbGxfID0gLTE7CisKKyAgICBkZWxldGUgdmlkZW9fOworICAgIHZpZGVvXyA9IE5VTEw7Cit9CisKK3ZvaWQgTWFpbldpbjo6cHJldmlldygpCit7CisgICAgaWYgKHByZXZpZXdfb24pIHsKKwlkZWxldGUgdmlkZW9fcHJldl87CisJdmlkZW9fcHJldl8gPSBOVUxMOworCisJcGpzdWFfdmlkX3ByZXZpZXdfc3RvcChERUZBVUxUX0NBUF9ERVYpOworCisJc2hvd1N0YXR1cygiUHJldmlldyBzdG9wcGVkIik7CisJcHJldmlld0J1dHRvbl8tPnNldFRleHQodHIoIlN0YXJ0ICZQcmV2aWV3IikpOworICAgIH0gZWxzZSB7CisJcGpzdWFfdmlkX3dpbl9pZCB3aWQ7CisJcGpzdWFfdmlkX3dpbl9pbmZvIHdpOworCXBqc3VhX3ZpZF9wcmV2aWV3X3BhcmFtIHByZV9wYXJhbTsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisKKwlwanN1YV92aWRfcHJldmlld19wYXJhbV9kZWZhdWx0KCZwcmVfcGFyYW0pOworCXByZV9wYXJhbS5yZW5kX2lkID0gREVGQVVMVF9SRU5EX0RFVjsKKwlwcmVfcGFyYW0uc2hvdyA9IFBKX0ZBTFNFOworCisJc3RhdHVzID0gcGpzdWFfdmlkX3ByZXZpZXdfc3RhcnQoREVGQVVMVF9DQVBfREVWLCAmcHJlX3BhcmFtKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKwkgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwkgICAgUU1lc3NhZ2VCb3g6OmNyaXRpY2FsKDAsICJFcnJvciBjcmVhdGluZyBwcmV2aWV3IiwgZXJybXNnKTsKKwkgICAgcmV0dXJuOworCX0KKwl3aWQgPSBwanN1YV92aWRfcHJldmlld19nZXRfd2luKERFRkFVTFRfQ0FQX0RFVik7CisJcGpzdWFfdmlkX3dpbl9nZXRfaW5mbyh3aWQsICZ3aSk7CisKKwl2aWRlb19wcmV2XyA9IG5ldyBWaWRXaW4oJndpLmh3bmQpOworICAgICAgICB2aWRlb19wcmV2Xy0+cHV0SW50b0xheW91dCh2Ym94X2xlZnQpOworCS8vVXNpbmcgdGhpcyB3aWxsIGNhdXNlIFNETCB3aW5kb3cgdG8gZGlzcGxheSBibGFuaworCS8vc2NyZWVuIHNvbWV0aW1lcywgcHJvYmFibHkgYmVjYXVzZSBpdCdzIHVzaW5nIGRpZmZlcmVudAorCS8vWDExIERpc3BsYXkKKwkvL3N0YXR1cyA9IHBqc3VhX3ZpZF93aW5fc2V0X3Nob3cod2lkLCBQSl9UUlVFKTsKKwkvL1RoaXMgaXMgaGFuZGxlZCBieSBWaWRXaW4gbm93CisJLy92aWRlb19wcmV2Xy0+c2hvd19zZGwoKTsKKwlzaG93U3RhdHVzKCJQcmV2aWV3IHN0YXJ0ZWQiKTsKKworCXByZXZpZXdCdXR0b25fLT5zZXRUZXh0KHRyKCJTdG9wICZQcmV2aWV3IikpOworICAgIH0KKyAgICBwcmV2aWV3X29uID0gIXByZXZpZXdfb247Cit9CisKKwordm9pZCBNYWluV2luOjpjYWxsKCkKK3sKKyAgICBpZiAoY2FsbEJ1dHRvbl8tPnRleHQoKSA9PSAiQW5zd2VyIikgeworCXBqc3VhX2NhbGxfc2V0dGluZyBjYWxsX3NldHRpbmc7CisKKwlwal9hc3NlcnQoY3VycmVudENhbGxfICE9IC0xKTsKKworCXBqc3VhX2NhbGxfc2V0dGluZ19kZWZhdWx0KCZjYWxsX3NldHRpbmcpOworCWNhbGxfc2V0dGluZy52aWRfY250ID0gKHZpZEVuYWJsZWRfLT5jaGVja1N0YXRlKCk9PVF0OjpDaGVja2VkKTsKKworCXBqc3VhX2NhbGxfYW5zd2VyMihjdXJyZW50Q2FsbF8sICZjYWxsX3NldHRpbmcsIDIwMCwgTlVMTCwgTlVMTCk7CisJY2FsbEJ1dHRvbl8tPnNldEVuYWJsZWQoZmFsc2UpOworICAgIH0gZWxzZSB7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCVFTdHJpbmcgZHN0ID0gdXJsXy0+dGV4dCgpOworCWNoYXIgdXJpWzI1Nl07CisJcGpzdWFfY2FsbF9zZXR0aW5nIGNhbGxfc2V0dGluZzsKKworCXBqX2Fuc2lfc3RybmNweSh1cmksIGRzdC50b0FzY2lpKCkuZGF0YSgpLCBzaXplb2YodXJpKSk7CisJcGpfc3RyX3QgdXJpMiA9IHBqX3N0cigoY2hhciopdXJpKTsKKworCXBqX2Fzc2VydChjdXJyZW50Q2FsbF8gPT0gLTEpOworCisJcGpzdWFfY2FsbF9zZXR0aW5nX2RlZmF1bHQoJmNhbGxfc2V0dGluZyk7CisJY2FsbF9zZXR0aW5nLnZpZF9jbnQgPSAodmlkRW5hYmxlZF8tPmNoZWNrU3RhdGUoKT09UXQ6OkNoZWNrZWQpOworCisJc3RhdHVzID0gcGpzdWFfY2FsbF9tYWtlX2NhbGwoYWNjb3VudElkXywgJnVyaTIsICZjYWxsX3NldHRpbmcsCisJCQkJICAgICAgTlVMTCwgTlVMTCwgJmN1cnJlbnRDYWxsXyk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHNob3dFcnJvcigibWFrZSBjYWxsIiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKK3ZvaWQgTWFpbldpbjo6aGFuZ3VwKCkKK3sKKyAgICBwal9hc3NlcnQoY3VycmVudENhbGxfICE9IC0xKTsKKyAgICAvL3Bqc3VhX2NhbGxfaGFuZ3VwKGN1cnJlbnRDYWxsXywgUEpTSVBfU0NfQlVTWV9IRVJFLCBOVUxMLCBOVUxMKTsKKyAgICBwanN1YV9jYWxsX2hhbmd1cF9hbGwoKTsKKyAgICBlbWl0IHNpZ25hbENhbGxSZWxlYXNlZCgpOworfQorCisKK3ZvaWQgTWFpbldpbjo6aW5pdFZpZGVvV2luZG93KCkKK3sKKyAgICBwanN1YV9jYWxsX2luZm8gY2k7CisgICAgdW5zaWduZWQgaTsKKworICAgIGlmIChjdXJyZW50Q2FsbF8gPT0gLTEpCisJcmV0dXJuOworCisgICAgZGVsZXRlIHZpZGVvXzsKKyAgICB2aWRlb18gPSBOVUxMOworCisgICAgcGpzdWFfY2FsbF9nZXRfaW5mbyhjdXJyZW50Q2FsbF8sICZjaSk7CisgICAgZm9yIChpID0gMDsgaSA8IGNpLm1lZGlhX2NudDsgKytpKSB7CisJaWYgKChjaS5tZWRpYVtpXS50eXBlID09IFBKTUVESUFfVFlQRV9WSURFTykgJiYKKwkgICAgKGNpLm1lZGlhW2ldLmRpciAmIFBKTUVESUFfRElSX0RFQ09ESU5HKSkKKwl7CisJICAgIHBqc3VhX3ZpZF93aW5faW5mbyB3aTsKKwkgICAgcGpzdWFfdmlkX3dpbl9nZXRfaW5mbyhjaS5tZWRpYVtpXS5zdHJlYW0udmlkLndpbl9pbiwgJndpKTsKKworCSAgICB2aWRlb189IG5ldyBWaWRXaW4oJndpLmh3bmQpOworICAgICAgICAgICAgdmlkZW9fLT5wdXRJbnRvTGF5b3V0KHZib3hfbGVmdCk7CisKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKwordm9pZCBNYWluV2luOjpvbl9yZWdfc3RhdGUocGpzdWFfYWNjX2lkIGFjY19pZCkKK3sKKyAgICBwanN1YV9hY2NfaW5mbyBpbmZvOworCisgICAgcGpzdWFfYWNjX2dldF9pbmZvKGFjY19pZCwgJmluZm8pOworCisgICAgY2hhciByZWdfc3RhdHVzWzgwXTsKKyAgICBjaGFyIHN0YXR1c1sxMjBdOworCisgICAgaWYgKCFpbmZvLmhhc19yZWdpc3RyYXRpb24pIHsKKwlwal9hbnNpX3NucHJpbnRmKHJlZ19zdGF0dXMsIHNpemVvZihyZWdfc3RhdHVzKSwgIiUuKnMiLAorCQkJIChpbnQpaW5mby5zdGF0dXNfdGV4dC5zbGVuLAorCQkJIGluZm8uc3RhdHVzX3RleHQucHRyKTsKKworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zbnByaW50ZihyZWdfc3RhdHVzLCBzaXplb2YocmVnX3N0YXR1cyksCisJCQkgIiVkLyUuKnMgKGV4cGlyZXM9JWQpIiwKKwkJCSBpbmZvLnN0YXR1cywKKwkJCSAoaW50KWluZm8uc3RhdHVzX3RleHQuc2xlbiwKKwkJCSBpbmZvLnN0YXR1c190ZXh0LnB0ciwKKwkJCSBpbmZvLmV4cGlyZXMpOworCisgICAgfQorCisgICAgc25wcmludGYoc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwKKwkgICAgICIlLipzOiAlc1xuIiwKKwkgICAgIChpbnQpaW5mby5hY2NfdXJpLnNsZW4sIGluZm8uYWNjX3VyaS5wdHIsCisJICAgICByZWdfc3RhdHVzKTsKKyAgICBzaG93U3RhdHVzKHN0YXR1cyk7Cit9CisKK3ZvaWQgTWFpbldpbjo6b25fY2FsbF9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQsIHBqc2lwX2V2ZW50ICplKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBjaTsKKworICAgIFBKX1VOVVNFRF9BUkcoZSk7CisKKyAgICBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjaSk7CisKKyAgICBpZiAoY3VycmVudENhbGxfID09IC0xICYmIGNpLnN0YXRlIDwgUEpTSVBfSU5WX1NUQVRFX0RJU0NPTk5FQ1RFRCAmJgorCWNpLnJvbGUgPT0gUEpTSVBfUk9MRV9VQUMpCisgICAgeworCWVtaXQgc2lnbmFsTmV3Q2FsbChjYWxsX2lkLCBmYWxzZSk7CisgICAgfQorCisgICAgY2hhciBzdGF0dXNbODBdOworICAgIGlmIChjaS5zdGF0ZSA9PSBQSlNJUF9JTlZfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisJc25wcmludGYoc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgIkNhbGwgaXMgJXMgKCVzKSIsCisJICAgICAgICAgY2kuc3RhdGVfdGV4dC5wdHIsCisJICAgICAgICAgY2kubGFzdF9zdGF0dXNfdGV4dC5wdHIpOworCXNob3dTdGF0dXMoc3RhdHVzKTsKKwllbWl0IHNpZ25hbENhbGxSZWxlYXNlZCgpOworICAgIH0gZWxzZSB7CisJc25wcmludGYoc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgIkNhbGwgaXMgJXMiLCBwanNpcF9pbnZfc3RhdGVfbmFtZShjaS5zdGF0ZSkpOworCXNob3dTdGF0dXMoc3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTWFpbldpbjo6b25faW5jb21pbmdfY2FsbChwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgUEpfVU5VU0VEX0FSRyhhY2NfaWQpOworICAgIFBKX1VOVVNFRF9BUkcocmRhdGEpOworCisgICAgaWYgKGN1cnJlbnRDYWxsXyAhPSAtMSkgeworCXBqc3VhX2NhbGxfYW5zd2VyKGNhbGxfaWQsIFBKU0lQX1NDX0JVU1lfSEVSRSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGVtaXQgc2lnbmFsTmV3Q2FsbChjYWxsX2lkLCB0cnVlKTsKKworICAgIHBqc3VhX2NhbGxfaW5mbyBjaTsKKyAgICBjaGFyIHN0YXR1c1s4MF07CisKKyAgICBwanN1YV9jYWxsX2dldF9pbmZvKGNhbGxfaWQsICZjaSk7CisgICAgc25wcmludGYoc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgIkluY29taW5nIGNhbGwgZnJvbSAlLipzIiwKKyAgICAgICAgICAgICAoaW50KWNpLnJlbW90ZV9pbmZvLnNsZW4sIGNpLnJlbW90ZV9pbmZvLnB0cik7CisgICAgc2hvd1N0YXR1cyhzdGF0dXMpOworfQorCit2b2lkIE1haW5XaW46Om9uX2NhbGxfbWVkaWFfc3RhdGUocGpzdWFfY2FsbF9pZCBjYWxsX2lkKQoreworICAgIHBqc3VhX2NhbGxfaW5mbyBjaTsKKworICAgIHBqc3VhX2NhbGxfZ2V0X2luZm8oY2FsbF9pZCwgJmNpKTsKKworICAgIGZvciAodW5zaWduZWQgaT0wOyBpPGNpLm1lZGlhX2NudDsgKytpKSB7CisJaWYgKGNpLm1lZGlhW2ldLnR5cGUgPT0gUEpNRURJQV9UWVBFX0FVRElPKSB7CisJICAgIHN3aXRjaCAoY2kubWVkaWFbaV0uc3RhdHVzKSB7CisJICAgIGNhc2UgUEpTVUFfQ0FMTF9NRURJQV9BQ1RJVkU6CisJCXBqc3VhX2NvbmZfY29ubmVjdChjaS5tZWRpYVtpXS5zdHJlYW0uYXVkLmNvbmZfc2xvdCwgMCk7CisJCXBqc3VhX2NvbmZfY29ubmVjdCgwLCBjaS5tZWRpYVtpXS5zdHJlYW0uYXVkLmNvbmZfc2xvdCk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSBpZiAoY2kubWVkaWFbaV0udHlwZSA9PSBQSk1FRElBX1RZUEVfVklERU8pIHsKKwkgICAgZW1pdCBzaWduYWxJbml0VmlkZW9XaW5kb3coKTsKKwl9CisgICAgfQorfQorCisvLworLy8gcGpzdWEgY2FsbGJhY2tzCisvLworc3RhdGljIHZvaWQgb25fcmVnX3N0YXRlKHBqc3VhX2FjY19pZCBhY2NfaWQpCit7CisgICAgTWFpbldpbjo6aW5zdGFuY2UoKS0+b25fcmVnX3N0YXRlKGFjY19pZCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2NhbGxfc3RhdGUocGpzdWFfY2FsbF9pZCBjYWxsX2lkLCBwanNpcF9ldmVudCAqZSkKK3sKKyAgICBNYWluV2luOjppbnN0YW5jZSgpLT5vbl9jYWxsX3N0YXRlKGNhbGxfaWQsIGUpOworfQorCitzdGF0aWMgdm9pZCBvbl9pbmNvbWluZ19jYWxsKHBqc3VhX2FjY19pZCBhY2NfaWQsIHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgTWFpbldpbjo6aW5zdGFuY2UoKS0+b25faW5jb21pbmdfY2FsbChhY2NfaWQsIGNhbGxfaWQsIHJkYXRhKTsKK30KKworc3RhdGljIHZvaWQgb25fY2FsbF9tZWRpYV9zdGF0ZShwanN1YV9jYWxsX2lkIGNhbGxfaWQpCit7CisgICAgTWFpbldpbjo6aW5zdGFuY2UoKS0+b25fY2FsbF9tZWRpYV9zdGF0ZShjYWxsX2lkKTsKK30KKworLy8KKy8vIGluaXRTdGFjaygpCisvLworYm9vbCBNYWluV2luOjppbml0U3RhY2soKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8vc2hvd1N0YXR1cygiQ3JlYXRpbmcgc3RhY2suLiIpOworICAgIHN0YXR1cyA9IHBqc3VhX2NyZWF0ZSgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXNob3dFcnJvcigicGpzdWFfY3JlYXRlIiwgc3RhdHVzKTsKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2hvd1N0YXR1cygiSW5pdGlhbGl6aW5nIHN0YWNrLi4iKTsKKworICAgIHBqc3VhX2NvbmZpZyB1YV9jZmc7CisgICAgcGpzdWFfY29uZmlnX2RlZmF1bHQoJnVhX2NmZyk7CisgICAgcGpzdWFfY2FsbGJhY2sgdWFfY2I7CisgICAgcGpfYnplcm8oJnVhX2NiLCBzaXplb2YodWFfY2IpKTsKKyAgICB1YV9jZmcuY2Iub25fcmVnX3N0YXRlID0gJjo6b25fcmVnX3N0YXRlOworICAgIHVhX2NmZy5jYi5vbl9jYWxsX3N0YXRlID0gJjo6b25fY2FsbF9zdGF0ZTsKKyAgICB1YV9jZmcuY2Iub25faW5jb21pbmdfY2FsbCA9ICY6Om9uX2luY29taW5nX2NhbGw7CisgICAgdWFfY2ZnLmNiLm9uX2NhbGxfbWVkaWFfc3RhdGUgPSAmOjpvbl9jYWxsX21lZGlhX3N0YXRlOworI2lmIFVTRV9TVFVOCisgICAgdWFfY2ZnLnN0dW5fc3J2X2NudCA9IDE7CisgICAgdWFfY2ZnLnN0dW5fc3J2WzBdID0gcGpfc3RyKChjaGFyKilTVFVOX1NSVik7CisjZW5kaWYKKworICAgIHBqc3VhX2xvZ2dpbmdfY29uZmlnIGxvZ19jZmc7CisgICAgcGpzdWFfbG9nZ2luZ19jb25maWdfZGVmYXVsdCgmbG9nX2NmZyk7CisgICAgbG9nX2NmZy5sb2dfZmlsZW5hbWUgPSBwal9zdHIoKGNoYXIqKUxPR19GSUxFKTsKKworICAgIHBqc3VhX21lZGlhX2NvbmZpZyBtZWRfY2ZnOworICAgIHBqc3VhX21lZGlhX2NvbmZpZ19kZWZhdWx0KCZtZWRfY2ZnKTsKKyAgICBtZWRfY2ZnLmVuYWJsZV9pY2UgPSBVU0VfSUNFOworCisgICAgc3RhdHVzID0gcGpzdWFfaW5pdCgmdWFfY2ZnLCAmbG9nX2NmZywgJm1lZF9jZmcpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXNob3dFcnJvcigicGpzdWFfaW5pdCIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENyZWF0ZSBVRFAgYW5kIFRDUCB0cmFuc3BvcnRzCisgICAgLy8KKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIHVkcF9jZmc7CisgICAgcGpzdWFfdHJhbnNwb3J0X2lkIHVkcF9pZDsKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnX2RlZmF1bHQoJnVkcF9jZmcpOworICAgIHVkcF9jZmcucG9ydCA9IFNJUF9QT1JUOworCisgICAgc3RhdHVzID0gcGpzdWFfdHJhbnNwb3J0X2NyZWF0ZShQSlNJUF9UUkFOU1BPUlRfVURQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkcF9jZmcsICZ1ZHBfaWQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXNob3dFcnJvcigiVURQIHRyYW5zcG9ydCBjcmVhdGlvbiIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICBwanN1YV90cmFuc3BvcnRfaW5mbyB1ZHBfaW5mbzsKKyAgICBzdGF0dXMgPSBwanN1YV90cmFuc3BvcnRfZ2V0X2luZm8odWRwX2lkLCAmdWRwX2luZm8pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXNob3dFcnJvcigiVURQIHRyYW5zcG9ydCBpbmZvIiwgc3RhdHVzKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworI2lmIFNJUF9UQ1AKKyAgICBwanN1YV90cmFuc3BvcnRfY29uZmlnIHRjcF9jZmc7CisgICAgcGpzdWFfdHJhbnNwb3J0X2NvbmZpZ19kZWZhdWx0KCZ0Y3BfY2ZnKTsKKyAgICB0Y3BfY2ZnLnBvcnQgPSAwOworCisgICAgc3RhdHVzID0gcGpzdWFfdHJhbnNwb3J0X2NyZWF0ZShQSlNJUF9UUkFOU1BPUlRfVENQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRjcF9jZmcsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXNob3dFcnJvcigiVENQIHRyYW5zcG9ydCBjcmVhdGlvbiIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vCisgICAgLy8gQ3JlYXRlIGFjY291bnQKKyAgICAvLworICAgIHBqc3VhX2FjY19jb25maWcgYWNjX2NmZzsKKyAgICBwanN1YV9hY2NfY29uZmlnX2RlZmF1bHQoJmFjY19jZmcpOworI2lmIFVTRV9SRUdJU1RSQVRJT04KKyAgICBhY2NfY2ZnLmlkID0gcGpfc3RyKCAoY2hhciopIjxzaXA6IiBTSVBfVVNFUk5BTUUgIkAiIFNJUF9ET01BSU4gIj4iKTsKKyAgICBhY2NfY2ZnLnJlZ191cmkgPSBwal9zdHIoKGNoYXIqKSAoInNpcDoiIFNJUF9ET01BSU4pKTsKKyAgICBhY2NfY2ZnLmNyZWRfY291bnQgPSAxOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnJlYWxtID0gcGpfc3RyKChjaGFyKikiKiIpOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnNjaGVtZSA9IHBqX3N0cigoY2hhciopImRpZ2VzdCIpOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLnVzZXJuYW1lID0gcGpfc3RyKChjaGFyKilTSVBfVVNFUk5BTUUpOworICAgIGFjY19jZmcuY3JlZF9pbmZvWzBdLmRhdGEgPSBwal9zdHIoKGNoYXIqKVNJUF9QQVNTV09SRCk7CisKKyMgaWYgU0lQX1RDUAorICAgIGFjY19jZmcucHJveHlbYWNjX2NmZy5wcm94eV9jbnQrK10gPSBwal9zdHIoKGNoYXIqKSAiPHNpcDoiIFNJUF9ET01BSU4gIjt0cmFuc3BvcnQ9dGNwPiIpOworIyBlbmRpZgorCisjZWxzZQorICAgIGNoYXIgc2lwX2lkWzgwXTsKKyAgICBzbnByaW50ZihzaXBfaWQsIHNpemVvZihzaXBfaWQpLAorCSAgICAgInNpcDolc0AlLipzOiV1IiwgU0lQX1VTRVJOQU1FLAorCSAgICAgKGludCl1ZHBfaW5mby5sb2NhbF9uYW1lLmhvc3Quc2xlbiwKKwkgICAgIHVkcF9pbmZvLmxvY2FsX25hbWUuaG9zdC5wdHIsCisJICAgICB1ZHBfaW5mby5sb2NhbF9uYW1lLnBvcnQpOworICAgIGFjY19jZmcuaWQgPSBwal9zdHIoc2lwX2lkKTsKKyNlbmRpZgorCisgICAgYWNjX2NmZy52aWRfY2FwX2RldiA9IERFRkFVTFRfQ0FQX0RFVjsKKyAgICBhY2NfY2ZnLnZpZF9yZW5kX2RldiA9IERFRkFVTFRfUkVORF9ERVY7CisgICAgYWNjX2NmZy52aWRfaW5fYXV0b19zaG93ID0gUEpfVFJVRTsKKyAgICBhY2NfY2ZnLnZpZF9vdXRfYXV0b190cmFuc21pdCA9IFBKX1RSVUU7CisKKyAgICBzdGF0dXMgPSBwanN1YV9hY2NfYWRkKCZhY2NfY2ZnLCBQSl9UUlVFLCAmYWNjb3VudElkXyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc2hvd0Vycm9yKCJBY2NvdW50IGNyZWF0aW9uIiwgc3RhdHVzKTsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIGxvY2FsVXJpXy0+c2V0VGV4dChhY2NfY2ZnLmlkLnB0cik7CisKKyAgICAvLworICAgIC8vIFN0YXJ0IHBqc3VhIQorICAgIC8vCisgICAgc2hvd1N0YXR1cygiU3RhcnRpbmcgc3RhY2suLiIpOworICAgIHN0YXR1cyA9IHBqc3VhX3N0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJc2hvd0Vycm9yKCJwanN1YV9zdGFydCIsIHN0YXR1cyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICBzaG93U3RhdHVzKCJSZWFkeSIpOworCisgICAgcmV0dXJuIHRydWU7CisKK29uX2Vycm9yOgorICAgIHBqc3VhX2Rlc3Ryb3koKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBBIHNpbXBsZSByZWdpc3RyYXIsIGludm9rZWQgYnkgZGVmYXVsdF9tb2Rfb25fcnhfcmVxdWVzdCgpCisgKi8KK3N0YXRpYyB2b2lkIHNpbXBsZV9yZWdpc3RyYXIocGpzaXBfcnhfZGF0YSAqcmRhdGEpCit7CisgICAgcGpzaXBfdHhfZGF0YSAqdGRhdGE7CisgICAgY29uc3QgcGpzaXBfZXhwaXJlc19oZHIgKmV4cDsKKyAgICBjb25zdCBwanNpcF9oZHIgKmg7CisgICAgdW5zaWduZWQgY250ID0gMDsKKyAgICBwanNpcF9nZW5lcmljX3N0cmluZ19oZHIgKnNydjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwanNpcF9lbmRwdF9jcmVhdGVfcmVzcG9uc2UocGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCksCisJCQkJIHJkYXRhLCAyMDAsIE5VTEwsICZ0ZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybjsKKworICAgIGV4cCA9IChwanNpcF9leHBpcmVzX2hkciopCisJICBwanNpcF9tc2dfZmluZF9oZHIocmRhdGEtPm1zZ19pbmZvLm1zZywgUEpTSVBfSF9FWFBJUkVTLCBOVUxMKTsKKworICAgIGggPSByZGF0YS0+bXNnX2luZm8ubXNnLT5oZHIubmV4dDsKKyAgICB3aGlsZSAoaCAhPSAmcmRhdGEtPm1zZ19pbmZvLm1zZy0+aGRyKSB7CisJaWYgKGgtPnR5cGUgPT0gUEpTSVBfSF9DT05UQUNUKSB7CisJICAgIGNvbnN0IHBqc2lwX2NvbnRhY3RfaGRyICpjID0gKGNvbnN0IHBqc2lwX2NvbnRhY3RfaGRyKiloOworCSAgICBpbnQgZSA9IGMtPmV4cGlyZXM7CisKKwkgICAgaWYgKGUgPCAwKSB7CisJCWlmIChleHApCisJCSAgICBlID0gZXhwLT5pdmFsdWU7CisJCWVsc2UKKwkJICAgIGUgPSAzNjAwOworCSAgICB9CisKKwkgICAgaWYgKGUgPiAwKSB7CisJCXBqc2lwX2NvbnRhY3RfaGRyICpuYyA9IChwanNpcF9jb250YWN0X2hkciopCisJCQkJCXBqc2lwX2hkcl9jbG9uZSh0ZGF0YS0+cG9vbCwgaCk7CisJCW5jLT5leHBpcmVzID0gZTsKKwkJcGpzaXBfbXNnX2FkZF9oZHIodGRhdGEtPm1zZywgKHBqc2lwX2hkciopbmMpOworCQkrK2NudDsKKwkgICAgfQorCX0KKwloID0gaC0+bmV4dDsKKyAgICB9CisKKyAgICBzcnYgPSBwanNpcF9nZW5lcmljX3N0cmluZ19oZHJfY3JlYXRlKHRkYXRhLT5wb29sLCBOVUxMLCBOVUxMKTsKKyAgICBzcnYtPm5hbWUgPSBwal9zdHIoKGNoYXIqKSJTZXJ2ZXIiKTsKKyAgICBzcnYtPmh2YWx1ZSA9IHBqX3N0cigoY2hhciopInBqc3VhIHNpbXBsZSByZWdpc3RyYXIiKTsKKyAgICBwanNpcF9tc2dfYWRkX2hkcih0ZGF0YS0+bXNnLCAocGpzaXBfaGRyKilzcnYpOworCisgICAgcGpzaXBfZW5kcHRfc2VuZF9yZXNwb25zZTIocGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRhdGEsIHRkYXRhLCBOVUxMLCBOVUxMKTsKK30KKworLyogTm90aWZpY2F0aW9uIG9uIGluY29taW5nIHJlcXVlc3QgKi8KK3N0YXRpYyBwal9ib29sX3QgZGVmYXVsdF9tb2Rfb25fcnhfcmVxdWVzdChwanNpcF9yeF9kYXRhICpyZGF0YSkKK3sKKyAgICAvKiBTaW1wbGUgcmVnaXN0cmFyICovCisgICAgaWYgKHBqc2lwX21ldGhvZF9jbXAoJnJkYXRhLT5tc2dfaW5mby5tc2ctPmxpbmUucmVxLm1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcGpzaXBfcmVnaXN0ZXJfbWV0aG9kKSA9PSAwKQorICAgIHsKKwlzaW1wbGVfcmVnaXN0cmFyKHJkYXRhKTsKKwlyZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKy8qIFRoZSBtb2R1bGUgaW5zdGFuY2UuICovCitzdGF0aWMgcGpzaXBfbW9kdWxlIG1vZF9kZWZhdWx0X2hhbmRsZXIgPQoreworICAgIE5VTEwsIE5VTEwsCQkJCS8qIHByZXYsIG5leHQuCQkqLworICAgIHsgKGNoYXIqKSJtb2QtZGVmYXVsdC1oYW5kbGVyIiwgMTkgfSwJLyogTmFtZS4JCSovCisgICAgLTEsCQkJCQkvKiBJZAkJCSovCisgICAgUEpTSVBfTU9EX1BSSU9SSVRZX0FQUExJQ0FUSU9OKzk5LAkvKiBQcmlvcml0eQkgICAgICAgICovCisgICAgTlVMTCwJCQkJLyogbG9hZCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHN0YXJ0KCkJCSovCisgICAgTlVMTCwJCQkJLyogc3RvcCgpCQkqLworICAgIE5VTEwsCQkJCS8qIHVubG9hZCgpCQkqLworICAgICZkZWZhdWx0X21vZF9vbl9yeF9yZXF1ZXN0LAkJLyogb25fcnhfcmVxdWVzdCgpCSovCisgICAgTlVMTCwJCQkJLyogb25fcnhfcmVzcG9uc2UoKQkqLworICAgIE5VTEwsCQkJCS8qIG9uX3R4X3JlcXVlc3QuCSovCisgICAgTlVMTCwJCQkJLyogb25fdHhfcmVzcG9uc2UoKQkqLworICAgIE5VTEwsCQkJCS8qIG9uX3RzeF9zdGF0ZSgpCSovCisKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgLyogQXQgbGVhc3Qgb24gTGludXgsIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSBTREwgdmlkZW8gc3Vic3lzdGVtIHByaW9yIHRvCisgICAgICogY3JlYXRpbmcvaW5pdGlhbGl6aW5nIFFBcHBsaWNhdGlvbiwgb3RoZXJ3aXNlIHdlJ2xsIHNlZ2ZhdWx0IG1pc2VyYWJseQorICAgICAqIGluIFNETF9DcmVhdGVXaW5kb3coKS4gSGVyZSdzIGEgc3RhY2sgdHJhY2UgaWYgeW91J3JlIGludGVyZXN0ZWQ6CisKKwlUaHJlYWQgWzddIChTdXNwZW5kZWQ6IFNpZ25hbCAnU0lHU0VHVicgcmVjZWl2ZWQuIERlc2NyaXB0aW9uOiBTZWdtZW50YXRpb24gZmF1bHQuKQorCTEzIFhDcmVhdGVJQygpCisJMTIgU2V0dXBXaW5kb3dEYXRhKCkKKwkxMSBYMTFfQ3JlYXRlV2luZG93KCkKKwkxMCBTRExfQ3JlYXRlV2luZG93KCkKKwkuLgorICAgICAqLworICAgIGlmICggU0RMX0luaXRTdWJTeXN0ZW0oU0RMX0lOSVRfVklERU8pIDwgMCApIHsKKyAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gaW5pdCBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisKKyAgICBNYWluV2luIHdpbjsKKyAgICB3aW4uc2hvdygpOworCisgICAgaWYgKCF3aW4uaW5pdFN0YWNrKCkpIHsKKwl3aW4ucXVpdCgpOworCXJldHVybiAxOworICAgIH0KKworICAgIC8qIFdlIHdhbnQgdG8gYmUgcmVnaXN0cmFyIHRvbyEgKi8KKyAgICBpZiAocGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCkpIHsKKwlwanNpcF9lbmRwdF9yZWdpc3Rlcl9tb2R1bGUocGpzdWFfZ2V0X3Bqc2lwX2VuZHB0KCksCisJCQkJICAgICZtb2RfZGVmYXVsdF9oYW5kbGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gYXBwLmV4ZWMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3ZpZGd1aS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3ZpZGd1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2NlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkZ3VpLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qICRJZDogdmlkZ3VpLmggMzkyNiAyMDExLTEyLTI3IDEyOjUwOjE3WiBiZW5ueWxwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgVklER1VJX0hfCisjZGVmaW5lIFZJREdVSV9IXworCisjaW5jbHVkZSA8UUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFDaGVja0JveD4KKyNpbmNsdWRlIDxRRm9udD4KKyNpbmNsdWRlIDxRTGFiZWw+CisjaW5jbHVkZSA8UUxpbmVFZGl0PgorI2luY2x1ZGUgPFFNYWluV2luZG93PgorI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisjaW5jbHVkZSA8UVN0YXR1c0Jhcj4KKyNpbmNsdWRlIDxRVGV4dEVkaXQ+CisjaW5jbHVkZSA8UVZCb3hMYXlvdXQ+CisjaW5jbHVkZSA8UVdpZGdldD4KKworI2luY2x1ZGUgPHBqc3VhLmg+CisKK2NsYXNzIFZpZFdpbjsKKworY2xhc3MgTWFpbldpbiA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIE1haW5XaW4oUVdpZGdldCAqcGFyZW50ID0gMCk7CisgICAgdmlydHVhbCB+TWFpbldpbigpOworCisgICAgc3RhdGljIE1haW5XaW4gKmluc3RhbmNlKCk7CisKKyAgICBib29sIGluaXRTdGFjaygpOworICAgIHZvaWQgc2hvd0Vycm9yKGNvbnN0IGNoYXIgKnRpdGxlLCBwal9zdGF0dXNfdCBzdGF0dXMpOworICAgIHZvaWQgc2hvd1N0YXR1cyhjb25zdCBjaGFyICptc2cpOworCisgICAgdm9pZCBvbl9yZWdfc3RhdGUocGpzdWFfYWNjX2lkIGFjY19pZCk7CisgICAgdm9pZCBvbl9jYWxsX3N0YXRlKHBqc3VhX2NhbGxfaWQgY2FsbF9pZCwgcGpzaXBfZXZlbnQgKmUpOworICAgIHZvaWQgb25faW5jb21pbmdfY2FsbChwanN1YV9hY2NfaWQgYWNjX2lkLCBwanN1YV9jYWxsX2lkIGNhbGxfaWQsIHBqc2lwX3J4X2RhdGEgKnJkYXRhKTsKKyAgICB2b2lkIG9uX2NhbGxfbWVkaWFfc3RhdGUocGpzdWFfY2FsbF9pZCBjYWxsX2lkKTsKKworc2lnbmFsczoKKyAgICB2b2lkIHNpZ25hbE5ld0NhbGwoaW50LCBib29sKTsKKyAgICB2b2lkIHNpZ25hbENhbGxSZWxlYXNlZCgpOworICAgIHZvaWQgc2lnbmFsSW5pdFZpZGVvV2luZG93KCk7CisgICAgdm9pZCBzaWduYWxTaG93U3RhdHVzKGNvbnN0IFFTdHJpbmcmKTsKKyAgICAKK3B1YmxpYyBzbG90czoKKyAgICB2b2lkIHByZXZpZXcoKTsKKyAgICB2b2lkIGNhbGwoKTsKKyAgICB2b2lkIGhhbmd1cCgpOworICAgIHZvaWQgcXVpdCgpOworICAgIHZvaWQgb25WaWRFbmFibGVkQ2hhbmdlZChpbnQgc3RhdGUpOworCisgICAgdm9pZCBvbk5ld0NhbGwoaW50IGNpZCwgYm9vbCBpbmNvbWluZyk7CisgICAgdm9pZCBvbkNhbGxSZWxlYXNlZCgpOworICAgIHZvaWQgaW5pdFZpZGVvV2luZG93KCk7CisgICAgdm9pZCBkb1Nob3dTdGF0dXMoY29uc3QgUVN0cmluZyYgbXNnKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTWFpbldpbiAqdGhlSW5zdGFuY2VfOworICAgIHBqc3VhX2FjY19pZCBhY2NvdW50SWRfOworICAgIHBqc3VhX2NhbGxfaWQgY3VycmVudENhbGxfOworICAgIGJvb2wgcHJldmlld19vbjsKKworcHJpdmF0ZToKKyAgICBRUHVzaEJ1dHRvbiAqY2FsbEJ1dHRvbl8sCisJCSpoYW5ndXBCdXR0b25fLAorCQkqcXVpdEJ1dHRvbl8sCisJCSpwcmV2aWV3QnV0dG9uXzsKKyAgICBRQ2hlY2tCb3ggICAqdmlkRW5hYmxlZF87CisgICAgUUxpbmVFZGl0ICp1cmxfOworICAgIFZpZFdpbiAqdmlkZW9fOworICAgIFZpZFdpbiAqdmlkZW9fcHJldl87CisgICAgLy9RU3RhdHVzQmFyICpzdGF0dXNCYXJfOworICAgIFFMYWJlbCAqc3RhdHVzQmFyXzsKKyAgICBRTGFiZWwgKmxvY2FsVXJpXzsKKworICAgIFFWQm94TGF5b3V0ICp2Ym94X2xlZnQ7CisKKyAgICB2b2lkIGluaXRMYXlvdXQoKTsKK307CisKKworCisjZW5kaWYgLyogVklER1VJX0hfICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkZ3VpLnBybyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS92aWRndWkucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmIyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkZ3VpLnBybwpAQCAtMCwwICsxLDM2IEBACit3aW4zMiB7CisgIERFRklORVMgKz0gUEpfV0lOMzI9MQorICBJTkNMVURFUEFUSCArPSAuLi8uLi8uLi9wamxpYi9pbmNsdWRlIC4uLy4uLy4uL3BqbGliLXV0aWwvaW5jbHVkZSBcCisJCSAuLi8uLi8uLi9wam5hdGgvaW5jbHVkZSAuLi8uLi8uLi9wam1lZGlhL2luY2x1ZGUgXAorCQkgLi4vLi4vLi4vcGpzaXAvaW5jbHVkZQorCisgICMgVGhlc2UgdG8gZW5hYmxlIHN0YXRpYyBsaW5raW5nCisgICNDT05GSUcgKz0gc3RhdGljCisgICNERUZJTkVTICs9IFNUQVRJQworCisgIENPTkZJRyhkZWJ1ZykgeworICAgIExJQlMgKz0gLi4vLi4vLi4vbGliL2xpYnBqcHJvamVjdC1pMzg2LVdpbjMyLXZjOC1EZWJ1Zy5saWIKKyAgfSBlbHNlIHsKKyAgICBMSUJTICs9IC4uLy4uLy4uL2xpYi9saWJwanByb2plY3QtaTM4Ni1XaW4zMi12YzgtUmVsZWFzZS5saWIKKyAgfQorICBMSUJTICs9IElwaGxwYXBpLmxpYiAgZHNvdW5kLmxpYiBcCisgIAkgIGR4Z3VpZC5saWIgbmV0YXBpMzIubGliIG1zd3NvY2subGliIHdzMl8zMi5saWIgb2RiYzMyLmxpYiBcCisgIAkgIG9kYmNjcDMyLmxpYiBvbGUzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIAorfSBlbHNlIHsKKyAgTElCUyArPSAkJHN5c3RlbShtYWtlIC1mIHBqLXBrZ2NvbmZpZy5tYWsgbGRmbGFncykKKyAgUU1BS0VfQ1hYRkxBR1MgKz0gJCRzeXN0ZW0obWFrZSAtLXNpbGVudCAtZiBwai1wa2djb25maWcubWFrIGNmbGFncykKKworICBtYWN4IHsKKyAgICBRTUFLRV9DWFhGTEFHUyArPSAtT2JqQysrCisgIH0KK30KKworVEVNUExBVEUgPSBhcHAKK0NPTkZJRyArPSB0aHJlYWQgZGVidWcKK1RBUkdFVCA9IAorREVQRU5EUEFUSCArPSAuCisKKyMgSW5wdXQKK0hFQURFUlMgKz0gdmlkZ3VpLmggdmlkd2luLmgKK1NPVVJDRVMgKz0gdmlkZ3VpLmNwcCB2aWR3aW4uY3BwIAorCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkd2luLmNwcCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3Bqc2lwLWFwcHMvc3JjL3ZpZGd1aS92aWR3aW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWVlODkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkd2luLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyogJElkOiB2aWR3aW4uY3BwIDQwNjAgMjAxMi0wNC0xNyAwOTo1NTozMFogbWluZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgInZpZHdpbi5oIgorI2luY2x1ZGUgPFFFdmVudD4KKworI2RlZmluZSBUSElTX0ZJTEUJInZpZHdpbi5jcHAiCisjZGVmaW5lIFRSQUNFXyguLi4pCVBKX0xPRyg0LChUSElTX0ZJTEUsIF9fVkFfQVJHU19fKSkKKworVmlkV2luOjpWaWRXaW4oY29uc3QgcGptZWRpYV92aWRfZGV2X2h3bmQgKmh3bmRfLAorCSAgICAgICBRV2lkZ2V0KiBwYXJlbnQsCisJICAgICAgIFF0OjpXaW5kb3dGbGFncyBmKSA6CisgICAgUVdpZGdldChwYXJlbnQsIGYpLCBvcmlnX3BhcmVudChOVUxMKSwKKyAgICBzaXplX2hpbnQoUVdJREdFVFNJWkVfTUFYLCBRV0lER0VUU0laRV9NQVgpCit7CisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9OYXRpdmVXaW5kb3cpOworCisgICAgLyogTWFrZSB0aGlzIHdpZGdldCBhIGJpdCAibGlnaHRlciIgKi8KKyAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX1VwZGF0ZXNEaXNhYmxlZCk7CisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9QYWludE9uU2NyZWVuKTsKKyAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX05vU3lzdGVtQmFja2dyb3VuZCk7CisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9QYWludE91dHNpZGVQYWludEV2ZW50KTsKKyAgICBzZXRVcGRhdGVzRW5hYmxlZChmYWxzZSk7CisKKyAgICBwal9iemVybygmaHduZCwgc2l6ZW9mKGh3bmQpKTsKKyAgICBpZiAoaHduZF8pIHsKKwlod25kID0gKmh3bmRfOworICAgIH0KK30KKworCitWaWRXaW46On5WaWRXaW4oKQoreworICAgIHNob3dfc2RsKGZhbHNlKTsKKyAgICBkZXRhY2goKTsKK30KKwordm9pZCBWaWRXaW46OnB1dEludG9MYXlvdXQoUUJveExheW91dCAqYm94KQoreworICAgIGJveC0+YWRkV2lkZ2V0KHRoaXMsIDEpOworICAgIHNob3coKTsKKyAgICBhY3RpdmF0ZVdpbmRvdygpOworfQorCitib29sIFZpZFdpbjo6ZXZlbnQoUUV2ZW50ICplKQoreworICAgIHN3aXRjaChlLT50eXBlKCkpIHsKKworICAgIGNhc2UgUUV2ZW50OjpSZXNpemU6CisJc2V0X3NpemUoKTsKKwlicmVhazsKKworICAgIGNhc2UgUUV2ZW50OjpQYXJlbnRDaGFuZ2U6CisJZ2V0X3NpemUoKTsKKwlpZiAoMCkgeworCSAgICBRUmVjdCBxciA9IHJlY3QoKTsKKwkgICAgaWYgKHFyLndpZHRoKCkgPiBzaXplX2hpbnQud2lkdGgoKSkKKwkJc2l6ZV9oaW50LnNldFdpZHRoKHFyLndpZHRoKCkpOworCSAgICBpZiAocXIuaGVpZ2h0KCkgPiBzaXplX2hpbnQuaGVpZ2h0KCkpCisJCXNpemVfaGludC5zZXRXaWR0aChxci5oZWlnaHQoKSk7CisJfQorCXNldEZpeGVkU2l6ZShzaXplX2hpbnQpOworCWF0dGFjaCgpOworCWJyZWFrOworCisgICAgY2FzZSBRRXZlbnQ6OlNob3c6CisJc2hvd19zZGwodHJ1ZSk7CisJLy8gcmV2ZXJ0IHRvIGRlZmF1bHQgc2l6ZSBoaW50LCBtYWtlIGl0IHJlc2l6YWJsZQorCXNldEZpeGVkU2l6ZShRV0lER0VUU0laRV9NQVgsIFFXSURHRVRTSVpFX01BWCk7CisJYnJlYWs7CisKKyAgICBjYXNlIFFFdmVudDo6SGlkZToKKwlzaG93X3NkbChmYWxzZSk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKworICAgIHJldHVybiBRV2lkZ2V0OjpldmVudChlKTsKK30KKworLyogUGxhdGZvcm0gc3BlY2lmaWMgY29kZSAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XSU5DRSkKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordm9pZCBWaWRXaW46OmF0dGFjaCgpCit7CisgICAgaWYgKCFod25kLmluZm8ud2luLmh3bmQpIHJldHVybjsKKworICAgIEhXTkQgdyA9IChIV05EKWh3bmQuaW5mby53aW4uaHduZDsKKyAgICBIV05EIG5ld19wYXJlbnQgPSAoSFdORCl3aW5JZCgpOworICAgIG9yaWdfcGFyZW50ID0gR2V0UGFyZW50KHcpOworCisgICAgLy9TZXRXaW5kb3dMb25nKHcsIEdXTF9TVFlMRSwgV1NfQ0hJTEQpOworICAgIFNldFBhcmVudCh3LCBuZXdfcGFyZW50KTsKKyAgICBUUkFDRV8oIiVwIG5ldyBwYXJlbnQgaGFuZGxlID0gJXAiLCB3LCBuZXdfcGFyZW50KTsKK30KKwordm9pZCBWaWRXaW46OmRldGFjaCgpCit7CisgICAgaWYgKCFod25kLmluZm8ud2luLmh3bmQpIHJldHVybjsKKworICAgIEhXTkQgdyA9IChIV05EKWh3bmQuaW5mby53aW4uaHduZDsKKyAgICBTZXRQYXJlbnQodywgKEhXTkQpb3JpZ19wYXJlbnQpOworICAgIFRSQUNFXygiJXAgcmV2ZXJ0IHBhcmVudCBoYW5kbGUgdG8gJXAiLCB3LCBvcmlnX3BhcmVudCk7Cit9CisKK3ZvaWQgVmlkV2luOjpzZXRfc2l6ZSgpCit7CisgICAgaWYgKCFod25kLmluZm8ud2luLmh3bmQpIHJldHVybjsKKworICAgIEhXTkQgdyA9IChIV05EKWh3bmQuaW5mby53aW4uaHduZDsKKyAgICBRUmVjdCBxciA9IHJlY3QoKTsKKyAgICBVSU5UIHN3cF9mbGFnID0gU1dQX05PQUNUSVZBVEU7CisgICAgU2V0V2luZG93UG9zKHcsIEhXTkRfVE9QLCAwLCAwLCBxci53aWR0aCgpLCBxci5oZWlnaHQoKSwgc3dwX2ZsYWcpOworICAgIFRSQUNFXygiJXAgbmV3IHNpemUgPSAlZHglZCIsIHcsIHFyLndpZHRoKCksIHFyLmhlaWdodCgpKTsKK30KKwordm9pZCBWaWRXaW46OmdldF9zaXplKCkKK3sKKyAgICBpZiAoIWh3bmQuaW5mby53aW4uaHduZCkgcmV0dXJuOworCisgICAgSFdORCB3ID0gKEhXTkQpaHduZC5pbmZvLndpbi5od25kOworICAgIFJFQ1QgcjsKKyAgICBpZiAoR2V0V2luZG93UmVjdCh3LCAmcikpCisJc2l6ZV9oaW50ID0gUVNpemUoci5yaWdodC1yLmxlZnQrMSwgci5ib3R0b20tci50b3ArMSk7CisgICAgVFJBQ0VfKCIlcCBzaXplID0gJWR4JWQiLCB3LCBzaXplX2hpbnQud2lkdGgoKSwgc2l6ZV9oaW50LmhlaWdodCgpKTsKK30KKwordm9pZCBWaWRXaW46OnNob3dfc2RsKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoIWh3bmQuaW5mby53aW4uaHduZCkgcmV0dXJuOworCisgICAgSFdORCB3ID0gKEhXTkQpaHduZC5pbmZvLndpbi5od25kOworICAgIFNob3dXaW5kb3codywgdmlzaWJsZSA/IFNXX1NIT1cgOiBTV19ISURFKTsKK30KKworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyNpbXBvcnQ8Q29jb2EvQ29jb2EuaD4KKwordm9pZCBWaWRXaW46OmF0dGFjaCgpCit7CisgICAgaWYgKCFod25kLmluZm8uY29jb2Eud2luZG93KSByZXR1cm47CisKKyAgICAvKiBFbWJlZCBod25kIHRvIHdpZGdldCAqLworICAgIE5TV2luZG93ICp3ID0gKE5TV2luZG93Kilod25kLmluZm8uY29jb2Eud2luZG93OworICAgIE5TV2luZG93ICpwYXJlbnQgPSBbKE5TVmlldyopd2luSWQoKSB3aW5kb3ddOworICAgIG9yaWdfcGFyZW50ID0gW3cgcGFyZW50V2luZG93XTsKKworICAgIC8vW3cgc2V0U3R5bGVNYXNrOk5TQm9yZGVybGVzc1dpbmRvd01hc2tdOworCisgICAgLy9DYW4ndCB1c2UgdGhpcywgYXMgc29tZXRpbWUgdGhlIHZpZGVvIHdpbmRvdyBtYXkgbm90IGdldCByZXBhcmVudGVkLgorICAgIC8vW3cgc2V0UGFyZW50V2luZG93OnBhcmVudF07CisKKyAgICBbcGFyZW50IGFkZENoaWxkV2luZG93Oncgb3JkZXJlZDpOU1dpbmRvd0Fib3ZlXTsKKyAgICBUUkFDRV8oIiVwIG5ldyBwYXJlbnQgaGFuZGxlID0gJXAiLCB3LCBwYXJlbnQpOworfQorCisKK3ZvaWQgVmlkV2luOjpkZXRhY2goKQoreworICAgIGlmICghaHduZC5pbmZvLmNvY29hLndpbmRvdykgcmV0dXJuOworCisgICAgTlNXaW5kb3cgKncgPSAoTlNXaW5kb3cqKWh3bmQuaW5mby5jb2NvYS53aW5kb3c7CisgICAgTlNXaW5kb3cgKnBhcmVudCA9IFsoTlNWaWV3Kil3aW5JZCgpIHdpbmRvd107CisgICAgW3BhcmVudCByZW1vdmVDaGlsZFdpbmRvdzp3XTsgCit9CisKKwordm9pZCBWaWRXaW46OnNldF9zaXplKCkKK3sKKyAgICBpZiAoIWh3bmQuaW5mby5jb2NvYS53aW5kb3cpIHJldHVybjsKKworICAgIC8qIFVwZGF0ZSBwb3NpdGlvbiBhbmQgc2l6ZSAqLworICAgIE5TV2luZG93ICp3ID0gKE5TV2luZG93Kilod25kLmluZm8uY29jb2Eud2luZG93OworICAgIE5TUmVjdCByOworCisgICAgTlNWaWV3KiB2ID0gKE5TVmlldyopd2luSWQoKTsKKyAgICByID0gW3YgYm91bmRzXTsKKyAgICByID0gW3YgY29udmVydFJlY3RUb0Jhc2U6cl07CisgICAgci5vcmlnaW4gPSBbW3Ygd2luZG93XSBjb252ZXJ0QmFzZVRvU2NyZWVuOnIub3JpZ2luXTsKKworICAgIFFSZWN0IHFyID0gcmVjdCgpOworICAgIFt3IHNldEZyYW1lOnIgZGlzcGxheTpOT107IAorCisgICAgVFJBQ0VfKCIlcCBuZXcgc2l6ZSA9ICVkeCVkIiwgdywgcXIud2lkdGgoKSwgcXIuaGVpZ2h0KCkpOworfQorCit2b2lkIFZpZFdpbjo6Z2V0X3NpemUoKQoreworICAgIGlmICghaHduZC5pbmZvLmNvY29hLndpbmRvdykgcmV0dXJuOworCisgICAgTlNXaW5kb3cgKncgPSAoTlNXaW5kb3cqKWh3bmQuaW5mby5jb2NvYS53aW5kb3c7CisKKyAgICBzaXplX2hpbnQgPSBRU2l6ZSgzMDAsIDIwMCk7CisKKyAgICBUUkFDRV8oIiVwIHNpemUgPSAlZHglZCIsIDAsIHNpemVfaGludC53aWR0aCgpLCBzaXplX2hpbnQuaGVpZ2h0KCkpOworfQorCit2b2lkIFZpZFdpbjo6c2hvd19zZGwoYm9vbCB2aXNpYmxlKQoreworICAgIGlmICghaHduZC5pbmZvLmNvY29hLndpbmRvdykgcmV0dXJuOworCisgICAgTlNXaW5kb3cgKncgPSAoTlNXaW5kb3cqKWh3bmQuaW5mby5jb2NvYS53aW5kb3c7CisKKyAgICBpZiAodmlzaWJsZSkgeworICAgICAgICBbW3cgY29udGVudFZpZXddc2V0SGlkZGVuOk5PXTsKKyAgICB9IGVsc2UgeworICAgICAgICBbW3cgY29udGVudFZpZXddc2V0SGlkZGVuOllFU107CisgICAgfQorfQorCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGludXgpCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFFYMTFJbmZvPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgR0VUX0RJU1BMQVkoKQlRWDExSW5mbzo6ZGlzcGxheSgpCisvLyNkZWZpbmUgR0VUX0RJU1BMQVkoKQkoRGlzcGxheSopaHduZC5pbmZvLngxMS5kaXNwbGF5CisKK3ZvaWQgVmlkV2luOjphdHRhY2goKQoreworICAgIGlmICghaHduZC5pbmZvLngxMS53aW5kb3cpIHJldHVybjsKKworICAgIC8qIEVtYmVkIGh3bmQgdG8gd2lkZ2V0ICovCisKKyAgICAvLyBVc2UgUXQgWDExIGRpc3BsYXkgaGVyZSwgdXNpbmcgd2luZG93IGNyZWF0b3IgWDExIGRpc3BsYXkgbWF5IGNhdXNlCisgICAgLy8gdGhlIHdpbmRvdyBmYWlsaW5nIHRvIGVtYmVkIHRvIHRoaXMgUVdpZGdldC4KKyAgICAvL0Rpc3BsYXkgKmQgPSAoRGlzcGxheSopaHduZC5pbmZvLngxMS5kaXNwbGF5OworICAgIERpc3BsYXkgKmQgPSBHRVRfRElTUExBWSgpOworICAgIFdpbmRvdyB3ID0gKFdpbmRvdylod25kLmluZm8ueDExLndpbmRvdzsKKyAgICBXaW5kb3cgcGFyZW50ID0gKFdpbmRvdyl0aGlzLT53aW5JZCgpOworICAgIGludCBlcnIgPSBYUmVwYXJlbnRXaW5kb3coZCwgdywgcGFyZW50LCAwLCAwKTsKKyAgICBUUkFDRV8oIiVwIG5ldyBwYXJlbnQgaGFuZGxlID0gJXAsIGVyciA9ICVkIiwKKwkgICAodm9pZCopdywodm9pZCopcGFyZW50LCBlcnIpOworfQorCisKK3ZvaWQgVmlkV2luOjpkZXRhY2goKQoreworfQorCisKK3ZvaWQgVmlkV2luOjpzZXRfc2l6ZSgpCit7CisgICAgaWYgKCFod25kLmluZm8ueDExLndpbmRvdykgcmV0dXJuOworCisgICAgLyogVXBkYXRlIHBvc2l0aW9uIGFuZCBzaXplICovCisgICAgRGlzcGxheSAqZCA9IEdFVF9ESVNQTEFZKCk7CisgICAgV2luZG93IHcgPSAoV2luZG93KWh3bmQuaW5mby54MTEud2luZG93OworICAgIFFSZWN0IHFyID0gcmVjdCgpOworCisgICAgaW50IGVyciA9IFhSZXNpemVXaW5kb3coZCwgdywgcXIud2lkdGgoKSwgcXIuaGVpZ2h0KCkpOworICAgIFRSQUNFXygiWyVwLCVwXSBuZXcgc2l6ZSA9ICVkeCVkLCBlcnIgPSAlZCIsCisJICAgKHZvaWQqKWQsICh2b2lkKil3LCBxci53aWR0aCgpLCBxci5oZWlnaHQoKSwgZXJyKTsKK30KKwordm9pZCBWaWRXaW46OmdldF9zaXplKCkKK3sKKyAgICBpZiAoIWh3bmQuaW5mby54MTEud2luZG93KSByZXR1cm47CisKKyAgICBEaXNwbGF5ICpkID0gR0VUX0RJU1BMQVkoKTsKKyAgICBXaW5kb3cgdyA9IChXaW5kb3cpaHduZC5pbmZvLngxMS53aW5kb3c7CisKKyAgICBYV2luZG93QXR0cmlidXRlcyBhdHRyOworICAgIFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGQsIHcsICZhdHRyKTsKKyAgICBzaXplX2hpbnQgPSBRU2l6ZShhdHRyLndpZHRoLCBhdHRyLmhlaWdodCk7CisgICAgVFJBQ0VfKCIlcCBzaXplID0gJWR4JWQiLCB3LCBzaXplX2hpbnQud2lkdGgoKSwgc2l6ZV9oaW50LmhlaWdodCgpKTsKK30KKwordm9pZCBWaWRXaW46OnNob3dfc2RsKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoIWh3bmQuaW5mby54MTEud2luZG93KSByZXR1cm47CisKKyAgICBEaXNwbGF5ICpkID0gR0VUX0RJU1BMQVkoKTsKKyAgICBXaW5kb3cgdyA9IChXaW5kb3cpaHduZC5pbmZvLngxMS53aW5kb3c7CisKKyAgICBpZiAodmlzaWJsZSkgeworCVhNYXBSYWlzZWQoZCwgdyk7CisgICAgfSBlbHNlIHsKKwlYVW5tYXBXaW5kb3coZCwgdyk7CisgICAgfQorCisgICAgWEZsdXNoKGQpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3ZpZHdpbi5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGpzaXAtYXBwcy9zcmMvdmlkZ3VpL3ZpZHdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjEwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wanNpcC1hcHBzL3NyYy92aWRndWkvdmlkd2luLmgKQEAgLTAsMCArMSw1NSBAQAorLyogJElkOiB2aWR3aW4uaCA0MDYwIDIwMTItMDQtMTcgMDk6NTU6MzBaIG1pbmcgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgVklEV0lOX0gKKyNkZWZpbmUgVklEV0lOX0gKKworI2luY2x1ZGUgPHBqc3VhLmg+CisjaW5jbHVkZSA8UVdpZGdldD4KKyNpbmNsdWRlIDxRQm94TGF5b3V0PgorCitjbGFzcyBWaWRXaW4gOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBWaWRXaW4oY29uc3QgcGptZWRpYV92aWRfZGV2X2h3bmQgKmh3bmQsCisJICAgUVdpZGdldCogcGFyZW50ID0gMCwKKwkgICBRdDo6V2luZG93RmxhZ3MgZiA9IDApOworICAgIHZpcnR1YWwgflZpZFdpbigpOworICAgIFFTaXplIHNpemVIaW50KCkgY29uc3QgeyByZXR1cm4gc2l6ZV9oaW50OyB9CisKKyAgICB2b2lkIHB1dEludG9MYXlvdXQoUUJveExheW91dCAqbGF5b3V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQgKmUpOworCitwcml2YXRlOgorICAgIHBqbWVkaWFfdmlkX2Rldl9od25kIGh3bmQ7CisgICAgdm9pZCAqb3JpZ19wYXJlbnQ7CisgICAgUVNpemUgc2l6ZV9oaW50OworCisgICAgdm9pZCBhdHRhY2goKTsKKyAgICB2b2lkIGRldGFjaCgpOworICAgIHZvaWQgc2V0X3NpemUoKTsKKyAgICB2b2lkIGdldF9zaXplKCk7CisgICAgdm9pZCBzaG93X3NkbChib29sIHZpc2libGU9dHJ1ZSk7Cit9OworCisjZW5kaWYKKwo=