I2lmbmRlZiBVVElMU19DT01NT05fSAojZGVmaW5lIFVUSUxTX0NPTU1PTl9ICgojaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfVjRMX1NPRlRXQVJFX1BBUlNFUgojaW5jbHVkZSAicGl4Zm10LmgiCiNlbmRpZgoKI2RlZmluZSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFCTY0CiNkZWZpbmUgTUlOX0NBQ0hFX0JJVFMJCQk2NAoKI2RlZmluZSBGRk1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCiNkZWZpbmUgRkZNQVgzKGEsYixjKSBGRk1BWChGRk1BWChhLGIpLGMpCiNkZWZpbmUgRkZNSU4oYSxiKSAoKGEpID4gKGIpID8gKGIpIDogKGEpKQojZGVmaW5lIEZGTUlOMyhhLGIsYykgRkZNSU4oRkZNSU4oYSxiKSxjKQoKI2RlZmluZSBBVl9XTDMyKHAsIHZhbCkJCQkJXAoJZG8gewkJCQkJXAoJCXUzMiBkID0gKHZhbCk7CQkJXAoJCSgodTgqKShwKSlbMF0gPSAoZCk7CQlcCgkJKCh1OCopKHApKVsxXSA9IChkKSA+PiA4OwlcCgkJKCh1OCopKHApKVsyXSA9IChkKSA+PiAxNjsJXAoJCSgodTgqKShwKSlbM10gPSAoZCkgPj4gMjQ7CVwKCX0gd2hpbGUoMCkKCiNkZWZpbmUgQVZfV0IzMihwLCB2YWwpCQkJCVwKCWRvIHsgdTMyIGQgPSAodmFsKTsJCQlcCgkJKCh1OCopKHApKVszXSA9IChkKTsJCVwKCQkoKHU4KikocCkpWzJdID0gKGQpID4+IDg7CVwKCQkoKHU4KikocCkpWzFdID0gKGQpID4+IDE2OwlcCgkJKCh1OCopKHApKVswXSA9IChkKSA+PiAyNDsJXAoJfSB3aGlsZSgwKQoKI2RlZmluZSBBVl9SQjMyKHgpCQkJCVwKCSgoKHUzMikoKGNvbnN0IHU4KikoeCkpWzBdIDw8IDI0KSB8CVwKCSgoKGNvbnN0IHU4KikoeCkpWzFdIDw8IDE2KSB8CQlcCgkoKChjb25zdCB1OCopKHgpKVsyXSA8PCAgOCkgfAkJXAoJKChjb25zdCB1OCopKHgpKVszXSkKCiNkZWZpbmUgQVZfUkwzMih4KQkJCQlcCgkoKCh1MzIpKChjb25zdCB1OCopKHgpKVszXSA8PCAyNCkgfAlcCgkoKChjb25zdCB1OCopKHgpKVsyXSA8PCAxNikgfAkJXAoJKCgoY29uc3QgdTgqKSh4KSlbMV0gPDwgIDgpIHwJCVwKCSgoY29uc3QgdTgqKSh4KSlbMF0pCgojZGVmaW5lIE5FR19TU1IzMihhLCBzKSAgICgoKGludCkoYSkpID4+ICgocyA8IDMyKSA/ICgzMiAtIChzKSkgOiAwKSkKI2RlZmluZSBORUdfVVNSMzIoYSwgcykgICAoKCh1MzIpKGEpKSA+PiAoKHMgPCAzMikgPyAoMzIgLSAocykpIDogMCkpCgovL3JvdW5kZWQgZGl2aXNpb24gJiBzaGlmdAojZGVmaW5lIFJTSElGVChhLGIpICgoYSkgPiAwID8gKChhKSArICgoMTw8KGIpKT4+MSkpPj4oYikgOiAoKGEpICsgKCgxPDwoYikpPj4xKS0xKT4+KGIpKQovKiBhc3N1bWUgYj4wICovCiNkZWZpbmUgUk9VTkRFRF9ESVYoYSxiKSAoKChhKT4wID8gKGEpICsgKChiKT4+MSkgOiAoYSkgLSAoKGIpPj4xKSkvKGIpKQoKc3RydWN0IEFWUmF0aW9uYWx7CglpbnQgbnVtOyAvLy88IG51bWVyYXRvcgoJaW50IGRlbjsgLy8vPCBkZW5vbWluYXRvcgp9OwoKI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCi8qKgogKiBZVVYgY29sb3JzcGFjZSB0eXBlLgogKiBUaGVzZSB2YWx1ZXMgbWF0Y2ggdGhlIG9uZXMgZGVmaW5lZCBieSBJU08vSUVDIDIzMDAxLThfMjAxMyCh7CA3LjMuCiAqLwplbnVtIEFWQ29sb3JTcGFjZSB7CglBVkNPTF9TUENfUkdCICAgICAgICAgPSAwLCAgLy8vPCBvcmRlciBvZiBjb2VmZmljaWVudHMgaXMgYWN0dWFsbHkgR0JSLCBhbHNvIElFQyA2MTk2Ni0yLTEgKHNSR0IpCglBVkNPTF9TUENfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgeHZZQ0M3MDkgLyBTTVBURSBSUDE3NyBBbm5leCBCCglBVkNPTF9TUENfVU5TUEVDSUZJRUQgPSAyLAoJQVZDT0xfU1BDX1JFU0VSVkVEICAgID0gMywKCUFWQ09MX1NQQ19GQ0MgICAgICAgICA9IDQsICAvLy88IEZDQyBUaXRsZSA0NyBDb2RlIG9mIEZlZGVyYWwgUmVndWxhdGlvbnMgNzMuNjgyIChhKSgyMCkKCUFWQ09MX1NQQ19CVDQ3MEJHICAgICA9IDUsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA2MjUgLyBJVFUtUiBCVDEzNTggNjI1IC8gSVRVLVIgQlQxNzAwIDYyNSBQQUwgJiBTRUNBTSAvIElFQyA2MTk2Ni0yLTQgeHZZQ0M2MDEKCUFWQ09MX1NQQ19TTVBURTE3ME0gICA9IDYsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA1MjUgLyBJVFUtUiBCVDEzNTggNTI1IC8gSVRVLVIgQlQxNzAwIE5UU0MKCUFWQ09MX1NQQ19TTVBURTI0ME0gICA9IDcsICAvLy88IGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKCUFWQ09MX1NQQ19ZQ0dDTyAgICAgICA9IDgsICAvLy88IFVzZWQgYnkgRGlyYWMgLyBWQy0yIGFuZCBILjI2NCBGUmV4dCwgc2VlIElUVS1UIFNHMTYKCUFWQ09MX1NQQ19ZQ09DRyAgICAgICA9IEFWQ09MX1NQQ19ZQ0dDTywKCUFWQ09MX1NQQ19CVDIwMjBfTkNMICA9IDksICAvLy88IElUVS1SIEJUMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlIHN5c3RlbQoJQVZDT0xfU1BDX0JUMjAyMF9DTCAgID0gMTAsIC8vLzwgSVRVLVIgQlQyMDIwIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KCUFWQ09MX1NQQ19TTVBURTIwODUgICA9IDExLCAvLy88IFNNUFRFIDIwODUsIFknRCd6RCd4CglBVkNPTF9TUENfQ0hST01BX0RFUklWRURfTkNMID0gMTIsIC8vLzwgQ2hyb21hdGljaXR5LWRlcml2ZWQgbm9uLWNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KCUFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9DTCA9IDEzLCAvLy88IENocm9tYXRpY2l0eS1kZXJpdmVkIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KCUFWQ09MX1NQQ19JQ1RDUCAgICAgICA9IDE0LCAvLy88IElUVS1SIEJULjIxMDAtMCwgSUN0Q3AKCUFWQ09MX1NQQ19OQiAgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQp9OwoKLyoqCiAgKiBDaHJvbWF0aWNpdHkgY29vcmRpbmF0ZXMgb2YgdGhlIHNvdXJjZSBwcmltYXJpZXMuCiAgKiBUaGVzZSB2YWx1ZXMgbWF0Y2ggdGhlIG9uZXMgZGVmaW5lZCBieSBJU08vSUVDIDIzMDAxLThfMjAxMyCh7CA3LjEuCiAgKi8KZW51bSBBVkNvbG9yUHJpbWFyaWVzIHsKCUFWQ09MX1BSSV9SRVNFUlZFRDAgICA9IDAsCglBVkNPTF9QUklfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgLyBTTVBURSBSUDE3NyBBbm5leCBCCglBVkNPTF9QUklfVU5TUEVDSUZJRUQgPSAyLAoJQVZDT0xfUFJJX1JFU0VSVkVEICAgID0gMywKCUFWQ09MX1BSSV9CVDQ3ME0gICAgICA9IDQsICAvLy88IGFsc28gRkNDIFRpdGxlIDQ3IENvZGUgb2YgRmVkZXJhbCBSZWd1bGF0aW9ucyA3My42ODIgKGEpKDIwKQoKCUFWQ09MX1BSSV9CVDQ3MEJHICAgICA9IDUsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA2MjUgLyBJVFUtUiBCVDEzNTggNjI1IC8gSVRVLVIgQlQxNzAwIDYyNSBQQUwgJiBTRUNBTQoJQVZDT0xfUFJJX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQwoJQVZDT0xfUFJJX1NNUFRFMjQwTSAgID0gNywgIC8vLzwgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBhYm92ZQoJQVZDT0xfUFJJX0ZJTE0gICAgICAgID0gOCwgIC8vLzwgY29sb3VyIGZpbHRlcnMgdXNpbmcgSWxsdW1pbmFudCBDCglBVkNPTF9QUklfQlQyMDIwICAgICAgPSA5LCAgLy8vPCBJVFUtUiBCVDIwMjAKCUFWQ09MX1BSSV9TTVBURTQyOCAgICA9IDEwLCAvLy88IFNNUFRFIFNUIDQyOC0xIChDSUUgMTkzMSBYWVopCglBVkNPTF9QUklfU01QVEVTVDQyOF8xID0gQVZDT0xfUFJJX1NNUFRFNDI4LAoJQVZDT0xfUFJJX1NNUFRFNDMxICAgID0gMTEsIC8vLzwgU01QVEUgU1QgNDMxLTIgKDIwMTEpIC8gRENJIFAzCglBVkNPTF9QUklfU01QVEU0MzIgICAgPSAxMiwgLy8vPCBTTVBURSBTVCA0MzItMSAoMjAxMCkgLyBQMyBENjUgLyBEaXNwbGF5IFAzCglBVkNPTF9QUklfSkVERUNfUDIyICAgPSAyMiwgLy8vPCBKRURFQyBQMjIgcGhvc3Bob3JzCglBVkNPTF9QUklfTkIgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKfTsKCi8qKgogKiBDb2xvciBUcmFuc2ZlciBDaGFyYWN0ZXJpc3RpYy4KICogVGhlc2UgdmFsdWVzIG1hdGNoIHRoZSBvbmVzIGRlZmluZWQgYnkgSVNPL0lFQyAyMzAwMS04XzIwMTMgoewgNy4yLgogKi8KZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB7CglBVkNPTF9UUkNfUkVTRVJWRUQwICAgID0gMCwKCUFWQ09MX1RSQ19CVDcwOSAgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MQoJQVZDT0xfVFJDX1VOU1BFQ0lGSUVEICA9IDIsCglBVkNPTF9UUkNfUkVTRVJWRUQgICAgID0gMywKCUFWQ09MX1RSQ19HQU1NQTIyICAgICAgPSA0LCAgLy8vPCBhbHNvIElUVS1SIEJUNDcwTSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0KCUFWQ09MX1RSQ19HQU1NQTI4ICAgICAgPSA1LCAgLy8vPCBhbHNvIElUVS1SIEJUNDcwQkcKCUFWQ09MX1RSQ19TTVBURTE3ME0gICAgPSA2LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNTI1IG9yIDYyNSAvIElUVS1SIEJUMTM1OCA1MjUgb3IgNjI1IC8gSVRVLVIgQlQxNzAwIE5UU0MKCUFWQ09MX1RSQ19TTVBURTI0ME0gICAgPSA3LAoJQVZDT0xfVFJDX0xJTkVBUiAgICAgICA9IDgsICAvLy88ICJMaW5lYXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIgoJQVZDT0xfVFJDX0xPRyAgICAgICAgICA9IDksICAvLy88ICJMb2dhcml0aG1pYyB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAoMTAwOjEgcmFuZ2UpIgoJQVZDT0xfVFJDX0xPR19TUVJUICAgICA9IDEwLCAvLy88ICJMb2dhcml0aG1pYyB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAoMTAwICogU3FydCgxMCkgOiAxIHJhbmdlKSIKCUFWQ09MX1RSQ19JRUM2MTk2Nl8yXzQgPSAxMSwgLy8vPCBJRUMgNjE5NjYtMi00CglBVkNPTF9UUkNfQlQxMzYxX0VDRyAgID0gMTIsIC8vLzwgSVRVLVIgQlQxMzYxIEV4dGVuZGVkIENvbG91ciBHYW11dAoJQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSA9IDEzLCAvLy88IElFQyA2MTk2Ni0yLTEgKHNSR0Igb3Igc1lDQykKCUFWQ09MX1RSQ19CVDIwMjBfMTAgICAgPSAxNCwgLy8vPCBJVFUtUiBCVDIwMjAgZm9yIDEwLWJpdCBzeXN0ZW0KCUFWQ09MX1RSQ19CVDIwMjBfMTIgICAgPSAxNSwgLy8vPCBJVFUtUiBCVDIwMjAgZm9yIDEyLWJpdCBzeXN0ZW0KCUFWQ09MX1RSQ19TTVBURTIwODQgICAgPSAxNiwgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC0sIDEyLSwgMTQtIGFuZCAxNi1iaXQgc3lzdGVtcwoJQVZDT0xfVFJDX1NNUFRFU1QyMDg0ICA9IEFWQ09MX1RSQ19TTVBURTIwODQsCglBVkNPTF9UUkNfU01QVEU0MjggICAgID0gMTcsIC8vLzwgU01QVEUgU1QgNDI4LTEKCUFWQ09MX1RSQ19TTVBURVNUNDI4XzEgPSBBVkNPTF9UUkNfU01QVEU0MjgsCglBVkNPTF9UUkNfQVJJQl9TVERfQjY3ID0gMTgsIC8vLzwgQVJJQiBTVEQtQjY3LCBrbm93biBhcyAiSHlicmlkIGxvZy1nYW1tYSIKCUFWQ09MX1RSQ19OQiAgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKfTsKI2VuZGlmCgovL2ZtdApjb25zdCBjaGFyICphdl9jb2xvcl9zcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHNwYWNlKTsKY29uc3QgY2hhciAqYXZfY29sb3JfcHJpbWFyaWVzX25hbWUoZW51bSBBVkNvbG9yUHJpbWFyaWVzIHByaW1hcmllcyk7CmNvbnN0IGNoYXIgKmF2X2NvbG9yX3RyYW5zZmVyX25hbWUoZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmFuc2Zlcik7CgovL21hdGgKaW50IGF2X2xvZzIodTMyIHYpOwoKLy9iaXRzdHJlYW0KaW50IGZpbmRfc3RhcnRfY29kZSh1OCAqZGF0YSwgaW50IGRhdGFfc3opOwppbnQgY2FsY19uYWxfbGVuKHU4ICpkYXRhLCBpbnQgbGVuKTsKdTggKm5hbF91bml0X2V4dHJhY3RfcmJzcChjb25zdCB1OCAqc3JjLCB1MzIgc3JjX2xlbiwgdTMyICpkc3RfbGVuKTsKCi8vZGVidWcKdm9pZCBwcmludF9oZXhfZGVidWcodTggKmRhdGEsIHUzMiBsZW4sIGludCBtYXgpOwoKYm9vbCBpc19vdmVyX3NpemUoaW50IHcsIGludCBoLCBpbnQgc2l6ZSk7CgojZW5kaWY=