ZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RyaW5nIGIvaW5jbHVkZS9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzOWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc3RyaW5nCkBAIC0wLDAgKzEsMzU0MyBAQAorLy8gLSotIEMrKyAtKi0KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xJQkNQUF9TVFJJTkcKKyNkZWZpbmUgX0xJQkNQUF9TVFJJTkcKKworLyoKKyAgICBzdHJpbmcgc3lub3BzaXMKKworbmFtZXNwYWNlIHN0ZAoreworCit0ZW1wbGF0ZSA8Y2xhc3Mgc3RhdGVUPgorY2xhc3MgZnBvcworeworcHJpdmF0ZToKKyAgICBzdGF0ZVQgc3Q7CitwdWJsaWM6CisgICAgZnBvcyhzdHJlYW1vZmYgPSBzdHJlYW1vZmYoKSk7CisKKyAgICBvcGVyYXRvciBzdHJlYW1vZmYoKSBjb25zdDsKKworICAgIHN0YXRlVCBzdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3RhdGUoc3RhdGVUKTsKKworICAgIGZwb3MmIG9wZXJhdG9yKz0oc3RyZWFtb2ZmKTsKKyAgICBmcG9zICBvcGVyYXRvcisgKHN0cmVhbW9mZikgY29uc3Q7CisgICAgZnBvcyYgb3BlcmF0b3ItPShzdHJlYW1vZmYpOworICAgIGZwb3MgIG9wZXJhdG9yLSAoc3RyZWFtb2ZmKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBzdGF0ZVQ+IHN0cmVhbW9mZiBvcGVyYXRvci0oY29uc3QgZnBvczxzdGF0ZVQ+JiB4LCBjb25zdCBmcG9zPHN0YXRlVD4mIHkpOworCit0ZW1wbGF0ZSA8Y2xhc3Mgc3RhdGVUPiBib29sIG9wZXJhdG9yPT0oY29uc3QgZnBvczxzdGF0ZVQ+JiB4LCBjb25zdCBmcG9zPHN0YXRlVD4mIHkpOwordGVtcGxhdGUgPGNsYXNzIHN0YXRlVD4gYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZwb3M8c3RhdGVUPiYgeCwgY29uc3QgZnBvczxzdGF0ZVQ+JiB5KTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJUPgorc3RydWN0IGNoYXJfdHJhaXRzCit7CisgICAgdHlwZWRlZiBjaGFyVCAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgLi4uICAgICAgIGludF90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtcG9zIHBvc190eXBlOworICAgIHR5cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CisKKyAgICBzdGF0aWMgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMik7CisgICAgc3RhdGljIGJvb2wgZXEoY2hhcl90eXBlIGMxLCBjaGFyX3R5cGUgYzIpOworICAgIHN0YXRpYyBib29sIGx0KGNoYXJfdHlwZSBjMSwgY2hhcl90eXBlIGMyKTsKKworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pOworICAgIHN0YXRpYyBzaXplX3QgICAgICAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIHMpOworICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY29uc3QgY2hhcl90eXBlJiBhKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBjb3B5KGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY2hhcl90eXBlIGEpOworCisgICAgc3RhdGljIGludF90eXBlICBub3RfZW9mKGludF90eXBlIGMpOworICAgIHN0YXRpYyBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIGMpOworICAgIHN0YXRpYyBpbnRfdHlwZSAgdG9faW50X3R5cGUoY2hhcl90eXBlIGMpOworICAgIHN0YXRpYyBib29sICAgICAgZXFfaW50X3R5cGUoaW50X3R5cGUgYzEsIGludF90eXBlIGMyKTsKKyAgICBzdGF0aWMgaW50X3R5cGUgIGVvZigpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGNoYXJfdHJhaXRzPGNoYXI+OwordGVtcGxhdGUgPD4gc3RydWN0IGNoYXJfdHJhaXRzPHdjaGFyX3Q+OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzID0gY2hhcl90cmFpdHM8Y2hhclQ+LCBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvY2F0b3I8Y2hhclQ+ID4gCitjbGFzcyBiYXNpY19zdHJpbmcKK3sKK3B1YmxpYzogCisvLyB0eXBlczogCisgICAgdHlwZWRlZiB0cmFpdHMgdHJhaXRzX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6Y2hhcl90eXBlIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uLWRlZmluZWQgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3MgPSAtMTsKKworICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpOworICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiA9IG5wb3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0X3BvaW50ZXIgcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3RfcG9pbnRlciBzLCBzaXplX3R5cGUgbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIG4sIHZhbHVlX3R5cGUgYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcoSW5wdXRJdGVyYXRvciBiZWdpbiwgSW5wdXRJdGVyYXRvciBlbmQsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgYmFzaWNfc3RyaW5nKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4sIGNvbnN0IEFsbG9jYXRvciYgPSBBbGxvY2F0b3IoKSk7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYsIGNvbnN0IEFsbG9jYXRvciYpOworICAgIGJhc2ljX3N0cmluZyhiYXNpY19zdHJpbmcmJiwgY29uc3QgQWxsb2NhdG9yJik7CisKKyAgICB+YmFzaWNfc3RyaW5nKCk7CisKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oY29uc3RfcG9pbnRlciBzKTsKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPSh2YWx1ZV90eXBlIGMpOworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgaXRlcmF0b3IgICAgICAgYmVnaW4oKTsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICAgIGl0ZXJhdG9yICAgICAgIGVuZCgpOworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByYmVnaW4oKTsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0OworICAgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCgpOworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0OworCisgICAgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSBjb25zdDsKKyAgICBjb25zdF9pdGVyYXRvciAgICAgICAgIGNlbmQoKSBjb25zdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0OworICAgIHNpemVfdHlwZSBsZW5ndGgoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsKKyAgICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdDsKKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuLCB2YWx1ZV90eXBlIGMpOworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuKTsKKworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgcmVzX2FyZyA9IDApOworICAgIHZvaWQgc2hyaW5rX3RvX2ZpdCgpOworICAgIHZvaWQgY2xlYXIoKTsKKyAgICBib29sIGVtcHR5KCkgY29uc3Q7CisKKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKSBjb25zdDsKKyAgICByZWZlcmVuY2UgICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKTsKKworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgbikgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGF0KHNpemVfdHlwZSBuKTsKKworICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0X3BvaW50ZXIgcyk7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KHZhbHVlX3R5cGUgYyk7CisgICAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3RfcG9pbnRlciBzLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3RfcG9pbnRlciBzKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPiBiYXNpY19zdHJpbmcmIGFwcGVuZChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgdm9pZCBwdXNoX2JhY2sodmFsdWVfdHlwZSBjKTsKKyAgICB2b2lkIHBvcF9iYWNrKCk7CisgICAgcmVmZXJlbmNlICAgICAgIGZyb250KCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Q7CisgICAgcmVmZXJlbmNlICAgICAgIGJhY2soKTsKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OworCisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3RfcG9pbnRlciBzLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3RfcG9pbnRlciBzKTsKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPiBiYXNpY19zdHJpbmcmIGFzc2lnbihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MyLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvcywgY29uc3RfcG9pbnRlciBzLCBzaXplX3R5cGUgbik7CisgICAgYmFzaWNfc3RyaW5nJiBpbnNlcnQoc2l6ZV90eXBlIHBvcywgY29uc3RfcG9pbnRlciBzKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiwgdmFsdWVfdHlwZSBjKTsKKyAgICBpdGVyYXRvciAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBwLCB2YWx1ZV90eXBlIGMpOworICAgIGl0ZXJhdG9yICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHAsIHNpemVfdHlwZSBuLCB2YWx1ZV90eXBlIGMpOworICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SXRlcmF0b3I+IGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwLCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QpOworICAgIGl0ZXJhdG9yICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHAsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4pOworCisgICAgYmFzaWNfc3RyaW5nJiBlcmFzZShzaXplX3R5cGUgcG9zID0gMCwgc2l6ZV90eXBlIG4gPSBucG9zKTsKKyAgICBpdGVyYXRvciAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKTsKKyAgICBpdGVyYXRvciAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdCBiYXNpY19zdHJpbmcmIHN0cik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zMiwgc2l6ZV90eXBlIG4yKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBjb25zdF9wb2ludGVyIHMsIHNpemVfdHlwZSBuMik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuMSwgY29uc3RfcG9pbnRlciBzKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBzaXplX3R5cGUgbjIsIHZhbHVlX3R5cGUgYyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBpMSwgaXRlcmF0b3IgaTIsIGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIG4pOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBpMSwgaXRlcmF0b3IgaTIsIGNvbnN0X3BvaW50ZXIgcyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgc2l6ZV90eXBlIG4sIHZhbHVlX3R5cGUgYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcj4gYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgSW5wdXRJdGVyYXRvciBqMSwgSW5wdXRJdGVyYXRvciBqMik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPik7CisKKyAgICBzaXplX3R5cGUgY29weShwb2ludGVyIHMsIHNpemVfdHlwZSBuLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgICAgYmFzaWNfc3RyaW5nIHN1YnN0cihzaXplX3R5cGUgcG9zID0gMCwgc2l6ZV90eXBlIG4gPSBucG9zKSBjb25zdDsKKworICAgIHZvaWQgc3dhcChiYXNpY19zdHJpbmcmIHN0cik7CisKKyAgICBjb25zdF9wb2ludGVyIGNfc3RyKCkgY29uc3Q7CisgICAgY29uc3RfcG9pbnRlciBkYXRhKCkgY29uc3Q7CisKKyAgICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZmluZChjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworCisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSByZmluZChjb25zdF9wb2ludGVyIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKyAgICBzaXplX3R5cGUgcmZpbmQodmFsdWVfdHlwZSBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworCisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3RfcG9pbnRlciBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdF9wb2ludGVyIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworCisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdF9wb2ludGVyIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YodmFsdWVfdHlwZSBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKHZhbHVlX3R5cGUgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworCisgICAgaW50IGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIpIGNvbnN0OworICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvczIsIHNpemVfdHlwZSBuMikgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoY29uc3RfcG9pbnRlciBzKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdF9wb2ludGVyIHMpIGNvbnN0OworICAgIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0X3BvaW50ZXIgcywgc2l6ZV90eXBlIG4yKSBjb25zdDsKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGNoYXJUKiBsaHMgLCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsdHJhaXRzLEFsbG9jYXRvcj4mcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4KK29wZXJhdG9yKyhjaGFyVCBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCx0cmFpdHMsQWxsb2NhdG9yPiYgcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjaGFyVCByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCx0cmFpdHMsQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPiAKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsdHJhaXRzLEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBsaHMsIGNvbnN0IGNoYXJUKiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPCAoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPiAoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I+IChjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcj4gKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Citib29sIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jvb2wgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYm9vbCBvcGVyYXRvcj49KGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+Cit2b2lkIHN3YXAoYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgYmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocyk7CisKK3RlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KK2Jhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mCitvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQsIHRyYWl0cz4mIGlzLCBiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgc3RyKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK29wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBzdHIpOworCit0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CitiYXNpY19pc3RyZWFtPGNoYXJULCB0cmFpdHM+JiAKK2dldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsIGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBzdHIsIGNoYXJUIGRlbGltKTsKKwordGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYKK2dldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyVCwgdHJhaXRzPiYgaXMsIGJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBzdHIpOworCit0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyPiAgICBzdHJpbmc7Cit0eXBlZGVmIGJhc2ljX3N0cmluZzx3Y2hhcl90PiB3c3RyaW5nOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDxzdHJpbmc+OwordGVtcGxhdGUgPD4gc3RydWN0IGhhc2g8dTE2c3RyaW5nPjsKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHUzMnN0cmluZz47Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaGFzaDx3c3RyaW5nPjsKKworfSAgLy8gc3RkCisKKyovCisKKyNpbmNsdWRlIDxfX2NvbmZpZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjd2NoYXI+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgorI2lmbmRlZiBfTElCQ1BQX0hBU19OT19VTklDT0RFX0NIQVJTCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNlbmRpZgorI2lmIGRlZmluZWQoX0xJQkNQUF9OT19FWENFUFRJT05TKSB8fCBkZWZpbmVkKF9MSUJDUFBfREVCVUcpCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNlbmRpZgorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK19MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAorCisvLyBmcG9zCisKK3RlbXBsYXRlIDxjbGFzcyBfU3RhdGVUPgorY2xhc3MgZnBvcworeworcHJpdmF0ZToKKyAgICBfU3RhdGVUIF9fc3RfOworICAgIHN0cmVhbW9mZiBfX29mZl87CitwdWJsaWM6CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcG9zKHN0cmVhbW9mZiBfX29mZiA9IHN0cmVhbW9mZigpKSA6IF9fc3RfKCksIF9fb2ZmXyhfX29mZikge30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3Qge3JldHVybiBfX29mZl87fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBfU3RhdGVUIHN0YXRlKCkgY29uc3Qge3JldHVybiBfX3N0Xzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHN0YXRlKF9TdGF0ZVQgX19zdCkge19fc3RfID0gX19zdDt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZwb3MmIG9wZXJhdG9yKz0oc3RyZWFtb2ZmIF9fb2ZmKSB7X19vZmZfICs9IF9fb2ZmOyByZXR1cm4gKnRoaXM7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgZnBvcyAgb3BlcmF0b3IrIChzdHJlYW1vZmYgX19vZmYpIGNvbnN0IHtmcG9zIF9fdCgqdGhpcyk7IF9fdCArPSBfX29mZjsgcmV0dXJuIF9fdDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBmcG9zJiBvcGVyYXRvci09KHN0cmVhbW9mZiBfX29mZikge19fb2ZmXyAtPSBfX29mZjsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGZwb3MgIG9wZXJhdG9yLSAoc3RyZWFtb2ZmIF9fb2ZmKSBjb25zdCB7ZnBvcyBfX3QoKnRoaXMpOyBfX3QgLT0gX19vZmY7IHJldHVybiBfX3Q7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIF9TdGF0ZVQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc3RyZWFtb2ZmIG9wZXJhdG9yLShjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3gsIGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9feSkKKyAgICB7cmV0dXJuIHN0cmVhbW9mZihfX3gpIC0gc3RyZWFtb2ZmKF9feSk7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1N0YXRlVD4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sIG9wZXJhdG9yPT0oY29uc3QgZnBvczxfU3RhdGVUPiYgX194LCBjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3kpCisgICAge3JldHVybiBzdHJlYW1vZmYoX194KSA9PSBzdHJlYW1vZmYoX195KTt9CisKK3RlbXBsYXRlIDxjbGFzcyBfU3RhdGVUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3gsIGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9feSkKKyAgICB7cmV0dXJuIHN0cmVhbW9mZihfX3gpICE9IHN0cmVhbW9mZihfX3kpO30KKworLy8gY2hhcl90cmFpdHMKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK3N0cnVjdCBjaGFyX3RyYWl0cworeworICAgIHR5cGVkZWYgX0NoYXJUICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGludCAgICAgICBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHN0cmVhbW9mZiBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIHN0cmVhbXBvcyBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIHtfX2MxID0gX19jMjt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCBlcShjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBib29sIGx0KGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikge3JldHVybiBfX2MxIDwgX19jMjt9CisKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgc2l6ZV90ICAgICAgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpOworICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIG5vdF9lb2YoaW50X3R5cGUgX19jKQorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIF9fYykge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIHRvX2ludF90eXBlKGNoYXJfdHlwZSBfX2MpIHtyZXR1cm4gaW50X3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCAgICAgIGVxX2ludF90eXBlKGludF90eXBlIF9fYzEsIGludF90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgZW9mKCkge3JldHVybiBpbnRfdHlwZShFT0YpO30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbnQKK2NoYXJfdHJhaXRzPF9DaGFyVD46OmNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpfX3MxLCAqX19zMikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsdCgqX19zMiwgKl9fczEpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NpemVfdAorY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQoreworICAgIHNpemVfdCBfX2xlbiA9IDA7CisgICAgZm9yICg7ICFlcSgqX19zLCBjaGFyX3R5cGUoMCkpOyArK19fcykKKyAgICAgICAgKytfX2xlbjsKKyAgICByZXR1cm4gX19sZW47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3QgX0NoYXJUKgorY2hhcl90cmFpdHM8X0NoYXJUPjo6ZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgeworICAgICAgICBpZiAoZXEoKl9fcywgX19hKSkKKyAgICAgICAgICAgIHJldHVybiBfX3M7CisgICAgICAgICsrX19zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KK19DaGFyVCoKK2NoYXJfdHJhaXRzPF9DaGFyVD46Om1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCit7CisgICAgY2hhcl90eXBlKiBfX3IgPSBfX3MxOworICAgIGlmIChfX3MxIDwgX19zMikKKyAgICB7CisgICAgICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICAgICAgICAgIGFzc2lnbigqX19zMSwgKl9fczIpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3MyIDwgX19zMSkKKyAgICB7CisgICAgICAgIF9fczEgKz0gX19uOworICAgICAgICBfX3MyICs9IF9fbjsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgICAgICBhc3NpZ24oKi0tX19zMSwgKi0tX19zMik7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorX0NoYXJUKgorY2hhcl90cmFpdHM8X0NoYXJUPjo6Y29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICBhc3NpZ24oKl9fczEsICpfX3MyKTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK19DaGFyVCoKK2NoYXJfdHJhaXRzPF9DaGFyVD46OmFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MpCisgICAgICAgIGFzc2lnbigqX19zLCBfX2EpOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIGNoYXJfdHJhaXRzPGNoYXI+CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcj4KK3sKKyAgICB0eXBlZGVmIGNoYXIgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBpbnQgICAgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIHZvaWQgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSB7X19jMSA9IF9fYzI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGJvb2wgZXEoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSB7cmV0dXJuIF9fYzEgPT0gX19jMjt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCBsdChjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gKHVuc2lnbmVkIGNoYXIpX19jMSA8ICh1bnNpZ25lZCBjaGFyKV9fYzI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgICB7cmV0dXJuIG1lbWNtcChfX3MxLCBfX3MyLCBfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBzaXplX3QgICAgICAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykge3JldHVybiBzdHJsZW4oX19zKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgY29uc3QgY2hhcl90eXBlKiBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgICAge3JldHVybiAoY29uc3QgY2hhcl90eXBlKiltZW1jaHIoX19zLCB0b19pbnRfdHlwZShfX2EpLCBfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICAgIHtyZXR1cm4gKGNoYXJfdHlwZSopbWVtbW92ZShfX3MxLCBfX3MyLCBfX24pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICAgIHtyZXR1cm4gKGNoYXJfdHlwZSopbWVtY3B5KF9fczEsIF9fczIsIF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGNoYXJfdHlwZSogICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgICB7cmV0dXJuIChjaGFyX3R5cGUqKW1lbXNldChfX3MsIHRvX2ludF90eXBlKF9fYSksIF9fbik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIG5vdF9lb2YoaW50X3R5cGUgX19jKQorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIF9fYykge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIHRvX2ludF90eXBlKGNoYXJfdHlwZSBfX2MpIHtyZXR1cm4gaW50X3R5cGUoKHVuc2lnbmVkIGNoYXIpX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCAgICAgIGVxX2ludF90eXBlKGludF90eXBlIF9fYzEsIGludF90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgZW9mKCkge3JldHVybiBpbnRfdHlwZShFT0YpO30KK307CisKKy8vIGNoYXJfdHJhaXRzPHdjaGFyX3Q+CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgY2hhcl90cmFpdHM8d2NoYXJfdD4KK3sKKyAgICB0eXBlZGVmIHdjaGFyX3QgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB3aW50X3QgICAgaW50X3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3Qgc3RhdGVfdHlwZTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIHZvaWQgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSB7X19jMSA9IF9fYzI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGJvb2wgZXEoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSB7cmV0dXJuIF9fYzEgPT0gX19jMjt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCBsdChjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gX19jMSA8IF9fYzI7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgICB7cmV0dXJuIHdtZW1jbXAoX19zMSwgX19zMiwgX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgc2l6ZV90ICAgICAgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpIHtyZXR1cm4gd2NzbGVuKF9fcyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSogZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgICAgIHtyZXR1cm4gKGNvbnN0IGNoYXJfdHlwZSopd21lbWNocihfX3MsIF9fYSwgX19uKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgICB7cmV0dXJuIChjaGFyX3R5cGUqKXdtZW1tb3ZlKF9fczEsIF9fczIsIF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGNoYXJfdHlwZSogICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgICAge3JldHVybiAoY2hhcl90eXBlKil3bWVtY3B5KF9fczEsIF9fczIsIF9fbik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGNoYXJfdHlwZSogICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgICB7cmV0dXJuIChjaGFyX3R5cGUqKXdtZW1zZXQoX19zLCBfX2EsIF9fbik7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIG5vdF9lb2YoaW50X3R5cGUgX19jKQorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIF9fYykge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIHRvX2ludF90eXBlKGNoYXJfdHlwZSBfX2MpIHtyZXR1cm4gaW50X3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCAgICAgIGVxX2ludF90eXBlKGludF90eXBlIF9fYzEsIGludF90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgZW9mKCkge3JldHVybiBpbnRfdHlwZShXRU9GKTt9Cit9OworCisjaWZuZGVmIF9MSUJDUFBfSEFTX05PX1VOSUNPREVfQ0hBUlMKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjaGFyX3RyYWl0czxjaGFyMTZfdD4KK3sKKyAgICB0eXBlZGVmIGNoYXIxNl90ICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHVpbnRfbGVhc3QxNl90IGludF90eXBlOworICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgb2ZmX3R5cGU7CisgICAgdHlwZWRlZiB1MTZzdHJlYW1wb3MgICBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIG1ic3RhdGVfdCAgICAgIHN0YXRlX3R5cGU7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyB2b2lkIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikge19fYzEgPSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBib29sIGVxKGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikge3JldHVybiBfX2MxID09IF9fYzI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGJvb2wgbHQoY2hhcl90eXBlIF9fYzEsIGNoYXJfdHlwZSBfX2MyKSB7cmV0dXJuIF9fYzEgPCBfX2MyO30KKworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pOworICAgIHN0YXRpYyBzaXplX3QgICAgICAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcyk7CisgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSogZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pOworICAgIHN0YXRpYyBjaGFyX3R5cGUqICAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSk7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBfX2MpCisgICAgICAgIHtyZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyB+ZW9mKCkgOiBfX2M7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGNoYXJfdHlwZSB0b19jaGFyX3R5cGUoaW50X3R5cGUgX19jKSB7cmV0dXJuIGNoYXJfdHlwZShfX2MpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgdG9faW50X3R5cGUoY2hhcl90eXBlIF9fYykge3JldHVybiBpbnRfdHlwZShfX2MpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBib29sICAgICAgZXFfaW50X3R5cGUoaW50X3R5cGUgX19jMSwgaW50X3R5cGUgX19jMikKKyAgICAgICAge3JldHVybiBfX2MxID09IF9fYzI7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc3RhdGljIGludF90eXBlICBlb2YoKSB7cmV0dXJuIGludF90eXBlKDB4REZGRik7fQorfTsKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2ludAorY2hhcl90cmFpdHM8Y2hhcjE2X3Q+Ojpjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQoreworICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICB7CisgICAgICAgIGlmIChsdCgqX19zMSwgKl9fczIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobHQoKl9fczIsICpfX3MxKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3NpemVfdAorY2hhcl90cmFpdHM8Y2hhcjE2X3Q+OjpsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCit7CisgICAgc2l6ZV90IF9fbGVuID0gMDsKKyAgICBmb3IgKDsgIWVxKCpfX3MsIGNoYXJfdHlwZSgwKSk7ICsrX19zKQorICAgICAgICArK19fbGVuOworICAgIHJldHVybiBfX2xlbjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NvbnN0IGNoYXIxNl90KgorY2hhcl90cmFpdHM8Y2hhcjE2X3Q+OjpmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKK3sKKyAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICB7CisgICAgICAgIGlmIChlcSgqX19zLCBfX2EpKQorICAgICAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgICAgKytfX3M7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY2hhcjE2X3QqCitjaGFyX3RyYWl0czxjaGFyMTZfdD46Om1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCit7CisgICAgY2hhcl90eXBlKiBfX3IgPSBfX3MxOworICAgIGlmIChfX3MxIDwgX19zMikKKyAgICB7CisgICAgICAgIGZvciAoOyBfX247IC0tX19uLCArK19fczEsICsrX19zMikKKyAgICAgICAgICAgIGFzc2lnbigqX19zMSwgKl9fczIpOworICAgIH0KKyAgICBlbHNlIGlmIChfX3MyIDwgX19zMSkKKyAgICB7CisgICAgICAgIF9fczEgKz0gX19uOworICAgICAgICBfX3MyICs9IF9fbjsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgICAgICBhc3NpZ24oKi0tX19zMSwgKi0tX19zMik7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyMTZfdCoKK2NoYXJfdHJhaXRzPGNoYXIxNl90Pjo6Y29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICBhc3NpZ24oKl9fczEsICpfX3MyKTsKKyAgICByZXR1cm4gX19yOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY2hhcjE2X3QqCitjaGFyX3RyYWl0czxjaGFyMTZfdD46OmFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MpCisgICAgICAgIGFzc2lnbigqX19zLCBfX2EpOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcjMyX3Q+Cit7CisgICAgdHlwZWRlZiBjaGFyMzJfdCAgICAgICBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiB1aW50X2xlYXN0MzJfdCBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgIG9mZl90eXBlOworICAgIHR5cGVkZWYgdTMyc3RyZWFtcG9zICAgcG9zX3R5cGU7CisgICAgdHlwZWRlZiBtYnN0YXRlX3QgICAgICBzdGF0ZV90eXBlOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIHtfX2MxID0gX19jMjt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCBlcShjaGFyX3R5cGUgX19jMSwgY2hhcl90eXBlIF9fYzIpIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBib29sIGx0KGNoYXJfdHlwZSBfX2MxLCBjaGFyX3R5cGUgX19jMikge3JldHVybiBfX2MxIDwgX19jMjt9CisKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgc2l6ZV90ICAgICAgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpOworICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKTsKKyAgICBzdGF0aWMgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIG5vdF9lb2YoaW50X3R5cGUgX19jKQorICAgICAgICB7cmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gfmVvZigpIDogX19jO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIF9fYykge3JldHVybiBjaGFyX3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgaW50X3R5cGUgIHRvX2ludF90eXBlKGNoYXJfdHlwZSBfX2MpIHtyZXR1cm4gaW50X3R5cGUoX19jKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzdGF0aWMgYm9vbCAgICAgIGVxX2ludF90eXBlKGludF90eXBlIF9fYzEsIGludF90eXBlIF9fYzIpCisgICAgICAgIHtyZXR1cm4gX19jMSA9PSBfX2MyO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHN0YXRpYyBpbnRfdHlwZSAgZW9mKCkge3JldHVybiBpbnRfdHlwZSgweEZGRkZGRkZGKTt9Cit9OworCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW50CitjaGFyX3RyYWl0czxjaGFyMzJfdD46OmNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCit7CisgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpfX3MxLCAqX19zMikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsdCgqX19zMiwgKl9fczEpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc2l6ZV90CitjaGFyX3RyYWl0czxjaGFyMzJfdD46Omxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKK3sKKyAgICBzaXplX3QgX19sZW4gPSAwOworICAgIGZvciAoOyAhZXEoKl9fcywgY2hhcl90eXBlKDApKTsgKytfX3MpCisgICAgICAgICsrX19sZW47CisgICAgcmV0dXJuIF9fbGVuOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorY29uc3QgY2hhcjMyX3QqCitjaGFyX3RyYWl0czxjaGFyMzJfdD46OmZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQoreworICAgIGZvciAoOyBfX247IC0tX19uKQorICAgIHsKKyAgICAgICAgaWYgKGVxKCpfX3MsIF9fYSkpCisgICAgICAgICAgICByZXR1cm4gX19zOworICAgICAgICArK19fczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyMzJfdCoKK2NoYXJfdHJhaXRzPGNoYXIzMl90Pjo6bW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgICBjaGFyX3R5cGUqIF9fciA9IF9fczE7CisgICAgaWYgKF9fczEgPCBfX3MyKQorICAgIHsKKyAgICAgICAgZm9yICg7IF9fbjsgLS1fX24sICsrX19zMSwgKytfX3MyKQorICAgICAgICAgICAgYXNzaWduKCpfX3MxLCAqX19zMik7CisgICAgfQorICAgIGVsc2UgaWYgKF9fczIgPCBfX3MxKQorICAgIHsKKyAgICAgICAgX19zMSArPSBfX247CisgICAgICAgIF9fczIgKz0gX19uOworICAgICAgICBmb3IgKDsgX19uOyAtLV9fbikKKyAgICAgICAgICAgIGFzc2lnbigqLS1fX3MxLCAqLS1fX3MyKTsKKyAgICB9CisgICAgcmV0dXJuIF9fcjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2NoYXIzMl90KgorY2hhcl90cmFpdHM8Y2hhcjMyX3Q+Ojpjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQoreworICAgIGNoYXJfdHlwZSogX19yID0gX19zMTsKKyAgICBmb3IgKDsgX19uOyAtLV9fbiwgKytfX3MxLCArK19fczIpCisgICAgICAgIGFzc2lnbigqX19zMSwgKl9fczIpOworICAgIHJldHVybiBfX3I7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyMzJfdCoKK2NoYXJfdHJhaXRzPGNoYXIzMl90Pjo6YXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQoreworICAgIGNoYXJfdHlwZSogX19yID0gX19zOworICAgIGZvciAoOyBfX247IC0tX19uLCArK19fcykKKyAgICAgICAgYXNzaWduKCpfX3MsIF9fYSk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2VuZGlmCisKKy8vIGJhc2ljX3N0cmluZworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiwgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mKTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBfQ2hhclQqLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mKTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhfQ2hhclQsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYpOworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiwgY29uc3QgX0NoYXJUKik7CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mLCBfQ2hhclQpOworCit0ZW1wbGF0ZSA8Ym9vbD4KK2NsYXNzIF9fYmFzaWNfc3RyaW5nX2NvbW1vbgoreworcHJvdGVjdGVkOgorICAgIHZvaWQgX190aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdDsKKyAgICB2b2lkIF9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBfX2I+Cit2b2lkCitfX2Jhc2ljX3N0cmluZ19jb21tb248X19iPjo6X190aHJvd19sZW5ndGhfZXJyb3IoKSBjb25zdAoreworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBsZW5ndGhfZXJyb3IoImJhc2ljX3N0cmluZyIpOworI2Vsc2UKKyAgICBhc3NlcnQoISJiYXNpY19zdHJpbmcgbGVuZ3RoX2Vycm9yIik7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGJvb2wgX19iPgordm9pZAorX19iYXNpY19zdHJpbmdfY29tbW9uPF9fYj46Ol9fdGhyb3dfb3V0X29mX3JhbmdlKCkgY29uc3QKK3sKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgdGhyb3cgb3V0X29mX3JhbmdlKCJiYXNpY19zdHJpbmciKTsKKyNlbHNlCisgICAgYXNzZXJ0KCEiYmFzaWNfc3RyaW5nIG91dF9vZl9yYW5nZSIpOworI2VuZGlmCit9CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfX2Jhc2ljX3N0cmluZ19jb21tb248dHJ1ZT47CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4gCitjbGFzcyBiYXNpY19zdHJpbmcKKyAgICA6IHByaXZhdGUgX19iYXNpY19zdHJpbmdfY29tbW9uPHRydWU+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NlbGY7CisgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpjaGFyX3R5cGUgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpyZWZlcmVuY2UgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgICBjb25zdF9wb2ludGVyOworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICB0eXBlZGVmIF9fZGVidWdfaXRlcjxiYXNpY19zdHJpbmcsIHBvaW50ZXI+ICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgX19kZWJ1Z19pdGVyPGJhc2ljX3N0cmluZywgY29uc3RfcG9pbnRlcj4gICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICBmcmllbmQgY2xhc3MgX19kZWJ1Z19pdGVyPGJhc2ljX3N0cmluZywgcG9pbnRlcj47CisgICAgZnJpZW5kIGNsYXNzIF9fZGVidWdfaXRlcjxiYXNpY19zdHJpbmcsIGNvbnN0X3BvaW50ZXI+OworI2VsaWYgZGVmaW5lZChfTElCQ1BQX1JBV19JVEVSQVRPUlMpCisgICAgdHlwZWRlZiBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0X3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworI2Vsc2UKKyAgICB0eXBlZGVmIF9fd3JhcF9pdGVyPHBvaW50ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgX193cmFwX2l0ZXI8Y29uc3RfcG9pbnRlcj4gICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisjZW5kaWYKKyAgICB0eXBlZGVmIF9TVEQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfU1REOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCitwcml2YXRlOgorICAgIHN0cnVjdCBfX2xvbmcKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcF87CisgICAgICAgIHNpemVfdHlwZSBfX3NpemVfOworICAgICAgICBwb2ludGVyICAgX19kYXRhXzsKKyAgICB9OworCisjaWYgX0xJQkNQUF9CSUdfRU5ESUFOCisgICAgZW51bSB7X19zaG9ydF9tYXNrID0gMHg4MH07CisgICAgZW51bSB7X19sb25nX21hc2sgID0gfihzaXplX3R5cGUofjApID4+IDEpfTsKKyNlbHNlCisgICAgZW51bSB7X19zaG9ydF9tYXNrID0gMHgwMX07CisgICAgZW51bSB7X19sb25nX21hc2sgID0gMHgxfTsKKyNlbmRpZgorCisgICAgZW51bSB7X19tYXNrID0gc2l6ZV90eXBlKH4wKSA+PiAxfTsKKworICAgIGVudW0ge19fbWluX2NhcCA9IChzaXplb2YoX19sb25nKSAtIDEpL3NpemVvZih2YWx1ZV90eXBlKSA+IDIgPworICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoX19sb25nKSAtIDEpL3NpemVvZih2YWx1ZV90eXBlKSA6IDJ9OworCisgICAgc3RydWN0IF9fc2hvcnQKKyAgICB7CisgICAgICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgX19zaXplXzsKKyAgICAgICAgICAgIHZhbHVlX3R5cGUgXzsKKyAgICAgICAgfTsKKyAgICAgICAgdmFsdWVfdHlwZSBfX2RhdGFfW19fbWluX2NhcF07CisgICAgfTsKKworICAgIHVuaW9uIF97X19sb25nIF87IF9fc2hvcnQgX187fTsKKworICAgIGVudW0ge19fbl93b3JkcyA9IHNpemVvZihfKSAvIHNpemVvZihzaXplX3R5cGUpfTsKKworICAgIHN0cnVjdCBfX3JhdworICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fd29yZHNbX19uX3dvcmRzXTsKKyAgICB9OworCisgICAgc3RydWN0IF9fcmVwCisgICAgeworICAgICAgICB1bmlvbgorICAgICAgICB7CisgICAgICAgICAgICBfX2xvbmcgIF9fbDsKKyAgICAgICAgICAgIF9fc2hvcnQgX19zOworICAgICAgICAgICAgX19yYXcgICBfX3I7CisgICAgICAgIH07CisgICAgfTsKKworICAgIF9fY29tcHJlc3NlZF9wYWlyPF9fcmVwLCBhbGxvY2F0b3JfdHlwZT4gX19yXzsKKworI2lmZGVmIF9MSUJDUFBfREVCVUcKKworICAgIHBhaXI8aXRlcmF0b3IqLCBjb25zdF9pdGVyYXRvcio+IF9faXRlcmF0b3JfbGlzdF87CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yKiYgICAgICAgX19nZXRfaXRlcmF0b3JfbGlzdChpdGVyYXRvciopICAgICAgIHtyZXR1cm4gX19pdGVyYXRvcl9saXN0Xy5maXJzdDt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciomIF9fZ2V0X2l0ZXJhdG9yX2xpc3QoY29uc3RfaXRlcmF0b3IqKSB7cmV0dXJuIF9faXRlcmF0b3JfbGlzdF8uc2Vjb25kO30KKworI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCisKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3MgPSAtMTsKKworICAgIGJhc2ljX3N0cmluZygpOworICAgIGV4cGxpY2l0IGJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworI2lmZGVmIF9MSUJDUFBfTU9WRQorICAgIGJhc2ljX3N0cmluZyhiYXNpY19zdHJpbmcmJiBfX3N0cik7CisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNlbmRpZgorICAgIGJhc2ljX3N0cmluZyhjb25zdF9wb2ludGVyIF9fcyk7CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0X3BvaW50ZXIgX19zLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBiYXNpY19zdHJpbmcoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24pOworICAgIGJhc2ljX3N0cmluZyhjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICBiYXNpY19zdHJpbmcoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpOworICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24gPSBucG9zLAorICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyAgICBiYXNpY19zdHJpbmcoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKTsKKyAgICBiYXNpY19zdHJpbmcoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKworICAgIH5iYXNpY19zdHJpbmcoKTsKKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikge3JldHVybiBhc3NpZ24oX19zdHIpO30KKyNpZmRlZiBfTElCQ1BQX01PVkUKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KGJhc2ljX3N0cmluZyYmIF9fc3RyKSB7c3dhcChfX3N0cik7IHJldHVybiAqdGhpczt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KGNvbnN0X3BvaW50ZXIgX19zKSAgICAgICAgIHtyZXR1cm4gYXNzaWduKF9fcyk7fQorICAgIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9KHZhbHVlX3R5cGUgX19jKTsKKyAgICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpIHtyZXR1cm4gYXNzaWduKF9faWwuYmVnaW4oKSwgX19pbC5zaXplKCkpO30KKworI2lmbmRlZiBfTElCQ1BQX0RFQlVHCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciAgICAgICBiZWdpbigpICAgICAgIHtyZXR1cm4gaXRlcmF0b3IoX19nZXRfcG9pbnRlcigpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciAgICAgICBlbmQoKSAgICAgICAgIHtyZXR1cm4gaXRlcmF0b3IoX19nZXRfcG9pbnRlcigpICsgc2l6ZSgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgc2l6ZSgpKTt9CisjZWxzZSAgLy8gX0xJQkNQUF9ERUJVRworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3IgICAgICAgYmVnaW4oKSAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fZ2V0X3BvaW50ZXIoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMsIGRhdGEoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3IgICAgICAgZW5kKCkgICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fZ2V0X3BvaW50ZXIoKSArIHNpemUoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMsIGRhdGEoKSArIHNpemUoKSk7fQorI2VuZGlmICAvLyBfTElCQ1BQX0RFQlVHCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJiZWdpbigpICAgICAgIHtyZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJldmVyc2VfaXRlcmF0b3IgICAgICAgcmVuZCgpICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0ICAge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgICAgICAgICBjYmVnaW4oKSBjb25zdCB7cmV0dXJuIGJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgICAgICAgICBjZW5kKCkgY29uc3QgICB7cmV0dXJuIGVuZCgpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IHtyZXR1cm4gcmJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0ICAge3JldHVybiByZW5kKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0CisgICAgICAgIHtyZXR1cm4gX19pc19sb25nKCkgPyBfX2dldF9sb25nX3NpemUoKSA6IF9fZ2V0X3Nob3J0X3NpemUoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3Qge3JldHVybiBzaXplKCk7fQorICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3QKKyAgICAgICAge3JldHVybiAoX19pc19sb25nKCkgPyBfX2dldF9sb25nX2NhcCgpIDogX19taW5fY2FwKSAtIDE7fQorCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbikge3Jlc2l6ZShfX24sIHZhbHVlX3R5cGUoKSk7fQorCisgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSByZXNfYXJnID0gMCk7CisgICAgdm9pZCBzaHJpbmtfdG9fZml0KCkge3Jlc2VydmUoKTt9CisgICAgdm9pZCBjbGVhcigpOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBlbXB0eSgpIGNvbnN0IHtyZXR1cm4gc2l6ZSgpID09IDA7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpIGNvbnN0OworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlICAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKTsKKworICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgICByZWZlcmVuY2UgICAgICAgYXQoc2l6ZV90eXBlIF9fbik7CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSB7cmV0dXJuIGFwcGVuZChfX3N0cik7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0X3BvaW50ZXIgX19zKSAgICAgICAgIHtyZXR1cm4gYXBwZW5kKF9fcyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcis9KHZhbHVlX3R5cGUgX19jKSAgICAgICAgICAgIHtwdXNoX2JhY2soX19jKTsgcmV0dXJuICp0aGlzO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJhc2ljX3N0cmluZyYgb3BlcmF0b3IrPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpIHtyZXR1cm4gYXBwZW5kKF9faWwpO30KKworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbik7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24pOworICAgIGJhc2ljX3N0cmluZyYgYXBwZW5kKGNvbnN0X3BvaW50ZXIgX19zKTsKKyAgICBiYXNpY19zdHJpbmcmIGFwcGVuZChzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhcHBlbmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgYmFzaWNfc3RyaW5nJiBhcHBlbmQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKSB7cmV0dXJuIGFwcGVuZChfX2lsLmJlZ2luKCksIF9faWwuc2l6ZSgpKTt9CisKKyAgICB2b2lkIHB1c2hfYmFjayh2YWx1ZV90eXBlIF9fYyk7CisgICAgdm9pZCBwb3BfYmFjaygpOworICAgIHJlZmVyZW5jZSAgICAgICBmcm9udCgpOworICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0OworICAgIHJlZmVyZW5jZSAgICAgICBiYWNrKCk7CisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdDsKKworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbik7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24pOworICAgIGJhc2ljX3N0cmluZyYgYXNzaWduKGNvbnN0X3BvaW50ZXIgX19zKTsKKyAgICBiYXNpY19zdHJpbmcmIGFzc2lnbihzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBhc3NpZ24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisgICAgYmFzaWNfc3RyaW5nJiBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKSB7cmV0dXJuIGFzc2lnbihfX2lsLmJlZ2luKCksIF9faWwuc2l6ZSgpKTt9CisKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0X3BvaW50ZXIgX19zKTsKKyAgICBiYXNpY19zdHJpbmcmIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKTsKKyAgICBpdGVyYXRvciAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgdmFsdWVfdHlwZSBfX2MpOworICAgIGl0ZXJhdG9yICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgIGl0ZXJhdG9yCisgICAgICAgID46OnR5cGUKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworICAgIHRlbXBsYXRlPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZgorICAgICAgICA8CisgICAgICAgICAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgPjo6dHlwZQorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2lsKQorICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGluc2VydChfX3BvcywgX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTt9CisKKyAgICBiYXNpY19zdHJpbmcmIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKTsKKyAgICBpdGVyYXRvciAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKTsKKyAgICBpdGVyYXRvciAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fbjIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdF9wb2ludGVyIF9fcyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCB2YWx1ZV90eXBlIF9fYyk7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOworICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fbik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0X3BvaW50ZXIgX19zKTsKKyAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpOworICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICAgICAgPAorICAgICAgICAgICAgX19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgICAgICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgICA+Ojp0eXBlCisgICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0lucHV0SXRlcmF0b3IgX19qMSwgX0lucHV0SXRlcmF0b3IgX19qMik7CisgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19pbCkKKyAgICAgICAge3JldHVybiByZXBsYWNlKF9faTEsIF9faTIsIF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7fQorCisgICAgc2l6ZV90eXBlIGNvcHkocG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICAgIGJhc2ljX3N0cmluZyBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0OworCisgICAgdm9pZCBzd2FwKGJhc2ljX3N0cmluZyYgX19zdHIpOworCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9wb2ludGVyIGNfc3RyKCkgY29uc3Qge3JldHVybiBkYXRhKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcG9pbnRlciBkYXRhKCkgY29uc3QgIHtyZXR1cm4gX19nZXRfcG9pbnRlcigpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHtyZXR1cm4gX19hbGxvYygpO30KKworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKyAgICBzaXplX3R5cGUgZmluZCh2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgcmZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisgICAgc2l6ZV90eXBlIHJmaW5kKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIHNpemVfdHlwZSByZmluZChjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisgICAgc2l6ZV90eXBlIHJmaW5kKHZhbHVlX3R5cGUgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisgICAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKHZhbHVlX3R5cGUgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZih2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShjb25zdF9wb2ludGVyIF9fcykgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0X3BvaW50ZXIgX19zKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKworICAgIGJvb2wgX19pbnZhcmlhbnRzKCkgY29uc3Q7Citwcml2YXRlOgorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYWxsb2NhdG9yX3R5cGUmICAgICAgIF9fYWxsb2MoKSAgICAgICB7cmV0dXJuIF9fcl8uc2Vjb25kKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYWxsb2MoKSBjb25zdCB7cmV0dXJuIF9fcl8uc2Vjb25kKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIF9faXNfbG9uZygpIGNvbnN0IHtyZXR1cm4gYm9vbChfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV8gJiBfX3Nob3J0X21hc2spO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19zZXRfbG9uZygpICB7X19yXy5maXJzdCgpLl9fcy5fX3NpemVfICY9IF9fc2hvcnRfbWFzazt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fc2V0X3Nob3J0KCkge19fcl8uZmlyc3QoKS5fX3MuX19zaXplXyB8PSB+X19zaG9ydF9tYXNrO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBfX3NldF9zaG9ydF9zaXplKHNpemVfdHlwZSBfX3MpCisjaWYgX0xJQkNQUF9CSUdfRU5ESUFOCisgICAgICAgIHtfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV8gPSAodW5zaWduZWQgY2hhcikoX19zKTt9CisjZWxzZQorICAgICAgICB7X19yXy5maXJzdCgpLl9fcy5fX3NpemVfID0gKHVuc2lnbmVkIGNoYXIpKF9fcyA8PCAxKTt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBfX2dldF9zaG9ydF9zaXplKCkgY29uc3QKKyNpZiBfTElCQ1BQX0JJR19FTkRJQU4KKyAgICAgICAge3JldHVybiBfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV87fQorI2Vsc2UKKyAgICAgICAge3JldHVybiBfX3JfLmZpcnN0KCkuX19zLl9fc2l6ZV8gPj4gMTt9CisjZW5kaWYKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgX19zZXRfbG9uZ19zaXplKHNpemVfdHlwZSBfX3MpICB7X19yXy5maXJzdCgpLl9fbC5fX3NpemVfID0gX19zO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHNpemVfdHlwZSBfX2dldF9sb25nX3NpemUoKSBjb25zdCB7cmV0dXJuIF9fcl8uZmlyc3QoKS5fX2wuX19zaXplXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9fc2V0X3NpemUoc2l6ZV90eXBlIF9fcykKKyAgICAgICAge2lmIChfX2lzX2xvbmcoKSkgX19zZXRfbG9uZ19zaXplKF9fcyk7IGVsc2UgX19zZXRfc2hvcnRfc2l6ZShfX3MpO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBfX3NldF9sb25nX2NhcChzaXplX3R5cGUgX19zKSAgIHtfX3JfLmZpcnN0KCkuX19sLl9fY2FwXyAgPSBfX2xvbmdfbWFzayB8IF9fczt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgX19nZXRfbG9uZ19jYXAoKSBjb25zdCB7cmV0dXJuIF9fcl8uZmlyc3QoKS5fX2wuX19jYXBfICYgfl9fbG9uZ19tYXNrO30KKworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgdm9pZCBfX3NldF9sb25nX3BvaW50ZXIocG9pbnRlciBfX3ApIHtfX3JfLmZpcnN0KCkuX19sLl9fZGF0YV8gPSBfX3A7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcG9pbnRlciAgICAgICBfX2dldF9sb25nX3BvaW50ZXIoKSAgICAgICB7cmV0dXJuIF9fcl8uZmlyc3QoKS5fX2wuX19kYXRhXzt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9wb2ludGVyIF9fZ2V0X2xvbmdfcG9pbnRlcigpIGNvbnN0IHtyZXR1cm4gX19yXy5maXJzdCgpLl9fbC5fX2RhdGFfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBvaW50ZXIgICAgICAgX19nZXRfc2hvcnRfcG9pbnRlcigpICAgICAgIHtyZXR1cm4gX19yXy5maXJzdCgpLl9fcy5fX2RhdGFfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3BvaW50ZXIgX19nZXRfc2hvcnRfcG9pbnRlcigpIGNvbnN0IHtyZXR1cm4gX19yXy5maXJzdCgpLl9fcy5fX2RhdGFfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHBvaW50ZXIgICAgICAgX19nZXRfcG9pbnRlcigpCisgICAgICAgIHtyZXR1cm4gX19pc19sb25nKCkgPyBfX2dldF9sb25nX3BvaW50ZXIoKSA6IF9fZ2V0X3Nob3J0X3BvaW50ZXIoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9wb2ludGVyIF9fZ2V0X3BvaW50ZXIoKSBjb25zdAorICAgICAgICB7cmV0dXJuIF9faXNfbG9uZygpID8gX19nZXRfbG9uZ19wb2ludGVyKCkgOiBfX2dldF9zaG9ydF9wb2ludGVyKCk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIF9femVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdHlwZSAoJl9fYSlbX19uX3dvcmRzXSA9IF9fcl8uZmlyc3QoKS5fX3IuX193b3JkczsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgX19pID0gMDsgX19pIDwgX19uX3dvcmRzOyArK19faSkKKyAgICAgICAgICAgICAgICBfX2FbX19pXSA9IDA7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlIDxzaXplX3R5cGUgX19hPiBzdGF0aWMKKyAgICAgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBzaXplX3R5cGUgX19hbGlnbihzaXplX3R5cGUgX19zKSB7cmV0dXJuIF9fcyArIChfX2EtMSkgJiB+KF9fYS0xKTt9CisgICAgZW51bSB7X19hbGlnbm1lbnQgPSAxNn07CisgICAgc3RhdGljIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgc2l6ZV90eXBlIF9fcmVjb21tZW5kKHNpemVfdHlwZSBfX3MpCisgICAgICAgIHtyZXR1cm4gKF9fcyA8IF9fbWluX2NhcCA/IF9fbWluX2NhcCA6CisgICAgICAgICAgICAgICAgIF9fYWxpZ248c2l6ZW9mKHZhbHVlX3R5cGUpIDwgX19hbGlnbm1lbnQgPyBfX2FsaWdubWVudC9zaXplb2YodmFsdWVfdHlwZSkgOiAxPihfX3MrMSkpIC0gMTt9CisKKyAgICB2b2lkIF9faW5pdChjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fc3osIHNpemVfdHlwZSBfX3Jlc2VydmUpOworICAgIHZvaWQgX19pbml0KGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19zeik7CisgICAgdm9pZCBfX2luaXQoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpOworIAorICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgICBfX2lzX2lucHV0X2l0ZXJhdG9yICA8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX19pbml0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICB0eXBlbmFtZSBlbmFibGVfaWYKKyAgICA8CisgICAgICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgICAgIHZvaWQKKyAgICA+Ojp0eXBlCisgICAgX19pbml0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworCisgICAgdm9pZCBfX2dyb3dfYnkoc2l6ZV90eXBlIF9fb2xkX2NhcCwgc2l6ZV90eXBlIF9fZGVsdGFfY2FwLCBzaXplX3R5cGUgX19vbGRfc3osCisgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9jb3B5LCAgc2l6ZV90eXBlIF9fbl9kZWwsICAgICBzaXplX3R5cGUgX19uX2FkZCA9IDApOyAKKyAgICB2b2lkIF9fZ3Jvd19ieV9hbmRfcmVwbGFjZShzaXplX3R5cGUgX19vbGRfY2FwLCBzaXplX3R5cGUgX19kZWx0YV9jYXAsIHNpemVfdHlwZSBfX29sZF9zeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2NvcHksICBzaXplX3R5cGUgX19uX2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2FkZCwgY29uc3RfcG9pbnRlciBfX3BfbmV3X3N0dWZmKTsKKworICAgIHZvaWQgX19lcmFzZV90b19lbmQoc2l6ZV90eXBlIF9fcG9zKTsKKworICAgIHZvaWQgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICB2b2lkIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChzaXplX3R5cGUpOworCisgICAgZnJpZW5kIGJhc2ljX3N0cmluZyBvcGVyYXRvcis8Pihjb25zdCBiYXNpY19zdHJpbmcmLCBjb25zdCBiYXNpY19zdHJpbmcmKTsKKyAgICBmcmllbmQgYmFzaWNfc3RyaW5nIG9wZXJhdG9yKzw+KGNvbnN0IHZhbHVlX3R5cGUqLCBjb25zdCBiYXNpY19zdHJpbmcmKTsKKyAgICBmcmllbmQgYmFzaWNfc3RyaW5nIG9wZXJhdG9yKzw+KHZhbHVlX3R5cGUsIGNvbnN0IGJhc2ljX3N0cmluZyYpOworICAgIGZyaWVuZCBiYXNpY19zdHJpbmcgb3BlcmF0b3IrPD4oY29uc3QgYmFzaWNfc3RyaW5nJiwgY29uc3QgdmFsdWVfdHlwZSopOworICAgIGZyaWVuZCBiYXNpY19zdHJpbmcgb3BlcmF0b3IrPD4oY29uc3QgYmFzaWNfc3RyaW5nJiwgdmFsdWVfdHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorI2lmbmRlZiBfTElCQ1BQX0RFQlVHCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorI2VuZGlmCit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBpdGVyYXRvcjo6X19yZW1vdmVfYWxsKHRoaXMpOworICAgIGNvbnN0X2l0ZXJhdG9yOjpfX3JlbW92ZV9hbGwodGhpcyk7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KKyNpZm5kZWYgX0xJQkNQUF9ERUJVRworX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKKyNlbmRpZgordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChzaXplX3R5cGUgX19wb3MpCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVnID0gYmVnaW4oKTsKKyAgICBpZiAoX19pdGVyYXRvcl9saXN0Xy5maXJzdCkKKyAgICB7CisgICAgICAgIGZvciAoaXRlcmF0b3IqIF9fcCA9IF9faXRlcmF0b3JfbGlzdF8uZmlyc3Q7IF9fcDspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqX19wIC0gX19iZWcgPiBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KF9fcG9zKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciogX19uID0gX19wOworICAgICAgICAgICAgICAgIF9fcCA9IF9fcC0+X19uZXh0OworICAgICAgICAgICAgICAgIF9fbi0+X19yZW1vdmVfb3duZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX3AgPSBfX3AtPl9fbmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoX19pdGVyYXRvcl9saXN0Xy5zZWNvbmQpCisgICAgeworICAgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yKiBfX3AgPSBfX2l0ZXJhdG9yX2xpc3RfLnNlY29uZDsgX19wOykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpfX3AgLSBfX2JlZyA+IHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19wb3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKiBfX24gPSBfX3A7CisgICAgICAgICAgICAgICAgX19wID0gX19wLT5fX25leHQ7CisgICAgICAgICAgICAgICAgX19uLT5fX3JlbW92ZV9vd25lcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fcCA9IF9fcC0+X19uZXh0OworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygpCit7CisgICAgX196ZXJvKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19yXyhfX2EpCit7CisgICAgX196ZXJvKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19pbml0KGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19zeiwgc2l6ZV90eXBlIF9fcmVzZXJ2ZSkKK3sKKyAgICBpZiAoX19yZXNlcnZlID4gbWF4X3NpemUoKSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBwb2ludGVyIF9fcDsKKyAgICBpZiAoX19yZXNlcnZlIDwgX19taW5fY2FwKQorICAgIHsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3N6KTsKKyAgICAgICAgX19wID0gX19nZXRfc2hvcnRfcG9pbnRlcigpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBfX3JlY29tbWVuZChfX3Jlc2VydmUpOworICAgICAgICBfX3AgPSBfX2FsbG9jKCkuYWxsb2NhdGUoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgICAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6Y29weShfX3AsIF9fcywgX19zeik7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19pbml0KGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19zeikKK3sKKyAgICBpZiAoX19zeiA+IG1heF9zaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgcG9pbnRlciBfX3A7CisgICAgaWYgKF9fc3ogPCBfX21pbl9jYXApCisgICAgeworICAgICAgICBfX3NldF9zaG9ydF9zaXplKF9fc3opOworICAgICAgICBfX3AgPSBfX2dldF9zaG9ydF9wb2ludGVyKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcCA9IF9fcmVjb21tZW5kKF9fc3opOworICAgICAgICBfX3AgPSBfX2FsbG9jKCkuYWxsb2NhdGUoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgICAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fc3opOworICAgIH0KKyAgICB0cmFpdHNfdHlwZTo6Y29weShfX3AsIF9fcywgX19zeik7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdF9wb2ludGVyIF9fcykKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIF9faW5pdChfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdF9wb2ludGVyIF9fcywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19hKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgX19pbml0KF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgX19pbml0KF9fcywgX19uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19yXyhfX2EpCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICBfX2luaXQoX19zLCBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIDogX19yXyhfX3N0ci5fX2FsbG9jKCkpCit7CisgICAgaWYgKCFfX3N0ci5fX2lzX2xvbmcoKSkKKyAgICAgICAgX19yXy5maXJzdCgpLl9fciA9IF9fc3RyLl9fcl8uZmlyc3QoKS5fX3I7CisgICAgZWxzZQorICAgICAgICBfX2luaXQoX19zdHIuX19nZXRfbG9uZ19wb2ludGVyKCksIF9fc3RyLl9fZ2V0X2xvbmdfc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19hKQoreworICAgIGlmICghX19zdHIuX19pc19sb25nKCkpCisgICAgICAgIF9fcl8uZmlyc3QoKS5fX3IgPSBfX3N0ci5fX3JfLmZpcnN0KCkuX19yOworICAgIGVsc2UKKyAgICAgICAgX19pbml0KF9fc3RyLl9fZ2V0X2xvbmdfcG9pbnRlcigpLCBfX3N0ci5fX2dldF9sb25nX3NpemUoKSk7Cit9CisKKyNpZmRlZiBfTElCQ1BQX01PVkUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgIDogX19yXyhfU1REOjptb3ZlKF9fc3RyLl9fcl8pKQoreworICAgIF9fc3RyLl9femVybygpOworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBfX3N0ci5fX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhiYXNpY19zdHJpbmcmJiBfX3N0ciwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19zdHIuX19yXy5maXJzdCgpLCBfX2EpCit7CisgICAgX19zdHIuX196ZXJvKCk7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIF9fc3RyLl9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisjZW5kaWYKK30KKworI2VuZGlmICAvLyBfTElCQ1BQX01PVkUKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2luaXQoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgcG9pbnRlciBfX3A7CisgICAgaWYgKF9fbiA8IF9fbWluX2NhcCkKKyAgICB7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19uKTsKKyAgICAgICAgX19wID0gX19nZXRfc2hvcnRfcG9pbnRlcigpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBfX3JlY29tbWVuZChfX24pOworICAgICAgICBfX3AgPSBfX2FsbG9jKCkuYWxsb2NhdGUoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgICAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKF9fbik7CisgICAgfQorICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wLCBfX24sIF9fYyk7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19uXSwgdmFsdWVfdHlwZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIHZhbHVlX3R5cGUgX19jKQoreworICAgIF9faW5pdChfX24sIF9fYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9fcl8oX19hKQoreworICAgIF9faW5pdChfX24sIF9fYyk7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19yXyhfX2EpCit7CisgICAgc2l6ZV90eXBlIF9fc3RyX3N6ID0gX19zdHIuc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3RyX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9faW5pdChfX3N0ci5kYXRhKCkgKyBfX3BvcywgX1NURDo6bWluKF9fbiwgX19zdHJfc3ogLSBfX3BvcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgIF9faXNfaW5wdXRfaXRlcmF0b3IgIDxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2luaXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIF9femVybygpOworI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgfQorICAgIGNhdGNoICguLi4pCisgICAgeworICAgICAgICBpZiAoX19pc19sb25nKCkpCisgICAgICAgICAgICBfX2FsbG9jKCkuZGVhbGxvY2F0ZShfX2dldF9sb25nX3BvaW50ZXIoKSwgX19nZXRfbG9uZ19jYXAoKSk7CisgICAgICAgIHRocm93OworICAgIH0KKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICBfX2lzX2ZvcndhcmRfaXRlcmF0b3I8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlLAorICAgIHZvaWQKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2luaXQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fc3ogPiBtYXhfc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHBvaW50ZXIgX19wOworICAgIGlmIChfX3N6IDwgX19taW5fY2FwKQorICAgIHsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3N6KTsKKyAgICAgICAgX19wID0gX19nZXRfc2hvcnRfcG9pbnRlcigpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBfX3JlY29tbWVuZChfX3N6KTsKKyAgICAgICAgX19wID0gX19hbGxvYygpLmFsbG9jYXRlKF9fY2FwKzEpOworICAgICAgICBfX3NldF9sb25nX3BvaW50ZXIoX19wKTsKKyAgICAgICAgX19zZXRfbG9uZ19jYXAoX19jYXArMSk7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3N6KTsKKyAgICB9CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19wKQorICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBfX2luaXQoX19maXJzdCwgX19sYXN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19yXyhfX2EpCit7CisgICAgX19pbml0KF9fZmlyc3QsIF9fbGFzdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwpCit7CisgICAgX19pbml0KF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9faWwsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX3JfKF9fYSkKK3sKKyAgICBfX2luaXQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6fmJhc2ljX3N0cmluZygpCit7CisgICAgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICBpZiAoX19pc19sb25nKCkpCisgICAgICAgIF9fYWxsb2MoKS5kZWFsbG9jYXRlKF9fZ2V0X2xvbmdfcG9pbnRlcigpLCBfX2dldF9sb25nX2NhcCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpfX2dyb3dfYnlfYW5kX3JlcGxhY2UKKyAgICAoc2l6ZV90eXBlIF9fb2xkX2NhcCwgc2l6ZV90eXBlIF9fZGVsdGFfY2FwLCBzaXplX3R5cGUgX19vbGRfc3osCisgICAgIHNpemVfdHlwZSBfX25fY29weSwgIHNpemVfdHlwZSBfX25fZGVsLCAgICAgc2l6ZV90eXBlIF9fbl9hZGQsIGNvbnN0X3BvaW50ZXIgX19wX25ld19zdHVmZikKK3sKKyAgICBzaXplX3R5cGUgX19tcyA9IG1heF9zaXplKCk7CisgICAgaWYgKF9fZGVsdGFfY2FwID4gX19tcyAtIF9fb2xkX2NhcCAtIDEpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfbGVuZ3RoX2Vycm9yKCk7CisgICAgcG9pbnRlciBfX29sZF9wID0gX19nZXRfcG9pbnRlcigpOworICAgIHNpemVfdHlwZSBfX2NhcCA9IF9fb2xkX2NhcCA8IF9fbXMgLyAyIC0gX19hbGlnbm1lbnQgPworICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlY29tbWVuZChfU1REOjptYXgoX19vbGRfY2FwICsgX19kZWx0YV9jYXAsIDIgKiBfX29sZF9jYXApKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbXMgLSAxOworICAgIHBvaW50ZXIgX19wID0gX19hbGxvYygpLmFsbG9jYXRlKF9fY2FwKzEpOworICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgaWYgKF9fbl9jb3B5ICE9IDApCisgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcCwgX19vbGRfcCwgX19uX2NvcHkpOworICAgIGlmIChfX25fYWRkICE9IDApCisgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcCArIF9fbl9jb3B5LCBfX3BfbmV3X3N0dWZmLCBfX25fYWRkKTsKKyAgICBzaXplX3R5cGUgX19zZWNfY3Bfc3ogPSBfX29sZF9zeiAtIF9fbl9kZWwgLSBfX25fY29weTsKKyAgICBpZiAoX19zZWNfY3Bfc3ogIT0gMCkKKyAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19wICsgX19uX2NvcHkgKyBfX25fYWRkLCBfX29sZF9wICsgX19uX2NvcHkgKyBfX25fZGVsLCBfX3NlY19jcF9zeik7CisgICAgaWYgKF9fb2xkX2NhcCsxICE9IF9fbWluX2NhcCkKKyAgICAgICAgX19hbGxvYygpLmRlYWxsb2NhdGUoX19vbGRfcCwgX19vbGRfY2FwKzEpOworICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX3ApOworICAgIF9fc2V0X2xvbmdfY2FwKF9fY2FwKzEpOworICAgIF9fb2xkX3N6ID0gX19uX2NvcHkgKyBfX25fYWRkICsgX19zZWNfY3Bfc3o7CisgICAgX19zZXRfbG9uZ19zaXplKF9fb2xkX3N6KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX29sZF9zel0sIHZhbHVlX3R5cGUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19ncm93X2J5KHNpemVfdHlwZSBfX29sZF9jYXAsIHNpemVfdHlwZSBfX2RlbHRhX2NhcCwgc2l6ZV90eXBlIF9fb2xkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uX2NvcHksICBzaXplX3R5cGUgX19uX2RlbCwgICAgIHNpemVfdHlwZSBfX25fYWRkKQoreworICAgIHNpemVfdHlwZSBfX21zID0gbWF4X3NpemUoKTsKKyAgICBpZiAoX19kZWx0YV9jYXAgPiBfX21zIC0gX19vbGRfY2FwIC0gMSkKKyAgICAgICAgdGhpcy0+X190aHJvd19sZW5ndGhfZXJyb3IoKTsKKyAgICBwb2ludGVyIF9fb2xkX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gX19vbGRfY2FwIDwgX19tcyAvIDIgLSBfX2FsaWdubWVudCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVjb21tZW5kKF9TVEQ6Om1heChfX29sZF9jYXAgKyBfX2RlbHRhX2NhcCwgMiAqIF9fb2xkX2NhcCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19tcyAtIDE7CisgICAgcG9pbnRlciBfX3AgPSBfX2FsbG9jKCkuYWxsb2NhdGUoX19jYXArMSk7CisgICAgX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyAgICBpZiAoX19uX2NvcHkgIT0gMCkKKyAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19wLCBfX29sZF9wLCBfX25fY29weSk7CisgICAgc2l6ZV90eXBlIF9fc2VjX2NwX3N6ID0gX19vbGRfc3ogLSBfX25fZGVsIC0gX19uX2NvcHk7CisgICAgaWYgKF9fc2VjX2NwX3N6ICE9IDApCisgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcCArIF9fbl9jb3B5ICsgX19uX2FkZCwgX19vbGRfcCArIF9fbl9jb3B5ICsgX19uX2RlbCwgX19zZWNfY3Bfc3opOworICAgIGlmIChfX29sZF9jYXArMSAhPSBfX21pbl9jYXApCisgICAgICAgIF9fYWxsb2MoKS5kZWFsbG9jYXRlKF9fb2xkX3AsIF9fb2xkX2NhcCsxKTsKKyAgICBfX3NldF9sb25nX3BvaW50ZXIoX19wKTsKKyAgICBfX3NldF9sb25nX2NhcChfX2NhcCsxKTsKK30KKworLy8gYXNzaWduCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojphc3NpZ24oY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24pCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCA+PSBfX24pCisgICAgeworICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wLCBfX3MsIF9fbik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fbl0sIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X3NpemUoX19uKTsKKyAgICAgICAgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBfX2dyb3dfYnlfYW5kX3JlcGxhY2UoX19jYXAsIF9fbiAtIF9fY2FwLCBfX3N6LCAwLCBfX3N6LCBfX24sIF9fcyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCA8IF9fbikKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBfX2dyb3dfYnkoX19jYXAsIF9fbiAtIF9fY2FwLCBfX3N6LCAwLCBfX3N6KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19uKTsKKyAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcCwgX19uLCBfX2MpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fbl0sIHZhbHVlX3R5cGUoKSk7CisgICAgX19zZXRfc2l6ZShfX24pOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om9wZXJhdG9yPSh2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBwb2ludGVyIF9fcDsKKyAgICBpZiAoX19pc19sb25nKCkpCisgICAgeworICAgICAgICBfX3AgPSBfX2dldF9sb25nX3BvaW50ZXIoKTsKKyAgICAgICAgX19zZXRfbG9uZ19zaXplKDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3AgPSBfX2dldF9zaG9ydF9wb2ludGVyKCk7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoMSk7CisgICAgfQorICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgX19jKTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCorK19fcCwgdmFsdWVfdHlwZSgpKTsKKyAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoMSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCis+Ojp0eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBjbGVhcigpOworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCis+Ojp0eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXNzaWduKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCit7CisgICAgc2l6ZV90eXBlIF9fbiA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBpZiAoX19jYXAgPCBfX24pCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX24gLSBfX2NhcCwgX19zeiwgMCwgX19zeik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fbik7CisgICAgcG9pbnRlciBfX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19wKQorICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIHZhbHVlX3R5cGUoKSk7CisgICAgX19zZXRfc2l6ZShfX24pOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojphc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKK3sKKyAgICByZXR1cm4gYXNzaWduKF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBfX3N0ci5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gYXNzaWduKF9fc3RyLmRhdGEoKSArIF9fcG9zLCBfU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFzc2lnbihjb25zdF9wb2ludGVyIF9fcykKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiBhc3NpZ24oX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCisvLyBhcHBlbmQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fbikKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fY2FwIC0gX19zeiA+PSBfX24pCisgICAgeworICAgICAgICBpZiAoX19uKQorICAgICAgICB7CisgICAgICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcCArIF9fc3osIF9fcywgX19uKTsKKyAgICAgICAgICAgIF9fc3ogKz0gX19uOworICAgICAgICAgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX19ncm93X2J5X2FuZF9yZXBsYWNlKF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fc3osIDAsIF9fbiwgX19zKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphcHBlbmQoc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBpZiAoX19jYXAgLSBfX3N6IDwgX19uKQorICAgICAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fc3osIDApOworICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3AgKyBfX3N6LCBfX24sIF9fYyk7CisgICAgICAgIF9fc3ogKz0gX19uOworICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX3N6XSwgdmFsdWVfdHlwZSgpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnB1c2hfYmFjayh2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3N6ID09IF9fY2FwKQorICAgICAgICBfX2dyb3dfYnkoX19jYXAsIDEsIF9fc3osIF9fc3osIDApOworICAgIHBvaW50ZXIgX19wID0gX19nZXRfcG9pbnRlcigpICsgX19zejsKKyAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIF9fYyk7CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqKytfX3AsIHZhbHVlX3R5cGUoKSk7CisgICAgX19zZXRfc2l6ZShfX3N6KzEpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+Cit0eXBlbmFtZSBlbmFibGVfaWYKKzwKKyAgICAgX19pc19pbnB1dF9pdGVyYXRvciAgPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUgJiYKKyAgICAhX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCis+Ojp0eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YXBwZW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0ZW1wbGF0ZTxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19mb3J3YXJkX2l0ZXJhdG9yPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZSwKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKKz46OnR5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphcHBlbmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIHNpemVfdHlwZSBfX24gPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9TVEQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBpZiAoX19jYXAgLSBfX3N6IDwgX19uKQorICAgICAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fc3osIDApOworICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKSArIF9fc3o7CisgICAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3AsICsrX19maXJzdCkKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgKl9fZmlyc3QpOworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X3NpemUoX19zeiArIF9fbik7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKK3sKKyAgICByZXR1cm4gYXBwZW5kKF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBfX3N0ci5zaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gYXBwZW5kKF9fc3RyLmRhdGEoKSArIF9fcG9zLCBfU1REOjptaW4oX19uLCBfX3N6IC0gX19wb3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmFwcGVuZChjb25zdF9wb2ludGVyIF9fcykKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiBhcHBlbmQoX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCisvLyBpbnNlcnQKKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCAtIF9fc3ogPj0gX19uKQorICAgIHsKKyAgICAgICAgaWYgKF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgcG9pbnRlciBfX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgICAgICAgICBzaXplX3R5cGUgX19uX21vdmUgPSBfX3N6IC0gX19wb3M7CisgICAgICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX19wICsgX19wb3MgPD0gX19zICYmIF9fcyA8IF9fcCArIF9fc3opCisgICAgICAgICAgICAgICAgICAgIF9fcyArPSBfX247CisgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MgKyBfX24sIF9fcCArIF9fcG9zLCBfX25fbW92ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcywgX19zLCBfX24pOworICAgICAgICAgICAgX19zeiArPSBfX247CisgICAgICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBfX2dyb3dfYnlfYW5kX3JlcGxhY2UoX19jYXAsIF9fc3ogKyBfX24gLSBfX2NhcCwgX19zeiwgX19wb3MsIDAsIF9fbiwgX19zKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIGlmIChfX24pCisgICAgeworICAgICAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgICAgICBwb2ludGVyIF9fcDsKKyAgICAgICAgaWYgKF9fY2FwIC0gX19zeiA+PSBfX24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgICAgIHNpemVfdHlwZSBfX25fbW92ZSA9IF9fc3ogLSBfX3BvczsKKyAgICAgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zICsgX19uLCBfX3AgKyBfX3BvcywgX19uX21vdmUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX3N6ICsgX19uIC0gX19jYXAsIF9fc3osIF9fcG9zLCAwLCBfX24pOworICAgICAgICAgICAgX19wID0gX19nZXRfbG9uZ19wb2ludGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3AgKyBfX3BvcywgX19uLCBfX2MpOworICAgICAgICBfX3N6ICs9IF9fbjsKKyAgICAgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgIF9faXNfaW5wdXRfaXRlcmF0b3IgIDxfSW5wdXRJdGVyYXRvcj46OnZhbHVlICYmCisgICAgIV9faXNfZm9yd2FyZF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQoreworICAgIHNpemVfdHlwZSBfX29sZF9zeiA9IHNpemUoKTsKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19pcCA9IF9fcG9zIC0gYmVnaW4oKTsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICBfU1REOjpyb3RhdGUoX19wICsgX19pcCwgX19wICsgX19vbGRfc3osIF9fcCArIHNpemUoKSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcCArIF9faXApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KK3R5cGVuYW1lIGVuYWJsZV9pZgorPAorICAgIF9faXNfZm9yd2FyZF9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWUsCisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCis+Ojp0eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQoreworICAgIHNpemVfdHlwZSBfX2lwID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX3BvcyAtIGJlZ2luKCkpOworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgc2l6ZV90eXBlIF9fbiA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX1NURDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgaWYgKF9fbikKKyAgICB7CisgICAgICAgIHBvaW50ZXIgX19wOworICAgICAgICBpZiAoX19jYXAgLSBfX3N6ID49IF9fbikKKyAgICAgICAgeworICAgICAgICAgICAgX19wID0gX19nZXRfcG9pbnRlcigpOworICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9tb3ZlID0gX19zeiAtIF9faXA7CisgICAgICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX2lwICsgX19uLCBfX3AgKyBfX2lwLCBfX25fbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfX2dyb3dfYnkoX19jYXAsIF9fc3ogKyBfX24gLSBfX2NhcCwgX19zeiwgX19pcCwgMCwgX19uKTsKKyAgICAgICAgICAgIF9fcCA9IF9fZ2V0X2xvbmdfcG9pbnRlcigpOworICAgICAgICB9CisgICAgICAgIF9fc3ogKz0gX19uOworICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcFtfX3N6XSwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgZm9yIChfX3AgKz0gX19pcDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19wLCArK19fZmlyc3QpCisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2ZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGJlZ2luKCkgKyBfX2lwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQoreworICAgIHJldHVybiBpbnNlcnQoX19wb3MxLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKK3sKKyAgICBzaXplX3R5cGUgX19zdHJfc3ogPSBfX3N0ci5zaXplKCk7CisgICAgaWYgKF9fcG9zMiA+IF9fc3RyX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBpbnNlcnQoX19wb3MxLCBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9TVEQ6Om1pbihfX24sIF9fc3RyX3N6IC0gX19wb3MyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdF9wb2ludGVyIF9fcykKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiBpbnNlcnQoX19wb3MsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjppdGVyYXRvcgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Omluc2VydChjb25zdF9pdGVyYXRvciBfX3BvcywgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgc2l6ZV90eXBlIF9faXAgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcG9zIC0gYmVnaW4oKSk7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgc2l6ZV90eXBlIF9fY2FwID0gY2FwYWNpdHkoKTsKKyAgICBwb2ludGVyIF9fcDsKKyAgICBpZiAoX19jYXAgPT0gX19zeikKKyAgICB7CisgICAgICAgIF9fZ3Jvd19ieShfX2NhcCwgMSwgX19zeiwgX19pcCwgMCwgMSk7CisgICAgICAgIF9fcCA9IF9fZ2V0X2xvbmdfcG9pbnRlcigpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgICAgIHNpemVfdHlwZSBfX25fbW92ZSA9IF9fc3ogLSBfX2lwOworICAgICAgICBpZiAoX19uX21vdmUgIT0gMCkKKyAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9faXAgKyAxLCBfX3AgKyBfX2lwLCBfX25fbW92ZSk7CisgICAgfQorICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19faXBdLCBfX2MpOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wWysrX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgX19zZXRfc2l6ZShfX3N6KTsKKyAgICByZXR1cm4gYmVnaW4oKSArIHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oX19pcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBkaWZmZXJlbmNlX3R5cGUgX19wID0gX19wb3MgLSBiZWdpbigpOworICAgIGluc2VydChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcCksIF9fbiwgX19jKTsKKyAgICByZXR1cm4gYmVnaW4oKSArIF9fcDsKK30KKworLy8gcmVwbGFjZQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fbjIpCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIF9fbjEgPSBfU1REOjptaW4oX19uMSwgX19zeiAtIF9fcG9zKTsKKyAgICBzaXplX3R5cGUgX19jYXAgPSBjYXBhY2l0eSgpOworICAgIGlmIChfX2NhcCAtIF9fc3ogKyBfX24xID49IF9fbjIpCisgICAgeworICAgICAgICBwb2ludGVyIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgaWYgKF9fbjEgIT0gX19uMikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9tb3ZlID0gX19zeiAtIF9fcG9zIC0gX19uMTsKKyAgICAgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX24xID4gX19uMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zLCBfX3MsIF9fbjIpOworICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcyArIF9fbjIsIF9fcCArIF9fcG9zICsgX19uMSwgX19uX21vdmUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZmluaXNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX19wICsgX19wb3MgPCBfX3MgJiYgX19zIDwgX19wICsgX19zeikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX3AgKyBfX3BvcyArIF9fbjEgPD0gX19zKQorICAgICAgICAgICAgICAgICAgICAgICAgX19zICs9IF9fbjIgLSBfX24xOworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIF9fcCArIF9fcG9zIDwgX19zIDwgX19wICsgX19wb3MgKyBfX24xCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zLCBfX3MsIF9fbjEpOworICAgICAgICAgICAgICAgICAgICAgICAgX19wb3MgKz0gX19uMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcyArPSBfX24yOworICAgICAgICAgICAgICAgICAgICAgICAgX19uMiAtPSBfX24xOworICAgICAgICAgICAgICAgICAgICAgICAgX19uMSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6Om1vdmUoX19wICsgX19wb3MgKyBfX24yLCBfX3AgKyBfX3BvcyArIF9fbjEsIF9fbl9tb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcywgX19zLCBfX24yKTsKK19fZmluaXNoOgorICAgICAgICBfX3N6ICs9IF9fbjIgLSBfX24xOworICAgICAgICBfX3NldF9zaXplKF9fc3opOworICAgICAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19zeik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9fZ3Jvd19ieV9hbmRfcmVwbGFjZShfX2NhcCwgX19zeiAtIF9fbjEgKyBfX24yIC0gX19jYXAsIF9fc3osIF9fcG9zLCBfX24xLCBfX24yLCBfX3MpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIHZhbHVlX3R5cGUgX19jKQoreworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3opCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgX19uMSA9IF9TVEQ6Om1pbihfX24xLCBfX3N6IC0gX19wb3MpOworICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgcG9pbnRlciBfX3A7CisgICAgaWYgKF9fY2FwIC0gX19zeiArIF9fbjEgPj0gX19uMikKKyAgICB7CisgICAgICAgIF9fcCA9IF9fZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgaWYgKF9fbjEgIT0gX19uMikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90eXBlIF9fbl9tb3ZlID0gX19zeiAtIF9fcG9zIC0gX19uMTsKKyAgICAgICAgICAgIGlmIChfX25fbW92ZSAhPSAwKQorICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjptb3ZlKF9fcCArIF9fcG9zICsgX19uMiwgX19wICsgX19wb3MgKyBfX24xLCBfX25fbW92ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX19ncm93X2J5KF9fY2FwLCBfX3N6IC0gX19uMSArIF9fbjIgLSBfX2NhcCwgX19zeiwgX19wb3MsIF9fbjEsIF9fbjIpOworICAgICAgICBfX3AgPSBfX2dldF9sb25nX3BvaW50ZXIoKTsKKyAgICB9CisgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3AgKyBfX3BvcywgX19uMiwgX19jKTsKKyAgICBfX3N6ICs9IF9fbjIgLSBfX24xOworICAgIF9fc2V0X3NpemUoX19zeik7CisgICAgX19pbnZhbGlkYXRlX2l0ZXJhdG9yc19wYXN0KF9fc3opOworICAgIHRyYWl0c190eXBlOjphc3NpZ24oX19wW19fc3pdLCB2YWx1ZV90eXBlKCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3RlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgordHlwZW5hbWUgZW5hYmxlX2lmCis8CisgICAgX19pc19pbnB1dF9pdGVyYXRvcjxfSW5wdXRJdGVyYXRvcj46OnZhbHVlLAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorPjo6dHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fajEsIF9JbnB1dEl0ZXJhdG9yIF9fajIpCit7CisgICAgZm9yICg7IHRydWU7ICsrX19pMSwgKytfX2oxKQorICAgIHsKKyAgICAgICAgaWYgKF9faTEgPT0gX19pMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9fajEgIT0gX19qMikKKyAgICAgICAgICAgICAgICBpbnNlcnQoX19pMSwgX19qMSwgX19qMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19qMSA9PSBfX2oyKQorICAgICAgICB7CisgICAgICAgICAgICBlcmFzZShfX2kxLCBfX2kyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9faTEsICpfX2oxKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCit7CisgICAgcmV0dXJuIHJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpCit7CisgICAgc2l6ZV90eXBlIF9fc3RyX3N6ID0gX19zdHIuc2l6ZSgpOworICAgIGlmIChfX3BvczIgPiBfX3N0cl9zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICByZXR1cm4gcmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyLmRhdGEoKSArIF9fcG9zMiwgX1NURDo6bWluKF9fbjIsIF9fc3RyX3N6IC0gX19wb3MyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0X3BvaW50ZXIgX19zKQoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgcmV0dXJuIHJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCit7CisgICAgcmV0dXJuIHJlcGxhY2Uoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2kxIC0gYmVnaW4oKSksIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMiAtIF9faTEpLAorICAgICAgICAgICAgICAgICAgIF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uKQoreworICAgIHJldHVybiByZXBsYWNlKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMSAtIGJlZ2luKCkpLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faTIgLSBfX2kxKSwgX19zLCBfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3RfcG9pbnRlciBfX3MpCit7CisgICAgcmV0dXJuIHJlcGxhY2Uoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2kxIC0gYmVnaW4oKSksIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMiAtIF9faTEpLCBfX3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgdmFsdWVfdHlwZSBfX2MpCit7CisgICAgcmV0dXJuIHJlcGxhY2Uoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2kxIC0gYmVnaW4oKSksIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pMiAtIF9faTEpLCBfX24sIF9fYyk7Cit9CisKKy8vIGVyYXNlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjplcmFzZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBpZiAoX19uKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgICAgIF9fbiA9IF9TVEQ6Om1pbihfX24sIF9fc3ogLSBfX3Bvcyk7CisgICAgICAgIHNpemVfdHlwZSBfX25fbW92ZSA9IF9fc3ogLSBfX3BvcyAtIF9fbjsKKyAgICAgICAgaWYgKF9fbl9tb3ZlICE9IDApCisgICAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfX3AgKyBfX3BvcywgX19wICsgX19wb3MgKyBfX24sIF9fbl9tb3ZlKTsKKyAgICAgICAgX19zeiAtPSBfX247CisgICAgICAgIF9fc2V0X3NpemUoX19zeik7CisgICAgICAgIF9faW52YWxpZGF0ZV9pdGVyYXRvcnNfcGFzdChfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3BbX19zel0sIHZhbHVlX3R5cGUoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6aXRlcmF0b3IKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjplcmFzZShjb25zdF9pdGVyYXRvciBfX3BvcykKK3sKKyAgICBpdGVyYXRvciBfX2IgPSBiZWdpbigpOworICAgIHNpemVfdHlwZSBfX3IgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcG9zIC0gX19iKTsKKyAgICBlcmFzZShfX3IsIDEpOworICAgIHJldHVybiBfX2IgKyBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Oml0ZXJhdG9yCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQoreworICAgIGl0ZXJhdG9yIF9fYiA9IGJlZ2luKCk7CisgICAgc2l6ZV90eXBlIF9fciA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19maXJzdCAtIF9fYik7CisgICAgZXJhc2UoX19yLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fbGFzdCAtIF9fZmlyc3QpKTsKKyAgICByZXR1cm4gX19iICsgX19yOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3ZvaWQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpwb3BfYmFjaygpCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydCghZW1wdHkoKSk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19zejsKKyAgICBpZiAoX19pc19sb25nKCkpCisgICAgeworICAgICAgICBfX3N6ID0gX19nZXRfbG9uZ19zaXplKCkgLSAxOworICAgICAgICBfX3NldF9sb25nX3NpemUoX19zeik7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKihfX2dldF9sb25nX3BvaW50ZXIoKSArIF9fc3opLCB2YWx1ZV90eXBlKCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfX3N6ID0gX19nZXRfc2hvcnRfc2l6ZSgpIC0gMTsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZShfX3N6KTsKKyAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqKF9fZ2V0X3Nob3J0X3BvaW50ZXIoKSArIF9fc3opLCB2YWx1ZV90eXBlKCkpOworICAgIH0KKyAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19zeik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNsZWFyKCkKK3sKKyAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIGlmIChfX2lzX2xvbmcoKSkKKyAgICB7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZ2V0X2xvbmdfcG9pbnRlcigpLCB2YWx1ZV90eXBlKCkpOworICAgICAgICBfX3NldF9sb25nX3NpemUoMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZ2V0X3Nob3J0X3BvaW50ZXIoKSwgdmFsdWVfdHlwZSgpKTsKKyAgICAgICAgX19zZXRfc2hvcnRfc2l6ZSgwKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Ol9fZXJhc2VfdG9fZW5kKHNpemVfdHlwZSBfX3BvcykKK3sKKyAgICBpZiAoX19pc19sb25nKCkpCisgICAgeworICAgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCooX19nZXRfbG9uZ19wb2ludGVyKCkgKyBfX3BvcyksIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3Bvcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKihfX2dldF9zaG9ydF9wb2ludGVyKCkgKyBfX3BvcyksIHZhbHVlX3R5cGUoKSk7CisgICAgICAgIF9fc2V0X3Nob3J0X3NpemUoX19wb3MpOworICAgIH0KKyAgICBfX2ludmFsaWRhdGVfaXRlcmF0b3JzX3Bhc3QoX19wb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlc2l6ZShzaXplX3R5cGUgX19uLCB2YWx1ZV90eXBlIF9fYykKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19uID4gX19zeikKKyAgICAgICAgYXBwZW5kKF9fbiAtIF9fc3osIF9fYyk7CisgICAgZWxzZQorICAgICAgICBfX2VyYXNlX3RvX2VuZChfX24pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjptYXhfc2l6ZSgpIGNvbnN0Cit7CisgICAgc2l6ZV90eXBlIF9fbSA9IF9fYWxsb2MoKS5tYXhfc2l6ZSgpOworI2lmIF9MSUJDUFBfQklHX0VORElBTgorICAgIHJldHVybiAoX19tIDw9IH5fX2xvbmdfbWFzayA/IF9fbSA6IF9fbS8yKSAtIDE7CisjZWxzZQorICAgIHJldHVybiBfX20gLSAxOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit2b2lkCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnKQoreworICAgIGlmIChfX3Jlc19hcmcgPiBtYXhfc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X2xlbmd0aF9lcnJvcigpOworICAgIHNpemVfdHlwZSBfX2NhcCA9IGNhcGFjaXR5KCk7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgX19yZXNfYXJnID0gX1NURDo6bWF4KF9fcmVzX2FyZywgX19zeik7CisgICAgX19yZXNfYXJnID0gX19yZWNvbW1lbmQoX19yZXNfYXJnKTsKKyAgICBpZiAoX19yZXNfYXJnICE9IF9fY2FwKQorICAgIHsKKyAgICAgICAgcG9pbnRlciBfX25ld19kYXRhLCBfX3A7CisgICAgICAgIGJvb2wgX193YXNfbG9uZywgX19ub3dfbG9uZzsKKyAgICAgICAgaWYgKF9fcmVzX2FyZyA9PSBfX21pbl9jYXAgLSAxKQorICAgICAgICB7CisgICAgICAgICAgICBfX3dhc19sb25nID0gdHJ1ZTsKKyAgICAgICAgICAgIF9fbm93X2xvbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIF9fbmV3X2RhdGEgPSBfX2dldF9zaG9ydF9wb2ludGVyKCk7CisgICAgICAgICAgICBfX3AgPSBfX2dldF9sb25nX3BvaW50ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3Jlc19hcmcgPiBfX2NhcCkKKyAgICAgICAgICAgICAgICBfX25ld19kYXRhID0gX19hbGxvYygpLmFsbG9jYXRlKF9fcmVzX2FyZysxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIF9fbmV3X2RhdGEgPSBfX2FsbG9jKCkuYWxsb2NhdGUoX19yZXNfYXJnKzEpOworICAgICAgICAgICAgI2lmbmRlZiBfTElCQ1BQX05PX0VYQ0VQVElPTlMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIGlmIChfX25ld19kYXRhID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgX19ub3dfbG9uZyA9IHRydWU7CisgICAgICAgICAgICBfX3dhc19sb25nID0gX19pc19sb25nKCk7CisgICAgICAgICAgICBfX3AgPSBfX2dldF9wb2ludGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19uZXdfZGF0YSwgX19wLCBzaXplKCkrMSk7CisgICAgICAgIGlmIChfX3dhc19sb25nKQorICAgICAgICAgICAgX19hbGxvYygpLmRlYWxsb2NhdGUoX19wLCBfX2NhcCsxKTsKKyAgICAgICAgaWYgKF9fbm93X2xvbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fc2V0X2xvbmdfY2FwKF9fcmVzX2FyZysxKTsKKyAgICAgICAgICAgIF9fc2V0X2xvbmdfc2l6ZShfX3N6KTsKKyAgICAgICAgICAgIF9fc2V0X2xvbmdfcG9pbnRlcihfX25ld19kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3NldF9zaG9ydF9zaXplKF9fc3opOworICAgICAgICBfX2ludmFsaWRhdGVfYWxsX2l0ZXJhdG9ycygpOworICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29uc3RfcmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisjaWZkZWYgX19MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19wb3MgPD0gc2l6ZSgpKTsKKyNlbmRpZgorICAgIHJldHVybiAqKGRhdGEoKSArIF9fcG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6b3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpCit7CisjaWZkZWYgX19MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19wb3MgPCBzaXplKCkpOworI2VuZGlmCisgICAgcmV0dXJuICooX19nZXRfcG9pbnRlcigpICsgX19wb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbnN0X3JlZmVyZW5jZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmF0KHNpemVfdHlwZSBfX24pIGNvbnN0Cit7CisgICAgaWYgKF9fbiA+PSBzaXplKCkpCisgICAgICAgIHRoaXMtPl9fdGhyb3dfb3V0X29mX3JhbmdlKCk7CisgICAgcmV0dXJuICgqdGhpcylbX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjphdChzaXplX3R5cGUgX19uKQoreworICAgIGlmIChfX24gPj0gc2l6ZSgpKQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiAoKnRoaXMpW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnJlZmVyZW5jZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZyb250KCkKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KCFlbXB0eSgpKTsKKyNlbmRpZgorICAgIHJldHVybiAqX19nZXRfcG9pbnRlcigpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb25zdF9yZWZlcmVuY2UKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpmcm9udCgpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydCghZW1wdHkoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gKmRhdGEoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFjaygpCit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydCghZW1wdHkoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gKihfX2dldF9wb2ludGVyKCkgKyBzaXplKCkgLSAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29uc3RfcmVmZXJlbmNlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6YmFjaygpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydCghZW1wdHkoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gKihkYXRhKCkgKyBzaXplKCkgLSAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb3B5KHBvaW50ZXIgX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zID4gX19zeikKKyAgICAgICAgdGhpcy0+X190aHJvd19vdXRfb2ZfcmFuZ2UoKTsKKyAgICBzaXplX3R5cGUgX19ybGVuID0gX1NURDo6bWluKF9fbiwgX19zeiAtIF9fcG9zKTsKKyAgICB0cmFpdHNfdHlwZTo6Y29weShfX3MsIGRhdGEoKSArIF9fcG9zLCBfX3JsZW4pOworICAgIHJldHVybiBfX3JsZW47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzdWJzdHIoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIHJldHVybiBiYXNpY19zdHJpbmcoKnRoaXMsIF9fcG9zLCBfX24sIF9fYWxsb2MoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordm9pZAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnN3YXAoYmFzaWNfc3RyaW5nJiBfX3N0cikKK3sKKyAgICBfX3JfLnN3YXAoX19zdHIuX19yXyk7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIF9faW52YWxpZGF0ZV9hbGxfaXRlcmF0b3JzKCk7CisgICAgX19zdHIuX19pbnZhbGlkYXRlX2FsbF9pdGVyYXRvcnMoKTsKKyNlbmRpZgorfQorCisvLyBmaW5kCisKK3RlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgorc3RydWN0IF9MSUJDUFBfSElEREVOIF9fdHJhaXRzX2VxCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUgY2hhcl90eXBlOworICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXJfdHlwZSYgX194LCBjb25zdCBjaGFyX3R5cGUmIF9feSkge3JldHVybiBfVHJhaXRzOjplcShfX3gsIF9feSk7fQorfTsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmQoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+IF9fc3ogfHwgX19zeiAtIF9fcG9zIDwgX19uKQorICAgICAgICByZXR1cm4gbnBvczsKKyAgICBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBfX3BvczsKKyAgICBjb25zdF9wb2ludGVyIF9fcCA9IGRhdGEoKTsKKyAgICBjb25zdF9wb2ludGVyIF9fciA9IF9TVEQ6OnNlYXJjaChfX3AgKyBfX3BvcywgX19wICsgX19zeiwgX19zLCBfX3MgKyBfX24sIF9fdHJhaXRzX2VxPHRyYWl0c190eXBlPigpKTsKKyAgICBpZiAoX19yID09IF9fcCArIF9fc3opCisgICAgICAgIHJldHVybiBucG9zOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fciAtIF9fcCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbmQoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICByZXR1cm4gZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZCh2YWx1ZV90eXBlIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAoreworICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA+PSBfX3N6KQorICAgICAgICByZXR1cm4gbnBvczsKKyAgICBjb25zdF9wb2ludGVyIF9fcCA9IGRhdGEoKTsKKyAgICBjb25zdF9wb2ludGVyIF9fciA9IHRyYWl0c190eXBlOjpmaW5kKF9fcCArIF9fcG9zLCBfX3N6IC0gX19wb3MsIF9fYyk7CisgICAgaWYgKF9fciA9PSAwKQorICAgICAgICByZXR1cm4gbnBvczsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX3IgLSBfX3ApOworfQorCisvLyByZmluZAorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIF9fcG9zID0gX1NURDo6bWluKF9fcG9zLCBfX3N6KTsKKyAgICBpZiAoX19uIDwgX19zeiAtIF9fcG9zKQorICAgICAgICBfX3BvcyArPSBfX247CisgICAgZWxzZQorICAgICAgICBfX3BvcyA9IF9fc3o7CisgICAgY29uc3RfcG9pbnRlciBfX3AgPSBkYXRhKCk7CisgICAgY29uc3RfcG9pbnRlciBfX3IgPSBfU1REOjpmaW5kX2VuZChfX3AsIF9fcCArIF9fcG9zLCBfX3MsIF9fcyArIF9fbiwgX190cmFpdHNfZXE8dHJhaXRzX3R5cGU+KCkpOworICAgIGlmIChfX24gPiAwICYmIF9fciA9PSBfX3AgKyBfX3BvcykKKyAgICAgICAgcmV0dXJuIG5wb3M7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19yIC0gX19wKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpyZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJmaW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiByZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6cmZpbmQodmFsdWVfdHlwZSBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19zeikKKyAgICB7CisgICAgICAgIGlmIChfX3BvcyA8IF9fc3opCisgICAgICAgICAgICArK19fcG9zOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3BvcyA9IF9fc3o7CisgICAgICAgIGNvbnN0X3BvaW50ZXIgX19wID0gZGF0YSgpOworICAgICAgICBmb3IgKGNvbnN0X3BvaW50ZXIgX19wcyA9IF9fcCArIF9fcG9zOyBfX3BzICE9IF9fcDspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoKi0tX19wcywgX19jKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX3BzIC0gX19wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnBvczsKK30KKworLy8gZmluZF9maXJzdF9vZgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9vZihjb25zdF9wb2ludGVyIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zID49IF9fc3ogfHwgX19uID09IDApCisgICAgICAgIHJldHVybiBucG9zOworICAgIGNvbnN0X3BvaW50ZXIgX19wID0gZGF0YSgpOworICAgIGNvbnN0X3BvaW50ZXIgX19yID0gX1NURDo6ZmluZF9maXJzdF9vZihfX3AgKyBfX3BvcywgX19wICsgX19zeiwgX19zLCBfX3MgKyBfX24sIF9fdHJhaXRzX2VxPHRyYWl0c190eXBlPigpKTsKKyAgICBpZiAoX19yID09IF9fcCArIF9fc3opCisgICAgICAgIHJldHVybiBucG9zOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fciAtIF9fcCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbmRfZmlyc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2ZpcnN0X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICByZXR1cm4gZmluZF9maXJzdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfZmlyc3Rfb2YodmFsdWVfdHlwZSBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgICByZXR1cm4gZmluZChfX2MsIF9fcG9zKTsKK30KKworLy8gZmluZF9sYXN0X29mCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfb2YoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIGlmIChfX24gIT0gMCkKKyAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgICAgICBpZiAoX19wb3MgPCBfX3N6KQorICAgICAgICAgICAgKytfX3BvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19wb3MgPSBfX3N6OworICAgICAgICBjb25zdF9wb2ludGVyIF9fcCA9IGRhdGEoKTsKKyAgICAgICAgZm9yIChjb25zdF9wb2ludGVyIF9fcHMgPSBfX3AgKyBfX3BvczsgX19wcyAhPSBfX3A7KQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdF9wb2ludGVyIF9fciA9IHRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCAqLS1fX3BzKTsKKyAgICAgICAgICAgIGlmIChfX3IpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19wcyAtIF9fcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5wb3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgICByZXR1cm4gZmluZF9sYXN0X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICByZXR1cm4gZmluZF9sYXN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X29mKHZhbHVlX3R5cGUgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJmaW5kKF9fYywgX19wb3MpOworfQorCisvLyBmaW5kX2ZpcnN0X25vdF9vZgorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Cit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHNpemVfdHlwZSBfX3N6ID0gc2l6ZSgpOworICAgIGlmIChfX3BvcyA8IF9fc3opCisgICAgeworICAgICAgICBjb25zdF9wb2ludGVyIF9fcCA9IGRhdGEoKTsKKyAgICAgICAgY29uc3RfcG9pbnRlciBfX3BlID0gX19wICsgX19zejsKKyAgICAgICAgZm9yIChjb25zdF9wb2ludGVyIF9fcHMgPSBfX3AgKyBfX3BvczsgX19wcyAhPSBfX3BlOyArK19fcHMpCisgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sICpfX3BzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcHMgLSBfX3ApOworICAgIH0KKyAgICByZXR1cm4gbnBvczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbmRfZmlyc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9maXJzdF9ub3Rfb2YoY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfZmlyc3Rfbm90X29mKHZhbHVlX3R5cGUgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zIDwgX19zeikKKyAgICB7CisgICAgICAgIGNvbnN0X3BvaW50ZXIgX19wID0gZGF0YSgpOworICAgICAgICBjb25zdF9wb2ludGVyIF9fcGUgPSBfX3AgKyBfX3N6OworICAgICAgICBmb3IgKGNvbnN0X3BvaW50ZXIgX19wcyA9IF9fcCArIF9fcG9zOyBfX3AgIT0gX19wZTsgKytfX3BzKQorICAgICAgICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXEoKl9fcHMsIF9fYykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19wcyAtIF9fcCk7CisgICAgfQorICAgIHJldHVybiBucG9zOworfQorCisvLyBmaW5kX2xhc3Rfbm90X29mCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPCBfX3N6KQorICAgICAgICArK19fcG9zOworICAgIGVsc2UKKyAgICAgICAgX19wb3MgPSBfX3N6OworICAgIGNvbnN0X3BvaW50ZXIgX19wID0gZGF0YSgpOworICAgIGZvciAoY29uc3RfcG9pbnRlciBfX3BzID0gX19wICsgX19wb3M7IF9fcHMgIT0gX19wOykKKyAgICAgICAgaWYgKHRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCAqLS1fX3BzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19wcyAtIF9fcCk7CisgICAgcmV0dXJuIG5wb3M7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6ZmluZF9sYXN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3R5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpmaW5kX2xhc3Rfbm90X29mKGNvbnN0X3BvaW50ZXIgX19zLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0Cit7CisjaWZkZWYgX0xJQkNQUF9ERUJVRworICAgIGFzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICByZXR1cm4gZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQordHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmZpbmRfbGFzdF9ub3Rfb2YodmFsdWVfdHlwZSBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKK3sKKyAgICBzaXplX3R5cGUgX19zeiA9IHNpemUoKTsKKyAgICBpZiAoX19wb3MgPCBfX3N6KQorICAgICAgICArK19fcG9zOworICAgIGVsc2UKKyAgICAgICAgX19wb3MgPSBfX3N6OworICAgIGNvbnN0X3BvaW50ZXIgX19wID0gZGF0YSgpOworICAgIGZvciAoY29uc3RfcG9pbnRlciBfX3BzID0gX19wICsgX19wb3M7IF9fcHMgIT0gX19wOykKKyAgICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXEoKi0tX19wcywgX19jKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fcHMgLSBfX3ApOworICAgIHJldHVybiBucG9zOworfQorCisvLyBjb21wYXJlCisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQoraW50CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29tcGFyZShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAoreworICAgIHJldHVybiBjb21wYXJlKDAsIG5wb3MsIF9fc3RyLmRhdGEoKSwgX19zdHIuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitpbnQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAoreworICAgIHJldHVybiBjb21wYXJlKF9fcG9zMSwgX19uMSwgX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW50CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdAoreworICAgIHNpemVfdHlwZSBfX3N6ID0gX19zdHIuc2l6ZSgpOworICAgIGlmIChfX3BvczIgPiBfX3N6KQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHJldHVybiBjb21wYXJlKF9fcG9zMSwgX19uMSwgX19zdHIuZGF0YSgpICsgX19wb3MyLCBfU1REOjptaW4oX19uMiwgX19zeiAtIF9fcG9zMikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgoraW50CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6Y29tcGFyZShjb25zdF9wb2ludGVyIF9fcykgY29uc3QKK3sKKyNpZmRlZiBfTElCQ1BQX0RFQlVHCisgICAgYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgIHJldHVybiBjb21wYXJlKDAsIG5wb3MsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2ludAorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0X3BvaW50ZXIgX19zKSBjb25zdAoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgcmV0dXJuIGNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitpbnQKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+Ojpjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlciBfX3MsIHNpemVfdHlwZSBfX24yKSBjb25zdAoreworI2lmZGVmIF9MSUJDUFBfREVCVUcKKyAgICBhc3NlcnQoX19zICE9IDApOworI2VuZGlmCisgICAgc2l6ZV90eXBlIF9fc3ogPSBzaXplKCk7CisgICAgaWYgKF9fcG9zMSA+IF9fc3ogfHwgX19uMiA9PSBucG9zKQorICAgICAgICB0aGlzLT5fX3Rocm93X291dF9vZl9yYW5nZSgpOworICAgIHNpemVfdHlwZSBfX3JsZW4gPSBfU1REOjptaW4oX19uMSwgX19zeiAtIF9fcG9zMSk7CisgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKGRhdGEoKSArIF9fcG9zMSwgX19zLCBfU1REOjptaW4oX19ybGVuLCBfX24yKSk7CisgICAgaWYgKF9fciA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKF9fcmxlbiA8IF9fbjIpCisgICAgICAgICAgICBfX3IgPSAtMTsKKyAgICAgICAgZWxzZSBpZiAoX19ybGVuID4gX19uMikKKyAgICAgICAgICAgIF9fciA9IDE7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKKy8vIF9faW52YXJpYW50cworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Citib29sCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6X19pbnZhcmlhbnRzKCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZSgpID4gY2FwYWNpdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChjYXBhY2l0eSgpIDwgX19taW5fY2FwIC0gMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChkYXRhKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChkYXRhKClbc2l6ZSgpXSAhPSB2YWx1ZV90eXBlKDApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIG9wZXJhdG9yPT0KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fbGhzLnNpemUoKSA9PSBfX3Jocy5zaXplKCkgJiYgX1RyYWl0czo6Y29tcGFyZShfX2xocy5kYXRhKCksIF9fcmhzLmRhdGEoKSwgX19saHMuc2l6ZSgpKSA9PSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBfQ2hhclQqIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBjaGFyKiBfX2xocywgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIHN0cmNtcChfX2xocywgX19yaHMuZGF0YSgpKSA9PSAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3Qgd2NoYXJfdCogX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiB3Y3NjbXAoX19saHMsIF9fcmhzLmRhdGEoKSkgPT0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3QgX0NoYXJUKiBfX3JocykKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgX0FsbG9jYXRvcj4mIF9fbGhzLCBjb25zdCBjaGFyKiBfX3JocykKK3sKKyAgICByZXR1cm4gc3RyY21wKF9fbGhzLmRhdGEoKSwgX19yaHMpID09IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3Qgd2NoYXJfdCogX19yaHMpCit7CisgICAgcmV0dXJuIHdjc2NtcChfX2xocy5kYXRhKCksIF9fcmhzKSA9PSAwOworfQorCisvLyBvcGVyYXRvciE9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4gCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBfQ2hhclQqIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsIGNvbnN0IF9DaGFyVCogX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOworfQorCisvLyBvcGVyYXRvcjwKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fbGhzLmNtcGFyZShfX3JocykgPCAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiBzdHJjbXAoX19saHMuZGF0YSgpLCBfX3Jocy5kYXRhKCkpIDwgMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjwgKGNvbnN0IGJhc2ljX3N0cmluZzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIF9BbGxvY2F0b3I+JiBfX3JocykKK3sKKyAgICByZXR1cm4gd2NzY21wKF9fbGhzLmRhdGEoKSwgX19yaHMuZGF0YSgpKSA8IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjwgKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3QgX0NoYXJUKiBfX3JocykKK3sKKyAgICByZXR1cm4gX19saHMuY29tcGFyZShfX3Jocyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJpbmc8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3QgY2hhciogX19yaHMpCit7CisgICAgcmV0dXJuIHN0cmNtcChfX2xocy5kYXRhKCksIF9fcmhzKSA8IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I8IChjb25zdCBiYXNpY19zdHJpbmc8d2NoYXJfdCwgY2hhcl90cmFpdHM8d2NoYXJfdD4sIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3Qgd2NoYXJfdCogX19yaHMpCit7CisgICAgcmV0dXJuIHdjc2NtcChfX2xocy5kYXRhKCksIF9fcmhzKSA8IDA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjwgKGNvbnN0IF9DaGFyVCogX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykKK3sKKyAgICByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPiAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3QgY2hhciogX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiwgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiBzdHJjbXAoX19saHMsIF9fcmhzLmRhdGEoKSkgPCAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPCAoY29uc3Qgd2NoYXJfdCogX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzx3Y2hhcl90LCBjaGFyX3RyYWl0czx3Y2hhcl90PiwgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiB3Y3NjbXAoX19saHMsIF9fcmhzLmRhdGEoKSkgPCAwOworfQorCisvLyBvcGVyYXRvcj4KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9fcmhzIDwgX19saHM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcj4gKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3QgX0NoYXJUKiBfX3JocykKK3sKKyAgICByZXR1cm4gX19yaHMgPCBfX2xoczsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPiAoY29uc3QgX0NoYXJUKiBfX2xocywgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiBfX3JocyA8IF9fbGhzOworfQorCisvLyBvcGVyYXRvcjw9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywKKyAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIHJldHVybiAhKF9fcmhzIDwgX19saHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsIGNvbnN0IF9DaGFyVCogX19yaHMpCit7CisgICAgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykKK3sKKyAgICByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsKK30KKworLy8gb3BlcmF0b3I+PQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3JocykKK3sKKyAgICByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLCBjb25zdCBfQ2hhclQqIF9fcmhzKQoreworICAgIHJldHVybiAhKF9fbGhzIDwgX19yaHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I+PShjb25zdCBfQ2hhclQqIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7Cit9CisKKy8vIG9wZXJhdG9yICsKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19saHMsCisgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9fcihfX2xocy5nZXRfYWxsb2NhdG9yKCkpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19saHNfc3ogPSBfX2xocy5zaXplKCk7CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX3Joc19zeiA9IF9fcmhzLnNpemUoKTsKKyAgICBfX3IuX19pbml0KF9fbGhzLmRhdGEoKSwgX19saHNfc3osIF9fbGhzX3N6ICsgX19yaHNfc3opOworICAgIF9fci5hcHBlbmQoX19yaHMuZGF0YSgpLCBfX3Joc19zeik7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzICwgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKK3sKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiBfX3IoX19yaHMuZ2V0X2FsbG9jYXRvcigpKTsKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fbGhzX3N6ID0gX1RyYWl0czo6bGVuZ3RoKF9fbGhzKTsKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fcmhzX3N6ID0gX19yaHMuc2l6ZSgpOworICAgIF9fci5fX2luaXQoX19saHMsIF9fbGhzX3N6LCBfX2xoc19zeiArIF9fcmhzX3N6KTsKKyAgICBfX3IuYXBwZW5kKF9fcmhzLmRhdGEoKSwgX19yaHNfc3opOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoX0NoYXJUIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQoreworICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9fcihfX3Jocy5nZXRfYWxsb2NhdG9yKCkpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19yaHNfc3ogPSBfX3Jocy5zaXplKCk7CisgICAgX19yLl9faW5pdCgmX19saHMsIDEsIDEgKyBfX3Joc19zeik7CisgICAgX19yLmFwcGVuZChfX3Jocy5kYXRhKCksIF9fcmhzX3N6KTsKKyAgICByZXR1cm4gX19yOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywgY29uc3QgX0NoYXJUKiBfX3JocykKK3sKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiBfX3IoX19saHMuZ2V0X2FsbG9jYXRvcigpKTsKKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlIF9fbGhzX3N6ID0gX19saHMuc2l6ZSgpOworICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+OjpzaXplX3R5cGUgX19yaHNfc3ogPSBfVHJhaXRzOjpsZW5ndGgoX19yaHMpOworICAgIF9fci5fX2luaXQoX19saHMuZGF0YSgpLCBfX2xoc19zeiwgX19saHNfc3ogKyBfX3Joc19zeik7CisgICAgX19yLmFwcGVuZChfX3JocywgX19yaHNfc3opOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLCBfQ2hhclQgX19yaHMpCit7CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gX19yKF9fbGhzLmdldF9hbGxvY2F0b3IoKSk7CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OnNpemVfdHlwZSBfX2xoc19zeiA9IF9fbGhzLnNpemUoKTsKKyAgICBfX3IuX19pbml0KF9fbGhzLmRhdGEoKSwgX19saHNfc3osIF9fbGhzX3N6ICsgMSk7CisgICAgX19yLnB1c2hfYmFjayhfX3Jocyk7CisgICAgcmV0dXJuIF9fcjsKK30KKworI2lmZGVmIF9MSUJDUFBfTU9WRQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgcmV0dXJuIF9TVEQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPgorb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX2xocywgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mJiBfX3JocykKK3sKKyAgICByZXR1cm4gX1NURDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mJiBfX2xocywgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mJiBfX3JocykKK3sKKyAgICByZXR1cm4gX1NURDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+CitvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocyAsIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYmIF9fcmhzKQoreworICAgIHJldHVybiBfU1REOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhfQ2hhclQgX19saHMsIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYmIF9fcmhzKQoreworICAgIF9fcmhzLmluc2VydChfX3Jocy5iZWdpbigpLCBfX2xocyk7CisgICAgcmV0dXJuIF9TVEQ6Om1vdmUoX19yaHMpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBjb25zdCBfQ2hhclQqIF9fcmhzKQoreworICAgIHJldHVybiBfU1REOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4KK29wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYmIF9fbGhzLCBfQ2hhclQgX19yaHMpCit7CisgICAgX19saHMucHVzaF9iYWNrKF9fcmhzKTsKKyAgICByZXR1cm4gX1NURDo6bW92ZShfX2xocyk7Cit9CisKKyNlbmRpZiAgLy8gX0xJQkNQUF9NT1ZFCisKKy8vIHN3YXAKKwordGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2NhdG9yPgorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK3ZvaWQKK3N3YXAoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fbGhzLCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19yaHMpCit7CisgICAgX19saHMuc3dhcChfX3Jocyk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3N0cnVjdCBfX2lzX3plcm9fZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+ID4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3plcm9fZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9BbGxvY2F0b3I+Ojp2YWx1ZT4ge307CisKKyNpZm5kZWYgX0xJQkNQUF9IQVNfTk9fVU5JQ09ERV9DSEFSUworCit0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyMTZfdD4gdTE2c3RyaW5nOwordHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjMyX3Q+IHUzMnN0cmluZzsKKworI2VuZGlmCisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICBjb25zdCB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPjo6c2l6ZV90eXBlCisgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj46Om5wb3M7CisKK3RlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jYXRvcj4KK3N0cnVjdCBoYXNoPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+ID4KKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiwgc2l6ZV90PgoreworICAgIHNpemVfdAorICAgICAgICBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+JiBfX3ZhbCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+CitzaXplX3QKK2hhc2g8YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gPjo6b3BlcmF0b3IoKSgKKyAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4mIF9fdmFsKSBjb25zdAoreworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4gUzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFM6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICBzaXplX3QgX19yID0gMDsKKyAgICBjb25zdCBzaXplX3QgX19zciA9IF9fQ0hBUl9CSVRfXyAqIHNpemVvZihzaXplX3QpIC0gODsKKyAgICBjb25zdCBzaXplX3QgX19tID0gc2l6ZV90KDB4RikgPDwgKF9fc3IgKyA0KTsKKyAgICBjb25zdF9wb2ludGVyIF9fcCA9IF9fdmFsLmRhdGEoKTsKKyAgICBjb25zdF9wb2ludGVyIF9fZSA9IF9fcCArIF9fdmFsLnNpemUoKTsKKyAgICBmb3IgKDsgX19wICE9IF9fZTsgKytfX3ApCisgICAgeworICAgICAgICBfX3IgPSAoX19yIDw8IDQpICsgKl9fcDsKKyAgICAgICAgc2l6ZV90IF9fZyA9IF9fciAmIF9fbTsKKyAgICAgICAgX19yIF49IF9fZyB8IChfX2cgPj4gX19zcik7CisgICAgfQorICAgIHJldHVybiBfX3I7Cit9CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmc8Y2hhcj47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nPHdjaGFyX3Q+OworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPGNoYXIgY29uc3QqPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjo6CisgICAgX19pbml0PGNoYXIgY29uc3QqPihjaGFyIGNvbnN0KiwgY2hhciBjb25zdCopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPHdjaGFyX3QgY29uc3QqPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjo6CisgICAgX19pbml0PHdjaGFyX3QgY29uc3QqPih3Y2hhcl90IGNvbnN0Kiwgd2NoYXJfdCBjb25zdCopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPGNoYXIqPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPiY+Ojp0eXBlCisgICAgYmFzaWNfc3RyaW5nPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbGxvY2F0b3I8Y2hhcj4gPjo6CisgICAgYXBwZW5kPGNoYXIqPihjaGFyKiwgY2hhciopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPHdjaGFyX3QqPjo6dmFsdWUsCisgICAgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPiY+Ojp0eXBlCisgICAgYmFzaWNfc3RyaW5nPHdjaGFyX3QsIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LCBhbGxvY2F0b3I8d2NoYXJfdD4gPjo6CisgICAgYXBwZW5kPHdjaGFyX3QqPih3Y2hhcl90Kiwgd2NoYXJfdCopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19mb3J3YXJkX2l0ZXJhdG9yPGNoYXIgY29uc3QqPjo6dmFsdWUsCisgICAgc3RyaW5nOjppdGVyYXRvcj46OnR5cGUKKyAgICBzdHJpbmc6OgorICAgIGluc2VydDxjaGFyIGNvbnN0Kj4oc3RyaW5nOjpjb25zdF9pdGVyYXRvciwgY2hhciBjb25zdCosIGNoYXIgY29uc3QqKTsKKworZXh0ZXJuIHRlbXBsYXRlCisgICAgZW5hYmxlX2lmPF9faXNfZm9yd2FyZF9pdGVyYXRvcjx3Y2hhcl90IGNvbnN0Kj46OnZhbHVlLAorICAgIHdzdHJpbmc6Oml0ZXJhdG9yPjo6dHlwZQorICAgIHdzdHJpbmc6OgorICAgIGluc2VydDx3Y2hhcl90IGNvbnN0Kj4od3N0cmluZzo6Y29uc3RfaXRlcmF0b3IsIHdjaGFyX3QgY29uc3QqLCB3Y2hhcl90IGNvbnN0Kik7CisKK2V4dGVybiB0ZW1wbGF0ZQorICAgIGVuYWJsZV9pZjxfX2lzX2lucHV0X2l0ZXJhdG9yPGNoYXIgY29uc3QqPjo6dmFsdWUsIHN0cmluZyY+Ojp0eXBlCisgICAgc3RyaW5nOjoKKyAgICByZXBsYWNlPGNoYXIgY29uc3QqPihzdHJpbmc6Oml0ZXJhdG9yLCBzdHJpbmc6Oml0ZXJhdG9yLCBjaGFyIGNvbnN0KiwgY2hhciBjb25zdCopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBlbmFibGVfaWY8X19pc19pbnB1dF9pdGVyYXRvcjx3Y2hhcl90IGNvbnN0Kj46OnZhbHVlLCB3c3RyaW5nJj46OnR5cGUKKyAgICB3c3RyaW5nOjoKKyAgICByZXBsYWNlPHdjaGFyX3QgY29uc3QqPih3c3RyaW5nOjppdGVyYXRvciwgd3N0cmluZzo6aXRlcmF0b3IsIHdjaGFyX3QgY29uc3QqLCB3Y2hhcl90IGNvbnN0Kik7CisKK2V4dGVybiB0ZW1wbGF0ZQorICAgIGVuYWJsZV9pZjxfX2lzX2ZvcndhcmRfaXRlcmF0b3I8d2NoYXJfdCo+Ojp2YWx1ZSwgd3N0cmluZyY+Ojp0eXBlCisgICAgd3N0cmluZzo6YXNzaWduPHdjaGFyX3QqPih3Y2hhcl90Kiwgd2NoYXJfdCopOworCitleHRlcm4gdGVtcGxhdGUKKyAgICBzdHJpbmcKKyAgICBvcGVyYXRvcis8Y2hhciwgY2hhcl90cmFpdHM8Y2hhcj4sIGFsbG9jYXRvcjxjaGFyPiA+KGNoYXIgY29uc3QqLCBzdHJpbmcgY29uc3QmKTsKKworX0xJQkNQUF9FTkRfTkFNRVNQQUNFX1NURAorCisjZW5kaWYgIC8vIF9MSUJDUFBfU1RSSU5HCisKKy8vIGhoIDA2MDUyNSBDcmVhdGVkCg==