Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAgICAgICAgCi8vCSCpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLCBsaWNlbnNlZCB1bmRlciBBcGFjaGUgMi4wIAovLwovLyAgZmlsZSA6IAovLyAgYXV0aG9yIDogSmVhbi1ZdmVzIEJvdWd1ZXQgLSBqZWFuLXl2ZXMuYm91Z3VldEBpbnRlbC5jb20KLy8JCQkgU2NvdHQgRXR0aW5nZXIJIC0gc2NvdHQubS5ldHRpbmdlckBpbnRlbC5jb20KLy8gIGRlc2NyaXB0aW9uIDogSW1hZ2UgUHJvamVjdGlvbiBkZXNjcmlwdGlvbi4KLy8gIG1vZGlmaWVkIDogCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKQojIGluY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlICJJbWFnZVByb2plY3Rpb24uaCIKI2luY2x1ZGUgIkNhbWVyYU1vZGVsLmgiCiNpbmNsdWRlIDx2ZWN0b3I+CgovLyBQcm9qZWN0IGEgc2luZ2xlIDNEIHBvaW50IG9udG8gYSBzaW5nbGUgY2FtZXJhCmlubGluZSB2b2lkIFByb2plY3RQb2ludHMoVmVjdG9yM2YgJnB0XzNELCBQb2ludCAmcHRfMkQsIENhbWVyYSAmY2FtZXJhKQp7CQoJVmVjdG9yM2YgWDIgPSBjYW1lcmEubWNfZXh0ICogcHRfM0Q7CglmbG9hdCBpbnZfWiA9IDEuMDBmIC9YMi56OwoJUG9pbnQgcHQoaW52X1ogKiBYMi54LGludl9aICogWDIueSk7CgoJZmxvYXQgcjIgPSAocHQueCAqIHB0LngpICsgKHB0LnkgKiBwdC55KTsKCWZsb2F0IHI0ID0gcjIgKiByMjsKCWZsb2F0IHI2ID0gcjQgKiByMjsKCWZsb2F0IGNkaXN0ID0gMS4wMGYgKyBjYW1lcmEua2NbMF0gKiByMiArIGNhbWVyYS5rY1sxXSAqIHI0ICsgY2FtZXJhLmtjWzRdICogcjY7CglQb2ludCBwdDIoY2Rpc3QgKiBwdC54LGNkaXN0ICogcHQueSk7CgoJZmxvYXQgYTEgPSAyICogcHQueCAqIHB0Lnk7CglmbG9hdCBhMiA9IHIyICsgMiAqIChwdC54ICogcHQueCk7CglmbG9hdCBhMyA9IHIyICsgMiAqIChwdC55ICogcHQueSk7CgoJUG9pbnQgcHQzKHB0Mi54ICsgY2FtZXJhLmtjWzJdICogYTEgKyBjYW1lcmEua2NbMl0gKiBhMiAsIHB0Mi55ICsgY2FtZXJhLmtjWzJdICogYTMgKyBjYW1lcmEua2NbMl0gKiBhMSk7CglQb2ludCBwdDQocHQzLnggKyBjYW1lcmEuYWxwaGFfYyAqIHB0My55LCBwdDMueSk7CgoJcHRfMkQuU2V0KGNhbWVyYS5mYy54ICogcHQ0LnggKyBjYW1lcmEuY2MueCAsIGNhbWVyYS5mYy55ICogcHQ0LnkgKyBjYW1lcmEuY2MueSk7Cn0KCi8vIFByb2plY3QgYSBjeWxpbmRlciBvbnRvIGEgc2luZ2xlIGNhbWVyYQp2b2lkIFByb2plY3RlZEN5bGluZGVyOjpJbWFnZVByb2plY3Rpb24oY29uc3QgS1RDeWxpbmRlciAmY3lsLCBDYW1lcmEgJmNhbWVyYSkKewoJVmVjdG9yM2YgcG9pbnQoMC4wMGYsMC4wMGYsY3lsLmxlbmd0aC8yKTsKCVZlY3RvcjNmIHIgPSBwb2ludCAtIEludmVyc2UoY3lsLnBvc2UpICogY2FtZXJhLmV5ZTsKCWRvdWJsZSBybm9ybTIgPSByLnggKiByLnggKyByLnkgKiByLnk7CglmbG9hdCBub3JtX3IgPSAoZmxvYXQpc3FydChybm9ybTIpOwoJVmVjdG9yM2YgcjIoLXIueSAvIG5vcm1fciwgci54IC8gbm9ybV9yLCAwLjAwZik7CgoJVmVjdG9yM2YgcHRzWzRdOwoJcHRzWzBdLlNldCgtY3lsLmJvdHRvbSAqIHIyLnggLCAtY3lsLmJvdHRvbSAqIHIyLnkgLCAtY3lsLmJvdHRvbSAqIHIyLnopOwoJcHRzWzFdLlNldCgtY3lsLnRvcCAqIHIyLnggLCAtY3lsLnRvcCAqIHIyLnkgLCBjeWwubGVuZ3RoIC0gKGN5bC50b3AgKiByMi56KSk7CglwdHNbMl0uU2V0KGN5bC50b3AgKiByMi54ICwgY3lsLnRvcCAqIHIyLnkgLCBjeWwubGVuZ3RoICsgKGN5bC50b3AgKiByMi56KSk7CglwdHNbM10uU2V0KGN5bC5ib3R0b20gKiByMi54ICwgY3lsLmJvdHRvbSAqIHIyLnkgLCBjeWwuYm90dG9tICogcjIueik7CglwdHNbMF0gPSBjeWwucG9zZSAqIHB0c1swXTsKCXB0c1sxXSA9IGN5bC5wb3NlICogcHRzWzFdOwoJcHRzWzJdID0gY3lsLnBvc2UgKiBwdHNbMl07CglwdHNbM10gPSBjeWwucG9zZSAqIHB0c1szXTsKCQoJZm9yKGludCBpPTA7IGkgPCA0OyBpKyspCgkJUHJvamVjdFBvaW50cyhwdHNbaV0sIG1QdHNbaV0sIGNhbWVyYSk7Cn0KCi8vIFByb2plY3QgYSBib2R5IChtdWx0aXBsZSBjeWxpbmRlcnMpIG9udG8gYSBzaW5nbGUgY2FtZXJhCnZvaWQgUHJvamVjdGVkQm9keTo6SW1hZ2VQcm9qZWN0aW9uKGNvbnN0IEJvZHlHZW9tZXRyeSAmYm9keSwgQ2FtZXJhICZjYW1lcmEpCnsKCWludCBuX3BhcnRzID0gYm9keS5HZXRCb2R5UGFydENvdW50KCk7CgltUHJvakN5bHMucmVzaXplKG5fcGFydHMpOwoJCglmb3IoaW50IGk9MDtpPG5fcGFydHM7aSsrKQoJCW1Qcm9qQ3lsc1tpXS5JbWFnZVByb2plY3Rpb24oYm9keShpKSwgY2FtZXJhKTsKfQoKLy8gUHJvamVjdCBhIGJvZHkgb250byBtdWx0aXBsZSBjYW1lcmFzCnZvaWQgTXVsdGlDYW1lcmFQcm9qZWN0ZWRCb2R5OjpJbWFnZVByb2plY3Rpb24oY29uc3QgQm9keUdlb21ldHJ5ICZib2R5LCBNdWx0aUNhbWVyYSAmY2FtZXJhcykKewoJaW50IG5fY2FtZXJhcyA9IGNhbWVyYXMuR2V0Q2FtZXJhQ291bnQoKTsKCW1Qcm9qQm9kaWVzLnJlc2l6ZShuX2NhbWVyYXMpOwoJZm9yKGludCBpPTA7aTxuX2NhbWVyYXM7aSsrKQoJCW1Qcm9qQm9kaWVzW2ldLkltYWdlUHJvamVjdGlvbihib2R5LCBjYW1lcmFzKGkpKTsKfQoK