LyoKICogVVNCIEZUREkgU0lPIGRyaXZlcgogKgogKiAJQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMQogKiAJICAgIEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCiAqICAgICAgICAgIEJpbGwgUnlkZXIgKGJyeWRlckBzZ2kuY29tKQogKglDb3B5cmlnaHQgKEMpIDIwMDIKICoJICAgIEt1YmEgT2JlciAoa3ViYUBtYXJlaW1icml1bS5vcmcpCiAqCiAqIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICoKICogU2VlIGh0dHA6Ly9mdGRpLXVzYi1zaW8uc291cmNlZm9yZ2UubmV0IGZvciB1cHRvIGRhdGUgdGVzdGluZyBpbmZvCiAqCWFuZCBleHRyYSBkb2N1bWVudGF0aW9uCiAqCiAqICgyMS9KdWwvMjAwNCkgSWFuIEFiYm90dAogKiAgICAgIEluY29ycG9yYXRlZCBTdGV2ZW4gVHVybmVyJ3MgY29kZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEZUMjIzMkMgY2hpcC4KICogICAgICBUaGUgcHJlbGltaWxhcnkgcG9ydCB0byB0aGUgMi42IGtlcm5lbCB3YXMgYnkgUnVzIFYuIEJydXNoa29mZi4gIEkgaGF2ZQogKiAgICAgIGZpeGVkIGEgY291cGxlIG9mIHRoaW5ncy4KICoKICogKDI3L01heS8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgSW1wcm92ZWQgdGhyb3R0bGluZyBjb2RlLCBtb3N0bHkgc3RvbGVuIGZyb20gdGhlIFdoaXRlSEVBVCBkcml2ZXIuCiAqCiAqICgyNi9NYXIvMjAwNCkgSmFuIENhcGVrCiAqICAgICAgQWRkZWQgUElEJ3MgZm9yIElDRC1VMjAvSUNELVU0MCAtIGluY2lyY3VpdCBQSUMgZGVidWdnZXJzIGZyb20gQ0NTIEluYy4KICoKICogKDA5L0ZlYi8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgQ2hhbmdlZCBmdWxsIG5hbWUgb2YgVVNCLVVJUlQgZGV2aWNlIHRvIGF2b2lkICIvIiBjaGFyYWN0ZXIuCiAqICAgICAgQWRkZWQgRlRESSdzIGFsdGVybmF0ZSBQSUQgKDB4NjAwNikgZm9yIEZUMjMyLzI0NSBkZXZpY2VzLgogKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCiAqIAogKiAoMjEvT2N0LzIwMDMpIElhbiBBYmJvdHQKICogICAgICBSZW5hbWVkIHNvbWUgVklEL1BJRCBtYWNyb3MgZm9yIE1hdHJpeCBPcmJpdGFsIGFuZCBQZXJsZSBTeXN0ZW1zCiAqICAgICAgZGV2aWNlcy4gIFJlbW92ZWQgTWF0cml4IE9yYml0YWwgYW5kIFBlcmxlIFN5c3RlbXMgZGV2aWNlcyBmcm9tIHRoZQogKiAgICAgIDhVMjMyQU0gZGV2aWNlIHRhYmxlLCBidXQgbGVmdCB0aGVtIGluIHRoZSBGVDIzMkJNIHRhYmxlLCBhcyB0aGV5IGFyZQogKiAgICAgIGtub3duIHRvIHVzZSBvbmx5IEZUMjMyQk0uCiAqCiAqICgxNy9PY3QvMjAwMykgU2NvdHQgQWxsZW4KICogICAgICBBZGRlZCB2aWQvcGlkIGZvciBQZXJsZSBTeXN0ZW1zIFVsdHJhUG9ydCBVU0Igc2VyaWFsIGNvbnZlcnRlcnMKICoKICogKDIxL1NlcC8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgVklEL1BJRCBmb3IgT21uaWRpcmVjdGlvbmFsIENvbnRyb2wgVGVjaG5vbG9neSBVUzEwMSBVU0IgdG8KICogICAgICBSUy0yMzIgYWRhcHRlciAoYWxzbyByZWJhZGdlZCBhcyBEaWNrIFNtaXRoIEVsZWN0cm9uaWNzIFhINjM4MSkuCiAqICAgICAgVklEL1BJRCBzdXBwbGllZCBieSBEb25hbGQgR29yZG9uLgogKgogKiAoMTkvQXVnLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGcmVlZCB1cmIncyB0cmFuc2ZlciBidWZmZXIgaW4gd3JpdGUgYnVsayBjYWxsYmFjay4KICogICAgICBPbWl0dGVkIHNvbWUgcGFyYW5vaWQgY2hlY2tzIGluIHdyaXRlIGJ1bGsgY2FsbGJhY2sgdGhhdCBkb24ndCBtYXR0ZXIuCiAqICAgICAgU2NoZWR1bGVkIHdvcmsgaW4gd3JpdGUgYnVsayBjYWxsYmFjayByZWdhcmRsZXNzIG9mIHBvcnQncyBvcGVuIGNvdW50LgogKgogKiAoMDUvQXVnLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBWSUQvUElEIGZvciBJRCBURUNIIElEVDEyMjFVIFVTQiB0byBSUy0yMzIgYWRhcHRlci4KICogICAgICBWSUQvUElEIHByb3ZpZGVkIGJ5IFN0ZXZlIEJyaWdncy4KICoKICogKDIzL0p1bC8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgUElEcyBmb3IgQ3J5c3RhbEZvbnR6IDU0NywgNjMzLCA2MzEsIDYzNSwgNjQwIGFuZCA2NDAgZnJvbQogKiAgICAgIFdheW5lIFd5bHVwc2tpLgogKgogKiAoMTAvSnVsLzIwMDMpIERhdmlkIEdsYW5jZQogKiAgICAgIEFkZGVkIFBJRCBmb3IgRFNTLTIwIFN5bmNTdGF0aW9uIGNyYWRsZSBmb3IgU29ueS1Fcmljc3NvbiBQODAwLgogKgogKiAoMjcvSnVuLzIwMDMpIElhbiBBYmJvdHQKICoJUmV3b3JrZWQgdGhlIHVyYiBoYW5kbGluZyBsb2dpYy4gIFdlIGhhdmUgbm8gbW9yZSBwb29sLCBidXQgZHluYW1pY2FsbHkKICoJYWxsb2NhdGUgdGhlIHVyYiBhbmQgdGhlIHRyYW5zZmVyIGJ1ZmZlciBvbiB0aGUgZmx5LiAgSW4gdGVzdGluZyB0aGlzCiAqCWRvZXMgbm90IGluY3VyZSBhbnkgbWVhc3VyYWJsZSBvdmVyaGVhZC4gIFRoaXMgYWxzbyByZWxpZXMgb24gdGhlIGZhY3QKICoJdGhhdCB3ZSBoYXZlIHByb3BlciByZWZlcmVuY2UgY291bnRpbmcgbG9naWMgZm9yIHVyYnMuICBJIG5pY2tlZCB0aGlzCiAqCWZyb20gR3JlZyBLSCdzIFZpc29yIGRyaXZlci4KICogICAgICAKICogKDIzL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgUmVkdWNlZCBmbGlwIGJ1ZmZlciBwdXNoZXMgYW5kIGNvcnJlY3RlZCBhIGRhdGEgbGVuZ3RoIHRlc3QgaW4KICogICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjay4KICogICAgICBEZWZlcmVyZW5jZSBwb2ludGVycyBhZnRlciBhbnkgcGFyYW5vaWQgY2hlY2tzLCBub3QgYmVmb3JlLgogKgogKiAoMjEvSnVuLzIwMDMpIEVyaWsgTnlncmVuCiAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgdXNpbmcgRlQyMzJCTSBjaGlwLgogKiAgICAgIFNlZSA8aHR0cDovL3d3dy5ob21lLWVsZWN0cm8uY29tL3RpcmExLmh0bT4uICBPbmx5IG9wZXJhdGVzIHByb3Blcmx5IAogKiAgICAgIGF0IDEwMDAwMCBhbmQgUlRTLUNUUywgc28gc2V0IGN1c3RvbSBkaXZpc29yIG1vZGUgb24gc3RhcnR1cC4KICogICAgICBBbHNvIGZvcmNlIHRoZSBUaXJhLTEgYW5kIFVTQi1VSVJUIHRvIG9ubHkgdXNlIHRoZWlyIGN1c3RvbSBiYXVkIHJhdGVzLgogKgogKiAoMTgvSnVuLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBEZXZpY2UgSUQgb2YgdGhlIFVTQiByZWxhaXMgZnJvbSBSdWRvbGYgR3VnbGVyIChiYWNrcG9ydGVkIGZyb20KICogICAgICBQaGlsaXBwIEf8aHJpbmcncyBwYXRjaCBmb3IgMi41Lngga2VybmVsKS4KICogICAgICBNb3ZlZCByZWFkIHRyYW5zZmVyIGJ1ZmZlciByZWFsbG9jYXRpb24gaW50byBzdGFydHVwIGZ1bmN0aW9uLgogKiAgICAgIEZyZWUgZXhpc3Rpbmcgd3JpdGUgdXJiIGFuZCB0cmFuc2ZlciBidWZmZXIgaW4gc3RhcnR1cCBmdW5jdGlvbi4KICogICAgICBPbmx5IHVzZSB1cmJzIGluIHdyaXRlIHVyYiBwb29sIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgogKiAgICAgIE1vdmVkIHNvbWUgY29uc3RhbnQgbWFjcm9zIG91dCBvZiBmdW5jdGlvbnMuCiAqICAgICAgTWlub3Igd2hpdGVzcGFjZSBhbmQgY29tbWVudCBjaGFuZ2VzLgogKgogKiAoMTIvSnVuLzIwMDMpIERhdmlkIE5vcndvb2QKICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBVU0ItVUlSVCBJUiB0cmFuc2NlaXZlciB1c2luZyA4VTIzMkFNIGNoaXAuCiAqICAgICAgU2VlIDxodHRwOi8vaG9tZS5lYXJ0aGxpbmsubmV0L35qcmhlZXMvVVNCVUlSVC9pbmRleC5odG0+LiAgT25seQogKiAgICAgIG9wZXJhdGVzIHByb3Blcmx5IGF0IDMxMjUwMCwgc28gc2V0IGN1c3RvbSBkaXZpc29yIG1vZGUgb24gc3RhcnR1cC4KICoKICogKDEyL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgU2VhbGV2ZWwgU2VhTElOSysgMjEweCwgMjIweCwgMjQweCwgMjgweCB2aWQvcGlkcyBmcm9tIFR1YW4gSG9hbmcKICogICAgICAtIEkndmUgZWxpbWluYXRlZCBzb21lIHRoYXQgZG9uJ3Qgc2VlbSB0byBleGlzdCEKICogICAgICBBZGRlZCBIb21lIEVsZWN0cm9uaWNzIFRpcmEtMSBJUiB0cmFuc2NlaXZlciBwaWQgZnJvbSBDaHJpcyBIb3JuCiAqICAgICAgU29tZSB3aGl0ZXNwYWNlL2NvZGluZy1zdHlsZSBjbGVhbnVwcwogKgogKiAoMTEvSnVuLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGaXhlZCB1bnNhZmUgc3BpbmxvY2sgdXNhZ2UgaW4gZnRkaV93cml0ZQogKgogKiAoMjQvRmViLzIwMDMpIFJpY2hhcmQgU2hvb3RlcgogKiAgICAgIEluY3JlYXNlIHJlYWQgYnVmZmVyIHNpemUgdG8gaW1wcm92ZSByZWFkIHNwZWVkcyBhdCBoaWdoZXIgYmF1ZCByYXRlcwogKiAgICAgIChzcGVjaWZpY2FsbHkgdGVzdGVkIHdpdGggdXAgdG8gMU1iL3NlYyBhdCAxLjVNIGJhdWQpCiAqCiAqICgyMy9GZWIvMjAwMykgSm9obiBXaWxraW5zCiAqICAgICAgQWRkZWQgWG9uL3hvZmYgZmxvdyBjb250cm9sIChhY3RpdmF0aW5nIHN1cHBvcnQgaW4gdGhlIGZ0ZGkgZGV2aWNlKQogKiAgICAgIEFkZGVkIHZpZC9waWQgZm9yIFZpZGVvbmV0d29ya3MvSG9tZWNob2ljZSAoVUsgSVNQKQogKgogKiAoMjMvRmViLzIwMDMpIEJpbGwgUnlkZXIKICogICAgICBBZGRlZCBtYXRyaXggb3JiIGRldmljZSB2aWQvcGlkcyBmcm9tIFdheW5lIFd5bHVwc2tpCiAqCiAqICgxOS9GZWIvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEZvciBUSU9DU1NFUklBTCwgc2V0IGFsdF9zcGVlZCB0byAwIHdoZW4gQVNZTkNfU1BEX01BU0sgdmFsdWUgaGFzCiAqICAgICAgY2hhbmdlZCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBBU1lOQ19TUERfSEksIEFTWU5DX1NQRF9WSEksCiAqICAgICAgQVNZTkNfU1BEX1NISSBvciBBU1lOQ19TUERfV0FSUC4gIEFsc28sIHVubGVzcyBBU1lOQ19TUERfQ1VTVCBpcyBpbgogKiAgICAgIGZvcmNlLCBkb24ndCBib3RoZXIgY2hhbmdpbmcgYmF1ZCByYXRlIHdoZW4gY3VzdG9tX2Rpdmlzb3IgaGFzIGNoYW5nZWQuCiAqCiAqICgxOC9GZWIvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEZpeGVkIFRJT0NNR0VUIGhhbmRsaW5nIHRvIGluY2x1ZGUgc3RhdGUgb2YgRFRSIGFuZCBSVFMsIHRoZSBzdGF0ZQogKiAgICAgIG9mIHdoaWNoIGFyZSBub3cgc2F2ZWQgYnkgc2V0X2R0cigpIGFuZCBzZXRfcnRzKCkuCiAqICAgICAgRml4ZWQgaW1wcm9wZXIgc3RvcmFnZSBjbGFzcyBmb3IgYnVmIGluIHNldF9kdHIoKSBhbmQgc2V0X3J0cygpLgogKiAgICAgIEFkZGVkIEZUMjMyQk0gY2hpcCB0eXBlIGFuZCBzdXBwb3J0IGZvciBpdHMgZXh0cmEgYmF1ZCByYXRlcyAoY29tcGFyZWQKICogICAgICB0byBGVDhVMjMyQU0pLgogKiAgICAgIFRvb2sgYWNjb3VudCBvZiBzcGVjaWFsIGNhc2UgZGl2aXNvciB2YWx1ZXMgZm9yIGhpZ2hlc3QgYmF1ZCByYXRlcyBvZgogKiAgICAgIEZUOFUyMzJBTSBhbmQgRlQyMzJCTS4KICogICAgICBGb3IgVElPQ1NTRVJJQUwsIGZvcmNlZCBhbHRfc3BlZWQgdG8gMCB3aGVuIEFTWU5DX1NQRF9DVVNUIGtsdWRnZSB1c2VkLAogKiAgICAgIGFzIHByZXZpb3VzIGFsdF9zcGVlZCBzZXR0aW5nIGlzIG5vdyBzdGFsZS4KICogICAgICBNb3ZlZCBzdGFydHVwIGNvZGUgY29tbW9uIGJldHdlZW4gdGhlIHN0YXJ0dXAgcm91dGluZXMgZm9yIHRoZQogKiAgICAgIGRpZmZlcmVudCBjaGlwIHR5cGVzIGludG8gYSBjb21tb24gc3Vicm91dGluZS4KICoKICogKDE3L0ZlYi8yMDAzKSBCaWxsIFJ5ZGVyCiAqICAgICAgQWRkZWQgd3JpdGUgdXJiIGJ1ZmZlciBwb29sIG9uIGEgcGVyIGRldmljZSBiYXNpcwogKiAgICAgIEFkZGVkIG1vcmUgY2hlY2tpbmcgZm9yIG9wZW4gZmlsZSBvbiBjYWxsYmFja3MgKGZpeGVkIE9PUFMpCiAqICAgICAgQWRkZWQgQ3J5c3RhbEZvbnR6IDYzMiBhbmQgNjM0IFBJRHMgCiAqICAgICAgICAgKHRoYW54IHRvIENyeXN0YWxGb250eiBmb3IgdGhlIHNhbXBsZSBkZXZpY2VzIC0gdGhleSBmbHVzaGVkIG91dAogKiAgICAgICAgICAgc29tZSBkcml2ZXIgYnVncykKICogICAgICBNaW5vciBkZWJ1Z2dpbmcgbWVzc2FnZSBjaGFuZ2VzCiAqICAgICAgQWRkZWQgdGhyb3R0bGUsIHVudGhyb3R0bGUgYW5kIGNoYXJzX2luX2J1ZmZlciBmdW5jdGlvbnMKICogICAgICBGaXhlZCBGVERJX1NJTyAodGhlIG9yaWdpbmFsIGRldmljZSkgYnVnCiAqICAgICAgRml4ZWQgc29tZSBzaHV0ZG93biBoYW5kbGluZwogKiAgICAgIAogKiAKICogCiAqIAogKiAoMDcvSnVuLzIwMDIpIEt1YmEgT2JlcgogKglDaGFuZ2VkIEZURElfU0lPX0JBU0VfQkFVRF9UT19ESVZJU09SIG1hY3JvIGludG8gZnRkaV9iYXVkX3RvX2Rpdmlzb3IKICoJZnVuY3Rpb24uIEl0IHdhcyBnZXR0aW5nIHRvbyBjb21wbGV4LgogKglGaXggdGhlIGRpdmlzb3IgY2FsY3VsYXRpb24gbG9naWMgd2hpY2ggd2FzIHNldHRpbmcgZGl2aXNvciBvZiAwLjEyNQogKglpbnN0ZWFkIG9mIDAuNSBmb3IgZnJhY3Rpb25hbCBwYXJ0cyBvZiBkaXZpc29yIGVxdWFsIHRvIDUvOCwgNi84LCA3LzguCiAqCUFsc28gbWFrZSBpdCBidW1wIHVwIHRoZSBkaXZpc29yIHRvIG5leHQgaW50ZWdlciBpbiBjYXNlIG9mIDcvOCAtIGl0J3MKICoJYSBiZXR0ZXIgYXBwcm94aW1hdGlvbi4KICoKICogKDI1L0p1bC8yMDAyKSBCaWxsIFJ5ZGVyIGluc2VydGVkIERtaXRyaSdzIFRJT0NNSVdBSVQgcGF0Y2gKICogICAgICBOb3QgdGVzdGVkIGJ5IG1lIGJ1dCBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nIEkgdXNlLgogKiAKICogKDA0L0phbi8yMDAyKSBLdWJhIE9iZXIKICoJSW1wbGVtZW50ZWQgMzg0MDAgYmF1ZHJhdGUga2x1ZGdlLCB3aGVyZSBpdCBjYW4gYmUgc3Vic3RpdHV0ZWQgd2l0aCBvdGhlcgogKgkgIHZhbHVlcy4gVGhhdCdzIHRoZSBvbmx5IHdheSB0byBzZXQgY3VzdG9tIGJhdWRyYXRlcy4KICoJSW1wbGVtZW50ZWQgVElPQ1NTRVJJQUwsIFRJT0NHU0VSSUFMIGlvY3RsJ3Mgc28gdGhhdCBzZXRzZXJpYWwgaXMgaGFwcHkuCiAqCUZJWE1FOiBib3RoIGJhdWRyYXRlIHRoaW5ncyBzaG91bGQgZXZlbnR1YWxseSBnbyB0byB1c2JzZXJpYWwuYyBhcyBvdGhlcgogKgkgIGRldmljZXMgbWF5IG5lZWQgdGhhdCBmdW5jdGlvbmFsaXR5IHRvby4gQWN0dWFsbHksIGl0IGNhbiBwcm9iYWJseSBiZQogKgkgIG1lcmdlZCBpbiBzZXJpYWwuYyBzb21laG93IC0gdG9vIG1hbnkgZHJpdmVycyByZXBlYXQgdGhpcyBjb2RlIG92ZXIKICoJICBhbmQgb3Zlci4KICoJRml4ZWQgYmF1ZHJhdGUgZm9yZ2V0ZnVsbmVzcyAtIG9wZW4oKSB1c2VkIHRvIHJlc2V0IGJhdWRyYXRlIHRvIDk2MDAgZXZlcnkgdGltZS4KICoJRGl2aXNvcnMgZm9yIGJhdWRyYXRlcyBhcmUgY2FsY3VsYXRlZCBieSBhIG1hY3JvLgogKglTbWFsbCBjb2RlIGNsZWFudXBzLiBVZ2x5IHdoaXRlc3BhY2UgY2hhbmdlcyBmb3IgUGxhdG8ncyBzYWtlIG9ubHkgOy1dLgogKgogKiAoMDQvTm92LzIwMDEpIEJpbGwgUnlkZXIKICoJRml4ZWQgYnVnIGluIHJlYWRfYnVsa19jYWxsYmFjayB3aGVyZSBpbmNvcnJlY3QgdXJiIGJ1ZmZlciB3YXMgdXNlZC4KICoJQ2xlYW5lZCB1cCB3cml0ZSBvZmZzZXQgY2FsY3VsYXRpb24KICoJQWRkZWQgd3JpdGVfcm9vbSBzaW5jZSBkZWZhdWx0IHZhbHVlcyBjYW4gYmUgaW5jb3JyZWN0IGZvciBzaW8KICoJQ2hhbmdlZCB3cml0ZV9idWxrX2NhbGxiYWNrIHRvIHVzZSBzYW1lIHF1ZXVlX3Rhc2sgYXMgb3RoZXIgZHJpdmVycwogKiAgICAgICAgKHRoZSBwcmV2aW91cyB2ZXJzaW9uIGNhdXNlZCBwYW5pY3MpCiAqCVJlbW92ZWQgcG9ydCBpdGVyYXRpb24gY29kZSBzaW5jZSB0aGUgZGV2aWNlIG9ubHkgaGFzIG9uZSBJL08gcG9ydCBhbmQgaXQKICoJICB3YXMgd3JvbmcgYW55d2F5LgogKiAKICogKDMxL01heS8yMDAxKSBna2gKICoJU3dpdGNoZWQgZnJvbSB1c2luZyBzcGlubG9jayB0byBhIHNlbWFwaG9yZSwgd2hpY2ggZml4ZXMgbG90cyBvZiBwcm9ibGVtcy4KICoKICogKDIzL01heS8yMDAxKSAgIEJpbGwgUnlkZXIKICoJQWRkZWQgcnVudGltZSBkZWJ1ZyBwYXRjaCAodGhhbnggVHlzb24gRCBTYXd5ZXIpLgogKglDbGVhbmVkIHVwIGNvbW1lbnRzIGZvciA4VTIzMgogKglBZGRlZCBwYXJpdHksIGZyYW1pbmcgYW5kIG92ZXJydW4gZXJyb3IgaGFuZGxpbmcKICoJQWRkZWQgcmVjZWl2ZSBicmVhayBoYW5kbGluZy4KICogCiAqICgwNC8wOC8yMDAxKSBnYgogKglJZGVudGlmeSB2ZXJzaW9uIG9uIG1vZHVsZSBsb2FkLgogKiAgICAgICAKICogKDE4L01hcmNoLzIwMDEpIEJpbGwgUnlkZXIKICoJKE5vdCByZWxlYXNlZCkKICoJQWRkZWQgc2VuZCBicmVhayBoYW5kbGluZy4gKHJlcXVpcmVzIGtlcm5lbCBwYXRjaCB0b28pCiAqCUZpeGVkIDhVMjMyQU0gaGFyZHdhcmUgUlRTL0NUUyBldGMgc3RhdHVzIHJlcG9ydGluZy4KICoJQWRkZWQgZmxpcGJ1ZiBmaXggY29waWVkIGZyb20gZ2VuZXJpYyBkZXZpY2UKICogCiAqICgxMi8zLzIwMDApIEJpbGwgUnlkZXIKICoJQWRkZWQgc3VwcG9ydCBmb3IgOFUyMzJBTSBkZXZpY2UuCiAqCU1vdmVkIFBJRCBhbmQgVklEcyBpbnRvIGhlYWRlciBmaWxlIG9ubHkuCiAqCVR1cm5lZCBvbiBsb3ctbGF0ZW5jeSBmb3IgdGhlIHR0eSAoZGV2aWNlIHdpbGwgZG8gaGlnaCBiYXVkcmF0ZXMpCiAqCUFkZGVkIHNodXRkb3duIHJvdXRpbmUgdG8gY2xvc2UgZmlsZXMgd2hlbiBkZXZpY2UgcmVtb3ZlZC4KICoJTW9yZSBkZWJ1ZyBhbmQgZXJyb3IgbWVzc2FnZSBjbGVhbnVwcy4KICoKICogKDExLzEzLzIwMDApIEJpbGwgUnlkZXIKICoJQWRkZWQgc3BpbmxvY2sgcHJvdGVjdGVkIG9wZW4gY29kZSBhbmQgY2xvc2UgY29kZS4KICoJTXVsdGlwbGUgb3BlbnMgd29yayAoc29ydCBvZiAtIHNlZSB3ZWJwYWdlIG1lbnRpb25lZCBhYm92ZSkuCiAqCUNsZWFuZWQgdXAgY29tbWVudHMuIFJlbW92ZWQgbXVsdGlwbGUgUElEL1ZJRCBkZWZpbml0aW9ucy4KICoJRmFjdG9yaXNlZCBjdHMvZHRyIGNvZGUKICoJTWFkZSB1c2Ugb2YgX19GVU5DVElPTl9fIGluIGRiZydzCiAqICAgICAgCiAqICgxMS8wMS8yMDAwKSBBZGFtIEouIFJpY2h0ZXIKICoJdXNiX2RldmljZV9pZCB0YWJsZSBzdXBwb3J0CiAqIAogKiAoMTAvMDUvMjAwMCkgZ2toCiAqCUZpeGVkIGJ1ZyB3aXRoIHVyYi0+ZGV2IG5vdCBiZWluZyBzZXQgcHJvcGVybHksIG5vdyB0aGF0IHRoZSB1c2IKICoJY29yZSBuZWVkcyBpdC4KICogCiAqICgwOS8xMS8yMDAwKSBna2gKICoJUmVtb3ZlZCBERUJVRyAjaWZkZWZzIHdpdGggY2FsbCB0byB1c2Jfc2VyaWFsX2RlYnVnX2RhdGEKICoKICogKDA3LzE5LzIwMDApIGdraAogKglBZGRlZCBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgZmFjdCB0aGF0IHRoaXMKICoJZHJpdmVyIGlzIGEgbG9hZGFibGUgbW9kdWxlIG5vdy4KICoKICogKDA0LzA0LzIwMDApIEJpbGwgUnlkZXIgCiAqCUZpeGVkIGJ1Z3MgaW4gVENHRVQvVENTRVQgaW9jdGxzIChieSByZW1vdmluZyB0aGVtIC0gdGhleSBhcmUKICogICAgICAgIGhhbmRsZWQgZWxzZXdoZXJlIGluIHRoZSB0dHkgaW8gZHJpdmVyIGNoYWluKS4KICoKICogKDAzLzMwLzIwMDApIEJpbGwgUnlkZXIgCiAqCUltcGxlbWVudGVkIGxvdHMgb2YgaW9jdGxzCiAqCUZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gd3JpdGUKICoJQ2hhbmdlZCBzb21lIGRiZydzIHRvIGVycnMKICoKICogKDAzLzI2LzIwMDApIGdraAogKglTcGxpdCBkcml2ZXIgdXAgaW50byBkZXZpY2Ugc3BlY2lmaWMgcGllY2VzLgogKgogKi8KCi8qIEJpbGwgUnlkZXIgLSBicnlkZXJAc2dpLmNvbSAtIHdyb3RlIHRoZSBGVERJX1NJTyBpbXBsZW1lbnRhdGlvbiAqLwovKiBUaGFueCB0byBGVERJIGZvciBzbyBraW5kbHkgcHJvdmlkaW5nIGRldGFpbHMgb2YgdGhlIHByb3RvY29sIHJlcXVpcmVkICovCi8qICAgdG8gdGFsayB0byB0aGUgZGV2aWNlICovCi8qIFRoYW54IHRvIGdraCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHVzYiBkZXYgZ3JvdXAgZm9yIGFsbCBjb2RlIEkgaGF2ZSBhc3NpbWlsYXRlZCA6LSkgKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgojaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgojaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxsaW51eC91c2IuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgojaW5jbHVkZSAidXNiLXNlcmlhbC5oIgojaW5jbHVkZSAiZnRkaV9zaW8uaCIKCi8qCiAqIFZlcnNpb24gSW5mb3JtYXRpb24KICovCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjQuMyIKI2RlZmluZSBEUklWRVJfQVVUSE9SICJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiwgQmlsbCBSeWRlciA8YnJ5ZGVyQHNnaS5jb20+LCBLdWJhIE9iZXIgPGt1YmFAbWFyZWltYnJpdW0ub3JnPiIKI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEZUREkgU2VyaWFsIENvbnZlcnRlcnMgRHJpdmVyIgoKc3RhdGljIGludCBkZWJ1ZzsKc3RhdGljIF9fdTE2IHZlbmRvciA9IEZURElfVklEOwpzdGF0aWMgX191MTYgcHJvZHVjdDsKCi8qIHN0cnVjdCBmdGRpX3Npb19xdWlyayBpcyB1c2VkIGJ5IGRldmljZXMgcmVxdWlyaW5nIHNwZWNpYWwgYXR0ZW50aW9uLiAqLwpzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgewoJdm9pZCAoKnNldHVwKShzdHJ1Y3QgdXNiX3NlcmlhbCAqKTsgLyogU3BlY2lhbCBzZXR0aW5ncyBkdXJpbmcgc3RhcnR1cC4gKi8KfTsKCnN0YXRpYyB2b2lkICBmdGRpX1VTQl9VSVJUX3NldHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIHZvaWQgIGZ0ZGlfSEVfVElSQTFfc2V0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwoKc3RhdGljIHN0cnVjdCBmdGRpX3Npb19xdWlyayBmdGRpX1VTQl9VSVJUX3F1aXJrID0gewoJLnNldHVwID0gZnRkaV9VU0JfVUlSVF9zZXR1cCwKfTsKCnN0YXRpYyBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgZnRkaV9IRV9USVJBMV9xdWlyayA9IHsKCS5zZXR1cCA9IGZ0ZGlfSEVfVElSQTFfc2V0dXAsCn07CgovKgogKiBUaGUgOFUyMzJBTSBoYXMgdGhlIHNhbWUgQVBJIGFzIHRoZSBzaW8gZXhjZXB0IGZvcjoKICogLSBpdCBjYW4gc3VwcG9ydCBNVUNIIGhpZ2hlciBiYXVkcmF0ZXM7IHVwIHRvOgogKiAgIG8gOTIxNjAwIGZvciBSUzIzMiBhbmQgMjAwMDAwMCBmb3IgUlM0MjIvNDg1IGF0IDQ4TUh6CiAqICAgbyAyMzA0MDAgYXQgMTJNSHoKICogICBzbyAuLiA4VTIzMkFNJ3MgYmF1ZHJhdGUgc2V0dGluZyBjb2RlcyBhcmUgZGlmZmVyZW50CiAqIC0gaXQgaGFzIGEgdHdvIGJ5dGUgc3RhdHVzIGNvZGUuCiAqIC0gaXQgcmV0dXJucyBjaGFyYWN0ZXJzIGV2ZXJ5IDE2bXMgKHRoZSBGVERJIGRvZXMgaXQgZXZlcnkgNDBtcykKICoKICogdGhlIGJjZERldmljZSB2YWx1ZSBpcyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgRlQyMzJCTSBhbmQgRlQyNDVCTSBmcm9tCiAqIHRoZSBlYXJsaWVyIEZUOFUyMzJBTSBhbmQgRlQ4VTIzMkJNLiAgRm9yIG5vdywgaW5jbHVkZSBhbGwga25vd24gVklEL1BJRAogKiBjb21iaW5hdGlvbnMgaW4gYm90aCB0YWJsZXMuCiAqIEZJWE1FOiBwZXJoYXBzIGJjZERldmljZSBjYW4gYWxzbyBpZGVudGlmeSAxMk1IeiBGVDhVMjMyQU0gZGV2aWNlcywKICogYnV0IEkgZG9uJ3Qga25vdyBpZiB0aG9zZSBldmVyIHdlbnQgaW50byBtYXNzIHByb2R1Y3Rpb24uIFtJYW4gQWJib3R0XQogKi8KCgoKc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX2NvbWJpbmVkIFtdID0gewoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9BTFRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjIzMkNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JFTEFJU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVEVSQklPTUVUUklDU19WSUQsIElOVEVSQklPTUVUUklDU19NSU5JX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjM0X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl81NDdfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjMxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjQyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9EU1MyMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8wX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAzX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV83X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl81X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl84X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM182X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfN19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzhfUElEKSB9LAoJeyBVU0JfREVWSUNFKElEVEVDSF9WSUQsIElEVEVDSF9JRFQxMjIxVV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoT0NUX1ZJRCwgT0NUX1VTMTAxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9IRV9USVJBMV9QSUQpLAoJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZnRkaV9IRV9USVJBMV9xdWlyayB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCksCgkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX1VTQl9VSVJUX3F1aXJrIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8xKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1IyWDApIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8zKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfNCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDhfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBBX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBEX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg4X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4QV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhCX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OENfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhFX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTzEwMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VNMTAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVVIxMDBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9BTEM4NTAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QWVJBTUlEX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRkhaMTAwMFBDX1BJRCkgfSwKCS8qCgkgKiBUaGVzZSB3aWxsIHByb2JhYmx5IHVzZSB1c2VyLXNwYWNlIGRyaXZlcnMuICBVbmNvbW1lbnQgdGhlbSBpZgoJICogeW91IG5lZWQgdGhlbSBvciB1c2UgdGhlIHVzZXItc3BlY2lmaWVkIHZlbmRvci9wcm9kdWN0IG1vZHVsZQoJICogcGFyYW1ldGVycyAoc2VlIGZ0ZGlfc2lvLmggZm9yIHRoZSBudW1iZXJzKS4gIE1ha2UgYSBmdXNzIGlmCgkgKiB5b3UgdGhpbmsgdGhlIGRyaXZlciBzaG91bGQgcmVjb2duaXplIGFueSBvZiB0aGVtIGJ5IGRlZmF1bHQuCgkgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfQ0xJNzAwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BQUzczMzBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9URk0xMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VREY3N19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VJTzg4X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVUFEOF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VEQTdfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VU0kyX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVDExMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QQ0QyMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTEEyMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9DU0k4X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRU0xMDAwRExfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QQ0sxMDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9SRlA1MDBfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GUzIwU0lHX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1MzMDBQQ19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZIWjEzMDBQQ19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1dTNTAwX1BJRCkgfSwgKi8KIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfU0RNVVNCUVNTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIElOU0lERV9BQ0NFU1NPKSB9LAoJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZBTENPTV9WSUQsIEZBTENPTV9UV0lTVF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRkFMQ09NX1ZJRCwgRkFMQ09NX1NBTUJBX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9TVVVOVE9fU1BPUlRTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9STV9DQU5WSUVXX1BJRCkgfSwKCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU1RMNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU085TUwyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUykgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl81X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfN19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BQ1RJVkVfUk9CT1RTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSEFNX1k2X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSEFNX1k4X1BJRCkgfSwKCXsgVVNCX0RFVklDRShFVk9MVVRJT05fVklELCBFVk9MVVRJT05fRVIxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BUlRFTUlTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BVElLX0FUSzE2X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BVElLX0FUSzE2SFJfUElEKSB9LAoJeyB9LAkJCQkJLyogT3B0aW9uYWwgcGFyYW1ldGVyIGVudHJ5ICovCgl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlX2NvbWJpbmVkKTsKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBmdGRpX2RyaXZlciA9IHsKCS5uYW1lID0JCSJmdGRpX3NpbyIsCgkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAoJLmRpc2Nvbm5lY3QgPQl1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QsCgkuaWRfdGFibGUgPQlpZF90YWJsZV9jb21iaW5lZCwKfTsKCnN0YXRpYyBjaGFyICpmdGRpX2NoaXBfbmFtZVtdID0gewoJW1NJT10gPSAiU0lPIiwJLyogdGhlIHNlcmlhbCBwYXJ0IG9mIEZUOFUxMDBBWCAqLwoJW0ZUOFUyMzJBTV0gPSAiRlQ4VTIzMkFNIiwKCVtGVDIzMkJNXSA9ICJGVDIzMkJNIiwKCVtGVDIyMzJDXSA9ICJGVDIyMzJDIiwKfTsKCgovKiBDb25zdGFudHMgZm9yIHJlYWQgdXJiIGFuZCB3cml0ZSB1cmIgKi8KI2RlZmluZSBCVUZTWiA1MTIKI2RlZmluZSBQS1RTWiA2NAoKLyogcnhfZmxhZ3MgKi8KI2RlZmluZSBUSFJPVFRMRUQJCTB4MDEKI2RlZmluZSBBQ1RVQUxMWV9USFJPVFRMRUQJMHgwMgoKc3RydWN0IGZ0ZGlfcHJpdmF0ZSB7CglmdGRpX2NoaXBfdHlwZV90IGNoaXBfdHlwZTsKCQkJCS8qIHR5cGUgb2YgdGhlIGRldmljZSwgZWl0aGVyIFNJTyBvciBGVDhVMjMyQU0gKi8KCWludCBiYXVkX2Jhc2U7CQkvKiBiYXVkIGJhc2UgY2xvY2sgZm9yIGRpdmlzb3Igc2V0dGluZyAqLwoJaW50IGN1c3RvbV9kaXZpc29yOwkvKiBjdXN0b21fZGl2aXNvciBrbHVkZ2UsIHRoaXMgaXMgZm9yIGJhdWRfYmFzZSAoZGlmZmVyZW50IGZyb20gd2hhdCBnb2VzIHRvIHRoZSBjaGlwISkgKi8KCV9fdTE2IGxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlIDsKCQkJCS8qIHRoZSBsYXN0IGRhdGEgc3RhdGUgc2V0IC0gbmVlZGVkIGZvciBkb2luZyBhIGJyZWFrICovCiAgICAgICAgaW50IHdyaXRlX29mZnNldDsgICAgICAgLyogVGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSB1c2IgZGF0YSBibG9jayB0byB3cml0ZSB0aGUgc2VyaWFsIGRhdGEgLSAKCQkJCSAqIGl0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIGRldmljZXMKCQkJCSAqLwoJaW50IGZsYWdzOwkJLyogc29tZSBBU1lOQ194eHh4IGZsYWdzIGFyZSBzdXBwb3J0ZWQgKi8KCXVuc2lnbmVkIGxvbmcgbGFzdF9kdHJfcnRzOwkvKiBzYXZlZCBtb2RlbSBjb250cm9sIG91dHB1dHMgKi8KICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwoJX191OCByeF9mbGFnczsJCS8qIHJlY2VpdmUgc3RhdGUgZmxhZ3MgKHRocm90dGxpbmcpICovCglzcGlubG9ja190IHJ4X2xvY2s7CS8qIHNwaW5sb2NrIGZvciByZWNlaXZlIHN0YXRlICovCglzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfd29yazsKCWludCByeF9wcm9jZXNzZWQ7CgoJX191MTYgaW50ZXJmYWNlOwkvKiBGVDIyMzJDIHBvcnQgaW50ZXJmYWNlICgwIGZvciBGVDIzMi8yNDUpICovCgoJaW50IGZvcmNlX2JhdWQ7CQkvKiBpZiBub24temVybywgZm9yY2UgdGhlIGJhdWQgcmF0ZSB0byB0aGlzIHZhbHVlICovCglpbnQgZm9yY2VfcnRzY3RzOwkvKiBpZiBub24temVybywgZm9yY2UgUlRTLUNUUyB0byBhbHdheXMgYmUgZW5hYmxlZCAqLwp9OwoKLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwojZGVmaW5lIEZURElfU1RBVFVTX0IwX01BU0sJKEZURElfUlMwX0NUUyB8IEZURElfUlMwX0RTUiB8IEZURElfUlMwX1JJIHwgRlRESV9SUzBfUkxTRCkKI2RlZmluZSBGVERJX1NUQVRVU19CMV9NQVNLCShGVERJX1JTX0JJKQovKiBFbmQgVElPQ01JV0FJVCAqLwoKI2RlZmluZSBGVERJX0lNUExfQVNZTkNfRkxBR1MgPSAoIEFTWU5DX1NQRF9ISSB8IEFTWU5DX1NQRF9WSEkgXAogQVNZTkNfU1BEX0NVU1QgfCBBU1lOQ19TUERfU0hJIHwgQVNZTkNfU1BEX1dBUlAgKQoKLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgYSBGVERJIHNlcmlhbCBjb252ZXJ0ZXIgKi8Kc3RhdGljIGludCAgZnRkaV9zaW9fcHJvYmUJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CnN0YXRpYyBpbnQgIGZ0ZGlfc2lvX2F0dGFjaAkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpzdGF0aWMgdm9pZCBmdGRpX3NodXRkb3duCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CnN0YXRpYyBpbnQgIGZ0ZGlfb3BlbgkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CnN0YXRpYyB2b2lkIGZ0ZGlfY2xvc2UJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwpzdGF0aWMgaW50ICBmdGRpX3dyaXRlCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKc3RhdGljIGludCAgZnRkaV93cml0ZV9yb29tCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CnN0YXRpYyBpbnQgIGZ0ZGlfY2hhcnNfaW5fYnVmZmVyCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIHZvaWQgZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrCShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKc3RhdGljIHZvaWQgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpzdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZAkJKHZvaWQgKnBhcmFtKTsKc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKc3RhdGljIGludCAgZnRkaV90aW9jbWdldCAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CnN0YXRpYyBpbnQgIGZ0ZGlfdGlvY21zZXQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CnN0YXRpYyBpbnQgIGZ0ZGlfaW9jdGwJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CnN0YXRpYyB2b2lkIGZ0ZGlfYnJlYWtfY3RsCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlICk7CnN0YXRpYyB2b2lkIGZ0ZGlfdGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIHZvaWQgZnRkaV91bnRocm90dGxlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IGZ0ZGlfMjMyYW1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IgKGludCBiYXVkLCBpbnQgYmFzZSk7CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IgKGludCBiYXVkKTsKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IgKGludCBiYXVkLCBpbnQgYmFzZSk7CnN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvciAoaW50IGJhdWQpOwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBmdGRpX3Npb19kZXZpY2UgPSB7CgkuZHJpdmVyID0gewoJCS5vd25lciA9CVRISVNfTU9EVUxFLAoJCS5uYW1lID0JCSJmdGRpX3NpbyIsCgl9LAoJLmRlc2NyaXB0aW9uID0JCSJGVERJIFVTQiBTZXJpYWwgRGV2aWNlIiwKCS5pZF90YWJsZSA9CQlpZF90YWJsZV9jb21iaW5lZCwKCS5udW1faW50ZXJydXB0X2luID0JMCwKCS5udW1fYnVsa19pbiA9CQkxLAoJLm51bV9idWxrX291dCA9CQkxLAoJLm51bV9wb3J0cyA9CQkxLAoJLnByb2JlID0JCWZ0ZGlfc2lvX3Byb2JlLAoJLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAoJLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCgkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCgkud3JpdGUgPQkJZnRkaV93cml0ZSwKCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAoJLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCgkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAoJLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKCS5hdHRhY2ggPQkJZnRkaV9zaW9fYXR0YWNoLAoJLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCn07CgoKI2RlZmluZSBXRFJfVElNRU9VVCA1MDAwIC8qIGRlZmF1bHQgdXJiIHRpbWVvdXQgKi8KI2RlZmluZSBXRFJfU0hPUlRfVElNRU9VVCAxMDAwCS8qIHNob3J0ZXIgdXJiIHRpbWVvdXQgKi8KCi8qIEhpZ2ggYW5kIGxvdyBhcmUgZm9yIERUUiwgUlRTIGV0YyBldGMgKi8KI2RlZmluZSBISUdIIDEKI2RlZmluZSBMT1cgMAoKLyoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFV0bGl0eSBmdW5jdGlvbnMKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBmdGRpXzIzMmFtX2JhdWRfYmFzZV90b19kaXZpc29yKGludCBiYXVkLCBpbnQgYmFzZSkKewoJdW5zaWduZWQgc2hvcnQgaW50IGRpdmlzb3I7CglpbnQgZGl2aXNvcjMgPSBiYXNlIC8gMiAvIGJhdWQ7IC8vIGRpdmlzb3Igc2hpZnRlZCAzIGJpdHMgdG8gdGhlIGxlZnQKCWlmICgoZGl2aXNvcjMgJiAweDcpID09IDcpIGRpdmlzb3IzICsrOyAvLyByb3VuZCB4LjcvOCB1cCB0byB4KzEKCWRpdmlzb3IgPSBkaXZpc29yMyA+PiAzOwoJZGl2aXNvcjMgJj0gMHg3OwoJaWYgKGRpdmlzb3IzID09IDEpIGRpdmlzb3IgfD0gMHhjMDAwOyBlbHNlIC8vIDAuMTI1CglpZiAoZGl2aXNvcjMgPj0gNCkgZGl2aXNvciB8PSAweDQwMDA7IGVsc2UgLy8gMC41CglpZiAoZGl2aXNvcjMgIT0gMCkgZGl2aXNvciB8PSAweDgwMDA7ICAgICAgLy8gMC4yNQoJaWYgKGRpdmlzb3IgPT0gMSkgZGl2aXNvciA9IDA7CS8qIHNwZWNpYWwgY2FzZSBmb3IgbWF4aW11bSBiYXVkIHJhdGUgKi8KCXJldHVybiBkaXZpc29yOwp9CgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKGludCBiYXVkKQp7CgkgcmV0dXJuKGZ0ZGlfMjMyYW1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IoYmF1ZCwgNDgwMDAwMDApKTsKfQoKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IoaW50IGJhdWQsIGludCBiYXNlKQp7CglzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaXZmcmFjWzhdID0geyAwLCAzLCAyLCA0LCAxLCA1LCA2LCA3IH07CglfX3UzMiBkaXZpc29yOwoJaW50IGRpdmlzb3IzID0gYmFzZSAvIDIgLyBiYXVkOyAvLyBkaXZpc29yIHNoaWZ0ZWQgMyBiaXRzIHRvIHRoZSBsZWZ0CglkaXZpc29yID0gZGl2aXNvcjMgPj4gMzsKCWRpdmlzb3IgfD0gKF9fdTMyKWRpdmZyYWNbZGl2aXNvcjMgJiAweDddIDw8IDE0OwoJLyogRGVhbCB3aXRoIHNwZWNpYWwgY2FzZXMgZm9yIGhpZ2hlc3QgYmF1ZCByYXRlcy4gKi8KCWlmIChkaXZpc29yID09IDEpIGRpdmlzb3IgPSAwOyBlbHNlCS8vIDEuMAoJaWYgKGRpdmlzb3IgPT0gMHg0MDAxKSBkaXZpc29yID0gMTsJLy8gMS41CglyZXR1cm4gZGl2aXNvcjsKfQoKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yKGludCBiYXVkKQp7CgkgcmV0dXJuKGZ0ZGlfMjMyYm1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IoYmF1ZCwgNDgwMDAwMDApKTsKfQoKI2RlZmluZSBzZXRfbWN0cmwocG9ydCwgc2V0KQkJdXBkYXRlX21jdHJsKChwb3J0KSwgKHNldCksIDApCiNkZWZpbmUgY2xlYXJfbWN0cmwocG9ydCwgY2xlYXIpCXVwZGF0ZV9tY3RybCgocG9ydCksIDAsIChjbGVhcikpCgpzdGF0aWMgaW50IHVwZGF0ZV9tY3RybChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgljaGFyICpidWY7Cgl1bnNpZ25lZCB1cmJfdmFsdWU7CglpbnQgcnY7CgoJaWYgKCgoc2V0IHwgY2xlYXIpICYgKFRJT0NNX0RUUiB8IFRJT0NNX1JUUykpID09IDApIHsKCQlkYmcoIiVzIC0gRFRSfFJUUyBub3QgYmVpbmcgc2V0fGNsZWFyZWQiLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAwOwkvKiBubyBjaGFuZ2UgKi8KCX0KCglidWYgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKCWlmICghYnVmKSB7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJY2xlYXIgJj0gfnNldDsJLyogJ3NldCcgdGFrZXMgcHJlY2VkZW5jZSBvdmVyICdjbGVhcicgKi8KCXVyYl92YWx1ZSA9IDA7CglpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCgkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9EVFJfTE9XOwoJaWYgKGNsZWFyICYgVElPQ01fUlRTKQoJCXVyYl92YWx1ZSB8PSBGVERJX1NJT19TRVRfUlRTX0xPVzsKCWlmIChzZXQgJiBUSU9DTV9EVFIpCgkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9EVFJfSElHSDsKCWlmIChzZXQgJiBUSU9DTV9SVFMpCgkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9SVFNfSElHSDsKCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1QsIAoJCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkgICAgICAgdXJiX3ZhbHVlLCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKCglrZnJlZShidWYpOwoJaWYgKHJ2IDwgMCkgewoJCWVycigiJXMgRXJyb3IgZnJvbSBNT0RFTV9DVFJMIHVyYjogRFRSICVzLCBSVFMgJXMiLAoJCQkJX19GVU5DVElPTl9fLAoJCQkJKHNldCAmIFRJT0NNX0RUUikgPyAiSElHSCIgOgoJCQkJKGNsZWFyICYgVElPQ01fRFRSKSA/ICJMT1ciIDogInVuY2hhbmdlZCIsCgkJCQkoc2V0ICYgVElPQ01fUlRTKSA/ICJISUdIIiA6CgkJCQkoY2xlYXIgJiBUSU9DTV9SVFMpID8gIkxPVyIgOiAidW5jaGFuZ2VkIik7Cgl9IGVsc2UgewoJCWRiZygiJXMgLSBEVFIgJXMsIFJUUyAlcyIsIF9fRlVOQ1RJT05fXywKCQkJCShzZXQgJiBUSU9DTV9EVFIpID8gIkhJR0giIDoKCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLAoJCQkJKHNldCAmIFRJT0NNX1JUUykgPyAiSElHSCIgOgoJCQkJKGNsZWFyICYgVElPQ01fUlRTKSA/ICJMT1ciIDogInVuY2hhbmdlZCIpOwoJCXByaXYtPmxhc3RfZHRyX3J0cyA9IChwcml2LT5sYXN0X2R0cl9ydHMgJiB+Y2xlYXIpIHwgc2V0OwoJfQoJcmV0dXJuIHJ2Owp9CgoKc3RhdGljIF9fdTMyIGdldF9mdGRpX2Rpdmlzb3Ioc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQpOwoKCnN0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgljaGFyICpidWY7CiAgICAgICAgX191MTYgdXJiX3ZhbHVlOwoJX191MTYgdXJiX2luZGV4OwoJX191MzIgdXJiX2luZGV4X3ZhbHVlOwoJaW50IHJ2OwoKCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOwoJaWYgKCFidWYpCgkJcmV0dXJuIC1FTk9NRU07CgoJdXJiX2luZGV4X3ZhbHVlID0gZ2V0X2Z0ZGlfZGl2aXNvcihwb3J0KTsKCXVyYl92YWx1ZSA9IChfX3UxNil1cmJfaW5kZXhfdmFsdWU7Cgl1cmJfaW5kZXggPSAoX191MTYpKHVyYl9pbmRleF92YWx1ZSA+PiAxNik7CglpZiAocHJpdi0+aW50ZXJmYWNlKSB7CS8qIEZUMjIzMkMgKi8KCQl1cmJfaW5kZXggPSAoX191MTYpKCh1cmJfaW5kZXggPDwgOCkgfCBwcml2LT5pbnRlcmZhY2UpOwoJfQoJCglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfQkFVRFJBVEVfUkVRVUVTVCwKCQkJICAgIEZURElfU0lPX1NFVF9CQVVEUkFURV9SRVFVRVNUX1RZUEUsCgkJCSAgICB1cmJfdmFsdWUsIHVyYl9pbmRleCwKCQkJICAgIGJ1ZiwgMCwgV0RSX1NIT1JUX1RJTUVPVVQpOwoKCWtmcmVlKGJ1Zik7CglyZXR1cm4gcnY7Cn0KCgpzdGF0aWMgX191MzIgZ2V0X2Z0ZGlfZGl2aXNvcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICogcG9ydCkKeyAvKiBnZXRfZnRkaV9kaXZpc29yICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJX191MzIgZGl2X3ZhbHVlID0gMDsKCWludCBkaXZfb2theSA9IDE7CglpbnQgYmF1ZDsKCgkvKgoJICogVGhlIGxvZ2ljIGludm9sdmVkIGluIHNldHRpbmcgdGhlIGJhdWRyYXRlIGNhbiBiZSBjbGVhbmx5IHNwbGl0IGluIDMgc3RlcHMuCgkgKiBPYnRhaW5pbmcgdGhlIGFjdHVhbCBiYXVkIHJhdGUgaXMgYSBsaXR0bGUgdHJpY2t5IHNpbmNlIHVuaXggdHJhZGl0aW9uYWxseQoJICogc29tZWhvdyBpZ25vcmVkIHRoZSBwb3NzaWJpbGl0eSB0byBzZXQgbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZXMuCgkgKiAxLiBTdGFuZGFyZCBiYXVkIHJhdGVzIGFyZSBzZXQgaW4gdHR5LT50ZXJtaW9zLT5jX2NmbGFnCgkgKiAyLiBJZiB0aGVzZSBhcmUgbm90IGVub3VnaCwgeW91IGNhbiBzZXQgYW55IHNwZWVkIHVzaW5nIGFsdF9zcGVlZCBhcyBmb2xsb3dzOgoJICogICAgLSBzZXQgdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHNwZWVkIHRvIEIzODQwMAoJICogICAgLSBzZXQgeW91ciByZWFsIHNwZWVkIGluIHR0eS0+YWx0X3NwZWVkOyBpdCBnZXRzIGlnbm9yZWQgd2hlbgoJICogICAgICBhbHRfc3BlZWQ9PTAsIChvcikKCSAqICAgIC0gY2FsbCBUSU9DU1NFUklBTCBpb2N0bCB3aXRoIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkgc2V0IGFzIGZvbGxvd3M6CgkgKiAgICAgIGZsYWdzICYgQVNZTkNfU1BEX01BU0sgPT0gQVNZTkNfU1BEX1tISSwgVkhJLCBTSEksIFdBUlBdLCB0aGlzIGp1c3QKCSAqICAgICAgc2V0cyBhbHRfc3BlZWQgdG8gKEhJOiA1NzYwMCwgVkhJOiAxMTUyMDAsIFNISTogMjMwNDAwLCBXQVJQOiA0NjA4MDApCgkgKiAqKiBTdGVwcyAxLCAyIGFyZSBkb25lIGNvdXJ0ZXN5IG9mIHR0eV9nZXRfYmF1ZF9yYXRlCgkgKiAzLiBZb3UgY2FuIGFsc28gc2V0IGJhdWQgcmF0ZSBieSBzZXR0aW5nIGN1c3RvbSBkaXZpc29yIGFzIGZvbGxvd3MKCSAqICAgIC0gc2V0IHR0eS0+dGVybWlvcy0+Y19jZmxhZyBzcGVlZCB0byBCMzg0MDAKCSAqICAgIC0gY2FsbCBUSU9DU1NFUklBTCBpb2N0bCB3aXRoIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkgc2V0IGFzIGZvbGxvd3M6CgkgKiAgICAgIG8gZmxhZ3MgJiBBU1lOQ19TUERfTUFTSyA9PSBBU1lOQ19TUERfQ1VTVAoJICogICAgICBvIGN1c3RvbV9kaXZpc29yIHNldCB0byBiYXVkX2Jhc2UgLyB5b3VyX25ld19iYXVkcmF0ZQoJICogKiogU3RlcCAzIGlzIGRvbmUgY291cnRlc3kgb2YgY29kZSBib3Jyb3dlZCBmcm9tIHNlcmlhbC5jIC0gSSBzaG91bGQgcmVhbGx5CgkgKiAgICBzcGVuZCBzb21lIHRpbWUgYW5kIHNlcGFyYXRlK21vdmUgdGhpcyBjb21tb24gY29kZSB0byBzZXJpYWwuYywgaXQgaXMKCSAqICAgIHJlcGxpY2F0ZWQgaW4gbmVhcmx5IGV2ZXJ5IHNlcmlhbCBkcml2ZXIgeW91IHNlZS4KCSAqLwoKCS8qIDEuIEdldCB0aGUgYmF1ZCByYXRlIGZyb20gdGhlIHR0eSBzZXR0aW5ncywgdGhpcyBvYnNlcnZlcyBhbHRfc3BlZWQgaGFjayAqLwoKCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOwoJZGJnKCIlcyAtIHR0eV9nZXRfYmF1ZF9yYXRlIHJlcG9ydHMgc3BlZWQgJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOwoKCS8qIDIuIE9ic2VydmUgYXN5bmMtY29tcGF0aWJsZSBjdXN0b21fZGl2aXNvciBoYWNrLCB1cGRhdGUgYmF1ZHJhdGUgaWYgbmVlZGVkICovCgoJaWYgKGJhdWQgPT0gMzg0MDAgJiYKCSAgICAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSAmJgoJICAgICAocHJpdi0+Y3VzdG9tX2Rpdmlzb3IpKSB7CgkJYmF1ZCA9IHByaXYtPmJhdWRfYmFzZSAvIHByaXYtPmN1c3RvbV9kaXZpc29yOwoJCWRiZygiJXMgLSBjdXN0b20gZGl2aXNvciAlZCBzZXRzIGJhdWQgcmF0ZSB0byAlZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y3VzdG9tX2Rpdmlzb3IsIGJhdWQpOwoJfQoKCS8qIDMuIENvbnZlcnQgYmF1ZHJhdGUgdG8gZGV2aWNlLXNwZWNpZmljIGRpdmlzb3IgKi8KCglpZiAoIWJhdWQpIGJhdWQgPSA5NjAwOwkKCXN3aXRjaChwcml2LT5jaGlwX3R5cGUpIHsKCWNhc2UgU0lPOiAvKiBTSU8gY2hpcCAqLwoJCXN3aXRjaChiYXVkKSB7CgkJY2FzZSAzMDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IzMDA7IGJyZWFrOwoJCWNhc2UgNjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iNjAwOyBicmVhazsKCQljYXNlIDEyMDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IxMjAwOyBicmVhazsKCQljYXNlIDI0MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IyNDAwOyBicmVhazsKCQljYXNlIDQ4MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I0ODAwOyBicmVhazsKCQljYXNlIDk2MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I5NjAwOyBicmVhazsKCQljYXNlIDE5MjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMTkyMDA7IGJyZWFrOwoJCWNhc2UgMzg0MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IzODQwMDsgYnJlYWs7CgkJY2FzZSA1NzYwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjU3NjAwOyAgYnJlYWs7CgkJY2FzZSAxMTUyMDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IxMTUyMDA7IGJyZWFrOwoJCX0gLyogYmF1ZCAqLwoJCWlmIChkaXZfdmFsdWUgPT0gMCkgewogIAkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I5NjAwOwoJCQlkaXZfb2theSA9IDA7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDhVMjMyQU06IC8qIDhVMjMyQU0gY2hpcCAqLwoJCWlmIChiYXVkIDw9IDMwMDAwMDApIHsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IoYmF1ZCk7CgkJfSBlbHNlIHsKCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fRlVOQ1RJT05fXyk7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKDk2MDApOwoJCQlkaXZfb2theSA9IDA7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDIzMkJNOiAvKiBGVDIzMkJNIGNoaXAgKi8KCWNhc2UgRlQyMjMyQzogLyogRlQyMjMyQyBjaGlwICovCgkJaWYgKGJhdWQgPD0gMzAwMDAwMCkgewoJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKCQl9IGVsc2UgewoJICAgICAgICAgICAgICAgIGRiZygiJXMgLSBCYXVkIHJhdGUgdG9vIGhpZ2ghIiwgX19GVU5DVElPTl9fKTsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IoOTYwMCk7CgkJCWRpdl9va2F5ID0gMDsKCQl9CgkJYnJlYWs7Cgl9IC8qIHByaXYtPmNoaXBfdHlwZSAqLwoKCWlmIChkaXZfb2theSkgewoJCWRiZygiJXMgLSBCYXVkIHJhdGUgc2V0IHRvICVkIChkaXZpc29yIDB4JWxYKSBvbiBjaGlwICVzIiwKCQkJX19GVU5DVElPTl9fLCBiYXVkLCAodW5zaWduZWQgbG9uZylkaXZfdmFsdWUsCgkJCWZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwoJfQoKCXJldHVybihkaXZfdmFsdWUpOwp9CgoKc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CgoJaWYgKCFyZXRpbmZvKQoJCXJldHVybiAtRUZBVUxUOwoJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKCXRtcC5mbGFncyA9IHByaXYtPmZsYWdzOwoJdG1wLmJhdWRfYmFzZSA9IHByaXYtPmJhdWRfYmFzZTsKCXRtcC5jdXN0b21fZGl2aXNvciA9IHByaXYtPmN1c3RvbV9kaXZpc29yOwoJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9IC8qIGdldF9zZXJpYWxfaW5mbyAqLwoKCnN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiBwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdpbmZvKQp7IC8qIHNldF9zZXJpYWxfaW5mbyAqLwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CglzdHJ1Y3QgZnRkaV9wcml2YXRlIG9sZF9wcml2OwoKCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3aW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCW9sZF9wcml2ID0gKiBwcml2OwoKCS8qIERvIGVycm9yIGNoZWNraW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nICovCgoJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkJaWYgKCgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KCQkgICAgIChwcml2LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQoJCQlyZXR1cm4gLUVQRVJNOwoJCXByaXYtPmZsYWdzID0gKChwcml2LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAoJCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOwoJCXByaXYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKCQlnb3RvIGNoZWNrX2FuZF9leGl0OwoJfQoKCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gcHJpdi0+YmF1ZF9iYXNlKSAmJgoJICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSA8IDk2MDApKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIE1ha2UgdGhlIGNoYW5nZXMgLSB0aGVzZSBhcmUgcHJpdmlsZWdlZCBjaGFuZ2VzISAqLwoKCXByaXYtPmZsYWdzID0gKChwcml2LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAoJICAgICAgICAgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwkKCXByaXYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKCglwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CgpjaGVja19hbmRfZXhpdDoKCWlmICgob2xkX3ByaXYuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KCSAgICAgKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB7CgkJaWYgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CgkJZWxzZSBpZiAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOwoJCWVsc2UgaWYgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKCQllbHNlIGlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOwoJCWVsc2UKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSAwOwoJfQoJaWYgKCgob2xkX3ByaXYuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KCSAgICAgKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB8fAoJICAgICgoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSAmJgoJICAgICAob2xkX3ByaXYuY3VzdG9tX2Rpdmlzb3IgIT0gcHJpdi0+Y3VzdG9tX2Rpdmlzb3IpKSkgewoJCWNoYW5nZV9zcGVlZChwb3J0KTsKCX0KCQoJcmV0dXJuICgwKTsKCn0gLyogc2V0X3NlcmlhbF9pbmZvICovCgoKLyogRGV0ZXJtaW5lIHR5cGUgb2YgRlRESSBjaGlwIGJhc2VkIG9uIFVTQiBjb25maWcgYW5kIGRlc2NyaXB0b3IuICovCnN0YXRpYyB2b2lkIGZ0ZGlfZGV0ZXJtaW5lX3R5cGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OwoJdW5zaWduZWQgdmVyc2lvbjsKCXVuc2lnbmVkIGludGVyZmFjZXM7CgoJLyogQXNzdW1lIGl0IGlzIG5vdCB0aGUgb3JpZ2luYWwgU0lPIGRldmljZSBmb3Igbm93LiAqLwoJcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOwoJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMDsKCgl2ZXJzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwoJaW50ZXJmYWNlcyA9IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsKCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCgkJCXZlcnNpb24sIGludGVyZmFjZXMpOwoJaWYgKGludGVyZmFjZXMgPiAxKSB7CgkJaW50IGludGVyOwoKCQkvKiBNdWx0aXBsZSBpbnRlcmZhY2VzLiAgQXNzdW1lIEZUMjIzMkMuICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMjMyQzsKCQkvKiBEZXRlcm1pbmUgaW50ZXJmYWNlIGNvZGUuICovCgkJaW50ZXIgPSBzZXJpYWwtPmludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwoJCWlmIChpbnRlciA9PSAwKSB7CgkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9BOwoJCX0gZWxzZSB7CgkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COwoJCX0KCQkvKiBCTS10eXBlIGRldmljZXMgaGF2ZSBhIGJ1ZyB3aGVyZSBiY2REZXZpY2UgZ2V0cyBzZXQKCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCgkJaWYgKHZlcnNpb24gPCAweDUwMCkgewoJCQlkYmcoIiVzOiBzb21ldGhpbmcgZmlzaHkgLSBiY2REZXZpY2UgdG9vIGxvdyBmb3IgbXVsdGktaW50ZXJmYWNlIGRldmljZSIsCgkJCQkJX19GVU5DVElPTl9fKTsKCQl9Cgl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDIwMCkgewoJCS8qIE9sZCBkZXZpY2UuICBBc3N1bWUgaXRzIHRoZSBvcmlnaW5hbCBTSU8uICovCgkJcHJpdi0+Y2hpcF90eXBlID0gU0lPOwoJCXByaXYtPmJhdWRfYmFzZSA9IDEyMDAwMDAwIC8gMTY7CgkJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMTsKCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4NDAwKSB7CgkJLyogQXNzdW1lIGl0cyBhbiBGVDhVMjMyQU0gKG9yIEZUOFUyNDVBTSkgKi8KCQkvKiAoSXQgbWlnaHQgYmUgYSBCTSBiZWNhdXNlIG9mIHRoZSBpU2VyaWFsTnVtYmVyIGJ1ZywKCQkgKiBidXQgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGFuIEFNIGRldmljZS4pICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQ4VTIzMkFNOwoJfSBlbHNlIHsKCQkvKiBBc3N1bWUgaXRzIGFuIEZUMjMyQk0gKG9yIEZUMjQ1Qk0pICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKCX0KCWluZm8oIkRldGVjdGVkICVzIiwgZnRkaV9jaGlwX25hbWVbcHJpdi0+Y2hpcF90eXBlXSk7Cn0KCgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3lzZnMgQXR0cmlidXRlCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyBzc2l6ZV90IHNob3dfbGF0ZW5jeV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0b191c2Jfc2VyaWFsX3BvcnQoZGV2KTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCXVuc2lnbmVkIHNob3J0IGxhdGVuY3kgPSAwOwoJaW50IHJ2ID0gMDsKCQoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCQoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKCQoJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKCQkJICAgICB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCgkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKCQkJICAgICBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUl9SRVFVRVNUX1RZUEUsCgkJCSAgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKCQkJICAgICAoY2hhciopICZsYXRlbmN5LCAxLCBXRFJfVElNRU9VVCk7CgkKCWlmIChydiA8IDApIHsKCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWFkIGxhdGVuY3kgdGltZXI6ICVpIiwgcnYpOwoJCXJldHVybiAtRUlPOwoJfQoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIGxhdGVuY3kpOwp9CgovKiBXcml0ZSBhIG5ldyB2YWx1ZSBvZiB0aGUgbGF0ZW5jeSB0aW1lciwgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9sYXRlbmN5X3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnZhbGJ1ZiwKCQkJCSAgIHNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoJY2hhciBidWZbMV07CglpbnQgdiA9IHNpbXBsZV9zdHJ0b3VsKHZhbGJ1ZiwgTlVMTCwgMTApOwoJaW50IHJ2ID0gMDsKCQoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCQoJZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOwoJCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19TRVRfTEFURU5DWV9USU1FUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsIAoJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoJCglpZiAocnYgPCAwKSB7CgkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gd3JpdGUgbGF0ZW5jeSB0aW1lcjogJWkiLCBydik7CgkJcmV0dXJuIC1FSU87Cgl9CgkKCXJldHVybiBjb3VudDsKfQoKLyogV3JpdGUgYW4gZXZlbnQgY2hhcmFjdGVyIGRpcmVjdGx5IHRvIHRoZSBGVERJIHJlZ2lzdGVyLiAgVGhlIEFTQ0lJCiAgIHZhbHVlIGlzIGluIHRoZSBsb3cgOCBiaXRzLCB3aXRoIHRoZSBlbmFibGUgYml0IGluIHRoZSA5dGggYml0LiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudF9jaGFyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnZhbGJ1ZiwKCQkJCXNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoJY2hhciBidWZbMV07CglpbnQgdiA9IHNpbXBsZV9zdHJ0b3VsKHZhbGJ1ZiwgTlVMTCwgMTApOwoJaW50IHJ2ID0gMDsKCQoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCQoJZGJnKCIlczogc2V0dGluZyBldmVudCBjaGFyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOwoJCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19TRVRfRVZFTlRfQ0hBUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX1NFVF9FVkVOVF9DSEFSX1JFUVVFU1RfVFlQRSwKCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsIAoJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoJCglpZiAocnYgPCAwKSB7CgkJZGJnKCJVbmFibGUgdG8gd3JpdGUgZXZlbnQgY2hhcmFjdGVyOiAlaSIsIHJ2KTsKCQlyZXR1cm4gLUVJTzsKCX0KCQoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIobGF0ZW5jeV90aW1lciwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGF0ZW5jeV90aW1lciwgc3RvcmVfbGF0ZW5jeV90aW1lcik7CnN0YXRpYyBERVZJQ0VfQVRUUihldmVudF9jaGFyLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9ldmVudF9jaGFyKTsKCnN0YXRpYyB2b2lkIGNyZWF0ZV9zeXNmc19hdHRycyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CQoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgkKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXVkZXYgPSBzZXJpYWwtPmRldjsKCQoJLyogWFhYIEkndmUgbm8gaWRlYSBpZiB0aGUgb3JpZ2luYWwgU0lPIHN1cHBvcnRzIHRoZSBldmVudF9jaGFyCgkgKiBzeXNmcyBwYXJhbWV0ZXIsIHNvIEknbSBwbGF5aW5nIGl0IHNhZmUuICAqLwoJaWYgKHByaXYtPmNoaXBfdHlwZSAhPSBTSU8pIHsKCQlkYmcoInN5c2ZzIGF0dHJpYnV0ZXMgZm9yICVzIiwgZnRkaV9jaGlwX25hbWVbcHJpdi0+Y2hpcF90eXBlXSk7CgkJZGV2aWNlX2NyZWF0ZV9maWxlKCZ1ZGV2LT5kZXYsICZkZXZfYXR0cl9ldmVudF9jaGFyKTsKCQlpZiAocHJpdi0+Y2hpcF90eXBlID09IEZUMjMyQk0gfHwgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMpIHsKCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZ1ZGV2LT5kZXYsICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIHJlbW92ZV9zeXNmc19hdHRycyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CgoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsJCgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwoJdWRldiA9IHNlcmlhbC0+ZGV2OwoJCgkvKiBYWFggc2VlIGNyZWF0ZV9zeXNmc19hdHRycyAqLwoJaWYgKHByaXYtPmNoaXBfdHlwZSAhPSBTSU8pIHsKCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2V2ZW50X2NoYXIpOwoJCWlmIChwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJCTSB8fCBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQykgewoJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2xhdGVuY3lfdGltZXIpOwoJCX0KCX0KCQp9CgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRlRESSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb25zCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCi8qIFByb2JlIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBzcGVjaWFsIGRldmljZXMgKi8Kc3RhdGljIGludCBmdGRpX3Npb19wcm9iZSAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7Cgl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgKHZvaWQgKilpZC0+ZHJpdmVyX2luZm8pOwoKCXJldHVybiAoMCk7Cn0KCi8qIGF0dGFjaCBzdWJyb3V0aW5lICovCnN0YXRpYyBpbnQgZnRkaV9zaW9fYXR0YWNoIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCXN0cnVjdCBmdGRpX3Npb19xdWlyayAqcXVpcms7CgkKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdGRpX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKCWlmICghcHJpdil7CgkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CgoJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJ4X2xvY2spOwogICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKCS8qIFRoaXMgd2lsbCBwdXNoIHRoZSBjaGFyYWN0ZXJzIHRocm91Z2ggaW1tZWRpYXRlbHkgcmF0aGVyCgkgICB0aGFuIHF1ZXVlIGEgdGFzayB0byBkZWxpdmVyIHRoZW0gKi8KCXByaXYtPmZsYWdzID0gQVNZTkNfTE9XX0xBVEVOQ1k7CgoJLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgcmVhZCBidWZmZXJzICovCglrZnJlZShwb3J0LT5idWxrX2luX2J1ZmZlcik7Cglwb3J0LT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MgKEJVRlNaLCBHRlBfS0VSTkVMKTsKCWlmICghcG9ydC0+YnVsa19pbl9idWZmZXIpIHsKCQlrZnJlZSAocHJpdik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglpZiAocG9ydC0+cmVhZF91cmIpIHsKCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gcG9ydC0+YnVsa19pbl9idWZmZXI7CgkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBCVUZTWjsKCX0KCglJTklUX1dPUksoJnByaXYtPnJ4X3dvcmssIGZ0ZGlfcHJvY2Vzc19yZWFkLCBwb3J0KTsKCgkvKiBGcmVlIHBvcnQncyBleGlzdGluZyB3cml0ZSB1cmIgYW5kIHRyYW5zZmVyIGJ1ZmZlci4gKi8KCWlmIChwb3J0LT53cml0ZV91cmIpIHsKCQl1c2JfZnJlZV91cmIgKHBvcnQtPndyaXRlX3VyYik7CgkJcG9ydC0+d3JpdGVfdXJiID0gTlVMTDsKCX0KCWtmcmVlKHBvcnQtPmJ1bGtfb3V0X2J1ZmZlcik7Cglwb3J0LT5idWxrX291dF9idWZmZXIgPSBOVUxMOwoKCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOwoKCWZ0ZGlfZGV0ZXJtaW5lX3R5cGUgKHNlcmlhbC0+cG9ydFswXSk7CgljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKCgkvKiBDaGVjayBmb3IgZGV2aWNlIHJlcXVpcmluZyBzcGVjaWFsIHNldCB1cC4gKi8KCXF1aXJrID0gKHN0cnVjdCBmdGRpX3Npb19xdWlyayAqKXVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKCWlmIChxdWlyayAmJiBxdWlyay0+c2V0dXApIHsKCQlxdWlyay0+c2V0dXAoc2VyaWFsKTsKCX0KCQoJcmV0dXJuICgwKTsKfSAvKiBmdGRpX3Npb19hdHRhY2ggKi8KCgovKiBTZXR1cCBmb3IgdGhlIFVTQi1VSVJUIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkCiAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAzMTI1MDApICovCi8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8Kc3RhdGljIHZvaWQgZnRkaV9VU0JfVUlSVF9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSA3NzsKCXByaXYtPmZvcmNlX2JhdWQgPSBCMzg0MDA7Cn0gLyogZnRkaV9VU0JfVUlSVF9zZXR1cCAqLwoKLyogU2V0dXAgZm9yIHRoZSBIRS1USVJBMSBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAogKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMTAwMDAwKSBhbmQgUlRTLUNUUyBlbmFibGVkLiAgKi8Kc3RhdGljIHZvaWQgZnRkaV9IRV9USVJBMV9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSAyNDA7Cglwcml2LT5mb3JjZV9iYXVkID0gQjM4NDAwOwoJcHJpdi0+Zm9yY2VfcnRzY3RzID0gMTsKfSAvKiBmdGRpX0hFX1RJUkExX3NldHVwICovCgoKLyogZnRkaV9zaHV0ZG93biBpcyBjYWxsZWQgZnJvbSB1c2JzZXJpYWw6dXNiX3NlcmlhbF9kaXNjb25uZWN0IAogKiAgIGl0IGlzIGNhbGxlZCB3aGVuIHRoZSB1c2IgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZAogKgogKiAgIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKICogICAgICBjYWxscyBfX3NlcmlhbF9jbG9zZSBmb3IgZWFjaCBvcGVuIG9mIHRoZSBwb3J0CiAqICAgICAgc2h1dGRvd24gaXMgY2FsbGVkIHRoZW4gKGllIGZ0ZGlfc2h1dGRvd24pCiAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV9zaHV0ZG93biAqLwoJCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCglyZW1vdmVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKCQoJLyogYWxsIG9wZW4gcG9ydHMgYXJlIGNsb3NlZCBhdCB0aGlzIHBvaW50IAogICAgICAgICAqICAgIChieSB1c2JzZXJpYWwuYzpfX3NlcmlhbF9jbG9zZSwgd2hpY2ggY2FsbHMgZnRkaV9jbG9zZSkgIAoJICovCgoJaWYgKHByaXYpIHsKCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgTlVMTCk7CgkJa2ZyZWUocHJpdik7Cgl9Cn0gLyogZnRkaV9zaHV0ZG93biAqLwoKCnN0YXRpYyBpbnQgIGZ0ZGlfb3BlbiAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCnsgLyogZnRkaV9vcGVuICovCglzdHJ1Y3QgdGVybWlvcyB0bXBfdGVybWlvczsKCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglpbnQgcmVzdWx0ID0gMDsKCWNoYXIgYnVmWzFdOyAvKiBOZWVkZWQgZm9yIHRoZSB1c2JfY29udHJvbF9tc2cgSSB0aGluayAqLwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCglwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CgoJLyogTm8gZXJyb3IgY2hlY2tpbmcgZm9yIHRoaXMgKHdpbGwgZ2V0IGVycm9ycyBsYXRlciBhbnl3YXkpICovCgkvKiBTZWUgZnRkaV9zaW8uaCBmb3IgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcyByZXNldCAqLwoJdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCUZURElfU0lPX1JFU0VUX1JFUVVFU1QsIEZURElfU0lPX1JFU0VUX1JFUVVFU1RfVFlQRSwgCgkJCUZURElfU0lPX1JFU0VUX1NJTywgCgkJCXByaXYtPmludGVyZmFjZSwgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJLyogVGVybWlvcyBkZWZhdWx0cyBhcmUgc2V0IGJ5IHVzYl9zZXJpYWxfaW5pdC4gV2UgZG9uJ3QgY2hhbmdlCgkgICBwb3J0LT50dHktPnRlcm1pb3MgLSB0aGlzIHdvdWxkIGxvb3NlIHNwZWVkIHNldHRpbmdzLCBldGMuCgkgICBUaGlzIGlzIHNhbWUgYmVoYXZpb3VyIGFzIHNlcmlhbC5jL3JzX29wZW4oKSAtIEt1YmEgKi8KCgkvKiBmdGRpX3NldF90ZXJtaW9zICB3aWxsIHNlbmQgdXNiIGNvbnRyb2wgbWVzc2FnZXMgKi8KCWZ0ZGlfc2V0X3Rlcm1pb3MocG9ydCwgJnRtcF90ZXJtaW9zKTsKCgkvKiBGSVhNRTogRmxvdyBjb250cm9sIG1pZ2h0IGJlIGVuYWJsZWQsIHNvIGl0IHNob3VsZCBiZSBjaGVja2VkIC0KCSAgIHdlIGhhdmUgbm8gY29udHJvbCBvZiBkZWZhdWx0cyEgKi8KCS8qIFR1cm4gb24gUlRTIGFuZCBEVFIgc2luY2Ugd2UgYXJlIG5vdCBmbG93IGNvbnRyb2xsaW5nIGJ5IGRlZmF1bHQgKi8KCXNldF9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwoKCS8qIE5vdCB0aHJvdHRsZWQgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KCXByaXYtPnJ4X3Byb2Nlc3NlZCA9IDA7Cgl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgZGV2LAoJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKCQkgICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CglyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CglpZiAocmVzdWx0KQoJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CgoKCXJldHVybiByZXN1bHQ7Cn0gLyogZnRkaV9vcGVuICovCgoKCi8qIAogKiB1c2JzZXJpYWw6X19zZXJpYWxfY2xvc2UgIG9ubHkgY2FsbHMgZnRkaV9jbG9zZSBpZiB0aGUgcG9pbnQgaXMgb3BlbgogKgogKiAgIFRoaXMgb25seSBnZXRzIGNhbGxlZCB3aGVuIGl0IGlzIHRoZSBsYXN0IGNsb3NlCiAqICAgCiAqICAgCiAqLwoKc3RhdGljIHZvaWQgZnRkaV9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCnsgLyogZnRkaV9jbG9zZSAqLwoJdW5zaWduZWQgaW50IGNfY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciBidWZbMV07CgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CgoJaWYgKGNfY2ZsYWcgJiBIVVBDTCl7CgkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KCQlpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKCQkJCSAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsIGJ1ZiwgMCwKCQkJCSAgICBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCWVycigiZXJyb3IgZnJvbSBmbG93Y29udHJvbCB1cmIiKTsKCQl9CSAgICAKCgkJLyogZHJvcCBSVFMgYW5kIERUUiAqLwoJCWNsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Cgl9IC8qIE5vdGUgY2hhbmdlIG5vIGxpbmUgaWYgaHVwY2wgaXMgb2ZmICovCgoJLyogY2FuY2VsIGFueSBzY2hlZHVsZWQgcmVhZGluZyAqLwoJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yayk7CglmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoJCgkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkICovCglpZiAocG9ydC0+cmVhZF91cmIpCgkJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKfSAvKiBmdGRpX2Nsb3NlICovCgoKICAKLyogVGhlIFNJTyByZXF1aXJlcyB0aGUgZmlyc3QgYnl0ZSB0byBoYXZlOgogKiAgQjAgMQogKiAgQjEgMAogKiAgQjIuLjcgbGVuZ3RoIG9mIG1lc3NhZ2UgZXhjbHVkaW5nIGJ5dGUgMAogKgogKiBUaGUgbmV3IGRldmljZXMgZG8gbm90IHJlcXVpcmUgdGhpcyBieXRlCiAqLwpzdGF0aWMgaW50IGZ0ZGlfd3JpdGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCgkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQp7IC8qIGZ0ZGlfd3JpdGUgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXJiICp1cmI7Cgl1bnNpZ25lZCBjaGFyICpidWZmZXI7CglpbnQgZGF0YV9vZmZzZXQgOyAgICAgICAvKiB3aWxsIGJlIDEgZm9yIHRoZSBTSU8gYW5kIDAgb3RoZXJ3aXNlICovCglpbnQgc3RhdHVzOwoJaW50IHRyYW5zZmVyX3NpemU7CgoJZGJnKCIlcyBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CgoJaWYgKGNvdW50ID09IDApIHsKCQlkYmcoIndyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIpOwoJCXJldHVybiAwOwoJfQoJCglkYXRhX29mZnNldCA9IHByaXYtPndyaXRlX29mZnNldDsKICAgICAgICBkYmcoImRhdGFfb2Zmc2V0IHNldCB0byAlZCIsZGF0YV9vZmZzZXQpOwoKCS8qIERldGVybWluZSB0b3RhbCB0cmFuc2ZlciBzaXplICovCgl0cmFuc2Zlcl9zaXplID0gY291bnQ7CglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogT3JpZ2luYWwgc2lvIG5lZWRzIGNvbnRyb2wgYnl0ZXMgdG9vLi4uICovCgkJdHJhbnNmZXJfc2l6ZSArPSAoZGF0YV9vZmZzZXQgKgoJCQkJKChjb3VudCArIChQS1RTWiAtIDEgLSBkYXRhX29mZnNldCkpIC8KCQkJCSAoUEtUU1ogLSBkYXRhX29mZnNldCkpKTsKCX0KCglidWZmZXIgPSBrbWFsbG9jICh0cmFuc2Zlcl9zaXplLCBHRlBfQVRPTUlDKTsKCWlmICghYnVmZmVyKSB7CgkJZXJyKCIlcyByYW4gb3V0IG9mIGtlcm5lbCBtZW1vcnkgZm9yIHVyYiAuLi4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CglpZiAoIXVyYikgewoJCWVycigiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUgKGJ1ZmZlcik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLyogQ29weSBkYXRhICovCglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogT3JpZ2luYWwgc2lvIHJlcXVpcmVzIGNvbnRyb2wgYnl0ZSBhdCBzdGFydCBvZiBlYWNoIHBhY2tldC4gKi8KCQlpbnQgdXNlcl9wa3RzeiA9IFBLVFNaIC0gZGF0YV9vZmZzZXQ7CgkJaW50IHRvZG8gPSBjb3VudDsKCQl1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlID0gYnVmZmVyOwoJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcG9zaXRpb24gPSBidWY7CgoJCXdoaWxlICh0b2RvID4gMCkgewoJCQlpZiAodXNlcl9wa3RzeiA+IHRvZG8pIHsKCQkJCXVzZXJfcGt0c3ogPSB0b2RvOwoJCQl9CgkJCS8qIFdyaXRlIHRoZSBjb250cm9sIGJ5dGUgYXQgdGhlIGZyb250IG9mIHRoZSBwYWNrZXQqLwoJCQkqZmlyc3RfYnl0ZSA9IDEgfCAoKHVzZXJfcGt0c3opIDw8IDIpOyAKCQkJLyogQ29weSBkYXRhIGZvciBwYWNrZXQgKi8KCQkJbWVtY3B5IChmaXJzdF9ieXRlICsgZGF0YV9vZmZzZXQsCgkJCQljdXJyZW50X3Bvc2l0aW9uLCB1c2VyX3BrdHN6KTsKCQkJZmlyc3RfYnl0ZSArPSB1c2VyX3BrdHN6ICsgZGF0YV9vZmZzZXQ7CgkJCWN1cnJlbnRfcG9zaXRpb24gKz0gdXNlcl9wa3RzejsKCQkJdG9kbyAtPSB1c2VyX3BrdHN6OwoJCX0KCX0gZWxzZSB7CgkJLyogTm8gY29udHJvbCBieXRlIHJlcXVpcmVkLiAqLwoJCS8qIENvcHkgaW4gdGhlIGRhdGEgdG8gc2VuZCAqLwoJCW1lbWNweSAoYnVmZmVyLCBidWYsIGNvdW50KTsKCX0KCgl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdHJhbnNmZXJfc2l6ZSwgYnVmZmVyKTsKCgkvKiBmaWxsIHRoZSBidWZmZXIgYW5kIHNlbmQgaXQgKi8KCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcG9ydC0+c2VyaWFsLT5kZXYsIAoJCSAgICAgIHVzYl9zbmRidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSwKCQkgICAgICBidWZmZXIsIHRyYW5zZmVyX3NpemUsCgkJICAgICAgZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLCBwb3J0KTsKCglzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwoJaWYgKHN0YXR1cykgewoJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwoJCWNvdW50ID0gc3RhdHVzOwoJCWtmcmVlIChidWZmZXIpOwoJfQoKCS8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyB1cmIsIHNvIGxldCB0aGUgaG9zdCBkcml2ZXIKCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLwoJdXNiX2ZyZWVfdXJiICh1cmIpOwoKCWRiZygiJXMgd3JpdGUgcmV0dXJuaW5nOiAlZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOwoJcmV0dXJuIGNvdW50Owp9IC8qIGZ0ZGlfd3JpdGUgKi8KCgovKiBUaGlzIGZ1bmN0aW9uIG1heSBnZXQgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBjbG9zZWQgKi8KCnN0YXRpYyB2b2lkIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwoKCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLwoJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCQoJaWYgKHVyYi0+c3RhdHVzKSB7CgkJZGJnKCJub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIHVyYi0+c3RhdHVzKTsKCQlyZXR1cm47Cgl9CgoJc2NoZWR1bGVfd29yaygmcG9ydC0+d29yayk7Cn0gLyogZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrICovCgoKc3RhdGljIGludCBmdGRpX3dyaXRlX3Jvb20oIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKQp7CglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCgkvKgoJICogV2UgcmVhbGx5IGNhbiB0YWtlIGFueXRoaW5nIHRoZSB1c2VyIHRocm93cyBhdCB1cwoJICogYnV0IGxldCdzIHBpY2sgYSBuaWNlIGJpZyBudW1iZXIgdG8gdGVsbCB0aGUgdHR5CgkgKiBsYXllciB0aGF0IHdlIGhhdmUgbG90cyBvZiBmcmVlIHNwYWNlCgkgKi8KCXJldHVybiAyMDQ4Owp9IC8qIGZ0ZGlfd3JpdGVfcm9vbSAqLwoKCnN0YXRpYyBpbnQgZnRkaV9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsgLyogZnRkaV9jaGFyc19pbl9idWZmZXIgKi8KCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCS8qIAoJICogV2UgY2FuJ3QgcmVhbGx5IGFjY291bnQgZm9yIGhvdyBtdWNoIGRhdGEgd2UKCSAqIGhhdmUgc2VudCBvdXQsIGJ1dCBoYXNuJ3QgbWFkZSBpdCB0aHJvdWdoIHRvIHRoZQoJICogZGV2aWNlLCBzbyBqdXN0IHRlbGwgdGhlIHR0eSBsYXllciB0aGF0IGV2ZXJ5dGhpbmcKCSAqIGlzIGZsdXNoZWQuCgkgKi8KCXJldHVybiAwOwp9IC8qIGZ0ZGlfY2hhcnNfaW5fYnVmZmVyICovCgoKCnN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CglzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCglpZiAodXJiLT5udW1iZXJfb2ZfcGFja2V0cyA+IDApIHsKCQllcnIoIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgYWN0dWFsX2xlbmd0aCAlZCBudW1iZXIgb2YgcGFja2V0cyAlZCIsX19GVU5DVElPTl9fLAoJCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyApOwoJCWVycigiJXMgdHJhbnNmZXJfZmxhZ3MgJXggIiwgX19GVU5DVElPTl9fLHVyYi0+dHJhbnNmZXJfZmxhZ3MgKTsKCX0KCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglpZiAocG9ydC0+b3Blbl9jb3VudCA8PSAwKQoJCXJldHVybjsKCgl0dHkgPSBwb3J0LT50dHk7CglpZiAoIXR0eSkgewoJCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIixfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJaWYgKCFwcml2KSB7CgkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWlmICh1cmIgIT0gcG9ydC0+cmVhZF91cmIpIHsKCQllcnIoIiVzIC0gTm90IG15IHVyYiEiLCBfX0ZVTkNUSU9OX18pOwoJfQoKCWlmICh1cmItPnN0YXR1cykgewoJCS8qIFRoaXMgd2lsbCBoYXBwZW4gYXQgY2xvc2UgZXZlcnkgdGltZSBzbyBpdCBpcyBhIGRiZyBub3QgYW4gZXJyICovCgkJZGJnKCIodGhpcyBpcyBvayBvbiBjbG9zZSkgbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIHVyYi0+c3RhdHVzKTsKCQlyZXR1cm47Cgl9CgoJZnRkaV9wcm9jZXNzX3JlYWQocG9ydCk7Cgp9IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCgoKc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQgKHZvaWQgKnBhcmFtKQp7IC8qIGZ0ZGlfcHJvY2Vzc19yZWFkICovCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQqKXBhcmFtOwoJc3RydWN0IHVyYiAqdXJiOwoJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgljaGFyIGVycm9yX2ZsYWc7CiAgICAgICAJdW5zaWduZWQgY2hhciAqZGF0YTsKCglpbnQgaTsKCWludCByZXN1bHQ7CglpbnQgbmVlZF9mbGlwOwoJaW50IHBhY2tldF9vZmZzZXQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCWlmIChwb3J0LT5vcGVuX2NvdW50IDw9IDApCgkJcmV0dXJuOwoKCXR0eSA9IHBvcnQtPnR0eTsKCWlmICghdHR5KSB7CgkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpZiAoIXByaXYpIHsKCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJdXJiID0gcG9ydC0+cmVhZF91cmI7CglpZiAoIXVyYikgewoJCWRiZygiJXMgLSBiYWQgcmVhZF91cmIgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CgoJaWYgKHByaXYtPnJ4X3Byb2Nlc3NlZCkgewoJCWRiZygiJXMgLSBhbHJlYWR5IHByb2Nlc3NlZDogJWQgYnl0ZXMsICVkIHJlbWFpbiIsIF9fRlVOQ1RJT05fXywKCQkJCXByaXYtPnJ4X3Byb2Nlc3NlZCwKCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtIHByaXYtPnJ4X3Byb2Nlc3NlZCk7Cgl9IGVsc2UgewoJCS8qIFRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgZXZlcnkgcmVhZCBwYWNrZXQgYXJlIHN0YXR1cyAqLwoJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAyKSB7CgkJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwoJCX0gZWxzZSB7CgkJCWRiZygiU3RhdHVzIG9ubHk6ICUwM29vICUwM29vIixkYXRhWzBdLGRhdGFbMV0pOwoJCX0KCX0KCgoJLyogVE8gRE8gLS0gY2hlY2sgZm9yIGh1bmcgdXAgbGluZSBhbmQgaGFuZGxlIGFwcHJvcHJpYXRlbHk6ICovCgkvKiAgIHNlbmQgaGFuZ3VwICAqLwoJLyogU2VlIGFjbS5jIC0geW91IGRvIGEgdHR5X2hhbmd1cCAgLSBlZyB0dHlfaGFuZ3VwKHR0eSkgKi8KCS8qIGlmIENEIGlzIGRyb3BwZWQgYW5kIHRoZSBsaW5lIGlzIG5vdCBDTE9DQUwgdGhlbiB3ZSBzaG91bGQgaGFuZ3VwICovCgoJbmVlZF9mbGlwID0gMDsKCWZvciAocGFja2V0X29mZnNldCA9IHByaXYtPnJ4X3Byb2Nlc3NlZDsgcGFja2V0X29mZnNldCA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgcGFja2V0X29mZnNldCArPSBQS1RTWikgewoJCWludCBsZW5ndGg7CgoJCS8qIENvbXBhcmUgbmV3IGxpbmUgc3RhdHVzIHRvIHRoZSBvbGQgb25lLCBzaWduYWwgaWYgZGlmZmVyZW50ICovCgkJLyogTi5CLiBwYWNrZXQgbWF5IGJlIHByb2Nlc3NlZCBtb3JlIHRoYW4gb25jZSwgYnV0IGRpZmZlcmVuY2VzCgkJICogYXJlIG9ubHkgcHJvY2Vzc2VkIG9uY2UuICAqLwoJCWlmIChwcml2ICE9IE5VTEwpIHsKCQkJY2hhciBuZXdfc3RhdHVzID0gZGF0YVtwYWNrZXRfb2Zmc2V0KzBdICYgRlRESV9TVEFUVVNfQjBfTUFTSzsKCQkJaWYgKG5ld19zdGF0dXMgIT0gcHJpdi0+cHJldl9zdGF0dXMpIHsKCQkJCXByaXYtPmRpZmZfc3RhdHVzIHw9IG5ld19zdGF0dXMgXiBwcml2LT5wcmV2X3N0YXR1czsKCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwoJCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBuZXdfc3RhdHVzOwoJCQl9CgkJfQoKCQlsZW5ndGggPSBtaW4oUEtUU1osIHVyYi0+YWN0dWFsX2xlbmd0aC1wYWNrZXRfb2Zmc2V0KS0yOwoJCWlmIChsZW5ndGggPCAwKSB7CgkJCWVycigiJXMgLSBiYWQgcGFja2V0IGxlbmd0aDogJWQiLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCsyKTsKCQkJbGVuZ3RoID0gMDsKCQl9CgoJCS8qIGhhdmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBidWZmZXIKCQkgICB3aXRoIHR0eV9pbnNlcnRfZmxpcF9jaGFyJ3MgKi8KCQlpZiAodHR5LT5mbGlwLmNvdW50K2xlbmd0aCA+IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKCQkJbmVlZF9mbGlwID0gMDsKCgkJCWlmICh0dHktPmZsaXAuY291bnQgIT0gMCkgewoJCQkJLyogZmxpcCBkaWRuJ3Qgd29yaywgdGhpcyBoYXBwZW5zIHdoZW4gZnRkaV9wcm9jZXNzX3JlYWQoKSBpcwoJCQkJICogY2FsbGVkIGZyb20gZnRkaV91bnRocm90dGxlLCBiZWNhdXNlIFRUWV9ET05UX0ZMSVAgaXMgc2V0ICovCgkJCQlkYmcoIiVzIC0gZmxpcCBidWZmZXIgcHVzaCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7CgkJCWRiZygiJXMgLSB0aHJvdHRsZWQiLCBfX0ZVTkNUSU9OX18pOwoJCQlicmVhazsKCQl9CgkJaWYgKHR0eS0+bGRpc2MucmVjZWl2ZV9yb29tKHR0eSktdHR5LT5mbGlwLmNvdW50IDwgbGVuZ3RoKSB7CgkJCS8qIGJyZWFrIG91dCAmIHdhaXQgZm9yIHRocm90dGxpbmcvdW50aHJvdHRsaW5nIHRvIGhhcHBlbiAqLwoJCQlkYmcoIiVzIC0gcmVjZWl2ZSByb29tIGxvdyIsIF9fRlVOQ1RJT05fXyk7CgkJCWJyZWFrOwoJCX0KCgkJLyogSGFuZGxlIGVycm9ycyBhbmQgYnJlYWsgKi8KCQllcnJvcl9mbGFnID0gVFRZX05PUk1BTDsKCQkvKiBBbHRob3VnaCB0aGUgZGV2aWNlIHVzZXMgYSBiaXRtYXNrIGFuZCBoZW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSAqLwoJCS8qIGVycm9ycyBvbiBhIHBhY2tldCAtIHRoZSBvcmRlciBoZXJlIHNldHMgdGhlIHByaW9yaXR5IHRoZSAqLwoJCS8qIGVycm9yIGlzIHJldHVybmVkIHRvIHRoZSB0dHkgbGF5ZXIgICovCgoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19PRSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9PVkVSUlVOOwoJCQlkYmcoIk9WRVJSUlVOIGVycm9yIik7CgkJfQoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19CSSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9CUkVBSzsKCQkJZGJnKCJCUkVBSyByZWNlaXZlZCIpOwoJCX0KCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfUEUgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfUEFSSVRZOwoJCQlkYmcoIlBBUklUWSBlcnJvciIpOwoJCX0KCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfRkUgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfRlJBTUU7CgkJCWRiZygiRlJBTUlORyBlcnJvciIpOwoJCX0KCQlpZiAobGVuZ3RoID4gMCkgewoJCQlmb3IgKGkgPSAyOyBpIDwgbGVuZ3RoKzI7IGkrKykgewoJCQkJLyogTm90ZSB0aGF0IHRoZSBlcnJvciBmbGFnIGlzIGR1cGxpY2F0ZWQgZm9yIAoJCQkJICAgZXZlcnkgY2hhcmFjdGVyIHJlY2VpdmVkIHNpbmNlIHdlIGRvbid0IGtub3cKCQkJCSAgIHdoaWNoIGNoYXJhY3RlciBpdCBhcHBsaWVkIHRvICovCgkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbcGFja2V0X29mZnNldCtpXSwgZXJyb3JfZmxhZyk7CgkJCX0KCQkJbmVlZF9mbGlwID0gMTsKCQl9CgojaWZkZWYgTk9UX0NPUlJFQ1RfQlVUX0tFRVBJTkdfSVRfRk9SX05PVwoJCS8qIGlmIGEgcGFyaXR5IGVycm9yIGlzIGRldGVjdGVkIHlvdSBnZXQgc3RhdHVzIHBhY2tldHMgZm9yZXZlcgoJCSAgIHVudGlsIGEgY2hhcmFjdGVyIGlzIHNlbnQgd2l0aG91dCBhIHBhcml0eSBlcnJvci4KCQkgICBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG5ldmVyCgkJICAgZW5kaW5nIHN0cmVhbSBvZiBiYWQgZGF0YSAtIGV2ZW4gdGhvdWdoIG5ldyBkYXRhIGhhc24ndCBiZWVuIHNlbnQuCgkJICAgVGhlcmVmb3JlIEkgKGJpbGwpIGhhdmUgdGFrZW4gdGhpcyBvdXQuCgkJICAgSG93ZXZlciAtIHRoaXMgbWlnaHQgbWFrZSBzZW5zZSBmb3IgZnJhbWluZyBlcnJvcnMgYW5kIHNvIG9uIAoJCSAgIHNvIEkgYW0gbGVhdmluZyB0aGUgY29kZSBpbiBmb3Igbm93LgoJCSovCgkJZWxzZSB7CgkJCWlmIChlcnJvcl9mbGFnICE9IFRUWV9OT1JNQUwpewoJCQkJZGJnKCJlcnJvcl9mbGFnIGlzIG5vdCBub3JtYWwiKTsKCQkJCS8qIEluIHRoaXMgY2FzZSBpdCBpcyBqdXN0IHN0YXR1cyAtIGlmIHRoYXQgaXMgYW4gZXJyb3Igc2VuZCBhIGJhZCBjaGFyYWN0ZXIgKi8KCQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CgkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKCQkJCX0KCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMHhmZiwgZXJyb3JfZmxhZyk7CgkJCQluZWVkX2ZsaXAgPSAxOwoJCQl9CgkJfQojZW5kaWYKCX0gLyogImZvcihwYWNrZXRfb2Zmc2V0PTAuLi4iICovCgoJLyogTG93IGxhdGVuY3kgKi8KCWlmIChuZWVkX2ZsaXApIHsKCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoJfQoKCWlmIChwYWNrZXRfb2Zmc2V0IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CgkJLyogbm90IGNvbXBsZXRlbHkgcHJvY2Vzc2VkIC0gcmVjb3JkIHByb2dyZXNzICovCgkJcHJpdi0+cnhfcHJvY2Vzc2VkID0gcGFja2V0X29mZnNldDsKCQlkYmcoIiVzIC0gaW5jb21wbGV0ZSwgJWQgYnl0ZXMgcHJvY2Vzc2VkLCAlZCByZW1haW4iLAoJCQkJX19GVU5DVElPTl9fLCBwYWNrZXRfb2Zmc2V0LAoJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcGFja2V0X29mZnNldCk7CgkJLyogY2hlY2sgaWYgd2Ugd2VyZSB0aHJvdHRsZWQgd2hpbGUgcHJvY2Vzc2luZyAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgkJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7CgkJCXByaXYtPnJ4X2ZsYWdzIHw9IEFDVFVBTExZX1RIUk9UVExFRDsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJCQlkYmcoIiVzIC0gZGVmZXJyaW5nIHJlbWFpbmRlciB1bnRpbCB1bnRocm90dGxlZCIsCgkJCQkJX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuOwoJCX0KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgkJLyogaWYgdGhlIHBvcnQgaXMgY2xvc2VkIHN0b3AgdHJ5aW5nIHRvIHJlYWQgKi8KCQlpZiAocG9ydC0+b3Blbl9jb3VudCA+IDApewoJCQkvKiBkZWxheSBwcm9jZXNzaW5nIG9mIHJlbWFpbmRlciAqLwoJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnJ4X3dvcmssIDEpOwoJCX0gZWxzZSB7CgkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCIsIF9fRlVOQ1RJT05fXyk7CgkJfQoJCXJldHVybjsKCX0KCgkvKiB1cmIgaXMgY29tcGxldGVseSBwcm9jZXNzZWQgKi8KCXByaXYtPnJ4X3Byb2Nlc3NlZCA9IDA7CgoJLyogaWYgdGhlIHBvcnQgaXMgY2xvc2VkIHN0b3AgdHJ5aW5nIHRvIHJlYWQgKi8KCWlmIChwb3J0LT5vcGVuX2NvdW50ID4gMCl7CgkJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkICAqLwoJCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwgCgkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAoJCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKCQkJICAgICAgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwoKCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CgkJaWYgKHJlc3VsdCkKCQkJZXJyKCIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwoJfQoKCXJldHVybjsKfSAvKiBmdGRpX3Byb2Nlc3NfcmVhZCAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfYnJlYWtfY3RsKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJX191MTYgdXJiX3ZhbHVlID0gMDsgCgljaGFyIGJ1ZlsxXTsKCQoJLyogYnJlYWtfc3RhdGUgPSAtMSB0byB0dXJuIG9uIGJyZWFrLCBhbmQgMCB0byB0dXJuIG9mZiBicmVhayAqLwoJLyogc2VlIGRyaXZlcnMvY2hhci90dHlfaW8uYyB0byBzZWUgaXQgdXNlZCAqLwoJLyogbGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgTkVWRVIgaGFzIHRoZSBicmVhayBiaXQgc2V0IGluIGl0ICovCgoJaWYgKGJyZWFrX3N0YXRlKSB7CgkJdXJiX3ZhbHVlID0gcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgfCBGVERJX1NJT19TRVRfQlJFQUs7Cgl9IGVsc2UgewoJCXVyYl92YWx1ZSA9IHByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlOyAKCX0KCgkKCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULCAKCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKCQkJICAgIHVyYl92YWx1ZSAsIHByaXYtPmludGVyZmFjZSwKCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCWVycigiJXMgRkFJTEVEIHRvIGVuYWJsZS9kaXNhYmxlIGJyZWFrIHN0YXRlIChzdGF0ZSB3YXMgJWQpIiwgX19GVU5DVElPTl9fLGJyZWFrX3N0YXRlKTsKCX0JICAgCgoJZGJnKCIlcyBicmVhayBzdGF0ZSBpcyAlZCAtIHVyYiBpcyAlZCIsIF9fRlVOQ1RJT05fXyxicmVha19zdGF0ZSwgdXJiX3ZhbHVlKTsKCQp9CgoKLyogb2xkX3Rlcm1pb3MgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRlcm1pb3Mgc2V0dGluZ3MgYW5kIHR0eS0+dGVybWlvcyBjb250YWlucwogKiB0aGUgbmV3IHNldHRpbmcgdG8gYmUgdXNlZAogKiBXQVJOSU5HOiBzZXRfdGVybWlvcyBjYWxscyB0aGlzIHdpdGggb2xkX3Rlcm1pb3MgaW4ga2VybmVsIHNwYWNlCiAqLwoKc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQp7IC8qIGZ0ZGlfdGVybWlvcyAqLwoJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwoJdW5zaWduZWQgaW50IGNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCV9fdTE2IHVyYl92YWx1ZTsgLyogd2lsbCBob2xkIHRoZSBuZXcgZmxhZ3MgKi8KCWNoYXIgYnVmWzFdOyAvKiBQZXJoYXBzIEkgc2hvdWxkIGR5bmFtaWNhbGx5IGFsbG9jIHRoaXM/ICovCgkKCS8vIEFkZGVkIGZvciB4b24veG9mZiBzdXBwb3J0Cgl1bnNpZ25lZCBpbnQgaWZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWc7Cgl1bnNpZ25lZCBjaGFyIHZzdG9wOwoJdW5zaWduZWQgY2hhciB2c3RhcnQ7CgkKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCS8qIEZvcmNlIGJhdWQgcmF0ZSBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdCwgdW5sZXNzIGl0IGlzIHNldCB0byBCMC4gKi8KCWlmIChwcml2LT5mb3JjZV9iYXVkICYmICgocG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICE9IEIwKSkgewoJCWRiZygiJXM6IGZvcmNpbmcgYmF1ZCByYXRlIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKCQlwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gcHJpdi0+Zm9yY2VfYmF1ZDsKCX0KCgkvKiBGb3JjZSBSVFMtQ1RTIGlmIHRoaXMgZGV2aWNlIHJlcXVpcmVzIGl0LiAqLwoJaWYgKHByaXYtPmZvcmNlX3J0c2N0cykgewoJCWRiZygiJXM6IGZvcmNpbmcgcnRzY3RzIGZvciB0aGlzIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IENSVFNDVFM7Cgl9CgoJY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CgoJLyogRklYTUUgLUZvciB0aGlzIGN1dCBJIGRvbid0IGNhcmUgaWYgdGhlIGxpbmUgaXMgcmVhbGx5IGNoYW5naW5nIG9yIAoJICAgbm90ICAtIHNvIGp1c3QgZG8gdGhlIGNoYW5nZSByZWdhcmRsZXNzICAtIHNob3VsZCBiZSBhYmxlIHRvIAoJICAgY29tcGFyZSBvbGRfdGVybWlvcyBhbmQgdHR5LT50ZXJtaW9zICovCgkvKiBOT1RFIFRoZXNlIHJvdXRpbmVzIGNhbiBnZXQgaW50ZXJydXB0ZWQgYnkgCgkgICBmdGRpX3Npb19yZWFkX2J1bGtfY2FsbGJhY2sgIC0gbmVlZCB0byBleGFtaW5lIHdoYXQgdGhpcyAKICAgICAgICAgICBtZWFucyAtIGRvbid0IHNlZSBhbnkgcHJvYmxlbXMgeWV0ICovCgkKCS8qIFNldCBudW1iZXIgb2YgZGF0YSBiaXRzLCBwYXJpdHksIHN0b3AgYml0cyAqLwoJCgl1cmJfdmFsdWUgPSAwOwoJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIENTVE9QQiA/IEZURElfU0lPX1NFVF9EQVRBX1NUT1BfQklUU18yIDoKCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMSk7Cgl1cmJfdmFsdWUgfD0gKGNmbGFnICYgUEFSRU5CID8gCgkJICAgICAgKGNmbGFnICYgUEFST0REID8gRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX09ERCA6IAoJCSAgICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfRVZFTikgOgoJCSAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9OT05FKTsKCWlmIChjZmxhZyAmIENTSVpFKSB7CgkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6IHVyYl92YWx1ZSB8PSA1OyBkYmcoIlNldHRpbmcgQ1M1Iik7IGJyZWFrOwoJCWNhc2UgQ1M2OiB1cmJfdmFsdWUgfD0gNjsgZGJnKCJTZXR0aW5nIENTNiIpOyBicmVhazsKCQljYXNlIENTNzogdXJiX3ZhbHVlIHw9IDc7IGRiZygiU2V0dGluZyBDUzciKTsgYnJlYWs7CgkJY2FzZSBDUzg6IHVyYl92YWx1ZSB8PSA4OyBkYmcoIlNldHRpbmcgQ1M4Iik7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVycigiQ1NJWkUgd2FzIHNldCBidXQgbm90IENTNS1DUzgiKTsKCQl9Cgl9CgoJLyogVGhpcyBpcyBuZWVkZWQgYnkgdGhlIGJyZWFrIGNvbW1hbmQgc2luY2UgaXQgdXNlcyB0aGUgc2FtZSBjb21tYW5kIC0gYnV0IGlzCgkgKiAgb3InZWQgd2l0aCB0aGlzIHZhbHVlICAqLwoJcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgPSB1cmJfdmFsdWU7CgkKCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1QsIAoJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVF9UWVBFLAoJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCkgPCAwKSB7CgkJZXJyKCIlcyBGQUlMRUQgdG8gc2V0IGRhdGFiaXRzL3N0b3BiaXRzL3Bhcml0eSIsIF9fRlVOQ1RJT05fXyk7Cgl9CSAgIAoKCS8qIE5vdyBkbyB0aGUgYmF1ZHJhdGUgKi8KCWlmICgoY2ZsYWcgJiBDQkFVRCkgPT0gQjAgKSB7CgkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULCAKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsIAoJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQllcnIoIiVzIGVycm9yIGZyb20gZGlzYWJsZSBmbG93Y29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18pOwoJCX0JICAgIAoJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KCQljbGVhcl9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwoJfSBlbHNlIHsKCQkvKiBzZXQgdGhlIGJhdWRyYXRlIGRldGVybWluZWQgYmVmb3JlICovCgkJaWYgKGNoYW5nZV9zcGVlZChwb3J0KSkgewoJCQllcnIoIiVzIHVyYiBmYWlsZWQgdG8gc2V0IGJhdWRyYXRlIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJLyogRW5zdXJlIFJUUyBhbmQgRFRSIGFyZSByYWlzZWQgd2hlbiBiYXVkcmF0ZSBjaGFuZ2VkIGZyb20gMCAqLwoJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjApIHsKCQkJc2V0X21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7CgkJfQoJfQoKCS8qIFNldCBmbG93IGNvbnRyb2wgKi8KCS8qIE5vdGUgZGV2aWNlIGFsc28gc3VwcG9ydHMgRFRSL0NEICh1Z2gpIGFuZCBYb24vWG9mZiBpbiBoYXJkd2FyZSAqLwoJaWYgKGNmbGFnICYgQ1JUU0NUUykgewoJCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CgkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsIAoJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwgCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkgICAgMCAsIChGVERJX1NJT19SVFNfQ1RTX0hTIHwgcHJpdi0+aW50ZXJmYWNlKSwKCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byBydHMvY3RzIGZsb3cgY29udHJvbCIpOwoJCX0JCQoJCQoJfSBlbHNlIHsgCgkJLyoKCQkgKiBYb24vWG9mZiBjb2RlCgkJICoKCQkgKiBDaGVjayB0aGUgSVhPRkYgc3RhdHVzIGluIHRoZSBpZmxhZyBjb21wb25lbnQgb2YgdGhlIHRlcm1pb3Mgc3RydWN0dXJlCgkJICogaWYgSVhPRkYgaXMgbm90IHNldCwgdGhlIHByZS14b24veG9mZiBjb2RlIGlzIGV4ZWN1dGVkLgoJCSovCgkJaWYgKGlmbGFnICYgSVhPRkYpIHsKCQkJZGJnKCIlcyAgcmVxdWVzdCB0byBlbmFibGUgeG9ueG9mZiBpZmxhZz0lMDR4IixfX0ZVTkNUSU9OX18saWZsYWcpOwoJCQkvLyBUcnkgdG8gZW5hYmxlIHRoZSBYT04vWE9GRiBvbiB0aGUgZnRkaV9zaW8KCQkJLy8gU2V0IHRoZSB2c3RhcnQgYW5kIHZzdG9wIC0tIGNvdWxkIGhhdmUgYmVlbiBkb25lIHVwIGFib3ZlIHdoZXJlCgkJCS8vIGEgbG90IG9mIG90aGVyIGRlcmVmZXJlbmNpbmcgaXMgZG9uZSBidXQgdGhhdCB3b3VsZCBiZSB2ZXJ5CgkJCS8vIGluZWZmaWNpZW50IGFzIHZzdGFydCBhbmQgdnN0b3AgYXJlIG5vdCBhbHdheXMgbmVlZGVkCgkJCXZzdGFydD1wb3J0LT50dHktPnRlcm1pb3MtPmNfY2NbVlNUQVJUXTsKCQkJdnN0b3A9cG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKCQkJdXJiX3ZhbHVlPSh2c3RvcCA8PCA4KSB8ICh2c3RhcnQpOwoKCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJCSAgICB1cmJfdmFsdWUgLCAoRlRESV9TSU9fWE9OX1hPRkZfSFMKCQkJCQkJCSB8IHByaXYtPmludGVyZmFjZSksCgkJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byB4b24veG9mZiBmbG93IGNvbnRyb2wiKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KCQkJLyogQ0hFQ0tNRSBBc3N1bWluZyBYT04vWE9GRiBoYW5kbGVkIGJ5IHR0eSBzdGFjayAtIG5vdCBieSBkZXZpY2UgKi8KCQkJZGJnKCIlcyBUdXJuaW5nIG9mZiBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLCBfX0ZVTkNUSU9OX18pOwoJCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsIAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKCQkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCQllcnIoInVyYiBmYWlsZWQgdG8gY2xlYXIgZmxvdyBjb250cm9sIik7CgkJCX0JCQkJCgkJfQoJCQoJfQoJcmV0dXJuOwp9IC8qIGZ0ZGlfdGVybWlvcyAqLwoKCnN0YXRpYyBpbnQgZnRkaV90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKCWludCByZXQ7CgoJZGJnKCIlcyBUSU9DTUdFVCIsIF9fRlVOQ1RJT05fXyk7Cglzd2l0Y2ggKHByaXYtPmNoaXBfdHlwZSkgewoJY2FzZSBTSU86CgkJLyogUmVxdWVzdCB0aGUgc3RhdHVzIGZyb20gdGhlIGRldmljZSAqLwoJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKCQkJCQkgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwgCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNUX1RZUEUsCgkJCQkJICAgMCwgMCwgCgkJCQkJICAgYnVmLCAxLCBXRFJfVElNRU9VVCkpIDwgMCApIHsKCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAoJCQkgICAgcmV0KTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDhVMjMyQU06CgljYXNlIEZUMjMyQk06CgljYXNlIEZUMjIzMkM6CgkJLyogdGhlIDhVMjMyQU0gcmV0dXJucyBhIHR3byBieXRlIHZhbHVlICh0aGUgc2lvIGlzIGEgMSBieXRlIHZhbHVlKSAtIGluIHRoZSBzYW1lCgkJICAgZm9ybWF0IGFzIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIGluIHBvaW50ICovCgkJaWYgKChyZXQgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIAoJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNULCAKCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAwLCBwcml2LT5pbnRlcmZhY2UsIAoJCQkJCSAgIGJ1ZiwgMiwgV0RSX1RJTUVPVVQpKSA8IDAgKSB7CgkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKCQkJICAgIHJldCk7CgkJCXJldHVybihyZXQpOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7Cgl9CgkKCXJldHVybiAgKGJ1ZlswXSAmIEZURElfU0lPX0RTUl9NQVNLID8gVElPQ01fRFNSIDogMCkgfAoJCShidWZbMF0gJiBGVERJX1NJT19DVFNfTUFTSyA/IFRJT0NNX0NUUyA6IDApIHwKCQkoYnVmWzBdICAmIEZURElfU0lPX1JJX01BU0sgID8gVElPQ01fUkkgIDogMCkgfAoJCShidWZbMF0gICYgRlRESV9TSU9fUkxTRF9NQVNLID8gVElPQ01fQ0QgIDogMCkgfAoJCXByaXYtPmxhc3RfZHRyX3J0czsJCQkKfQoKc3RhdGljIGludCBmdGRpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQp7CglkYmcoIiVzIFRJT0NNU0VUIiwgX19GVU5DVElPTl9fKTsKCXJldHVybiB1cGRhdGVfbWN0cmwocG9ydCwgc2V0LCBjbGVhcik7Cn0KCgpzdGF0aWMgaW50IGZ0ZGlfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgoJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19GVU5DVElPTl9fLCBjbWQpOwoKCS8qIEJhc2VkIG9uIGNvZGUgZnJvbSBhY20uYyBhbmQgb3RoZXJzICovCglzd2l0Y2ggKGNtZCkgewoKCWNhc2UgVElPQ0dTRVJJQUw6IC8qIGdldHMgc2VyaWFsIHBvcnQgZGF0YSAqLwoJCXJldHVybiBnZXRfc2VyaWFsX2luZm8ocG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgVElPQ1NTRVJJQUw6IC8qIHNldHMgc2VyaWFsIHBvcnQgZGF0YSAqLwoJCXJldHVybiBzZXRfc2VyaWFsX2luZm8ocG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwoKCS8qCgkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCgkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQoJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMuCgkgKgoJICogVGhpcyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gbGludXgvZHJpdmVycy9jaGFyL3NlcmlhbC5jCgkgKi8KCWNhc2UgVElPQ01JV0FJVDoKCQl3aGlsZSAocHJpdiAhPSBOVUxMKSB7CgkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnByaXYtPmRlbHRhX21zcl93YWl0KTsKCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoJCQllbHNlIHsKCQkJCWNoYXIgZGlmZiA9IHByaXYtPmRpZmZfc3RhdHVzOwoKCQkJCWlmIChkaWZmID09IDApIHsKCQkJCQlyZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCgkJCQl9CgoJCQkJLyogQ29uc3VtZSBhbGwgZXZlbnRzICovCgkJCQlwcml2LT5kaWZmX3N0YXR1cyA9IDA7CgoJCQkJLyogUmV0dXJuIDAgaWYgY2FsbGVyIHdhbnRlZCB0byBrbm93IGFib3V0IHRoZXNlIGJpdHMgKi8KCQkJCWlmICggKChhcmcgJiBUSU9DTV9STkcpICYmIChkaWZmICYgRlRESV9SUzBfUkkpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGRpZmYgJiBGVERJX1JTMF9EU1IpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGRpZmYgJiBGVERJX1JTMF9STFNEKSkgfHwKCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChkaWZmICYgRlRESV9SUzBfQ1RTKSkgKSB7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQkvKgoJCQkJICogT3RoZXJ3aXNlIGNhbGxlciBjYW4ndCBjYXJlIGxlc3MgYWJvdXQgd2hhdCBoYXBwZW5lZCwKCQkJCSAqIGFuZCBzbyB3ZSBjb250aW51ZSB0byB3YWl0IGZvciBtb3JlIGV2ZW50cy4KCQkJCSAqLwoJCQl9CgkJfQoJCXJldHVybigwKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7CgkJCgl9CgoKCS8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIC0gdHVybnMgb3V0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgZG8gCgkgKiAgc29tZSBpb2N0bHMgaXRzZWxmIChzZWUgY29tbWVudCBhYm92ZSkKCSAqLwoJZGJnKCIlcyBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayAvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oIiwgX19GVU5DVElPTl9fLCBjbWQpOwoKCXJldHVybigtRU5PSU9DVExDTUQpOwp9IC8qIGZ0ZGlfaW9jdGwgKi8KCgpzdGF0aWMgdm9pZCBmdGRpX3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+cnhfZmxhZ3MgfD0gVEhST1RUTEVEOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwp9CgoKc3RhdGljIHZvaWQgZnRkaV91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJaW50IGFjdHVhbGx5X3Rocm90dGxlZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCWFjdHVhbGx5X3Rocm90dGxlZCA9IHByaXYtPnJ4X2ZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwoJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoKCWlmIChhY3R1YWxseV90aHJvdHRsZWQpCgkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGZ0ZGlfaW5pdCAodm9pZCkKewoJaW50IHJldHZhbDsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCWlmICh2ZW5kb3IgPiAwICYmIHByb2R1Y3QgPiAwKSB7CgkJLyogQWRkIHVzZXIgc3BlY2lmaWVkIFZJRC9QSUQgdG8gcmVzZXJ2ZWQgZWxlbWVudCBvZiB0YWJsZS4gKi8KCQlpbnQgaTsKCQlmb3IgKGkgPSAwOyBpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvcjsgaSsrKQoJCQk7CgkJaWRfdGFibGVfY29tYmluZWRbaV0ubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKCQlpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvciA9IHZlbmRvcjsKCQlpZF90YWJsZV9jb21iaW5lZFtpXS5pZFByb2R1Y3QgPSBwcm9kdWN0OwoJfQoJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKCWlmIChyZXR2YWwpCgkJZ290byBmYWlsZWRfc2lvX3JlZ2lzdGVyOwoJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2RyaXZlcik7CglpZiAocmV0dmFsKSAKCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CgoJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOwoJcmV0dXJuIDA7CmZhaWxlZF91c2JfcmVnaXN0ZXI6Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CmZhaWxlZF9zaW9fcmVnaXN0ZXI6CglyZXR1cm4gcmV0dmFsOwp9CgoKc3RhdGljIHZvaWQgX19leGl0IGZ0ZGlfZXhpdCAodm9pZCkKewoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCXVzYl9kZXJlZ2lzdGVyICgmZnRkaV9kcml2ZXIpOwoJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9zaW9fZGV2aWNlKTsKCn0KCgptb2R1bGVfaW5pdChmdGRpX2luaXQpOwptb2R1bGVfZXhpdChmdGRpX2V4aXQpOwoKTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOwpNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKbW9kdWxlX3BhcmFtKHZlbmRvciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2ZW5kb3IsICJVc2VyIHNwZWNpZmllZCB2ZW5kb3IgSUQgKGRlZmF1bHQ9IgoJCV9fTU9EVUxFX1NUUklORyhGVERJX1ZJRCkiKSIpOwptb2R1bGVfcGFyYW0ocHJvZHVjdCwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2ZW5kb3IsICJVc2VyIHNwZWNpZmllZCBwcm9kdWN0IElEIik7Cgo=