From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34314) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QLKeP-0002yJ-O4 for qemu-devel@nongnu.org; Sat, 14 May 2011 15:37:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QLKeO-0002Ta-BM for qemu-devel@nongnu.org; Sat, 14 May 2011 15:37:21 -0400 Received: from mail-qw0-f45.google.com ([209.85.216.45]:41051) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QLKeO-0002Qf-8l for qemu-devel@nongnu.org; Sat, 14 May 2011 15:37:20 -0400 Received: by mail-qw0-f45.google.com with SMTP id 8so2052660qwj.4 for ; Sat, 14 May 2011 12:37:20 -0700 (PDT) MIME-Version: 1.0 From: Blue Swirl Date: Sat, 14 May 2011 22:37:00 +0300 Message-ID: Content-Type: multipart/mixed; boundary=0016367b6392f786d904a3418cef Subject: [Qemu-devel] [PATCH 02/11] Delete unused tb_invalidate_page_range List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel --0016367b6392f786d904a3418cef Content-Type: text/plain; charset=UTF-8 tb_invalidate_page_range() was intended to be used to invalidate an area of a TB which the guest explicitly flushes from i-cache. However, QEMU detects writes to code areas where TBs have been generated, so this has never been useful. Delete the function, adjust callers. Signed-off-by: Blue Swirl --- cpu-exec.c | 13 ------------- exec-all.h | 1 - linux-user/main.c | 22 ++-------------------- target-ppc/op_helper.c | 1 - target-sparc/helper.h | 1 - target-sparc/op_helper.c | 6 ------ target-sparc/translate.c | 2 +- 7 files changed, 3 insertions(+), 43 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 014f03b..5f0a5a1 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -666,16 +666,3 @@ int cpu_exec(CPUState *env1) cpu_single_env = NULL; return ret; } - -/* must only be called from the generated code as an exception can be - generated */ -void tb_invalidate_page_range(target_ulong start, target_ulong end) -{ - /* XXX: cannot enable it yet because it yields to MMU exception - where NIP != read address on PowerPC */ -#if 0 - target_ulong phys_addr; - phys_addr = get_phys_addr_code(env, start); - tb_invalidate_phys_page_range(phys_addr, phys_addr + end - start, 0); -#endif -} diff --git a/exec-all.h b/exec-all.h index 7c2d29f..cf3a704 100644 --- a/exec-all.h +++ b/exec-all.h @@ -95,7 +95,6 @@ void QEMU_NORETURN cpu_loop_exit(void); int page_unprotect(target_ulong address, unsigned long pc, void *puc); void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, int is_cpu_write_access); -void tb_invalidate_page_range(target_ulong start, target_ulong end); void tlb_flush_page(CPUState *env, target_ulong addr); void tlb_flush(CPUState *env, int flush_global); #if !defined(CONFIG_USER_ONLY) diff --git a/linux-user/main.c b/linux-user/main.c index a4996e7..8336639 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -455,24 +455,6 @@ void cpu_loop(CPUX86State *env) #ifdef TARGET_ARM -static void arm_cache_flush(abi_ulong start, abi_ulong last) -{ - abi_ulong addr, last1; - - if (last < start) - return; - addr = start; - for(;;) { - last1 = ((addr + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK) - 1; - if (last1 > last) - last1 = last; - tb_invalidate_page_range(addr, last1 + 1); - if (last1 == last) - break; - addr = last1 + 1; - } -} - /* Handle a jump to the kernel code page. */ static int do_kernel_trap(CPUARMState *env) @@ -717,7 +699,7 @@ void cpu_loop(CPUARMState *env) } if (n == ARM_NR_cacheflush) { - arm_cache_flush(env->regs[0], env->regs[1]); + /* nop */ } else if (n == ARM_NR_semihosting || n == ARM_NR_thumb_semihosting) { env->regs[0] = do_arm_semihosting (env); @@ -733,7 +715,7 @@ void cpu_loop(CPUARMState *env) if ( n > ARM_NR_BASE) { switch (n) { case ARM_NR_cacheflush: - arm_cache_flush(env->regs[0], env->regs[1]); + /* nop */ break; case ARM_NR_set_tls: cpu_set_tls(env, env->regs[0]); diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c index d5db484..d5a987b 100644 --- a/target-ppc/op_helper.c +++ b/target-ppc/op_helper.c @@ -362,7 +362,6 @@ void helper_icbi(target_ulong addr) * do the load "by hand". */ ldl(addr); - tb_invalidate_page_range(addr, addr + env->icache_line_size); } // XXX: to be tested diff --git a/target-sparc/helper.h b/target-sparc/helper.h index 12e8557..023f4d6 100644 --- a/target-sparc/helper.h +++ b/target-sparc/helper.h @@ -35,7 +35,6 @@ DEF_HELPER_2(check_align, void, tl, i32) DEF_HELPER_0(debug, void) DEF_HELPER_0(save, void) DEF_HELPER_0(restore, void) -DEF_HELPER_1(flush, void, tl) DEF_HELPER_2(udiv, tl, tl, tl) DEF_HELPER_2(udiv_cc, tl, tl, tl) DEF_HELPER_2(sdiv, tl, tl, tl) diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index ffffb8c..b38691e 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -4092,12 +4092,6 @@ void helper_write_softint(uint64_t value) } #endif -void helper_flush(target_ulong addr) -{ - addr &= ~7; - tb_invalidate_page_range(addr, addr + 8); -} - #ifdef TARGET_SPARC64 #ifdef DEBUG_PCALL static const char * const excp_names[0x80] = { diff --git a/target-sparc/translate.c b/target-sparc/translate.c index fe99f0b..0cc47e9 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -4226,7 +4226,7 @@ static void disas_sparc_insn(DisasContext * dc) case 0x3b: /* flush */ if (!((dc)->def->features & CPU_FEATURE_FLUSH)) goto unimp_flush; - gen_helper_flush(cpu_dst); + /* nop */ break; case 0x3c: /* save */ save_state(dc, cpu_cond); -- 1.6.2.4 --0016367b6392f786d904a3418cef Content-Type: text/x-diff; charset=US-ASCII; name="0002-Delete-unused-tb_invalidate_page_range.patch" Content-Disposition: attachment; filename="0002-Delete-unused-tb_invalidate_page_range.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gnoyiyud0 RnJvbSBlY2Y4ODE4NTBiNmYxMzIzZWVjZTQyYzcwNzAzYTBhNzI0ZWEzZTMxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpNZXNzYWdlLUlkOiA8ZWNmODgxODUwYjZmMTMyM2VlY2U0MmM3MDcwM2Ew YTcyNGVhM2UzMS4xMzA1NDAxNzUwLmdpdC5ibGF1d2lyYmVsQGdtYWlsLmNvbT4KSW4tUmVwbHkt VG86IDw2ZTIxZGY4ZTM2OTM4OGEzMTUyZGNjN2RhMzA0MzFjNjcyZTFlZTM3LjEzMDU0MDE3NTAu Z2l0LmJsYXV3aXJiZWxAZ21haWwuY29tPgpSZWZlcmVuY2VzOiA8NmUyMWRmOGUzNjkzODhhMzE1 MmRjYzdkYTMwNDMxYzY3MmUxZWUzNy4xMzA1NDAxNzUwLmdpdC5ibGF1d2lyYmVsQGdtYWlsLmNv bT4KRnJvbTogQmx1ZSBTd2lybCA8YmxhdXdpcmJlbEBnbWFpbC5jb20+CkRhdGU6IFNhdCwgMTQg TWF5IDIwMTEgMTE6NTU6MzAgKzAwMDAKU3ViamVjdDogW1BBVENIIDAyLzExXSBEZWxldGUgdW51 c2VkIHRiX2ludmFsaWRhdGVfcGFnZV9yYW5nZQoKdGJfaW52YWxpZGF0ZV9wYWdlX3JhbmdlKCkg d2FzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gaW52YWxpZGF0ZSBhbiBhcmVhIG9mIGEgVEIKd2hp Y2ggdGhlIGd1ZXN0IGV4cGxpY2l0bHkgZmx1c2hlcyBmcm9tIGktY2FjaGUuIEhvd2V2ZXIsIFFF TVUgZGV0ZWN0cyB3cml0ZXMKdG8gY29kZSBhcmVhcyB3aGVyZSBUQnMgaGF2ZSBiZWVuIGdlbmVy YXRlZCwgc28gdGhpcyBoYXMgbmV2ZXIgYmVlbiB1c2VmdWwuCgpEZWxldGUgdGhlIGZ1bmN0aW9u LCBhZGp1c3QgY2FsbGVycy4KClNpZ25lZC1vZmYtYnk6IEJsdWUgU3dpcmwgPGJsYXV3aXJiZWxA Z21haWwuY29tPgotLS0KIGNwdS1leGVjLmMgICAgICAgICAgICAgICB8ICAgMTMgLS0tLS0tLS0t LS0tLQogZXhlYy1hbGwuaCAgICAgICAgICAgICAgIHwgICAgMSAtCiBsaW51eC11c2VyL21haW4u YyAgICAgICAgfCAgIDIyICsrLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHRhcmdldC1wcGMvb3BfaGVs cGVyLmMgICB8ICAgIDEgLQogdGFyZ2V0LXNwYXJjL2hlbHBlci5oICAgIHwgICAgMSAtCiB0YXJn ZXQtc3BhcmMvb3BfaGVscGVyLmMgfCAgICA2IC0tLS0tLQogdGFyZ2V0LXNwYXJjL3RyYW5zbGF0 ZS5jIHwgICAgMiArLQogNyBmaWxlcyBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDQzIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NwdS1leGVjLmMgYi9jcHUtZXhlYy5jCmluZGV4IDAxNGYw M2IuLjVmMGE1YTEgMTAwNjQ0Ci0tLSBhL2NwdS1leGVjLmMKKysrIGIvY3B1LWV4ZWMuYwpAQCAt NjY2LDE2ICs2NjYsMyBAQCBpbnQgY3B1X2V4ZWMoQ1BVU3RhdGUgKmVudjEpCiAgICAgY3B1X3Np bmdsZV9lbnYgPSBOVUxMOwogICAgIHJldHVybiByZXQ7CiB9Ci0KLS8qIG11c3Qgb25seSBiZSBj YWxsZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUgYXMgYW4gZXhjZXB0aW9uIGNhbiBiZQotICAg Z2VuZXJhdGVkICovCi12b2lkIHRiX2ludmFsaWRhdGVfcGFnZV9yYW5nZSh0YXJnZXRfdWxvbmcg c3RhcnQsIHRhcmdldF91bG9uZyBlbmQpCi17Ci0gICAgLyogWFhYOiBjYW5ub3QgZW5hYmxlIGl0 IHlldCBiZWNhdXNlIGl0IHlpZWxkcyB0byBNTVUgZXhjZXB0aW9uCi0gICAgICAgd2hlcmUgTklQ ICE9IHJlYWQgYWRkcmVzcyBvbiBQb3dlclBDICovCi0jaWYgMAotICAgIHRhcmdldF91bG9uZyBw aHlzX2FkZHI7Ci0gICAgcGh5c19hZGRyID0gZ2V0X3BoeXNfYWRkcl9jb2RlKGVudiwgc3RhcnQp OwotICAgIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX3JhbmdlKHBoeXNfYWRkciwgcGh5c19hZGRy ICsgZW5kIC0gc3RhcnQsIDApOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9leGVjLWFsbC5oIGIv ZXhlYy1hbGwuaAppbmRleCA3YzJkMjlmLi5jZjNhNzA0IDEwMDY0NAotLS0gYS9leGVjLWFsbC5o CisrKyBiL2V4ZWMtYWxsLmgKQEAgLTk1LDcgKzk1LDYgQEAgdm9pZCBRRU1VX05PUkVUVVJOIGNw dV9sb29wX2V4aXQodm9pZCk7CiBpbnQgcGFnZV91bnByb3RlY3QodGFyZ2V0X3Vsb25nIGFkZHJl c3MsIHVuc2lnbmVkIGxvbmcgcGMsIHZvaWQgKnB1Yyk7CiB2b2lkIHRiX2ludmFsaWRhdGVfcGh5 c19wYWdlX3JhbmdlKHRiX3BhZ2VfYWRkcl90IHN0YXJ0LCB0Yl9wYWdlX2FkZHJfdCBlbmQsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19jcHVfd3JpdGVfYWNjZXNz KTsKLXZvaWQgdGJfaW52YWxpZGF0ZV9wYWdlX3JhbmdlKHRhcmdldF91bG9uZyBzdGFydCwgdGFy Z2V0X3Vsb25nIGVuZCk7CiB2b2lkIHRsYl9mbHVzaF9wYWdlKENQVVN0YXRlICplbnYsIHRhcmdl dF91bG9uZyBhZGRyKTsKIHZvaWQgdGxiX2ZsdXNoKENQVVN0YXRlICplbnYsIGludCBmbHVzaF9n bG9iYWwpOwogI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCmRpZmYgLS1naXQgYS9saW51 eC11c2VyL21haW4uYyBiL2xpbnV4LXVzZXIvbWFpbi5jCmluZGV4IGE0OTk2ZTcuLjgzMzY2Mzkg MTAwNjQ0Ci0tLSBhL2xpbnV4LXVzZXIvbWFpbi5jCisrKyBiL2xpbnV4LXVzZXIvbWFpbi5jCkBA IC00NTUsMjQgKzQ1NSw2IEBAIHZvaWQgY3B1X2xvb3AoQ1BVWDg2U3RhdGUgKmVudikKIAogI2lm ZGVmIFRBUkdFVF9BUk0KIAotc3RhdGljIHZvaWQgYXJtX2NhY2hlX2ZsdXNoKGFiaV91bG9uZyBz dGFydCwgYWJpX3Vsb25nIGxhc3QpCi17Ci0gICAgYWJpX3Vsb25nIGFkZHIsIGxhc3QxOwotCi0g ICAgaWYgKGxhc3QgPCBzdGFydCkKLSAgICAgICAgcmV0dXJuOwotICAgIGFkZHIgPSBzdGFydDsK LSAgICBmb3IoOzspIHsKLSAgICAgICAgbGFzdDEgPSAoKGFkZHIgKyBUQVJHRVRfUEFHRV9TSVpF KSAmIFRBUkdFVF9QQUdFX01BU0spIC0gMTsKLSAgICAgICAgaWYgKGxhc3QxID4gbGFzdCkKLSAg ICAgICAgICAgIGxhc3QxID0gbGFzdDsKLSAgICAgICAgdGJfaW52YWxpZGF0ZV9wYWdlX3Jhbmdl KGFkZHIsIGxhc3QxICsgMSk7Ci0gICAgICAgIGlmIChsYXN0MSA9PSBsYXN0KQotICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgIGFkZHIgPSBsYXN0MSArIDE7Ci0gICAgfQotfQotCiAvKiBIYW5k bGUgYSBqdW1wIHRvIHRoZSBrZXJuZWwgY29kZSBwYWdlLiAgKi8KIHN0YXRpYyBpbnQKIGRvX2tl cm5lbF90cmFwKENQVUFSTVN0YXRlICplbnYpCkBAIC03MTcsNyArNjk5LDcgQEAgdm9pZCBjcHVf bG9vcChDUFVBUk1TdGF0ZSAqZW52KQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAg ICAgIGlmIChuID09IEFSTV9OUl9jYWNoZWZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFy bV9jYWNoZV9mbHVzaChlbnYtPnJlZ3NbMF0sIGVudi0+cmVnc1sxXSk7CisgICAgICAgICAgICAg ICAgICAgIC8qIG5vcCAqLwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSBBUk1fTlJf c2VtaWhvc3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG4gPT0gQVJNX05SX3Ro dW1iX3NlbWlob3N0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1swXSA9IGRv X2FybV9zZW1paG9zdGluZyAoZW52KTsKQEAgLTczMyw3ICs3MTUsNyBAQCB2b2lkIGNwdV9sb29w KENQVUFSTVN0YXRlICplbnYpCiAgICAgICAgICAgICAgICAgICAgIGlmICggbiA+IEFSTV9OUl9C QVNFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4pIHsKICAgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgQVJNX05SX2NhY2hlZmx1c2g6Ci0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgYXJtX2NhY2hlX2ZsdXNoKGVudi0+cmVnc1swXSwgZW52LT5yZWdzWzFdKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3AgKi8KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX05SX3NldF90 bHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3NldF90bHMoZW52LCBlbnYtPnJl Z3NbMF0pOwpkaWZmIC0tZ2l0IGEvdGFyZ2V0LXBwYy9vcF9oZWxwZXIuYyBiL3RhcmdldC1wcGMv b3BfaGVscGVyLmMKaW5kZXggZDVkYjQ4NC4uZDVhOTg3YiAxMDA2NDQKLS0tIGEvdGFyZ2V0LXBw Yy9vcF9oZWxwZXIuYworKysgYi90YXJnZXQtcHBjL29wX2hlbHBlci5jCkBAIC0zNjIsNyArMzYy LDYgQEAgdm9pZCBoZWxwZXJfaWNiaSh0YXJnZXRfdWxvbmcgYWRkcikKICAgICAgKiBkbyB0aGUg bG9hZCAiYnkgaGFuZCIuCiAgICAgICovCiAgICAgbGRsKGFkZHIpOwotICAgIHRiX2ludmFsaWRh dGVfcGFnZV9yYW5nZShhZGRyLCBhZGRyICsgZW52LT5pY2FjaGVfbGluZV9zaXplKTsKIH0KIAog Ly8gWFhYOiB0byBiZSB0ZXN0ZWQKZGlmZiAtLWdpdCBhL3RhcmdldC1zcGFyYy9oZWxwZXIuaCBi L3RhcmdldC1zcGFyYy9oZWxwZXIuaAppbmRleCAxMmU4NTU3Li4wMjNmNGQ2IDEwMDY0NAotLS0g YS90YXJnZXQtc3BhcmMvaGVscGVyLmgKKysrIGIvdGFyZ2V0LXNwYXJjL2hlbHBlci5oCkBAIC0z NSw3ICszNSw2IEBAIERFRl9IRUxQRVJfMihjaGVja19hbGlnbiwgdm9pZCwgdGwsIGkzMikKIERF Rl9IRUxQRVJfMChkZWJ1Zywgdm9pZCkKIERFRl9IRUxQRVJfMChzYXZlLCB2b2lkKQogREVGX0hF TFBFUl8wKHJlc3RvcmUsIHZvaWQpCi1ERUZfSEVMUEVSXzEoZmx1c2gsIHZvaWQsIHRsKQogREVG X0hFTFBFUl8yKHVkaXYsIHRsLCB0bCwgdGwpCiBERUZfSEVMUEVSXzIodWRpdl9jYywgdGwsIHRs LCB0bCkKIERFRl9IRUxQRVJfMihzZGl2LCB0bCwgdGwsIHRsKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0 LXNwYXJjL29wX2hlbHBlci5jIGIvdGFyZ2V0LXNwYXJjL29wX2hlbHBlci5jCmluZGV4IGZmZmZi OGMuLmIzODY5MWUgMTAwNjQ0Ci0tLSBhL3RhcmdldC1zcGFyYy9vcF9oZWxwZXIuYworKysgYi90 YXJnZXQtc3BhcmMvb3BfaGVscGVyLmMKQEAgLTQwOTIsMTIgKzQwOTIsNiBAQCB2b2lkIGhlbHBl cl93cml0ZV9zb2Z0aW50KHVpbnQ2NF90IHZhbHVlKQogfQogI2VuZGlmCiAKLXZvaWQgaGVscGVy X2ZsdXNoKHRhcmdldF91bG9uZyBhZGRyKQotewotICAgIGFkZHIgJj0gfjc7Ci0gICAgdGJfaW52 YWxpZGF0ZV9wYWdlX3JhbmdlKGFkZHIsIGFkZHIgKyA4KTsKLX0KLQogI2lmZGVmIFRBUkdFVF9T UEFSQzY0CiAjaWZkZWYgREVCVUdfUENBTEwKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXhj cF9uYW1lc1sweDgwXSA9IHsKZGlmZiAtLWdpdCBhL3RhcmdldC1zcGFyYy90cmFuc2xhdGUuYyBi L3RhcmdldC1zcGFyYy90cmFuc2xhdGUuYwppbmRleCBmZTk5ZjBiLi4wY2M0N2U5IDEwMDY0NAot LS0gYS90YXJnZXQtc3BhcmMvdHJhbnNsYXRlLmMKKysrIGIvdGFyZ2V0LXNwYXJjL3RyYW5zbGF0 ZS5jCkBAIC00MjI2LDcgKzQyMjYsNyBAQCBzdGF0aWMgdm9pZCBkaXNhc19zcGFyY19pbnNuKERp c2FzQ29udGV4dCAqIGRjKQogICAgICAgICAgICAgICAgIGNhc2UgMHgzYjogLyogZmx1c2ggKi8K ICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKGRjKS0+ZGVmLT5mZWF0dXJlcyAmIENQVV9GRUFU VVJFX0ZMVVNIKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5pbXBfZmx1c2g7Ci0g ICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmx1c2goY3B1X2RzdCk7CisgICAgICAgICAg ICAgICAgICAgIC8qIG5vcCAqLwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICAgICAgICBjYXNlIDB4M2M6ICAgICAgLyogc2F2ZSAqLwogICAgICAgICAgICAgICAgICAgICBz YXZlX3N0YXRlKGRjLCBjcHVfY29uZCk7Ci0tIAoxLjcuMi41Cgo= --0016367b6392f786d904a3418cef--