From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk1-xa2e.google.com (mail-vk1-xa2e.google.com [IPv6:2607:f8b0:4864:20::a2e]) by sourceware.org (Postfix) with ESMTPS id 8C8FE385E455 for ; Sun, 25 Apr 2021 06:53:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8C8FE385E455 Received: by mail-vk1-xa2e.google.com with SMTP id q192so513330vke.1 for ; Sat, 24 Apr 2021 23:53:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=3Xlr50UNgC5ZZNxJLgGNT7puLq9UYWBjZdZQgBk2+J0=; b=JKpJhUOCG9MZS4ROCAt/E+FKsdAPsZLyYQ8DrDZJpjR4p0ljXG4ujstYklDeCQjF0W D/DTahANzpU5VXzmuIW7yhp0tIwmv9e8vcA7/GgQnA8VsnhRuKPYNxLaZby9Zo79zRei ywLGjXFvqoSQaOz+9qKiCsKHNdpYgOvNbwpb3c+H2jM2JOwg70d+dmtQ4+1+O/PWwKZd a1B5j3u89/zi615ReTkYIE78fdhvpyTKDjQTgPwoBXHpACpi+MORMYLDFpvX4u/SV8rz FgCsYGpVKliePR7aXfDB/D4NdrBw8Dux1t93OiLbsuDfOQN8kfCw99d693h/473v0TZQ kH6w== X-Gm-Message-State: AOAM532hOMqmC4GFfEzrTEXRByblmHJmKf1ucbQ8SVDnx0YaGn61WD58 lBiIHaQJgZYGC7QN4zcT+1pzn3wUqQm3sxapwsU= X-Google-Smtp-Source: ABdhPJwpHrEHgHW1pOotTz0cetIm0TZSr7MZt3Y9DcHR5Jwdam2WF5FQlv7+uH54yiTPhyuaPCXdpXD73wiqkdnXH20= X-Received: by 2002:a1f:45c7:: with SMTP id s190mr8532586vka.24.1619333580119; Sat, 24 Apr 2021 23:53:00 -0700 (PDT) MIME-Version: 1.0 References: <20210423091336.GX1179226@tucnak> In-Reply-To: <20210423091336.GX1179226@tucnak> From: Hongtao Liu Date: Sun, 25 Apr 2021 14:57:08 +0800 Message-ID: Subject: Re: [PATCH] [i386] Optimize __builtin_shuffle when it's used to zero the upper bits of the dest. [PR target/94680] To: Jakub Jelinek Cc: GCC Patches Content-Type: multipart/mixed; boundary="000000000000d0ffbf05c0c67ace" X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SCC_10_SHORT_WORD_LINES, SCC_20_SHORT_WORD_LINES, SCC_35_SHORT_WORD_LINES, SCC_5_SHORT_WORD_LINES, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Apr 2021 06:53:05 -0000 --000000000000d0ffbf05c0c67ace Content-Type: text/plain; charset="UTF-8" On Fri, Apr 23, 2021 at 5:13 PM Jakub Jelinek wrote: > > On Fri, Apr 23, 2021 at 12:53:58PM +0800, Hongtao Liu via Gcc-patches wrote: > > + if (!CONST_INT_P (er)) > > + return 0; > > + ei = INTVAL (er); > > + if (i < nelt2 && ei != i) > > + return 0; > > + if (i >= nelt2 > > + && (ei < nelt || ei >= nelt<<1)) > > Formatting: > 1) you have spaces followed by tab, remove the spaces; but, > if (i >= nelt2 && (ei < nelt || ei >= nelt<<1)) > fits on one line, so keep it on one line. > 2) nelt<<1 should be nelt << 1 with spaces around the << > Done. > > -(define_insn "*vec_concatv4si_0" > > - [(set (match_operand:V4SI 0 "register_operand" "=v,x") > > - (vec_concat:V4SI > > - (match_operand:V2SI 1 "nonimmediate_operand" "vm,?!*y") > > - (match_operand:V2SI 2 "const0_operand" " C,C")))] > > +(define_insn "*vec_concat_0" > > + [(set (match_operand:VI124_128 0 "register_operand" "=v,x") > > + (vec_concat:VI124_128 > > + (match_operand: 1 "nonimmediate_operand" "vm,?!*y") > > + (match_operand: 2 "const0_operand" " C,C")))] > > "TARGET_SSE2" > > "@ > > %vmovq\t{%1, %0|%0, %1} > > @@ -22154,6 +22157,24 @@ (define_insn "avx_vec_concat" > > (set_attr "prefix" "maybe_evex") > > (set_attr "mode" "")]) > > > > +(define_insn_and_split "*vec_concat_0" > > Would be better to use a different pattern name, *vec_concat_0 > is already used in the above define_insn. > Use some additional suffix after _0? > Changed to "*vec_concat_0_1" > > + return __builtin_shuffle (x, (v32qi) { 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v32qi) { 0, 1, 2, 3, 4, 5, 6, 7, > > + 8, 9, 10, 11, 12, 13, 14, 15, > > + 32, 49, 34, 58, 36, 53, 38, 39, > > + 40, 60, 42, 43, 63, 45, 46, 47 }); > > In this testcase the shuffles in the part taking indexes from the zero > vector are nicely randomized. > > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/i386/avx512f-pr94680.c > > @@ -0,0 +1,78 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-mavx512bw -mavx512vbmi -O2" } */ > > +/* { dg-final { scan-assembler-times {(?n)vmov[a-z0-9]*[ \t]*%ymm[0-9]} 6} } */ > > +/* { dg-final { scan-assembler-not "pxor" } } */ > > + > > + > > +typedef float v16sf __attribute__((vector_size(64))); > > +typedef double v8df __attribute__ ((vector_size (64))); > > +typedef long long v8di __attribute__((vector_size(64))); > > +typedef int v16si __attribute__((vector_size(64))); > > +typedef short v32hi __attribute__ ((vector_size (64))); > > +typedef char v64qi __attribute__ ((vector_size (64))); > > + > > +v8df > > +foo_v8df (v8df x) > > +{ > > + return __builtin_shuffle (x, (v8df) { 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v8di) { 0, 1, 2, 3, 8, 9, 10, 11 }); > > +} > > + > > +v8di > > +foo_v8di (v8di x) > > +{ > > + return __builtin_shuffle (x, (v8di) { 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v8di) { 0, 1, 2, 3, 8, 9, 10, 11 }); > > +} > > + > > +v16sf > > +foo_v16sf (v16sf x) > > +{ > > + return __builtin_shuffle (x, (v16sf) { 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v16si) { 0, 1, 2, 3, 4, 5, 6, 7, > > + 16, 17, 18, 19, 20, 21, 22, 23 }); > > +} > > + > > +v16si > > +foo_v16si (v16si x) > > +{ > > + return __builtin_shuffle (x, (v16si) { 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v16si) { 0, 1, 2, 3, 4, 5, 6, 7, > > + 16, 17, 18, 19, 20, 21, 22, 23 }); > > +} > > + > > +v32hi > > +foo_v32hi (v32hi x) > > +{ > > + return __builtin_shuffle (x, (v32hi) { 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v32hi) { 0, 1, 2, 3, 4, 5, 6, 7, > > + 8, 9, 10, 11, 12, 13, 14, 15, > > + 32, 33, 34, 35, 36, 37, 38, 39, > > + 40,41, 42, 43, 44, 45, 46, 47 }); > > +} > > + > > +v64qi > > +foo_v64qi (v64qi x) > > +{ > > + return __builtin_shuffle (x, (v64qi) { 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0, > > + 0, 0, 0, 0, 0, 0, 0, 0 }, > > + (v64qi) {0, 1, 2, 3, 4, 5, 6, 7, > > + 8, 9, 10, 11, 12, 13, 14, 15, > > + 16, 17, 18, 19, 20, 21, 22, 23, > > + 24, 25, 26, 27, 28, 29, 30, 31, > > + 64, 65, 66, 67, 68, 69, 70, 71, > > + 72, 73, 74, 75, 76, 77, 78, 79, > > + 80, 81, 82, 83, 84, 85, 86, 87, > > + 88, 89, 90, 91, 92, 93, 94, 95 }); > > Can't you randomize a little bit at least some of these too? > Done. > Also, what happens with __builtin_shuffle (zero_vector, x, ...) (i.e. when > you swap the two vectors and adjust correspondingly the permutation)? > Will it be also recognized or do we just punt on those? when building gimple, vec_perm(0, x, sel) is simplified to vec_perm(x, 0, sel*)(, with adjustment of selector), since arg0 is a constant. Not sure if rtl phase would do same simplification, anyway i add testcases for __builtin_shuffle (zero_vector, x, ...), but not extend pre-reload splitters to handle (vec_select: (vec_concat: cosnt0_rtx op1) selector). > > Jakub > -- BR, Hongtao --000000000000d0ffbf05c0c67ace Content-Type: text/x-patch; charset="US-ASCII"; name="0001-i386-Optimize-__builtin_shuffle-when-it-s-used-to-ze.patch" Content-Disposition: attachment; filename="0001-i386-Optimize-__builtin_shuffle-when-it-s-used-to-ze.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_knwteywr0 RnJvbSBmYjcyZGI1YTc1MTcwOGYzZDEzMDI3YzNjMjc5ZmJmNjBlMWUxYWFmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBUaHUsIDIyIEFwciAyMDIxIDE1OjMzOjE2ICswODAwClN1YmplY3Q6IFtQQVRDSF0gW2kzODZd IE9wdGltaXplIF9fYnVpbHRpbl9zaHVmZmxlIHdoZW4gaXQncyB1c2VkIHRvIHplcm8gdGhlCiB1 cHBlciBiaXRzIG9mIHRoZSBkZXN0LiBbUFIgdGFyZ2V0Lzk0NjgwXQoKSWYgdGhlIHNlY29uZCBv cGVyYW5kIG9mIF9fYnVpbHRpbl9zaHVmZmxlIGlzIGNvbnN0IHZlY3RvciAwLCBhbmQgd2l0aApz cGVjaWZpYyBtYXNrLCBpdCBjYW4gYmUgb3B0aW1pemVkIHRvIG1vdnEvdm1vdnBzLgoKLmkuZS4K Zm9vMTI4OgotICAgICAgIHZ4b3JwcyAgJXhtbTEsICV4bW0xLCAleG1tMQotICAgICAgIHZtb3Zs aHBzICAgICAgICAleG1tMSwgJXhtbTAsICV4bW0wCisgICAgICAgdm1vdnEgICAleG1tMCwgJXht bTAKCiBmb28yNTY6Ci0gICAgICAgdnhvcnBzICAleG1tMSwgJXhtbTEsICV4bW0xCi0gICAgICAg dnNodWZmMzJ4NCAgICAgICQwLCAleW1tMSwgJXltbTAsICV5bW0wCisgICAgICAgdm1vdmFwcyAl eG1tMCwgJXhtbTAKCiBmb281MTI6Ci0gICAgICAgdnhvcnBzICAleG1tMSwgJXhtbTEsICV4bW0x Ci0gICAgICAgdnNodWZmMzJ4NCAgICAgICQ2OCwgJXptbTEsICV6bW0wLCAlem1tMAorICAgICAg IHZtb3ZhcHMgJXltbTAsICV5bW0wCgpnY2MvQ2hhbmdlTG9nOgoKCVBSIHRhcmdldC85NDY4MAoJ KiBjb25maWcvaTM4Ni9zc2UubWQgKHNzZWRvdWJsZXZlY21vZGUpOiBBZGQgYXR0cmlidXRlIGZv cgoJVjY0UUkvVjMySEkvVjE2U0kvVjRESS4KCShzc2VoYWxmdmVjbW9kZSk6IEFkZCBhdHRyaWJ1 dGUgZm9yIFYyREkvVjJERi4KCSgqdmVjX2NvbmNhdHY0c2lfMCk6IEV4dGVuZCB0byBWSTEyNF8x MjguCgkoKnZlY19jb25jYXQ8bW9kZT5fMCk6IE5ldyBwcmUtcmVsb2FkIHNwbGl0dGVyLgoJKiBj b25maWcvaTM4Ni9wcmVkaWNhdGVzLm1kIChtb3ZxX3BhcmFsbGVsKTogTmV3IHByZWRpY2F0ZS4K CmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoKCVBSIHRhcmdldC85NDY4MAoJKiBnY2MudGFyZ2V0 L2kzODYvYXZ4LXByOTQ2ODAuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJm LXByOTQ2ODAuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9zc2UyLXByOTQ2ODAuYzog TmV3IHRlc3QuCi0tLQogZ2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQgICAgICAgICAgICAg ICAgIHwgIDMyICsrKysKIGdjYy9jb25maWcvaTM4Ni9zc2UubWQgICAgICAgICAgICAgICAgICAg ICAgICB8ICAzNyArKysrLQogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4LXByOTQ2 ODAuYyAgIHwgMTA3ICsrKysrKysrKysrKysKIC4uLi9nY2MudGFyZ2V0L2kzODYvYXZ4NTEyZi1w cjk0NjgwLmMgICAgICAgICB8IDE0NCArKysrKysrKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3NzZTItcHI5NDY4MC5jICB8ICA5MSArKysrKysrKysrKwogNSBmaWxl cyBjaGFuZ2VkLCA0MDMgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdngtcHI5NDY4MC5jCiBjcmVh dGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEyZi1wcjk0 NjgwLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9z c2UyLXByOTQ2ODAuYwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9wcmVkaWNhdGVzLm1k IGIvZ2NjL2NvbmZpZy9pMzg2L3ByZWRpY2F0ZXMubWQKaW5kZXggYjFkZjg1NDhhZjYuLjIwMWFh Y2Q2NWU2IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZAorKysgYi9n Y2MvY29uZmlnL2kzODYvcHJlZGljYXRlcy5tZApAQCAtMTUyNCw2ICsxNTI0LDM4IEBAIChkZWZp bmVfcHJlZGljYXRlICJtaXNhbGlnbmVkX29wZXJhbmQiCiAgIChhbmQgKG1hdGNoX2NvZGUgIm1l bSIpCiAgICAgICAgKG1hdGNoX3Rlc3QgIk1FTV9BTElHTiAob3ApIDwgR0VUX01PREVfQklUU0la RSAobW9kZSkiKSkpCiAKKzs7IFJldHVybiB0cnVlIGlmIE9QIGlzIGEgcGFyYWxsZWwgZm9yIGFu IG1vdntkLHEsZHFhLHBzLHBkfSB2ZWNfc2VsZWN0LAorOzsgd2hlcmUgb25lIG9mIHRoZSB0d28g b3BlcmFuZHMgb2YgdGhlIHZlY19jb25jYXQgaXMgY29uc3QwX29wZXJhbmQuCisoZGVmaW5lX3By ZWRpY2F0ZSAibW92cV9wYXJhbGxlbCIKKyAgKG1hdGNoX2NvZGUgInBhcmFsbGVsIikKK3sKKyAg dW5zaWduZWQgbmVsdCA9IFhWRUNMRU4gKG9wLCAwKTsKKyAgdW5zaWduZWQgbmVsdDIgPSBuZWx0 ID4+IDE7CisgIHVuc2lnbmVkIGk7CisKKyAgaWYgKG5lbHQgPCAyKQorICAgIHJldHVybiBmYWxz ZTsKKworICAvKiBWYWxpZGF0ZSB0aGF0IGFsbCBvZiB0aGUgZWxlbWVudHMgYXJlIGNvbnN0YW50 cywKKyAgICAgbG93ZXIgaGFsdmVzIG9mIHBlcm11dGUgYXJlIGxvd2VyIGhhbHZlcyBvZiB0aGUg Zmlyc3Qgb3BlcmFuZCwKKyAgICAgdXBwZXIgaGFsdmVzIG9mIHBlcm11dGUgY29tZSBmcm9tIGFu eSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbmVsdDsgKytp KQorICAgIHsKKyAgICAgIHJ0eCBlciA9IFhWRUNFWFAgKG9wLCAwLCBpKTsKKyAgICAgIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgZWk7CisKKyAgICAgIGlmICghQ09OU1RfSU5UX1AgKGVyKSkKKwly ZXR1cm4gMDsKKyAgICAgIGVpID0gSU5UVkFMIChlcik7CisgICAgICBpZiAoaSA8IG5lbHQyICYm IGVpICE9IGkpCisJcmV0dXJuIDA7CisgICAgICBpZiAoaSA+PSBuZWx0MiAmJiAoZWkgPCBuZWx0 IHx8IGVpID49IG5lbHQgPDwgMSkpCisJcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOwor fSkKKwogOzsgUmV0dXJuIHRydWUgaWYgT1AgaXMgYSB2emVyb2FsbCBvcGVyYXRpb24sIGtub3du IHRvIGJlIGEgUEFSQUxMRUwuCiAoZGVmaW5lX3ByZWRpY2F0ZSAidnplcm9hbGxfb3BlcmF0aW9u IgogICAobWF0Y2hfY29kZSAicGFyYWxsZWwiKQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2 L3NzZS5tZCBiL2djYy9jb25maWcvaTM4Ni9zc2UubWQKaW5kZXggOWQzNzI4ZDFjYjAuLjM2OWZm MmI5ZjI4IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvc3NlLm1kCisrKyBiL2djYy9jb25m aWcvaTM4Ni9zc2UubWQKQEAgLTgxMiwxOSArODEyLDIyIEBAIChkZWZpbmVfbW9kZV9hdHRyIHNz ZWludHZlY21vZGVsb3dlcgogCiA7OyBNYXBwaW5nIG9mIHZlY3RvciBtb2RlcyB0byBhIHZlY3Rv ciBtb2RlIG9mIGRvdWJsZSBzaXplCiAoZGVmaW5lX21vZGVfYXR0ciBzc2Vkb3VibGV2ZWNtb2Rl Ci0gIFsoVjMyUUkgIlY2NFFJIikgKFYxNkhJICJWMzJISSIpIChWOFNJICJWMTZTSSIpIChWNERJ ICJWOERJIikKKyAgWyhWNjRRSSAiVjEyOFFJIikgKFYzMkhJICJWNjRISSIpIChWMTZTSSAiVjMy U0kiKSAoVjhESSAiVjE2REkiKQorICAgKFYzMlFJICJWNjRRSSIpIChWMTZISSAiVjMySEkiKSAo VjhTSSAiVjE2U0kiKSAoVjRESSAiVjhESSIpCiAgICAoVjE2UUkgIlYzMlFJIikgKFY4SEkgIlYx NkhJIikgKFY0U0kgIlY4U0kiKSAoVjJESSAiVjRESSIpCisgICAoVjE2U0YgIlYzMlNGIikgKFY4 REYgIlYxNkRGIikKICAgIChWOFNGICJWMTZTRiIpIChWNERGICJWOERGIikKICAgIChWNFNGICJW OFNGIikgKFYyREYgIlY0REYiKV0pCiAKIDs7IE1hcHBpbmcgb2YgdmVjdG9yIG1vZGVzIHRvIGEg dmVjdG9yIG1vZGUgb2YgaGFsZiBzaXplCis7OyBpbnN0ZWFkIG9mIFYxREkvVjFERiwgREkvREYg YXJlIHVzZWQgZm9yIFYyREkvVjJERiBhbHRob3VnaCB0aGV5IGFyZSBzY2FsYXIuCiAoZGVmaW5l X21vZGVfYXR0ciBzc2VoYWxmdmVjbW9kZQogICBbKFY2NFFJICJWMzJRSSIpIChWMzJISSAiVjE2 SEkiKSAoVjE2U0kgIlY4U0kiKSAoVjhESSAiVjRESSIpIChWNFRJICJWMlRJIikKICAgIChWMzJR SSAiVjE2UUkiKSAoVjE2SEkgICJWOEhJIikgKFY4U0kgICJWNFNJIikgKFY0REkgIlYyREkiKQot ICAgKFYxNlFJICAiVjhRSSIpIChWOEhJICAgIlY0SEkiKSAoVjRTSSAgIlYyU0kiKQorICAgKFYx NlFJICAiVjhRSSIpIChWOEhJICAgIlY0SEkiKSAoVjRTSSAgIlYyU0kiKSAoVjJESSAiREkiKQog ICAgKFYxNlNGICJWOFNGIikgKFY4REYgIlY0REYiKQogICAgKFY4U0YgICJWNFNGIikgKFY0REYg IlYyREYiKQotICAgKFY0U0YgICJWMlNGIildKQorICAgKFY0U0YgICJWMlNGIikgKFYyREYgIkRG IildKQogCiAoZGVmaW5lX21vZGVfYXR0ciBzc2VoYWxmdmVjbW9kZWxvd2VyCiAgIFsoVjY0UUkg InYzMnFpIikgKFYzMkhJICJ2MTZoaSIpIChWMTZTSSAidjhzaSIpIChWOERJICJ2NGRpIikgKFY0 VEkgInYydGkiKQpAQCAtMTU5NjQsMTEgKzE1OTY3LDExIEBAIChkZWZpbmVfaW5zbiAiKnZlY19j b25jYXR2NHNpIgogICAgKHNldF9hdHRyICJwcmVmaXgiICJvcmlnLG1heWJlX2V2ZXgsb3JpZyxv cmlnLG1heWJlX2V2ZXgiKQogICAgKHNldF9hdHRyICJtb2RlIiAiVEksVEksVjRTRixWMlNGLFYy U0YiKV0pCiAKLShkZWZpbmVfaW5zbiAiKnZlY19jb25jYXR2NHNpXzAiCi0gIFsoc2V0IChtYXRj aF9vcGVyYW5kOlY0U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgICAgICAgIj12LHgiKQotCSh2ZWNf Y29uY2F0OlY0U0kKLQkgIChtYXRjaF9vcGVyYW5kOlYyU0kgMSAibm9uaW1tZWRpYXRlX29wZXJh bmQiICJ2bSw/ISp5IikKLQkgIChtYXRjaF9vcGVyYW5kOlYyU0kgMiAiY29uc3QwX29wZXJhbmQi ICAgICAgICIgQyxDIikpKV0KKyhkZWZpbmVfaW5zbiAiKnZlY19jb25jYXQ8bW9kZT5fMCIKKyAg WyhzZXQgKG1hdGNoX29wZXJhbmQ6VkkxMjRfMTI4IDAgInJlZ2lzdGVyX29wZXJhbmQiICAgICAg ICI9dix4IikKKwkodmVjX2NvbmNhdDpWSTEyNF8xMjgKKwkgIChtYXRjaF9vcGVyYW5kOjxzc2Vo YWxmdmVjbW9kZT4gMSAibm9uaW1tZWRpYXRlX29wZXJhbmQiICJ2bSw/ISp5IikKKwkgIChtYXRj aF9vcGVyYW5kOjxzc2VoYWxmdmVjbW9kZT4gMiAiY29uc3QwX29wZXJhbmQiICAgICAgICIgQyxD IikpKV0KICAgIlRBUkdFVF9TU0UyIgogICAiQAogICAgJXZtb3ZxXHR7JTEsICUwfCUwLCAlMX0K QEAgLTIyMTU0LDYgKzIyMTU3LDI0IEBAIChkZWZpbmVfaW5zbiAiYXZ4X3ZlY19jb25jYXQ8bW9k ZT4iCiAgICAoc2V0X2F0dHIgInByZWZpeCIgIm1heWJlX2V2ZXgiKQogICAgKHNldF9hdHRyICJt b2RlIiAiPHNzZWluc25tb2RlPiIpXSkKIAorKGRlZmluZV9pbnNuX2FuZF9zcGxpdCAiKnZlY19j b25jYXQ8bW9kZT5fMF8xIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWIDAgInJlZ2lzdGVyX29w ZXJhbmQiKQorCSh2ZWNfc2VsZWN0OlYKKwkgICh2ZWNfY29uY2F0Ojxzc2Vkb3VibGV2ZWNtb2Rl PgorCSAgICAobWF0Y2hfb3BlcmFuZDpWIDEgIm5vbmltbWVkaWF0ZV9vcGVyYW5kIikKKwkgICAg KG1hdGNoX29wZXJhbmQ6ViAyICJjb25zdDBfb3BlcmFuZCIpKQorCSAgKG1hdGNoX3BhcmFsbGVs IDMgIm1vdnFfcGFyYWxsZWwiCisJICAgIFsobWF0Y2hfb3BlcmFuZCA0ICJjb25zdF9pbnRfb3Bl cmFuZCIpXSkpKV0KKyAgIml4ODZfcHJlX3JlbG9hZF9zcGxpdCAoKSIKKyAgIiMiCisgICImJiAx IgorICBbKHNldCAobWF0Y2hfZHVwIDApCisJKHZlY19jb25jYXQ6ViAobWF0Y2hfZHVwIDEpICht YXRjaF9kdXAgNSkpKV0KK3sKKyAgb3BlcmFuZHNbMV0gPSBnZW5fbG93cGFydCAoPHNzZWhhbGZ2 ZWNtb2RlPm1vZGUsIG9wZXJhbmRzWzFdKTsKKyAgb3BlcmFuZHNbNV0gPSBDT05TVDBfUlRYICg8 c3NlaGFsZnZlY21vZGU+bW9kZSk7Cit9KQorCiAoZGVmaW5lX2luc24gInZjdnRwaDJwczxtYXNr X25hbWU+IgogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpWNFNGIDAgInJlZ2lzdGVyX29wZXJhbmQi ICI9diIpCiAJKHZlY19zZWxlY3Q6VjRTRgpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvYXZ4LXByOTQ2ODAuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2 L2F2eC1wcjk0NjgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmE4 OWU0OTY3ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvYXZ4LXByOTQ2ODAuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0g Ki8KKy8qIHsgZGctb3B0aW9ucyAiLW1hdnggLW1uby1hdng1MTJmIC1PMiIgfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHsoP24pdm1vdlthLXowLTldKlsgXHRdKiV4 bW1bMC05XX0gMTIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJw eG9yIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCB2OHNmIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9z aXplKDMyKSkpOwordHlwZWRlZiBkb3VibGUgdjRkZiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3Np emUgKDMyKSkpOwordHlwZWRlZiBsb25nIGxvbmcgdjRkaSBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jf c2l6ZSgzMikpKTsKK3R5cGVkZWYgaW50IHY4c2kgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUo MzIpKSk7Cit0eXBlZGVmIHNob3J0IHYxNmhpIF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAo MzIpKSk7Cit0eXBlZGVmIGNoYXIgdjMycWkgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgz MikpKTsKKwordjRkZgorZm9vX3Y0ZGYgKHY0ZGYgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9z aHVmZmxlICh4LCAodjRkZikgeyAwLCAwLCAwLCAwIH0sICh2NGRpKSB7IDAsIDEsIDQsIDUgfSk7 Cit9CisKK3Y0ZGYKK2Zvb192NGRmX2wgKHY0ZGYgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9z aHVmZmxlICgodjRkZikgeyAwLCAwLCAwLCAwIH0sIHgsICh2NGRpKSB7IDQsIDUsIDEsIDIgfSk7 Cit9CisKK3Y0ZGkKK2Zvb192NGRpICh2NGRpIHgpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1 ZmZsZSAoeCwgKHY0ZGkpIHsgMCwgMCwgMCwgMCB9LCAodjRkaSkgeyAwLCAxLCA0LCA3IH0pOwor fQorCit2NGRpCitmb29fdjRkaV9sICh2NGRpIHgpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1 ZmZsZSAoKHY0ZGkpIHsgMCwgMCwgMCwgMCB9LCB4LCAodjRkaSkgeyA0LCA1LCAzLCAxIH0pOwor fQorCit2OHNmCitmb29fdjhzZiAodjhzZiB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZm bGUgKCh2OHNmKSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAodjhzaSkg eyA4LCA5LCAxMCwgMTEsIDAsIDEsIDIsIDMgfSk7Cit9CisKK3Y4c2YKK2Zvb192OHNmX2wgKHY4 c2YgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4LCAodjhzZikgeyAwLCAwLCAw LCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAgKHY4c2kpIHsgMCwgMSwgMiwgMywgOCwgOSwgMTAs IDExIH0pOworfQorCit2OHNpCitmb29fdjhzaSAodjhzaSB4KQoreworICByZXR1cm4gX19idWls dGluX3NodWZmbGUgKHgsICh2OHNpKSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJCSAg ICAodjhzaSkgeyAwLCAxLCAyLCAzLCAxMywgMTIsIDExLCAxNSB9KTsKK30KKwordjhzaQorZm9v X3Y4c2lfbCAodjhzaSB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGUgKCh2OHNpKSB7 IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAodjhzaSkgeyA4LCA5LCAxMCwg MTEsIDcsIDYsIDUsIDQgfSk7Cit9CisKK3YxNmhpCitmb29fdjE2aGkgKHYxNmhpIHgpCit7Cisg IHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZSAoeCwgKHYxNmhpKSAgeyAwLCAwLCAwLCAwLCAwLCAw LCAwLCAwLAorCQkJCQkgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJCSAgICAgICAodjE2 aGkpIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywKKwkJCQkJIDI0LCAxNywgMjYsIDE5LCAyOCwg MjEsIDMwLCAyMyB9KTsKK30KKwordjE2aGkKK2Zvb192MTZoaV9sICh2MTZoaSB4KQoreworICBy ZXR1cm4gX19idWlsdGluX3NodWZmbGUgKCh2MTZoaSkgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwg MCwKKwkJCQkgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCB4LAorCQkJICAgICh2MTZo aSkgeyAxNiwgMTcsIDE4LCAyMCwgMjEsIDIyLCAyMywKKwkJCQkgICAgICAxNSwgMCwgMTMsIDIs IDExLCA0LCA5LCA2IH0pOworfQorCit2MzJxaQorZm9vX3YzMnFpICh2MzJxaSB4KQoreworICBy ZXR1cm4gX19idWlsdGluX3NodWZmbGUgKHgsICh2MzJxaSkgeyAwLCAwLCAwLCAwLCAwLCAwLCAw LCAwLAorCQkJCQkgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkJIDAsIDAsIDAsIDAsIDAs IDAsIDAsIDAsCisJCQkJCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAgICAgKHYz MnFpKSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsCisJCQkJCSA4LCA5LCAxMCwgMTEsIDEyLCAx MywgMTQsIDE1LAorCQkJCQkgMzIsIDQ5LCAzNCwgNTgsIDM2LCA1MywgMzgsIDM5LAorCQkJCQkg NDAsIDYwLCA0MiwgNDMsIDYzLCA0NSwgNDYsIDQ3IH0pOworfQorCit2MzJxaQorZm9vX3YzMnFp X2wgKHYzMnFpIHgpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZSAoKHYzMnFpKSB7IDAs IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwK KwkJCQkgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCSAgICAgIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAgKHYzMnFpKSB7IDMyLCAzMywgMzQsIDM1LCAzNiwg MzcsIDM4LCAzOSwKKwkJCQkgICAgICAgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAor CQkJCSAgICAgICAzMSwgMCwgMjksIDIsIDI3LCA0LCAyNSwgNiwKKwkJCQkgICAgICAgMjMsIDgs IDIxLCAxMCwgMTksIDEyLCAxNywgMTQgfSk7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9hdng1MTJmLXByOTQ2ODAuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L2F2eDUxMmYtcHI5NDY4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwLi5jMjc0MzFhYWU3MgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L2F2eDUxMmYtcHI5NDY4MC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiB7 IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItbWF2eDUxMmJ3IC1tYXZ4NTEy dmJtaSAtTzIiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7KD9u KXZtb3ZbYS16MC05XSpbIFx0XSoleW1tWzAtOV19IDEyfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItbm90ICJweG9yIiB9IH0gKi8KKworCit0eXBlZGVmIGZsb2F0IHYxNnNm IF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDY0KSkpOwordHlwZWRlZiBkb3VibGUgdjhkZiBf X2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDY0KSkpOwordHlwZWRlZiBsb25nIGxvbmcgdjhk aSBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSg2NCkpKTsKK3R5cGVkZWYgaW50IHYxNnNpIF9f YXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDY0KSkpOwordHlwZWRlZiBzaG9ydCB2MzJoaSBfX2F0 dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDY0KSkpOwordHlwZWRlZiBjaGFyIHY2NHFpIF9fYXR0 cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNjQpKSk7CisKK3Y4ZGYKK2Zvb192OGRmICh2OGRmIHgp Cit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZSAoeCwgKHY4ZGYpIHsgMCwgMCwgMCwgMCwg MCwgMCwgMCwgMCB9LAorCQkJICAgICh2OGRpKSB7IDAsIDEsIDIsIDMsIDE1LCAxNCwgMTAsIDEx IH0pOworfQorCit2OGRmCitmb29fdjhkZl9sICh2OGRmIHgpCit7CisgIHJldHVybiBfX2J1aWx0 aW5fc2h1ZmZsZSAoKHY4ZGYpIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCB4LAorCQkJICAg ICh2OGRpKSB7IDgsIDksIDEwLCAxMSwgMCwgMSwgMiwgMyB9KTsKK30KKwordjhkaQorZm9vX3Y4 ZGkgKHY4ZGkgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4LCAodjhkaSkgeyAw LCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAgKHY4ZGkpIHsgMCwgMSwgMiwgMywgOCwg OSwgMTAsIDExIH0pOworfQorCit2OGRpCitmb29fdjhkaV9sICh2OGRpIHgpCit7CisgIHJldHVy biBfX2J1aWx0aW5fc2h1ZmZsZSAoKHY4ZGkpIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCB4 LAorCQkJICAgICh2OGRpKSB7IDgsIDksIDEwLCAxMSwgNywgNiwgNSwgNCB9KTsKK30KKwordjE2 c2YKK2Zvb192MTZzZiAodjE2c2YgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4 LCAodjE2c2YpICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJCSAgIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAgfSwKKwkJCSAgICAgICAodjE2c2kpIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwg NywKKwkJCQkJIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMyB9KTsKK30KKwordjE2c2YK K2Zvb192MTZzZl9sICh2MTZzZiB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGUgKCh2 MTZzZikgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkgICAgICAgMCwgMCwgMCwgMCwg MCwgMCwgMCwgMCB9LCB4LAorCQkJICAgICh2MTZzaSkgeyAxNiwgMTcsIDE4LCAxOSwgMjAsIDIx LCAyMiwgMjMsCisJCQkJICAgICAgMCwgMTUsIDIsIDEzLCA0LCAxMSwgNiwgOSB9KTsKK30KKwor djE2c2kKK2Zvb192MTZzaSAodjE2c2kgeCkKK3sKKyAgICByZXR1cm4gX19idWlsdGluX3NodWZm bGUgKHgsICh2MTZzaSkgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkJICAgMCwgMCwg MCwgMCwgMCwgMCwgMCwgMCB9LAorCQkJICAgICAgICh2MTZzaSkgeyAwLCAxLCAyLCAzLCA0LCA1 LCA2LCA3LAorCQkJCQkgMzEsIDMwLCAyOSwgMjgsIDIwLCAyMSwgMjIsIDIzIH0pOworfQorCit2 MTZzaQorZm9vX3YxNnNpX2wgKHYxNnNpIHgpCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9zaHVm ZmxlICgodjE2c2kpICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJCSAwLCAwLCAwLCAw LCAwLCAwLCAwLCAwIH0sIHgsCisJCQkgICAgICAodjE2c2kpIHsgMTYsIDE3LCAxOCwgMTksIDIw LCAyMSwgMjIsIDIzLAorCQkJCQkxNSwgMCwgMTMsIDIsIDExLCA0LCA5LCA2IH0pOworfQorCit2 MzJoaQorZm9vX3YzMmhpICh2MzJoaSB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGUg KHgsICh2MzJoaSkgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCQkgMCwgMCwgMCwgMCwg MCwgMCwgMCwgMCwKKwkJCQkJIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJCSAwLCAwLCAw LCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAgICAgKHYzMmhpKSB7IDAsIDEsIDIsIDMsIDQsIDUs IDYsIDcsCisJCQkJCSA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorCQkJCQkgNjMsIDMz LCA2MSwgMzUsIDU5LCAzNywgNTcsIDM5LAorCQkJCQkgNTUsIDQxLCA1MywgNDMsIDUxLCA0NSwg NDksIDQ3IH0pOworfQorCit2MzJoaQorZm9vX3YzMmhpX2wgKHYzMmhpIHgpCit7CisgIHJldHVy biBfX2J1aWx0aW5fc2h1ZmZsZSAoKHYzMmhpKSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJ CQkJICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJICAgICAgIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAsCisJCQkJICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJ CSAgICAgICAodjMyaGkpIHsgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LAorCQkJCQkg NDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorCQkJCQkgMzEsIDAsIDI5LCAyLCAyNywg NCwgMjUsIDYsCisJCQkJCSAyMywgOCwgMjEsIDEwLCAxOSwgMTIsIDE3LCAxNCB9KTsKK30KKwor djY0cWkKK2Zvb192NjRxaSAodjY0cWkgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxl ICh4LCAodjY0cWkpIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkJIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAsCisJCQkJCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCQkgMCwgMCwg MCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkJIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJCSAw LCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCQkgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJ CQkJIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJCSAgICAgICAodjY0cWkpIHswLCAxLCAy LCAzLCA0LCA1LCA2LCA3LAorCQkJCQkgIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisJ CQkJCSAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLAorCQkJCQkgIDI0LCAyNSwgMjYs IDI3LCAyOCwgMjksIDMwLCAzMSwKKwkJCQkJICA2NCwgMTI3LCA2NiwgMTI1LCA2OCwgMTIzLCA3 MCwgMTIxLAorCQkJCQkgIDcyLCAxMTksIDc0LCAxMTcsIDc2LCAxMTUsIDc4LCAxMTMsCisJCQkJ CSAgODAsIDExMSwgODIsIDEwOSwgODQsIDEwNywgODYsIDEwNSwKKwkJCQkJICA4OCwgMTAzLCA5 MCwgMTAxLCA5MiwgOTksIDk0LCA5NyB9KTsKK30KKwordjY0cWkKK2Zvb192NjRxaV9sICh2NjRx aSB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGUgKCh2NjRxaSkgeyAwLCAwLCAwLCAw LCAwLCAwLCAwLCAwLAorCQkJCSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJICAg ICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAw LCAwLAorCQkJCSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCQkJICAgICAgMCwgMCwg MCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJ CSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAodjY0cWkpIHsgNjQs IDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLAorCQkJCSAgICAgIDcyLCA3MywgNzQsIDc1LCA3 NiwgNzcsIDc4LCA3OSwKKwkJCQkgICAgICA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcs CisJCQkJICAgICAgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAorCQkJCSAgICAgIDAs IDYzLCAyLCA2MSwgNCwgNTksIDYsIDU3LAorCQkJCSAgICAgIDgsIDU1LCAxMCwgNTMsIDEyLCA1 MSwgMTQsIDQ5LAorCQkJCSAgICAgIDE2LCA0NywgMTgsIDQ1LCAyMCwgNDMsIDIyLCA0MSwKKwkJ CQkgICAgICAyNCwgMzksIDI2LCAzNywgMjgsIDM1LCAzMCwgMzMgfSk7Cit9CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9zc2UyLXByOTQ2ODAuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItcHI5NDY4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi43ZTBmZjlmNmJjNwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3NzZTItcHI5NDY4MC5jCkBAIC0wLDAgKzEsOTEgQEAK Ky8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1tc3NlMiAtbW5vLXNz ZTQuMSAtTzIiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7KD9u KSg/Om1vdnxwc3JsZHEpLioleG1tWzAtOV19IDEyIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLW5vdCAicHhvciIgfSB9ICovCisKK3R5cGVkZWYgZmxvYXQgdjRzZiBfX2F0 dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgxNikpKTsKK3R5cGVkZWYgZG91YmxlIHYyZGYgX19hdHRy aWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKTsKK3R5cGVkZWYgbG9uZyBsb25nIHYyZGkgX19h dHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7Cit0eXBlZGVmIGludCB2NHNpIF9fYXR0cmli dXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpOwordHlwZWRlZiBzaG9ydCB2OGhpIF9fYXR0cmlidXRl X18gKCh2ZWN0b3Jfc2l6ZSAoMTYpKSk7Cit0eXBlZGVmIGNoYXIgdjE2cWkgX19hdHRyaWJ1dGVf XyAoKHZlY3Rvcl9zaXplICgxNikpKTsKKwordjJkZgorZm9vX3YyZGYgKHYyZGYgeCkKK3sKKyAg cmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4LCAodjJkZikgeyAwLCAwIH0sICh2MmRpKSB7MCwg Mn0pOworfQorCit2MmRmCitmb29fdjJkZl9sICh2MmRmIHgpCit7CisgIHJldHVybiBfX2J1aWx0 aW5fc2h1ZmZsZSAoKHYyZGYpIHsgMCwgMCB9LCB4LCAodjJkaSkgezMsIDF9KTsKK30KKwordjJk aQorZm9vX3YyZGkgKHYyZGkgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4LCAo djJkaSkgeyAwLCAwIH0sICh2MmRpKSB7MCwgM30pOworfQorCit2MmRpCitmb29fdjJkaV9sICh2 MmRpIHgpCit7CisgIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZSAoKHYyZGkpIHsgMCwgMCB9LCB4 LCAodjJkaSkgezMsIDB9KTsKK30KKwordjRzZgorZm9vX3Y0c2YgKHY0c2YgeCkKK3sKKyAgcmV0 dXJuIF9fYnVpbHRpbl9zaHVmZmxlICh4LCAodjRzZikgeyAwLCAwLCAwLCAwIH0sICh2NHNpKSB7 MCwgMSwgNCwgNX0pOworfQorCit2NHNmCitmb29fdjRzZl9sICh2NHNmIHgpCit7CisgIHJldHVy biBfX2J1aWx0aW5fc2h1ZmZsZSAoKHY0c2YpIHsgMCwgMCwgMCwgMCB9LCB4LCAodjRzaSkgezQs IDUsIDMsIDF9KTsKK30KKwordjRzaQorZm9vX3Y0c2kgKHY0c2kgeCkKK3sKKyAgcmV0dXJuIF9f YnVpbHRpbl9zaHVmZmxlICh4LCAodjRzaSkgeyAwLCAwLCAwLCAwIH0sICh2NHNpKSB7MCwgMSwg NiwgN30pOworfQorCit2NHNpCitmb29fdjRzaV9sICh2NHNpIHgpCit7CisgIHJldHVybiBfX2J1 aWx0aW5fc2h1ZmZsZSAoKHY0c2kpIHsgMCwgMCwgMCwgMCB9LCB4LCAodjRzaSkgezQsIDUsIDEs IDJ9KTsKK30KKwordjhoaQorZm9vX3Y4aGkgKHY4aGkgeCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRp bl9zaHVmZmxlICh4LCAodjhoaSkgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAg ICAgKHY4aGkpIHsgMCwgMSwgMiwgMywgOCwgMTIsIDEwLCAxMyB9KTsKK30KKwordjhoaQorZm9v X3Y4aGlfbCAodjhoaSB4KQoreworICByZXR1cm4gX19idWlsdGluX3NodWZmbGUgKCh2OGhpKSB7 IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAodjhoaSkgeyA4LCA5LCAxMCwg MTEsIDcsIDYsIDUsIDQgfSk7Cit9CisKK3YxNnFpCitmb29fdjE2cWkgKHYxNnFpIHgpCit7Cisg IHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZSAoeCwgKHYxNnFpKSB7IDAsIDAsIDAsIDAsIDAsIDAs IDAsIDAsCisJCQkJCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCQkgICAgICAgKHYxNnFp KSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywKKwkJCQkJMTYsIDI0LCAxOCwgMjYsIDIwLCAyOCwg MjIsIDMwIH0pOworfQorCit2MTZxaQorZm9vX3YxNnFpX2wgKHYxNnFpIHgpCit7CisgIHJldHVy biBfX2J1aWx0aW5fc2h1ZmZsZSAoKHYxNnFpKSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJ CQkJICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgeCwKKwkJCSAgICAodjE2cWkpIHsg MTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLAorCQkJCSAgICAgIDE1LCAwLCAxMywgMiwg MTEsIDQsIDksIDYgfSk7Cit9Ci0tIAoyLjE4LjEKCg== --000000000000d0ffbf05c0c67ace--