From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Date: Thu, 28 Nov 2019 10:34:40 +0000 Subject: Re: [Intel-gfx] [PATCH 01/13] video: fb_defio: preserve user fb_ops Message-Id: <871rtsnvb3.fsf@intel.com> List-Id: References: <448995ffd954e0cd2287089cb686e351cc095834.1574871797.git.jani.nikula@intel.com> <20191127181741.GG406127@phenom.ffwll.local> <20191127182105.GJ406127@phenom.ffwll.local> <87fti8nz8l.fsf@intel.com> <20191128100557.GO406127@phenom.ffwll.local> <20191128100809.GP406127@phenom.ffwll.local> In-Reply-To: <20191128100809.GP406127@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Daniel Vetter Cc: linux-fbdev@vger.kernel.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Jaya Kumar On Thu, 28 Nov 2019, Daniel Vetter wrote: > On Thu, Nov 28, 2019 at 11:05:57AM +0100, Daniel Vetter wrote: >> On Thu, Nov 28, 2019 at 11:09:46AM +0200, Jani Nikula wrote: >> > On Wed, 27 Nov 2019, Daniel Vetter wrote: >> > > On Wed, Nov 27, 2019 at 07:17:41PM +0100, Daniel Vetter wrote: >> > >> On Wed, Nov 27, 2019 at 06:31:57PM +0200, Jani Nikula wrote: >> > >> > Modifying fb_ops directly to override fb_mmap with fb_deferred_io_mmap >> > >> > and then resetting it to NULL afterwards causes problems all over the >> > >> > place. First, it prevents making the fbops member of struct fb_info a >> > >> > const pointer, which means we can't make struct fb_ops const >> > >> > anywhere. Second, a few places have to go out of their way to restore >> > >> > the original fb_mmap pointer that gets reset to NULL. >> > >> > >> > >> > Preserve the passed in fb_ops by making a copy of it and modifying that >> > >> > instead. Add a deferred_io_private member to struct fb_info to store the >> > >> > pointer to the old fb_ops, and restore that at cleanup. >> > >> > >> > >> > Cc: Jaya Kumar >> > >> > Cc: linux-fbdev@vger.kernel.org >> > >> > Signed-off-by: Jani Nikula >> > >> > >> > >> > --- >> > >> > >> > >> > Note: If the approach is acceptable, we'll also need to handle the error >> > >> > returns on memory allocation failures at fb_deferred_io_init() call >> > >> > sites. There are 13. >> > >> >> > >> it's fbdev defio, I think we can do worse with less effort. Just embed a >> > >> copy of fb_ops into fb_info, and use that, and tada! no memory allocation >> > >> needed :-) >> > >> >> > >> I'd totally r-b that patch. >> > >> >> > >> Or do what Ville suggested, add an fb_info->fbdefio.enabled, set that in >> > >> the _init function and in fb_mmap call fb_deferred_io_mmap for that case >> > >> instead of the driver's fb_ops->fb_mmap. There's only one caller of that >> > >> in the entire tree, in fbmem.c. Also, we could/should nuke the >> > >> EXPORT_SYMBOL(fb_deferred_io_mmap) I think. >> > > >> > > I just realized that fb_info->fbdefio is a pointer, so this would be >> > > really simple to pull off I think. >> > >> > Heh, having a >> > >> > int (*fb_deferred_io_mmap)(struct fb_info *, struct vm_area_struct *); >> > >> > member in struct fb_info, and using that in fbmem.c if non-NULL, was >> > actually my first idea. I didn't think it was particularly pretty, but >> > if we don't care about aesthetics... >> > >> > Would you like that instead of the patch at hand? >> >> >> diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c >> index 82c20c6047b0..9275c6bd71da 100644 >> --- a/drivers/video/fbdev/core/fb_defio.c >> +++ b/drivers/video/fbdev/core/fb_defio.c >> @@ -206,13 +206,11 @@ void fb_deferred_io_init(struct fb_info *info) >> >> BUG_ON(!fbdefio); >> mutex_init(&fbdefio->lock); >> - info->fbops->fb_mmap = fb_deferred_io_mmap; >> INIT_DELAYED_WORK(&info->deferred_work, fb_deferred_io_work); >> INIT_LIST_HEAD(&fbdefio->pagelist); >> if (fbdefio->delay = 0) /* set a default of 1 s */ >> fbdefio->delay = HZ; >> } >> -EXPORT_SYMBOL_GPL(fb_deferred_io_init); >> >> void fb_deferred_io_open(struct fb_info *info, >> struct inode *inode, >> diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c >> index 86b06a599f96..6af627f281c3 100644 >> --- a/drivers/video/fbdev/core/fbmem.c >> +++ b/drivers/video/fbdev/core/fbmem.c >> @@ -1341,7 +1341,16 @@ fb_mmap(struct file *file, struct vm_area_struct * vma) >> return -ENODEV; >> fb = info->fbops; >> mutex_lock(&info->mm_lock); >> - if (fb->fb_mmap) { >> + if (fb->fbdefio) { >> + /* >> + * The framebuffer needs to be accessed decrypted, be sure >> + * SME protection is removed ahead of the call >> + */ >> + vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); >> + res = fb_deferred_io_mmap(info, vma); >> + mutex_unlock(&info->mm_lock); >> + return res; >> + } else if (fb->fb_mmap) { >> int res; >> >> /* >> >> Is what I was thinking off as the pretty solution. Add an explicit >> fb_info->fbdefio_enabled boolean if you don't feel like auditing all the >> drivers for whether they really call defio_init() every time they assign >> something to that pointer. A quick scan brought some nasties to light in >> that area. > > Correction, brain wasn't awake yet, I've done the audit and the above diff > should work afaict. It just felt sketchy to me to depend on that pointer being set as the decider, independent of defio init. But if you think that's the way to go, I'm not going to argue. I'll bet it won't go unnoticed if fb_deferred_io_mmap() gets called without the init. ;) BR, Jani. > -Daniel > >> >> I think a function pointer here is pointless because we clearly don't need >> it, and with all the panic around function pointers a direct call feels >> much better :-) >> -Daniel >> >> > >> > BR, >> > Jani. >> > >> > >> > > -Daniel >> > > >> > >> >> > >> That version would also get my r-b stamp. So up to you what you prefer. >> > >> -Daniel >> > >> >> > >> > --- >> > >> > drivers/video/fbdev/core/fb_defio.c | 25 ++++++++++++++++++++++--- >> > >> > include/linux/fb.h | 3 ++- >> > >> > 2 files changed, 24 insertions(+), 4 deletions(-) >> > >> > >> > >> > diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c >> > >> > index 82c20c6047b0..36697844c1e0 100644 >> > >> > --- a/drivers/video/fbdev/core/fb_defio.c >> > >> > +++ b/drivers/video/fbdev/core/fb_defio.c >> > >> > @@ -200,13 +200,23 @@ static void fb_deferred_io_work(struct work_struct *work) >> > >> > mutex_unlock(&fbdefio->lock); >> > >> > } >> > >> > >> > >> > -void fb_deferred_io_init(struct fb_info *info) >> > >> > +int fb_deferred_io_init(struct fb_info *info) >> > >> > { >> > >> > struct fb_deferred_io *fbdefio = info->fbdefio; >> > >> > + struct fb_ops *fbops; >> > >> > >> > >> > BUG_ON(!fbdefio); >> > >> > + >> > >> > + fbops = kmemdup(info->fbops, sizeof(*fbops), GFP_KERNEL); >> > >> > + if (!fbops) >> > >> > + return -ENOMEM; >> > >> > + >> > >> > + fbops->fb_mmap = fb_deferred_io_mmap; >> > >> > + info->deferred_io_private = info->fbops; >> > >> > + info->fbops = fbops; >> > >> > + >> > >> > mutex_init(&fbdefio->lock); >> > >> > - info->fbops->fb_mmap = fb_deferred_io_mmap; >> > >> > + >> > >> > INIT_DELAYED_WORK(&info->deferred_work, fb_deferred_io_work); >> > >> > INIT_LIST_HEAD(&fbdefio->pagelist); >> > >> > if (fbdefio->delay = 0) /* set a default of 1 s */ >> > >> > @@ -229,6 +239,12 @@ void fb_deferred_io_cleanup(struct fb_info *info) >> > >> > int i; >> > >> > >> > >> > BUG_ON(!fbdefio); >> > >> > + >> > >> > + /* sanity check against misuse */ >> > >> > + if (WARN_ON(!info->deferred_io_private || >> > >> > + info->fbops->fb_mmap != fb_deferred_io_mmap)) >> > >> > + return; >> > >> > + >> > >> > cancel_delayed_work_sync(&info->deferred_work); >> > >> > >> > >> > /* clear out the mapping that we setup */ >> > >> > @@ -237,7 +253,10 @@ void fb_deferred_io_cleanup(struct fb_info *info) >> > >> > page->mapping = NULL; >> > >> > } >> > >> > >> > >> > - info->fbops->fb_mmap = NULL; >> > >> > + kfree(info->fbops); >> > >> > + info->fbops = info->deferred_io_private; >> > >> > + info->deferred_io_private = NULL; >> > >> > + >> > >> > mutex_destroy(&fbdefio->lock); >> > >> > } >> > >> > EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup); >> > >> > diff --git a/include/linux/fb.h b/include/linux/fb.h >> > >> > index a6ad528990de..65f2abd47745 100644 >> > >> > --- a/include/linux/fb.h >> > >> > +++ b/include/linux/fb.h >> > >> > @@ -470,6 +470,7 @@ struct fb_info { >> > >> > #ifdef CONFIG_FB_DEFERRED_IO >> > >> > struct delayed_work deferred_work; >> > >> > struct fb_deferred_io *fbdefio; >> > >> > + void *deferred_io_private; >> > >> > #endif >> > >> > >> > >> > struct fb_ops *fbops; >> > >> > @@ -658,7 +659,7 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, >> > >> > >> > >> > /* drivers/video/fb_defio.c */ >> > >> > int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma); >> > >> > -extern void fb_deferred_io_init(struct fb_info *info); >> > >> > +extern int fb_deferred_io_init(struct fb_info *info); >> > >> > extern void fb_deferred_io_open(struct fb_info *info, >> > >> > struct inode *inode, >> > >> > struct file *file); >> > >> > -- >> > >> > 2.20.1 >> > >> > >> > >> > _______________________________________________ >> > >> > Intel-gfx mailing list >> > >> > Intel-gfx@lists.freedesktop.org >> > >> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx >> > >> >> > >> -- >> > >> Daniel Vetter >> > >> Software Engineer, Intel Corporation >> > >> http://blog.ffwll.ch >> > >> > -- >> > Jani Nikula, Intel Open Source Graphics Center >> >> -- >> Daniel Vetter >> Software Engineer, Intel Corporation >> http://blog.ffwll.ch -- Jani Nikula, Intel Open Source Graphics Center From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [Intel-gfx] [PATCH 01/13] video: fb_defio: preserve user fb_ops Date: Thu, 28 Nov 2019 12:34:40 +0200 Message-ID: <871rtsnvb3.fsf@intel.com> References: <448995ffd954e0cd2287089cb686e351cc095834.1574871797.git.jani.nikula@intel.com> <20191127181741.GG406127@phenom.ffwll.local> <20191127182105.GJ406127@phenom.ffwll.local> <87fti8nz8l.fsf@intel.com> <20191128100557.GO406127@phenom.ffwll.local> <20191128100809.GP406127@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20191128100809.GP406127@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: linux-fbdev@vger.kernel.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Jaya Kumar List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCAyOCBOb3YgMjAxOSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90 ZToKPiBPbiBUaHUsIE5vdiAyOCwgMjAxOSBhdCAxMTowNTo1N0FNICswMTAwLCBEYW5pZWwgVmV0 dGVyIHdyb3RlOgo+PiBPbiBUaHUsIE5vdiAyOCwgMjAxOSBhdCAxMTowOTo0NkFNICswMjAwLCBK YW5pIE5pa3VsYSB3cm90ZToKPj4gPiBPbiBXZWQsIDI3IE5vdiAyMDE5LCBEYW5pZWwgVmV0dGVy IDxkYW5pZWxAZmZ3bGwuY2g+IHdyb3RlOgo+PiA+ID4gT24gV2VkLCBOb3YgMjcsIDIwMTkgYXQg MDc6MTc6NDFQTSArMDEwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4gPiA+PiBPbiBXZWQsIE5v diAyNywgMjAxOSBhdCAwNjozMTo1N1BNICswMjAwLCBKYW5pIE5pa3VsYSB3cm90ZToKPj4gPiA+ PiA+IE1vZGlmeWluZyBmYl9vcHMgZGlyZWN0bHkgdG8gb3ZlcnJpZGUgZmJfbW1hcCB3aXRoIGZi X2RlZmVycmVkX2lvX21tYXAKPj4gPiA+PiA+IGFuZCB0aGVuIHJlc2V0dGluZyBpdCB0byBOVUxM IGFmdGVyd2FyZHMgY2F1c2VzIHByb2JsZW1zIGFsbCBvdmVyIHRoZQo+PiA+ID4+ID4gcGxhY2Uu IEZpcnN0LCBpdCBwcmV2ZW50cyBtYWtpbmcgdGhlIGZib3BzIG1lbWJlciBvZiBzdHJ1Y3QgZmJf aW5mbyBhCj4+ID4gPj4gPiBjb25zdCBwb2ludGVyLCB3aGljaCBtZWFucyB3ZSBjYW4ndCBtYWtl IHN0cnVjdCBmYl9vcHMgY29uc3QKPj4gPiA+PiA+IGFueXdoZXJlLiBTZWNvbmQsIGEgZmV3IHBs YWNlcyBoYXZlIHRvIGdvIG91dCBvZiB0aGVpciB3YXkgdG8gcmVzdG9yZQo+PiA+ID4+ID4gdGhl IG9yaWdpbmFsIGZiX21tYXAgcG9pbnRlciB0aGF0IGdldHMgcmVzZXQgdG8gTlVMTC4KPj4gPiA+ PiA+IAo+PiA+ID4+ID4gUHJlc2VydmUgdGhlIHBhc3NlZCBpbiBmYl9vcHMgYnkgbWFraW5nIGEg Y29weSBvZiBpdCBhbmQgbW9kaWZ5aW5nIHRoYXQKPj4gPiA+PiA+IGluc3RlYWQuIEFkZCBhIGRl ZmVycmVkX2lvX3ByaXZhdGUgbWVtYmVyIHRvIHN0cnVjdCBmYl9pbmZvIHRvIHN0b3JlIHRoZQo+ PiA+ID4+ID4gcG9pbnRlciB0byB0aGUgb2xkIGZiX29wcywgYW5kIHJlc3RvcmUgdGhhdCBhdCBj bGVhbnVwLgo+PiA+ID4+ID4gCj4+ID4gPj4gPiBDYzogSmF5YSBLdW1hciA8amF5YWxrQGludHdv cmtzLmJpej4KPj4gPiA+PiA+IENjOiBsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcKPj4gPiA+ PiA+IFNpZ25lZC1vZmYtYnk6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBpbnRlbC5jb20+Cj4+ ID4gPj4gPiAKPj4gPiA+PiA+IC0tLQo+PiA+ID4+ID4gCj4+ID4gPj4gPiBOb3RlOiBJZiB0aGUg YXBwcm9hY2ggaXMgYWNjZXB0YWJsZSwgd2UnbGwgYWxzbyBuZWVkIHRvIGhhbmRsZSB0aGUgZXJy b3IKPj4gPiA+PiA+IHJldHVybnMgb24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMgYXQgZmJf ZGVmZXJyZWRfaW9faW5pdCgpIGNhbGwKPj4gPiA+PiA+IHNpdGVzLiBUaGVyZSBhcmUgMTMuCj4+ ID4gPj4gCj4+ID4gPj4gaXQncyBmYmRldiBkZWZpbywgSSB0aGluayB3ZSBjYW4gZG8gd29yc2Ug d2l0aCBsZXNzIGVmZm9ydC4gSnVzdCBlbWJlZCBhCj4+ID4gPj4gY29weSBvZiBmYl9vcHMgaW50 byBmYl9pbmZvLCBhbmQgdXNlIHRoYXQsIGFuZCB0YWRhISBubyBtZW1vcnkgYWxsb2NhdGlvbgo+ PiA+ID4+IG5lZWRlZCA6LSkKPj4gPiA+PiAKPj4gPiA+PiBJJ2QgdG90YWxseSByLWIgdGhhdCBw YXRjaC4KPj4gPiA+PiAKPj4gPiA+PiBPciBkbyB3aGF0IFZpbGxlIHN1Z2dlc3RlZCwgYWRkIGFu IGZiX2luZm8tPmZiZGVmaW8uZW5hYmxlZCwgc2V0IHRoYXQgaW4KPj4gPiA+PiB0aGUgX2luaXQg ZnVuY3Rpb24gYW5kIGluIGZiX21tYXAgY2FsbCBmYl9kZWZlcnJlZF9pb19tbWFwIGZvciB0aGF0 IGNhc2UKPj4gPiA+PiBpbnN0ZWFkIG9mIHRoZSBkcml2ZXIncyBmYl9vcHMtPmZiX21tYXAuIFRo ZXJlJ3Mgb25seSBvbmUgY2FsbGVyIG9mIHRoYXQKPj4gPiA+PiBpbiB0aGUgZW50aXJlIHRyZWUs IGluIGZibWVtLmMuIEFsc28sIHdlIGNvdWxkL3Nob3VsZCBudWtlIHRoZQo+PiA+ID4+IEVYUE9S VF9TWU1CT0woZmJfZGVmZXJyZWRfaW9fbW1hcCkgSSB0aGluay4KPj4gPiA+Cj4+ID4gPiBJIGp1 c3QgcmVhbGl6ZWQgdGhhdCBmYl9pbmZvLT5mYmRlZmlvIGlzIGEgcG9pbnRlciwgc28gdGhpcyB3 b3VsZCBiZQo+PiA+ID4gcmVhbGx5IHNpbXBsZSB0byBwdWxsIG9mZiBJIHRoaW5rLgo+PiA+IAo+ PiA+IEhlaCwgaGF2aW5nIGEKPj4gPiAKPj4gPiAJaW50ICgqZmJfZGVmZXJyZWRfaW9fbW1hcCko c3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwo+PiA+IAo+PiA+IG1l bWJlciBpbiBzdHJ1Y3QgZmJfaW5mbywgYW5kIHVzaW5nIHRoYXQgaW4gZmJtZW0uYyBpZiBub24t TlVMTCwgd2FzCj4+ID4gYWN0dWFsbHkgbXkgZmlyc3QgaWRlYS4gSSBkaWRuJ3QgdGhpbmsgaXQg d2FzIHBhcnRpY3VsYXJseSBwcmV0dHksIGJ1dAo+PiA+IGlmIHdlIGRvbid0IGNhcmUgYWJvdXQg YWVzdGhldGljcy4uLgo+PiA+IAo+PiA+IFdvdWxkIHlvdSBsaWtlIHRoYXQgaW5zdGVhZCBvZiB0 aGUgcGF0Y2ggYXQgaGFuZD8KPj4gCj4+IAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9m YmRldi9jb3JlL2ZiX2RlZmlvLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJfZGVmaW8u Ywo+PiBpbmRleCA4MmMyMGM2MDQ3YjAuLjkyNzVjNmJkNzFkYSAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy92aWRlby9mYmRldi9jb3JlL2ZiX2RlZmlvLmMKPj4gKysrIGIvZHJpdmVycy92aWRlby9m YmRldi9jb3JlL2ZiX2RlZmlvLmMKPj4gQEAgLTIwNiwxMyArMjA2LDExIEBAIHZvaWQgZmJfZGVm ZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gIAo+PiAgCUJVR19PTighZmJk ZWZpbyk7Cj4+ICAJbXV0ZXhfaW5pdCgmZmJkZWZpby0+bG9jayk7Cj4+IC0JaW5mby0+ZmJvcHMt PmZiX21tYXAgPSBmYl9kZWZlcnJlZF9pb19tbWFwOwo+PiAgCUlOSVRfREVMQVlFRF9XT1JLKCZp bmZvLT5kZWZlcnJlZF93b3JrLCBmYl9kZWZlcnJlZF9pb193b3JrKTsKPj4gIAlJTklUX0xJU1Rf SEVBRCgmZmJkZWZpby0+cGFnZWxpc3QpOwo+PiAgCWlmIChmYmRlZmlvLT5kZWxheSA9PSAwKSAv KiBzZXQgYSBkZWZhdWx0IG9mIDEgcyAqLwo+PiAgCQlmYmRlZmlvLT5kZWxheSA9IEhaOwo+PiAg fQo+PiAtRVhQT1JUX1NZTUJPTF9HUEwoZmJfZGVmZXJyZWRfaW9faW5pdCk7Cj4+ICAKPj4gIHZv aWQgZmJfZGVmZXJyZWRfaW9fb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKPj4gIAkJCSBzdHJ1 Y3QgaW5vZGUgKmlub2RlLAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmRldi9jb3Jl L2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0uYwo+PiBpbmRleCA4NmIw NmE1OTlmOTYuLjZhZjYyN2YyODFjMyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy92aWRlby9mYmRl di9jb3JlL2ZibWVtLmMKPj4gKysrIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMK Pj4gQEAgLTEzNDEsNyArMTM0MSwxNiBAQCBmYl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCj4+ICAJCXJldHVybiAtRU5PREVWOwo+PiAgCWZiID0g aW5mby0+ZmJvcHM7Cj4+ICAJbXV0ZXhfbG9jaygmaW5mby0+bW1fbG9jayk7Cj4+IC0JaWYgKGZi LT5mYl9tbWFwKSB7Cj4+ICsJaWYgKGZiLT5mYmRlZmlvKSB7Cj4+ICsJCS8qCj4+ICsJCSAqIFRo ZSBmcmFtZWJ1ZmZlciBuZWVkcyB0byBiZSBhY2Nlc3NlZCBkZWNyeXB0ZWQsIGJlIHN1cmUKPj4g KwkJICogU01FIHByb3RlY3Rpb24gaXMgcmVtb3ZlZCBhaGVhZCBvZiB0aGUgY2FsbAo+PiArCQkg Ki8KPj4gKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3RfZGVjcnlwdGVkKHZtYS0+dm1fcGFn ZV9wcm90KTsKPj4gKwkJcmVzID0gZmJfZGVmZXJyZWRfaW9fbW1hcChpbmZvLCB2bWEpOwo+PiAr CQltdXRleF91bmxvY2soJmluZm8tPm1tX2xvY2spOwo+PiArCQlyZXR1cm4gcmVzOwo+PiArCX0g ZWxzZSBpZiAoZmItPmZiX21tYXApIHsKPj4gIAkJaW50IHJlczsKPj4gIAo+PiAgCQkvKgo+PiAK Pj4gSXMgd2hhdCBJIHdhcyB0aGlua2luZyBvZmYgYXMgdGhlIHByZXR0eSBzb2x1dGlvbi4gQWRk IGFuIGV4cGxpY2l0Cj4+IGZiX2luZm8tPmZiZGVmaW9fZW5hYmxlZCBib29sZWFuIGlmIHlvdSBk b24ndCBmZWVsIGxpa2UgYXVkaXRpbmcgYWxsIHRoZQo+PiBkcml2ZXJzIGZvciB3aGV0aGVyIHRo ZXkgcmVhbGx5IGNhbGwgZGVmaW9faW5pdCgpIGV2ZXJ5IHRpbWUgdGhleSBhc3NpZ24KPj4gc29t ZXRoaW5nIHRvIHRoYXQgcG9pbnRlci4gQSBxdWljayBzY2FuIGJyb3VnaHQgc29tZSBuYXN0aWVz IHRvIGxpZ2h0IGluCj4+IHRoYXQgYXJlYS4KPgo+IENvcnJlY3Rpb24sIGJyYWluIHdhc24ndCBh d2FrZSB5ZXQsIEkndmUgZG9uZSB0aGUgYXVkaXQgYW5kIHRoZSBhYm92ZSBkaWZmCj4gc2hvdWxk IHdvcmsgYWZhaWN0LgoKSXQganVzdCBmZWx0IHNrZXRjaHkgdG8gbWUgdG8gZGVwZW5kIG9uIHRo YXQgcG9pbnRlciBiZWluZyBzZXQgYXMgdGhlCmRlY2lkZXIsIGluZGVwZW5kZW50IG9mIGRlZmlv IGluaXQuIEJ1dCBpZiB5b3UgdGhpbmsgdGhhdCdzIHRoZSB3YXkgdG8KZ28sIEknbSBub3QgZ29p bmcgdG8gYXJndWUuIEknbGwgYmV0IGl0IHdvbid0IGdvIHVubm90aWNlZCBpZgpmYl9kZWZlcnJl ZF9pb19tbWFwKCkgZ2V0cyBjYWxsZWQgd2l0aG91dCB0aGUgaW5pdC4gOykKCkJSLApKYW5pLgoK Cgo+IC1EYW5pZWwKPgo+PiAKPj4gSSB0aGluayBhIGZ1bmN0aW9uIHBvaW50ZXIgaGVyZSBpcyBw b2ludGxlc3MgYmVjYXVzZSB3ZSBjbGVhcmx5IGRvbid0IG5lZWQKPj4gaXQsIGFuZCB3aXRoIGFs bCB0aGUgcGFuaWMgYXJvdW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGEgZGlyZWN0IGNhbGwgZmVlbHMK Pj4gbXVjaCBiZXR0ZXIgOi0pCj4+IC1EYW5pZWwKPj4gCj4+ID4gCj4+ID4gQlIsCj4+ID4gSmFu aS4KPj4gPiAKPj4gPiAKPj4gPiA+IC1EYW5pZWwKPj4gPiA+Cj4+ID4gPj4gCj4+ID4gPj4gVGhh dCB2ZXJzaW9uIHdvdWxkIGFsc28gZ2V0IG15IHItYiBzdGFtcC4gU28gdXAgdG8geW91IHdoYXQg eW91IHByZWZlci4KPj4gPiA+PiAtRGFuaWVsCj4+ID4gPj4gCj4+ID4gPj4gPiAtLS0KPj4gPiA+ PiA+ICBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJfZGVmaW8uYyB8IDI1ICsrKysrKysrKysr KysrKysrKysrKystLS0KPj4gPiA+PiA+ICBpbmNsdWRlL2xpbnV4L2ZiLmggICAgICAgICAgICAg ICAgICB8ICAzICsrLQo+PiA+ID4+ID4gIDIgZmlsZXMgY2hhbmdlZCwgMjQgaW5zZXJ0aW9ucygr KSwgNCBkZWxldGlvbnMoLSkKPj4gPiA+PiA+IAo+PiA+ID4+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvdmlkZW8vZmJkZXYvY29yZS9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3Jl L2ZiX2RlZmlvLmMKPj4gPiA+PiA+IGluZGV4IDgyYzIwYzYwNDdiMC4uMzY2OTc4NDRjMWUwIDEw MDY0NAo+PiA+ID4+ID4gLS0tIGEvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiX2RlZmlvLmMK Pj4gPiA+PiA+ICsrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYl9kZWZpby5jCj4+ID4g Pj4gPiBAQCAtMjAwLDEzICsyMDAsMjMgQEAgc3RhdGljIHZvaWQgZmJfZGVmZXJyZWRfaW9fd29y ayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4+ID4gPj4gPiAgCW11dGV4X3VubG9jaygmZmJk ZWZpby0+bG9jayk7Cj4+ID4gPj4gPiAgfQo+PiA+ID4+ID4gIAo+PiA+ID4+ID4gLXZvaWQgZmJf ZGVmZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gPiA+PiA+ICtpbnQgZmJf ZGVmZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gPiA+PiA+ICB7Cj4+ID4g Pj4gPiAgCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbyA9IGluZm8tPmZiZGVmaW87Cj4+ ID4gPj4gPiArCXN0cnVjdCBmYl9vcHMgKmZib3BzOwo+PiA+ID4+ID4gIAo+PiA+ID4+ID4gIAlC VUdfT04oIWZiZGVmaW8pOwo+PiA+ID4+ID4gKwo+PiA+ID4+ID4gKwlmYm9wcyA9IGttZW1kdXAo aW5mby0+ZmJvcHMsIHNpemVvZigqZmJvcHMpLCBHRlBfS0VSTkVMKTsKPj4gPiA+PiA+ICsJaWYg KCFmYm9wcykKPj4gPiA+PiA+ICsJCXJldHVybiAtRU5PTUVNOwo+PiA+ID4+ID4gKwo+PiA+ID4+ ID4gKwlmYm9wcy0+ZmJfbW1hcCA9IGZiX2RlZmVycmVkX2lvX21tYXA7Cj4+ID4gPj4gPiArCWlu Zm8tPmRlZmVycmVkX2lvX3ByaXZhdGUgPSBpbmZvLT5mYm9wczsKPj4gPiA+PiA+ICsJaW5mby0+ ZmJvcHMgPSBmYm9wczsKPj4gPiA+PiA+ICsKPj4gPiA+PiA+ICAJbXV0ZXhfaW5pdCgmZmJkZWZp by0+bG9jayk7Cj4+ID4gPj4gPiAtCWluZm8tPmZib3BzLT5mYl9tbWFwID0gZmJfZGVmZXJyZWRf aW9fbW1hcDsKPj4gPiA+PiA+ICsKPj4gPiA+PiA+ICAJSU5JVF9ERUxBWUVEX1dPUksoJmluZm8t PmRlZmVycmVkX3dvcmssIGZiX2RlZmVycmVkX2lvX3dvcmspOwo+PiA+ID4+ID4gIAlJTklUX0xJ U1RfSEVBRCgmZmJkZWZpby0+cGFnZWxpc3QpOwo+PiA+ID4+ID4gIAlpZiAoZmJkZWZpby0+ZGVs YXkgPT0gMCkgLyogc2V0IGEgZGVmYXVsdCBvZiAxIHMgKi8KPj4gPiA+PiA+IEBAIC0yMjksNiAr MjM5LDEyIEBAIHZvaWQgZmJfZGVmZXJyZWRfaW9fY2xlYW51cChzdHJ1Y3QgZmJfaW5mbyAqaW5m bykKPj4gPiA+PiA+ICAJaW50IGk7Cj4+ID4gPj4gPiAgCj4+ID4gPj4gPiAgCUJVR19PTighZmJk ZWZpbyk7Cj4+ID4gPj4gPiArCj4+ID4gPj4gPiArCS8qIHNhbml0eSBjaGVjayBhZ2FpbnN0IG1p c3VzZSAqLwo+PiA+ID4+ID4gKwlpZiAoV0FSTl9PTighaW5mby0+ZGVmZXJyZWRfaW9fcHJpdmF0 ZSB8fAo+PiA+ID4+ID4gKwkJICAgIGluZm8tPmZib3BzLT5mYl9tbWFwICE9IGZiX2RlZmVycmVk X2lvX21tYXApKQo+PiA+ID4+ID4gKwkJcmV0dXJuOwo+PiA+ID4+ID4gKwo+PiA+ID4+ID4gIAlj YW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPmRlZmVycmVkX3dvcmspOwo+PiA+ID4+ID4g IAo+PiA+ID4+ID4gIAkvKiBjbGVhciBvdXQgdGhlIG1hcHBpbmcgdGhhdCB3ZSBzZXR1cCAqLwo+ PiA+ID4+ID4gQEAgLTIzNyw3ICsyNTMsMTAgQEAgdm9pZCBmYl9kZWZlcnJlZF9pb19jbGVhbnVw KHN0cnVjdCBmYl9pbmZvICppbmZvKQo+PiA+ID4+ID4gIAkJcGFnZS0+bWFwcGluZyA9IE5VTEw7 Cj4+ID4gPj4gPiAgCX0KPj4gPiA+PiA+ICAKPj4gPiA+PiA+IC0JaW5mby0+ZmJvcHMtPmZiX21t YXAgPSBOVUxMOwo+PiA+ID4+ID4gKwlrZnJlZShpbmZvLT5mYm9wcyk7Cj4+ID4gPj4gPiArCWlu Zm8tPmZib3BzID0gaW5mby0+ZGVmZXJyZWRfaW9fcHJpdmF0ZTsKPj4gPiA+PiA+ICsJaW5mby0+ ZGVmZXJyZWRfaW9fcHJpdmF0ZSA9IE5VTEw7Cj4+ID4gPj4gPiArCj4+ID4gPj4gPiAgCW11dGV4 X2Rlc3Ryb3koJmZiZGVmaW8tPmxvY2spOwo+PiA+ID4+ID4gIH0KPj4gPiA+PiA+ICBFWFBPUlRf U1lNQk9MX0dQTChmYl9kZWZlcnJlZF9pb19jbGVhbnVwKTsKPj4gPiA+PiA+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKPj4gPiA+PiA+IGluZGV4 IGE2YWQ1Mjg5OTBkZS4uNjVmMmFiZDQ3NzQ1IDEwMDY0NAo+PiA+ID4+ID4gLS0tIGEvaW5jbHVk ZS9saW51eC9mYi5oCj4+ID4gPj4gPiArKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKPj4gPiA+PiA+ IEBAIC00NzAsNiArNDcwLDcgQEAgc3RydWN0IGZiX2luZm8gewo+PiA+ID4+ID4gICNpZmRlZiBD T05GSUdfRkJfREVGRVJSRURfSU8KPj4gPiA+PiA+ICAJc3RydWN0IGRlbGF5ZWRfd29yayBkZWZl cnJlZF93b3JrOwo+PiA+ID4+ID4gIAlzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8gKmZiZGVmaW87Cj4+ ID4gPj4gPiArCXZvaWQgKmRlZmVycmVkX2lvX3ByaXZhdGU7Cj4+ID4gPj4gPiAgI2VuZGlmCj4+ ID4gPj4gPiAgCj4+ID4gPj4gPiAgCXN0cnVjdCBmYl9vcHMgKmZib3BzOwo+PiA+ID4+ID4gQEAg LTY1OCw3ICs2NTksNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgX19mYl9wYWRfYWxpZ25lZF9idWZm ZXIodTggKmRzdCwgdTMyIGRfcGl0Y2gsCj4+ID4gPj4gPiAgCj4+ID4gPj4gPiAgLyogZHJpdmVy cy92aWRlby9mYl9kZWZpby5jICovCj4+ID4gPj4gPiAgaW50IGZiX2RlZmVycmVkX2lvX21tYXAo c3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKPj4gPiA+ PiA+IC1leHRlcm4gdm9pZCBmYl9kZWZlcnJlZF9pb19pbml0KHN0cnVjdCBmYl9pbmZvICppbmZv KTsKPj4gPiA+PiA+ICtleHRlcm4gaW50IGZiX2RlZmVycmVkX2lvX2luaXQoc3RydWN0IGZiX2lu Zm8gKmluZm8pOwo+PiA+ID4+ID4gIGV4dGVybiB2b2lkIGZiX2RlZmVycmVkX2lvX29wZW4oc3Ry dWN0IGZiX2luZm8gKmluZm8sCj4+ID4gPj4gPiAgCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCj4+ ID4gPj4gPiAgCQkJCXN0cnVjdCBmaWxlICpmaWxlKTsKPj4gPiA+PiA+IC0tIAo+PiA+ID4+ID4g Mi4yMC4xCj4+ID4gPj4gPiAKPj4gPiA+PiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4+ID4gPj4gPiBJbnRlbC1nZnggbWFpbGluZyBsaXN0Cj4+ID4g Pj4gPiBJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4+ID4gPj4gPiBodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+PiA+ID4+IAo+ PiA+ID4+IC0tIAo+PiA+ID4+IERhbmllbCBWZXR0ZXIKPj4gPiA+PiBTb2Z0d2FyZSBFbmdpbmVl ciwgSW50ZWwgQ29ycG9yYXRpb24KPj4gPiA+PiBodHRwOi8vYmxvZy5mZndsbC5jaAo+PiA+IAo+ PiA+IC0tIAo+PiA+IEphbmkgTmlrdWxhLCBJbnRlbCBPcGVuIFNvdXJjZSBHcmFwaGljcyBDZW50 ZXIKPj4gCj4+IC0tIAo+PiBEYW5pZWwgVmV0dGVyCj4+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgo+PiBodHRwOi8vYmxvZy5mZndsbC5jaAoKLS0gCkphbmkgTmlrdWxhLCBJ bnRlbCBPcGVuIFNvdXJjZSBHcmFwaGljcyBDZW50ZXIKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vZHJpLWRldmVs 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=-6.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=unavailable 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 3BD24C432C0 for ; Thu, 28 Nov 2019 10:34:51 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1A76B21774 for ; Thu, 28 Nov 2019 10:34:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1A76B21774 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D09CC6E79C; Thu, 28 Nov 2019 10:34:47 +0000 (UTC) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 872256E79B; Thu, 28 Nov 2019 10:34:46 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Nov 2019 02:34:45 -0800 X-IronPort-AV: E=Sophos;i="5.69,253,1571727600"; d="scan'208";a="203396712" Received: from jnikula-mobl3.fi.intel.com (HELO localhost) ([10.237.66.161]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Nov 2019 02:34:43 -0800 From: Jani Nikula To: Daniel Vetter In-Reply-To: <20191128100809.GP406127@phenom.ffwll.local> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <448995ffd954e0cd2287089cb686e351cc095834.1574871797.git.jani.nikula@intel.com> <20191127181741.GG406127@phenom.ffwll.local> <20191127182105.GJ406127@phenom.ffwll.local> <87fti8nz8l.fsf@intel.com> <20191128100557.GO406127@phenom.ffwll.local> <20191128100809.GP406127@phenom.ffwll.local> Date: Thu, 28 Nov 2019 12:34:40 +0200 Message-ID: <871rtsnvb3.fsf@intel.com> MIME-Version: 1.0 Subject: Re: [Intel-gfx] [PATCH 01/13] video: fb_defio: preserve user fb_ops X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-fbdev@vger.kernel.org, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Jaya Kumar Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Message-ID: <20191128103440.FbgEkLH_S21LStOUyY53CNZJD_CKvltOguxTNNvjcpA@z> T24gVGh1LCAyOCBOb3YgMjAxOSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90 ZToKPiBPbiBUaHUsIE5vdiAyOCwgMjAxOSBhdCAxMTowNTo1N0FNICswMTAwLCBEYW5pZWwgVmV0 dGVyIHdyb3RlOgo+PiBPbiBUaHUsIE5vdiAyOCwgMjAxOSBhdCAxMTowOTo0NkFNICswMjAwLCBK YW5pIE5pa3VsYSB3cm90ZToKPj4gPiBPbiBXZWQsIDI3IE5vdiAyMDE5LCBEYW5pZWwgVmV0dGVy IDxkYW5pZWxAZmZ3bGwuY2g+IHdyb3RlOgo+PiA+ID4gT24gV2VkLCBOb3YgMjcsIDIwMTkgYXQg MDc6MTc6NDFQTSArMDEwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4gPiA+PiBPbiBXZWQsIE5v diAyNywgMjAxOSBhdCAwNjozMTo1N1BNICswMjAwLCBKYW5pIE5pa3VsYSB3cm90ZToKPj4gPiA+ PiA+IE1vZGlmeWluZyBmYl9vcHMgZGlyZWN0bHkgdG8gb3ZlcnJpZGUgZmJfbW1hcCB3aXRoIGZi X2RlZmVycmVkX2lvX21tYXAKPj4gPiA+PiA+IGFuZCB0aGVuIHJlc2V0dGluZyBpdCB0byBOVUxM IGFmdGVyd2FyZHMgY2F1c2VzIHByb2JsZW1zIGFsbCBvdmVyIHRoZQo+PiA+ID4+ID4gcGxhY2Uu IEZpcnN0LCBpdCBwcmV2ZW50cyBtYWtpbmcgdGhlIGZib3BzIG1lbWJlciBvZiBzdHJ1Y3QgZmJf aW5mbyBhCj4+ID4gPj4gPiBjb25zdCBwb2ludGVyLCB3aGljaCBtZWFucyB3ZSBjYW4ndCBtYWtl IHN0cnVjdCBmYl9vcHMgY29uc3QKPj4gPiA+PiA+IGFueXdoZXJlLiBTZWNvbmQsIGEgZmV3IHBs YWNlcyBoYXZlIHRvIGdvIG91dCBvZiB0aGVpciB3YXkgdG8gcmVzdG9yZQo+PiA+ID4+ID4gdGhl IG9yaWdpbmFsIGZiX21tYXAgcG9pbnRlciB0aGF0IGdldHMgcmVzZXQgdG8gTlVMTC4KPj4gPiA+ PiA+IAo+PiA+ID4+ID4gUHJlc2VydmUgdGhlIHBhc3NlZCBpbiBmYl9vcHMgYnkgbWFraW5nIGEg Y29weSBvZiBpdCBhbmQgbW9kaWZ5aW5nIHRoYXQKPj4gPiA+PiA+IGluc3RlYWQuIEFkZCBhIGRl ZmVycmVkX2lvX3ByaXZhdGUgbWVtYmVyIHRvIHN0cnVjdCBmYl9pbmZvIHRvIHN0b3JlIHRoZQo+ PiA+ID4+ID4gcG9pbnRlciB0byB0aGUgb2xkIGZiX29wcywgYW5kIHJlc3RvcmUgdGhhdCBhdCBj bGVhbnVwLgo+PiA+ID4+ID4gCj4+ID4gPj4gPiBDYzogSmF5YSBLdW1hciA8amF5YWxrQGludHdv cmtzLmJpej4KPj4gPiA+PiA+IENjOiBsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcKPj4gPiA+ PiA+IFNpZ25lZC1vZmYtYnk6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBpbnRlbC5jb20+Cj4+ ID4gPj4gPiAKPj4gPiA+PiA+IC0tLQo+PiA+ID4+ID4gCj4+ID4gPj4gPiBOb3RlOiBJZiB0aGUg YXBwcm9hY2ggaXMgYWNjZXB0YWJsZSwgd2UnbGwgYWxzbyBuZWVkIHRvIGhhbmRsZSB0aGUgZXJy b3IKPj4gPiA+PiA+IHJldHVybnMgb24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMgYXQgZmJf ZGVmZXJyZWRfaW9faW5pdCgpIGNhbGwKPj4gPiA+PiA+IHNpdGVzLiBUaGVyZSBhcmUgMTMuCj4+ ID4gPj4gCj4+ID4gPj4gaXQncyBmYmRldiBkZWZpbywgSSB0aGluayB3ZSBjYW4gZG8gd29yc2Ug d2l0aCBsZXNzIGVmZm9ydC4gSnVzdCBlbWJlZCBhCj4+ID4gPj4gY29weSBvZiBmYl9vcHMgaW50 byBmYl9pbmZvLCBhbmQgdXNlIHRoYXQsIGFuZCB0YWRhISBubyBtZW1vcnkgYWxsb2NhdGlvbgo+ PiA+ID4+IG5lZWRlZCA6LSkKPj4gPiA+PiAKPj4gPiA+PiBJJ2QgdG90YWxseSByLWIgdGhhdCBw YXRjaC4KPj4gPiA+PiAKPj4gPiA+PiBPciBkbyB3aGF0IFZpbGxlIHN1Z2dlc3RlZCwgYWRkIGFu IGZiX2luZm8tPmZiZGVmaW8uZW5hYmxlZCwgc2V0IHRoYXQgaW4KPj4gPiA+PiB0aGUgX2luaXQg ZnVuY3Rpb24gYW5kIGluIGZiX21tYXAgY2FsbCBmYl9kZWZlcnJlZF9pb19tbWFwIGZvciB0aGF0 IGNhc2UKPj4gPiA+PiBpbnN0ZWFkIG9mIHRoZSBkcml2ZXIncyBmYl9vcHMtPmZiX21tYXAuIFRo ZXJlJ3Mgb25seSBvbmUgY2FsbGVyIG9mIHRoYXQKPj4gPiA+PiBpbiB0aGUgZW50aXJlIHRyZWUs IGluIGZibWVtLmMuIEFsc28sIHdlIGNvdWxkL3Nob3VsZCBudWtlIHRoZQo+PiA+ID4+IEVYUE9S VF9TWU1CT0woZmJfZGVmZXJyZWRfaW9fbW1hcCkgSSB0aGluay4KPj4gPiA+Cj4+ID4gPiBJIGp1 c3QgcmVhbGl6ZWQgdGhhdCBmYl9pbmZvLT5mYmRlZmlvIGlzIGEgcG9pbnRlciwgc28gdGhpcyB3 b3VsZCBiZQo+PiA+ID4gcmVhbGx5IHNpbXBsZSB0byBwdWxsIG9mZiBJIHRoaW5rLgo+PiA+IAo+ PiA+IEhlaCwgaGF2aW5nIGEKPj4gPiAKPj4gPiAJaW50ICgqZmJfZGVmZXJyZWRfaW9fbW1hcCko c3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwo+PiA+IAo+PiA+IG1l bWJlciBpbiBzdHJ1Y3QgZmJfaW5mbywgYW5kIHVzaW5nIHRoYXQgaW4gZmJtZW0uYyBpZiBub24t TlVMTCwgd2FzCj4+ID4gYWN0dWFsbHkgbXkgZmlyc3QgaWRlYS4gSSBkaWRuJ3QgdGhpbmsgaXQg d2FzIHBhcnRpY3VsYXJseSBwcmV0dHksIGJ1dAo+PiA+IGlmIHdlIGRvbid0IGNhcmUgYWJvdXQg YWVzdGhldGljcy4uLgo+PiA+IAo+PiA+IFdvdWxkIHlvdSBsaWtlIHRoYXQgaW5zdGVhZCBvZiB0 aGUgcGF0Y2ggYXQgaGFuZD8KPj4gCj4+IAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9m YmRldi9jb3JlL2ZiX2RlZmlvLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJfZGVmaW8u Ywo+PiBpbmRleCA4MmMyMGM2MDQ3YjAuLjkyNzVjNmJkNzFkYSAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy92aWRlby9mYmRldi9jb3JlL2ZiX2RlZmlvLmMKPj4gKysrIGIvZHJpdmVycy92aWRlby9m YmRldi9jb3JlL2ZiX2RlZmlvLmMKPj4gQEAgLTIwNiwxMyArMjA2LDExIEBAIHZvaWQgZmJfZGVm ZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gIAo+PiAgCUJVR19PTighZmJk ZWZpbyk7Cj4+ICAJbXV0ZXhfaW5pdCgmZmJkZWZpby0+bG9jayk7Cj4+IC0JaW5mby0+ZmJvcHMt PmZiX21tYXAgPSBmYl9kZWZlcnJlZF9pb19tbWFwOwo+PiAgCUlOSVRfREVMQVlFRF9XT1JLKCZp bmZvLT5kZWZlcnJlZF93b3JrLCBmYl9kZWZlcnJlZF9pb193b3JrKTsKPj4gIAlJTklUX0xJU1Rf SEVBRCgmZmJkZWZpby0+cGFnZWxpc3QpOwo+PiAgCWlmIChmYmRlZmlvLT5kZWxheSA9PSAwKSAv KiBzZXQgYSBkZWZhdWx0IG9mIDEgcyAqLwo+PiAgCQlmYmRlZmlvLT5kZWxheSA9IEhaOwo+PiAg fQo+PiAtRVhQT1JUX1NZTUJPTF9HUEwoZmJfZGVmZXJyZWRfaW9faW5pdCk7Cj4+ICAKPj4gIHZv aWQgZmJfZGVmZXJyZWRfaW9fb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKPj4gIAkJCSBzdHJ1 Y3QgaW5vZGUgKmlub2RlLAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmRldi9jb3Jl L2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0uYwo+PiBpbmRleCA4NmIw NmE1OTlmOTYuLjZhZjYyN2YyODFjMyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy92aWRlby9mYmRl di9jb3JlL2ZibWVtLmMKPj4gKysrIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMK Pj4gQEAgLTEzNDEsNyArMTM0MSwxNiBAQCBmYl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCj4+ICAJCXJldHVybiAtRU5PREVWOwo+PiAgCWZiID0g aW5mby0+ZmJvcHM7Cj4+ICAJbXV0ZXhfbG9jaygmaW5mby0+bW1fbG9jayk7Cj4+IC0JaWYgKGZi LT5mYl9tbWFwKSB7Cj4+ICsJaWYgKGZiLT5mYmRlZmlvKSB7Cj4+ICsJCS8qCj4+ICsJCSAqIFRo ZSBmcmFtZWJ1ZmZlciBuZWVkcyB0byBiZSBhY2Nlc3NlZCBkZWNyeXB0ZWQsIGJlIHN1cmUKPj4g KwkJICogU01FIHByb3RlY3Rpb24gaXMgcmVtb3ZlZCBhaGVhZCBvZiB0aGUgY2FsbAo+PiArCQkg Ki8KPj4gKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3RfZGVjcnlwdGVkKHZtYS0+dm1fcGFn ZV9wcm90KTsKPj4gKwkJcmVzID0gZmJfZGVmZXJyZWRfaW9fbW1hcChpbmZvLCB2bWEpOwo+PiAr CQltdXRleF91bmxvY2soJmluZm8tPm1tX2xvY2spOwo+PiArCQlyZXR1cm4gcmVzOwo+PiArCX0g ZWxzZSBpZiAoZmItPmZiX21tYXApIHsKPj4gIAkJaW50IHJlczsKPj4gIAo+PiAgCQkvKgo+PiAK Pj4gSXMgd2hhdCBJIHdhcyB0aGlua2luZyBvZmYgYXMgdGhlIHByZXR0eSBzb2x1dGlvbi4gQWRk IGFuIGV4cGxpY2l0Cj4+IGZiX2luZm8tPmZiZGVmaW9fZW5hYmxlZCBib29sZWFuIGlmIHlvdSBk b24ndCBmZWVsIGxpa2UgYXVkaXRpbmcgYWxsIHRoZQo+PiBkcml2ZXJzIGZvciB3aGV0aGVyIHRo ZXkgcmVhbGx5IGNhbGwgZGVmaW9faW5pdCgpIGV2ZXJ5IHRpbWUgdGhleSBhc3NpZ24KPj4gc29t ZXRoaW5nIHRvIHRoYXQgcG9pbnRlci4gQSBxdWljayBzY2FuIGJyb3VnaHQgc29tZSBuYXN0aWVz IHRvIGxpZ2h0IGluCj4+IHRoYXQgYXJlYS4KPgo+IENvcnJlY3Rpb24sIGJyYWluIHdhc24ndCBh d2FrZSB5ZXQsIEkndmUgZG9uZSB0aGUgYXVkaXQgYW5kIHRoZSBhYm92ZSBkaWZmCj4gc2hvdWxk IHdvcmsgYWZhaWN0LgoKSXQganVzdCBmZWx0IHNrZXRjaHkgdG8gbWUgdG8gZGVwZW5kIG9uIHRo YXQgcG9pbnRlciBiZWluZyBzZXQgYXMgdGhlCmRlY2lkZXIsIGluZGVwZW5kZW50IG9mIGRlZmlv IGluaXQuIEJ1dCBpZiB5b3UgdGhpbmsgdGhhdCdzIHRoZSB3YXkgdG8KZ28sIEknbSBub3QgZ29p bmcgdG8gYXJndWUuIEknbGwgYmV0IGl0IHdvbid0IGdvIHVubm90aWNlZCBpZgpmYl9kZWZlcnJl ZF9pb19tbWFwKCkgZ2V0cyBjYWxsZWQgd2l0aG91dCB0aGUgaW5pdC4gOykKCkJSLApKYW5pLgoK Cgo+IC1EYW5pZWwKPgo+PiAKPj4gSSB0aGluayBhIGZ1bmN0aW9uIHBvaW50ZXIgaGVyZSBpcyBw b2ludGxlc3MgYmVjYXVzZSB3ZSBjbGVhcmx5IGRvbid0IG5lZWQKPj4gaXQsIGFuZCB3aXRoIGFs bCB0aGUgcGFuaWMgYXJvdW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGEgZGlyZWN0IGNhbGwgZmVlbHMK Pj4gbXVjaCBiZXR0ZXIgOi0pCj4+IC1EYW5pZWwKPj4gCj4+ID4gCj4+ID4gQlIsCj4+ID4gSmFu aS4KPj4gPiAKPj4gPiAKPj4gPiA+IC1EYW5pZWwKPj4gPiA+Cj4+ID4gPj4gCj4+ID4gPj4gVGhh dCB2ZXJzaW9uIHdvdWxkIGFsc28gZ2V0IG15IHItYiBzdGFtcC4gU28gdXAgdG8geW91IHdoYXQg eW91IHByZWZlci4KPj4gPiA+PiAtRGFuaWVsCj4+ID4gPj4gCj4+ID4gPj4gPiAtLS0KPj4gPiA+ PiA+ICBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJfZGVmaW8uYyB8IDI1ICsrKysrKysrKysr KysrKysrKysrKystLS0KPj4gPiA+PiA+ICBpbmNsdWRlL2xpbnV4L2ZiLmggICAgICAgICAgICAg ICAgICB8ICAzICsrLQo+PiA+ID4+ID4gIDIgZmlsZXMgY2hhbmdlZCwgMjQgaW5zZXJ0aW9ucygr KSwgNCBkZWxldGlvbnMoLSkKPj4gPiA+PiA+IAo+PiA+ID4+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvdmlkZW8vZmJkZXYvY29yZS9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3Jl L2ZiX2RlZmlvLmMKPj4gPiA+PiA+IGluZGV4IDgyYzIwYzYwNDdiMC4uMzY2OTc4NDRjMWUwIDEw MDY0NAo+PiA+ID4+ID4gLS0tIGEvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiX2RlZmlvLmMK Pj4gPiA+PiA+ICsrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYl9kZWZpby5jCj4+ID4g Pj4gPiBAQCAtMjAwLDEzICsyMDAsMjMgQEAgc3RhdGljIHZvaWQgZmJfZGVmZXJyZWRfaW9fd29y ayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4+ID4gPj4gPiAgCW11dGV4X3VubG9jaygmZmJk ZWZpby0+bG9jayk7Cj4+ID4gPj4gPiAgfQo+PiA+ID4+ID4gIAo+PiA+ID4+ID4gLXZvaWQgZmJf ZGVmZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gPiA+PiA+ICtpbnQgZmJf ZGVmZXJyZWRfaW9faW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKPj4gPiA+PiA+ICB7Cj4+ID4g Pj4gPiAgCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbyA9IGluZm8tPmZiZGVmaW87Cj4+ ID4gPj4gPiArCXN0cnVjdCBmYl9vcHMgKmZib3BzOwo+PiA+ID4+ID4gIAo+PiA+ID4+ID4gIAlC VUdfT04oIWZiZGVmaW8pOwo+PiA+ID4+ID4gKwo+PiA+ID4+ID4gKwlmYm9wcyA9IGttZW1kdXAo aW5mby0+ZmJvcHMsIHNpemVvZigqZmJvcHMpLCBHRlBfS0VSTkVMKTsKPj4gPiA+PiA+ICsJaWYg KCFmYm9wcykKPj4gPiA+PiA+ICsJCXJldHVybiAtRU5PTUVNOwo+PiA+ID4+ID4gKwo+PiA+ID4+ ID4gKwlmYm9wcy0+ZmJfbW1hcCA9IGZiX2RlZmVycmVkX2lvX21tYXA7Cj4+ID4gPj4gPiArCWlu Zm8tPmRlZmVycmVkX2lvX3ByaXZhdGUgPSBpbmZvLT5mYm9wczsKPj4gPiA+PiA+ICsJaW5mby0+ ZmJvcHMgPSBmYm9wczsKPj4gPiA+PiA+ICsKPj4gPiA+PiA+ICAJbXV0ZXhfaW5pdCgmZmJkZWZp by0+bG9jayk7Cj4+ID4gPj4gPiAtCWluZm8tPmZib3BzLT5mYl9tbWFwID0gZmJfZGVmZXJyZWRf aW9fbW1hcDsKPj4gPiA+PiA+ICsKPj4gPiA+PiA+ICAJSU5JVF9ERUxBWUVEX1dPUksoJmluZm8t PmRlZmVycmVkX3dvcmssIGZiX2RlZmVycmVkX2lvX3dvcmspOwo+PiA+ID4+ID4gIAlJTklUX0xJ U1RfSEVBRCgmZmJkZWZpby0+cGFnZWxpc3QpOwo+PiA+ID4+ID4gIAlpZiAoZmJkZWZpby0+ZGVs YXkgPT0gMCkgLyogc2V0IGEgZGVmYXVsdCBvZiAxIHMgKi8KPj4gPiA+PiA+IEBAIC0yMjksNiAr MjM5LDEyIEBAIHZvaWQgZmJfZGVmZXJyZWRfaW9fY2xlYW51cChzdHJ1Y3QgZmJfaW5mbyAqaW5m bykKPj4gPiA+PiA+ICAJaW50IGk7Cj4+ID4gPj4gPiAgCj4+ID4gPj4gPiAgCUJVR19PTighZmJk ZWZpbyk7Cj4+ID4gPj4gPiArCj4+ID4gPj4gPiArCS8qIHNhbml0eSBjaGVjayBhZ2FpbnN0IG1p c3VzZSAqLwo+PiA+ID4+ID4gKwlpZiAoV0FSTl9PTighaW5mby0+ZGVmZXJyZWRfaW9fcHJpdmF0 ZSB8fAo+PiA+ID4+ID4gKwkJICAgIGluZm8tPmZib3BzLT5mYl9tbWFwICE9IGZiX2RlZmVycmVk X2lvX21tYXApKQo+PiA+ID4+ID4gKwkJcmV0dXJuOwo+PiA+ID4+ID4gKwo+PiA+ID4+ID4gIAlj YW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPmRlZmVycmVkX3dvcmspOwo+PiA+ID4+ID4g IAo+PiA+ID4+ID4gIAkvKiBjbGVhciBvdXQgdGhlIG1hcHBpbmcgdGhhdCB3ZSBzZXR1cCAqLwo+ PiA+ID4+ID4gQEAgLTIzNyw3ICsyNTMsMTAgQEAgdm9pZCBmYl9kZWZlcnJlZF9pb19jbGVhbnVw KHN0cnVjdCBmYl9pbmZvICppbmZvKQo+PiA+ID4+ID4gIAkJcGFnZS0+bWFwcGluZyA9IE5VTEw7 Cj4+ID4gPj4gPiAgCX0KPj4gPiA+PiA+ICAKPj4gPiA+PiA+IC0JaW5mby0+ZmJvcHMtPmZiX21t YXAgPSBOVUxMOwo+PiA+ID4+ID4gKwlrZnJlZShpbmZvLT5mYm9wcyk7Cj4+ID4gPj4gPiArCWlu Zm8tPmZib3BzID0gaW5mby0+ZGVmZXJyZWRfaW9fcHJpdmF0ZTsKPj4gPiA+PiA+ICsJaW5mby0+ ZGVmZXJyZWRfaW9fcHJpdmF0ZSA9IE5VTEw7Cj4+ID4gPj4gPiArCj4+ID4gPj4gPiAgCW11dGV4 X2Rlc3Ryb3koJmZiZGVmaW8tPmxvY2spOwo+PiA+ID4+ID4gIH0KPj4gPiA+PiA+ICBFWFBPUlRf U1lNQk9MX0dQTChmYl9kZWZlcnJlZF9pb19jbGVhbnVwKTsKPj4gPiA+PiA+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKPj4gPiA+PiA+IGluZGV4 IGE2YWQ1Mjg5OTBkZS4uNjVmMmFiZDQ3NzQ1IDEwMDY0NAo+PiA+ID4+ID4gLS0tIGEvaW5jbHVk ZS9saW51eC9mYi5oCj4+ID4gPj4gPiArKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKPj4gPiA+PiA+ IEBAIC00NzAsNiArNDcwLDcgQEAgc3RydWN0IGZiX2luZm8gewo+PiA+ID4+ID4gICNpZmRlZiBD T05GSUdfRkJfREVGRVJSRURfSU8KPj4gPiA+PiA+ICAJc3RydWN0IGRlbGF5ZWRfd29yayBkZWZl cnJlZF93b3JrOwo+PiA+ID4+ID4gIAlzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8gKmZiZGVmaW87Cj4+ ID4gPj4gPiArCXZvaWQgKmRlZmVycmVkX2lvX3ByaXZhdGU7Cj4+ID4gPj4gPiAgI2VuZGlmCj4+ ID4gPj4gPiAgCj4+ID4gPj4gPiAgCXN0cnVjdCBmYl9vcHMgKmZib3BzOwo+PiA+ID4+ID4gQEAg LTY1OCw3ICs2NTksNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgX19mYl9wYWRfYWxpZ25lZF9idWZm ZXIodTggKmRzdCwgdTMyIGRfcGl0Y2gsCj4+ID4gPj4gPiAgCj4+ID4gPj4gPiAgLyogZHJpdmVy cy92aWRlby9mYl9kZWZpby5jICovCj4+ID4gPj4gPiAgaW50IGZiX2RlZmVycmVkX2lvX21tYXAo c3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKPj4gPiA+ PiA+IC1leHRlcm4gdm9pZCBmYl9kZWZlcnJlZF9pb19pbml0KHN0cnVjdCBmYl9pbmZvICppbmZv KTsKPj4gPiA+PiA+ICtleHRlcm4gaW50IGZiX2RlZmVycmVkX2lvX2luaXQoc3RydWN0IGZiX2lu Zm8gKmluZm8pOwo+PiA+ID4+ID4gIGV4dGVybiB2b2lkIGZiX2RlZmVycmVkX2lvX29wZW4oc3Ry dWN0IGZiX2luZm8gKmluZm8sCj4+ID4gPj4gPiAgCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCj4+ ID4gPj4gPiAgCQkJCXN0cnVjdCBmaWxlICpmaWxlKTsKPj4gPiA+PiA+IC0tIAo+PiA+ID4+ID4g Mi4yMC4xCj4+ID4gPj4gPiAKPj4gPiA+PiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4+ID4gPj4gPiBJbnRlbC1nZnggbWFpbGluZyBsaXN0Cj4+ID4g Pj4gPiBJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4+ID4gPj4gPiBodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+PiA+ID4+IAo+ PiA+ID4+IC0tIAo+PiA+ID4+IERhbmllbCBWZXR0ZXIKPj4gPiA+PiBTb2Z0d2FyZSBFbmdpbmVl ciwgSW50ZWwgQ29ycG9yYXRpb24KPj4gPiA+PiBodHRwOi8vYmxvZy5mZndsbC5jaAo+PiA+IAo+ PiA+IC0tIAo+PiA+IEphbmkgTmlrdWxhLCBJbnRlbCBPcGVuIFNvdXJjZSBHcmFwaGljcyBDZW50 ZXIKPj4gCj4+IC0tIAo+PiBEYW5pZWwgVmV0dGVyCj4+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgo+PiBodHRwOi8vYmxvZy5mZndsbC5jaAoKLS0gCkphbmkgTmlrdWxhLCBJ bnRlbCBPcGVuIFNvdXJjZSBHcmFwaGljcyBDZW50ZXIKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4