From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH v2 05/13] drm/i915/dp: generate and cache sink rate array for all DP, not just eDP 1.4 Date: Fri, 3 Feb 2017 19:16:51 +0200 Message-ID: <20170203171651.GL31595@intel.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id AE6C68925E for ; Fri, 3 Feb 2017 17:16:55 +0000 (UTC) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Jani Nikula Cc: intel-gfx@lists.freedesktop.org, dhinakaran.pandiyan@intel.com List-Id: intel-gfx@lists.freedesktop.org T24gRnJpLCBGZWIgMDMsIDIwMTcgYXQgMDQ6MTk6MjhQTSArMDIwMCwgSmFuaSBOaWt1bGEgd3Jv dGU6Cj4gVGhlcmUgaXMgc29tZSBjb25mbGF0aW9uIHJlbGF0ZWQgdG8gc2luayByYXRlcywgbWFr aW5nIHRoaXMgY2hhbmdlIG1vcmUKPiBjb21wbGljYXRlZCB0aGFuIGl0IHdvdWxkIG90aGVyd2lz ZSBoYXZlIHRvIGJlLiBUaGVyZSBhcmUgdGhyZWUgY2hhbmdlcwo+IGhlcmUgdGhhdCBhcmUgcmF0 aGVyIGRpZmZpY3VsdCB0byBzcGxpdCB1cDoKPiAKPiAxKSBVc2UgdGhlIGludGVsX2RwLT5zaW5r X3JhdGVzIGFycmF5IGZvciBhbGwgRFAsIG5vdCBqdXN0IGVEUCAxLjQuIFdlCj4gICAgaW5pdGlh bGl6ZSBpdCBmcm9tIERQQ0Qgb24gZURQIDEuNCBsaWtlIGJlZm9yZSwgYnV0IGdlbmVyYXRlIGl0 IGJhc2VkCj4gICAgb24gRFBfTUFYX0xJTktfUkFURSBvbiBvdGhlcnMuIFRoaXMgcmVkdWNlcyBj b2RlIGNvbXBsZXhpdHkgd2hlbiB3ZQo+ICAgIG5lZWQgdG8gdXNlIHRoZSBzaW5rIHJhdGVzOyB0 aGV5IGFyZSBhbGwgYWx3YXlzIGluIHRoZSBzaW5rX3JhdGVzCj4gICAgYXJyYXkuCj4gCj4gMikg VXBkYXRlIHRoZSBzaW5rIHJhdGUgYXJyYXkgd2hlbmV2ZXIgd2UgcmVhZCBEUENELCBhbmQgdXNl IHRoZQo+ICAgIGluZm9ybWF0aW9uIGZyb20gdGhlcmUuIFRoaXMgaW5jcmVhc2VzIGNvZGUgcmVh ZGFiaWxpdHkgd2hlbiB3ZSBuZWVkCj4gICAgdGhlIHNpbmsgcmF0ZXMuCj4gCj4gMykgRGlzZW50 YW5nbGUgZmFsbGJhY2sgcmF0ZSBsaW1pdGluZyBmcm9tIHNpbmsgcmF0ZXMuIEluIHRoZSBjb2Rl LCB0aGUKPiAgICBtYXggcmF0ZSBpcyBhIGR5bmFtaWMgcHJvcGVydHkgb2YgdGhlICpsaW5rKiwg bm90IG9mIHRoZSAqc2luayouIERvCj4gICAgdGhlIGxpbWl0aW5nIGFmdGVyIGludGVyc2VjdGlu ZyB0aGUgc291cmNlIGFuZCBzaW5rIHJhdGVzLCB3aGljaCBhcmUKPiAgICBzdGF0aWMgcHJvcGVy dGllcyBvZiB0aGUgZGV2aWNlcy4KPiAKPiBUaGlzIHBhdmVzIHRoZSB3YXkgZm9yIGZvbGxvdy11 cCByZWZhY3RvcmluZyB0aGF0IEkndmUgcmVmcmFpbmVkIGZyb20KPiBkb2luZyBoZXJlIHRvIGtl ZXAgdGhpcyBjaGFuZ2UgYXMgc2ltcGxlIGFzIGl0IHBvc3NpYmx5IGNhbi4KPiAKPiB2MjogaW50 cm9kdWNlIHVzZV9yYXRlX3NlbGVjdCBhbmQgaGFuZGxlIG5vbi1jb25maXJtaW5nIGVEUCAoVmls bGUpCj4gCj4gQ2M6IE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4g Q2M6IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Cj4gU2ln bmVkLW9mZi1ieTogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGludGVsLmNvbT4KPiAtLS0KPiAg ZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyAgICAgICAgICAgICAgIHwgNzkgKysrKysr KysrKysrKysrKysrLS0tLS0tLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2xp bmtfdHJhaW5pbmcuYyB8ICAzICstCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5o ICAgICAgICAgICAgICB8ICA1ICstCj4gIDMgZmlsZXMgY2hhbmdlZCwgNTkgaW5zZXJ0aW9ucygr KSwgMjggZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCj4gaW5kZXggMjM3 OGYwNjUxY2JkLi42NmVmZTgwNDRhYzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZHAuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKPiBA QCAtMTMzLDYgKzEzMywzNCBAQCBzdGF0aWMgdm9pZCB2bHZfc3RlYWxfcG93ZXJfc2VxdWVuY2Vy KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gIAkJCQkgICAgICBlbnVtIHBpcGUgcGlwZSk7Cj4g IHN0YXRpYyB2b2lkIGludGVsX2RwX3Vuc2V0X2VkaWQoc3RydWN0IGludGVsX2RwICppbnRlbF9k cCk7Cj4gIAo+ICtzdGF0aWMgaW50IGludGVsX2RwX251bV9yYXRlcyh1OCBsaW5rX2J3X2NvZGUp Cj4gK3sKPiArCXN3aXRjaCAobGlua19id19jb2RlKSB7Cj4gKwlkZWZhdWx0Ogo+ICsJCVdBUk4o MSwgImludmFsaWQgbWF4IERQIGxpbmsgYncgdmFsICV4LCB1c2luZyAxLjYyR2Jwc1xuIiwKPiAr CQkgICAgIGxpbmtfYndfY29kZSk7Cj4gKwljYXNlIERQX0xJTktfQldfMV82MjoKPiArCQlyZXR1 cm4gMTsKPiArCWNhc2UgRFBfTElOS19CV18yXzc6Cj4gKwkJcmV0dXJuIDI7Cj4gKwljYXNlIERQ X0xJTktfQldfNV80Ogo+ICsJCXJldHVybiAzOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKiB1cGRhdGUg c2luayByYXRlcyBmcm9tIGRwY2QgKi8KPiArc3RhdGljIHZvaWQgaW50ZWxfZHBfc2V0X3Npbmtf cmF0ZXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKPiArewo+ICsJaW50IGksIG51bV9yYXRl czsKPiArCj4gKwludW1fcmF0ZXMgPSBpbnRlbF9kcF9udW1fcmF0ZXMoaW50ZWxfZHAtPmRwY2Rb RFBfTUFYX0xJTktfUkFURV0pOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudW1fcmF0ZXM7IGkr KykKPiArCQlpbnRlbF9kcC0+c2lua19yYXRlc1tpXSA9IGRlZmF1bHRfcmF0ZXNbaV07Cj4gKwo+ ICsJaW50ZWxfZHAtPm51bV9zaW5rX3JhdGVzID0gbnVtX3JhdGVzOwo+ICt9Cj4gKwo+ICBzdGF0 aWMgaW50Cj4gIGludGVsX2RwX21heF9saW5rX2J3KHN0cnVjdCBpbnRlbF9kcCAgKmludGVsX2Rw KQo+ICB7Cj4gQEAgLTIwNSwxOSArMjMzLDYgQEAgaW50ZWxfZHBfZG93bnN0cmVhbV9tYXhfZG90 Y2xvY2soc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKPiAgCXJldHVybiBtYXhfZG90Y2xrOwo+ ICB9Cj4gIAo+IC1zdGF0aWMgaW50Cj4gLWludGVsX2RwX3NpbmtfcmF0ZXMoc3RydWN0IGludGVs X2RwICppbnRlbF9kcCwgY29uc3QgaW50ICoqc2lua19yYXRlcykKPiAtewo+IC0JaWYgKGludGVs X2RwLT5udW1fc2lua19yYXRlcykgewo+IC0JCSpzaW5rX3JhdGVzID0gaW50ZWxfZHAtPnNpbmtf cmF0ZXM7Cj4gLQkJcmV0dXJuIGludGVsX2RwLT5udW1fc2lua19yYXRlczsKPiAtCX0KPiAtCj4g LQkqc2lua19yYXRlcyA9IGRlZmF1bHRfcmF0ZXM7Cj4gLQo+IC0JcmV0dXJuIChpbnRlbF9kcC0+ bWF4X3NpbmtfbGlua19idyA+PiAzKSArIDE7Cj4gLX0KPiAtCj4gIHN0YXRpYyB2b2lkCj4gIGlu dGVsX2RwX3NldF9zb3VyY2VfcmF0ZXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKPiAgewo+ IEBAIC0yODYsMTUgKzMwMSwyMiBAQCBzdGF0aWMgaW50IGludGVsX2RwX3JhdGVfaW5kZXgoY29u c3QgaW50ICpyYXRlcywgaW50IGxlbiwgaW50IHJhdGUpCj4gIHN0YXRpYyBpbnQgaW50ZWxfZHBf Y29tbW9uX3JhdGVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCj4gIAkJCQkgaW50ICpjb21t b25fcmF0ZXMpCj4gIHsKPiAtCWNvbnN0IGludCAqc2lua19yYXRlczsKPiAtCWludCBzaW5rX2xl bjsKPiArCWludCBtYXhfcmF0ZSA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShpbnRlbF9k cC0+bWF4X3NpbmtfbGlua19idyk7Cj4gKwlpbnQgaSwgY29tbW9uX2xlbjsKPiAgCj4gLQlzaW5r X2xlbiA9IGludGVsX2RwX3NpbmtfcmF0ZXMoaW50ZWxfZHAsICZzaW5rX3JhdGVzKTsKPiArCWNv bW1vbl9sZW4gPSBpbnRlcnNlY3RfcmF0ZXMoaW50ZWxfZHAtPnNvdXJjZV9yYXRlcywKPiArCQkJ CSAgICAgaW50ZWxfZHAtPm51bV9zb3VyY2VfcmF0ZXMsCj4gKwkJCQkgICAgIGludGVsX2RwLT5z aW5rX3JhdGVzLAo+ICsJCQkJICAgICBpbnRlbF9kcC0+bnVtX3NpbmtfcmF0ZXMsCj4gKwkJCQkg ICAgIGNvbW1vbl9yYXRlcyk7Cj4gIAo+IC0JcmV0dXJuIGludGVyc2VjdF9yYXRlcyhpbnRlbF9k cC0+c291cmNlX3JhdGVzLAo+IC0JCQkgICAgICAgaW50ZWxfZHAtPm51bV9zb3VyY2VfcmF0ZXMs Cj4gLQkJCSAgICAgICBzaW5rX3JhdGVzLCBzaW5rX2xlbiwKPiAtCQkJICAgICAgIGNvbW1vbl9y YXRlcyk7Cj4gKwkvKiBMaW1pdCByZXN1bHRzIGJ5IHBvdGVudGlhbGx5IHJlZHVjZWQgbWF4IHJh dGUgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBjb21tb25fbGVuOyBpKyspIHsKPiArCQlpZiAoY29t bW9uX3JhdGVzW2NvbW1vbl9sZW4gLSBpIC0gMV0gPD0gbWF4X3JhdGUpCj4gKwkJCXJldHVybiBj b21tb25fbGVuIC0gaTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiAgfQo+ICAKPiAgc3RhdGlj IGludCBpbnRlbF9kcF9saW5rX3JhdGVfaW5kZXgoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwK PiBAQCAtMTUwMiw4ICsxNTI0LDcgQEAgc3RhdGljIHZvaWQgc25wcmludGZfaW50X2FycmF5KGNo YXIgKnN0ciwgc2l6ZV90IGxlbiwKPiAgCj4gIHN0YXRpYyB2b2lkIGludGVsX2RwX3ByaW50X3Jh dGVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCj4gIHsKPiAtCWNvbnN0IGludCAqc2lua19y YXRlczsKPiAtCWludCBzaW5rX2xlbiwgY29tbW9uX2xlbjsKPiArCWludCBjb21tb25fbGVuOwo+ ICAJaW50IGNvbW1vbl9yYXRlc1tEUF9NQVhfU1VQUE9SVEVEX1JBVEVTXTsKPiAgCWNoYXIgc3Ry WzEyOF07IC8qIEZJWE1FOiB0b28gYmlnIGZvciBzdGFjaz8gKi8KPiAgCj4gQEAgLTE1MTQsOCAr MTUzNSw4IEBAIHN0YXRpYyB2b2lkIGludGVsX2RwX3ByaW50X3JhdGVzKHN0cnVjdCBpbnRlbF9k cCAqaW50ZWxfZHApCj4gIAkJCSAgIGludGVsX2RwLT5zb3VyY2VfcmF0ZXMsIGludGVsX2RwLT5u dW1fc291cmNlX3JhdGVzKTsKPiAgCURSTV9ERUJVR19LTVMoInNvdXJjZSByYXRlczogJXNcbiIs IHN0cik7Cj4gIAo+IC0Jc2lua19sZW4gPSBpbnRlbF9kcF9zaW5rX3JhdGVzKGludGVsX2RwLCAm c2lua19yYXRlcyk7Cj4gLQlzbnByaW50Zl9pbnRfYXJyYXkoc3RyLCBzaXplb2Yoc3RyKSwgc2lu a19yYXRlcywgc2lua19sZW4pOwo+ICsJc25wcmludGZfaW50X2FycmF5KHN0ciwgc2l6ZW9mKHN0 ciksCj4gKwkJCSAgIGludGVsX2RwLT5zaW5rX3JhdGVzLCBpbnRlbF9kcC0+bnVtX3NpbmtfcmF0 ZXMpOwo+ICAJRFJNX0RFQlVHX0tNUygic2luayByYXRlczogJXNcbiIsIHN0cik7Cj4gIAo+ICAJ Y29tbW9uX2xlbiA9IGludGVsX2RwX2NvbW1vbl9yYXRlcyhpbnRlbF9kcCwgY29tbW9uX3JhdGVz KTsKPiBAQCAtMTU4MSw3ICsxNjAyLDggQEAgaW50IGludGVsX2RwX3JhdGVfc2VsZWN0KHN0cnVj dCBpbnRlbF9kcCAqaW50ZWxfZHAsIGludCByYXRlKQo+ICB2b2lkIGludGVsX2RwX2NvbXB1dGVf cmF0ZShzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBpbnQgcG9ydF9jbG9jaywKPiAgCQkJICAg dWludDhfdCAqbGlua19idywgdWludDhfdCAqcmF0ZV9zZWxlY3QpCj4gIHsKPiAtCWlmIChpbnRl bF9kcC0+bnVtX3NpbmtfcmF0ZXMpIHsKPiArCS8qIGVEUCAxLjQgcmF0ZSBzZWxlY3QgbWV0aG9k LiAqLwo+ICsJaWYgKGludGVsX2RwLT51c2VfcmF0ZV9zZWxlY3QpIHsKPiAgCQkqbGlua19idyA9 IDA7Cj4gIAkJKnJhdGVfc2VsZWN0ID0KPiAgCQkJaW50ZWxfZHBfcmF0ZV9zZWxlY3QoaW50ZWxf ZHAsIHBvcnRfY2xvY2spOwo+IEBAIC0zNzE4LDYgKzM3NDAsMTEgQEAgaW50ZWxfZWRwX2luaXRf ZHBjZChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQo+ICAJCWludGVsX2RwLT5udW1fc2lua19y YXRlcyA9IGk7Cj4gIAl9Cj4gIAo+ICsJaWYgKGludGVsX2RwLT5udW1fc2lua19yYXRlcykKPiAr CQlpbnRlbF9kcC0+dXNlX3JhdGVfc2VsZWN0ID0gdHJ1ZTsKPiArCWVsc2UKPiArCQlpbnRlbF9k cF9zZXRfc2lua19yYXRlcyhpbnRlbF9kcCk7Cj4gKwo+ICAJcmV0dXJuIHRydWU7Cj4gIH0KPiAg Cj4gQEAgLTM3MjgsNiArMzc1NSw4IEBAIGludGVsX2RwX2dldF9kcGNkKHN0cnVjdCBpbnRlbF9k cCAqaW50ZWxfZHApCj4gIAlpZiAoIWludGVsX2RwX3JlYWRfZHBjZChpbnRlbF9kcCkpCj4gIAkJ cmV0dXJuIGZhbHNlOwo+ICAKPiArCWludGVsX2RwX3NldF9zaW5rX3JhdGVzKGludGVsX2RwKTsK PiArCgpJc24ndCB0aGF0IGdvaW5nIHRvIGNsb2JiZXIgd2hhdGV2ZXIgaW50ZWxfZWRwX2luaXRf ZHBjZCgpIHNldCB1cD8KCj4gIAlpZiAoZHJtX2RwX2RwY2RfcmVhZCgmaW50ZWxfZHAtPmF1eCwg RFBfU0lOS19DT1VOVCwKPiAgCQkJICAgICAmaW50ZWxfZHAtPnNpbmtfY291bnQsIDEpIDwgMCkK PiAgCQlyZXR1cm4gZmFsc2U7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX2RwX2xpbmtfdHJhaW5pbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2xp bmtfdHJhaW5pbmcuYwo+IGluZGV4IDAwNDhiNTIwYmFmNy4uNjk0YWQwZmZiNTIzIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2xpbmtfdHJhaW5pbmcuYwo+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX2xpbmtfdHJhaW5pbmcuYwo+IEBAIC0x NDYsNyArMTQ2LDggQEAgaW50ZWxfZHBfbGlua190cmFpbmluZ19jbG9ja19yZWNvdmVyeShzdHJ1 Y3QgaW50ZWxfZHAgKmludGVsX2RwKQo+ICAJCWxpbmtfY29uZmlnWzFdIHw9IERQX0xBTkVfQ09V TlRfRU5IQU5DRURfRlJBTUVfRU47Cj4gIAlkcm1fZHBfZHBjZF93cml0ZSgmaW50ZWxfZHAtPmF1 eCwgRFBfTElOS19CV19TRVQsIGxpbmtfY29uZmlnLCAyKTsKPiAgCj4gLQlpZiAoaW50ZWxfZHAt Pm51bV9zaW5rX3JhdGVzKQo+ICsJLyogZURQIDEuNCByYXRlIHNlbGVjdCBtZXRob2QuICovCj4g KwlpZiAoIWxpbmtfYncpCj4gIAkJZHJtX2RwX2RwY2Rfd3JpdGUoJmludGVsX2RwLT5hdXgsIERQ X0xJTktfUkFURV9TRVQsCj4gIAkJCQkgICZyYXRlX3NlbGVjdCwgMSk7Cj4gIAo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2Rydi5oCj4gaW5kZXggZjEzMmQ0YWVhMWFkLi4zYTZmMDkyYTJlYzMgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAo+IEBAIC05MzMsOSArOTMzLDEwIEBAIHN0cnVjdCBp bnRlbF9kcCB7Cj4gIAkvKiBzb3VyY2UgcmF0ZXMgKi8KPiAgCWludCBudW1fc291cmNlX3JhdGVz Owo+ICAJY29uc3QgaW50ICpzb3VyY2VfcmF0ZXM7Cj4gLQkvKiBzaW5rIHJhdGVzIGFzIHJlcG9y dGVkIGJ5IERQX1NVUFBPUlRFRF9MSU5LX1JBVEVTICovCj4gLQl1aW50OF90IG51bV9zaW5rX3Jh dGVzOwo+ICsJLyogc2luayByYXRlcyBhcyByZXBvcnRlZCBieSBEUF9NQVhfTElOS19SQVRFL0RQ X1NVUFBPUlRFRF9MSU5LX1JBVEVTICovCj4gKwlpbnQgbnVtX3NpbmtfcmF0ZXM7Cj4gIAlpbnQg c2lua19yYXRlc1tEUF9NQVhfU1VQUE9SVEVEX1JBVEVTXTsKPiArCWJvb2wgdXNlX3JhdGVfc2Vs ZWN0Owo+ICAJLyogTWF4IGxhbmUgY291bnQgZm9yIHRoZSBzaW5rIGFzIHBlciBEUENEIHJlZ2lz dGVycyAqLwo+ICAJdWludDhfdCBtYXhfc2lua19sYW5lX2NvdW50Owo+ICAJLyogTWF4IGxpbmsg QlcgZm9yIHRoZSBzaW5rIGFzIHBlciBEUENEIHJlZ2lzdGVycyAqLwo+IC0tIAo+IDIuMS40Cgot LSAKVmlsbGUgU3lyasOkbMOkCkludGVsIE9UQwpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK