From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 74917 invoked by alias); 30 May 2016 05:55:16 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 74904 invoked by uid 89); 30 May 2016 05:55:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=AWL,BAYES_50,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=biener, Biener, youd, you'd X-HELO: mail-it0-f43.google.com Received: from mail-it0-f43.google.com (HELO mail-it0-f43.google.com) (209.85.214.43) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 30 May 2016 05:55:05 +0000 Received: by mail-it0-f43.google.com with SMTP id z123so24036765itg.0 for ; Sun, 29 May 2016 22:55:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=qeEMJHvKxN/+6/PH1sD4jCtYMekWd4JBkOA/rCNSWfc=; b=bRSxXs4OB1A4xQ03+N76V09TYu9nUPuv4iOQ+qeAZUTofKZ0dmSEPHY52eGgwW4Kx/ delxxlgemZ7NFDa84BZ0+KOWjXTBMAE1IlaLucc+lGsaoUBK3lXFUeNBjHsIjBLek8p9 I0crcuuFDLe61YZAZcxL2P1QxXL3yUS1V822b/mstp4eWUKSlgnhRWMbiqUXc4Mi6tEV 9ZYEiw8SG90Sr8IB7vvLwB5eGV+EUzm/+a6105ey1OqiiZCPiNIAZZzeC7Et4MWU5AFw HmwSsLEA/Z6UYJb5CAaLvSQibCGArPPRVxzyJqHuQ+0qkGzjFFrFE4gcXYh8BSqmm+l3 10Ig== X-Gm-Message-State: ALyK8tLUSaXqA/phnTNvI2+vZDgJ5vNx3nsJgx/DtuvfP7ckh3+Tj5AmFkJciHjoLbVNJOwBEAk/Y57+Bv9Br0uK MIME-Version: 1.0 X-Received: by 10.36.123.77 with SMTP id q74mr6052205itc.44.1464587702451; Sun, 29 May 2016 22:55:02 -0700 (PDT) Received: by 10.36.236.5 with HTTP; Sun, 29 May 2016 22:55:02 -0700 (PDT) In-Reply-To: References: Date: Mon, 30 May 2016 09:56:00 -0000 Message-ID: Subject: Re: RFC [1/2] divmod transform From: Prathamesh Kulkarni To: Richard Biener Cc: Richard Biener , gcc Patches , Ramana Radhakrishnan , Kugan Vivekanandarajah , Jim Wilson Content-Type: multipart/mixed; boundary=001a11475b22bf9a8c053408e58d X-IsSubscribed: yes X-SW-Source: 2016-05/txt/msg02314.txt.bz2 --001a11475b22bf9a8c053408e58d Content-Type: text/plain; charset=UTF-8 Content-length: 19903 On 27 May 2016 at 17:31, Richard Biener wrote: > On Fri, 27 May 2016, Prathamesh Kulkarni wrote: > >> On 27 May 2016 at 15:45, Richard Biener wrote: >> > On Wed, 25 May 2016, Prathamesh Kulkarni wrote: >> > >> >> On 25 May 2016 at 12:52, Richard Biener wrote: >> >> > On Tue, 24 May 2016, Prathamesh Kulkarni wrote: >> >> > >> >> >> On 24 May 2016 at 19:39, Richard Biener wrote: >> >> >> > On Tue, 24 May 2016, Prathamesh Kulkarni wrote: >> >> >> > >> >> >> >> On 24 May 2016 at 17:42, Richard Biener wrote: >> >> >> >> > On Tue, 24 May 2016, Prathamesh Kulkarni wrote: >> >> >> >> > >> >> >> >> >> On 23 May 2016 at 17:35, Richard Biener wrote: >> >> >> >> >> > On Mon, May 23, 2016 at 10:58 AM, Prathamesh Kulkarni >> >> >> >> >> > wrote: >> >> >> >> >> >> Hi, >> >> >> >> >> >> I have updated my patch for divmod (attached), which was originally >> >> >> >> >> >> based on Kugan's patch. >> >> >> >> >> >> The patch transforms stmts with code TRUNC_DIV_EXPR and TRUNC_MOD_EXPR >> >> >> >> >> >> having same operands to divmod representation, so we can cse computation of mod. >> >> >> >> >> >> >> >> >> >> >> >> t1 = a TRUNC_DIV_EXPR b; >> >> >> >> >> >> t2 = a TRUNC_MOD_EXPR b >> >> >> >> >> >> is transformed to: >> >> >> >> >> >> complex_tmp = DIVMOD (a, b); >> >> >> >> >> >> t1 = REALPART_EXPR (complex_tmp); >> >> >> >> >> >> t2 = IMAGPART_EXPR (complex_tmp); >> >> >> >> >> >> >> >> >> >> >> >> * New hook divmod_expand_libfunc >> >> >> >> >> >> The rationale for introducing the hook is that different targets have >> >> >> >> >> >> incompatible calling conventions for divmod libfunc. >> >> >> >> >> >> Currently three ports define divmod libfunc: c6x, spu and arm. >> >> >> >> >> >> c6x and spu follow the convention of libgcc2.c:__udivmoddi4: >> >> >> >> >> >> return quotient and store remainder in argument passed as pointer, >> >> >> >> >> >> while the arm version takes two arguments and returns both >> >> >> >> >> >> quotient and remainder having mode double the size of the operand mode. >> >> >> >> >> >> The port should hence override the hook expand_divmod_libfunc >> >> >> >> >> >> to generate call to target-specific divmod. >> >> >> >> >> >> Ports should define this hook if: >> >> >> >> >> >> a) The port does not have divmod or div insn for the given mode. >> >> >> >> >> >> b) The port defines divmod libfunc for the given mode. >> >> >> >> >> >> The default hook default_expand_divmod_libfunc() generates call >> >> >> >> >> >> to libgcc2.c:__udivmoddi4 provided the operands are unsigned and >> >> >> >> >> >> are of DImode. >> >> >> >> >> >> >> >> >> >> >> >> Patch passes bootstrap+test on x86_64-unknown-linux-gnu and >> >> >> >> >> >> cross-tested on arm*-*-*. >> >> >> >> >> >> Bootstrap+test in progress on arm-linux-gnueabihf. >> >> >> >> >> >> Does this patch look OK ? >> >> >> >> >> > >> >> >> >> >> > diff --git a/gcc/targhooks.c b/gcc/targhooks.c >> >> >> >> >> > index 6b4601b..e4a021a 100644 >> >> >> >> >> > --- a/gcc/targhooks.c >> >> >> >> >> > +++ b/gcc/targhooks.c >> >> >> >> >> > @@ -1965,4 +1965,31 @@ default_optab_supported_p (int, machine_mode, >> >> >> >> >> > machine_mode, optimization_type) >> >> >> >> >> > return true; >> >> >> >> >> > } >> >> >> >> >> > >> >> >> >> >> > +void >> >> >> >> >> > +default_expand_divmod_libfunc (bool unsignedp, machine_mode mode, >> >> >> >> >> > + rtx op0, rtx op1, >> >> >> >> >> > + rtx *quot_p, rtx *rem_p) >> >> >> >> >> > >> >> >> >> >> > functions need a comment. >> >> >> >> >> > >> >> >> >> >> > ISTR it was suggested that ARM change to libgcc2.c__udivmoddi4 style? In that >> >> >> >> >> > case we could avoid the target hook. >> >> >> >> >> Well I would prefer adding the hook because that's more easier -;) >> >> >> >> >> Would it be ok for now to go with the hook ? >> >> >> >> >> > >> >> >> >> >> > + /* If target overrides expand_divmod_libfunc hook >> >> >> >> >> > + then perform divmod by generating call to the target-specifc divmod >> >> >> >> >> > libfunc. */ >> >> >> >> >> > + if (targetm.expand_divmod_libfunc != default_expand_divmod_libfunc) >> >> >> >> >> > + return true; >> >> >> >> >> > + >> >> >> >> >> > + /* Fall back to using libgcc2.c:__udivmoddi4. */ >> >> >> >> >> > + return (mode == DImode && unsignedp); >> >> >> >> >> > >> >> >> >> >> > I don't understand this - we know optab_libfunc returns non-NULL for 'mode' >> >> >> >> >> > but still restrict this to DImode && unsigned? Also if >> >> >> >> >> > targetm.expand_divmod_libfunc >> >> >> >> >> > is not the default we expect the target to handle all modes? >> >> >> >> >> Ah indeed, the check for DImode is unnecessary. >> >> >> >> >> However I suppose the check for unsignedp should be there, >> >> >> >> >> since we want to generate call to __udivmoddi4 only if operand is unsigned ? >> >> >> >> > >> >> >> >> > The optab libfunc for sdivmod should be NULL in that case. >> >> >> >> Ah indeed, thanks. >> >> >> >> > >> >> >> >> >> > >> >> >> >> >> > That said - I expected the above piece to be simply a 'return true;' ;) >> >> >> >> >> > >> >> >> >> >> > Usually we use some can_expand_XXX helper in optabs.c to query if the target >> >> >> >> >> > supports a specific operation (for example SImode divmod would use DImode >> >> >> >> >> > divmod by means of widening operands - for the unsigned case of course). >> >> >> >> >> Thanks for pointing out. So if a target does not support divmod >> >> >> >> >> libfunc for a mode >> >> >> >> >> but for a wider mode, then we could zero-extend operands to the wider-mode, >> >> >> >> >> perform divmod on the wider-mode, and then cast result back to the >> >> >> >> >> original mode. >> >> >> >> >> I haven't done that in this patch, would it be OK to do that as a follow up ? >> >> >> >> > >> >> >> >> > I think that you should conservatively handle the div_optab query, thus if >> >> >> >> > the target has a HW division in a wider mode don't use the divmod IFN. >> >> >> >> > You'd simply iterate over GET_MODE_WIDER_MODE and repeat the >> >> >> >> > if (optab_handler (div_optab, mode) != CODE_FOR_nothing) check, bailing >> >> >> >> > out if that is available. >> >> >> >> Done. >> >> >> >> > >> >> >> >> >> > + /* Disable the transform if either is a constant, since >> >> >> >> >> > division-by-constant >> >> >> >> >> > + may have specialized expansion. */ >> >> >> >> >> > + if (TREE_CONSTANT (op1) || TREE_CONSTANT (op2)) >> >> >> >> >> > + return false; >> >> >> >> >> > >> >> >> >> >> > please use CONSTANT_CLASS_P (op1) || CONSTANT_CLASS_P (op2) >> >> >> >> >> > >> >> >> >> >> > + if (TYPE_OVERFLOW_TRAPS (type)) >> >> >> >> >> > + return false; >> >> >> >> >> > >> >> >> >> >> > why's that? Generally please first test cheap things (trapping, constant-ness) >> >> >> >> >> > before checking expensive stuff (target_supports_divmod_p). >> >> >> >> >> I added TYPE_OVERFLOW_TRAPS (type) based on your suggestion in: >> >> >> >> >> https://www.mail-archive.com/gcc@gcc.gnu.org/msg78534.html >> >> >> >> >> "When looking at TRUNC_DIV_EXPR you should also exclude >> >> >> >> >> the case where TYPE_OVERFLOW_TRAPS (type) as that should >> >> >> >> >> expand using the [su]divv optabs (no trapping overflow >> >> >> >> >> divmod optab exists)." >> >> >> >> > >> >> >> >> > Ok, didn't remember that. >> >> >> >> > >> >> >> >> >> > >> >> >> >> >> > +static bool >> >> >> >> >> > +convert_to_divmod (gassign *stmt) >> >> >> >> >> > +{ >> >> >> >> >> > + if (!divmod_candidate_p (stmt)) >> >> >> >> >> > + return false; >> >> >> >> >> > + >> >> >> >> >> > + tree op1 = gimple_assign_rhs1 (stmt); >> >> >> >> >> > + tree op2 = gimple_assign_rhs2 (stmt); >> >> >> >> >> > + >> >> >> >> >> > + vec stmts = vNULL; >> >> >> >> >> > >> >> >> >> >> > use an auto_vec - you currently leak it in at least one place. >> >> >> >> >> > >> >> >> >> >> > + if (maybe_clean_or_replace_eh_stmt (use_stmt, use_stmt)) >> >> >> >> >> > + cfg_changed = true; >> >> >> >> >> > >> >> >> >> >> > note that this suggests you should check whether any of the stmts may throw >> >> >> >> >> > internally as you don't update / transfer EH info correctly. So for 'stmt' and >> >> >> >> >> > all 'use_stmt' check stmt_can_throw_internal and if so do not add it to >> >> >> >> >> > the list of stmts to modify. >> >> >> >> >> > >> >> >> >> >> > Btw, I think you should not add 'stmt' immediately but when iterating over >> >> >> >> >> > all uses also gather uses in TRUNC_MOD_EXPR. >> >> >> >> >> > >> >> >> >> >> > Otherwise looks ok. >> >> >> >> >> Done changes in this version. I am gathering mod uses same time as div uses, >> >> >> >> >> so this imposes a constraint that mod dominates mod. I am not sure if >> >> >> >> >> that's desirable. >> >> >> >> > >> >> >> >> > I think you also need a mod_seen variable now that you don't necessarily >> >> >> >> > end up with 'stmt' in the vector of stmts. I don't see how there is a >> >> >> >> > constraint that mod dominates mod - it's just that the top_stmt needs >> >> >> >> > to dominate all other uses that can be replaced with replacing top_stmt >> >> >> >> > with a divmod. It's just that the actual stmt set we choose may now >> >> >> >> > depend on immediate uses order which on a second thought is bad >> >> >> >> > as immediate uses order could be affected by debug stmts ... hmm. >> >> >> >> > >> >> >> >> > To avoid this please re-add the code adding 'stmt' to stmts immediately >> >> >> >> > and add a use_stmt != stmt check to the immediate use processing loop >> >> >> >> > so that we don't end up adding it twice. >> >> >> >> Well I wonder what will happen for the following case: >> >> >> >> t1 = x / y; >> >> >> >> if (cond) >> >> >> >> t2 = x % y; >> >> >> >> else >> >> >> >> t3 = x % y; >> >> >> >> >> >> >> >> Assuming stmt == top_stmt is "t2 = x % y" and use_stmt is "t3 = x % y", >> >> >> >> use_stmt will not get added to stmts vector, since top_stmt and >> >> >> >> use_stmt are not in same bb, >> >> >> >> and bb's containing top_stmt and use_stmt don't dominate each other. >> >> >> >> Not sure if this is practical case (I assume fre will hoist mod >> >> >> >> outside if-else?) >> >> >> >> >> >> >> >> Now that we immediately add stmt to stmts vector, I suppose mod_seen >> >> >> >> shall not be required ? >> >> >> > >> >> >> > In that case mod_seen is not needed. But the situation you say will >> >> >> > still happen so I wonder if we'd need a better way of iterating over >> >> >> > immediate uses, like first pushing all candidates into a worklist >> >> >> > vector and then iterating over that until we find no more candidates. >> >> >> > >> >> >> > You can then also handle the case of more than one group of stmts >> >> >> > (the pass currently doesn't iterate in any particular useful order >> >> >> > over BBs). >> >> >> IIUC, we want to perform the transform if: >> >> >> i) there exists top_stmt with code trunc_div_expr/trunc_mod_expr and >> >> >> having same operands as stmt. >> >> >> ii) top_stmt dominates all other stmts with code >> >> >> trunc_div_expr/trunc_mod_expr and having same operands as top_stmt. >> >> >> >> >> >> Firstly, we try to get to top_stmt if it exists, by iterating over uses of stmt, >> >> >> and then iterate over all uses of top_stmt and add them to stmts vector >> >> >> only if top_stmt dominates all the stmts with same operands as top_stmt >> >> >> and have code trunc_div_expr/trunc_mod_expr. >> >> >> >> >> >> /* Get to top_stmt. */ >> >> >> top_stmt = stmt; >> >> >> top_bb = gimple_bb (stmt); >> >> >> >> >> >> FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, op1) >> >> >> { >> >> >> if (use_stmt code is TRUNC_DIV_EXPR or TRUNC_MOD_EXPR >> >> >> && use_stmt has same operands as stmt) >> >> >> { >> >> >> if (gimple_bb (use_stmt) dominates top_bb) >> >> >> { >> >> >> top_bb = gimple_bb (use_stmt); >> >> >> top_stmt = use_stmt; >> >> >> } >> >> >> else if (gimple_bb (use_stmt) == top_stmt >> >> >> && gimple_uid (use_stmt) < top_stmt) >> >> >> top_stmt = use_stmt; >> >> >> } >> >> >> } >> >> >> >> >> >> /* Speculatively consider top_stmt as dominating all other >> >> >> div_expr/mod_expr stmts with same operands as stmt. */ >> >> >> stmts.safe_push (top_stmt); >> >> >> >> >> >> /* Walk uses of top_stmt to ensure that all stmts are dominated by top_stmt. */ >> >> >> top_op1 = gimple_assign_rhs1 (top_stmt); >> >> >> FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, top_op1) >> >> >> { >> >> >> if (use_stmt code is TRUNC_DIV_EXPR or TRUNC_MOD_EXPR >> >> >> && use_stmt has same operands as top_stmt) >> >> >> { >> >> >> if (use_stmt == top_stmt) >> >> >> continue; >> >> >> >> >> >> /* No top_stmt exits, do not proceed with transform */ >> >> >> if (top_bb does not dominate gimple_bb (use_stmt)) >> >> >> return false; >> >> >> >> >> >> stmts.safe_push (use_stmt); >> >> >> } >> >> >> } >> >> >> >> >> >> For the case: >> >> >> t1 = x / y; >> >> >> if (cond) >> >> >> t2 = x % y; >> >> >> else >> >> >> t3 = x % y; >> >> >> >> >> >> Assuming stmt is "t2 = x % y", it will walk uses of stmt and set >> >> >> top_stmt to "t1 = x / y" >> >> >> Then it will walk all uses of top_stmt: >> >> >> "t2 = x % y" -> dominated by top_stmt >> >> >> "t3 = x % y" -> dominated by top_stmt >> >> >> Since all stmts are dominated by top_stmt, we add all three stmts to >> >> >> vector of stmts and proceed with transform. >> >> >> >> >> >> For the case where, top_stmt dominates original stmt but not all stmts: >> >> >> >> >> >> if (cond) >> >> >> t1 = x / y; >> >> >> else >> >> >> { >> >> >> t2 = x % y; >> >> >> return; >> >> >> } >> >> >> >> >> >> t3 = x % y; >> >> >> >> >> >> Assuming stmt is "t3 = x % y", >> >> >> Walking stmt uses will set top_stmt to "t1 = x / y"; >> >> >> >> >> >> Walking immediate uses of top_stmt, we find that "t2 = x % y" is not >> >> >> dominated by top_stmt, >> >> >> and hence don't do the transform. >> >> >> >> >> >> Does this sound reasonable ? >> >> > >> >> > Yes, that's reasonable. >> >> Thanks, I have attached patch that implements above approach. >> >> Does it look OK ? >> > >> > Please start the top-stmt search with >> > >> > top_stmt = stmt; >> > top_bb = gimple_bb (stmt); >> > >> > this makes sure to process all stmts via the IL walk in case >> > the uses have multiple independent "dominated" trees. This also >> > simplifies the loop body (no need to check for NULL). This also >> > makes mod_seen always true and you can compute div_seen in that >> > loop as well. >> Done. Um I don't understand why setting top_stmt to NULL won't process >> all stmts ? AFAIU it will have one extra iteration compared to >> initializing top_stmt to stmt (since first iteration would initialize >> top_stmt to stmt assuming stmt does not throw) ? > > If you have > > if (cond) > { > r = x % y; > q = x / y; > } > else > { > r = x % y; > q = x / y; > } > > then the loop over the function might end up transforming the else > block when visiting the then block modulo and thus it will never > transform the then block. Because you walk immediate uses which > do not guarantee that you end up with a top_stmt related to the > IL point you were coming from - the first iteration does _not_ > necessarily have use_stmt == stmt. Thanks for the explanation, I overlooked the fact that for first iteration use_stmt may not equal stmt -;) > >> > >> > Otherwise looks ok now. >> > >> >> The patch does not still handle the following case: >> >> int f(int x, int y) >> >> { >> >> extern int cond; >> >> int q, r; >> >> >> >> if (cond) >> >> q = x % y; >> >> else >> >> q = x % y; >> >> >> >> r = x % y; >> >> return q + r; >> >> } >> >> >> >> In above case although the mod stmt is not dominated by either div >> >> stmt, I suppose the transform >> >> is still possible by inserting DIVMOD (x, y) before if-else ? >> > >> > Yeah, same for sincos where doing this requires some LCM algorithm. >> Well I don't have a good approach for this. >> I was thinking, before doing the divmod transform, we could walk >> GIMPLE_COND of "diamond" shape >> (having both arms), and check "then" bb and "else" bb have same div or >> mod stmts and in that case put an artificial >> same stmt above GIMPLE_COND. >> >> So the above case would be transformed to: >> >> int tmp = x / y; // artificial top_stmt >> if (cond) >> q = x / y; >> else >> q = x / y; >> >> r = x % y; >> return q + r; >> >> and then the divmod transform will see "tmp = x / y" as the topmost stmt. >> Since top_stmt is artificially introduced, we will replace that with DIVMOD ifn >> rather than inserting DIVMOD ifn above top_stmt as in other cases. > > Yeah, but it is really a general missed optimization that should be not > required for this transform. The attached patch ICE's during bootstrap for x86_64, and is reproducible with following case with -m32 -O2: typedef long long type; type f(type x, type y) { type q = x / y; type r = x % y; return q + r; } The ICE happens because the test-case hits gcc_assert (unsignedp); in default_expand_divmod_libfunc (). Surprisingly, optab_libfunc (sdivmod_optab, DImode) returns optab_libfunc with name "__divmoddi4" although __divmoddi4() is nowhere defined in libgcc for x86. (I verified that by forcing the patch to generate call to __divmoddi4, which results in undefined reference to __divmoddi4). This happens because in optabs.def we have: OPTAB_NL(sdivmod_optab, "divmod$a4", UNKNOWN, "divmod", '4', gen_int_libfunc) and gen_int_libfunc generates "__divmoddi4" on first call to optab_libfunc and sets optab_libfunc (sdivmod_optab, DImode) to "__divmoddi4". I wonder if we should remove gen_int_libfunc entry in optabs.def for sdivmod_optab ? Thanks, Prathamesh > > Richard. > >> > >> >> For the following test-case, I am surprised why CSE didn't take place before >> >> widening_mul pass ? >> >> >> >> int >> >> f_1 (int x, int y) >> >> { >> >> int q = x / y; >> >> int r1 = 0, r2 = 0; >> >> if (cond) >> >> r1 = x % y; >> >> else >> >> r2 = x % y; >> >> return q + r1 + r2; >> >> } >> > >> > This is not CSE but code hoisting which is not implemented on GIMPLE >> > (see PR23286) >> Ah right, thanks for pointing out the PR. >> >> Thanks, >> Prathamesh >> > >> >> The input to widening_mul pass is: >> >> f_1 (int x, int y) >> >> { >> >> int r2; >> >> int r1; >> >> int q; >> >> int cond.0_1; >> >> int _2; >> >> int _11; >> >> >> >> : >> >> q_7 = x_5(D) / y_6(D); >> >> cond.0_1 = cond; >> >> if (cond.0_1 != 0) >> >> goto ; >> >> else >> >> goto ; >> >> >> >> : >> >> r1_9 = x_5(D) % y_6(D); >> >> goto ; >> >> >> >> : >> >> r2_10 = x_5(D) % y_6(D); >> >> >> >> : >> >> # r1_3 = PHI >> >> # r2_4 = PHI <0(3), r2_10(4)> >> >> _2 = r1_3 + q_7; >> >> _11 = _2 + r2_4; >> >> return _11; >> >> >> >> } >> >> >> >> Thanks, >> >> Prathamesh >> >> > >> >> > Richard. >> >> > >> >> >> Thanks, >> >> >> Prathamesh >> >> >> > >> >> >> > Richard. >> >> >> > >> >> >> >> >> >> >> >> > >> >> > -- >> >> > Richard Biener >> >> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg) >> >> >> > >> > -- >> > Richard Biener >> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg) >> > > -- > Richard Biener > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg) --001a11475b22bf9a8c053408e58d Content-Type: text/plain; charset=US-ASCII; name="divmod_5_5.diff" Content-Disposition: attachment; filename="divmod_5_5.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iotloli40 Content-length: 38077 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybS5jIGIvZ2NjL2NvbmZp Zy9hcm0vYXJtLmMKaW5kZXggMTIwNjBiYS4uMTMxMDAwNiAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmMKKysrIGIvZ2NjL2NvbmZpZy9hcm0v YXJtLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlICJidWlsdGlucy5o IgogI2luY2x1ZGUgInRtLWNvbnN0cnMuaCIKICNpbmNsdWRlICJydGwtaXRl ci5oIgorI2luY2x1ZGUgIm9wdGFicy1saWJmdW5jcy5oIgogCiAvKiBUaGlz IGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGxhc3QuICAqLwogI2luY2x1ZGUg InRhcmdldC1kZWYuaCIKQEAgLTMwMCw2ICszMDEsNyBAQCBzdGF0aWMgdW5z aWduZWQgSE9TVF9XSURFX0lOVCBhcm1fYXNhbl9zaGFkb3dfb2Zmc2V0ICh2 b2lkKTsKIHN0YXRpYyB2b2lkIGFybV9zY2hlZF9mdXNpb25fcHJpb3JpdHkg KHJ0eF9pbnNuICosIGludCwgaW50ICosIGludCopOwogc3RhdGljIGJvb2wg YXJtX2Nhbl9vdXRwdXRfbWlfdGh1bmsgKGNvbnN0X3RyZWUsIEhPU1RfV0lE RV9JTlQsIEhPU1RfV0lERV9JTlQsCiAJCQkJICAgICBjb25zdF90cmVlKTsK K3N0YXRpYyB2b2lkIGFybV9leHBhbmRfZGl2bW9kX2xpYmZ1bmMgKGJvb2ws IG1hY2hpbmVfbW9kZSwgcnR4LCBydHgsIHJ0eCAqLCBydHggKik7CiAKIAwK IC8qIFRhYmxlIG9mIG1hY2hpbmUgYXR0cmlidXRlcy4gICovCkBAIC03MzAs NiArNzMyLDkgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfc3Bl YyBhcm1fYXR0cmlidXRlX3RhYmxlW10gPQogI3VuZGVmIFRBUkdFVF9TQ0hF RF9GVVNJT05fUFJJT1JJVFkKICNkZWZpbmUgVEFSR0VUX1NDSEVEX0ZVU0lP Tl9QUklPUklUWSBhcm1fc2NoZWRfZnVzaW9uX3ByaW9yaXR5CiAKKyN1bmRl ZiBUQVJHRVRfRVhQQU5EX0RJVk1PRF9MSUJGVU5DCisjZGVmaW5lIFRBUkdF VF9FWFBBTkRfRElWTU9EX0xJQkZVTkMgYXJtX2V4cGFuZF9kaXZtb2RfbGli ZnVuYworCiBzdHJ1Y3QgZ2NjX3RhcmdldCB0YXJnZXRtID0gVEFSR0VUX0lO SVRJQUxJWkVSOwogDAogLyogT2JzdGFjayBmb3IgbWluaXBvb2wgY29uc3Rh bnQgaGFuZGxpbmcuICAqLwpAQCAtMzAzNTQsNiArMzAzNTksMzcgQEAgYXJt X3NjaGVkX2Z1c2lvbl9wcmlvcml0eSAocnR4X2luc24gKmluc24sIGludCBt YXhfcHJpLAogICByZXR1cm47CiB9CiAKKy8qIEV4cGFuZCBjYWxsIHRvIF9f YWVhYmlfW21vZGVdZGl2bW9kIChvcDAsIG9wMSkuICAqLworCitzdGF0aWMg dm9pZAorYXJtX2V4cGFuZF9kaXZtb2RfbGliZnVuYyAoYm9vbCB1bnNpZ25l ZHAsIG1hY2hpbmVfbW9kZSBtb2RlLAorCQkJICAgcnR4IG9wMCwgcnR4IG9w MSwKKwkJCSAgIHJ0eCAqcXVvdF9wLCBydHggKnJlbV9wKQoreworICBpZiAo bW9kZSA9PSBTSW1vZGUpCisgICAgZ2NjX2Fzc2VydCAoIVRBUkdFVF9JRElW KTsKKworICBvcHRhYiB0YWIgPSAodW5zaWduZWRwKSA/IHVkaXZtb2Rfb3B0 YWIgOiBzZGl2bW9kX29wdGFiOworICBydHggbGliZnVuYyA9IG9wdGFiX2xp YmZ1bmMgKHRhYiwgbW9kZSk7CisgIGdjY19hc3NlcnQgKGxpYmZ1bmMpOwor CisgIG1hY2hpbmVfbW9kZSBsaWJ2YWxfbW9kZSA9IHNtYWxsZXN0X21vZGVf Zm9yX3NpemUgKDIgKiBHRVRfTU9ERV9CSVRTSVpFIChtb2RlKSwKKwkJCQkJ CSAgICAgTU9ERV9JTlQpOworCisgIHJ0eCBsaWJ2YWwgPSBlbWl0X2xpYnJh cnlfY2FsbF92YWx1ZSAobGliZnVuYywgTlVMTF9SVFgsIExDVF9DT05TVCwK KwkJCQkJbGlidmFsX21vZGUsIDIsCisJCQkJCW9wMCwgR0VUX01PREUgKG9w MCksCisJCQkJCW9wMSwgR0VUX01PREUgKG9wMSkpOworCisgIHJ0eCBxdW90 aWVudCA9IHNpbXBsaWZ5X2dlbl9zdWJyZWcgKG1vZGUsIGxpYnZhbCwgbGli dmFsX21vZGUsIDApOworICBydHggcmVtYWluZGVyID0gc2ltcGxpZnlfZ2Vu X3N1YnJlZyAobW9kZSwgbGlidmFsLCBsaWJ2YWxfbW9kZSwgR0VUX01PREVf U0laRSAobW9kZSkpOworCisgIGdjY19hc3NlcnQgKHF1b3RpZW50KTsKKyAg Z2NjX2Fzc2VydCAocmVtYWluZGVyKTsKKyAgCisgICpxdW90X3AgPSBxdW90 aWVudDsKKyAgKnJlbV9wID0gcmVtYWluZGVyOworfQogCiAvKiBDb25zdHJ1 Y3QgYW5kIHJldHVybiBhIFBBUkFMTEVMIFJUWCB2ZWN0b3Igd2l0aCBlbGVt ZW50cyBudW1iZXJpbmcgdGhlCiAgICBsYW5lcyBvZiBlaXRoZXIgdGhlIGhp Z2ggKEhJR0ggPT0gVFJVRSkgb3IgbG93IChISUdIID09IEZBTFNFKSBoYWxm IG9mCmRpZmYgLS1naXQgYS9nY2MvZG9jL3RtLnRleGkgYi9nY2MvZG9jL3Rt LnRleGkKaW5kZXggOGM3ZjJhMS4uMTExZjE5ZiAxMDA2NDQKLS0tIGEvZ2Nj L2RvYy90bS50ZXhpCisrKyBiL2djYy9kb2MvdG0udGV4aQpAQCAtNjk2Myw2 ICs2OTYzLDEyIEBAIFRoaXMgaXMgZmlyc3RseSBpbnRyb2R1Y2VkIG9uIEFS TS9BQXJjaDY0IHRhcmdldHMsIHBsZWFzZSByZWZlciB0bwogdGhlIGhvb2sg aW1wbGVtZW50YXRpb24gZm9yIGhvdyBkaWZmZXJlbnQgZnVzaW9uIHR5cGVz IGFyZSBzdXBwb3J0ZWQuCiBAZW5kIGRlZnR5cGVmbgogCitAZGVmdHlwZWZu IHtUYXJnZXQgSG9va30gdm9pZCBUQVJHRVRfRVhQQU5EX0RJVk1PRF9MSUJG VU5DIChib29sIEB2YXJ7dW5zaWduZWRwfSwgbWFjaGluZV9tb2RlIEB2YXJ7 bW9kZX0sIEB2YXJ7cnR4fSwgQHZhcntydHh9LCBydHggKkB2YXJ7cXVvdH0s IHJ0eCAqQHZhcntyZW19KQorRGVmaW5lIHRoaXMgaG9vayBpZiB0aGUgcG9y dCBkb2VzIG5vdCBoYXZlIGhhcmR3YXJlIGRpdiBhbmQgZGl2bW9kIGluc24g Zm9yCit0aGUgZ2l2ZW4gbW9kZSBidXQgaGFzIGRpdm1vZCBsaWJmdW5jLCB3 aGljaCBpcyBpbmNvbXBhdGlibGUKK3dpdGggbGliZ2NjMi5jOl9fdWRpdm1v ZGRpNAorQGVuZCBkZWZ0eXBlZm4KKwogQG5vZGUgU2VjdGlvbnMKIEBzZWN0 aW9uIERpdmlkaW5nIHRoZSBPdXRwdXQgaW50byBTZWN0aW9ucyAoVGV4dHMs IERhdGEsIEBkb3Rze30pCiBAYyB0aGUgYWJvdmUgc2VjdGlvbiB0aXRsZSBp cyBXQVkgdG9vIGxvbmcuICBtYXliZSBjdXQgdGhlIHBhcnQgYmV0d2Vlbgpk aWZmIC0tZ2l0IGEvZ2NjL2RvYy90bS50ZXhpLmluIGIvZ2NjL2RvYy90bS50 ZXhpLmluCmluZGV4IGY5NjNhNTguLjJjOWE4MDAgMTAwNjQ0Ci0tLSBhL2dj Yy9kb2MvdG0udGV4aS5pbgorKysgYi9nY2MvZG9jL3RtLnRleGkuaW4KQEAg LTQ4NDgsNiArNDg0OCw4IEBAIHRoZW06IHRyeSB0aGUgZmlyc3Qgb25lcyBp biB0aGlzIGxpc3QgZmlyc3QuCiAKIEBob29rIFRBUkdFVF9TQ0hFRF9GVVNJ T05fUFJJT1JJVFkKIAorQGhvb2sgVEFSR0VUX0VYUEFORF9ESVZNT0RfTElC RlVOQworCiBAbm9kZSBTZWN0aW9ucwogQHNlY3Rpb24gRGl2aWRpbmcgdGhl IE91dHB1dCBpbnRvIFNlY3Rpb25zIChUZXh0cywgRGF0YSwgQGRvdHN7fSkK IEBjIHRoZSBhYm92ZSBzZWN0aW9uIHRpdGxlIGlzIFdBWSB0b28gbG9uZy4g IG1heWJlIGN1dCB0aGUgcGFydCBiZXR3ZWVuCmRpZmYgLS1naXQgYS9nY2Mv aW50ZXJuYWwtZm4uYyBiL2djYy9pbnRlcm5hbC1mbi5jCmluZGV4IGM4Njdk ZGMuLjBjYjU5ZjcgMTAwNjQ0Ci0tLSBhL2djYy9pbnRlcm5hbC1mbi5jCisr KyBiL2djYy9pbnRlcm5hbC1mbi5jCkBAIC0yMjc2LDYgKzIyNzYsNDggQEAg bXVsdGlfdmVjdG9yX29wdGFiX3N1cHBvcnRlZF9wIChjb252ZXJ0X29wdGFi IG9wdGFiLCB0cmVlX3BhaXIgdHlwZXMsCiAjZGVmaW5lIGRpcmVjdF9tYXNr X3N0b3JlX29wdGFiX3N1cHBvcnRlZF9wIGRpcmVjdF9vcHRhYl9zdXBwb3J0 ZWRfcAogI2RlZmluZSBkaXJlY3Rfc3RvcmVfbGFuZXNfb3B0YWJfc3VwcG9y dGVkX3AgbXVsdGlfdmVjdG9yX29wdGFiX3N1cHBvcnRlZF9wCiAKKy8qIEV4 cGFuZCBESVZNT0QoKSB1c2luZzoKKyBhKSBvcHRhYiBoYW5kbGVyIGZvciB1 ZGl2bW9kL3NkaXZtb2QgaWYgaXQgaXMgYXZhaWxhYmxlLgorIGIpIElmIG9w dGFiX2hhbmRsZXIgZG9lc24ndCBleGlzdCwgR2VuZXJhdGUgY2FsbCB0bwor ICAgIG9wdGFiX2xpYmZ1bmMgZm9yIHVkaXZtb2Qvc2Rpdm1vZC4gICovCisK K3N0YXRpYyB2b2lkIAorZXhwYW5kX0RJVk1PRCAoaW50ZXJuYWxfZm4sIGdj YWxsICpzdG10KQoreworICB0cmVlIGxocyA9IGdpbXBsZV9jYWxsX2xocyAo c3RtdCk7CisgIHRyZWUgYXJnMCA9IGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwg MCk7CisgIHRyZWUgYXJnMSA9IGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMSk7 CisKKyAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGxocykp ID09IENPTVBMRVhfVFlQRSk7CisgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAo VFJFRV9UWVBFIChsaHMpKTsKKyAgbWFjaGluZV9tb2RlIG1vZGUgPSBUWVBF X01PREUgKHR5cGUpOworICBib29sIHVuc2lnbmVkcCA9IFRZUEVfVU5TSUdO RUQgKHR5cGUpOworICBvcHRhYiB0YWIgPSAodW5zaWduZWRwKSA/IHVkaXZt b2Rfb3B0YWIgOiBzZGl2bW9kX29wdGFiOworCisgIHJ0eCBvcDAgPSBleHBh bmRfbm9ybWFsIChhcmcwKTsKKyAgcnR4IG9wMSA9IGV4cGFuZF9ub3JtYWwg KGFyZzEpOworICBydHggdGFyZ2V0ID0gZXhwYW5kX2V4cHIgKGxocywgTlVM TF9SVFgsIFZPSURtb2RlLCBFWFBBTkRfV1JJVEUpOworCisgIHJ0eCBxdW90 aWVudCwgcmVtYWluZGVyOworCisgIC8qIENoZWNrIGlmIG9wdGFiIGhhbmRs ZXIgZXhpc3RzIGZvciBbdV1kaXZtb2QuICAqLworICBpZiAob3B0YWJfaGFu ZGxlciAodGFiLCBtb2RlKSAhPSBDT0RFX0ZPUl9ub3RoaW5nKQorICAgIHsK KyAgICAgIHF1b3RpZW50ID0gZ2VuX3JlZ19ydHggKG1vZGUpOworICAgICAg cmVtYWluZGVyID0gZ2VuX3JlZ19ydHggKG1vZGUpOworICAgICAgZXhwYW5k X3R3b3ZhbF9iaW5vcCAodGFiLCBvcDAsIG9wMSwgcXVvdGllbnQsIHJlbWFp bmRlciwgdW5zaWduZWRwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0YXJnZXRt LmV4cGFuZF9kaXZtb2RfbGliZnVuYyAodW5zaWduZWRwLCBtb2RlLCBvcDAs IG9wMSwKKwkJCQkgICAmcXVvdGllbnQsICZyZW1haW5kZXIpOworCisgIC8q IFdyYXAgdGhlIHJldHVybiB2YWx1ZSAocXVvdGllbnQsIHJlbWFpbmRlcikg d2l0aGluIENPTVBMRVhfRVhQUi4gICovCisgIGV4cGFuZF9leHByIChidWls ZDIgKENPTVBMRVhfRVhQUiwgVFJFRV9UWVBFIChsaHMpLAorCQkgICAgICAg bWFrZV90cmVlIChUUkVFX1RZUEUgKGFyZzApLCBxdW90aWVudCksCisJCSAg ICAgICBtYWtlX3RyZWUgKFRSRUVfVFlQRSAoYXJnMSksIHJlbWFpbmRlcikp LAorCSAgICAgICB0YXJnZXQsIFZPSURtb2RlLCBFWFBBTkRfTk9STUFMKTsK K30KKwogLyogUmV0dXJuIHRydWUgaWYgRk4gaXMgc3VwcG9ydGVkIGZvciB0 aGUgdHlwZXMgaW4gVFlQRVMgd2hlbiB0aGUKICAgIG9wdGltaXphdGlvbiB0 eXBlIGlzIE9QVF9UWVBFLiAgVGhlIHR5cGVzIGFyZSB0aG9zZSBhc3NvY2lh dGVkIHdpdGgKICAgIHRoZSAidHlwZTAiIGFuZCAidHlwZTEiIGZpZWxkcyBv ZiBGTidzIGRpcmVjdF9pbnRlcm5hbF9mbl9pbmZvCmRpZmYgLS1naXQgYS9n Y2MvaW50ZXJuYWwtZm4uZGVmIGIvZ2NjL2ludGVybmFsLWZuLmRlZgppbmRl eCBlNzI5ZDg1Li41NmE4MGYxIDEwMDY0NAotLS0gYS9nY2MvaW50ZXJuYWwt Zm4uZGVmCisrKyBiL2djYy9pbnRlcm5hbC1mbi5kZWYKQEAgLTE5NCw2ICsx OTQsOSBAQCBERUZfSU5URVJOQUxfRk4gKEFUT01JQ19CSVRfVEVTVF9BTkRf U0VULCBFQ0ZfTEVBRiB8IEVDRl9OT1RIUk9XLCBOVUxMKQogREVGX0lOVEVS TkFMX0ZOIChBVE9NSUNfQklUX1RFU1RfQU5EX0NPTVBMRU1FTlQsIEVDRl9M RUFGIHwgRUNGX05PVEhST1csIE5VTEwpCiBERUZfSU5URVJOQUxfRk4gKEFU T01JQ19CSVRfVEVTVF9BTkRfUkVTRVQsIEVDRl9MRUFGIHwgRUNGX05PVEhS T1csIE5VTEwpCiAKKy8qIERpdm1vZCBmdW5jdGlvbi4gICovCitERUZfSU5U RVJOQUxfRk4gKERJVk1PRCwgRUNGX0NPTlNUIHwgRUNGX0xFQUYsIE5VTEwp CisKICN1bmRlZiBERUZfSU5URVJOQUxfSU5UX0ZOCiAjdW5kZWYgREVGX0lO VEVSTkFMX0ZMVF9GTgogI3VuZGVmIERFRl9JTlRFUk5BTF9PUFRBQl9GTgpk aWZmIC0tZ2l0IGEvZ2NjL3RhcmdldC5kZWYgYi9nY2MvdGFyZ2V0LmRlZgpp bmRleCA2MzkyZTczLi40NDk2ZjlhIDEwMDY0NAotLS0gYS9nY2MvdGFyZ2V0 LmRlZgorKysgYi9nY2MvdGFyZ2V0LmRlZgpAQCAtNDk0OCw2ICs0OTQ4LDE2 IEBAIE5vcm1hbGx5LCB0aGlzIGlzIG5vdCBuZWVkZWQuIiwKICBib29sLCAo Y29uc3RfdHJlZSBmaWVsZCwgbWFjaGluZV9tb2RlIG1vZGUpLAogIGRlZmF1 bHRfbWVtYmVyX3R5cGVfZm9yY2VzX2JsaykKIAorLyogU2VlIHRyZWUtc3Nh LW1hdGgtb3B0cy5jOmRpdm1vZF9jYW5kaWRhdGVfcCBmb3IgY29uZGl0aW9u cyB0aGF0IGdhdGUKKyAgIHRoZSBkaXZtb2QgdHJhbnNmb3JtLiAgKi8KK0RF RkhPT0sKKyhleHBhbmRfZGl2bW9kX2xpYmZ1bmMsCisgIkRlZmluZSB0aGlz IGhvb2sgaWYgdGhlIHBvcnQgZG9lcyBub3QgaGF2ZSBoYXJkd2FyZSBkaXYg YW5kIGRpdm1vZCBpbnNuIGZvclxuXAordGhlIGdpdmVuIG1vZGUgYnV0IGhh cyBkaXZtb2QgbGliZnVuYywgd2hpY2ggaXMgaW5jb21wYXRpYmxlXG5cCit3 aXRoIGxpYmdjYzIuYzpfX3VkaXZtb2RkaTQiLAorIHZvaWQsIChib29sIHVu c2lnbmVkcCwgbWFjaGluZV9tb2RlIG1vZGUsIHJ0eCwgcnR4LCBydHggKnF1 b3QsIHJ0eCAqcmVtKSwKKyBkZWZhdWx0X2V4cGFuZF9kaXZtb2RfbGliZnVu YykKKwogLyogUmV0dXJuIHRoZSBjbGFzcyBmb3IgYSBzZWNvbmRhcnkgcmVs b2FkLCBhbmQgZmlsbCBpbiBleHRyYSBpbmZvcm1hdGlvbi4gICovCiBERUZI T09LCiAoc2Vjb25kYXJ5X3JlbG9hZCwKZGlmZiAtLWdpdCBhL2djYy90YXJn aG9va3MuYyBiL2djYy90YXJnaG9va3MuYwppbmRleCA2YjQ2MDFiLi4yMDMy N2E2IDEwMDY0NAotLS0gYS9nY2MvdGFyZ2hvb2tzLmMKKysrIGIvZ2NjL3Rh cmdob29rcy5jCkBAIC0xOTY1LDQgKzE5NjUsMzEgQEAgZGVmYXVsdF9vcHRh Yl9zdXBwb3J0ZWRfcCAoaW50LCBtYWNoaW5lX21vZGUsIG1hY2hpbmVfbW9k ZSwgb3B0aW1pemF0aW9uX3R5cGUpCiAgIHJldHVybiB0cnVlOwogfQogCisv KiBHZW5lcmF0ZSBjYWxsIHRvCisgICBESW1vZGUgX191ZGl2bW9kZGk0IChE SW1vZGUgb3AwLCBESW1vZGUgb3AxLCBESW1vZGUgKnJlbSkuICAqLworCit2 b2lkCitkZWZhdWx0X2V4cGFuZF9kaXZtb2RfbGliZnVuYyAoYm9vbCB1bnNp Z25lZHAsIG1hY2hpbmVfbW9kZSBtb2RlLAorCQkJICAgICAgIHJ0eCBvcDAs IHJ0eCBvcDEsCisJCQkgICAgICAgcnR4ICpxdW90X3AsIHJ0eCAqcmVtX3Ap Cit7CisgIGdjY19hc3NlcnQgKG1vZGUgPT0gREltb2RlKTsKKyAgZ2NjX2Fz c2VydCAodW5zaWduZWRwKTsKKworICBydHggbGliZnVuYyA9IG9wdGFiX2xp YmZ1bmMgKHVkaXZtb2Rfb3B0YWIsIERJbW9kZSk7CisgIGdjY19hc3NlcnQg KGxpYmZ1bmMpOworCisgIHJ0eCByZW1haW5kZXIgPSBhc3NpZ25fc3RhY2tf dGVtcCAoREltb2RlLCBHRVRfTU9ERV9TSVpFIChESW1vZGUpKTsKKyAgcnR4 IGFkZHJlc3MgPSBYRVhQIChyZW1haW5kZXIsIDApOworCisgIHJ0eCBxdW90 aWVudCA9IGVtaXRfbGlicmFyeV9jYWxsX3ZhbHVlIChsaWJmdW5jLCBOVUxM X1JUWCwgTENUX0NPTlNULAorCQkJCQkgIERJbW9kZSwgMywKKwkJCQkJICBv cDAsIEdFVF9NT0RFIChvcDApLAorCQkJCQkgIG9wMSwgR0VUX01PREUgKG9w MSksCisJCQkJCSAgYWRkcmVzcywgR0VUX01PREUgKGFkZHJlc3MpKTsKKwor ICAqcXVvdF9wID0gcXVvdGllbnQ7CisgICpyZW1fcCA9IHJlbWFpbmRlcjsK K30KKwogI2luY2x1ZGUgImd0LXRhcmdob29rcy5oIgpkaWZmIC0tZ2l0IGEv Z2NjL3Rhcmdob29rcy5oIGIvZ2NjL3Rhcmdob29rcy5oCmluZGV4IDc2ODdj MzkuLmRjNWU4ZTcgMTAwNjQ0Ci0tLSBhL2djYy90YXJnaG9va3MuaAorKysg Yi9nY2MvdGFyZ2hvb2tzLmgKQEAgLTI1NCw0ICsyNTQsNyBAQCBleHRlcm4g dm9pZCBkZWZhdWx0X3NldHVwX2luY29taW5nX3ZhcmFyZ19ib3VuZHMgKGN1 bXVsYXRpdmVfYXJnc190IGNhIEFUVFJJQlVURQogZXh0ZXJuIGJvb2wgZGVm YXVsdF9vcHRhYl9zdXBwb3J0ZWRfcCAoaW50LCBtYWNoaW5lX21vZGUsIG1h Y2hpbmVfbW9kZSwKIAkJCQkgICAgICAgb3B0aW1pemF0aW9uX3R5cGUpOwog CitleHRlcm4gdm9pZCBkZWZhdWx0X2V4cGFuZF9kaXZtb2RfbGliZnVuYyAo Ym9vbCwgbWFjaGluZV9tb2RlLAorCQkJCQkgICBydHgsIHJ0eCwgcnR4ICos IHJ0eCAqKTsKKwogI2VuZGlmIC8qIEdDQ19UQVJHSE9PS1NfSCAqLwpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTEtc2ltb2Rl LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZtb2QtMS1zaW1vZGUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1ZjY2Ci0t LSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9k LTEtc2ltb2RlLmMKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1yZXF1aXJl LWVmZmVjdGl2ZS10YXJnZXQgZGl2bW9kX3NpbW9kZSB9ICovCisvKiB7IGRn LW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS13aWRlbmluZ19tdWwtZGV0YWls cyIgfSAqLworLyogZGl2IGRvbWluYXRlcyBtb2QuICAqLworCitleHRlcm4g aW50IGNvbmQ7Cit2b2lkIGZvbyh2b2lkKTsKKworI2RlZmluZSBGT08oc21h bGx0eXBlLCBiaWd0eXBlLCBubykgIFwKK2JpZ3R5cGUgZl8jI25vKHNtYWxs dHlwZSB4LCBiaWd0eXBlIHkpIFwKK3sJCQkJCSBcCisgIGJpZ3R5cGUgcSA9 IHggLyB5OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGNvbmQpICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvbyAoKTsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJpZ3R5cGUgciA9IHgg JSB5OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHEgKyByOyAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGT08oaW50LCBpbnQs IDEpCitGT08oaW50LCB1bnNpZ25lZCwgMikKK0ZPTyh1bnNpZ25lZCwgdW5z aWduZWQsIDUpCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10 aW1lcyAiRElWTU9EIiAzICJ3aWRlbmluZ19tdWwiIH0gfSAqLwpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTEuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uNDBhZWM3NAotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC0xLmMKQEAgLTAsMCArMSwy NiBAQAorLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgZGl2bW9k IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLXdpZGVu aW5nX211bC1kZXRhaWxzIiB9ICovCisvKiBkaXYgZG9taW5hdGVzIG1vZC4g ICovCisKK2V4dGVybiBpbnQgY29uZDsKK3ZvaWQgZm9vKHZvaWQpOworCisj ZGVmaW5lIEZPTyhzbWFsbHR5cGUsIGJpZ3R5cGUsIG5vKQkgXAorYmlndHlw ZSBmXyMjbm8oc21hbGx0eXBlIHgsIGJpZ3R5cGUgeSkgICBcCit7CQkJCQkg XAorICBiaWd0eXBlIHEgPSB4IC8geTsgICAgICAgICAgICAgICAgICAgICBc CisgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICBmb28gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICBiaWd0eXBlIHIgPSB4ICUgeTsgICAgICAgICAgICAgICAgICAgICBcCisg IHJldHVybiBxICsgcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30K KworRk9PKGludCwgbG9uZyBsb25nLCAzKQorRk9PKGludCwgdW5zaWduZWQg bG9uZyBsb25nLCA0KQorRk9PKHVuc2lnbmVkLCBsb25nIGxvbmcsIDYpCitG T08odW5zaWduZWQsIHVuc2lnbmVkIGxvbmcgbG9uZywgNykKK0ZPTyhsb25n IGxvbmcsIGxvbmcgbG9uZywgOCkKK0ZPTyhsb25nIGxvbmcsIHVuc2lnbmVk IGxvbmcgbG9uZywgOSkKK0ZPTyh1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2ln bmVkIGxvbmcgbG9uZywgMTApCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRy ZWUtZHVtcC10aW1lcyAiRElWTU9EIiA3ICJ3aWRlbmluZ19tdWwiIH0gfSAq LwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTIt c2ltb2RlLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZtb2QtMi1zaW1v ZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzgz MTNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv ZGl2bW9kLTItc2ltb2RlLmMKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1y ZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgZGl2bW9kX3NpbW9kZSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS13aWRlbmluZ19tdWwt ZGV0YWlscyIgfSAqLworLyogbW9kIGRvbWluYXRlcyBkaXYuICAqLworCitl eHRlcm4gaW50IGNvbmQ7Cit2b2lkIGZvbyh2b2lkKTsKKworI2RlZmluZSBG T08oc21hbGx0eXBlLCBiaWd0eXBlLCBubykgIFwKK2JpZ3R5cGUgZl8jI25v KHNtYWxsdHlwZSB4LCBiaWd0eXBlIHkpIFwKK3sJCQkJCSBcCisgIGJpZ3R5 cGUgciA9IHggJSB5OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGNv bmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvbyAo KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJpZ3R5cGUg cSA9IHggLyB5OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHEg KyByOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGT08oaW50 LCBpbnQsIDEpCitGT08oaW50LCB1bnNpZ25lZCwgMikKK0ZPTyh1bnNpZ25l ZCwgdW5zaWduZWQsIDUpCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcC10aW1lcyAiRElWTU9EIiAzICJ3aWRlbmluZ19tdWwiIH0gfSAqLwpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTIuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC0yLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyMjE2YwotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC0yLmMKQEAgLTAs MCArMSwyNiBAQAorLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQg ZGl2bW9kIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVl LXdpZGVuaW5nX211bC1kZXRhaWxzIiB9ICovCisvKiBtb2QgZG9taW5hdGVz IGRpdi4gICovCisKK2V4dGVybiBpbnQgY29uZDsKK3ZvaWQgZm9vKHZvaWQp OworCisjZGVmaW5lIEZPTyhzbWFsbHR5cGUsIGJpZ3R5cGUsIG5vKQkgXAor YmlndHlwZSBmXyMjbm8oc21hbGx0eXBlIHgsIGJpZ3R5cGUgeSkgICBcCit7 CQkJCQkgXAorICBiaWd0eXBlIHIgPSB4ICUgeTsgICAgICAgICAgICAgICAg ICAgICBcCisgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICBmb28gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICBiaWd0eXBlIHEgPSB4IC8geTsgICAgICAgICAgICAgICAgICAg ICBcCisgIHJldHVybiBxICsgcjsgICAgICAgICAgICAgICAgICAgICAgICAg IFwKK30KKworRk9PKGludCwgbG9uZyBsb25nLCAzKQorRk9PKGludCwgdW5z aWduZWQgbG9uZyBsb25nLCA0KQorRk9PKHVuc2lnbmVkLCBsb25nIGxvbmcs IDYpCitGT08odW5zaWduZWQsIHVuc2lnbmVkIGxvbmcgbG9uZywgNykKK0ZP Tyhsb25nIGxvbmcsIGxvbmcgbG9uZywgOCkKK0ZPTyhsb25nIGxvbmcsIHVu c2lnbmVkIGxvbmcgbG9uZywgOSkKK0ZPTyh1bnNpZ25lZCBsb25nIGxvbmcs IHVuc2lnbmVkIGxvbmcgbG9uZywgMTApCisKKy8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcC10aW1lcyAiRElWTU9EIiA3ICJ3aWRlbmluZ19tdWwi IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2 bW9kLTMtc2ltb2RlLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZtb2Qt My1zaW1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li42ZjBmNjNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvZGl2bW9kLTMtc2ltb2RlLmMKQEAgLTAsMCArMSwyMCBAQAorLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgZGl2bW9kX3NpbW9kZSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS13aWRlbmlu Z19tdWwtZGV0YWlscyIgfSAqLworLyogZGl2IGNvbWVzIGJlZm9yZSBtb2Qg aW4gc2FtZSBiYi4gICovIAorCitleHRlcm4gaW50IGNvbmQ7Cit2b2lkIGZv byh2b2lkKTsKKworI2RlZmluZSBGT08oc21hbGx0eXBlLCBiaWd0eXBlLCBu bykgIAkgXAorYmlndHlwZSBmXyMjbm8oc21hbGx0eXBlIHgsIGJpZ3R5cGUg eSkJIFwKK3sJCQkJCSBcCisgIGJpZ3R5cGUgcSA9IHggLyB5OyAgICAgICAg ICAgICAgICAgICAgIFwKKyAgYmlndHlwZSByID0geCAlIHk7ICAgICAgICAg ICAgICAgICAgICAgXAorICByZXR1cm4gcSArIHI7ICAgICAgICAgICAgICAg ICAgICAgICAgICBcCit9CisKK0ZPTyhpbnQsIGludCwgMSkKK0ZPTyhpbnQs IHVuc2lnbmVkLCAyKQorRk9PKHVuc2lnbmVkLCB1bnNpZ25lZCwgNSkKKwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJESVZNT0Qi IDMgIndpZGVuaW5nX211bCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy9kaXZtb2QtMy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvZGl2bW9kLTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi45ZmU2ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvZGl2bW9kLTMuYwpAQCAtMCwwICsxLDI0IEBACisvKiB7IGRn LXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBkaXZtb2QgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLWZkdW1wLXRyZWUtd2lkZW5pbmdfbXVsLWRldGFp bHMiIH0gKi8KKy8qIGRpdiBjb21lcyBiZWZvcmUgbW9kIGluIHNhbWUgYmIu ICAqLyAKKworZXh0ZXJuIGludCBjb25kOwordm9pZCBmb28odm9pZCk7CisK KyNkZWZpbmUgRk9PKHNtYWxsdHlwZSwgYmlndHlwZSwgbm8pICAgICAgXAor YmlndHlwZSBmXyMjbm8oc21hbGx0eXBlIHgsIGJpZ3R5cGUgeSkgICBcCit7 CQkJCQkgXAorICBiaWd0eXBlIHEgPSB4IC8geTsgICAgICAgICAgICAgICAg ICAgICBcCisgIGJpZ3R5cGUgciA9IHggJSB5OyAgICAgICAgICAgICAgICAg ICAgIFwKKyAgcmV0dXJuIHEgKyByOyAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorfQorCitGT08oaW50LCBsb25nIGxvbmcsIDMpCitGT08oaW50LCB1 bnNpZ25lZCBsb25nIGxvbmcsIDQpCitGT08odW5zaWduZWQsIGxvbmcgbG9u ZywgNikKK0ZPTyh1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyBsb25nLCA3KQor Rk9PKGxvbmcgbG9uZywgbG9uZyBsb25nLCA4KQorRk9PKGxvbmcgbG9uZywg dW5zaWduZWQgbG9uZyBsb25nLCA5KQorRk9PKHVuc2lnbmVkIGxvbmcgbG9u ZywgdW5zaWduZWQgbG9uZyBsb25nLCAxMCkKKworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJESVZNT0QiIDcgIndpZGVuaW5nX211 bCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9k aXZtb2QtNC1zaW1vZGUuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1v ZC00LXNpbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLjljMzI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy9kaXZtb2QtNC1zaW1vZGUuYwpAQCAtMCwwICsxLDIwIEBACisv KiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBkaXZtb2Rfc2ltb2Rl IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLXdpZGVu aW5nX211bC1kZXRhaWxzIiB9ICovCisvKiBtb2QgY29tZXMgYmVmb3JlIGRp diBpbiBzYW1lIGJiLiAgKi8gCisKK2V4dGVybiBpbnQgY29uZDsKK3ZvaWQg Zm9vKHZvaWQpOworCisjZGVmaW5lIEZPTyhzbWFsbHR5cGUsIGJpZ3R5cGUs IG5vKSAgICAgIFwKK2JpZ3R5cGUgZl8jI25vKHNtYWxsdHlwZSB4LCBiaWd0 eXBlIHkpICAgXAorewkJCQkJIFwKKyAgYmlndHlwZSByID0geCAlIHk7ICAg ICAgICAgICAgICAgICAgICAgXAorICBiaWd0eXBlIHEgPSB4IC8geTsgICAg ICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBxICsgcjsgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKK30KKworRk9PKGludCwgaW50LCAxKQorRk9P KGludCwgdW5zaWduZWQsIDIpCitGT08odW5zaWduZWQsIHVuc2lnbmVkLCA1 KQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIkRJ Vk1PRCIgMyAid2lkZW5pbmdfbXVsIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC00LmMgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy9kaXZtb2QtNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLmE1Njg2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVz dHN1aXRlL2djYy5kZy9kaXZtb2QtNC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8q IHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGRpdm1vZCB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS13aWRlbmluZ19tdWwt ZGV0YWlscyIgfSAqLworLyogbW9kIGNvbWVzIGJlZm9yZSBkaXYgaW4gc2Ft ZSBiYi4gICovIAorCitleHRlcm4gaW50IGNvbmQ7Cit2b2lkIGZvbyh2b2lk KTsKKworI2RlZmluZSBGT08oc21hbGx0eXBlLCBiaWd0eXBlLCBubykJXAor YmlndHlwZSBmXyMjbm8oc21hbGx0eXBlIHgsIGJpZ3R5cGUgeSkgIFwKK3sJ CQkJCVwKKyAgYmlndHlwZSByID0geCAlIHk7ICAgICAgICAgICAgICAgICAg ICBcCisgIGJpZ3R5cGUgcSA9IHggLyB5OyAgICAgICAgICAgICAgICAgICAg XAorICByZXR1cm4gcSArIHI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwK K30KKworRk9PKGludCwgbG9uZyBsb25nLCAzKQorRk9PKGludCwgdW5zaWdu ZWQgbG9uZyBsb25nLCA0KQorRk9PKHVuc2lnbmVkLCBsb25nIGxvbmcsIDYp CitGT08odW5zaWduZWQsIHVuc2lnbmVkIGxvbmcgbG9uZywgNykKK0ZPTyhs b25nIGxvbmcsIGxvbmcgbG9uZywgOCkKK0ZPTyhsb25nIGxvbmcsIHVuc2ln bmVkIGxvbmcgbG9uZywgOSkKK0ZPTyh1bnNpZ25lZCBsb25nIGxvbmcsIHVu c2lnbmVkIGxvbmcgbG9uZywgMTApCisKKy8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcC10aW1lcyAiRElWTU9EIiA3ICJ3aWRlbmluZ19tdWwiIH0g fSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9k LTUuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC01LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4Y2VlNQotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC01LmMK QEAgLTAsMCArMSwxOSBAQAorLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10 YXJnZXQgZGl2bW9kX3NpbW9kZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MiAtZmR1bXAtdHJlZS13aWRlbmluZ19tdWwtZGV0YWlscyIgfSAqLworLyog ZGl2IGFuZCBtb2QgYXJlIG5vdCBpbiBzYW1lIGJiIGFuZAorICAgYmIncyBj b250YWluaW5nIGRpdiBhbmQgbW9kIGRvbid0IGRvbWluYXRlIGVhY2ggb3Ro ZXIuICAqLworCitpbnQgZihpbnQgeCwgaW50IHkpCit7CisgIGludCBxID0g MDsKKyAgaW50IHIgPSAwOworICBleHRlcm4gaW50IGNvbmQ7CisKKyAgaWYg KGNvbmQpCisgICAgcSA9IHggLyB5OworCisgIHIgPSB4ICUgeTsKKyAgcmV0 dXJuIHEgKyByOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtdGltZXMgIkRJVk1PRCIgMCAid2lkZW5pbmdfbXVsIiB9IH0gKi8KZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1vZC02LXNpbW9k ZS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTYtc2ltb2RlLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNmZhMwot LS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2Rpdm1v ZC02LXNpbW9kZS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIHsgZGctcmVxdWly ZS1lZmZlY3RpdmUtdGFyZ2V0IGRpdm1vZF9zaW1vZGUgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLWZkdW1wLXRyZWUtd2lkZW5pbmdfbXVsLWRldGFp bHMiIH0gKi8KKworCitleHRlcm4gaW50IGNvbmQ7Cit2b2lkIGZvbyh2b2lk KTsKKworI2RlZmluZSBGT08oc21hbGx0eXBlLCBiaWd0eXBlLCBubykgIFwK K2JpZ3R5cGUgZl8jI25vKHNtYWxsdHlwZSB4LCBiaWd0eXBlIHkpIFwKK3sJ CQkJCSBcCisgIGJpZ3R5cGUgcSA9IHggLyB5OyAgICAgICAgICAgICAgICAg ICAgIFwKKyAgYmlndHlwZSByMSA9IDAsIHIyID0gMDsgICAgICAgICAgICAg ICAgXAorICBpZiAoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgcjEgPSB4ICUgeTsgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorICAgIHIyID0geCAlIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgIHJldHVybiBxICsgcjEgKyByMjsgICAgICAgICAgICAgICAgICAgIFwK K30KKworRk9PKGludCwgaW50LCAxKQorRk9PKGludCwgdW5zaWduZWQsIDIp CitGT08odW5zaWduZWQsIHVuc2lnbmVkLCA1KQorCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIkRJVk1PRCIgMyAid2lkZW5pbmdf bXVsIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRn L2Rpdm1vZC02LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZtb2QtNi5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTQzMjEK LS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZt b2QtNi5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIHsgZGctcmVxdWlyZS1lZmZl Y3RpdmUtdGFyZ2V0IGRpdm1vZCB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MiAtZmR1bXAtdHJlZS13aWRlbmluZ19tdWwtZGV0YWlscyIgfSAqLworCitl eHRlcm4gaW50IGNvbmQ7Cit2b2lkIGZvbyh2b2lkKTsKKworI2RlZmluZSBG T08oc21hbGx0eXBlLCBiaWd0eXBlLCBubykJIFwKK2JpZ3R5cGUgZl8jI25v KHNtYWxsdHlwZSB4LCBiaWd0eXBlIHkpICAgXAorewkJCQkJIFwKKyAgYmln dHlwZSBxID0geCAvIHk7ICAgICAgICAgICAgICAgICAgICAgXAorICBiaWd0 eXBlIHIxID0gMCwgcjIgPSAwOyAgICAgICAgICAgICAgICBcCisgIGlmIChj b25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByMSA9 IHggJSB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcjIgPSB4 ICUgeTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHEg KyByMSArIHIyOyAgICAgICAgICAgICAgICAgICAgXAorfQorCitGT08oaW50 LCBsb25nIGxvbmcsIDMpCitGT08oaW50LCB1bnNpZ25lZCBsb25nIGxvbmcs IDQpCitGT08odW5zaWduZWQsIGxvbmcgbG9uZywgNikKK0ZPTyh1bnNpZ25l ZCwgdW5zaWduZWQgbG9uZyBsb25nLCA3KQorRk9PKGxvbmcgbG9uZywgbG9u ZyBsb25nLCA4KQorRk9PKGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25n LCA5KQorRk9PKHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBs b25nLCAxMCkKKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRp bWVzICJESVZNT0QiIDcgIndpZGVuaW5nX211bCIgfSB9ICovCmRpZmYgLS1n aXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9kaXZtb2QtNy5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi5hNmU3ZmNkCi0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZGl2bW9kLTcuYwpAQCAtMCwwICsxLDIx IEBACisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBkaXZtb2Rf c2ltb2RlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVl LXdpZGVuaW5nX211bC1kZXRhaWxzIiB9ICovCisKK2ludCBmKGludCB4LCBp bnQgeSkKK3sKKyAgaW50IHEgPSAwLCByMSA9IDAsIHIyID0gMDsKKyAgZXh0 ZXJuIGludCBjb25kOworCisgIGlmIChjb25kKQorICAgIHEgPSB4IC8geTsK KyAgZWxzZQorICAgIHsKKyAgICAgIHIxID0geCAlIHk7CisgICAgICByZXR1 cm4gcSArIHIxOworICAgIH0KKworICByMiA9IHggJSB5OworICByZXR1cm4g cSArIHIyOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgIkRJVk1PRCIgMCAid2lkZW5pbmdfbXVsIiB9IH0gKi8KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvbGliL3RhcmdldC1zdXBwb3J0cy5leHAg Yi9nY2MvdGVzdHN1aXRlL2xpYi90YXJnZXQtc3VwcG9ydHMuZXhwCmluZGV4 IDA0Y2ExNzYuLmFkN2M0ODcgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUv bGliL3RhcmdldC1zdXBwb3J0cy5leHAKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9s aWIvdGFyZ2V0LXN1cHBvcnRzLmV4cApAQCAtNjk4NiwzICs2OTg2LDMyIEBA IHByb2MgY2hlY2tfZWZmZWN0aXZlX3RhcmdldF9vZmZsb2FkX2hzYSB7IH0g ewogCWludCBtYWluICgpIHtyZXR1cm4gMDt9CiAgICAgfSAiLWZvZmZsb2Fk PWhzYSIgXQogfQorCisjIEZvciBBUk0gY29uZmlncyBkZWZpbmluZyBfX0FS TV9BUkNIX0VYVF9JRElWX18sIGRpc2FibGUgZGl2bW9kX3NpbW9kZSB0ZXN0 LWNhc2VzLgorCitwcm9jIGNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfYXJtX2Rp dm1vZF9zaW1vZGUgeyB9IHsKKyAgICByZXR1cm4gW2NoZWNrX25vX2NvbXBp bGVyX21lc3NhZ2VzIGFybV9kaXZtb2QgYXNzZW1ibHkgeworCSNpZmRlZiBf X0FSTV9BUkNIX0VYVF9JRElWX18KKwkjZXJyb3IgaGFzIGRpdiBpbnNuCisJ I2VuZGlmCisJaW50IGk7CisgICAgfV0KK30KKworcHJvYyBjaGVja19lZmZl Y3RpdmVfdGFyZ2V0X2Rpdm1vZCB7IH0geworICAgICNUT0RPOiBBZGQgY2hl Y2tzIGZvciBhbGwgdGFyZ2V0cyB0aGF0IGhhdmUgZWl0aGVyIGhhcmR3YXJl IGRpdm1vZCBpbnNuCisgICAgIyBvciBkZWZpbmUgbGliZnVuYyBmb3IgZGl2 bW9kLgorICAgIGlmIHsgW2lzdGFyZ2V0IGFybSotKi0qXQorCSB8fCBbaXN0 YXJnZXQgeDg2XzY0LSotKl0gfSB7CisJcmV0dXJuIDEKKyAgICB9CisgICAg cmV0dXJuIDAKK30KKworcHJvYyBjaGVja19lZmZlY3RpdmVfdGFyZ2V0X2Rp dm1vZF9zaW1vZGUgeyB9IHsKKyAgICBpZiB7IFtpc3RhcmdldCBhcm0qLSot Kl0gfSB7CisJcmV0dXJuIFtjaGVja19lZmZlY3RpdmVfdGFyZ2V0X2FybV9k aXZtb2Rfc2ltb2RlXQorICAgIH0KKworICAgIHJldHVybiBbY2hlY2tfZWZm ZWN0aXZlX3RhcmdldF9kaXZtb2RdCit9CmRpZmYgLS1naXQgYS9nY2MvdHJl ZS1zc2EtbWF0aC1vcHRzLmMgYi9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmMK aW5kZXggODE2ODhjZC4uNGU1Y2QyYiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUt c3NhLW1hdGgtb3B0cy5jCisrKyBiL2djYy90cmVlLXNzYS1tYXRoLW9wdHMu YwpAQCAtMTEyLDYgKzExMiw5IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhl IGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAicGFyYW1z LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwtZm4uaCIKICNpbmNsdWRlICJjYXNl LWNmbi1tYWNyb3MuaCIKKyNpbmNsdWRlICJvcHRhYnMtbGliZnVuY3MuaCIK KyNpbmNsdWRlICJ0cmVlLWVoLmgiCisjaW5jbHVkZSAidGFyZ2hvb2tzLmgi CiAKIC8qIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgb25lIGJhc2ljIGJs b2NrIHRoYXQgZWl0aGVyIGNvbXB1dGVzIGEKICAgIGRpdmlzaW9uLCBvciBp cyBhIGNvbW1vbiBkb21pbmF0b3IgZm9yIGJhc2ljIGJsb2NrIHRoYXQgY29t cHV0ZSBhCkBAIC0xODQsNiArMTg3LDkgQEAgc3RhdGljIHN0cnVjdAogCiAg IC8qIE51bWJlciBvZiBmcCBmdXNlZCBtdWx0aXBseS1hZGQgb3BzIGluc2Vy dGVkLiAgKi8KICAgaW50IGZtYXNfaW5zZXJ0ZWQ7CisKKyAgLyogTnVtYmVy IG9mIGRpdm1vZCBjYWxscyBpbnNlcnRlZC4gICovCisgIGludCBkaXZtb2Rf Y2FsbHNfaW5zZXJ0ZWQ7CiB9IHdpZGVuX211bF9zdGF0czsKIAogLyogVGhl IGluc3RhbmNlIG9mICJzdHJ1Y3Qgb2NjdXJyZW5jZSIgcmVwcmVzZW50aW5n IHRoZSBoaWdoZXN0CkBAIC0zNzg0LDYgKzM3OTAsMjIyIEBAIG1hdGNoX3Vh ZGRzdWJfb3ZlcmZsb3cgKGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2ksIGdp bXBsZSAqc3RtdCwKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8qIFJldHVybiB0 cnVlIGlmIHRhcmdldCBoYXMgc3VwcG9ydCBmb3IgZGl2bW9kLiAgKi8KKwor c3RhdGljIGJvb2wKK3RhcmdldF9zdXBwb3J0c19kaXZtb2RfcCAob3B0YWIg ZGl2bW9kX29wdGFiLCBvcHRhYiBkaXZfb3B0YWIsIG1hY2hpbmVfbW9kZSBt b2RlKSAKK3sKKyAgLyogSWYgdGFyZ2V0IHN1cHBvcnRzIGhhcmR3YXJlIGRp dm1vZCBpbnNuLCB1c2UgaXQgZm9yIGRpdm1vZC4gICovCisgIGlmIChvcHRh Yl9oYW5kbGVyIChkaXZtb2Rfb3B0YWIsIG1vZGUpICE9IENPREVfRk9SX25v dGhpbmcpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogQ2hlY2sgaWYgbGli ZnVuYyBmb3IgZGl2bW9kIGlzIGF2YWlsYWJsZS4gICovCisgIGlmIChvcHRh Yl9saWJmdW5jIChkaXZtb2Rfb3B0YWIsIG1vZGUpICE9IE5VTExfUlRYKQor ICAgIHsKKyAgICAgIC8qIElmIG9wdGFiX2hhbmRsZXIgZXhpc3RzIGZvciBk aXZfb3B0YWIsIHBlcmhhcHMgaW4gYSB3aWRlciBtb2RlLAorCSB3ZSBkb24n dCB3YW50IHRvIHVzZSB0aGUgbGliZnVuYyBldmVuIGlmIGl0IGV4aXN0cyBm b3IgZ2l2ZW4gbW9kZS4gICovIAorICAgICAgZm9yIChtYWNoaW5lX21vZGUg ZGl2X21vZGUgPSBtb2RlOworCSAgIGRpdl9tb2RlICE9IFZPSURtb2RlOwor CSAgIGRpdl9tb2RlID0gR0VUX01PREVfV0lERVJfTU9ERSAoZGl2X21vZGUp KQorCWlmIChvcHRhYl9oYW5kbGVyIChkaXZfb3B0YWIsIGRpdl9tb2RlKSAh PSBDT0RFX0ZPUl9ub3RoaW5nKQorCSAgcmV0dXJuIGZhbHNlOworCisgICAg ICByZXR1cm4gdHJ1ZTsgCisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30K KworLyogQ2hlY2sgaWYgc3RtdCBpcyBjYW5kaWRhdGUgZm9yIGRpdm1vZCB0 cmFuc2Zvcm0uICAqLworCitzdGF0aWMgYm9vbAorZGl2bW9kX2NhbmRpZGF0 ZV9wIChnYXNzaWduICpzdG10KQoreworICB0cmVlIHR5cGUgPSBUUkVFX1RZ UEUgKGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSk7CisgIGVudW0gbWFjaGlu ZV9tb2RlIG1vZGUgPSBUWVBFX01PREUgKHR5cGUpOworICBvcHRhYiBkaXZt b2Rfb3B0YWIsIGRpdl9vcHRhYjsKKworICBpZiAoVFlQRV9VTlNJR05FRCAo dHlwZSkpCisgICAgeworICAgICAgZGl2bW9kX29wdGFiID0gdWRpdm1vZF9v cHRhYjsKKyAgICAgIGRpdl9vcHRhYiA9IHVkaXZfb3B0YWI7CisgICAgfQor ICBlbHNlCisgICAgeworICAgICAgZGl2bW9kX29wdGFiID0gc2Rpdm1vZF9v cHRhYjsKKyAgICAgIGRpdl9vcHRhYiA9IHNkaXZfb3B0YWI7CisgICAgfQor CisgIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKKyAg dHJlZSBvcDIgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOworCisgIC8q IERpc2FibGUgdGhlIHRyYW5zZm9ybSBpZiBlaXRoZXIgaXMgYSBjb25zdGFu dCwgc2luY2UgZGl2aXNpb24tYnktY29uc3RhbnQKKyAgICAgbWF5IGhhdmUg c3BlY2lhbGl6ZWQgZXhwYW5zaW9uLiAgKi8KKyAgaWYgKENPTlNUQU5UX0NM QVNTX1AgKG9wMSkgfHwgQ09OU1RBTlRfQ0xBU1NfUCAob3AyKSkKKyAgICBy ZXR1cm4gZmFsc2U7CisKKyAgLyogRXhjbHVkZSB0aGUgY2FzZSB3aGVyZSBU WVBFX09WRVJGTE9XX1RSQVBTICh0eXBlKSBhcyB0aGF0IHNob3VsZAorICAg ICBleHBhbmQgdXNpbmcgdGhlIFtzdV1kaXZ2IG9wdGFicy4gICovCisgIGlm IChUWVBFX09WRVJGTE9XX1RSQVBTICh0eXBlKSkKKyAgICByZXR1cm4gZmFs c2U7CisgIAorICBpZiAoIXRhcmdldF9zdXBwb3J0c19kaXZtb2RfcCAoZGl2 bW9kX29wdGFiLCBkaXZfb3B0YWIsIG1vZGUpKSAKKyAgICByZXR1cm4gZmFs c2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24g bG9va3MgZm9yOgorICAgdDEgPSBhIFRSVU5DX0RJVl9FWFBSIGI7CisgICB0 MiA9IGEgVFJVTkNfTU9EX0VYUFIgYjsKKyAgIGFuZCB0cmFuc2Zvcm1zIGl0 IHRvIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisgICBjb21wbGV4X3RtcCA9 IERJVk1PRCAoYSwgYik7CisgICB0MSA9IFJFQUxQQVJUX0VYUFIoYSk7Cisg ICB0MiA9IElNQUdQQVJUX0VYUFIoYik7CisgICBGb3IgY29uZGl0aW9ucyBl bmFibGluZyB0aGUgdHJhbnNmb3JtIHNlZSBkaXZtb2RfY2FuZGlkYXRlX3Ao KS4KKworICAgVGhlIHBhc3Mgd29ya3MgaW4gdHdvIHBoYXNlczoKKyAgIDEp IFdhbGsgdGhyb3VnaCBhbGwgaW1tZWRpYXRlIHVzZXMgb2Ygc3RtdCdzIG9w ZXJhbmQgYW5kIGZpbmQgYQorICAgICAgVFJVTkNfRElWX0VYUFIgd2l0aCBt YXRjaGluZyBvcGVyYW5kcyBhbmQgaWYgc3VjaCBhIHN0bXQgaXMgZm91bmQg YWRkCisgICAgICBpdCB0byBzdG10cyB2ZWN0b3IuCisgICAyKSBJbnNlcnQg RElWTU9EIGNhbGwgYmVmb3JlIGZpcnN0IGRpdi9tb2Qgc3RtdCBpbiB0b3Bf YmIgKGJhc2ljIGJsb2NrIHRoYXQKKyAgICAgIGRvbWluYXRlcyBvdGhlciBk aXYvbW9kIHN0bXRzIHdpdGggc2FtZSBvcGVyYW5kcykgYW5kIHVwZGF0ZSBl bnRyaWVzIGluCisgICAgICBzdG10cyB2ZWN0b3IgdG8gdXNlIHJldHVybiB2 YWx1ZSBvZiBESU1PVkQgKFJFQUxFWFBSX1BBUlQgZm9yIGRpdiwKKyAgICAg IElNQUdQQVJUX0VYUFIgZm9yIG1vZCkuICAqLworCitzdGF0aWMgYm9vbAor Y29udmVydF90b19kaXZtb2QgKGdhc3NpZ24gKnN0bXQpCit7CisgIGlmICgh ZGl2bW9kX2NhbmRpZGF0ZV9wIChzdG10KSkKKyAgICByZXR1cm4gZmFsc2U7 CisKKyAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpOwor ICB0cmVlIG9wMiA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCk7CisgIAor ICBpbW1fdXNlX2l0ZXJhdG9yIHVzZV9pdGVyOworICBnaW1wbGUgKnVzZV9z dG10OworICBhdXRvX3ZlYzxnaW1wbGUgKj4gc3RtdHM7IAorCisgIGdpbXBs ZSAqdG9wX3N0bXQgPSBzdG10OyAKKyAgYmFzaWNfYmxvY2sgdG9wX2JiID0g Z2ltcGxlX2JiIChzdG10KTsKKworICAvKiBUcnkgdG8gc2V0IHRvcF9zdG10 IHRvICJ0b3Btb3N0IiBzdG10CisgICAgIHdpdGggY29kZSBUUlVOQ19ESVZf RVhQUi9UUlVOQ19NT0RfRVhQUiBoYXZpbmcgc2FtZSBvcGVyYW5kcyBhcyBz dG10LiAgKi8KKworICBGT1JfRUFDSF9JTU1fVVNFX1NUTVQgKHVzZV9zdG10 LCB1c2VfaXRlciwgb3AxKQorICAgIHsKKyAgICAgIGlmIChpc19naW1wbGVf YXNzaWduICh1c2Vfc3RtdCkKKwkgICYmIChnaW1wbGVfYXNzaWduX3Joc19j b2RlICh1c2Vfc3RtdCkgPT0gVFJVTkNfRElWX0VYUFIKKwkgICAgICB8fCBn aW1wbGVfYXNzaWduX3Joc19jb2RlICh1c2Vfc3RtdCkgPT0gVFJVTkNfTU9E X0VYUFIpCisJICAmJiBvcGVyYW5kX2VxdWFsX3AgKG9wMSwgZ2ltcGxlX2Fz c2lnbl9yaHMxICh1c2Vfc3RtdCksIDApCisJICAmJiBvcGVyYW5kX2VxdWFs X3AgKG9wMiwgZ2ltcGxlX2Fzc2lnbl9yaHMyICh1c2Vfc3RtdCksIDApKQor CXsKKwkgIGlmIChzdG10X2Nhbl90aHJvd19pbnRlcm5hbCAodXNlX3N0bXQp KQorCSAgICBjb250aW51ZTsKKworCSAgYmFzaWNfYmxvY2sgYmIgPSBnaW1w bGVfYmIgKHVzZV9zdG10KTsKKworCSAgaWYgKGJiID09IHRvcF9iYikKKwkg ICAgeworCSAgICAgIGlmIChnaW1wbGVfdWlkICh1c2Vfc3RtdCkgPCBnaW1w bGVfdWlkICh0b3Bfc3RtdCkpCisJCXRvcF9zdG10ID0gdXNlX3N0bXQ7CisJ ICAgIH0KKwkgIGVsc2UgaWYgKGRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5B VE9SUywgdG9wX2JiLCBiYikpCisJICAgIHsKKwkgICAgICB0b3BfYmIgPSBi YjsKKwkgICAgICB0b3Bfc3RtdCA9IHVzZV9zdG10OworCSAgICB9CisJfQor ICAgIH0KKworICBpZiAodG9wX3N0bXQgPT0gc3RtdCAmJiBzdG10X2Nhbl90 aHJvd19pbnRlcm5hbCAodG9wX3N0bXQpKQorICAgIHJldHVybiBmYWxzZTsK KworICB0cmVlIHRvcF9vcDEgPSBnaW1wbGVfYXNzaWduX3JoczEgKHRvcF9z dG10KTsKKyAgdHJlZSB0b3Bfb3AyID0gZ2ltcGxlX2Fzc2lnbl9yaHMyICh0 b3Bfc3RtdCk7CisKKyAgc3RtdHMuc2FmZV9wdXNoICh0b3Bfc3RtdCk7Cisg IGJvb2wgZGl2X3NlZW4gPSAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAodG9w X3N0bXQpID09IFRSVU5DX0RJVl9FWFBSKTsKKworICAvKiBFbnN1cmUgdGhh dCBnaW1wbGVfYmIgKHVzZV9zdG10KSBpcyBkb21pbmF0ZWQgYnkgdG9wX2Ji LiAgKi8gICAgCisKKyAgRk9SX0VBQ0hfSU1NX1VTRV9TVE1UICh1c2Vfc3Rt dCwgdXNlX2l0ZXIsIHRvcF9vcDEpCisgICAgeworICAgICAgaWYgKGlzX2dp bXBsZV9hc3NpZ24gKHVzZV9zdG10KQorCSAgJiYgKGdpbXBsZV9hc3NpZ25f cmhzX2NvZGUgKHVzZV9zdG10KSA9PSBUUlVOQ19ESVZfRVhQUgorCSAgICAg IHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KSA9PSBUUlVO Q19NT0RfRVhQUikKKwkgICYmIG9wZXJhbmRfZXF1YWxfcCAodG9wX29wMSwg Z2ltcGxlX2Fzc2lnbl9yaHMxICh1c2Vfc3RtdCksIDApCisJICAmJiBvcGVy YW5kX2VxdWFsX3AgKHRvcF9vcDIsIGdpbXBsZV9hc3NpZ25fcmhzMiAodXNl X3N0bXQpLCAwKSkKKwl7CisJICBpZiAodXNlX3N0bXQgPT0gdG9wX3N0bXQp CisJICAgIGNvbnRpbnVlOworCisJICBpZiAoc3RtdF9jYW5fdGhyb3dfaW50 ZXJuYWwgKHVzZV9zdG10KSkKKwkgICAgY29udGludWU7CisKKwkgIGlmICgh ZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLCBnaW1wbGVfYmIgKHVz ZV9zdG10KSwgdG9wX2JiKSkKKwkgICAgeworCSAgICAgIGVuZF9pbW1fdXNl X3N0bXRfdHJhdmVyc2UgKCZ1c2VfaXRlcik7CisJICAgICAgcmV0dXJuIGZh bHNlOworCSAgICB9CisKKwkgIHN0bXRzLnNhZmVfcHVzaCAodXNlX3N0bXQp OworCSAgaWYgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KSA9 PSBUUlVOQ19ESVZfRVhQUikKKwkgICAgZGl2X3NlZW4gPSB0cnVlOworCX0K KyAgICB9CisKKyAgaWYgKCFkaXZfc2VlbikKKyAgICByZXR1cm4gZmFsc2U7 CisKKyAgLyogQ3JlYXRlIGxpYmNhbGwgdG8gaW50ZXJuYWwgZm4gRElWTU9E OgorICAgICBkaXZtb2RfdG1wID0gRElWTU9EIChvcDEsIG9wMikuICAqLwor CisgIGdjYWxsICpjYWxsX3N0bXQgPSBnaW1wbGVfYnVpbGRfY2FsbF9pbnRl cm5hbCAoSUZOX0RJVk1PRCwgMiwgb3AxLCBvcDIpOworICB0cmVlIHJlcyA9 IG1ha2VfdGVtcF9zc2FfbmFtZSAoCisJCWJ1aWxkX2NvbXBsZXhfdHlwZSAo VFJFRV9UWVBFIChvcDEpKSwKKwkJY2FsbF9zdG10LCAiZGl2bW9kX3RtcCIp OworICBnaW1wbGVfY2FsbF9zZXRfbGhzIChjYWxsX3N0bXQsIHJlcyk7CisK KyAgLyogSW5zZXJ0IHRoZSBjYWxsIGJlZm9yZSB0b3Bfc3RtdC4gICovCisg IGdpbXBsZV9zdG10X2l0ZXJhdG9yIHRvcF9zdG10X2dzaSA9IGdzaV9mb3Jf c3RtdCAodG9wX3N0bXQpOworICBnc2lfaW5zZXJ0X2JlZm9yZSAoJnRvcF9z dG10X2dzaSwgY2FsbF9zdG10LCBHU0lfU0FNRV9TVE1UKTsKKworICB3aWRl bl9tdWxfc3RhdHMuZGl2bW9kX2NhbGxzX2luc2VydGVkKys7CQkKKworICAv KiBVcGRhdGUgYWxsIHN0YXRlbWVudHMgaW4gc3RtdHMuCisgICAgIGlmIHN0 bXQgaXMgbGhzID0gb3AxIFRSVU5DX0RJVl9FWFBSIG9wMiwgY2hhbmdlIHRv IGxocyA9IFJFQUxQQVJUX0VYUFI8ZGl2bW9kX3RtcD4KKyAgICAgaWYgc3Rt dCBpcyBsaHMgPSBvcDEgVFJVTkNfTU9EX0VYUFIgb3AyLCBjaGFuZ2UgdG8g bGhzID0gSU1BR1BBUlRfRVhQUjxkaXZtb2RfdG1wPi4gICovCisKKyAgYm9v bCBjZmdfY2hhbmdlZCA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAw OyBzdG10cy5pdGVyYXRlIChpLCAmdXNlX3N0bXQpOyArK2kpCisgICAgewor ICAgICAgdHJlZSBuZXdfcmhzOworCisgICAgICBzd2l0Y2ggKGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10KSkKKwl7CisJICBjYXNlIFRSVU5D X0RJVl9FWFBSOgorCSAgICBuZXdfcmhzID0gZm9sZF9idWlsZDEgKFJFQUxQ QVJUX0VYUFIsIFRSRUVfVFlQRSAob3AxKSwgcmVzKTsKKwkgICAgYnJlYWs7 CisKKwkgIGNhc2UgVFJVTkNfTU9EX0VYUFI6CisJICAgIG5ld19yaHMgPSBm b2xkX2J1aWxkMSAoSU1BR1BBUlRfRVhQUiwgVFJFRV9UWVBFIChvcDIpLCBy ZXMpOworCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgZ2NjX3Vu cmVhY2hhYmxlICgpOworCX0KKworICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgZ3NpID0gZ3NpX2Zvcl9zdG10ICh1c2Vfc3RtdCk7CisgICAgICBnaW1w bGVfYXNzaWduX3NldF9yaHNfZnJvbV90cmVlICgmZ3NpLCBuZXdfcmhzKTsK KyAgICAgIHVwZGF0ZV9zdG10ICh1c2Vfc3RtdCk7CisKKyAgICAgIGlmICht YXliZV9jbGVhbl9vcl9yZXBsYWNlX2VoX3N0bXQgKHVzZV9zdG10LCB1c2Vf c3RtdCkpCisJY2ZnX2NoYW5nZWQgPSB0cnVlOworICAgIH0KKworICByZXR1 cm4gY2ZnX2NoYW5nZWQ7Cit9ICAgIAogCiAvKiBGaW5kIGludGVnZXIgbXVs dGlwbGljYXRpb25zIHdoZXJlIHRoZSBvcGVyYW5kcyBhcmUgZXh0ZW5kZWQg ZnJvbQogICAgc21hbGxlciB0eXBlcywgYW5kIHJlcGxhY2UgdGhlIE1VTFRf RVhQUiB3aXRoIGEgV0lERU5fTVVMVF9FWFBSCkBAIC0zODI4LDYgKzQwNTAs OCBAQCBwYXNzX29wdGltaXplX3dpZGVuaW5nX211bDo6ZXhlY3V0ZSAoZnVu Y3Rpb24gKmZ1bikKICAgYm9vbCBjZmdfY2hhbmdlZCA9IGZhbHNlOwogCiAg IG1lbXNldCAoJndpZGVuX211bF9zdGF0cywgMCwgc2l6ZW9mICh3aWRlbl9t dWxfc3RhdHMpKTsKKyAgY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChDRElf RE9NSU5BVE9SUyk7CisgIHJlbnVtYmVyX2dpbXBsZV9zdG10X3VpZHMgKCk7 CiAKICAgRk9SX0VBQ0hfQkJfRk4gKGJiLCBmdW4pCiAgICAgewpAQCAtMzg2 MSw2ICs0MDg1LDEwIEBAIHBhc3Nfb3B0aW1pemVfd2lkZW5pbmdfbXVsOjpl eGVjdXRlIChmdW5jdGlvbiAqZnVuKQogCQkgICAgbWF0Y2hfdWFkZHN1Yl9v dmVyZmxvdyAoJmdzaSwgc3RtdCwgY29kZSk7CiAJCSAgYnJlYWs7CiAKKwkJ Y2FzZSBUUlVOQ19NT0RfRVhQUjoKKwkJICBjZmdfY2hhbmdlZCA9IGNvbnZl cnRfdG9fZGl2bW9kIChhc19hPGdhc3NpZ24gKj4gKHN0bXQpKTsKKwkJICBi cmVhazsKKwogCQlkZWZhdWx0OjsKIAkJfQogCSAgICB9CkBAIC0zOTA3LDYg KzQxMzUsOCBAQCBwYXNzX29wdGltaXplX3dpZGVuaW5nX211bDo6ZXhlY3V0 ZSAoZnVuY3Rpb24gKmZ1bikKIAkJCSAgICB3aWRlbl9tdWxfc3RhdHMubWFj Y3NfaW5zZXJ0ZWQpOwogICBzdGF0aXN0aWNzX2NvdW50ZXJfZXZlbnQgKGZ1 biwgImZ1c2VkIG11bHRpcGx5LWFkZHMgaW5zZXJ0ZWQiLAogCQkJICAgIHdp ZGVuX211bF9zdGF0cy5mbWFzX2luc2VydGVkKTsKKyAgc3RhdGlzdGljc19j b3VudGVyX2V2ZW50IChmdW4sICJkaXZtb2QgY2FsbHMgaW5zZXJ0ZWQiLAor CQkJICAgIHdpZGVuX211bF9zdGF0cy5kaXZtb2RfY2FsbHNfaW5zZXJ0ZWQp OwogCiAgIHJldHVybiBjZmdfY2hhbmdlZCA/IFRPRE9fY2xlYW51cF9jZmcg OiAwOwogfQo= --001a11475b22bf9a8c053408e58d--