From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH v3 1/1] cameraif: add ABI for para-virtual camera Date: Wed, 12 Dec 2018 11:49:29 +0200 Message-ID: <20181212094929.4709-2-andr2000@gmail.com> References: <20181212094929.4709-1-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gX19G-00080M-FH for xen-devel@lists.xenproject.org; Wed, 12 Dec 2018 09:49:46 +0000 Received: by mail-lf1-x12f.google.com with SMTP id v5so13041444lfe.7 for ; Wed, 12 Dec 2018 01:49:42 -0800 (PST) In-Reply-To: <20181212094929.4709-1-andr2000@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com, hverkuil@xs4all.nl Cc: Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKVGhpcyBpcyB0aGUgQUJJIGZvciB0aGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmly dHVhbGl6ZWQKY2FtZXJhIGRyaXZlciB3aGljaCBleHRlbmRzIFhlbidzIHJlYWNoIG11bHRpbWVk aWEgY2FwYWJpbGl0aWVzIGV2ZW4KZmFydGhlciBlbmFibGluZyBpdCBmb3IgdmlkZW8gY29uZmVy ZW5jaW5nLCBJbi1WZWhpY2xlIEluZm90YWlubWVudCwKaGlnaCBkZWZpbml0aW9uIG1hcHMgZXRj LgoKVGhlIGluaXRpYWwgZ29hbCBpcyB0byBzdXBwb3J0IG1vc3QgbmVlZGVkIGZ1bmN0aW9uYWxp dHkgd2l0aCB0aGUKZmluYWwgaWRlYSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUg cHJvdG9jb2wgaWYgbmVlZCBiZToKCjEuIFByb3ZpZGUgbWVhbnMgZm9yIGJhc2UgdmlydHVhbCBk ZXZpY2UgY29uZmlndXJhdGlvbjoKIC0gcGl4ZWwgZm9ybWF0cwogLSByZXNvbHV0aW9ucwogLSBm cmFtZSByYXRlcwoyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBjb250cm9sczoKIC0gY29udHJhc3QK IC0gYnJpZ2h0bmVzcwogLSBodWUKIC0gc2F0dXJhdGlvbgozLiBTdXBwb3J0IHN0cmVhbWluZyBj b250cm9sCgpTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRy X2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Ci0tLQogeGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVy YWlmLmggfCAxMzc0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5n ZWQsIDEzNzQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9pbmNsdWRlL3B1 YmxpYy9pby9jYW1lcmFpZi5oCgpkaWZmIC0tZ2l0IGEveGVuL2luY2x1ZGUvcHVibGljL2lvL2Nh bWVyYWlmLmggYi94ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjlhYWUwZjQ3NzQzYgotLS0gL2Rldi9udWxsCisr KyBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCkBAIC0wLDAgKzEsMTM3NCBAQAor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorICogY2FtZXJhaWYuaAorICoKKyAqIFVuaWZpZWQgY2Ft ZXJhIGRldmljZSBJL08gaW50ZXJmYWNlIGZvciBYZW4gZ3Vlc3QgT1Nlcy4KKyAqCisgKiBQZXJt aXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBv YnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3Vt ZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3 YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhl CisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmli dXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwg YW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNo ZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAq IFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNo YWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25z IG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwg SU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklO R0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhP TERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZU V0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisg KgorICogQ29weXJpZ2h0IChDKSAyMDE4IEVQQU0gU3lzdGVtcyBJbmMuCisgKgorICogQXV0aG9y OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5j b20+CisgKi8KKworI2lmbmRlZiBfX1hFTl9QVUJMSUNfSU9fQ0FNRVJBSUZfSF9fCisjZGVmaW5l IF9fWEVOX1BVQkxJQ19JT19DQU1FUkFJRl9IX18KKworI2luY2x1ZGUgInJpbmcuaCIKKyNpbmNs dWRlICIuLi9ncmFudF90YWJsZS5oIgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbCB2ZXJzaW9uCisgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCisgKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX1BST1RPQ09MX1ZFUlNJT04gICAgICIx IgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBGZWF0 dXJlIGFuZCBQYXJhbWV0ZXIgTmVnb3RpYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq CisgKiBGcm9udC0+YmFjayBub3RpZmljYXRpb25zOiB3aGVuIGVucXVldWluZyBhIG5ldyByZXF1 ZXN0LCBzZW5kaW5nIGEKKyAqIG5vdGlmaWNhdGlvbiBjYW4gYmUgbWFkZSBjb25kaXRpb25hbCBv biB4ZW5jYW1lcmFfcmVxIChpLmUuLCB0aGUgZ2VuZXJpYworICogaG9sZC1vZmYgbWVjaGFuaXNt IHByb3ZpZGVkIGJ5IHRoZSByaW5nIG1hY3JvcykuIEJhY2tlbmRzIG11c3Qgc2V0CisgKiB4ZW5j YW1lcmFfcmVxIGFwcHJvcHJpYXRlbHkgKGUuZy4sIHVzaW5nIFJJTkdfRklOQUxfQ0hFQ0tfRk9S X1JFUVVFU1RTKCkpLgorICoKKyAqIEJhY2stPmZyb250IG5vdGlmaWNhdGlvbnM6IHdoZW4gZW5x dWV1aW5nIGEgbmV3IHJlc3BvbnNlLCBzZW5kaW5nIGEKKyAqIG5vdGlmaWNhdGlvbiBjYW4gYmUg bWFkZSBjb25kaXRpb25hbCBvbiB4ZW5jYW1lcmFfcmVzcCAoaS5lLiwgdGhlIGdlbmVyaWMKKyAq IGhvbGQtb2ZmIG1lY2hhbmlzbSBwcm92aWRlZCBieSB0aGUgcmluZyBtYWNyb3MpLiBGcm9udGVu ZHMgbXVzdCBzZXQKKyAqIHhlbmNhbWVyYV9yZXNwIGFwcHJvcHJpYXRlbHkgKGUuZy4sIHVzaW5n IFJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFU1BPTlNFUygpKS4KKyAqCisgKiBUaGUgdHdvIGhhbHZl cyBvZiBhIHBhcmEtdmlydHVhbCBjYW1lcmEgZHJpdmVyIHV0aWxpemUgbm9kZXMgd2l0aGluCisg KiBYZW5TdG9yZSB0byBjb21tdW5pY2F0ZSBjYXBhYmlsaXRpZXMgYW5kIHRvIG5lZ290aWF0ZSBv cGVyYXRpbmcgcGFyYW1ldGVycy4KKyAqIFRoaXMgc2VjdGlvbiBlbnVtZXJhdGVzIHRoZXNlIG5v ZGVzIHdoaWNoIHJlc2lkZSBpbiB0aGUgcmVzcGVjdGl2ZSBmcm9udCBhbmQKKyAqIGJhY2tlbmQg cG9ydGlvbnMgb2YgWGVuU3RvcmUsIGZvbGxvd2luZyB0aGUgWGVuQnVzIGNvbnZlbnRpb24uCisg KgorICogQWxsIGRhdGEgaW4gWGVuU3RvcmUgaXMgc3RvcmVkIGFzIHN0cmluZ3MuIE5vZGVzIHNw ZWNpZnlpbmcgbnVtZXJpYworICogdmFsdWVzIGFyZSBlbmNvZGVkIGluIGRlY2ltYWwuIEludGVn ZXIgdmFsdWUgcmFuZ2VzIGxpc3RlZCBiZWxvdyBhcmUKKyAqIGV4cHJlc3NlZCBhcyBmaXhlZCBz aXplZCBpbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2Ygc3RvcmluZyB0aGUgY29udmVyc2lvbgorICog b2YgYSBwcm9wZXJseSBmb3JtYXR0ZWQgbm9kZSBzdHJpbmcsIHdpdGhvdXQgbG9zcyBvZiBpbmZv cm1hdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAg ICAgICAgIEV4YW1wbGUgY29uZmlndXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoK KyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBiYWNrZW5kIGFuZCBmcm9udGVuZCBjb25maWd1cmF0 aW9uOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2tlbmQgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAvbG9jYWwvZG9tYWluLzAv YmFja2VuZC92Y2FtZXJhLzEvMC9mcm9udGVuZC1pZCA9ICIxIgorICogL2xvY2FsL2RvbWFpbi8w L2JhY2tlbmQvdmNhbWVyYS8xLzAvZnJvbnRlbmQgPSAiL2xvY2FsL2RvbWFpbi8xL2RldmljZS92 Y2FtZXJhLzAiCisgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9zdGF0ZSA9 ICI0IgorICogL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xLzAvdmVyc2lvbnMgPSAi MSwyIgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZyb250ZW5kIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAvbG9jYWwvZG9tYWluLzEv ZGV2aWNlL3ZjYW1lcmEvMC9iYWNrZW5kLWlkID0gIjAiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2 aWNlL3ZjYW1lcmEvMC9iYWNrZW5kID0gIi9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZjYW1lcmEv MSIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3N0YXRlID0gIjQiCisgKiAv bG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC92ZXJzaW9uID0gIjEiCisgKiAvbG9jYWwv ZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iZS1hbGxvYyA9ICIxIgorICoKKyAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgMCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9tYXgt YnVmZmVycyA9ICIzIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvY29udHJv bHMgPSAiY29udHJhc3QsaHVlIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAv Zm9ybWF0cy9ZVVlWLzY0MHg0ODAvZnJhbWUtcmF0ZXMgPSAiMzAvMSwxNS8xIgorICogL2xvY2Fs L2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzE5MjB4MTA4MC9mcmFtZS1y YXRlcyA9ICIxNS8yIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0 cy9CR1JBLzY0MHg0ODAvZnJhbWUtcmF0ZXMgPSAiMTUvMSwxNS8yIgorICogL2xvY2FsL2RvbWFp bi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9CR1JBLzEyMDB4NzIwL2ZyYW1lLXJhdGVzID0g IjE1LzIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC91bmlxdWUtaWQgPSAi MCIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3JlcS1yaW5nLXJlZiA9ICIy ODMyIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvcmVxLWV2ZW50LWNoYW5u ZWwgPSAiMTUiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9ldnQtcmluZy1y ZWYgPSAiMzg3IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZXZ0LWV2ZW50 LWNoYW5uZWwgPSAiMTYiCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmlj ZSAxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIC9sb2Nh bC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL21heC1idWZmZXJzID0gIjgiCisgKiAvbG9jYWwv ZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9jb250cm9scyA9ICJicmlnaHRuZXNzLHNhdHVyYXRp b24saHVlIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlW LzY0MHg0ODAvZnJhbWUtcmF0ZXMgPSAiMzAvMSwxNS8yIgorICogL2xvY2FsL2RvbWFpbi8xL2Rl dmljZS92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlWLzE5MjB4MTA4MC9mcmFtZS1yYXRlcyA9ICIxNS8y IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvdW5pcXVlLWlkID0gIjEiCisg KiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9yZXEtcmluZy1yZWYgPSAiMjgzMyIK KyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL3JlcS1ldmVudC1jaGFubmVsID0g IjE3IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvZXZ0LXJpbmctcmVmID0g IjM4OCIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2V2dC1ldmVudC1jaGFu bmVsID0gIjE4IgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEJhY2tlbmQgWGVuQnVzIE5vZGVzCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90b2NvbCB2ZXJzaW9uIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHZlcnNpb25zCisgKiAgICAgIFZh bHVlczogICAgICAgICA8c3RyaW5nPgorICoKKyAqICAgICAgTGlzdCBvZiBYRU5DQU1FUkFfTElT VF9TRVBBUkFUT1Igc2VwYXJhdGVkIHByb3RvY29sIHZlcnNpb25zIHN1cHBvcnRlZAorICogICAg ICBieSB0aGUgYmFja2VuZC4gRm9yIGV4YW1wbGUgIjEsMiwzIi4KKyAqCisgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZCBYZW5CdXMg Tm9kZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tIEFkZHJlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgorICogZG9tLWlkCisgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDE2X3Q+CisgKgor ICogICAgICBEb21haW4gaWRlbnRpZmllci4KKyAqCisgKiBkZXYtaWQKKyAqICAgICAgVmFsdWVz OiAgICAgICAgIDx1aW50MTZfdD4KKyAqCisgKiAgICAgIERldmljZSBpZGVudGlmaWVyLgorICoK KyAqICAgICAgL2xvY2FsL2RvbWFpbi88ZG9tLWlkPi9kZXZpY2UvdmNhbWVyYS88ZGV2LWlkPi8u Li4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvY29sIHZlcnNpb24g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogdmVyc2lvbgorICogICAgICBW YWx1ZXM6ICAgICAgICAgPHN0cmluZz4KKyAqCisgKiAgICAgIFByb3RvY29sIHZlcnNpb24sIGNo b3NlbiBhbW9uZyB0aGUgb25lcyBzdXBwb3J0ZWQgYnkgdGhlIGJhY2tlbmQuCisgKgorICotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2tlbmQgYnVmZmVyIGFsbG9jYXRpb24gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGJlLWFsbG9jCisgKiAgICAgIFZhbHVlczogICAgICAg ICAiMCIsICIxIgorICoKKyAqICAgICAgSWYgdmFsdWUgaXMgc2V0IHRvICIxIiwgdGhlbiBiYWNr ZW5kIHdpbGwgYmUgdGhlIGJ1ZmZlcgorICogICAgICBwcm92aWRlci9hbGxvY2F0b3IgZm9yIHRo aXMgZG9tYWluIGR1cmluZyBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURQorICogICAgICBvcGVyYXRp b24uCisgKiAgICAgIElmIHZhbHVlIGlzIG5vdCAiMSIgb3Igb21pdHRlZCBmcm9udGVuZCBtdXN0 IGFsbG9jYXRlIGJ1ZmZlcnMgaXRzZWxmLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSBDYW1lcmEgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAq CisgKiB1bmlxdWUtaWQKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxzdHJpbmc+CisgKgorICog ICAgICBBZnRlciBkZXZpY2UgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gZWFjaCBjYW1lcmEgaXMg YXNzaWduZWQgYQorICogICAgICB1bmlxdWUgSUQsIHNvIGl0IGNhbiBiZSBpZGVudGlmaWVkIGJ5 IHRoZSBiYWNrZW5kIGJ5IHRoaXMgSUQuCisgKiAgICAgIFRoaXMgY2FuIGJlIFVVSUQgb3Igc3Vj aC4KKyAqCisgKiBtYXgtYnVmZmVycworICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQ4X3Q+ CisgKgorICogICAgICBNYXhpbXVtIG51bWJlciBvZiBjYW1lcmEgYnVmZmVycyB0aGlzIGZyb250 ZW5kIG1heSB1c2UuCisgKgorICogY29udHJvbHMKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxs aXN0IG9mIHN0cmluZz4KKyAqCisgKiAgICAgIExpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYSBjb250 cm9scyBzZXBhcmF0ZWQgYnkgWEVOQ0FNRVJBX0xJU1RfU0VQQVJBVE9SLgorICogICAgICBDYW1l cmEgY29udHJvbHMgYXJlIGV4cHJlc3NlZCBhcyBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyB3L28g YW55CisgKiAgICAgIG9yZGVyaW5nIHJlcXVpcmVtZW50LgorICoKKyAqIGZvcm1hdHMKKyAqICAg ICAgVmFsdWVzOiAgICAgICAgIDxmb3JtYXQsIGNoYXJbN10+CisgKgorICogICAgICBGb3JtYXRz IGFyZSBvcmdhbml6ZWQgYXMgYSBzZXQgb2YgZGlyZWN0b3JpZXMgb25lIHBlciBlYWNoCisgKiAg ICAgIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaXMg dGhlCisgKiAgICAgIGNvcnJlc3BvbmRpbmcgRk9VUkNDIHN0cmluZyBsYWJlbC4gVGhlIG5leHQg bGV2ZWwgb2YKKyAqICAgICAgdGhlIGRpcmVjdG9yeSB1bmRlciA8Zm9ybWF0cz4gcmVwcmVzZW50 cyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMuCisgKiAgICAgIElmIHRoZSBmb3JtYXQgcmVwcmVzZW50 cyBhIGJpZy1lbmRpYW4gdmFyaWFudCBvZiBhIGxpdHRsZQorICogICAgICBlbmRpYW4gZm9ybWF0 LCB0aGVuIHRoZSAiLUJFIiBzdWZmaXggbXVzdCBiZSBhZGRlZC4gRS5nLiAnQVIxNScgdnMKKyAq ICAgICAgJ0FSMTUtQkUnLgorICogICAgICBJZiBGT1VSQ0Mgc3RyaW5nIGxhYmVsIGhhcyBzcGFj ZXMgdGhlbiB0aG9zZSBhcmUgb25seSBhbGxvd2VkIHRvCisgKiAgICAgIGJlIGF0IHRoZSBlbmQg b2YgdGhlIGxhYmVsIGFuZCBtdXN0IGJlIHRyaW1tZWQuCisgKgorICogcmVzb2x1dGlvbgorICog ICAgICBWYWx1ZXM6ICAgICAgICAgPHdpZHRoLCB1aW50MzJfdD54PGhlaWdodCwgdWludDMyX3Q+ CisgKgorICogICAgICBSZXNvbHV0aW9ucyBhcmUgb3JnYW5pemVkIGFzIGEgc2V0IG9mIGRpcmVj dG9yaWVzIG9uZSBwZXIgZWFjaAorICogICAgICBzdXBwb3J0ZWQgcmVzb2x1dGlvbiB1bmRlciBj b3JyZXNwb25kaW5nIDxmb3JtYXRzPiBkaXJlY3RvcnkuCisgKiAgICAgIFRoZSBuYW1lIG9mIHRo ZSBkaXJlY3RvcnkgaXMgdGhlIHN1cHBvcnRlZCB3aWR0aCBhbmQgaGVpZ2h0CisgKiAgICAgIG9m IHRoZSBjYW1lcmEgcmVzb2x1dGlvbiBpbiBwaXhlbHMuCisgKgorICogZnJhbWUtcmF0ZXMKKyAq ICAgICAgVmFsdWVzOiAgICAgICAgIDxudW1lcmF0b3IsIHVpbnQzMl90Pi88ZGVub21pbmF0b3Is IHVpbnQzMl90PgorICoKKyAqICAgICAgTGlzdCBvZiBYRU5DQU1FUkFfRlJBTUVfUkFURV9TRVBB UkFUT1Igc2VwYXJhdGVkIHN1cHBvcnRlZCBmcmFtZSByYXRlcworICogICAgICBvZiB0aGUgY2Ft ZXJhIGV4cHJlc3NlZCBhcyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIHRoZQorICogICAg ICBjb3JyZXNwb25kaW5nIGZyYW1lIHJhdGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tIENh bWVyYSBSZXF1ZXN0IFRyYW5zcG9ydCBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQor ICoKKyAqIFRoaXMgY29tbXVuaWNhdGlvbiBwYXRoIGlzIHVzZWQgdG8gZGVsaXZlciByZXF1ZXN0 cyBmcm9tIGZyb250ZW5kIHRvIGJhY2tlbmQKKyAqIGFuZCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcg cmVzcG9uc2VzIGZyb20gYmFja2VuZCB0byBmcm9udGVuZCwKKyAqIHNldCB1cCBwZXIgdmlydHVh bCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIHJlcS1ldmVudC1jaGFubmVsCisgKiAgICAgIFZhbHVl czogICAgICAgICA8dWludDMyX3Q+CisgKgorICogICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUg WGVuIGNhbWVyYSdzIGNvbnRyb2wgZXZlbnQgY2hhbm5lbAorICogICAgICB1c2VkIHRvIHNpZ25h bCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCisgKgorICogcmVxLXJpbmctcmVmCisgKiAg ICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+CisgKgorICogICAgICBUaGUgWGVuIGdyYW50 IHJlZmVyZW5jZSBncmFudGluZyBwZXJtaXNzaW9uIGZvciB0aGUgYmFja2VuZCB0byBtYXAKKyAq ICAgICAgYSBzb2xlIHBhZ2Ugb2YgY2FtZXJhJ3MgY29udHJvbCByaW5nIGJ1ZmZlci4KKyAqCisg Ki0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbWVyYSBFdmVudCBUcmFuc3BvcnQgUGFyYW1ldGVycyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBjb21tdW5pY2F0aW9uIHBhdGggaXMg dXNlZCB0byBkZWxpdmVyIGFzeW5jaHJvbm91cyBldmVudHMgZnJvbSBiYWNrZW5kCisgKiB0byBm cm9udGVuZCwgc2V0IHVwIHBlciB2aXJ0dWFsIGNhbWVyYSBkZXZpY2UuCisgKgorICogZXZ0LWV2 ZW50LWNoYW5uZWwKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MzJfdD4KKyAqCisgKiAg ICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYZW4gY2FtZXJhJ3MgZXZlbnQgY2hhbm5lbAorICog ICAgICB1c2VkIHRvIHNpZ25hbCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCisgKgorICog ZXZ0LXJpbmctcmVmCisgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+CisgKgorICog ICAgICBUaGUgWGVuIGdyYW50IHJlZmVyZW5jZSBncmFudGluZyBwZXJtaXNzaW9uIGZvciB0aGUg YmFja2VuZCB0byBtYXAKKyAqICAgICAgYSBzb2xlIHBhZ2Ugb2YgY2FtZXJhJ3MgZXZlbnQgcmlu ZyBidWZmZXIuCisgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFNUQVRFIERJQUdSQU1TCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisgKgorICogVG9vbCBzdGFjayBjcmVhdGVzIGZyb250IGFuZCBiYWNrIHN0YXRlIG5vZGVz IHdpdGggaW5pdGlhbCBzdGF0ZQorICogWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcuCisgKiBUb29s IHN0YWNrIGNyZWF0ZXMgYW5kIHNldHMgdXAgZnJvbnRlbmQgY2FtZXJhIGNvbmZpZ3VyYXRpb24K KyAqIG5vZGVzIHBlciBkb21haW4uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSBOb3JtYWwgZmxvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAq IEZyb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrCisgKiA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQorICogWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcgICAgICAgICAgICAgIFhlbmJ1c1N0 YXRlSW5pdGlhbGlzaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG8gUXVlcnkgYmFja2VuZCBkZXZpY2UgaWRlbnRpZmljYXRpb24KKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorICogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvIE9wZW4gYW5kIHZhbGlkYXRlIGJhY2tlbmQgZGV2aWNlLgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgorICogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlSW5pdFdhaXQKKyAqCisgKiBvIFF1 ZXJ5IGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KKyAqIG8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUK KyAqICAgZXZlbnQgY2hhbm5lbHMgcGVyIGNvbmZpZ3VyZWQKKyAqICAgY2FtZXJhLgorICogbyBQ dWJsaXNoIHRyYW5zcG9ydCBwYXJhbWV0ZXJzCisgKiAgIHRoYXQgd2lsbCBiZSBpbiBlZmZlY3Qg ZHVyaW5nCisgKiAgIHRoaXMgY29ubmVjdGlvbi4KKyAqICAgICAgICAgICAgICB8CisgKiAgICAg ICAgICAgICAgfAorICogICAgICAgICAgICAgIFYKKyAqIFhlbmJ1c1N0YXRlSW5pdGlhbGlzZWQK KyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gUXVlcnkgZnJv bnRlbmQgdHJhbnNwb3J0IHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG8gQ29ubmVjdCB0byB0aGUgZXZlbnQgY2hhbm5lbHMuCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDb25uZWN0ZWQKKyAqCisgKiAgbyBDcmVhdGUg YW5kIGluaXRpYWxpemUgT1MKKyAqICAgIHZpcnR1YWwgY2FtZXJhIGFzIHBlcgorICogICAgY29u ZmlndXJhdGlvbi4KKyAqICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgfAorICogICAg ICAgICAgICAgIFYKKyAqIFhlbmJ1c1N0YXRlQ29ubmVjdGVkCisgKgorICogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlVW5rbm93bgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlQ2xvc2VkCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDbG9zaW5nCisgKiBvIFJl bW92ZSB2aXJ0dWFsIGNhbWVyYSBkZXZpY2UKKyAqIG8gUmVtb3ZlIGV2ZW50IGNoYW5uZWxzCisg KiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICBWCisg KiBYZW5idXNTdGF0ZUNsb3NlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LSBSZWNvdmVyeSBmbG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJ biBjYXNlIG9mIGZyb250ZW5kIHVucmVjb3ZlcmFibGUgZXJyb3JzIGJhY2tlbmQgaGFuZGxlcyB0 aGF0IGFzCisgKiBpZiBmcm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlQ2xvc2VkIHN0 YXRlLgorICoKKyAqIEluIGNhc2Ugb2YgYmFja2VuZCB1bnJlY292ZXJhYmxlIGVycm9ycyBmcm9u dGVuZCB0cmllcyByZW1vdmluZworICogdGhlIHZpcnR1YWxpemVkIGRldmljZS4gSWYgdGhpcyBp cyBwb3NzaWJsZSBhdCB0aGUgbW9tZW50IG9mIGVycm9yLAorICogdGhlbiBmcm9udGVuZCBnb2Vz IGludG8gdGhlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlIGFuZCBpcyByZWFkeSBmb3IK KyAqIG5ldyBjb25uZWN0aW9uIHdpdGggYmFja2VuZC4gSWYgdGhlIHZpcnR1YWxpemVkIGRldmlj ZSBpcyBzdGlsbCBpbiB1c2UgYW5kCisgKiBjYW5ub3QgYmUgcmVtb3ZlZCwgdGhlbiBmcm9udGVu ZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZyBzdGF0ZQorICogdW50aWwg ZWl0aGVyIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaXMgcmVtb3ZlZCBvciBiYWNrZW5kIGluaXRp YXRlcyBhIG5ldworICogY29ubmVjdGlvbi4gT24gdGhlIHZpcnR1YWxpemVkIGRldmljZSByZW1v dmFsIGZyb250ZW5kIGdvZXMgaW50byB0aGUKKyAqIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0 YXRlLgorICoKKyAqIE5vdGUgb24gWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIHN0YXRlIG9mIHRo ZSBmcm9udGVuZDogaWYgYmFja2VuZCBoYXMKKyAqIHVucmVjb3ZlcmFibGUgZXJyb3JzIHRoZW4g ZnJvbnRlbmQgY2Fubm90IHNlbmQgcmVxdWVzdHMgdG8gdGhlIGJhY2tlbmQKKyAqIGFuZCB0aHVz IGNhbm5vdCBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHZpcnR1YWxpemVkIGRldmljZSBh bnltb3JlLgorICogQWZ0ZXIgYmFja2VuZCBpcyBiYWNrIHRvIG5vcm1hbCB0aGUgdmlydHVhbGl6 ZWQgZGV2aWNlIG1heSBzdGlsbCBob2xkIHNvbWUKKyAqIHN0YXRlOiBjb25maWd1cmF0aW9uIGlu IHVzZSwgYWxsb2NhdGVkIGJ1ZmZlcnMsIGNsaWVudCBhcHBsaWNhdGlvbiBzdGF0ZSBldGMuCisg KiBJbiBtb3N0IGNhc2VzLCB0aGlzIHdpbGwgcmVxdWlyZSBmcm9udGVuZCB0byBpbXBsZW1lbnQg Y29tcGxleCByZWNvdmVyeQorICogcmVjb25uZWN0IGxvZ2ljLiBJbnN0ZWFkLCBieSBnb2luZyBp bnRvIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZyBzdGF0ZSwKKyAqIGZyb250ZW5kIHdpbGwgbWFr ZSBzdXJlIG5vIG5ldyBjbGllbnRzIG9mIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgYXJlCisgKiBh Y2NlcHRlZCwgYWxsb3cgZXhpc3RpbmcgY2xpZW50KHMpIHRvIGV4aXQgZ3JhY2VmdWxseSBieSBz aWduYWxpbmcgZXJyb3IKKyAqIHN0YXRlIGV0Yy4KKyAqIE9uY2UgYWxsIHRoZSBjbGllbnRzIGFy ZSBnb25lIGZyb250ZW5kIGNhbiByZWluaXRpYWxpemUgdGhlIHZpcnR1YWxpemVkCisgKiBkZXZp Y2UgYW5kIGdldCBpbnRvIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlIGFnYWluIHNpZ25h bGluZyB0aGUKKyAqIGJhY2tlbmQgdGhhdCBhIG5ldyBjb25uZWN0aW9uIGNhbiBiZSBtYWRlLgor ICoKKyAqIFRoZXJlIGFyZSBtdWx0aXBsZSBjb25kaXRpb25zIHBvc3NpYmxlIHVuZGVyIHdoaWNo IGZyb250ZW5kIHdpbGwgZ28gZnJvbQorICogWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIGludG8g WGVuYnVzU3RhdGVJbml0aWFsaXNpbmcsIHNvbWUgb2YgdGhlbSBhcmUgT1MKKyAqIHNwZWNpZmlj LiBGb3IgZXhhbXBsZToKKyAqIDEuIFRoZSB1bmRlcmx5aW5nIE9TIGZyYW1ld29yayBtYXkgcHJv dmlkZSBjYWxsYmFja3MgdG8gc2lnbmFsIHRoYXQgdGhlIGxhc3QKKyAqICAgIGNsaWVudCBvZiB0 aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGhhcyBnb25lIGFuZCB0aGUgZGV2aWNlIGNhbiBiZSByZW1v dmVkCisgKiAyLiBGcm9udGVuZCBjYW4gc2NoZWR1bGUgYSBkZWZlcnJlZCB3b3JrICh0aW1lci90 YXNrbGV0L3dvcmtxdWV1ZSkKKyAqICAgIHRvIHBlcmlvZGljYWxseSBjaGVjayBpZiB0aGlzIGlz IHRoZSByaWdodCB0aW1lIHRvIHJlLXRyeSByZW1vdmFsIG9mCisgKiAgICB0aGUgdmlydHVhbGl6 ZWQgZGV2aWNlLgorICogMy4gQnkgYW55IG90aGVyIG1lYW5zLgorICoKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUIENPREVTCisg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NPTkZJR19T RVQgICAgICAgIDB4MDAKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NPTkZJR19HRVQgICAgICAgIDB4 MDEKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NPTkZJR19WQUxJREFURSAgIDB4MDIKKyNkZWZpbmUg WEVOQ0FNRVJBX09QX0ZSQU1FX1JBVEVfU0VUICAgIDB4MDMKKyNkZWZpbmUgWEVOQ0FNRVJBX09Q X0JVRl9HRVRfTEFZT1VUICAgIDB4MDQKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNU ICAgICAgIDB4MDUKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgICAgICAgIDB4MDYK KyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9ERVNUUk9ZICAgICAgIDB4MDcKKyNkZWZpbmUgWEVO Q0FNRVJBX09QX0JVRl9RVUVVRSAgICAgICAgIDB4MDgKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JV Rl9ERVFVRVVFICAgICAgIDB4MDkKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxfRU5VTSAgICAg ICAgIDB4MGEKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxfU0VUICAgICAgICAgIDB4MGIKKyNk ZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxfR0VUICAgICAgICAgIDB4MGMKKyNkZWZpbmUgWEVOQ0FN RVJBX09QX1NUUkVBTV9TVEFSVCAgICAgIDB4MGQKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX1NUUkVB TV9TVE9QICAgICAgIDB4MGUKKworI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9CUklHSFRORVNTICAg ICAgMAorI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9DT05UUkFTVCAgICAgICAgMQorI2RlZmluZSBY RU5DQU1FUkFfQ1RSTF9TQVRVUkFUSU9OICAgICAgMgorI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9I VUUgICAgICAgICAgICAgMworCisvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIGNvbnRyb2xzLiAqLwor I2RlZmluZSBYRU5DQU1FUkFfTUFYX0NUUkwgICAgICAgICAgICAgNAorCisvKiBDb250cm9sIGlz IHJlYWQtb25seS4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfRkxHX1JPICAgICAgICAgICgx IDw8IDApCisvKiBDb250cm9sIGlzIHdyaXRlLW9ubHkuICovCisjZGVmaW5lIFhFTkNBTUVSQV9D VFJMX0ZMR19XTyAgICAgICAgICAoMSA8PCAxKQorLyogQ29udHJvbCdzIHZhbHVlIGlzIHZvbGF0 aWxlLiAqLworI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9GTEdfVk9MQVRJTEUgICAgKDEgPDwgMikK KworLyogU3VwcG9ydGVkIGNvbG9yIHNwYWNlcy4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9S U1BBQ0VfREVGQVVMVCAgIDAKKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfU01QVEUxNzBN IDEKKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfUkVDNzA5ICAgIDIKKyNkZWZpbmUgWEVO Q0FNRVJBX0NPTE9SU1BBQ0VfU1JHQiAgICAgIDMKKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BB Q0VfT1BSR0IgICAgIDQKKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfQlQyMDIwICAgIDUK KyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfRENJX1AzICAgIDYKKworLyogQ29sb3Igc3Bh Y2UgdHJhbnNmZXIgZnVuY3Rpb24uICovCisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfREVG QVVMVCAgICAwCisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfNzA5ICAgICAgICAxCisjZGVm aW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfU1JHQiAgICAgICAyCisjZGVmaW5lIFhFTkNBTUVSQV9Y RkVSX0ZVTkNfT1BSR0IgICAgICAzCisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfTk9ORSAg ICAgICA0CisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfRENJX1AzICAgICA1CisjZGVmaW5l IFhFTkNBTUVSQV9YRkVSX0ZVTkNfU01QVEUyMDg0ICA2CisKKy8qIENvbG9yIHNwYWNlIFnigJlD YkNyIGVuY29kaW5nLiAqLworI2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DX0lHTk9SRSAgICAg ICAgICAgMAorI2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DXzYwMSAgICAgICAgICAgICAgMQor I2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DXzcwOSAgICAgICAgICAgICAgMgorI2RlZmluZSBY RU5DQU1FUkFfWUNCQ1JfRU5DX1hWNjAxICAgICAgICAgICAgMworI2RlZmluZSBYRU5DQU1FUkFf WUNCQ1JfRU5DX1hWNzA5ICAgICAgICAgICAgNAorI2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5D X0JUMjAyMCAgICAgICAgICAgNQorI2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DX0JUMjAyMF9D T05TVF9MVU0gNgorCisvKiBRdWFudGl6YXRpb24gcmFuZ2UuICovCisjZGVmaW5lIFhFTkNBTUVS QV9RVUFOVElaQVRJT05fREVGQVVMVCAgICAgICAwCisjZGVmaW5lIFhFTkNBTUVSQV9RVUFOVEla QVRJT05fRlVMTF9SQU5HRSAgICAxCisjZGVmaW5lIFhFTkNBTUVSQV9RVUFOVElaQVRJT05fTElN X1JBTkdFICAgICAyCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEVWRU5UIENPREVTCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX0VWVF9GUkFNRV9BVkFJTCAgICAgIDB4MDAKKyNkZWZp bmUgWEVOQ0FNRVJBX0VWVF9DVFJMX0NIQU5HRSAgICAgIDB4MDEKKworLyogUmVzb2x1dGlvbiBo YXMgY2hhbmdlZC4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX0VWVF9DRkdfRkxHX1JFU09MICAgICgx IDw8IDApCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIFhF TlNUT1JFIEZJRUxEIEFORCBQQVRIIE5BTUUgU1RSSU5HUywgSEVMUEVSUworICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgorICovCisjZGVmaW5lIFhFTkNBTUVSQV9EUklWRVJfTkFNRSAgICAgICAgICAi dmNhbWVyYSIKKworI2RlZmluZSBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1IgICAgICAgIiwiCisj ZGVmaW5lIFhFTkNBTUVSQV9SRVNPTFVUSU9OX1NFUEFSQVRPUiAieCIKKyNkZWZpbmUgWEVOQ0FN RVJBX0ZSQUNUSU9OX1NFUEFSQVRPUiAgICIvIgorCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9C RV9WRVJTSU9OUyAgICAidmVyc2lvbnMiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9GRV9WRVJT SU9OICAgICAidmVyc2lvbiIKKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX1JFUV9SSU5HX1JFRiAg ICJyZXEtcmluZy1yZWYiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9SRVFfQ0hBTk5FTCAgICAi cmVxLWV2ZW50LWNoYW5uZWwiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9FVlRfUklOR19SRUYg ICAiZXZ0LXJpbmctcmVmIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRVZUX0NIQU5ORUwgICAg ImV2dC1ldmVudC1jaGFubmVsIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERfTUFYX0JVRkZFUlMg ICAgIm1heC1idWZmZXJzIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERfQ09OVFJPTFMgICAgICAg ImNvbnRyb2xzIgorI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRk9STUFUUyAgICAgICAgImZvcm1h dHMiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9GUkFNRV9SQVRFUyAgICAiZnJhbWUtcmF0ZXMi CisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9CRV9BTExPQyAgICAgICAiYmUtYWxsb2MiCisjZGVm aW5lIFhFTkNBTUVSQV9GSUVMRF9VTklRVUVfSUQgICAgICAidW5pcXVlLWlkIgorCisjZGVmaW5l IFhFTkNBTUVSQV9DVFJMX0JSSUdIVE5FU1NfU1RSICAiYnJpZ2h0bmVzcyIKKyNkZWZpbmUgWEVO Q0FNRVJBX0NUUkxfQ09OVFJBU1RfU1RSICAgICJjb250cmFzdCIKKyNkZWZpbmUgWEVOQ0FNRVJB X0NUUkxfU0FUVVJBVElPTl9TVFIgICJzYXR1cmF0aW9uIgorI2RlZmluZSBYRU5DQU1FUkFfQ1RS TF9IVUVfU1RSICAgICAgICAgImh1ZSIKKworI2RlZmluZSBYRU5DQU1FUkFfRk9VUkNDX0JJR0VO RElBTl9TVFIgIi1CRSIKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVyIHBsYW5lcyBzdXBw b3J0ZWQuICovCisjZGVmaW5lIFhFTkNBTUVSQV9NQVhfUExBTkUgICAgICAgICAgICA0CisKKy8q CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1RB VFVTIFJFVFVSTiBDT0RFUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXR1cyBy ZXR1cm4gY29kZSBpcyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIC1YRU5fRVhYIG9uIGZhaWx1cmUuCisg KgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBBc3N1bXB0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIC0gdXNhZ2Ugb2Yg Z3JhbnQgcmVmZXJlbmNlIDAgYXMgaW52YWxpZCBncmFudCByZWZlcmVuY2U6CisgKiAgIGdyYW50 IHJlZmVyZW5jZSAwIGlzIHZhbGlkLCBidXQgbmV2ZXIgZXhwb3NlZCB0byBhIFBWIGRyaXZlciwK KyAqICAgYmVjYXVzZSBvZiB0aGUgZmFjdCBpdCBpcyBhbHJlYWR5IGluIHVzZS9yZXNlcnZlZCBi eSB0aGUgUFYgY29uc29sZS4KKyAqIC0gYWxsIHJlZmVyZW5jZXMgaW4gdGhpcyBkb2N1bWVudCB0 byBwYWdlIHNpemVzIG11c3QgYmUgdHJlYXRlZAorICogICBhcyBwYWdlcyBvZiBzaXplIFhFTl9Q QUdFX1NJWkUgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KKyAqIC0gYWxsIEZPVVJDQyBtYXBwaW5n cyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGFuZCBtZXNzYWdpbmcgYXJlCisgKiAgIExpbnV4IFY0 TDIgb25lczogaHR0cHM6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQv dG9ydmFsZHMvbGludXguZ2l0L3RyZWUvaW5jbHVkZS91YXBpL2xpbnV4L3ZpZGVvZGV2Mi5oCisg KiAgIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorICogICAgIC0gY2hhcmFjdGVycyBh cmUgYWxsb3dlZCBpbiBbMHgyMDsgMHg3Zl0gcmFuZ2UKKyAqICAgICAtIHdoZW4gdXNlZCBmb3Ig WGVuU3RvcmUgY29uZmlndXJhdGlvbiBlbnRyaWVzIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGFy ZSBub3QgYWxsb3dlZDoKKyAqICAgICAgIC0gJy8nLCAnXCcsICcgJyAoc3BhY2UpLCAnPCcsICc+ JywgJzonLCAnIicsICd8JywgJz8nLCAnKicKKyAqICAgICAgIC0gaWYgdHJhaWxpbmcgc3BhY2Vz IGFyZSBwYXJ0IG9mIHRoZSBGT1VSQ0MgY29kZSB0aGVuIHRob3NlIG11c3QgYmUKKyAqICAgICAg ICAgdHJpbW1lZAorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBEZXNj cmlwdGlvbiBvZiB0aGUgcHJvdG9jb2wgYmV0d2VlbiBmcm9udGVuZCBhbmQgYmFja2VuZCBkcml2 ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgdHdvIGhhbHZlcyBvZiBhIFBh cmEtdmlydHVhbCBjYW1lcmEgZHJpdmVyIGNvbW11bmljYXRlIHdpdGgKKyAqIGVhY2ggb3RoZXIg dXNpbmcgc2hhcmVkIHBhZ2VzIGFuZCBldmVudCBjaGFubmVscy4KKyAqIFNoYXJlZCBwYWdlIGNv bnRhaW5zIGEgcmluZyB3aXRoIHJlcXVlc3QvcmVzcG9uc2UgcGFja2V0cy4KKyAqCisgKiBBbGwg cmVzZXJ2ZWQgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmVzIGJlbG93IG11c3QgYmUgMC4KKyAqCisg KiBGb3IgYWxsIHJlcXVlc3QvcmVzcG9uc2UvZXZlbnQgcGFja2V0czoKKyAqICAgLSBmcmFtZSBy YXRlIHBhcmFtZXRlciBpcyByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgNCBvY3RldCBsb25nCisg KiAgICAgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcjoKKyAqICAgICAgIC0gZnJhbWVfcmF0ZV9u dW1lciAtIHVpbnQzMl90LCBudW1lcmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUKKyAqICAgICAgIC0g ZnJhbWVfcmF0ZV9kZW5vbSAtIHVpbnQzMl90LCBkZW5vbWluYXRvciBvZiB0aGUgZnJhbWUgcmF0 ZQorICogICAgIFRoZSBjb3JyZXNwb25kaW5nIGZyYW1lIHJhdGUgKEh6KSBpcyBjYWxjdWxhdGVk IGFzOgorICogICAgICAgZnJhbWVfcmF0ZSA9IGZyYW1lX3JhdGVfbnVtZXIgLyBmcmFtZV9yYXRl X2Rlbm9tCisgKiAgIC0gYnVmZmVyIGluZGV4IGlzIGEgemVybyBiYXNlZCBpbmRleCBvZiB0aGUg YnVmZmVyLiBNdXN0IGJlIGxlc3MgdGhhbgorICogICAgIHRoZSB2YWx1ZSBvZiBYRU5DQU1FUkFf T1BfQ09ORklHX1NFVC5udW1fYnVmcyByZXNwb25zZToKKyAqICAgICAgIC0gaW5kZXggLSB1aW50 OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyLgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0gUmVxdWVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgorICogQWxsIHJlcXVlc3QgcGFja2V0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0 ZXRzKS4KKyAqIEFsbCByZXF1ZXN0IHBhY2tldHMgaGF2ZSBjb21tb24gaGVhZGVyOgorICogICAg ICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAz ICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAg ICAgICAgICAgICAgfCAgICBvcGVyYXRpb24gICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiAgIGlkIC0g dWludDE2X3QsIHByaXZhdGUgZ3Vlc3QgdmFsdWUsIGVjaG9lZCBpbiByZXNwb25zZS4KKyAqICAg b3BlcmF0aW9uIC0gdWludDhfdCwgb3BlcmF0aW9uIGNvZGUsIFhFTkNBTUVSQV9PUF9YWFguCisg KgorICoKKyAqIFJlcXVlc3QgdG8gc2V0L3ZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIC0gcmVx dWVzdCB0byBzZXQgdGhlCisgKiBjb25maWd1cmF0aW9uL21vZGUgb2YgdGhlIGNhbWVyYSAoWEVO Q0FNRVJBX09QX0NPTkZJR19TRVQpIG9yIHRvCisgKiBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlv biBpcyB2YWxpZCBhbmQgY2FuIGJlIHVzZWQKKyAqIChYRU5DQU1FUkFfT1BfQ09ORklHX1ZBTElE QVRFKToKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAg ICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NPTkZJR19YWFggfCAgIHJlc2VydmVkICAg ICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCBmb3JtYXQgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAx NgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhl aWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHhmZXJfZnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2Jjcl9l bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0MAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBwaXhlbF9mb3JtYXQgLSB1aW50MzJf dCwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQsIEZPVVJDQyBjb2RlLgorICogd2lkdGggLSB1aW50 MzJfdCwgd2lkdGggaW4gcGl4ZWxzLgorICogaGVpZ2h0IC0gdWludDMyX3QsIGhlaWdodCBpbiBw aXhlbHMuCisgKiBjb2xvcnNwYWNlIC0gdWludDMyX3QsIHRoaXMgc3VwcGxlbWVudHMgcGl4ZWxf Zm9ybWF0IHBhcmFtZXRlciwKKyAqICAgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9Y WFguCisgKiB4ZmVyX2Z1bmMgLSB1aW50MzJfdCwgdGhpcyBzdXBwbGVtZW50cyBjb2xvcnNwYWNl IHBhcmFtZXRlciwKKyAqICAgb25lIG9mIHRoZSBYRU5DQU1FUkFfWEZFUl9GVU5DX1hYWC4KKyAq IHljYmNyX2VuYyAtIHVpbnQzMl90LCB0aGlzIHN1cHBsZW1lbnRzIGNvbG9yc3BhY2UgcGFyYW1l dGVyLAorICogICBvbmUgb2YgdGhlIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfWFhYLiBQbGVhc2Ugbm90 ZSwgdGhhdCB5Y2Jjcl9lbmMgaXMgb25seQorICogICB2YWxpZCBmb3IgWUNiQ3IgcGl4ZWxmb3Jt YXRzIGFuZCBzaG91bGQgYmUgaWdub3JlZCBvdGhlcndpc2UuCisgKiBxdWFudGl6YXRpb24gLSB1 aW50MzJfdCwgdGhpcyBzdXBwbGVtZW50cyBjb2xvcnNwYWNlIHBhcmFtZXRlciwKKyAqICAgb25l IG9mIHRoZSBYRU5DQU1FUkFfUVVBTlRJWkFUSU9OX1hYWC4KKyAqCisgKiBTZWUgcmVzcG9uc2Ug Zm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCisgKgorICogTm90ZXM6CisgKiAgLSB0aGUgb25seSBk aWZmZXJlbmNlIGJldHdlZW4gWEVOQ0FNRVJBX09QX0NPTkZJR19WQUxJREFURSBhbmQKKyAqICAg IFhFTkNBTUVSQV9PUF9DT05GSUdfU0VUIGlzIHRoYXQgdGhlIGZvcm1lciBkb2Vzbid0IGFjdHVh bGx5IGNoYW5nZQorICogICAgY2FtZXJhIGNvbmZpZ3VyYXRpb24sIGJ1dCBxdWVyaWVzIGlmIHRo ZSBjb25maWd1cmF0aW9uIGlzIHZhbGlkLgorICogICAgVGhpcyBjYW4gYmUgdXNlZCB3aGlsZSBz dHJlYW0gaXMgYWN0aXZlIGFuZC9vciBidWZmZXJzIGFsbG9jYXRlZC4KKyAqICAtIGZyb250ZW5k IG11c3QgY2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UgaW4gb3JkZXIgdG8gc2VlCisg KiAgICBpZiB0aGUgdmFsdWVzIHJlcG9ydGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2gg dGhlIGRlc2lyZWQgb25lcworICogICAgYW5kIGNhbiBiZSBhY2NlcHRlZC4KKyAqICAtIGZyb250 ZW5kIG1heSBzZW5kIG11bHRpcGxlIFhFTkNBTUVSQV9PUF9DT05GSUdfU0VUIHJlcXVlc3RzIGJl Zm9yZQorICogICAgc2VuZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8g dXBkYXRlIG9yIHR1bmUgdGhlCisgKiAgICBmaW5hbCBzdHJlYW0gY29uZmlndXJhdGlvbi4KKyAq ICAtIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNoYW5nZWQgZHVyaW5nIGFjdGl2ZSBzdHJlYW1p bmcsIGUuZy4KKyAqICAgIGFmdGVyIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgYW5kIGJlZm9y ZSBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUT1AKKyAqICAgIHJlcXVlc3RzLgorICovCitzdHJ1Y3Qg eGVuY2FtZXJhX2NvbmZpZ19yZXEgeworICAgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdDsKKyAgICB1 aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgY29sb3Jz cGFjZTsKKyAgICB1aW50MzJfdCB4ZmVyX2Z1bmM7CisgICAgdWludDMyX3QgeWNiY3JfZW5jOwor ICAgIHVpbnQzMl90IHF1YW50aXphdGlvbjsKK307CisKKy8qCisgKiBSZXF1ZXN0IGN1cnJlbnQg Y29uZmlndXJhdGlvbiBvZiB0aGUgY2FtZXJhOgorICogICAgICAgICAwICAgICAgICAgICAgICAg IDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ09O RklHX0dFVCB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBTZWUgcmVzcG9u c2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCisgKgorICoKKyAqIFJlcXVlc3QgdG8gc2V0IHRo ZSBmcmFtZSByYXRlIG9mIHRoZSBzdHJlYW06CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAg MSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9GUkFNRV9S QVRFX1NFVHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGZy YW1lX3JhdGVfbnVtZXIgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX2Rlbm9tICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDIwCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGZyYW1lX3JhdGVfbnVt ZXIgLSB1aW50MzJfdCwgbnVtZXJhdG9yIG9mIHRoZSBmcmFtZSByYXRlLgorICogZnJhbWVfcmF0 ZV9kZW5vbSAtIHVpbnQzMl90LCBkZW5vbWluYXRvciBvZiB0aGUgZnJhbWUgcmF0ZS4KKyAqCisg KiBOb3RlczoKKyAqICAtIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IChhY3R1YWwpIGZyYW1lIHJhdGUg dXNlIFhFTkNBTUVSQV9PUF9DT05GSUdfR0VUCisgKiAgICByZXF1ZXN0LgorICogIC0gdGhpcyBy ZXF1ZXN0IGNhbiBiZSB1c2VkIHdpdGggY2FtZXJhIGJ1ZmZlcnMgYWxsb2NhdGVkLCBidXQgc3Ry ZWFtCisgKiAgICBzdG9wcGVkLCBlLmcuIGZyb250ZW5kIGlzIGFsbG93ZWQgdG8gc3RvcCB0aGUg c3RyZWFtIHdpdGgKKyAqICAgIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RPUCwgaG9sZCB0aGUgYnVm ZmVycyBhbGxvY2F0ZWQgKGUuZy4ga2VlcCB0aGUKKyAqICAgIGNvbmZpZ3VyYXRpb24gc2V0IHdp dGggWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQpLCBjaGFuZ2UgdGhlCisgKiAgICBmcmFtZSByYXRl IG9mIHRoZSBzdHJlYW0gYW5kIChyZSlzdGFydCB0aGUgc3RyZWFtIGFnYWluIHdpdGgKKyAqICAg IFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQuCisgKiAgLSBmcmFtZSByYXRlIGNhbm5vdCBiZSBj aGFuZ2VkIGR1cmluZyBhY3RpdmUgc3RyZWFtaW5nLCBlLmcuCisgKiAgICBhZnRlciBYRU5DQU1F UkFfT1BfU1RSRUFNX1NUQVJUIGFuZCBiZWZvcmUgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9QCisg KiAgICBjb21tYW5kcy4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9mcmFtZV9yYXRlX3JlcSB7Cisg ICAgdWludDMyX3QgZnJhbWVfcmF0ZV9udW1lcjsKKyAgICB1aW50MzJfdCBmcmFtZV9yYXRlX2Rl bm9tOworfTsKKworLyoKKyAqIFJlcXVlc3QgY2FtZXJhIGJ1ZmZlcidzIGxheW91dDoKKyAqICAg ICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAg MyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAg ICAgICAgICAgICAgIHwgX0JVRl9HRVRfTEFZT1VUfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0LgorICoKKyAq CisgKiBSZXF1ZXN0IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQ6CisgKiAgICAgICAgIDAg ICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAg IG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8IF9PUF9CVUZfUkVRVUVTVHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgbnVtX2J1ZnMg ICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAx MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKgorICogbnVtX2J1ZnMgLSB1aW50OF90LCBkZXNpcmVkIG51bWJlciBv ZiBidWZmZXJzIHRvIGJlIHVzZWQuCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhp cyByZXF1ZXN0LgorICoKKyAqIE5vdGVzOgorICogIC0gZnJvbnRlbmQgbXVzdCBjaGVjayB0aGUg Y29ycmVzcG9uZGluZyByZXNwb25zZSBpbiBvcmRlciB0byBzZWUKKyAqICAgIGlmIHRoZSB2YWx1 ZXMgcmVwb3J0ZWQgYmFjayBieSB0aGUgYmFja2VuZCBkbyBtYXRjaCB0aGUgZGVzaXJlZCBvbmVz CisgKiAgICBhbmQgY2FuIGJlIGFjY2VwdGVkLgorICogIC0gZnJvbnRlbmQgbWF5IHNlbmQgbXVs dGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUIHJlcXVlc3RzIGJlZm9yZQorICogICAgc2Vu ZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8gdXBkYXRlIG9yIHR1bmUg dGhlCisgKiAgICBjb25maWd1cmF0aW9uLgorICogIC0gYWZ0ZXIgdGhpcyByZXF1ZXN0IGNhbWVy YSBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjaGFuZ2VkLCB1bmxlc3MKKyAqICAgIHN0cmVhbWlu ZyBpcyBzdG9wcGVkIGFuZCBidWZmZXJzIGRlc3Ryb3llZAorICogIC0gcGFzc2luZyB6ZXJvIG51 bV9idWZzIGluIHRoaXMgcmVxdWVzdCAoYWZ0ZXIgc3RyZWFtaW5nIGhhcyBzdG9wcGVkCisgKiAg ICBhbmQgYWxsIGJ1ZmZlcnMgZGVzdHJveWVkKSB1bmJsb2NrcyBjYW1lcmEgY29uZmlndXJhdGlv biBjaGFuZ2VzLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9yZXF1ZXN0IHsKKyAgICB1aW50 OF90IG51bV9idWZzOworfTsKKworLyoKKyAqIFJlcXVlc3QgY2FtZXJhIGJ1ZmZlciBjcmVhdGlv bjoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAg ICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0JVRl9DUkVBVEUgfCAgIHJlc2VydmVkICAgICB8 IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgIGluZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICBwbGFuZV9vZmZzZXRbMF0gICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zm c2V0WzFdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFsyXSAgICAgICAgICAgICAg ICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICBwbGFuZV9vZmZzZXRbM10gICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZl9kaXJlY3Rv cnkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIEFuIGF0 dGVtcHQgdG8gY3JlYXRlIG11bHRpcGxlIGJ1ZmZlcnMgd2l0aCB0aGUgc2FtZSBpbmRleCBpcyBh biBlcnJvci4KKyAqIGluZGV4IGNhbiBiZSByZS11c2VkIGFmdGVyIGRlc3Ryb3lpbmcgdGhlIGNv cnJlc3BvbmRpbmcgY2FtZXJhIGJ1ZmZlci4KKyAqCisgKiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4 IG9mIHRoZSBidWZmZXIgdG8gYmUgY3JlYXRlZC4KKyAqIHBsYW5lX29mZnNldCAtIGFycmF5IG9m IHVpbnQzMl90LCBvZmZzZXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGxhbmUKKyAqICAgaW4gb2N0 ZXRzIGZyb20gdGhlIGJ1ZmZlciBzdGFydC4gTnVtYmVyIG9mIG9mZnNldHMgcmV0dXJuZWQgaXMK KyAqICAgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIFhFTkNBTUVSQV9PUF9CVUZfR0VU X0xBWU9VVC5udW1fcGxhbmVzLgorICogZ3JlZl9kaXJlY3RvcnkgLSBncmFudF9yZWZfdCwgYSBy ZWZlcmVuY2UgdG8gdGhlIGZpcnN0IHNoYXJlZCBwYWdlCisgKiAgIGRlc2NyaWJpbmcgc2hhcmVk IGJ1ZmZlciByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIGVxdWFsIHRvCisg KiAgIFhFTkNBTUVSQV9PUF9CVUZfR0VUX0xBWU9VVC5zaXplIHJlc3BvbnNlLiBBdCBsZWFzdCBv bmUgcGFnZSBleGlzdHMuIElmCisgKiAgIHNoYXJlZCBidWZmZXIgc2l6ZSBleGNlZWRzIHdoYXQg Y2FuIGJlIGFkZHJlc3NlZCBieSB0aGlzIHNpbmdsZSBwYWdlLAorICogICB0aGVuIHJlZmVyZW5j ZSB0byB0aGUgbmV4dCBzaGFyZWQgcGFnZSBtdXN0IGJlIHN1cHBsaWVkIChzZWUKKyAqICAgZ3Jl Zl9kaXJfbmV4dF9wYWdlIGJlbG93KS4KKyAqCisgKiBJZiBYRU5DQU1FUkFfRklFTERfQkVfQUxM T0MgY29uZmlndXJhdGlvbiBlbnRyeSBpcyBzZXQsIHRoZW4gYmFja2VuZCB3aWxsCisgKiBhbGxv Y2F0ZSB0aGUgYnVmZmVyIHdpdGggdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4gdGhpcyByZXF1 ZXN0IGFuZCBwYWdlCisgKiBkaXJlY3RvcnkgaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgorICogICBG cm9udGVuZCBvbiByZXF1ZXN0OgorICogICAgIC0gYWxsb2NhdGVzIHBhZ2VzIGZvciB0aGUgZGly ZWN0b3J5IChncmVmX2RpcmVjdG9yeSwKKyAqICAgICAgIGdyZWZfZGlyX25leHRfcGFnZShzKQor ICogICAgIC0gZ3JhbnRzIHBlcm1pc3Npb25zIGZvciB0aGUgcGFnZXMgb2YgdGhlIGRpcmVjdG9y eSB0byB0aGUgYmFja2VuZAorICogICAgIC0gc2V0cyBncmVmX2Rpcl9uZXh0X3BhZ2UgZmllbGRz CisgKiAgIEJhY2tlbmQgb24gcmVzcG9uc2U6CisgKiAgICAgLSBncmFudHMgcGVybWlzc2lvbnMg Zm9yIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCB0bworICogICAgICAgdGhlIGZy b250ZW5kCisgKiAgICAgLSBmaWxscyBpbiBwYWdlIGRpcmVjdG9yeSB3aXRoIGdyYW50IHJlZmVy ZW5jZXMKKyAqICAgICAgIChncmVmW10gaW4gc3RydWN0IHhlbmNhbWVyYV9wYWdlX2RpcmVjdG9y eSkKKyAqLworc3RydWN0IHhlbmNhbWVyYV9idWZfY3JlYXRlX3JlcSB7CisgICAgdWludDhfdCBp bmRleDsKKyAgICB1aW50OF90IHJlc2VydmVkWzNdOworICAgIHVpbnQzMl90IHBsYW5lX29mZnNl dFtYRU5DQU1FUkFfTUFYX1BMQU5FXTsKKyAgICBncmFudF9yZWZfdCBncmVmX2RpcmVjdG9yeTsK K307CisKKy8qCisgKiBTaGFyZWQgcGFnZSBmb3IgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgYnVm ZmVyIGRlc2NyaXB0b3IgKGdyZWZfZGlyZWN0b3J5IGluCisgKiB0aGUgcmVxdWVzdCkgZW1wbG95 cyBhIGxpc3Qgb2YgcGFnZXMsIGRlc2NyaWJpbmcgYWxsIHBhZ2VzIG9mIHRoZSBzaGFyZWQKKyAq IGRhdGEgYnVmZmVyOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAg ICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZl9kaXJfbmV4dF9wYWdlICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZ3JlZlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdyZWZbaV0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IGkqNCs4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmW04gLSAxXSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgTio0KzgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGdyZWZf ZGlyX25leHRfcGFnZSAtIGdyYW50X3JlZl90LCByZWZlcmVuY2UgdG8gdGhlIG5leHQgcGFnZSBk ZXNjcmliaW5nCisgKiAgIHBhZ2UgZGlyZWN0b3J5LiBNdXN0IGJlIDAgaWYgdGhlcmUgYXJlIG5v IG1vcmUgcGFnZXMgaW4gdGhlIGxpc3QuCisgKiBncmVmW2ldIC0gZ3JhbnRfcmVmX3QsIHJlZmVy ZW5jZSB0byBhIHNoYXJlZCBwYWdlIG9mIHRoZSBidWZmZXIKKyAqICAgYWxsb2NhdGVkIGF0IFhF TkNBTUVSQV9PUF9CVUZfQ1JFQVRFLgorICoKKyAqIE51bWJlciBvZiBncmFudF9yZWZfdCBlbnRy aWVzIGluIHRoZSB3aG9sZSBwYWdlIGRpcmVjdG9yeSBpcyBub3QKKyAqIHBhc3NlZCwgYnV0IGlu c3RlYWQgY2FuIGJlIGNhbGN1bGF0ZWQgYXM6CisgKiAgIG51bV9ncmVmc190b3RhbCA9IChYRU5D QU1FUkFfT1BfQlVGX1JFUVVFU1Quc2l6ZSArIFhFTl9QQUdFX1NJWkUgLSAxKSAvCisgKiAgICAg ICBYRU5fUEFHRV9TSVpFCisgKi8KK3N0cnVjdCB4ZW5jYW1lcmFfcGFnZV9kaXJlY3Rvcnkgewor ICAgIGdyYW50X3JlZl90IGdyZWZfZGlyX25leHRfcGFnZTsKKyAgICBncmFudF9yZWZfdCBncmVm WzFdOyAvKiBWYXJpYWJsZSBsZW5ndGggKi8KK307CisKKy8qCisgKiBSZXF1ZXN0IGJ1ZmZlciBk ZXN0cnVjdGlvbiAtIGRlc3Ryb3kgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYW1lcmEgYnVmZmVy OgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAg ICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0RFU1RST1l8ICAgcmVzZXJ2ZWQgICAgIHwg NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cisg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGluZGV4IC0gdWludDhfdCwgaW5k ZXggb2YgdGhlIGJ1ZmZlciB0byBiZSBkZXN0cm95ZWQuCisgKgorICoKKyAqIFJlcXVlc3QgcXVl dWVpbmcgb2YgdGhlIGJ1ZmZlciBmb3IgYmFja2VuZCB1c2U6CisgKiAgICAgICAgIDAgICAgICAg ICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8 IF9PUF9CVUZfUVVFVUUgIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICBpbmRleCAgICAgfCAg ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKgorICogTm90ZXM6CisgKiAgLSBmcm9udGVuZHMgbXVzdCBub3QgYWNjZXNzIHRo ZSBidWZmZXIgY29udGVudCBhZnRlciB0aGlzIHJlcXVlc3QgdW50aWwKKyAqICAgIHJlc3BvbnNl IHRvIFhFTkNBTUVSQV9PUF9CVUZfREVRVUVVRSBoYXMgYmVlbiByZWNlaXZlZC4KKyAqICAtIGJ1 ZmZlcnMgbXVzdCBiZSBxdWV1ZWQgdG8gdGhlIGJhY2tlbmQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhl bSB3aXRoCisgKiAgICBYRU5DQU1FUkFfT1BfQlVGX0RFU1RST1kuCisgKgorICogaW5kZXggLSB1 aW50OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIHF1ZXVlZC4KKyAqCisgKgorICogUmVx dWVzdCBkZXF1ZXVlaW5nIG9mIHRoZSBidWZmZXIgZm9yIGZyb250ZW5kIHVzZToKKyAqICAgICAg ICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAg ICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAg ICAgICAgICAgIHxfT1BfQlVGX0RFUVVFVUUgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgIGlu ZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAg ICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBOb3RlczoKKyAqICAtIGZyb250ZW5kIGlzIGFsbG93 ZWQgdG8gYWNjZXNzIHRoZSBidWZmZXIgY29udGVudCBhZnRlciB0aGUgY29ycmVzcG9uZGluZwor ICogICAgcmVzcG9uc2UgdG8gdGhpcyByZXF1ZXN0LgorICoKKyAqIGluZGV4IC0gdWludDhfdCwg aW5kZXggb2YgdGhlIGJ1ZmZlciB0byBiZSBxdWV1ZWQuCisgKgorICoKKyAqIFJlcXVlc3QgY2Ft ZXJhIGNvbnRyb2wgZGV0YWlsczoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAg ICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NUUkxfRU5VTSAg fCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgIGluZGV4ICAg ICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEy CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqCisgKiBTZWUgcmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3Qu CisgKgorICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgY29udHJvbCB0byBiZSBxdWVy aWVkLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2luZGV4IHsKKyAgICB1aW50OF90IGluZGV4Owor fTsKKworLyoKKyAqIFJlcXVlc3QgY2FtZXJhIGNvbnRyb2wgY2hhbmdlOgorICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAg ICAgICAgfCAgX09QX1NFVF9DVFJMICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgIHR5cGUgICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAg ICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg MTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxvdyAzMi1iaXQgICAgICAgICAg ICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICB2YWx1ZSBoaWdoIDMyLWJpdCAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2 ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq IHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICoKKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBv bmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4KKyAqIHZhbHVlIC0gaW50NjRfdCwgbmV3IHZh bHVlIG9mIHRoZSBjb250cm9sLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxfdmFsdWUgewor ICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IHJlc2VydmVkWzddOworICAgIGludDY0X3Qg dmFsdWU7Cit9OworCisvKgorICogUmVxdWVzdCBjYW1lcmEgY29udHJvbCBzdGF0ZToKKyAqICAg ICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAg MyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAg ICAgICAgICAgICAgIHwgIF9PUF9HRVRfQ1RSTCAgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICB0eXBlICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFNlZSByZXNw b25zZSBmb3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4KKyAqCisgKiB0eXBlIC0gdWludDhfdCwgdHlw ZSBvZiB0aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCisgKi8KK3N0 cnVjdCB4ZW5jYW1lcmFfZ2V0X2N0cmxfcmVxIHsKKyAgICB1aW50OF90IHR5cGU7Cit9OworCisv KgorICogUmVxdWVzdCBjYW1lcmEgY2FwdHVyZSBzdHJlYW0gc3RhcnQ6CisgKiAgICAgICAgIDAg ICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAg IG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8X09QX1NUUkVBTV9TVEFSVHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoK KyAqCisgKiBSZXF1ZXN0IGNhbWVyYSBjYXB0dXJlIHN0cmVhbSBzdG9wOgorICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAg ICAgICAgfF9PUF9TVFJFQU1fU1RPUCB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2 ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc3BvbnNlcyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFsbCByZXNwb25zZSBwYWNrZXRz IGhhdmUgdGhlIHNhbWUgbGVuZ3RoICg2NCBvY3RldHMpLgorICoKKyAqIEFsbCByZXNwb25zZSBw YWNrZXRzIGhhdmUgY29tbW9uIGhlYWRlcjoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAx ICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgICAgb3BlcmF0 aW9uICAgfCAgICByZXNlcnZlZCAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGlkIC0gdWludDE2X3QsIGNvcGllZCBmcm9t IHRoZSByZXF1ZXN0LgorICogb3BlcmF0aW9uIC0gdWludDhfdCwgWEVOQ0FNRVJBX09QXyogLSBj b3BpZWQgZnJvbSByZXF1ZXN0LgorICogc3RhdHVzIC0gaW50MzJfdCwgcmVzcG9uc2Ugc3RhdHVz LCB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIC1YRU5fRVhYIG9uIGZhaWx1cmUuCisgKgorICoKKyAqIENv bmZpZ3VyYXRpb24gcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0NPTkZJR19T RVQsCisgKiBYRU5DQU1FUkFfT1BfQ09ORklHX0dFVCBhbmQgWEVOQ0FNRVJBX09QX0NPTkZJR19W QUxJREFURSByZXF1ZXN0czoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAg ICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NPTkZJR19YWFggfCAg ICByZXNlcnZlZCAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCBmb3Jt YXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHhmZXJfZnVuYyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAyOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB5Y2Jjcl9lbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgIGRpc3BsX2FzcF9yYXRpb19udW1lciAgICAgICAgICAgICAgICAgICAg ICAgfCA0MAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICBkaXNw bF9hc3BfcmF0aW9fZGVub20gICAgICAgICAgICAgICAgICAgICAgIHwgNDQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9udW1lciAgICAg ICAgICAgICAgICAgICAgICAgICB8IDQ4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfZGVub20gICAgICAgICAgICAgICAgICAgICAgICAg fCA1MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTYKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKgorICogTWVhbmluZyBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1 ZXMgaW4gdGhpcyByZXNwb25zZSBpcyB0aGUgc2FtZSBhcyBmb3IKKyAqIFhFTkNBTUVSQV9PUF9D T05GSUdfU0VUIGFuZCBYRU5DQU1FUkFfT1BfRlJBTUVfUkFURV9TRVQgcmVxdWVzdHMuCisgKgor ICogZGlzcGxfYXNwX3JhdGlvX251bWVyIC0gdWludDMyX3QsIG51bWVyYXRvciBvZiB0aGUgZGlz cGxheSBhc3BlY3QgcmF0aW8uCisgKiBkaXNwbF9hc3BfcmF0aW9fZGVub20gLSB1aW50MzJfdCwg ZGVub21pbmF0b3Igb2YgdGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvLgorICovCitzdHJ1Y3QgeGVu Y2FtZXJhX2NvbmZpZ19yZXNwIHsKKyAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXQ7CisgICAgdWlu dDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGNvbG9yc3Bh Y2U7CisgICAgdWludDMyX3QgeGZlcl9mdW5jOworICAgIHVpbnQzMl90IHljYmNyX2VuYzsKKyAg ICB1aW50MzJfdCBxdWFudGl6YXRpb247CisgICAgdWludDMyX3QgZGlzcGxfYXNwX3JhdGlvX251 bWVyOworICAgIHVpbnQzMl90IGRpc3BsX2FzcF9yYXRpb19kZW5vbTsKKyAgICB1aW50MzJfdCBm cmFtZV9yYXRlX251bWVyOworICAgIHVpbnQzMl90IGZyYW1lX3JhdGVfZGVub207Cit9OworCisv KgorICogUmVxdWVzdCBidWZmZXIgcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09Q X0JVRl9HRVRfTEFZT1VUCisgKiByZXF1ZXN0OgorICogICAgICAgICAwICAgICAgICAgICAgICAg IDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9CVUZfR0VU X0xBWU9VVCB8ICAgIHJlc2VydmVkICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgbnVtX3BsYW5lcyAgIHwgICAgICAgICAg ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICBwbGFuZV9zaXplWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAyMAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxh bmVfc2l6ZVsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3NpemVbMl0gICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDI4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICBwbGFuZV9zaXplWzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAz MgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9z dHJpZGVbMF0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzYKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc3RyaWRlWzFdICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDQwCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgIHBsYW5lX3N0cmlkZVsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0NAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdHJp ZGVbM10gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDgKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKgorICogbnVtX3BsYW5lcyAtIHVpbnQ4X3QsIG51bWJlciBvZiBwbGFuZXMg b2YgdGhlIGJ1ZmZlci4KKyAqIHNpemUgLSB1aW50MzJfdCwgb3ZlcmFsbCBzaXplIG9mIHRoZSBi dWZmZXIgaW5jbHVkaW5nIHNpemVzIG9mIHRoZQorICogICBpbmRpdmlkdWFsIHBsYW5lcyBhbmQg cGFkZGluZyBpZiBhcHBsaWNhYmxlLgorICogcGxhbmVfc2l6ZSAtIGFycmF5IG9mIHVpbnQzMl90 LCBzaXplIGluIG9jdGV0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBwbGFuZQorICogICBpbmNsdWRp bmcgcGFkZGluZy4KKyAqIHBsYW5lX3N0cmlkZSAtIGFycmF5IG9mIHVpbnQzMl90LCBzaXplIGlu IG9jdGV0cyBvY2N1cGllZCBieSB0aGUKKyAqICAgY29ycmVzcG9uZGluZyBzaW5nbGUgaW1hZ2Ug bGluZSBpbmNsdWRpbmcgcGFkZGluZyBpZiBhcHBsaWNhYmxlLgorICoKKyAqIE5vdGUhIFRoZSBz aXplcyBhbmQgc3RyaWRlcyBpbiB0aGlzIHJlc3BvbnNlIGFwcGx5IHRvIGFsbCBidWZmZXJzIGNy ZWF0ZWQKKyAqIHdpdGggWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgY29tbWFuZCwgYnV0IGluZGl2 aWR1YWwgYnVmZmVycyBtYXkgaGF2ZQorICogZGlmZmVyZW50IHBsYW5lIG9mZnNldHMsIHNlZSBY RU5DQU1FUkFfT1BfQlVGX1JFUVVFU1QucGxhbmVfb2Zmc2V0LgorICovCitzdHJ1Y3QgeGVuY2Ft ZXJhX2J1Zl9nZXRfbGF5b3V0X3Jlc3AgeworICAgIHVpbnQ4X3QgbnVtX3BsYW5lczsKKyAgICB1 aW50OF90IHJlc2VydmVkWzNdOworICAgIHVpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgcGxh bmVfc2l6ZVtYRU5DQU1FUkFfTUFYX1BMQU5FXTsKKyAgICB1aW50MzJfdCBwbGFuZV9zdHJpZGVb WEVOQ0FNRVJBX01BWF9QTEFORV07Cit9OworCisvKgorICogUmVxdWVzdCBidWZmZXIgcmVzcG9u c2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUCisgKiByZXF1ZXN0Ogor ICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAg ICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg aWQgICAgICAgICAgICAgICAgfF9PUF9CVUZfUkVRVUVTVCB8ICAgIHJlc2VydmVkICAgIHwgNAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1 cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgbnVtX2J1ZmZlcnMgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIG51bV9idWZmZXJzIC0gdWludDhfdCwg bnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZC4KKyAqCisgKgorICogQ29udHJvbCBlbnVtZXJh dGUgcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0NUUkxfRU5VTToKKyAqICAg ICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAg MyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAg ICAgICAgICAgICAgIHwgX09QX0NUUkxfRU5VTSAgfCAgICByZXNlcnZlZCAgICB8IDQKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg aW5kZXggICAgICB8ICAgICAgdHlwZSAgICAgIHwgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gbG93IDMyLWJpdHMgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgbWluIGhpZ2ggMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAg ICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIG1h eCBsb3cgMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggaGlnaCAzMi1iaXRzICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICBzdGVwIGxvdyAzMi1iaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCBo aWdoIDMyLWJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgfCA0MAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3ZhbCBsb3cgMzItYml0cyAgICAgICAg ICAgICAgICAgICAgICAgIHwgNDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgIGRlZl92YWwgaGlnaCAzMi1iaXRzICAgICAgICAgICAgICAgICAgICAgICB8IDQ4 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA1MgorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqCisgKiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBjYW1lcmEg Y29udHJvbCBpbiByZXNwb25zZS4KKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250 cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4KKyAqIGZsYWdzIC0gdWludDMyX3Qs IGZsYWdzIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX0ZMR19YWFgu CisgKiBtaW4gLSBpbnQ2NF90LCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjb250cm9sLgorICogbWF4 IC0gaW50NjRfdCwgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KKyAqIHN0ZXAgLSBpbnQ2 NF90LCBtaW5pbXVtIHNpemUgaW4gd2hpY2ggY29udHJvbCB2YWx1ZSBjYW4gYmUgY2hhbmdlZC4K KyAqIGRlZl92YWwgLSBpbnQ2NF90LCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250cm9sLgorICov CitzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxfZW51bV9yZXNwIHsKKyAgICB1aW50OF90IGluZGV4Owor ICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IHJlc2VydmVkWzJdOworICAgIHVpbnQzMl90 IGZsYWdzOworICAgIGludDY0X3QgbWluOworICAgIGludDY0X3QgbWF4OworICAgIGludDY0X3Qg c3RlcDsKKyAgICBpbnQ2NF90IGRlZl92YWw7Cit9OworCisvKgorICogR2V0IGNvbnRyb2wgcmVz cG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0NUUkxfR0VUOgorICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAg ICAgICAgfCBfT1BfQ1RSTF9HRVQgICB8ICAgIHJlc2VydmVkICAgIHwgNAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgIHR5cGUg ICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwg OAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgIHZhbHVlIGxvdyAzMi1iaXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBoaWdo IDMyLWJpdCAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDI4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIHR5 cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9D VFJMX1hYWC4KKyAqIHZhbHVlIC0gaW50NjRfdCwgbmV3IHZhbHVlIG9mIHRoZSBjb250cm9sLgor ICovCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2ZW50cyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRXZlbnRzIGFyZSBzZW50 IHZpYSBhIHNoYXJlZCBwYWdlIGFsbG9jYXRlZCBieSB0aGUgZnJvbnQgYW5kIHByb3BhZ2F0ZWQg YnkKKyAqICAgZXZ0LWV2ZW50LWNoYW5uZWwvZXZ0LXJpbmctcmVmIFhlblN0b3JlIGVudHJpZXMu CisgKgorICogQWxsIGV2ZW50IHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKDY0IG9jdGV0 cykuCisgKiBBbGwgZXZlbnQgcGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6CisgKiAgICAgICAg IDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAg ICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAg ICAgICAgICB8ICAgICAgdHlwZSAgICAgIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBpZCAtIHVp bnQxNl90LCBldmVudCBpZCwgbWF5IGJlIHVzZWQgYnkgZnJvbnQuCisgKiB0eXBlIC0gdWludDhf dCwgdHlwZSBvZiB0aGUgZXZlbnQuCisgKgorICoKKyAqIEZyYW1lIGNhcHR1cmVkIGV2ZW50IC0g ZXZlbnQgZnJvbSBiYWNrIHRvIGZyb250IHdoZW4gYSBuZXcgY2FwdHVyZWQKKyAqIGZyYW1lIGlz IGF2YWlsYWJsZToKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAg ICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfRVZUX0ZSQU1FX0FWQUlMfCAgIHJlc2Vy dmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgIGluZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2 ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1c2VkX3N6ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgIHNlcV9udW0gbG93IDMyLWJpdHMgICAg ICAgICAgICAgICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICBzZXFfbnVtIGhpZ2ggMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAg fCAyOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKgorICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgYnVm ZmVyIHRoYXQgY29udGFpbnMgbmV3IGNhcHR1cmVkIGZyYW1lLgorICogdXNlZF9zeiAtIHVpbnQz Ml90LCBudW1iZXIgb2Ygb2N0ZXRzIHRoaXMgZnJhbWUgaGFzLiBUaGlzIGNhbiBiZSBsZXNzCisg KiB0aGFuIHRoZSBYRU5DQU1FUkFfT1BfQlVGX1JFUVVFU1Quc2l6ZSAocmVzcG9uc2UpIGZvciBj b21wcmVzc2VkIGZvcm1hdHMuCisgKiBzZXFfbnVtIC0gdWludDY0X3QsIHNlcXVlbnRpYWwgbnVt YmVyIG9mIHRoZSBmcmFtZS4gTXVzdCBiZQorICogICBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcu IElmIHNraXBzIGFyZSBkZXRlY3RlZCBpbiBzZXFfbnVtIHRoZW4gdGhhdAorICogICBtZWFucyB0 aGF0IHRoZSBmcmFtZXMgaW4tYmV0d2VlbiB3ZXJlIGRyb3BwZWQuCisgKi8KK3N0cnVjdCB4ZW5j YW1lcmFfZnJhbWVfYXZhaWxfZXZ0IHsKKyAgICB1aW50OF90IGluZGV4OworICAgIHVpbnQ4X3Qg cmVzZXJ2ZWQwWzNdOworICAgIHVpbnQzMl90IHVzZWRfc3o7CisgICAgdWludDhfdCByZXNlcnZl ZDFbNF07CisgICAgdWludDY0X3Qgc2VxX251bTsKK307CisKKy8qCisgKiBDb250cm9sIGNoYW5n ZSBldmVudC0gZXZlbnQgZnJvbSBiYWNrIHRvIGZyb250IHdoZW4gY2FtZXJhIGNvbnRyb2wKKyAq IGhhcyBjaGFuZ2VkOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAg ICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9FVlRfQ1RSTF9DSEFOR0V8ICAgcmVz ZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgIHR5cGUgICAgIHwgICAg ICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg IHZhbHVlIGxvdyAzMi1iaXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBoaWdoIDMyLWJpdCAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDI4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIHR5cGUgLSB1aW50 OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4K KyAqIHZhbHVlIC0gaW50NjRfdCwgbmV3IHZhbHVlIG9mIHRoZSBjb250cm9sLgorICoKKyAqIE5v dGVzOgorICogIC0gdGhpcyBldmVudCBpcyBub3Qgc2VudCBmb3Igd3JpdGUtb25seSBjb250cm9s cworICogIC0gdGhpcyBldmVudCBpcyBub3Qgc2VudCB0byB0aGUgb3JpZ2luYXRvciBvZiB0aGUg Y29udHJvbCBjaGFuZ2UKKyAqICAtIHRoaXMgZXZlbnQgaXMgbm90IHNlbnQgd2hlbiBmcm9udGVu ZCBmaXJzdCBjb25uZWN0cywgZS5nLiBpbml0aWFsCisgKiAgICBjb250cm9sIHN0YXRlIG11c3Qg YmUgZXhwbGljaXRseSBxdWVyaWVkCisgKi8KKworc3RydWN0IHhlbmNhbWVyYV9yZXEgeworICAg IHVpbnQxNl90IGlkOworICAgIHVpbnQ4X3Qgb3BlcmF0aW9uOworICAgIHVpbnQ4X3QgcmVzZXJ2 ZWRbNV07CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZ19yZXEg Y29uZmlnOworICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2ZyYW1lX3JhdGVfcmVxIGZyYW1lX3Jh dGU7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfYnVmX3JlcXVlc3QgYnVmX3JlcXVlc3Q7Cisg ICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfYnVmX2NyZWF0ZV9yZXEgYnVmX2NyZWF0ZTsKKyAgICAg ICAgc3RydWN0IHhlbmNhbWVyYV9pbmRleCBpbmRleDsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVy YV9jdHJsX3ZhbHVlIGN0cmxfdmFsdWU7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfZ2V0X2N0 cmxfcmVxIGdldF9jdHJsOworICAgICAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKKyAgICB9IHJl cTsKK307CisKK3N0cnVjdCB4ZW5jYW1lcmFfcmVzcCB7CisgICAgdWludDE2X3QgaWQ7CisgICAg dWludDhfdCBvcGVyYXRpb247CisgICAgdWludDhfdCByZXNlcnZlZDsKKyAgICBpbnQzMl90IHN0 YXR1czsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY29uZmlnX3Jlc3Ag Y29uZmlnOworICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9nZXRfbGF5b3V0X3Jlc3AgYnVm X2xheW91dDsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9idWZfcmVxdWVzdCBidWZfcmVxdWVz dDsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9jdHJsX2VudW1fcmVzcCBjdHJsX2VudW07Cisg ICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY3RybF92YWx1ZSBjdHJsX3ZhbHVlOworICAgICAgICB1 aW50OF90IHJlc2VydmVkMVs1Nl07CisgICAgfSByZXNwOworfTsKKworc3RydWN0IHhlbmNhbWVy YV9ldnQgeworICAgIHVpbnQxNl90IGlkOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90 IHJlc2VydmVkWzVdOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9mcmFt ZV9hdmFpbF9ldnQgZnJhbWVfYXZhaWw7CisgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY3RybF92 YWx1ZSBjdHJsX3ZhbHVlOworICAgICAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKKyAgICB9IGV2 dDsKK307CisKK0RFRklORV9SSU5HX1RZUEVTKHhlbl9jYW1lcmFpZiwgc3RydWN0IHhlbmNhbWVy YV9yZXEsIHN0cnVjdCB4ZW5jYW1lcmFfcmVzcCk7CisKKy8qCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJhY2sgdG8gZnJvbnQgZXZlbnRzIGRlbGl2 ZXJ5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbiBvcmRlciB0byBkZWxpdmVyIGFzeW5j aHJvbm91cyBldmVudHMgZnJvbSBiYWNrIHRvIGZyb250IGEgc2hhcmVkIHBhZ2UgaXMKKyAqIGFs bG9jYXRlZCBieSBmcm9udCBhbmQgaXRzIGdyYW50ZWQgcmVmZXJlbmNlIHByb3BhZ2F0ZWQgdG8g YmFjayB2aWEKKyAqIFhlblN0b3JlIGVudHJpZXMgKGV2dC1yaW5nLXJlZi9ldnQtZXZlbnQtY2hh bm5lbCkuCisgKiBUaGlzIHBhZ2UgaGFzIGEgY29tbW9uIGhlYWRlciB1c2VkIGJ5IGJvdGggZnJv bnQgYW5kIGJhY2sgdG8gc3luY2hyb25pemUKKyAqIGFjY2VzcyBhbmQgY29udHJvbCBldmVudCdz IHJpbmcgYnVmZmVyLCB3aGlsZSBiYWNrIGJlaW5nIGEgcHJvZHVjZXIgb2YgdGhlCisgKiBldmVu dHMgYW5kIGZyb250IGJlaW5nIGEgY29uc3VtZXIuIFRoZSByZXN0IG9mIHRoZSBwYWdlIGFmdGVy IHRoZSBoZWFkZXIKKyAqIGlzIHVzZWQgZm9yIGV2ZW50IHBhY2tldHMuCisgKgorICogVXBvbiBy ZWNlcHRpb24gb2YgYW4gZXZlbnQocykgZnJvbnQgbWF5IGNvbmZpcm0gaXRzIHJlY2VwdGlvbgor ICogZm9yIGVpdGhlciBlYWNoIGV2ZW50LCBncm91cCBvZiBldmVudHMgb3Igbm9uZS4KKyAqLwor CitzdHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UgeworICAgIHVpbnQzMl90IGluX2NvbnM7Cisg ICAgdWludDMyX3QgaW5fcHJvZDsKKyAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKK307CisKKyNk ZWZpbmUgWEVOQ0FNRVJBX0VWRU5UX1BBR0VfU0laRSA0MDk2CisjZGVmaW5lIFhFTkNBTUVSQV9J Tl9SSU5HX09GRlMgKHNpemVvZihzdHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UpKQorI2RlZmlu ZSBYRU5DQU1FUkFfSU5fUklOR19TSVpFIChYRU5DQU1FUkFfRVZFTlRfUEFHRV9TSVpFIC0gWEVO Q0FNRVJBX0lOX1JJTkdfT0ZGUykKKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVOIChYRU5D QU1FUkFfSU5fUklOR19TSVpFIC8gc2l6ZW9mKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0KSkKKyNkZWZp bmUgWEVOQ0FNRVJBX0lOX1JJTkcocGFnZSkgXAorICAgICgoc3RydWN0IHhlbmNhbWVyYV9ldnQg KikoKGNoYXIgKikocGFnZSkgKyBYRU5DQU1FUkFfSU5fUklOR19PRkZTKSkKKyNkZWZpbmUgWEVO Q0FNRVJBX0lOX1JJTkdfUkVGKHBhZ2UsIGlkeCkgXAorICAgIChYRU5DQU1FUkFfSU5fUklORygo cGFnZSkpWyhpZHgpICUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVOXSkKKworI2VuZGlmIC8qIF9fWEVO X1BVQkxJQ19JT19DQU1FUkFJRl9IX18gKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAq IG1vZGU6IEMKKyAqIGMtZmlsZS1zdHlsZTogIkJTRCIKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0Cisg KiB0YWItd2lkdGg6IDQKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICovCi0t IAoyLjE5LjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo dHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,T_MIXED_ES,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2CC7C65BAF for ; Wed, 12 Dec 2018 09:49:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5CAB720873 for ; Wed, 12 Dec 2018 09:49:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Jp6tklGZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5CAB720873 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-media-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726796AbeLLJtr (ORCPT ); Wed, 12 Dec 2018 04:49:47 -0500 Received: from mail-lf1-f45.google.com ([209.85.167.45]:45032 "EHLO mail-lf1-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726598AbeLLJtr (ORCPT ); Wed, 12 Dec 2018 04:49:47 -0500 Received: by mail-lf1-f45.google.com with SMTP id z13so13008849lfe.11 for ; Wed, 12 Dec 2018 01:49:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dQDsB1l7vfetU2CeGEHpvPcPV637I/U6TnwvR+simmY=; b=Jp6tklGZyLfJ+nfZ2NLpjXF9pFaBE91XCGaCAhXjLCn1MXT8DI/b5sgfq9MKImGaBw qlXotTCudc6RxfkenLC0o3Gug2AFg8l8QN328PSbLqu2/UfMyaRT0917bfY6kT27Xnwk D/9bmau+lWWWKJbRzjVbYrTrTRoKur0MFdI4YkOqsiqckFizculQNlsGHoLEo9GJ9vp5 oditd2qJtg29bEYHaNCzWmm4WmLunrZtm4UZmUfuSlFdHa6FOL+d1YEQ8UGFaCDfJAYn B34mpB+2Ku0aivAwUDL5gcFvpRhKlthK7rNPD1oqo/z1Xm0FqMXYmcRVXU/NNivsT5hS aLCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dQDsB1l7vfetU2CeGEHpvPcPV637I/U6TnwvR+simmY=; b=D31T34cPIUjN9Dj0lpJ8Ret44xtjxDl4mrI1z2JDs+9lktJe6tN0goUUeIvWQKF+Bw XHhSD8DiqJiJEkVLRGhnEdUUg8vCDVrMToUu2Yfc1MP+kyLeswZdxihnl6SUQN+b6+bk sIeKDZDjRt7jSWxUAPDaeVvFO6AZpjoeK2Kkt9KBLoikq4YwBC1K5ltotOaWak7+1t5b zRXMuqZoGi5KZdZ0Ek2HPGrfxbTP+/wdNT0jI2ewNb4DdgtmL8I4qQdoaVg4MWq+6XoL vT77HJYlkSpytRGr7TXRE7pUts2VLTuQCL+JqVOG5yNCzQRPIndvPTUbM170aJ1oUmQG jPag== X-Gm-Message-State: AA+aEWZgnpIp71DOczFWdZ1WzaNiSGVAEcEQAHn667ikdCIkdHyq7xB7 w95zDJLNaZrRR8B39wFQHA0= X-Google-Smtp-Source: AFSGD/XLR3BOtLwJy0kOC4qUmnlmmvKAiaC/Sz5cvojZkhlMc1bsi6DSKSwIB+w1QzUTWgy7vzMULQ== X-Received: by 2002:a19:2755:: with SMTP id n82mr10755491lfn.94.1544608179663; Wed, 12 Dec 2018 01:49:39 -0800 (PST) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id t19-v6sm3188680lje.23.2018.12.12.01.49.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 12 Dec 2018 01:49:38 -0800 (PST) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com, hverkuil@xs4all.nl Cc: Oleksandr Andrushchenko Subject: [Xen-devel][PATCH v3 1/1] cameraif: add ABI for para-virtual camera Date: Wed, 12 Dec 2018 11:49:29 +0200 Message-Id: <20181212094929.4709-2-andr2000@gmail.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181212094929.4709-1-andr2000@gmail.com> References: <20181212094929.4709-1-andr2000@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org From: Oleksandr Andrushchenko This is the ABI for the two halves of a para-virtualized camera driver which extends Xen's reach multimedia capabilities even farther enabling it for video conferencing, In-Vehicle Infotainment, high definition maps etc. The initial goal is to support most needed functionality with the final idea to make it possible to extend the protocol if need be: 1. Provide means for base virtual device configuration: - pixel formats - resolutions - frame rates 2. Support basic camera controls: - contrast - brightness - hue - saturation 3. Support streaming control Signed-off-by: Oleksandr Andrushchenko --- xen/include/public/io/cameraif.h | 1374 ++++++++++++++++++++++++++++++ 1 file changed, 1374 insertions(+) create mode 100644 xen/include/public/io/cameraif.h diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h new file mode 100644 index 000000000000..9aae0f47743b --- /dev/null +++ b/xen/include/public/io/cameraif.h @@ -0,0 +1,1374 @@ +/****************************************************************************** + * cameraif.h + * + * Unified camera device I/O interface for Xen guest OSes. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (C) 2018 EPAM Systems Inc. + * + * Author: Oleksandr Andrushchenko + */ + +#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ +#define __XEN_PUBLIC_IO_CAMERAIF_H__ + +#include "ring.h" +#include "../grant_table.h" + +/* + ****************************************************************************** + * Protocol version + ****************************************************************************** + */ +#define XENCAMERA_PROTOCOL_VERSION "1" + +/* + ****************************************************************************** + * Feature and Parameter Negotiation + ****************************************************************************** + * + * Front->back notifications: when enqueuing a new request, sending a + * notification can be made conditional on xencamera_req (i.e., the generic + * hold-off mechanism provided by the ring macros). Backends must set + * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). + * + * Back->front notifications: when enqueuing a new response, sending a + * notification can be made conditional on xencamera_resp (i.e., the generic + * hold-off mechanism provided by the ring macros). Frontends must set + * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). + * + * The two halves of a para-virtual camera driver utilize nodes within + * XenStore to communicate capabilities and to negotiate operating parameters. + * This section enumerates these nodes which reside in the respective front and + * backend portions of XenStore, following the XenBus convention. + * + * All data in XenStore is stored as strings. Nodes specifying numeric + * values are encoded in decimal. Integer value ranges listed below are + * expressed as fixed sized integer types capable of storing the conversion + * of a properly formatted node string, without loss of information. + * + ****************************************************************************** + * Example configuration + ****************************************************************************** + * + * This is an example of backend and frontend configuration: + * + *--------------------------------- Backend ----------------------------------- + * + * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" + * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" + * /local/domain/0/backend/vcamera/1/0/state = "4" + * /local/domain/0/backend/vcamera/1/0/versions = "1,2" + * + *--------------------------------- Frontend ---------------------------------- + * + * /local/domain/1/device/vcamera/0/backend-id = "0" + * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" + * /local/domain/1/device/vcamera/0/state = "4" + * /local/domain/1/device/vcamera/0/version = "1" + * /local/domain/1/device/vcamera/0/be-alloc = "1" + * + *---------------------------- Device 0 configuration ------------------------- + * + * /local/domain/1/device/vcamera/0/max-buffers = "3" + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/unique-id = "0" + * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" + * /local/domain/1/device/vcamera/0/req-event-channel = "15" + * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" + * /local/domain/1/device/vcamera/0/evt-event-channel = "16" + * + *---------------------------- Device 1 configuration ------------------------- + * + * /local/domain/1/device/vcamera/1/max-buffers = "8" + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/1/unique-id = "1" + * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" + * /local/domain/1/device/vcamera/1/req-event-channel = "17" + * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" + * /local/domain/1/device/vcamera/1/evt-event-channel = "18" + * + ****************************************************************************** + * Backend XenBus Nodes + ****************************************************************************** + * + *----------------------------- Protocol version ------------------------------ + * + * versions + * Values: + * + * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported + * by the backend. For example "1,2,3". + * + ****************************************************************************** + * Frontend XenBus Nodes + ****************************************************************************** + * + *-------------------------------- Addressing --------------------------------- + * + * dom-id + * Values: + * + * Domain identifier. + * + * dev-id + * Values: + * + * Device identifier. + * + * /local/domain//device/vcamera//... + * + *----------------------------- Protocol version ------------------------------ + * + * version + * Values: + * + * Protocol version, chosen among the ones supported by the backend. + * + *------------------------- Backend buffer allocation ------------------------- + * + * be-alloc + * Values: "0", "1" + * + * If value is set to "1", then backend will be the buffer + * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE + * operation. + * If value is not "1" or omitted frontend must allocate buffers itself. + * + *------------------------------- Camera settings ----------------------------- + * + * unique-id + * Values: + * + * After device instance initialization each camera is assigned a + * unique ID, so it can be identified by the backend by this ID. + * This can be UUID or such. + * + * max-buffers + * Values: + * + * Maximum number of camera buffers this frontend may use. + * + * controls + * Values: + * + * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. + * Camera controls are expressed as a list of string values w/o any + * ordering requirement. + * + * formats + * Values: + * + * Formats are organized as a set of directories one per each + * supported pixel format. The name of the directory is the + * corresponding FOURCC string label. The next level of + * the directory under represents supported resolutions. + * If the format represents a big-endian variant of a little + * endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs + * 'AR15-BE'. + * If FOURCC string label has spaces then those are only allowed to + * be at the end of the label and must be trimmed. + * + * resolution + * Values: x + * + * Resolutions are organized as a set of directories one per each + * supported resolution under corresponding directory. + * The name of the directory is the supported width and height + * of the camera resolution in pixels. + * + * frame-rates + * Values: / + * + * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates + * of the camera expressed as numerator and denominator of the + * corresponding frame rate. + * + *------------------- Camera Request Transport Parameters --------------------- + * + * This communication path is used to deliver requests from frontend to backend + * and get the corresponding responses from backend to frontend, + * set up per virtual camera device. + * + * req-event-channel + * Values: + * + * The identifier of the Xen camera's control event channel + * used to signal activity in the ring buffer. + * + * req-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's control ring buffer. + * + *-------------------- Camera Event Transport Parameters ---------------------- + * + * This communication path is used to deliver asynchronous events from backend + * to frontend, set up per virtual camera device. + * + * evt-event-channel + * Values: + * + * The identifier of the Xen camera's event channel + * used to signal activity in the ring buffer. + * + * evt-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's event ring buffer. + */ + +/* + ****************************************************************************** + * STATE DIAGRAMS + ****************************************************************************** + * + * Tool stack creates front and back state nodes with initial state + * XenbusStateInitialising. + * Tool stack creates and sets up frontend camera configuration + * nodes per domain. + * + *-------------------------------- Normal flow -------------------------------- + * + * Front Back + * ================================= ===================================== + * XenbusStateInitialising XenbusStateInitialising + * o Query backend device identification + * data. + * o Open and validate backend device. + * | + * | + * V + * XenbusStateInitWait + * + * o Query frontend configuration + * o Allocate and initialize + * event channels per configured + * camera. + * o Publish transport parameters + * that will be in effect during + * this connection. + * | + * | + * V + * XenbusStateInitialised + * + * o Query frontend transport parameters. + * o Connect to the event channels. + * | + * | + * V + * XenbusStateConnected + * + * o Create and initialize OS + * virtual camera as per + * configuration. + * | + * | + * V + * XenbusStateConnected + * + * XenbusStateUnknown + * XenbusStateClosed + * XenbusStateClosing + * o Remove virtual camera device + * o Remove event channels + * | + * | + * V + * XenbusStateClosed + * + *------------------------------- Recovery flow ------------------------------- + * + * In case of frontend unrecoverable errors backend handles that as + * if frontend goes into the XenbusStateClosed state. + * + * In case of backend unrecoverable errors frontend tries removing + * the virtualized device. If this is possible at the moment of error, + * then frontend goes into the XenbusStateInitialising state and is ready for + * new connection with backend. If the virtualized device is still in use and + * cannot be removed, then frontend goes into the XenbusStateReconfiguring state + * until either the virtualized device is removed or backend initiates a new + * connection. On the virtualized device removal frontend goes into the + * XenbusStateInitialising state. + * + * Note on XenbusStateReconfiguring state of the frontend: if backend has + * unrecoverable errors then frontend cannot send requests to the backend + * and thus cannot provide functionality of the virtualized device anymore. + * After backend is back to normal the virtualized device may still hold some + * state: configuration in use, allocated buffers, client application state etc. + * In most cases, this will require frontend to implement complex recovery + * reconnect logic. Instead, by going into XenbusStateReconfiguring state, + * frontend will make sure no new clients of the virtualized device are + * accepted, allow existing client(s) to exit gracefully by signaling error + * state etc. + * Once all the clients are gone frontend can reinitialize the virtualized + * device and get into XenbusStateInitialising state again signaling the + * backend that a new connection can be made. + * + * There are multiple conditions possible under which frontend will go from + * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS + * specific. For example: + * 1. The underlying OS framework may provide callbacks to signal that the last + * client of the virtualized device has gone and the device can be removed + * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) + * to periodically check if this is the right time to re-try removal of + * the virtualized device. + * 3. By any other means. + * + ****************************************************************************** + * REQUEST CODES + ****************************************************************************** + */ +#define XENCAMERA_OP_CONFIG_SET 0x00 +#define XENCAMERA_OP_CONFIG_GET 0x01 +#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 +#define XENCAMERA_OP_FRAME_RATE_SET 0x03 +#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 +#define XENCAMERA_OP_BUF_REQUEST 0x05 +#define XENCAMERA_OP_BUF_CREATE 0x06 +#define XENCAMERA_OP_BUF_DESTROY 0x07 +#define XENCAMERA_OP_BUF_QUEUE 0x08 +#define XENCAMERA_OP_BUF_DEQUEUE 0x09 +#define XENCAMERA_OP_CTRL_ENUM 0x0a +#define XENCAMERA_OP_CTRL_SET 0x0b +#define XENCAMERA_OP_CTRL_GET 0x0c +#define XENCAMERA_OP_STREAM_START 0x0d +#define XENCAMERA_OP_STREAM_STOP 0x0e + +#define XENCAMERA_CTRL_BRIGHTNESS 0 +#define XENCAMERA_CTRL_CONTRAST 1 +#define XENCAMERA_CTRL_SATURATION 2 +#define XENCAMERA_CTRL_HUE 3 + +/* Number of supported controls. */ +#define XENCAMERA_MAX_CTRL 4 + +/* Control is read-only. */ +#define XENCAMERA_CTRL_FLG_RO (1 << 0) +/* Control is write-only. */ +#define XENCAMERA_CTRL_FLG_WO (1 << 1) +/* Control's value is volatile. */ +#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) + +/* Supported color spaces. */ +#define XENCAMERA_COLORSPACE_DEFAULT 0 +#define XENCAMERA_COLORSPACE_SMPTE170M 1 +#define XENCAMERA_COLORSPACE_REC709 2 +#define XENCAMERA_COLORSPACE_SRGB 3 +#define XENCAMERA_COLORSPACE_OPRGB 4 +#define XENCAMERA_COLORSPACE_BT2020 5 +#define XENCAMERA_COLORSPACE_DCI_P3 6 + +/* Color space transfer function. */ +#define XENCAMERA_XFER_FUNC_DEFAULT 0 +#define XENCAMERA_XFER_FUNC_709 1 +#define XENCAMERA_XFER_FUNC_SRGB 2 +#define XENCAMERA_XFER_FUNC_OPRGB 3 +#define XENCAMERA_XFER_FUNC_NONE 4 +#define XENCAMERA_XFER_FUNC_DCI_P3 5 +#define XENCAMERA_XFER_FUNC_SMPTE2084 6 + +/* Color space Y’CbCr encoding. */ +#define XENCAMERA_YCBCR_ENC_IGNORE 0 +#define XENCAMERA_YCBCR_ENC_601 1 +#define XENCAMERA_YCBCR_ENC_709 2 +#define XENCAMERA_YCBCR_ENC_XV601 3 +#define XENCAMERA_YCBCR_ENC_XV709 4 +#define XENCAMERA_YCBCR_ENC_BT2020 5 +#define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 + +/* Quantization range. */ +#define XENCAMERA_QUANTIZATION_DEFAULT 0 +#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 +#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 + +/* + ****************************************************************************** + * EVENT CODES + ****************************************************************************** + */ +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 +#define XENCAMERA_EVT_CTRL_CHANGE 0x01 + +/* Resolution has changed. */ +#define XENCAMERA_EVT_CFG_FLG_RESOL (1 << 0) + +/* + ****************************************************************************** + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS + ****************************************************************************** + */ +#define XENCAMERA_DRIVER_NAME "vcamera" + +#define XENCAMERA_LIST_SEPARATOR "," +#define XENCAMERA_RESOLUTION_SEPARATOR "x" +#define XENCAMERA_FRACTION_SEPARATOR "/" + +#define XENCAMERA_FIELD_BE_VERSIONS "versions" +#define XENCAMERA_FIELD_FE_VERSION "version" +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" +#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" +#define XENCAMERA_FIELD_CONTROLS "controls" +#define XENCAMERA_FIELD_FORMATS "formats" +#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" + +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" +#define XENCAMERA_CTRL_SATURATION_STR "saturation" +#define XENCAMERA_CTRL_HUE_STR "hue" + +#define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" + +/* Maximum number of buffer planes supported. */ +#define XENCAMERA_MAX_PLANE 4 + +/* + ****************************************************************************** + * STATUS RETURN CODES + ****************************************************************************** + * + * Status return code is zero on success and -XEN_EXX on failure. + * + ****************************************************************************** + * Assumptions + ****************************************************************************** + * + * - usage of grant reference 0 as invalid grant reference: + * grant reference 0 is valid, but never exposed to a PV driver, + * because of the fact it is already in use/reserved by the PV console. + * - all references in this document to page sizes must be treated + * as pages of size XEN_PAGE_SIZE unless otherwise noted. + * - all FOURCC mappings used for configuration and messaging are + * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h + * with the following exceptions: + * - characters are allowed in [0x20; 0x7f] range + * - when used for XenStore configuration entries the following + * are not allowed: + * - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*' + * - if trailing spaces are part of the FOURCC code then those must be + * trimmed + * + * + ****************************************************************************** + * Description of the protocol between frontend and backend driver + ****************************************************************************** + * + * The two halves of a Para-virtual camera driver communicate with + * each other using shared pages and event channels. + * Shared page contains a ring with request/response packets. + * + * All reserved fields in the structures below must be 0. + * + * For all request/response/event packets: + * - frame rate parameter is represented as a pair of 4 octet long + * numerator and denominator: + * - frame_rate_numer - uint32_t, numerator of the frame rate + * - frame_rate_denom - uint32_t, denominator of the frame rate + * The corresponding frame rate (Hz) is calculated as: + * frame_rate = frame_rate_numer / frame_rate_denom + * - buffer index is a zero based index of the buffer. Must be less than + * the value of XENCAMERA_OP_CONFIG_SET.num_bufs response: + * - index - uint8_t, index of the buffer. + * + * + *---------------------------------- Requests --------------------------------- + * + * All request packets have the same length (64 octets). + * All request packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * id - uint16_t, private guest value, echoed in response. + * operation - uint8_t, operation code, XENCAMERA_OP_XXX. + * + * + * Request to set/validate the configuration - request to set the + * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to + * check if the configuration is valid and can be used + * (XENCAMERA_OP_CONFIG_VALIDATE): + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | colorspace | 24 + * +----------------+----------------+----------------+----------------+ + * | xfer_func | 28 + * +----------------+----------------+----------------+----------------+ + * | ycbcr_enc | 32 + * +----------------+----------------+----------------+----------------+ + * | quantization | 36 + * +----------------+----------------+----------------+----------------+ + * | reserved | 40 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * pixel_format - uint32_t, pixel format to be used, FOURCC code. + * width - uint32_t, width in pixels. + * height - uint32_t, height in pixels. + * colorspace - uint32_t, this supplements pixel_format parameter, + * one of the XENCAMERA_COLORSPACE_XXX. + * xfer_func - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_XFER_FUNC_XXX. + * ycbcr_enc - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only + * valid for YCbCr pixelformats and should be ignored otherwise. + * quantization - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_QUANTIZATION_XXX. + * + * See response format for this request. + * + * Notes: + * - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and + * XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change + * camera configuration, but queries if the configuration is valid. + * This can be used while stream is active and/or buffers allocated. + * - frontend must check the corresponding response in order to see + * if the values reported back by the backend do match the desired ones + * and can be accepted. + * - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before + * sending XENCAMERA_OP_STREAM_START request to update or tune the + * final stream configuration. + * - configuration cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * requests. + */ +struct xencamera_config_req { + uint32_t pixel_format; + uint32_t width; + uint32_t height; + uint32_t colorspace; + uint32_t xfer_func; + uint32_t ycbcr_enc; + uint32_t quantization; +}; + +/* + * Request current configuration of the camera: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request to set the frame rate of the stream: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _FRAME_RATE_SET| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 12 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * frame_rate_numer - uint32_t, numerator of the frame rate. + * frame_rate_denom - uint32_t, denominator of the frame rate. + * + * Notes: + * - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET + * request. + * - this request can be used with camera buffers allocated, but stream + * stopped, e.g. frontend is allowed to stop the stream with + * XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the + * configuration set with XENCAMERA_OP_CONFIG_SET), change the + * frame rate of the stream and (re)start the stream again with + * XENCAMERA_OP_STREAM_START. + * - frame rate cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * commands. + */ +struct xencamera_frame_rate_req { + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request camera buffer's layout: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _BUF_GET_LAYOUT| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request number of buffers to be used: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_REQUEST| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | num_bufs | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_bufs - uint8_t, desired number of buffers to be used. + * + * See response format for this request. + * + * Notes: + * - frontend must check the corresponding response in order to see + * if the values reported back by the backend do match the desired ones + * and can be accepted. + * - frontend may send multiple XENCAMERA_OP_BUF_REQUEST requests before + * sending XENCAMERA_OP_STREAM_START request to update or tune the + * configuration. + * - after this request camera configuration cannot be changed, unless + * streaming is stopped and buffers destroyed + * - passing zero num_bufs in this request (after streaming has stopped + * and all buffers destroyed) unblocks camera configuration changes. + */ +struct xencamera_buf_request { + uint8_t num_bufs; +}; + +/* + * Request camera buffer creation: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_CREATE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[0] | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[1] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[2] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[3] | 28 + * +----------------+----------------+----------------+----------------+ + * | gref_directory | 32 + * +----------------+----------------+----------------+----------------+ + * | reserved | 36 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * An attempt to create multiple buffers with the same index is an error. + * index can be re-used after destroying the corresponding camera buffer. + * + * index - uint8_t, index of the buffer to be created. + * plane_offset - array of uint32_t, offset of the corresponding plane + * in octets from the buffer start. Number of offsets returned is + * equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes. + * gref_directory - grant_ref_t, a reference to the first shared page + * describing shared buffer references. The size of the buffer is equal to + * XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If + * shared buffer size exceeds what can be addressed by this single page, + * then reference to the next shared page must be supplied (see + * gref_dir_next_page below). + * + * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will + * allocate the buffer with the parameters provided in this request and page + * directory is handled as follows: + * Frontend on request: + * - allocates pages for the directory (gref_directory, + * gref_dir_next_page(s) + * - grants permissions for the pages of the directory to the backend + * - sets gref_dir_next_page fields + * Backend on response: + * - grants permissions for the pages of the buffer allocated to + * the frontend + * - fills in page directory with grant references + * (gref[] in struct xencamera_page_directory) + */ +struct xencamera_buf_create_req { + uint8_t index; + uint8_t reserved[3]; + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; + grant_ref_t gref_directory; +}; + +/* + * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in + * the request) employs a list of pages, describing all pages of the shared + * data buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | gref_dir_next_page | 4 + * +----------------+----------------+----------------+----------------+ + * | gref[0] | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[i] | i*4+8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[N - 1] | N*4+8 + * +----------------+----------------+----------------+----------------+ + * + * gref_dir_next_page - grant_ref_t, reference to the next page describing + * page directory. Must be 0 if there are no more pages in the list. + * gref[i] - grant_ref_t, reference to a shared page of the buffer + * allocated at XENCAMERA_OP_BUF_CREATE. + * + * Number of grant_ref_t entries in the whole page directory is not + * passed, but instead can be calculated as: + * num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) / + * XEN_PAGE_SIZE + */ +struct xencamera_page_directory { + grant_ref_t gref_dir_next_page; + grant_ref_t gref[1]; /* Variable length */ +}; + +/* + * Request buffer destruction - destroy a previously allocated camera buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_DESTROY| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer to be destroyed. + * + * + * Request queueing of the buffer for backend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_QUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontends must not access the buffer content after this request until + * response to XENCAMERA_OP_BUF_DEQUEUE has been received. + * - buffers must be queued to the backend before destroying them with + * XENCAMERA_OP_BUF_DESTROY. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request dequeueing of the buffer for frontend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_DEQUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontend is allowed to access the buffer content after the corresponding + * response to this request. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request camera control details: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * index - uint8_t, index of the control to be queried. + */ +struct xencamera_index { + uint8_t index; +}; + +/* + * Request camera control change: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_SET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ +struct xencamera_ctrl_value { + uint8_t type; + uint8_t reserved[7]; + int64_t value; +}; + +/* + * Request camera control state: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_GET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + */ +struct xencamera_get_ctrl_req { + uint8_t type; +}; + +/* + * Request camera capture stream start: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_START| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + * Request camera capture stream stop: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_STOP | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + *---------------------------------- Responses -------------------------------- + * + * All response packets have the same length (64 octets). + * + * All response packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, copied from the request. + * operation - uint8_t, XENCAMERA_OP_* - copied from request. + * status - int32_t, response status, zero on success and -XEN_EXX on failure. + * + * + * Configuration response - response for XENCAMERA_OP_CONFIG_SET, + * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | colorspace | 24 + * +----------------+----------------+----------------+----------------+ + * | xfer_func | 28 + * +----------------+----------------+----------------+----------------+ + * | ycbcr_enc | 32 + * +----------------+----------------+----------------+----------------+ + * | quantization | 36 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_numer | 40 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_denom | 44 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 48 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 52 + * +----------------+----------------+----------------+----------------+ + * | reserved | 56 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Meaning of the corresponding values in this response is the same as for + * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests. + * + * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio. + * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio. + */ +struct xencamera_config_resp { + uint32_t pixel_format; + uint32_t width; + uint32_t height; + uint32_t colorspace; + uint32_t xfer_func; + uint32_t ycbcr_enc; + uint32_t quantization; + uint32_t displ_asp_ratio_numer; + uint32_t displ_asp_ratio_denom; + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_BUF_GET_LAYOUT | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_planes | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | size | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_size[0] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_size[1] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_size[2] | 28 + * +----------------+----------------+----------------+----------------+ + * | plane_size[3] | 32 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[0] | 36 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[1] | 40 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[2] | 44 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[3] | 48 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_planes - uint8_t, number of planes of the buffer. + * size - uint32_t, overall size of the buffer including sizes of the + * individual planes and padding if applicable. + * plane_size - array of uint32_t, size in octets of the corresponding plane + * including padding. + * plane_stride - array of uint32_t, size in octets occupied by the + * corresponding single image line including padding if applicable. + * + * Note! The sizes and strides in this response apply to all buffers created + * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have + * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset. + */ +struct xencamera_buf_get_layout_resp { + uint8_t num_planes; + uint8_t reserved[3]; + uint32_t size; + uint32_t plane_size[XENCAMERA_MAX_PLANE]; + uint32_t plane_stride[XENCAMERA_MAX_PLANE]; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_REQUEST | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_buffers | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_buffers - uint8_t, number of buffers to be used. + * + * + * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | index | type | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | flags | 16 + * +----------------+----------------+----------------+----------------+ + * | min low 32-bits | 20 + * +----------------+----------------+----------------+----------------+ + * | min high 32-bits | 24 + * +----------------+----------------+----------------+----------------+ + * | max low 32-bits | 28 + * +----------------+----------------+----------------+----------------+ + * | max high 32-bits | 32 + * +----------------+----------------+----------------+----------------+ + * | step low 32-bits | 36 + * +----------------+----------------+----------------+----------------+ + * | step high 32-bits | 40 + * +----------------+----------------+----------------+----------------+ + * | def_val low 32-bits | 44 + * +----------------+----------------+----------------+----------------+ + * | def_val high 32-bits | 48 + * +----------------+----------------+----------------+----------------+ + * | reserved | 52 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the camera control in response. + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX. + * min - int64_t, minimum value of the control. + * max - int64_t, maximum value of the control. + * step - int64_t, minimum size in which control value can be changed. + * def_val - int64_t, default value of the control. + */ +struct xencamera_ctrl_enum_resp { + uint8_t index; + uint8_t type; + uint8_t reserved[2]; + uint32_t flags; + int64_t min; + int64_t max; + int64_t step; + int64_t def_val; +}; + +/* + * Get control response - response for XENCAMERA_OP_CTRL_GET: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ + +/* + *----------------------------------- Events ---------------------------------- + * + * Events are sent via a shared page allocated by the front and propagated by + * evt-event-channel/evt-ring-ref XenStore entries. + * + * All event packets have the same length (64 octets). + * All event packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | type | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, event id, may be used by front. + * type - uint8_t, type of the event. + * + * + * Frame captured event - event from back to front when a new captured + * frame is available: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_FRAME_AVAIL| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | used_sz | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * | seq_num low 32-bits | 24 + * +----------------+----------------+----------------+----------------+ + * | seq_num high 32-bits | 28 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer that contains new captured frame. + * used_sz - uint32_t, number of octets this frame has. This can be less + * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats. + * seq_num - uint64_t, sequential number of the frame. Must be + * monotonically increasing. If skips are detected in seq_num then that + * means that the frames in-between were dropped. + */ +struct xencamera_frame_avail_evt { + uint8_t index; + uint8_t reserved0[3]; + uint32_t used_sz; + uint8_t reserved1[4]; + uint64_t seq_num; +}; + +/* + * Control change event- event from back to front when camera control + * has changed: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_CTRL_CHANGE| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + * + * Notes: + * - this event is not sent for write-only controls + * - this event is not sent to the originator of the control change + * - this event is not sent when frontend first connects, e.g. initial + * control state must be explicitly queried + */ + +struct xencamera_req { + uint16_t id; + uint8_t operation; + uint8_t reserved[5]; + union { + struct xencamera_config_req config; + struct xencamera_frame_rate_req frame_rate; + struct xencamera_buf_request buf_request; + struct xencamera_buf_create_req buf_create; + struct xencamera_index index; + struct xencamera_ctrl_value ctrl_value; + struct xencamera_get_ctrl_req get_ctrl; + uint8_t reserved[56]; + } req; +}; + +struct xencamera_resp { + uint16_t id; + uint8_t operation; + uint8_t reserved; + int32_t status; + union { + struct xencamera_config_resp config; + struct xencamera_buf_get_layout_resp buf_layout; + struct xencamera_buf_request buf_request; + struct xencamera_ctrl_enum_resp ctrl_enum; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved1[56]; + } resp; +}; + +struct xencamera_evt { + uint16_t id; + uint8_t type; + uint8_t reserved[5]; + union { + struct xencamera_frame_avail_evt frame_avail; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved[56]; + } evt; +}; + +DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); + +/* + ****************************************************************************** + * Back to front events delivery + ****************************************************************************** + * In order to deliver asynchronous events from back to front a shared page is + * allocated by front and its granted reference propagated to back via + * XenStore entries (evt-ring-ref/evt-event-channel). + * This page has a common header used by both front and back to synchronize + * access and control event's ring buffer, while back being a producer of the + * events and front being a consumer. The rest of the page after the header + * is used for event packets. + * + * Upon reception of an event(s) front may confirm its reception + * for either each event, group of events or none. + */ + +struct xencamera_event_page { + uint32_t in_cons; + uint32_t in_prod; + uint8_t reserved[56]; +}; + +#define XENCAMERA_EVENT_PAGE_SIZE 4096 +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) +#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) +#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) +#define XENCAMERA_IN_RING(page) \ + ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) +#define XENCAMERA_IN_RING_REF(page, idx) \ + (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) + +#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 2.19.2