LyoKICogcHVibGljX2luZm9lbGUuaAogKgogKiBDb3B5cmlnaHQoYykgMTk5OCAtIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAgICAKICogYXJlIG1ldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgICAKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgIAogKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgCiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAgICAKICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAgICAgICAgIAogKiAgICBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAqICAqIE5laXRoZXIgdGhlIG5hbWUgVGV4YXMgSW5zdHJ1bWVudHMgbm9yIHRoZSBuYW1lcyBvZiBpdHMgICAgICAgICAgICAKICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkICAgIAogKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICAgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAgIAogKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCAgICAgCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiAKICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgIAogKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgICAgICAKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIAogKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgICAKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIAogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIEZJTEVOQU1FOiAgICAgICBwdWJsaWNfaW5mb2VsZS5oCgogIERFU0NSSVBUSU9OOiAgICBDb250YWlucyBpbmZvcm1hdGlvbiBlbGVtZW50IGRlZmluZXMvc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBGVyBhbmQgaG9zdC4KCgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZm5kZWYgUFVCTElDX0lORk9FTEVfSAojZGVmaW5lIFBVQkxJQ19JTkZPRUxFX0gKCgojaW5jbHVkZSAicHVibGljX3R5cGVzLmgiCiNpbmNsdWRlICJwdWJsaWNfY29tbWFuZHMuaCIKI2luY2x1ZGUgInB1YmxpY19yYWRpby5oIiAKCnR5cGVkZWYgZW51bQp7CiAgICBBQ1hfV0FLRV9VUF9DT05ESVRJT05TICAgICAgPSAweDAwMDIsCiAgICBBQ1hfTUVNX0NGRyAgICAgICAgICAgICAgICAgPSAweDAwMDMsCiAgICBBQ1hfU0xPVCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsCgogICAgQUNYX0FDX0NGRyAgICAgICAgICAgICAgICAgID0gMHgwMDA3LAogICAgQUNYX01FTV9NQVAgICAgICAgICAgICAgICAgID0gMHgwMDA4LAogICAgQUNYX0FJRCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDBBLAoKICAgIEFDWF9NRURJVU1fVVNBR0UgICAgICAgICAgICA9IDB4MDAwRiwKICAgIEFDWF9SWF9DRkcgICAgICAgICAgICAgICAgICA9IDB4MDAxMCwKICAgIEFDWF9UWF9RVUVVRV9DRkcgICAgICAgICAgICA9IDB4MDAxMSwKICAgIEFDWF9TVEFUSVNUSUNTICAgICAgICAgICAgICA9IDB4MDAxMywgLyogRGVidWcgQVBJKi8KICAgIEFDWF9QV1JfQ09OU1VNUFRJT05fU1RBVElTVElDUyAgICAgICA9MHgwMDE0LAogICAgQUNYX0ZFQVRVUkVfQ0ZHICAgICAgICAgICAgID0gMHgwMDE1LAogICAgQUNYX1RJRF9DRkcgICAgICAgICAgICAgICAgID0gMHgwMDFBLAogICAgQUNYX1BTX1JYX1NUUkVBTUlORyAgICAgICAgID0gMHgwMDFCLCAKICAgIEFDWF9CRUFDT05fRklMVEVSX09QVCAgICAgICA9IDB4MDAxRiwKICAgIEFDWF9OT0lTRV9ISVNUICAgICAgICAgICAgICA9IDB4MDAyMSwKICAgIEFDWF9IREtfVkVSU0lPTiAgICAgICAgICAgICA9IDB4MDAyMiwgLyogPz8/Ki8KICAgIEFDWF9QRF9USFJFU0hPTEQgICAgICAgICAgICA9IDB4MDAyMywKICAgIEFDWF9UWF9DT05GSUdfT1BUICAgICAgICAgICA9IDB4MDAyNCwKICAgIEFDWF9DQ0FfVEhSRVNIT0xEICAgICAgICAgICA9IDB4MDAyNSwKICAgIEFDWF9FVkVOVF9NQk9YX01BU0sgICAgICAgICA9IDB4MDAyNiwKICAgIEFDWF9DT05OX01PTklUX1BBUkFNUyAgICAgICA9IDB4MDAyRCwKICAgIEFDWF9DT05TX1RYX0ZBSUxVUkUgICAgICAgICA9IDB4MDAyRiwKICAgIEFDWF9CQ05fRFRJTV9PUFRJT05TICAgICAgICA9IDB4MDAzMSwKICAgIEFDWF9TR19FTkFCTEUgICAgICAgICAgICAgICA9IDB4MDAzMiwKICAgIEFDWF9TR19DRkcgICAgICAgICAgICAgICAgICA9IDB4MDAzMywKICAgIEFDWF9GTV9DT0VYX0NGRyAgICAgICAgICAgICA9IDB4MDAzNCwKCiAgICBBQ1hfQkVBQ09OX0ZJTFRFUl9UQUJMRSAgICAgPSAweDAwMzgsCiAgICBBQ1hfQVJQX0lQX0ZJTFRFUiAgICAgICAgICAgPSAweDAwMzksCiAgICBBQ1hfUk9BTUlOR19TVEFUSVNUSUNTX1RCTCAgPSAweDAwM0IsCiAgICBBQ1hfUkFURV9QT0xJQ1kgICAgICAgICAgICAgPSAweDAwM0QsIAogICAgQUNYX0NUU19QUk9URUNUSU9OICAgICAgICAgID0gMHgwMDNFLCAKICAgIEFDWF9TTEVFUF9BVVRIICAgICAgICAgICAgICA9IDB4MDAzRiwKICAgIEFDWF9QUkVBTUJMRV9UWVBFICAgICAgICAgICA9IDB4MDA0MCwKICAgIEFDWF9FUlJPUl9DTlQgICAgICAgICAgICAgICA9IDB4MDA0MSwKICAgIEFDWF9JQlNTX0ZJTFRFUiAgICAgICAgICAgICA9IDB4MDA0NCwKICAgIEFDWF9TRVJWSUNFX1BFUklPRF9USU1FT1VUICA9IDB4MDA0NSwKICAgIEFDWF9UU0ZfSU5GTyAgICAgICAgICAgICAgICA9IDB4MDA0NiwKICAgIEFDWF9DT05GSUdfUFNfV01NICAgICAgICAgICA9IDB4MDA0OSwKICAgIEFDWF9FTkFCTEVfUlhfREFUQV9GSUxURVIgICA9IDB4MDA0QSwKICAgIEFDWF9TRVRfUlhfREFUQV9GSUxURVIgICAgICA9IDB4MDA0QiwKICAgIEFDWF9HRVRfREFUQV9GSUxURVJfU1RBVElTVElDUyA9IDB4MDA0QywKICAgIEFDWF9SWF9DT05GSUdfT1BUICAgICAgICAgICA9IDB4MDA0RSwKICAgIEFDWF9GUkFHX0NGRyAgICAgICAgICAgICAgICA9IDB4MDA0RiwKICAgIEFDWF9CRVRfRU5BQkxFICAgICAgICAgICAgICA9IDB4MDA1MCwKCQojaWZkZWYgUkFESU9fU0NPUEUgIC8qIFJBRElPIE1PRFVMRSBTRUNUSU9OIFNUQVJUICovCgoJQUNYX1JBRElPX01PRFVMRV9TVEFSVCAgICAgID0gMHgwNTAwLAoJQUNYX1JTX0VOQUJMRQkJCQk9IEFDWF9SQURJT19NT0RVTEVfU1RBUlQsCglBQ1hfUlNfUlgJCQkJCT0gMHgwNTAxLAoKICAgIC8qIEFkZCBoZXJlIC4uLiAqLwoKCUFDWF9SQURJT19NT0RVTEVfRU5EICAgICAgICA9IDB4MDYwMCwKCiNlbmRpZiAvKiBSQURJTyBNT0RVTEUgU0VDVElPTiBFTkQgKi8KCiAgICBBQ1hfUlNTSV9TTlJfVFJJR0dFUiAgICAgICAgPSAweDAwNTEsCiAgICBBQ1hfUlNTSV9TTlJfV0VJR0hUUyAgICAgICAgPSAweDAwNTIsCiAgICBBQ1hfS0VFUF9BTElWRV9NT0RFICAgICAgICAgPSAweDAwNTMsCiAgICBBQ1hfU0VUX0tFRVBfQUxJVkVfQ09ORklHICAgPSAweDAwNTQsCiAgICBBQ1hfQkFfU0VTU0lPTl9SRVNQT05ERVJfUE9MSUNZID0gMHgwMDU1LAogICAgQUNYX0JBX1NFU1NJT05fSU5JVElBVE9SX1BPTElDWSA9IDB4MDA1NiwKICAgIEFDWF9QRUVSX0hUX0NBUCAgICAgICAgICAgICA9IDB4MDA1NywKICAgIEFDWF9IVF9CU1NfT1BFUkFUSU9OICAgICAgICA9IDB4MDA1OCwKICAgIEFDWF9DT0VYX0FDVElWSVRZICAgICAgICAgICA9IDB4MDA1OSwKICAgIEFDWF9TRVRfU01BUlRfUkVGTEVYX0RFQlVHICA9IDB4MDA1QSwKCUFDWF9TRVRfU01BUlRfUkVGTEVYX1NUQVRFICA9IDB4MDA1QiwKCUFDWF9TRVRfU01BUlRfUkVGTEVYX1BBUkFNUyA9IDB4MDA1RiwKCUFDWF9CVVJTVF9NT0RFCQkJCT0gMHgwMDVDLAoKICAgIEFDWF9TRVRfUkFURV9NQU1BR0VNRU5UX1BBUkFNUyA9IDB4MDA1RCwKICAgIEFDWF9HRVRfUkFURV9NQU1BR0VNRU5UX1BBUkFNUyA9IDB4MDA1RSwKCiAgICBET1QxMV9SWF9NU0RVX0xJRkVfVElNRSAgICAgPSAweDEwMDQsCiAgICBET1QxMV9DVVJfVFhfUFdSICAgICAgICAgICAgPSAweDEwMEQsCiAgICBET1QxMV9SWF9ET1QxMV9NT0RFICAgICAgICAgPSAweDEwMTIsCiAgICBET1QxMV9SVFNfVEhSRVNIT0xEICAgICAgICAgPSAweDEwMTMsIAogICAgRE9UMTFfR1JPVVBfQUREUkVTU19UQkwgICAgID0gMHgxMDE0LAogICAgQUNYX1NFVF9SQURJT19QQVJBTVMJCT0gMHgxMDE1LAoJQUNYX1BNX0NPTkZJRyAgICAgICAgICAgICAgID0gMHgxMDE2LAogICAgIAogICAgTUFYX0RPVDExX0lFID0gQUNYX1BNX0NPTkZJRywKICAgIAogICAgTUFYX0lFID0gMHhGRkZGICAgLypmb3JjZSBlbnVtZXJhdGlvbiB0byAxNmJpdHMqLwp9IEluZm9FbGVtZW50X2VudW07CgoKI2lmZGVmIEhPU1RfQ09NUElMRQp0eXBlZGVmIHVpbnQxNiBJbmZvRWxlbWVudF9lOwojZWxzZQp0eXBlZGVmIEluZm9FbGVtZW50X2VudW0gSW5mb0VsZW1lbnRfZTsKI2VuZGlmCgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgSW5mb0VsZW1lbnRfZSBpZDsKICAgIHVpbnQxNiBsZW5ndGg7CiAgICB1aW50MzIgZGF0YUxvYzsgLyp1c2UgdGhpcyB0byBwb2ludCB0byBmb3IgZm9sbG93aW5nIHZhcmlhYmxlLWxlbmd0aCBkYXRhKi8KfSBJbmZvRWxlbWVudF90OwoKCnR5cGVkZWYgc3RydWN0IAp7CiAgICB1aW50MTYgaWQ7CiAgICB1aW50MTYgbGVuOwp9IEVsZUhkclN0cnVjdDsKCiNkZWZpbmUgTUFYX05VTV9BSUQgICAgIDQgLyogbWF4IG51bWJlciBvZiBTVEFzIGluIElCU1MgKi8gIAoKCiNpZmRlZiBIT1NUX0NPTVBJTEUKI2RlZmluZSBJTkZPX0VMRV9IRFIgICAgRWxlSGRyU3RydWN0ICAgIEVsZUhkcjsKI2Vsc2UKI2RlZmluZSBJTkZPX0VMRV9IRFIKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfV0FLRV9VUF9DT05ESVRJT05TCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiAyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgZW51bQp7CiAgICBXQUtFX1VQX0VWRU5UX0JFQUNPTl9CSVRNQVAgICAgID0gMHgwMSwgLyogV2FrZSBvbiBldmVyeSBCZWFjb24qLwogICAgV0FLRV9VUF9FVkVOVF9EVElNX0JJVE1BUCAgICAgICA9IDB4MDIsIC8qIFdha2Ugb24gZXZlcnkgRFRJTSovCiAgICBXQUtFX1VQX0VWRU5UX05fRFRJTV9CSVRNQVAgICAgID0gMHgwNCwgLyogV2FrZSBvbiBldmVyeSBOdGggRFRJTSAoTGlzdGVuIGludGVydmFsKSovCiAgICBXQUtFX1VQX0VWRU5UX05fQkVBQ09OU19CSVRNQVAgID0gMHgwOCwgLyogV2FrZSBvbiBldmVyeSBOdGggQmVhY29uIChOeCBCZWFjb24pKi8KICAgIFdBS0VfVVBfRVZFTlRfQklUU19NQVNLICAgICAgICAgPSAweDBGCn0gV2FrZVVwRXZlbnRCaXRNYXNrX2U7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4ICB3YWtlVXBDb25kaXRpb25CaXRtYXA7ICAgLyogVGhlIGhvc3QgY2FuIHNldCBvbmUgYml0IG9ubHkuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdha2VVcEV2ZW50Qml0TWFza19lIGRlc2NyaWJlcyB0aGUgUG9zc2libGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FrZXVwIGNvbmZpZ3VyYXRpb24gYml0cyovCgogICAgdWludDggIGxpc3RlbkludGVydmFsOyAgICAgICAgICAvKiAwIGZvciBCZWFjb24gYW5kIER0aW0sICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHhEdGltcyAoMS0xMCkgZm9yIExpc3RlbiBJbnRlcnZhbCBhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeEJlYWNvbnMgKDEtMjU1KSBmb3IgTnhCZWFjb24qLwogICAgdWludDggIHBhZGRpbmdbMl07ICAgICAgICAgICAgICAvKiBhbGlnbm1lbnQgdG8gMzJiaXRzIGJvdW5kcnkgICAqLwp9V2FrZVVwQ29uZGl0aW9uX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfTUVNX0NGRwogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMTIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDggICByeE1lbWJsb2NrTnVtYmVyOyAgICAgICAgICAgLyogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbWVtb3J5IGJ1ZmZlcnMgdGhhdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgYWxsb2NhdGVkIHRvIHRoZSBSeCBtZW1vcnkgcG9vbC4gVGhlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY3R1YWwgbnVtYmVyIGFsbG9jYXRlZCBtYXkgYmUgbGVzcyB0aGFuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbnVtYmVyIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIG1lbW9yeSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmxvY2tzIGxlZnQgb3ZlciBmb3IgdGhlIE1pbmltdW0gTnVtYmVyIG9mICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeCBCbG9ja3MuIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgUlggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIHRoZSBtZW1vcnkgbWFwKi8KCiAgICB1aW50OCAgIHR4TWluaW11bU1lbWJsb2NrTnVtYmVyOyAgICAvKiBzcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyB0aGF0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIGFsbG9jYXRlZCB0byB0aGUgVFggcG9vbC4gRm9sbG93cyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBsaW1pdCBldmVuIGlmIHRoZSBOdW1iZXIgb2YgUnggTWVtb3J5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9ja3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQuKi8KCiAgICB1aW50OCAgIG51bVN0YXRpb25zOyAgICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIFNUQXMgc3VwcG9ydGVkIGluIElCU1MgbW9kZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBGVyB1c2VzIHRoaXMgZmllbGQgdG8gYWxsb2NhdGUgbWVtb3J5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgU1RBIGNvbnRleHQgZGF0YSBzdWNoIGFzIHNlY3VyaXR5IGtleXMqLwoKICAgIHVpbnQ4ICAgbnVtU3NpZFByb2ZpbGVzOyAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgU1NJRCBwcm9maWxlcyB1c2VkIGluIElCU1MgbW9kZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlcyBkaWZmZXJlbnQgcHJvZmlsZXMgZm9yIGRpZmZlcmVudCBTVEFzICovCgogICAgdWludDMyICB0b3RhbFR4RGVzY3JpcHRvcnM7ICAgICAgICAgLyogVG90YWwgVFggRGVzY3JpcHRvcnMgLSBpbiB0aGUgcGFzdCBpdCB3YXMgY29uZmlndXJlZCBwZXIgQUMgKi8KfSBBQ1hDb25maWdNZW1vcnlfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfU0xPVAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogOAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBlbnVtCnsKICAgIFNMT1RfVElNRV9MT05HID0gMCwgICAgIC8qIHRoZSBXaUxpbmsgdXNlcyBsb25nICgyMCB1cykgc2xvdHMqLwogICAgU0xPVF9USU1FX1NIT1JUID0gMSwgICAgLyogdGhlIFdpTGluayB1c2VzIHNob3J0ICg5IHVzKSBzbG90cyovCiAgICBERUZBVUxUX1NMT1RfVElNRSA9IFNMT1RfVElNRV9TSE9SVCwKICAgIE1BWF9TTE9UX1RJTUVTID0gMHhGRgp9IFNsb3RUaW1lX2VudW07CgojaWZkZWYgSE9TVF9DT01QSUxFCnR5cGVkZWYgdWludDggU2xvdFRpbWVfZTsKI2Vsc2UKdHlwZWRlZiBTbG90VGltZV9lbnVtIFNsb3RUaW1lX2U7CiNlbmRpZgoKCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDggICAgICB3b25lSW5kZXg7ICAgLyogcmVzZXJ2ZWQqLwoKICAgIFNsb3RUaW1lX2Ugc2xvdFRpbWU7ICAgIC8qIFRoZSBzbG90IHNpemUgdG8gYmUgdXNlZC4gcmVmZXIgdG8gU2xvdFRpbWVfZW51bS4gICAgKi8KICAgIHVpbnQ4ICAgICAgcmVzZXJ2ZWRbNl07Cn0gQUNYU2xvdF90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9BQ19DRkcKICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDgKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtCnsKICAgIEFDX0JFID0gMCwgICAgICAgICAgLyogQmVzdCBFZmZvcnQvTGVnYWN5Ki8KICAgIEFDX0JLID0gMSwgICAgICAgICAgLyogQmFja2dyb3VuZCovCiAgICBBQ19WSSA9IDIsICAgICAgICAgIC8qIFZpZGVvKi8KICAgIEFDX1ZPID0gMywgICAgICAgICAgLyogVm9pY2UqLwogICAgLyogQUNfQkNBU1QgICAgPSA0LCAqLyAgLyogQnJvYWRjYXN0IGR1bW15IGFjY2VzcyBjYXRlZ29yeSAgICAgICovIAogICAgQUNfQ1RTMlNFTEYgPSA0LCAgICAgICAgLyogQ1RTMlNlbGYgZmljdGl0aW91cyBBQywgICAgICAgICAgICAgICovICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZXMgIzQgdG8gZm9sbG93IEFDX1ZPLCBhcyAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUNfQkNBU1QgZG9lcyBub3Qgc2VlbSB0byBiZSBpbiB1c2UuICovCiAgICAgICAgQUNfQU5ZX1RJRCA9IDB4MUYsCglBQ19JTlZBTElEID0gMHhGRiwgIC8qIHVzZWQgZm9yIGdUeEFDY29uc3RyYWludCAqLwogICAgTlVNX0FDQ0VTU19DQVRFR09SSUVTID0gNAp9IEFjY2Vzc0NhdGVnb3J5X2VudW07Cgp0eXBlZGVmIGVudW0KewoJVElEMCA9IDAsCQkJLyogQmVzdCBFZmZvcnQvTGVnYWN5Ki8KCVRJRDEgPSAxLAkJCS8qIEJlc3QgRWZmb3J0L0xlZ2FjeSovCglUSUQyID0gMiwJCQkvKiBCYWNrZ3JvdW5kKi8KCVRJRDMgPSAzLAkJCS8qIFZpZGVvKi8KCVRJRDQgPSA0LAkJCS8qIFZvaWNlKi8KCVRJRDUgPSA1LAkJLyogQnJvYWRjYXN0IGR1bW15IGFjY2VzcyBjYXRlZ29yeSovCglUSUQ2ID0gNiwKCVRJRDcgPSA3LCAgICAgICAgICAgLyogbWFuYWdtZW50ICovCglOVU1fVFJBRkZJQ19DQVRFR09SSUVTID0gOAp9IFRyYWZmaWNDYXRlZ29yeV9lbnVtOwoKCiNkZWZpbmUgQUNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAweGZlICAgIC8qIFNwZWNpYWwgYWNjZXNzIGNhdGVnb3J5IHR5cGUgZm9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcXVlc3RzKi8KCgovKiBmb2xsb3dpbmcgYXJlIGRlZnVsdCB2YWx1ZXMgZm9yIHRoZSBJRSBmaWVsZHMqLwojZGVmaW5lIENXTUlOX0JLICAxNQojZGVmaW5lIENXTUlOX0JFICAxNQojZGVmaW5lIENXTUlOX1ZJICA3CiNkZWZpbmUgQ1dNSU5fVk8gIDMKI2RlZmluZSBDV01BWF9CSyAgMTAyMwojZGVmaW5lIENXTUFYX0JFICA2MwojZGVmaW5lIENXTUFYX1ZJICAxNQojZGVmaW5lIENXTUFYX1ZPICA3CiNkZWZpbmUgQUlGU19QSUZTIDEgLyogc2xvdCBudW1iZXIgc2V0dGluZyB0byBzdGFydCB0cmFuc21pc3Npb24gYXQgUElGUyBpbnRlcnZhbCAqLwojZGVmaW5lIEFJRlNfRElGUyAyIC8qIHNsb3QgbnVtYmVyIHNldHRpbmcgdG8gc3RhcnQgdHJhbnNtaXNzaW9uIGF0IERJRlMgaW50ZXJ2YWwgLSAqLwogICAgICAgICAgICAgICAgICAgIC8qIG5vcm1hbCBEQ0YgYWNjZXNzICovCgojZGVmaW5lIEFJRlNfTUlOIEFJRlNfUElGUwoKI2RlZmluZSBBSUZTTl9CSyAgNwojZGVmaW5lIEFJRlNOX0JFICAzCiNkZWZpbmUgQUlGU05fVkkgIEFJRlNfUElGUwojZGVmaW5lIEFJRlNOX1ZPICBBSUZTX1BJRlMKI2RlZmluZSBUWE9QX0JLICAgMAojZGVmaW5lIFRYT1BfQkUgICAwCiNkZWZpbmUgVFhPUF9WSSAgIDMwMDgKI2RlZmluZSBUWE9QX1ZPICAgMTUwNAojZGVmaW5lIERFRkFVTFRfQUNfU0hPUlRfUkVUUllfTElNSVQgNwojZGVmaW5lIERFRkFVTFRfQUNfTE9OR19SRVRSWV9MSU1JVCA0CgovKiByeFRpbWVvdXQgdmFsdWVzICovCiNkZWZpbmUgTk9fUlhfVElNRU9VVCAwCgp0eXBlZGVmIHN0cnVjdCAKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgIGFjOyAgICAgICAgIC8qIEFjY2VzcyBDYXRlZ29yeSAtIFRoZSBUWCBxdWV1ZSdzIGFjY2VzcyBjYXRlZ29yeSAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocmVmZXIgdG8gQWNjZXNzQ2F0ZWdvcnlfZW51bSkqLwogICAgdWludDggICBjd01pbjsgICAgICAvKiBUaGUgY29udGVudGlvbiB3aW5kb3cgbWluaW11bSBzaXplIChpbiBzbG90cykgZm9yICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhY2Nlc3MgY2xhc3MuKi8KICAgIHVpbnQxNiAgY3dNYXg7ICAgICAgLyogVGhlIGNvbnRlbnRpb24gd2luZG93IG1heGltdW0gc2l6ZSAoaW4gc2xvdHMpIGZvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYWNjZXNzIGNsYXNzLiovCiAgICB1aW50OCAgIGFpZnNuOyAgICAgIC8qIFRoZSBBSUYgdmFsdWUgKGluIHNsb3RzKSBmb3IgdGhlIGFjY2VzcyBjbGFzcy4qLwogICAgdWludDggICByZXNlcnZlZDsKICAgIHVpbnQxNiAgdHhvcExpbWl0OyAgLyogVGhlIFRYIE9wIExpbWl0IChpbiBtaWNyb3NlY29uZHMpIGZvciB0aGUgYWNjZXNzIGNsYXNzLiovCn0gQUNYQWNDZmdfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfTUVNX01BUAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFJlYWQgT25seQogICAgTGVuZ3RoOiA3MgogICAgTm90ZTogICBFeGNlcHQgZm9yIHRoZSBudW1UeE1lbUJsa3MsIG51bVJ4TWVtQmxrcyBmaWVsZHMsIHRoaXMgaXMKICAgICAgICAgICAgdXNlZCBpbiBNQVNURVIgbW9kZSBvbmx5ISEhCiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIE1FTV9NQVBfTlVNX0ZJRUxEUyAgMjQKCnR5cGVkZWYgc3RydWN0IAp7CiAgICB1aW50MzIgKmNvbnRyb2xCbG9jazsgLyogYXJyYXkgb2YgdHdvIDMyLWJpdCBlbnRyaWVzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBUeC1SZXN1bHQgZW50cmllcyBjb3VudGVyIHdyaXR0ZW4gYnkgdGhlIEZXCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBUeC1SZXN1bHQgZW50cmllcyBjb3VudGVyIHJlYWQgYnkgdGhlIGhvc3QgKi8KICAgIHZvaWQgICAqdHhSZXN1bHRRdWV1ZVN0YXJ0OyAvKiBwb2ludHMgdCBmaXJzdCBkZXNjcmlwdG9yIGluIFRSUSAqLwp9IFR4UmVzdWx0UG9pbnRlcnNfdDsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHZvaWQgKmNvZGVTdGFydDsgICAgICAgICAgICAgICAgCiAgICB2b2lkICpjb2RlRW5kOyAgICAgICAgICAgICAgICAgIAogICAgdm9pZCAqd2VwRGVmYXVsdEtleVN0YXJ0OwogICAgdm9pZCAqd2VwRGVmYXVsdEtleUVuZDsgICAgICAgICAKICAgIHZvaWQgKnN0YVRhYmxlU3RhcnQ7CiAgICB2b2lkICpzdGFUYWJsZUVuZDsgICAgICAgICAgICAgIAogICAgdm9pZCAqcGFja2V0VGVtcGxhdGVTdGFydDsKICAgIHZvaWQgKnBhY2tldFRlbXBsYXRlRW5kOyAgICAgICAgCiAgICBUeFJlc3VsdFBvaW50ZXJzX3QgIHRycUJsb2NrOyAgICAgICAgICAgICAKIAogICAgdm9pZCAqcXVldWVNZW1vcnlTdGFydDsKICAgIHZvaWQgKnF1ZXVlTWVtb3J5RW5kOyAKICAgIHZvaWQgKnBhY2tldE1lbW9yeVBvb2xTdGFydDsKICAgIHZvaWQgKnBhY2tldE1lbW9yeVBvb2xFbmQ7CiAgICB2b2lkICpkZWJ1Z0J1ZmZlcjFTdGFydDsKICAgIHZvaWQgKmRlYnVnQnVmZmVyMUVuZDsKICAgIHZvaWQgKmRlYnVnQnVmZmVyMlN0YXJ0OwogICAgdm9pZCAqZGVidWdCdWZmZXIyRW5kOwoKICAgIHVpbnQzMiBudW1UeE1lbUJsa3M7ICAgIC8qIE51bWJlciBvZiBibG9ja3MgdGhhdCBGVyBhbGxvY2F0ZWQgZm9yIFRYIHBhY2tldHMuKi8KICAgIHVpbnQzMiBudW1SeE1lbUJsa3M7ICAgIC8qIE51bWJlciBvZiBibG9ja3MgdGhhdCBGVyBhbGxvY2F0ZWQgZm9yIFJYIHBhY2tldHMuICAgKi8KCiAgICAvKiB0aGUgZm9sbG93aW5nIDQgZmllbGRzIGFyZSB2YWxpZCBpbiBTTEFWRSBtb2RlIG9ubHkgKi8KICAgIHVpbnQ4ICAgKnR4Q0J1ZlB0cjsKICAgIHVpbnQ4ICAgKnJ4Q0J1ZlB0cjsKICAgIHZvaWQgICAgKnJ4Q29udHJvbFB0cjsKICAgIHZvaWQgICAgKnR4Q29udHJvbFB0cjsKCn0gTWVtb3J5TWFwX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0FJRAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMgogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDE2ICBBaWQ7ICAgIC8qIFRoZSBBc3NvY2lhdGlvbiBJRCB0byB0aGUgV2lMaW5rLiBUaGUgV2lMaW5rIHVzZXMgdGhpcyAqLwogICAgICAgICAgICAgICAgICAgIC8qIGZpZWxkIHRvIGRldGVybWluZSB3aGVuIHRoZSBTVEEncyBBSUQgYml0IGlzIHNldCBpbiBhICovCiAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2ZWQgYmVhY29uIGFuZCB3aGVuIGEgUFMgUG9sbCBmcmFtZSBzaG91bGQgYmUgKi8KICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc21pdHRlZCB0byB0aGUgQVAuIFRoZSBob3N0IGNvbmZpZ3VyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgYWZ0ZXIgaXQgaGFzIGFzc29jaWF0ZWQgd2l0aCBhbiBBUC4gVGhpcyBpbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgaW4gQWQgSG9jIG1vZGUuKi8KICAgIHVpbnQ4ICBwYWRkaW5nWzJdOyAgLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KfSBBQ1hBaWRfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfRVJST1JfQ05UCiAgICBUeXBlOiAgIE9wZXJhdGlvbgogICAgQWNjZXNzOiBSZWFkIE9ubHkKICAgIExlbmd0aDogMTIKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIFBMQ1BFcnJvckNvdW50OyAgLyogVGhlIG51bWJlciBvZiBQTENQIGVycm9ycyBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZm9ybWF0aW9uIGVsZW1lbnQgd2FzIGludGVycm9nYXRlZC4gVGhpcyBmaWVsZCBpcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4gaXQgaXMgaW50ZXJyb2dhdGVkLiovCiAgICAKICAgIHVpbnQzMiBGQ1NFcnJvckNvdW50OyAgIC8qIFRoZSBudW1iZXIgb2YgRkNTIGVycm9ycyBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZm9ybWF0aW9uIGVsZW1lbnQgd2FzIGludGVycm9nYXRlZC4gVGhpcyBmaWVsZCBpcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4gaXQgaXMgaW50ZXJyb2dhdGVkLiovCiAgICAKICAgIHVpbnQzMiB2YWxpZEZyYW1lQ291bnQ7IC8qIFRoZSBudW1iZXIgb2YgTVBEVcKScyB3aXRob3V0IFBMQ1AgaGVhZGVyIGVycm9ycyByZWNlaXZlZCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgaW5mb3JtYXRpb24gZWxlbWVudCB3YXMgaW50ZXJyb2dhdGVkLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmaWVsZCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbiBpdCBpcyBpbnRlcnJvZ2F0ZWQuKi8KCiAgICB1aW50MzIgc2VxTnVtTWlzc0NvdW50OyAvKiB0aGUgbnVtYmVyIG9mIG1pc3NlZCBzZXF1ZW5jZSBudW1iZXJzIGluIHRoZSBzcXVlbnRpYWxseSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsdWVzIG9mIGZyYW1lcyBzZXEgbnVtYmVycyAqLwoKfSBBQ1hFcnJvckNvdW50ZXJzX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfTUVESVVNX1VTQUdFCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogUmVhZCBPbmx5CiAgICBMZW5ndGg6IDgKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIG1lZGl1bVVzYWdlOyAvKiByZXBvcnQgdG8gdGhlIGhvc3QgdGhlIHZhbHVlIG9mIG1lZGl1bSB1c2FnZSByZWdpc3RlcnMqLwogICAgdWludDMyIHBlcmlvZDsgICAgICAvKiByZXBvcnQgdG8gdGhlIGhvc3QgdGhlIHZhbHVlIG9mIG1lZGl1bSBwZXJpb2QgcmVnaXN0ZXJzKi8KfSBBQ1hNZWRpdW1Vc2FnZV90OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1JYX0NGRwogICAgVHlwZTogICBGaWx0ZXJpbmcgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDgKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFJ4IGNvbmZpZ3VyYXRpb24gKGZpbHRlcikgaW5mb3JtYXRpb24gZWxlbWVudAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi8qCiAgICBSWCBDb25maWdPcHRpb25zIFRhYmxlCiAgICBCaXQgICAgIERlZmluaXRpb24KICAgID09PSAgICAgPT09PT09PT09PQogICAgMzE6MTQgICBSZXNlcnZlZAogICAgMTMgICAgICBDb3B5IFJYIFN0YXR1cyAtIHdoZW4gc2V0LCB3cml0ZSB0aHJlZSByZWNlaXZlIHN0YXR1cyB3b3JkcyB0byB0b3Agb2YgCiAgICAgICAgICAgIHJ4J2QgTVBEVS4KICAgICAgICAgICAgV2hlbiBjbGVhciwgZG8gbm90IHdyaXRlIHRocmVlIHN0YXR1cyB3b3JkcyAoYWRkZWQgcmV2IDEuNSkKICAgIDEyICAgICAgUmVzZXJ2ZWQKICAgIDExICAgICAgUlggQ29tcGxldGUgdXBvbiBGQ1MgZXJyb3IgLSB3aGVuIHNldCwgZ2l2ZSByeCBjb21wbGV0ZSBpbnRlcnJ1cHQgZm9yIAogICAgICAgICAgICBGQ1MgZXJyb3JzLCBhZnRlciB0aGUgcnggZmlsdGVyaW5nLCBlLmcuIHVuaWNhc3QgZnJhbWVzIG5vdCB0byB1cyB3aXRoIAogICAgICAgICAgICBGQ1MgZXJyb3Igd2lsbCBub3QgZ2VuZXJhdGUgYW4gaW50ZXJydXB0CiAgICAxMCAgICAgIFNTSUQgRmlsdGVyIEVuYWJsZSAtIFdoZW4gc2V0LCB0aGUgV2lMaW5rIGRpc2NhcmRzIGFsbCBiZWFjb24sIAogICAgICAgICAgICBwcm9iZSByZXF1ZXN0LCBhbmQgcHJvYmUgcmVzcG9uc2UgZnJhbWVzIHdpdGggYW4gU1NJRCB0aGF0IGRvZXMgbm90IAogICAgICAgICAgICBtYXRjaCB0aGUgU1NJRCBzcGVjaWZpZWQgYnkgdGhlIGhvc3QgaW4gdGhlIFNUQVJUL0pPSU4gY29tbWFuZC4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgZnJhbWVzIHdpdGggYW55IFNTSUQuCiAgICA5ICAgICAgIEJyb2FkY2FzdCBGaWx0ZXIgRW5hYmxlIC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgZGlzY2FyZHMgYWxsIGJyb2FkY2FzdCAKICAgICAgICAgICAgZnJhbWVzLiBXaGVuIGNsZWFyLCB0aGUgV2lMaW5rIHJlY2VpdmVzIGFsbCByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzLgogICAgODo2ICAgICBSZXNlcnZlZAogICAgNSAgICAgICBCU1NJRCBGaWx0ZXIgRW5hYmxlIC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgZGlzY2FyZHMgYW55IGZyYW1lcyB3aXRoIGEgCiAgICAgICAgICAgIEJTU0lEIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIEJTU0lEIHNwZWNpZmllZCBieSB0aGUgaG9zdC4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgZnJhbWVzIGZyb20gYW55IEJTU0lELgogICAgNCAgICAgICBNQUMgQWRkciBGaWx0ZXIgLSBXaGVuIHNldCwgdGhlIFdpTGluayBkaXNjYXJkcyBhbnkgZnJhbWVzIHdpdGggYSAKICAgICAgICAgICAgZGVzdGluYXRpb24gYWRkcmVzcyB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWRhcHRvci4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgZnJhbWVzIGRlc3RpbmVkIHRvIGFueSBNQUMgYWRkcmVzcy4KICAgIDMgICAgICAgUHJvbWlzY3VvdXMgLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgdmFsaWQgZnJhbWVzIAogICAgICAgICAgICAoaS5lLiwgYWxsIGZyYW1lcyB0aGF0IHBhc3MgdGhlIEZDUyBjaGVjaykuIAogICAgICAgICAgICBXaGVuIGNsZWFyLCBvbmx5IGZyYW1lcyB0aGF0IHBhc3MgdGhlIG90aGVyIGZpbHRlcnMgc3BlY2lmaWVkIGFyZSByZWNlaXZlZC4KICAgIDIgICAgICAgRkNTIC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgaW5jbHVkZXMgdGhlIEZDUyB3aXRoIHRoZSByZWNlaXZlZCBmcmFtZS4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZSBGQ1MgaXMgZGlzY2FyZGVkLgogICAgMSAgICAgICBQTENQIGhlYWRlciAtIFdoZW4gc2V0LCB3cml0ZSBhbGwgZGF0YSBmcm9tIGJhc2ViYW5kIHRvIGZyYW1lIGJ1ZmZlciAKICAgICAgICAgICAgaW5jbHVkaW5nIFBIWSBoZWFkZXIuCiAgICAwICAgICAgIFJlc2VydmVkIC0gQWx3YXlzIGVxdWFsIHRvIDAuCgogICAgUlggRmlsdGVyT3B0aW9ucyBUYWJsZQogICAgQml0ICAgICBEZWZpbml0aW9uCiAgICA9PT0gICAgID09PT09PT09PT0KICAgIDMxOjEyICAgUmVzZXJ2ZWQgLSBBbHdheXMgZXF1YWwgdG8gMC4KICAgIDExICAgICAgQXNzb2NpYXRpb24gLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgYXNzb2NpYXRpb24gcmVsYXRlZCBmcmFtZXMgCiAgICAgICAgICAgIChhc3NvY2lhdGlvbiByZXF1ZXN0L3Jlc3BvbnNlLCByZWFzc29jYXRpb24gcmVxdWVzdC9yZXNwb25zZSwgYW5kIAogICAgICAgICAgICBkaXNhc3NvY2lhdGlvbikuIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgMTAgICAgICBBdXRoL0RlIGF1dGggLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgYXV0aGVudGljYXRpb24gYW5kIAogICAgICAgICAgICBkZS1hdXRoZW50aWNhdGlvbiBmcmFtZXMuIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgOSAgICAgICBCZWFjb24gLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgYmVhY29uIGZyYW1lcy4gV2hlbiBjbGVhciwgCiAgICAgICAgICAgIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgOCAgICAgICBDb250ZW50aW9uIEZyZWUgLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgY29udGVudGlvbiBmcmVlIGZyYW1lcy4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgNyAgICAgICBDb250cm9sIC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgYWxsIGNvbnRyb2wgZnJhbWVzLiAKICAgICAgICAgICAgV2hlbiBjbGVhciwgdGhlc2UgZnJhbWVzIGFyZSBkaXNjYXJkZWQuCiAgICA2ICAgICAgIERhdGEgLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgZGF0YSBmcmFtZXMuICAgCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgNSAgICAgICBGQ1MgRXJyb3IgLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBmcmFtZXMgdGhhdCBoYXZlIEZDUyBlcnJvcnMuIAogICAgICAgICAgICBXaGVuIGNsZWFyLCB0aGVzZSBmcmFtZXMgYXJlIGRpc2NhcmRlZC4KICAgIDQgICAgICAgTWFuYWdlbWVudCAtIFdoZW4gc2V0LCB0aGUgV2lMaW5rIHJlY2VpdmVzIGFsbCBtYW5hZ2VtZW50IGZyYW1lcy4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgMyAgICAgICBQcm9iZSBSZXF1ZXN0IC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgYWxsIHByb2JlIHJlcXVlc3QgZnJhbWVzLiAKICAgICAgICAgICAgV2hlbiBjbGVhciwgdGhlc2UgZnJhbWVzIGFyZSBkaXNjYXJkZWQuCiAgICAyICAgICAgIFByb2JlIFJlc3BvbnNlIC0gV2hlbiBzZXQsIHRoZSBXaUxpbmsgcmVjZWl2ZXMgYWxsIHByb2JlIHJlc3BvbnNlIGZyYW1lcy4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgMSAgICAgICBSVFMvQ1RTL0FDSyAtIFdoZW4gc2V0LCB0aGUgV2lMaW5rIHJlY2VpdmVzIGFsbCBSVFMsIENUUyBhbmQgQUNLIGZyYW1lcy4gCiAgICAgICAgICAgIFdoZW4gY2xlYXIsIHRoZXNlIGZyYW1lcyBhcmUgZGlzY2FyZGVkLgogICAgMCAgICAgICBSc3ZkIFR5cGUvU3ViIFR5cGUgLSBXaGVuIHNldCwgdGhlIFdpTGluayByZWNlaXZlcyBhbGwgZnJhbWVzIHRoYXQgCiAgICAgICAgICAgIGhhdmUgcmVzZXJ2ZWQgZnJhbWUgdHlwZXMgYW5kIHN1YiB0eXBlcyBhcyBkZWZpbmVkIGJ5IHRoZSA4MDIuMTEgCiAgICAgICAgICAgIHNwZWNpZmljYXRpb24uIAogICAgICAgICAgICBXaGVuIGNsZWFyLCB0aGVzZSBmcmFtZXMgYXJlIGRpc2NhcmRlZC4KKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MzIgICAgICAgICAgQ29uZmlnT3B0aW9uczsgIC8qIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSByZWNlaXZlciBpbiB0aGUgV2lMaW5rLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiUlggQ29uZmlnT3B0aW9ucyBUYWJsZSIgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBmaWVsZC4qLwogICAgdWludDMyICAgICAgICAgIEZpbHRlck9wdGlvbnM7ICAvKiBUaGUgdHlwZXMgb2YgZnJhbWVzIHRoYXQgdGhlIFdpTGluayBjYW4gcmVjZWl2ZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlJYIEZpbHRlck9wdGlvbnMgVGFibGUiIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgZmllbGQuKi8KfSBBQ1hSeENvbmZpZ190OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0JFQUNPTl9GSUxURVJfT1BUCiAgICBEZXNjOiAgIFRoaXMgaW5mb3JtYXRpb24gZWxlbWVudCBlbmFibGVzIHRoZSBob3N0IHRvIGFjdGl2YXRlIGJlYWNvbiBmaWx0ZXJpbmcuIAogICAgICAgICAgICBUaGUgZmlsdGVyIGNhbiBvbmx5IGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBTVEEgaXMgaW4gUFMgbW9kZS4gCiAgICAgICAgICAgIFdoZW4gYWN0aXZhdGVkLCBlaXRoZXIgdGhlIGhvc3QgaXMgbm90IG5vdGlmaWVkIGFib3V0IGJlYWNvbnMgd2hvc2UgCiAgICAgICAgICAgIHVuaWNhc3QgVElNIGJpdCBpcyBub3Qgc2V0LCBvciB0aGVzZSBiZWFjb25zIGFyZSBidWZmZXJlZCBmaXJzdCBhbmQgCiAgICAgICAgICAgIHRoZSBob3N0IGlzIG5vdGlmaWVkIG9ubHkgYWZ0ZXIgdGhlIGJ1ZmZlciByZWFjaGVzIGEgcHJlZGV0ZXJtaW5lZCBzaXplLgogICAgICAgICAgICBUaGUgaG9zdCBzaG91bGQgbm90IGFjdGl2YXRlIHRoZSBmaWx0ZXIgaWYgaXQgY29uZmlndXJlcyB0aGUgZmlybXdhcmUgCiAgICAgICAgICAgIHRvIGxpc3RlbiB0byBicm9hZGNhc3RzIChzZWUgdGhlIFZCTSBPcHRpb25zIGZpZWxkIGluIHRoZSAKICAgICAgICAgICAgQUNYUG93ZXJNZ210T3B0aW9ucyBpbmZvcm1hdGlvbiBlbGVtZW50KS4gVGhlIGZpbHRlciBvbmx5IGFmZmVjdHMgYmVhY29ucywgCiAgICAgICAgICAgIGFuZCBub3Qgb3RoZXIgTVNEVXMgLSB0aGUgZmlybXdhcmUgbm90aWZpZXMgdGhlIGhvc3QgaW1tZWRpYXRlbHkgYWJvdXQgCiAgICAgICAgICAgIHRoZWlyIGFycml2YWwuCiAgICBUeXBlOiAgIEZpbHRlcmluZyBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMgogCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QgIAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4ICAgZW5hYmxlOyAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsdGVyIGlzIGVuYWJsZWQuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSAtIGVuYWJsZWQsIDAgLSBkaXNhYmxlZC4gKi8KICAgIHVpbnQ4ICAgbWF4TnVtT2ZCZWFjb25zU3RvcmVkOyAvKiBUaGUgbnVtYmVyIG9mIGJlYWNvbnMgd2l0aG91dCB0aGUgdW5pY2FzdCBUSU0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgc2V0IHRoYXQgdGhlIGZpcm13YXJlIGJ1ZmZlcnMgYmVmb3JlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2lnbmFsaW5nIHRoZSBob3N0IGFib3V0IHJlYWR5IGZyYW1lcy4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIHNldCB0byAwIGFuZCB0aGUgZmlsdGVyIGlzIGVuYWJsZWQsIGJlYWNvbnMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRob3V0IHRoZSB1bmljYXN0IFRJTSBiaXQgc2V0IGFyZSBkcm9wcGVkLiovCiAgICB1aW50OCAgcGFkZGluZ1syXTsgICAgICAgICAgICAgLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KfSBBQ1hCZWFjb25GaWx0ZXJPcHRpb25zX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0JFQUNPTl9GSUxURVJfVEFCTEUKICAgIERlc2M6ICAgVGhpcyBpbmZvcm1hdGlvbiBlbGVtZW50IGNvbmZpZ3VyZXMgYmVhY29uIGZpbHRlcmluZyBoYW5kbGluZyBmb3IgdGhlCiAgICAgICAgICAgIHNldCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cy4gQW4gaW5mb3JtYXRpb24gZWxlbWVudCBpbiBhIGJlYWNvbiBjYW4gYmUgCiAgICAgICAgICAgIHNldCB0byBiZTogaWdub3JlZCAobmV2ZXIgY29tcGFyZWQsIGFuZCBjaGFuZ2VzIHdpbGwgbm90IGNhdXNlIGJlYWNvbiAKICAgICAgICAgICAgdHJhbnNmZXIpLCBjaGVja2VkIChjb21wYXJlZCwgYW5kIHRyYW5zZmVycmVkIGluIGNhc2Ugb2YgYSBjaGFuZ2UpLCBvciAKICAgICAgICAgICAgdHJhbnNmZXJyZWQgKHRyYW5zZmVycmVkIHRvIHRoZSBob3N0IGZvciBlYWNoIGFwcGVhcmFuY2Ugb3IgZGlzYXBwZWFyYW5jZSkuCiAgICAgICAgICAgIFRoZSB0YWJsZSBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gZWxlbWVudHMgdGhhdCBhcmUgc3ViamVjdCB0byBtb25pdG9yaW5nIAogICAgICAgICAgICBmb3IgaG9zdCB0cmFuc2Zlci4gCiAgICAgICAgICAgIEFsbCBpbmZvcm1hdGlvbiBlbGVtZW50cyB0aGF0IGFyZSBub3QgaW4gdGhlIHRhYmxlIHNob3VsZCBiZSBpZ25vcmVkIGZvciAKICAgICAgICAgICAgbW9uaXRvcmluZy4KICAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgZW5hYmxlZCB3aGVuIGJlYWNvbiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSAKICAgICAgICAgICAgQUNYX0JFQUNPTl9GSUxURVJfT1BULgogICAgVHlwZTogICBGaWx0ZXJpbmcgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDEwMQogICAgTm90ZXM6ICB0aGUgZmllbGQgbWVhc3VyaW5nIHRoZSB2YWx1ZSBvZiByZWNlaXZlZCBiZWFjb25zIGZvciB3aGljaCB0aGUgZGV2aWNlIAogICAgICAgICAgICB3YWtlcyB1cCB0aGUgaG9zdCBpbiBBQ1hfQkVBQ09OX0ZJTFRFUl9PUFQgZG9lcyBub3QgYWZmZWN0IAogICAgICAgICAgICB0aGlzIGluZm9ybWF0aW9uIGVsZW1lbnQuCiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICAgIEFDWEJlYWNvbkZpbHRlckVudHJ5IChub3QgMjIxKQogICAgQnl0ZSBPZmZzZXQgICAgIFNpemUgKEJ5dGVzKSAgICBEZWZpbml0aW9uIAogICAgPT09PT09PT09PT0gICAgID09PT09PT09PT09PSAgICA9PT09PT09PT09CiAgICAwICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIElFIGlkZW50aWZpZXIKICAgIDEgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgVHJlYXRtZW50IGJpdCBtYXNrCgogICAgQUNYQmVhY29uRmlsdGVyRW50cnkgKDIyMSkKICAgIEJ5dGUgT2Zmc2V0ICAgICBTaXplIChCeXRlcykgICAgRGVmaW5pdGlvbiAKICAgID09PT09PT09PT09ICAgICA9PT09PT09PT09PT0gICAgPT09PT09PT09PQogICAgMCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICBJRSBpZGVudGlmaWVyCiAgICAxICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIFRyZWF0bWVudCBiaXQgbWFzawogICAgMiAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICBPVUkKICAgIDUgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgVHlwZQogICAgNiAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICBWZXJzaW9uCgoKICAgIFRyZWF0bWVudCBiaXQgbWFzayAtIFRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGhhbmRsaW5nOgogICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgLSBUaGUgaW5mb3JtYXRpb24gZWxlbWVudCBpcyBjb21wYXJlZCBhbmQgdHJhbnNmZXJyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBjaGFuZ2UuCiAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMSAtIFRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGlzIHRyYW5zZmVycmVkIHRvIHRoZSBob3N0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggYXBwZWFyYW5jZSBvciBkaXNhcHBlYXJhbmNlLgogICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGJvdGggYml0cyBjYW4gYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUuCiovCiNkZWZpbmUgQkVBQ09OX0ZJTFRFUl9UQUJMRV9NQVhfSUVfTlVNICAgICAgICAgICAgICAgICAgICAgICgzMikKI2RlZmluZSBCRUFDT05fRklMVEVSX1RBQkxFX01BWF9WRU5ET1JfU1BFQ0lGSUNfSUVfTlVNICAgICAgKDYpCiNkZWZpbmUgQkVBQ09OX0ZJTFRFUl9UQUJMRV9JRV9FTlRSWV9TSVpFICAgICAgICAgICAgICAgICAgICgyKQojZGVmaW5lIEJFQUNPTl9GSUxURVJfVEFCTEVfRVhUUkFfVkVORE9SX1NQRUNJRklDX0lFX1NJWkUgICAoNikKI2RlZmluZSBCRUFDT05fRklMVEVSX1RBQkxFX01BWF9TSVpFICAgICgoQkVBQ09OX0ZJTFRFUl9UQUJMRV9NQVhfSUVfTlVNICogQkVBQ09OX0ZJTFRFUl9UQUJMRV9JRV9FTlRSWV9TSVpFKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQkVBQ09OX0ZJTFRFUl9UQUJMRV9NQVhfVkVORE9SX1NQRUNJRklDX0lFX05VTSAqIEJFQUNPTl9GSUxURVJfVEFCTEVfRVhUUkFfVkVORE9SX1NQRUNJRklDX0lFX1NJWkUpKQoKdHlwZWRlZiBzdHJ1Y3QgQUNYQmVhY29uRmlsdGVySUVUYWJsZVN0cnVjdCB7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4IE51bWJlck9mSUVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBJRSdzIGluIHRoZSB0YWJsZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgLSBjbGVhcnMgdGhlIHRhYmxlLiovCgogICAgdWludDggcGFkZGluZ1szXTsgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCiAgICB1aW50OCBJRVRhYmxlW0JFQUNPTl9GSUxURVJfVEFCTEVfTUFYX1NJWkVdOwp9IEFDWEJlYWNvbkZpbHRlcklFVGFibGVfdDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9DT0VYX0FDVElWSVRZX1RBQkxFCiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBlbnVtCnsKICAgIENPRVhfSVBfQlQgPSAwLAogICAgQ09FWF9JUF9XTEFOLCAKICAgIENPRVhfSVBfRFVBTF9NT0RFLCAgIC8qIFRoYXQgZGVmaW5lIGlzbid0IHZhbGlkIHZhbHVlIGluIERSJkZXIGludGVyZmFjZSBhbmQgdXNlIGp1c3QgaW4gdGhlIEZXICovCiAgICBNQVhfQ09FWF9JUAp9IENvZXhJcF9lbnVtOwoKI2lmZGVmIEhPU1RfQ09NUElMRQp0eXBlZGVmIHVpbnQ4IENvZXhJcF9lOwojZWxzZQp0eXBlZGVmIENvZXhJcF9lbnVtIENvZXhJcF9lOwojZW5kaWYKCnR5cGVkZWYgc3RydWN0IEFDWENvZXhBY3Rpdml0eUlFU3RydWN0IHsKICAgIElORk9fRUxFX0hEUgogICAgQ29leElwX2UgY29leElwOyAgICAgICAgIC8qIDAtQlQsIDEtV0xBTiAoYWNjb3JkaW5nIHRvIENvZXhJcF9lIGluIEZXKSAqLwogICAgdWludDggIGFjdGl2aXR5SWQ7ICAgICAgIC8qIEFjY29yZGluZyB0byBCVC9XTEFOIGFjdGl2aXR5IG51bWJlcmluZyBpbiBGVyAqLyAKICAgIHVpbnQ4ICBkZWZhdWx0UHJpb3JpdHk7ICAvKiAwLTI1NSwgYWN0aXZpdHkgZGVmYXVsdCBwcmlvcml0eSAqLwogICAgdWludDggIHJhaXNlZFByaW9yaXR5OyAgIC8qIDAtMjU1LCBhY3Rpdml0eSByYWlzZWQgcHJpb3JpdHkgKi8KICAgIHVpbnQxNiBtaW5TZXJ2aWNlOyAgICAgICAvKiAwLTY1NTM1LCBUaGUgbWluaW11bSBzZXJ2aWNlIHJlcXVlc3RlZCBlaXRoZXIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyBvciBpbiBtaWxsaXNlY29uZHMgZGVwZW5kaW5nIG9uIGFjdGl2aXR5IElEICovCiAgICB1aW50MTYgbWF4U2VydmljZTsgICAgICAgLyogMC02NTUzNSwgVGhlIG1heGltdW0gc2VydmljZSBhbGxvd2VkIGVpdGhlciBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgb3IgaW4gbWlsbGlzZWNvbmRzIGRlcGVuZGluZyBvbiBhY3Rpdml0eSBJRCAqLwp9IEFDWENvZXhBY3Rpdml0eUlFX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfQVJQX0lQX0ZJTFRFUiAKICAgIFR5cGU6ICAgRmlsdGVyaW5nIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiAyMAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QgIAp7ICAgIAogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgICAgaXBWZXJzaW9uOyAgICAgICAvKiBUaGUgSVAgdmVyc2lvbiBvZiB0aGUgSVAgYWRkcmVzczogNCAtIElQdjQsIDYgLSBJUHY2LiovCiAgICB1aW50OCAgICAgYXJwRmlsdGVyRW5hYmxlOyAvKiAxIC0gQVJQIGZpbHRlcmluZyBpcyBlbmFibGVkLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAtIEFSUCBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQuKi8KICAgIHVpbnQ4ICAgICBwYWRkaW5nWzJdOyAgICAgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCiAgICB1aW50OCAgICAgYWRkcmVzc1sxNl07ICAgICAvKiBUaGUgSVAgYWRkcmVzcyB1c2VkIHRvIGZpbHRlciBBUlAgcGFja2V0cy4gQVJQIHBhY2tldHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoYXQgZG8gbm90IG1hdGNoIHRoaXMgYWRkcmVzcyBhcmUgZHJvcHBlZC4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gdGhlIElQIFZlcnNpb24gaXMgNCwgdGhlIGxhc3QgMTIgYnl0ZXMgb2YgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhZGRyZXNzIGFyZSBpZ25vcmVkLiovCiAgICAKfSBBQ1hDb25maWd1cmVJUF90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgTmFtZTogICAgIEFDWF9JQlNTX0ZJTFRFUgogIFR5cGU6ICAgICBGaWx0ZXJpbmcgQ29uZmlndXJhdGlvbgogIEFjY2VzczogICBXcml0ZSBPbmx5CiAgTGVuZ3RoOiAgIDEKICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdCAgCnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDggICBlbmFibGU7IC8qIGlmIHNldCAoaS5lLiBJQlNTIG1vZGUpLCBmb3J3YXJkIGJlYWNvbnMgZnJvbSB0aGUgc2FtZSBTU0lEKi8KICAgICAgICAgICAgICAgICAgICAvKiAoYWxzbyBmcm9tIGRpZmZlcmVudCBCU1NJRCksIHdpdGggYmlnZ2VyIFRTRiB0aGVuIHRoZSB0aGlzIG9mICovCiAgICAgICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgQlNTLiovCiAgICB1aW50OCAgIHBhZGRpbmdbM107IC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCn0gQUNYSUJTU0ZpbHRlck9wdGlvbnNfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIE5hbWU6ICAgICBBQ1hfU0VSVklDRV9QRVJJT0RfVElNRU9VVAogIFR5cGU6ICAgICBDb25maWd1cmF0aW9uCiAgQWNjZXNzOiAgIFdyaXRlIE9ubHkKICBMZW5ndGg6ICAgMQogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0IAp7ICAgIAogICAgSU5GT19FTEVfSERSCiAgICB1aW50MTYgUHNQb2xsVGltZW91dDsgLyogdGhlIG1heGltdW0gdGltZSB0aGF0IHRoZSBkZXZpY2Ugd2lsbCB3YWl0IHRvIHJlY2VpdmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFmZmljIGZyb20gdGhlIEFQIGFmdGVyIHRyYW5zbWlzc2lvbiBvZiBQUy1wb2xsLiovCiAgICAKICAgIHVpbnQxNiBVcHNkVGltZW91dDsgICAvKiB0aGUgbWF4aW11bSB0aW1lIHRoYXQgdGhlIGRldmljZSB3aWxsIHdhaXQgdG8gcmVjZWl2ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYWZmaWMgZnJvbSB0aGUgQVAgYWZ0ZXIgdHJhbnNtaXNzaW9uIGZyb20gVVBTRCBlbmFibGVkKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWV1ZS4qLwp9IEFDWFJ4VGltZW91dF90OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1RYX1FVRVVFX0NGRwogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogOAogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgIHFJRDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgVFggcXVldWUgSUQgbnVtYmVyLiovCiAgICB1aW50OCAgIHBhZGRpbmdbM107ICAgICAgICAgICAgICAgICAvKiBhbGlnbm1lbnQgdG8gMzJiaXRzIGJvdW5kcnkgICAqLwogICAgdWludDE2ICBudW1iZXJPZkJsb2NrSGlnaFRocmVzaG9sZDsgLyogVGhlIG1heGltdW0gbWVtb3J5IGJsb2NrcyBhbGxvd2VkIGluIHRoZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVldWUuKi8KICAgIHVpbnQxNiAgbnVtYmVyT2ZCbG9ja0xvd1RocmVzaG9sZDsgIC8qIFRoZSBtaW5pbXVtIG1lbW9yeSBibG9ja3MgdGhhdCBhcmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGd1YXJhbnRlZWQgZm9yIHRoaXMgcXVldWUuKi8KfSBBQ1hUeFF1ZXVlQ2ZnX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1NUQVRJU1RJQ1MKICAgIFR5cGU6ICAgU3RhdGlzdGljcwogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IAogICAgTm90ZTogICBEZWJ1ZyBBUEkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIHVpbnQzMiAgZGVidWcxOwogICAgdWludDMyICBkZWJ1ZzI7CiAgICB1aW50MzIgIGRlYnVnMzsKICAgIHVpbnQzMiAgZGVidWc0OwogICAgdWludDMyICBkZWJ1ZzU7CiAgICB1aW50MzIgIGRlYnVnNjsKfURiZ1N0YXRpc3RpY3NfdDsKCnR5cGVkZWYgc3RydWN0IAp7CiAgICB1aW50MzIgIG51bU9mVHhQcm9jczsKICAgIHVpbnQzMiAgbnVtT2ZQcmVwYXJlZERlc2NzOwogICAgdWludDMyICBudW1PZlR4WGZyOwogICAgdWludDMyICBudW1PZlR4RG1hOyAgICAKICAgIHVpbnQzMiAgbnVtT2ZUeENtcGx0OwogICAgdWludDMyICBudW1PZlJ4UHJvY3M7CiAgICB1aW50MzIgIG51bU9mUnhEYXRhOwp9UmluZ1N0YXRpc3RpY3NfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIHVpbnQzMiBudW1PZlR4VGVtcGxhdGVQcmVwYXJlZDsKICAgIHVpbnQzMiBudW1PZlR4RGF0YVByZXBhcmVkOwogICAgdWludDMyIG51bU9mVHhUZW1wbGF0ZVByb2dyYW1tZWQ7CiAgICB1aW50MzIgbnVtT2ZUeERhdGFQcm9ncmFtbWVkOwogICAgdWludDMyIG51bU9mVHhCdXJzdFByb2dyYW1tZWQ7CiAgICB1aW50MzIgbnVtT2ZUeFN0YXJ0czsKICAgIHVpbnQzMiBudW1PZlR4SW1tUmVzcDsKICAgIHVpbnQzMiBudW1PZlR4U3RhcnRUZW1wYWx0ZXM7CiAgICB1aW50MzIgbnVtT2ZUeFN0YXJ0SW50VGVtcGxhdGU7CiAgICB1aW50MzIgbnVtT2ZUeFN0YXJ0RndHZW47CiAgICB1aW50MzIgbnVtT2ZUeFN0YXJ0RGF0YTsKICAgIHVpbnQzMiBudW1PZlR4U3RhcnROdWxsRnJhbWU7CiAgICB1aW50MzIgbnVtT2ZUeEV4Y2g7CiAgICB1aW50MzIgbnVtT2ZUeFJldHJ5VGVtcGxhdGU7CiAgICB1aW50MzIgbnVtT2ZUeFJldHJ5RGF0YTsKICAgIHVpbnQzMiBudW1PZlR4RXhjaFBlbmRpbmc7CiAgICB1aW50MzIgbnVtT2ZUeEV4Y2hFeHBpcnk7CiAgICB1aW50MzIgbnVtT2ZUeEV4Y2hNaXNtYXRjaDsKICAgIHVpbnQzMiBudW1PZlR4RG9uZVRlbXBsYXRlOwogICAgdWludDMyIG51bU9mVHhEb25lRGF0YTsKICAgIHVpbnQzMiBudW1PZlR4RG9uZUludFRlbXBsYXRlOwogICAgdWludDMyIG51bU9mVHhQcmVYZnI7CiAgICB1aW50MzIgbnVtT2ZUeFhmcjsKICAgIHVpbnQzMiBudW1PZlR4WGZyT3V0T2ZNZW07CiAgICB1aW50MzIgbnVtT2ZUeERtYVByb2dyYW1tZWQ7CiAgICB1aW50MzIgbnVtT2ZUeERtYURvbmU7Cn0gVHhTdGF0aXN0aWNzX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgdWludDMyIFJ4T3V0T2ZNZW07CiAgICB1aW50MzIgUnhIZHJPdmVyZmxvdzsKICAgIHVpbnQzMiBSeEhXU3R1Y2s7CiAgICB1aW50MzIgUnhEcm9wcGVkRnJhbWU7CiAgICB1aW50MzIgUnhDb21wbGV0ZURyb3BwZWRGcmFtZTsKICAgIHVpbnQzMiBSeEFsbG9jRnJhbWU7Cgl1aW50MzIgUnhEb25lUXVldWU7Cgl1aW50MzIgUnhEb25lOwoJdWludDMyIFJ4RGVmcmFnOwoJdWludDMyIFJ4RGVmcmFnRW5kOwoJdWludDMyIFJ4TWljOwoJdWludDMyIFJ4TWljRW5kOwoJdWludDMyIFJ4WGZyOwogICAgdWludDMyIFJ4WGZyRW5kOwogICAgdWludDMyIFJ4Q21wbHQ7CiAgICB1aW50MzIgUnhQcmVDbXBsdDsKICAgIHVpbnQzMiBSeENtcGx0VGFzazsKCXVpbnQzMiBSeFBoeUhkcjsKICAgIHVpbnQzMiBSeFRpbWVvdXQ7Cn0gUnhTdGF0aXN0aWNzX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgdWludDMyIFJ4RE1BRXJyb3JzOwogICAgdWludDMyIFR4RE1BRXJyb3JzOwp9IERNQVN0YXRpc3RpY3NfdDsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICB1aW50MzIgSVJRczsgICAgICAgICAgICAgIC8qIGlycWlzcigpICovCn0gSXNyU3RhdGlzdGljc190OwoKCnR5cGVkZWYgc3RydWN0IFdlcFN0YXRpc3RpY3NfdAp7CiAgICB1aW50MzIgV2VwQWRkcktleUNvdW50OyAgICAgIC8qIENvdW50IG9mIFdFUCBhZGRyZXNzIGtleXMgY29uZmlndXJlZCovCiAgICB1aW50MzIgV2VwRGVmYXVsdEtleUNvdW50OyAgIC8qIENvdW50IG9mIGRlZmF1bHQga2V5cyBjb25maWd1cmVkKi8KICAgIHVpbnQzMiBXZXBLZXlOb3RGb3VuZDsgICAgICAgLyogY291bnQgb2YgbnVtYmVyIG9mIHRpbWVzIHRoYXQgV0VQIGtleSBub3QgZm91bmQgb24gbG9va3VwKi8KICAgIHVpbnQzMiBXZXBEZWNyeXB0RmFpbDsgICAgICAgLyogY291bnQgb2YgbnVtYmVyIG9mIHRpbWVzIHRoYXQgV0VQIGtleSBkZWNyeXB0aW9uIGZhaWxlZCovCiAgICB1aW50MzIgV2VwRW5jcnlwdEZhaWw7ICAgICAgIC8qIGNvdW50IG9mIG51bWJlciBvZiB0aW1lcyB0aGF0IFdFUCBrZXkgZW5jcnlwdGlvbiBmYWlsZWQqLwogICAgdWludDMyIFdlcERlY1BhY2tldHM7ICAgICAgICAvKiBXRVAgUGFja2V0cyBEZWNyeXB0ZWQqLwogICAgdWludDMyIFdlcERlY0ludGVycnVwdDsgICAgICAvKiBXRVAgRGVjcnlwdCBJbnRlcnJ1cHRzKi8KICAgIHVpbnQzMiBXZXBFblBhY2tldHM7ICAgICAgICAgLyogV0VQIFBhY2tldHMgRW5jcnlwdGVkKi8KICAgIHVpbnQzMiBXZXBFbkludGVycnVwdDsgICAgICAgLyogV0VQIEVuY3J5cHQgSW50ZXJydXB0cyovCn0gV2VwU3RhdGlzdGljc190OwoKCiNkZWZpbmUgUFdSX1NUQVRfTUFYX0NPTlRfTUlTU0VEX0JDTlNfU1BSRUFEIDEwCnR5cGVkZWYgc3RydWN0IFB3clN0YXRpc3RpY3NfdAp7CiAgICB1aW50MzIgTWlzc2luZ0JjbnNDbnQ7ICAgICAgLyogQ291bnQgdGhlIGFtb3VudCBvZiBtaXNzaW5nIGJlYWNvbiBpbnRlcnJ1cHRzIHRvIHRoZSBob3N0LiovCiAgICB1aW50MzIgUmN2ZEJlYWNvbnNDbnQ7ICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiByZWNlaXZlZCBiZWFjb25zLiovCiAgICB1aW50MzIgQ29ubmVjdGlvbk91dE9mU3luYzsgICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIFRTRiBPdXQgT2YgU3luYyBvY2N1cmVzLCBtZWFuaW5nIHdlIGxvc3QgbW9yZSBjb25zZWN1dGl2ZSBiZWFjb25zIHRoYXQgZGVmaW5lZCBieSB0aGUgaG9zdCdzIHRocmVzaG9sZC4qLwogICAgdWludDMyIENvbnRNaXNzQmNuc1NwcmVhZFtQV1JfU1RBVF9NQVhfQ09OVF9NSVNTRURfQkNOU19TUFJFQURdOyAgLyogR2l2ZXMgc3RhdGlzdGljcyBhYm91dCB0aGUgc3ByZWFkIGNvbnRpbnVvdXMgbWlzc2VkIGJlYWNvbnMuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIDE2IExTQiBhcmUgZGVkaWNhdGVkIGZvciB0aGUgUFMgbW9kZS4qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgMTYgTVNCIGFyZSBkZWRpY2F0ZWQgZm9yIHRoZSBQUyBtb2RlLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRNaXNzQmNuc1NwcmVhZFswXSAtIHNpbmdsZSBtaXNzZWQgYmVhY29uLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRNaXNzQmNuc1NwcmVhZFsxXSAtIHR3byBjb250aW51b3VzIG1pc3NlZCBiZWFjb25zLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRNaXNzQmNuc1NwcmVhZFsyXSAtIHRocmVlIGNvbnRpbnVvdXMgbWlzc2VkIGJlYWNvbnMuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udE1pc3NCY25zU3ByZWFkWzldIC0gdGVuIGFuZCBtb3JlIGNvbnRpbnVvdXMgbWlzc2VkIGJlYWNvbnMuKi8KICAgIHVpbnQzMiBSY3ZkQXdha2VCZWFjb25zQ250OyAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJlYWNvbnMgaW4gYXdha2UgbW9kZS4qLwp9IFB3clN0YXRpc3RpY3NfdDsKCgp0eXBlZGVmIHN0cnVjdCBNaWNTdGF0aXN0aWNzX3QKewogICAgdWludDMyIE1pY1J4UGt0czsKICAgIHVpbnQzMiBNaWNDYWxjRmFpbHVyZTsKfSBNaWNTdGF0aXN0aWNzX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QgQWVzU3RhdGlzdGljc1N0cnVjdAp7CiAgICB1aW50MzIgQWVzRW5jcnlwdEZhaWw7CiAgICB1aW50MzIgQWVzRGVjcnlwdEZhaWw7CiAgICB1aW50MzIgQWVzRW5jcnlwdFBhY2tldHM7CiAgICB1aW50MzIgQWVzRGVjcnlwdFBhY2tldHM7CiAgICB1aW50MzIgQWVzRW5jcnlwdEludGVycnVwdDsKICAgIHVpbnQzMiBBZXNEZWNyeXB0SW50ZXJydXB0Owp9IEFlc1N0YXRpc3RpY3NfdDsKCnR5cGVkZWYgc3RydWN0IEdlbVN0YXRpc3RpY3NTdHJ1Y3QKewogICAgdWludDMyIEdlbUVuY3J5cHRGYWlsOwogICAgdWludDMyIEdlbURlY3J5cHRGYWlsOwogICAgdWludDMyIEdlbUVuY3J5cHRQYWNrZXRzOwogICAgdWludDMyIEdlbURlY3J5cHRQYWNrZXRzOwogICAgdWludDMyIEdlbUVuY3J5cHRJbnRlcnJ1cHQ7CiAgICB1aW50MzIgR2VtRGVjcnlwdEludGVycnVwdDsKfSBHZW1TdGF0aXN0aWNzX3Q7Cgp0eXBlZGVmIHN0cnVjdCBFdmVudFN0YXRpc3RpY3NfdAp7CiAgICB1aW50MzIgY2FsaWJyYXRpb247CiAgICB1aW50MzIgcnhNaXNtYXRjaDsKICAgIHVpbnQzMiByeE1lbUVtcHR5Owp9IEV2ZW50U3RhdGlzdGljc190OwoKCnR5cGVkZWYgc3RydWN0IFBzUG9sbFVwc2RTdGF0aXN0aWNzX3QKewogICAgdWludDMyIHBzUG9sbFRpbWVPdXRzOwogICAgdWludDMyIHVwc2RUaW1lT3V0czsKICAgIHVpbnQzMiB1cHNkTWF4QVB0dXJuOwogICAgdWludDMyIHBzUG9sbE1heEFQdHVybjsKICAgIHVpbnQzMiBwc1BvbGxVdGlsaXphdGlvbjsKICAgIHVpbnQzMiB1cHNkVXRpbGl6YXRpb247Cn0gUHNQb2xsVXBzZFN0YXRpc3RpY3NfdDsKCnR5cGVkZWYgc3RydWN0IFJ4RmlsdGVyU3RhdGlzdGljc190CnsKICAgIHVpbnQzMiBiZWFjb25GaWx0ZXI7CiAgICB1aW50MzIgYXJwRmlsdGVyOwogICAgdWludDMyIE1DRmlsdGVyOwogICAgdWludDMyIGR1cEZpbHRlcjsKICAgIHVpbnQzMiBkYXRhRmlsdGVyOwogICAgdWludDMyIGlic3NGaWx0ZXI7Cn0gUnhGaWx0ZXJTdGF0aXN0aWNzX3Q7Cgp0eXBlZGVmIHN0cnVjdCBDbGFpYnJhdGlvbkZhaWxTdGF0aXN0aWNzX3QKewoJdWludDMyIGluaXRDYWxUb3RhbDsKCXVpbnQzMiBpbml0UmFkaW9CYW5kc0ZhaWw7Cgl1aW50MzIgaW5pdFNldFBhcmFtczsKCXVpbnQzMiBpbml0VHhDbHBjRmFpbDsKCXVpbnQzMiBpbml0UnhJcU1tRmFpbDsKCXVpbnQzMiB0dW5lQ2FsVG90YWw7Cgl1aW50MzIgdHVuZURycHdSVHJpbUZhaWw7Cgl1aW50MzIgdHVuZURycHdQZEJ1ZkZhaWw7Cgl1aW50MzIgdHVuZURycHdUeE1peEZyZXFGYWlsOwoJdWludDMyIHR1bmVEcnB3VGFDYWw7Cgl1aW50MzIgdHVuZURycHdSeElmMkdhaW47Cgl1aW50MzIgdHVuZURycHdSeERhYzsKCXVpbnQzMiB0dW5lRHJwd0NoYW5UdW5lOwoJdWludDMyIHR1bmVEcnB3UnhUeExwZjsKCXVpbnQzMiB0dW5lRHJwd0xuYVRhbms7Cgl1aW50MzIgdHVuZVR4TE9MZWFrRmFpbDsKCXVpbnQzMiB0dW5lVHhJcU1tRmFpbDsKCXVpbnQzMiB0dW5lVHhQZGV0RmFpbDsKCXVpbnQzMiB0dW5lVHhQUEFGYWlsOwoJdWludDMyIHR1bmVUeENscGNGYWlsOwoJdWludDMyIHR1bmVSeEFuYURjRmFpbDsKCXVpbnQzMiB0dW5lUnhJcU1tRmFpbDsKCXVpbnQzMiBjYWxTdGF0ZUZhaWw7Cn1DbGFpYnJhdGlvbkZhaWxTdGF0aXN0aWNzX3Q7Cgp0eXBlZGVmIHN0cnVjdCBBQ1hTdGF0aXN0aWNzU3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgUmluZ1N0YXRpc3RpY3NfdCByaW5nU3RhdDsKICAgIERiZ1N0YXRpc3RpY3NfdCAgZGVidWc7CiAgICBUeFN0YXRpc3RpY3NfdCAgIHR4OwogICAgUnhTdGF0aXN0aWNzX3QgICByeDsKICAgIERNQVN0YXRpc3RpY3NfdCAgZG1hOwogICAgSXNyU3RhdGlzdGljc190ICBpc3I7CiAgICBXZXBTdGF0aXN0aWNzX3QgIHdlcDsKICAgIFB3clN0YXRpc3RpY3NfdCAgcHdyOwogICAgQWVzU3RhdGlzdGljc190ICBhZXM7CiAgICBNaWNTdGF0aXN0aWNzX3QgIG1pYzsKICAgIEV2ZW50U3RhdGlzdGljc190IGV2ZW50OwogICAgUHNQb2xsVXBzZFN0YXRpc3RpY3NfdCBwczsKICAgIFJ4RmlsdGVyU3RhdGlzdGljc190IHJ4RmlsdGVyOwoJQ2xhaWJyYXRpb25GYWlsU3RhdGlzdGljc190IHJhZGlvQ2FsOwogICAgR2VtU3RhdGlzdGljc190ICBnZW07Cn0gQUNYU3RhdGlzdGljc190OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1JPQU1JTkdfU1RBVElTVElDU19UQkwKICAgIERlc2M6ICAgVGhpcyBpbmZvcm1hdGlvbiBlbGVtZW50IHJlYWRzIHRoZSBjdXJyZW50IHJvYW1pbmcgdHJpZ2dlcnMgCiAgICAgICAgICAgIGNvdW50ZXJzL21ldHJpY3MuIAogICAgVHlwZTogICBTdGF0aXN0aWNzCiAgICBBY2Nlc3M6IFJlYWQgT25seQogICAgTGVuZ3RoOiA2CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0IAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQzMiBNaXNzZWRCZWFjb25zOyAvKiBUaGUgY3VycmVudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgbG9zdCBiZWFjb25zKi8KCXVpbnQ4ICBzbnJEYXRhOyAgICAgICAvKiBUaGUgY3VycmVudCBhdmVyYWdlIFNOUiBpbiBkYiAtIEZvciBEYXRhIFBhY2tldHMqLwoJdWludDggIHNuckJlYWNvbjsgICAgIC8qIFRoZSBjdXJyZW50IGF2ZXJhZ2UgU05SIGluIGRiIC0gRm9yIEJlYWNvbiBQYWNrZXRzKi8KICAgIGludDggICByc3NpRGF0YTsgICAgICAvKiBUaGUgY3VycmVudCBhdmVyYWdlIFJTU0kgIC0gRm9yIERhdGEgUGFja2V0cyovCiAgICBpbnQ4ICAgcnNzaUJlYWNvbjsgICAgLyogVGhlIGN1cnJlbnQgYXZlcmFnZSBSU1NJIC0gRm9yIEJlYWNvbiBQYWNrZXRzKi8KfUFDWFJvYW1pbmdTdGF0aXN0aWNzVGFibGVfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfRkVBVFVSRV9DRkcKICAgIERlc2M6ICAgUHJvdmlkZXMgZXhwYW5kYWJpbGl0eSBmb3IgZnV0dXJlIGZlYXR1cmVzCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiA4CiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogYml0IGRlZmluZXMgZm9yIE9wdGlvbjogKi8KI2RlZmluZSBGRUFUX1BDSV9DTEtfUlVOX0VOQUJMRSAgICAgMHgwMDAwMDAwMiAgLyogRW5hYmxlIENMS19SVU4gb24gUENJIGJ1cyAqLwoKLyogYml0IGRlZmluZXMgZm9yIGRhdGFmbG93T3B0aW9uczogKi8KI2RlZmluZSBERl9FTkNSWVBUSU9OX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMSAgLyogV2hlbiBzZXQsIGVuYWJsZSBlbmNyaXB0aW9uIGluIEZXLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gY2xlYXIsIGRpc2FibGUgZW5jcmlwdGlvbi4gKi8KI2RlZmluZSBERl9TTklGRl9NT0RFX0VOQUJMRSAgICAgICAgMHgwMDAwMDA4MCAgLyogV2hlbiBzZXQsIGVuYWJsZSBkZWNyeXB0aW9uIGluIEZXLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gY2xlYXIsIGRpc2FibGUgZGVjcmlwdGlvbi4gKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MzIgT3B0aW9uczsgICAgICAgICAvKiBEYXRhIGZsb3cgb3B0aW9ucyAtIHJlZmVyIHRvIGFib3ZlIGRlZmluaXRpb25zKi8KICAgIHVpbnQzMiBkYXRhZmxvd09wdGlvbnM7IC8qIERhdGEgZmxvdyBvcHRpb25zIC0gcmVmZXIgdG8gYWJvdmUgZGVmaW5pdGlvbnMqLwp9IEFDWEZlYXR1cmVDb25maWdfdDsKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1RJRF9DRkcKICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDE2CiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIGVudW0KewogICAgQ0hBTk5FTF9UWVBFX0RDRiA9IDAsICAgLyogREMvTEVHQUNZKi8KICAgIENIQU5ORUxfVFlQRV9FRENGID0gMSwgIC8qIEVEQ0EqLwogICAgQ0hBTk5FTF9UWVBFX0hDQ0EgPSAyLCAgLyogSENDQSovCiAgICBNQVhfQ0hBTk5FTF9UWVBFID0gQ0hBTk5FTF9UWVBFX0hDQ0EKfSBDaGFubmVsVHlwZV9lbnVtOwoKdHlwZWRlZiBlbnVtCnsKICAgIFBTX1NDSEVNRV9MRUdBQ1kgICAgICAgICA9IDAsIC8qIFJlZ3VsYXIgUFM6IHNpbXBsZSBzZW5kaW5nIG9mIHBhY2tldHMqLwogICAgUFNfU0NIRU1FX1VQU0RfVFJJR0dFUiAgID0gMSwgLyogVVBTRDogc2VuZGluZyBhIHBhY2tldCB0cmlnZ2VycyBhIFVQU0QgZG93bnN0cmVhbSovCiAgICBQU19TQ0hFTUVfTEVHQUNZX1BTUE9MTCAgPSAyLCAvKiBMZWdhY3kgUFNQT0xMOiBhIFBTUE9MTCBwYWNrZXQgd2lsbCBiZSBzZW50IGJlZm9yZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlcnkgZGF0YSBwYWNrZXQgdHJhbnNtaXNzaW9uIGluIHRoaXMgcXVldWUuKi8KICAgIFBTX1NDSEVNRV9TQVBTRCAgICAgICAgICA9IDMsIC8qIFNjaGVkdWxlZCBBUFNEIG1vZGUuKi8KICAgIE1BWF9QU19TQ0hFTUUgPSBQU19TQ0hFTUVfU0FQU0QKfSBQU1NjaGVtZV9lbnVtOwoKdHlwZWRlZiBlbnVtCnsKICAgIEFDS19QT0xJQ1lfTEVHQUNZID0gMCwgICAvKiBBQ0sgaW1tZWRpYXRlIHBvbGljeSovCiAgICBBQ0tfUE9MSUNZX05PX0FDSyA9IDEsICAgLyogbm8gQUNLIHBvbGljeSovCiAgICBBQ0tfUE9MSUNZX0JMT0NLICA9IDIsICAgLyogYmxvY2sgYWNrIHBvbGljeSovCiAgICBNQVhfQUNLX1BPTElDWSA9IEFDS19QT0xJQ1lfQkxPQ0sKfSBBY2tQb2xpY3lfZW51bTsKCgojaWZkZWYgSE9TVF9DT01QSUxFCnR5cGVkZWYgdWludDggQ2hhbm5lbFR5cGVfZTsKdHlwZWRlZiB1aW50OCBQU1NjaGVtZV9lOwp0eXBlZGVmIHVpbnQ4IEFja1BvbGljeV9lOwojZWxzZQp0eXBlZGVmIENoYW5uZWxUeXBlX2VudW0gQ2hhbm5lbFR5cGVfZTsKdHlwZWRlZiBQU1NjaGVtZV9lbnVtIFBTU2NoZW1lX2U7CnR5cGVkZWYgQWNrUG9saWN5X2VudW0gQWNrUG9saWN5X2U7CiNlbmRpZgoKCgovKiBNaWNoYWwgcmVjb21tZW5kYXRpb246CiAgIGluIHRoZSBBQ1hUSURDb25maWdfdCBzdHJ1Y3R1cmUgd2UgbmVlZCBvbmx5IHRoZSBmaWVsZHMgcHNTY2hlbWUsIGFuZCBvbmUgb3RoZXIgZmllbGQgZm9yIEFDIGlkIChxdWV1ZT8gdHNpZD8pLgogICB0aGUgcmVzdCBhcmUgb2Jzb2xldGUuIHNlZSBJRVBzRGVsaXZlcnlUcmlnZ2VyVHlwZV90IGluIENFMi4wLgogICAqLwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgIHF1ZXVlSUQ7ICAgICAgICAvKiBUaGUgVFggcXVldWUgSUQgbnVtYmVyICgwLTcpLiovCiAgICB1aW50OCAgIGNoYW5uZWxUeXBlOyAgICAvKiBDaGFubmVsIGFjY2VzcyB0eXBlIGZvciB0aGUgcXVldWUuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZmVyIHRvIENoYW5uZWxUeXBlX2VudW0uKi8KICAgIHVpbnQ4ICAgdHNpZDsgICAgICAgICAgIC8qIGZvciBFRENBIC0gdGhlIEFDIEluZGV4ICgwLTMsIHJlZmVyIHRvKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY2Vzc0NhdGVnb3J5X2VudW0pLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgSENDQSAtIEhDQ0EgVHJhZmZpYyBTdHJlYW0gSUQgKFRTSUQpIG9mICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgcXVldWUgKDgtMTUpLiovCiAgICBQU1NjaGVtZV9lICBwc1NjaGVtZTsgICAvKiBUaGUgcG93ZXIgc2F2ZSBzY2hlbWUgb2YgdGhlIHNwZWNpZmllZCBxdWV1ZS4qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVmZXIgdG8gUFNTY2hlbWVfZW51bS4qLwogICAgQWNrUG9saWN5X2UgYWNrUG9saWN5OyAgLyogVGhlIFRYIHF1ZXVlIEFDSyBwb2xpY3kuICovCiAgICB1aW50OCAgcGFkZGluZ1szXTsgICAgICAvKiBhbGlnbm1lbnQgdG8gMzJiaXRzIGJvdW5kcnkgICAqLwogICAgdWludDMyIEFQU0RDb25mWzJdOyAgICAgLyogTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gISEhKi8KfUFDWFRJRENvbmZpZ190OwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZToJQUNYX1BTX1JYX1NUUkVBTUlORwoJVHlwZToJQ29uZmlndXJhdGlvbgoJQWNjZXNzOglXcml0ZSBPbmx5CglMZW5ndGg6IDMyCgkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4IAlUSUQ7ICAgICAgICAgICAgLyogVGhlIFRJRCBpbmRleCovCiAgICBCb29sX2UgCXJ4UFNERW5hYmxlZDsgICAvKiBpbmRpY2F0ZXMgaWYgdGhpcyB0cmFmZmljIHN0cmVhbSByZXF1aXJlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wbG95aW5nIGFuIFJYIFN0cmVhbWluZyBkZWxpdmVyeSBtZWNoYW5pc20gZm9yIHRoZSBUSUQqLwoKICAgIHVpbnQ4ICAgc3RyZWFtUGVyaW9kOyAgIC8qIHRoZSB0aW1lIHBlcmlvZCBmb3Igd2hpY2ggYSB0cmlnZ2VyIG5lZWRzIHRvIGJlIHRyYW5zbWl0dGVkKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugbm8gZGF0YSBUWCB0cmlnZ2VycyBhcmUgc2VudCBieSBob3N0Ki8KICAgIHVpbnQ4ICAgdHhUaW1lb3V0OyAgICAgIC8qIHRoZSB0aW1lb3V0IGZyb20gbGFzdCBUWCB0cmlnZ2VyIGFmdGVyIHdoaWNoIEZXKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0cyBnZW5lcmF0aW5nIHRyaWdnZXJzIGJ5IGl0c2VsZiovCn1BQ1hQc1J4U3RyZWFtaW5nX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICAgICBNVUxUSVBMRSBSU1NJIEFORCBTTlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgZW51bQp7CiAgICBSWF9RVUFMSVRZX0VWRU5UX0xFVkVMID0gMCwgIC8qIFRoZSBldmVudCBpcyBhICJMZXZlbCIgaW5kaWNhdGlvbiB3aGljaCBrZWVwcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlcmluZyBhcyBsb25nIGFzIHRoZSBhdmVyYWdlIFJTU0kgaXMgYmVsb3cqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHRocmVzaG9sZC4qLwoKCVJYX1FVQUxJVFlfRVZFTlRfRURHRSA9IDEgICAgLyogVGhlIGV2ZW50IGlzIGFuICJFZGdlIiBpbmRpY2F0aW9uIHdoaWNoIHRyaWdnZXJzKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgd2hlbiB0aGUgUlNTSSB0aHJlc2hvbGQgaXMgY3Jvc3NlZCBmcm9tIGFib3ZlLiovCn1yeFF1YWxpdHlFdmVudFR5cGVfZW51bTsKCi8qIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHRyaWdnZXIgaXMgYWN0aXZlICovCnR5cGVkZWYgZW51bQp7CiAgICBSU1NJX0VWRU5UX0RJUl9MT1cgPSAwLAogICAgUlNTSV9FVkVOVF9ESVJfSElHSCA9IDEsCiAgICBSU1NJX0VWRU5UX0RJUl9CSURJUiA9IDIKfVJzc2lFdmVudERpcl9lOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIFJTU0kvU05SIHRyaWdnZXIgY29uZmlndXJhdGlvbjoKCiAgICBBQ1hfUlNTSV9TTlJfVFJJR0dFUgogICAgQUNYX1JTU0lfU05SX1dJR0hUUwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIE5VTV9PRl9SU1NJX1NOUl9UUklHR0VSUyA4CnR5cGVkZWYgc3RydWN0CnsKICAgIGludDE2ICB0aHJlc2hvbGQ7CiAgICB1aW50MTYgcGFjaW5nOyAvKiBNaW5pbXVtIGRlbGF5IGJldHdlZW4gY29uc2VjdXRpdmUgdHJpZ2dlcnMgaW4gbWlsbGlzZWNvbmRzICgwIC0gNjAwMDApICovCiAgICB1aW50OCAgbWV0cmljOyAvKiBSU1NJIEJlYWNvbiwgUlNTSSBQYWNrZXQsIFNOUiBCZWFjb24sIFNOUiBQYWNrZXQgKi8KICAgIHVpbnQ4ICB0eXBlOyAgIC8qIExldmVsIC8gRWRnZSAqLwogICAgdWludDggIGRpcmVjdGlvbjsgLyogTG93LCBIaWdoLCBCaWRpcmVjdGlvbmFsICovCiAgICB1aW50OCAgaHlzdGVyc2lzOyAvKiBIeXN0ZXJlc2lzIHJhbmdlIGluIGRCIGFyb3VuZCB0aGUgdGhyZXNob2xkIHZhbHVlICgwIC0gMjU1KSAqLwogICAgdWludDggIGluZGV4OyAvKiBJbmRleCBvZiBFdmVudC4gVmFsdWVzIDAgLSA3ICovCiAgICB1aW50OCAgZW5hYmxlOyAvKiAxIC0gQ29uZmlndXJlZCwgMiAtIE5vdCBDb25maWd1cmVkOyAgKGZvciByZWNvdmVyeSB1c2luZykgKi8KICAgIHVpbnQ4ICBwYWRkaW5nWzJdOwp9UnNzaVNuclRyaWdnZXJDZmdfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgUnNzaVNuclRyaWdnZXJDZmdfdCBwYXJhbTsKfUFDWFJzc2lTbnJUcmlnZ2VyQ2ZnX3Q7CgovKiBGaWx0ZXIgV2VpZ2h0IGZvciBldmVyeSBvbmUgb2YgNCBSU1NJIC9TTlIgVHJpZ2dlciBNZXRyaWNzICAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICB1aW50OCByc3NpQmVhY29uQXZlcmFnZVdlaWdodDsKICAgIHVpbnQ4IHJzc2lQYWNrZXRBdmVyYWdlV2VpZ2h0OwogICAgdWludDggc25yQmVhY29uQXZlcmFnZVdlaWdodDsKICAgIHVpbnQ4IHNuclBhY2tldEF2ZXJhZ2VXZWlnaHQ7Cn1Sc3NpU25yQXZlcmFnZVdlaWdodHNfdDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgUnNzaVNuckF2ZXJhZ2VXZWlnaHRzX3QgcGFyYW07Cn1BQ1hSc3NpU25yQXZlcmFnZVdlaWdodHNfdDsKCnR5cGVkZWYgZW51bQp7CiAgICBNRVRSSUNfRVZFTlRfUlNTSV9CRUFDT04gPSAwLAogICAgTUVUUklDX0VWRU5UX1JTU0lfREFUQSAgID0gMSwKICAgIE1FVFJJQ19FVkVOVF9TTlJfQkVBQ09OICA9IDIsCiAgICBNRVRSSUNfRVZFTlRfU05SX0RBVEEgICAgID0gMywgCglNRVRSSUNfRVZFTlRfVFJJR0dFUl9TSVpFID0gNAp9TWV0cmljRXZlbnRfZTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9OT0lTRV9ISVNUCiAgICBEZXNjOiAgIE5vaXNlIEhpc3RvZ3JhbSBhY3RpdmF0aW9uIGlzIGRvbmUgYnkgc3BlY2lhbCBjb21tYW5kIGZyb20gaG9zdCB3aGljaAogICAgICAgICAgICBpcyByZXNwb25zaWJsZSB0byByZWFkIHRoZSByZXN1bHRzIHVzaW5nIHRoaXMgSUUuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogUmVhZCBPbmx5CiAgICBMZW5ndGg6IDQ4IChOT0lTRV9ISVNUX0xFTj04KQogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIGNvdW50ZXJzW05PSVNFX0hJU1RfTEVOXTsgLyogVGhpcyBhcnJheSBvZiBlaWdodCAzMiBiaXQgY291bnRlcnMgZGVzY3JpYmVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgaGlzdG9ncmFtIGNyZWF0ZWQgYnkgdGhlIEZXIG5vaXNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaXN0b2dyYW0gZW5naW5lLiovCgogICAgdWludDMyIG51bU9mTG9zdEN5Y2xlczsgICAgICAgICAgLyogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBtZWFzdXJlbWVudCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3ljbGVzIHdpdGggZmFpbHVyZSBiZWNhdXNlIFR4IHdhcyBhY3RpdmUuKi8KCiAgICB1aW50MzIgbnVtT2ZUeEh3R2VuTG9zdEN5Y2xlczsgICAvKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1lYXN1cmVtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeWNsZXMgd2l0aCBmYWlsdXJlIGJlY2F1c2UgVHggKEZXIEdlbmVyYXRlZCkqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FzIGFjdGl2ZS4qLwoKICAgIHVpbnQzMiBudW1PZlJ4TG9zdEN5Y2xlczsgICAgICAgIC8qIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbWVhc3VyZW1lbnQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlcyBiZWNhdXNlIHRoZSBSeCBDQ0Egd2FzIGFjdGl2ZS4gKi8KfSBOb2lzZUhpc3RSZXN1bHRfdDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9QRF9USFJFU0hPTEQKICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIHBkVGhyZXNob2xkOyAvKiBUaGUgcGFja2V0IGRldGVjdGlvbiB0aHJlc2hvbGQgaW4gdGhlIFBIWS4qLwp9IEFDWFBhY2tldERldGVjdGlvbl90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfUkFURV9QT0xJQ1kKCVR5cGU6CUNvbmZpZ3VyYXRpb24KCUFjY2VzczoJV3JpdGUgT25seQoJTGVuZ3RoOiAxMzIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgSE9TVF9NQVhfUkFURV9QT0xJQ0lFUyAgICAgICAoOCkKCgp0eXBlZGVmIHN0cnVjdCAKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MzIgICAgICAgIG51bU9mQ2xhc3NlczsgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgdHJhbnNtaXNzaW9uIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbGJhY2sgcG9saWN5IGNsYXNzZXMuKi8KCiAgICB0eEF0dHJDbGFzc190IHJhdGVDbGFzc2VzW0hPU1RfTUFYX1JBVEVfUE9MSUNJRVNdOyAgLyogUmF0ZSBQb2xpY2llcyB0YWJsZSovCn1BQ1hUeEF0dHJDbGFzc2VzX3Q7CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9DVFNfUFJPVEVDVElPTgogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMQogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0IAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4ICAgY3RzUHJvdGVjdE1vZGU7IC8qIFRoaXMgZmllbGQgaXMgYSBmbGFnIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENUUy10by1zZWxmIHByb3RlY3Rpb24gbWVjaGFuaXNtOiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAtIGRpc2FibGUsIDEgLSBlbmFibGUqLwogICAgdWludDggIHBhZGRpbmdbM107ICAgICAgICAgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCn1BQ1hDdHNQcm90ZWN0aW9uX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgQUNYX0ZSQUdfQ0ZHCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQxNiAgZnJhZ1RocmVzaG9sZDsKICAgIHVpbnQ4ICAgcGFkZGluZ1syXTsgICAgICAgICAgLyogYWxpZ25tZW50IHRvSUVfUlRTX0NUU19DRkcgMzJiaXRzIGJvdW5kcnkgICAqLwogICAKfSBBQ1hGUkFHVGhyZXNob2xkX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIEFDWF9SWF9DT05GSUdfT1BUCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgZW51bSAgCnsKICAgIFJYX1FVRVVFX1RZUEVfUlhfTE9XX1BSSU9SSVRZLCAgICAvKiBBbGwgZXhjZXB0IHRoZSBoaWdoIHByaW9yaXR5ICovCiAgICBSWF9RVUVVRV9UWVBFX1JYX0hJR0hfUFJJT1JJVFksICAgLyogTWFuYWdlbWVudCBhbmQgdm9pY2UgcGFja2V0cyAqLwogICAgUlhfUVVFVUVfVFlQRV9OVU0sCiAgICBSWF9RVUVVRV9UWVBFX01BWCA9IE1BWF9QT1NJVElWRTgKfSBSeFF1ZXVlVHlwZV9lbnVtOwoKCiNpZmRlZiBIT1NUX0NPTVBJTEUKICAgIHR5cGVkZWYgdWludDggUnhRdWV1ZVR5cGVfZTsKI2Vsc2UKICAgIHR5cGVkZWYgUnhRdWV1ZVR5cGVfZW51bSBSeFF1ZXVlVHlwZV9lOwojZW5kaWYKCgp0eXBlZGVmIHN0cnVjdCAKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MTYgICAgICAgICByeE1ibGtUaHJlc2hvbGQ7ICAgLyogT2NjdXBpZWQgUnggbWVtLWJsb2NrcyBudW1iZXIgd2hpY2ggcmVxdWlyZXMgaW50ZXJydXB0aW5nIHRoZSBob3N0ICgwID0gbm8gYnVmZmVyaW5nKSAqLwogICAgdWludDE2ICAgICAgICAgcnhQa3RUaHJlc2hvbGQ7ICAgIC8qIFJ4IHBhY2tldHMgbnVtYmVyIHdoaWNoIHJlcXVpcmVzIGludGVycnVwdGluZyB0aGUgaG9zdCAgKDAgPSBubyBidWZmZXJpbmcpICovIAogICAgdWludDE2ICAgICAgICAgcnhDb21wbGV0ZVRpbWVvdXQ7IC8qIE1heCB0aW1lIGluIG1zZWMgdGhlIEZXIG1heSBkZWxheSBSeC1Db21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgIFJ4UXVldWVUeXBlX2UgIHJ4UXVldWVUeXBlOyAgICAgICAvKiBzZWUgYWJvdmUgKi8gICAKICAgIHVpbnQ4ICAgICAgICAgIHJlc2VydmVkOwp9IEFDWFJ4QnVmZmVyaW5nQ29uZmlnX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1NMRUVQX0FVVEgKICAgIERlc2M6ICAgY29uZmlndXJhdGlvbiBvZiBzbGVlcCBhdXRob3JpemF0aW9uIGxldmVsCiAgICBUeXBlOiAgIFN5c3RlbSBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDggICBzbGVlcEF1dGg7IC8qIFRoZSBzbGVlcCBsZXZlbCBhdXRob3JpemF0aW9uIG9mIHRoZSBkZXZpY2UuICovCiAgICAgICAgICAgICAgICAgICAgICAgLyogMCAtIEFsd2F5cyBhY3RpdmUqLwogICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLSBQb3dlciBkb3duIG1vZGU6IGxpZ2h0IC8gZmFzdCBzbGVlcCovCiAgICAgICAgICAgICAgICAgICAgICAgLyogMiAtIEVMUCBtb2RlOiBEZWVwIC8gTWF4IHNsZWVwKi8KICAgICAgICAKICAgIHVpbnQ4ICBwYWRkaW5nWzNdOyAvKiBhbGlnbm1lbnQgdG8gMzJiaXRzIGJvdW5kcnkgICAqLwp9QUNYU2xlZXBBdXRoX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZToJQUNYX1BNX0NPTkZJRwoJRGVzYzogICBjb25maWd1cmF0aW9uIG9mIHBvd2VyIG1hbmFnZW1lbnQKCVR5cGU6CVN5c3RlbSBDb25maWd1cmF0aW9uCglBY2Nlc3M6CVdyaXRlIE9ubHkKCUxlbmd0aDogMQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIElORk9fRUxFX0hEUgoJdWludDMyCWhvc3RDbGtTZXR0bGluZ1RpbWU7CS8qIEhvc3QgQ0xLIHNldHRsaW5nIHRpbWUgKGluIHVTZWMgdW5pdHMpICovCgl1aW50OAlob3N0RmFzdFdha2V1cFN1cHBvcnQ7CS8qIDAgLSBub3Qgc3VwcG9ydGVkICovCgkJCQkJCQkJCS8qIDEgLSBzdXBwb3J0ZWQgKi8KICAgIHVpbnQ4ICBwYWRkaW5nWzNdOyAJCQkJLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KfUFDWFBNQ29uZmlnX3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfUFJFQU1CTEVfVFlQRQogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMQogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgZW51bQp7CglMT05HX1BSRUFNQkxFCQkJPSAwLAoJU0hPUlRfUFJFQU1CTEUJCQk9IDEsCglPRkRNX1BSRUFNQkxFCQkJPSA0LAoJTl9NSVhFRF9NT0RFX1BSRUFNQkxFCT0gNiwKCUdSRUVORklFTERfUFJFQU1CTEUJCT0gNywKCVBSRUFNQkxFX0lOVkFMSUQJCT0gMHhGRgp9IFByZWFtYmxlX2VudW07CgoKI2lmZGVmIEhPU1RfQ09NUElMRQp0eXBlZGVmIHVpbnQ4IFByZWFtYmxlX2U7CiNlbHNlCnR5cGVkZWYgUHJlYW1ibGVfZW51bSBQcmVhbWJsZV9lOwojZW5kaWYKCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIFByZWFtYmxlX2UgcHJlYW1ibGU7IC8qIFdoZW4gc2V0LCB0aGUgV2lMaW5rIHRyYW5zbWl0cyBiZWFjb24sIHByb2JlIHJlc3BvbnNlLCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogUlRTIGFuZCBQUyBQb2xsIGZyYW1lcyB3aXRoIGEgc2hvcnQgcHJlYW1ibGUuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIGNsZWFyLCB0aGUgV2lMaW5rIHRyYW5zbWl0cyB0aGUgZnJhbWUgd2l0aCBhIGxvbmcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWFtYmxlLiovCiAgICB1aW50OCAgcGFkZGluZ1szXTsgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCn0gQUNYUHJlYW1ibGVfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfQ0NBX1RIUkVTSE9MRAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMgogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDE2IHJ4Q0NBVGhyZXNob2xkOyAvKiBUaGUgUnggQ2xlYXIgQ2hhbm5lbCBBc3Nlc3NtZW50IHRocmVzaG9sZCBpbiB0aGUgUEhZKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHRoZSBlbmVyZ3kgdGhyZXNob2xkKS4qLwogICAgQm9vbF9lIHR4RW5lcmd5RGV0ZWN0aW9uOyAgLyogVGhlIFR4IEVEIHZhbHVlIGZvciBURUxFQyBFbmFibGUvRGlzYWJsZSovCiAgICB1aW50OCAgcGFkZGluZzsKfSBBQ1hFbmVyZ3lEZXRlY3Rpb25fdDsKICAgICAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfRVZFTlRfTUJPWF9NQVNLCiAgICBUeXBlOiAgIE9wZXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDgKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQzMiBsb3dFdmVudE1hc2s7ICAgLyogSW5kaWNhdGVzIHdoaWNoIGV2ZW50cyBhcmUgbWFza2VkIGFuZCB3aGljaCBhcmUgbm90Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVmZXIgdG8gRXZlbnRNQm94SWRfZW51bSBpbiBwdWJsaWNfZXZlbnRfbWJveC5oLiovCiAgICAKICAgIHVpbnQzMiBoaWdoRXZlbnRNYXNrOyAgLyogTm90IGluIHVzZSAoc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMHhGRkZGRkZGRikuKi8KfSBBQ1hFdmVudE1ib3hNYXNrX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0NPTk5fTU9OSVRfUEFSQU1TCiAgICBEZXNjOiAgIFRoaXMgaW5mb3JtYXRpb24gZWxlbWVudCBjb25maWd1cmVzIHRoZSBTWU5DSFJPTklaQVRJT05fVElNRU9VVCAKICAgICAgICAgICAgaW50ZXJydXB0IGluZGljYXRvci4gSXQgY29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIG1pc3NlZCBCZWFjb25zIAogICAgICAgICAgICBiZWZvcmUgaXNzdWluZyB0aGUgU1lOQ0hST05JWkFUSU9OX1RJTUVPVVQgZXZlbnQuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiA4CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQzMiBUU0ZNaXNzZWRUaHJlc2hvbGQ7IC8qIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmVhY29ucyB0aGF0IGNhbiBiZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9zdCBiZWZvcmUgdGhlIFdpTGluayByYWlzZXMgdGhlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTWU5DSFJPTklaQVRJT05fVElNRU9VVCBldmVudC4qLwoKICAgIHVpbnQzMiBCU1NMb3NzVGltZW91dDsgICAgIC8qIFRoZSBkZWxheSAoaW4gdGltZSB1bml0cykgYmV0d2VlbiB0aGUgdGltZSBhdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggdGhlIGRldmljZSBpc3N1ZXMgdGhlIFNZTkNIUk9OSVpBVElPTl9USU1FT1VUKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50IHVudGlsLCBpZiBubyBwcm9iZSByZXNwb25zZSBvciBiZWFjb24gaXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmVkIGEgQlNTX0xPU1MgZXZlbnQgaXMgaXNzdWVkLiovCn0gQWN4Q29ubmVjdGlvbk1vbml0b3JPcHRpb25zOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0NPTlNfVFhfRkFJTFVSRQogICAgRGVzYzogICBUaGlzIGluZm9ybWF0aW9uIGVsZW1lbnQgY29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pc3Npb24KICAgICAgICAgICAgZmFpbHVyZXMgYmVmb3JlIGlzc3VpbmcgdGhlICJNYXggVHggUmV0cnkiIGV2ZW50LiBUaGUgY291bnRlciBpcyAKICAgICAgICAgICAgaW5jcmVtZW50ZWQgb25seSBmb3IgdW5pY2FzdCBmcmFtZXMgb3IgZnJhbWVzIHRoYXQgcmVxdWlyZSBBY2sgCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiAxCiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCBtYXhUeFJldHJ5OyAvKiB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pc3Npb24gZmFpbHVyZXMgYmVmb3JlICovCiAgICAgICAgICAgICAgICAgICAgICAvKiBpc3N1aW5nIHRoZSAiTWF4IFR4IFJldHJ5IiBldmVudCovCiAgICB1aW50OCAgcGFkZGluZ1szXTsgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCn0gQUNYQ29uc1R4RmFpbHVyZVRyaWdnZXJQYXJhbWV0ZXJzX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX0JDTl9EVElNX09QVElPTlMKICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDUKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCAKeyAgICAKICAgIElORk9fRUxFX0hEUgogICAgdWludDE2IGJlYWNvblJ4VGltZU91dDsKICAgIHVpbnQxNiBicm9hZGNhc3RUaW1lT3V0OwogICAgdWludDggIHJ4QnJvYWRjYXN0SW5QUzsgIC8qIGlmIHNldCwgZW5hYmxlcyByZWNlaXZlIG9mIGJyb2FkY2FzdCBwYWNrZXRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gUG93ZXItU2F2ZSBtb2RlLiovCiAgICB1aW50OCAgY29uc2VjdXRpdmVQc1BvbGxEZWxpdmVyeUZhaWx1cmVUaHI7ICAgICAgICAgLyogQ29uc2VjdXRpdmUgUFMgUG9sbCBGYWlsIGJlZm9yZSB1cGRhdGluZyB0aGUgRHJpdmVyICovCiAgICB1aW50OCAgcGFkZGluZ1syXTsgICAgICAgLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KfSBBQ1hCZWFjb25BbmRCcm9hZGNhc3RPcHRpb25zX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1NHX0VOQUJMRQogICAgRGVzYzogICBUaGlzIGNvbW1hbmQgaW5zdHJ1Y3RzIHRoZSBXaUxpbmsgdG8gc2V0IHRoZSBTb2Z0IEdlbWluaSAoQlQgY28tZXhpc3RlbmNlKQogICAgICAgICAgICBzdGF0ZSB0byBlaXRoZXIgZW5hYmxlL2Rpc2FibGUgb3Igc2Vuc2UgbW9kZS4gCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiAxCiAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKCXVpbnQ4CWNvZXhPcGVyYXRpb25Nb2RlOyAvKiAwLSBDby1leCBvcGVyYXRpb24gaXMgRGlzYWJsZWQKCQkJCQkJCQkgIDEtIENvLWV4IG9wZXJhdGlvbiBpcyBjb25maWd1cmVkIHRvIFByb3RlY3RpdmUgbW9kZQoJCQkJCQkJCSAgMi0gQ28tZXggb3BlcmF0aW9uIGlzIGNvbmZpZ3VyZWQgdG8gT3Bwb3J0dW5pc3RpYyBtb2RlIAoJCQkgICAgICAgICAgICAgICAgICAgICAgCgkJCQkJCQkJICBEZWZhdWx0IFZhbHVlOiAwLSBDby1leCBvcGVyYXRpb24gaXMgRGlzYWJsZWQKCQkJCQkJCQkqLwoKICAgIHVpbnQ4ICBwYWRkaW5nWzNdOyAgLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KCn0gQUNYQmx1ZXRvb3RoV2xhbkNvRW5hYmxlU3RydWN0OwoKCgovKiogXHN0cnVjdCBUU29mdEdlbWluaVBhcmFtcwogKiBcYnJpZWYgU29mdCBHZW1pbmkgUGFyYW1ldGVycwogKgogKiBccGFyIERlc2NyaXB0aW9uCiAqIFVzZWQgZm9yIFNldHRpbmcvUHJpbnRpbmcgU29mdCBHZW1pbmkgUGFyYW1ldGVycwogKgogKiBcc2EKICovCgp0eXBlZGVmIGVudW0KewoJU09GVF9HRU1JTklfQlRfUEVSX1RIUkVTSE9MRCA9IDAsCglTT0ZUX0dFTUlOSV9BVVRPX1NDQU5fQ09NUEVOU0FUSU9OX01BWF9USU1FLAoJU09GVF9HRU1JTklfQlRfTkZTX1NBTVBMRV9JTlRFUlZBTCwKCVNPRlRfR0VNSU5JX0JUX0xPQURfUkFUSU8sCglTT0ZUX0dFTUlOSV9BVVRPX1BTX01PREUsCglTT0ZUX0dFTUlOSV9BVVRPX1NDQU5fUFJPQkVfUkVRLAoJU09GVF9HRU1JTklfQVVUT19TQ0FOX1dJTkRPVywKCVNPRlRfR0VNSU5JX0FOVEVOTkFfQ09ORklHVVJBVElPTiwKCVNPRlRfR0VNSU5JX0JFQUNPTl9NSVNTX1BFUkNFTlQsCglTT0ZUX0dFTUlOSV9SQVRFX0FEQVBUX1RIUkVTSCwKCVNPRlRfR0VNSU5JX1JBVEVfQURBUFRfU05SLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19CVF9BQ0xfTUFTVEVSX01JTl9CUiwKICAgIFNPRlRfR0VNSU5JX1dMQU5fUFNfQlRfQUNMX01BU1RFUl9NQVhfQlIsCiAgICBTT0ZUX0dFTUlOSV9XTEFOX1BTX01BWF9CVF9BQ0xfTUFTVEVSX0JSLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19CVF9BQ0xfU0xBVkVfTUlOX0JSLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19CVF9BQ0xfU0xBVkVfTUFYX0JSLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19NQVhfQlRfQUNMX1NMQVZFX0JSLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19CVF9BQ0xfTUFTVEVSX01JTl9FRFIsCglTT0ZUX0dFTUlOSV9XTEFOX1BTX0JUX0FDTF9NQVNURVJfTUFYX0VEUiwKCVNPRlRfR0VNSU5JX1dMQU5fUFNfTUFYX0JUX0FDTF9NQVNURVJfRURSLAogICAgU09GVF9HRU1JTklfV0xBTl9QU19CVF9BQ0xfU0xBVkVfTUlOX0VEUiwKCVNPRlRfR0VNSU5JX1dMQU5fUFNfQlRfQUNMX1NMQVZFX01BWF9FRFIsCglTT0ZUX0dFTUlOSV9XTEFOX1BTX01BWF9CVF9BQ0xfU0xBVkVfRURSLAogICAgU09GVF9HRU1JTklfUlhULAoJU09GVF9HRU1JTklfVFhULAoJU09GVF9HRU1JTklfQURBUFRJVkVfUlhUX1RYVCwKCVNPRlRfR0VNSU5JX1BTX1BPTExfVElNRU9VVCwKCVNPRlRfR0VNSU5JX1VQU0RfVElNRU9VVCwKCVNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX0JUX0FDTF9NQVNURVJfTUlOX0VEUiwKCVNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX0JUX0FDTF9NQVNURVJfTUFYX0VEUiwKCVNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX01BWF9CVF9BQ0xfTUFTVEVSX0VEUiwKICAgIFNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX0JUX0FDTF9TTEFWRV9NSU5fRURSLAoJU09GVF9HRU1JTklfV0xBTl9BQ1RJVkVfQlRfQUNMX1NMQVZFX01BWF9FRFIsCglTT0ZUX0dFTUlOSV9XTEFOX0FDVElWRV9NQVhfQlRfQUNMX1NMQVZFX0VEUiwKICAgIFNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX0JUX0FDTF9TTEFWRV9NSU5fQlIsICAgCiAgICBTT0ZUX0dFTUlOSV9XTEFOX0FDVElWRV9CVF9BQ0xfU0xBVkVfTUFYX0JSLCAKICAgIFNPRlRfR0VNSU5JX1dMQU5fQUNUSVZFX01BWF9CVF9BQ0xfU0xBVkVfQlIsIAogICAgU09GVF9HRU1JTklfVEVNUF9QQVJBTV8xLAoJU09GVF9HRU1JTklfVEVNUF9QQVJBTV8yLAoJU09GVF9HRU1JTklfVEVNUF9QQVJBTV8zLAoJU09GVF9HRU1JTklfVEVNUF9QQVJBTV80LAoJU09GVF9HRU1JTklfVEVNUF9QQVJBTV81LAoJU09GVF9HRU1JTklfUEFSQU1TX01BWAp9IHNvZnRHZW1pbmlQYXJhbXM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgdWludDMyICAgY29leFBhcmFtc1tTT0ZUX0dFTUlOSV9QQVJBTVNfTUFYXTsKICB1aW50OCAgICBwYXJhbUlkeDsgICAgICAgLyogdGhlIHBhcmFtIGluZGV4IHdoaWNoIHRoZSBGVyBzaG91bGQgdXBkYXRlLCBpZiBpdCBlcXVhbHMgdG8gMHhGRiAtIHVwZGF0ZSBhbGwgKi8gCiAgdWludDggICAgICAgcGFkZGluZ1szXTsKfSBUU29mdEdlbWluaVBhcmFtczsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBBQ1hfU0dfQ0ZHCiAgICBEZXNjOiAgIFRoaXMgY29tbWFuZCBpbnN0cnVjdHMgdGhlIFdpTGluayB0byBzZXQgdGhlIFNvZnQgR2VtaW5pIChCVCBjby1leGlzdGVuY2UpIAogICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIHRoZSBkZXNpcmVkIHZhbHVlcy4gCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KCUFjY2VzczoJV3JpdGUgKFJlYWQgRm9yIEdXU0kgLSBkaXNhYmxlIGZvciBub3cpCiAgICBMZW5ndGg6IDEKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0Cgp7CiAgICBJTkZPX0VMRV9IRFIKCQoJVFNvZnRHZW1pbmlQYXJhbXMgc29mdEdlbWluaVBhcmFtczsKfSBBQ1hCbHVldG9vdGhXbGFuQ29QYXJhbXNTdHJ1Y3Q7CiAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIEFDWF9GTV9DT0VYX0NGRwogICAgRGVzYzogICBUaGlzIGNvbW1hbmQgaW5zdHJ1Y3RzIHRoZSBXaUxpbmsgdG8gc2V0IHRoZSBGTSBjby1leGlzdGVuY2UKICAgICAgICAgICAgcGFyYW1ldGVycyB0byB0aGUgZGVzaXJlZCB2YWx1ZXMuIAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCglBY2Nlc3M6CVdyaXRlCiAgICBMZW5ndGg6IAogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QKCnsKICAgIElORk9fRUxFX0hEUgoJCiAgICB1aW50OCAgIGVuYWJsZTsgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUoMSkgLyBkaXNhYmxlKDApIHRoZSBGTSBDb2V4IGZlYXR1cmUgKi8KCiAgICB1aW50OCAgIHN3YWxsb3dQZXJpb2Q7ICAgICAgICAgICAgICAvKiBTd2FsbG93IHBlcmlvZCB1c2VkIGluIENPRVggUExMIHN3YWxsb3dpbmcgbWVjaGFuaXNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2U6IDAtMHhGRiwgIDB4RkYgPSB1c2UgRlcgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICB1aW50OCAgIG5EaXZpZGVyRnJlZlNldDE7ICAgICAgICAgICAvKiBUaGUgTiBkaXZpZGVyIHVzZWQgaW4gQ09FWCBQTEwgc3dhbGxvd2luZyBtZWNoYW5pc20gZm9yIEZyZWYgb2YgMzguNC8xOS4yIE1oei4gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2U6IDAtMHhGRiwgIDB4RkYgPSB1c2UgRlcgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICB1aW50OCAgIG5EaXZpZGVyRnJlZlNldDI7ICAgICAgICAgICAvKiBUaGUgTiBkaXZpZGVyIHVzZWQgaW4gQ09FWCBQTEwgc3dhbGxvd2luZyBtZWNoYW5pc20gZm9yIEZyZWYgb2YgMjYvNTIgTWh6LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2U6IDAtMHhGRiwgIDB4RkYgPSB1c2UgRlcgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICB1aW50MTYgIG1EaXZpZGVyRnJlZlNldDE7ICAgICAgICAgICAvKiBUaGUgTSBkaXZpZGVyIHVzZWQgaW4gQ09FWCBQTEwgc3dhbGxvd2luZyBtZWNoYW5pc20gZm9yIEZyZWYgb2YgMzguNC8xOS4yIE1oei4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlOiAwLTB4MUZGLCAgMHhGRkZGID0gdXNlIEZXIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgdWludDE2ICBtRGl2aWRlckZyZWZTZXQyOyAgICAgICAgICAgLyogVGhlIE0gZGl2aWRlciB1c2VkIGluIENPRVggUExMIHN3YWxsb3dpbmcgbWVjaGFuaXNtIGZvciBGcmVmIG9mIDI2LzUyIE1oei4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlOiAwLTB4MUZGLCAgMHhGRkZGID0gdXNlIEZXIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgdWludDMyICBjb2V4UGxsU3RhYmlsaXphdGlvblRpbWU7ICAgLyogVGhlIHRpbWUgZHVyYXRpb24gaW4gdVNlYyByZXF1aXJlZCBmb3IgQ09FWCBQTEwgdG8gc3RhYmlsaXplLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRiA9IHVzZSBGVyBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIHVpbnQxNiAgbGRvU3RhYmlsaXphdGlvblRpbWU7ICAgICAgIC8qIFRoZSB0aW1lIGR1cmF0aW9uIGluIHVTZWMgcmVxdWlyZWQgZm9yIExETyB0byBzdGFiaWxpemUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGID0gdXNlIEZXIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgdWludDggICBmbURpc3R1cmJlZEJhbmRNYXJnaW47ICAgICAgLyogVGhlIGRpc3R1cmJlZCBmcmVxdWVuY3kgYmFuZCBtYXJnaW4gYXJvdW5kIHRoZSBkaXN0dXJiZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBjZW50ZXIgKHNpbmdsZSBzaWRlZCkuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIDIgaXMgY29uZmlndXJlZCwgdGhlIGZvbGxvd2luZyBjaGFubmVscyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb25zaWRlcmVkIGRpc3R1cmJlZCBjaGFubmVsOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAgKy0gMC4xIE1IeiwgOTEgKy0gMC4xIE1IeiwgOTggKy0gMC4xIE1IeiwgMTAyICstIDAuMSBNSHoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYgPSB1c2UgRlcgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgl1aW50OAlzd2FsbG93Q2xrRGlmOyAgICAgICAgICAgICAgLyogVGhlIHN3YWxsb3cgY2xvY2sgZGlmZmVyZW5jZSBvZiB0aGUgc3dhbGxvd2luZyBtZWNoYW5pc20uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGID0gdXNlIEZXIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgp9IEFDWFdsYW5GbUNvZXhTdHJ1Y3Q7CiAgCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgQUNYX1RTRl9JTkZPCiAgICBUeXBlOiAgIE9wZXJhdGlvbgogICAgQWNjZXNzOiBSZWFkIE9ubHkKICAgIExlbmd0aDogMjAKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QgQUNYX2Z3VFNGSW5mb3JtYXRpb24KewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MzIgQ3VycmVudFRTRkhpZ2g7CiAgICB1aW50MzIgQ3VycmVudFRTRkxvdzsKICAgIHVpbnQzMiBsYXN0VEJUVEhpZ2g7CiAgICB1aW50MzIgbGFzdFRCVFRMb3c7CiAgICB1aW50OCBMYXN0RFRJTUNvdW50OwogICAgdWludDggIHBhZGRpbmdbM107ICAvKiBhbGlnbm1lbnQgdG8gMzJiaXRzIGJvdW5kcnkgICAqLwp9QUNYX2Z3VFNGSW5mb3JtYXRpb25fdDsKCiAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKTmFtZTogICBBQ1hfQkVUX0VOQUJMRQpEZXNjOiAgIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBCZWFjb24gRWFybHkgVGVybWluYXRpb24gbW9kdWxlLiBJbiBhZGRpdGlvbiBpbml0aWFsaXplZCB0aGUKICAgICAgICBNYXggRHJvcHBlZCBiZWFjb25zIHBhcmFtZXRlcgpUeXBlOiAgIENvbmZpZ3VyYXRpb24KQWNjZXNzOiBXcml0ZSAKTGVuZ3RoOiA2Ck5vdGU6ICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAoKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgICAgICAgICAgRW5hYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWZpZXMgaWYgYmVhY29uIGVhcmx5IHRlcm1pbmF0aW9uIHByb2NlZHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkOiAwIJYgZGlzYWJsZWQsIDEgliBlbmFibGVkICovCiAgICB1aW50OCAgICAgICAgICAgTWF4aW11bUNvbnNlY3V0aXZlRVQ7ICAgICAgICAgICAvKiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbnMgdGhhdCBtYXkgYmUgZWFybHkgdGVybWluYXRlZC4gQWZ0ZXIgdGhpcyBudW1iZXIgaXMgcmVhY2hlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBmdWxsIGJlYWNvbiBtdXN0IGJlIGNvcnJlY3RseSByZWNlaXZlZCBpbiBGVyBiZWZvcmUgYmVhY29uIEVUIHJlc3VtZXMuICBMZWdhbCByYW5nZTogMCCWIDI1NSAqLwogICAgdWludDggICAgICAgICAgIHBhZGRpbmdbMl07Cn1BQ1hCZXRfRW5hYmxlX3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6ICAgRE9UMTFfUlhfTVNEVV9MSUZFX1RJTUUKICAgIFR5cGU6ICAgT3BlcmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogNAogICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIFJ4TXNkdUxpZmVUaW1lOyAvKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSwgaW4gVFUsIHRoYXQgdGhlIFdpTGluayAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYXR0ZW1wdCB0byBjb2xsZWN0IGZyYWdtZW50cyBvZiBhbiBNU0RVIGJlZm9yZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkaW5nIHRoZW0uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDUxMi4qLwp9IGRvdDExUnhNc2R1TGlmZVRpbWVfdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBET1QxMV9DVVJfVFhfUFdSCiAgICBEZXNjOiAgIFRoaXMgSUUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIFR4UG93ZXIgaW4gRGJtLzEwIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvIHRyYW5zbWl0IGRhdGEuCiAgICBUeXBlOiAgIE9wZXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDEKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7IAogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCBkb3QxMUN1cnJlbnRUeFBvd2VyOyAvKiB0aGUgbWF4IFBvd2VyIGluIERibS8xMCB0byBiZSB1c2VkIHRvIHRyYW5zbWl0IGRhdGEuKi8KICAgIHVpbnQ4ICBwYWRkaW5nWzNdOyAgLyogYWxpZ25tZW50IHRvIDMyYml0cyBib3VuZHJ5ICAgKi8KfSBkb3QxMUN1cnJlbnRUeFBvd2VyU3RydWN0IDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBET1QxMV9SWF9ET1QxMV9NT0RFCiAgICBEZXNjOiAgIFRoaXMgSUUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IFJ4IE1vZGUgdXNlZCBieSBEU1NTIFBIWS4KICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDQKICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qClBvc3NpYmxlIHZhbHVlcyBmb3IgUnggRE9UMTEgTW9kZSBhcmUgdGhlIGZvbGxvd2luZzoKVmFsdWUgICBEZXNjcmlwdGlvbgo9PT09PSAgID09PT09PT09PT09CjMgICAgICAgMTFnIC0gcHJvY2Vzc2luZyBvZiBib3RoIGEgYW5kIGIgcGFja2V0IGZvcm1hdHMgaXMgZW5hYmxlZAoyICAgICAgIDExYiAtIHByb2Nlc3Npbmcgb2YgYiBwYWNrZXQgZm9ybWF0IGlzIGVuYWJsZWQKMSAgICAgICAxMWEgLSBwcm9jZXNzaW5nIG9mIGEgcGFja2V0IGZvcm1hdCBpcyBlbmFibGVkCjAgICAgICAgdW5kZWZpbmVkCiovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQzMiBkb3QxMVJ4RG90MTFNb2RlOyAvKiByZWZlciB0byBhYm92ZSB0YWJsZSovCn0gZG90MTFSeERvdDExTW9kZVN0cnVjdDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZTogICBET1QxMV9SVFNfVEhSRVNIT0xEIAogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6IFdyaXRlIE9ubHkKICAgIExlbmd0aDogMgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDE2ICBSVFNUaHJlc2hvbGQ7IC8qIFRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIGFuIE1QRFUsIGJlbG93IHdoaWNoIGFuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlRTL0NUUyBoYW5kc2hha2UgaXMgbm90IHBlcmZvcm1lZC4qLwogICAgCiAgICB1aW50OCAgcGFkZGluZ1syXTsgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCn1kb3QxMVJUU1RocmVzaG9sZF90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOiAgIERPVDExX0dST1VQX0FERFJFU1NfVEJMCiAgICBEZXNjOiAgIFRoZSB2YXJpYWJsZSBsZW5ndGhzIG9mIE1BQyBhZGRyZXNzZXMgdGhhdCBhcmUgZGVmaW5lIGFzIGxpc3RlbmluZyBmb3IKICAgICAgICAgICAgbXVsdGljYXN0LiBUaGUgZmllbGQgTnVtYmVyIG9mIGdyb3VwcyBpZGVudGlmaWVzIGhvdyBtYW55IE1BQyBBZGRyZXNzZXMgCiAgICAgICAgICAgIGFyZSByZWxldmFudCBpbiB0aGF0IGluZm9ybWF0aW9uIGVsZW1lbnQuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiB1cCB0byA1MCBieXRlcwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIEFERFJFU1NfR1JPVVBfTUFYICAgICAgICg4KQojZGVmaW5lIEFERFJFU1NfR1JPVVBfTUFYX0xFTiAgICg2ICogQUREUkVTU19HUk9VUF9NQVgpCnR5cGVkZWYgc3RydWN0IAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4ICAgZmx0clN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLSBtdWx0aWNhc3QgZmlsdGVyaW5nIGlzIGVuYWJsZWQuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIC0gbXVsdGljYXN0IGZpbHRlcmluZyBpcyBkaXNhYmxlZC4qLwoKICAgIHVpbnQ4ICAgbnVtT2ZHcm91cHM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWxldmFudCBtdWx0aWNhc3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3Nlcy4qLwoKICAgIHVpbnQ4ICAgcGFkZGluZ1syXTsgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRhcnkgICAqLwogICAgdWludDggICBkYXRhTG9jYXRpb25bQUREUkVTU19HUk9VUF9NQVhfTEVOXTsgLyogdGFibGUgb2YgTUFDIGFkZHJlc3Nlcy4qLwp9ZG90MTFNdWx0aWNhc3RHcm91cEFkZHJTdGFydF90OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgQUNYX0NPTkZJR19QU19XTU0gKFBhdGNoIGZvciBXaS1GaSBCdWcpCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCAKeyAgICAKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyICAgICAgQ29uZmlnUHNPbldtbU1vZGU7ICAvKiBUUlVFICAtIENvbmZpZ3VyZSBQUyB0byB3b3JrIG9uIFdNTSBtb2RlIC0gZG8gbm90IHNlbmQgdGhlIE5VTEwvUFNfUE9MTCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRzIGV2ZW4gaWYgVElNIGlzIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLSBDb25maWd1cmUgUFMgdG8gd29yayBvbiBOb24tV01NIG1vZGUgLSB3b3JrIGFjY29yZGluZyB0byB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQuICovCn0gQUNYQ29uZmlnUHNXbW1fdDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgIAogICAgTmFtZTogICBBQ1hfU0VUX1JYX0RBVEFfRklMVEVSCiAgICBEZXNjOiAgIFRoaXMgSUUgY29uZmlndXJlIG9uZSBmaWx0ZXIgaW4gdGhlIGRhdGEgZmlsdGVyIG1vZHVsZS4gY2FuIGJlIHVzZWQgCiAgICAgICAgICAgIGZvciBhZGQgLyByZW1vdmUgLyBtb2RpZnkgZmlsdGVyLgogICAgVHlwZTogICBGaWx0ZXJpbmcgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDQgKyBzaXplIG9mIHRoZSBmaWVsZHMgb2YgdGhlIGZpbHRlciAoY2FuIHZhcnkgYmV0d2VlbiBmaWx0ZXJzKQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBkYXRhIGZpbHRlciBhY3Rpb24gKi8KCiNpZmRlZiBIT1NUX0NPTVBJTEUKCiNkZWZpbmUgRklMVEVSX0RST1AgIDAgICAgICAgICAgLyogUGFja2V0IHdpbGwgYmUgZHJvcHBlZCBieSB0aGUgRlcgYW5kIHdvbnQgYmUgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIuICovCiNkZWZpbmUgRklMVEVSX1NJR05BTCAgMSAgICAgICAgLyogUGFja2V0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIuICovCiNkZWZpbmUgRklMVEVSX0ZXX0hBTkRMRSAgMiAgICAgLyogUGFja2V0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgRlcgYW5kIHdvbnQgYmUgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIuICovCgojZWxzZQoKdHlwZWRlZiBlbnVtIHsKICAgIEZJTFRFUl9EUk9QID0gMCwKICAgIEZJTFRFUl9TSUdOQUwgICwKICAgIEZJTFRFUl9GV19IQU5ETEUsIAogICAgRklMVEVSX01BWCAgPSAweEZGCn1maWx0ZXJfZW51bTsKCiNlbmRpZgoKI2lmZGVmIEhPU1RfQ09NUElMRQp0eXBlZGVmIHVpbnQ4IGZpbHRlcl9lOwojZWxzZQp0eXBlZGVmIGZpbHRlcl9lbnVtIGZpbHRlcl9lOwojZW5kaWYKCi8qIGRhdGEgZmlsdGVyIGNvbW1hbmQgKi8KI2RlZmluZSBSRU1PVkVfRklMVEVSICAgMCAgICAgICAvKiBSZW1vdmUgZmlsdGVyICovCiNkZWZpbmUgQUREX0ZJTFRFUiAgICAgIDEgICAgICAgLyogQWRkIGZpbHRlciAqLwoKLyogbGltaXRhdGlvbiAqLwojZGVmaW5lIE1BWF9EQVRBX0ZJTFRFUlMgNAojZGVmaW5lIE1BWF9EQVRBX0ZJTFRFUl9TSVpFIDkwCgp0eXBlZGVmIHN0cnVjdCAKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50OCAgICAgICAgICAgICAgICBjb21tYW5kOyAgIC8qIDAtcmVtb3ZlLCAxLWFkZCAqLwogICAgdWludDggICAgICAgICAgICAgICAgaW5kZXg7ICAgICAvKiByYW5nZSAwLU1BWF9EQVRBX0ZJTFRFUlMgKi8KICAgIGZpbHRlcl9lICAgICAgICAgICAgIGFjdGlvbjsgICAgLyogYWN0aW9uOiBGSUxURVJfRFJPUCwgRklMVEVSX1NJR05BTCwgRklMVEVSX0ZXX0hBTkRMRSAqLyAgCiAgICB1aW50OCAgICAgICAgICAgICAgICBudW1PZkZpZWxkczsgLyogbnVtYmVyIG9mIGZpZWxkIGluIHNwZWNpZmljIGZpbHRlciAqLwogICAgdWludDggICAgICAgICAgICAgICAgRlBUYWJsZTsgICAvKiBmaWx0ZXIgZmllbGRzIHN0YXJ0cyBoZXJlLiB2YXJpYWJsZSBzaXplLiAqLwp9IERhdGFGaWx0ZXJDb25maWdfdDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgCiAgICBOYW1lOiAgIEFDWF9FTkFCTEVfUlhfREFUQV9GSUxURVIKICAgIERlc2M6ICAgVGhpcyBJRSBkaXNhYmxlIC8gZW5hYmxlIHRoZSBkYXRhIGZpbHRlcmluZyBmZWF0dXJlLiBpbiBjYXNlIHRoZQogICAgICAgICAgICBmZWF0dWUgaXMgZW5hYmxlZCAtIGRlZmF1bHQgYWN0aW9uIHNob3VsZCBiZSBzZXQgYXMgd2VsbC4KICAgIFR5cGU6ICAgRmlsdGVyaW5nIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOiAyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCAgCnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDggICAgICAgZW5hYmxlOyAgICAgLyogMSAtIGVuYWJsZSwgMCAtIGRpc2FibGUgdGhlIGRhdGEgZGF0YSBmaWx0ZXJpbmcgZmVhdHVyZSAqLwogICAgZmlsdGVyX2UgICAgYWN0aW9uOyAgICAgLyogZGVmYXVsdCBhY3Rpb24gdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yIHBhY2tldHMgdGhhdCB3b250CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhbnkgb2YgdGhlIGZpbHRlcnMsIG9yIGluIGNhc2Ugbm8gZmlsdGVyIGlzIGNvbmZpZ3VyZWQgKi8KfSBEYXRhRmlsdGVyRGVmYXVsdF90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgCiAgICBOYW1lOiAgIEFDWF9HRVRfREFUQV9GSUxURVJfU1RBVElTVElDUwogICAgRGVzYzogICBnZXQgc3RhdGlzdGljcyBvZiB0aGUgZGF0YSBmaWx0ZXJpbmcgbW9kdWxlLgogICAgVHlwZTogICBTdGF0aXN0aWNzCiAgICBBY2Nlc3M6IFJlYWQgT25seQogICAgTGVuZ3RoOiAyMAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyICB1bm1hdGNoZWRQYWNrZXRzQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHBhY2tldHMgZGlkbid0IG1hdGNoIGFueSBmaWx0ZXIgKHdoZW4gdGhlIGZlYXR1cmUgd2FzIGVuYWJsZWQpLiAqLwogICAgdWludDMyICBtYXRjaGVkUGFja2V0c0NvdW50W01BWF9EQVRBX0ZJTFRFUlNdOyAgLyogbnVtYmVyIG9mIHBhY2tldHMgbWF0Y2hpbmcgZWFjaCBvZiB0aGUgZmlsdGVycyAqLwp9IEFDWERhdGFGaWx0ZXJpbmdTdGF0aXN0aWNzX3Q7CgoKI2lmZGVmIFJBRElPX1NDT1BFCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIE5hbWU6CUFDWF9SU19FTkFCTEUKCURlc2M6ICAgVGhpcyBjb21tYW5kIGluc3RydWN0cyB0aGUgV2lMaW5rIHRvIHNldCB0aGUgUmFkaW8gU2NvcGUgZnVuY3Rpb25hbGl0eQoJICAgICAgICBzdGF0ZSB0byBlaXRoZXIgZW5hYmxlL2Rpc2FibGUuIAoJVHlwZToJQ29uZmlndXJhdGlvbgoJQWNjZXNzOglXcml0ZSBPbmx5CglMZW5ndGg6IDEKCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgoJdWludDggICBFbmFibGU7IC8qIFJhZGlvU2NvcGUgZmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkKDApICovCiAgICB1aW50OCAgcGFkZGluZ1szXTsgIC8qIGFsaWdubWVudCB0byAzMiBiaXRzICAqLwp9IEFDWFJhZGlvU2NvcGVFbmFibGVTdHJ1Y3Q7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZToJQUNYX1JTX1JYCglEZXNjOiAgIFRoaXMgY29tbWFuZCBpbnN0cnVjdHMgdGhlIFdpTGluayB0byBzZXQgdGhlIFJhZGlvIFNjb3BlIAoJICAgICAgICBwYXJhbWV0ZXJzIHRvIHRoZSBkZXNpcmVkIHZhbHVlcy4gCglUeXBlOglDb25maWd1cmF0aW9uCglBY2Nlc3M6CVJlYWQvV3JpdGUgCglMZW5ndGg6IDEKCglXZSBoYXZlIHRoZSBmb2xsb3dpbmcgYXZhaWxhYmxlIG1lbW9yeSBhcmVhOgoJCQoJCQlJbmZvcm1hdGlvbiBFbGVtZW50IElEIC0JCTIgYnl0ZXMKCQkJSW5mb3JtYXRpb24gRWxlbWVudCBMZW5ndGggLQkyIGJ5dGVzCQkJCgkJCQoJCQkJTm93IHRoZSByZXN0IGlzIE1BWF9DTURfUEFSQU1TCgkJCQlidXQgNCBieXRlcyBtdXN0IGJlIHN1YnRyYWN0ZWQKCQkJCWJlY2F1c2Ugb2YgdGhlIElFIGluIEJ1ZmZlci4KCQkJCgkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CSAgICAKCXVpbnQxNiAgc2VydmljZTsKCXVpbnQxNglsZW5ndGg7Cgl1aW50OAljaGFubmVsOwoJdWludDgJYmFuZDsKCXVpbnQ4CXN0YXR1czsKCXVpbnQ4ICAgcGFkZGluZ1sxXTsgLyozMiBiaXQgcGFkZGluZyAqLwp9UnhQYWNrZXRTdHJ1Y3Q7Cgp0eXBlZGVmIHN0cnVjdCAKewkJCiAgICAvKiAgV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGF2YWlsYWJsZSBtZW1vcnkgYXJlYTogICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgSW5mb3JtYXRpb24gRWxlbWVudCBJRCAtICAgICAgICAyIGJ5dGVzICAgICAgICAgICAgICovCiAgICAvKiAgSW5mb3JtYXRpb24gRWxlbWVudCBMZW5ndGggLSAgICAyIGJ5dGVzICAgICAgICAgICAgICovCiAgICAvKiAgTnVtYmVyIE9mIFBhY2tldHMgaW4gQnVmZmVyIC0gICAgMiBieXRlcyAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgTm93IHRoZSByZXN0IGlzIE1BWF9DTURfUEFSQU1TICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgYnV0IDIgYnl0ZXMgbXVzdCBiZSBzdWJ0cmFjdGVkICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgYmVjYXVzZSBvZiB0aGUgTnVtYmVyIE9mIFBhY2tldHMgaW4gQnVmZmVyLiAgICovCglSeFBhY2tldFN0cnVjdCBwYWNrZXRbKE1BWF9DTURfUEFSQU1TLTIpL3NpemVvZihSeFBhY2tldFN0cnVjdCldOwp9UnhDeWNsaWNCdWZmZXJTdHJ1Y3Q7Cgp0eXBlZGVmIHN0cnVjdAoKewogICAgSU5GT19FTEVfSERSCiAgICAvKnVpbnQ4ICAgcGFkZGluZ1tNQVhfQ01EX1BBUkFNUy00XTsgKi8KCVJ4Q3ljbGljQnVmZmVyU3RydWN0IGJ1ZjsKfSBBQ1hSYWRpb1Njb3BlUnhQYXJhbXNTdHJ1Y3Q7CgojZW5kaWYgLyogUkFESU9fU0NPUEUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgTmFtZTogICBBQ1hfS0VFUF9BTElWRV9NT0RFCiAgICBEZXNjOiAgIFNldC9HZXQgdGhlIEtlZXAgQWxpdmUgZmVhdHVyZSBtb2RlLgogICAgVHlwZTogICBDb25maWd1cmF0aW9uCglBY2Nlc3M6CVdyaXRlCiAgICBMZW5ndGg6IDQgLSAxIGZvciB0aGUgbW9kZSArIDMgZm9yIHBhZGRpbmcuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CklORk9fRUxFX0hEUgogICAgQm9vbF9lICBtb2RlRW5hYmxlZDsKICAgIHVpbnQ4IHBhZGRpbmcgWzNdOwp9QWN4S2VlcEFsaXZlTW9kZTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgTmFtZToJQUNYX1NFVF9LRUVQX0FMSVZFX0NPTkZJRwogICAgRGVzYzogICBDb25maWd1cmUgYSBLTFYgdGVtcGxhdGUgcGFyYW1ldGVycy4KICAgIFR5cGU6ICAgQ29uZmlndXJhdGlvbgogICAgQWNjZXNzOiBXcml0ZSBPbmx5CiAgICBMZW5ndGg6IDgKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgZW51bQp7CiAgICBOT19UWCA9IDAsCiAgICBQRVJJT0RfT05MWQp9IEtlZXBBbGl2ZVRyaWdnZXJfZW51bTsKCiNpZmRlZiBIT1NUX0NPTVBJTEUKdHlwZWRlZiB1aW50OCBLZWVwQWxpdmVUcmlnZ2VyX2U7CiNlbHNlCnR5cGVkZWYgS2VlcEFsaXZlVHJpZ2dlcl9lbnVtIEtlZXBBbGl2ZVRyaWdnZXJfZTsKI2VuZGlmCgp0eXBlZGVmIGVudW0KewogICAgS0xWX1RFTVBMQVRFX0lOVkFMSUQgPSAwLAogICAgS0xWX1RFTVBMQVRFX1ZBTElELAogICAgS0xWX1RFTVBMQVRFX1BFTkRJTkcgLyogdGhpcyBvcHRpb24gaXMgRlcgaW50ZXJuYWwgb25seS4gaG9zdCBjYW4gb25seSBjb25maWd1cmUgVkFMSUQgb3IgSU5WQUxJRCovCn0gS2VlcEFsaXZlVGVtcGxhdGVWYWxpZGF0aW9uX2VudW07CgojaWZkZWYgSE9TVF9DT01QSUxFCnR5cGVkZWYgdWludDggS2VlcEFsaXZlVGVtcGxhdGVWYWxpZGF0aW9uX2U7CiNlbHNlCnR5cGVkZWYgS2VlcEFsaXZlVGVtcGxhdGVWYWxpZGF0aW9uX2VudW0gS2VlcEFsaXZlVGVtcGxhdGVWYWxpZGF0aW9uX2U7CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCgl1aW50MzIgcGVyaW9kOyAvKmF0IHJhbmdlIDEwMDAtMzYwMDAwMCAobXNlYykuIChUbyBhbGxvdyBiZXR0ZXIgcmFuZ2UgZm9yIGRlYnVnZ2luZykqLwogICAgdWludDggaW5kZXg7CiAgICBLZWVwQWxpdmVUZW1wbGF0ZVZhbGlkYXRpb25fZSAgIHZhbGlkOwogICAgS2VlcEFsaXZlVHJpZ2dlcl9lICB0cmlnZ2VyOwogICAgdWludDggcGFkZGluZzsKfSBBY3hTZXRLZWVwQWxpdmVDb25maWdfdDsKCi8qCiAqIEJBIHNlc3NlbiBpbnRlcmZhY2Ugc3RydWN0dXJlCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4IGFNYWNBZGRyZXNzWzZdOyAgICAgICAgICAgLyogTWFjIGFkZHJlc3Mgb2Y6IFNBIGFzIHJlY2VpdmVyIC8gUkEgYXMgaW5pdGlhdG9yICovCiAgICB1aW50OCB1VGlkOyAgICAgICAgICAgICAgICAgICAgIC8qIFRJRCAqLwogICAgdWludDggdVBvbGljeTsgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgLyBEaXNhYmxlICovCiAgICB1aW50MTYgdVdpblNpemU7ICAgICAgICAgICAgICAgIC8qIHdpbmRvd3Mgc2l6ZSBpbiBudW0gb2YgcGFja2V0ICovCiAgICB1aW50MTYgdUluYWN0aXZpdHlUaW1lb3V0OyAgICAgIC8qIGFzIGluaXRpYXRvciBpbmFjdGl2aXR5IHRpbWVvdXQgaW4gdGltZSB1bml0cyhUVSkgb2YgMTAyNHVzIC8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHJlY2VpdmVyIHJlc2VydmVkICovCn0gVEF4Y0JhU2Vzc2lvbkluaXRpYXRvclJlc3BvbmRlclBvbGljeTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfUEVFUl9IVF9DQVAKCURlc2M6ICAgQ29uZmlndXJlIEhUIGNhcGFiaWxpdGllcyAtIGRlY2xhcmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgcGVlciAKICAgICAgICAgICAgd2UgYXJlIGNvbm5lY3RlZCB0by4KCVR5cGU6CUNvbmZpZ3VyYXRpb24KCUFjY2VzczoJV3JpdGUgT25seQogICAgTGVuZ3RoOiAKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIElORk9fRUxFX0hEUgogICAgdWludDMyIHVIdENhcGFiaWxpdGVzOyAgICAgIC8qIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJpdCAwIJYgQWxsb3cgSFQgT3BlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0IDEgLSBBbGxvdyBHcmVlbmZpZWxkIGZvcm1hdCBpbiBUWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJpdCAyIJYgQWxsb3cgU2hvcnQgR0kgaW4gVFggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0IDMgliBBbGxvdyBMLVNJRyBUWE9QIFByb3RlY3Rpb24gaW4gVFgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaXQgNCCWIEFsbG93IEhUIENvbnRyb2wgZmllbGRzIGluIFRYLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgIE5vdGUsIGRyaXZlciB3aWxsIHN0aWxsIGxlYXZlIHNwYWNlIGZvciBIVCBjb250cm9sIGluIHBhY2tldHMgcmVnYXJkbGVzcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLiBGVyB3aWxsIGJlIHJlc3BvbnNpYmxlIHRvIGRyb3AgdGhlIEhUIGZpZWxkIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgZnJvbSBhbnkgZnJhbWUgd2hlbiB0aGlzIEJpdCBpcyBzZXQgdG8gMC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaXQgNSAtIEFsbG93IFJEIGluaXRpYXRpb24gaW4gVFhPUC4gRlcgaXMgYWxsb3dlZCB0byBpbml0YXRlIFJELiBFeGFjdCBwb2xpY3kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICBzZXR0aW5nIGZvciB0aGlzIGZlYXR1cmUgaXMgVEJELgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgTm90ZSwgdGhpcyBiaXQgY2FuIG9ubHkgYmUgc2V0IHRvIDEgaWYgYml0IDMgaXMgc2V0IHRvIDEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgIHVpbnQ4ICBhTWFjQWRkcmVzc1s2XTsgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSW5kaWNhdGVzIHRvIHdoaWNoIHBlZXIgdGhlc2UgY2FwYWJpbGl0aWVzIGFyZSByZWxldmFudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOb3RlLCBjdXJyZW50bHkgdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBGRkZGRkZGRkZGRkYgdG8gaW5kaWNhdGUgaXQgaXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVsZXZhbnQgZm9yIGFsbCBwZWVycyBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQgSFQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZS4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTGF0ZXIgb24gdGhpcyBmaWVsZCB3aWxsIGJlIHJlbGV2YW50IHRvIElCU1MvRExTIG9wZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICB1aW50OCAgdUFtcGR1TWF4TGVuZ3RoOyAgICAvKiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHRoZSBtYXhpbXVtIGEtbXBkdSBsZW5ndGggc3VwcG9ydGVkIGJ5IHRoZSBBUC4gVGhlIEZXIG1heSBub3QgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZXhjZWVkIHRoaXMgbGVuZ3RoIHdoZW4gc2VuZGluZyBBLU1QRFVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgIHVpbnQ4ICB1QW1wZHVNaW5TcGFjaW5nOyAgIC8qIFRoaXMgaXMgdGhlIG1pbmltYWwgc3BhY2luZyByZXF1aXJlZCB3aGVuIHNlbmRpbmcgQS1NUERVcyB0byB0aGUgQVAuICovCiAgICAgCn0gVEF4Y0h0Q2FwYWJpbGl0aWVzSWVGd0ludGVyZmFjZTsKCi8qIEVIdENhcGFiaWxpdGVzRndCaXRNYXNrIG1hcHBpbmcgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEZXX0NBUF9CSVRfTUFTS19IVF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgPSAgQklUXzAsCiAgICBGV19DQVBfQklUX01BU0tfR1JFRU5GSUVMRF9GUkFNRV9GT1JNQVQgICAgICAgICAgID0gIEJJVF8xLAogICAgRldfQ0FQX0JJVF9NQVNLX1NIT1JUX0dJX0ZPUl8yME1IWl9QQUNLRVRTICAgICAgICA9ICBCSVRfMiwKICAgIEZXX0NBUF9CSVRfTUFTS19MU0lHX1RYT1BfUFJPVEVDVElPTiAgICAgICAgICAgICAgPSAgQklUXzMsCiAgICBGV19DQVBfQklUX01BU0tfSFRfQ09OVFJPTF9GSUVMRFMgICAgICAgICAgICAgICAgID0gIEJJVF80LAogICAgRldfQ0FQX0JJVF9NQVNLX1JEX0lOSVRJQVRJT04gICAgICAgICAgICAgICAgICAgICA9ICBCSVRfNQp9IEVIdENhcGFiaWxpdGVzRndCaXRNYXNrOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfSFRfQlNTX09QRVJBVElPTgoJRGVzYzogICBDb25maWd1cmUgSFQgY2FwYWJpbGl0aWVzIC0gQVAgcnVsZXMgZm9yIGJlaGF2aW9yIGluIHRoZSBCU1MuCglUeXBlOglDb25maWd1cmF0aW9uCglBY2Nlc3M6CVdyaXRlIE9ubHkKICAgIExlbmd0aDogCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQ4IHVSaWZzTW9kZTsgICAgICAgICAgICAvKiBWYWx1ZXM6IDAgliBSSUZTIG5vdCBhbGxvd2VkLCAxIJYgUklGUyBhbGxvd2VkICovCiAgICB1aW50OCB1SHRQcm90ZWN0aW9uOyAgICAgICAgLyogVmFsdWVzOiAwIJYgMyBsaWtlIGluIHNwZWMgKi8KICAgIHVpbnQ4IHVHZlByb3RlY3Rpb247ICAgICAgICAvKiBWYWx1ZXM6IDAgLSBHRiBwcm90ZWN0aW9uIG5vdCByZXF1aXJlZCwgMSCWIEdGIHByb3RlY3Rpb24gcmVxdWlyZWQgKi8KICAgIHVpbnQ4IHVIdFR4QnVyc3RMaW1pdDsgICAgICAvKiBWYWx1ZXM6IDAgliBUWCBCdXJzdCBsaW1pdCBub3QgcmVxdWlyZWQsIDEgliBUWCBCdXJzdCBMaW1pdCByZXF1aXJlZCAqLwogICAgdWludDggdUR1YWxDdHNQcm90ZWN0aW9uOyAgIC8qIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFZhbHVlczogMCCWIER1YWwgQ1RTIHByb3RlY3Rpb24gbm90IHJlcXVpcmVkLCAxIER1YWwgQ1RTIFByb3RlY3Rpb24gcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBOb3RlOiBXaGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIDEgRlcgd2lsbCBwcm90ZWN0IGFsbCBUWE9QIHdpdGggUlRTIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGZyYW1lIGFuZCB3aWxsIG5vdCB1c2UgQ1RTLXRvLXNlbGYgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFDWF9DVFNfUFJPVEVDVElPTiBpbmZvcm1hdGlvbiBlbGVtZW50IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdWludDggcGFkZGluZ1szXTsKCn0gVEF4Y0h0SW5mb3JtYXRpb25JZUZ3SW50ZXJmYWNlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRndTdGF0aWNEYXRhX3QgLSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gY29tbWFuZCBtYWlsYm94IGFyZWEgYWZ0ZXIgdGhlIEluaXQgCiAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgY29tcGxldGUKCiBOb3RlOiAgVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIHRoZSBob3N0IHZpYSB0aGUgbWFpbGJveCBhdCBJbml0LUNvbXBsZXRlCiAgICAgICAgd2l0aG91dCBob3N0IHJlcXVlc3QhIQogICAgICAgIFRoZSBob3N0IHJlYWRzIHRoaXMgc3RydWN0dXJlIGJlZm9yZSBzZW5kaW5nIGFueSBjb25maWd1cmF0aW9uIHRvIHRoZSBGVy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QKewoJLyogZG90MTFTdGF0aW9uSURTdHJ1Y3QgKi8KCXVpbnQ4IGRvdDExU3RhdGlvbklEWzZdOyAvKiBUaGUgTUFDIGFkZHJlc3MgZm9yIHRoZSBTVEEuKi8KICAgIHVpbnQ4IHBhZGRpbmdbMl07ICAgICAgIC8qIGFsaWdubWVudCB0byAzMmJpdHMgYm91bmRyeSAgICovCgkvKiBBQ1hSZXZpc2lvbl90ICovCgljaGFyIEZXVmVyc2lvblsyMF07CQkvKiBUaGUgV2lMaW5rIGZpcm13YXJlIHZlcnNpb24sIGFuIEFTQ0lJIHN0cmluZyB4LngueC54LnggKi8KCQkJCQkJCS8qIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY3VycmVudCBmaXJtd2FyZS4gKi8KCQkJCQkJCS8qIFRoZSBsZWZ0IG1vc3QgZGlnaXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgKi8KCQkJCQkJCS8qIHNpZ25pZmljYW50IGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBmaXJtd2FyZSwgc3VjaCBhcyAqLwoJCQkJCQkJLyogV0xBTiBuZXcgcHJvamVjdC4qLwoJCQkJCQkJLyogVGhlIHNlY29uZCBhbmQgdGhpcmQgZGlnaXQgaXMgaW5jcmVtZW50ZWQgd2hlbiBtYWpvciBlbmhhbmNlbWVudHMqLwoJCQkJCQkJLyogYXJlIGFkZGVkIG9yIG1ham9yIGZpeGVzIGFyZSBtYWRlLiovCgkJCQkJCQkvKiBUaGUgZm91cnRoIGRpZ2l0IGlzIGluY3JlbWVudGVkIGZvciBlYWNoIFNQIHJlbGVhc2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBpdCBpbmRpY2FudHMgdGhlIGNvc3R1bWVyIHByaXZhdGUgYnJhbmNoICovCgkJCQkJCQkvKiBUaGUgZmlmdGggZGlnaXQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggYnVpbGQuKi8KCQkKICAgIHVpbnQzMiBIYXJkV2FyZVZlcnNpb247IC8qIFRoaXMgNCBieXRlIGZpZWxkIHNwZWNpZmllcyB0aGUgV2lMaW5rIGhhcmR3YXJlIHZlcnNpb24uICovCgkJCQkJCQkvKiBiaXRzIDAgIC0gMTU6IFJlc2VydmVkLiovCgkJCQkJCQkvKiBiaXRzIDE2IC0gMjM6IFZlcnNpb24gSUQgLSBUaGUgV2lMaW5rIHZlcnNpb24gSUQgICovCgkJCQkJCQkvKiAgICAgICAgICAgICAgKDEgPSBmaXJzdCBzcGluLCAyID0gc2Vjb25kIHNwaW4sIGFuZCBzbyBvbikuKi8KCQkJCQkJCS8qIGJpdHMgMjQgLSAzMTogQ2hpcCBJRCAtIFRoZSBXaUxpbmsgY2hpcCBJRC4gKi8KICAgICAgICB1aW50OCB0eFBvd2VyVGFibGVbTlVNQkVSX09GX1NVQl9CQU5EU19FXVtOVU1fT0ZfUE9XRVJfTEVWRUxdOyAvKiBNYXhpbXVuIERibSBpbiBEYm0vMTAgdW5pdHMgKi8KfSBGd1N0YXRpY0RhdGFfdDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgoKICAgIEFDWF9UWF9DT05GSUdfT1BUCgogCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCAKewogICAgSU5GT19FTEVfSERSCiAgICB1aW50MTYgIHR4Q29tcGxldGVUaW1lb3V0OyAgIC8qIE1heCB0aW1lIGluIG1zZWMgdGhlIEZXIG1heSBkZWxheSBmcmFtZSBUeC1Db21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgIHVpbnQxNiAgdHhDb21wbGV0ZVRocmVzaG9sZDsgLyogVHgtQ29tcGxldGUgcGFja2V0cyBudW1iZXIgd2hpY2ggcmVxdWlyZXMgaW50ZXJydXB0aW5nIHRoZSBob3N0ICgwID0gbm8gYnVmZmVyaW5nKSAqLwp9IEFDWFR4Q29uZmlnT3B0aW9uc190OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCk5hbWU6CUFDWF9QV1JfQ09OU1VNUFRJT05fU1RBVElTVElDUwpEZXNjOiAgIFJldHJpZXZlIHRpbWUgc3RhdGlzdGljcyBvZiB0aGUgZGlmZmVyZW50IHBvd2VyIHN0YXRlcy4KVHlwZToJQ29uZmlndXJhdGlvbgpBY2Nlc3M6CVJlYWQgT25seQpMZW5ndGg6IDIwIAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gUG93ZXIgU3RhdGlzdGljcwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIHVpbnQzMiBhd2FrZVRpbWVDbnRfTG93OwogICAgdWludDMyIGF3YWtlVGltZUNudF9IaTsKICAgIHVpbnQzMiBwb3dlckRvd25UaW1lQ250X0xvdzsKICAgIHVpbnQzMiBwb3dlckRvd25UaW1lQ250X0hpOwogICAgdWludDMyIGVscFRpbWVDbnRfTG93OwogICAgdWludDMyIGVscFRpbWVDbnRfSGk7CiAgICB1aW50MzIgTGlzdGVuTW9kZTExQlRpbWVDbnRfTG93OwogICAgdWludDMyIExpc3Rlbk1vZGUxMUJUaW1lQ250X0hpOwogICAgdWludDMyIExpc3Rlbk1vZGVPRkRNVGltZUNudF9Mb3c7CiAgICB1aW50MzIgTGlzdGVuTW9kZU9GRE1UaW1lQ250X0hpOwp9QUNYUG93ZXJDb25zdW1wdGlvblRpbWVTdGF0X3Q7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgTmFtZTogICBBQ1hfQlVSU1RfTU9ERQogICAgRGVzYzogICBlbmFibGUvZGlzYWJsZSBidXJzdCBtb2RlIGluIGNhc2UgVHhPcCBsaW1pdCAhPSAwLgogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6ICAgIFdyaXRlCiAgICBMZW5ndGg6IDEgLSAyIGZvciB0aGUgbW9kZSArIDMgZm9yIHBhZGRpbmcuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdAp7CklORk9fRUxFX0hEUgogICAgQm9vbF9lICBlbmFibGU7CiAgICB1aW50OCBwYWRkaW5nIFszXTsKfUFjeEJ1cnN0TW9kZTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBOYW1lOiAgIEFDWF9TRVRfUkFURV9NQU1BR0VNRU5UX1BBUkFNUwogICAgRGVzYzogICBjb25maWd1cmUgb25lIG9mIHRoZSBjb25maWd1cmFibGUgcGFyYW1ldGVycyBpbiByYXRlIG1hbmFnZW1lbnQgbW9kdWxlLgogICAgVHlwZTogICBDb25maWd1cmF0aW9uCiAgICBBY2Nlc3M6ICAgIFdyaXRlCiAgICBMZW5ndGg6IDggYnl0ZXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtCnsKICAgIFJBVEVfTUdNVF9SRVRSWV9TQ09SRV9QQVJBTSwKCVJBVEVfTUdNVF9QRVJfQUREX1BBUkFNLAoJUkFURV9NR01UX1BFUl9USDFfUEFSQU0sCglSQVRFX01HTVRfUEVSX1RIMl9QQVJBTSwKCVJBVEVfTUdNVF9NQVhfUEVSX1BBUkFNLAoJUkFURV9NR01UX0lOVkVSU0VfQ1VSSU9TSVRZX0ZBQ1RPUl9QQVJBTSwKCVJBVEVfTUdNVF9UWF9GQUlMX0xPV19USF9QQVJBTSwKCVJBVEVfTUdNVF9UWF9GQUlMX0hJR0hfVEhfUEFSQU0sCglSQVRFX01HTVRfUEVSX0FMUEhBX1NISUZUX1BBUkFNLAoJUkFURV9NR01UX1BFUl9BRERfU0hJRlRfUEFSQU0sCglSQVRFX01HTVRfUEVSX0JFVEExX1NISUZUX1BBUkFNLAoJUkFURV9NR01UX1BFUl9CRVRBMl9TSElGVF9QQVJBTSwKCVJBVEVfTUdNVF9SQVRFX0NIRUNLX1VQX1BBUkFNLAoJUkFURV9NR01UX1JBVEVfQ0hFQ0tfRE9XTl9QQVJBTSwKCVJBVEVfTUdNVF9SQVRFX1JFVFJZX1BPTElDWV9QQVJBTSwKCVJBVEVfTUdNVF9BTExfUEFSQU1TID0gMHhmZgp9IHJhdGVBZGFwdFBhcmFtX2VudW07CgojaWZkZWYgSE9TVF9DT01QSUxFCnR5cGVkZWYgdWludDggcmF0ZUFkYXB0UGFyYW1fZTsKI2Vsc2UKdHlwZWRlZiByYXRlQWRhcHRQYXJhbV9lbnVtIHJhdGVBZGFwdFBhcmFtX2U7CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgSU5GT19FTEVfSERSCglyYXRlQWRhcHRQYXJhbV9lIHBhcmFtSW5kZXg7Cgl1aW50MTYgUmF0ZVJldHJ5U2NvcmU7Cgl1aW50MTYgUGVyQWRkOwoJdWludDE2IFBlclRoMTsKCXVpbnQxNiBQZXJUaDI7Cgl1aW50MTYgTWF4UGVyOwoJdWludDggSW52ZXJzZUN1cmlvc2l0eUZhY3RvcjsKCXVpbnQ4IFR4RmFpbExvd1RoOwoJdWludDggVHhGYWlsSGlnaFRoOwoJdWludDggUGVyQWxwaGFTaGlmdDsKCXVpbnQ4IFBlckFkZFNoaWZ0OwoJdWludDggUGVyQmV0YTFTaGlmdDsKCXVpbnQ4IFBlckJldGEyU2hpZnQ7Cgl1aW50OCBSYXRlQ2hlY2tVcDsKCXVpbnQ4IFJhdGVDaGVja0Rvd247Cgl1aW50OCBSYXRlUmV0cnlQb2xpY3lbMTNdOwp9QWN4UmF0ZU1hbmdlUGFyYW1zOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgTmFtZTogICBBQ1hfR0VUX1JBVEVfTUFNQUdFTUVOVF9QQVJBTVMKICAgIERlc2M6ICAgcmVhZCB0aGUgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgb2YgcmF0ZSBtYW5hZ2VtZW50IG1vZHVsZS4KICAgIFR5cGU6CiAgICBBY2Nlc3M6IHJlYWQKICAgIExlbmd0aDogOCBieXRlcwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBJTkZPX0VMRV9IRFIKICAgIGludDMyICBTTlJDb3JyZWN0aW9uSGlnaExpbWl0OwogICAgaW50MzIgIFNOUkNvcnJlY3Rpb25Mb3dMaW1pdDsKICAgIGludDMyICBQRVJFcnJvclRIOwogICAgaW50MzIgIGF0dGVtcHRFdmFsdWF0ZVRIOwogICAgaW50MzIgIGdvb2RBdHRlbXB0VEg7CiAgICBpbnQzMiAgY3VydmVDb3JyZWN0aW9uU3RlcDsKfUFjeFJhdGVNYW5nZVJlYWRQYXJhbXM7CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfU0VUX1NNQVJUX1JFRkxFWF9TVEFURQogICAgRGVzYzogICBDb25maWd1cmUgc21hcnQgcmVmbGV4IHN0YXRlIChlbmFibGUvZGlzYWJsZSkuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QKewoJSU5GT19FTEVfSERSCiAgICBCb29sX2UgIGVuYWJsZTsKICAgIHVpbnQ4IHBhZGRpbmcgWzNdOwp9QUNYU21hcnRSZWZsZXhTdGF0ZV90OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfU0VUX1NNQVJUX1JFRkxFWF9ERUJVRwogICAgRGVzYzogICBDb25maWd1cmUgc21hcnQgcmVmbGV4IG1lY2hhbmlzbSBwYXJhbWV0ZXJzIC0gZm9yIGRlYnVnIG1vZGUuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdAp7Cgl1aW50OCBsZW47IC8vbWF4aW11bSBsZW5ndGggaXMgMTQKCWludDggdXBwZXJMaW1pdDsKCWludDggdmFsdWVzWzE0XTsgLy90aGlzIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCAoaW4gcm93cykgb2YgdGhlIGVycm9yIHRhYmxlCn1TbWFydFJlZmxleEVyclRhYmxlX3Q7Cgp0eXBlZGVmIHN0cnVjdAp7CglJTkZPX0VMRV9IRFIKCVNtYXJ0UmVmbGV4RXJyVGFibGVfdCBlcnJvclRhYmxlOwoJdWludDE2IHNlbk5fUDsKCXVpbnQxNiBzZW5OUk47Cgl1aW50MTYgc2VuUFJOOwoJdWludDE2IHNlbk5fUF9HYWluOwp9QUNYU21hcnRSZWZsZXhEZWJ1Z1BhcmFtc190OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBOYW1lOglBQ1hfU0VUX1NNQVJUX1JFRkxFWF9QQVJBTVMKICAgIERlc2M6ICAgQ29uZmlndXJlIHNtYXJ0IHJlZmxleCBtZWNoYW5pc20gdGFibGVzIC0gMSBmb3IgZWFjaCBGQUIuCgkJCVRoZSBGVyB3aWxsIGNob29zZSB0aGUgY29ycmVjdCBGQUIsIGFjY29yZGluZyB0byB3aGF0IGlzIGJ1cm5lZCBpbiB0aGUgRWZ1c2UuCiAgICBUeXBlOiAgIENvbmZpZ3VyYXRpb24KICAgIEFjY2VzczogV3JpdGUgT25seQogICAgTGVuZ3RoOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBzdHJ1Y3QKewoJSU5GT19FTEVfSERSCglTbWFydFJlZmxleEVyclRhYmxlX3QgZXJyb3JUYWJsZVszXTsKfUFDWFNtYXJ0UmVmbGV4Q29uZmlnUGFyYW1zX3Q7CgojZW5kaWYgLyogUFVCTElDX0lORk9FTEVfSCAqLwoK