From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Z.q. Hou" Subject: [PATCHv5 09/20] PCI: mobiveil: Correct inbound/outbound window setup routines Date: Fri, 12 Apr 2019 08:36:06 +0000 Message-ID: <20190412083635.33626-10-Zhiqiang.Hou@nxp.com> References: <20190412083635.33626-1-Zhiqiang.Hou@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190412083635.33626-1-Zhiqiang.Hou@nxp.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "bhelgaas@google.com" , "robh+dt@kernel.org" , "mark.rutland@arm.com" , "l.subrahmanya@mobiveil.co.in" , "shawnguo@kernel.org" , Leo Li , "lorenzo.pieralisi@arm.com" , "catalin.marinas@arm.com" , "will.deacon@arm.com" Cc: Mingkai Hu , "M.h. Lian" , Xiaowei Bao , "Z.q. Hou" List-Id: devicetree@vger.kernel.org RnJvbTogSG91IFpoaXFpYW5nIDxaaGlxaWFuZy5Ib3VAbnhwLmNvbT4NCg0KT3V0Ym91bmQgd2lu ZG93IHJvdXRpbmU6DQogLSBSZW1vdmUgdW51c2VkIHZhciBkZWZpbml0aW9ucyBhbmQgcmVnaXN0 ZXIgcmVhZCBvcGVyYXRpb25zLg0KIC0gQWRkIHRoZSB1cHBlciAzMi1iaXQgY3B1IGFkZHJlc3Mg c2V0dXAgb2YgdGhlIHdpbmRvdy4NCiAtIEluc3RlYWQgb2YgYmxpbmRseSB3cml0ZSwgb25seSBj aGFuZ2UgdGhlIGZpZWxkcyBzcGVjaWZpZWQuDQogLSBNYXNrIHRoZSBsb3dlciBiaXRzIG9mIHdp bmRvdyBzaXplIGluIGNhc2Ugb3ZlcnJpZGUgdGhlDQogICBjb250cm9sIGJpdHMuDQogLSBDaGVj ayBpZiB0aGUgcGFzc2luZyB3aW5kb3cgbnVtYmVyIGlzIGF2YWlsYWJsZSwgaW5zdGVhZCBvZg0K ICAgdGhlIHRvdGFsIG51bWJlciBvZiB0aGUgaW5pdGlhbGl6ZWQgd2luZG93cy4NCg0KSW5ib3Vu ZCB3aW5kb3cgcm91dGluZToNCiAtIEFkZCBwYXJhbWV0ZXIgJ3U2NCBjcHVfYWRkcicgdG8gc3Bl Y2lmeSB0aGUgY3B1IGFkZHJlc3MNCiAgIG9mIHRoZSB3aW5kb3cgaW5zdGVhZCBvZiB1c2luZyAn cGNpX2FkZHInLg0KIC0gQ2hhbmdlICdpbnQgcGNpX2FkZHInIHRvICd1NjQgcGNpX2FkZHInLCBh bmQgYWRkIHNldHVwDQogICBvZiB0aGUgdXBwZXIgMzItYml0IFBDSSBhZGRyZXNzIG9mIHRoZSB3 aW5kb3cuDQogLSBNb3ZlIHRoZSBQQ0llIFBJTyBtYXN0ZXIgZW5hYmxlbWVudCB0byBtb2JpdmVp bF9ob3N0X2luaXQoKS4NCiAtIEluc3RlYWQgb2YgYmxpbmRseSB3cml0ZSwgb25seSBjaGFuZ2Ug dGhlIGZpZWxkcyBzcGVjaWZpZWQuDQogLSBNYXNrIHRoZSBsb3dlciBiaXRzIG9mIHdpbmRvdyBz aXplIGluIGNhc2Ugb3ZlcnJpZGUgdGhlDQogICBjb250cm9sIGJpdHMuDQogLSBDaGVjayBpZiB0 aGUgcGFzc2luZyB3aW5kb3cgbnVtYmVyIGlzIGF2YWlsYWJsZSwgaW5zdGVhZCBvZg0KICAgdGhl IHRvdGFsIG51bWJlciBvZiB0aGUgaW5pdGlhbGl6ZWQgd2luZG93cy4NCiAtIEFuZCBhZGQgdGhl IHN0YXRpc3RpYyBvZiBpbml0aWFsaXplZCBpbmJvdW5kIHdpbmRvd3MuDQoNCkZpeGVzOiA5YWY2 YmNiMTFlMTIgKCJQQ0k6IG1vYml2ZWlsOiBBZGQgTW9iaXZlaWwgUENJZSBIb3N0IEJyaWRnZSBJ UCBkcml2ZXIiKQ0KU2lnbmVkLW9mZi1ieTogSG91IFpoaXFpYW5nIDxaaGlxaWFuZy5Ib3VAbnhw LmNvbT4NClJldmlld2VkLWJ5OiBNaW5naHVhbiBMaWFuIDxNaW5naHVhbi5MaWFuQG54cC5jb20+ DQpSZXZpZXdlZC1ieTogU3VicmFobWFueWEgTGluZ2FwcGEgPGwuc3VicmFobWFueWFAbW9iaXZl aWwuY28uaW4+DQotLS0NClY1Og0KIC0gQ29ycmVjdGVkIGFuZCByZXRvdWNoZWQgdGhlIHN1Ympl Y3QgYW5kIGNoYW5nZWxvZy4NCg0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1tb2JpdmVp bC5jIHwgNzAgKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0NCiAxIGZpbGUgY2hhbmdlZCwgNDIg aW5zZXJ0aW9ucygrKSwgMjggZGVsZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaWUtbW9iaXZlaWwuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNp ZS1tb2JpdmVpbC5jDQppbmRleCBlODhhZmM3OTJhNWMuLjRiYTQ1ODQ3NGU0MiAxMDA2NDQNCi0t LSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpZS1tb2JpdmVpbC5jDQorKysgYi9kcml2ZXJz L3BjaS9jb250cm9sbGVyL3BjaWUtbW9iaXZlaWwuYw0KQEAgLTY1LDkgKzY1LDEzIEBADQogI2Rl ZmluZSBQQUJfQVhJX0FNQVBfQ1RSTCh3aW4pCQlQQUJfUkVHX0FERFIoMHgwYmEwLCB3aW4pDQog I2RlZmluZSAgV0lOX0VOQUJMRV9TSElGVAkJMA0KICNkZWZpbmUgIFdJTl9UWVBFX1NISUZUCQkJ MQ0KKyNkZWZpbmUgIFdJTl9UWVBFX01BU0sJCQkweDMNCisjZGVmaW5lICBXSU5fU0laRV9TSElG VAkJCTEwDQorI2RlZmluZSAgV0lOX1NJWkVfTUFTSwkJCTB4M2ZmZmZmDQogDQogI2RlZmluZSBQ QUJfRVhUX0FYSV9BTUFQX1NJWkUod2luKQlQQUJfRVhUX1JFR19BRERSKDB4YmFmMCwgd2luKQ0K IA0KKyNkZWZpbmUgUEFCX0VYVF9BWElfQU1BUF9BWElfV0lOKHdpbikJUEFCX0VYVF9SRUdfQURE UigweDgwYTAsIHdpbikNCiAjZGVmaW5lIFBBQl9BWElfQU1BUF9BWElfV0lOKHdpbikJUEFCX1JF R19BRERSKDB4MGJhNCwgd2luKQ0KICNkZWZpbmUgIEFYSV9XSU5ET1dfQUxJR05fTUFTSwkJMw0K IA0KQEAgLTgyLDggKzg2LDEwIEBADQogI2RlZmluZSBQQUJfUEVYX0FNQVBfQ1RSTCh3aW4pCQlQ QUJfUkVHX0FERFIoMHg0YmEwLCB3aW4pDQogI2RlZmluZSAgQU1BUF9DVFJMX0VOX1NISUZUCQkw DQogI2RlZmluZSAgQU1BUF9DVFJMX1RZUEVfU0hJRlQJCTENCisjZGVmaW5lICBBTUFQX0NUUkxf VFlQRV9NQVNLCQkzDQogDQogI2RlZmluZSBQQUJfRVhUX1BFWF9BTUFQX1NJWkVOKHdpbikJUEFC X0VYVF9SRUdfQUREUigweGJlZjAsIHdpbikNCisjZGVmaW5lIFBBQl9FWFRfUEVYX0FNQVBfQVhJ X1dJTih3aW4pCVBBQl9FWFRfUkVHX0FERFIoMHhiNGEwLCB3aW4pDQogI2RlZmluZSBQQUJfUEVY X0FNQVBfQVhJX1dJTih3aW4pCVBBQl9SRUdfQUREUigweDRiYTQsIHdpbikNCiAjZGVmaW5lIFBB Ql9QRVhfQU1BUF9QRVhfV0lOX0wod2luKQlQQUJfUkVHX0FERFIoMHg0YmE4LCB3aW4pDQogI2Rl ZmluZSBQQUJfUEVYX0FNQVBfUEVYX1dJTl9IKHdpbikJUEFCX1JFR19BRERSKDB4NGJhYywgd2lu KQ0KQEAgLTQ1NSw0OSArNDYxLDUxIEBAIHN0YXRpYyBpbnQgbW9iaXZlaWxfcGNpZV9wYXJzZV9k dChzdHJ1Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSkNCiB9DQogDQogc3RhdGljIHZvaWQgcHJvZ3Jh bV9pYl93aW5kb3dzKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCBpbnQgd2luX251bSwNCi0J CQkgICAgICAgaW50IHBjaV9hZGRyLCB1MzIgdHlwZSwgdTY0IHNpemUpDQorCQkJICAgICAgIHU2 NCBjcHVfYWRkciwgdTY0IHBjaV9hZGRyLCB1MzIgdHlwZSwgdTY0IHNpemUpDQogew0KLQlpbnQg cGlvX2N0cmxfdmFsOw0KLQlpbnQgYW1hcF9jdHJsX2R3Ow0KKwl1MzIgdmFsdWU7DQogCXU2NCBz aXplNjQgPSB+KHNpemUgLSAxKTsNCiANCi0JaWYgKChwY2llLT5pYl93aW5zX2NvbmZpZ3VyZWQg KyAxKSA+IHBjaWUtPnBwaW9fd2lucykgew0KKwlpZiAod2luX251bSA+PSBwY2llLT5wcGlvX3dp bnMpIHsNCiAJCWRldl9lcnIoJnBjaWUtPnBkZXYtPmRldiwNCiAJCQkiRVJST1I6IG1heCBpbmJv dW5kIHdpbmRvd3MgcmVhY2hlZCAhXG4iKTsNCiAJCXJldHVybjsNCiAJfQ0KIA0KLQlwaW9fY3Ry bF92YWwgPSBjc3JfcmVhZGwocGNpZSwgUEFCX1BFWF9QSU9fQ1RSTCk7DQotCXBpb19jdHJsX3Zh bCB8PSAxIDw8IFBJT19FTkFCTEVfU0hJRlQ7DQotCWNzcl93cml0ZWwocGNpZSwgcGlvX2N0cmxf dmFsLCBQQUJfUEVYX1BJT19DVFJMKTsNCi0NCi0JYW1hcF9jdHJsX2R3ID0gY3NyX3JlYWRsKHBj aWUsIFBBQl9QRVhfQU1BUF9DVFJMKHdpbl9udW0pKTsNCi0JYW1hcF9jdHJsX2R3IHw9ICh0eXBl IDw8IEFNQVBfQ1RSTF9UWVBFX1NISUZUKSB8DQotCQkJKDEgPDwgQU1BUF9DVFJMX0VOX1NISUZU KSB8DQotCQkJbG93ZXJfMzJfYml0cyhzaXplNjQpOw0KLQljc3Jfd3JpdGVsKHBjaWUsIGFtYXBf Y3RybF9kdywgUEFCX1BFWF9BTUFQX0NUUkwod2luX251bSkpOw0KKwl2YWx1ZSA9IGNzcl9yZWFk bChwY2llLCBQQUJfUEVYX0FNQVBfQ1RSTCh3aW5fbnVtKSk7DQorCXZhbHVlICY9IH4oQU1BUF9D VFJMX1RZUEVfTUFTSyA8PCBBTUFQX0NUUkxfVFlQRV9TSElGVCB8DQorCQkgV0lOX1NJWkVfTUFT SyA8PCBXSU5fU0laRV9TSElGVCk7DQorCXZhbHVlIHw9ICh0eXBlIDw8IEFNQVBfQ1RSTF9UWVBF X1NISUZUKSB8ICgxIDw8IEFNQVBfQ1RSTF9FTl9TSElGVCkgfA0KKwkJIChsb3dlcl8zMl9iaXRz KHNpemU2NCkgJiBXSU5fU0laRV9NQVNLIDw8IFdJTl9TSVpFX1NISUZUKTsNCisJY3NyX3dyaXRl bChwY2llLCB2YWx1ZSwgUEFCX1BFWF9BTUFQX0NUUkwod2luX251bSkpOw0KIA0KIAljc3Jfd3Jp dGVsKHBjaWUsIHVwcGVyXzMyX2JpdHMoc2l6ZTY0KSwNCiAJCSAgIFBBQl9FWFRfUEVYX0FNQVBf U0laRU4od2luX251bSkpOw0KIA0KLQljc3Jfd3JpdGVsKHBjaWUsIHBjaV9hZGRyLCBQQUJfUEVY X0FNQVBfQVhJX1dJTih3aW5fbnVtKSk7DQorCWNzcl93cml0ZWwocGNpZSwgbG93ZXJfMzJfYml0 cyhjcHVfYWRkciksDQorCQkgICBQQUJfUEVYX0FNQVBfQVhJX1dJTih3aW5fbnVtKSk7DQorCWNz cl93cml0ZWwocGNpZSwgdXBwZXJfMzJfYml0cyhjcHVfYWRkciksDQorCQkgICBQQUJfRVhUX1BF WF9BTUFQX0FYSV9XSU4od2luX251bSkpOw0KKw0KKwljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMy X2JpdHMocGNpX2FkZHIpLA0KKwkJICAgUEFCX1BFWF9BTUFQX1BFWF9XSU5fTCh3aW5fbnVtKSk7 DQorCWNzcl93cml0ZWwocGNpZSwgdXBwZXJfMzJfYml0cyhwY2lfYWRkciksDQorCQkgICBQQUJf UEVYX0FNQVBfUEVYX1dJTl9IKHdpbl9udW0pKTsNCiANCi0JY3NyX3dyaXRlbChwY2llLCBwY2lf YWRkciwgUEFCX1BFWF9BTUFQX1BFWF9XSU5fTCh3aW5fbnVtKSk7DQotCWNzcl93cml0ZWwocGNp ZSwgMCwgUEFCX1BFWF9BTUFQX1BFWF9XSU5fSCh3aW5fbnVtKSk7DQorCXBjaWUtPmliX3dpbnNf Y29uZmlndXJlZCsrOw0KIH0NCiANCiAvKg0KICAqIHJvdXRpbmUgdG8gcHJvZ3JhbSB0aGUgb3V0 Ym91bmQgd2luZG93cw0KICAqLw0KIHN0YXRpYyB2b2lkIHByb2dyYW1fb2Jfd2luZG93cyhzdHJ1 Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSwgaW50IHdpbl9udW0sDQotCQkJICAgICAgIHU2NCBjcHVf YWRkciwgdTY0IHBjaV9hZGRyLA0KLQkJCSAgICAgICB1MzIgY29uZmlnX2lvX2JpdCwgdTY0IHNp emUpDQorCQkJICAgICAgIHU2NCBjcHVfYWRkciwgdTY0IHBjaV9hZGRyLCB1MzIgdHlwZSwgdTY0 IHNpemUpDQogew0KIA0KLQl1MzIgdmFsdWUsIHR5cGU7DQorCXUzMiB2YWx1ZTsNCiAJdTY0IHNp emU2NCA9IH4oc2l6ZSAtIDEpOw0KIA0KLQlpZiAoKHBjaWUtPm9iX3dpbnNfY29uZmlndXJlZCAr IDEpID4gcGNpZS0+YXBpb193aW5zKSB7DQorCWlmICh3aW5fbnVtID49IHBjaWUtPmFwaW9fd2lu cykgew0KIAkJZGV2X2VycigmcGNpZS0+cGRldi0+ZGV2LA0KIAkJCSJFUlJPUjogbWF4IG91dGJv dW5kIHdpbmRvd3MgcmVhY2hlZCAhXG4iKTsNCiAJCXJldHVybjsNCkBAIC01MDcsMTAgKzUxNSwx MiBAQCBzdGF0aWMgdm9pZCBwcm9ncmFtX29iX3dpbmRvd3Moc3RydWN0IG1vYml2ZWlsX3BjaWUg KnBjaWUsIGludCB3aW5fbnVtLA0KIAkgKiBwcm9ncmFtIEVuYWJsZSBCaXQgdG8gMSwgVHlwZSBC aXQgdG8gKDAwKSBiYXNlIDIsIEFYSSBXaW5kb3cgU2l6ZSBCaXQNCiAJICogdG8gNCBLQiBpbiBQ QUJfQVhJX0FNQVBfQ1RSTCByZWdpc3Rlcg0KIAkgKi8NCi0JdHlwZSA9IGNvbmZpZ19pb19iaXQ7 DQogCXZhbHVlID0gY3NyX3JlYWRsKHBjaWUsIFBBQl9BWElfQU1BUF9DVFJMKHdpbl9udW0pKTsN Ci0JY3NyX3dyaXRlbChwY2llLCAxIDw8IFdJTl9FTkFCTEVfU0hJRlQgfCB0eXBlIDw8IFdJTl9U WVBFX1NISUZUIHwNCi0JCSAgIGxvd2VyXzMyX2JpdHMoc2l6ZTY0KSwgUEFCX0FYSV9BTUFQX0NU Ukwod2luX251bSkpOw0KKwl2YWx1ZSAmPSB+KFdJTl9UWVBFX01BU0sgPDwgV0lOX1RZUEVfU0hJ RlQgfA0KKwkJIFdJTl9TSVpFX01BU0sgPDwgV0lOX1NJWkVfU0hJRlQpOw0KKwl2YWx1ZSB8PSAx IDw8IFdJTl9FTkFCTEVfU0hJRlQgfCB0eXBlIDw8IFdJTl9UWVBFX1NISUZUIHwNCisJCSAobG93 ZXJfMzJfYml0cyhzaXplNjQpICYgV0lOX1NJWkVfTUFTSyA8PCBXSU5fU0laRV9TSElGVCk7DQor CWNzcl93cml0ZWwocGNpZSwgdmFsdWUsIFBBQl9BWElfQU1BUF9DVFJMKHdpbl9udW0pKTsNCiAN CiAJY3NyX3dyaXRlbChwY2llLCB1cHBlcl8zMl9iaXRzKHNpemU2NCksIFBBQl9FWFRfQVhJX0FN QVBfU0laRSh3aW5fbnVtKSk7DQogDQpAQCAtNTE4LDExICs1MjgsMTAgQEAgc3RhdGljIHZvaWQg cHJvZ3JhbV9vYl93aW5kb3dzKHN0cnVjdCBtb2JpdmVpbF9wY2llICpwY2llLCBpbnQgd2luX251 bSwNCiAJICogcHJvZ3JhbSBBWEkgd2luZG93IGJhc2Ugd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZSBp bg0KIAkgKiBQQUJfQVhJX0FNQVBfQVhJX1dJTjAgcmVnaXN0ZXINCiAJICovDQotCXZhbHVlID0g Y3NyX3JlYWRsKHBjaWUsIFBBQl9BWElfQU1BUF9BWElfV0lOKHdpbl9udW0pKTsNCi0JY3NyX3dy aXRlbChwY2llLCBjcHVfYWRkciAmICh+QVhJX1dJTkRPV19BTElHTl9NQVNLKSwNCisJY3NyX3dy aXRlbChwY2llLCBsb3dlcl8zMl9iaXRzKGNwdV9hZGRyKSAmICh+QVhJX1dJTkRPV19BTElHTl9N QVNLKSwNCiAJCSAgIFBBQl9BWElfQU1BUF9BWElfV0lOKHdpbl9udW0pKTsNCi0NCi0JdmFsdWUg PSBjc3JfcmVhZGwocGNpZSwgUEFCX0FYSV9BTUFQX1BFWF9XSU5fSCh3aW5fbnVtKSk7DQorCWNz cl93cml0ZWwocGNpZSwgdXBwZXJfMzJfYml0cyhjcHVfYWRkciksDQorCQkgICBQQUJfRVhUX0FY SV9BTUFQX0FYSV9XSU4od2luX251bSkpOw0KIA0KIAljc3Jfd3JpdGVsKHBjaWUsIGxvd2VyXzMy X2JpdHMocGNpX2FkZHIpLA0KIAkJICAgUEFCX0FYSV9BTUFQX1BFWF9XSU5fTCh3aW5fbnVtKSk7 DQpAQCAtNjA0LDYgKzYxMywxMSBAQCBzdGF0aWMgaW50IG1vYml2ZWlsX2hvc3RfaW5pdChzdHJ1 Y3QgbW9iaXZlaWxfcGNpZSAqcGNpZSkNCiAJdmFsdWUgfD0gQVBJT19FTl9NQVNLOw0KIAljc3Jf d3JpdGVsKHBjaWUsIHZhbHVlLCBQQUJfQVhJX1BJT19DVFJMKTsNCiANCisJLyogRW5hYmxlIFBD SWUgUElPIG1hc3RlciAqLw0KKwl2YWx1ZSA9IGNzcl9yZWFkbChwY2llLCBQQUJfUEVYX1BJT19D VFJMKTsNCisJdmFsdWUgfD0gMSA8PCBQSU9fRU5BQkxFX1NISUZUOw0KKwljc3Jfd3JpdGVsKHBj aWUsIHZhbHVlLCBQQUJfUEVYX1BJT19DVFJMKTsNCisNCiAJLyoNCiAJICogd2UnbGwgcHJvZ3Jh bSBvbmUgb3V0Ym91bmQgd2luZG93IGZvciBjb25maWcgcmVhZHMgYW5kDQogCSAqIGFub3RoZXIg ZGVmYXVsdCBpbmJvdW5kIHdpbmRvdyBmb3IgYWxsIHRoZSB1cHN0cmVhbSB0cmFmZmljDQpAQCAt NjE2LDcgKzYzMCw3IEBAIHN0YXRpYyBpbnQgbW9iaXZlaWxfaG9zdF9pbml0KHN0cnVjdCBtb2Jp dmVpbF9wY2llICpwY2llKQ0KIAkJCSAgIENGR19XSU5ET1dfVFlQRSwgcmVzb3VyY2Vfc2l6ZShw Y2llLT5vYl9pb19yZXMpKTsNCiANCiAJLyogbWVtb3J5IGluYm91bmQgdHJhbnNsYXRpb24gd2lu ZG93ICovDQotCXByb2dyYW1faWJfd2luZG93cyhwY2llLCBXSU5fTlVNXzAsIDAsIE1FTV9XSU5E T1dfVFlQRSwgSUJfV0lOX1NJWkUpOw0KKwlwcm9ncmFtX2liX3dpbmRvd3MocGNpZSwgV0lOX05V TV8wLCAwLCAwLCBNRU1fV0lORE9XX1RZUEUsIElCX1dJTl9TSVpFKTsNCiANCiAJLyogR2V0IHRo ZSBJL08gYW5kIG1lbW9yeSByYW5nZXMgZnJvbSBEVCAqLw0KIAlyZXNvdXJjZV9saXN0X2Zvcl9l YWNoX2VudHJ5KHdpbiwgJnBjaWUtPnJlc291cmNlcykgew0KLS0gDQoyLjE3LjENCg0K