ICNpbmNsdWRlIDxDb3B5cmlnaHQuaD4KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1zQXBpRGVmcy5oCioKKiBERVNDUklQVElPTjoKKiAgICAgICBBUEkgZGVmaW5pdGlvbnMgZm9yIFF1YXJ0ZXJEZWNrIERldmljZQoqCiogREVQRU5ERU5DSUVTOgoqCiogRklMRSBSRVZJU0lPTiBOVU1CRVI6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX19tc0FwaURlZnNfaAojZGVmaW5lIF9fbXNBcGlEZWZzX2gKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCi8qIE1pY3JvIGRlZmluaXRpb25zICovCiN1bmRlZiBHVF9VU0VfTUFECiN1bmRlZiBHVF9STUdNVF9BQ0NFU1MKI3VuZGVmIENPTkZJR19BVkJfRlBHQQojdW5kZWYgQ09ORklHX0FWQl9GUEdBXzIKI3VuZGVmIEdUX1BPUlRfTUFQX0lOX0RFVgojaWZkZWYgQ0hFQ0tfQVBJX1NFTEVDVAojaW5jbHVkZSAibXNBcGlTZWxlY3QuaCIKI2VuZGlmCiNpbmNsdWRlICJtc0FwaVNlbGVjdC5oIgoKI2luY2x1ZGUgPG1zQXBpVHlwZXMuaD4KI2lmZGVmIEdUX1VTRV9NQUQKI2luY2x1ZGUgIm1hZEFwaURlZnMuaCIKI2VuZGlmCgojaWZkZWYgREVCVUdfUUQKI2RlZmluZSBEQkdfSU5GTyh4KSBndERiZ1ByaW50IHgKI2Vsc2UKI2RlZmluZSBEQkdfSU5GTyh4KTsKI2VuZGlmIC8qIERFQlVHX1FEICovCgp0eXBlZGVmIEdUX1UzMiBHVF9TRU07CgojZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIEdUX0VUSEVSTkVUX0hFQURFUl9TSVpFCiNkZWZpbmUgSVNfTVVMVElDQVNUX01BQyAgICAgICAgR1RfSVNfTVVMVElDQVNUX01BQwojZGVmaW5lIElTX0JST0FEQ0FTVF9NQUMgICAgICAgIEdUX0lTX0JST0FEQ0FTVF9NQUMKCiNkZWZpbmUgR1RfSU5WQUxJRF9QSFkgICAgICAgICAgICAweEZGCiNkZWZpbmUgR1RfSU5WQUxJRF9QT1JUICAgICAgICAgICAgMHhGRgojZGVmaW5lIEdUX0lOVkFMSURfUE9SVF9WRUMgICAgICAgIDB4RkZGRkZGRkYKCiNkZWZpbmUgR1RfVU5VU0VEX1BBUkFNKF9hKSAgICAgICAgKF9hKT0oX2EpCgovKgogKiAgIExvZ2ljYWwgUG9ydCB2YWx1ZSBiYXNlZCBvbiBhIFBvcnQKICogICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxCiAqICAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKiAgfDB8ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBwb3J0ICAgICAgIHwKICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCiAqCiAqCiAqICAgVGhlIGZvbGxvd2luZyBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQgdG8gZXh0cmFjdCBzcGVjaWZpYyBpbmZvCiAqICAgZnJvbSBhIExvZ2ljYWwgUG9ydCBpbmRleAogKi8KdHlwZWRlZiBHVF9VMzIgR1RfTFBPUlQ7CnR5cGVkZWYgR1RfVTMyIEdUX0VUWVBFOwoKCi8qIERlZmluZSB0aGUgZGlmZmVyZW50IGRldmljZSB0eXBlIHRoYXQgbWF5IGV4aXN0IGluIHN5c3RlbSAgICAgICAgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUXzg4RTYwMjEgID0gMHgwMjEsCiAgICBHVF84OEU2MDMxICA9IDB4MDMxLAogICAgR1RfODhFNjAzNSAgPSAweDAzNSwKICAgIEdUXzg4RTYwNDYgID0gMHgwNDgsCiAgICBHVF84OEU2MDQ3ICA9IDB4MDQ5LAogICAgR1RfODhFNjA4NSAgPSAweDA0QSwKICAgIEdUXzg4RTYwNTEgID0gMHgwNTEsCiAgICBHVF84OEU2MDUyICA9IDB4MDUyLAogICAgR1RfODhFNjA1NSAgPSAweDA1NSwKICAgIEdUXzg4RTYwNjAgID0gMHgwNjAsCiAgICBHVF84OEU2MDYxICA9IDB4MDYxLAogICAgR1RfODhFNjA2NSAgPSAweDA2NSwKICAgIEdUXzg4RTYwODMgID0gMHgwODMsCiAgICBHVF84OEU2MDkzICA9IDB4MDkzLAogICAgR1RfODhFNjA0NSAgPSAweDA5NCwKICAgIEdUXzg4RTYwOTUgID0gMHgwOTUsCiAgICBHVF84OEU2MDkyICA9IDB4MDk3LAogICAgR1RfODhFNjA5NiAgPSAweDA5OCwKICAgIEdUXzg4RTYwOTcgID0gMHgwOTksCiAgICBHVF84OEU2MDYzICAgID0gMHgxNTMsCiAgICBHVF84OEU2MTIxICAgID0gMHgxMDQsCiAgICBHVF84OEU2MTIyICAgID0gMHgxMDUsCiAgICBHVF84OEU2MTMxICAgID0gMHgxMDYsCiAgICBHVF84OEU2MTA4ICAgID0gMHgxMDcsCiAgICBHVF84OEU2MTIzICAgID0gMHgxMjEsCiAgICBHVF84OEU2MTI0ICAgID0gMHgxMjQsICAgIC8qIHdhcyA4OEU2MTI0ICovCiAgICBHVF84OEU2MTQwICAgID0gMHgxNDEsIC8qIEVtZXJhbGQgKi8KICAgIEdUXzg4RTYxNjEgICAgPSAweDE2MSwgLyogRW1lcmFsZCAqLwogICAgR1RfODhFNjE2NSAgICA9IDB4MTY1LCAvKiBFbWVyYWxkICovCiAgICBHVF84OEU2MTcxICAgID0gMHgxNzEsIC8qIEFtYmVyICovCiAgICBHVF84OEU2MTc1ICAgID0gMHgxNzUsIC8qIEFtYmVyICovCiAgICBHVF84OEU2MTgxICAgID0gMHgxQTAsCiAgICBHVF84OEU2MTUzICAgID0gMHgxQTEsCiAgICBHVF84OEU2MTgzICAgID0gMHgxQTMsCiAgICBHVF84OEU2MTUyICAgID0gMHgxQTQsCiAgICBHVF84OEU2MTU1ICAgID0gMHgxQTUsCiAgICBHVF84OEU2MTgyICAgID0gMHgxQTYsCiAgICBHVF84OEU2MTg1ICAgID0gMHgxQTcsCiAgICBHVF84OEU2MzIxICAgID0gMHgzMjQsICAgIC8qIHdhcyA4OEU2MzI1ICovIC8qIEFtYmVyICovCiAgICBHVF84OEU2MzUwICAgID0gMHgzNzEsICAgIC8qIHdhcyA4OEU2MzcxICovIC8qIEFtYmVyICovCiAgICBHVF84OEU2MzUxICAgID0gMHgzNzUsICAgIC8qIEFtYmVyICovCiAgICBHVF84OEVDMDAwICAgID0gMHhDMDAsICAgIC8qIE1lbG9keSAweGMwMC0weGMwNyAqLwogICAgR1RfODhFMzAyMCAgICA9IDB4MDAwLCAgICAvKiBTcGlubmFrZXIgMHgwMDAgKi8KICAgIEdUXzg4RTYwMjAgICAgPSAweDAyMCwgICAgLyogU3Bpbm5ha2VyIDB4MDIwICovCiAgICBHVF84OEU2MDcwICAgID0gMHgwNzAsICAgIC8qIFNwaW5uYWtlciAweDA3MCAqLwogICAgR1RfODhFNjA3MSAgICA9IDB4MDcxLCAgICAvKiBTcGlubmFrZXIgMHgwNzEgKi8KICAgIEdUXzg4RTYyMjAgICAgPSAweDIyMCwgICAgLyogU3Bpbm5ha2VyIDB4MjIwICovCiAgICBHVF84OEU2MjUwICAgID0gMHgyNTAsICAgIC8qIFNwaW5uYWtlciAweDI1MCAqLwogICAgR1RfRkhfVlBOICAgPSAweEY1MywKICAgIEdUX0ZGX0VHICAgID0gMHhGOTEsCiAgICBHVF9GRl9IRyAgICA9IDB4RjkzLAogICAgR1RfODhFNjE3MiAgICA9IDB4MTcyLCAvKiBBZ2F0ZSAqLwogICAgR1RfODhFNjE3NiAgICA9IDB4MTc2LCAvKiBBZ2F0ZSAqLwogICAgR1RfODhFNjI0MCAgICA9IDB4MjQwLCAvKiBBZ2F0ZSAqLwogICAgR1RfODhFNjM1MiAgICA9IDB4MzUyLCAvKiBBZ2F0ZSAqLwogICAgR1RfODhFNjExNSAgICA9IDB4MTE1LCAvKiBQZWFybCAqLwogICAgR1RfODhFNjEyNSAgICA9IDB4MTI1LCAvKiBQZWFybCAqLwogICAgR1RfODhFNjMxMCAgICA9IDB4MzEwLCAvKiBQZWFybCAqLwogICAgR1RfODhFNjMyMCAgICA9IDB4MzIwLCAvKiBQZWFybCAqLwoKfUdUX0RFVklDRTsKCgovKiBEZWZpbml0aW9uIGZvciB0aGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBkZXZpY2UgICAgICAgICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9SRVZfMCA9IDAsCiAgICBHVF9SRVZfMSwKICAgIEdUX1JFVl8yLAogICAgR1RfUkVWXzMKfUdUX0RFVklDRV9SRVY7CgoKLyogVG9EbzogTm8gVXNlZCAqLwp0eXBlZGVmIGVudW0KewogICAgSU5UUl9NT0RFX0RJU0FCTEUgPTAsCiAgICBJTlRSX01PREVfRU5BQkxFCn1JTlRFUlJVUFRfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBQb3J0IFNwZWVkICovCnR5cGVkZWYgZW51bQp7CiAgICBQT1JUX1NQRUVEXzEwX01CUFMgPSAwLAogICAgUE9SVF9TUEVFRF8xMDBfTUJQUyA9IDEsCiAgICBQT1JUX1NQRUVEXzIwMF9NQlBTID0gMiwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9TUEVFRF8xMDAwX01CUFMgPSAyICwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9TUEVFRF9VTktOT1dOID0gMwp9IEdUX1BPUlRfU1BFRURfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgUG9ydCBTcGVlZCAqLwp0eXBlZGVmIGVudW0KewogICAgUE9SVF9GT1JDRV9TUEVFRF8xMF9NQlBTID0gMCwKICAgIFBPUlRfRk9SQ0VfU1BFRURfMTAwX01CUFMgPSAxLAogICAgUE9SVF9GT1JDRV9TUEVFRF8yMDBfTUJQUyA9IDIsICAgIC8qIHZhbGlkIG9ubHkgaWYgZGV2aWNlIHN1cHBvcnQgKi8KICAgIFBPUlRfRk9SQ0VfU1BFRURfMTAwMF9NQlBTID0gMiwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9ET19OT1RfRk9SQ0VfU1BFRUQgPTMKfSBHVF9QT1JUX0ZPUkNFRF9TUEVFRF9NT0RFOwoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIGZvcmNlZCBQb3J0IER1cGxleCBtb2RlICovCnR5cGVkZWYgZW51bQp7CiAgICBQT1JUX0RPX05PVF9GT1JDRV9EVVBMRVgsCiAgICBQT1JUX0ZPUkNFX0ZVTExfRFVQTEVYLAogICAgUE9SVF9GT1JDRV9IQUxGX0RVUExFWAp9IEdUX1BPUlRfRk9SQ0VEX0RVUExFWF9NT0RFOwoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIGZvcmNlZCBQb3J0IExpbmsgKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPUlRfRE9fTk9UX0ZPUkNFX0xJTkssCiAgICBQT1JUX0ZPUkNFX0xJTktfVVAsCiAgICBQT1JUX0ZPUkNFX0xJTktfRE9XTgp9IEdUX1BPUlRfRk9SQ0VEX0xJTktfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgZmxvdyBjb250cm9sIG1vZGUgKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPUlRfRE9fTk9UX0ZPUkNFX0ZDLAogICAgUE9SVF9GT1JDRV9GQ19FTkFCTEVELAogICAgUE9SVF9GT1JDRV9GQ19ESVNBQkxFRAp9IEdUX1BPUlRfRk9SQ0VEX0ZDX01PREU7CgovKiBEZWZpbml0aW9uIGZvciB0aGUgUFBVIHN0YXRlICovCnR5cGVkZWYgZW51bQp7CiAgICBQUFVfU1RBVEVfRElTQUJMRURfQVRfUkVTRVQsCiAgICBQUFVfU1RBVEVfQUNUSVZFLAogICAgUFBVX1NUQVRFX0RJU0FCTEVEX0FGVEVSX1JFU0VULAogICAgUFBVX1NUQVRFX1BPTExJTkcKfSBHVF9QUFVfU1RBVEU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QT1JUX0NPTkZJR19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHBvcnQncyBpbnRlcmZhY2UgdHlwZSBjb25maWd1cmF0aW9uIG1vZGUgZGV0ZXJtaW5lZCBhdAogKiAgICAgICAgICAgICAgICByZXNldC4gVGhpcyBkZWZpbml0aW9uIG1heSBub3QgcmVwcmVzZW50IHRoZSBkZXZpY2UgdW5kZXIgdXNlLgogKiAgICAgICAgICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPUlRDRkdfR01JSV8xMjVNSFogPSAwLCAgICAgICAgLyogUHhfR1RYQ0xLID0gMTI1TUh6LCAxMDAwQkFTRSAqLwogICAgUE9SVENGR19GRF9NSUlfME1IWiA9IDEsICAgICAgICAvKiBQeF9HVFhDTEsgPSAwIE1IeiwgUG93ZXIgU2F2ZSAqLwogICAgUE9SVENGR19GREhEX01JSV8yNU1IWiA9IDIsICAgICAgICAvKiBQeF9HVFhDTEsgPSAyNU1IeiwgMTAwQkFTRSAqLwogICAgUE9SVENGR19GREhEX01JSV8yXzVNSFogPSAzLCAgICAvKiBQeF9HVFhDTEsgPSAyLjVNSHosIDEwQkFTRSAqLwogICAgUE9SVENGR19GRF9TRVJERVMgPSA0LCAgICAgICAgICAgIC8qIERlZmF1bHQgdmFsdWUgKi8KICAgIFBPUlRDRkdfRkRfMTAwMEJBU0VfWCA9IDUsCiAgICBQT1JUQ0ZHX01HTUlJID0gNiwgICAgICAgICAgICAgICAgLyogZHVwbGV4LCBzcGVlZCBkZXRlcm1pbmVkIGJ5IHRoZSBQUFUgKi8KICAgIFBPUlRDRkdfRElTQUJMRUQgPSA3Cn0gR1RfUE9SVF9DT05GSUdfTU9ERTsKCgp0eXBlZGVmIGVudW0KewogICAgR1RfU0FfRklMVEVSSU5HX0RJU0FCTEUgPSAwLAogICAgR1RfU0FfRFJPUF9PTl9MT0NLLAogICAgR1RfU0FfRFJPUF9PTl9VTkxPQ0ssCiAgICBHVF9TQV9EUk9QX1RPX0NQVQp9IEdUX1NBX0ZJTFRFUklORzsKCgovKiBEZWZpbml0aW9uIGZvciB0aGUgSW5ncmVlL0VncmVzcyBGcmFtZSBNb2RlICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9GUkFNRV9NT0RFX05PUk1BTCA9IDAsICAgIC8qIE5vcm1hbCBOZXR3b3JrICovCiAgICBHVF9GUkFNRV9NT0RFX0RTQSwgICAgICAgICAgICAvKiBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlICovCiAgICBHVF9GUkFNRV9NT0RFX1BST1ZJREVSLCAgICAgICAgLyogUHJvdmlkZXIgKi8KICAgIEdUX0ZSQU1FX01PREVfRVRIRVJfVFlQRV9EU0EgICAgLyogRXRoZXIgVHlwZSBEU0EgKi8KfSBHVF9GUkFNRV9NT0RFOwoKLyoKICogVHlwZWRlZjogZW51bSBHVF9KVU1CT19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIEp1bWJvIEZyYW1lIFNpemUgYWxsb3dlZCB0byBiZSB0eCBhbmQgcngKICoKICogRmllbGRzOgogKiAgICAgIEdUX0pVTUJPX01PREVfMTUyMiAtIFJ4IGFuZCBUeCBmcmFtZXMgd2l0aCBtYXggYnl0ZSBvZiAxNTIyLgogKiAgICAgIEdUX0pVTUJPX01PREVfMjA0OCAtIFJ4IGFuZCBUeCBmcmFtZXMgd2l0aCBtYXggYnl0ZSBvZiAyMDQ4LgogKiAgICAgIEdUX0pVTUJPX01PREVfMTAyNDAgLSBSeCBhbmQgVHggZnJhbWVzIHdpdGggbWF4IGJ5dGUgb2YgMTAyNDAuCiAqCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfSlVNQk9fTU9ERV8xNTIyID0gMCwKICAgIEdUX0pVTUJPX01PREVfMjA0OCwKICAgIEdUX0pVTUJPX01PREVfMTAyNDAKfSBHVF9KVU1CT19NT0RFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFJJX09WRVJSSURFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBwcmlvcml0eSBvdmVycmlkZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFJJX09WRVJSSURFX05PTkUgLSBOb3JtYWwgZnJhbWUgcHJpb3JpdHkgcHJvY2Vzc2luZyBvY2N1cnMuCiAqICAgICAgICBQUklfT1ZFUlJJREVfRlJBTUVfUVVFVUUgLQogKiAgICAgICAgICAgIEJvdGggZnJhbWUgYW5kIHF1ZXVlIG92ZXJyaWRlcyB0YWtlIHBsYWNlIG9uIHRoZSBmcmFtZS4KICogICAgICBQUklfT1ZFUlJJREVfRlJBTUUgLQogKiAgICAgICAgICAgIE92ZXJ3aXRlIHRoZSBmcmFtZSdzIEZQcmkgKGZyYW1lIHByaW9yaXR5KS4KICogICAgICAgICAgICBJZiB0aGUgZnJhbWUgZWdyZXNzZXMgdGFnZ2VkLCB0aGUgcHJpb3JpdHkgaW4gdGhlIGZyYW1lIHdpbGwgYmUKICogICAgICAgICAgICB0aGUgb3ZlcndyaXR0ZW4gcHJpb3JpdHkgdmFsdWUuCiAqICAgICAgICBQUklfT1ZFUlJJREVfUVVFVUUgLQogKiAgICAgICAgICAgIE92ZXJ3aXRlIHRoZSBmcmFtZSdzIFFQcmkgKHF1ZXVlIHByaW9yaXR5KS4KICogICAgICAgICAgICBRUHJpIGlzIHVzZWQgaW50ZXJuYWxseSB0byBtYXAgdGhlIGZyYW1lIHRvIG9uZSBvZiB0aGUgZWdyZXNzCiAqICAgICAgICAgICAgcXVldWVzIGluc2lkZSB0aGUgc3dpdGNoLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBSSV9PVkVSUklERV9OT05FID0gMCwKICAgIFBSSV9PVkVSUklERV9GUkFNRV9RVUVVRSwKICAgIFBSSV9PVkVSUklERV9GUkFNRSwKICAgIFBSSV9PVkVSUklERV9RVUVVRQp9IEdUX1BSSV9PVkVSUklERTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0ZSQU1FX1BPTElDWQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgcG9saWN5IG9mIHRoZSBmcmFtZQogKgogKiBGaWVsZHM6CiAqICAgICAgRlJBTUVfUE9MSUNZX05PTkUgLSBOb3JtYWwgZnJhbWUgc3dpdGNoaW5nCiAqICAgICAgRlJBTUVfUE9MSUNZX01JUlJPUiAtIE1pcnJvcihjb3B5KSBmcmFtZSB0byB0aGUgTWlycm9yRGVzdCBwb3J0CiAqICAgICAgRlJBTUVfUE9MSUNZX1RSQVAgLSBUcmFwKHJlLWRpcmVjdCkgZnJhbWUgdG8gdGhlIENQVURlc3QgcG9ydAogKiAgICAgIEZSQU1FX1BPTElDWV9ESVNDQVJEIC0gRGlzY2FyZChmaWx0ZXIpIHRoZSBmcmFtZQogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEZSQU1FX1BPTElDWV9OT05FID0gMCwKICAgIEZSQU1FX1BPTElDWV9NSVJST1IsCiAgICBGUkFNRV9QT0xJQ1lfVFJBUCwKICAgIEZSQU1FX1BPTElDWV9ESVNDQVJECn0gR1RfRlJBTUVfUE9MSUNZOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUE9MSUNZX1RZUEUKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIHBvbGljeSB0eXBlCiAqCiAqIEZpZWxkczoKICogICAgICBQT0xJQ1lfVFlQRV9EQSAgICAgLSBQb2xpY3kgYmFzZWQgb24gRGVzdGluYXRpb24gQWRkcmVzcwogKiAgICAgIFBPTElDWV9UWVBFX1NBICAgICAtIFBvbGljeSBiYXNlZCBvbiBTb3VyY2UgQWRkcmVzcwogKiAgICAgIFBPTElDWV9UWVBFX1ZUVSAgICAgLSBQb2xpY3kgYmFzZWQgb24gVklECiAqICAgICAgICBQT0xJQ1lfVFlQRV9FVFlQRSAgICAtIGJhc2VkIG9uIEV0aGVyIFR5cGUgb2YgYSBmcmFtZQogKiAgICAgICAgUE9MSUNZX1RZUEVfUFBQb0UgICAgLSBQb2xpY3kgZm9yIHRoZSBmcmFtZSB3aXRoIEV0aGVyIFR5cGUgb2YgMHg4ODYzCiAqICAgICAgICBQT0xJQ1lfVFlQRV9WQkFTICAgIC0gUG9saWN5IGZvciB0aGUgZnJhbWUgd2l0aCBFdGhlciBUeXBlIG9mIDB4ODIwMAogKiAgICAgICAgUE9MSUNZX1RZUEVfT1BUODIgICAgLSBQb2xpY3kgZm9yIHRoZSBmcmFtZSB3aXRoIERIQ1AgT3B0aW9uIDgyCiAqICAgICAgICBQT0xJQ1lfVFlQRV9VRFAgICAgLSBQb2xpY3kgZm9yIHRoZSBmcmFtZSB3aXRoIEJyb2FkY2FzdCBJUHY0IFVEUCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdCBJUHY2IFVEUAogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPTElDWV9UWVBFX0RBLAogICAgUE9MSUNZX1RZUEVfU0EsCiAgICBQT0xJQ1lfVFlQRV9WVFUsCiAgICBQT0xJQ1lfVFlQRV9FVFlQRSwKICAgIFBPTElDWV9UWVBFX1BQUG9FLAogICAgUE9MSUNZX1RZUEVfVkJBUywKICAgIFBPTElDWV9UWVBFX09QVDgyLAogICAgUE9MSUNZX1RZUEVfVURQCn0gR1RfUE9MSUNZX1RZUEU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QUklfT1ZFUlJJREVfRlRZUEUKICoKICogRGVzY3JpcHRpb246IERlZmluaXRpb24gb2YgdGhlIGZyYW1lIHR5cGUgZm9yIHByaW9yaXR5IG92ZXJyaWRlCiAqCiAqIEZpZWxkczoKICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfQlBEVSAtCiAqICAgICAgICAgICAgVXNlZCBvbiBtdWx0aWNhc3QgRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHgwIChCUERVL01HTVQpLgogKiAgICAgICAgICAgIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9EU0FfVE9fQ1BVX0YyUiAtCiAqICAgICAgICAgICAgVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDEgKEZyYW1lIHRvIFJlZ2lzdGVyCiAqICAgICAgICAgICAgUmVwbHkpLiBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfRFNBX1RPX0NQVV9JR01QIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4MiAoSUdNUC9NTEQgVHJhcCkKICogICAgICAgICAgICBhbmQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGFyZSBJR01QIG9yIE1MRCB0cmFwcGVkCiAqICAgICAgICBGVFlQRV9EU0FfVE9fQ1BVX1RSQVAgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHgzIChQb2xpY3kgVHJhcCkgYW5kCiAqICAgICAgICAgICAgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGFyZSBQb2xpY3kgVHJhcHBlZAogKiAgICAgICAgRlRZUEVfRFNBX1RPX0NQVV9BUlAgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHg0IChBUlAgTWlycm9yKSBhbmQKICogICAgICAgICAgICBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgYXJlIEFSUCBNaXJyb3JlZCAoc2VlIGdwcnRTZXRBUlB0b0NQVSBBUEkpLgogKiAgICAgICAgRlRZUEVfRFNBX1RPX0NQVV9NSVJST1IgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHg1IChQb2xpY3kgTWlycm9yKSBhbmQKICogICAgICAgICAgICBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgYXJlIFBvbGljeSBNaXJyb3JlZCAoc2VlIGdwcnRTZXRQb2xpY3kgQVBJKS4KICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfUkVTRVJWRUQgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHg2IChSZXNlcnZlZCkuIE5vdAogKiAgICAgICAgICAgIHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfVUNBU1RfTUdNVCAtCiAqICAgICAgICAgICAgVXNlZCBvbiB1bmljYXN0IERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4MCAodW5pY2FzdAogKiAgICAgICAgICAgIE1HTVQpLiBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfRFNBX0ZST01fQ1BVIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBGcm9tX0NQVSBmcmFtZXMuIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZQogKiAgICAgICAgRlRZUEVfRFNBX0NST1NTX0NISVBfRkMgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIENyb3NzIENoaXAgRmxvdyBDb250cm9sIGZyYW1lcyAoVG9fU25pZmZlciBGbG93CiAqICAgICAgICAgICAgQ29udHJvbCkuIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9FR1JFU1NfTU9OIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBDcm9zcyBDaGlwIEVncmVzcyBNb25pdG9yIGZyYW1lcyAoVG9fU25pZmZlciBUeCkuCiAqICAgICAgICAgICAgTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICogICAgICAgIEZUWVBFX0RTQV9DUk9TU19DSElQX0lOR1JFU1NfTU9OIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBDcm9zcyBDaGlwIEluZ3Jlc3MgTW9uaXRvciBmcmFtZXMgKFRvX1NuaWZmZXIgUngpLgogKiAgICAgICAgICAgIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9QT1JUX0VUWVBFX01BVENIIC0KICogICAgICAgICAgICBVc2VkIG9uIG5vcm1hbCBuZXR3b3JrIHBvcnRzIChzZWUgZ3BydFNldEZyYW1lTW9kZSBBUEkpCiAqICAgICAgICAgICAgb24gZnJhbWVzIHdob3NlIEV0aGVydHlwZSBtYXRjaGVzIHRoZSBwb3J0J3MgUG9ydEVUeXBlIHJlZ2lzdGVyLgogKiAgICAgICAgICAgIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9CQ0FTVF9OT05fRFNBX0NPTlRST0wgLQogKiAgICAgICAgICAgIFVzZWQgb24gTm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGNvbnRhaW4gYSBCcm9hZGNhc3QKICogICAgICAgICAgICBkZXN0aW5hdGlvbiBhZGRyZXNzLiBOb3QgdXNlZCBvbiBEU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9QUFBvRV9OT05fRFNBX0NPTlRST0wgLQogKiAgICAgICAgICAgIFVzZWQgb24gTm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGNvbnRhaW4gYW4gRXRoZXIgVHlwZSAweDg4NjMKICogICAgICAgICAgICAoaS5lLiwgUFBQb0UgZnJhbWVzKS4gTm90IHVzZWQgb24gRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfSVBfTk9OX0RTQV9DT05UUk9MIC0KICogICAgICAgICAgICBVc2VkIG9uIE5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBjb250YWluIGFuIElQdjQgb3IgSVB2NiBFdGhlcgogKiAgICAgICAgICAgIFR5cGUuIE5vdCB1c2VkIG9uIERTQSBDb250cm9sIGZyYW1lcy4KICovCnR5cGVkZWYgZW51bQp7CiAgICBGVFlQRV9EU0FfVE9fQ1BVX0JQRFUgPSAwLAogICAgRlRZUEVfRFNBX1RPX0NQVV9GMlIsCiAgICBGVFlQRV9EU0FfVE9fQ1BVX0lHTVAsCiAgICBGVFlQRV9EU0FfVE9fQ1BVX1RSQVAsCiAgICBGVFlQRV9EU0FfVE9fQ1BVX0FSUCwKICAgIEZUWVBFX0RTQV9UT19DUFVfTUlSUk9SLAogICAgRlRZUEVfRFNBX1RPX0NQVV9SRVNFUlZFRCwKICAgIEZUWVBFX0RTQV9UT19DUFVfVUNBU1RfTUdNVCwKICAgIEZUWVBFX0RTQV9GUk9NX0NQVSwKICAgIEZUWVBFX0RTQV9DUk9TU19DSElQX0ZDLAogICAgRlRZUEVfRFNBX0NST1NTX0NISVBfRUdSRVNTX01PTiwKICAgIEZUWVBFX0RTQV9DUk9TU19DSElQX0lOR1JFU1NfTU9OLAogICAgRlRZUEVfUE9SVF9FVFlQRV9NQVRDSCwKICAgIEZUWVBFX0JDQVNUX05PTl9EU0FfQ09OVFJPTCwKICAgIEZUWVBFX1BQUG9FX05PTl9EU0FfQ09OVFJPTCwKICAgIEZUWVBFX0lQX05PTl9EU0FfQ09OVFJPTAp9IEdUX1BSSV9PVkVSUklERV9GVFlQRTsKCgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfUVBSSV9UQkxfRU5UUlkKICoKICogRGVzY3JpcHRpb246IFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBlbnRyeSBvZiBRdWV1ZSBQcmlvcml0eSBPdmVycmlkZQogKiAgICAgICAgICAgICAgICBUYWJsZS4KICoKICogRmllbGRzOgogKiAgICAgICAgcVByaUVuICAgIC0gR1RfVFJVRSB0byBlbmFibGUgUXVldWUgUHJpb3JpdHksIEdUX0ZBTFNFIG90aGVyd2lzZQogKiAgICAgICAgcVByaW9yaXR5IC0gcHJpb3JpdHkgdG8gYmUgb3ZlcnJpZGRlbiAoIDAgfiAzICkgb25seSBpZiBxUHJpRW4gaXMgR1RfVFJVRQogKiAgICAgICAgICAgICAgICAgICAgV2hlbiBxUHJpRW4gaXMgR1RfRkFMU0UsIHFQcmlvcml0eSBzaG91bGQgYmUgaWdub3JlZC4KICoKICogTm90ZXM6IElmIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHFQcmlBdmJFbiwgcVByaUF2YkVuIGFuZCBxQXZiUHJpb3JpdHkgZmllbGRzCiAqICAgICAgICB3aWxsIGJlIGlnbm9yZWQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICBxUHJpRW47CiAgICBHVF9VMzIgICAgICAgIHFQcmlvcml0eTsKfUdUX1FQUklfVEJMX0VOVFJZOwoKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9GUFJJX1RCTF9FTlRSWQogKgogKiBEZXNjcmlwdGlvbjogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIGVudHJ5IG9mIEZyYW1lIFByaW9yaXR5IE92ZXJyaWRlCiAqICAgICAgICAgICAgICAgIFRhYmxlLgogKgogKiBGaWVsZHM6CiAqICAgICAgICBmUHJpRW4gICAgLSBHVF9UUlVFIHRvIGVuYWJsZSBGcmFtZSBQcmlvcml0eSwgR1RfRkFMU0Ugb3RoZXJ3aXNlCiAqICAgICAgICBmUHJpb3JpdHkgLSBwcmlvcml0eSB0byBiZSBvdmVycmlkZGVuICggMCB+IDcgKSBvbmx5IGlmIGZQcmlFbiBpcyBHVF9UUlVFCiAqICAgICAgICAgICAgICAgICAgICBXaGVuIGZQcmlFbiBpcyBHVF9GQUxTRSwgZlByaW9yaXR5IHNob3VsZCBiZSBpZ25vcmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgZlByaUVuOwogICAgR1RfVTMyICAgICAgICBmUHJpb3JpdHk7Cn1HVF9GUFJJX1RCTF9FTlRSWTsKCgovKiBNYXhpbWFtIG51bWJlciBvZiBwb3J0cyBhIHN3aXRjaCBtYXkgaGF2ZS4gKi8KI2RlZmluZSBNQVhfU1dJVENIX1BPUlRTICAgIDExCiNkZWZpbmUgVkVSU0lPTl9NQVhfTEVOICAgICAzMAojZGVmaW5lIE1BWF9RT1NfV0VJR0hUUyAgICAgICAgMTI4CgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfUW9TX1dFSUdIVAogKgogKiBEZXNjcmlwdGlvbjogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgUHJvZ3JhbW1hYmxlIFJvdW5kIFJvYmluIFdlaWdodHMuCiAqCiAqIEZpZWxkczoKICogICAgICBsZW4gICAgLSBsZW5ndGggb2YgdGhlIHZhbGlkIHF1ZXVlIGRhdGEKICogICAgICAgIHF1ZXVlICAtIHVwdG8gMTI4IHF1ZXVlIGRhdGEKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICAgICAgbGVuOwogICAgR1RfVTggICAgICAgIHF1ZXVlW01BWF9RT1NfV0VJR0hUU107Cn1HVF9Rb1NfV0VJR0hUOwoKCgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfVkVSU0lPTgogKgogKiBEZXNjcmlwdGlvbjogVGhpcyBzdHJ1Y3QgaG9sZHMgdGhlIHBhY2thZ2UgdmVyc2lvbi4KICoKICogRmllbGRzOgogKiAgICAgIHZlcnNpb24gLSBzdHJpbmcgYXJyYXkgaG9sZGluZyB0aGUgdmVyc2lvbi4KICoKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1U4ICAgdmVyc2lvbltWRVJTSU9OX01BWF9MRU5dOwp9R1RfVkVSU0lPTjsKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfUk1VCiAqCiAqIERlc2NyaXB0aW9uOiBUaGlzIHN0cnVjdCBob2xkcyB0aGUgUmVtb3RlIE1hbmFnZW1lbnQgVW5pdCBtb2RlLgogKgogKiBGaWVsZHM6CiAqICAgICAgICBybXVFbiAgICAtIGVuYWJsZSBvciBkaXNhYmxlIFJNVQogKiAgICAgICAgcG9ydCAgICAtIGxvZ2ljYWwgcG9ydCB3aGVyZSBSTVUgaXMgZW5hYmxlZAogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgcm11RW47CiAgICBHVF9MUE9SVCAgICBwb3J0Owp9IEdUX1JNVTsKCgoKLyoKICogVHlwZWRlZjoKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIGRpZmZlcmVudCBzaXplcyBvZiB0aGUgTWFjIGFkZHJlc3MgdGFibGUuCiAqCiAqIEZpZWxkczoKICogICAgICBBVFVfU0laRV8yNTYgICAgLSAgIDI1NiBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKiAgICAgIEFUVV9TSVpFXzUxMiAgICAtICAgNTEyIGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqICAgICAgQVRVX1NJWkVfMTAyNCAgIC0gICAxMDI0IGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqICAgICAgQVRVX1NJWkVfMjA0OCAgIC0gICAyMDQ4IGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqICAgICAgQVRVX1NJWkVfNDA5NiAgIC0gICA0MDk2IGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqICAgICAgQVRVX1NJWkVfODE5MiAgIC0gICA4MTkyIGVudHJpZXMgTWFjIGFkZHJlc3MgdGFibGUuCiAqCiAqLwp0eXBlZGVmIGVudW0KewogICAgQVRVX1NJWkVfMjU2LAogICAgQVRVX1NJWkVfNTEyLAogICAgQVRVX1NJWkVfMTAyNCwKICAgIEFUVV9TSVpFXzIwNDgsCiAgICBBVFVfU0laRV80MDk2LAogICAgQVRVX1NJWkVfODE5Mgp9QVRVX1NJWkU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9QT1JUX1NUUF9TVEFURQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgc3Bhbm5pbmcgdHJlZSBzdGF0ZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX1BPUlRfRElTQUJMRSAgICAtIHBvcnQgaXMgZGlzYWJsZWQuCiAqICAgR1RfUE9SVF9CTE9DS0lORyAgIC0gcG9ydCBpcyBpbiBibG9ja2luZy9saXN0ZW5pbmcgc3RhdGUuCiAqICAgR1RfUE9SVF9MRUFSTklORyAgIC0gcG9ydCBpcyBpbiBsZWFybmluZyBzdGF0ZS4KICogICBHVF9QT1JUX0ZPUldBUkRJTkcgLSBwb3J0IGlzIGluIGZvcndhcmRpbmcgc3RhdGUuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUE9SVF9ESVNBQkxFID0gMCwKICAgIEdUX1BPUlRfQkxPQ0tJTkcsCiAgICBHVF9QT1JUX0xFQVJOSU5HLAogICAgR1RfUE9SVF9GT1JXQVJESU5HCn0gR1RfUE9SVF9TVFBfU1RBVEU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9FR1JFU1NfTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgZWdyZXNzIG1vZGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9VTk1PRElGWV9FR1JFU1MgLSBmcmFtZXMgYXJlIHRyYW5zbWl0ZWQgdW5tb2RpZmllZC4KICogICBHVF9UQUdHRURfRUdSRVNTICAgLSBhbGwgZnJhbWVzIGFyZSB0cmFuc21pdGVkIHRhZ2dlZC4KICogICBHVF9VTlRBR0dFRF9FR1JFU1MgLSBhbGwgZnJhbWVzIGFyZSB0cmFuc21pdGVkIHVudGFnZ2VkLgogKiAgIEdUX0FERF9UQUcgICAgICAgICAtIGFsd2F5cyBhZGQgYSB0YWcuIChvciBkb3VibGUgdGFnKQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1VOTU9ESUZZX0VHUkVTUyA9IDAsCiAgICBHVF9VTlRBR0dFRF9FR1JFU1MsCiAgICBHVF9UQUdHRURfRUdSRVNTLAogICAgR1RfQUREX1RBRwp9IEdUX0VHUkVTU19NT0RFOwoKLyogIHR5cGVkZWY6IGVudW0gR1RfRE9UMVFfTU9ERSAqLwoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0RJU0FCTEUgPSAwLAogICAgR1RfRkFMTEJBQ0ssCiAgICBHVF9DSEVDSywKICAgIEdUX1NFQ1VSRQp9IEdUX0RPVDFRX01PREU7CgoKLyogdHlwZWRlZjogZW51bSBHVF9TV19NT0RFICovCgp0eXBlZGVmIGVudW0KewogICAgR1RfQ1BVX0FUVEFUQ0hFRCA9IDAsIC8qIHBvcnRzIGNvbWUgdXAgZGlzYWJsZWQgKi8KICAgIEdUX0JBQ0tPRkYsICAgICAgICAgICAvKiBFRVBST00gYXR0YWMgbW9kZSB3aXRoIG9sZCBoYWxmIGR1cGxleCBiYWNrb2ZmIG1vZGUgKi8KICAgIEdUX1NUQU5EX0FMT05FLCAgICAgICAvKiBwb3J0cyBjb21lIHVwIGVuYWJsZWQsIGlnbm9yZSBFRVBST00gKi8KICAgIEdUX0VFUFJPTV9BVFRBVENIRUQgICAvKiBFRVBST00gZGVmaW5lZCBwcm90IHN0YXRlcyAqLwp9IEdUX1NXX01PREU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9BVFVfT1BFUkFSSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgQVRVIGFuZCBWVFUgb3BlcmF0aW9ucwogKgogKiBGaWVsZHM6CiAqICAgICAgRkxVU0hfQUxMICAgICAgICAgICAtIEZsdXNoIGFsbCBlbnRyaWVzLgogKiAgICAgIEZMVVNIX1VOTE9DS0VEICAgICAgLSBGbHVzaCBhbGwgdW5sb2NrZWQgZW50cmllcyBpbiBBVFUuCiAqICAgICAgTE9BRF9QVVJHRV9FTlRSWSAgICAtIExvYWQgLyBQdXJnZSBlbnRyeS4KICogICAgICBHRVRfTkVYVF9FTlRSWSAgICAgIC0gR2V0IG5leHQgQVRVIG9yIFZUVSAgZW50cnkuCiAqICAgICAgRkxVU0hfQUxMX0lOX0RCICAgICAtIEZsdXNoIGFsbCBlbnRyaWVzIGluIGEgcGFydGljdWxhciBEQk51bS4KICogICAgICBGTFVTSF9VTkxPQ0tFRF9JTl9EQiAtIEZsdXNoIGFsbCB1bmxvY2tlZCBlbnRyaWVzIGluIGEgcGFydGljdWxhciBEQk51bS4KICogICAgICBTRVJWSUNFX1ZJT0xBVE9OUyAgIC0gc2V2aWNlIHZpb2xhdGlvbnMgb2YgVlRVCiAqCiAqLwp0eXBlZGVmIGVudW0KewogICAgRkxVU0hfQUxMID0gMSwgICAgICAgIC8qIGZvciBib3RoIGF0dSBhbmQgdnR1ICovCiAgICBGTFVTSF9VTkxPQ0tFRCwgICAgICAgIC8qIGZvciBhdHUgb25seSAqLwogICAgTE9BRF9QVVJHRV9FTlRSWSwgICAgLyogZm9yIGJvdGggYXR1IGFuZCB2dHUgKi8KICAgIEdFVF9ORVhUX0VOVFJZLCAgICAgICAgLyogZm9yIGJvdGggYXR1IGFuZCB2dHUgKi8KICAgIEZMVVNIX0FMTF9JTl9EQiwgICAgLyogZm9yIGF0dSBvbmx5ICovCiAgICBGTFVTSF9VTkxPQ0tFRF9JTl9EQiwgICAgLyogZm9yIGF0dSBvbmx5ICovCiAgICBTRVJWSUNFX1ZJT0xBVElPTlMgICAgIC8qIGZvciB2dHUgb25seSAqLwp9IEdUX0FUVV9PUEVSQVRJT04sIEdUX1ZUVV9PUEVSQVRJT047CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9GTFVTSF9DTUQKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIHVuaXQgZmx1c2ggb3BlcmF0aW9uLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfRkxVU0hfQUxMICAgICAgIC0gZmx1c2ggYWxsIGVudHJpZXMuCiAqICAgR1RfRkxVU0hfQUxMX1VOQkxLIC0gZmx1c2ggYWxsIHVuYmxvY2tlZCAob3IgdW5sb2NrZWQpLgogKiAgIEdUX0ZMVVNIX0FMTF9VTkxPQ0tFRCAtIGZsdXNoIGFsbCB1bmJsb2NrZWQgKG9yIHVubG9ja2VkKS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9GTFVTSF9BTEwgICAgICAgPSAxLAogICAgR1RfRkxVU0hfQUxMX1VOQkxLID0gMiwKICAgIEdUX0ZMVVNIX0FMTF9VTkxPQ0tFRCA9IDIKfUdUX0ZMVVNIX0NNRDsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfTU9WRV9DTUQKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIHVuaXQgbW92ZSBvciByZW1vdmUgb3BlcmF0aW9uLgogKiAgICAgV2hlbiBkZXN0aW5hdGlvbiBwb3J0IGlzIHNldCB0byAweEYsIFJlbW92ZSBvcGVyYXRpb24gb2NjdXJzLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfTU9WRV9BTEwgICAgICAgLSBtb3ZlIGFsbCBlbnRyaWVzLgogKiAgIEdUX01PVkVfQUxMX1VOQkxLIC0gbW92ZSBhbGwgdW5ibG9ja2VkIChvciB1bmxvY2tlZCkuCiAqICAgR1RfTU9WRV9BTExfVU5MT0NLRUQgLSBtb3ZlIGFsbCB1bmJsb2NrZWQgKG9yIHVubG9ja2VkKS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9NT1ZFX0FMTCAgICAgICA9IDEsCiAgICBHVF9NT1ZFX0FMTF9VTkJMSyA9IDIsCiAgICBHVF9NT1ZFX0FMTF9VTkxPQ0tFRCA9IDIKfUdUX01PVkVfQ01EOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQVRVX1VDX1NUQVRFCiAqCiAqIERlc2NyaXB0aW9uOgogKiAgICAgIEVudW1lcmF0aW9uIG9mIHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIHVuaXQgZW50cnkgc3RhdGUgb2YgdW5pY2FzdAogKiAgICAgIGVudHJpcy4KICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfVUNfSU5WQUxJRCAgIC0gaW52YWxpZCBlbnRyeS4KICogICAgICAgIEdUX1VDX0RZTkFNSUMgICAtIHVuaWNhc3QgZHluYW1pYyBlbnRyeS4KICogICAgICAgIEdUX1VDX05PX1BSSV9UT19DUFVfU1RBVElDX05STAogKiAgICAgICAgICAgICAgICAtIHN0YXRpYyB1bmljYXN0IGVudHJ5IHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gQ1BVIHdpdGhvdXQKICogICAgICAgICAgICAgICAgICAgIGZvcmNpbmcgcHJpb3JpdHkgYW5kIHdpdGhvdXQgcmF0ZSBsaW1pdGluZy4KICogICAgICAgIEdUX1VDX1RPX0NQVV9TVEFUSUNfTlJMCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBDUFUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgcmF0ZSBsaW1pdGluZy4KICogICAgICAgIEdUX1VDX05PX1BSSV9TVEFUSUNfTlJMCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgd2l0aG91dCBmb3JjaW5nIHByaW9yaXR5IGFuZCB3aXRob3V0LgogKiAgICAgICAgICAgICAgICAgICAgcmF0ZSBsaW1pdGluZy4KICogICAgICAgIEdUX1VDX05PX1BSSV9TVEFUSUNfQVZCX0VOVFJZCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgQVZCIGVudHJ5IHdpdGhvdXQgZm9yY2luZyBwcmlvcml0eSBpZiBNYWNBdmIgaXMgZW5hYmxlZC4KICogICAgICAgIEdUX1VDX1NUQVRJQ19OUkwgICAgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB3aXRob3V0IHJhdGUgbGltaXRpbmcuCiAqICAgICAgICBHVF9VQ19TVEFUSUNfQVZCX0VOVFJZIC0gc3RhdGljIHVuaWNhc3QgQVZCIGVudHJ5IGlmIE1hY0F2YiBpcyBlbmFibGVkIC4KICogICAgICAgIEdUX1VDX05PX1BSSV9UT19DUFVfU1RBVElDCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBDUFUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgZm9yY2luZyBwcmlvcml0eS4KICogICAgICAgIEdUX1VDX1RPX0NQVV9TVEFUSUMgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIHRvIENQVS4KICogICAgICAgIEdUX1VDX05PX1BSSV9TVEFUSUMgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB3aXRob3V0IGZvcmNpbmcgcHJpb3JpdHkuCiAqICAgICAgICBHVF9VQ19TVEFUSUMgICAgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeS4KICoKICogTm90ZTogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWxlZCB1bmljYXN0IGVudHJ5IHN0YXRlcwogKiAgICAgICAgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfVUNfSU5WQUxJRCAgICAgID0gMCwKICAgIEdUX1VDX0RZTkFNSUMgICAgICA9IDB4MSwKCiAgICBHVF9VQ19OT19QUklfVE9fQ1BVX1NUQVRJQ19OUkwgICAgPSAweDgsCiAgICBHVF9VQ19UT19DUFVfU1RBVElDX05STCAgICAgICAgICAgID0gMHg5LAogICAgR1RfVUNfTk9fUFJJX1NUQVRJQ19OUkwgICAgICAgICAgICA9IDB4QSwKICAgIEdUX1VDX05PX1BSSV9TVEFUSUNfQVZCX0VOVFJZICAgID0gMHhBLAogICAgR1RfVUNfU1RBVElDX05STCAgICAgICAgICAgICAgICAgPSAweEIsCiAgICBHVF9VQ19TVEFUSUNfQVZCX0VOVFJZICAgICAgICAgICAgPSAweEIsCgogICAgR1RfVUNfTk9fUFJJX1RPX0NQVV9TVEFUSUMgICAgPSAweEMsCiAgICBHVF9VQ19UT19DUFVfU1RBVElDICAgICAgICAgPSAweEQsCiAgICBHVF9VQ19OT19QUklfU1RBVElDICAgICAgICAgPSAweEUsCiAgICBHVF9VQ19TVEFUSUMgICAgICAgICAgICAgICAgICA9IDB4Rgp9IEdUX0FUVV9VQ19TVEFURTsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0FUVV9NQ19TVEFURQogKgogKiBEZXNjcmlwdGlvbjoKICogICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiB1bml0IGVudHJ5IHN0YXRlIG9mIG11bHRpY2FzdAogKiAgICAgIGVudHJpcy4KICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIEdUX01DX0lOVkFMSUQgICAgICAgICAtIGludmFsaWQgZW50cnkuCiAqICAgICAgR1RfTUNfTUdNX1NUQVRJQyAgICAgIC0gc3RhdGljIG11bHRpY2FzdCBtYW5hZ2VtZW50IGVudHJpZXMuCiAqICAgICAgR1RfTUNfU1RBVElDICAgICAgICAgIC0gc3RhdGljIG11bHRpY2FzdCByZWd1bGFyIGVudHJpcy4KICogICAgICBHVF9NQ19TVEFUSUNfQVZCX0VOVFJZLSBzdGF0aWMgQVZCIGVudHJ5IGlmIE1hY0F2YiBpcyBlbmFsYmVkLgogKiAgICAgIEdUX01DX1BSSU9fTUdNX1NUQVRJQyAtIHN0YXRpYyBtdWx0aWNhc3QgbWFuYWdlbWVudCBlbnRyaWVzIHdpdGgKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eS4KICogICAgICBHVF9NQ19QUklPX1NUQVRJQyAgICAgLSBzdGF0aWMgbXVsdGljYXN0IHJlZ3VsYXIgZW50cmlzIHdpdGggcHJpb3JpdHkuCiAqICAgICAgR1RfTUNfUFJJT19TVEFUSUNfQVZCX0VOVFJZICAgICAgLSBzdGF0aWMgbXVsdGljYXN0IEFWQiBFbnRyeSB3aXRoIHByaW9yaXR5IGlmIE1hY0F2YiBpcyBlbmFibGVkCiAqICAgICAgR1RfTUNfUFJJT19TVEFUSUNfVU5MSU1JVEVEX1JBVEUgLSBzdGF0aWMgbXVsdGljYXN0IHJlZ3VsYXIgZW50cmlzIHdpdGggcHJpb3JpdHkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB3aXRob3V0IHJhdGUgbGltaXRpbmcuCiAqICAgICAgR1RfTUNfTUdNX1NUQVRJQ19VTkxJTUlURURfUkFURSAgICAgLSBzdGF0aWMgbXVsdGljYXN0IG1hbmFnZW1lbnQgZW50cmllcyB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIGxpbWl0aW5nLgogKiAgICAgIEdUX01DX1NUQVRJQ19VTkxJTUlURURfUkFURSAgICAgIC0gc3RhdGljIG11bHRpY2FzdCByZWd1bGFyIGVudHJpcyB3aXRob3V0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIGxpbWl0aW5nLgogKiAgICAgIEdUX01DX1BSSU9fTUdNX1NUQVRJQ19VTkxJTUlURURfUkFURSAtIHN0YXRpYyBtdWx0aWNhc3QgbWFuYWdlbWVudCBlbnRyaWVzIHdpdGgKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBhbmQgd2l0aG91dCByYXRlIGxpbWl0aW5nLgogKgogKiBOb3RlOiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIGRldGFpbGVkIG11bHRpY2FzdCBlbnRyeSBzdGF0ZXMKICogICAgICAgIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX01DX0lOVkFMSUQgICAgICAgICA9IDAsCiAgICBHVF9NQ19NR01fU1RBVElDX1VOTElNSVRFRF9SQVRFID0gMHg0LAogICAgR1RfTUNfU1RBVElDX1VOTElNSVRFRF9SQVRFICAgID0gMHg1LAogICAgR1RfTUNfU1RBVElDX0FWQl9FTlRSWSAgICA9IDB4NSwKICAgIEdUX01DX01HTV9TVEFUSUMgICAgICA9IDB4NiwKICAgIEdUX01DX1NUQVRJQyAgICAgICAgICA9IDB4NywKICAgIEdUX01DX1BSSU9fTUdNX1NUQVRJQ19VTkxJTUlURURfUkFURSA9IDB4QywKICAgIEdUX01DX1BSSU9fU1RBVElDX1VOTElNSVRFRF9SQVRFICAgID0gMHhELAogICAgR1RfTUNfUFJJT19TVEFUSUNfQVZCX0VOVFJZICAgID0gMHhELAogICAgR1RfTUNfUFJJT19NR01fU1RBVElDID0gMHhFLAogICAgR1RfTUNfUFJJT19TVEFUSUMgICAgID0gMHhGCn0gR1RfQVRVX01DX1NUQVRFOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfQVRVX0VYVF9QUkkKICoKICogIERlc2NyaXB0aW9uOgogKiAgICAgICAgRXh0YW5kZWQgcHJpb3JpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBhZGRyZXNzIHRhcm5zbGF0b24gdW5pdCBlbnRyeS4KICoKICogICAgICAgIG1hY0ZQcmkgZGF0YSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBmcmFtZSBwcmlvcml0eSBvbiBhbnkgZnJhbWUgYXNzb2NpYXRlZAogKiAgICAgICAgd2l0aCB0aGlzIE1BQywgaWYgdGhlIHVzZU1hY0ZQcmkgaXMgR1RfVFJVRSBhbmQgdGhlIHBvcnQncyBTQSBhbmQvb3IKICogICAgICAgIERBIEZQcmlPdmVycmlkZSBhcmUgZW5hYmxlZC4gU0EgRnJhbWUgUHJpb3JpdHkgT3ZlcnJpZGVzIGNhbiBvbmx5IG9jY3VyIG9uCiAqICAgICAgICBNQUMgYWRkcmVzc2VzIHRoYXQgYXJlIFN0YXRpYyBvciB3aGVyZSB0aGUgUG9ydCBpcyBMb2NrZWQsIGFuZCB3aGVyZSB0aGUgcG9ydAogKiAgICAgICAgaXMgbWFwcGVkIHNvdXJjZSBwb3J0IGZvciB0aGUgTUFDIGFkZHJlc3MuCiAqCiAqICAgICAgICBtYWNRUHJpIGRhdGEgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgcXVldWUgcHJpb3JpdHkgb24gYW55IGZyYW1lIGFzc29jaWF0ZWQKICogICAgICAgIHdpdGggdGhpcyBNQUMsIGlmIHRoZSBFbnRyeVN0YXRlIGluZGljYXRlcyBRdWV1ZSBQcmlvcml0eSBPdmVycmlkZSBhbmQgdGhlCiAqICAgICAgICBwb3J0J3MgU0EgYW5kL29yIERBIFFQcmlPdmVycmlkZSBhcmUgZW5hYmxlZC4KICoKICogIEZpZWxkczoKICogICAgICB1c2VNYWNGUHJpIC0gVXNlIE1BQyBmcmFtZSBwcmlvcml0eSBvdmVycmlkZS4gV2hlbiB0aGlzIGlzIEdUX1RSVUUsCiAqICAgICAgICAgICAgICAgICAgICAgTWFjRlByaSBkYXRhIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBmcmFtZSBwcmlvcml0eSBvbgogKiAgICAgICAgICAgICAgICAgICAgIGFueSBmcmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBNQUMuCiAqICAgICAgbWFjRlByaSAgICAtIE1BQyBmcmFtZSBwcmlvcml0eSBkYXRhICgwIH4gNykuCiAqICAgICAgbWFjUVByaSAgICAtIE1BQyBxdWV1ZSBwcmlvcml0eSBkYXRhICgwIH4gMykuCiAqCiAqICBDb21tZW50OgogKiAgICAgIFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCB0byBmaW5kIG91dCBpZiB0aGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgogKiAgICAgICAgV2hlbiB0aGlzIHN0cnVjdHVyZSBpcyBpbXBsZW1lbnRlZCwgdGhlIGZvbGxvd2luZ3MgYXJlIHRoZSBkZXZpY2VzIHN1cHBvcnRpbmcKICogICAgICAgIHRoaXMgZmVhdHVyZToKICogICAgICAgICAgICA4OEU2MDY1LCA4OEU2MDM1LCBhbmQgODhFNjA1NSBzdXBwb3J0IGFsbCBleHRhbmRlZCBwcmlvcml0eSBkYXRhLgogKiAgICAgICAgICAgIDg4RTYwNjEgYW5kIDg4RTYwMzEgc3VwcG9ydCBvbmx5IG1hY1FQcmkgZGF0YQogKiAgICAgICAgICAgIDg4RUMwMDAgYW5kIDg4RTMwMjAgZmFtaWx5IHVzZSBvbmx5IG1hY0ZQcmkgZGF0YQogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgICAgIHVzZU1hY0ZQcmk7CiAgICBHVF9VOCAgICAgICAgICAgICBtYWNGUHJpOwogICAgR1RfVTggICAgICAgICAgICAgbWFjUVByaTsKfSBHVF9BVFVfRVhUX1BSSTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0FUVV9FTlRSWQogKgogKiAgRGVzY3JpcHRpb246IGFkZHJlc3MgdGFybnNsYXRvbiB1bml0IEVudHJ5CiAqCiAqICBGaWVsZHM6CiAqICAgICAgbWFjQWRkciAgICAtIG1hYyBhZGRyZXNzCiAqICAgICAgdHJ1bmtNZW1iZXItIEdUX1RSVUUgaWYgZW50cnkgYmVsb25ncyB0byBhIFRydW5rLiBUaGlzIGZpZWxkIHdpbGwgYmUKICogICAgICAgICAgICAgICAgICAgICBpZ25vcmVkIGlmIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFRydW5rLgogKiAgICAgIHBvcnRWZWMgICAgLSBwb3J0IFZlY3Rvci4KICogICAgICAgICAgICAgICAgICAgICBJZiB0cnVua01lbWJlciBmaWVsZCBpcyBHVF9UUlVFLCB0aGlzIHZhbHVlIHJlcHJlc2VudHMgdHJ1bmsgSUQuCiAqICAgICAgcHJpbyAgICAgICAtIGVudHJ5IHByaW9yaXR5LgogKiAgICAgIGVudHJ5U3RhdGUgLSB0aGUgZW50cnkgc3RhdGUuCiAqICAgICAgICBEQk51bSAgICAgICAtIEFUVSBNQUMgQWRkcmVzcyBEYXRhYmFzZSBudW1iZXIuIElmIG11bHRpcGxlIGFkZHJlc3MKICogICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgYXJlIG5vdCBiZWluZyB1c2VkLCBEQk51bSBzaG91bGQgYmUgemVyby4KICogICAgICAgICAgICAgICAgICAgICBJZiBtdWx0aXBsZSBhZGRyZXNzIGRhdGFiYXNlcyBhcmUgYmVpbmcgdXNlZCwgdGhpcyB2YWx1ZQogKiAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGRlc2lyZWQgYWRkcmVzcyBkYXRhYmFzZSBudW1iZXIuCiAqICAgICAgICBleFByaW8gICAgIC0gZXh0YW5kZWQgcHJpb3JpdHkgaW5mb3JtYXRpb24uIElmIGRldmljZSBzdXBwb3J0IGV4dGFuZGVkCiAqICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksIHByaW8gZmllbGQgc2hvdWxkIGJlIGlnbm9yZWQuCiAqCiAqICBDb21tZW50OgogKiAgICAgIFRoZSBlbnRyeVN0YXRlIHVuaW9uIFR5cGUgaXMgZGV0ZXJtaW5lIGFjY29yZGluZyB0byB0aGUgTWFjIFR5cGUuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9FVEhFUkFERFIgICAgIG1hY0FkZHI7CiAgICBHVF9CT09MICAgICAgICAgICAgdHJ1bmtNZW1iZXI7CiAgICBHVF9VMzIgICAgICAgICAgICBwb3J0VmVjOwogICAgR1RfVTggICAgICAgICAgICBwcmlvOwogICAgR1RfVTggICAgICAgICAgICByZXNlcnZlZDsKICAgIEdUX1UxNiAgICAgICAgICAgIERCTnVtOwogICAgdW5pb24KICAgIHsKICAgICAgICBHVF9BVFVfVUNfU1RBVEUgdWNFbnRyeVN0YXRlOwogICAgICAgIEdUX0FUVV9NQ19TVEFURSBtY0VudHJ5U3RhdGU7CiAgICB9IGVudHJ5U3RhdGU7CiAgICBHVF9BVFVfRVhUX1BSSSAgICBleFByaW87Cn0gR1RfQVRVX0VOVFJZOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVlRVX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBWTEFOICB0YXJuc2xhdG9uIHVuaXQgRGF0YSBSZWdpc3RlcgogKgogKiAgRmllbGRzOgogKiAgICAgIG1lbWJlclRhZ1AgLSBNZW1iZXJzaGlwIGFuZCBFZ3Jlc3MgVGFnZ2luZwogKiAgICAgICAgICAgICAgICAgICBtZW1iZXJUYWdQWzBdIGlzIGZvciBQb3J0IDAsIE1lbWJlclRhZ1BbMV0gaXMgZm9yIHBvcnQgMSwgYW5kIHNvIG9uCiAqCiAqICBDb21tZW50OgogKiAgICAgTUFYX1NXSVRDSF9QT1JUUyBpcyAxMCBmb3IgT2N0YW5lLgogKiAgICAgSW4gdGhlIGNhc2Ugb2YgRnVsbFNhaWwsIHRoZXJlIGFyZSAzIHBvcnRzLiBTbywgdGhlIHJlc3QgNyBpcyBpZ25vcmVkIGluIG1lbWViZXJUYWdQCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgbWVtYmVyVGFnUFtNQVhfU1dJVENIX1BPUlRTXTsKICAgIEdUX1U4ICAgICBwb3J0U3RhdGVQW01BWF9TV0lUQ0hfUE9SVFNdOwp9IEdUX1ZUVV9EQVRBOwoKLyoKICogIGRlZmluaXRpb24gZm9yIE1FTUJFUl9UQUcKICovCiNkZWZpbmUgTUVNQkVSX0VHUkVTU19VTk1PRElGSUVEICAgIDAKI2RlZmluZSBOT1RfQV9NRU1CRVIgICAgICAgICAgICAgICAgMQojZGVmaW5lIE1FTUJFUl9FR1JFU1NfVU5UQUdHRUQgICAgICAgIDIKI2RlZmluZSBNRU1CRVJfRUdSRVNTX1RBR0dFRCAgICAgICAgMwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9WVFVfRVhUX0lORk8KICoKICogIERlc2NyaXB0aW9uOgogKiAgICAgICAgRXh0YW5kZWQgVlRVIEVudHJ5IGluZm9ybWF0aW9uIGZvciBQcmlvcml0eSBPdmVycmlkZSBhbmQgTm9uIFJhdGUgTGltaXQuCiAqICAgICAgICBGcmFtZSBQcmlvcml0eSBpcyB1c2VkIHRvIGFzIHRoZSB0YWcncyBQUkkgYml0cyBpZiB0aGUgZnJhbWUgZWdyZXNzZXMKICogICAgICAgIHRoZSBzd2l0Y2ggdGFnZ2VkLiBUaGUgZWdyZXNzcyBxdWV1ZSB0aGUgZnJhbWUgaXMgc3dpdGNoIGludG8gaXMgbm90CiAqICAgICAgICBtb2RpZmllZCBieSB0aGUgRnJhbWUgUHJpb3JpdHkgT3ZlcnJpZGUuCiAqICAgICAgICBRdWV1ZSBQcmlvcml0eSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZWdyZXNzIHF1ZXVlIHRoZSBmcmFtZSBpcwogKiAgICAgICAgc3dpdGNoZWQgaW50by4gSWYgdGhlIGZyYW1lIGVncmVzc2VzIHRhZ2dlZCwgdGhlIHByaW9yaXR5IGluIHRoZSBmcmFtZQogKiAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQgYnkgYSBRdWV1ZSBQcmlvcml0eSBPdmVycmlkZS4KICogICAgICAgIE5vblJhdGVMaW1pdCBmb3IgVklEIGlzIHVzZWQgdG8gaW5kaWNhdGUgYW55IGZyYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhpcwogKiAgICAgICAgVklEIGFyZSB0byBieXBhc3MgaW5ncmVzcyBhbmQgZWdyZXNzIHJhdGUgbGltaXRpbmcsIGlmIHRoZSBpbmdyZXNzCiAqICAgICAgICBwb3J0J3MgVklEIE5SYXRlTGltaXQgaXMgYWxzbyBlbmFibGVkLgogKgogKiAgRmllbGRzOgogKiAgICAgIHVzZVZJREZQcmkgLSBVc2UgVklEIGZyYW1lIHByaW9yaXR5IG92ZXJyaWRlLiBXaGVuIHRoaXMgaXMgR1RfVFJVRSBhbmQKICogICAgICAgICAgICAgICAgICAgICBWSURGUHJpT3ZlcnJpZGUgb2YgdGhlIGluZ3Jlc3MgcG9ydCBvZiB0aGUgZnJhbWUgaXMgZW5hYmxlZCwKICogICAgICAgICAgICAgICAgICAgICB2aWRGUHJpIGRhdGEgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgZnJhbWUgcHJpb3JpdHkgb24KICogICAgICAgICAgICAgICAgICAgICBhbnkgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVklELgogKiAgICAgIHZpZEZQcmkgICAgLSBWSUQgZnJhbWUgcHJpb3JpdHkgZGF0YSAoMCB+IDcpLgogKiAgICAgIHVzZVZJRFFQcmkgLSBVc2UgVklEIHF1ZXVlIHByaW9yaXR5IG92ZXJyaWRlLiBXaGVuIHRoaXMgaXMgR1RfVFJVRSBhbmQKICogICAgICAgICAgICAgICAgICAgICBWSURRUHJpT3ZlcnJpZGUgb2YgdGhlIGluZ3Jlc3MgcG9ydCBvZiB0aGUgZnJhbWUgaXMgZW5hYmxlZCwKICogICAgICAgICAgICAgICAgICAgICB2aWRRUHJpIGRhdGEgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHF1ZXVlIHByaW9yaXR5IG9uCiAqICAgICAgICAgICAgICAgICAgICAgYW55IGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZJRC4KICogICAgICB2aWRRUHJpICAgIC0gVklEIHF1ZXVlIHByaW9yaXR5IGRhdGEgKDAgfiAzKS4KICogICAgICB2aWROUmF0ZUxpbWl0IC0gYnlwYXNzIHJhdGUgaW5ncmVzcyBhbmQgZWdyZXNzIGxpbWl0aW5nCiAqCiAqICBDb21tZW50OgogKiAgICAgIFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCB0byBmaW5kIG91dCBpZiB0aGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgogKiAgICAgICAgV2hlbiB0aGlzIHN0cnVjdHVyZSBpcyBpbXBsZW1lbnRlZCwgdGhlIGZvbGxvd2luZ3MgYXJlIHRoZSBkZXZpY2VzIHN1cHBvcnRpbmcKICogICAgICAgIHRoaXMgZmVhdHVyZToKICogICAgICAgICAgICA4OEU2MDY1LCA4OEU2MDM1LCBhbmQgODhFNjA1NSBzdXBwb3J0IGFsbCBkYXRhLgogKiAgICAgICAgICAgIDg4RTYwNjEgYW5kIDg4RTYwMzEgc3VwcG9ydCBvbmx5IHZpZE5SYXRlTGltaXQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICAgICAgdXNlVklERlByaTsKICAgIEdUX1U4ICAgICAgICAgICAgIHZpZEZQcmk7CiAgICBHVF9CT09MICAgICAgICAgICAgdXNlVklEUVByaTsKICAgIEdUX1U4ICAgICAgICAgICAgIHZpZFFQcmk7CiAgICBHVF9CT09MICAgICAgICAgICAgdmlkTlJhdGVMaW1pdDsKfSBHVF9WVFVfRVhUX0lORk87CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9WVFVfRU5UUlkKICoKICogIERlc2NyaXB0aW9uOiBWTEFOIHRhcm5zbGF0b24gdW5pdCBFbnRyeQogKiAgICAgICAgRWFjaCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGlzIGRldmljZSBzcGVjaWZpYywgaS5lLiwgc29tZSBmaWVsZHMgbWF5IG5vdAogKiAgICAgICAgYmUgc3VwcG9ydGVkIGJ5IHRoZSB1c2VkIHN3aXRjaCBkZXZpY2UuIEluIHN1Y2ggY2FzZSwgdGhvc2UgZmllbGRzIGFyZQogKiAgICAgICAgaWdub3JlZCBieSB0aGUgRFNEVCBkcml2ZXIuIFBsZWFzZSByZWZlciB0byB0aGUgZGF0YXNoZWV0IGZvciB0aGUgbGlzdCBvZgogKiAgICAgICAgc3VwcG9ydGVkIGZpZWxkcy4KICoKICogIEZpZWxkczoKICogICAgICBEQk51bSAgICAgIC0gZGF0YWJhc2UgbnVtYmVyIG9yIEZJRCAoZm9yd2FyZGluZyBpbmZvcm1hdGlvbiBkYXRhYmFzZSkKICogICAgICB2aWQgICAgICAgIC0gVkxBTiBJRAogKiAgICAgIHZ0dURhdGEgICAgLSBWVFUgZGF0YQogKiAgICAgICAgdmlkUHJpT3ZlcnJpZGUgLSBvdmVycmlkZSB0aGUgcHJpb3JpdHkgb24gYW55IGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZJRAogKiAgICAgICAgdmlkUHJpb3JpdHkgLSBWSUQgUHJpb3JpdHkgYml0cyAoMCB+IDcpCiAqICAgICAgICBzaWQgICAgICAgICAgIC0gODAyLjFzIFBvcnQgU3RhdGUgRGF0YWJhc2UgSUQKICogICAgICAgIHZpZFBvbGljeSAgLSBpbmRpY2F0ZSB0aGF0IHRoZSBmcmFtZSB3aXRoIHRoaXMgVklEIHVzZXMgVklEIFBvbGljeQogKiAgICAgICAgICAgICAgICAgICAgIChzZWUgZ3BydFNldFBvbGljeSBBUEkpLgogKiAgICAgICAgdmlkRXhJbmZvICAtIGV4dGFuZGVkIGluZm9ybWF0aW9uIGZvciBWVFUgZW50cnkuIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZXh0YW5kZWQKICogICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiwgdmlkUHJpb3JpdHlPdmVycmlkZSBhbmQgdmlkUHJpb3JpdHkgdmFsdWVzIGFyZQogKiAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgICAgICAgIERCTnVtOwogICAgR1RfVTE2ICAgICAgICB2aWQ7CiAgICBHVF9WVFVfREFUQSAgIHZ0dURhdGE7CiAgICBHVF9CT09MICAgICAgICAgIHZpZFByaU92ZXJyaWRlOwogICAgR1RfVTggICAgICAgICAgdmlkUHJpb3JpdHk7CiAgICBHVF9VOCAgICAgICAgICBzaWQ7CiAgICBHVF9CT09MICAgICAgICAgIHZpZFBvbGljeTsKICAgIEdUX1ZUVV9FWFRfSU5GTyAgICB2aWRFeEluZm87Cn0gR1RfVlRVX0VOVFJZOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfU1RVX09QRVJBUklPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgU1RVIG9wZXJhdGlvbnMKICoKICogRmllbGRzOgogKiAgICAgIExPQURfUFVSR0VfU1RVX0VOVFJZICAgIC0gTG9hZCAvIFB1cmdlIGVudHJ5LgogKiAgICAgIEdFVF9ORVhUX1NUVV9FTlRSWSAgICAgIC0gR2V0IG5leHQgU1RVICBlbnRyeS4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBMT0FEX1BVUkdFX1NUVV9FTlRSWSA9IDUsCiAgICBHRVRfTkVYVF9TVFVfRU5UUlkgPTYKfSBHVF9TVFVfT1BFUkFUSU9OOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfU1RVX0VOVFJZCiAqCiAqICBEZXNjcmlwdGlvbjogODAyLjFzIFBvcnQgU3RhdGUgSW5mb3JtYXRpb24gRGF0YWJhc2UgKFNUVSkgRW50cnkKICoKICogIEZpZWxkczoKICogICAgICBzaWQgICAgICAgLSBTVFUgSUQKICogICAgICAgIHBvcnRTdGF0ZSAtIFBlciBWTEFOIFBvcnQgU3RhdGVzIGZvciBlYWNoIHBvcnQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgICAgICAgICAgICAgICAgc2lkOwogICAgR1RfUE9SVF9TVFBfU1RBVEUgICAgcG9ydFN0YXRlW01BWF9TV0lUQ0hfUE9SVFNdOwp9IEdUX1NUVV9FTlRSWTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1ZUVV9JTlRfU1RBVFVTCiAqCiAqICBEZXNjcmlwdGlvbjogVkxBTiB0YXJuc2xhdG9uIHVuaXQgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGludENhdXNlICAtIFZUVSBJbnRlcnJ1cHQgQ2F1c2UKICogICAgICAgICAgICAgICAgICAgIEdUX1ZUVV9GVUxMX1ZJT0xBVElPTixHVF9NRU1FQkVSX1ZJT0xBVElPTixvcgogKiAgICAgICAgICAgICAgICAgICAgR1RfTUlTU19WSU9MQVRJT04KICogICAgICBTUElEICAgICAgLSBzb3VyY2UgcG9ydCBudW1iZXIKICogICAgICAgICAgICAgICAgICAgICBpZiBpbnRDYXVzZSBpcyBHVF9WVFVfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICogICAgICB2aWQgICAgICAgLSBWTEFOIElECiAqICAgICAgICAgICAgICAgICAgICAgaWYgaW50Q2F1c2UgaXMgR1RfVlRVX0ZVTExfVklPTEFUSU9OLCBpdCBtZWFucyBub3RoaW5nCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgICB2dHVJbnRDYXVzZTsKICAgIEdUX1U4ICAgIHNwaWQ7CiAgICBHVF9VMTYgICB2aWQ7Cn0gR1RfVlRVX0lOVF9TVEFUVVM7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0FUVV9JTlRfU1RBVFVTCiAqCiAqICBEZXNjcmlwdGlvbjogVkxBTiB0YXJuc2xhdG9uIHVuaXQgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGludENhdXNlICAtIEFUVSBJbnRlcnJ1cHQgQ2F1c2UKICogICAgICAgICAgICAgICAgICAgIEdUX0ZVTExfVklPTEFUSU9OLEdUX01FTUVCRVJfVklPTEFUSU9OLAogKiAgICAgICAgICAgICAgICAgICAgR1RfTUlTU19WSU9MQVRJT04sIEdUX0FHRV9WSU9MQVRJT04sIG9yCiAqICAgICAgICAgICAgICAgICAgICBHVF9BR0VfT1VUX1ZJT0xBVElPTgogKiAgICAgIFNQSUQgICAgICAtIHNvdXJjZSBwb3J0IG51bWJlcgogKiAgICAgICAgICAgICAgICAgICAgIGlmIGludENhdXNlIGlzIEdUX0ZVTExfVklPTEFUSU9OLCBpdCBtZWFucyBub3RoaW5nCiAqICAgICAgREJOdW0gICAgIC0gREIgTnVtIChvciBGSUQpCiAqICAgICAgICAgICAgICAgICAgICAgaWYgaW50Q2F1c2UgaXMgR1RfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICogICAgICAgIG1hY0FkZHIgICAgICAtIE1BQyBBZGRyZXNzCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgICBhdHVJbnRDYXVzZTsKICAgIEdUX1U4ICAgIHNwaWQ7CiAgICBHVF9VOCAgICBkYk51bTsKICAgIEdUX0VUSEVSQUREUiAgbWFjQWRkcjsKfSBHVF9BVFVfSU5UX1NUQVRVUzsKCi8qCiogRGVmaW5pdGlvbiBmb3IgVlRVIGludGVycnVwdAoqLwojZGVmaW5lIEdUX01FTUJFUl9WSU9MQVRJT04gICAgICAgIDB4NAojZGVmaW5lIEdUX01JU1NfVklPTEFUSU9OICAgICAgICAweDIKI2RlZmluZSBHVF9WVFVfRlVMTF9WSU9MQVRJT04gICAgMHgxCi8qCiogRGVmaW5pdGlvbnMgZm9yIEFUVSBpbnRlcnJ1cHQgaW4gR2lnYWJpdCBzd2l0Y2ggYXJlIHRoZSBzYW1lIGFzCiogdGhlIG9uZXMgZm9yIFZUVSBpbnRlcnJ1cHQuIEhlcmUgd2UganVzdCByZWRlZmluZSB0aGUgRlVMTF9WSU9MQVRJT04gZm9yCiogYm90aCBWVFUgYW5kIEFUVS4KKi8KI2RlZmluZSBHVF9GVUxMX1ZJT0xBVElPTiAgICAgICAgMHgxCgojZGVmaW5lIEdUX0FHRV9WSU9MQVRJT04gICAgICAgIDB4OAojZGVmaW5lIEdUX0FHRV9PVVRfVklPTEFUSU9OICAgIDB4MTAKCgovKgoKICAqIFR5cGVkZWY6IGVudW0gR1RfUFZUX09QRVJBVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFZUIChDcm9zcyBDaGlwIFBvcnQgVkxBTiBUYWJsZSkgT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBWVF9JTklUSUFMSVpFIC0gSW5pdGlhbGl6ZSBhbGwgcmVzb3VyY2VzIHRvIHRoZSBpbml0YWwgc3RhdGUKICogICAgICBQVlRfV1JJVEUgICAgICAtIFdyaXRlIHRvIHRoZSBzZWxlY3RlZCBQVlQgZW50cnkKICogICAgICBQVlRfUkVBRCAgICAgICAtIFJlYWQgZnJvbSB0aGUgc2VsZWN0ZWQgUFZUIGVudHJ5CiAqLwp0eXBlZGVmIGVudW0KewogICAgUFZUX0lOSVRJQUxJWkUgICAgID0gMHgxLAogICAgUFZUX1dSSVRFICAgICAgICA9IDB4MywKICAgIFBWVF9SRUFEICAgICAgICA9IDB4NAp9IEdUX1BWVF9PUEVSQVRJT047CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVlRfT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgUFZUIChDcm9zcyBDaGlwIFBvcnQgVkxBTiBUYWJsZSkgT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHZ0QWRkciAtIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZW50cnkgb2YgUFZUCiAqICAgICAgcHZ0RGF0YSAtIENyb3NzIENoaXAgUG9ydCBWTEFOIGRhdGEgZm9yIHRoZSBlbnRyeSBwb2ludGVkIGJ5IHB2dEFkZHIKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBwdnRBZGRyOwogICAgR1RfVTMyICAgIHB2dERhdGE7Cn0gR1RfUFZUX09QX0RBVEE7CgoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUElSTF9GQ19ERUFTU0VSVAogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSBvbiBQSVJMLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfRU1QVFkgLQogKiAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyBiZWNvbWUgZW1wdHkKICogICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICogICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgZW5vdWdoIHJvb20gYXMKICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBDQlNMaW1pdC4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZID0gMCwKICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUCn0gR1RfUElSTF9GQ19ERUFTU0VSVDsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9QSVJMX0VMSU1JVF9NT0RFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgZWdyZXNzIHJhdGUgbGltaXQgY291bnRpbmcgbW9kZS4KICoKICogIEVudW1lcmF0aW9uczoKICogICAgICBHVF9QSVJMX0VMSU1JVF9GUkFNRSAtCiAqICAgICAgICAgICAgICAgIENvdW50IHRoZSBudW1iZXIgb2YgZnJhbWVzCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIxIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDEgYnl0ZXM6CiAqICAgICAgICAgICAgICAgIFByZWFtYmxlICg4Ynl0ZXMpICsgRnJhbWUncyBEQSB0byBDUkMgKyBJRkcgKDEyYnl0ZXMpCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIyIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDIgYnl0ZXM6IEZyYW1lJ3MgREEgdG8gQ1JDCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIzIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDMgYnl0ZXM6CiAqICAgICAgICAgICAgICAgIEZyYW1lJ3MgREEgdG8gQ1JDIC0gMTggLSA0IChpZiBmcmFtZSBpcyB0YWdnZWQpCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUElSTF9FTElNSVRfRlJBTUUgPSAwLAogICAgR1RfUElSTF9FTElNSVRfTEFZRVIxLAogICAgR1RfUElSTF9FTElNSVRfTEFZRVIyLAogICAgR1RfUElSTF9FTElNSVRfTEFZRVIzCn0gR1RfUElSTF9FTElNSVRfTU9ERTsKCgovKiB0eXBlZGVmOiBlbnVtIEdUX1JBVEVfTElNSVRfTU9ERQogKiBUaGUgaW5ncmVzcyBsaW1pdCBtb2RlIGluIHRoZSByYXRlIGNvbnRyb2wgcmVnaXN0ZXIgKDB4QSkKICovCgp0eXBlZGVmIGVudW0KewogICAgR1RfTElNVF9BTEwgPSAwLCAgICAgICAgIC8qIGxpbWl0IGFuZCBjb3VudCBhbGwgZnJhbWVzICovCiAgICBHVF9MSU1JVF9GTE9PRCwgICAgICAgICAgLyogbGltaXQgYW5kIGNvdW50IEJyb2FkY2FzdCwgTXVsdGljYXN0IGFuZCBmbG9vZGVkIHVuaWNhc3QgZnJhbWVzICovCiAgICBHVF9MSU1JVF9CUkRDU1RfTUxUQ1NULCAgICAvKiBsaW1pdCBhbmQgY291bnQgQnJvYWRjYXN0IGFuZCBNdWx0aWNhc3QgZnJhbWVzICovCiAgICBHVF9MSU1JVF9CUkRDU1QgICAgICAgICAgIC8qIGxpbWl0IGFuZCBjb3VudCBCcm9hZGNhc3QgZnJhbWVzICovCn0gR1RfUkFURV9MSU1JVF9NT0RFOwoKLyogdHlwZWRlZjogZW51bSBHVF9QUkkwX1JBVEUKICogVGhlIGluZ3Jlc3MgZGF0YSByYXRlIGxpbWl0IGZvciBwcmlvcml0eSAwIGZyYW1lcwogKi8KCnR5cGVkZWYgZW51bQp7CiAgICBHVF9OT19MSU1JVCA9IDAsICAgICAvKiBOb3QgbGltaXRlZCAgICovCiAgICBHVF8xMjhLLCAgICAgICAgICAgICAgLyogMTI4SyBiaXRzL3NlYyAqLwogICAgR1RfMjU2SywgICAgICAgICAgICAgIC8qIDI1NksgYml0cy9zZWMgKi8KICAgIEdUXzUxMkssICAgICAgICAgICAgICAvKiA1MTIgYml0cy9zZWMgKi8KICAgIEdUXzFNLCAgICAgICAgICAgICAgLyogMU0gIGJpdHMvc2VjICovCiAgICBHVF8yTSwgICAgICAgICAgICAgIC8qIDJNICBiaXRzL3NlYyAqLwogICAgR1RfNE0sICAgICAgICAgICAgICAvKiA0TSAgYml0cy9zZWMgKi8KICAgIEdUXzhNLCAgICAgICAgICAgICAgLyogOE0gIGJpdHMvc2VjICovCiAgICBHVF8xNk0sICAgICAgICAgICAgICAvKiAxNk0gIGJpdHMvc2VjLCBOb3RlOiBzdXBwb3J0ZWQgb25seSBieSBHaWdhYml0IEV0aGVybmV0IFN3aXRjaCAqLwogICAgR1RfMzJNLCAgICAgICAgICAgICAgLyogMzJNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KICAgIEdUXzY0TSwgICAgICAgICAgICAgIC8qIDY0TSAgYml0cy9zZWMsIE5vdGU6IHN1cHBvcnRlZCBvbmx5IGJ5IEdpZ2FiaXQgRXRoZXJuZXQgU3dpdGNoICovCiAgICBHVF8xMjhNLCAgICAgICAgICAgICAgLyogMTI4TSAgYml0cy9zZWMsIE5vdGU6IHN1cHBvcnRlZCBvbmx5IGJ5IEdpZ2FiaXQgRXRoZXJuZXQgU3dpdGNoICovCiAgICBHVF8yNTZNICAgICAgICAgICAgICAvKiAyNTZNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KfSBHVF9QUkkwX1JBVEUsR1RfRUdSRVNTX1JBVEU7CgoKLyoKICogVHlwZWRlZjogdW5pb24gR1RfRVJBVEVfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRWdyZXNzIFJhdGUKICoKICogRmllbGRzOgogKiAgICAgIGRlZmluZWRSYXRlIC0gR1RfRUdSRVNTX1JBVEUgZW51bSB0eXBlIHNob3VsZCBiZSB1c2VkIG9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICA4OEU2MjE4LCA4OEU2MzE4LCA4OEU2MDYzLCA4OEU2MDgzLCA4OEU2MTgxLCA4OEU2MTgzLCA4OEU2MDkzCiAqICAgICAgICAgICAgICAgICAgICAgICAgODhFNjA5NSwgODhFNjE4NSwgODhFNjEwOCwgODhFNjA2NSwgODhFNjA2MSwgYW5kIHRoZWlyIHZhcmlhdGlvbnMuCiAqICAgICAga2JSYXRlICAgICAgLSByYXRlIGluIGticHMgdGhhdCBzaG91bGQgYmUgdXNlZCBvbiB0aGUgZm9sbG93aW5nIGRldmljZXM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgODhFNjA5NywgODhFNjA5NiB3aXRoIGNvdW50IG1vZGUgb2Ygbm9uIGZyYW1lLCBzdWNoIGFzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBWUVSMSwgQUxMX0xBWUVSMiwgYW5kIEFMTF9MQVlFUjMKICogICAgICAgICAgICAgICAgICAgICAgICA2NGticHMgfiAxTWJwcyAgICA6IGluY3JlbWVudHMgb2YgNjRrYnBzLAogKiAgICAgICAgICAgICAgICAgICAgICAgIDFNYnBzIH4gMTAwTWJwcyAgIDogaW5jcmVtZW50cyBvZiAxTWJwcywgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgMTAwTWJwcyB+IDEwMDBNYnBzOiBpbmNyZW1lbnRzIG9mIDEwTWJwcwogKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHZhbGlkIHZhbHVlcyBhcmU6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LCAxMjgsIDE5MiwgMjU2LCAzMjAsIDM4NCwuLi4sIDk2MCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgLi4uLCAxMDAwMDAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDAwMCwgMTIwMDAwLCAxMzAwMDAsIC4uLiwgMTAwMDAwMC4KICogICAgICBmUmF0ZSAgICAgICAgIC0gZnJhbWUgcGVyIHNlY29uZCB0aGF0IHNob3VsZCBiZSB1c2VkIG9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICA4OEU2MDk3LCA4OEU2MDk2IHdpdGggY291bnQgbW9kZSBvZiBmcmFtZSAoR1RfUElSTF9DT1VOVF9GUkFNRSkKICovCnR5cGVkZWYgdW5pb24KewogICAgR1RfRUdSRVNTX1JBVEUgICAgZGVmaW5lZFJhdGU7CiAgICBHVF9VMzIgICAgICAgICAgICBrYlJhdGU7CiAgICBHVF9VMzIgICAgICAgICAgICBmUmF0ZTsKfSBHVF9FUkFURV9UWVBFOwoKLyoKICogRm9ybXVsYSBmb3IgUmF0ZSBMaW1pdCBvZiBHaWdhYml0IFN3aXRjaCBmYW1pbHkgYW5kIEVuaGFuY2VkIEZhc3RFdGhlcm5ldCBTd2l0Y2gKICovCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVQoX2ticHMpICAgIFwKICAgICAgICAoKF9rYnBzKT8oODAwMDAwMCAvICgyOCAqIChfa2JwcykpKTowKQojZGVmaW5lIEdUX0dFVF9SQVRFX0xJTUlUMihfa2JwcykgICAgXAogICAgICAgICgoX2ticHMpPyg4MDAwMDAwIC8gKDMyICogKF9rYnBzKSkgKyAoODAwMDAwMCAlICgzMiAqIChfa2JwcykpPzE6MCkpOjApCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVQzKF9rYnBzKSAgICBcCiAgICAgICAgKChfa2Jwcyk/KDgwMDAwMDAgLyAoNDAgKiAoX2ticHMpKSArICg4MDAwMDAwICUgKDQwICogKF9rYnBzKSk/MTowKSk6MCkKCiNkZWZpbmUgTUFYX1JBVEVfTElNSVQgICAgICAgIDI1NjAwMCAgICAvKiB1bml0IG9mIEticHMgKi8KI2RlZmluZSBNSU5fUkFURV9MSU1JVCAgICAgICAgNjUgICAgICAgIC8qIHVuaXQgb2YgS2JwcyAqLwoKCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVRfUEVSX0ZSQU1FKF9mcmFtZXMsIF9kZWMpICAgIFwKICAgICAgICAoKF9mcmFtZXMpPygxMDAwMDAwMDAwIC8gKDMyICogKF9mcmFtZXMpKSArICgxMDAwMDAwMDAwICUgKDMyICogKF9mcmFtZXMpKT8xOjApKTowKQoKI2RlZmluZSBHVF9HRVRfUkFURV9MSU1JVF9QRVJfQllURShfa2JwcywgX2RlYykgICAgXAogICAgICAgICgoX2ticHMpPygoODAwMDAwMCooX2RlYykpIC8gKDMyICogKF9rYnBzKSkgKyAoKDgwMDAwMDAqKF9kZWMpKSAlICgzMiAqIChfa2JwcykpPzE6MCkpOjApCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0JVUlNUX1NJWkUKICogVGhlIGluZ3Jlc3MgZGF0YSByYXRlIGxpbWl0IGJ1cnN0IHNpemUgd2luZG93cyBzZWxlY3Rpb24KICovCgp0eXBlZGVmIGVudW0KewogICAgR1RfQlVSU1RfU0laRV8xMksgPSAwLCAgICAgLyogMTJLIGJ5dGUgYnVyc3Qgc2l6ZSAqLwogICAgR1RfQlVSU1RfU0laRV8yNEssICAgICAgICAvKiAyNEsgYnl0ZSBidXJzdCBzaXplICovCiAgICBHVF9CVVJTVF9TSVpFXzQ4SywgICAgICAgIC8qIDQ4SyBieXRlIGJ1cnN0IHNpemUgKi8KICAgIEdUX0JVUlNUX1NJWkVfOTZLICAgICAgICAgIC8qIDk2SyBieXRlIGJ1cnN0IHNpemUgKi8KfSBHVF9CVVJTVF9TSVpFOwoKLyoKICogdHlwZWRlZjogZW51bSBHVF9CVVJTVF9SQVRFCiAqIFRoZSBpbmdyZXNzIGRhdGEgcmF0ZSBsaW1pdCBiYXNlZCBvbiBidXJzdCBzaXplCiAqLwoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0JVUlNUX05PX0xJTUlUID0gMCwgICAgIC8qIE5vdCBsaW1pdGVkICAgKi8KICAgIEdUX0JVUlNUXzY0SywgICAgICAgICAgLyogNjRLIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF8xMjhLLCAgICAgIC8qIDEyOEsgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzI1NkssICAgICAgLyogMjU2SyBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMzg0SywgICAgICAvKiAzODRLIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF81MTJLLCAgICAgIC8qIDUxMiBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfNjQwSywgICAgICAvKiA2NDBLIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF83NjhLLCAgICAgIC8qIDc2OEsgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzg5NkssICAgICAgLyogODk2SyBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMU0sICAgICAgICAvKiAxTSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzE1MDBLLCAgICAgIC8qIDEuNU0gYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzJNLCAgICAgICAgLyogMk0gIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF80TSwgICAgICAgIC8qIDRNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfOE0sICAgICAgICAgICAvKiA4TSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzE2TSwgICAgICAgICAgLyogMTZNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMzJNLCAgICAgICAgICAvKiAzMk0gIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF82NE0sICAgICAgICAgIC8qIDY0TSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzEyOE0sICAgICAgICAgLyogMTI4TSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzI1Nk0gICAgICAgICAgLyogMjU2TSAgYml0cy9zZWMgKi8KfSBHVF9CVVJTVF9SQVRFOwoKLyoKICogRm9ybXVsYSBmb3IgYnVyc3QgYmFzZWQgUmF0ZSBMaW1pdAogKi8KI2RlZmluZSBHVF9HRVRfQlVSU1RfUkFURV9MSU1JVChfYnNpemUsX2ticHMpICAgIFwKICAgICAgICAoKF9rYnBzKT8oKChfYnNpemUpKzEpKjgwMDAwMDAgLyAoMzIgKiAoX2ticHMpKSArICAgICAgICAgXAogICAgICAgICAgICAgICAgKCgoX2JzaXplKSsxKSo4MDAwMDAwICUgKDMyICogKF9rYnBzKSk/MTowKSkgICAgXAogICAgICAgICAgICAgICAgOjApCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BJUkxfT1BFUkFUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQSVJMIChQb3J0IEluZ3Jlc3MgUmF0ZSBMaW1pdCkgT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBJUkxfSU5JVF9BTExfUkVTT1VSQ0UgLSBJbml0aWFsaXplIGFsbCByZXNvdXJjZXMgdG8gdGhlIGluaXRhbCBzdGF0ZQogKiAgICAgIFBJUkxfSU5JVF9SRVNPVVJDRSAgICAgLSBJbml0aWFsaXplIHNlbGVjdGVkIHJlc291cmNlcyB0byB0aGUgaW5pdGFsIHN0YXRlCiAqICAgICAgUElSTF9XUklURV9SRVNPVVJDRSAgICAtIFdyaXRlIHRvIHRoZSBzZWxlY3RlZCByZXNvdXJjZS9yZWdpc3RlcgogKiAgICAgIFBJUkxfUkVBRF9SRVNPVVJDRSAgICAgLSBSZWFkIGZyb20gdGhlIHNlbGVjdGVkIHJlc291cmNlL3JlZ2lzdGVyCiAqLwp0eXBlZGVmIGVudW0KewogICAgUElSTF9JTklUX0FMTF9SRVNPVVJDRSAgICAgPSAweDEsCiAgICBQSVJMX0lOSVRfUkVTT1VSQ0UgICAgICAgID0gMHgyLAogICAgUElSTF9XUklURV9SRVNPVVJDRSAgICAgICAgPSAweDMsCiAgICBQSVJMX1JFQURfUkVTT1VSQ0UgICAgICAgID0gMHg0Cn0gR1RfUElSTF9PUEVSQVRJT04sIEdUX1BJUkwyX09QRVJBVElPTjsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkxfT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgUElSTCBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICBpcmxVbml0ICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgVW5pdCB0aGF0IGRlZmluZXMgb25lIG9mIElSTCByZXNvdXJjZXMuCiAqICAgICAgaXJsUmVnICAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IFJlZ2lzdGVyLgogKiAgICAgIGlybERhdGEgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBEYXRhLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIGlybFVuaXQ7CiAgICBHVF9VMzIgICAgaXJsUmVnOwogICAgR1RfVTMyICAgIGlybERhdGE7Cn0gR1RfUElSTF9PUF9EQVRBOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMMl9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBQSVJMIE9wZXJhdGlvbgogKgogKiAgRmllbGRzOgogKiAgICAgIGlybFBvcnQgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdGluZyBwb3J0IChwaHlzaWNhbCBwb3J0IG51bWJlcikuCiAqICAgICAgaXJsUmVzICAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IFJlc291cmNlLgogKiAgICAgIGlybFJlZyAgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBSZWdpc3Rlci4KICogICAgICBpcmxEYXRhICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgRGF0YS4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBpcmxQb3J0OwogICAgR1RfVTMyICAgIGlybFJlczsKICAgIEdUX1UzMiAgICBpcmxSZWc7CiAgICBHVF9VMzIgICAgaXJsRGF0YTsKfSBHVF9QSVJMMl9PUF9EQVRBOwoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QSVJMX0FDVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgQWN0aW9uIHRoYXQgc2hvdWxkIGJlIHRha2VuIHdoZW4KICogICAgICAgIHRoZXJlIHRoZXJlIGFyZSBub3QgZW5vdWdoIHRva2VucyB0byBhY2NlcHQgdGhlIGVudGlyZSBpbmNvbWluZyBmcmFtZQogKgogKiBGaWVsZHM6CiAqICAgICAgICBQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqICAgICAgICBQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIEVTQiBMaW1pdCBBY3Rpb24KICovCnR5cGVkZWYgZW51bQp7CiAgICBQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OID0gMHgwLAogICAgUElSTF9BQ1RJT05fQUNDRVBUICAgICA9IDB4MQp9IEdUX1BJUkxfQUNUSU9OOwoKLyoKICogVHlwZWRlZjogZW51bSBHVF9FU0JfTElNSVRfQUNUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBFU0IgTGltaXQgQWN0aW9uIHRoYXQgc2hvdWxkIGJlIHRha2VuIHdoZW4KICogICAgICAgIHRoZSBpbmNvbWluZyBwb3J0IGluZm9ybWF0aW9uIHJhdGUgZXhjZWVkcyB0aGUgRUJTX0xpbWl0LgogKgogKiBGaWVsZHM6CiAqICAgICAgICBFU0JfTElNSVRfQUNUSU9OX0RST1AgLSBkcm9wIHBhY2tldHMKICogICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRkMgICAtIHNlbmQgZmxvdyBjb250cm9sIHBhY2tldAogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAgICAgPSAweDAsCiAgICBFU0JfTElNSVRfQUNUSU9OX0ZDICAgICAgICA9IDB4MQp9IEdUX0VTQl9MSU1JVF9BQ1RJT047CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9CVUNLRVRfUkFURV9UWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBCdWNrZXQgUmF0ZSBUeXBlCiAqCiAqIEZpZWxkczoKICogICAgICAgIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQgICAgLSBidWNrZXQgaXMgdHJhZmZpYyB0eXBlIGJhc2VkCiAqICAgICAgICBCVUNLRVRfVFlQRV9SQVRFX0JBU0VEICAgICAgICAtIGJ1Y2tldCBpcyByYXRlIGJhc2VkCiAqLwp0eXBlZGVmIGVudW0KewogICAgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRCAgICA9IDB4MCwKICAgIEJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQgICAgICAgID0gMHgxCn0gR1RfQlVDS0VUX1JBVEVfVFlQRTsKCi8qCiAqIERlZmluaXRpb24gZm9yIEdUX0JVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFRyYWZmaWMgVHlwZSB0aGF0IGlzIHVzZWQgd2hlbiBCdWNrZXQgUmF0ZSBUeXBlCiAqICAgICAgICBpcyB0cmFmZmljIHR5cGUgYmFzZWQgKEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQpLgogKiAgICAgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGluIG9yZGVyIHRvIGNoZWNrIHdoaWNoIHRyYWZmaWMKICogICAgICAgIHR5cGVzIGFyZSBzdXBwb3J0ZWQuCiAqCiAqIERlZmluaXRpb246CiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX1VOSUNBU1QgICAgLSB1bmtub3duIHVuaWNhc3QgZnJhbWUKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNULSB1bmtub3duIG11bHRpY2FzdCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNUICAgICAgICAtIGJyb2FkY2FzdCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNUICAgICAgICAtIG11bHRpY2FzdCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCAgICAgICAgICAgIC0gdW5pY2FzdCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSAgICAgICAgLSBtYW5hZ2VtZW50IGZyYW1lCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19BUlAgICAgICAgICAgICAgICAgLSBhcnAgZnJhbWUKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX1RDUF9EQVRBICAgICAgICAgICAgLSBUQ1AgRGF0YQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfVENQX0NUUkwgICAgICAgICAgICAtIFRDUCBDdHJsIChpZiBhbnkgb2YgdGhlIFRDUCBGbGFnc1s1OjBdIGFyZSBzZXQpCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19VRFAgICAgICAgICAgICAgICAgLSBVRFAKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX05PTl9UQ1BVRFAgICAgICAgIC0gY292ZXJzIElHTVAsSUNNUCxHUkUsSUdSUCxMMlRQCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19JTVMgICAgICAgICAgICAgICAgLSBJbmdyZXNzIE1vbml0b3IgU291cmNlCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19QT0xJQ1lfTUlSUk9SICAgIC0gUG9saWN5IE1pcnJvcgogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfUExJQ1lfVFJBUCAgICAgICAgLSBQb2xpY3kgVHJhcAogKi8KI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX1VOSUNBU1QgICAgICAweDAxCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QgICAgMHgwMgojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX0JST0FEQ0FTVCAgICAgICAgICAgIDB4MDQKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QgICAgICAgICAgICAweDA4CiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCAgICAgICAgICAgICAgICAweDEwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSAgICAgICAgICAgIDB4MjAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19BUlAgICAgICAgICAgICAgICAgICAgIDB4NDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19UQ1BfREFUQSAgICAgICAgICAgICAgICAweDEwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1RDUF9DVFJMICAgICAgICAgICAgICAgIDB4MjAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVURQICAgICAgICAgICAgICAgICAgICAweDQwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX05PTl9UQ1BVRFAgICAgICAgICAgICAweDgwMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX0lNUyAgICAgICAgICAgICAgICAgICAgMHgxMDAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfUE9MSUNZX01JUlJPUiAgICAgICAgMHgyMDAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfUExJQ1lfVFJBUCAgICAgICAgICAgIDB4NDAwMAoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUElSTF9DT1VOVF9NT0RFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgZWdyZXNzIHJhdGUgbGltaXQgY291bnRpbmcgbW9kZS4KICoKICogIEVudW1lcmF0aW9uczoKICogICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjEgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMSBieXRlczoKICogICAgICAgICAgICAgICAgUHJlYW1ibGUgKDhieXRlcykgKyBGcmFtZSdzIERBIHRvIENSQyArIElGRyAoMTJieXRlcykKICogICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjIgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMiBieXRlczogRnJhbWUncyBEQSB0byBDUkMKICogICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjMgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMyBieXRlczoKICogICAgICAgICAgICAgICAgRnJhbWUncyBEQSB0byBDUkMgLSAxOCAtIDQgKGlmIGZyYW1lIGlzIHRhZ2dlZCkKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjEgPSAwLAogICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIyLAogICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIzCn0gR1RfUElSTF9DT1VOVF9NT0RFOwoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUElSTDJfQ09VTlRfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGVncmVzcyByYXRlIGxpbWl0IGNvdW50aW5nIG1vZGUuCiAqCiAqICBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfUElSTDJfQ09VTlRfRlJBTUUgLQogKiAgICAgICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIGZyYW1lcwogKiAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMSBieXRlczoKICogICAgICAgICAgICAgICAgUHJlYW1ibGUgKDhieXRlcykgKyBGcmFtZSdzIERBIHRvIENSQyArIElGRyAoMTJieXRlcykKICogICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIyIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDIgYnl0ZXM6IEZyYW1lJ3MgREEgdG8gQ1JDCiAqICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMyAtCiAqICAgICAgICAgICAgICAgIENvdW50IGFsbCBMYXllciAzIGJ5dGVzOgogKiAgICAgICAgICAgICAgICBGcmFtZSdzIERBIHRvIENSQyAtIDE4IC0gNCAoaWYgZnJhbWUgaXMgdGFnZ2VkKQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BJUkwyX0NPVU5UX0ZSQU1FID0gMCwKICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEsCiAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIyLAogICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMwp9IEdUX1BJUkwyX0NPVU5UX01PREU7CgoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9SRVNPVVJDRQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIFBJUkwgUmVzb3VyY2UKICoKICogIEZpZWxkczoKICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKiAgICAgICAgZWJzTGltaXRBY3Rpb24gIC0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBpbmNvbWluZyByYXRlIGV4Y2VlZHMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlYnNMaW1pdC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoIDAgfiAweEZGRkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCVXJzdCBTaXplIGxpbWl0IChleHBlY3RlZCB0byBiZSAya0J5dGVzKQogKiAgICAgICAgYmt0UmF0ZUZhY3RvciAgIC0gYnVja2V0IHJhdGUgZmFjdG9yID0gYnVja2V0RGVjcmVtZW50L3VwZGF0ZUludGVydmFsLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdXBkYXRlSW50ZXJ2YWwgaW5kaWNhdGVzIHRoZSByYXRlIGF0IHdoaWNoIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCB0b2tlbnMsIG9yIDEvQ0lSLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQ0lSIGlzIHRoZSBjb21taXR0ZWQgaW5mb3JtYXRpb24gcmF0ZSBpbiBrYnBzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0RGVjcmVtZW50IGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHRva2VucyB0aGF0CiAqICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIHJlbW92ZWQgcGVyIGVhY2ggYnVja2V0IGRlY3JlbWVudC4KICogICAgICAgIGJrdEluY3JlbWVudCAgICAtIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBmb3IgZWFjaAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBvZiBwYWNrZXQgaW5mb3JtYXRpb24uCiAqICAgICAgICBia3RSYXRlVHlwZSAgICAgICAgLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICogICAgICAgIGJrdFR5cGVNYXNrICAgICAgICAtIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSwgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19BUlAKICogICAgICAgIGJ5dGVUb2JlQ291bnRlZCAgICAtIGJ5dGVzIHRvIGJlIGNvdW50ZWQgZm9yIGFjY291bnRpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMiwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMwogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudFFDb25mOwogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudEZpbHRlcmVkOwogICAgR1RfRVNCX0xJTUlUX0FDVElPTiBlYnNMaW1pdEFjdGlvbjsKICAgIEdUX1UzMiAgICAgICAgZWJzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGNic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBia3RSYXRlRmFjdG9yOwogICAgR1RfVTMyICAgICAgICBia3RJbmNyZW1lbnQ7CiAgICBHVF9CVUNLRVRfUkFURV9UWVBFICAgIGJrdFJhdGVUeXBlOwogICAgR1RfVTMyICAgICAgICBia3RUeXBlTWFzazsKICAgIEdUX1BJUkxfQ09VTlRfTU9ERSAgICBieXRlVG9iZUNvdW50ZWQ7Cn0gR1RfUElSTF9SRVNPVVJDRTsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVAogKgogKiAgRGVzY3JpcHRpb246IFRoZSBwYXJhbWV0ZXJzIHRoYXQgZGVjaWRlcyBJbmdyZXNzIFJhdGUgTGltaXQgdmFyeSBkZXBlbmRpbmcgb24KICogICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uLiBTaW5jZSBEU0RUIGRyaXZlciBjYW5ub3QgY292ZXIgYWxsIHRoZSBjYXNlcywKICogICAgICAgICAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQgZm9yIHRoZSBjdXN0b20gcGFyYW1ldGVyIHNldHRpbmcuCiAqICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMsIHVzZXIgbWF5IGluZ29yZSB0aGlzIHN0cnVjdHVyZSBieSBzZXR0aW5nCiAqICAgICAgICAgICAgICAgIGlzVmFsaWQgdG8gR1RfRkFMU0UuIElmIEluZ3Jlc3MgUmF0ZSBMaW1pdCBpcyB0b28gbXVjaCBvZmYgZnJvbQogKiAgICAgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgcmF0ZSwgcGxlYXNlIGNvbnRhY3QgRkFFIGFuZCBnZXRzIHRoZSBjb3JyZWN0IGVic0xpbWl0LAogKiAgICAgICAgICAgICAgICBjYnNMaW1pdCxia3RJbmNyZW1lbnQsIGFuZCBia3RSYXRlRmFjdG9yIHZhbHVlIGFuZCB1c2UgdGhpcyBzdHJ1Y3R1cmUKICogICAgICAgICAgICAgICAgdG8gZG8gY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKgogKiAgICAgICAgaXNWYWxpZCAgICAgICAgIC0gSWYgR1RfVFJVRSwgdGhlIHBhcmFtZXJzIGluIHRoaXMgc3RydWN0dXJlIGFyZSB1c2VkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm9ncmFtIFBJUkwgUmVzb3VyY2UncyBSYXRlIExpbWl0LiBBbmQgaW5ncmVzc1JhdGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIEdUX1BJUkxfQlVDS0VUX0RBVEEgc3RydWN0dXJlIGFyZSBpZ25vcmVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgR1RfRkFMU0UsIGluZ3Jlc3NSYXRlIGluIEdUX1BJUkxfQlVDS0VUX0RBVEEgc3RydWN0dXJlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGZvciBSZXNvdXJjZSdzIFJhdGUgTGltaXQuCiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoIDAgfiAweEZGRkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCdXJzdCBTaXplIGxpbWl0IChleHBlY3RlZCB0byBiZSAya0J5dGVzKQogKiAgICAgICAgYmt0SW5jcmVtZW50ICAgIC0gdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlYWNoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIG9mIHBhY2tldCBpbmZvcm1hdGlvbi4KICogICAgICAgIGJrdFJhdGVGYWN0b3IgICAtIGJ1Y2tldCByYXRlIGZhY3RvciA9IGJ1Y2tldERlY3JlbWVudC91cGRhdGVJbnRlcnZhbCwKICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVwZGF0ZUludGVydmFsIGluZGljYXRlcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdG9rZW5zLCBvciAxL0NJUiwKICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIENJUiBpcyB0aGUgY29tbWl0dGVkIGluZm9ybWF0aW9uIHJhdGUgaW4ga2Jwcy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldERlY3JlbWVudCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBiZSByZW1vdmVkIHBlciBlYWNoIGJ1Y2tldCBkZWNyZW1lbnQuCiovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgIGlzVmFsaWQ7CiAgICBHVF9VMzIgICAgICAgIGVic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBjYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgYmt0SW5jcmVtZW50OwogICAgR1RfVTMyICAgICAgICBia3RSYXRlRmFjdG9yOwp9IEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQ7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkxfQlVDS0VUX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTCBCdWNrZXQgcHJvZ3JhbWluZyB0aGF0IGlzIHJlc291cmNlIGJhc2VkCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICBpbmdyZXNzUmF0ZSAgICAgICAtIGNvbW1pdGVkIGluZ3Jlc3MgcmF0ZSBpbiBrYnBzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgNjRrYnBzIH4gMU1icHMgICAgOiBpbmNyZW1lbnRzIG9mIDY0a2JwcywKICogICAgICAgICAgICAgICAgICAgICAgICAgIDFNYnBzIH4gMTAwTWJwcyAgIDogaW5jcmVtZW50cyBvZiAxTWJwcywgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxMDBNYnBzIH4gMjAwTWJwcyA6IGluY3JlbWVudHMgb2YgMTBNYnBzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSB2YWxpZCB2YWx1ZXMgYXJlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsIDEyOCwgMTkyLCAyNTYsIDMyMCwgMzg0LC4uLiwgOTYwLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgLi4uLCAxMDAwMDAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwMDAsIDEyMDAwMCwgMTMwMDAwLCAuLi4sIDIwMDAwMC4KICogICAgICAgIGN1c3RvbVNldHVwICAgICAgIC0gY3VzdG9tIGluZ3Jlc3MgcmF0ZSBwYXJhbWV0ZXIgc2V0dXAuIHBsZWFzZSByZWZlciB0bwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVCBzdHJ1Y3R1cmUuCiAqICAgICAgYWNjb3VudFFDb25mICAgIC0gYWNjb3VudCBkaXNjYXJkZWQgZnJhbWVzIGR1ZSB0byBxdWV1ZSBjb25nZXN0aW9uCiAqICAgICAgYWNjb3VudEZpbHRlcmVkIC0gYWNjb3VudCBmaWx0ZXJlZCBmcmFtZXMKICogICAgICAgIGVzYkxpbWl0QWN0aW9uICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGUgaW5jb21pbmcgcmF0ZSBleGNlZWRzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0JfTElNSVRfQUNUSU9OX0RST1AgLSBkcm9wIHBhY2tldHMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRkMgICAtIHNlbmQgZmxvdyBjb250cm9sIHBhY2tldAogKiAgICAgICAgZmNEZWFzc2VydE1vZGUgICAgLSBwb3J0IGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSB3aGVuIGxpbWl0QWN0aW9uIGlzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gRVNCX0xJTUlUX0FDVElPTl9GQy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGZjRGVhc3NlcnRNb2RlWzBdIGZvciBwb3J0IDAsIGZjRGVhc3NlcnRNb2RlWzFdIGZvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAxLCBldGMuIElmIHBvcnQgeCBkb2VzIG5vdCBzaGFyZSB0aGUgYnVja2V0LAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmNEZWFzc2VydE1vZGVbeF0gZGF0YSB3aWxsIGJlIGlnbm9yZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBlbXB0eS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCByb29tIGFzIHNwZWNpZmllZCBieSB0aGUgQ0JTTGltaXQuCiAqICAgICAgICBia3RSYXRlVHlwZSAgICAgICAgLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICogICAgICAgIGJrdFR5cGVNYXNrICAgICAgICAtIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSwgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19BUlAKICogICAgICAgIGJ5dGVUb2JlQ291bnRlZCAgICAtIGJ5dGVzIHRvIGJlIGNvdW50ZWQgZm9yIGFjY291bnRpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMiwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMwogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgICAgICBpbmdyZXNzUmF0ZTsKICAgIEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQgY3VzdG9tU2V0dXA7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50UUNvbmY7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50RmlsdGVyZWQ7CiAgICBHVF9FU0JfTElNSVRfQUNUSU9OIGVic0xpbWl0QWN0aW9uOwogICAgR1RfUElSTF9GQ19ERUFTU0VSVCBmY0RlYXNzZXJ0TW9kZVtNQVhfU1dJVENIX1BPUlRTXTsKICAgIEdUX0JVQ0tFVF9SQVRFX1RZUEUgICAgYmt0UmF0ZVR5cGU7CiAgICBHVF9VMzIgICAgICAgIGJrdFR5cGVNYXNrOwogICAgR1RfUElSTF9DT1VOVF9NT0RFICAgIGJ5dGVUb2JlQ291bnRlZDsKfSBHVF9QSVJMX0RBVEE7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMMl9SRVNPVVJDRQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIFBJUkwgUmVzb3VyY2UKICoKICogIEZpZWxkczoKICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKiAgICAgIG1nbXROcmxFbiAgICAgICAgIC0gZXhjbHVkZSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gaW5ncmVzcyByYXRlIGxpbWl0aW5nIGNhbGN1bGF0aW9uCiAqICAgICAgc2FOcmxFbiAgICAgICAgIC0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgU0Egb2YgdGhlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqICAgICAgZGFOcmxFbiAgICAgICAgIC0gZXhjbHVkZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbiBpZiB0aGUgREEgb2YgdGhlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBpcyBpbiBBVFUgd2l0aCBFbnRyeVN0YXRlIHRoYXQgaW5kaWNhdGVzIE5vbiBSYXRlIExpbWl0ZWQuCiAqICAgICAgICBzYW1wbGluZ01vZGUgICAgLSBzYW1wbGUgb25lIG91dCBvZiBzbyBtYW55IGZyYW1lcy9ieXRlcyBmb3IgYSBzdHJlYW0gb2YgZnJhbWVzCiAqICAgICAgICBhY3Rpb25Nb2RlICAgICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiAqICAgICAgICBlYnNMaW1pdEFjdGlvbiAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlIGluY29taW5nIHJhdGUgZXhjZWVkcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVic0xpbWl0LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9EUk9QIC0gZHJvcCBwYWNrZXRzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0JfTElNSVRfQUNUSU9OX0ZDICAgLSBzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQKICogICAgICAgIGVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICggMCB+IDB4RkZGRkZGKQogKiAgICAgICAgY2JzTGltaXQgICAgICAgIC0gQ29tbWl0dGVkIEJVcnN0IFNpemUgbGltaXQgKGV4cGVjdGVkIHRvIGJlIDJrQnl0ZXMpCiAqICAgICAgICBia3RSYXRlRmFjdG9yICAgLSBidWNrZXQgcmF0ZSBmYWN0b3IgPSBidWNrZXREZWNyZW1lbnQvdXBkYXRlSW50ZXJ2YWwsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB1cGRhdGVJbnRlcnZhbCBpbmRpY2F0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRva2Vucywgb3IgMS9DSVIsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBDSVIgaXMgdGhlIGNvbW1pdHRlZCBpbmZvcm1hdGlvbiByYXRlIGluIGticHMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXREZWNyZW1lbnQgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQKICogICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gYmUgcmVtb3ZlZCBwZXIgZWFjaCBidWNrZXQgZGVjcmVtZW50LgogKiAgICAgICAgYmt0SW5jcmVtZW50ICAgIC0gdGhlIGFtb3VudCBvZiB0b2tlbnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGZvciBlYWNoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIG9mIHBhY2tldCBpbmZvcm1hdGlvbi4KICogICAgICAgIGZjRGVhc3NlcnRNb2RlICAgIC0gZmxvdyBjb250cm9sIGRlLWFzc2VydGlvbiBtb2RlIHdoZW4gbGltaXRBY3Rpb24gaXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0byBFU0JfTElNSVRfQUNUSU9OX0ZDLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9GQ19ERUFTU0VSVF9FTVBUWSAtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNvbWUgZW1wdHkuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0NCU19MSU1JVCAtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2ggcm9vbSBhcyBzcGVjaWZpZWQgYnkgdGhlIENCU0xpbWl0LgogKiAgICAgICAgYmt0UmF0ZVR5cGUgICAgICAgIC0gYnVja2V0IGlzIGVpdGhlciByYXRlIGJhc2VkIG9yIHRyYWZmaWMgdHlwZSBiYXNlZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQsIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECiAqICAgICAgcHJpT1JwdCAgICAgICAgIC0gZGV0ZXJtaW5lIHRoZSBpbmNvbWluZyBmcmFtZXMgdGhhdCBnZXQgcmF0ZSBsaW1pdGVkIHVzaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfVFJVRSAtIHR5cGVNYXNrIE9SIHByaU1hc2sKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfRkFMU0UgLSB0eXBlTWFzayBBTkQgcHJpTWFzawogKiAgICAgICAgcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqICAgICAgICBia3RUeXBlTWFzayAgICAgICAgLSB1c2VkIGlmIGJrdFJhdGVUeXBlIGlzIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19BUlAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19UQ1BfREFUQSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1RDUF9DVFJMLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVURQLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTk9OX1RDUFVEUCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0lNUywKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1BPTElDWV9NSVJST1IsIGFuZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfUExJQ1lfVFJBUAogKiAgICAgICAgYnl0ZVRvYmVDb3VudGVkICAgIC0gYnl0ZXMgdG8gYmUgY291bnRlZCBmb3IgYWNjb3VudGluZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTDJfQ09VTlRfRlJBTUUsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIxLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMiwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjMKICoKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgIGFjY291bnRRQ29uZjsKICAgIEdUX0JPT0wgICAgICAgIGFjY291bnRGaWx0ZXJlZDsKICAgIEdUX0JPT0wgICAgICAgIG1nbXROcmxFbjsKICAgIEdUX0JPT0wgICAgICAgIHNhTnJsRW47CiAgICBHVF9CT09MICAgICAgICBkYU5ybEVuOwogICAgR1RfQk9PTCAgICAgICAgc2FtcGxpbmdNb2RlOwogICAgR1RfUElSTF9BQ1RJT04gICAgYWN0aW9uTW9kZTsKICAgIEdUX0VTQl9MSU1JVF9BQ1RJT04gZWJzTGltaXRBY3Rpb247CiAgICBHVF9VMzIgICAgICAgIGVic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBjYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgYmt0UmF0ZUZhY3RvcjsKICAgIEdUX1UzMiAgICAgICAgYmt0SW5jcmVtZW50OwogICAgR1RfUElSTF9GQ19ERUFTU0VSVCBmY0RlYXNzZXJ0TW9kZTsKICAgIEdUX0JVQ0tFVF9SQVRFX1RZUEUgICAgYmt0UmF0ZVR5cGU7CiAgICBHVF9CT09MICAgICAgICBwcmlPUnB0OwogICAgR1RfVTMyICAgICAgICBwcmlNYXNrOwogICAgR1RfVTMyICAgICAgICBia3RUeXBlTWFzazsKICAgIEdUX1BJUkwyX0NPVU5UX01PREUgICAgYnl0ZVRvYmVDb3VudGVkOwp9IEdUX1BJUkwyX1JFU09VUkNFOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfQlVDS0VUX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTDIgQnVja2V0IHByb2dyYW1pbmcgdGhhdCBpcyBwb3J0IGJhc2VkLgogKgogKiAgRmllbGRzOgogKiAgICAgICAgaW5ncmVzc1JhdGUgICAgICAgLSBjb21taXRlZCBpbmdyZXNzIHJhdGUgaW4ga2Jwcy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIDY0a2JwcyB+IDFNYnBzICAgIDogaW5jcmVtZW50cyBvZiA2NGticHMsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxTWJwcyB+IDEwME1icHMgICA6IGluY3JlbWVudHMgb2YgMU1icHMsIGFuZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwTWJwcyB+IDIwME1icHMgOiBpbmNyZW1lbnRzIG9mIDEwTWJwcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgdmFsaWQgdmFsdWVzIGFyZToKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LCAxMjgsIDE5MiwgMjU2LCAzMjAsIDM4NCwuLi4sIDk2MCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDIwMDAsIDMwMDAsIDQwMDAsIC4uLiwgMTAwMDAwLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMDAwLCAxMjAwMDAsIDEzMDAwMCwgLi4uLCAyMDAwMDAuCiAqICAgICAgICBjdXN0b21TZXR1cCAgICAgICAtIGN1c3RvbSBpbmdyZXNzIHJhdGUgcGFyYW1ldGVyIHNldHVwLiBwbGVhc2UgcmVmZXIgdG8KICogICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQgc3RydWN0dXJlLgogKiAgICAgIGFjY291bnRRQ29uZiAgICAtIGFjY291bnQgZGlzY2FyZGVkIGZyYW1lcyBkdWUgdG8gcXVldWUgY29uZ2VzdGlvbgogKiAgICAgIGFjY291bnRGaWx0ZXJlZCAtIGFjY291bnQgZmlsdGVyZWQgZnJhbWVzCiAqICAgICAgbWdtdE5ybEVuICAgICAgICAgLSBleGNsdWRlIG1hbmFnZW1lbnQgZnJhbWUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24KICogICAgICBzYU5ybEVuICAgICAgICAgLSBleGNsdWRlIGZyb20gaW5ncmVzcyByYXRlIGxpbWl0aW5nIGNhbGN1bGF0aW9uIGlmIHRoZSBTQSBvZiB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGlzIGluIEFUVSB3aXRoIEVudHJ5U3RhdGUgdGhhdCBpbmRpY2F0ZXMgTm9uIFJhdGUgTGltaXRlZC4KICogICAgICBkYU5ybEVuICAgICAgICAgLSBleGNsdWRlIGZyb20gaW5ncmVzcyByYXRlIGxpbWl0aW5nIGNhbGN1bGF0aW9uIGlmIHRoZSBEQSBvZiB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGlzIGluIEFUVSB3aXRoIEVudHJ5U3RhdGUgdGhhdCBpbmRpY2F0ZXMgTm9uIFJhdGUgTGltaXRlZC4KICogICAgICAgIHNhbXBsaW5nTW9kZSAgICAtIHNhbXBsZSBvbmUgb3V0IG9mIHNvIG1hbnkgZnJhbWVzL2J5dGVzIGZvciBhIHN0cmVhbSBvZiBmcmFtZXMKICogICAgICAgIGFjdGlvbk1vZGUgICAgICAgIC0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZXJlIGFyZSBub3QgZW5vdWdoIHRva2VucwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWNjZXB0IHRoZSBlbnRpcmUgaW5jb21pbmcgZnJhbWUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUkxfQUNUSU9OX0FDQ0VQVCAtIGFjY2VwdCB0aGUgZnJhbWUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUkxfQUNUSU9OX1VTRV9MSU1JVF9BQ1RJT04gLSB1c2UgbGltaXRBY3Rpb24KICogICAgICAgIGVic0xpbWl0QWN0aW9uICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGUgaW5jb21pbmcgcmF0ZSBleGNlZWRzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0JfTElNSVRfQUNUSU9OX0RST1AgLSBkcm9wIHBhY2tldHMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRkMgICAtIHNlbmQgZmxvdyBjb250cm9sIHBhY2tldAogKiAgICAgICAgZmNEZWFzc2VydE1vZGUgICAgLSBmbG93IGNvbnRyb2wgZGUtYXNzZXJ0aW9uIG1vZGUgd2hlbiBsaW1pdEFjdGlvbiBpcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIEVTQl9MSU1JVF9BQ1RJT05fRkMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBlbXB0eS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCByb29tIGFzIHNwZWNpZmllZCBieSB0aGUgQ0JTTGltaXQuCiAqICAgICAgICBia3RSYXRlVHlwZSAgICAgICAgLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICogICAgICBwcmlPUnB0ICAgICAgICAgLSBkZXRlcm1pbmUgdGhlIGluY29taW5nIGZyYW1lcyB0aGF0IGdldCByYXRlIGxpbWl0ZWQgdXNpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW5ncmVzcyByYXRlIHJlc291cmNlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9UUlVFIC0gdHlwZU1hc2sgT1IgcHJpTWFzawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9GQUxTRSAtIHR5cGVNYXNrIEFORCBwcmlNYXNrCiAqICAgICAgICBwcmlNYXNrICAgICAgICAgLSBwcmlvcml0eSBiaXQgbWFzayB0aGF0IGVhY2ggYml0IGluZGljYXRlcyBvbmUgb2YgdGhlIGZvdXIKICogICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIHByaW9yaXRpZXMuIFNldHRpbmcgZWFjaCBvbmUgb2YgdGhlc2UgYml0cyBpbmRpY2F0ZXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHJhdGUgcmVzb3VyY2UgaXMgc2xhdGVkIHRvIGFjY291bnQgZm9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBmcmFtZXMgd2l0aCB0aGUgZW5hYmxlZCBiaXRzJyBwcmlvcml0eS4KICogICAgICAgIGJrdFR5cGVNYXNrICAgICAgICAtIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0FSUCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1RDUF9EQVRBLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVENQX0NUUkwsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VRFAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19OT05fVENQVURQLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfSU1TLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfUE9MSUNZX01JUlJPUiwgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19QTElDWV9UUkFQCiAqICAgICAgICBieXRlVG9iZUNvdW50ZWQgICAgLSBieXRlcyB0byBiZSBjb3VudGVkIGZvciBhY2NvdW50aW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9GUkFNRSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIyLCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMwogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgICAgICBpbmdyZXNzUmF0ZTsKICAgIEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQgY3VzdG9tU2V0dXA7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50UUNvbmY7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50RmlsdGVyZWQ7CiAgICBHVF9CT09MICAgICAgICBtZ210TnJsRW47CiAgICBHVF9CT09MICAgICAgICBzYU5ybEVuOwogICAgR1RfQk9PTCAgICAgICAgZGFOcmxFbjsKICAgIEdUX0JPT0wgICAgICAgIHNhbXBsaW5nTW9kZTsKICAgIEdUX1BJUkxfQUNUSU9OICAgIGFjdGlvbk1vZGU7CiAgICBHVF9FU0JfTElNSVRfQUNUSU9OIGVic0xpbWl0QWN0aW9uOwogICAgR1RfUElSTF9GQ19ERUFTU0VSVCBmY0RlYXNzZXJ0TW9kZTsKICAgIEdUX0JVQ0tFVF9SQVRFX1RZUEUgICAgYmt0UmF0ZVR5cGU7CiAgICBHVF9CT09MICAgICAgICBwcmlPUnB0OwogICAgR1RfVTMyICAgICAgICBwcmlNYXNrOwogICAgR1RfVTMyICAgICAgICBia3RUeXBlTWFzazsKICAgIEdUX1BJUkwyX0NPVU5UX01PREUgICAgYnl0ZVRvYmVDb3VudGVkOwp9IEdUX1BJUkwyX0RBVEE7CgoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9DVVNUT01fVFNNX0NGRwogKgogKiAgRGVzY3JpcHRpb246IFRoZSBwYXJhbWV0ZXJzIHRoYXQgZGVjaWRlcyBJbmdyZXNzIFJhdGUgTGltaXQgZm9yIEFWQiBmcmFtZXMgdmFyeQogKiAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbi4gU2luY2UgRFNEVCBkcml2ZXIgY2Fubm90IGNvdmVyIGFsbCB0aGUgY2FzZXMsCiAqICAgICAgICAgICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIHByb3ZpZGVkIGZvciB0aGUgY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKiAgICAgICAgICAgICAgICBIb3dldmVyLCBpbiBtb3N0IGNhc2VzLCB1c2VyIG1heSBpbmdvcmUgdGhpcyBzdHJ1Y3R1cmUgYnkgc2V0dGluZwogKiAgICAgICAgICAgICAgICBpc1ZhbGlkIHRvIEdUX0ZBTFNFLiBJZiBJbmdyZXNzIFJhdGUgTGltaXQgaXMgdG9vIG11Y2ggb2ZmIGZyb20KICogICAgICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHJhdGUsIHBsZWFzZSBjb250YWN0IEZBRSBhbmQgZ2V0cyB0aGUgY29ycmVjdCBlYnNMaW1pdCwKICogICAgICAgICAgICAgICAgY2JzTGltaXQsIENUUyBpbnRlcnZhbCwgYW5kIGFjdGlvbiBtb2RlIHZhbHVlIGFuZCB1c2UgdGhpcyBzdHJ1Y3R1cmUKICogICAgICAgICAgICAgICAgdG8gZG8gY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKgogKiAgICAgICAgaXNWYWxpZCAgICAgICAgIC0gSWYgR1RfVFJVRSwgdGhlIHBhcmFtZXJzIGluIHRoaXMgc3RydWN0dXJlIGFyZSB1c2VkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm9ncmFtIFBJUkwgUmVzb3VyY2UncyBSYXRlIExpbWl0LiBBbmQgaW5ncmVzc1JhdGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIEdUX1BJUkxfVFNNX0RBVEEgc3RydWN0dXJlIGFyZSBpZ25vcmVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgR1RfRkFMU0UsIGluZ3Jlc3NSYXRlIGluIEdUX1BJUkxfVFNNX0RBVEEgc3RydWN0dXJlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGZvciBSZXNvdXJjZSdzIFJhdGUgTGltaXQuCiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoMCB+IDB4RkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCdXJzdCBTaXplIGxpbWl0ICgwIH4gMHhGRkZGKQogKiAgICAgICAgY3RzSW50diAgICAgICAgIC0gQ2xhc3MgVGltZSBTbG90IEludGVydmFsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gaW50ZXJ2YWwgaXMgNjIuNXVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gaW50ZXJ2YWwgaXMgMTI1dXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBpbnRlcnZhbCBpcyAyNTB1cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIGludGVydmFsIGlzIDEwMDB1cwogKiAgICAgICAgYWN0aW9uTW9kZSAgICAgICAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlcmUgYXJlIG5vdCBlbm91Z2ggdG9rZW5zCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2NlcHQgdGhlIGVudGlyZSBpbmNvbWluZyBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fQUNDRVBUIC0gYWNjZXB0IHRoZSBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiAtIHVzZSBsaW1pdEFjdGlvbgoqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICBpc1ZhbGlkOwogICAgR1RfVTMyICAgICAgICBlYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgY2JzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGN0c0ludHY7CiAgICBHVF9QSVJMX0FDVElPTiAgICAgICAgYWN0aW9uTW9kZTsKfSBHVF9QSVJMX0NVU1RPTV9UU01fQ0ZHOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfVFNNX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTDIgVFNNIEluZ3Jlc3MgUmF0ZSBMaW1pdC4KICoKICogIEZpZWxkczoKICogICAgICAgIGVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICgwIH4gMHhGRkZGKQogKiAgICAgICAgY2JzTGltaXQgICAgICAgIC0gQ29tbWl0dGVkIEJ1cnN0IFNpemUgbGltaXQgKDAgfiAweEZGRkYpCiAqICAgICAgICBjdHNJbnR2ICAgICAgICAgLSBDbGFzcyBUaW1lIFNsb3QgSW50ZXJ2YWwKICogICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBpbnRlcnZhbCBpcyA2Mi41dXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBpbnRlcnZhbCBpcyAxMjV1cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGludGVydmFsIGlzIDI1MHVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gaW50ZXJ2YWwgaXMgMTAwMHVzCiAqICAgICAgICBhY3Rpb25Nb2RlICAgICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiAqICAgICAgICAgbWdtdE5ybEVuICAgICAgICAgLSBleGNsdWRlIG1hbmFnZW1lbnQgZnJhbWUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24KICogICAgICAgIHByaU1hc2sgICAgICAgICAtIHByaW9yaXR5IGJpdCBtYXNrIHRoYXQgZWFjaCBiaXQgaW5kaWNhdGVzIG9uZSBvZiB0aGUgZm91cgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgcHJpb3JpdGllcy4gU2V0dGluZyBlYWNoIG9uZSBvZiB0aGVzZSBiaXRzIGluZGljYXRlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcmF0ZSByZXNvdXJjZSBpcyBzbGF0ZWQgdG8gYWNjb3VudCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyYW1lcyB3aXRoIHRoZSBlbmFibGVkIGJpdHMnIHByaW9yaXR5LgogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgdHNtTW9kZTsKICAgIEdUX1UzMiAgICAgICAgZWJzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGNic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBjdHNJbnR2OwogICAgR1RfUElSTF9BQ1RJT04gICAgICAgIGFjdGlvbk1vZGU7CiAgICBHVF9CT09MICAgICAgICBtZ210TnJsRW47CiAgICBHVF9VMzIgICAgICAgIHByaU1hc2s7Cn0gR1RfUElSTDJfVFNNX1JFU09VUkNFOwoKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkwyX1RTTV9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSBzdHJ1Y3R1cmUgZm9yIFBJUkwyIFRTTSBJbmdyZXNzIFJhdGUgTGltaXQuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICB0c21Nb2RlICAgICAgICAgICAgLSBlbmFibGUvZGlzYWJsZSBUU00gbW9kZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpZ25vcmVkIGlmIGRpYWJsZQogKiAgICAgICAgaW5ncmVzc1JhdGUgICAgICAgLSBjb21taXRlZCBpbmdyZXNzIHJhdGUgaW4ga2Jwcy4obWluIDY0IGZvciA2NGticHMpCiAqICAgICAgICBjdXN0b21TZXR1cCAgICAgICAtIGN1c3RvbSBpbmdyZXNzIHJhdGUgcGFyYW1ldGVyIHNldHVwLiBwbGVhc2UgcmVmZXIgdG8KICogICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfQ1VTVE9NX1RTTV9DRkcgc3RydWN0dXJlLgogKiAgICAgICAgbWdtdE5ybEVuICAgICAgICAtIGV4Y2x1ZGUgbWFuYWdlbWVudCBmcmFtZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbgogKiAgICAgICAgcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICB0c21Nb2RlOwogICAgR1RfVTMyICAgICAgICBpbmdyZXNzUmF0ZTsKICAgIEdUX1BJUkxfQ1VTVE9NX1RTTV9DRkcgY3VzdG9tU2V0dXA7CiAgICBHVF9CT09MICAgICAgICBtZ210TnJsRW47CiAgICBHVF9VMzIgICAgICAgIHByaU1hc2s7Cn0gR1RfUElSTDJfVFNNX0RBVEE7CgoKCiNkZWZpbmUgTUFYX1BUUF9DT05TRUNVVElWRV9SRUFEICAgIDQKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9PUEVSQVRJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFBUUCAoUHJlY2lzZSBUaW1lIFByb3RvY29sKSBPcGVyYXRpb24gdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX1dSSVRFX0RBVEEgICAgICAgICAgICAgLSBXcml0ZSBkYXRhIHRvIHRoZSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9EQVRBICAgICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9NVUxUSVBMRV9EQVRBICAgIC0gUmVhZCBtdWx0aXBsZSBkYXRhIGZyb20gUFRQIHJlZ2lzdGVyCiAqICAgICAgUFRQX1JFQURfVElNRVNUQU1QX0RBVEEgICAgLSBSZWFkIHRpbWVzdGFtcCBkYXRhIGZyb20gUFRQIHJlZ2lzdGVyCiAqICAgICAgICAgICAgICAgICAgICB2YWxpZCBiaXQgd2lsbCBiZSByZXNldCBhZnRlciByZWFkCiAqLwp0eXBlZGVmIGVudW0KewogICAgUFRQX1dSSVRFX0RBVEEgICAgICAgICAgICAgPSAweDMsCiAgICBQVFBfUkVBRF9EQVRBICAgICAgICAgICAgICA9IDB4NCwKICAgIFBUUF9SRUFEX01VTFRJUExFX0RBVEEgICAgPSAweDYsCiAgICBQVFBfUkVBRF9USU1FU1RBTVBfREFUQSAgICA9IDB4OCwKfSBHVF9QVFBfT1BFUkFUSU9OOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFRQX1NQRUMKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFBUUCAoUHJlY2lzZSBUaW1lIFByb3RvY29sKSBTUEVDIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBUUF9JRUVFXzE1ODggICAgICAgICAtIElFRUUgMTU4OAogKiAgICAgIFBUUF9JRUVFXzgwMl8xQVMgICAgLSBJRUVFIDgwMi4xYXMKICovCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfSUVFRV8xNTg4ICAgICAgICA9IDB4MCwKICAgIFBUUF9JRUVFXzgwMl8xQVMgICAgPSAweDEKfSBHVF9QVFBfU1BFQzsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BUUF9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBQVFAgT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHRwUG9ydCAgICAgICAgLSBwaHlzaWNhbCBwb3J0IG9mIHRoZSBkZXZpY2UKICogICAgICBwdHBBZGRyICAgICAtIHJlZ2lzdGVyIGFkZHJlc3MKICogICAgICBwdHBEYXRhICAgICAtIGRhdGEgZm9yIHB0cCByZWdpc3Rlci4KICogICAgICBwdHBNdWx0aURhdGEtIHVzZWQgZm9yIG11bHRpcGxlIHJlYWQgb3BlcmF0aW9uLgogKiAgICAgIG5EYXRhICAgICAgICAgLSBudW1iZXIgb2YgZGF0YSB0byBiZSByZWFkIG9uIG11bHRpcGxlIHJlYWQgb3BlcmF0aW9uLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHB0cFBvcnQ7CiAgICBHVF9VMzIgICAgcHRwQmxvY2s7CiAgICBHVF9VMzIgICAgcHRwQWRkcjsKICAgIEdUX1UzMiAgICBwdHBEYXRhOwogICAgR1RfVTMyICAgIHB0cE11bHRpRGF0YVtNQVhfUFRQX0NPTlNFQ1VUSVZFX1JFQURdOwogICAgR1RfVTMyICAgIG5EYXRhOwp9IEdUX1BUUF9PUF9EQVRBOwoKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BUUF9HTE9CQUxfQ09ORklHCiAqCiAqICBEZXNjcmlwdGlvbjogUFRQIGdsb2JhbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICoKICogIEZpZWxkczoKICogICAgICBwdHBFVHlwZSAgICAtIFBUUCBFdGhlciBUeXBlCiAqICAgICAgbXNnSWRUU0VuICAgICAtIE1lc3NhZ2UgSURzIHRoYXQgbmVlZHMgdGltZSBzdGFtcAogKiAgICAgIHRzQXJyUHRyICAgICAtIFRpbWUgc3RhbXAgYXJyaXZhbCB0aW1lIGNvdW50ZXIgcG9pbnRlciAoZWl0aGVyIEFycjBUaW1lIG9yIEFycjFUaW1lKQogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHB0cEVUeXBlOwogICAgR1RfVTMyICAgIG1zZ0lkVFNFbjsKICAgIEdUX1UzMiAgICB0c0FyclB0cjsKfSBHVF9QVFBfR0xPQkFMX0NPTkZJRzsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9UU19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgKFByZWNpc2UgVGltZSBQcm90b2NvbCkgQXJyMCBUUyBNb2RlCiAqCiAqIEZpZWxkczoKICogICAgICBHVF9QVFBfVFNfTU9ERV9JTl9SRUcgICAgICAgICAtIFRpbWUgc3RhbXAgaW4gVFMgcmVnaWdpc3RlciAob3JpZ2luYWwpCiAqICAgICAgR1RfUFRQX1RTX01PREVfSU5fUkVTRVJWRURfMiAgLSBUaW1lIHN0YW1wIGluIEZyYW1lIHJlc2VkdmVkIDIKICogICAgICBHVF9QVFBfVFNfTU9ERV9JTl9GUkFNRV9FTkQgICAtIFRpbWUgc3RhbXAgaW4gRnJhbWUgRW5kCiAqLwp0eXBlZGVmIGVudW0KewogICAgICAgR1RfUFRQX1RTX01PREVfSU5fUkVHLAogICAgICAgR1RfUFRQX1RTX01PREVfSU5fUkVTRVJWRURfMiwKICAgICAgIEdUX1BUUF9UU19NT0RFX0lOX0ZSQU1FX0VORAp9IEdUX1BUUF9UU19NT0RFOwoKI2RlZmluZSBQVFBfVFNfTE9DX1JFU0VSVkVEXzIgIDB4MTAKI2RlZmluZSBQVFBfRlJBTUVfU0laRSAweGMwCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BUUF9QT1JUX0NPTkZJRwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIGVhY2ggcG9ydAogKgogKiAgRmllbGRzOgogKiAgICAgIHRyYW5zU3BlYyAgICAtIFRoaXMgaXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHZhcmlvdXMgdGltaW5nIHByb3RvY29scy4KICogICAgICBkaXNUU3BlYyAgICAgLSBEaXNhYmxlIFRyYW5zcG9ydCBzcGVjaWZpYyBjaGVjawogKiAgICAgIGV0SnVtcCAgICAgICAgIC0gb2Zmc2V0IHRvIEV0aGVyIHR5cGUgc3RhcnQgYWRkcmVzcyBpbiBieXRlcwogKiAgICAgIGlwSnVtcCAgICAgICAgIC0gb2Zmc2V0IHRvIElQIGhlYWRlciBzdGFydCBhZGRyZXNzIGNvdW50aW5nIGZyb20gRXRoZXIgdHlwZSBvZmZzZXQKICogICAgICBwdHBBcnJJbnRFbiAgICAtIFBUUCBwb3J0IGFycml2YWwgaW50ZXJydXB0IGVuYWJsZQogKiAgICAgIHB0cERlcEludEVuICAgIC0gUFRQIHBvcnQgZGVwYXJ0dXJlIGludGVycnVwdCBlbmFibGUKICogICAgICBkaXNUU092ZXJ3cml0ZSAtIGRpc2FibGUgdGltZSBzdGFtcCBjb3VudGVyIG92ZXJ3cml0aW5nIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciB2YWxpZCBiaXQgaXMgY2xlYXJlZC4KICogICAgICBhcnJUU01vZGUgICAgICAtIFBUUCBhcnJpdmFsIFRTIG1vZGUuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9QVFBfU1BFQyAgICB0cmFuc1NwZWM7CiAgICBHVF9CT09MICAgICAgICBkaXNUU3BlYzsKICAgIEdUX1UzMiAgICAgICAgIGV0SnVtcDsKICAgIEdUX1UzMiAgICAgICAgIGlwSnVtcDsKICAgIEdUX0JPT0wgICAgICAgIHB0cEFyckludEVuOwogICAgR1RfQk9PTCAgICAgICAgcHRwRGVwSW50RW47CiAgICBHVF9CT09MICAgICAgICBkaXNUU092ZXJ3cml0ZTsKICAgIEdUX1BUUF9UU19NT0RFICAgICAgICAgYXJyVFNNb2RlOwp9IEdUX1BUUF9QT1JUX0NPTkZJRzsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX0NPTkZJRwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICoKICogIEZpZWxkczoKICogICAgICBwdHBFVHlwZSAgICAtIFBUUCBFdGhlciBUeXBlCiAqICAgICAgbXNnSWRUU0VuICAgICAtIE1lc3NhZ2UgSURzIHRoYXQgbmVlZHMgdGltZSBzdGFtcAogKiAgICAgIHRzQXJyUHRyICAgICAtIFRpbWUgc3RhbXAgYXJyaXZhbCB0aW1lIGNvdW50ZXIgcG9pbnRlciAoZWl0aGVyIEFycjBUaW1lIG9yIEFycjFUaW1lKQogKiAgICAgIHB0cEFyckludEVuICAgIC0gUFRQIHBvcnQgYXJyaXZhbCBpbnRlcnJ1cHQgZW5hYmxlCiAqICAgICAgcHRwRGVwSW50RW4gICAgLSBQVFAgcG9ydCBkZXBhcnR1cmUgaW50ZXJydXB0IGVuYWJsZQogKiAgICAgIHRyYW5zU3BlYyAgICAtIFRoaXMgaXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHZhcmlvdXMgdGltaW5nIHByb3RvY29scy4KICogICAgICBtc2dJZFN0YXJ0Qml0ICAgICAtIE1lc3NhZ2UgSUQgc3RhcnRpbmcgYml0IGluIHRoZSBQVFAgY29tbW9uIGhlYWRlcgogKiAgICAgIGRpc1RTT3ZlcndyaXRlICAgICAtIGRpc2FibGUgdGltZSBzdGFtcCBjb3VudGVyIG92ZXJ3cml0aW5nIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciB2YWxpZCBiaXQgaXMgY2xlYXJlZC4KICogICAgICBwdHBQb3J0Q29uZmlnICAgICAgLSBQVFAgcG9ydCBjb25maWd1cmF0aW9uIGFycmF5LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHB0cEVUeXBlOwogICAgR1RfVTMyICAgIG1zZ0lkVFNFbjsKICAgIEdUX1UzMiAgICB0c0FyclB0cjsKCiAgICBHVF9VMzIgICAgcHRwQXJySW50RW47CiAgICBHVF9VMzIgICAgcHRwRGVwSW50RW47CiAgICBHVF9QVFBfU1BFQyAgICB0cmFuc1NwZWM7CiAgICBHVF9VMzIgICAgbXNnSWRTdGFydEJpdDsKICAgIEdUX0JPT0wgICAgZGlzVFNPdmVyd3JpdGU7CiAgICBHVF9QVFBfUE9SVF9DT05GSUcgICAgICBwdHBQb3J0Q29uZmlnW01BWF9TV0lUQ0hfUE9SVFNdOwp9IEdUX1BUUF9DT05GSUc7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QVFBfVElNRQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFRQIFRpbWUgdG8gYmUgcmVhZAogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX1dSSVRFX0RBVEEgICAgICAgICAgICAgLSBXcml0ZSBkYXRhIHRvIHRoZSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9EQVRBICAgICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9NVUxUSVBMRV9EQVRBICAgIC0gUmVhZCBtdWx0aXBsZSBkYXRhIGZyb20gUFRQIHJlZ2lzdGVyCiAqLwp0eXBlZGVmIGVudW0KewogICAgUFRQX0FSUjBfVElNRSA9IDB4MCwKICAgIFBUUF9BUlIxX1RJTUUgPSAweDEsCiAgICBQVFBfREVQX1RJTUUgPSAweDIKfSBHVF9QVFBfVElNRTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9JTlRfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgUG9ydCBpbnRlcnJ1cHQgc3RhdHVzIGZvciB0aW1lIHN0YW1wCiAqCiAqIEZpZWxkczoKICogICAgICBQVFBfSU5UX05PUk1BTCAgICAgICAgLSBObyBlcnJvciBjb25kaXRpb24gb2NjdXJyZWQKICogICAgICBQVFBfSU5UX09WRVJXUklURSAgICAgLSBQVFAgbG9naWMgaGFzIHRvIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBQVFAgZnJhbWUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBuZWVkcyB0aW1lIHN0YW1waW5nIGJlZm9yZSB0aGUgY3VycmVudCByZWFkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSB0aGUgbGF0ZXN0IG9uZSBpcyBzYXZlZC4KICogICAgICBQVFBfSU5UX0RST1AgICAgICAgICAgLSBQVFAgbG9naWMgaGFzIHRvIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBQVFAgZnJhbWUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBuZWVkcyB0aW1lIHN0YW1waW5nIGJlZm9yZSB0aGUgY3VycmVudCByZWFkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSB0aGUgb2xkZXN0IG9uZSBpcyBzYXZlZC4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfSU5UX05PUk1BTCAgICAgICAgID0gMHgwLAogICAgUFRQX0lOVF9PVkVSV1JJVEUgICAgID0gMHgxLAogICAgUFRQX0lOVF9EUk9QICAgICAgICAgPSAweDIKfSBHVF9QVFBfSU5UX1NUQVRVUzsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BUUF9UU19TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBQVFAgcG9ydCBzdGF0dXMgb2YgdGltZSBzdGFtcAogKgogKiAgRmllbGRzOgogKiAgICAgIGlzVmFsaWQgICAgICAgIC0gdGltZSBzdGFtcCBpcyB2YWxpZAogKiAgICAgIHN0YXR1cyAgICAgICAgLSB0aW1lIHN0YW1wIGVycm9yIHN0YXR1cwogKiAgICAgIHRpbWVTdGFtcGVkICAgIC0gdGltZSBzdGFtcCB2YWx1ZSBvZiBhIFBUUCBmcmFtZSB0aGF0IG5lZWRzIHRvIGJlIHRpbWUgc3RhbXBlZAogKiAgICAgIHB0cFNlcUlkICAgIC0gc2VxdWVuY2UgSUQgb2YgdGhlIGZyYW1lIHdob3NlIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gaGFzIGJlZW4gY2FwdHVyZWQKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgaXNWYWxpZDsKICAgIEdUX1UzMiAgICB0aW1lU3RhbXBlZDsKICAgIEdUX1UzMiAgICBwdHBTZXFJZDsKICAgIEdUX1BUUF9JTlRfU1RBVFVTICAgIHN0YXR1czsKfSBHVF9QVFBfVFNfU1RBVFVTOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX1BPUlRfRElTQ0FSRF9TVEFUUwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBwb3J0IGRpc2NhcmQgc3RhdGlzdGljcy4gVGhlIGNvdW50ZXIgKDQgYml0IHdpZGUpIHdyYXBzIGFyb3VuZCBhZnRlciAxNS4KICoKICogIEZpZWxkczoKICogICAgICB0c0RlcERpc0N0ciAgICAtIFBUUCBkZXBhcnR1cmUgZnJhbWUgZGlzY2FyZCBjb3VudGVyIGZvciBQVFAgZnJhbWVzIHRoYXQgbmVlZCB0aW1lIHN0YW1waW5nLgogKiAgICAgIG50c0RlcERpc0N0ciAgICAtIFBUUCBkZXBhcnR1cmUgZnJhbWUgZGlzY2FyZCBjb3VudGVyIGZvciBQVFAgZnJhbWVzIHRoYXQgZG8gbm90IG5lZWQgdGltZSBzdGFtcGluZy4KICogICAgICB0c0FyckRpc0N0ciAgICAtIFBUUCBhcnJpdmFsIGZyYW1lIGRpc2NhcmQgY291bnRlciBmb3IgUFRQIGZyYW1lcyB0aGF0IG5lZWQgdGltZSBzdGFtcGluZy4KICogICAgICBudHNBcnJEaXNDdHIgICAgLSBQVFAgYXJyaXZhbCBmcmFtZSBkaXNjYXJkIGNvdW50ZXIgZm9yIFBUUCBmcmFtZXMgdGhhdCBkbyBub3QgbmVlZCB0aW1lIHN0YW1waW5nLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHRzRGVwRGlzQ3RyOwogICAgR1RfVTMyICAgIG50c0RlcERpc0N0cjsKICAgIEdUX1UzMiAgICB0c0FyckRpc0N0cjsKICAgIEdUX1UzMiAgICBudHNBcnJEaXNDdHI7Cn0gR1RfUFRQX1BPUlRfRElTQ0FSRF9TVEFUUzsKCi8qIEZyb20gQWdhdGUsIHRvIGFkZCBhcnJpdmFsIFRTIG1vZGUsIHRvIGluc2VydCBUUyBpbnRvIGZyYW1lICovCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfQVJSX1RTX01PREVfRElBQkxFICA9IDAsICAgLyogUFRQIEFycml2YWwgbW9kZTogZGlzYWJsZSBUUyBtb2RlIG1vZGlmaWNhdGlvbiAqLwogICAgUFRQX0FSUl9UU19NT0RFX0ZSTV9FTkQgPSAxLCAgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IGVuZCBvZiBmcmFtZSAqLwogICAgUFRQX0FSUl9UU19NT0RFX0xPQ181ICAgPSA0LCAgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IG9mZnNldCA1IGluIGNvbW1vbiBoZWFkZXIgKi8KICAgIFBUUF9BUlJfVFNfTU9ERV9MT0NfMTcgID0gMTYsICAvKiBQVFAgQXJyaXZhbCBtb2RlOiBUUyBhdCBvZmZzZXQgMTcgaW4gY29tbW9uIGhlYWRlciAqLwogICAgUFRQX0FSUl9UU19NT0RFX0xPQ18zNSAgPSAzNCwgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IG9mZnNldCAzNSBpbiBjb21tb24gaGVhZGVyICovCiAgICBQVFBfQVJSX1RTX01PREVfTE9DX2ZmICAgICAgICAgLyogUFRQIEFycml2YWwgbW9kZTogVFMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgKi8KfSBHVF9QVFBfQVJSX1RTX01PREU7CgoKCiNpZmRlZiBDT05GSUdfQVZCX0ZQR0EKCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfQ0xPQ0tfU1JDX0FEX0RFVklDRSA9IDAsICAgIC8qIFBUUCBDbG9jayBzb3VyY2UgaXMgZnJvbSBBL0QgZGV2aWNlICovCiAgICBQVFBfQ0xPQ0tfU1JDX0ZQR0EgICAgICAgICAgICAgICAgLyogUFRQIENsb2NrIHNvdXJjZSBpcyBmcm9tIENlc2l1bSBGUEdBICovCn0gR1RfUFRQX0NMT0NLX1NSQzsKCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfUDlfTU9ERV9HTUlJID0gMCwgICAgIC8qIFBvcnQgOSB1c2VzIEdNSUkgY29ubmVjdCB0byA4OEUxMTExICovCiAgICBQVFBfUDlfTU9ERV9NSUksICAgICAgICAvKiBQb3J0IDkgdXNlcyBNSUkgY29ubmVjdCB0byA4OEUxMTExICovCiAgICBQVFBfUDlfTU9ERV9NSUlfQ09OTkVDVE9SLCAgICAgICAgLyogUG9ydCA5IGNvbm5lY3QgdG8gTUlJIGNvbm5lY3RvciAqLwogICAgUFRQX1A5X01PREVfSlVNUEVSICAgICAgICAvKiBVc2UgSnVtcGVyIHNldHVwICovCn0gR1RfUFRQX1A5X01PREU7Cgp0eXBlZGVmIGVudW0KewogICAgR1RfUFRQX1NJR05fTkVHQVRJVkUgPSAwLCAgICAvKiBhcHBseSBNaW51cyBzaWduIHRvIHRoZSBEdXR5IEN5Y2xlICovCiAgICBHVF9QVFBfU0lHTl9QTFVTICAgICAgICAgICAgLyogYXBwbHkgUGx1cyBzaWduIHRvIHRoZSBEdXR5IEN5Y2xlICovCn0gR1RfUFRQX1NJR047Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9QVFBfU0lHTiAgICBhZGpTaWduOyAgICAvKiBkZXRlcm1pbmUgdGhlIHBsdXMvbWludXMgc2lnbiBvZiB0aGUgZHV0eSBjeWNsZSBhZGogKi8KICAgIEdUX1UzMiAgICBjeWNsZVN0ZXA7ICAgICAgICAvKiBudW1iZXIgb2Ygc3RlcHMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGluIGFkanVzdGluZyB0aGUgZHV0eSBjeWNsZSBoaWdoIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgOEtIeiBjbG9jayBjeWNsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXJlIDAgfiA3ICovCiAgICBHVF9VMzIgICAgY3ljbGVJbnRlcnZhbDsgICAgLyogZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiBjbG9jayBjeWNsZXMgZm9yIHdoaWNoIGEgZHV0eSBjeWNsZSBhZGogd2lsbCBvY2N1ciAqLwogICAgR1RfVTMyICAgIGN5Y2xlQWRqdXN0OyAgICAvKiBkZWZpbmUgdGhlIG51bWJlciBvZiA4S0h6IGNsb2NrIGN5Y2xlcyBmb3Igd2hpY2ggZHV0eSBjeWNsZSBhZGogd2lsbCBvY2N1cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiBlYWNoIFBUUCBjbG9jayBjbHljbGUgaW50ZXJ2YWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IChjeWNsZUFkanVzdCA8PSBjeWNsZUludGVydmFsKSBmb3IgcHJvcGVyIG9wZXJhdGlvbiAqLwp9IEdUX1BUUF9DTE9DS19BREpVU1RNRU5UOwoKI2VuZGlmCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1RBSV9FVkVOVF9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBUQUkgZXZlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICoKICogIEZpZWxkczoKICogICAgICBldmVudE92ZXJ3cml0ZSAgICAtIGV2ZW50IGNhcHR1cmUgb3ZlcndyaXRlCiAqICAgICAgZXZlbnRDdHJTdGFydCAgICAgLSBldmVudCBjb3VudGVyIHN0YXJ0CiAqICAgICAgZXZlbnRQaGFzZSAgICAgICAgLSBldmVudCBwaGFzZSwgV2hlbiAweDEgdGhlIGFjdGl2ZSBwaGFzZSBvZiB0aGUgUFRQX0VWUkVRIGlucHV0CiAqICAgICAgICBpcyBpbnZlcnRlZCB0byBiZSBhY3RpdmUgbG93LiBXaGVuIDB4MCB0aGUgYWN0aXZlIHBoYXNlIG9mIHRoZSBQVFBfRVZSRVEgaW5wdXQKICogICAgICAgIGlzIG5vcm1hbCBhY3RpdmVoaWdoCiAqICAgICAgaW50RW4gICAgICAgICAgICAgLSBldmVudCBjYXB0dXJlIGludGVycnVwdCBlbmFibGUKICogICAgICBjYXB0VHJpZ0V2ZW50ICAgICAtIENhdHB0dXJlIFRyaWcuIDE6IGZyb20gd2F2ZWZvcm0gZ2VuZXJhdGVkIGJ5IFBUUF9UUklHLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogZnJvbSBQVFBfRVZSRVEgcGluLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICBldmVudE92ZXJ3cml0ZTsKICAgIEdUX0JPT0wgICAgZXZlbnRDdHJTdGFydDsKICAgIEdUX0JPT0wgICAgZXZlbnRQaGFzZTsKICAgIEdUX0JPT0wgICAgaW50RW47CiAgICBHVF9CT09MICAgIGNhcHRUcmlnRXZlbnQ7Cgp9IEdUX1RBSV9FVkVOVF9DT05GSUc7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9UQUlfRVZFTlRfU1RBVFVTCiAqCiAqICBEZXNjcmlwdGlvbjogVEFJIGV2ZW50IGNhcHR1cmUgc3RhdHVzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaXNWYWxpZCAgICAgICAgLSBldmVudFRpbWUgaXMgdmFsaWQKICogICAgICBldmVudFRpbWUgICAgIC0gUFRQIGdsb2JhbCB0aW1lIHdoZW4gZXZlbnQgaXMgcmVnaXN0ZXJlZC4KICogICAgICBldmVudEN0ciAgICAtIGV2ZW50IGNhcHR1cmUgY291bnRlci4gaW5jcmVhbWVudGVkIG9ubHkgaWYgZXZlbnRDdHJTdGFydCBpcyBzZXQuCiAqICAgICAgZXZlbnRFcnIgICAgLSBpc1ZhbGlkIGlzIGFscmVhZHkgc2V0IHdoZW4gYSBuZXcgZXZlbnQgaXMgb2JzZXJ2ZWQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgIGlzVmFsaWQ7CiAgICBHVF9VMzIgICAgZXZlbnRUaW1lOwogICAgR1RfVTMyICAgIGV2ZW50Q3RyOwogICAgR1RfQk9PTCAgICBldmVudEVycjsKfSBHVF9UQUlfRVZFTlRfU1RBVFVTOwoKCnR5cGVkZWYgZW51bQp7CiAgICBHVF9UQUlfVFJJR19QRVJJT0RJQ19QVVJTRSA9IDAsICAgIC8qIGdlbmVyYXRlIHBlcmlvZGljIHB1cnNlICovCiAgICBHVF9UQUlfVFJJR19PTl9HSVZFTl9USU1FICAgICAgICAvKiBnZW5lcmF0ZSBwdXJzZSB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUCBnbG9iYWwgdGltZSBtYXRjaGVzIHdpdGggZ2l2ZW4gdGltZSAqLwp9IEdUX1RBSV9UUklHX01PREU7Cgp0eXBlZGVmIGVudW0KewogICAgR1RfVEFJX01VTFRJX1BUUF9TWU5DX0RJU0FCTEUgPSAwLCAgLyogdGhlIEV2ZW50UmVxdWVzdCBhbmQgVHJpZ2dlckdlbiBpbnRlcmZhY2VzIG9wZXJhdGUgbm9ybWFsbHkuICovCiAgICBHVF9UQUlfTVVMVElfUFRQX1NZTkNfRU5BQkxFICAgICAgICAvKiB0aGUgbG9naWMgZGV0ZWN0cyBhIGxvdyB0byBoaWdoIHRyYW5zaXRpb24gb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBFdmVudFJlcXVlc3QgKEdQSU8pIGFuZCB0cmFuc2ZlcnMgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBUcmlnR2VuQW10WzMxOjBdIChUQUkgR2xvYmFsIENvbmZpZyAweDIsIDB4MykgaW50bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBUUCBHbG9iYWwgVGltZSByZWdpc3RlclszMTowXS4gVGhlIEV2ZW50Q2FwVGltZVszMTowXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRBSSBnbG9iYWwgU3RhdHVzIDB4QSwgMHhCKSBpcyBhbHNvIHVwZGF0ZWQgYXQgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudC4gKi8KfSBHVF9UQUlfTVVMVElfUFRQX1NZTkNfTU9ERTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1RBSV9DTE9DS19TRUxFQ1QKICoKICogIERlc2NyaXB0aW9uOiBUQUkgQ2xvY2sgc2VsZWN0CiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHJpUmVjQ2xrU2VsICAgICAgLSBTeW5jaHJvbm91cyBFdGhlcm5ldCBQcmltYXJ5IFJlY292ZXJlZCBDbG9jayBTZWxlY3QuCiAqICAgICAgICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW50ZXJuYWwgUEhZIG51bWJlciB3aG9zZSByZWNvdmVyZWQgY2xvY2sgd2lsbCBiZQogKiAgICAgICAgcHJlc2VudGVkIG9uIHRoZSBTRV9SQ0xLMCBwaW4uIFRoZSByZXNldCB2YWx1ZSBvZiAweDcgc2VsZWN0cyBubyBjbG9jayBhbmQKICogICAgICAgIHRoZSBwaW4gaXMgdHJpLXN0YXRlZC4KICogICAgICBzeW5jUmVjQ2xrU2VsICAgICAtIFN5bmNocm9ub3VzIEV0aGVybmV0IFNlY29uZGFyeSBSZWNvdmVyZWQgQ2xvY2sgU2VsZWN0LgogKiAgICAgIHB0cEV4dENsayAgICAgICAgIC0gUFRQIGV4dGVybmFsIENsb2NrIHNlbGVjdAogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTggICAgcHJpUmVjQ2xrU2VsOwogICAgR1RfVTggICAgc3luY1JlY0Nsa1NlbDsKICAgIEdUX0JPT0wgIHB0cEV4dENsazsKfSBHVF9UQUlfQ0xPQ0tfU0VMRUNUOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9UQUlfVFJJR0dFUl9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBUQUkgdHJpZ2dlciBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaW50RW4gICAgICAgICAtIHRyaWdnZXIgZ2VuZXJhdG9yIGludGVycnVwdCBlbmFibGUKICogICAgICB0cmlnUGhhc2UgICAgIC0gdHJpZ2dlciBwaGFzZSwgV2hlbiAweDEgdGhlIGFjdGl2ZSBwaGFzZSBvZiB0aGUgUFRQX1RSSUcgb3V0cHV0CiAqICAgICAgICBpcyBpbnZlcnRlZCB0byBiZSBhY3RpdmUgbG93LiBXaGVuIDB4MCB0aGUgYWN0aXZlIHBoYXNlIG9mIHRoZSBQVFBfVFJJRyBvdXRwdXQKICogICAgICAgIGlzIG5vcm1hbCBhY3RpdmUgaGlnaC4KICogICAgICB0cmlnTG9jayAgICAgLSB0cmlnZ2VyIExvY2ssIFdoZW4gMHgxIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgUFRQX1RSSUcgd2lsbCBiZSBhZGp1ZHRlcmQgaW4gZm9sbG93aW5nIHJhbmdlLgogKiAgICAgIHRyaWdMb2NrUmFuZ2UgLSB0cmlnZ2VyIExvY2tpbmcgcmFuZ2UuCiAqICAgICAgbG9ja0NvcnJlY3QgICAtIFRyaWcgTG9jayBDb3JyZWN0aW9uIGFtb3VudAogKiAgICAgIGxvY2syQ29ycmVjdCAgLSBUcmlnIExvY2sgMiBDb3JyZWN0aW9uIGFtb3VudAogKiAgICAgIG1vZGUgICAgICAgIC0gdHJpZ2dlciBtb2RlLCBlaXRoZXIgR1RfVEFJX1RSSUdfUEVSSU9ESUNfUFVSU0Ugb3IKICogICAgICAgICAgICAgICAgICAgICAgR1RfVEFJX1RSSUdfT05fR0lWRU5fVElNRQogKiAgICAgIHRyaWdHZW5BbXQgICAgIC0gaWYgbW9kZSBpcyBHVF9UQUlfVFJJR19QRVJJT0RJQ19QVVJTRSwKICogICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBpcyB1c2VkIGFzIGEgY2xvY2sgcGVyaW9kIGluIFRTQ2xrUGVyIGluY3JlbWVudHMKICogICAgICAgICAgICAgICAgICAgICAgSWYgbW9kZSBpcyBHVF9UQUlfVFJJR19PTl9HSVZFTl9USU1FLAogKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIGlzIHVzZWQgdG8gY29tcGFyZSB3aXRoIFBUUCBnbG9iYWwgdGltZS4KICogICAgICBwdWxzZVdpZHRoICAgICAgICAtIHB1bHNlIHdpZHRoIGluIHVuaXRzIG9mIFRTQ2xrUGVyLgogKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHNob3VsZCBiZSAxIH4gMHhGLiBJZiBpdCdzIDAsIG5vIGNoYW5nZXMgbWFkZS4KICogICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBpcyB2YWxpZCBvbmx5IGluIEdUX1RBSV9UUklHX09OX0dJVkVOX1RJTUUgbW9kZS4KICogICAgICB0cmlnQ2xrQ29tcCAgICAtIHRyaWdnZXIgbW9kZSBjbG9jayBjb21wZW5zYXRpb24gYW1vdW50IGluIHBpY28gc2VjLgogKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIGlzIHZhbGlkIG9ubHkgaW4gR1RfVEFJX1RSSUdfUEVSSU9ESUNfUFVSU0UgbW9kZS4KICogICAgICB0cmlnR2VuVGltZSAgICAtIFRyaWdnZXIgR2VuZXJhdGlvbiBUaW1lLgogKiAgICAgIHRyaWdHZW5EZWxheSAgIC0gVHJpZ2dlciBHZW5lcmF0aW9uIERlbGF5LgogKiAgICAgIHRyaWdHZW4yVGltZSAgIC0gVHJpZ2dlciBHZW5lcmF0aW9uIFRpbWUgMi4KICogICAgICB0cmlnR2VuMkRlbGF5ICAtIFRyaWdnZXIgR2VuZXJhdGlvbiBEZWxheSAyLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgIGludEVuOwogICAgR1RfQk9PTCAgIHRyaWdQaGFzZTsKICAgIEdUX0JPT0wgICB0cmlnTG9jazsKICAgIEdUX1U4ICAgICB0cmlnTG9ja1JhbmdlOwogICAgR1RfVTggICAgIGxvY2tDb3JyZWN0OwogICAgR1RfVTggICAgIGxvY2tDb3JyZWN0MjsKICAgIEdUX1RBSV9UUklHX01PREUgICAgIG1vZGU7CiAgICBHVF9VMzIgICAgdHJpZ0dlbkFtdDsKICAgIEdUX1UzMiAgICBwdWxzZVdpZHRoOwogICAgR1RfVTMyICAgIHRyaWdDbGtDb21wOwogICAgR1RfVTMyICAgIHRyaWdHZW5UaW1lOwogICAgR1RfVTMyICAgIHRyaWdHZW5EZWxheTsKICAgIEdUX1UzMiAgICB0cmlnR2VuMlRpbWU7CiAgICBHVF9VMzIgICAgdHJpZ0dlbjJEZWxheTsKfSBHVF9UQUlfVFJJR0dFUl9DT05GSUc7CgoKCi8qIEFWQiBmdW5jdGlvbnMgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0FWQl9ISV9GUFJJLCAgICAgICAgLyogQVZCIEhpIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9BVkJfSElfUVBSSSwgICAgICAgIC8qIEFWQiBIaSBRdWV1ZSBQcmlvcml0eSAqLwogICAgR1RfQVZCX0xPX0ZQUkksICAgICAgICAvKiBBVkIgTG8gRnJhbWUgUHJpb3JpdHkgKi8KICAgIEdUX0FWQl9MT19RUFJJLCAgICAgICAgLyogQVZCIExvIFF1ZXVlIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfSElfRlBSSSwgICAgLyogTGVnYWN5IEhpIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfSElfUVBSSSwgICAgLyogTGVnYWN5IEhpIFF1ZXVlIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfTE9fRlBSSSwgICAgLyogTGVnYWN5IExvIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfTE9fUVBSSSAgICAvKiBMZWdhY3kgTG8gUXVldWUgUHJpb3JpdHkgKi8KfSBHVF9BVkJfUFJJX1RZUEU7CgoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0FWQl9MRUdBQ1lfTU9ERSwgLyogYWxsIGZyYW1lcyBlbnRlcmluZyB0aGUgcG9ydCBhcmUgY29uc2lkZXJlZCBsZWdhY3kgKi8KICAgIEdUX0FWQl9TVEFOREFSRF9BVkJfTU9ERSwgLyphbnkgdGFnZ2VkIGZyYW1lIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEFWQiBmcmFtZSBwcmlvcml0eSBpcyBjb25zaWRlcmVkIEFWQiAqLwogICAgR1RfQVZCX0VOSEFOQ0VEX0FWQl9NT0RFLCAvKmFueSBmcmFtZSB0aGF0IGVuZHMgdXAgd2l0aCBhbiBBVkIgZnJhbWUgcHJpb3JpdHkgd2hvc2UgREEgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbiBBVkIgRW50cnkgc3RhdGUgaXMgY29uc2lkZXJlZCBBVkIgKi8KICAgIEdUX0FWQl9TRUNVUkVfQVZCX01PREUgICAvKmFueSBmcmFtZSB0aGF0IGVuZHMgdXAgd2l0aCBhbiBBVkIgZnJhbWUgcHJpb3JpdHkgd2hvc2UgREEgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbiBBVkIgZW50cnkgc3RhdGUgYW5kIHdob3NlIERQViBoYXMgdGhpcyBzb3VyY2UgcG9ydCdzIGJpdCBzZXQgdG8gYSBvbmUgaXMgY29uc2lkZXJlZCBBVkIuICovCn0gR1RfQVZCX01PREU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9BVkJfRlJBTUVfUE9MSUNZCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBwb2xpY3kgb2YgdGhlIGZyYW1lCiAqCiAqIEZpZWxkczoKICogICAgICBBVkJfRlJBTUVfUE9MSUNZX05PTkUgLSBOb3JtYWwgZnJhbWUgc3dpdGNoaW5nCiAqICAgICAgQVZCX0ZSQU1FX1BPTElDWV9NSVJST1IgLSBNaXJyb3IoY29weSkgZnJhbWUgdG8gdGhlIE1pcnJvckRlc3QgcG9ydAogKiAgICAgIEFWQl9GUkFNRV9QT0xJQ1lfVFJBUCAtIFRyYXAocmUtZGlyZWN0KSBmcmFtZSB0byB0aGUgQ1BVRGVzdCBwb3J0CiAqICAgICAgQVZCX0ZSQU1FX1BPTElDWV9SRVMgLSBSZXNlcnZlZCwgYnV0IGltcGxlbWVudGVkIGFzIERpc2NhcmQgdGhlIGZyYW1lCiAqCiAqLwp0eXBlZGVmIGVudW0KewogICAgQVZCX0ZSQU1FX1BPTElDWV9OT05FID0gMCwKICAgIEFWQl9GUkFNRV9QT0xJQ1lfTUlSUk9SLAogICAgQVZCX0ZSQU1FX1BPTElDWV9UUkFQLAogICAgQVZCX0ZSQU1FX1BPTElDWV9SRVMKfSBHVF9BVkJfRlJBTUVfUE9MSUNZOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfQVZCX0ZSQU1FX1RZUEUKICoKICogRGVzY3JpcHRpb246CiAqICAgICAgICBEZWZpbmVzIHRoZSBBVkIgZnJhbWUgdHlwZS4KICogICAgICAgIEFWQiBIaSBGcmFtZSBpcyBvbmUgdGhhdCBEQSBvZiB0aGUgZnJhbWUgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbgogKiAgICAgICAgRW50cnkgU3RhdGUgdGhhdCBpbmRpY2F0ZXMgQVZCIHdpdGggcHJpb3JpdHkgb3ZlcnJpZGUgd2hlcmUgdGhlIG92ZXJyaWRkZW4KICogICAgICAgIHByaW9yaXR5IGVxdWFscyB0aGUgSGkgQVZCIGZyYW1lIHByaW9yaXR5KHJlZmVyIHRvIGdhdmJHZXRQcmlvcml0eSBBUEkpIGFuZAogKiAgICAgICAgd2hlbiB0aGUgcG9ydCdzIERBIEF2Yk92ZXJyaWRlIGlzIGVuYWJsZWQuCiAqICAgICAgICBBVkIgTG8gRnJhbWUgaXMgb25lIHRoYXQgREEgb2YgdGhlIGZyYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgQVRVIHdpdGggYW4KICogICAgICAgIEVudHJ5IFN0YXRlIHRoYXQgaW5kaWNhdGVzIEFWQiB3aXRoIHByaW9yaXR5IG92ZXJyaWRlIHdoZXJlIHRoZSBvdmVycmlkZGVuCiAqICAgICAgICBwcmlvcml0eSBlcXVhbHMgdGhlIExvIEFWQiBmcmFtZSBwcmlvcml0eShyZWZlciB0byBnYXZiR2V0UHJpb3JpdHkgQVBJKSBhbmQKICogICAgICAgIHdoZW4gdGhlIHBvcnQncyBEQSBBdmJPdmVycmlkZSBpcyBlbmFibGVkLgogKgogKiBGaWVsZHM6CiAqICAgICAgQVZCX0hJX0ZSQU1FICAgIC0gQVZCIEhpIEZyYW1lCiAqICAgICAgQVZCX0xPX0ZSQU1FICAgIC0gQVZCIExvIEZyYW1lCiAqLwp0eXBlZGVmIGVudW0KewogICAgQVZCX0hJX0ZSQU1FLAogICAgQVZCX0xPX0ZSQU1FCn0gR1RfQVZCX0ZSQU1FX1RZUEU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9UQ0FNX09QRVJBVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgVENBTSAoVGVybmFyeSBDb250ZW50IEFkZHJlc3NhYmxlIE1lbW9yeSkgT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgIFRDQU1fRkxVU0hfQUxMICAgICAgIC0gRmx1c2ggYWxsIGVudHJpZXMKICogICBUQ0FNX0ZMVVNIX0VOVFJZICAgICAtIEZsdXNoIG9yIGludmFsaWRhdGUgYSBzaW5nbGUgVENBTSBlbnRyeQogKiAgIFRDQU1fTE9BRF9FTlRSWSAgICAgIC0gTG9hZCBxbiBlbnRyeSdzIHBhZ2UgLSBvciBQdXJnZSBhbiBlbnRyeQogKiAgIFRDQU1fR0VUX05FWFRfRU5UUlkgIC0gR2V0IE5leHQgKHJlYWQgbmV4dCB2YWxpZCBlbnRyeSAtIGFsbCBwYWdlcykKICogICBUQ0FNX1JFQURfRU5UUlkgICAgICAtIFJlYWQgYW4gZW50cnkncyBwYWdlIChwZXJmb3JtIGEgZGlyZWN0IHJlYWQgb2YgYW4gZW50cnkpCiAqLwp0eXBlZGVmIGVudW0KewogICAgVENBTV9GTFVTSF9BTEwgICAgICAgPSAweDEsCiAgICBUQ0FNX0ZMVVNIX0VOVFJZICAgICA9IDB4MiwKICAgIFRDQU1fTE9BRF9FTlRSWSAgICAgID0gMHgzLAogICAgVENBTV9QVVJHRV9FTlRSWSAgICAgPSAweDYsCiAgICBUQ0FNX0dFVF9ORVhUX0VOVFJZICA9IDB4NCwKICAgIFRDQU1fUkVBRF9FTlRSWSAgICAgID0gMHg1Cn0gR1RfVENBTV9PUEVSQVRJT047Cgp0eXBlZGVmIGVudW0KewogICAgRlJBTUVfVFlQRV9OT1JNQUwgID0gMCwKICAgIEZSQU1FX1RZUEVfRFNBICAgICA9IDEsCiAgICBGUkFNRV9UWVBFX1BST1ZJREUgPSAyLAogICAgRlJBTUVfVFlQRV9SRVMgPSAzLAp9IEdUX0ZSQU1FX1RZUEU7CgovKiBUaGUgUDMgcmVnaXN0ZXIgMzEgd29yayBhcyBmb2xsb3dzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXF1ZW5jZToKbyAweDAwRkYgPSBSZXNldCBzdGF0ZSwgbm8gaGl0cyB5ZXQKbyAweDAwMDAgPSA0OC1ieXRlIFRDQU0gaGl0IG9uIEVudHJ5IDB4MDAKbyAweDAyMDEgPSA5Ni1ieXRlIFRDQU0gaGl0IG9uIEVudHJpZXMgMHgwMSAobG93KSBhbmQgMHgwMiAoaGlnaCkKbyAweDAwMDMgPSA0OC1ieXRlIFRDQU0gaGl0IG9uIEVudHJ5IDB4MDMKbyAweDA4MDkgPSA5Ni1ieXRlIFRDQU0gaGl0IG9uIEVudHJpZXMgMHgwOSAobG93KSBhbmQgMHgwOCAoaGlnaCkKbyAweDAwMDkgPSA0OC1ieXRlIFRDQU0gaGl0IG9uIEVudHJ5IDB4MDkgd2l0aCBhIFRDQU0gbWlzcyBvbiB0aGUgaGlnaCA0OC1ieXRlcwpvIDB4MDBGRiA9IE1pc3Mgb24gMXN0IDQ4IGJ5dGUgbG9va3VwCiovCnR5cGVkZWYgZW51bQp7CiAgICBUQ0FNX0hJVF9SRVNFVCAgPSAweEZGLAogICAgVENBTV9ISVRfNDhfRTAgID0gMHgwMCwKICAgIFRDQU1fSElUXzk2X0UxICA9IDB4MjAxLAogICAgVENBTV9ISVRfNDhfRTMgID0gMHgwMywKICAgIFRDQU1fSElUXzk2X0U5ICA9IDB4ODA5LAogICAgVENBTV9ISVRfNDhfTUlTUyAgPSAweDBGRiwKfSBHVF9UQ0FNX0hJVF9TVEFUVVM7CgoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVENBTV9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogVENBTSBLZXkgRGF0YSBhbmQgRnJhbWUgTWF0Y2ggRGF0YS4KICogIFRoZSBieXRlcyBhcmUgaW4gdGhlIGxvd2VyIDggYml0cyBvZiBlYWNoIDE2LWJpdCByZWdpc3Rlci4gVGhlIHVwcGVyIDggYml0cyBvZgogKiAgZWFjaCByZWdpc3RlciBhcmUgdGhlIE1hc2sgYml0cyBmb3IgdGhlIGxvd2VyIDggYml0cyB3aGVyZSBiaXQgMTUgaXMgdGhlIG1hc2sKICogIGZvciBiaXQgNywgYml0IDE0IGlzIHRoZSBtYXNrIGZvciBiaXQgNiwgZXRjLiBUaGUgaW5kaXZpZHVhbCBwYWlycyBvZiBkYXRhIGJpdHMKICogIGFuZCBtYXNrIGJpdHMgd29yayB0b2dldGhlciBhcyBmb2xsb3dzOgogKiAgICBNYXNrIERhdGEgTWVhbmluZwogKiAgICAgIDAgMCBEb26SdCBDYXJlLiBUaGUgZGF0YSBiaXQgY2FuIGJlIGEgb25lIG9yIGEgemVybyBmb3IgYSBUQ0FNIGhpdCB0byBvY2N1ci4KICogICAgICAxIDAgSGl0IG9uIDAuIFRoZSBkYXRhIGJpdCBtdXN0IGJlIGEgemVybyBmb3IgYSBUQ0FNIGhpdCB0byBvY2N1ci4KICogICAgICAxIDEgSGl0IG9uIDEuIFRoZSBkYXRhIGJpdCBtdXN0IGJlIGEgb25lIGZvciBhIFRDQU0gaGl0IHRvIG9jY3VyLgogKiAgICAgIDAgMSBOZXZlciBIaXQuIFVzZWQgdG8gcHJldmVudCBhIFRDQU0gaGl0IGZyb20gb2NjdXJyaW5nIGZyb20gdGhpcyBlbnRyeS4KICogICAgVGhlIE5ldmVyIEhpdCB2YWx1ZSBpcyB1c2VkIHRvIEZsdXNoIHRoZSBUQ0FNIG9yIFB1cmdlIGEgVENBTSBlbnRyeS4KICogICAgT24gYSBUQ0FNIEZsdXNoIG9yIFB1cmdlLCB0aGlzIHZhbHVlIGl0IHdyaXR0ZW4gdG8gdGhlIDFzdCBUQ0FNIGJ5dGUgb25seQogKiAgICAob2Zmc2V0IDB4MDIgb24gVENBTSBwYWdlIDEpLiBPbiBhIFRDQU0gRmx1c2ggQWxsIG9yIG9uIGEgVENBTSBGbHVzaAogKiAgICBhbiBlbnRyeSwgYWxsIG90aGVyIFRDQU0gZGF0YSBhbmQgbWFzayBieXRlcyBhcmUgd3JpdHRlbiB0byBhIHZhbHVlIG9mIDB4MDAwMAogKiAgICBhbmQgc28gYXJlIHRoZSBBY3Rpb24gYnl0ZXMuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgZnJhbWVUeXBlICAgICAgLSBGcmFtZSBUeXBlLiBUaGVzZSBiaXRzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgRnJhbWUgdHlwZSBvciBtb2RlCiAqICAgICAgZnJhbWVUeXBlTWFzayAgLSBGcmFtZSBUeXBlIE1hc2suCiAqICAgICAgc3B2ICAgICAgLSBTb3VyY2UgUG9ydCBWZWN0b3IuIFRoZXNlIGJpdHMgYXJlIHVzZWQgdG8gZGVmaW5lIHdoaWNoIHN3aXRjaCBwb3J0cwogKiAgICAgICAgICAgICAgICAgY2FuIHVzZSB0aGlzIFRDQU0gZW50cnkuCiAqICAgICAgc3B2TWFzayAgLSBTb3VyY2UgUG9ydCBWZWN0b3IgTWFzay4KICogICAgICBwcHJpICAgICAgLSBXaGVuIHRoZSBUQ0FNIGVudHJ5knMgRnJhbWVNb2RlIGJpdHMgYXJlIFByb3ZpZGVyIFRhZ2dlZCwgdGhlc2UgYml0cyBhcmUKICogICAgICAgICAgICAgICAgICBQcm92aWRlciBQcmlvcml0eSBiaXRzLgogKiAgICAgIHBwcmlNYXNrICAtIFByb3ZpZGVyIFByaW9yaXR5IE1hc2suCiAqICAgICAgcHZpZCAgICAgIC0gV2hlbiB0aGUgVENBTSBlbnRyeZJzIEZyYW1lTW9kZSBiaXRzIGFyZSBQcm92aWRlciBUYWdnZWQsIHRoZXNlIGJpdHMgYXJlCiAqICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgVklEIGJpdHMuLgogKiAgICAgIHB2aWRNYXNrICAtIFByb3ZpZGVyIFZJRCBNYXNrLgogKiAgICAgIGZyYW1lT2N0ZXQgICAgICAtIEZyYW1lIE9jdGV0IDEtNDggYW5kIDQ5LTk2LiBUaGVzZSBhcmUgdGhlIG1hdGNoIGRhdGEgZm9yIG9jdGV0CiAqICAgICAgICAgICAgICAgICAgICAgICAgMS00OCBvZiB0aGUgZnJhbWUgaWYgdGhlIFRDQU0gZW50cnkgaXMgZm9yIHRoZSBmaXJzdCA0OCBieXRlcwogKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgZnJhbWUuIElmIHRoaXMgVENBTSBlbnRyeSBpcyBmb3IgdGhlIHNlY29uZCA0OCBieXRlcyBvZgogKiAgICAgICAgICAgICAgICAgICAgICAgIGEgZnJhbWUgdGhpcyBpcyB0aGUgbWF0Y2ggZGF0YSBmb3Igb2N0ZXQgNDkgKG9yIDk3KS4KICogICAgICBmcmFtZU9jdGV0TWFzayAgLSBGcmFtZSBPY3RldCBNYXNrLgogKiAgICAgIGNvbnRpbnUgIC0gQ29udGludWUgdGhpcyBUQ0FNIGVudHJ5LiBUaGlzIGJpdCBzaG91bGQgb25seSBiZSBhIDEgb24gVENBTSBlbnRyaWVzCiAqICAgICAgICAgICAgICAgIHRoYXQgY292ZXIgdGhlIGZpcnN0IDQ4IGJ5dGVzIG9mIGEgZnJhbWUgdGhhdCBuZWVkcyB0byBiZSBleHRlbmRlZCB0bwogKiAgICAgICAgICAgICAgICBhbHNvIG1hdGNoIGJ5dGVzIDQ5IHRvIDk2IG9mIHRoZSBmcmFtZSBvciBvbiBhbnkgc3Vic2VxdWVudCBjb250aW51YXRpb24KICogICAgICAgICAgICAgICAgYmV5b25kIGJ5dGUgOTYgb2YgdGhlIGZyYW1lLgogKiAgICAgIGludGVycnVwdCAgLSBJbnRlcnJ1cHQgb24gYSBUQ0FNIGhpdC4gV2hlbiB0aGlzIGJpdCBpcyBzZXQgdG8gYSBvbmUgb24gYSBUQ0FNIGVudHJ5CiAqICAgICAgICAgICAgICAgICAgICh3aGVyZSB0aGUgQ29udGludWUgYml0IGlzIGEgemVybyksIGEgVENBTSBoaXQgaW50ZXJydXB0IHdpbGwgYmUKICogICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW5ldmVyIGEgbWF0Y2ggb2NjdXJzIHRvIHRoaXMgZW50cnkuCiAqICAgICAgSW5jVGNhbUN0ciAgIC0gSW5jcmVtZW50IHRoZSBwb3J0knMgVENBTSBDb3VudGVyIG9uIGEgVENBTSBoaXQuCiAqICAgICAgdmlkT3ZlcnJpZGUgIC0gVklEIE92ZXJyaWRlIEVuYWJsZS4KICogICAgICB2aWREYXRhICAgIC0gVklEIE92ZXJyaWRlIERhdGEuCiAqICAgICAgbmV4dElkICAgICAtIE5leHQgSW5kZXggb3IgRmxvdyBJRC4KICogICAgICBxcHJpT3ZlcnJpZGUgIC0gUVBSSSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgcXByaURhdGEgICAgICAtIFFQUkkgT3ZlcnJpZGUgRGF0YS4KICogICAgICBmcHJpT3ZlcnJpZGUgIC0gRlBSSSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZnByaURhdGEgICAgICAtIEZQUkkgT3ZlcnJpZGUgRGF0YS4KICogICAgICBxcHJpQXZiT3ZlcnJpZGUgIC0gUVBSSV9BVkIgT3ZlcnJpZGUgRW5hYmxlLgogKiAgICAgIHFwcmlBdmJEYXRhICAgICAgLSBRUFJJX0FWQiBPdmVycmlkZSBEYXRhLgogKiAgICAgIGRwdk92ZXJyaWRlICAtIERQViBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZHB2RGF0YSAgICAgIC0gRFBWIE92ZXJyaWRlIERhdGEuCiAqICAgICAgZmFjdGlvbk92ZXJyaWRlICAtIEZyYW1lIEFjdGlvbiBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZmFjdGlvbkRhdGEgICAgICAtIEZyYW1lIEFjdGlvbiBPdmVycmlkZSBEYXRhLgogKiAgICAgIGxkQmFsYW5jZU92ZXJyaWRlICAtIExvYWQgQmFsYW5jZSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgbGRCYWxhbmNlRGF0YSAgICAgIC0gTG9hZCBCYWxhbmNlIE92ZXJyaWRlIERhdGEuCiAqICAgICAgZGVidWdQb3J0ICAgIC0gRGVidWcgUG9ydCBOdW1iZXIuCiAqICAgICAgaGlnaEhpdCAgICAgIC0gVENBTSBFbnRyeSBmb3IgSGlnaCA0OC1ieXRlIEhpdC4uCiAqICAgICAgbG93SGl0ICAgICAgIC0gVENBTSBFbnRyeSBmb3IgSGlnaCA0OC1ieXRlIEhpdC4uCiovCnR5cGVkZWYgdW5pb24KewogIEdUX1UxNiAgZnJhbWVbMThdOwogIHN0cnVjdCB7CiAgICBHVF9VOCAgIGRlc3RBZGRyWzZdOwogICAgR1RfVTggICBzcmNBZGRyWzZdOwogICAgR1RfVTE2ICB0YWc7CiAgICBHVF9VMTYgIHByaVZpZDsKICAgIEdUX1UxNiAgZXRoVHlwZTsKICB9IHBhcmFGcm1IZDsKfSBHVF9UQ0FNX0ZSTV9IRDsKCnR5cGVkZWYgdW5pb24KewogIEdUX1UxNiAgZGF0YTsKICBzdHJ1Y3QgewogICAgR1RfVTE2ICAgb2N0Ojg7CiAgICBHVF9VMTYgICBtYXNrOjg7CiAgfSBzdHJ1YzsKfSBHVF9UQ0FNX0ZSQU1FOwoKdHlwZWRlZiB1bmlvbgp7CiAgR1RfVTE2ICBmcmFtZVsyOF07ICAvKiBmaXJzdCBwYXJ0IGlzIDAtNDggYnl0ZXMgb2YgZnJhbWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGFydCBpcyA0Ny05NiBieXRlcyBvZiBmcmFtZSAqLwogIHN0cnVjdCB7CiAgLyogUGcwIHJlZ2lzdGVycyAqLwogICAgR1RfVTE2ICAgICAgIHBnME9wOwoKICAgIEdUX1UxNiAgICAgICBwZzByZXMwOwoKICAgIEdUX1UxNiAgICAgICBzcHZSZXM6MzsKICAgIEdUX1UxNiAgICAgICB0eXBlMFJlczozOwogICAgR1RfVTE2ICAgICAgIGZyYW1lMFR5cGU6MjsKICAgIEdUX1UxNiAgICAgICBtYXNrVHlwZTo4OwoKICAgIEdUX1UxNiAgICAgICBzcHY6ODsKICAgIEdUX1UxNiAgICAgICBzcHZNYXNrOjg7CgogICAgR1RfVTE2ICAgICAgIHB2aWQwSGk6NDsKICAgIEdUX1UxNiAgICAgICBwcHJpMDo0OwogICAgR1RfVTE2ICAgICAgIHB2aWQwTWFza0hpOjQ7CiAgICBHVF9VMTYgICAgICAgcHByaTBNYXNrOjQ7CgogICAgR1RfVTE2ICAgICAgIHB2aWQwTG93Ojg7CiAgICBHVF9VMTYgICAgICAgcHZpZE1hc2swTG93Ojg7CgogICAgR1RfVENBTV9GUkFNRSBmcmFtZTBbMjJdOwogIH0gIHBhcmFGcm07Cn0gR1RfVENBTV9GUk0wX0RBVEE7CnR5cGVkZWYgdW5pb24KewogIEdUX1UxNiAgZnJhbWVbMjhdOyAgLyogZmlyc3QgcGFydCBpcyAwLTQ4IGJ5dGVzIG9mIGZyYW1lICovCiAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBhcnQgaXMgNDctOTYgYnl0ZXMgb2YgZnJhbWUgKi8KICBzdHJ1Y3QgewogIC8qIFBnMSByZWdpc3RlcnMgKi8KICAgIEdUX1UxNiAgICAgICBwZzFPcDsKICAgIEdUX1UxNiAgICAgICBwZzFyZXMwOwogICAgR1RfVENBTV9GUkFNRSBmcmFtZTFbMjZdOwoKICB9ICBwYXJhRnJtOwp9IEdUX1RDQU1fRlJNMV9EQVRBOwp0eXBlZGVmIHVuaW9uCnsKICBHVF9VMTYgIGZyYW1lWzI4XTsgIC8qIGZpcnN0IHBhcnQgaXMgMC00OCBieXRlcyBvZiBmcmFtZSAqLwogICAgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwYXJ0IGlzIDQ3LTk2IGJ5dGVzIG9mIGZyYW1lICovCiAgc3RydWN0IHsKICAvKiBQZzIgcmVnaXN0ZXJzICovCiAgICBHVF9VMTYgICAgICAgcGcyT3A7CgogICAgR1RfVTE2ICAgICAgIHBnMnJlczA7CgogICAgR1RfVTE2ICAgICAgIHZpZERhdGE6MTI7CiAgICBHVF9VMTYgICAgICAgcGcycmVzMToxOwogICAgR1RfVTE2ICAgICAgIEluY1RjYW1DdHI6MTsKICAgIEdUX1UxNiAgICAgICBpbnRlcnJ1cHQ6MTsKICAgIEdUX1UxNiAgICAgICBjb250aW51OjE7CgogICAgR1RfVTE2ICAgICAgICBmcHJpRGF0YTozOwogICAgR1RfVTE2ICAgICAgICBwZzJyZXMzOjE7CiAgICBHVF9VMTYgICAgICAgIHFwcmlEYXRhOjI7CiAgICBHVF9VMTYgICAgICAgIHBnMnJlczI6MjsKICAgIEdUX1UxNiAgICAgICAgbmV4dElkOjg7CgogICAgR1RfVTE2ICAgICAgICBkcHZEYXRhOjExOwogICAgR1RfVTE2ICAgICAgICBwZzJyZXM1OjE7CiAgICBHVF9VMTYgICAgICAgIHFwcmlBdmJEYXRhOjI7CiAgICBHVF9VMTYgICAgICAgIHBnMnJlczQ6MjsKCiAgICBHVF9VMTYgICAgICAgIGxkQmFsYW5jZURhdGE6MzsKICAgIEdUX1UxNiAgICAgICAgcGcycmVzNzoxOwogICAgR1RfVTE2ICAgICAgIGZhY3Rpb25EYXRhOjExOwogICAgR1RfVTE2ICAgICAgICBwZzJyZXM2OjE7CiAgfSAgcGFyYUZybTsKfSBHVF9UQ0FNX0ZSTTJfREFUQTsKCnR5cGVkZWYgc3RydWN0CnsKICAvKiBQZzAgcmVnaXN0ZXJzICovCiAgR1RfVENBTV9GUk0wX0RBVEEgZnJhbWUwOwogIC8qIFBnMSByZWdpc3RlcnMgKi8KICBHVF9UQ0FNX0ZSTTFfREFUQSBmcmFtZTE7CiAgLyogUGcyIHJlZ2lzdGVycyAqLwogIEdUX1RDQU1fRlJNMl9EQVRBIGZyYW1lMjsKfSBHVF9UQ0FNX0ZSTV9EQVRBOwoKdHlwZWRlZiBzdHJ1Y3QKewogIEdUX1RDQU1fRlJNX0RBVEEgIHJhd0ZybURhdGFbMl07ICAvKiBmaXJzdCBwYXJ0IGlzIDAtNDggYnl0ZXMgb2YgZnJhbWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBhcnQgaXMgNDctOTYgYnl0ZXMgb2YgZnJhbWUgKi8KICAgIEdUX1U4ICAgICAgICBmcmFtZVR5cGU7CiAgICBHVF9VOCAgICAgICAgZnJhbWVUeXBlTWFzazsKICAgIEdUX1U4ICAgICAgICBzcHY7CiAgICBHVF9VOCAgICAgICAgc3B2TWFzazsKICAgIEdUX1U4ICAgICAgICBwcHJpOwogICAgR1RfVTggICAgICAgIHBwcmlNYXNrOwogICAgR1RfVTE2ICAgICAgIHB2aWQ7CiAgICBHVF9VMTYgICAgICAgcHZpZE1hc2s7CiAgICBHVF9VOCAgICAgICAgZnJhbWVPY3RldFs5Nl07CiAgICBHVF9VOCAgICAgICAgZnJhbWVPY3RldE1hc2tbOTZdOwogICAgR1RfVTggICAgICAgIGNvbnRpbnU7CiAgICBHVF9VOCAgICAgICAgaW50ZXJydXB0OwogICAgR1RfVTggICAgICAgIEluY1RjYW1DdHI7CiAgICBHVF9VOCAgICAgICAgdmlkT3ZlcnJpZGU7CiAgICBHVF9VMTYgICAgICAgdmlkRGF0YTsKICAgIEdUX1U4ICAgICAgICBuZXh0SWQ7CiAgICBHVF9VOCAgICAgICAgcXByaURhdGE7CiAgICBHVF9VOCAgICAgICAgZnByaURhdGE7CiAgICBHVF9VOCAgICAgICAgcXByaUF2YkRhdGE7CiAgICBHVF9VOCAgICAgICAgZHB2RGF0YTsKICAgIEdUX1U4ICAgICAgICBmYWN0aW9uT3ZlcnJpZGU7CiAgICBHVF9VMTYgICAgICAgZmFjdGlvbkRhdGE7CiAgICBHVF9VOCAgICAgICAgbGRCYWxhbmNlT3ZlcnJpZGU7CiAgICBHVF9VOCAgICAgICAgbGRCYWxhbmNlRGF0YTsKICAgIEdUX1U4ICAgICAgICBkZWJ1Z1BvcnQ7CiAgICBHVF9VOCAgICAgICAgaGlnaEhpdDsKICAgIEdUX1U4ICAgICAgICBsb3dIaXQ7CiAgICBHVF9VOCAgICAgICAgaXM5NkZyYW1lOwp9IEdUX1RDQU1fREFUQTsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVENBTV9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBUQ0FNIChUZXJuYXJ5IENvbnRlbnQgQWRkcmVzc2FibGUgTWVtb3J5KSBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICB0Y2FtUGFnZSAtIHBhZ2UgIG9mIFRDQU0KICogICAgICB0Y2FtRW50cnkgLSBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVudHJ5IG9mIFRDQU0KICogICAgICB0Y2FtRGF0YSAtIFRDQU0gZGF0YSBmb3IgdGhlIGVudHJ5IHBvaW50ZWQgYnkgdGNhbUVudHJ5CiAqLwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHRjYW1QYWdlOwogICAgR1RfVTMyICAgIHRjYW1FbnRyeTsKICAgIEdUX1RDQU1fREFUQSAgICAqdGNhbURhdGFQOwp9IEdUX1RDQU1fT1BfREFUQTsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0VWRU5UX1RZUEUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgaGFyZHdhcmUgZHJpdmVuIGV2ZW50cy4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0FWQl9JTlQgICAgLSBBVkIgSW50ZXJydXB0IEVuYWJsZQogKiAgIEdUX0RFVklDRV9JTlQgLSBEZXZpY2UgSW50ZXJydXB0IChHVF9ERVZJQ0VfSU5UX1RZUEUpIEVuYWJsZQogKiAgIEdUX1NUQVRTX0RPTkUgLSBTdGF0aXN0aWNzIE9wZXJhdGlvbiBEb25lIGludGVycnJ1cHQgRW5hYmxlCiAqICAgR1RfVlRVX1BST0IgLSBWTEFOIFByb2JsZW0vVmlvbGF0aW9uIEludGVycnVwdCBFbmFibGUKICogICBHVF9WVFVfRE9ORSAtIFZBTE4gVGFibGUgT3BlcmF0aW9uIERvbmUgSW50ZXJydXB0IEVuYWJsZQogKiAgIEdUX0FUVV9QUk9CIC0gQVRVIFByb2JsZW0vVmlvbGF0aW9uIEludGVycnVwdCBFbmFibGUsIGZvciBHaWdhYml0IFN3aXRjaAogKiAgIEdUX0FUVV9GVUxMIC0gQVRVIGZ1bGwgaW50ZXJydXB0IGVuYWJsZSwgZm9yIEZhc3QgRXRoZXJuZXQgU3dpdGNoCiAqICAgR1RfQVRVX0RPTkUgLSBBVFUgRG9uZSBpbnRlcnJ1cHQgZW5hYmxlLgogKiAgIEdUX1BIWV9JTlQgIC0gUEhZIGludGVycnVwdCBlbmFibGUsIGZvciBGYXN0IEV0aGVybmV0IFN3aXRjaAogKiAgIEdUX0VFX0lOVCAgIC0gRUVQUk9NIERvbmUgaW50ZXJydXB0IGVuYWJsZS4KICovCiNkZWZpbmUgR1RfQVZCX0lOVCAgICAgICAgICAgICAgIDB4MTAwCiNkZWZpbmUgR1RfREVWSUNFX0lOVCAgICAgICAgICAgMHg4MAojZGVmaW5lIEdUX1NUQVRTX0RPTkUgICAgICAgICAgIDB4NDAKI2RlZmluZSBHVF9WVFVfUFJPQiAgICAgICAgICAgICAweDIwCiNkZWZpbmUgR1RfVlRVX0RPTkUgICAgICAgICAgICAgMHgxMAojZGVmaW5lIEdUX0FUVV9QUk9CICAgICAgICAgMHg4CiNkZWZpbmUgR1RfQVRVX0ZVTEwgICAgICAgICAweDgKI2RlZmluZSBHVF9BVFVfRE9ORSAgICAgICAgICAgIDB4NAojZGVmaW5lIEdUX1BIWV9JTlRFUlJVUFQgICAgMHgyICAgICAgICAvKiBEZXZpY2UgbWF5IG5vdCBzdXBwb3J0IFBIWSBJbnQuIFBsZWFzZSByZWZlciB0byBkYXRhc2hlZXQuICovCiNkZWZpbmUgR1RfRUVfSU5URVJSVVBUICAgICAgICAweDEKCiNkZWZpbmUgR1RfSU5UX01BU0sgICAgICAgICAgICBcCiAgICAgICAgKEdUX0FWQl9JTlQgfCBHVF9ERVZJQ0VfSU5UIHwgR1RfU1RBVFNfRE9ORSB8IEdUX1ZUVV9QUk9CIHwgR1RfVlRVX0RPTkUgfCBHVF9BVFVfRlVMTCB8ICAgICBcCiAgICAgICAgR1RfQVRVX0RPTkUgfCBHVF9QSFlfSU5URVJSVVBUIHwgR1RfRUVfSU5URVJSVVBUKQojZGVmaW5lIEdUX05PX0lOVEVSTkFMX1BIWV9JTlRfTUFTSyAgICAgICAgXAogICAgICAgIChHVF9BVkJfSU5UIHwgR1RfREVWSUNFX0lOVCB8IEdUX1NUQVRTX0RPTkUgfCBHVF9WVFVfUFJPQiB8IEdUX1ZUVV9ET05FIHwgR1RfQVRVX1BST0IgfCAgICAgXAogICAgICAgIEdUX0FUVV9ET05FIHwgR1RfRUVfSU5URVJSVVBUKQoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfREVWX0VWRU5UCiAqCiAqICBEZXNjcmlwdGlvbjogRGV2aWNlIGludGVycnVwdCBzdGF0dXMKICoKICogIEZpZWxkczoKICogICAgICBldmVudCAgICAgLSBEZXZpY2UgSW50ZXJydXB0cyB0byBiZSBlbmFibGVkCiAqICAgICAgICAgICAgICAgICAgICBHVF9ERVZfSU5UX1dBVENIRE9HLCBHVF9ERVZfSU5UX0pBTUxJTUlULAogKiAgICAgICAgICAgICAgICAgICAgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0gsIGFuZC9vciBHVF9ERVZfSU5UX1NFUkRFU19MSU5LCiAqICAgICAgcG9ydExpc3QgIC0gU0VSREVTIHBvcnQgbGlzdCB3aGVyZSBHVF9ERVZfSU5UX1NFUkRFU19MSU5LIGludGVycnVwdCBuZWVkcwogKiAgICAgICAgICAgICAgICAgICAgdG8gYmUgYXNzZXJ0ZWQuIEl0J3MgaW4gdmVjdG9yIGZvcm1hdCwgQml0IDEwIGlzIGZvciBwb3J0IDEwLAogKiAgICAgICAgICAgICAgICAgICAgQml0IDkgaXMgZm9yIHBvcnQgOSwgZXRjLgogKiAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiBHVF9ERVZfSU5UX1NFUkRFU19MSU5LIGJpdCBpcyBzZXQuCiAqICAgICAgcGh5TGlzdCAgIC0gUGh5IGxpc3Qgd2hlcmUgR1RfREVWX0lOVF9QSFkgaW50ZXJydXB0IG5lZWRzIHRvIGJlIGFzc2VydGVkLgogKiAgICAgICAgICAgICAgICAgICAgSXQncyBpbiB2ZWN0b3IgZm9ybWF0LCBCaXQgMCBpcyBmb3IgcG9ydCAwLAogKiAgICAgICAgICAgICAgICAgICAgQml0IDEgaXMgZm9yIHBvcnQgMSwgZXRjLgogKiAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiBHVF9ERVZfSU5UX1BIWSBiaXQgaXMgc2V0LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgICAgICBldmVudDsKICAgIEdUX1UzMiAgICAgICAgcG9ydExpc3Q7CiAgICBHVF9VMzIgICAgICAgIHBoeUxpc3Q7Cn0gR1RfREVWX0VWRU5UOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfREVWX0lOVF9TVEFUVVMKICoKICogIERlc2NyaXB0aW9uOiBEZXZpY2UgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGludENhdXNlICAtIERldmljZSBJbnRlcnJ1cHQgQ2F1c2UKICogICAgICAgICAgICAgICAgICAgIEdUX0RFVl9JTlRfV0FUQ0hET0csIEdUX0RFVl9JTlRfSkFNTElNSVQsCiAqICAgICAgICAgICAgICAgICAgICBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCwgYW5kL29yIEdUX0RFVl9JTlRfU0VSREVTX0xJTksKICogICAgICAgIHBvcnQgICAgICAtIGxvZ2ljYWwgcG9ydCB3aGVyZSBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCBvY2N1cnJlZC4KICogICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgaWYgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0ggaXMgc2V0LgogKiAgICAgIGxpbmtJbnQgICAtIFNFUkRFUyBwb3J0IGxpc3Qgd2hlcmUgR1RfREVWX0lOVF9TRVJERVNfTElOSyBpbnRlcnJ1cHQgaXMKICogICAgICAgICAgICAgICAgICAgIGFzc2VydGVkLiBJdCdzIGluIHZlY3RvciBmb3JtYXQsIEJpdCAxMCBpcyBmb3IgcG9ydCAxMCwKICogICAgICAgICAgICAgICAgICAgIEJpdCA5IGlzIGZvciBwb3J0IDksIGV0Yy4KICogICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgaWYgR1RfREVWX0lOVF9TRVJERVNfTElOSyBiaXQgaXMgc2V0LgogKiAgICAgICAgICAgICAgICAgICAgVGhlc2UgYml0cyBhcmUgb25seSB2YWxpZCBvZiB0aGUgcG9ydCB0aGF0IGlzIGluIDEwMDBCYXNlLVggbW9kZS4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICAgICAgZGV2SW50Q2F1c2U7CiAgICBHVF9MUE9SVCAgICBwb3J0OwogICAgR1RfVTMyICAgICAgICBsaW5rSW50OwogICAgR1RfVTMyICAgICAgICBwaHlJbnQ7Cn0gR1RfREVWX0lOVF9TVEFUVVM7CgoKLyoKKiBHVF9ERVZJQ0VfSU5UCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgRGV2aWNlIGludGVycnVwdAoqICAgIEdUX0RFVl9JTlRfV0FUQ0hET0cgICAgICAgIC0gV2F0Y2hEb2cgZXZlbnQgaW50ZXJydXB0IChXYXRjaERvZyBldmVudCBjYW4gYmUKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgd2l0aCBnd2RTZXRFdmVudCBBUEkpCiogICAgR1RfREVWX0lOVF9KQU1MSU1JVCAgICAgICAgLSBhbnkgb2YgdGhlIHBvcnRzIGRldGVjdCBhbiBJbmdyZXNzIEphbSBMaW1pdCB2aW9sYXRpb24KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncHJ0U2V0UGF1c2VMaW1pdEluIEFQSSkKKiAgICBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCAgICAtIGFueSBvZiB0aGUgcG9ydHMgZGV0ZWN0IGEgZHVwbGV4IG1pc21hdGNoCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiwgdGhlIGxvY2FsIHBvcnQgaXMgaW4gaGFsZiBkdXBsZXggbW9kZSB3aGlsZQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgcGFydG5lciBpcyBpbiBmdWxsIGR1cGxleCBtb2RlKQoqICAgIEdUX0RFVl9JTlRfU0VSREVTX0xJTksgICAgLSBTRVJERVMgbGluayBjaGFnZSBpbnRlcnJ1cHQuCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlcnJ1cHQgb2NjdXJzIHdoZW4gYSBTRVJERVMgcG9ydCBjaGFuZ2VzIGxpbmsKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAobGluayB1cCBvciBsaW5rIGRvd24pCiovCgojZGVmaW5lIEdUX0RFVl9JTlRfV0FUQ0hET0cgICAgICAgICAgICAweDgKI2RlZmluZSBHVF9ERVZfSU5UX0pBTUxJTUlUICAgICAgICAgICAgMHg0CiNkZWZpbmUgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0ggICAgMHgyCiNkZWZpbmUgR1RfREVWX0lOVF9TRVJERVNfTElOSyAgICAgICAgMHgxCiNkZWZpbmUgR1RfREVWX0lOVF9XQUtFX0VWRU5UICAgICAgICAgMHgxCiNkZWZpbmUgR1RfREVWX0lOVF9QSFkgICAgICAgICAgICAgICAgMHgxMAoKLyoKKiBHVF9XQVRDSERPR19FVkVOVAoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIFdhdGNoRG9nIGV2ZW50CiogICAgICAgIEdUX1dEX1FDICAtIFF1ZXVlIENvbnRyb2xsZXIgV2F0Y2ggRG9nIGVuYWJsZS4KKiAgICAgICAgICAgICAgICAgICAgV2hlbiBlbmFibGVkLCB0aGUgUUMncyB3YXRjaCBkb2cgY2lyY3VpdCBjaGVja3MgZm9yIGxpbmsKKiAgICAgICAgICAgICAgICAgICAgbGlzdCBlcnJvcnMgYW5kIGFueSBlcnJvcnMgZm91bmQgaW4gdGhlIFFDLgoqICAgICAgICBHVF9XRF9FR1JFU1MgLSBFZ3Jlc3MgV2F0Y2ggRG9nIGVuYWJsZS4KKiAgICAgICAgICAgICAgICAgICAgV2hlbiBlbmFibGVkLCBlYWNoIHBvcnQncyBlZ3Jlc3MgY2lyY3VpdCBjaGVja3MgZm9yIHByb2JsZW1zCiogICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdGhlIHBvcnQgYW5kIHRoZSBRdWV1ZSBDb250cm9sbGVyLgoqICAgICAgICBHVF9XRF9GT1JDRSAtIEZvcmNlIGEgV2F0Y2ggRG9nIGV2ZW50LgoqLwoKI2RlZmluZSBHVF9XRF9RQyAgICAgICAgMHgxCiNkZWZpbmUgR1RfV0RfRUdSRVNTICAgIDB4MgojZGVmaW5lIEdUX1dEX0ZPUkNFICAgICAgICAweDQKCgovKgoqIHR5cGVkZWY6IHN0cnVjdCBHVF9XRF9FVkVOVF9ISVNUT1JZCioKKiBEZXNjcmlwdGlvbjogV2F0Y2hEb2cgRXZlbnQgSGlzdG9yeSAoY2xlYXJlZCBvbmx5IGJ5IGEgaGFyZHdhcmUgcmVzZXQpCiogICAgICAgIHdkRXZlbnQgICAtIFdoZW4gaXQncyBzZXQgdG8gR1RfVFJVRSwgc29tZSBlbmFibGVkIFdhdGNoIERvZyBldmVudCBvY2N1cnJlZC4KKiAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBldmVudHMgYXJlIHBvc3NpYmxlOgoqICAgICAgICAgICAgICAgICAgICAgICAgUUMgV2F0Y2hEb2cgRXZlbnQgKEdUX1dEX1FDKQoqICAgICAgICAgICAgICAgICAgICAgICAgRWdyZXNzIFdhdGNoRG9nIEV2ZW50IChHVF9XRF9FR1JFU1MpCiogICAgICAgICAgICAgICAgICAgICAgICBGb3JjZWQgV2F0Y2hEb2cgRXZlbnQgKEdUX1dEX0ZPUkNFKQoqICAgICAgICBlZ3Jlc3NFdmVudC1JZiBhbnkgcG9ydCdzIGVncmVzcyBsb2dpYyBkZXRlY3RzIGFuIGVncmVzcyB3YXRjaCBkb2cgaXNzdWUsCiogICAgICAgICAgICAgICAgICAgIHRoaXMgZmllbGQgaXMgc2V0IHRvIEdUX1RSVUUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuYWJsaW5nIEdUX1dEX0VHUkVTUwoqICAgICAgICAgICAgICAgICAgICBldmVudC4KKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICB3ZEV2ZW50OwogICAgR1RfQk9PTCBlZ3Jlc3NFdmVudDsKfSBHVF9XRF9FVkVOVF9ISVNUT1JZOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9QSFlfSU5UCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgUEhZIGludGVycnVwdAoqLwoKI2RlZmluZSBHVF9TUEVFRF9DSEFOR0VEICAgICAgICAgMHg0MDAwCiNkZWZpbmUgR1RfRFVQTEVYX0NIQU5HRUQgICAgICAgIDB4MjAwMAojZGVmaW5lIEdUX1BBR0VfUkVDRUlWRUQgICAgICAgIDB4MTAwMAojZGVmaW5lIEdUX0FVVE9fTkVHX0NPTVBMRVRFRCAgICAweDgwMAojZGVmaW5lIEdUX0xJTktfU1RBVFVTX0NIQU5HRUQgICAgMHg0MDAKI2RlZmluZSBHVF9TWU1CT0xfRVJST1IgICAgICAgICAgICAweDIwMAojZGVmaW5lIEdUX0ZBTFNFX0NBUlJJRVIgICAgICAgIDB4MTAwCiNkZWZpbmUgR1RfRklGT19GTE9XICAgICAgICAgICAgMHg4MAojZGVmaW5lIEdUX0NST1NTT1ZFUl9DSEFOR0VEICAgIDB4NDAKI2RlZmluZSBHVF9QT0xBUklUWV9DSEFOR0VEICAgICAgICAweDIKI2RlZmluZSBHVF9KQUJCRVIgICAgICAgICAgICAgICAgMHgxCgojZGVmaW5lIEdUX0FVVE9fTkVHX0VSUk9SICAgICAgICAweDgwMDAKI2RlZmluZSBHVF9ET1dOU0hJRlRfREVURUNUICAgICAgICAweDIwCiNkZWZpbmUgR1RfRU5FUkdZX0RFVEVDVCAgICAgICAgMHgxMAoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX1BIWV9BVVRPX01PREUKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBBdXRvbmVnb3RpYXRpb24gbW9kZS4KKiAgICBBdXRvIGZvciBib3RoIHNwZWVkIGFuZCBkdXBsZXguCiogICAgQXV0byBmb3Igc3BlZWQgb25seSBhbmQgRnVsbCBkdXBsZXguCiogICAgQXV0byBmb3Igc3BlZWQgb25seSBhbmQgSGFsZiBkdXBsZXguICgxMDAwTWJwcyBpcyBub3Qgc3VwcG9ydGVkKQoqICAgIEF1dG8gZm9yIGR1cGxleCBvbmx5IGFuZCBzcGVlZCAxMDAwTWJwcy4KKiAgICBBdXRvIGZvciBkdXBsZXggb25seSBhbmQgc3BlZWQgMTAwTWJwcy4KKiAgICBBdXRvIGZvciBkdXBsZXggb25seSBhbmQgc3BlZWQgMTBNYnBzLgoqICAgIDEwMDBNYnBzIEZ1bGwgZHVwbGV4LgoqICAgIDEwME1icHMgRnVsbCBkdXBsZXguCiogICAgMTAwTWJwcyBIYWxmIGR1cGxleC4KKiAgICAxME1icHMgRnVsbCBkdXBsZXguCiogICAgMTBNYnBzIEhhbGYgZHVwbGV4LgoqLwoKdHlwZWRlZiBlbnVtCnsKICAgIFNQRUVEX0FVVE9fRFVQTEVYX0FVVE8sCiAgICBTUEVFRF8xMDAwX0RVUExFWF9BVVRPLAogICAgU1BFRURfMTAwX0RVUExFWF9BVVRPLAogICAgU1BFRURfMTBfRFVQTEVYX0FVVE8sCiAgICBTUEVFRF9BVVRPX0RVUExFWF9GVUxMLAogICAgU1BFRURfQVVUT19EVVBMRVhfSEFMRiwKICAgIFNQRUVEXzEwMDBfRFVQTEVYX0ZVTEwsCiAgICBTUEVFRF8xMDAwX0RVUExFWF9IQUxGLAogICAgU1BFRURfMTAwX0RVUExFWF9GVUxMLAogICAgU1BFRURfMTAwX0RVUExFWF9IQUxGLAogICAgU1BFRURfMTBfRFVQTEVYX0ZVTEwsCiAgICBTUEVFRF8xMF9EVVBMRVhfSEFMRgp9R1RfUEhZX0FVVE9fTU9ERTsKCgovKgoqIHR5cGVkZWY6IGVudW0gR1RfUEhZX1BBVVNFX01PREUKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBQYXVzZSBNb2RlIGluIHRoZSBQaHkuCioKKiBFbnVtZXJhdGlvbnM6CiogICAgR1RfUEhZX05PX1BBVVNFICAgICAgICAtIGRpc2FibGUgcGF1c2UKKiAgICBHVF9QSFlfUEFVU0UgICAgICAgIC0gc3VwcG9ydCBwYXVzZQoqICAgIEdUX1BIWV9BU1lNTUVUUklDX1BBVVNFICAgIC0gc3VwcG9ydCBhc3ltbWV0cmljIHBhdXNlCiogICAgR1RfUEhZX0JPVEhfUEFVU0UgICAgLSBzdXBwb3J0IGJvdGggcGF1c2UgYW5kIGFzeW1tZXRyaWMgcGF1c2UKKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BIWV9OT19QQVVTRSA9IDAsCiAgICBHVF9QSFlfUEFVU0UsCiAgICBHVF9QSFlfQVNZTU1FVFJJQ19QQVVTRSwKICAgIEdUX1BIWV9CT1RIX1BBVVNFCn0gR1RfUEhZX1BBVVNFX01PREU7CgoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX1BIWV9TUEVFRAoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIFBoeSBTcGVlZAoqCiogRW51bWVyYXRpb25zOgoqICAgIFBIWV9TUEVFRF8xMF9NQlBTICAgLSAxME1icHMKKiAgICBQSFlfU1BFRURfMTAwX01CUFMgICAgLSAxMDBNYnBzCiogICAgUEhZX1NQRUVEXzEwMDBfTUJQUyAtIDEwMDBNYnBzCiovCnR5cGVkZWYgZW51bQp7CiAgICBQSFlfU1BFRURfMTBfTUJQUywKICAgIFBIWV9TUEVFRF8xMDBfTUJQUywKICAgIFBIWV9TUEVFRF8xMDAwX01CUFMKfSBHVF9QSFlfU1BFRUQ7CgoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX1NFUkRFU19NT0RFCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgU2VyZGVzIG1vZGUKKgoqIEVudW1lcmF0aW9uczoKKiAgICBQSFlfU0VSREVTXzEwMEZYICAgICAtIDEwMCBGWAoqICAgIFBIWV9TRVJERVNfMTAwMFggICAgIC0gMTAwMCBYCiogICAgUEhZX1NFUkRFU19TR01JSV9QSFkgLSBTR01JSSBQSFkKKiAgICBQSFlfU0VSREVTX1NHTUlJX01BQyAtIFNHTUlJIE1BQwoqLwp0eXBlZGVmIGVudW0KewogICAgUEhZX1NFUkRFU18xMDBGWCA9IDAsCiAgICBQSFlfU0VSREVTXzEwMDBYLAogICAgUEhZX1NFUkRFU19TR01JSV9QSFksCiAgICBQSFlfU0VSREVTX1NHTUlJX01BQwp9IEdUX1NFUkRFU19NT0RFOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9FREVURUNUX01PREUKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBFbmVyZ3kgRGV0ZWN0IG1vZGUKKgoqIEVudW1lcmF0aW9uczoKKiAgICBHVF9FREVURUNUX09GRiAgICAgICAgLSBFbmVyZ3kgRGV0ZWN0IGRpc2FibGVkCiogICAgR1RfRURFVEVDVF9TRU5TRV9QVUxTRSAgICAtIEVuZXJneSBEZXRlY3QgZW5hYmxlZCB3aXRoIHNlbnNlIGFuZCBwdWxzZQoqICAgIEdUX0VERVRFQ1RfU0VOU0UgICAgLSBFbmVyZ3kgRGV0ZWN0IGVuYWJsZWQgb25seSB3aXRoIHNlbnNlCiovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9FREVURUNUX09GRiA9IDAsCiAgICBHVF9FREVURUNUX1NFTlNFX1BVTFNFLAogICAgR1RfRURFVEVDVF9TRU5TRQp9IEdUX0VERVRFQ1RfTU9ERTsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfSU5HUkVTU19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBpbmdyZXNzIG1vZGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9VTk1PRElGWV9JTkdSRVNTIC0gZnJhbWVzIGFyZSByZWNlaXZlIHVubW9kaWZpZWQuCiAqICAgR1RfVFJBSUxFUl9JTkdSRVNTICAtIGFsbCBmcmFtZXMgYXJlIHJlY2VpdmVkIHdpdGggdHJhaWxlci4KICogICBHVF9VTlRBR0dFRF9JTkdSRVNTICAtIHJlbW92ZSB0YWcgb24gcmVjZWl2ZSAoZm9yIGRvdWJsZSB0YWdnaW5nKS4KICogICBHVF9DUFVQT1JUX0lOR1JFU1MgLSBubyB0cmFpbGVyLiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBDUFUgcG9ydCBmb3IgSUdNUC9NTEQgU25vb3BpbmcKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9VTk1PRElGWV9JTkdSRVNTID0gMCwgIC8qIDB4MDAgKi8KICAgIEdUX1RSQUlMRVJfSU5HUkVTUywgICAgICAgLyogMHgwMSAqLwogICAgR1RfVU5UQUdHRURfSU5HUkVTUywgICAgICAvKiAweDEwICovCiAgICBHVF9DUFVQT1JUX0lOR1JFU1MgICAgICAgIC8qIDB4MTEgKi8KfSBHVF9JTkdSRVNTX01PREU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9FR1JFU1NfRkxPT0QKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGluZ3Jlc3MgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOIC0gZG8gbm90IGVncmVzcyBmcmFtZSB3aXRoIHVua25vd24gREEKICogICBHVF9CTE9DS19FR1JFU1NfVU5LTk9XTl9NVUxUSUNBU1QgLSBkbyBub3QgZWdyZXNzIGZyYW1lIHdpdGggdW5rbm93biBtdWx0aWNhc3QgREEKICogICBHVF9CTE9DS19FR1JFU1NfVU5LTk9XTl9VTklJQ0FTVCAtIGRvIG5vdCBlZ3Jlc3MgZnJhbWUgd2l0aCB1bmtub3duIHVuaWNhc3QgREEKICogICBHVF9CTE9DS19FR1JFU1NfTk9ORSAtIGVncmVzcyBhbGwgZnJhbWVzIHdpdGggdW5rbm93biBEQQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOID0gMCwKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX01VTFRJQ0FTVCwKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX1VOSUNBU1QsCiAgICBHVF9CTE9DS19FR1JFU1NfTk9ORQp9IEdUX0VHUkVTU19GTE9PRDsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9NQ19SQVRFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgaW5ncmVzcyBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX01DXzNfUEVSQ0VOVF9STCAgIC0gbXVsdGljYXN0IHJhdGUgaXMgbGltaXRlZCB0byAzIHBlcmNlbnQuCiAqICAgICAgR1RfTUNfNl9QRVJDRU5UX1JMICAgLSBtdWx0aWNhc3QgcmF0ZSBpcyBsaW1pdGVkIHRvIDYgcGVyY2VudC4KICogICAgICBHVF9NQ18xMl9QRVJDRU5UX1JMICAtIG11bHRpY2FzdCByYXRlIGlzIGxpbWl0ZWQgdG8gMTIgcGVyY2VudC4KICogICAgICBHVF9NQ18xMDBfUEVSQ0VOVF9STCAtIHVubGltaXRlZCBtdWx0aWNhc3QgcmF0ZS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9NQ18zX1BFUkNFTlRfUkwgPSAwLAogICAgR1RfTUNfNl9QRVJDRU5UX1JMLAogICAgR1RfTUNfMTJfUEVSQ0VOVF9STCwKICAgIEdUX01DXzEwMF9QRVJDRU5UX1JMLAp9IEdUX01DX1JBVEU7CgoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfSU5HUkVTU19SQVRFX01PREUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBpbmdyZXNzIHJhdGUgbGltaXQgbW9kZS4KICoKICogIEVudW1lcmF0aW9uczoKICogICAgICBHVF9SQVRFX1BSSV9CQVNFICAgLSBQcmlvcml0eSBiYXNlZCByYXRlIGxpbWl0aW5nCiAqICAgICAgICBHVF9SQVRFX0JVUlNUX0JBU0UgLSBCdXJzdCBTaXplIGJhc2VkIHJhdGUgbGltaXRpbmcKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9SQVRFX1BSSV9CQVNFID0gMCwKICAgIEdUX1JBVEVfQlVSU1RfQkFTRQp9IEdUX0lOR1JFU1NfUkFURV9NT0RFOwoKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX1BPUlRfU0NIRURfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHBvcnQgc2NoZWR1bGluZyBtb2RlCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICAgR1RfUE9SVF9TQ0hFRF9XRUlHSFRFRF9SUkIgLSB1c2UgOCw0LDIsMSB3ZWlnaHRlZCBmYWlyIHNjaGVkdWxpbmcKICogICAgICAgICBHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkzIC0gdXNlIGEgc3RyaWN0IGZvciBwcmlvcml0eSAzIGFuZCB3ZWlnaHRlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kIHJvYmluIGZvciB0aGUgcHJpb3JpdHkgMiwxLGFuZCAwCiAqICAgICAgICAgR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJMl8zIC0gdXNlIGEgc3RyaWN0IGZvciBwcmlvcml0eSAyLDMgYW5kIHdlaWdodGVkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQgcm9iaW4gZm9yIHRoZSBwcmlvcml0eSAxLGFuZCAwCiAqICAgICAgICAgR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJIC0gdXNlIGEgc3RyaWN0IHByaW9yaXR5IHNjaGVtZQogKgogKiAgQ29tbWVudDoKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QT1JUX1NDSEVEX1dFSUdIVEVEX1JSQiA9IDAsCiAgICBHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkzLAogICAgR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJMl8zLAogICAgR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJCn0gR1RfUE9SVF9TQ0hFRF9NT0RFOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUE9SVF9TVEFUCiAqCiAqICBEZXNjcmlwdGlvbjogcG9ydCBzdGF0aXN0aWMgc3RydWN0LgogKgogKiAgRmllbGRzOgogKiAgICAgIHJ4Q3RyICAgLSBwb3J0IHJlY2VpdmUgY291bnRlci4KICogICAgICB0eEN0ciAgIC0gcG9ydCB0cmFuc21pdCBjb3VudGVyLgogKiAgICAgIGRyb3BwZWQgLSBkcm9wcGVkIGZyYW1lIGNvdW50ZXIuCiAqCiAqICBDb21tZW50OgogKiAgICAgICAgZHJvcHBlZCBmcmFtZSBjb3VudGVyIGlzIHN1cHBvcnRlZCBieSBvbmx5IGxpbWl0ZWQgZGV2aWNlcy4KICogICAgICAgIEF0IHRoaXMgbW9tZW50LCA4OEU2MDYxLzg4RTYwNjUgYXJlIHRoZSBkZXZpY2VzIHN1cHBvcnRpbmcKICogICAgICAgIGRyb3BwZWQgZnJhbWUgY291bnRlci4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UxNiAgcnhDdHI7CiAgICBHVF9VMTYgIHR4Q3RyOwogICAgR1RfVTE2ICBkcm9wcGVkOwp9IEdUX1BPUlRfU1RBVDsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUE9SVF9TVEFUMgogKgogKiAgRGVzY3JpcHRpb246IHBvcnQgc3RhdGlzdGljIHN0cnVjdC4KICoKICogIEZpZWxkczoKICogICAgICBpbkRpc2NhcmRMbyAtIEluRGlzY2FyZHMgTG93IEZyYW1lIENvdW50ZXIKICogICAgICBpbkRpc2NhcmRIaSAtIEluRGlzY2FyZHMgSGlnaCBGcmFtZSBDb3VudGVyCiAqICAgICAgaW5GaWx0ZXJlZCAgLSBJbkZpbHRlcmVkIEZyYW1lIENvdW50ZXIKICogICAgICBvdXRGaWx0ZXJlZCAtIE91dEZpbHRlcmVkIEZyYW1lIENvdW50ZXIKICoKICogIENvbW1lbnQ6CiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgIGluRGlzY2FyZExvOwogICAgR1RfVTE2ICBpbkRpc2NhcmRIaTsKICAgIEdUX1UxNiAgaW5GaWx0ZXJlZDsKICAgIEdUX1UxNiAgb3V0RmlsdGVyZWQ7Cn0gR1RfUE9SVF9TVEFUMjsKCgovKgogKiogIHR5cGVkZWY6IHN0cnVjdCBHVF9QT1JUX1FfQ09VTlRFUlMKICoqCiAqKiAgRGVzY3JpcHRpb246IHBvcnQgcXVldWUgc3RhdGlzdGljIHN0cnVjdC4KICoqCiAqKiAgRmllbGRzOgogKiogICAgICBPdXRRX1NpemUgLSBwb3J0IGVncmVzcyBxdWV1ZSBzaXplIGNvaQogKiogICAgICBSc3ZfU2l6ZSAgLSBpbmdyZXNzIHJlc2VydmVkIGUgY291bnRlcgogKioKICoqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgIE91dFFfU2l6ZTsKICAgIEdUX1UxNiAgUnN2X1NpemU7Cn0gR1RfUE9SVF9RX1NUQVQ7CgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0NUUl9NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBjb3VudGVycyBtb2RlLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfQ1RSX0FMTCAgICAtIEluIHRoaXMgbW9kZSB0aGUgY291bnRlcnMgY291bnRzIFJ4IHJlY2VpdmUgYW5kIHRyYW5zbWl0CiAqICAgICAgICAgICAgICAgICAgIGZyYW1lcy4KICogICBHVF9DVFJfRVJST1JTIC0gSW4gdGhpcyBtb2RlIHRoZSBjb3VudGVycyBjb3VudHMgUnggRXJyb3JzIGFuZCBjb2xsaXNpb25zLgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0NUUl9BTEwgPSAwLAogICAgR1RfQ1RSX0VSUk9SUywKfSBHVF9DVFJfTU9ERTsKCnR5cGVkZWYgc3RydWN0IF9HVF9RRF9ERVYgR1RfUURfREVWOwoKLyoKICogc2VtYXBob3JlIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCiAqIFVzZXIgQXBwbGljYXRpb25zIG1heSByZWdpc3RlciBTZW1hcGhvcmUgZnVuY3Rpb25zIHVzaW5nIGZvbGxvd2luZyBkZWZpbml0aW9ucwogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1NFTV9FTVBUWSwKICAgIEdUX1NFTV9GVUxMCn0gR1RfU0VNX0JFR0lOX1NUQVRFOwoKdHlwZWRlZiBHVF9TRU0gKCpGR1RfU0VNX0NSRUFURSkoCiAgICAgICAgICAgICAgICAgICAgICAgIEdUX1NFTV9CRUdJTl9TVEFURSBzdGF0ZSk7CnR5cGVkZWYgR1RfU1RBVFVTICgqRkdUX1NFTV9ERUxFVEUpKAogICAgICAgICAgICAgICAgICAgICAgICBHVF9TRU0gc2VtSWQpOwp0eXBlZGVmIEdUX1NUQVRVUyAoKkZHVF9TRU1fVEFLRSkoCiAgICAgICAgICAgICAgICAgICAgICAgIEdUX1NFTSBzZW1JZCwgR1RfVTMyIHRpbU91dCk7CnR5cGVkZWYgR1RfU1RBVFVTICgqRkdUX1NFTV9HSVZFKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfU0VNIHNlbUlkKTsKCnR5cGVkZWYgc3RydWN0CnsKICAgIEZHVF9TRU1fQ1JFQVRFICAgIHNlbUNyZWF0ZTsgICAgIC8qIGNyZWF0ZSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9ERUxFVEUgICAgc2VtRGVsZXRlOyAgICAgLyogZGVsZXRlIHRoZSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9UQUtFICAgIHNlbVRha2U7ICAgIC8qIHRyeSB0byBnZXQgYSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9HSVZFICAgIHNlbUdpdmU7ICAgIC8qIHJldHVybiBzZW1hcGhvcmUgKi8KfUdUX1NFTV9ST1VUSU5FUzsKCi8qCiAqIGRlZmluaXRpb25zIGZvciByZWdpc3RlcmluZyBIYXJkd2FyZSBhY2Nlc3MgZnVuY3Rpb24uCiAqCiovCi8qI2lmZGVmIEdUX1JNR01UX0FDQ0VTUyAqLwojaWYgMQovKgogKiAgKiBEZWZpbml0aW9uIGZvciB0aGUgZGlyZWN0aW9uIGluIEhXX0RFVl9SV19SRUcgc3RydWN0dXJlLgogKiAgKi8KI2RlZmluZSBIV19SRUdfUkVBRCAgICAgICAgICAgICAgICAgICAgIDAKI2RlZmluZSBIV19SRUdfV1JJVEUgICAgICAgICAgICAxCiNkZWZpbmUgSFdfUkVHX1dBSVRfVElMTF8wICAgICAgMgojZGVmaW5lIEhXX1JFR19XQUlUX1RJTExfMSAgICAgIDMKCi8qIEhXX0FDQ0VTU19SRUFEX1JFRyBhbmQgSFdfQUNDRVNTX1dSSVRFX1JFRyAqLwp0eXBlZGVmIHN0cnVjdCBfSFdfREVWX1JXX1JFRwp7CiAgdW5zaWduZWQgbG9uZyBjbWQ7ICAvKklOUFVUOkhXX1JFR19SRUFELCBIV19SRUdfV1JJVEUsIEhXX1JFR19XQUlUX1RJTExfMCBvciBIV19SRUdfV0FJVF9USUxMXzEgKi8KICB1bnNpZ25lZCBsb25nIGFkZHI7IC8qSU5QVVQ6U01JIEFkZHJlc3MgKi8KICB1bnNpZ25lZCBsb25nIHJlZzsgIC8qSU5QVVQ6UmVnaXN0ZXIgb2Zmc2V0ICovCiAgdW5zaWduZWQgbG9uZyBkYXRhOyAvKklOUFVULE9VVFBVVDpWYWx1ZSBpbiB0aGUgUmVnaXN0ZXIgb3IgQml0IG51bWJlciAqLwp9IEhXX0RFVl9SV19SRUc7CgojZGVmaW5lICBNQVhfQUNDRVNTX1JFR19OVU0gIDEyCgp0eXBlZGVmIHN0cnVjdCBfSFdfREVWX1JFR19BQ0NFU1MKewogICAgICAgIHVuc2lnbmVkIGxvbmcgICBlbnRyaWVzOwogICAgICAgIEhXX0RFVl9SV19SRUcgICByd19yZWdfbGlzdFtNQVhfQUNDRVNTX1JFR19OVU1dOyAvKiBJTlBVVCxPVVRQVVQ6IFJlZyBBY2Nlc3MgaW5mb3JtYXRpb24gKi8KfSBIV19ERVZfUkVHX0FDQ0VTUzsKCgp0eXBlZGVmIEdUX0JPT0wgKCpGR1RfSFdfQUNDRVNTKShHVF9RRF9ERVYqIGRldiwgSFdfREVWX1JFR19BQ0NFU1MgKnJlZ0xpc3QpOwojZW5kaWYKCi8qCiAqIGRlZmluaXRpb25zIGZvciByZWdpc3RlcmluZyBNSUkgYWNjZXNzIGZ1bmN0aW9ucy4KICoKKi8KdHlwZWRlZiBHVF9CT09MICgqRkdUX1JFQURfTUlJKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfUURfREVWKiAgIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBoeUFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaWlSZWcsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogdmFsdWUpOwp0eXBlZGVmIEdUX0JPT0wgKCpGR1RfV1JJVEVfTUlJKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfUURfREVWKiAgIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBoeUFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaWlSZWcsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSk7CnR5cGVkZWYgR1RfQk9PTCAoKkZHVF9JTlRfSEFORExFUikoCiAgICAgICAgICAgICAgICAgICAgICAgIEdUX1FEX0RFViogICBkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgIEdUX1UxNiopOwoKdHlwZWRlZiBzdHJ1Y3QgX0JTUF9GVU5DVElPTlMKewogICAgR1RfVTMyICAgICAgICBod0FjY2Vzc01vZDsgICAgLyogSGFyZHdhcmUgYWNjZXNzIG1vZGUgKi8KICAgIEZHVF9SRUFEX01JSSAgICAgcmVhZE1paTsgICAgLyogcmVhZCBNSUkgUmVnaXN0ZXJzICovCiAgICBGR1RfV1JJVEVfTUlJICAgICB3cml0ZU1paTsgICAgLyogd3JpdGUgTUlJIFJlZ2lzdGVycyAqLwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICBGR1RfSFdfQUNDRVNTICAgaHdBY2Nlc3M7ICAgIC8qIEhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbiAqLwojZW5kaWYKICAgIEZHVF9TRU1fQ1JFQVRFICAgIHNlbUNyZWF0ZTsgICAgIC8qIGNyZWF0ZSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9ERUxFVEUgICAgc2VtRGVsZXRlOyAgICAgLyogZGVsZXRlIHRoZSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9UQUtFICAgIHNlbVRha2U7ICAgIC8qIHRyeSB0byBnZXQgYSBzZW1hcG9yZSAqLwogICAgRkdUX1NFTV9HSVZFICAgIHNlbUdpdmU7ICAgIC8qIHJldHVybiBzZW1hcGhvcmUgKi8KfUJTUF9GVU5DVElPTlM7CgoKLyoKICogICAgVHlwZSBkZWZpbml0aW9uIGZvciBNSUIgY291bnRlciBvcGVyYXRpb24KKi8KdHlwZWRlZiBlbnVtCnsKICAgIFNUQVRTX0ZMVVNIX0FMTCwgICAgICAgICAgICAvKiBGbHVzaCBhbGwgY291bnRlcnMgZm9yIGFsbCBwb3J0cyAqLwogICAgU1RBVFNfRkxVU0hfUE9SVCwgICAgICAgICAgIC8qIEZsdXNoIGFsbCBjb3VudGVycyBmb3IgYSBwb3J0ICovCiAgICBTVEFUU19SRUFEX0NPVU5URVIsICAgICAgICAgLyogUmVhZCBhIHNwZWNpZmljIGNvdW50ZXIgZnJvbSBhIHBvcnQgKi8KICAgIFNUQVRTX1JFQURfUkVBTFRJTUVfQ09VTlRFUiwgICAgLyogUmVhZCBhIHJlYWx0aW1lIGNvdW50ZXIgZnJvbSBhIHBvcnQgKi8KICAgIFNUQVRTX1JFQURfQUxMLCAgICAgICAgICAgICAgLyogUmVhZCBhbGwgY291bnRlcnMgZnJvbSBhIHBvcnQgKi8KICAgIFNUQVRTX1JFQURfQ09VTlRFUl9DTEVBUiwgICAvKiBGb3IgUk1VIHBhZ2UyLFJlYWQgYSBzcGVjaWZpYyBjb3VudGVyIGZyb20gYSBwb3J0IGFuZCBjbGVhciovCiAgICBTVEFUU19SRUFEX0FMTF9DTEVBUiAgICAgICAgLyogRm9yIFJNVSBwYWdlMixSZWFkIGFsbCBjb3VudGVycyBmcm9tIGEgcG9ydCBhbmQgY2xlYXIqLwoKfSBHVF9TVEFUU19PUEVSQVRJT047Cgp0eXBlZGVmIHN0cnVjdCBfR1RfU1RBVFNfQ09VTlRFUl9TRVQKewogICAgR1RfVTMyICAgIEluVW5pY2FzdHM7CiAgICBHVF9VMzIgICAgSW5Ccm9hZGNhc3RzOwogICAgR1RfVTMyICAgIEluUGF1c2U7CiAgICBHVF9VMzIgICAgSW5NdWx0aWNhc3RzOwogICAgR1RfVTMyICAgIEluRkNTRXJyOwogICAgR1RfVTMyICAgIEFsaWduRXJyOwogICAgR1RfVTMyICAgIEluR29vZE9jdGV0czsKICAgIEdUX1UzMiAgICBJbkJhZE9jdGV0czsKICAgIEdUX1UzMiAgICBVbmRlcnNpemU7CiAgICBHVF9VMzIgICAgRnJhZ21lbnRzOwogICAgR1RfVTMyICAgIEluNjRPY3RldHM7ICAgICAgICAvKiA2NCBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBJbjEyN09jdGV0czsgICAgLyogNjUgdG8gMTI3IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIEluMjU1T2N0ZXRzOyAgICAvKiAxMjggdG8gMjU1IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIEluNTExT2N0ZXRzOyAgICAvKiAyNTYgdG8gNTExIE9jdGV0cyAqLwogICAgR1RfVTMyICAgIEluMTAyM09jdGV0czsgICAgLyogNTEyIHRvIDEwMjMgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgSW5NYXhPY3RldHM7ICAgIC8qIDEwMjQgdG8gTWF4IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIEphYmJlcjsKICAgIEdUX1UzMiAgICBPdmVyc2l6ZTsKICAgIEdUX1UzMiAgICBJbkRpc2NhcmRzOwogICAgR1RfVTMyICAgIEZpbHRlcmVkOwogICAgR1RfVTMyICAgIE91dFVuaWNhc3RzOwogICAgR1RfVTMyICAgIE91dEJyb2FkY2FzdHM7CiAgICBHVF9VMzIgICAgT3V0UGF1c2U7CiAgICBHVF9VMzIgICAgT3V0TXVsdGljYXN0czsKICAgIEdUX1UzMiAgICBPdXRGQ1NFcnI7CiAgICBHVF9VMzIgICAgT3V0R29vZE9jdGV0czsKICAgIEdUX1UzMiAgICBPdXQ2NE9jdGV0czsgICAgLyogNjQgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT3V0MTI3T2N0ZXRzOyAgICAvKiA2NSB0byAxMjcgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT3V0MjU1T2N0ZXRzOyAgICAvKiAxMjggdG8gMjU1IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIE91dDUxMU9jdGV0czsgICAgLyogMjU2IHRvIDUxMSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPdXQxMDIzT2N0ZXRzOyAgICAvKiA1MTIgdG8gMTAyMyBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPdXRNYXhPY3RldHM7ICAgIC8qIDEwMjQgdG8gTWF4IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIENvbGxpc2lvbnM7CiAgICBHVF9VMzIgICAgTGF0ZTsKICAgIEdUX1UzMiAgICBFeGNlc3NpdmU7CiAgICBHVF9VMzIgICAgTXVsdGlwbGU7CiAgICBHVF9VMzIgICAgU2luZ2xlOwogICAgR1RfVTMyICAgIERlZmVycmVkOwogICAgR1RfVTMyICAgIE91dERpc2NhcmRzOwoKfSBHVF9TVEFUU19DT1VOVEVSX1NFVDsKCgp0eXBlZGVmIGVudW0KewogICAgU1RBVFNfSW5VbmljYXN0cyA9IDAsCiAgICBTVEFUU19JbkJyb2FkY2FzdHMsCiAgICBTVEFUU19JblBhdXNlLAogICAgU1RBVFNfSW5NdWx0aWNhc3RzLAogICAgU1RBVFNfSW5GQ1NFcnIsCiAgICBTVEFUU19BbGlnbkVyciwKICAgIFNUQVRTX0luR29vZE9jdGV0cywKICAgIFNUQVRTX0luQmFkT2N0ZXRzLAogICAgU1RBVFNfVW5kZXJzaXplLAogICAgU1RBVFNfRnJhZ21lbnRzLAogICAgU1RBVFNfSW42NE9jdGV0cywKICAgIFNUQVRTX0luMTI3T2N0ZXRzLAogICAgU1RBVFNfSW4yNTVPY3RldHMsCiAgICBTVEFUU19JbjUxMU9jdGV0cywKICAgIFNUQVRTX0luMTAyM09jdGV0cywKICAgIFNUQVRTX0luTWF4T2N0ZXRzLAogICAgU1RBVFNfSmFiYmVyLAogICAgU1RBVFNfT3ZlcnNpemUsCiAgICBTVEFUU19JbkRpc2NhcmRzLAogICAgU1RBVFNfRmlsdGVyZWQsCiAgICBTVEFUU19PdXRVbmljYXN0cywKICAgIFNUQVRTX091dEJyb2FkY2FzdHMsCiAgICBTVEFUU19PdXRQYXVzZSwKICAgIFNUQVRTX091dE11bHRpY2FzdHMsCiAgICBTVEFUU19PdXRGQ1NFcnIsCiAgICBTVEFUU19PdXRHb29kT2N0ZXRzLAogICAgU1RBVFNfT3V0NjRPY3RldHMsCiAgICBTVEFUU19PdXQxMjdPY3RldHMsCiAgICBTVEFUU19PdXQyNTVPY3RldHMsCiAgICBTVEFUU19PdXQ1MTFPY3RldHMsCiAgICBTVEFUU19PdXQxMDIzT2N0ZXRzLAogICAgU1RBVFNfT3V0TWF4T2N0ZXRzLAogICAgU1RBVFNfQ29sbGlzaW9ucywKICAgIFNUQVRTX0xhdGUsCiAgICBTVEFUU19FeGNlc3NpdmUsCiAgICBTVEFUU19NdWx0aXBsZSwKICAgIFNUQVRTX1NpbmdsZSwKICAgIFNUQVRTX0RlZmVycmVkLAogICAgU1RBVFNfT3V0RGlzY2FyZHMKCn0gR1RfU1RBVFNfQ09VTlRFUlM7Ci8qCiAqIHR5cGVkZWY6IGVudW0gR1RfSElTVE9HUkFNX01PREUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBoaXN0b2dyYW0gY291bnRlcnMgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0NPVU5UX1JYX09OTFkgLSBJbiB0aGlzIG1vZGUsIFJ4IEhpc3RvZ3JhbSBDb3VudGVycyBhcmUgY291bnRlZC4KICogICBHVF9DT1VOVF9UWF9PTkxZIC0gSW4gdGhpcyBtb2RlLCBUeCBIaXN0b2dyYW0gQ291bnRlcnMgYXJlIGNvdW50ZWQuCiAqICAgR1RfQ09VTlRfUlhfVFggICAtIEluIHRoaXMgbW9kZSwgUnggYW5kIFR4IEhpc3RvZ3JhbSBDb3VudGVycyBhcmUgY291bnRlZC4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9DT1VOVF9SWF9PTkxZID0gMCwKICAgIEdUX0NPVU5UX1RYX09OTFksCiAgICBHVF9DT1VOVF9SWF9UWAp9IEdUX0hJU1RPR1JBTV9NT0RFOwoKLyoKICAgIENvdW50ZXIgc2V0IDIgaXMgdXNlZCBieSA4OEU2MTgzCiovCnR5cGVkZWYgc3RydWN0IF9HVF9TVEFUU19DT1VOVEVSX1NFVDIKewogICAgR1RfVTMyICAgIEluR29vZE9jdGV0c0hpOwogICAgR1RfVTMyICAgIEluR29vZE9jdGV0c0xvOwogICAgR1RfVTMyICAgIEluQmFkT2N0ZXRzOwogICAgR1RfVTMyICAgIE91dERpc2NhcmRzOwogICAgR1RfVTMyICAgIEluR29vZEZyYW1lczsKICAgIEdUX1UzMiAgICBJbkJhZEZyYW1lczsKICAgIEdUX1UzMiAgICBJbkJyb2FkY2FzdHM7CiAgICBHVF9VMzIgICAgSW5NdWx0aWNhc3RzOwogICAgLyoKICAgICAgICBIaXN0b2dyYW0gQ291bnRlcnMgOiBSeCBPbmx5LCBUeCBPbmx5LCBvciBib3RoIFJ4IGFuZCBUeAogICAgICAgIChyZWZlciB0byBIaXN0b2dyYW0gTW9kZSkKICAgICovCiAgICBHVF9VMzIgICAgT2N0ZXRzNjQ7ICAgICAgICAvKiA2NCBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPY3RldHMxMjc7ICAgICAgICAvKiA2NSB0byAxMjcgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT2N0ZXRzMjU1OyAgICAgICAgLyogMTI4IHRvIDI1NSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPY3RldHM1MTE7ICAgICAgICAvKiAyNTYgdG8gNTExIE9jdGV0cyAqLwogICAgR1RfVTMyICAgIE9jdGV0czEwMjM7ICAgICAgICAvKiA1MTIgdG8gMTAyMyBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPY3RldHNNYXg7ICAgICAgICAvKiAxMDI0IHRvIE1heCBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNIaTsKICAgIEdUX1UzMiAgICBPdXRPY3RldHNMbzsKICAgIEdUX1UzMiAgICBPdXRGcmFtZXM7CiAgICBHVF9VMzIgICAgRXhjZXNzaXZlOwogICAgR1RfVTMyICAgIE91dE11bHRpY2FzdHM7CiAgICBHVF9VMzIgICAgT3V0QnJvYWRjYXN0czsKICAgIEdUX1UzMiAgICBJbkJhZE1BQ0N0cmw7CgogICAgR1RfVTMyICAgIE91dFBhdXNlOwogICAgR1RfVTMyICAgIEluUGF1c2U7CiAgICBHVF9VMzIgICAgSW5EaXNjYXJkczsKICAgIEdUX1UzMiAgICBVbmRlcnNpemU7CiAgICBHVF9VMzIgICAgRnJhZ21lbnRzOwogICAgR1RfVTMyICAgIE92ZXJzaXplOwogICAgR1RfVTMyICAgIEphYmJlcjsKICAgIEdUX1UzMiAgICBNQUNSY3ZFcnI7CiAgICBHVF9VMzIgICAgSW5GQ1NFcnI7CiAgICBHVF9VMzIgICAgQ29sbGlzaW9uczsKICAgIEdUX1UzMiAgICBMYXRlOwoKfSBHVF9TVEFUU19DT1VOVEVSX1NFVDI7CgoKdHlwZWRlZiBlbnVtCnsKICAgIFNUQVRTMl9Jbkdvb2RPY3RldHNIaSA9IDAsCiAgICBTVEFUUzJfSW5Hb29kT2N0ZXRzTG8sCiAgICBTVEFUUzJfSW5CYWRPY3RldHMsCgogICAgU1RBVFMyX091dERpc2NhcmRzLAogICAgU1RBVFMyX0luR29vZEZyYW1lcywKICAgIFNUQVRTMl9JbkJhZEZyYW1lcywKICAgIFNUQVRTMl9JbkJyb2FkY2FzdHMsCiAgICBTVEFUUzJfSW5NdWx0aWNhc3RzLAogICAgU1RBVFMyXzY0T2N0ZXRzLAogICAgU1RBVFMyXzEyN09jdGV0cywKICAgIFNUQVRTMl8yNTVPY3RldHMsCiAgICBTVEFUUzJfNTExT2N0ZXRzLAogICAgU1RBVFMyXzEwMjNPY3RldHMsCiAgICBTVEFUUzJfTWF4T2N0ZXRzLAogICAgU1RBVFMyX091dE9jdGV0c0hpLAogICAgU1RBVFMyX091dE9jdGV0c0xvLAogICAgU1RBVFMyX091dEZyYW1lcywKICAgIFNUQVRTMl9FeGNlc3NpdmUsCiAgICBTVEFUUzJfT3V0TXVsdGljYXN0cywKICAgIFNUQVRTMl9PdXRCcm9hZGNhc3RzLAogICAgU1RBVFMyX0luQmFkTUFDQ3RybCwKICAgIFNUQVRTMl9PdXRQYXVzZSwKICAgIFNUQVRTMl9JblBhdXNlLAogICAgU1RBVFMyX0luRGlzY2FyZHMsCiAgICBTVEFUUzJfVW5kZXJzaXplLAogICAgU1RBVFMyX0ZyYWdtZW50cywKICAgIFNUQVRTMl9PdmVyc2l6ZSwKICAgIFNUQVRTMl9KYWJiZXIsCiAgICBTVEFUUzJfTUFDUmN2RXJyLAogICAgU1RBVFMyX0luRkNTRXJyLAogICAgU1RBVFMyX0NvbGxpc2lvbnMsCiAgICBTVEFUUzJfTGF0ZQoKfSBHVF9TVEFUU19DT1VOVEVSUzI7CgovKgogICAgQ291bnRlciBzZXQgMyBpcyB1c2VkIGJ5IDg4RTYwOTMgYW5kIDg4RTYwNjUgYW5kIGxhdGVyCiovCnR5cGVkZWYgc3RydWN0IF9HVF9TVEFUU19DT1VOVEVSX1NFVDMKewogICAgR1RfVTMyICAgIEluR29vZE9jdGV0c0xvOyAgICAvKiBvZmZzZXQgMCAqLwogICAgR1RfVTMyICAgIEluR29vZE9jdGV0c0hpOyAgICAvKiBvZmZzZXQgMSwgbm90IHN1cHBvcnRlZCBieSA4OEU2MDY1ICovCiAgICBHVF9VMzIgICAgSW5CYWRPY3RldHM7ICAgICAgICAvKiBvZmZzZXQgMiAqLwogICAgR1RfVTMyICAgIE91dEZDU0VycjsgICAgICAgICAgICAvKiBvZmZzZXQgMyAqLwogICAgR1RfVTMyICAgIEluVW5pY2FzdHM7ICAgICAgICAgICAgLyogb2Zmc2V0IDQgKi8KICAgIEdUX1UzMiAgICBEZWZlcnJlZDsgICAgICAgICAgICAvKiBvZmZzZXQgNSAqLwogICAgR1RfVTMyICAgIEluQnJvYWRjYXN0czsgICAgICAgIC8qIG9mZnNldCA2ICovCiAgICBHVF9VMzIgICAgSW5NdWx0aWNhc3RzOyAgICAgICAgLyogb2Zmc2V0IDcgKi8KICAgIC8qCiAgICAgICAgSGlzdG9ncmFtIENvdW50ZXJzIDogUnggT25seSwgVHggT25seSwgb3IgYm90aCBSeCBhbmQgVHgKICAgICAgICAocmVmZXIgdG8gSGlzdG9ncmFtIE1vZGUpCiAgICAqLwogICAgR1RfVTMyICAgIE9jdGV0czY0OyAgICAgICAgLyogNjQgT2N0ZXRzLCBvZmZzZXQgOCAqLwogICAgR1RfVTMyICAgIE9jdGV0czEyNzsgICAgICAgIC8qIDY1IHRvIDEyNyBPY3RldHMsIG9mZnNldCA5ICovCiAgICBHVF9VMzIgICAgT2N0ZXRzMjU1OyAgICAgICAgLyogMTI4IHRvIDI1NSBPY3RldHMsIG9mZnNldCAxMCAqLwogICAgR1RfVTMyICAgIE9jdGV0czUxMTsgICAgICAgIC8qIDI1NiB0byA1MTEgT2N0ZXRzLCBvZmZzZXQgMTEgKi8KICAgIEdUX1UzMiAgICBPY3RldHMxMDIzOyAgICAgICAgLyogNTEyIHRvIDEwMjMgT2N0ZXRzLCBvZmZzZXQgMTIgKi8KICAgIEdUX1UzMiAgICBPY3RldHNNYXg7ICAgICAgICAvKiAxMDI0IHRvIE1heCBPY3RldHMsIG9mZnNldCAxMyAqLwogICAgR1RfVTMyICAgIE91dE9jdGV0c0xvOyAgICAvKiBvZmZzZXQgMTQgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNIaTsgICAgLyogb2Zmc2V0IDE1LCBub3Qgc3VwcG9ydGVkIGJ5IDg4RTYwNjUgKi8KICAgIEdUX1UzMiAgICBPdXRVbmljYXN0czsgICAgLyogb2Zmc2V0IDE2ICovCiAgICBHVF9VMzIgICAgRXhjZXNzaXZlOyAgICAgICAgLyogb2Zmc2V0IDE3ICovCiAgICBHVF9VMzIgICAgT3V0TXVsdGljYXN0czsgICAgLyogb2Zmc2V0IDE4ICovCiAgICBHVF9VMzIgICAgT3V0QnJvYWRjYXN0czsgICAgLyogb2Zmc2V0IDE5ICovCiAgICBHVF9VMzIgICAgU2luZ2xlOyAgICAgICAgICAgIC8qIG9mZnNldCAyMCAqLwoKICAgIEdUX1UzMiAgICBPdXRQYXVzZTsgICAgICAgIC8qIG9mZnNldCAyMSAqLwogICAgR1RfVTMyICAgIEluUGF1c2U7ICAgICAgICAgICAgLyogb2Zmc2V0IDIyICovCiAgICBHVF9VMzIgICAgTXVsdGlwbGU7ICAgICAgICAvKiBvZmZzZXQgMjMgKi8KICAgIEdUX1UzMiAgICBVbmRlcnNpemU7ICAgICAgICAvKiBvZmZzZXQgMjQgKi8KICAgIEdUX1UzMiAgICBGcmFnbWVudHM7ICAgICAgICAvKiBvZmZzZXQgMjUgKi8KICAgIEdUX1UzMiAgICBPdmVyc2l6ZTsgICAgICAgIC8qIG9mZnNldCAyNiAqLwogICAgR1RfVTMyICAgIEphYmJlcjsgICAgICAgICAgICAvKiBvZmZzZXQgMjcgKi8KICAgIEdUX1UzMiAgICBJbk1BQ1JjdkVycjsgICAgLyogb2Zmc2V0IDI4ICovCiAgICBHVF9VMzIgICAgSW5GQ1NFcnI7ICAgICAgICAvKiBvZmZzZXQgMjkgKi8KICAgIEdUX1UzMiAgICBDb2xsaXNpb25zOyAgICAgICAgLyogb2Zmc2V0IDMwICovCiAgICBHVF9VMzIgICAgTGF0ZTsgICAgICAgICAgICAgICAgLyogb2Zmc2V0IDMxICovCgp9IEdUX1NUQVRTX0NPVU5URVJfU0VUMzsKCgp0eXBlZGVmIGVudW0KewogICAgU1RBVFMzX0luR29vZE9jdGV0c0xvID0gMCwKICAgIFNUQVRTM19Jbkdvb2RPY3RldHNIaSwKICAgIFNUQVRTM19JbkJhZE9jdGV0cywKCiAgICBTVEFUUzNfT3V0RkNTRXJyLAogICAgU1RBVFMzX0luVW5pY2FzdHMsCiAgICBTVEFUUzNfRGVmZXJyZWQsICAgICAgICAgICAgLyogb2Zmc2V0IDUgKi8KICAgIFNUQVRTM19JbkJyb2FkY2FzdHMsCiAgICBTVEFUUzNfSW5NdWx0aWNhc3RzLAogICAgU1RBVFMzXzY0T2N0ZXRzLAogICAgU1RBVFMzXzEyN09jdGV0cywKICAgIFNUQVRTM18yNTVPY3RldHMsICAgICAgICAgICAgLyogb2Zmc2V0IDEwICovCiAgICBTVEFUUzNfNTExT2N0ZXRzLAogICAgU1RBVFMzXzEwMjNPY3RldHMsCiAgICBTVEFUUzNfTWF4T2N0ZXRzLAogICAgU1RBVFMzX091dE9jdGV0c0xvLAogICAgU1RBVFMzX091dE9jdGV0c0hpLAogICAgU1RBVFMzX091dFVuaWNhc3RzLCAgICAgICAgLyogb2Zmc2V0IDE2ICovCiAgICBTVEFUUzNfRXhjZXNzaXZlLAogICAgU1RBVFMzX091dE11bHRpY2FzdHMsCiAgICBTVEFUUzNfT3V0QnJvYWRjYXN0cywKICAgIFNUQVRTM19TaW5nbGUsCiAgICBTVEFUUzNfT3V0UGF1c2UsCiAgICBTVEFUUzNfSW5QYXVzZSwKICAgIFNUQVRTM19NdWx0aXBsZSwKICAgIFNUQVRTM19VbmRlcnNpemUsICAgICAgICAgICAgLyogb2Zmc2V0IDI0ICovCiAgICBTVEFUUzNfRnJhZ21lbnRzLAogICAgU1RBVFMzX092ZXJzaXplLAogICAgU1RBVFMzX0phYmJlciwKICAgIFNUQVRTM19Jbk1BQ1JjdkVyciwKICAgIFNUQVRTM19JbkZDU0VyciwKICAgIFNUQVRTM19Db2xsaXNpb25zLAogICAgU1RBVFMzX0xhdGUgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCAzMSAqLwoKfSBHVF9TVEFUU19DT1VOVEVSUzM7CgovKgogICAgQ291bnRlciBzZXQgUk1VIHBhZ2UyIGlzIHVzZWQgYnkgODhFNjMyMCBhbmQgbGF0ZXIKKi8KdHlwZWRlZiBzdHJ1Y3QgX0dUX1NUQVRTX0NPVU5URVJfU0VUX1BBR0UyCnsKCS8qIEJhbmsgMCAqLwogICAgR1RfVTMyICAgIEluR29vZE9jdGV0c0xvOyAgICAgLyogb2Zmc2V0IDAgKi8KICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHNIaTsgICAgIC8qIG9mZnNldCAxICovCiAgICBHVF9VMzIgICAgSW5CYWRPY3RldHM7ICAgICAgICAvKiBvZmZzZXQgMiAqLwogICAgR1RfVTMyICAgIE91dEZDU0VycjsgICAgICAgICAgLyogb2Zmc2V0IDMgKi8KICAgIEdUX1UzMiAgICBJblVuaWNhc3RzOyAgICAgICAgIC8qIG9mZnNldCA0ICovCiAgICBHVF9VMzIgICAgRGVmZXJyZWQ7ICAgICAgICAgICAvKiBvZmZzZXQgNSAqLwogICAgR1RfVTMyICAgIEluQnJvYWRjYXN0czsgICAgICAgLyogb2Zmc2V0IDYgKi8KICAgIEdUX1UzMiAgICBJbk11bHRpY2FzdHM7ICAgICAgIC8qIG9mZnNldCA3ICovCiAgICAvKgogICAgICAgIEhpc3RvZ3JhbSBDb3VudGVycyA6IFJ4IE9ubHksIFR4IE9ubHksIG9yIGJvdGggUnggYW5kIFR4CiAgICAgICAgKHJlZmVyIHRvIEhpc3RvZ3JhbSBNb2RlKQogICAgKi8KICAgIEdUX1UzMiAgICBPY3RldHM2NDsgICAgICAgICAvKiA2NCBPY3RldHMsIG9mZnNldCA4ICovCiAgICBHVF9VMzIgICAgT2N0ZXRzMTI3OyAgICAgICAgLyogNjUgdG8gMTI3IE9jdGV0cywgb2Zmc2V0IDkgKi8KICAgIEdUX1UzMiAgICBPY3RldHMyNTU7ICAgICAgICAvKiAxMjggdG8gMjU1IE9jdGV0cywgb2Zmc2V0IDEwICovCiAgICBHVF9VMzIgICAgT2N0ZXRzNTExOyAgICAgICAgLyogMjU2IHRvIDUxMSBPY3RldHMsIG9mZnNldCAxMSAqLwogICAgR1RfVTMyICAgIE9jdGV0czEwMjM7ICAgICAgIC8qIDUxMiB0byAxMDIzIE9jdGV0cywgb2Zmc2V0IDEyICovCiAgICBHVF9VMzIgICAgT2N0ZXRzTWF4OyAgICAgICAgLyogMTAyNCB0byBNYXggT2N0ZXRzLCBvZmZzZXQgMTMgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNMbzsgICAgICAvKiBvZmZzZXQgMTQgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNIaTsgICAgICAvKiBvZmZzZXQgMTUgKi8KICAgIEdUX1UzMiAgICBPdXRVbmljYXN0czsgICAgICAvKiBvZmZzZXQgMTYgKi8KICAgIEdUX1UzMiAgICBFeGNlc3NpdmU7ICAgICAgICAvKiBvZmZzZXQgMTcgKi8KICAgIEdUX1UzMiAgICBPdXRNdWx0aWNhc3RzOyAgICAvKiBvZmZzZXQgMTggKi8KICAgIEdUX1UzMiAgICBPdXRCcm9hZGNhc3RzOyAgICAvKiBvZmZzZXQgMTkgKi8KICAgIEdUX1UzMiAgICBTaW5nbGU7ICAgICAgICAgICAvKiBvZmZzZXQgMjAgKi8KCiAgICBHVF9VMzIgICAgT3V0UGF1c2U7ICAgICAgICAgLyogb2Zmc2V0IDIxICovCiAgICBHVF9VMzIgICAgSW5QYXVzZTsgICAgICAgICAgLyogb2Zmc2V0IDIyICovCiAgICBHVF9VMzIgICAgTXVsdGlwbGU7ICAgICAgICAgLyogb2Zmc2V0IDIzICovCiAgICBHVF9VMzIgICAgVW5kZXJzaXplOyAgICAgICAgLyogb2Zmc2V0IDI0ICovCiAgICBHVF9VMzIgICAgRnJhZ21lbnRzOyAgICAgICAgLyogb2Zmc2V0IDI1ICovCiAgICBHVF9VMzIgICAgT3ZlcnNpemU7ICAgICAgICAgLyogb2Zmc2V0IDI2ICovCiAgICBHVF9VMzIgICAgSmFiYmVyOyAgICAgICAgICAgLyogb2Zmc2V0IDI3ICovCiAgICBHVF9VMzIgICAgSW5NQUNSY3ZFcnI7ICAgICAgLyogb2Zmc2V0IDI4ICovCiAgICBHVF9VMzIgICAgSW5GQ1NFcnI7ICAgICAgICAgLyogb2Zmc2V0IDI5ICovCiAgICBHVF9VMzIgICAgQ29sbGlzaW9uczsgICAgICAgLyogb2Zmc2V0IDMwICovCiAgICBHVF9VMzIgICAgTGF0ZTsgICAgICAgICAgICAgLyogb2Zmc2V0IDMxICovCgkvKiBCYW5rIDEgKi8KICAgIEdUX1UzMiAgICBJbkRpc2NhcmRzOyAgICAgICAvKiBvZmZzZXQgMHgwMCAqLwogICAgR1RfVTMyICAgIEluRmlsdGVyZWQ7ICAgICAgIC8qIG9mZnNldCAweDAxICovCiAgICBHVF9VMzIgICAgSW5BY2NlcHRlZDsgICAgICAgLyogb2Zmc2V0IDB4MDIgKi8KICAgIEdUX1UzMiAgICBJbkJhZEFjY2VwdGVkOyAgICAvKiBvZmZzZXQgMHgwMyAqLwogICAgR1RfVTMyICAgIEluR29vZEF2YkNsYXNzQTsgIC8qIG9mZnNldCAweDA0ICovCiAgICBHVF9VMzIgICAgSW5Hb29kQXZiQ2xhc3NCOyAgLyogb2Zmc2V0IDB4MDUgKi8KICAgIEdUX1UzMiAgICBJbkJhZEF2YkNsYXNzQSA7ICAvKiBvZmZzZXQgMHgwNiAqLwogICAgR1RfVTMyICAgIEluQmFkQXZiQ2xhc3NCIDsgIC8qIG9mZnNldCAweDA3ICovCiAgICBHVF9VMzIgICAgVENBTUNvdW50ZXIwOyAgICAgLyogb2Zmc2V0IDB4MDggKi8KICAgIEdUX1UzMiAgICBUQ0FNQ291bnRlcjE7ICAgICAvKiBvZmZzZXQgMHgwOSAqLwogICAgR1RfVTMyICAgIFRDQU1Db3VudGVyMjsgICAgIC8qIG9mZnNldCAweDBhICovCiAgICBHVF9VMzIgICAgVENBTUNvdW50ZXIzOyAgICAgLyogb2Zmc2V0IDB4MGIgKi8KICAgIEdUX1UzMiAgICByZXNlcnZlZF9jOyAgICAgLyogb2Zmc2V0IDB4MGMgKi8KICAgIEdUX1UzMiAgICByZXNlcnZlZF9kOyAgICAgLyogb2Zmc2V0IDB4MGQgKi8KICAgIEdUX1UzMiAgICBJbkRhVW5rbm93biA7ICAgICAvKiBvZmZzZXQgMHgwZSAqLwogICAgR1RfVTMyICAgIEluTUdNVDsgICAgICAgICAgIC8qIG9mZnNldCAweDBmICovCiAgICBHVF9VMzIgICAgT3V0UXVldWUwOyAgICAgICAgLyogb2Zmc2V0IDB4MTAgKi8KICAgIEdUX1UzMiAgICBPdXRRdWV1ZTE7ICAgICAgICAvKiBvZmZzZXQgMHgxMSAqLwogICAgR1RfVTMyICAgIE91dFF1ZXVlMjsgICAgICAgIC8qIG9mZnNldCAweDEyICovCiAgICBHVF9VMzIgICAgT3V0UXVldWUzOyAgICAgICAgLyogb2Zmc2V0IDB4MTMgKi8KICAgIEdUX1UzMiAgICBPdXRRdWV1ZTQ7ICAgICAgICAvKiBvZmZzZXQgMHgxNCAqLwogICAgR1RfVTMyICAgIE91dFF1ZXVlNTsgICAgICAgIC8qIG9mZnNldCAweDE1ICovCiAgICBHVF9VMzIgICAgT3V0UXVldWU2OyAgICAgICAgLyogb2Zmc2V0IDB4MTYgKi8KICAgIEdUX1UzMiAgICBPdXRRdWV1ZTc7ICAgICAgICAvKiBvZmZzZXQgMHgxNyAqLwogICAgR1RfVTMyICAgIE91dEN1dFRocm91Z2g7ICAgIC8qIG9mZnNldCAweDE4ICovCiAgICBHVF9VMzIgICAgcmVzZXJ2ZWRfMTkgOyAgICAgLyogb2Zmc2V0IDB4MTkgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNBOyAgICAgICAvKiBvZmZzZXQgMHgxYSAqLwogICAgR1RfVTMyICAgIE91dE9jdGV0c0I7ICAgICAgIC8qIG9mZnNldCAweDFiICovCiAgICBHVF9VMzIgICAgcmVzZXJ2ZWRfMWM7ICAgICAgLyogb2Zmc2V0IDB4MWMgKi8KICAgIEdUX1UzMiAgICByZXNlcnZlZF8xZDsgICAgICAvKiBvZmZzZXQgMHgxZCAqLwogICAgR1RfVTMyICAgIHJlc2VydmVkXzFlOyAgICAgIC8qIG9mZnNldCAweDFlICovCiAgICBHVF9VMzIgICAgT3V0TUdNVDsgICAgICAgICAgLyogb2Zmc2V0IDB4MWYgKi8KCn0gR1RfU1RBVFNfQ09VTlRFUl9TRVRfUEFHRTI7CgojZGVmaW5lIEdUX1BBR0UyX0JBTksxIDB4ODAKdHlwZWRlZiBlbnVtCnsKCS8qIEJhbmsgMCAqLwogICAgU1RBVFNfUEcyX0luR29vZE9jdGV0c0xvID0gMCwKICAgIFNUQVRTX1BHMl9Jbkdvb2RPY3RldHNIaSwKICAgIFNUQVRTX1BHMl9JbkJhZE9jdGV0cywKCiAgICBTVEFUU19QRzJfT3V0RkNTRXJyLAogICAgU1RBVFNfUEcyX0luVW5pY2FzdHMsCiAgICBTVEFUU19QRzJfRGVmZXJyZWQsICAgICAgICAgICAgLyogb2Zmc2V0IDUgKi8KICAgIFNUQVRTX1BHMl9JbkJyb2FkY2FzdHMsCiAgICBTVEFUU19QRzJfSW5NdWx0aWNhc3RzLAogICAgU1RBVFNfUEcyXzY0T2N0ZXRzLAogICAgU1RBVFNfUEcyXzEyN09jdGV0cywKICAgIFNUQVRTX1BHMl8yNTVPY3RldHMsICAgICAgICAgICAgLyogb2Zmc2V0IDEwICovCiAgICBTVEFUU19QRzJfNTExT2N0ZXRzLAogICAgU1RBVFNfUEcyXzEwMjNPY3RldHMsCiAgICBTVEFUU19QRzJfTWF4T2N0ZXRzLAogICAgU1RBVFNfUEcyX091dE9jdGV0c0xvLAogICAgU1RBVFNfUEcyX091dE9jdGV0c0hpLAogICAgU1RBVFNfUEcyX091dFVuaWNhc3RzLCAgICAgICAgLyogb2Zmc2V0IDE2ICovCiAgICBTVEFUU19QRzJfRXhjZXNzaXZlLAogICAgU1RBVFNfUEcyX091dE11bHRpY2FzdHMsCiAgICBTVEFUU19QRzJfT3V0QnJvYWRjYXN0cywKICAgIFNUQVRTX1BHMl9TaW5nbGUsCiAgICBTVEFUU19QRzJfT3V0UGF1c2UsCiAgICBTVEFUU19QRzJfSW5QYXVzZSwKICAgIFNUQVRTX1BHMl9NdWx0aXBsZSwKICAgIFNUQVRTX1BHMl9VbmRlcnNpemUsICAgICAgICAgICAgLyogb2Zmc2V0IDI0ICovCiAgICBTVEFUU19QRzJfRnJhZ21lbnRzLAogICAgU1RBVFNfUEcyX092ZXJzaXplLAogICAgU1RBVFNfUEcyX0phYmJlciwKICAgIFNUQVRTX1BHMl9Jbk1BQ1JjdkVyciwKICAgIFNUQVRTX1BHMl9JbkZDU0VyciwKICAgIFNUQVRTX1BHMl9Db2xsaXNpb25zLAogICAgU1RBVFNfUEcyX0xhdGUsICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgMzEgKi8KCS8qIEJhbmsgMSAqLwogICAgU1RBVFNfUEcyX0luRGlzY2FyZHMgICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MDAsCiAgICBTVEFUU19QRzJfSW5GaWx0ZXJlZCAgICAgID0gR1RfUEFHRTJfQkFOSzErMHgwMSwKICAgIFNUQVRTX1BHMl9JbkFjY2VwdGVkICAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDAyLAogICAgU1RBVFNfUEcyX0luQmFkQWNjZXB0ZWQgICA9IEdUX1BBR0UyX0JBTksxKzB4MDMsCiAgICBTVEFUU19QRzJfSW5Hb29kQXZiQ2xhc3NBID0gR1RfUEFHRTJfQkFOSzErMHgwNCwKICAgIFNUQVRTX1BHMl9Jbkdvb2RBdmJDbGFzc0IgPSBHVF9QQUdFMl9CQU5LMSsweDA1LAogICAgU1RBVFNfUEcyX0luQmFkQXZiQ2xhc3NBICA9IEdUX1BBR0UyX0JBTksxKzB4MDYsCiAgICBTVEFUU19QRzJfSW5CYWRBdmJDbGFzc0IgID0gR1RfUEFHRTJfQkFOSzErMHgwNywKICAgIFNUQVRTX1BHMl9UQ0FNQ291bnRlcjAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDA4LAogICAgU1RBVFNfUEcyX1RDQU1Db3VudGVyMSAgICA9IEdUX1BBR0UyX0JBTksxKzB4MDksCiAgICBTVEFUU19QRzJfVENBTUNvdW50ZXIyICAgID0gR1RfUEFHRTJfQkFOSzErMHgwYSwKICAgIFNUQVRTX1BHMl9UQ0FNQ291bnRlcjMgICAgPSBHVF9QQUdFMl9CQU5LMSsweDBiLAogICAgU1RBVFNfUEcyX0luRGFVbmtub3duICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MGUsCiAgICBTVEFUU19QRzJfSW5NR01UICAgICAgICAgID0gR1RfUEFHRTJfQkFOSzErMHgwZiwKICAgIFNUQVRTX1BHMl9PdXRRdWV1ZTAgICAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDEwLAogICAgU1RBVFNfUEcyX091dFF1ZXVlMSAgICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MTEsCiAgICBTVEFUU19QRzJfT3V0UXVldWUyICAgICAgID0gR1RfUEFHRTJfQkFOSzErMHgxMiwKICAgIFNUQVRTX1BHMl9PdXRRdWV1ZTMgICAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDEzLAogICAgU1RBVFNfUEcyX091dFF1ZXVlNCAgICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MTQsCiAgICBTVEFUU19QRzJfT3V0UXVldWU1ICAgICAgID0gR1RfUEFHRTJfQkFOSzErMHgxNSwKICAgIFNUQVRTX1BHMl9PdXRRdWV1ZTYgICAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDE2LAogICAgU1RBVFNfUEcyX091dFF1ZXVlNyAgICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MTcsCiAgICBTVEFUU19QRzJfT3V0Q3V0VGhyb3VnaCAgID0gR1RfUEFHRTJfQkFOSzErMHgxOCwKICAgIFNUQVRTX1BHMl9PdXRPY3RldHNBICAgICAgPSBHVF9QQUdFMl9CQU5LMSsweDFhLAogICAgU1RBVFNfUEcyX091dE9jdGV0c0IgICAgICA9IEdUX1BBR0UyX0JBTksxKzB4MWIsCiAgICBTVEFUU19QRzJfT3V0TUdNVCAgICAgICAgID0gR1RfUEFHRTJfQkFOSzErMHgxZgoKfSBHVF9TVEFUU19DT1VOVEVSU19QQUdFMjsKCi8qIFN3aXRjaCBNYWMvV29sL1dvZiBkZWZpbml0aW9ucyAqLwoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUXzEwMDBUX01BU1RFUl9TTEFWRQogKgogKiBEZXNjcmlwdGlvbjogMTAwMEJhc2UtVCBNYXN0ZXIvU2xhdmUgQ29uZmlndXJhdGlvbgogKgogKiBGaWVsZHM6CiAqICAgICAgYXV0b0NvbmZpZyAgIC0gR1RfVFJVRSBmb3IgYXV0by1jb25maWcsIEdUX0ZBTFNFIGZvciBtYW51YWwgc2V0dXAuCiAqICAgICAgbWFzdGVyUHJlZmVyIC0gR1RfVFJVRSBpZiBNYXN0ZXIgY29uZmlndXJhdGlvbiBpcyBwcmVmZXJyZWQuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdCBfR1RfMTAwMFRfTUFTVEVSX1NMQVZFCnsKICAgIEdUX0JPT0wgICAgYXV0b0NvbmZpZzsKICAgIEdUX0JPT0wgbWFzdGVyUHJlZmVyOwp9IEdUXzEwMDBUX01BU1RFUl9TTEFWRTsKCgojZGVmaW5lIEdUX01ESV9QQUlSX05VTSAgICAgICAgIDQgICAgLyogKDEsMiksKDMsNiksKDQsNSksKDcsOCkgKi8KI2RlZmluZSBHVF9DSEFOTkVMX1BBSVJfTlVNICAgICAyICAgIC8qIChjaGFubmVsIEEsQiksKGNoYW5uZWwgQyxEKSAqLwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUEhZX0xJTktfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBMaW5rIFN0YXR1cwogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgICBHVF9QSFlfTElOS19PRkYgICAgICAgIC0gTm8gTGluawogKiAgICAgICAgR1RfUEhZX0xJTktfQ09QUEVSICAgIC0gTGluayBvbiBDb3BwZXIKICogICAgICAgIEdUX1BIWV9MSU5LX0ZJQkVSICAgIC0gTGluayBvbiBGaWJlcgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BIWV9MSU5LX09GRiA9IDAsCiAgICBHVF9QSFlfTElOS19DT1BQRVIgPSAxLAogICAgR1RfUEhZX0xJTktfRklCRVIgPSAyCn0gR1RfUEhZX0xJTktfU1RBVFVTOwoKCi8qIERlZmluaXRpb24gZm9yIHBhY2tldCBnZW5lcmF0b3IgKi8KCi8qIFBheWxvYWQgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BHX1BBWUxPQURfUkFORE9NID0gMCwgICAgLyogUHNldWRvLXJhbmRvbSAqLwogICAgR1RfUEdfUEFZTE9BRF81QUE1ICAgICAgICAvKiA1QSxBNSw1QSxBNSwuLi4gKi8KfSBHVF9QR19QQVlMT0FEOwoKLyogTGVuZ3RoICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QR19MRU5HVEhfNjQgPSAwLCAgICAgICAgLyogNjQgYnl0ZXMgKi8KICAgIEdUX1BHX0xFTkdUSF8xNTE0Cn0gR1RfUEdfTEVOR1RIOwoKLyogRXJyb3IgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BHX1RYX05PUk1BTCA9IDAsICAgICAgICAvKiBObyBFcnJvciAqLwogICAgR1RfUEdfVFhfRVJST1IgICAgICAgICAgICAvKiBUeCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIGFuZCBTeW1ib2wgZXJyb3IgKi8KfSBHVF9QR19UWDsKCi8qIFN0cnVjdHVyZSBmb3IgcGFja2V0IGdlbmVyYXRvciAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9QR19QQVlMT0FEICBwYXlsb2FkOwogICAgR1RfUEdfTEVOR1RIICAgbGVuZ3RoOwogICAgR1RfUEdfVFggICAgICAgdHg7Cn0gR1RfUEc7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9URVNUX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgVkNUIHRlc3Qgc3RhdHVzCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9URVNUX0ZBSUwgICAgLSB2aXJ0dWFsIGNhYmxlIHRlc3QgZmFpbGVkLgogKiAgICAgIEdUX05PUk1BTF9DQUJMRSAtIG5vcm1hbCBjYWJsZS4KICogICAgICBHVF9JTVBFREFOQ0VfTUlTTUFUQ0ggLSBpbXBlZGFuY2UgbWlzbWF0Y2guCiAqICAgICAgR1RfT1BFTl9DQUJMRSAgIC0gb3BlbiBpbiBjYWJsZS4KICogICAgICBHVF9TSE9SVF9DQUJMRSAgLSBzaG9ydCBpbiBjYWJsZS4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9URVNUX0ZBSUwsCiAgICBHVF9OT1JNQUxfQ0FCTEUsCiAgICBHVF9JTVBFREFOQ0VfTUlTTUFUQ0gsCiAgICBHVF9PUEVOX0NBQkxFLAogICAgR1RfU0hPUlRfQ0FCTEUsCn0gR1RfVEVTVF9TVEFUVVM7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9OT1JNQUxfQ0FCTEVfTEVOCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBmb3Igbm9ybWFsIGNhYmxlIGxlbmd0aAogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfTEVTU19USEFOXzUwTSAtIGNhYmxlIGxlbmd0aCBsZXNzIHRoYW4gNTAgbWV0ZXIuCiAqICAgICAgR1RfNTBNXzgwTSAgICAgICAtIGNhYmxlIGxlbmd0aCBiZXR3ZWVuIDUwIC0gODAgbWV0ZXIuCiAqICAgICAgR1RfODBNXzExME0gICAgICAtIGNhYmxlIGxlbmd0aCBiZXR3ZWVuIDgwIC0gMTEwIG1ldGVyLgogKiAgICAgIEdUXzExME1fMTQwTSAgICAgLSBjYWJsZSBsZW5ndGggYmV0d2VlbiAxMTAgLSAxNDAgbWV0ZXIuCiAqICAgICAgR1RfTU9SRV9USEFOXzE0MCAtIGNhYmxlIGxlbmd0aCBtb3JlIHRoYW4gMTQwIG1ldGVyLgogKiAgICAgIEdUX1VOS05PV05fTEVOICAgLSB1bmtub3duIGxlbmd0aC4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9MRVNTX1RIQU5fNTBNLAogICAgR1RfNTBNXzgwTSwKICAgIEdUXzgwTV8xMTBNLAogICAgR1RfMTEwTV8xNDBNLAogICAgR1RfTU9SRV9USEFOXzE0MCwKICAgIEdUX1VOS05PV05fTEVOLAoKfSBHVF9OT1JNQUxfQ0FCTEVfTEVOOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQ0FCTEVfTEVOCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBjYWJsZSBsZW5ndGgKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIG5vcm1DYWJsZUxlbiAtIGNhYmxlIGxlbmdodCBmb3Igbm9ybWFsIGNhYmxlLgogKiAgICAgIGVyckNhYmxlTGVuICAtIGZvciBjYWJsZSBmYWlsdXJlIHRoZSBlc3RpbWF0ZSBmYXVsdCBkaXN0YW5jZSBpbiBtZXRlcnMuCiAqCiAqLwp0eXBlZGVmIHVuaW9uCnsKICAgIEdUX05PUk1BTF9DQUJMRV9MRU4gbm9ybUNhYmxlTGVuOwogICAgR1RfVTggICAgICAgICAgICAgICBlcnJDYWJsZUxlbjsKCn0gR1RfQ0FCTEVfTEVOOwoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0NBQkxFX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogdmlydHVhbCBjYWJsZSBkaWFnbm9zdGljIHN0YXR1cyBwZXIgTURJIHBhaXIuCiAqCiAqIEZpZWxkczoKICogICAgICBjYWJsZVN0YXR1cyAtIFZDVCBjYWJsZSBzdGF0dXMuCiAqICAgICAgY2FibGVMZW4gICAgLSBWQ1QgY2FibGUgbGVuZ3RoLgogKiAgICBwaHlUeXBlICAgICAgICAtIHR5cGUgb2YgcGh5ICgxMDBNIHBoeSBvciBHaWdhYml0IHBoeSkKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1RFU1RfU1RBVFVTICBjYWJsZVN0YXR1c1tHVF9NRElfUEFJUl9OVU1dOwogICAgR1RfQ0FCTEVfTEVOICAgIGNhYmxlTGVuW0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9VMTYgICAgICAgIHBoeVR5cGU7Cgp9IEdUX0NBQkxFX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0NBQkxFX1RZUEUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIENhYmxlIFR5cGUKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfU1RSQUlHSFRfQ0FCTEUgICAgXyBzdHJhaWdodCBjYWJsZQogKiAgICAgIEdUX0NST1NTT1ZFUl9DQUJMRSAgICAgLSBjcm9zc292ZXIgY2FibGUKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9TVFJBSUdIVF9DQUJMRSwKICAgIEdUX0NST1NTT1ZFUl9DQUJMRQoKfSBHVF9DQUJMRV9UWVBFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUlhfQ0hBTk5FTAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgUmVjZWl2ZXIgQ2hhbm5lbCBBc3NpZ25tZW50CiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX0NIQU5ORUxfQSAgIC0gQ2hhbm5lbCBBCiAqICAgICAgICBHVF9DSEFOTkVMX0IgICAtIENoYW5uZWwgQgogKiAgICAgICAgR1RfQ0hBTk5FTF9DICAgLSBDaGFubmVsIEMKICogICAgICAgIEdUX0NIQU5ORUxfRCAgIC0gQ2hhbm5lbCBECiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQ0hBTk5FTF9BLAogICAgR1RfQ0hBTk5FTF9CLAogICAgR1RfQ0hBTk5FTF9DLAogICAgR1RfQ0hBTk5FTF9ECn0gR1RfUlhfQ0hBTk5FTDsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUE9MQVJJVFlfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBwb2xhcml0eSBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfUE9TSVRJVkUgICAgLSBwb3NpdGl2ZSBwb2xhcml0eQogKiAgICAgIEdUX05FR0FUSVZFICAgIC0gbmVnYXRpdmUgcG9sYXJpdHkKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QT1NJVElWRSwKICAgIEdUX05FR0FUSVZFCgp9IEdUX1BPTEFSSVRZX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfMTAwMEJUX0VYVEVOREVEX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogQ3VycmVudGx5IHRoZSAxMDAwQmFzZS1UIFBDUyBjYW4gZGV0ZXJtaW5lIHRoZSBjYWJsZSBwb2xhcml0eQogKiAgICAgICAgIG9uIHBhaXJzIEEsQixDLEQ7IGNyb3Nzb3ZlciBvbiBwYWlycyBBLEIgYW5kIEMsRDsgYW5kIHNrZXcgYW1vbmcKICogICAgICAgIHRoZSBwYXJlcy4gVGhlc2Ugc3RhdHVzIGVuaGFuY2UgdGhlIGNhcGFiaWxpdHkgb2YgdGhlIHZpcnR1YWwgY2FibGUgdGVzdGVyCiAqCiAqIEZpZWxkczoKICogICAgICBpc1ZhbGlkICAgICAgICAtIEdUX1RSVUUgaWYgdGhpcyBzdHJ1Y3R1cmUgaGF2ZSB2YWxpZCBpbmZvcm1hdGlvbiwKICogICAgICAgICAgICAgICAgICAgICAgIEdUX0ZBTFNFIG90aGVyd2lzZS4KICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdmFsaWQgb25seSBpZiAxMDAwQkFTRS1UIExpbmsgaXMgdXAuCiAqICAgICAgcGFpclN3YXAgICAgLSBHVF9DUk9TU09WRVJfQ0FCTEUsIGlmIHRoZSBjYWJsZSBpcyBjcm9zc292ZXIsCiAqICAgICAgICAgICAgICAgICAgICAgIEdUX1NUUkFJR0hUX0NBQkxFLCBvdGhlcndpc2UKICogICAgICAgIHBhaXJQb2xhcml0eS0gR1RfUE9TSVRJVkUsIGlmIHBvbGFyaXR5IGlzIHBvc2l0aXZlLAogKiAgICAgICAgICAgICAgICAgICAgICBHVF9ORUdBVElWRSwgb3RoZXJ3aXNlCiAqICAgICAgICBwYWlyU2tldyAgICAtIHBhaXIgc2tldyBpbiB1bml0cyBvZiBucwogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgICAgICAgICBpc1ZhbGlkOwogICAgR1RfQ0FCTEVfVFlQRSAgICAgICAgcGFpclN3YXBbR1RfQ0hBTk5FTF9QQUlSX05VTV07CiAgICBHVF9QT0xBUklUWV9TVEFUVVMgICAgcGFpclBvbGFyaXR5W0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9VMzIgICAgICAgICAgICAgICAgcGFpclNrZXdbR1RfTURJX1BBSVJfTlVNXTsKCn0gR1RfMTAwMEJUX0VYVEVOREVEX1NUQVRVUzsKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBHVF9BRFZfRVhURU5ERURfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBDdXJyZW50bHkgdGhlIDEwMDBCYXNlLVQgUENTIGNhbiBkZXRlcm1pbmUgdGhlIGNhYmxlIHBvbGFyaXR5CiAqICAgICAgICAgb24gcGFpcnMgQSxCLEMsRDsgY3Jvc3NvdmVyIG9uIHBhaXJzIEEsQiBhbmQgQyxEOyBhbmQgc2tldyBhbW9uZwogKiAgICAgICAgdGhlIHBhcmVzLiBUaGVzZSBzdGF0dXMgZW5oYW5jZSB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgdmlydHVhbCBjYWJsZSB0ZXN0ZXIKICoKICogRmllbGRzOgogKiAgICAgIGlzVmFsaWQgICAgICAgIC0gR1RfVFJVRSBpZiB0aGlzIHN0cnVjdHVyZSBoYXZlIHZhbGlkIGluZm9ybWF0aW9uLAogKiAgICAgICAgICAgICAgICAgICAgICAgR1RfRkFMU0Ugb3RoZXJ3aXNlLgogKiAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB2YWxpZCBvbmx5IGlmIDEwMDBCQVNFLVQgTGluayBpcyB1cC4KICogICAgICBwYWlyU3dhcCAgICAtIFJlY2VpdmUgY2hhbm5lbCBhc3NpZ25lbWVudAogKiAgICAgICAgcGFpclBvbGFyaXR5LSBHVF9QT1NJVElWRSwgaWYgcG9sYXJpdHkgaXMgcG9zaXRpdmUsCiAqICAgICAgICAgICAgICAgICAgICAgIEdUX05FR0FUSVZFLCBvdGhlcndpc2UKICogICAgICAgIHBhaXJTa2V3ICAgIC0gcGFpciBza2V3IGluIHVuaXRzIG9mIG5zCiAqICAgICAgICBjYWJsZUxlbiAgICAtIGNhYmxlIGxlbmd0aCBiYXNlZCBvbiBEU1AKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgICAgICBpc1ZhbGlkOwogICAgR1RfUlhfQ0hBTk5FTCAgICAgIHBhaXJTd2FwW0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9QT0xBUklUWV9TVEFUVVMgcGFpclBvbGFyaXR5W0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9VMzIgICAgICAgICAgICAgcGFpclNrZXdbR1RfTURJX1BBSVJfTlVNXTsKICAgIEdUX1UzMiAgICAgICAgICAgICAgICBjYWJsZUxlbltHVF9NRElfUEFJUl9OVU1dOwp9IEdUX0FEVl9FWFRFTkRFRF9TVEFUVVM7CgoKLyoKICogaWYgaXNHaWdQaHkgaW4gR1RfQ0FCTEVfU1RBVFVTIGlzIG5vdCBHVF9UUlVFLCBjYWJsZVN0YXR1cyBhbmQgY2FibGVMZW4KICogd2lsbCBoYXZlIG9ubHkgMiBwYWlycyBhdmFpbGFibGUuCiAqIE9uZSBpcyBSWCBQYWlyIGFuZCB0aGUgb3RoZXIgaXMgVFggUGFpci4KICovCiNkZWZpbmUgTURJX1JYX1BBSVIgICAgICAgIDAgICAgLyogY2FibGVTdGF0dXNbMF0gb3IgY2FibGVMZW5bMF0gKi8KI2RlZmluZSBNRElfVFhfUEFJUiAgICAgICAgMSAgICAvKiBjYWJsZVN0YXR1c1sxXSBvciBjYWJsZUxlblsxXSAqLwoKLyogZGVmaW5pdGlvbiBmb3IgUGh5IFR5cGUgKi8KI2RlZmluZSBQSFlfMTAwTSAgICAgICAgMCAvKiAxMC8xMDBNIHBoeSwgRTMwODIgb3IgRTMwODMgKi8KI2RlZmluZSBQSFlfMTAwME0gICAgICAgIDEgLyogR2lnYWJpdCBwaHksIHRoZSByZXN0IHBoeXMgKi8KI2RlZmluZSBQSFlfMTAwMDBNICAgICAgICAyIC8qIDEwIEdpZ2FiaXQgcGh5LCB1bnVzZWQgKi8KI2RlZmluZSBQSFlfMTAwME1fQiAgICAgICAgMyAvKiBHaWdhYml0IHBoeSB3aGljaCBuZWVkcyB3b3JrLWFyb3VuZCAqLwojZGVmaW5lIFBIWV8xMDAwTV9NUCAgICA0IC8qIEdpZ2FiaXQgcGh5IHdpdGggbXVsdGlwbGUgcGFnZSBtb2RlICovCgoKLyogRGVmaW5pdGlvbiBmb3IgQWR2YW5jZSBWaXJ0dWFsIENhYmxlIFRlc3QgKi8KCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQURWX1ZDVF9UUkFOU19DSEFOX1NFTAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQWR2YW5jZWQgVkNUIFRyYW5zbWl0dGVyIGNoYW5uZWwgc2VsZWN0CiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX0FEVl9WQ1RfTk9fQ1JPU1NQQUlSIC0gVHJhbnNtaXR0ZXIgY2hhbm5lbCBzZWxlY3QgaXMgMDAwCiAqICAgICAgICBHVF9BRFZfVkNUX0NST1NTUEFJUiAgICAtIFRyYW5zbWl0dGVyIGNoYW5uZWxzZWxlY3QgaXMgMTAwLzEwMS8xMTAvMTExCiAqLwp0eXBlZGVmIGVudW0KewogICAgLyogQWR2YW5jZWQgVkNUIE1vZGUgKi8KICAgIEdUX0FEVl9WQ1RfVENTX05PX0NST1NTUEFJUiAgICAgICAgPSAwLAogICAgR1RfQURWX1ZDVF9UQ1NfQ1JPU1NQQUlSXzAgICAgICAgICAgICA9IDB4NCwKICAgIEdUX0FEVl9WQ1RfVENTX0NST1NTUEFJUl8xICAgICAgICAgICAgPSAweDUsCiAgICBHVF9BRFZfVkNUX1RDU19DUk9TU1BBSVJfMiAgICAgICAgICAgID0gMHg2LAogICAgR1RfQURWX1ZDVF9UQ1NfQ1JPU1NQQUlSXzMgICAgICAgICAgICA9IDB4Nwp9IEdUX0FEVl9WQ1RfVFJBTlNfQ0hBTl9TRUw7CgoKdHlwZWRlZiBlbnVtCnsKICAgIC8qIEFkdmFuY2VkIFZDVCBNb2RlICovCiAgICBHVF9BRFZfVkNUX1NBVkdfMiAgICAgICAgPSAwLAogICAgR1RfQURWX1ZDVF9TQVZHXzQgICAgICAgID0gMSwKICAgIEdUX0FEVl9WQ1RfU0FWR184ICAgICAgICA9IDIsCiAgICBHVF9BRFZfVkNUX1NBVkdfMTYgICAgICAgID0gMywKICAgIEdUX0FEVl9WQ1RfU0FWR18zMiAgICAgICAgPSA0LAogICAgR1RfQURWX1ZDVF9TQVZHXzY0ICAgICAgICA9IDUsCiAgICBHVF9BRFZfVkNUX1NBVkdfMTI4ICAgID0gNiwKICAgIEdUX0FEVl9WQ1RfU0FWR18yNTYgICAgPSA3Cn0gR1RfQURWX1ZDVF9TQU1QTEVfQVZHOwoKdHlwZWRlZiBlbnVtCnsKICAgIC8qIEFkdmFuY2VkIFZDVCBNb2RlICovCiAgICBHVF9BRFZfVkNUX01BWF9QRUFLICAgICAgICA9MHgwMCwKICAgIEdUX0FEVl9WQ1RfRklSU1RfUEVBSyAgICAgICAgPTB4MDEsCn0gR1RfQURWX1ZDVF9NT0Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgR1RfQURWX1ZDVF9QRUFLREVUX0hZU1Q7CgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0FEVl9WQ1RfTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQWR2YW5jZWQgVkNUIE1vZGUgYW5kIFRyYW5zbWl0dGVyIGNoYW5uZWwgc2VsZWN0CiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9BRFZfVkNUX0ZJUlNUX1BFQUsgICAtIGZpcnN0IHBlYWsgYWJvdmUgYSBjZXJ0YWluIHRocmVzaG9sZCBpcyByZXBvcnRlZC4KICogICAgICBHVF9BRFZfVkNUX01BWF9QRUFLICAgICAtIG1heGltdW0gcGVhayBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkIGlzIHJlcG9ydGVkLgogKiAgICAgICAgR1RfQURWX1ZDVF9PRkZTRSAgICAgICAgIC0gb2Zmc2V0CiAqICAgICAgICBHVF9BRFZfVkNUX1NBTVBMRV9QT0lOVCAtIHNhbXBsZSBwb2ludAogKgogKiAgICAgICAgR1RfQURWX1ZDVF9OT19DUk9TU1BBSVIgLSBUcmFuc21pdHRlciBjaGFubmVsIHNlbGVjdCBpcyAwMDAKICogICAgICAgIEdUX0FEVl9WQ1RfQ1JPU1NQQUlSICAgIC0gVHJhbnNtaXR0ZXIgY2hhbm5lbHNlbGVjdCBpcyAxMDAvMTAxLzExMC8xMTEKICogICBFeGFtcGxlOiBtb2RlID0gR1RfQURWX1ZDVF9GSVJTVF9QRUFLIHwgR1RfQURWX1ZDVF9DUk9TU1BBSVIuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9BRFZfVkNUX01PRCAgICAgICAgICAgICAgICAgICAgbW9kZTsKICAgIEdUX0FEVl9WQ1RfVFJBTlNfQ0hBTl9TRUwgICAgICB0cmFuc0NoYW5TZWw7CiAgICBHVF9BRFZfVkNUX1NBTVBMRV9BVkcgICAgICAgICAgICBzYW1wbGVBdmc7CiAgICBHVF9BRFZfVkNUX1BFQUtERVRfSFlTVCAgICAgICAgcGVha0RldEh5c3Q7Cn0gR1RfQURWX1ZDVF9NT0RFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQURWX1ZDVF9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIEFkdmFuY2VkIFZDVCBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIEdUX0FEVl9WQ1RfRkFJTCAgICAgLSBhZHZhbmNlZCB2aXJ0dWFsIGNhYmxlIHRlc3QgZmFpbGVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggY2Fubm90IGJlIGRldGVybWluZWQuCiAqICAgICAgR1RfQURWX1ZDVF9OT1JNQUwgICAtIG5vcm1hbCBjYWJsZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIG1heSBub3QgYmUgZGV0ZXJtaW5lZC4KICogICAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1IC0gaW1wZWRhbmNlIG1pc21hdGNoID4gMTE1IG9obXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGlzIHZhbGlkLgogKiAgICAgIEdUX0FEVl9WQ1RfSU1QX0xFU1NfVEhBTl84NSAtIGltcGVkYW5jZSBtaXNtYXRjaCA8IDg1IG9obXMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGlzIHZhbGlkLgogKiAgICAgIEdUX0FEVl9WQ1RfT1BFTiAgICAgIC0gY2FibGUgb3BlbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9TSE9SVCAgICAgIC0gY2FibGUgc2hvcnRlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9DUk9TU19QQUlSX1NIT1JUIC0gY3Jvc3MgcGFpciBzaG9ydC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmxlIGxlbmdoIGZvciBlYWNoIGNoYW5uZWwgaXMgdmFsaWQuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQURWX1ZDVF9GQUlMLAogICAgR1RfQURWX1ZDVF9OT1JNQUwsCiAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1LAogICAgR1RfQURWX1ZDVF9JTVBfTEVTU19USEFOXzg1LAogICAgR1RfQURWX1ZDVF9PUEVOLAogICAgR1RfQURWX1ZDVF9TSE9SVCwKICAgIEdUX0FEVl9WQ1RfQ1JPU1NfUEFJUl9TSE9SVAp9IEdUX0FEVl9WQ1RfU1RBVFVTOwoKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBHVF9DUk9TU19QQUlSX0xJU1QKICoKICogRGVzY3JpcHRpb246IHN0cnVjdXR1cmUgZm9yIGNyb3NzIHBhaXIgc2hvcnQgY2hhbm5lbHMuCiAqCiAqIEZpZWxkczoKICogICAgICBjaGFubmVsIC0gY3Jvc3MgcGFpciBzaG9ydCBjaGFubmVsIGxpc3QKICogICAgICAgICAgICAgICAgY2hhbm5lbFtpXSBpcyBHVF9UUlVFIGlmIHRoZSBjaGFubmVsW2ldIGlzIGNyb3NzIHBhaXIgc2hvcnQKICogICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBjaGFubmVsIHVuZGVyIHRlc3QuCiAqICAgICAgZGlzdDJmYXVsdCAtIGVzdGltYXRlZCBkaXN0YW5jZSB0byB0aGUgc2hvcnRlZCBsb2NhdGlvbi4KICogICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiByZWxhdGVkIGNoYW5uZWwgKGFib3ZlKSBpcyBHVF9UUlVFLgogKi8KdHlwZWRlZiBzdHJ1Y3QgX0dUX0NST1NTX1NIT1JUX0xJU1QKewogICAgR1RfQk9PTCAgICBjaGFubmVsW0dUX01ESV9QQUlSX05VTV07CiAgICBHVF8xNiAgICAgZGlzdDJmYXVsdFtHVF9NRElfUEFJUl9OVU1dOwp9IEdUX0NST1NTX1NIT1JUX0xJU1Q7CgoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0FEVl9DQUJMRV9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IHN0cnVjdXR1cmUgZm9yIGFkdmFuY2VkIGNhYmxlIHN0YXR1cy4KICoKICogRmllbGRzOgogKiAgICAgIGNhYmxlU3RhdHVzIC0gVkNUIGNhYmxlIHN0YXR1cyBmb3IgZWFjaCBjaGFubmVsLgogKiAgICAgIGNyb3NzU2hvcnQgIC0gY3Jvc3MgcGFpciBzaG9ydCBsaXN0IGZvciBlYWNoIGNoYW5uZWwuCiAqICAgICAgICAgICAgICAgICAgICBWYWxpZCBvbmx5IGlmIHJlbGF0aXZlIGNhYmxlU3RhdHVzIGlzIEdUX0FEVl9WQ1RfQ1JPU1NfUEFJUl9TSE9SVC4KICogICAgICBkaXN0MmZhdWx0ICAtIGVzdGltYXRlZCBkaXN0YW5jZSB0byBmYXVsdCBmb3IgZWFjaCBjaGFubmVsLgogKiAgICAgICAgICAgICAgICAgICAgVmFsaWQgaWYgcmVsYXRpdmUgY2FibGVTdGF0dXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmdzOgogKiAgICAgICAgICAgICAgICAgICAgICBHVF9BRFZfVkNUX05PUk1BTAogKiAgICAgICAgICAgICAgICAgICAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1CiAqICAgICAgICAgICAgICAgICAgICAgIEdUX0FEVl9WQ1RfSU1QX0xFU1NfVEhBTl84NSwKICogICAgICAgICAgICAgICAgICAgICAgR1RfQURWX1ZDVF9PUEVOLCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgIEdUX0FEVl9WQ1RfU0hPUlQKICAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9BRFZfVkNUX1NUQVRVUyAgIGNhYmxlU3RhdHVzW0dUX01ESV9QQUlSX05VTV07CiAgICB1bmlvbiB7CiAgICAgICAgR1RfQ1JPU1NfU0hPUlRfTElTVCBjcm9zc1Nob3J0OwogICAgICAgIEdUXzE2ICAgICBkaXN0MmZhdWx0OwogICAgfXVbR1RfTURJX1BBSVJfTlVNXTsKfSBHVF9BRFZfQ0FCTEVfU1RBVFVTOwoKCi8qCiAqIERlZmluaXRpb246CiAqICAgICAgICBHVF9MRURfTElOS19BQ1RfU1BFRUQgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSBsaW5rLCBibGluayA9IGFjdGl2aXR5LCBibGluayBzcGVlZCA9IGxpbmsgc3BlZWQKICogICAgICAgIEdUX0xFRF9MSU5LX0FDVCAgICAgICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEX0xJTksgICAgICAgICAgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSBsaW5rCiAqICAgICAgICBHVF9MRURfMTBfTElOS19BQ1QgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCwgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwX0xJTksgICAgICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAKICogICAgICAgIEdUX0xFRF8xMDBfTElOS19BQ1QgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwMF9MSU5LICAgICAgICAgICAgLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwMCBsaW5rCiAqICAgICAgICBHVF9MRURfMTAwMF9MSU5LX0FDVCAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwMCBsaW5rLCBibGluayA9IGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfMTAwMF9MSU5LICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwMCBsaW5rCiAqICAgICAgICBHVF9MRURfMTBfMTAwX0xJTktfQUNUICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwXzEwMF9MSU5LICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAgb3IgMTAwIGxpbmsKICogICAgICAgIEdUX0xFRF8xMF8xMDAwX0xJTktfQUNUICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAwIGxpbmssIGJsaW5rID0gYWN0aXZpdHkKICogICAgICAgIEdUX0xFRF8xMF8xMDAwX0xJTksgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAwIGxpbmsKICogICAgICAgIEdUX0xFRF8xMDBfMTAwMF9MSU5LX0FDVC0gb2ZmID0gbm8gbGluaywgb24gPSAxMDAgb3IgMTAwMCBsaW5rLCBibGluayA9IGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfMTAwXzEwMDBfTElOSyAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwIG9yIDEwMDAgbGluawogKiAgICAgICAgR1RfTEVEX1NQRUNJQUwgICAgICAgICAgICAtIHNwZWNpYWwgbGVkcwogKiAgICAgICAgR1RfTEVEX0RVUExFWF9DT0wgICAgICAgIC0gb2ZmID0gaGFsZiBkdXBseCwgb24gPSBmdWxsIGR1cGxleCwgYmxpbmsgPSBjb2xsaXNpb24KICogICAgICAgIEdUX0xFRF9BQ1RJVklUWSAgICAgICAgICAgIC0gb2ZmID0gbm8gbGluaywgYmxpbmsgb24gPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEX1BUUF9BQ1QgICAgICAgICAgICAtIGJsaW5rIG9uID0gUFRQIGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfRk9SQ0VfQkxJTksgICAgICAgIC0gZm9yY2UgYmxpbmsKICogICAgICAgIEdUX0xFRF9GT1JDRV9PRkYgICAgICAgIC0gZm9yY2Ugb2ZmCiAqICAgICAgICBHVF9MRURfRk9SQ0VfT04gICAgICAgICAgICAtIGZvcmNlIG9uCiovCiNkZWZpbmUgR1RfTEVEX0xJTktfQUNUX1NQRUVEICAgICAgICAxCiNkZWZpbmUgR1RfTEVEX0xJTktfQUNUICAgICAgICAgICAgMgojZGVmaW5lIEdUX0xFRF9MSU5LICAgICAgICAgICAgICAgIDMKI2RlZmluZSBHVF9MRURfMTBfTElOS19BQ1QgICAgICAgICAgICA0CiNkZWZpbmUgR1RfTEVEXzEwX0xJTksgICAgICAgICAgICAgICAgNQojZGVmaW5lIEdUX0xFRF8xMDBfTElOS19BQ1QgICAgICAgIDYKI2RlZmluZSBHVF9MRURfMTAwX0xJTksgICAgICAgICAgICA3CiNkZWZpbmUgR1RfTEVEXzEwMDBfTElOS19BQ1QgICAgICAgIDgKI2RlZmluZSBHVF9MRURfMTAwMF9MSU5LICAgICAgICAgICAgOQojZGVmaW5lIEdUX0xFRF8xMF8xMDBfTElOS19BQ1QgICAgICAgIDEwCiNkZWZpbmUgR1RfTEVEXzEwXzEwMF9MSU5LICAgICAgICAgICAgMTEKI2RlZmluZSBHVF9MRURfMTBfMTAwMF9MSU5LX0FDVCAgICAxMgojZGVmaW5lIEdUX0xFRF8xMF8xMDAwX0xJTksgICAgICAgIDEzCiNkZWZpbmUgR1RfTEVEXzEwMF8xMDAwX0xJTktfQUNUICAgIDE0CiNkZWZpbmUgR1RfTEVEXzEwMF8xMDAwX0xJTksgICAgICAgIDE1CiNkZWZpbmUgR1RfTEVEX1NQRUNJQUwgICAgICAgICAgICAgICAgMTYKI2RlZmluZSBHVF9MRURfRFVQTEVYX0NPTCAgICAgICAgICAgIDE3CiNkZWZpbmUgR1RfTEVEX0FDVElWSVRZICAgICAgICAgICAgMTgKI2RlZmluZSBHVF9MRURfUFRQX0FDVCAgICAgICAgICAgICAgICAxOQojZGVmaW5lIEdUX0xFRF9GT1JDRV9CTElOSyAgICAgICAgICAgIDIwCiNkZWZpbmUgR1RfTEVEX0ZPUkNFX09GRiAgICAgICAgICAgIDIxCiNkZWZpbmUgR1RfTEVEX0ZPUkNFX09OICAgICAgICAgICAgMjIKI2RlZmluZSBHVF9MRURfUkVTRVJWRSAgICAgICAgICAgICAgICAyMwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfTEVEX0NGRwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gZm9yIExFRCBjb25maWd1cmF0aW9uIHR5cGUKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfTEVEX0NGR19MRUQwICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMCB2YWx1ZSAoR1RfTEVEX3h4eCBkZWZpbml0aW9uKQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQxICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMSB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQyICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMiB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQzICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMyB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19QVUxTRV9TVFJFVENIICAgIC0gcmVhZC93cml0ZSBwdWxzZSBzdHJldGNoICgwIH4gNCkKICogICAgICAgIEdUX0xFRF9DRkdfQkxJTktfUkFURSAgICAgICAgLSByZWFkL3dyaXRlIGJsaW5rIHJhdGUgICAgKDAgfiA1KQogKiAgICAgICAgR1RfTEVEX0NGR19TUEVDSUFMX0NPTlRST0wgICAgLSByZWFkL3dyaXRlIHNwZWNpYWwgY29udHJvbCAocG9ydCB2ZWN0b3IpCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfTEVEX0NGR19MRUQwLAogICAgR1RfTEVEX0NGR19MRUQxLAogICAgR1RfTEVEX0NGR19MRUQyLAogICAgR1RfTEVEX0NGR19MRUQzLAogICAgR1RfTEVEX0NGR19QVUxTRV9TVFJFVENILAogICAgR1RfTEVEX0NGR19CTElOS19SQVRFLAogICAgR1RfTEVEX0NGR19TUEVDSUFMX0NPTlRST0wKfSBHVF9MRURfQ0ZHOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQVZCX1JFQ09WRVJFRF9DTE9DSwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gZm9yIHJlY292ZXJlZCBjbG9jayB0eXBlCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX1BSSU1BUllfUkVDT1ZFUkVEX0NMT0NLICAgICAgICAgLSBwcmltYXJ5IHJlY292ZXJlZCBjbG9jawogKiAgICAgICAgR1RfU0VDT05EQVJZX1JFQ09WRVJFRF9DTE9DSyAgICAgLSBzZWNvbmRhcnkgcmVjb3ZlcmVkIGNsb2NrCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUFJJTUFSWV9SRUNPVkVSRURfQ0xPQ0ssCiAgICBHVF9TRUNPTkRBUllfUkVDT1ZFUkVEX0NMT0NLCn0gR1RfQVZCX1JFQ09WRVJFRF9DTE9DSzsKCgovKiBEZWZpbmUgUUFWIGludGVycnVwdCBiaXRzICovCgojZGVmaW5lIEdUX1FBVl9JTlRfU1RBVFVTX0VOUV9MTVRfQklUICAgICAgICAgICAgMHg4MDAwICAgIC8qIEVuUSBMaW1pdCBJbnRlcnJ1cHQgRW5hYmxlICovCiNkZWZpbmUgR1RfUUFWX0lOVF9TVEFUVVNfSVNPX0RFTF9CSVQgICAgICAgICAgICAweDA0MDAgICAgLyogSXNvIERlbGF5IEludGVycnVwdCBFbmFibGUgKi8KI2RlZmluZSBHVF9RQVZfSU5UX1NUQVRVU19JU09fRElTX0JJVCAgICAgICAgICAgIDB4MDIwMCAgLyogSXNvIERpc2NhcmQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfU1RBVFVTX0lTT19MSU1JVF9FWF9CSVQgICAgICAgIDB4MDEwMCAgLyogSXNvIFBhY2tldCBNZW1vcnkgRXhjZWVkZWQgSW50ZXJydXB0IEVuYWJsZSAqLwoKI2RlZmluZSBHVF9RQVZfSU5UX0VOQUJMRV9FTlFfTE1UX0JJVCAgICAgICAgICAgIDB4ODAgIC8qIEVuUSBMaW1pdCBJbnRlcnJ1cHQgRW5hYmxlICovCiNkZWZpbmUgR1RfUUFWX0lOVF9FTkFCTEVfSVNPX0RFTF9CSVQgICAgICAgICAgICAweDA0ICAvKiBJc28gRGVsYXkgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfRU5BQkxFX0lTT19ESVNfQklUICAgICAgICAgICAgMHgwMiAgLyogSXNvIERpc2NhcmQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfRU5BQkxFX0lTT19MSU1JVF9FWF9CSVQgICAgICAgIDB4MDEgIC8qIElzbyBQYWNrZXQgTWVtb3J5IEV4Y2VlZGVkIEludGVycnVwdCBFbmFibGUgKi8KCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0VFUFJPTV9PUEVSQVRJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIEVFUFJPTSBPcGVyYXRpb24gdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX1dSSVRFX0RBVEEgICAgICAgICAgICAgLSBXcml0ZSBkYXRhIHRvIHRoZSBFRVBST00gcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9EQVRBICAgICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBFRVBST00gcmVnaXN0ZXIKICogICAgICBQVFBfUkVTVEFSVCAgICAgICAgICAgICAgICAtIFJlc3RhcnQgRUVQUk9NIG9wcml0aW9uCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfRUVQUk9NX05PX09QICAgICAgICAgICAgICAgICAgICAgPSAweDAsCiAgICBHVF9FRVBST01fV1JJVEVfREFUQSAgICAgICAgICAgICA9IDB4MywKICAgIEdUX0VFUFJPTV9SRUFEX0RBVEEgICAgICAgICAgICAgID0gMHg0LAogICAgR1RfRUVQUk9NX1JFU1RBUlQgICAgICAgICAgICAgICAgPSAweDYsCiAgICBHVF9FRVBST01fSEFMVCAgICAgICAgICAgICAgICAgICAgPSAweDcsCn0gR1RfRUVQUk9NX09QRVJBVElPTjsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0VFUFJPTV9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBFRVBST00gT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgZWVwcm9tUG9ydCAgICAgICAgLSBwaHlzaWNhbCBwb3J0IG9mIHRoZSBkZXZpY2UKICogICAgICBlZXByb21BZGRyICAgICAtIHJlZ2lzdGVyIGFkZHJlc3MKICogICAgICBlZXByb21EYXRhICAgICAtIGRhdGEgZm9yIHB0cCByZWdpc3Rlci4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBlZXByb21Qb3J0OwogICAgR1RfVTMyICAgIGVlcHJvbUJsb2NrOwogICAgR1RfVTMyICAgIGVlcHJvbUFkZHI7CiAgICBHVF9VMzIgICAgZWVwcm9tRGF0YTsKfSBHVF9FRVBST01fT1BfREFUQTsKCiNkZWZpbmUgR1RfRUVQUk9NX09QX1NUX1JVTk5JTkdfTUFTSyAgICAgICAgMHg4MDAKI2RlZmluZSBHVF9FRVBST01fT1BfU1RfV1JJVEVfRU5fTUFTSyAgICAgICAgMHg0MDAKCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfU0NSQVRfMCAgICAweDAwIC8qIFNjcmF0Y2ggQnl0ZSAwICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfU0NSQVRfMSAgICAweDAxIC8qIFNjcmF0Y2ggQnl0ZSAxICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfR1BJT19DRkcgICAgMHg2MCAvKiBHUElPIENvbmZpZ3VyYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDYxID0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19HUElPX0RJUiAgICAweDYyIC8qIEdQSU8gRGlyZWN0aW9uICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfR1BJT19EQVQgICAgMHg2MyAvKiBHUElPIERhdGEgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMCAgICAweDcwIC8qIENPTkZJRyBEYXRhIDAgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMSAgICAweDcxIC8qIENPTkZJRyBEYXRhIDEgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMiAgICAweDcyIC8qIENPTkZJRyBEYXRhIDIgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMyAgICAweDczIC8qIENPTkZJRyBEYXRhIDMgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19TWU5DRSAgICAgICAgMHg3QyAvKiBTeW5jRSAmIFRBSUNMSzEyNZJzIERyaXZlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfUDVfQ0xLICAgIDB4N0QgLyogUDWScyAmIENMSzEyNZJzIENsb2NrIERyaXZlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfUDZfQ0xLICAgIDB4N0UgLyogUDaScyBDbG9jayBEcml2ZSAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX0VFUFJPTSAgICAweDdGIC8qIEVFUFJPTSBQYWQgZHJpdmUgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19NQVggICAgICAgIDB4ODAgLyogTWF4aW11biByZWdpc3RlciBwb2ludGVyICovCgojZGVmaW5lIEdUX0dQSU9fQklUXzAgICAgMHgxCiNkZWZpbmUgR1RfR1BJT19CSVRfMSAgICAweDIKI2RlZmluZSBHVF9HUElPX0JJVF8yICAgIDB4NAojZGVmaW5lIEdUX0dQSU9fQklUXzMgICAgMHg4CiNkZWZpbmUgR1RfR1BJT19CSVRfNCAgICAweDEwCiNkZWZpbmUgR1RfR1BJT19CSVRfNSAgICAweDIwCiNkZWZpbmUgR1RfR1BJT19CSVRfNiAgICAweDQwCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHVzZXIgOiAzOwogICAgR1RfVTggICAgICAgICBhZGRyIDogNTsKfUdUX0NPTkZJR19EQVRBXzA7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIGxlZCAgOiAyOwogICAgR1RfVTggICAgICAgICBmb3VyY29sIDogMTsKICAgIEdUX1U4ICAgICAgICAgbm9ybUN4IDogMTsKICAgIEdUX1U4ICAgICAgICAganVtYm8gOiAxOwogICAgR1RfVTggICAgICAgICBlZV93ZSA6IDE7CiAgICBHVF9VOCAgICAgICAgIGZkX2Zsb3cgOiAxOwogICAgR1RfVTggICAgICAgICBoZF9mbG93IDogMTsKfUdUX0NPTkZJR19EQVRBXzE7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHA1X21vZCA6IDM7CiAgICBHVF9VOCAgICAgICAgIGJpdDQgICAgIDogMTsKICAgIEdUX1U4ICAgICAgICAgcDZfbW9kIDogMzsKfUdUX0NPTkZJR19EQVRBXzI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHJtdV9tb2QgOiAyOwp9R1RfQ09ORklHX0RBVEFfMzsKCnR5cGVkZWYgc3RydWN0CnsKICAgIHVuaW9uIHsKICAgICAgICBHVF9VOCAgICAgICAgICAgICAgICBCeXRlOwogICAgICAgIEdUX0NPTkZJR19EQVRBXzAgICAgRGF0YTsKICAgIH0gY2ZnRGF0YTA7CiAgICB1bmlvbiB7CiAgICAgICAgR1RfVTggICAgICAgICAgICAgICAgQnl0ZTsKICAgICAgICBHVF9DT05GSUdfREFUQV8wICAgIERhdGE7CiAgICB9IGNmZ0RhdGExOwogICAgdW5pb24gewogICAgICAgIEdUX1U4ICAgICAgICAgICAgICAgIEJ5dGU7CiAgICAgICAgR1RfQ09ORklHX0RBVEFfMCAgICBEYXRhOwogICAgfSBjZmdEYXRhMjsKICAgIHVuaW9uIHsKICAgICAgICBHVF9VOCAgICAgICAgICAgICAgICBCeXRlOwogICAgICAgIEdUX0NPTkZJR19EQVRBXzAgICAgRGF0YTsKICAgIH0gY2ZnRGF0YTM7Cn1HVF9DT05GSUdfREFUQTsKCgovKiBkZWZpbml0aW9uIGZvciBUcnVua2luZyAqLwojZGVmaW5lIElTX1RSVU5LX0lEX1ZBTElEKF9kZXYsIF9pZCkgICAgKCgoX2lkKSA8IDE2KSA/IDEgOiAwKQoKCi8qIGRlZmluaXRpb24gZm9yIGRldmljZSBzY2FuIG1vZGUgKi8KI2RlZmluZSBTTUlfQVVUT19TQ0FOX01PREUgICAgICAgIDAgICAgLyogU2NhbiAwIG9yIDB4MTAgYmFzZSBhZGRyZXNzIHRvIGZpbmQgdGhlIFFEICovCiNkZWZpbmUgU01JX01BTlVBTF9NT0RFICAgICAgICAgICAgMSAgICAvKiBVc2UgUUQgbG9jYXRlZCBhdCBtYW51YWxseSBkZWZpbmVkIGJhc2UgYWRkciAqLwojZGVmaW5lIFNNSV9NVUxUSV9BRERSX01PREUgICAgICAgIDIgICAgLyogVXNlIFFEIGF0IGJhc2UgYWRkciBhbmQgdXNlIGluZGlyZWN0IGFjY2VzcyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgc2Nhbk1vZGU7ICAgIC8qIGNoZWNrIGRlZmluaXRpb24gZm9yIGRldmljZSBzY2FuIG1vZGUgKi8KICAgIEdUX1UzMiAgICBiYXNlQWRkcjsgICAgLyogbWVhbmluZ2Z1bCBpZiBzY2FuTW9kZSBpcyBub3QgU01JX0FVVE9fU0NBTl9NT0RFICovCn0gR1RfU0NBTl9NT0RFOwoKLyogZGVmaW5pdGlvbiBmb3IgQ3V0IFRocm91Z2ggKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTggICAgZW5hYmxlU2VsZWN0OyAgICAvKiBQb3J0IEVuYWJsZSBTZWxlY3QuICovCiAgICBHVF9VOCAgICBlbmFibGU7ICAgICAgICAgIC8qIEN1dCBUaHJvdWdoIGVuYWJsZS4gKi8KICAgIEdUX1U4ICAgIGN1dFRocnVRdWV1ZTsgICAgLyogQ3V0IFRocm91Z2ggUXVldWVzLi4gKi8KfSBHVF9DVVRfVEhST1VHSDsKCiNkZWZpbmUgR1RfU0tJUF9JTklUX1NFVFVQICAgIDB4NzM2YjY5NzAKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9TWVNfQ09ORklHCiAqCiAqIERlc2NyaXB0aW9uOiBTeXN0ZW0gY29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzIHN0cnVjdC4KICoKICogRmllbGRzOgogKiAgICBkZXZOdW0gICAgICAgIC0gU3dpdGNoIERldmljZSBOdW1iZXIKICogIGNwdVBvcnROdW0gIC0gVGhlIHBoeXNpY2FsIHBvcnQgdXNlZCB0byBjb25uZWN0IHRoZSBkZXZpY2UgdG8gQ1BVLgogKiAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBwb3J0IHRvIHdoaWNoIHBhY2tldHMgZGVzdGluZWQgdG8gQ1BVIGFyZQogKiAgICAgICAgICAgICAgICBmb3J3YXJkZWQuCiAqICBpbml0UG9ydHMgICAtIFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgcG9ydHMgc3RhdGUuCiAqICAgICAgICAgICAgICAgIEdUX0ZBTFNFICAgIC0gbGVhdmUgaW4gZGVmYXVsdCBzdGF0ZS4KICogICAgICAgICAgICAgICAgR1RfVFJVRSAgICAgLSBJbml0aWFsaXplIHRvIEZvcndhcmRpbmcgc3RhdGUuCiAqICBza2lwSW5pdFNldHVwIC0gc2tpcCBpbml0IHNldHVwLCBpZiB2YWx1ZSBpcyBHVF9TS0lQX0lOSVRfU0VUVVAKICogICAgICAgICAgICAgICAgICBwZXJmb3JtIGluaXQgc2V0dXAsIG90aGVyd2lzZQogKiAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6aW5nIHBvcnQgc3RhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgdmFyaWFibGUuCiAqICAgIEJTUEZ1bmN0aW9ucyAgICAtIEdyb3VwIG9mIEJTUCBzcGVjaWZpYyBmdW5jdGlvbnMuCiAqICAgICAgICAgICAgICAgIFNNSSBSZWFkL1dyaXRlIGFuZCBTZW1hcGhvcmUgUmVsYXRlZCBmdW5jdGlvbnMuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIGRldk51bTsKICAgIEdUX1U4ICAgICAgICAgY3B1UG9ydE51bTsKICAgIEdUX0JPT0wgICAgICAgaW5pdFBvcnRzOwogICAgQlNQX0ZVTkNUSU9OUyBCU1BGdW5jdGlvbnM7CiAgICBHVF9TQ0FOX01PREUgIG1vZGU7CiAgICBHVF9VMzIgICAgICAgIHNraXBJbml0U2V0dXA7Cn1HVF9TWVNfQ09ORklHOwoKI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwp0eXBlZGVmIGVudW0KewogSFdfQUNDRVNTX01PREVfU01JID0gMCwgICAgLyogVXNlIFNNSSAqLwogSFdfQUNDRVNTX01PREVfRjJSID0gMSwgICAgLyogVXNlIE1hcnZlbGwgUk1HTVQoRjJSKSBmdW5jdGlvbiAqLwp9IEZHVF9IV19BQ0NFU1NfTU9EOyAgICAvKiBIYXJkd2FyZSBhY2Nlc3MgbW9kZSAqLwojZW5kaWYKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9RRF9ERVYKICoKICogRGVzY3JpcHRpb246IEluY2x1ZGVzIFRhcGkgbGF5ZXIgc3dpdGNoIGNvbmZpZ3VyYXRpb24gZGF0YS4KICoKICogRmllbGRzOgogKiAgIGRldmljZUlkICAgICAgIC0gVGhlIGRldmljZSB0eXBlIGlkZW50aWZpZXIuCiAqICAgcmV2aXNpb24gICAgICAgLSBUaGUgZGV2aWNlIHJldmlzaW9uIG51bWJlci4KICogICBiYXNlUmVnQWRkciAgICAtIFN3aXRjaCBCYXNlIFJlZ2lzdGVyIGFkZHJlc3MuCiAqICAgbnVtT2ZQb3J0cyAgICAgLSBOdW1iZXIgb2YgYWN0aXZlIHBvcnRzLgogKiAgIG1heFBvcnRzICAgICAgIC0gbWF4IHBvcnRzLiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGRyaXZlcidzIHVzZS4KICogICBjcHVQb3J0TnVtICAgICAtIExvZ2ljYWwgcG9ydCBudW1iZXIgd2hvc2UgcGh5c2ljYWwgcG9ydCBpcyBjb25uZWN0ZWQgdG8gdGhlIENQVS4KICogICBtYXhQaHlOdW0gICAgICAtIG1heCBjb25maWd1cmFibGUgUGh5IGFkZHJlc3MuCiAqICAgc3RwTW9kZSAgICAgICAgLSBjdXJyZW50IHN3aXRjaCBTVFAgbW9kZSAoMCBub25lLCAxIGVuLCAyIGRpcykKICogICBhY2Nlc3NNb2RlICAgICAgICAtIHNob3dzIGhvdyB0byBmaW5kIGFuZCBhY2Nlc3MgdGhlIGRldmljZS4KICogICBwaHlBZGRyICAgICAgICAtIFNNSSBhZGRyZXNzIHVzZWQgdG8gYWNjZXNzIFN3aXRjaCByZWdpc3RlcnMob25seSBmb3IgU01JX01VTFRJX0FERFJfTU9ERSkuCiAqICAgdmFsaWRQb3J0VmVjICAgLSB2YWxpZCBwb3J0IGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIHZhbGlkUGh5VmVjICAgIC0gdmFsaWQgcGh5IGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIHZhbGlkU2VyZGVzVmVjICAgIC0gdmFsaWQgc2VyZGVzIGxpc3QgaW4gdmVjdG9yIGZvcm1hdAogKiAgIGRldkdyb3VwICAgICAgICAtIHRoZSBkZXZpY2UgZ3JvdXAKICogICBkZXZOYW1lICAgICAgICAtIG5hbWUgb2YgdGhlIGRldmljZSBpbiBncm91cCAwCiAqICAgZGV2TmFtZTEgICAgICAgIC0gbmFtZSBvZiB0aGUgZGV2aWNlIGluIGdyb3VwIDEKICogICBkZXZTdG9yYWdlICAgICAgICAtIGRyaXZlciBpbnRlcm5hbCB1c2UgKGhvbGQgdmFyaW91cyB0ZW1wIGluZm9ybWF0aW9uKQogKiAgIG11bHRpQWRkclNlbSAgIC0gU2VtYXBob3JlIGZvciBBY2Nlc3NpbmcgU01JIERldmljZQogKiAgIGF0dVJlZ3NTZW0gICAgIC0gU2VtYXBob3JlIGZvciBBVFUgYWNjZXNzCiAqICAgdnR1UmVnc1NlbSAgICAgLSBTZW1hcGhvcmUgZm9yIFZUVSBhY2Nlc3MKICogICBzdGF0c1JlZ3NTZW0gICAtIFNlbWFwaG9yZSBmb3IgUk1PTiBjb3VudGVyIGFjY2VzcwogKiAgIHBpcmxSZWdzU2VtICAgIC0gU2VtYXBob3JlIGZvciBQSVJMIFJlc291cmNlIGFjY2VzcwogKiAgIHB0cFJlZ3NTZW0gICAgIC0gU2VtYXBob3JlIGZvciBQVFAgUmVzb3VyY2UgYWNjZXNzCiAqICAgdGJsUmVnc1NlbSAgICAgLSBTZW1hcGhvcmUgZm9yIHZhcmlvdXMgVGFibGUgUmVzb3VyY2UgYWNjZXNzLAogKiAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBUcnVuayBUYWJsZXMgYW5kIERldmljZSBUYWJsZQogKiAgIGVlcHJvbVJlZ3NTZW0gIC0gU2VtYXBob3JlIGZvciBlZXByb20gY29udHJvbCBhY2Nlc3MKICogICBwaHlSZWdzU2VtICAgICAtIFNlbWFwaG9yZSBmb3IgUEhZIERldmljZSBhY2Nlc3MKICogICBod0FjY2Vzc1JlZ3NTZW0gLSBTZW1hcGhvcmUgZm9yIFJlbW90ZSBtYW5hZ2VtZW50IGFjY2VzcwogKiAgIGZndEh3QWNjZXNzTW9kIC0gU2VsZWN0IHJlZ2lzdGVyIGFjY2VzcyBtb2RlOiBSZWFkL1dyaXRlIG9yIEhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbgogKiAgIGZndFJlYWRNaWkgICAgIC0gcGxhdGZvcm0gc3BlY2lmaWMgU01JIHJlZ2lzdGVyIFJlYWQgZnVuY3Rpb24KICogICBmZ3RXcml0ZU1paSAgICAtIHBsYXRmb3JtIHNwZWNpZmljIFNNSSByZWdpc3RlciBXcml0ZSBmdW5jdGlvbgogKiAgIGZndEh3QWNjZXNzICAgIC0gcGxhdGZvcm0gc3BlY2lmaWMgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uCiAqICAgc2VtQ3JlYXRlICAgICAgLSBmdW5jdGlvbiB0byBjcmVhdGUgc2VtYXBvcmUKICogICBzZW1EZWxldGUgICAgICAtIGZ1bmN0aW9uIHRvIGRlbGV0ZSB0aGUgc2VtYXBvcmUKICogICBzZW1UYWtlICAgICAgICAtIGZ1bmN0aW9uIHRvIGdldCBhIHNlbWFwb3JlCiAqICAgc2VtR2l2ZSAgICAgICAgLSBmdW5jdGlvbiB0byByZXR1cm4gc2VtYXBob3JlCiAqICAgYXBwRGF0YSAgICAgICAgLSBhcHBsaWNhdGlvbiBkYXRhIHRoYXQgdXNlciBtYXkgdXNlCiAqLwpzdHJ1Y3QgX0dUX1FEX0RFVgp7CiAgICBHVF9ERVZJQ0UgICBkZXZpY2VJZDsKICAgIEdUX0xQT1JUICAgIGNwdVBvcnROdW07CiAgICBHVF9VOCAgICAgICByZXZpc2lvbjsKICAgIEdUX1U4ICAgICAgICBkZXZOdW07CiAgICBHVF9VOCAgICAgICAgZGV2RW5hYmxlZDsKICAgIEdUX1U4ICAgICAgIGJhc2VSZWdBZGRyOwogICAgR1RfVTggICAgICAgbnVtT2ZQb3J0czsKICAgIEdUX1U4ICAgICAgICBtYXhQb3J0czsKICAgIEdUX1U4ICAgICAgIG1heFBoeU51bTsKICAgIEdUX1U4ICAgICAgICBzdHBNb2RlOwogICAgR1RfVTggICAgICAgIGFjY2Vzc01vZGU7CiAgICBHVF9VOCAgICAgICAgcGh5QWRkcjsKICAgIEdUX1UxNiAgICAgICAgcmVzZXJ2ZWQ7CiAgICBHVF9VMTYgICAgICAgIHZhbGlkUG9ydFZlYzsKICAgIEdUX1UxNiAgICAgICAgdmFsaWRQaHlWZWM7CiAgICBHVF9VMTYgICAgICAgIHZhbGlkU2VyZGVzVmVjOwogICAgR1RfVTE2ICAgICAgICBkZXZHcm91cDsKICAgIEdUX1UzMiAgICAgICAgZGV2TmFtZTsKICAgIEdUX1UzMiAgICAgICAgZGV2TmFtZTE7CiAgICBHVF9VMzIgICAgICAgIGRldlN0b3JhZ2U7CiAgICBHVF9TRU0gICAgICAgIG11bHRpQWRkclNlbTsKICAgIEdUX1NFTSAgICAgICAgYXR1UmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgdnR1UmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgc3RhdHNSZWdzU2VtOwogICAgR1RfU0VNICAgICAgICBwaXJsUmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgcHRwUmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgdGJsUmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgZWVwcm9tUmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgcGh5UmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgaHdBY2Nlc3NSZWdzU2VtOwoKICAgIEZHVF9SRUFEX01JSSAgZmd0UmVhZE1paTsKICAgIEZHVF9XUklURV9NSUkgZmd0V3JpdGVNaWk7CiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKICAgIEZHVF9IV19BQ0NFU1NfTU9EIGZndEh3QWNjZXNzTW9kOyAgICAvKiBIYXJkd2FyZSBhY2Nlc3MgbW9kZSAqLwogICAgRkdUX0hXX0FDQ0VTUyBmZ3RId0FjY2VzczsgICAgLyogSGFyZHdhcmUgYWNjZXNzICAqLwojZW5kaWYKCiAgICBGR1RfU0VNX0NSRUFURSAgc2VtQ3JlYXRlOyAgICAgLyogY3JlYXRlIHNlbWFwaG9yZSAqLwogICAgRkdUX1NFTV9ERUxFVEUgIHNlbURlbGV0ZTsgICAgIC8qIGRlbGV0ZSB0aGUgc2VtYXBob3JlICovCiAgICBGR1RfU0VNX1RBS0UgICAgc2VtVGFrZTsgICAgLyogdHJ5IHRvIGdldCBhIHNlbWFwaG9yZSAqLwogICAgRkdUX1NFTV9HSVZFICAgIHNlbUdpdmU7ICAgIC8qIHJldHVybiBzZW1hcGhvcmUgKi8KICAgIHZvaWQqICAgICAgICAgICBhcHBEYXRhOwoKICAgIC8qIE1vZGlmaWVkIHRvIGFkZCBwb3J0IG1hcHBpbmcgZnVuY3Rpb25zIGludG8gZGV2aWNlIHNzeXN0ZW0gY29uZmlndXJhdGlvbi4gKi8KI2lmZGVmIEdUX1BPUlRfTUFQX0lOX0RFVgogICAgR1RfVTggICAgICAgICAgICgqbHBvcnQycG9ydCkgICAoR1RfVTE2IHBvcnRWZWMsIEdUX0xQT1JUIHBvcnQpOwogICAgR1RfTFBPUlQgICAgICAgICgqcG9ydDJscG9ydCkgICAoR1RfVTE2IHBvcnRWZWMsIEdUX1U4IGh3UG9ydCk7CiAgICBHVF9VMzIgICAgICAgICAgKCpscG9ydHZlYzJwb3J0dmVjKSAoR1RfVTE2IHBvcnRWZWMsIEdUX1UzMiBsVmVjKTsKICAgIEdUX1UzMiAgICAgICAgICAoKnBvcnR2ZWMybHBvcnR2ZWMpIChHVF9VMTYgcG9ydFZlYywgR1RfVTMyIHBWZWMpOwojZW5kaWYKCiAgICBHVF9CT09MICAgICAgIHVzZV9tYWQ7ICAgICAvKiB1c2UgTUFEIGRyaXZlciB0byBwcm9jZXNzIFBoeSAqLwojaWZkZWYgR1RfVVNFX01BRAogICAgTUFEX0RFViAgICBtYWRfZGV2OwojZW5kaWYKfTsKCi8qCiAqIHR5cGVkZWY6IHN0cnVjdCBQSVJMX1BBUkFfVEJMX1QKICoKICogRGVzY3JpcHRpb246IFBJUkwgcGFyYW1ldGVyIHRhYmxlIHN0cnVjdHVyZQogKgogKiBGaWVsZHM6CiAqICAgICAgQkkgICAgIC0gYnVja2V0IGluY3JlbWVudAogKiAgICAgIEJSRiAgICAtIGJ1Y2tldCByYXRlIGZhY3RvcgogKiAgICAgIENCUyAgICAtIENvbW1pdHRlZCBCdXJzdCBTaXplCiAqICAgICAgRUJTICAgIC0gRXhjZXNzIEJ1cnN0IFNpemUKICovCnN0cnVjdCBQSVJMX1BBUkFfVEJMX1QgewoJR1RfVTMyIEJJOwoJR1RfVTMyIEJSRjsKCUdUX1UzMiBDQlM7CglHVF9VMzIgRUJTOwp9OwoKLypzcGVjaWFsIHJhdGUgd2hpY2ggY2FuIG5vdCBiZSBjYWxjdWxhdGVkIGJ5IGZvcm11bGEqLwplbnVtIFBJUkxfU1BFQ0lBTF9SQVRFX0VOVU1fVCB7CglQSVJMX1JBVEVfTk9fTElNSVQgPSAwLAoJUElSTF9SQVRFXzY0SywKCVBJUkxfUkFURV8xMjhLLAoJUElSTF9SQVRFXzE5MkssCglQSVJMX1JBVEVfMjU2SywKCVBJUkxfUkFURV8zMjBLLAoJUElSTF9SQVRFXzM4NEssCglQSVJMX1JBVEVfNDQ4SywKCVBJUkxfUkFURV81MTJLLAoJUElSTF9SQVRFXzU3NkssCglQSVJMX1JBVEVfNjQwSywKCVBJUkxfUkFURV83MDRLLAoJUElSTF9SQVRFXzc2OEssCglQSVJMX1JBVEVfODMySywKCVBJUkxfUkFURV84OTZLLAoJUElSTF9SQVRFXzk2MEssCglQSVJMX1JBVEVfMU0sCglQSVJMX1JBVEVfMk0sCglQSVJMX1JBVEVfM00sCglQSVJMX1JBVEVfNE0sCglQSVJMX1JBVEVfNU0sCglQSVJMX1JBVEVfNk0sCglQSVJMX1JBVEVfN00sCglQSVJMX1JBVEVfOE0sCglQSVJMX1JBVEVfOU0sCglQSVJMX1JBVEVfMTBNLAoJUElSTF9SQVRFXzExTSwKCVBJUkxfUkFURV8xMk0sCglQSVJMX1JBVEVfMTNNLAoJUElSTF9SQVRFXzE0TSwKCVBJUkxfUkFURV8xNU0sCglQSVJMX1JBVEVfMTZNLAoJUElSTF9SQVRFXzE3TSwKCVBJUkxfUkFURV8xOE0sCglQSVJMX1JBVEVfMTlNLAoJUElSTF9SQVRFXzIwTQp9OwoKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiBfX21zQXBpX2ggKi8K