Ly8gLSotIEMrKyAtKi0KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN5c3RlbV9lcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBfTElCQ1BQX1NZU1RFTV9FUlJPUgojZGVmaW5lIF9MSUJDUFBfU1lTVEVNX0VSUk9SCgovKgogICAgc3lzdGVtX2Vycm9yIHN5bm9wc2lzCgpuYW1lc3BhY2Ugc3RkCnsKCmNsYXNzIGVycm9yX2NhdGVnb3J5CnsKcHVibGljOgogICAgdmlydHVhbCB+ZXJyb3JfY2F0ZWdvcnkoKTsKCiAgICBlcnJvcl9jYXRlZ29yeShjb25zdCBlcnJvcl9jYXRlZ29yeSYpID0gZGVsZXRlOwogICAgZXJyb3JfY2F0ZWdvcnkmIG9wZXJhdG9yPShjb25zdCBlcnJvcl9jYXRlZ29yeSYpID0gZGVsZXRlOwoKICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgZXJyb3JfY29uZGl0aW9uIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKGludCBldikgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChpbnQgY29kZSwgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBjb25kaXRpb24pIGNvbnN0OwogICAgdmlydHVhbCBib29sIGVxdWl2YWxlbnQoY29uc3QgZXJyb3JfY29kZSYgY29kZSwgaW50IGNvbmRpdGlvbikgY29uc3Q7CiAgICB2aXJ0dWFsIHN0cmluZyBtZXNzYWdlKGludCBldikgY29uc3QgPSAwOwoKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jYXRlZ29yeSYgcmhzKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jYXRlZ29yeSYgcmhzKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NhdGVnb3J5JiByaHMpIGNvbnN0Owp9OwoKY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGdlbmVyaWNfY2F0ZWdvcnkoKTsKY29uc3QgZXJyb3JfY2F0ZWdvcnkmIHN5c3RlbV9jYXRlZ29yeSgpOwoKdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW0KICAgIDogcHVibGljIGZhbHNlX3R5cGUge307Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtCiAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwoKY2xhc3MgZXJyb3JfY29kZQp7CnB1YmxpYzoKICAgIC8vIGNvbnN0cnVjdG9yczoKICAgIGVycm9yX2NvZGUoKTsKICAgIGVycm9yX2NvZGUoaW50IHZhbCwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdCk7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgRXJyb3JDb2RlRW51bT4KICAgICAgICBlcnJvcl9jb2RlKEVycm9yQ29kZUVudW0gZSk7CgogICAgLy8gbW9kaWZpZXJzOgogICAgdm9pZCBhc3NpZ24oaW50IHZhbCwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdCk7CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgRXJyb3JDb2RlRW51bT4KICAgICAgICBlcnJvcl9jb2RlJiBvcGVyYXRvcj0oRXJyb3JDb2RlRW51bSBlKTsKICAgIHZvaWQgY2xlYXIoKTsKCiAgICAvLyBvYnNlcnZlcnM6CiAgICBpbnQgdmFsdWUoKSBjb25zdDsKICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjYXRlZ29yeSgpIGNvbnN0OwogICAgZXJyb3JfY29uZGl0aW9uIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKCkgY29uc3Q7CiAgICBzdHJpbmcgbWVzc2FnZSgpIGNvbnN0OwogICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0Owp9OwoKLy8gbm9uLW1lbWJlciBmdW5jdGlvbnM6CmJvb2wgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NvZGUmIGxocywgY29uc3QgZXJyb3JfY29kZSYgcmhzKTsKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4mCiAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiYgb3MsIGNvbnN0IGVycm9yX2NvZGUmIGVjKTsKCmNsYXNzIGVycm9yX2NvbmRpdGlvbgp7CnB1YmxpYzoKICAgIC8vIGNvbnN0cnVjdG9yczoKICAgIGVycm9yX2NvbmRpdGlvbigpOwogICAgZXJyb3JfY29uZGl0aW9uKGludCB2YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjYXQpOwogICAgdGVtcGxhdGUgPGNsYXNzIEVycm9yQ29uZGl0aW9uRW51bT4KICAgICAgICBlcnJvcl9jb25kaXRpb24oRXJyb3JDb25kaXRpb25FbnVtIGUpOwoKICAgIC8vIG1vZGlmaWVyczoKICAgIHZvaWQgYXNzaWduKGludCB2YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjYXQpOwogICAgdGVtcGxhdGUgPGNsYXNzIEVycm9yQ29uZGl0aW9uRW51bT4KICAgICAgICBlcnJvcl9jb25kaXRpb24mIG9wZXJhdG9yPShFcnJvckNvbmRpdGlvbkVudW0gZSk7CiAgICB2b2lkIGNsZWFyKCk7CgogICAgLy8gb2JzZXJ2ZXJzOgogICAgaW50IHZhbHVlKCkgY29uc3Q7CiAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSYgY2F0ZWdvcnkoKSBjb25zdDsKICAgIHN0cmluZyBtZXNzYWdlKCkgY29uc3Q7CiAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Q7Cn07Cgpib29sIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jb25kaXRpb24mIGxocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiByaHMpOwoKY2xhc3Mgc3lzdGVtX2Vycm9yCiAgICA6IHB1YmxpYyBydW50aW1lX2Vycm9yCnsKcHVibGljOgogICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgZWMsIGNvbnN0IHN0cmluZyYgd2hhdF9hcmcpOwogICAgc3lzdGVtX2Vycm9yKGVycm9yX2NvZGUgZWMsIGNvbnN0IGNoYXIqIHdoYXRfYXJnKTsKICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIGVjKTsKICAgIHN5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBlY2F0LCBjb25zdCBzdHJpbmcmIHdoYXRfYXJnKTsKICAgIHN5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBlY2F0LCBjb25zdCBjaGFyKiB3aGF0X2FyZyk7CiAgICBzeXN0ZW1fZXJyb3IoaW50IGV2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgZWNhdCk7CgogICAgY29uc3QgZXJyb3JfY29kZSYgY29kZSgpIGNvbnN0IHRocm93KCk7CiAgICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKfTsKCmVudW0gY2xhc3MgZXJyYwp7CiAgICBhZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkLCAgICAgICAvLyBFQUZOT1NVUFBPUlQKICAgIGFkZHJlc3NfaW5fdXNlLCAgICAgICAgICAgICAgICAgICAgIC8vIEVBRERSSU5VU0UKICAgIGFkZHJlc3Nfbm90X2F2YWlsYWJsZSwgICAgICAgICAgICAgIC8vIEVBRERSTk9UQVZBSUwKICAgIGFscmVhZHlfY29ubmVjdGVkLCAgICAgICAgICAgICAgICAgIC8vIEVJU0NPTk4KICAgIGFyZ3VtZW50X2xpc3RfdG9vX2xvbmcsICAgICAgICAgICAgIC8vIEUyQklHCiAgICBhcmd1bWVudF9vdXRfb2ZfZG9tYWluLCAgICAgICAgICAgICAvLyBFRE9NCiAgICBiYWRfYWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBFRkFVTFQKICAgIGJhZF9maWxlX2Rlc2NyaXB0b3IsICAgICAgICAgICAgICAgIC8vIEVCQURGCiAgICBiYWRfbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBFQkFETVNHCiAgICBicm9rZW5fcGlwZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUElQRQogICAgY29ubmVjdGlvbl9hYm9ydGVkLCAgICAgICAgICAgICAgICAgLy8gRUNPTk5BQk9SVEVECiAgICBjb25uZWN0aW9uX2FscmVhZHlfaW5fcHJvZ3Jlc3MsICAgICAvLyBFQUxSRUFEWQogICAgY29ubmVjdGlvbl9yZWZ1c2VkLCAgICAgICAgICAgICAgICAgLy8gRUNPTk5SRUZVU0VECiAgICBjb25uZWN0aW9uX3Jlc2V0LCAgICAgICAgICAgICAgICAgICAvLyBFQ09OTlJFU0VUCiAgICBjcm9zc19kZXZpY2VfbGluaywgICAgICAgICAgICAgICAgICAvLyBFWERFVgogICAgZGVzdGluYXRpb25fYWRkcmVzc19yZXF1aXJlZCwgICAgICAgLy8gRURFU1RBRERSUkVRCiAgICBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSwgICAgICAgICAgICAvLyBFQlVTWQogICAgZGlyZWN0b3J5X25vdF9lbXB0eSwgICAgICAgICAgICAgICAgLy8gRU5PVEVNUFRZCiAgICBleGVjdXRhYmxlX2Zvcm1hdF9lcnJvciwgICAgICAgICAgICAvLyBFTk9FWEVDCiAgICBmaWxlX2V4aXN0cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBFRVhJU1QKICAgIGZpbGVfdG9vX2xhcmdlLCAgICAgICAgICAgICAgICAgICAgIC8vIEVGQklHCiAgICBmaWxlbmFtZV90b29fbG9uZywgICAgICAgICAgICAgICAgICAvLyBFTkFNRVRPT0xPTkcKICAgIGZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgIC8vIEVOT1NZUwogICAgaG9zdF91bnJlYWNoYWJsZSwgICAgICAgICAgICAgICAgICAgLy8gRUhPU1RVTlJFQUNICiAgICBpZGVudGlmaWVyX3JlbW92ZWQsICAgICAgICAgICAgICAgICAvLyBFSURSTQogICAgaWxsZWdhbF9ieXRlX3NlcXVlbmNlLCAgICAgICAgICAgICAgLy8gRUlMU0VRCiAgICBpbmFwcHJvcHJpYXRlX2lvX2NvbnRyb2xfb3BlcmF0aW9uLCAvLyBFTk9UVFkKICAgIGludGVycnVwdGVkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVJTlRSCiAgICBpbnZhbGlkX2FyZ3VtZW50LCAgICAgICAgICAgICAgICAgICAvLyBFSU5WQUwKICAgIGludmFsaWRfc2VlaywgICAgICAgICAgICAgICAgICAgICAgIC8vIEVTUElQRQogICAgaW9fZXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRUlPCiAgICBpc19hX2RpcmVjdG9yeSwgICAgICAgICAgICAgICAgICAgICAvLyBFSVNESVIKICAgIG1lc3NhZ2Vfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIEVNU0dTSVpFCiAgICBuZXR3b3JrX2Rvd24sICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkVURE9XTgogICAgbmV0d29ya19yZXNldCwgICAgICAgICAgICAgICAgICAgICAgLy8gRU5FVFJFU0VUCiAgICBuZXR3b3JrX3VucmVhY2hhYmxlLCAgICAgICAgICAgICAgICAvLyBFTkVUVU5SRUFDSAogICAgbm9fYnVmZmVyX3NwYWNlLCAgICAgICAgICAgICAgICAgICAgLy8gRU5PQlVGUwogICAgbm9fY2hpbGRfcHJvY2VzcywgICAgICAgICAgICAgICAgICAgLy8gRUNISUxECiAgICBub19saW5rLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFTk9MSU5LCiAgICBub19sb2NrX2F2YWlsYWJsZSwgICAgICAgICAgICAgICAgICAvLyBFTk9MQ0sKICAgIG5vX21lc3NhZ2VfYXZhaWxhYmxlLCAgICAgICAgICAgICAgIC8vIEVOT0RBVEEKICAgIG5vX21lc3NhZ2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT01TRwogICAgbm9fcHJvdG9jb2xfb3B0aW9uLCAgICAgICAgICAgICAgICAgLy8gRU5PUFJPVE9PUFQKICAgIG5vX3NwYWNlX29uX2RldmljZSwgICAgICAgICAgICAgICAgIC8vIEVOT1NQQwogICAgbm9fc3RyZWFtX3Jlc291cmNlcywgICAgICAgICAgICAgICAgLy8gRU5PU1IKICAgIG5vX3N1Y2hfZGV2aWNlX29yX2FkZHJlc3MsICAgICAgICAgIC8vIEVOWElPCiAgICBub19zdWNoX2RldmljZSwgICAgICAgICAgICAgICAgICAgICAvLyBFTk9ERVYKICAgIG5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnksICAgICAgICAgIC8vIEVOT0VOVAogICAgbm9fc3VjaF9wcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gRVNSQ0gKICAgIG5vdF9hX2RpcmVjdG9yeSwgICAgICAgICAgICAgICAgICAgIC8vIEVOT1RESVIKICAgIG5vdF9hX3NvY2tldCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT1RTT0NLCiAgICBub3RfYV9zdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAvLyBFTk9TVFIKICAgIG5vdF9jb25uZWN0ZWQsICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT1RDT05OCiAgICBub3RfZW5vdWdoX21lbW9yeSwgICAgICAgICAgICAgICAgICAvLyBFTk9NRU0KICAgIG5vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgICAgICAgICAgIC8vIEVOT1RTVVAKICAgIG9wZXJhdGlvbl9jYW5jZWxlZCwgICAgICAgICAgICAgICAgIC8vIEVDQU5DRUxFRAogICAgb3BlcmF0aW9uX2luX3Byb2dyZXNzLCAgICAgICAgICAgICAgLy8gRUlOUFJPR1JFU1MKICAgIG9wZXJhdGlvbl9ub3RfcGVybWl0dGVkLCAgICAgICAgICAgIC8vIEVQRVJNCiAgICBvcGVyYXRpb25fbm90X3N1cHBvcnRlZCwgICAgICAgICAgICAvLyBFT1BOT1RTVVBQCiAgICBvcGVyYXRpb25fd291bGRfYmxvY2ssICAgICAgICAgICAgICAvLyBFV09VTERCTE9DSwogICAgb3duZXJfZGVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9XTkVSREVBRAogICAgcGVybWlzc2lvbl9kZW5pZWQsICAgICAgICAgICAgICAgICAgLy8gRUFDQ0VTCiAgICBwcm90b2NvbF9lcnJvciwgICAgICAgICAgICAgICAgICAgICAvLyBFUFJPVE8KICAgIHByb3RvY29sX25vdF9zdXBwb3J0ZWQsICAgICAgICAgICAgIC8vIEVQUk9UT05PU1VQUE9SVAogICAgcmVhZF9vbmx5X2ZpbGVfc3lzdGVtLCAgICAgICAgICAgICAgLy8gRVJPRlMKICAgIHJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyLCAgICAgIC8vIEVERUFETEsKICAgIHJlc291cmNlX3VuYXZhaWxhYmxlX3RyeV9hZ2FpbiwgICAgIC8vIEVBR0FJTgogICAgcmVzdWx0X291dF9vZl9yYW5nZSwgICAgICAgICAgICAgICAgLy8gRVJBTkdFCiAgICBzdGF0ZV9ub3RfcmVjb3ZlcmFibGUsICAgICAgICAgICAgICAvLyBFTk9UUkVDT1ZFUkFCTEUKICAgIHN0cmVhbV90aW1lb3V0LCAgICAgICAgICAgICAgICAgICAgIC8vIEVUSU1FCiAgICB0ZXh0X2ZpbGVfYnVzeSwgICAgICAgICAgICAgICAgICAgICAvLyBFVFhUQlNZCiAgICB0aW1lZF9vdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFVElNRURPVVQKICAgIHRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtLCAgICAgIC8vIEVORklMRQogICAgdG9vX21hbnlfZmlsZXNfb3BlbiwgICAgICAgICAgICAgICAgLy8gRU1GSUxFCiAgICB0b29fbWFueV9saW5rcywgICAgICAgICAgICAgICAgICAgICAvLyBFTUxJTksKICAgIHRvb19tYW55X3N5bWJvbGljX2xpbmtfbGV2ZWxzLCAgICAgIC8vIEVMT09QCiAgICB2YWx1ZV90b29fbGFyZ2UsICAgICAgICAgICAgICAgICAgICAvLyBFT1ZFUkZMT1cKICAgIHdyb25nX3Byb3RvY29sX3R5cGUgICAgICAgICAgICAgICAgIC8vIEVQUk9UT1RZUEUKfTsKCnRlbXBsYXRlIDw+IHN0cnVjdCBpc19lcnJvcl9jb25kaXRpb25fZW51bTxlcnJjPgogICAgOiB0cnVlX3R5cGUgeyB9CgplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShlcnJjIGUpOwplcnJvcl9jb25kaXRpb24gbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYyBlKTsKCi8vIENvbXBhcmlzb24gb3BlcmF0b3JzOgpib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpOwpib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgbGhzLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIHJocyk7CmJvb2wgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb25kaXRpb24mIGxocywgY29uc3QgZXJyb3JfY29kZSYgcmhzKTsKYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIHJocyk7CmJvb2wgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBsaHMsIGNvbnN0IGVycm9yX2NvZGUmIHJocyk7CmJvb2wgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBsaHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgcmhzKTsKYm9vbCBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgbGhzLCBjb25zdCBlcnJvcl9jb2RlJiByaHMpOwpib29sIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBsaHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgcmhzKTsKCnRlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPHN0ZDo6ZXJyb3JfY29kZT47Cgp9ICAvLyBzdGQKCiovCgojaW5jbHVkZSA8X19jb25maWc+CiNpbmNsdWRlIDxjZXJybm8+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPF9fZnVuY3Rpb25hbF9iYXNlPgoKI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgoKX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECgovLyBpc19lcnJvcl9jb2RlX2VudW0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW0KICAgIDogcHVibGljIGZhbHNlX3R5cGUge307CgovLyBpc19lcnJvcl9jb25kaXRpb25fZW51bQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtCiAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwoKLy9lbnVtIGNsYXNzIGVycmMKc3RydWN0IGVycmMKewplbnVtIF8gewogICAgYWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZCAgICAgICAgPSBFQUZOT1NVUFBPUlQsCiAgICBhZGRyZXNzX2luX3VzZSAgICAgICAgICAgICAgICAgICAgICA9IEVBRERSSU5VU0UsCiAgICBhZGRyZXNzX25vdF9hdmFpbGFibGUgICAgICAgICAgICAgICA9IEVBRERSTk9UQVZBSUwsCiAgICBhbHJlYWR5X2Nvbm5lY3RlZCAgICAgICAgICAgICAgICAgICA9IEVJU0NPTk4sCiAgICBhcmd1bWVudF9saXN0X3Rvb19sb25nICAgICAgICAgICAgICA9IEUyQklHLAogICAgYXJndW1lbnRfb3V0X29mX2RvbWFpbiAgICAgICAgICAgICAgPSBFRE9NLAogICAgYmFkX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkFVTFQsCiAgICBiYWRfZmlsZV9kZXNjcmlwdG9yICAgICAgICAgICAgICAgICA9IEVCQURGLAogICAgYmFkX21lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgPSBFQkFETVNHLAogICAgYnJva2VuX3BpcGUgICAgICAgICAgICAgICAgICAgICAgICAgPSBFUElQRSwKICAgIGNvbm5lY3Rpb25fYWJvcnRlZCAgICAgICAgICAgICAgICAgID0gRUNPTk5BQk9SVEVELAogICAgY29ubmVjdGlvbl9hbHJlYWR5X2luX3Byb2dyZXNzICAgICAgPSBFQUxSRUFEWSwKICAgIGNvbm5lY3Rpb25fcmVmdXNlZCAgICAgICAgICAgICAgICAgID0gRUNPTk5SRUZVU0VELAogICAgY29ubmVjdGlvbl9yZXNldCAgICAgICAgICAgICAgICAgICAgPSBFQ09OTlJFU0VULAogICAgY3Jvc3NfZGV2aWNlX2xpbmsgICAgICAgICAgICAgICAgICAgPSBFWERFViwKICAgIGRlc3RpbmF0aW9uX2FkZHJlc3NfcmVxdWlyZWQgICAgICAgID0gRURFU1RBRERSUkVRLAogICAgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kgICAgICAgICAgICAgPSBFQlVTWSwKICAgIGRpcmVjdG9yeV9ub3RfZW1wdHkgICAgICAgICAgICAgICAgID0gRU5PVEVNUFRZLAogICAgZXhlY3V0YWJsZV9mb3JtYXRfZXJyb3IgICAgICAgICAgICAgPSBFTk9FWEVDLAogICAgZmlsZV9leGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRVhJU1QsCiAgICBmaWxlX3Rvb19sYXJnZSAgICAgICAgICAgICAgICAgICAgICA9IEVGQklHLAogICAgZmlsZW5hbWVfdG9vX2xvbmcgICAgICAgICAgICAgICAgICAgPSBFTkFNRVRPT0xPTkcsCiAgICBmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkICAgICAgICAgICAgICA9IEVOT1NZUywKICAgIGhvc3RfdW5yZWFjaGFibGUgICAgICAgICAgICAgICAgICAgID0gRUhPU1RVTlJFQUNILAogICAgaWRlbnRpZmllcl9yZW1vdmVkICAgICAgICAgICAgICAgICAgPSBFSURSTSwKICAgIGlsbGVnYWxfYnl0ZV9zZXF1ZW5jZSAgICAgICAgICAgICAgID0gRUlMU0VRLAogICAgaW5hcHByb3ByaWF0ZV9pb19jb250cm9sX29wZXJhdGlvbiAgPSBFTk9UVFksCiAgICBpbnRlcnJ1cHRlZCAgICAgICAgICAgICAgICAgICAgICAgICA9IEVJTlRSLAogICAgaW52YWxpZF9hcmd1bWVudCAgICAgICAgICAgICAgICAgICAgPSBFSU5WQUwsCiAgICBpbnZhbGlkX3NlZWsgICAgICAgICAgICAgICAgICAgICAgICA9IEVTUElQRSwKICAgIGlvX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUlPLAogICAgaXNfYV9kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgPSBFSVNESVIsCiAgICBtZXNzYWdlX3NpemUgICAgICAgICAgICAgICAgICAgICAgICA9IEVNU0dTSVpFLAogICAgbmV0d29ya19kb3duICAgICAgICAgICAgICAgICAgICAgICAgPSBFTkVURE9XTiwKICAgIG5ldHdvcmtfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgID0gRU5FVFJFU0VULAogICAgbmV0d29ya191bnJlYWNoYWJsZSAgICAgICAgICAgICAgICAgPSBFTkVUVU5SRUFDSCwKICAgIG5vX2J1ZmZlcl9zcGFjZSAgICAgICAgICAgICAgICAgICAgID0gRU5PQlVGUywKICAgIG5vX2NoaWxkX3Byb2Nlc3MgICAgICAgICAgICAgICAgICAgID0gRUNISUxELAogICAgbm9fbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFTk9MSU5LLAogICAgbm9fbG9ja19hdmFpbGFibGUgICAgICAgICAgICAgICAgICAgPSBFTk9MQ0ssCiAgICBub19tZXNzYWdlX2F2YWlsYWJsZSAgICAgICAgICAgICAgICA9IEVOT0RBVEEsCiAgICBub19tZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVOT01TRywKICAgIG5vX3Byb3RvY29sX29wdGlvbiAgICAgICAgICAgICAgICAgID0gRU5PUFJPVE9PUFQsCiAgICBub19zcGFjZV9vbl9kZXZpY2UgICAgICAgICAgICAgICAgICA9IEVOT1NQQywKICAgIG5vX3N0cmVhbV9yZXNvdXJjZXMgICAgICAgICAgICAgICAgID0gRU5PU1IsCiAgICBub19zdWNoX2RldmljZV9vcl9hZGRyZXNzICAgICAgICAgICA9IEVOWElPLAogICAgbm9fc3VjaF9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgPSBFTk9ERVYsCiAgICBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5ICAgICAgICAgICA9IEVOT0VOVCwKICAgIG5vX3N1Y2hfcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgID0gRVNSQ0gsCiAgICBub3RfYV9kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICA9IEVOT1RESVIsCiAgICBub3RfYV9zb2NrZXQgICAgICAgICAgICAgICAgICAgICAgICA9IEVOT1RTT0NLLAogICAgbm90X2Ffc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgPSBFTk9TVFIsCiAgICBub3RfY29ubmVjdGVkICAgICAgICAgICAgICAgICAgICAgICA9IEVOT1RDT05OLAogICAgbm90X2Vub3VnaF9tZW1vcnkgICAgICAgICAgICAgICAgICAgPSBFTk9NRU0sCiAgICBub3Rfc3VwcG9ydGVkICAgICAgICAgICAgICAgICAgICAgICA9IEVOT1RTVVAsCiAgICBvcGVyYXRpb25fY2FuY2VsZWQgICAgICAgICAgICAgICAgICA9IEVDQU5DRUxFRCwKICAgIG9wZXJhdGlvbl9pbl9wcm9ncmVzcyAgICAgICAgICAgICAgID0gRUlOUFJPR1JFU1MsCiAgICBvcGVyYXRpb25fbm90X3Blcm1pdHRlZCAgICAgICAgICAgICA9IEVQRVJNLAogICAgb3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQgICAgICAgICAgICAgPSBFT1BOT1RTVVBQLAogICAgb3BlcmF0aW9uX3dvdWxkX2Jsb2NrICAgICAgICAgICAgICAgPSBFV09VTERCTE9DSywKICAgIG93bmVyX2RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgID0gRU9XTkVSREVBRCwKICAgIHBlcm1pc3Npb25fZGVuaWVkICAgICAgICAgICAgICAgICAgID0gRUFDQ0VTLAogICAgcHJvdG9jb2xfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgPSBFUFJPVE8sCiAgICBwcm90b2NvbF9ub3Rfc3VwcG9ydGVkICAgICAgICAgICAgICA9IEVQUk9UT05PU1VQUE9SVCwKICAgIHJlYWRfb25seV9maWxlX3N5c3RlbSAgICAgICAgICAgICAgID0gRVJPRlMsCiAgICByZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1ciAgICAgICA9IEVERUFETEssCiAgICByZXNvdXJjZV91bmF2YWlsYWJsZV90cnlfYWdhaW4gICAgICA9IEVBR0FJTiwKICAgIHJlc3VsdF9vdXRfb2ZfcmFuZ2UgICAgICAgICAgICAgICAgID0gRVJBTkdFLAogICAgc3RhdGVfbm90X3JlY292ZXJhYmxlICAgICAgICAgICAgICAgPSBFTk9UUkVDT1ZFUkFCTEUsCiAgICBzdHJlYW1fdGltZW91dCAgICAgICAgICAgICAgICAgICAgICA9IEVUSU1FLAogICAgdGV4dF9maWxlX2J1c3kgICAgICAgICAgICAgICAgICAgICAgPSBFVFhUQlNZLAogICAgdGltZWRfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFVElNRURPVVQsCiAgICB0b29fbWFueV9maWxlc19vcGVuX2luX3N5c3RlbSAgICAgICA9IEVORklMRSwKICAgIHRvb19tYW55X2ZpbGVzX29wZW4gICAgICAgICAgICAgICAgID0gRU1GSUxFLAogICAgdG9vX21hbnlfbGlua3MgICAgICAgICAgICAgICAgICAgICAgPSBFTUxJTkssCiAgICB0b29fbWFueV9zeW1ib2xpY19saW5rX2xldmVscyAgICAgICA9IEVMT09QLAogICAgdmFsdWVfdG9vX2xhcmdlICAgICAgICAgICAgICAgICAgICAgPSBFT1ZFUkZMT1csCiAgICB3cm9uZ19wcm90b2NvbF90eXBlICAgICAgICAgICAgICAgICA9IEVQUk9UT1RZUEUKfTsKCiAgICBfIF9fdl87CgogICAgZXJyYyhfIF9fdikgOiBfX3ZfKF9fdikge30KICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHtyZXR1cm4gX192Xzt9Cgp9OwoKdGVtcGxhdGUgPD4gc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPGVycmM+CiAgICA6IHRydWVfdHlwZSB7IH07Cgp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfZXJyb3JfY29uZGl0aW9uX2VudW08ZXJyYzo6Xz4KICAgIDogdHJ1ZV90eXBlIHsgfTsKCmNsYXNzIGVycm9yX2NvbmRpdGlvbjsKY2xhc3MgZXJyb3JfY29kZTsKCi8vIGNsYXNzIGVycm9yX2NhdGVnb3J5CgpjbGFzcyBfX2RvX21lc3NhZ2U7CgpjbGFzcyBlcnJvcl9jYXRlZ29yeQp7CnB1YmxpYzoKICAgIHZpcnR1YWwgfmVycm9yX2NhdGVnb3J5KCk7Cgpwcml2YXRlOgogICAgZXJyb3JfY2F0ZWdvcnkoKTsKICAgIGVycm9yX2NhdGVnb3J5KGNvbnN0IGVycm9yX2NhdGVnb3J5Jik7Ly8gPSBkZWxldGU7CiAgICBlcnJvcl9jYXRlZ29yeSYgb3BlcmF0b3I9KGNvbnN0IGVycm9yX2NhdGVnb3J5Jik7Ly8gPSBkZWxldGU7CgpwdWJsaWM6CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIGVycm9yX2NvbmRpdGlvbiBkZWZhdWx0X2Vycm9yX2NvbmRpdGlvbihpbnQgX19ldikgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChpbnQgX19jb2RlLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fY29uZGl0aW9uKSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBlcXVpdmFsZW50KGNvbnN0IGVycm9yX2NvZGUmIF9fY29kZSwgaW50IF9fY29uZGl0aW9uKSBjb25zdDsKICAgIHZpcnR1YWwgc3RyaW5nIG1lc3NhZ2UoaW50IF9fZXYpIGNvbnN0ID0gMDsKCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19yaHMpIGNvbnN0IHtyZXR1cm4gdGhpcyA9PSAmX19yaHM7fQoKICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQogICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX3JocykgY29uc3Qge3JldHVybiAhKCp0aGlzID09IF9fcmhzKTt9CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fcmhzKSBjb25zdCB7cmV0dXJuIHRoaXMgPCAmX19yaHM7fQoKICAgIGZyaWVuZCBjbGFzcyBfX2RvX21lc3NhZ2U7Cn07CgpjbGFzcyBfTElCQ1BQX0hJRERFTiBfX2RvX21lc3NhZ2UKICAgIDogcHVibGljIGVycm9yX2NhdGVnb3J5CnsKcHVibGljOgogICAgdmlydHVhbCBzdHJpbmcgbWVzc2FnZShpbnQgZXYpIGNvbnN0Owp9OwoKY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGdlbmVyaWNfY2F0ZWdvcnkoKTsKY29uc3QgZXJyb3JfY2F0ZWdvcnkmIHN5c3RlbV9jYXRlZ29yeSgpOwoKY2xhc3MgZXJyb3JfY29uZGl0aW9uCnsKICAgIGludCBfX3ZhbF87CiAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSogX19jYXRfOwpwdWJsaWM6CiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIGVycm9yX2NvbmRpdGlvbigpIDogX192YWxfKDApLCBfX2NhdF8oJmdlbmVyaWNfY2F0ZWdvcnkoKSkge30KCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIGVycm9yX2NvbmRpdGlvbihpbnQgX192YWwsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkKICAgICAgICA6IF9fdmFsXyhfX3ZhbCksIF9fY2F0XygmX19jYXQpIHt9CgogICAgdGVtcGxhdGUgPGNsYXNzIF9FPgogICAgICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQogICAgICAgIGVycm9yX2NvbmRpdGlvbihfRSBfX2UsIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb25kaXRpb25fZW51bTxfRT46OnZhbHVlPjo6dHlwZSogPSAwKQogICAgICAgICAgICB7KnRoaXMgPSBtYWtlX2Vycm9yX2NvbmRpdGlvbihfX2UpO30KCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIHZvaWQgYXNzaWduKGludCBfX3ZhbCwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KQogICAgewogICAgICAgIF9fdmFsXyA9IF9fdmFsOwogICAgICAgIF9fY2F0XyA9ICZfX2NhdDsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0U+CiAgICAgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmCiAgICAgICAgPAogICAgICAgICAgICBpc19lcnJvcl9jb25kaXRpb25fZW51bTxfRT46OnZhbHVlLAogICAgICAgICAgICBlcnJvcl9jb25kaXRpb24mCiAgICAgICAgPjo6dHlwZQogICAgICAgIG9wZXJhdG9yPShfRSBfX2UpCiAgICAgICAgICAgIHsqdGhpcyA9IG1ha2VfZXJyb3JfY29uZGl0aW9uKF9fZSk7IHJldHVybiAqdGhpczt9CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICB2b2lkIGNsZWFyKCkKICAgIHsKICAgICAgICBfX3ZhbF8gPSAwOwogICAgICAgIF9fY2F0XyA9ICZnZW5lcmljX2NhdGVnb3J5KCk7CiAgICB9CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICBpbnQgdmFsdWUoKSBjb25zdCB7cmV0dXJuIF9fdmFsXzt9CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSYgY2F0ZWdvcnkoKSBjb25zdCB7cmV0dXJuICpfX2NhdF87fQogICAgc3RyaW5nIG1lc3NhZ2UoKSBjb25zdDsKCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIC8vZXhwbGljaXQKICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3Qge3JldHVybiBfX3ZhbF8gIT0gMDt9Cn07CgppbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQplcnJvcl9jb25kaXRpb24KbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYyBfX2UpCnsKICAgIHJldHVybiBlcnJvcl9jb25kaXRpb24oc3RhdGljX2Nhc3Q8aW50PihfX2UpLCBnZW5lcmljX2NhdGVnb3J5KCkpOwp9CgppbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQpib29sCm9wZXJhdG9yPChjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feCwgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3kpCnsKICAgIHJldHVybiBfX3guY2F0ZWdvcnkoKSA8IF9feS5jYXRlZ29yeSgpCiAgICAgICAgfHwgX194LmNhdGVnb3J5KCkgPT0gX195LmNhdGVnb3J5KCkgJiYgX194LnZhbHVlKCkgPCBfX3kudmFsdWUoKTsKfQoKLy8gZXJyb3JfY29kZQoKY2xhc3MgZXJyb3JfY29kZQp7CiAgICBpbnQgX192YWxfOwogICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkqIF9fY2F0XzsKcHVibGljOgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICBlcnJvcl9jb2RlKCkgOiBfX3ZhbF8oMCksIF9fY2F0Xygmc3lzdGVtX2NhdGVnb3J5KCkpIHt9CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICBlcnJvcl9jb2RlKGludCBfX3ZhbCwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KQogICAgICAgIDogX192YWxfKF9fdmFsKSwgX19jYXRfKCZfX2NhdCkge30KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0U+CiAgICAgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICAgICAgZXJyb3JfY29kZShfRSBfX2UsIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0U+Ojp2YWx1ZT46OnR5cGUqID0gMCkKICAgICAgICAgICAgeyp0aGlzID0gbWFrZV9lcnJvcl9jb2RlKF9fZSk7fQoKICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQogICAgdm9pZCBhc3NpZ24oaW50IF9fdmFsLCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpCiAgICB7CiAgICAgICAgX192YWxfID0gX192YWw7CiAgICAgICAgX19jYXRfID0gJl9fY2F0OwogICAgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfRT4KICAgICAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgICAgICB0eXBlbmFtZSBlbmFibGVfaWYKICAgICAgICA8CiAgICAgICAgICAgIGlzX2Vycm9yX2NvZGVfZW51bTxfRT46OnZhbHVlLAogICAgICAgICAgICBlcnJvcl9jb2RlJgogICAgICAgID46OnR5cGUKICAgICAgICBvcGVyYXRvcj0oX0UgX19lKQogICAgICAgICAgICB7KnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoX19lKTsgcmV0dXJuICp0aGlzO30KCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIHZvaWQgY2xlYXIoKQogICAgewogICAgICAgIF9fdmFsXyA9IDA7CiAgICAgICAgX19jYXRfID0gJnN5c3RlbV9jYXRlZ29yeSgpOwogICAgfQoKICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQogICAgaW50IHZhbHVlKCkgY29uc3Qge3JldHVybiBfX3ZhbF87fQoKICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQogICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdGVnb3J5KCkgY29uc3Qge3JldHVybiAqX19jYXRfO30KCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIGVycm9yX2NvbmRpdGlvbiBkZWZhdWx0X2Vycm9yX2NvbmRpdGlvbigpIGNvbnN0CiAgICAgICAge3JldHVybiBfX2NhdF8tPmRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKF9fdmFsXyk7fQoKICAgIHN0cmluZyBtZXNzYWdlKCkgY29uc3Q7CgogICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCiAgICAvL2V4cGxpY2l0CiAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHtyZXR1cm4gX192YWxfICE9IDA7fQp9OwoKaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKZXJyb3JfY29kZQptYWtlX2Vycm9yX2NvZGUoZXJyYyBfX2UpCnsKICAgIHJldHVybiBlcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oX19lKSwgZ2VuZXJpY19jYXRlZ29yeSgpKTsKfQoKaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKYm9vbApvcGVyYXRvcjwoY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb2RlJiBfX3kpCnsKICAgIHJldHVybiBfX3guY2F0ZWdvcnkoKSA8IF9feS5jYXRlZ29yeSgpCiAgICAgICAgfHwgX194LmNhdGVnb3J5KCkgPT0gX195LmNhdGVnb3J5KCkgJiYgX194LnZhbHVlKCkgPCBfX3kudmFsdWUoKTsKfQoKaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKYm9vbApvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvZGUmIF9feCwgY29uc3QgZXJyb3JfY29kZSYgX195KQp7CiAgICByZXR1cm4gX194LmNhdGVnb3J5KCkgPT0gX195LmNhdGVnb3J5KCkgJiYgX194LnZhbHVlKCkgPT0gX195LnZhbHVlKCk7Cn0KCmlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCmJvb2wKb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb2RlJiBfX3gsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX195KQp7CiAgICByZXR1cm4gX194LmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX3gudmFsdWUoKSwgX195KQogICAgICAgIHx8IF9feS5jYXRlZ29yeSgpLmVxdWl2YWxlbnQoX194LCBfX3kudmFsdWUoKSk7Cn0KCmlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCmJvb2wKb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feCwgY29uc3QgZXJyb3JfY29kZSYgX195KQp7CiAgICByZXR1cm4gX195ID09IF9feDsKfQoKaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKYm9vbApvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX194LCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feSkKewogICAgcmV0dXJuIF9feC5jYXRlZ29yeSgpID09IF9feS5jYXRlZ29yeSgpICYmIF9feC52YWx1ZSgpID09IF9feS52YWx1ZSgpOwp9CgppbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQpib29sCm9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb2RlJiBfX3kpIHtyZXR1cm4gIShfX3ggPT0gX195KTt9CgppbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQpib29sCm9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgX194LCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feSkge3JldHVybiAhKF9feCA9PSBfX3kpO30KCmlubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCmJvb2wKb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feCwgY29uc3QgZXJyb3JfY29kZSYgX195KSB7cmV0dXJuICEoX194ID09IF9feSk7fQoKaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKYm9vbApvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX194LCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9feSkge3JldHVybiAhKF9feCA9PSBfX3kpO30KCnRlbXBsYXRlIDw+CnN0cnVjdCBoYXNoPGVycm9yX2NvZGU+CiAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxlcnJvcl9jb2RlLCBzaXplX3Q+CnsKICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGVycm9yX2NvZGUmIF9fZWMpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oX19lYy52YWx1ZSgpKTsKICAgIH0KfTsKCi8vIHN5c3RlbV9lcnJvcgoKY2xhc3Mgc3lzdGVtX2Vycm9yCiAgICA6IHB1YmxpYyBydW50aW1lX2Vycm9yCnsKICAgIGVycm9yX2NvZGUgX19lY187CnB1YmxpYzoKICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMsIGNvbnN0IHN0cmluZyYgX193aGF0X2FyZyk7CiAgICBzeXN0ZW1fZXJyb3IoZXJyb3JfY29kZSBfX2VjLCBjb25zdCBjaGFyKiBfX3doYXRfYXJnKTsKICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMpOwogICAgc3lzdGVtX2Vycm9yKGludCBfX2V2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBzdHJpbmcmIF9fd2hhdF9hcmcpOwogICAgc3lzdGVtX2Vycm9yKGludCBfX2V2LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBjaGFyKiBfX3doYXRfYXJnKTsKICAgIHN5c3RlbV9lcnJvcihpbnQgX19ldiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fZWNhdCk7CiAgICB+c3lzdGVtX2Vycm9yKCkgdGhyb3coKTsKCiAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUKICAgIGNvbnN0IGVycm9yX2NvZGUmIGNvZGUoKSBjb25zdCB0aHJvdygpIHtyZXR1cm4gX19lY187fQoKcHJpdmF0ZToKICAgIHN0YXRpYyBzdHJpbmcgX19pbml0KGNvbnN0IGVycm9yX2NvZGUmLCBzdHJpbmcpOwp9OwoKdm9pZCBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQgZXYsIGNvbnN0IGNoYXIqIHdoYXRfYXJnKTsKCl9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKCiNlbmRpZiAgLy8gX0xJQkNQUF9TWVNURU1fRVJST1IK