From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 86025 invoked by alias); 24 Nov 2016 13:42:34 -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 85572 invoked by uid 89); 24 Nov 2016 13:42:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=dance, Yuri, yuri, statistics X-HELO: mail-ua0-f178.google.com Received: from mail-ua0-f178.google.com (HELO mail-ua0-f178.google.com) (209.85.217.178) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 24 Nov 2016 13:42:23 +0000 Received: by mail-ua0-f178.google.com with SMTP id b35so47523482uaa.3 for ; Thu, 24 Nov 2016 05:42:23 -0800 (PST) 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:from:date :message-id:subject:to:cc; bh=nrSAIdlK0Da6ynb7Hxel1jHLIYsddxA6984Yr4eK7h4=; b=IEjXNhGN0I6UgM1fDUuESUe597KmuU08lIJCV2t3pX9Tc36Df+n0VSboOd6JX//suo WUFu0F7NVD99kXQZP1l0myR1OnTY/W/9SUu4D//JkZvfgKgg1ovZgd93cilpYsjanpr+ DBGbwYBd5zf4axGOk4olBn7YDg8ydATTO6+KZpITlDNlRXPjGg356caTaDZdX+Ovagmf FpqbnyGSnP4Ky0TarehrQspsasM/38i9U7tSp4EKJ31uOnuO2OLw8/Cyu9jMZ89Dv2Er s1R6yWnvkvXGfeo6f15aYqlhygJxBti4xWtxJtDRecSSeVLT/rEviu1opQ1gkRe//YbT 5k/w== X-Gm-Message-State: AKaTC011uNxJKY4XkdaHNbF1OVBRGvuYvv9udF8ftluXJ48vFQUT0reMcO0fhZst+VxumJRsT3/EgacyT9D1Vg== X-Received: by 10.176.82.48 with SMTP id i45mr1368081uaa.126.1479994941437; Thu, 24 Nov 2016 05:42:21 -0800 (PST) MIME-Version: 1.0 Received: by 10.176.1.17 with HTTP; Thu, 24 Nov 2016 05:42:20 -0800 (PST) In-Reply-To: References: <0810E36B-CFA5-45E3-B352-1DE4B11FBF8A@suse.de> From: Yuri Rumyantsev Date: Thu, 24 Nov 2016 13:42:00 -0000 Message-ID: Subject: Re: [PATCH, vec-tails] Support loop epilogue vectorization To: Christophe Lyon Cc: Richard Biener , Jeff Law , gcc-patches , Ilya Enkovich Content-Type: multipart/mixed; boundary=94eb2c18f7eec1495d05420c2c91 X-SW-Source: 2016-11/txt/msg02538.txt.bz2 --94eb2c18f7eec1495d05420c2c91 Content-Type: text/plain; charset=UTF-8 Content-length: 19946 Hi All, Here is the second patch which supports epilogue vectorization using masking without cost model. Currently it is possible only with passing parameter "--param vect-epilogues-mask=1". Bootstrapping and regression testing did not show any new regression. Any comments will be appreciated. ChangeLog: 2016-11-24 Yuri Rumyantsev * params.def (PARAM_VECT_EPILOGUES_MASK): New. * tree-vect-data-refs.c (vect_get_new_ssa_name): Support vect_mask_var. * tree-vect-loop.c: Include insn-config.h, recog.h and alias.h. (new_loop_vec_info): Add zeroing can_be_masked, mask_loop and required_mask fields. (vect_check_required_masks_widening): New. (vect_check_required_masks_narrowing): New. (vect_get_masking_iv_elems): New. (vect_get_masking_iv_type): New. (vect_get_extreme_masks): New. (vect_check_required_masks): New. (vect_analyze_loop_operations): Call vect_check_required_masks if all statements can be masked. (vect_analyze_loop_2): Inititalize to zero min_scalar_loop_bound. Add check that epilogue can be masked with the same vf with issue fail notes. Allow epilogue vectorization through masking of low trip loops. Set to true can_be_masked field before loop operation analysis. Do not set-up min_scalar_loop_bound for epilogue vectorization through masking. Do not peeling for epilogue masking. Reset can_be_masked field before repeat analysis. (vect_estimate_min_profitable_iters): Do not compute profitability for epilogue masking. Set up mask_loop filed to true if parameter PARAM_VECT_EPILOGUES_MASK is non-zero. (vectorizable_reduction): Add check that statement can be masked. (vectorizable_induction): Do not support masking for induction. (vect_gen_ivs_for_masking): New. (vect_get_mask_index_for_elems): New. (vect_get_mask_index_for_type): New. (vect_create_narrowed_masks): New. (vect_create_widened_masks): New. (vect_gen_loop_masks): New. (vect_mask_reduction_stmt): New. (vect_mask_mask_load_store_stmt): New. (vect_mask_load_store_stmt): New. (vect_mask_loop): New. (vect_transform_loop): Invoke vect_mask_loop if required. Use div_ceil to recompute upper bounds for masked loops. Issue statistics for epilogue vectorization through masking. Do not reduce vf for masking epilogue. * tree-vect-stmts.c: Include tree-ssa-loop-ivopts.h. (can_mask_load_store): New. (vectorizable_mask_load_store): Check that mask conjuction is supported. Set-up first_copy_p field of stmt_vinfo. (vectorizable_simd_clone_call): Check that simd clone can not be masked. (vectorizable_store): Check that store can be masked. Mark the first copy of generated vector stores and provide it with vectype and the original data reference. (vectorizable_load): Check that load can be masked. (vect_stmt_should_be_masked_for_epilogue): New. (vect_add_required_mask_for_stmt): New. (vect_analyze_stmt): Add check on unsupported statements for masking with printing message. * tree-vectorizer.h (struct _loop_vec_info): Add new fields can_be_maske, required_masks, masl_loop. (LOOP_VINFO_CAN_BE_MASKED): New. (LOOP_VINFO_REQUIRED_MASKS): New. (LOOP_VINFO_MASK_LOOP): New. (struct _stmt_vec_info): Add first_copy_p field. (STMT_VINFO_FIRST_COPY_P): New. gcc/testsuite/ * gcc.dg/vect/vect-tail-mask-1.c: New test. 2016-11-18 18:54 GMT+03:00 Christophe Lyon : > On 18 November 2016 at 16:46, Yuri Rumyantsev wrote: >> It is very strange that this test failed on arm, since it requires >> target avx2 to check vectorizer dumps: >> >> /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 2 "vect" { >> target avx2_runtime } } } */ >> /* { dg-final { scan-tree-dump-times "LOOP EPILOGUE VECTORIZED >> \\(VS=16\\)" 2 "vect" { target avx2_runtime } } } */ >> >> Could you please clarify what is the reason of the failure? > > It's not the scan-dumps that fail, but the execution. > The test calls abort() for some reason. > > It will take me a while to rebuild the test manually in the right > debug environment to provide you with more traces. > > > >> >> Thanks. >> >> 2016-11-18 16:20 GMT+03:00 Christophe Lyon : >>> On 15 November 2016 at 15:41, Yuri Rumyantsev wrote: >>>> Hi All, >>>> >>>> Here is patch for non-masked epilogue vectoriziation. >>>> >>>> Bootstrap and regression testing did not show any new failures. >>>> >>>> Is it OK for trunk? >>>> >>>> Thanks. >>>> Changelog: >>>> >>>> 2016-11-15 Yuri Rumyantsev >>>> >>>> * params.def (PARAM_VECT_EPILOGUES_NOMASK): New. >>>> * tree-if-conv.c (tree_if_conversion): Make public. >>>> * * tree-if-conv.h: New file. >>>> * tree-vect-data-refs.c (vect_analyze_data_ref_dependences) Avoid >>>> dynamic alias checks for epilogues. >>>> * tree-vect-loop-manip.c (vect_do_peeling): Return created epilog. >>>> * tree-vect-loop.c: include tree-if-conv.h. >>>> (new_loop_vec_info): Add zeroing orig_loop_info field. >>>> (vect_analyze_loop_2): Don't try to enhance alignment for epilogues. >>>> (vect_analyze_loop): Add argument ORIG_LOOP_INFO which is not NULL >>>> if epilogue is vectorized, set up orig_loop_info field of loop_vinfo >>>> using passed argument. >>>> (vect_transform_loop): Check if created epilogue should be returned >>>> for further vectorization with less vf. If-convert epilogue if >>>> required. Print vectorization success for epilogue. >>>> * tree-vectorizer.c (vectorize_loops): Add epilogue vectorization >>>> if it is required, pass loop_vinfo produced during vectorization of >>>> loop body to vect_analyze_loop. >>>> * tree-vectorizer.h (struct _loop_vec_info): Add new field >>>> orig_loop_info. >>>> (LOOP_VINFO_ORIG_LOOP_INFO): New. >>>> (LOOP_VINFO_EPILOGUE_P): New. >>>> (LOOP_VINFO_ORIG_VECT_FACTOR): New. >>>> (vect_do_peeling): Change prototype to return epilogue. >>>> (vect_analyze_loop): Add argument of loop_vec_info type. >>>> (vect_transform_loop): Return created loop. >>>> >>>> gcc/testsuite/ >>>> >>>> * lib/target-supports.exp (check_avx2_hw_available): New. >>>> (check_effective_target_avx2_runtime): New. >>>> * gcc.dg/vect/vect-tail-nomask-1.c: New test. >>>> >>> >>> Hi, >>> >>> This new test fails on arm-none-eabi (using default cpu/fpu/mode): >>> gcc.dg/vect/vect-tail-nomask-1.c -flto -ffat-lto-objects execution test >>> gcc.dg/vect/vect-tail-nomask-1.c execution test >>> >>> It does pass on the same target if configured --with-cpu=cortex-a9. >>> >>> Christophe >>> >>> >>> >>>> >>>> 2016-11-14 20:04 GMT+03:00 Richard Biener : >>>>> On November 14, 2016 4:39:40 PM GMT+01:00, Yuri Rumyantsev wrote: >>>>>>Richard, >>>>>> >>>>>>I checked one of the tests designed for epilogue vectorization using >>>>>>patches 1 - 3 and found out that build compiler performs vectorization >>>>>>of epilogues with --param vect-epilogues-nomask=1 passed: >>>>>> >>>>>>$ gcc -Ofast -mavx2 t1.c -S --param vect-epilogues-nomask=1 -o >>>>>>t1.new-nomask.s -fdump-tree-vect-details >>>>>>$ grep VECTORIZED -c t1.c.156t.vect >>>>>>4 >>>>>> Without param only 2 loops are vectorized. >>>>>> >>>>>>Should I simply add a part of tests related to this feature or I must >>>>>>delete all not necessary changes also? >>>>> >>>>> Please remove all not necessary changes. >>>>> >>>>> Richard. >>>>> >>>>>>Thanks. >>>>>>Yuri. >>>>>> >>>>>>2016-11-14 16:40 GMT+03:00 Richard Biener : >>>>>>> On Mon, 14 Nov 2016, Yuri Rumyantsev wrote: >>>>>>> >>>>>>>> Richard, >>>>>>>> >>>>>>>> In my previous patch I forgot to remove couple lines related to aux >>>>>>field. >>>>>>>> Here is the correct updated patch. >>>>>>> >>>>>>> Yeah, I noticed. This patch would be ok for trunk (together with >>>>>>> necessary parts from 1 and 2) if all not required parts are removed >>>>>>> (and you'd add the testcases covering non-masked tail vect). >>>>>>> >>>>>>> Thus, can you please produce a single complete patch containing only >>>>>>> non-masked epilogue vectoriziation? >>>>>>> >>>>>>> Thanks, >>>>>>> Richard. >>>>>>> >>>>>>>> Thanks. >>>>>>>> Yuri. >>>>>>>> >>>>>>>> 2016-11-14 15:51 GMT+03:00 Richard Biener : >>>>>>>> > On Fri, 11 Nov 2016, Yuri Rumyantsev wrote: >>>>>>>> > >>>>>>>> >> Richard, >>>>>>>> >> >>>>>>>> >> I prepare updated 3 patch with passing additional argument to >>>>>>>> >> vect_analyze_loop as you proposed (untested). >>>>>>>> >> >>>>>>>> >> You wrote: >>>>>>>> >> tw, I wonder if you can produce a single patch containing just >>>>>>>> >> epilogue vectorization, that is combine patches 1-3 but rip out >>>>>>>> >> changes only needed by later patches? >>>>>>>> >> >>>>>>>> >> Did you mean that I exclude all support for vectorization >>>>>>epilogues, >>>>>>>> >> i.e. exclude from 2-nd patch all non-related changes >>>>>>>> >> like >>>>>>>> >> >>>>>>>> >> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c >>>>>>>> >> index 11863af..32011c1 100644 >>>>>>>> >> --- a/gcc/tree-vect-loop.c >>>>>>>> >> +++ b/gcc/tree-vect-loop.c >>>>>>>> >> @@ -1120,6 +1120,12 @@ new_loop_vec_info (struct loop *loop) >>>>>>>> >> LOOP_VINFO_PEELING_FOR_GAPS (res) = false; >>>>>>>> >> LOOP_VINFO_PEELING_FOR_NITER (res) = false; >>>>>>>> >> LOOP_VINFO_OPERANDS_SWAPPED (res) = false; >>>>>>>> >> + LOOP_VINFO_CAN_BE_MASKED (res) = false; >>>>>>>> >> + LOOP_VINFO_REQUIRED_MASKS (res) = 0; >>>>>>>> >> + LOOP_VINFO_COMBINE_EPILOGUE (res) = false; >>>>>>>> >> + LOOP_VINFO_MASK_EPILOGUE (res) = false; >>>>>>>> >> + LOOP_VINFO_NEED_MASKING (res) = false; >>>>>>>> >> + LOOP_VINFO_ORIG_LOOP_INFO (res) = NULL; >>>>>>>> > >>>>>>>> > Yes. >>>>>>>> > >>>>>>>> >> Did you mean also that new combined patch must be working patch, >>>>>>i.e. >>>>>>>> >> can be integrated without other patches? >>>>>>>> > >>>>>>>> > Yes. >>>>>>>> > >>>>>>>> >> Could you please look at updated patch? >>>>>>>> > >>>>>>>> > Will do. >>>>>>>> > >>>>>>>> > Thanks, >>>>>>>> > Richard. >>>>>>>> > >>>>>>>> >> Thanks. >>>>>>>> >> Yuri. >>>>>>>> >> >>>>>>>> >> 2016-11-10 15:36 GMT+03:00 Richard Biener : >>>>>>>> >> > On Thu, 10 Nov 2016, Richard Biener wrote: >>>>>>>> >> > >>>>>>>> >> >> On Tue, 8 Nov 2016, Yuri Rumyantsev wrote: >>>>>>>> >> >> >>>>>>>> >> >> > Richard, >>>>>>>> >> >> > >>>>>>>> >> >> > Here is updated 3 patch. >>>>>>>> >> >> > >>>>>>>> >> >> > I checked that all new tests related to epilogue >>>>>>vectorization passed with it. >>>>>>>> >> >> > >>>>>>>> >> >> > Your comments will be appreciated. >>>>>>>> >> >> >>>>>>>> >> >> A lot better now. Instead of the ->aux dance I now prefer to >>>>>>>> >> >> pass the original loops loop_vinfo to vect_analyze_loop as >>>>>>>> >> >> optional argument (if non-NULL we analyze the epilogue of that >>>>>>>> >> >> loop_vinfo). OTOH I remember we mainly use it to get at the >>>>>>>> >> >> original vectorization factor? So we can pass down an >>>>>>(optional) >>>>>>>> >> >> forced vectorization factor as well? >>>>>>>> >> > >>>>>>>> >> > Btw, I wonder if you can produce a single patch containing just >>>>>>>> >> > epilogue vectorization, that is combine patches 1-3 but rip out >>>>>>>> >> > changes only needed by later patches? >>>>>>>> >> > >>>>>>>> >> > Thanks, >>>>>>>> >> > Richard. >>>>>>>> >> > >>>>>>>> >> >> Richard. >>>>>>>> >> >> >>>>>>>> >> >> > 2016-11-08 15:38 GMT+03:00 Richard Biener >>>>>>: >>>>>>>> >> >> > > On Thu, 3 Nov 2016, Yuri Rumyantsev wrote: >>>>>>>> >> >> > > >>>>>>>> >> >> > >> Hi Richard, >>>>>>>> >> >> > >> >>>>>>>> >> >> > >> I did not understand your last remark: >>>>>>>> >> >> > >> >>>>>>>> >> >> > >> > That is, here (and avoid the FOR_EACH_LOOP change): >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > @@ -580,12 +586,21 @@ vectorize_loops (void) >>>>>>>> >> >> > >> > && dump_enabled_p ()) >>>>>>>> >> >> > >> > dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, >>>>>>vect_location, >>>>>>>> >> >> > >> > "loop vectorized\n"); >>>>>>>> >> >> > >> > - vect_transform_loop (loop_vinfo); >>>>>>>> >> >> > >> > + new_loop = vect_transform_loop (loop_vinfo); >>>>>>>> >> >> > >> > num_vectorized_loops++; >>>>>>>> >> >> > >> > /* Now that the loop has been vectorized, allow >>>>>>it to be unrolled >>>>>>>> >> >> > >> > etc. */ >>>>>>>> >> >> > >> > loop->force_vectorize = false; >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > + /* Add new loop to a processing queue. To make >>>>>>it easier >>>>>>>> >> >> > >> > + to match loop and its epilogue vectorization >>>>>>in dumps >>>>>>>> >> >> > >> > + put new loop as the next loop to process. >>>>>>*/ >>>>>>>> >> >> > >> > + if (new_loop) >>>>>>>> >> >> > >> > + { >>>>>>>> >> >> > >> > + loops.safe_insert (i + 1, new_loop->num); >>>>>>>> >> >> > >> > + vect_loops_num = number_of_loops (cfun); >>>>>>>> >> >> > >> > + } >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > simply dispatch to a vectorize_epilogue (loop_vinfo, >>>>>>new_loop) >>>>>>>> >> >> > >> f> unction which will set up stuff properly (and also >>>>>>perform >>>>>>>> >> >> > >> > the if-conversion of the epilogue there). >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > That said, if we can get in non-masked epilogue >>>>>>vectorization >>>>>>>> >> >> > >> > separately that would be great. >>>>>>>> >> >> > >> >>>>>>>> >> >> > >> Could you please clarify your proposal. >>>>>>>> >> >> > > >>>>>>>> >> >> > > When a loop was vectorized set things up to immediately >>>>>>vectorize >>>>>>>> >> >> > > its epilogue, avoiding changing the loop iteration and >>>>>>avoiding >>>>>>>> >> >> > > the re-use of ->aux. >>>>>>>> >> >> > > >>>>>>>> >> >> > > Richard. >>>>>>>> >> >> > > >>>>>>>> >> >> > >> Thanks. >>>>>>>> >> >> > >> Yuri. >>>>>>>> >> >> > >> >>>>>>>> >> >> > >> 2016-11-02 15:27 GMT+03:00 Richard Biener >>>>>>: >>>>>>>> >> >> > >> > On Tue, 1 Nov 2016, Yuri Rumyantsev wrote: >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> >> Hi All, >>>>>>>> >> >> > >> >> >>>>>>>> >> >> > >> >> I re-send all patches sent by Ilya earlier for review >>>>>>which support >>>>>>>> >> >> > >> >> vectorization of loop epilogues and loops with low >>>>>>trip count. We >>>>>>>> >> >> > >> >> assume that the only patch - >>>>>>vec-tails-07-combine-tail.patch - was not >>>>>>>> >> >> > >> >> approved by Jeff. >>>>>>>> >> >> > >> >> >>>>>>>> >> >> > >> >> I did re-base of all patches and performed >>>>>>bootstrapping and >>>>>>>> >> >> > >> >> regression testing that did not show any new failures. >>>>>>Also all >>>>>>>> >> >> > >> >> changes related to new vect_do_peeling algorithm have >>>>>>been changed >>>>>>>> >> >> > >> >> accordingly. >>>>>>>> >> >> > >> >> >>>>>>>> >> >> > >> >> Is it OK for trunk? >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > I would have prefered that the series up to >>>>>>-03-nomask-tails would >>>>>>>> >> >> > >> > _only_ contain epilogue loop vectorization changes but >>>>>>unfortunately >>>>>>>> >> >> > >> > the patchset is oddly separated. >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > I have a comment on that part nevertheless: >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > @@ -1608,7 +1614,10 @@ vect_enhance_data_refs_alignment >>>>>>(loop_vec_info >>>>>>>> >> >> > >> > loop_vinfo) >>>>>>>> >> >> > >> > /* Check if we can possibly peel the loop. */ >>>>>>>> >> >> > >> > if (!vect_can_advance_ivs_p (loop_vinfo) >>>>>>>> >> >> > >> > || !slpeel_can_duplicate_loop_p (loop, >>>>>>single_exit (loop)) >>>>>>>> >> >> > >> > - || loop->inner) >>>>>>>> >> >> > >> > + || loop->inner >>>>>>>> >> >> > >> > + /* Required peeling was performed in prologue >>>>>>and >>>>>>>> >> >> > >> > + is not required for epilogue. */ >>>>>>>> >> >> > >> > + || LOOP_VINFO_EPILOGUE_P (loop_vinfo)) >>>>>>>> >> >> > >> > do_peeling = false; >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > if (do_peeling >>>>>>>> >> >> > >> > @@ -1888,7 +1897,10 @@ vect_enhance_data_refs_alignment >>>>>>(loop_vec_info >>>>>>>> >> >> > >> > loop_vinfo) >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > do_versioning = >>>>>>>> >> >> > >> > optimize_loop_nest_for_speed_p (loop) >>>>>>>> >> >> > >> > - && (!loop->inner); /* FORNOW */ >>>>>>>> >> >> > >> > + && (!loop->inner) /* FORNOW */ >>>>>>>> >> >> > >> > + /* Required versioning was performed for the >>>>>>>> >> >> > >> > + original loop and is not required for >>>>>>epilogue. */ >>>>>>>> >> >> > >> > + && !LOOP_VINFO_EPILOGUE_P (loop_vinfo); >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > if (do_versioning) >>>>>>>> >> >> > >> > { >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > please do that check in the single caller of this >>>>>>function. >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > Otherwise I still dislike the new ->aux use and I >>>>>>believe that simply >>>>>>>> >> >> > >> > passing down info from the processed parent would be >>>>>>_much_ cleaner. >>>>>>>> >> >> > >> > That is, here (and avoid the FOR_EACH_LOOP change): >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > @@ -580,12 +586,21 @@ vectorize_loops (void) >>>>>>>> >> >> > >> > && dump_enabled_p ()) >>>>>>>> >> >> > >> > dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, >>>>>>vect_location, >>>>>>>> >> >> > >> > "loop vectorized\n"); >>>>>>>> >> >> > >> > - vect_transform_loop (loop_vinfo); >>>>>>>> >> >> > >> > + new_loop = vect_transform_loop (loop_vinfo); >>>>>>>> >> >> > >> > num_vectorized_loops++; >>>>>>>> >> >> > >> > /* Now that the loop has been vectorized, allow >>>>>>it to be unrolled >>>>>>>> >> >> > >> > etc. */ >>>>>>>> >> >> > >> > loop->force_vectorize = false; >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > + /* Add new loop to a processing queue. To make >>>>>>it easier >>>>>>>> >> >> > >> > + to match loop and its epilogue vectorization >>>>>>in dumps >>>>>>>> >> >> > >> > + put new loop as the next loop to process. >>>>>>*/ >>>>>>>> >> >> > >> > + if (new_loop) >>>>>>>> >> >> > >> > + { >>>>>>>> >> >> > >> > + loops.safe_insert (i + 1, new_loop->num); >>>>>>>> >> >> > >> > + vect_loops_num = number_of_loops (cfun); >>>>>>>> >> >> > >> > + } >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > simply dispatch to a vectorize_epilogue (loop_vinfo, >>>>>>new_loop) >>>>>>>> >> >> > >> > function which will set up stuff properly (and also >>>>>>perform >>>>>>>> >> >> > >> > the if-conversion of the epilogue there). >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > That said, if we can get in non-masked epilogue >>>>>>vectorization >>>>>>>> >> >> > >> > separately that would be great. >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > I'm still torn about all the rest of the stuff and >>>>>>question its >>>>>>>> >> >> > >> > usability (esp. merging the epilogue with the main >>>>>>vector loop). >>>>>>>> >> >> > >> > But it has already been approved ... oh well. >>>>>>>> >> >> > >> > >>>>>>>> >> >> > >> > Thanks, >>>>>>>> >> >> > >> > 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) >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Richard Biener >>>>>>> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham >>>>>>Norton, HRB 21284 (AG Nuernberg) >>>>> >>>>> --94eb2c18f7eec1495d05420c2c91 Content-Type: application/octet-stream; name="epilog-mask.patch" Content-Disposition: attachment; filename="epilog-mask.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ivwerqut0 Content-length: 69638 ZGlmZiAtLWdpdCBhL2djYy9wYXJhbXMuZGVmIGIvZ2NjL3BhcmFtcy5kZWYK aW5kZXggNTBmNzVhNy4uZGI4NjBiNiAxMDA2NDQKLS0tIGEvZ2NjL3BhcmFt cy5kZWYKKysrIGIvZ2NjL3BhcmFtcy5kZWYKQEAgLTEyNzAsNiArMTI3MCwx MiBAQCBERUZQQVJBTSAoUEFSQU1fTUFYX1ZSUF9TV0lUQ0hfQVNTRVJUSU9O UywKIAkgICJlZGdlIG9mIGEgc3dpdGNoIHN0YXRlbWVudCBkdXJpbmcgVlJQ IiwKIAkgIDEwLCAwLCAwKQogCitERUZQQVJBTSAoUEFSQU1fVkVDVF9FUElM T0dVRVNfTUFTSywKKwkgICJ2ZWN0LWVwaWxvZ3Vlcy1tYXNrIiwKKwkgICJF bmFibGUgbG9vcCBlcGlsb2d1ZSB2ZWN0b3JpemF0aW9uIHVzaW5nIHRoZSBz YW1lIHZlY3RvciAiCisJICAic2l6ZSBhbmQgbWFza2luZy4iLAorCSAgMCwg MCwgMSkKKwogREVGUEFSQU0gKFBBUkFNX1ZFQ1RfRVBJTE9HVUVTX05PTUFT SywKIAkgICJ2ZWN0LWVwaWxvZ3Vlcy1ub21hc2siLAogCSAgIkVuYWJsZSBs b29wIGVwaWxvZ3VlIHZlY3Rvcml6YXRpb24gdXNpbmcgc21hbGxlciB2ZWN0 b3Igc2l6ZS4iLApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv dmVjdC92ZWN0LXRhaWwtbWFzay0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy92ZWN0L3ZlY3QtdGFpbC1tYXNrLTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi4wNjM3MDU2Ci0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LXRhaWwtbWFzay0xLmMK QEAgLTAsMCArMSw4IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRn LXJlcXVpcmUtd2VhayAiIiB9ICovCisvKiB7IGRnLWFkZGl0aW9uYWwtb3B0 aW9ucyAiLS1wYXJhbSB2ZWN0LWVwaWxvZ3Vlcy1tYXNrPTEgLW1hdngyIiB7 IHRhcmdldCBhdngyX3J1bnRpbWUgfSB9ICovCisKKyNpbmNsdWRlICJ2ZWN0 LXRhaWwtbm9tYXNrLTEuYyIKKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wLXRpbWVzICJMT09QIFZFQ1RPUklaRUQiIDIgInZlY3QiIHsgdGFy Z2V0IGF2eDJfcnVudGltZSB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wLXRpbWVzICJMT09QIEVQSUxPR1VFIFZFQ1RPUklaRUQg QU5EIE1BU0tFRCBcXChWUz0zMlxcKSIgMiAidmVjdCIgeyB0YXJnZXQgYXZ4 Ml9ydW50aW1lIH0gfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0 LWRhdGEtcmVmcy5jIGIvZ2NjL3RyZWUtdmVjdC1kYXRhLXJlZnMuYwppbmRl eCA1YTMwMzE0Li4xYTBkZjcwIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12ZWN0 LWRhdGEtcmVmcy5jCisrKyBiL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmMK QEAgLTQxMjUsNiArNDEyNSw5IEBAIHZlY3RfZ2V0X25ld19zc2FfbmFtZSAo dHJlZSB0eXBlLCBlbnVtIHZlY3RfdmFyX2tpbmQgdmFyX2tpbmQsIGNvbnN0 IGNoYXIgKm5hbWUpCiAgIGNhc2UgdmVjdF9zY2FsYXJfdmFyOgogICAgIHBy ZWZpeCA9ICJzdG1wIjsKICAgICBicmVhazsKKyAgY2FzZSB2ZWN0X21hc2tf dmFyOgorICAgIHByZWZpeCA9ICJtYXNrIjsKKyAgICBicmVhazsKICAgY2Fz ZSB2ZWN0X3BvaW50ZXJfdmFyOgogICAgIHByZWZpeCA9ICJ2ZWN0cCI7CiAg ICAgYnJlYWs7CmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LWxvb3AtbWFu aXAuYyBiL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jCmluZGV4IGUxM2Q2 YTIuLjM2YmUzNDIgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3QtbG9vcC1t YW5pcC5jCisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jCkBAIC0x NjM1LDYgKzE2MzUsMTMgQEAgdmVjdF9kb19wZWVsaW5nIChsb29wX3ZlY19p bmZvIGxvb3BfdmluZm8sIHRyZWUgbml0ZXJzLCB0cmVlIG5pdGVyc20xLAog ICBib29sIGVwaWxvZ19wZWVsaW5nID0gKExPT1BfVklORk9fUEVFTElOR19G T1JfTklURVIgKGxvb3BfdmluZm8pCiAJCQkgfHwgTE9PUF9WSU5GT19QRUVM SU5HX0ZPUl9HQVBTIChsb29wX3ZpbmZvKSk7CiAKKyAgaWYgKExPT1BfVklO Rk9fRVBJTE9HVUVfUCAobG9vcF92aW5mbykpCisgICAgeworICAgICAgcHJv bG9nX3BlZWxpbmcgPSBmYWxzZTsKKyAgICAgIGlmIChMT09QX1ZJTkZPX01B U0tfTE9PUCAobG9vcF92aW5mbykpCisJZXBpbG9nX3BlZWxpbmcgPSBmYWxz ZTsKKyAgICB9CisKICAgaWYgKCFwcm9sb2dfcGVlbGluZyAmJiAhZXBpbG9n X3BlZWxpbmcpCiAgICAgcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2dj Yy90cmVlLXZlY3QtbG9vcC5jIGIvZ2NjL3RyZWUtdmVjdC1sb29wLmMKaW5k ZXggNDE1MGIwZC4uYjk0ODI4MyAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVj dC1sb29wLmMKKysrIGIvZ2NjL3RyZWUtdmVjdC1sb29wLmMKQEAgLTMxLDYg KzMxLDggQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJ0cmVlLXBhc3MuaCIKICNpbmNs dWRlICJzc2EuaCIKICNpbmNsdWRlICJvcHRhYnMtdHJlZS5oIgorI2luY2x1 ZGUgImluc24tY29uZmlnLmgiCisjaW5jbHVkZSAicmVjb2cuaCIJCS8qIEZJ WE1FOiBmb3IgaW5zbl9kYXRhLiAgKi8KICNpbmNsdWRlICJkaWFnbm9zdGlj LWNvcmUuaCIKICNpbmNsdWRlICJmb2xkLWNvbnN0LmgiCiAjaW5jbHVkZSAi c3Rvci1sYXlvdXQuaCIKQEAgLTUwLDYgKzUyLDcgQEAgYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNs dWRlICJjZ3JhcGguaCIKICNpbmNsdWRlICJ0cmVlLWNmZy5oIgogI2luY2x1 ZGUgInRyZWUtaWYtY29udi5oIgorI2luY2x1ZGUgImFsaWFzLmgiCiAKIC8q IExvb3AgVmVjdG9yaXphdGlvbiBQYXNzLgogCkBAIC0xMTcyLDYgKzExNzUs OSBAQCBuZXdfbG9vcF92ZWNfaW5mbyAoc3RydWN0IGxvb3AgKmxvb3ApCiAg IExPT1BfVklORk9fUEVFTElOR19GT1JfR0FQUyAocmVzKSA9IGZhbHNlOwog ICBMT09QX1ZJTkZPX1BFRUxJTkdfRk9SX05JVEVSIChyZXMpID0gZmFsc2U7 CiAgIExPT1BfVklORk9fT1BFUkFORFNfU1dBUFBFRCAocmVzKSA9IGZhbHNl OworICBMT09QX1ZJTkZPX0NBTl9CRV9NQVNLRUQgKHJlcykgPSBmYWxzZTsK KyAgTE9PUF9WSU5GT19NQVNLX0xPT1AgKHJlcykgPSBmYWxzZTsKKyAgTE9P UF9WSU5GT19SRVFVSVJFRF9NQVNLUyAocmVzKSA9IDA7CiAgIExPT1BfVklO Rk9fT1JJR19MT09QX0lORk8gKHJlcykgPSBOVUxMOwogCiAgIHJldHVybiBy ZXM7CkBAIC0xNjY0LDYgKzE2NzAsMjM1IEBAIHZlY3RfdXBkYXRlX3ZmX2Zv cl9zbHAgKGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbykKIAkJICAgICB2ZWN0 b3JpemF0aW9uX2ZhY3Rvcik7CiB9CiAKKy8qIEZ1bmN0aW9uIHZlY3RfY2hl Y2tfcmVxdWlyZWRfbWFza3Nfd2lkZW5pbmcuCisKKyAgIFJldHVybiB0cnVl IGlmIHZlY3RvciBtYXNrIG9mIHR5cGUgTUFTS19UWVBFIGNhbiBiZSB3aWRl bmVkCisgICB0byBhIHR5cGUgaGF2aW5nIFJFUV9FTEVNUyBlbGVtZW50cyBp biBhIHNpbmdsZSB2ZWN0b3IuICAqLworCitzdGF0aWMgYm9vbAordmVjdF9j aGVja19yZXF1aXJlZF9tYXNrc193aWRlbmluZyAobG9vcF92ZWNfaW5mbyBs b29wX3ZpbmZvLAorCQkJCSAgICB0cmVlIG1hc2tfdHlwZSwgdW5zaWduZWQg cmVxX2VsZW1zKQoreworICB1bnNpZ25lZCBtYXNrX2VsZW1zID0gVFlQRV9W RUNUT1JfU1VCUEFSVFMgKG1hc2tfdHlwZSk7CisKKyAgZ2NjX2Fzc2VydCAo bWFza19lbGVtcyA+IHJlcV9lbGVtcyk7CisKKyAgLyogRG9uJ3QgY29udmVy dCBpZiBpdCByZXF1aXJlcyB0b28gbWFueSBpbnRlcm1lZGlhdGUgc3RlcHMu ICAqLworICBpbnQgc3RlcHMgPSBleGFjdF9sb2cyIChtYXNrX2VsZW1zIC8g cmVxX2VsZW1zKTsKKyAgaWYgKHN0ZXBzID4gTUFYX0lOVEVSTV9DVlRfU1RF UFMgKyAxKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBDaGVjayB3ZSBo YXZlIGNvbnZlcnNpb24gc3VwcG9ydCBmb3IgZ2l2ZW4gbWFzayBtb2RlLiAg Ki8KKyAgbWFjaGluZV9tb2RlIG1vZGUgPSBUWVBFX01PREUgKG1hc2tfdHlw ZSk7CisgIGluc25fY29kZSBpY29kZSA9IG9wdGFiX2hhbmRsZXIgKHZlY191 bnBhY2tzX2xvX29wdGFiLCBtb2RlKTsKKyAgaWYgKGljb2RlID09IENPREVf Rk9SX25vdGhpbmcKKyAgICAgIHx8IG9wdGFiX2hhbmRsZXIgKHZlY191bnBh Y2tzX2hpX29wdGFiLCBtb2RlKSA9PSBDT0RFX0ZPUl9ub3RoaW5nKQorICAg IHJldHVybiBmYWxzZTsKKworICAvKiBNYWtlIHJlY3Vyc2l2ZSBjYWxsIGZv ciBtdWx0aS1zdGVwIGNvbnZlcnNpb24uICAqLworICBpZiAoc3RlcHMgPiAx KQorICAgIHsKKyAgICAgIG1hc2tfZWxlbXMgPSBtYXNrX2VsZW1zID4+IDE7 CisgICAgICBtYXNrX3R5cGUgPSBidWlsZF90cnV0aF92ZWN0b3JfdHlwZSAo bWFza19lbGVtcywgY3VycmVudF92ZWN0b3Jfc2l6ZSk7CisgICAgICBpZiAo VFlQRV9NT0RFIChtYXNrX3R5cGUpICE9IGluc25fZGF0YVtpY29kZV0ub3Bl cmFuZFswXS5tb2RlKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCF2 ZWN0X2NoZWNrX3JlcXVpcmVkX21hc2tzX3dpZGVuaW5nIChsb29wX3ZpbmZv LCBtYXNrX3R5cGUsCisJCQkJCSAgICAgICByZXFfZWxlbXMpKQorCXJldHVy biBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXNrX3R5 cGUgPSBidWlsZF90cnV0aF92ZWN0b3JfdHlwZSAocmVxX2VsZW1zLCBjdXJy ZW50X3ZlY3Rvcl9zaXplKTsKKyAgICAgIGlmIChUWVBFX01PREUgKG1hc2tf dHlwZSkgIT0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGUpCisJ cmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwor LyogRnVuY3Rpb24gdmVjdF9jaGVja19yZXF1aXJlZF9tYXNrc19uYXJyb3dp bmcuCisKKyAgIFJldHVybiB0cnVlIGlmIHZlY3RvciBtYXNrIG9mIHR5cGUg TUFTS19UWVBFIGNhbiBiZSBuYXJyb3dlZAorICAgdG8gYSB0eXBlIGhhdmlu ZyBSRVFfRUxFTVMgZWxlbWVudHMgaW4gYSBzaW5nbGUgdmVjdG9yLiAgKi8K Kworc3RhdGljIGJvb2wKK3ZlY3RfY2hlY2tfcmVxdWlyZWRfbWFza3NfbmFy cm93aW5nIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sCisJCQkJICAgICB0 cmVlIG1hc2tfdHlwZSwgdW5zaWduZWQgcmVxX2VsZW1zKQoreworICB1bnNp Z25lZCBtYXNrX2VsZW1zID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKG1hc2tf dHlwZSk7CisKKyAgZ2NjX2Fzc2VydCAocmVxX2VsZW1zID4gbWFza19lbGVt cyk7CisKKyAgLyogRG9uJ3QgY29udmVydCBpZiBpdCByZXF1aXJlcyB0b28g bWFueSBpbnRlcm1lZGlhdGUgc3RlcHMuICAqLworICBpbnQgc3RlcHMgPSBl eGFjdF9sb2cyIChyZXFfZWxlbXMgLyBtYXNrX2VsZW1zKTsKKyAgaWYgKHN0 ZXBzID4gTUFYX0lOVEVSTV9DVlRfU1RFUFMgKyAxKQorICAgIHJldHVybiBm YWxzZTsKKworICAvKiBDaGVjayB3ZSBoYXZlIGNvbnZlcnNpb24gc3VwcG9y dCBmb3IgZ2l2ZW4gbWFzayBtb2RlLiAgKi8KKyAgbWFjaGluZV9tb2RlIG1v ZGUgPSBUWVBFX01PREUgKG1hc2tfdHlwZSk7CisgIGluc25fY29kZSBpY29k ZSA9IG9wdGFiX2hhbmRsZXIgKHZlY19wYWNrX3RydW5jX29wdGFiLCBtb2Rl KTsKKyAgaWYgKGljb2RlID09IENPREVfRk9SX25vdGhpbmcpCisgICAgcmV0 dXJuIGZhbHNlOworCisgIC8qIE1ha2UgcmVjdXJzaXZlIGNhbGwgZm9yIG11 bHRpLXN0ZXAgY29udmVyc2lvbi4gICovCisgIGlmIChzdGVwcyA+IDEpCisg ICAgeworICAgICAgbWFza19lbGVtcyA9IG1hc2tfZWxlbXMgPDwgMTsKKyAg ICAgIG1hc2tfdHlwZSA9IGJ1aWxkX3RydXRoX3ZlY3Rvcl90eXBlIChtYXNr X2VsZW1zLCBjdXJyZW50X3ZlY3Rvcl9zaXplKTsKKyAgICAgIGlmIChUWVBF X01PREUgKG1hc2tfdHlwZSkgIT0gaW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5k WzBdLm1vZGUpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoIXZlY3Rf Y2hlY2tfcmVxdWlyZWRfbWFza3NfbmFycm93aW5nIChsb29wX3ZpbmZvLCBt YXNrX3R5cGUsCisJCQkJCQlyZXFfZWxlbXMpKQorCXJldHVybiBmYWxzZTsK KyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXNrX3R5cGUgPSBidWls ZF90cnV0aF92ZWN0b3JfdHlwZSAocmVxX2VsZW1zLCBjdXJyZW50X3ZlY3Rv cl9zaXplKTsKKyAgICAgIGlmIChUWVBFX01PREUgKG1hc2tfdHlwZSkgIT0g aW5zbl9kYXRhW2ljb2RlXS5vcGVyYW5kWzBdLm1vZGUpCisJcmV0dXJuIGZh bHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRnVuY3Rp b24gdmVjdF9nZXRfbWFza2luZ19pdl9lbGVtcy4KKworICAgUmV0dXJuIGEg bnVtYmVyIG9mIGVsZW1lbnRzIGluIElWIHVzZWQgZm9yIGxvb3AgbWFza2lu Zy4gICovCitzdGF0aWMgaW50Cit2ZWN0X2dldF9tYXNraW5nX2l2X2VsZW1z IChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCit7CisgIHRyZWUgaXZfdHlw ZSA9IFRSRUVfVFlQRSAoTE9PUF9WSU5GT19OSVRFUlMgKGxvb3BfdmluZm8p KTsKKyAgdHJlZSBpdl92ZWN0eXBlID0gZ2V0X3ZlY3R5cGVfZm9yX3NjYWxh cl90eXBlIChpdl90eXBlKTsKKworICAvKiBXZSBleHRlbmQgSVYgdHlwZSBp biBjYXNlIGl0IGlzIG5vdCBiaWcgZW5vdWdoIHRvCisgICAgIGZpbGwgZnVs bCB2ZWN0b3IuICAqLworICByZXR1cm4gTUlOICgoaW50KVRZUEVfVkVDVE9S X1NVQlBBUlRTIChpdl92ZWN0eXBlKSwKKwkgICAgICBMT09QX1ZJTkZPX1ZF Q1RfRkFDVE9SIChsb29wX3ZpbmZvKSk7Cit9CisKKy8qIEZ1bmN0aW9uIHZl Y3RfZ2V0X21hc2tpbmdfaXZfdHlwZS4KKworICAgUmV0dXJuIGEgdHlwZSBv ZiBJViB1c2VkIGZvciBsb29wIG1hc2tpbmcuICAqLworc3RhdGljIHRyZWUK K3ZlY3RfZ2V0X21hc2tpbmdfaXZfdHlwZSAobG9vcF92ZWNfaW5mbyBsb29w X3ZpbmZvKQoreworICAvKiBNYXNraW5nIElWIGlzIHRvIGJlIGNvbXBhcmVk IHRvIHZlY3RvciBvZiBOSVRFUlMgYW5kIHRoZXJlZm9yZQorICAgICB0eXBl IG9mIE5JVEVSUyBpcyB1c2VkIGFzIGEgYmFzaWMgdHlwZSBmb3IgSVYuCisg ICAgIEZJWE1FOiBJdCBjYW4gYmUgaW1wcm92ZWQgYnkgdXNpbmcgc21hbGxl ciBzaXplIHdoZW4gcG9zc2libGUKKyAgICAgZm9yIG1vcmUgZWZmaWNpZW50 IG1hc2tzIGNvbXB1dGF0aW9uLiAgKi8KKyAgdHJlZSBpdl90eXBlID0gVFJF RV9UWVBFIChMT09QX1ZJTkZPX05JVEVSUyAobG9vcF92aW5mbykpOworICB0 cmVlIGl2X3ZlY3R5cGUgPSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUg KGl2X3R5cGUpOworICB1bnNpZ25lZCB2ZiA9IExPT1BfVklORk9fVkVDVF9G QUNUT1IgKGxvb3BfdmluZm8pOworCisgIGlmIChUWVBFX1ZFQ1RPUl9TVUJQ QVJUUyAoaXZfdmVjdHlwZSkgPD0gdmYpCisgICAgcmV0dXJuIGl2X3ZlY3R5 cGU7CisKKyAgdW5zaWduZWQgZWxlbV9zaXplID0gY3VycmVudF92ZWN0b3Jf c2l6ZSAqIEJJVFNfUEVSX1VOSVQgLyB2ZjsKKyAgaXZfdHlwZSA9IGJ1aWxk X25vbnN0YW5kYXJkX2ludGVnZXJfdHlwZSAoZWxlbV9zaXplLCBUWVBFX1VO U0lHTkVEIChpdl90eXBlKSk7CisKKyAgcmV0dXJuIGdldF92ZWN0eXBlX2Zv cl9zY2FsYXJfdHlwZSAoaXZfdHlwZSk7Cit9CisKKy8qIEZ1bmN0aW9uIHZl Y3RfZ2V0X2V4dHJlbWVfbWFza3MuCisKKyAgIERldGVybWluZSBtaW5pbXVt IGFuZCBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBtYXNrcworICAg cmVxdWlyZWQgZm9yIG1hc2tpbmcgYSBsb29wIGRlc2NyaWJlZCBieSBMT09Q X1ZJTkZPLgorICAgQ29tcHV0ZWQgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBN SU5fTUFTS19FTEVNUyBhbmQKKyAgIE1BWF9NQVNLX0VMRU1TLiAgKi8KKwor c3RhdGljIHZvaWQKK3ZlY3RfZ2V0X2V4dHJlbWVfbWFza3MgKGxvb3BfdmVj X2luZm8gbG9vcF92aW5mbywKKwkJCXVuc2lnbmVkICptaW5fbWFza19lbGVt cywKKwkJCXVuc2lnbmVkICptYXhfbWFza19lbGVtcykKK3sKKyAgdW5zaWdu ZWQgcmVxdWlyZWRfbWFza3MgPSBMT09QX1ZJTkZPX1JFUVVJUkVEX01BU0tT IChsb29wX3ZpbmZvKTsKKyAgdW5zaWduZWQgZWxlbXMgPSAxOworCisgICpt aW5fbWFza19lbGVtcyA9ICptYXhfbWFza19lbGVtcyA9IHZlY3RfZ2V0X21h c2tpbmdfaXZfZWxlbXMgKGxvb3BfdmluZm8pOworCisgIHdoaWxlIChyZXF1 aXJlZF9tYXNrcykKKyAgICB7CisgICAgICBpZiAocmVxdWlyZWRfbWFza3Mg JiAxKQorCXsKKwkgIGlmIChlbGVtcyA8ICptaW5fbWFza19lbGVtcykKKwkg ICAgKm1pbl9tYXNrX2VsZW1zID0gZWxlbXM7CisJICBpZiAoZWxlbXMgPiAq bWF4X21hc2tfZWxlbXMpCisJICAgICptYXhfbWFza19lbGVtcyA9IGVsZW1z OworCX0KKyAgICAgIGVsZW1zID0gZWxlbXMgPDwgMTsKKyAgICAgIHJlcXVp cmVkX21hc2tzID0gcmVxdWlyZWRfbWFza3MgPj4gMTsKKyAgICB9Cit9CisK Ky8qIEZ1bmN0aW9uIHZlY3RfY2hlY2tfcmVxdWlyZWRfbWFza3MuCisKKyAg IEZvciBnaXZlbiBMT09QX1ZJTkZPIGNoZWNrIGFsbCByZXF1aXJlZCBtYXNr cyBjYW4gYmUgY29tcHV0ZWQuICAqLworCitzdGF0aWMgdm9pZAordmVjdF9j aGVja19yZXF1aXJlZF9tYXNrcyAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZv KQoreworICBpZiAoIUxPT1BfVklORk9fUkVRVUlSRURfTUFTS1MgKGxvb3Bf dmluZm8pKQorICAgIHJldHVybjsKKworICAvKiBGaXJzdGx5IGNoZWNrIHdl IGhhdmUgYSBwcm9wZXIgY29tcGFyaXNvbiB0byBnZXQKKyAgICAgYW4gaW5p dGlhbCBtYXNrLiAgKi8KKyAgdHJlZSBpdl92ZWN0eXBlID0gdmVjdF9nZXRf bWFza2luZ19pdl90eXBlIChsb29wX3ZpbmZvKTsKKyAgdW5zaWduZWQgaXZf ZWxlbXMgPSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoaXZfdmVjdHlwZSk7CisK KyAgdHJlZSBtYXNrX3R5cGUgPSBidWlsZF9zYW1lX3NpemVkX3RydXRoX3Zl Y3Rvcl90eXBlIChpdl92ZWN0eXBlKTsKKworICBpZiAoIWV4cGFuZF92ZWNf Y21wX2V4cHJfcCAoaXZfdmVjdHlwZSwgbWFza190eXBlLCBMVF9FWFBSKSkK KyAgICB7CisgICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCisJZHVtcF9w cmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2Nh dGlvbiwKKwkJCSAiY2Fubm90IGJlIG1hc2tlZDogcmVxdWlyZWQgdmVjdG9y IGNvbXBhcmlzb24gIgorCQkJICJpcyBub3Qgc3VwcG9ydGVkLlxuIik7Cisg ICAgICBMT09QX1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pID0g ZmFsc2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE5vdyBjaGVj ayB0aGUgd2lkZXN0IGFuZCB0aGUgbmFycm93ZXN0IG1hc2tzLgorICAgICBB bGwgaW50ZXJtZWRpYXRlIHZhbHVlcyBhcmUgb2J0YWluZWQgd2hpbGUKKyAg ICAgY29tcHV0aW5nIGV4dHJlbWUgdmFsdWVzLiAgKi8KKyAgdW5zaWduZWQg bWluX21hc2tfZWxlbXMgPSAwOworICB1bnNpZ25lZCBtYXhfbWFza19lbGVt cyA9IDA7CisKKyAgdmVjdF9nZXRfZXh0cmVtZV9tYXNrcyAobG9vcF92aW5m bywgJm1pbl9tYXNrX2VsZW1zLCAmbWF4X21hc2tfZWxlbXMpOworCisgIGlm IChtaW5fbWFza19lbGVtcyA8IGl2X2VsZW1zKQorICAgIHsKKyAgICAgIC8q IENoZWNrIG1hc2sgd2lkZW5pbmcgaXMgYXZhaWxhYmxlLiAgKi8KKyAgICAg IGlmICghdmVjdF9jaGVja19yZXF1aXJlZF9tYXNrc193aWRlbmluZyAobG9v cF92aW5mbywgbWFza190eXBlLAorCQkJCQkgICAgICAgbWluX21hc2tfZWxl bXMpKQorCXsKKwkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwkgICAgZHVt cF9wcmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9s b2NhdGlvbiwKKwkJCSAgICAgImNhbm5vdCBiZSBtYXNrZWQ6IHJlcXVpcmVk IG1hc2sgd2lkZW5pbmcgIgorCQkJICAgICAiaXMgbm90IHN1cHBvcnRlZC5c biIpOworCSAgTE9PUF9WSU5GT19DQU5fQkVfTUFTS0VEIChsb29wX3ZpbmZv KSA9IGZhbHNlOworCSAgcmV0dXJuOworCX0KKworICAgIH0KKworICBpZiAo bWF4X21hc2tfZWxlbXMgPiBpdl9lbGVtcykKKyAgICB7CisgICAgICBpZiAo IXZlY3RfY2hlY2tfcmVxdWlyZWRfbWFza3NfbmFycm93aW5nIChsb29wX3Zp bmZvLCBtYXNrX3R5cGUsCisJCQkJCQltYXhfbWFza19lbGVtcykpCisJewor CSAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCSAgICBkdW1wX3ByaW50Zl9s b2MgKE1TR19NSVNTRURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAor CQkJICAgICAiY2Fubm90IGJlIG1hc2tlZDogcmVxdWlyZWQgbWFzayBuYXJy b3dpbmcgIgorCQkJICAgICAiaXMgbm90IHN1cHBvcnRlZC5cbiIpOworCSAg TE9PUF9WSU5GT19DQU5fQkVfTUFTS0VEIChsb29wX3ZpbmZvKSA9IGZhbHNl OworCSAgcmV0dXJuOworCX0KKworICAgIH0KK30KKwogLyogRnVuY3Rpb24g dmVjdF9hbmFseXplX2xvb3Bfb3BlcmF0aW9ucy4KIAogICAgU2NhbiB0aGUg bG9vcCBzdG10cyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCB2ZWN0b3Jp emFibGUuICAqLwpAQCAtMTgxNSw2ICsyMDUwLDEyIEBAIHZlY3RfYW5hbHl6 ZV9sb29wX29wZXJhdGlvbnMgKGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbykK ICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgLyogSWYgYWxsIHN0 YXRlbWVudHMgY2FuIGJlIG1hc2tlZCB0aGVuIHdlIGFsc28gbmVlZAorICAg ICB0byBjaGVjayB3ZSBtYXkgY29tcHV0ZSByZXF1aXJlZCBtYXNrcyBhbmQg Y29tcHV0ZQorICAgICBpdHMgY29zdC4gICovCisgIGlmIChMT09QX1ZJTkZP X0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pKQorICAgIHZlY3RfY2hlY2tf cmVxdWlyZWRfbWFza3MgKGxvb3BfdmluZm8pOworCiAgIHJldHVybiB0cnVl OwogfQogCkBAIC0xOTg0LDcgKzIyMjUsNyBAQCB2ZWN0X2FuYWx5emVfbG9v cF8yIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sIGJvb2wgJmZhdGFsKQog ICBpbnQgc2F2ZWRfdmVjdG9yaXphdGlvbl9mYWN0b3IgPSBMT09QX1ZJTkZP X1ZFQ1RfRkFDVE9SIChsb29wX3ZpbmZvKTsKICAgSE9TVF9XSURFX0lOVCBl c3RpbWF0ZWRfbml0ZXI7CiAgIHVuc2lnbmVkIHRoOwotICBpbnQgbWluX3Nj YWxhcl9sb29wX2JvdW5kOworICBpbnQgbWluX3NjYWxhcl9sb29wX2JvdW5k ID0gMDsKIAogICAvKiBDaGVjayB0aGUgU0xQIG9wcG9ydHVuaXRpZXMgaW4g dGhlIGxvb3AsIGFuYWx5emUgYW5kIGJ1aWxkIFNMUCB0cmVlcy4gICovCiAg IG9rID0gdmVjdF9hbmFseXplX3NscCAobG9vcF92aW5mbywgbl9zdG10cyk7 CkBAIC0yMDA5LDYgKzIyNTAsMzQgQEAgc3RhcnRfb3ZlcjoKICAgdW5zaWdu ZWQgdmVjdG9yaXphdGlvbl9mYWN0b3IgPSBMT09QX1ZJTkZPX1ZFQ1RfRkFD VE9SIChsb29wX3ZpbmZvKTsKICAgZ2NjX2Fzc2VydCAodmVjdG9yaXphdGlv bl9mYWN0b3IgIT0gMCk7CiAKKyAgLyogRm9yIG5vdyB3ZSBtYXNrIGxvb3Ag ZXBpbG9ndWUgdXNpbmcgdGhlIHNhbWUgVkYgc2luY2UgaXQgd2FzIHVzZWQK KyAgICAgZm9yIGNvc3QgZXN0aW1hdGlvbnMgYW5kIGl0IHNob3VsZCBiZSBl YXNpZXIgZm9yIHJlZHVjdGlvbgorICAgICBvcHRpbWl6YXRpb24uICAqLwor ICBpZiAoTE9PUF9WSU5GT19FUElMT0dVRV9QIChsb29wX3ZpbmZvKQorICAg ICAgJiYgTE9PUF9WSU5GT19NQVNLX0xPT1AgKGxvb3BfdmluZm8pCisgICAg ICAmJiBMT09QX1ZJTkZPX09SSUdfVkVDVF9GQUNUT1IgKGxvb3BfdmluZm8p ICE9IChpbnQpdmVjdG9yaXphdGlvbl9mYWN0b3IpCisgICAgeworICAgICAg LyogSWYgd2UgY291bGRuJ3QgdmVjdG9yaXplIGVwaWxvZ3VlIHdpdGggbWFz a2luZyB0aGVuIHdlIG1heSBzdGlsbAorCSB0cnkgdG8gdmVjdG9yaXplIGl0 IHdpdGggYSBzbWFsbGVyIHZlY3RvciBzaXplLiAgKi8KKyAgICAgIGlmIChM T09QX1ZJTkZPX09SSUdfVkVDVF9GQUNUT1IgKGxvb3BfdmluZm8pID4gKGlu dCl2ZWN0b3JpemF0aW9uX2ZhY3RvcgorCSAgJiYgUEFSQU1fVkFMVUUgKFBB UkFNX1ZFQ1RfRVBJTE9HVUVTX05PTUFTSykpCisJeworCSAgaWYgKGR1bXBf ZW5hYmxlZF9wICgpKQorCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNT RURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAorCQkJICAgICAiY291 bGRuJ3QgbWFzayBsb29wIGVwaWxvZ3VlOyB0cnlpbmcgdG8gdmVjdG9yaXpl ICIKKwkJCSAgICAgInVzaW5nIGEgc21hbGxlciB2ZWN0b3IuXG4iKTsKKwkg IExPT1BfVklORk9fTUFTS19MT09QIChsb29wX3ZpbmZvKSA9IGZhbHNlOwor CX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZHVtcF9lbmFibGVkX3AgKCkp CisJICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJ T04sIHZlY3RfbG9jYXRpb24sCisJCQkgICAgICJub3QgdmVjdG9yaXplZDog VkYgZm9yIGxvb3AgZXBpbG9ndWUgZG9lc24ndCAiCisJCQkgICAgICJtYXRj aCBvcmlnaW5hbCBsb29wIFZGLlxuIik7CisJICByZXR1cm4gZmFsc2U7CisJ fQorICAgIH0KKwogICBpZiAoTE9PUF9WSU5GT19OSVRFUlNfS05PV05fUCAo bG9vcF92aW5mbykgJiYgZHVtcF9lbmFibGVkX3AgKCkpCiAgICAgZHVtcF9w cmludGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKIAkJICAgICAi dmVjdG9yaXphdGlvbl9mYWN0b3IgPSAlZCwgbml0ZXJzID0gIgpAQCAtMjAy MiwxMSArMjI5MSwxOCBAQCBzdGFydF9vdmVyOgogICAgICAgfHwgKG1heF9u aXRlciAhPSAtMQogCSAgJiYgKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQpIG1h eF9uaXRlciA8IHZlY3Rvcml6YXRpb25fZmFjdG9yKSkKICAgICB7Ci0gICAg ICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCi0JZHVtcF9wcmludGZfbG9jIChN U0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKLQkJCSAi bm90IHZlY3Rvcml6ZWQ6IGl0ZXJhdGlvbiBjb3VudCBzbWFsbGVyIHRoYW4g IgotCQkJICJ2ZWN0b3JpemF0aW9uIGZhY3Rvci5cbiIpOwotICAgICAgcmV0 dXJuIGZhbHNlOworICAgICAgLyogQWxsb3cgbG93IHRyaXAgY291bnQgZm9y IGxvb3AgZXBpbG9ndWUgd2Ugd2FudCB0byBtYXNrLiAgKi8KKyAgICAgIGlm IChMT09QX1ZJTkZPX0VQSUxPR1VFX1AgKGxvb3BfdmluZm8pCisJICAmJiBQ QVJBTV9WQUxVRSAoUEFSQU1fVkVDVF9FUElMT0dVRVNfTUFTSykpCisJTE9P UF9WSU5GT19NQVNLX0xPT1AgKGxvb3BfdmluZm8pID0gdHJ1ZTsKKyAgICAg IGVsc2UKKwl7CisJICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCisJICAgIGR1 bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04sIHZlY3Rf bG9jYXRpb24sCisJCQkgICAgICJub3QgdmVjdG9yaXplZDogaXRlcmF0aW9u IGNvdW50IHNtYWxsZXIgdGhhbiAiCisJCQkgICAgICJ2ZWN0b3JpemF0aW9u IGZhY3Rvci5cbiIpOworCSAgcmV0dXJuIGZhbHNlOworCX0KICAgICB9CiAK ICAgLyogQW5hbHl6ZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBkYXRhLXJlZnMg aW4gdGhlIGxvb3AuCkBAIC0yMDY0LDYgKzIzNDAsOCBAQCBzdGFydF9vdmVy OgogICAgICAgfQogICAgIH0KIAorICBMT09QX1ZJTkZPX0NBTl9CRV9NQVNL RUQgKGxvb3BfdmluZm8pID0gdHJ1ZTsKKwogICBpZiAoc2xwKQogICAgIHsK ICAgICAgIC8qIEFuYWx5emUgb3BlcmF0aW9ucyBpbiB0aGUgU0xQIGluc3Rh bmNlcy4gIE5vdGUgdGhpcyBtYXkKQEAgLTIxMjMsOCArMjQwMSwxMCBAQCBz dGFydF9vdmVyOgogICAgICAgZ290byBhZ2FpbjsKICAgICB9CiAKLSAgbWlu X3NjYWxhcl9sb29wX2JvdW5kID0gKChQQVJBTV9WQUxVRSAoUEFSQU1fTUlO X1ZFQ1RfTE9PUF9CT1VORCkKLQkJCSAgICAqIHZlY3Rvcml6YXRpb25fZmFj dG9yKSAtIDEpOworICBpZiAoIShMT09QX1ZJTkZPX0VQSUxPR1VFX1AgKGxv b3BfdmluZm8pCisJJiYgTE9PUF9WSU5GT19NQVNLX0xPT1AgKGxvb3Bfdmlu Zm8pKSkKKyAgICBtaW5fc2NhbGFyX2xvb3BfYm91bmQgPSAoKFBBUkFNX1ZB TFVFIChQQVJBTV9NSU5fVkVDVF9MT09QX0JPVU5EKQorCQkJICAgICAgKiB2 ZWN0b3JpemF0aW9uX2ZhY3RvcikgLSAxKTsKIAogICAvKiBVc2UgdGhlIGNv c3QgbW9kZWwgb25seSBpZiBpdCBpcyBtb3JlIGNvbnNlcnZhdGl2ZSB0aGFu IHVzZXIgc3BlY2lmaWVkCiAgICAgIHRocmVzaG9sZC4gICovCkBAIC0yMTc3 LDcgKzI0NTcsOSBAQCBzdGFydF9vdmVyOgogICAgICAgICAvIExPT1BfVklO Rk9fVkVDVF9GQUNUT1IgKGxvb3BfdmluZm8pKQogICAgICAgICogTE9PUF9W SU5GT19WRUNUX0ZBQ1RPUiAobG9vcF92aW5mbyk7CiAKLSAgaWYgKExPT1Bf VklORk9fTklURVJTX0tOT1dOX1AgKGxvb3BfdmluZm8pCisgIGlmIChMT09Q X1ZJTkZPX01BU0tfTE9PUCAobG9vcF92aW5mbykpCisgICAgOyAgLyogTG9v cCBlcGlsb2d1ZSBpcyBub3QgcmVxdWlyZWQuICAqLworICBlbHNlIGlmIChM T09QX1ZJTkZPX05JVEVSU19LTk9XTl9QIChsb29wX3ZpbmZvKQogICAgICAg JiYgTE9PUF9WSU5GT19QRUVMSU5HX0ZPUl9BTElHTk1FTlQgKGxvb3Bfdmlu Zm8pID4gMCkKICAgICB7CiAgICAgICBpZiAoY3R6X2h3aSAoTE9PUF9WSU5G T19JTlRfTklURVJTIChsb29wX3ZpbmZvKQpAQCAtMjMwNyw2ICsyNTg5LDcg QEAgYWdhaW46CiAgIExPT1BfVklORk9fUEVFTElOR19GT1JfTklURVIgKGxv b3BfdmluZm8pID0gZmFsc2U7CiAgIExPT1BfVklORk9fUEVFTElOR19GT1Jf R0FQUyAobG9vcF92aW5mbykgPSBmYWxzZTsKICAgTE9PUF9WSU5GT19DT1NU X01PREVMX1RIUkVTSE9MRCAobG9vcF92aW5mbykgPSAwOworICBMT09QX1ZJ TkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pID0gdHJ1ZTsKIAogICBn b3RvIHN0YXJ0X292ZXI7CiB9CkBAIC0zMjI1LDEyICszNTA4LDMyIEBAIHZl Y3RfZXN0aW1hdGVfbWluX3Byb2ZpdGFibGVfaXRlcnMgKGxvb3BfdmVjX2lu Zm8gbG9vcF92aW5mbywKICAgaW50IG5wZWVsID0gTE9PUF9WSU5GT19QRUVM SU5HX0ZPUl9BTElHTk1FTlQgKGxvb3BfdmluZm8pOwogICB2b2lkICp0YXJn ZXRfY29zdF9kYXRhID0gTE9PUF9WSU5GT19UQVJHRVRfQ09TVF9EQVRBIChs b29wX3ZpbmZvKTsKIAorICBpZiAoTE9PUF9WSU5GT19FUElMT0dVRV9QIChs b29wX3ZpbmZvKSkKKyAgICB7CisgICAgICAvKiBDdXJyZW50bHkgd2UgZG9u J3QgcHJvZHVjZSBzY2FsYXIgZXBpbG9ndWUgdmVyc2lvbiBpbiBjYXNlCisJ IGl0cyBtYXNrZWQgdmVyc2lvbiBpcyBwcm92aWRlZC4gIEl0IG1lYW5zIHdl IGRvbid0IG5lZWQgdG8KKwkgY29tcHV0ZSBwcm9maXRhYmlsaXR5IG9uZSBt b3JlIHRpbWUgaGVyZS4gIEp1c3QgbWFrZSBhCisJIG1hc2tlZCBsb29wIHZl cnNpb24uICAqLworICAgICAgaWYgKExPT1BfVklORk9fQ0FOX0JFX01BU0tF RCAobG9vcF92aW5mbykKKwkgICYmIFBBUkFNX1ZBTFVFIChQQVJBTV9WRUNU X0VQSUxPR1VFU19NQVNLKSkKKwl7CisJICBkdW1wX3ByaW50Zl9sb2MgKE1T R19OT1RFLCB2ZWN0X2xvY2F0aW9uLAorCQkJICAgImNvc3QgbW9kZWw6IG1h c2sgbG9vcCBlcGlsb2d1ZS5cbiIpOworCSAgTE9PUF9WSU5GT19NQVNLX0xP T1AgKGxvb3BfdmluZm8pID0gdHJ1ZTsKKwkgICpyZXRfbWluX3Byb2ZpdGFi bGVfbml0ZXJzID0gMDsKKwkgICpyZXRfbWluX3Byb2ZpdGFibGVfZXN0aW1h dGUgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICB9CiAgIC8qIENvc3QgbW9k ZWwgZGlzYWJsZWQuICAqLwotICBpZiAodW5saW1pdGVkX2Nvc3RfbW9kZWwg KExPT1BfVklORk9fTE9PUCAobG9vcF92aW5mbykpKQorICBlbHNlIGlmICh1 bmxpbWl0ZWRfY29zdF9tb2RlbCAoTE9PUF9WSU5GT19MT09QIChsb29wX3Zp bmZvKSkpCiAgICAgewogICAgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTk9U RSwgdmVjdF9sb2NhdGlvbiwgImNvc3QgbW9kZWwgZGlzYWJsZWQuXG4iKTsK ICAgICAgICpyZXRfbWluX3Byb2ZpdGFibGVfbml0ZXJzID0gMDsKICAgICAg ICpyZXRfbWluX3Byb2ZpdGFibGVfZXN0aW1hdGUgPSAwOworICAgICAgaWYg KFBBUkFNX1ZBTFVFIChQQVJBTV9WRUNUX0VQSUxPR1VFU19NQVNLKQorCSAg JiYgTE9PUF9WSU5GT19DQU5fQkVfTUFTS0VEIChsb29wX3ZpbmZvKSkKKwlM T09QX1ZJTkZPX01BU0tfTE9PUCAobG9vcF92aW5mbykgPSB0cnVlOwogICAg ICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTUyMyw2ICs1ODI2LDcgQEAgdmVj dG9yaXphYmxlX3JlZHVjdGlvbiAoZ2ltcGxlICpzdG10LCBnaW1wbGVfc3Rt dF9pdGVyYXRvciAqZ3NpLAogICAgICAgb3V0ZXJfbG9vcCA9IGxvb3A7CiAg ICAgICBsb29wID0gbG9vcC0+aW5uZXI7CiAgICAgICBuZXN0ZWRfY3ljbGUg PSB0cnVlOworICAgICAgTE9PUF9WSU5GT19DQU5fQkVfTUFTS0VEIChsb29w X3ZpbmZvKSA9IGZhbHNlOyAgLyogTm90IHN1cHBvcnRlZCB5ZXQuICAqLwog ICAgIH0KIAogICAvKiAxLiBJcyB2ZWN0b3JpemFibGUgcmVkdWN0aW9uPyAg Ki8KQEAgLTU3NzcsNiArNjA4MSwxOCBAQCB2ZWN0b3JpemFibGVfcmVkdWN0 aW9uIChnaW1wbGUgKnN0bXQsIGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2ks CiAKICAgZ2NjX2Fzc2VydCAobmNvcGllcyA+PSAxKTsKIAorICBpZiAoc2xw X25vZGUgfHwgUFVSRV9TTFBfU1RNVCAoc3RtdF9pbmZvKSB8fCBjb2RlID09 IENPTkRfRVhQUgorICAgICAgfHwgU1RNVF9WSU5GT19WRUNfUkVEVUNUSU9O X1RZUEUgKHN0bXRfaW5mbykgPT0gQ09ORF9SRURVQ1RJT04KKyAgICAgIHx8 IFNUTVRfVklORk9fVkVDX1JFRFVDVElPTl9UWVBFIChzdG10X2luZm8pCisJ ID09IElOVEVHRVJfSU5EVUNfQ09ORF9SRURVQ1RJT04pCisgICAgeworICAg ICAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCWR1bXBfcHJpbnRmX2xvYyAo TVNHX01JU1NFRF9PUFRJTUlaQVRJT04sIHZlY3RfbG9jYXRpb24sCisJCQkg ImNhbm5vdCBiZSBtYXNrZWQ6IHVuc3VwcG9ydGVkIGNvbmRpdGlvbmFsICIK KwkJCSAicmVkdWN0aW9uXG4iKTsKKyAgICAgIExPT1BfVklORk9fQ0FOX0JF X01BU0tFRCAobG9vcF92aW5mbykgPSBmYWxzZTsKKyAgICB9CisKICAgdmVj X21vZGUgPSBUWVBFX01PREUgKHZlY3R5cGVfaW4pOwogCiAgIGlmIChjb2Rl ID09IENPTkRfRVhQUikKQEAgLTYwNTgsNiArNjM3NCwyMCBAQCB2ZWN0b3Jp emFibGVfcmVkdWN0aW9uIChnaW1wbGUgKnN0bXQsIGdpbXBsZV9zdG10X2l0 ZXJhdG9yICpnc2ksCiAJfQogICAgIH0KIAorICBpZiAobG9vcF92aW5mbyAm JiBMT09QX1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pKQorICAg IHsKKyAgICAgIC8qIENoZWNrIHRoYXQgbWFza2luZyBvZiByZWR1Y3Rpb24g aXMgc3VwcG9ydGVkLiAgKi8KKyAgICAgIHRyZWUgbWFza192dHlwZSA9IGJ1 aWxkX3NhbWVfc2l6ZWRfdHJ1dGhfdmVjdG9yX3R5cGUgKHZlY3R5cGVfb3V0 KTsKKyAgICAgIGlmICghZXhwYW5kX3ZlY19jb25kX2V4cHJfcCAodmVjdHlw ZV9vdXQsIG1hc2tfdnR5cGUsIEVRX0VYUFIpKQorCXsKKwkgIGlmIChkdW1w X2VuYWJsZWRfcCAoKSkKKwkgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTUlT U0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKKwkJCSAgICAgImNh bm5vdCBiZSBtYXNrZWQ6IHJlcXVpcmVkIHZlY3RvciBjb25kaXRpb25hbCAi CisJCQkgICAgICJleHByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsK KwkgIExPT1BfVklORk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykgPSBm YWxzZTsKKwl9CisgICAgfQorCiAgIGlmICghdmVjX3N0bXQpIC8qIHRyYW5z Zm9ybWF0aW9uIG5vdCByZXF1aXJlZC4gICovCiAgICAgewogICAgICAgaWYg KGZpcnN0X3AKQEAgLTY0ODIsNiArNjgxMiwxNCBAQCB2ZWN0b3JpemFibGVf aW5kdWN0aW9uIChnaW1wbGUgKnBoaSwKICAgaWYgKGdpbXBsZV9jb2RlIChw aGkpICE9IEdJTVBMRV9QSEkpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIGlm IChsb29wX3ZpbmZvICYmIExPT1BfVklORk9fQ0FOX0JFX01BU0tFRCAobG9v cF92aW5mbykpCisgICAgeworICAgICAgTE9PUF9WSU5GT19DQU5fQkVfTUFT S0VEIChsb29wX3ZpbmZvKSA9IGZhbHNlOworICAgICAgaWYgKGR1bXBfZW5h YmxlZF9wICgpKQorCWR1bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJ TUlaQVRJT04sIHZlY3RfbG9jYXRpb24sCisJCQkgImNhbm5vdCBiZSBtYXNr ZWQ6IHVuc3VwcG9ydGVkIGluZHVjdGlvbi5cbiIpOworICAgIH0KKwogICBp ZiAoIXZlY19zdG10KSAvKiB0cmFuc2Zvcm1hdGlvbiBub3QgcmVxdWlyZWQu ICAqLwogICAgIHsKICAgICAgIFNUTVRfVklORk9fVFlQRSAoc3RtdF9pbmZv KSA9IGluZHVjX3ZlY19pbmZvX3R5cGU7CkBAIC02NzA0LDYgKzcwNDIsNTI0 IEBAIGxvb3Bfbml0ZXJzX25vX292ZXJmbG93IChsb29wX3ZlY19pbmZvIGxv b3BfdmluZm8pCiAgIHJldHVybiBmYWxzZTsKIH0KIAorLyogRnVuY3Rpb24g dmVjdF9nZW5faXZzX2Zvcl9tYXNraW5nLgorCisgICBDcmVhdGUgSVZzIHRv IGJlIHVzZWQgZm9yIG1hc2tzIGNvbXB1dGF0aW9uIHRvIG1hc2sgbG9vcCBk ZXNjcmliZWQKKyAgIGJ5IExPT1BfVklORk8uICBDcmVhdGVkIElWcyBhcmUg c3RvcmVkIGluIElWUyB2ZWN0b3IuICAuCisKKyAgIEluaXRpYWwgSVYgdmFs dWVzIGlzIHswLCAxLCAuLi4sIFZGIC0gMX0gKHByb2JhYmx5IHNwbGl0IGlu dG8gc2V2ZXJhbAorICAgdmVjdG9ycywgaW4gdGhpcyBjYXNlIElWUydzIGVs ZW1lbnRzIHdpdGggbG93ZXIgaW5kZXggaG9sZCBJViB3aXRoCisgICBzbWFs bGVyIG51bWJlcnMpLiAgSVYgc3RlcCBpcyB7VkYsIFZGLCAuLi4sIFZGfS4g IFZGIGlzIGEgdXNlZAorICAgdmVjdG9yaXphdGlvbiBmYWN0b3IuICAqLwor CitzdGF0aWMgdm9pZAordmVjdF9nZW5faXZzX2Zvcl9tYXNraW5nIChsb29w X3ZlY19pbmZvIGxvb3BfdmluZm8sIHZlYzx0cmVlPiAqaXZzKQoreworICBz dHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAobG9vcF92aW5m byk7CisgIHRyZWUgdmVjdHlwZSA9IHZlY3RfZ2V0X21hc2tpbmdfaXZfdHlw ZSAobG9vcF92aW5mbyk7CisgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAodmVj dHlwZSk7CisgIGludCB2ZiA9IExPT1BfVklORk9fVkVDVF9GQUNUT1IgKGxv b3BfdmluZm8pOworICB1bnNpZ25lZCBlbGVtcyA9IFRZUEVfVkVDVE9SX1NV QlBBUlRTICh2ZWN0eXBlKTsKKyAgaW50IG5jb3BpZXMgID0gdmYgLyBlbGVt czsKKyAgaW50IGksIGs7CisgIHRyZWUgaXYsIGluaXRfdmFsLCBzdGVwX3Zh bDsKKyAgYm9vbCBpbnNlcnRfYWZ0ZXI7CisgIGdpbXBsZV9zdG10X2l0ZXJh dG9yIGdzaTsKKyAgdHJlZSAqdnRlbXA7CisKKyAgLyogQ3JlYXRlIHtWRiwg Li4uLCBWRn0gdmVjdG9yIGNvbnN0YW50LiAgKi8KKyAgc3RlcF92YWwgPSBi dWlsZF92ZWN0b3JfZnJvbV92YWwgKHZlY3R5cGUsIGJ1aWxkX2ludF9jc3Qg KHR5cGUsIHZmKSk7CisKKyAgdnRlbXAgPSBYQUxMT0NBVkVDICh0cmVlLCB2 Zik7CisgIGZvciAoaSA9IDA7IGkgPCBuY29waWVzOyBpKyspCisgICAgewor ICAgICAgLyogQ3JlYXRlIGluaXRpYWwgSVYgdmFsdWUuICAqLworICAgICAg Zm9yIChrID0gMDsgayA8IHZmOyBrKyspCisJdnRlbXBba10gPSBidWlsZF9p bnRfY3N0ICh0eXBlLCBrICsgaSAqIGVsZW1zKTsKKyAgICAgIGluaXRfdmFs ID0gYnVpbGRfdmVjdG9yICh2ZWN0eXBlLCB2dGVtcCk7CisKKyAgICAgIC8q IENyZWF0ZSBhbiBpbmR1Y3RpdmUgdmFyaWFibGUgaW5jbHVkaW5nIHBoaSBu b2RlLiAgKi8KKyAgICAgIHN0YW5kYXJkX2l2X2luY3JlbWVudF9wb3NpdGlv biAobG9vcCwgJmdzaSwgJmluc2VydF9hZnRlcik7CisgICAgICBjcmVhdGVf aXYgKGluaXRfdmFsLCBzdGVwX3ZhbCwgTlVMTCwgbG9vcCwgJmdzaSwgaW5z ZXJ0X2FmdGVyLAorCQkgJml2LCBOVUxMKTsKKyAgICAgIGl2cy0+c2FmZV9w dXNoIChpdik7CisgICAgfQorfQorCisvKiBGdW5jdGlvbiB2ZWN0X2dldF9t YXNrX2luZGV4X2Zvcl9lbGVtcy4KKworICAgQSBoZWxwZXIgZnVuY3Rpb24g dG8gYWNjZXNzIG1hc2tzIHZlY3Rvci4gIFNlZSB2ZWN0X2dlbl9sb29wX21h c2tzCisgICBmb3IgbWFza3MgdmVjdG9yIHNvcnRpbmcgZGVzY3JpcHRpb24u ICBSZXR1cm4gaW5kZXggb2YgdGhlIGZpcnN0CisgICBtYXNrIGhhdmluZyBN QVNLX0VMRU1TIGVsZW1lbnRzLiAgKi8KKworc3RhdGljIGlubGluZSB1bnNp Z25lZAordmVjdF9nZXRfbWFza19pbmRleF9mb3JfZWxlbXMgKHVuc2lnbmVk IG1hc2tfZWxlbXMpCit7CisgIHJldHVybiBjdXJyZW50X3ZlY3Rvcl9zaXpl IC8gbWFza19lbGVtcyAtIDE7Cit9CisKKy8qIEZ1bmN0aW9uIHZlY3RfZ2V0 X21hc2tfaW5kZXhfZm9yX3R5cGUuCisKKyAgIEEgaGVscGVyIGZ1bmN0aW9u IHRvIGFjY2VzcyBtYXNrcyB2ZWN0b3IuICBTZWUgdmVjdF9nZW5fbG9vcF9t YXNrcworICAgZm9yIG1hc2tzIHZlY3RvciBzb3J0aW5nIGRlc2NyaXB0aW9u LiAgUmV0dXJuIGluZGV4IG9mIHRoZSBmaXJzdAorICAgbWFzayBhcHByb3By aWF0ZSBmb3IgVkVDVFlQRS4gICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWdu ZWQKK3ZlY3RfZ2V0X21hc2tfaW5kZXhfZm9yX3R5cGUgKHRyZWUgdmVjdHlw ZSkKK3sKKyAgdW5zaWduZWQgZWxlbXMgPSBUWVBFX1ZFQ1RPUl9TVUJQQVJU UyAodmVjdHlwZSk7CisgIHJldHVybiB2ZWN0X2dldF9tYXNrX2luZGV4X2Zv cl9lbGVtcyAoZWxlbXMpOworfQorCisvKiBGdW5jdGlvbiB2ZWN0X2NyZWF0 ZV9uYXJyb3dlZF9tYXNrcy4KKworICAgQ3JlYXRlIG1hc2tzIGJ5IG5hcnJv d2luZyBOTUFTS1MgYmFzZSBtYXNrcyBoYXZpbmcgQkFTRV9NQVNLX0VMRU1T CisgICBlbGVtZW50cyBlYWNoIGFuZCBwdXQgdGhlbSBpbnRvIE1BU0tTIHZl Y3Rvci4gIE1BWF9NQVNLX0VMRU1TIGhvbGRzCisgICB0aGUgbWF4aW11bSBu dW1iZXIgb2YgZWxlbWVudHMgaW4gYSBtYXNrIHJlcXVpcmVkLiAgR2VuZXJh dGVkCisgICBzdGF0ZW1lbnRzIGFyZSBpbnNlcnRlZCBiZWZvcmUgR1NJLiAg Ki8KK3N0YXRpYyB2b2lkCit2ZWN0X2NyZWF0ZV9uYXJyb3dlZF9tYXNrcyAo dmVjPHRyZWU+ICptYXNrcywgdW5zaWduZWQgbm1hc2tzLAorCQkJICAgIHVu c2lnbmVkIGJhc2VfbWFza19lbGVtcywgdW5zaWduZWQgbWF4X21hc2tfZWxl bXMsCisJCQkgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkKK3sKKyAg dW5zaWduZWQgY3VyX21hc2tfZWxlbXMgPSBiYXNlX21hc2tfZWxlbXM7Cisg IHVuc2lnbmVkIGN1cl9tYXNrLCBwcmV2X21hc2s7CisgIHVuc2lnbmVkIHZl Y19zaXplID0gY3VycmVudF92ZWN0b3Jfc2l6ZTsKKyAgdHJlZSBtYXNrX3R5 cGUsIG1hc2s7CisgIGdpbXBsZSAqc3RtdDsKKworICB3aGlsZSAoY3VyX21h c2tfZWxlbXMgPCBtYXhfbWFza19lbGVtcykKKyAgICB7CisgICAgICBwcmV2 X21hc2sgPSB2ZWN0X2dldF9tYXNrX2luZGV4X2Zvcl9lbGVtcyAoY3VyX21h c2tfZWxlbXMpOworCisgICAgICBjdXJfbWFza19lbGVtcyA8PD0gMTsKKyAg ICAgIG5tYXNrcyA+Pj0gMTsKKworICAgICAgY3VyX21hc2sgPSB2ZWN0X2dl dF9tYXNrX2luZGV4X2Zvcl9lbGVtcyAoY3VyX21hc2tfZWxlbXMpOworCisg ICAgICBtYXNrX3R5cGUgPSBidWlsZF90cnV0aF92ZWN0b3JfdHlwZSAoY3Vy X21hc2tfZWxlbXMsIHZlY19zaXplKTsKKworICAgICAgZm9yICh1bnNpZ25l ZCBpID0gMDsgaSA8IG5tYXNrczsgaSsrKQorCXsKKwkgIHRyZWUgbWFza19s b3cgPSAoKm1hc2tzKVtwcmV2X21hc2srK107CisJICB0cmVlIG1hc2tfaGkg PSAoKm1hc2tzKVtwcmV2X21hc2srK107CisJICBtYXNrID0gdmVjdF9nZXRf bmV3X3NzYV9uYW1lIChtYXNrX3R5cGUsIHZlY3RfbWFza192YXIpOworCSAg c3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKG1hc2ssIFZFQ19QQUNLX1RS VU5DX0VYUFIsCisJCQkJICAgICAgbWFza19sb3csIG1hc2tfaGkpOworCSAg Z3NpX2luc2VydF9iZWZvcmUgKGdzaSwgc3RtdCwgR1NJX1NBTUVfU1RNVCk7 CisJICAoKm1hc2tzKVtjdXJfbWFzaysrXSA9IG1hc2s7CisJfQorICAgIH0K K30KKworLyogRnVuY3Rpb24gdmVjdF9jcmVhdGVfd2lkZW5lZF9tYXNrcy4K KworICAgQ3JlYXRlIG1hc2tzIGJ5IHdpZGVuaW5nIE5NQVNLUyBiYXNlIG1h c2tzIGhhdmluZyBCQVNFX01BU0tfRUxFTVMKKyAgIGVsZW1lbnRzIGVhY2gg YW5kIHB1dCB0aGVtIGludG8gTUFTS1MgdmVjdG9yLiAgTUlOX01BU0tfRUxF TVMgaG9sZHMKKyAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyBp biBhIG1hc2sgcmVxdWlyZWQuICBHZW5lcmF0ZWQKKyAgIHN0YXRlbWVudHMg YXJlIGluc2VydGVkIGJlZm9yZSBHU0kuICAqLworc3RhdGljIHZvaWQKK3Zl Y3RfY3JlYXRlX3dpZGVuZWRfbWFza3MgKHZlYzx0cmVlPiAqbWFza3MsIHVu c2lnbmVkIG5tYXNrcywKKwkJCSAgIHVuc2lnbmVkIGJhc2VfbWFza19lbGVt cywgdW5zaWduZWQgbWluX21hc2tfZWxlbXMsCisJCQkgICBnaW1wbGVfc3Rt dF9pdGVyYXRvciAqZ3NpKQoreworICB1bnNpZ25lZCBjdXJfbWFza19lbGVt cyA9IGJhc2VfbWFza19lbGVtczsKKyAgdW5zaWduZWQgY3VyX21hc2ssIHBy ZXZfbWFzazsKKyAgdW5zaWduZWQgdmVjX3NpemUgPSBjdXJyZW50X3ZlY3Rv cl9zaXplOworICB0cmVlIG1hc2tfdHlwZSwgbWFzazsKKyAgZ2ltcGxlICpz dG10OworCisgIHdoaWxlIChjdXJfbWFza19lbGVtcyA+IG1pbl9tYXNrX2Vs ZW1zKQorICAgIHsKKyAgICAgIHByZXZfbWFzayA9IHZlY3RfZ2V0X21hc2tf aW5kZXhfZm9yX2VsZW1zIChjdXJfbWFza19lbGVtcyk7CisKKyAgICAgIGN1 cl9tYXNrX2VsZW1zID4+PSAxOworICAgICAgbm1hc2tzIDw8PSAxOworCisg ICAgICBjdXJfbWFzayA9IHZlY3RfZ2V0X21hc2tfaW5kZXhfZm9yX2VsZW1z IChjdXJfbWFza19lbGVtcyk7CisKKyAgICAgIG1hc2tfdHlwZSA9IGJ1aWxk X3RydXRoX3ZlY3Rvcl90eXBlIChjdXJfbWFza19lbGVtcywgdmVjX3NpemUp OworCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbm1hc2tzOyBp ICs9IDIpCisJeworCSAgdHJlZSBvcmlnX21hc2sgPSAoKm1hc2tzKVtwcmV2 X21hc2srK107CisKKwkgIG1hc2sgPSB2ZWN0X2dldF9uZXdfc3NhX25hbWUg KG1hc2tfdHlwZSwgdmVjdF9tYXNrX3Zhcik7CisJICBzdG10ID0gZ2ltcGxl X2J1aWxkX2Fzc2lnbiAobWFzaywgVkVDX1VOUEFDS19MT19FWFBSLCBvcmln X21hc2spOworCSAgZ3NpX2luc2VydF9iZWZvcmUgKGdzaSwgc3RtdCwgR1NJ X1NBTUVfU1RNVCk7CisJICAoKm1hc2tzKVtjdXJfbWFzaysrXSA9IG1hc2s7 CisKKwkgIG1hc2sgPSB2ZWN0X2dldF9uZXdfc3NhX25hbWUgKG1hc2tfdHlw ZSwgdmVjdF9tYXNrX3Zhcik7CisJICBzdG10ID0gZ2ltcGxlX2J1aWxkX2Fz c2lnbiAobWFzaywgVkVDX1VOUEFDS19ISV9FWFBSLCBvcmlnX21hc2spOwor CSAgZ3NpX2luc2VydF9iZWZvcmUgKGdzaSwgc3RtdCwgR1NJX1NBTUVfU1RN VCk7CisJICAoKm1hc2tzKVtjdXJfbWFzaysrXSA9IG1hc2s7CisJfQorICAg IH0KK30KKworLyogRnVuY3Rpb24gdmVjdF9nZW5fbG9vcF9tYXNrcy4KKwor ICAgQ3JlYXRlIG1hc2tzIHRvIG1hc2sgYSBsb29wIGRlc2NyaWJlZCBieSBM T09QX1ZJTkZPLiAgTWFza3MKKyAgIGFyZSBjcmVhdGVkIGFjY29yZGluZyB0 byBMT09QX1ZJTkZPX1JFUVVJUkVEX01BU0tTIGFuZCBhcmUgc3RvcmVkCisg ICBpbnRvIE1BU0tTIHZlY3Rvci4KKworICAgSW5kZXggb2YgYSBtYXNrIGlu IGEgdmVjdG9yIGlzIGNvbXB1dGVkIGFjY29yZGluZyB0byBhIG51bWJlcgor ICAgb2YgbWFza3MncyBlbGVtZW50cy4gIE1hc2tzIGFyZSBzb3J0ZWQgYnkg bnVtYmVyIG9mIGl0cyBlbGVtZW50cworICAgaW4gZGVzY2VuZGluZyBvcmRl ci4gIEluZGV4IDAgaXMgdXNlZCB0byBhY2Nlc3MgYSBtYXNrIHdpdGgKKyAg IGN1cnJlbnRfdmVjdG9yX3NpemUgZWxlbWVudHMuICBBbW9uZyBtYXNrcyB3 aXRoIHRoZSBzYW1lIG51bWJlcgorICAgb2YgZWxlbWVudHMgdGhlIG9uZSB3 aXRoIGxvd2VyIGluZGV4IGlzIHVzZWQgdG8gbWFzayBpdGVyYXRpb25zCisg ICB3aXRoIHNtYWxsZXIgaXRlcmF0aW9uIGNvdW50ZXIuICBOb3RlIHRoYXQg dmVjdG9yIG1heSBoYXZlIE5VTEwgdmFsdWVzCisgICBmb3IgbWFza3Mgd2hp Y2ggYXJlIG5vdCByZXF1aXJlZC4gIFVzZSB2ZWN0X2dldF9tYXNrX2luZGV4 X2Zvcl9lbGVtcworICAgb3IgdmVjdF9nZXRfbWFza19pbmRleF9mb3JfdHlw ZSB0byBhY2Nlc3MgcmVzdWx0aW5nIHZlY3Rvci4gICovCisKK3N0YXRpYyB2 b2lkCit2ZWN0X2dlbl9sb29wX21hc2tzIChsb29wX3ZlY19pbmZvIGxvb3Bf dmluZm8sIHZlYzx0cmVlPiAqbWFza3MpCit7CisgIHN0cnVjdCBsb29wICps b29wID0gTE9PUF9WSU5GT19MT09QIChsb29wX3ZpbmZvKTsKKyAgZWRnZSBw ZSA9IGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApOworICB0cmVlIG5pdGVy cyA9IExPT1BfVklORk9fTklURVJTIChsb29wX3ZpbmZvKTsKKyAgdW5zaWdu ZWQgbWluX21hc2tfZWxlbXMsIG1heF9tYXNrX2VsZW1zLCBubWFza3M7Cisg IHVuc2lnbmVkIGl2X2VsZW1zLCBjdXJfbWFzazsKKyAgYXV0b192ZWM8dHJl ZT4gaXZzOworICB0cmVlIHZlY3R5cGUsIG1hc2tfdHlwZTsKKyAgdHJlZSB2 ZWNfbml0ZXJzLCB2ZWNfbml0ZXJzX3ZhbCwgbWFzazsKKyAgZ2ltcGxlICpz dG10OworICBiYXNpY19ibG9jayBiYjsKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgZ3NpID0gZ3NpX2FmdGVyX2xhYmVscyAobG9vcC0+aGVhZGVyKTsKKwor ICAvKiBDcmVhdGUgcmVxdWlyZWQgSVZzLiAgKi8KKyAgdmVjdF9nZW5faXZz X2Zvcl9tYXNraW5nIChsb29wX3ZpbmZvLCAmaXZzKTsKKyAgdmVjdHlwZSA9 IFRSRUVfVFlQRSAoaXZzWzBdKTsKKworICBpdl9lbGVtcyA9IFRZUEVfVkVD VE9SX1NVQlBBUlRTICh2ZWN0eXBlKTsKKworICAvKiBHZXQgYSBwcm9wZXIg bml0ZXIgdG8gYnVpbGQgYSB2ZWN0b3IuICAqLworICBpZiAoIWlzX2dpbXBs ZV92YWwgKG5pdGVycykpCisgICAgeworICAgICAgZ2ltcGxlX3NlcSBzZXEg PSBOVUxMOworICAgICAgbml0ZXJzID0gZm9yY2VfZ2ltcGxlX29wZXJhbmQg KG5pdGVycywgJnNlcSwgdHJ1ZSwgTlVMTCk7CisgICAgICBnc2lfaW5zZXJ0 X3NlcV9vbl9lZGdlX2ltbWVkaWF0ZSAocGUsIHNlcSk7CisgICAgfQorCisg IC8qIFdlIG1heSBuZWVkIGEgdHlwZSBjYXN0IGluIGNhc2Ugbml0ZXIgaGFz IGEgdG9vIHNtYWxsIHR5cGUKKyAgICAgZm9yIGdlbmVyYXRlZCBJVnMuICAq LworICBpZiAoIXR5cGVzX2NvbXBhdGlibGVfcCAoVFJFRV9UWVBFICh2ZWN0 eXBlKSwgVFJFRV9UWVBFIChuaXRlcnMpKSkKKyAgICB7CisgICAgICB0cmVl IG5ld19uaXRlcnMgPSBtYWtlX3RlbXBfc3NhX25hbWUgKFRSRUVfVFlQRSAo dmVjdHlwZSksCisJCQkJCSAgICBOVUxMLCAibml0ZXJzIik7CisgICAgICBz dG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAobmV3X25pdGVycywgQ09OVkVS VF9FWFBSLCBuaXRlcnMpOworICAgICAgYmIgPSBnc2lfaW5zZXJ0X29uX2Vk Z2VfaW1tZWRpYXRlIChwZSwgc3RtdCk7CisgICAgICBnY2NfYXNzZXJ0ICgh YmIpOworICAgICAgbml0ZXJzID0gbmV3X25pdGVyczsKKyAgICB9CisKKyAg LyogQ3JlYXRlIHtOSVRFUlMsIC4uLiwgTklURVJTfSB2ZWN0b3IgYW5kIHB1 dCB0byBTU0FfTkFNRS4gICovCisgIHZlY19uaXRlcnNfdmFsID0gYnVpbGRf dmVjdG9yX2Zyb21fdmFsICh2ZWN0eXBlLCBuaXRlcnMpOworICB2ZWNfbml0 ZXJzID0gdmVjdF9nZXRfbmV3X3NzYV9uYW1lICh2ZWN0eXBlLCB2ZWN0X3Np bXBsZV92YXIsICJuaXRlcnMiKTsKKyAgc3RtdCA9IGdpbXBsZV9idWlsZF9h c3NpZ24gKHZlY19uaXRlcnMsIHZlY19uaXRlcnNfdmFsKTsKKyAgYmIgPSBn c2lfaW5zZXJ0X29uX2VkZ2VfaW1tZWRpYXRlIChwZSwgc3RtdCk7CisgIGdj Y19hc3NlcnQgKCFiYik7CisKKyAgLyogRGV0ZXJtaW5lIHdoaWNoIG1hc2tz IHdlIG5lZWQgdG8gY29tcHV0ZSBhbmQgaG93IG1hbnkuICAqLworICB2ZWN0 X2dldF9leHRyZW1lX21hc2tzIChsb29wX3ZpbmZvLCAmbWluX21hc2tfZWxl bXMsICZtYXhfbWFza19lbGVtcyk7CisgIG5tYXNrcyA9IHZlY3RfZ2V0X21h c2tfaW5kZXhfZm9yX2VsZW1zIChNSU4gKG1pbl9tYXNrX2VsZW1zLCBpdl9l bGVtcykgLyAyKTsKKyAgbWFza3MtPnNhZmVfZ3Jvd19jbGVhcmVkIChubWFz a3MpOworCisgIC8qIE5vdyBjcmVhdGUgYmFzZSBtYXNrcyB0aHJvdWdoIGNv bXBhcmlzb24gSVYgPCBWRUNfTklURVJTLiAgKi8KKyAgbWFza190eXBlID0g YnVpbGRfc2FtZV9zaXplZF90cnV0aF92ZWN0b3JfdHlwZSAodmVjdHlwZSk7 CisgIGN1cl9tYXNrID0gdmVjdF9nZXRfbWFza19pbmRleF9mb3JfZWxlbXMg KGl2X2VsZW1zKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl2cy5s ZW5ndGggKCk7IGkrKykKKyAgICB7CisgICAgICB0cmVlIGl2ID0gaXZzW2ld OworICAgICAgbWFzayA9IHZlY3RfZ2V0X25ld19zc2FfbmFtZSAobWFza190 eXBlLCB2ZWN0X21hc2tfdmFyKTsKKyAgICAgIHN0bXQgPSBnaW1wbGVfYnVp bGRfYXNzaWduIChtYXNrLCBMVF9FWFBSLCBpdiwgdmVjX25pdGVycyk7Cisg ICAgICBnc2lfaW5zZXJ0X2JlZm9yZSAoJmdzaSwgc3RtdCwgR1NJX1NBTUVf U1RNVCk7CisgICAgICAoKm1hc2tzKVtjdXJfbWFzaysrXSA9IG1hc2s7Cisg ICAgfQorCisgIHZlY3RfY3JlYXRlX25hcnJvd2VkX21hc2tzIChtYXNrcywg aXZzLmxlbmd0aCAoKSwgaXZfZWxlbXMsCisJCQkgICAgICBtYXhfbWFza19l bGVtcywgJmdzaSk7CisKKyAgdmVjdF9jcmVhdGVfd2lkZW5lZF9tYXNrcyAo bWFza3MsIGl2cy5sZW5ndGggKCksIGl2X2VsZW1zLAorCQkJICAgICBtaW5f bWFza19lbGVtcywgJmdzaSk7Cit9CisKKy8qIEZ1bmN0aW9uIHZlY3RfbWFz a19yZWR1Y3Rpb25fc3RtdC4KKworICAgTWFzayBnaXZlbiB2ZWN0b3JpemVk IHJlZHVjdGlvbiBzdGF0ZW1lbnQgU1RNVCB1c2luZworICAgTUFTSy4gIElu IGNhc2Ugc2NhbGFyIHJlZHVjdGlvbiBzdGF0ZW1lbnQgaXMgdmVjdG9yaXpl ZAorICAgaW50byBzZXZlcmFsIHZlY3RvciBzdGF0ZW1lbnRzIHRoZW4gUFJF ViBob2xkcyBhCisgICBwcmVjZWRpbmcgdmVjdG9yIHN0YXRlbWVudCBjb3B5 IGZvciBTVE1ULgorCisgICBNYXNraW5nIGlzIHBlcmZvcm1lZCB1c2luZyBW RUNfQ09ORF9FWFBSOgorCisgICBTMTogcl8xID0gcl8yICsgZF8zCisKKyAg IGlzIHRyYW5zZm9ybWVkIGludG8KKworICAgUzEnOiByXzQgPSByXzIgKyBk XzMKKyAgIFMyJzogcl8xID0gVkVDX0NPTkRfRVhQUjxNQVNLLCByXzQsIHJf Mj4KKworICAgUmV0dXJuIGdlbmVyYXRlZCBjb25kaXRpb24gc3RhdGVtZW50 LiAgKi8KKworc3RhdGljIGdpbXBsZSAqCit2ZWN0X21hc2tfcmVkdWN0aW9u X3N0bXQgKGdpbXBsZSAqc3RtdCwgdHJlZSBtYXNrLCBnaW1wbGUgKnByZXYp Cit7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKyAgdHJlZSB2ZWN0 eXBlOworICB0cmVlIGxocywgcmhzLCB0bXA7CisgIGdpbXBsZSAqbmV3X3N0 bXQsICpwaGk7CisKKyAgbGhzID0gZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQp OworICB2ZWN0eXBlID0gVFJFRV9UWVBFIChsaHMpOworCisgIGdjY19hc3Nl cnQgKFRZUEVfVkVDVE9SX1NVQlBBUlRTICh2ZWN0eXBlKQorCSAgICAgID09 IFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVFX1RZUEUgKG1hc2spKSk7CisK KyAgLyogRmluZCBvcGVyYW5kIFJIUyBkZWZpbmVkIGJ5IFBISSBub2RlLiAg Ki8KKyAgcmhzID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKKyAgZ2Nj X2Fzc2VydCAoVFJFRV9DT0RFIChyaHMpID09IFNTQV9OQU1FKTsKKyAgcGhp ID0gU1NBX05BTUVfREVGX1NUTVQgKHJocyk7CisKKyAgaWYgKHBoaSAhPSBw cmV2ICYmIGdpbXBsZV9jb2RlIChwaGkpICE9IEdJTVBMRV9QSEkpCisgICAg eworICAgICAgcmhzID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChzdG10KTsKKyAg ICAgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAocmhzKSA9PSBTU0FfTkFNRSk7 CisgICAgICBwaGkgPSBTU0FfTkFNRV9ERUZfU1RNVCAocmhzKTsKKyAgICAg IGdjY19hc3NlcnQgKHBoaSA9PSBwcmV2IHx8IGdpbXBsZV9jb2RlIChwaGkp ID09IEdJTVBMRV9QSEkpOworICAgIH0KKworICAvKiBDb252ZXJ0IHJlZHVj dGlvbiBzdG10IHRvIG9yZGluYXJ5IGFzc2lnbm1lbnQgdG8gVE1QLiAgKi8K KyAgdG1wID0gdmVjdF9nZXRfbmV3X3NzYV9uYW1lICh2ZWN0eXBlLCB2ZWN0 X3NpbXBsZV92YXIsIE5VTEwpOworICBnaW1wbGVfYXNzaWduX3NldF9saHMg KHN0bXQsIHRtcCk7CisKKyAgLyogQ3JlYXRlIFZFQ19DT05EX0VYUFIgYW5k IGluc2VydCBpdCBhZnRlciBTVE1ULiAgKi8KKyAgbmV3X3N0bXQgPSBnaW1w bGVfYnVpbGRfYXNzaWduIChsaHMsIFZFQ19DT05EX0VYUFIsIG1hc2ssIHRt cCwgcmhzKTsKKyAgZ3NpID0gZ3NpX2Zvcl9zdG10IChzdG10KTsKKyAgZ3Np X2luc2VydF9hZnRlciAoJmdzaSwgbmV3X3N0bXQsIEdTSV9TQU1FX1NUTVQp OworCisgIHJldHVybiBuZXdfc3RtdDsKK30KKworLyogRnVuY3Rpb24gdmVj dF9tYXNrX21hc2tfbG9hZF9zdG9yZV9zdG10LgorCisgICBNYXNrIGdpdmVu IHZlY3Rvcml6ZWQgTUFTS19MT0FEIG9yIE1BU0tfU1RPUkUgc3RhdGVtZW50 CisgICBTVE1UIHVzaW5nIE1BU0suICBGdW5jdGlvbiByZXBsYWNlcyBhIG1h c2sgdXNlZCBieSBTVE1UCisgICB3aXRoIGl0cyBjb25qdW5jdGlvbiB3aXRo IE1BU0suICAqLworCitzdGF0aWMgdm9pZAordmVjdF9tYXNrX21hc2tfbG9h ZF9zdG9yZV9zdG10IChnaW1wbGUgKnN0bXQsIHRyZWUgbWFzaykKK3sKKyAg Z2ltcGxlICpuZXdfc3RtdDsKKyAgdHJlZSBvbGRfbWFzaywgbmV3X21hc2s7 CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKworICBnc2kgPSBnc2lf Zm9yX3N0bXQgKHN0bXQpOworICBvbGRfbWFzayA9IGdpbXBsZV9jYWxsX2Fy ZyAoc3RtdCwgMik7CisKKyAgZ2NjX2Fzc2VydCAodHlwZXNfY29tcGF0aWJs ZV9wIChUUkVFX1RZUEUgKG9sZF9tYXNrKSwgVFJFRV9UWVBFIChtYXNrKSkp OworCisgIG5ld19tYXNrID0gdmVjdF9nZXRfbmV3X3NzYV9uYW1lIChUUkVF X1RZUEUgKG1hc2spLCB2ZWN0X3NpbXBsZV92YXIsIE5VTEwpOworICBuZXdf c3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKG5ld19tYXNrLCBCSVRfQU5E X0VYUFIsIG9sZF9tYXNrLCBtYXNrKTsKKyAgZ3NpX2luc2VydF9iZWZvcmUg KCZnc2ksIG5ld19zdG10LCBHU0lfU0FNRV9TVE1UKTsKKworICBnaW1wbGVf Y2FsbF9zZXRfYXJnIChzdG10LCAyLCBuZXdfbWFzayk7CisgIHVwZGF0ZV9z dG10IChzdG10KTsKK30KKworCisvKiBGdW5jdGlvbiB2ZWN0X21hc2tfbG9h ZF9zdG9yZV9zdG10LgorCisgICBNYXNrIGdpdmVuIHZlY3Rvcml6ZWQgbG9h ZCBvciBzdG9yZSBzdGF0ZW1lbnQgU1RNVCB1c2luZworICAgTUFTSy4gIERS IGlzIGEgZGF0YSByZWZlcmVuY2UgZm9yIGEgc2NhbGFyIG1lbW9yeSBhY2Nl c3MuCisgICBBc3NpZ25tZW50IGlzIHRyYW5zZm9ybWVkIGludG8gTUFTS19M T0FEIG9yIE1BU0tfU1RPUkUKKyAgIHN0YXRlbWVudC4gIFNJIGlzIGVpdGhl ciBhbiBpdGVyYXRvciBwb2ludGluZyB0byBTVE1UIGFuZAorICAgaXMgdG8g YmUgdXBkYXRlZCBvciBOVUxMLiAgKi8KKworc3RhdGljIHZvaWQKK3ZlY3Rf bWFza19sb2FkX3N0b3JlX3N0bXQgKGdpbXBsZSAqc3RtdCwgdHJlZSB2ZWN0 eXBlLCB0cmVlIG1hc2ssCisJCQkgICBkYXRhX3JlZmVyZW5jZSAqZHIsIGdp bXBsZV9zdG10X2l0ZXJhdG9yICpzaSkKK3sKKyAgdHJlZSBtZW0sIHZhbCwg YWRkciwgcHRyOworICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSBnc2lf Zm9yX3N0bXQgKHN0bXQpOworICB1bnNpZ25lZCBhbGlnbiwgbWlzYWxpZ247 CisgIHRyZWUgZWxlbV90eXBlID0gVFJFRV9UWVBFICh2ZWN0eXBlKTsKKyAg Z2ltcGxlICpuZXdfc3RtdDsKKworICBnY2NfYXNzZXJ0ICghc2kgfHwgZ3Np X3N0bXQgKCpzaSkgPT0gc3RtdCk7CisKKyAgZ3NpID0gZ3NpX2Zvcl9zdG10 IChzdG10KTsKKyAgaWYgKGdpbXBsZV9zdG9yZV9wIChzdG10KSkKKyAgICB7 CisgICAgICB2YWwgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpOworICAg ICAgbWVtID0gZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpOworICAgIH0KKyAg ZWxzZQorICAgIHsKKyAgICAgIHZhbCA9IGdpbXBsZV9hc3NpZ25fbGhzIChz dG10KTsKKyAgICAgIG1lbSA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCk7 CisgICAgfQorCisgIGdjY19hc3NlcnQgKFRZUEVfVkVDVE9SX1NVQlBBUlRT ICh2ZWN0eXBlKQorCSAgICAgID09IFRZUEVfVkVDVE9SX1NVQlBBUlRTIChU UkVFX1RZUEUgKG1hc2spKSk7CisKKyAgYWRkciA9IGZvcmNlX2dpbXBsZV9v cGVyYW5kX2dzaSAoJmdzaSwgYnVpbGRfZm9sZF9hZGRyX2V4cHIgKG1lbSks CisJCQkJICAgdHJ1ZSwgTlVMTF9UUkVFLCB0cnVlLAorCQkJCSAgIEdTSV9T QU1FX1NUTVQpOworCisgIGFsaWduID0gVFlQRV9BTElHTl9VTklUICh2ZWN0 eXBlKTsKKyAgaWYgKGFsaWduZWRfYWNjZXNzX3AgKGRyKSkKKyAgICBtaXNh bGlnbiA9IDA7CisgIGVsc2UgaWYgKERSX01JU0FMSUdOTUVOVCAoZHIpID09 IC0xKQorICAgIHsKKyAgICAgIGFsaWduID0gVFlQRV9BTElHTl9VTklUIChl bGVtX3R5cGUpOworICAgICAgbWlzYWxpZ24gPSAwOworICAgIH0KKyAgZWxz ZQorICAgIG1pc2FsaWduID0gRFJfTUlTQUxJR05NRU5UIChkcik7CisgIHNl dF9wdHJfaW5mb19hbGlnbm1lbnQgKGdldF9wdHJfaW5mbyAoYWRkciksIGFs aWduLCBtaXNhbGlnbik7CisgIHB0ciA9IGJ1aWxkX2ludF9jc3QgKHJlZmVy ZW5jZV9hbGlhc19wdHJfdHlwZSAobWVtKSwKKwkJICAgICAgIG1pc2FsaWdu ID8gbWlzYWxpZ24gJiAtbWlzYWxpZ24gOiBhbGlnbik7CisKKyAgaWYgKGdp bXBsZV9zdG9yZV9wIChzdG10KSkKKyAgICBuZXdfc3RtdCA9IGdpbXBsZV9i dWlsZF9jYWxsX2ludGVybmFsIChJRk5fTUFTS19TVE9SRSwgNCwgYWRkciwg cHRyLAorCQkJCQkgICBtYXNrLCB2YWwpOworICBlbHNlCisgICAgeworICAg ICAgbmV3X3N0bXQgPSBnaW1wbGVfYnVpbGRfY2FsbF9pbnRlcm5hbCAoSUZO X01BU0tfTE9BRCwgMywgYWRkciwgcHRyLAorCQkJCQkgICAgIG1hc2spOwor ICAgICAgZ2ltcGxlX2NhbGxfc2V0X2xocyAobmV3X3N0bXQsIHZhbCk7Cisg ICAgfQorICBnc2lfcmVwbGFjZSAoc2kgPyBzaSA6ICZnc2ksIG5ld19zdG10 LCBmYWxzZSk7Cit9CisKKy8qIEZ1bmN0aW9uIHZlY3RfbWFza19sb29wLgor CisgICBQZXJmb3JtIG1hc2tpbmcgb2YgdmVjdG9yaXplZCBsb29wLCBvbmx5 IG1lbW9yeSBhY2Nlc3NlcyBhbmQKKyAgIHJlZHVjdGlvbnMgYXJlIG1hc2tl ZCwgb3RoZXIgc3RhdGVtZW50cyBzdGF5IHVuY2hhbmdlZC4gICovCisKK3N0 YXRpYyB2b2lkCit2ZWN0X21hc2tfbG9vcCAobG9vcF92ZWNfaW5mbyBsb29w X3ZpbmZvKQoreworICBzdHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklORk9f TE9PUCAobG9vcF92aW5mbyk7CisgIGJhc2ljX2Jsb2NrICpiYnMgPSBMT09Q X1ZJTkZPX0JCUyAobG9vcF92aW5mbyk7CisgIHVuc2lnbmVkIG1hc2tfbm87 CisgIGF1dG9fdmVjPHRyZWU+IG1hc2tzOworCisgIHZlY3RfZ2VuX2xvb3Bf bWFza3MgKGxvb3BfdmluZm8sICZtYXNrcyk7CisKKyAgLyogQ29udmVydCBy ZWR1Y3Rpb24gc3RhdGVtZW50cyBpZiBhbnkuICAqLworICBmb3IgKHVuc2ln bmVkIGkgPSAwOyBpIDwgTE9PUF9WSU5GT19SRURVQ1RJT05TIChsb29wX3Zp bmZvKS5sZW5ndGggKCk7IGkrKykKKyAgICB7CisgICAgICBnaW1wbGUgKnN0 bXQgPSBMT09QX1ZJTkZPX1JFRFVDVElPTlMgKGxvb3BfdmluZm8pW2ldOwor ICAgICAgZ2ltcGxlICpwcmV2X3N0bXQgPSBOVUxMOworICAgICAgc3RtdF92 ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7CisK KyAgICAgIG1hc2tfbm8gPSB2ZWN0X2dldF9tYXNrX2luZGV4X2Zvcl90eXBl IChTVE1UX1ZJTkZPX1ZFQ1RZUEUgKHN0bXRfaW5mbykpOworCisgICAgICBz dG10ID0gU1RNVF9WSU5GT19WRUNfU1RNVCAoc3RtdF9pbmZvKTsKKyAgICAg IHdoaWxlIChzdG10KQorCXsKKwkgIHByZXZfc3RtdCA9IHZlY3RfbWFza19y ZWR1Y3Rpb25fc3RtdCAoc3RtdCwgbWFza3NbbWFza19ubysrXSwKKwkJCQkJ CXByZXZfc3RtdCk7CisJICBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAo c3RtdCk7CisJICBzdG10ID0gc3RtdF9pbmZvID8gU1RNVF9WSU5GT19SRUxB VEVEX1NUTVQgKHN0bXRfaW5mbykgOiBOVUxMOworCX0KKyAgICB9CisKKyAg LyogU2NhbiBhbGwgbG9vcCBzdGF0ZW1lbnRzIHRvIGNvbnZlcnQgdmVjdG9y IGxvYWQvc3RvcmUgaW5jbHVkaW5nIG1hc2tlZAorICAgICBmb3JtLiAgKi8K KyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3AtPm51bV9ub2Rlczsg aSsrKQorICAgIHsKKyAgICAgIGJhc2ljX2Jsb2NrIGJiID0gYmJzW2ldOwor ICAgICAgZm9yIChnaW1wbGVfc3RtdF9pdGVyYXRvciBzaSA9IGdzaV9zdGFy dF9iYiAoYmIpOworCSAgICFnc2lfZW5kX3AgKHNpKTsgZ3NpX25leHQgKCZz aSkpCisJeworCSAgZ2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKHNpKTsKKwkg IHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvID0gTlVMTDsKKwkgIHRyZWUgdmVj dHlwZSA9IE5VTEw7CisJICBkYXRhX3JlZmVyZW5jZSAqZHI7CisKKwkgIC8q IE1hc2sgbG9hZCBjYXNlLiAgKi8KKwkgIGlmIChpc19naW1wbGVfY2FsbCAo c3RtdCkKKwkgICAgICAmJiBnaW1wbGVfY2FsbF9pbnRlcm5hbF9wIChzdG10 KQorCSAgICAgICYmIGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChzdG10KSA9 PSBJRk5fTUFTS19MT0FECisJICAgICAgJiYgIVZFQ1RPUl9UWVBFX1AgKFRS RUVfVFlQRSAoZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAyKSkpKQorCSAgICB7 CisJICAgICAgc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOwor CSAgICAgIGlmICghU1RNVF9WSU5GT19WRUNfU1RNVCAoc3RtdF9pbmZvKSkK KwkJY29udGludWU7CisJICAgICAgc3RtdCA9IFNUTVRfVklORk9fVkVDX1NU TVQgKHN0bXRfaW5mbyk7CisJICAgICAgdmVjdHlwZSA9IFNUTVRfVklORk9f VkVDVFlQRSAoc3RtdF9pbmZvKTsKKwkgICAgfQorCSAgLyogTWFzayBzdG9y ZSBjYXNlLiAgKi8KKwkgIGVsc2UgaWYgKGlzX2dpbXBsZV9jYWxsIChzdG10 KQorCQkgICAmJiBnaW1wbGVfY2FsbF9pbnRlcm5hbF9wIChzdG10KQorCQkg ICAmJiBnaW1wbGVfY2FsbF9pbnRlcm5hbF9mbiAoc3RtdCkgPT0gSUZOX01B U0tfU1RPUkUKKwkJICAgJiYgdmluZm9fZm9yX3N0bXQgKHN0bXQpCisJCSAg ICYmIFNUTVRfVklORk9fRklSU1RfQ09QWV9QICh2aW5mb19mb3Jfc3RtdCAo c3RtdCkpKQorCSAgICB7CisJICAgICAgc3RtdF9pbmZvID0gdmluZm9fZm9y X3N0bXQgKHN0bXQpOworCSAgICAgIHZlY3R5cGUgPSBUUkVFX1RZUEUgKGdp bXBsZV9jYWxsX2FyZyAoc3RtdCwgMikpOworCSAgICB9CisJICAvKiBMb2Fk IGNhc2UuICAqLworCSAgZWxzZSBpZiAoZ2ltcGxlX2Fzc2lnbl9sb2FkX3Ag KHN0bXQpCisJCSAgICYmICFWRUNUT1JfVFlQRV9QIChUUkVFX1RZUEUgKGdp bXBsZV9hc3NpZ25fbGhzIChzdG10KSkpKQorCSAgICB7CisJICAgICAgc3Rt dF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOworCisJICAgICAgLyog U2tpcCB2ZWN0b3IgbG9hZHMuICAqLworCSAgICAgIGlmICghU1RNVF9WSU5G T19WRUNfU1RNVCAoc3RtdF9pbmZvKSkKKwkJY29udGludWU7CisKKwkgICAg ICAvKiBTa2lwIGludmFyaWFudCBsb2Fkcy4gICovCisJICAgICAgaWYgKGlu dGVnZXJfemVyb3AgKG5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwgc3Rt dCkKKwkJCQkgPyBTVE1UX1ZJTkZPX0RSX1NURVAgKHN0bXRfaW5mbykKKwkJ CQkgOiBEUl9TVEVQIChTVE1UX1ZJTkZPX0RBVEFfUkVGIChzdG10X2luZm8p KSkpCisJCWNvbnRpbnVlOworCSAgICAgIHN0bXQgPSBTVE1UX1ZJTkZPX1ZF Q19TVE1UIChzdG10X2luZm8pOworCSAgICAgIHZlY3R5cGUgPSBTVE1UX1ZJ TkZPX1ZFQ1RZUEUgKHN0bXRfaW5mbyk7CisJICAgIH0KKwkgIC8qIFN0b3Jl IGNhc2UuICAqLworCSAgZWxzZSBpZiAoZ2ltcGxlX2NvZGUgKHN0bXQpID09 IEdJTVBMRV9BU1NJR04KKwkJICAgJiYgZ2ltcGxlX3N0b3JlX3AgKHN0bXQp CisJCSAgICYmIHZpbmZvX2Zvcl9zdG10IChzdG10KQorCQkgICAmJiBTVE1U X1ZJTkZPX0ZJUlNUX0NPUFlfUCAodmluZm9fZm9yX3N0bXQgKHN0bXQpKSkK KwkgICAgeworCSAgICAgIHN0bXRfaW5mbyA9IHZpbmZvX2Zvcl9zdG10IChz dG10KTsKKwkgICAgICB2ZWN0eXBlID0gU1RNVF9WSU5GT19WRUNUWVBFIChz dG10X2luZm8pOworCSAgICB9CisJICBlbHNlCisJICAgIGNvbnRpbnVlOwor CisJICAvKiBTa2lwIGhvaXN0ZWQgb3V0IHN0YXRlbWVudHMuICAqLworCSAg aWYgKCFmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3AsIGdpbXBsZV9iYiAo c3RtdCkpKQorCSAgICBjb250aW51ZTsKKworCSAgbWFza19ubyA9IHZlY3Rf Z2V0X21hc2tfaW5kZXhfZm9yX3R5cGUgKHZlY3R5cGUpOworCisJICBkciA9 IFNUTVRfVklORk9fREFUQV9SRUYgKHN0bXRfaW5mbyk7CisJICB3aGlsZSAo c3RtdCkKKwkgICAgeworCSAgICAgIGlmIChpc19naW1wbGVfY2FsbCAoc3Rt dCkpCisJCXZlY3RfbWFza19tYXNrX2xvYWRfc3RvcmVfc3RtdCAoc3RtdCwg bWFza3NbbWFza19ubysrXSk7CisJICAgICAgZWxzZQorCQl2ZWN0X21hc2tf bG9hZF9zdG9yZV9zdG10IChzdG10LCB2ZWN0eXBlLCBtYXNrc1ttYXNrX25v KytdLCBkciwKKwkJCQkJICAgLyogSGF2ZSB0byB1cGRhdGUgaXRlcmF0b3Ig b25seSBpZgorCQkJCQkgICAgICBpdCBwb2ludHMgdG8gc3RtdCB3ZSBtYXNr LiAgKi8KKwkJCQkJICAgc3RtdCA9PSBnc2lfc3RtdCAoc2kpID8gJnNpIDog TlVMTCk7CisKKwkgICAgICBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAo c3RtdCk7CisJICAgICAgc3RtdCA9IHN0bXRfaW5mbyA/IFNUTVRfVklORk9f UkVMQVRFRF9TVE1UIChzdG10X2luZm8pIDogTlVMTDsKKwkgICAgfQorCX0K KyAgICB9CisKKyAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorICAgIGR1bXBf cHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sCisJCSAgICAg Ij09PSBMb29wIGhhcyBiZWVkIG1hc2tlZCA9PT1cbiIpOworfQorCiAvKiBG dW5jdGlvbiB2ZWN0X3RyYW5zZm9ybV9sb29wLgogCiAgICBUaGUgYW5hbHlz aXMgcGhhc2UgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgbG9vcCBpcyB2ZWN0 b3JpemFibGUuCkBAIC03MDU0LDYgKzc5MTAsOSBAQCB2ZWN0X3RyYW5zZm9y bV9sb29wIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCiAKICAgc2xwZWVs X21ha2VfbG9vcF9pdGVyYXRlX250aW1lcyAobG9vcCwgbml0ZXJzX3ZlY3Rv cik7CiAKKyAgaWYgKExPT1BfVklORk9fTUFTS19MT09QIChsb29wX3ZpbmZv KSkKKyAgICB2ZWN0X21hc2tfbG9vcCAobG9vcF92aW5mbyk7CisKICAgLyog UmVkdWNlIGxvb3AgaXRlcmF0aW9ucyBieSB0aGUgdmVjdG9yaXphdGlvbiBm YWN0b3IuICAqLwogICBzY2FsZV9sb29wX3Byb2ZpbGUgKGxvb3AsIEdDT1Zf Q09NUFVURV9TQ0FMRSAoMSwgdmYpLAogCQkgICAgICBleHBlY3RlZF9pdGVy YXRpb25zIC8gdmYpOwpAQCAtNzA2NywxNiArNzkyNiwyMSBAQCB2ZWN0X3Ry YW5zZm9ybV9sb29wIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCiAgIGlu dCBiaWFzID0gMSAtIG1pbl9lcGlsb2d1ZV9pdGVyczsKICAgLyogSW4gdGhl c2UgY2FsY3VsYXRpb25zIHRoZSAiLSAxIiBjb252ZXJ0cyBsb29wIGl0ZXJh dGlvbiBjb3VudHMKICAgICAgYmFjayB0byBsYXRjaCBjb3VudHMuICAqLwor ICAjZGVmaW5lIERJVih4LCB5KSAgXAorICAgIChMT09QX1ZJTkZPX01BU0tf TE9PUCAobG9vcF92aW5mbykgXAorICAgICAgPyB3aTo6ZGl2X2NlaWwgKCh4 KSwgKHkpLCBVTlNJR05FRCkgXAorICAgICAgOiB3aTo6dWRpdl9mbG9vciAo KHgpLCAoeSkpKQorCiAgIGlmIChsb29wLT5hbnlfdXBwZXJfYm91bmQpCiAg ICAgbG9vcC0+bmJfaXRlcmF0aW9uc191cHBlcl9ib3VuZAotICAgICAgPSB3 aTo6dWRpdl9mbG9vciAobG9vcC0+bmJfaXRlcmF0aW9uc191cHBlcl9ib3Vu ZCArIGJpYXMsIHZmKSAtIDE7CisgICAgICA9IERJViAobG9vcC0+bmJfaXRl cmF0aW9uc191cHBlcl9ib3VuZCArIGJpYXMsIHZmKSAtIDE7CiAgIGlmIChs b29wLT5hbnlfbGlrZWx5X3VwcGVyX2JvdW5kKQogICAgIGxvb3AtPm5iX2l0 ZXJhdGlvbnNfbGlrZWx5X3VwcGVyX2JvdW5kCi0gICAgICA9IHdpOjp1ZGl2 X2Zsb29yIChsb29wLT5uYl9pdGVyYXRpb25zX2xpa2VseV91cHBlcl9ib3Vu ZCArIGJpYXMsIHZmKSAtIDE7CisgICAgICA9IERJViAobG9vcC0+bmJfaXRl cmF0aW9uc19saWtlbHlfdXBwZXJfYm91bmQgKyBiaWFzLCB2ZikgLSAxOwog ICBpZiAobG9vcC0+YW55X2VzdGltYXRlKQogICAgIGxvb3AtPm5iX2l0ZXJh dGlvbnNfZXN0aW1hdGUKLSAgICAgID0gd2k6OnVkaXZfZmxvb3IgKGxvb3At Pm5iX2l0ZXJhdGlvbnNfZXN0aW1hdGUgKyBiaWFzLCB2ZikgLSAxOwotCisg ICAgICA9IERJViAobG9vcC0+bmJfaXRlcmF0aW9uc19lc3RpbWF0ZSArIGJp YXMsIHZmKSAtIDE7CisgICN1bmRlZiBESVYKICAgaWYgKGR1bXBfZW5hYmxl ZF9wICgpKQogICAgIHsKICAgICAgIGlmICghTE9PUF9WSU5GT19FUElMT0dV RV9QIChsb29wX3ZpbmZvKSkKQEAgLTcwODgsNiArNzk1MiwxMCBAQCB2ZWN0 X3RyYW5zZm9ybV9sb29wIChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8pCiAJ CQkgICAgICJPVVRFUiBMT09QIFZFQ1RPUklaRURcbiIpOwogCSAgZHVtcF9w cmludGYgKE1TR19OT1RFLCAiXG4iKTsKIAl9CisgICAgICBlbHNlIGlmIChM T09QX1ZJTkZPX01BU0tfTE9PUCAobG9vcF92aW5mbykpCisJZHVtcF9wcmlu dGZfbG9jIChNU0dfTk9URSwgdmVjdF9sb2NhdGlvbiwKKwkJCSAiTE9PUCBF UElMT0dVRSBWRUNUT1JJWkVEIEFORCBNQVNLRUQgKFZTPSVkKVxuIiwKKwkJ CSBjdXJyZW50X3ZlY3Rvcl9zaXplKTsKICAgICAgIGVsc2UKIAlkdW1wX3By aW50Zl9sb2MgKE1TR19OT1RFLCB2ZWN0X2xvY2F0aW9uLAogCQkJICJMT09Q IEVQSUxPR1VFIFZFQ1RPUklaRUQgKFZTPSVkKVxuIiwKQEAgLTcxMTAsMjgg Kzc5NzgsMzEgQEAgdmVjdF90cmFuc2Zvcm1fbG9vcCAobG9vcF92ZWNfaW5m byBsb29wX3ZpbmZvKQogCiAgIGlmIChlcGlsb2d1ZSkKICAgICB7Ci0JdW5z aWduZWQgaW50IHZlY3Rvcl9zaXplcwotCSAgPSB0YXJnZXRtLnZlY3Rvcml6 ZS5hdXRvdmVjdG9yaXplX3ZlY3Rvcl9zaXplcyAoKTsKLQl2ZWN0b3Jfc2l6 ZXMgJj0gY3VycmVudF92ZWN0b3Jfc2l6ZSAtIDE7Ci0KLQlpZiAoIVBBUkFN X1ZBTFVFIChQQVJBTV9WRUNUX0VQSUxPR1VFU19OT01BU0spKQotCSAgZXBp bG9ndWUgPSBOVUxMOwotCWVsc2UgaWYgKCF2ZWN0b3Jfc2l6ZXMpCi0JICBl cGlsb2d1ZSA9IE5VTEw7Ci0JZWxzZSBpZiAoTE9PUF9WSU5GT19OSVRFUlNf S05PV05fUCAobG9vcF92aW5mbykKLQkJICYmIExPT1BfVklORk9fUEVFTElO R19GT1JfQUxJR05NRU5UIChsb29wX3ZpbmZvKSA+PSAwKQotCSAgewotCSAg ICBpbnQgc21hbGxlc3RfdmVjX3NpemUgPSAxIDw8IGN0el9od2kgKHZlY3Rv cl9zaXplcyk7Ci0JICAgIGludCByYXRpbyA9IGN1cnJlbnRfdmVjdG9yX3Np emUgLyBzbWFsbGVzdF92ZWNfc2l6ZTsKLQkgICAgaW50IGVpdGVycyA9IExP T1BfVklORk9fSU5UX05JVEVSUyAobG9vcF92aW5mbykKLQkgICAgICAtIExP T1BfVklORk9fUEVFTElOR19GT1JfQUxJR05NRU5UIChsb29wX3ZpbmZvKTsK LQkgICAgZWl0ZXJzID0gZWl0ZXJzICUgdmY7CisgICAgICBpZiAoIVBBUkFN X1ZBTFVFIChQQVJBTV9WRUNUX0VQSUxPR1VFU19NQVNLKSkKKwl7CisJICB1 bnNpZ25lZCBpbnQgdmVjdG9yX3NpemVzCisJICAgID0gdGFyZ2V0bS52ZWN0 b3JpemUuYXV0b3ZlY3Rvcml6ZV92ZWN0b3Jfc2l6ZXMgKCk7CisJICB2ZWN0 b3Jfc2l6ZXMgJj0gY3VycmVudF92ZWN0b3Jfc2l6ZSAtIDE7CisKKwkgIGlm ICghUEFSQU1fVkFMVUUgKFBBUkFNX1ZFQ1RfRVBJTE9HVUVTX05PTUFTSykp CisJICAgIGVwaWxvZ3VlID0gTlVMTDsKKwkgIGVsc2UgaWYgKCF2ZWN0b3Jf c2l6ZXMpCisJICAgIGVwaWxvZ3VlID0gTlVMTDsKKwkgIGVsc2UgaWYgKExP T1BfVklORk9fTklURVJTX0tOT1dOX1AgKGxvb3BfdmluZm8pCisJCSAgICYm IExPT1BfVklORk9fUEVFTElOR19GT1JfQUxJR05NRU5UIChsb29wX3ZpbmZv KSA+PSAwKQorCSAgICB7CisJICAgICAgaW50IHNtYWxsZXN0X3ZlY19zaXpl ID0gMSA8PCBjdHpfaHdpICh2ZWN0b3Jfc2l6ZXMpOworCSAgICAgIGludCBy YXRpbyA9IGN1cnJlbnRfdmVjdG9yX3NpemUgLyBzbWFsbGVzdF92ZWNfc2l6 ZTsKKwkgICAgICBpbnQgZWl0ZXJzID0gTE9PUF9WSU5GT19JTlRfTklURVJT IChsb29wX3ZpbmZvKQorCQktIExPT1BfVklORk9fUEVFTElOR19GT1JfQUxJ R05NRU5UIChsb29wX3ZpbmZvKTsKKwkgICAgICBlaXRlcnMgPSBlaXRlcnMg JSB2ZjsKIAotCSAgICBlcGlsb2d1ZS0+bmJfaXRlcmF0aW9uc191cHBlcl9i b3VuZCA9IGVpdGVycyAtIDE7CisJICAgICAgZXBpbG9ndWUtPm5iX2l0ZXJh dGlvbnNfdXBwZXJfYm91bmQgPSBlaXRlcnMgLSAxOwogCi0JICAgIGlmIChl aXRlcnMgPCB2ZiAvIHJhdGlvKQotCSAgICAgIGVwaWxvZ3VlID0gTlVMTDsK KwkgICAgICBpZiAoZWl0ZXJzIDwgdmYgLyByYXRpbykKKwkJZXBpbG9ndWUg PSBOVUxMOwogCSAgICB9CisJfQogICAgIH0KIAogICBpZiAoZXBpbG9ndWUp CmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LXN0bXRzLmMgYi9nY2MvdHJl ZS12ZWN0LXN0bXRzLmMKaW5kZXggYjBiMTMxZC4uMDdjN2RkNSAxMDA2NDQK LS0tIGEvZ2NjL3RyZWUtdmVjdC1zdG10cy5jCisrKyBiL2djYy90cmVlLXZl Y3Qtc3RtdHMuYwpAQCAtNDgsNiArNDgsNyBAQCBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUg InRyZWUtdmVjdG9yaXplci5oIgogI2luY2x1ZGUgImJ1aWx0aW5zLmgiCiAj aW5jbHVkZSAiaW50ZXJuYWwtZm4uaCIKKyNpbmNsdWRlICJ0cmVlLXNzYS1s b29wLWl2b3B0cy5oIgogCiAvKiBGb3IgbGFuZ19ob29rcy50eXBlcy50eXBl X2Zvcl9tb2RlLiAgKi8KICNpbmNsdWRlICJsYW5naG9va3MuaCIKQEAgLTU4 NCw2ICs1ODUsMzggQEAgcHJvY2Vzc191c2UgKGdpbXBsZSAqc3RtdCwgdHJl ZSB1c2UsIGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbywKICAgcmV0dXJuIHRy dWU7CiB9CiAKKy8qIFJldHVybiB0cnVlIGlmIFNUTVQgY2FuIGJlIGNvbnZl cnRlZCB0byBtYXNrZWQgZm9ybS4gICovCisKK3N0YXRpYyBib29sCitjYW5f bWFza19sb2FkX3N0b3JlIChnaW1wbGUgKnN0bXQpCit7CisgIHN0bXRfdmVj X2luZm8gc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOworICB0 cmVlIHZlY3R5cGUsIG1hc2tfdmVjdHlwZTsKKyAgdHJlZSBsaHMsIHJlZjsK KworICBpZiAoIXN0bXRfaW5mbykKKyAgICByZXR1cm4gZmFsc2U7CisgIGxo cyA9IGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KTsKKyAgcmVmID0gKFRSRUVf Q09ERSAobGhzKSA9PSBTU0FfTkFNRSkgPyBnaW1wbGVfYXNzaWduX3JoczEg KHN0bXQpIDogbGhzOworICBpZiAobWF5X2JlX25vbmFkZHJlc3NhYmxlX3Ag KHJlZikpCisgICAgcmV0dXJuIGZhbHNlOworICB2ZWN0eXBlID0gU1RNVF9W SU5GT19WRUNUWVBFIChzdG10X2luZm8pOworICBtYXNrX3ZlY3R5cGUgPSBi dWlsZF9zYW1lX3NpemVkX3RydXRoX3ZlY3Rvcl90eXBlICh2ZWN0eXBlKTsK KyAgaWYgKCFjYW5fdmVjX21hc2tfbG9hZF9zdG9yZV9wIChUWVBFX01PREUg KHZlY3R5cGUpLAorCQkJCSAgVFlQRV9NT0RFIChtYXNrX3ZlY3R5cGUpLAor CQkJCSAgZ2ltcGxlX2Fzc2lnbl9sb2FkX3AgKHN0bXQpKSkKKyAgICB7Cisg ICAgICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCisJeworCSAgZHVtcF9wcmlu dGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlv biwKKwkJCSAgICJTdGF0ZW1lbnQgY2FuJ3QgYmUgbWFza2VkLlxuIik7CisJ ICBkdW1wX2dpbXBsZV9zdG10IChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwg VERGX1NMSU0sIHN0bXQsIDApOworCX0KKworICAgICAgIHJldHVybiBmYWxz ZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQogCiAvKiBGdW5jdGlvbiB2 ZWN0X21hcmtfc3RtdHNfdG9fYmVfdmVjdG9yaXplZC4KIApAQCAtMjExMyw2 ICsyMTQ2LDIwIEBAIHZlY3Rvcml6YWJsZV9tYXNrX2xvYWRfc3RvcmUgKGdp bXBsZSAqc3RtdCwgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSwKIAkgICAg ICAgJiYgIXVzZWxlc3NfdHlwZV9jb252ZXJzaW9uX3AgKHZlY3R5cGUsIHJo c192ZWN0eXBlKSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIGlmIChMT09Q X1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pKQorICAgIHsKKyAg ICAgIC8qIENoZWNrIHRoYXQgbWFzayBjb25qdWN0aW9uIGlzIHN1cHBvcnRl ZC4gICovCisgICAgICBvcHRhYiB0YWI7CisgICAgICB0YWIgPSBvcHRhYl9m b3JfdHJlZV9jb2RlIChCSVRfQU5EX0VYUFIsIHZlY3R5cGUsIG9wdGFiX2Rl ZmF1bHQpOworICAgICAgaWYgKCF0YWIgfHwgb3B0YWJfaGFuZGxlciAodGFi LCBUWVBFX01PREUgKHZlY3R5cGUpKSA9PSBDT0RFX0ZPUl9ub3RoaW5nKQor CXsKKwkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwkgICAgZHVtcF9wcmlu dGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlv biwKKwkJCSAgICAgImNhbm5vdCBiZSBtYXNrZWQ6IHVuc3VwcG9ydGVkIG1h c2sgb3BlcmF0aW9uXG4iKTsKKwkgIExPT1BfVklORk9fQ0FOX0JFX01BU0tF RCAobG9vcF92aW5mbykgPSBmYWxzZTsKKwl9CisgICAgfQorCiAgIGlmICgh dmVjX3N0bXQpIC8qIHRyYW5zZm9ybWF0aW9uIG5vdCByZXF1aXJlZC4gICov CiAgICAgewogICAgICAgU1RNVF9WSU5GT19NRU1PUllfQUNDRVNTX1RZUEUg KHN0bXRfaW5mbykgPSBtZW1vcnlfYWNjZXNzX3R5cGU7CkBAIC0yMzU0LDcg KzI0MDEsMTAgQEAgdmVjdG9yaXphYmxlX21hc2tfbG9hZF9zdG9yZSAoZ2lt cGxlICpzdG10LCBnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpLAogCQkJCQkg IHB0ciwgdmVjX21hc2ssIHZlY19yaHMpOwogCSAgdmVjdF9maW5pc2hfc3Rt dF9nZW5lcmF0aW9uIChzdG10LCBuZXdfc3RtdCwgZ3NpKTsKIAkgIGlmIChp ID09IDApCi0JICAgIFNUTVRfVklORk9fVkVDX1NUTVQgKHN0bXRfaW5mbykg PSAqdmVjX3N0bXQgPSBuZXdfc3RtdDsKKwkgICAgeworCSAgICAgIFNUTVRf VklORk9fVkVDX1NUTVQgKHN0bXRfaW5mbykgPSAqdmVjX3N0bXQgPSBuZXdf c3RtdDsKKwkgICAgICBTVE1UX1ZJTkZPX0ZJUlNUX0NPUFlfUCAodmluZm9f Zm9yX3N0bXQgKG5ld19zdG10KSkgPSB0cnVlOworCSAgICB9CiAJICBlbHNl CiAJICAgIFNUTVRfVklORk9fUkVMQVRFRF9TVE1UIChwcmV2X3N0bXRfaW5m bykgPSBuZXdfc3RtdDsKIAkgIHByZXZfc3RtdF9pbmZvID0gdmluZm9fZm9y X3N0bXQgKG5ld19zdG10KTsKQEAgLTMyMTEsNiArMzI2MSwxOCBAQCB2ZWN0 b3JpemFibGVfc2ltZF9jbG9uZV9jYWxsIChnaW1wbGUgKnN0bXQsIGdpbXBs ZV9zdG10X2l0ZXJhdG9yICpnc2ksCiAgIGlmIChzbHBfbm9kZSkKICAgICBy ZXR1cm4gZmFsc2U7CiAKKyAgLyogTWFza2VkIGNsb25lcyBhcmUgbm90IHll dCBzdXBwb3J0ZWQuICBCdXQgd2UgYWxsb3cKKyAgICAgY2FsbHMgd2hpY2gg bWF5IGJlIGp1c3QgY2FsbGVkIHdpdGggbm8gbWFzay4gICovCisgIGlmICgh KGdpbXBsZV9jYWxsX2ZsYWdzIChzdG10KSAmIEVDRl9DT05TVCkKKyAgICAg IHx8IChnaW1wbGVfY2FsbF9mbGFncyAoc3RtdCkgJiBFQ0ZfTE9PUElOR19D T05TVF9PUl9QVVJFKSkKKyAgICB7CisgICAgICBpZiAoZHVtcF9lbmFibGVk X3AgKCkpCisJZHVtcF9wcmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpB VElPTiwgdmVjdF9sb2NhdGlvbiwKKwkJCSAiY2Fubm90IGJlIG1hc2tlZDog bm9uLWNvbnN0IGNhbGwgIgorCQkJICIobWFza2VkIGNhbGxzIGFyZSBub3Qg c3VwcG9ydGVkKVxuIik7CisgICAgICBMT09QX1ZJTkZPX0NBTl9CRV9NQVNL RUQgKGxvb3BfdmluZm8pID0gZmFsc2U7CisgICAgfQorCiAgIC8qIFByb2Nl c3MgZnVuY3Rpb24gYXJndW1lbnRzLiAgKi8KICAgbmFyZ3MgPSBnaW1wbGVf Y2FsbF9udW1fYXJncyAoc3RtdCk7CiAKQEAgLTU3MzAsNiArNTc5MiwyNCBA QCB2ZWN0b3JpemFibGVfc3RvcmUgKGdpbXBsZSAqc3RtdCwgZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKmdzaSwgZ2ltcGxlICoqdmVjX3N0bXQsCiAJCQkgICAg Jm1lbW9yeV9hY2Nlc3NfdHlwZSwgJmdzX2luZm8pKQogICAgIHJldHVybiBm YWxzZTsKIAorICBpZiAobG9vcF92aW5mbyAmJiBMT09QX1ZJTkZPX0NBTl9C RV9NQVNLRUQgKGxvb3BfdmluZm8pCisgICAgICAmJiBtZW1vcnlfYWNjZXNz X3R5cGUgIT0gVk1BVF9DT05USUdVT1VTKQorICAgIHsKKyAgICAgIExPT1Bf VklORk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykgPSBmYWxzZTsKKyAg ICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwlkdW1wX3ByaW50Zl9sb2Mg KE1TR19NSVNTRURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAorCQkJ ICJjYW5ub3QgYmUgbWFza2VkOiB1bnN1cHBvcnRlZCBtZW1vcnkgYWNjZXNz IHR5cGUuXG4iKTsKKyAgICB9CisKKyAgaWYgKGxvb3BfdmluZm8gJiYgTE9P UF9WSU5GT19DQU5fQkVfTUFTS0VEIChsb29wX3ZpbmZvKQorICAgICAgJiYg IWNhbl9tYXNrX2xvYWRfc3RvcmUgKHN0bXQpKQorICAgIHsKKyAgICAgIExP T1BfVklORk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykgPSBmYWxzZTsK KyAgICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwlkdW1wX3ByaW50Zl9s b2MgKE1TR19NSVNTRURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAor CQkJICJjYW5ub3QgYmUgbWFza2VkOiB1bnN1cHBvcnRlZCBtYXNrZWQgc3Rv cmUuXG4iKTsKKyAgICB9CisKICAgaWYgKCF2ZWNfc3RtdCkgLyogdHJhbnNm b3JtYXRpb24gbm90IHJlcXVpcmVkLiAgKi8KICAgICB7CiAgICAgICBTVE1U X1ZJTkZPX01FTU9SWV9BQ0NFU1NfVFlQRSAoc3RtdF9pbmZvKSA9IG1lbW9y eV9hY2Nlc3NfdHlwZTsKQEAgLTYzODksNyArNjQ2OSwxNiBAQCB2ZWN0b3Jp emFibGVfc3RvcmUgKGdpbXBsZSAqc3RtdCwgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgKmdzaSwgZ2ltcGxlICoqdmVjX3N0bXQsCiAgICAgICBpZiAoIXNscCkK IAl7CiAJICBpZiAoaiA9PSAwKQotCSAgICBTVE1UX1ZJTkZPX1ZFQ19TVE1U IChzdG10X2luZm8pID0gKnZlY19zdG10ID0gbmV3X3N0bXQ7CisJICAgIHsK KwkgICAgICBTVE1UX1ZJTkZPX1ZFQ19TVE1UIChzdG10X2luZm8pID0gKnZl Y19zdG10ID0gbmV3X3N0bXQ7CisJICAgICAgU1RNVF9WSU5GT19GSVJTVF9D T1BZX1AgKHZpbmZvX2Zvcl9zdG10IChuZXdfc3RtdCkpID0gdHJ1ZTsKKwkg ICAgICAvKiBPcmlnaW5hbCBzdGF0ZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0 aGUgZmlyc3QgdmVjdG9yIG9uZS4KKwkJIEtlZXAgZGF0YSByZWZlcmVuY2Ug YW5kIG9yaWdpbmFsIHZlY3R5cGUgaW4gdGhlIGZpcnN0CisJCSB2ZWN0b3Ig Y29weSBmb3IgbWFza2luZyBwdXJwb3Nlcy4gICovCisJICAgICAgU1RNVF9W SU5GT19EQVRBX1JFRiAodmluZm9fZm9yX3N0bXQgKG5ld19zdG10KSkKKwkJ PSBTVE1UX1ZJTkZPX0RBVEFfUkVGIChzdG10X2luZm8pOworCSAgICAgIFNU TVRfVklORk9fVkVDVFlQRSAodmluZm9fZm9yX3N0bXQgKG5ld19zdG10KSkg PSB2ZWN0eXBlOworCSAgICB9CiAJICBlbHNlCiAJICAgIFNUTVRfVklORk9f UkVMQVRFRF9TVE1UIChwcmV2X3N0bXRfaW5mbykgPSBuZXdfc3RtdDsKIAkg IHByZXZfc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKG5ld19zdG10KTsK QEAgLTY2NjcsNiArNjc1NiwxNSBAQCB2ZWN0b3JpemFibGVfbG9hZCAoZ2lt cGxlICpzdG10LCBnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpLCBnaW1wbGUg Kip2ZWNfc3RtdCwKICAgICAgIGdjY19hc3NlcnQgKCFuZXN0ZWRfaW5fdmVj dF9sb29wKTsKICAgICAgIGdjY19hc3NlcnQgKCFTVE1UX1ZJTkZPX0dBVEhF Ul9TQ0FUVEVSX1AgKHN0bXRfaW5mbykpOwogCisgICAgICBpZiAobG9vcF92 aW5mbyAmJiBMT09QX1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8p KQorCXsKKwkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwkgICAgZHVtcF9w cmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2Nh dGlvbiwKKwkJCSAgICAgImNhbm5vdCBiZSBtYXNrZWQ6IGdyb3VwZWQgYWNj ZXNzIGlzIG5vdCIKKwkJCSAgICAgIiBzdXBwb3J0ZWQuIik7CisJICBMT09Q X1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pID0gZmFsc2U7Cisg ICAgICB9CisKICAgICAgIGZpcnN0X3N0bXQgPSBHUk9VUF9GSVJTVF9FTEVN RU5UIChzdG10X2luZm8pOwogICAgICAgZ3JvdXBfc2l6ZSA9IEdST1VQX1NJ WkUgKHZpbmZvX2Zvcl9zdG10IChmaXJzdF9zdG10KSk7CiAKQEAgLTY3MDcs NiArNjgwNSwzNiBAQCB2ZWN0b3JpemFibGVfbG9hZCAoZ2ltcGxlICpzdG10 LCBnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpLCBnaW1wbGUgKip2ZWNfc3Rt dCwKIAkJCSAgICAmbWVtb3J5X2FjY2Vzc190eXBlLCAmZ3NfaW5mbykpCiAg ICAgcmV0dXJuIGZhbHNlOwogCisgIGlmIChsb29wX3ZpbmZvICYmIExPT1Bf VklORk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykKKyAgICAgICYmIGlu dGVnZXJfemVyb3AgKG5lc3RlZF9pbl92ZWN0X2xvb3AKKwkJCT8gU1RNVF9W SU5GT19EUl9TVEVQIChzdG10X2luZm8pCisJCQk6IERSX1NURVAgKGRyKSkp CisgICAgeworICAgICAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCWR1bXBf cHJpbnRmX2xvYyAoTVNHX05PVEUsIHZlY3RfbG9jYXRpb24sCisJCQkgImFs bG93IGludmFyaWFudCBsb2FkIGZvciBtYXNrZWQgbG9vcC5cbiIpOworICAg IH0KKworICBpZiAobG9vcF92aW5mbyAmJiBMT09QX1ZJTkZPX0NBTl9CRV9N QVNLRUQgKGxvb3BfdmluZm8pCisgICAgICAmJiBtZW1vcnlfYWNjZXNzX3R5 cGUgIT0gVk1BVF9DT05USUdVT1VTCisgICAgICAmJiBtZW1vcnlfYWNjZXNz X3R5cGUgIT0gVk1BVF9JTlZBUklBTlQpCisgICAgeworICAgICAgTE9PUF9W SU5GT19DQU5fQkVfTUFTS0VEIChsb29wX3ZpbmZvKSA9IGZhbHNlOworICAg ICAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQorCWR1bXBfcHJpbnRmX2xvYyAo TVNHX01JU1NFRF9PUFRJTUlaQVRJT04sIHZlY3RfbG9jYXRpb24sCisJCQkg ImNhbm5vdCBiZSBtYXNrZWQ6IHVuc3VwcG9ydGVkIG1lbW9yeSBhY2Nlc3Mg dHlwZS5cbiIpOworICAgIH0KKworICBpZiAobG9vcF92aW5mbyAmJiBMT09Q X1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pCisgICAgICAmJiBt ZW1vcnlfYWNjZXNzX3R5cGUgIT0gVk1BVF9JTlZBUklBTlQKKyAgICAgICYm ICFjYW5fbWFza19sb2FkX3N0b3JlIChzdG10KSkKKyAgICB7CisgICAgICBp ZiAoZHVtcF9lbmFibGVkX3AgKCkpCisJZHVtcF9wcmludGZfbG9jIChNU0df TUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKKwkJCSAiY2Fu bm90IGJlIG1hc2tlZDogdW5zdXBwb3J0ZWQgbWFza2VkIGxvYWQuXG4iKTsK KyAgICAgIExPT1BfVklORk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykg PSBmYWxzZTsKKyAgICB9CisKICAgaWYgKCF2ZWNfc3RtdCkgLyogdHJhbnNm b3JtYXRpb24gbm90IHJlcXVpcmVkLiAgKi8KICAgICB7CiAgICAgICBpZiAo IXNscCkKQEAgLTgyNTIsNiArODM4MCw0MyBAQCB2ZWN0b3JpemFibGVfY29t cGFyaXNvbiAoZ2ltcGxlICpzdG10LCBnaW1wbGVfc3RtdF9pdGVyYXRvciAq Z3NpLAogICByZXR1cm4gdHJ1ZTsKIH0KIAorLyogUmV0dXJuIHRydWUgaWYg dmVjdG9yIHZlcnNpb24gb2YgU1RNVCBzaG91bGQgYmUgbWFza2VkCisgICBp biBhIHZlY3Rvcml6ZWQgbG9vcCBlcGlsb2d1ZSAoY29uc2lkZXJpbmcgdXNh Z2Ugb2YgdGhlCisgICBzYW1lIFZGIGFzIGZvciBtYWluIGxvb3ApLiAgKi8K Kworc3RhdGljIGJvb2wKK3ZlY3Rfc3RtdF9zaG91bGRfYmVfbWFza2VkX2Zv cl9lcGlsb2d1ZSAoZ2ltcGxlICpzdG10KQoreworICBzdG10X3ZlY19pbmZv IHN0bXRfaW5mbyA9IHZpbmZvX2Zvcl9zdG10IChzdG10KTsKKworICAvKiBX ZSBzaG91bGQgbWFzayBhbGwgc3RhdGVtZW50cyBhY2Nlc3NpbmcgbWVtb3J5 LiAgKi8KKyAgaWYgKFNUTVRfVklORk9fREFUQV9SRUYgKHN0bXRfaW5mbykp CisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2Ugc2hvdWxkIGFsc28gbWFz ayBhbGwgcmVjdXJzaW9ucy4gICovCisgIGlmIChTVE1UX1ZJTkZPX0RFRl9U WVBFIChzdG10X2luZm8pID09IHZlY3RfcmVkdWN0aW9uX2RlZgorICAgICAg fHwgU1RNVF9WSU5GT19ERUZfVFlQRSAoc3RtdF9pbmZvKSA9PSB2ZWN0X2Rv dWJsZV9yZWR1Y3Rpb25fZGVmKQorICAgIHJldHVybiB0cnVlOworCisgIHJl dHVybiBmYWxzZTsKK30KKworLyogQWRkIGEgbWFzayByZXF1aXJlZCB0byBt YXNrIFNUTVQgdG8gTE9PUF9WSU5GT19SRVFVSVJFRF9NQVNLUy4gICovCisK K3N0YXRpYyB2b2lkCit2ZWN0X2FkZF9yZXF1aXJlZF9tYXNrX2Zvcl9zdG10 IChnaW1wbGUgKnN0bXQpCit7CisgIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZv ID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOworICBsb29wX3ZlY19pbmZvIGxv b3BfdmluZm8gPSBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbyk7 CisgIHRyZWUgdmVjdHlwZSA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF9p bmZvKTsKKyAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBuZWxlbXMgPSBUWVBF X1ZFQ1RPUl9TVUJQQVJUUyAodmVjdHlwZSk7CisgIGludCBiaXRfbm8gPSBl eGFjdF9sb2cyIChuZWxlbXMpOworCisgIGdjY19hc3NlcnQgKGJpdF9ubyA+ PSAwKTsKKworICBMT09QX1ZJTkZPX1JFUVVJUkVEX01BU0tTIChsb29wX3Zp bmZvKSB8PSAoMSA8PCBiaXRfbm8pOworfQorCiAvKiBNYWtlIHN1cmUgdGhl IHN0YXRlbWVudCBpcyB2ZWN0b3JpemFibGUuICAqLwogCiBib29sCkBAIC04 MjU5LDYgKzg0MjQsNyBAQCB2ZWN0X2FuYWx5emVfc3RtdCAoZ2ltcGxlICpz dG10LCBib29sICpuZWVkX3RvX3ZlY3Rvcml6ZSwgc2xwX3RyZWUgbm9kZSkK IHsKICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3Rt dCAoc3RtdCk7CiAgIGJiX3ZlY19pbmZvIGJiX3ZpbmZvID0gU1RNVF9WSU5G T19CQl9WSU5GTyAoc3RtdF9pbmZvKTsKKyAgbG9vcF92ZWNfaW5mbyBsb29w X3ZpbmZvID0gU1RNVF9WSU5GT19MT09QX1ZJTkZPIChzdG10X2luZm8pOwog ICBlbnVtIHZlY3RfcmVsZXZhbnQgcmVsZXZhbmNlID0gU1RNVF9WSU5GT19S RUxFVkFOVCAoc3RtdF9pbmZvKTsKICAgYm9vbCBvazsKICAgdHJlZSBzY2Fs YXJfdHlwZSwgdmVjdHlwZTsKQEAgLTg0MjYsNiArODU5MiwxMCBAQCB2ZWN0 X2FuYWx5emVfc3RtdCAoZ2ltcGxlICpzdG10LCBib29sICpuZWVkX3RvX3Zl Y3Rvcml6ZSwgc2xwX3RyZWUgbm9kZSkKICAgICAgIFNUTVRfVklORk9fVkVD VFlQRSAoc3RtdF9pbmZvKSA9IHZlY3R5cGU7CiAgICB9CiAKKyAgLyogTWFz a2luZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBTTFAgeWV0LiAgKi8KKyAgaWYg KGxvb3BfdmluZm8gJiYgbm9kZSkKKyAgICBMT09QX1ZJTkZPX0NBTl9CRV9N QVNLRUQgKGxvb3BfdmluZm8pID0gZmFsc2U7CisKICAgaWYgKFNUTVRfVklO Rk9fUkVMRVZBTlRfUCAoc3RtdF9pbmZvKSkKICAgICB7CiAgICAgICBnY2Nf YXNzZXJ0ICghVkVDVE9SX01PREVfUCAoVFlQRV9NT0RFIChnaW1wbGVfZXhw cl90eXBlIChzdG10KSkpKTsKQEAgLTg0ODUsNiArODY1NSwzMCBAQCB2ZWN0 X2FuYWx5emVfc3RtdCAoZ2ltcGxlICpzdG10LCBib29sICpuZWVkX3RvX3Zl Y3Rvcml6ZSwgc2xwX3RyZWUgbm9kZSkKICAgICAgIHJldHVybiBmYWxzZTsK ICAgICB9CiAKKyAgaWYgKGxvb3BfdmluZm8KKyAgICAgICYmIExPT1BfVklO Rk9fQ0FOX0JFX01BU0tFRCAobG9vcF92aW5mbykpCisgICAgeworICAgICAg LyogQ3VycmVudGx5IHdlIGhhdmUgcmVhbCBtYXNraW5nIGZvciBsb2FkcyBh bmQgc3RvcmVzIG9ubHkuCisJIFdlIGNhbid0IG1hc2sgbG9vcCB3aGljaCBo YXMgb3RoZXIgc3RhdGVtZW50cyB3aGljaCBtYXkKKwkgdHJhcC4gICovCisg ICAgICBpZiAoKCFpc19naW1wbGVfY2FsbCAoc3RtdCkKKwkgICB8fCAhZ2lt cGxlX2NhbGxfaW50ZXJuYWxfcCAoc3RtdCkKKwkgICB8fCAoZ2ltcGxlX2Nh bGxfaW50ZXJuYWxfZm4gKHN0bXQpICE9IElGTl9NQVNLX1NUT1JFCisJICAg ICAgICYmIGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChzdG10KSAhPSBJRk5f TUFTS19MT0FEKSkKKwkgICYmIGdpbXBsZV9jb3VsZF90cmFwX3BfMSAoc3Rt dCwgZmFsc2UsIGZhbHNlKSkKKwl7CisJICBpZiAoZHVtcF9lbmFibGVkX3Ag KCkpCisJICAgIHsKKwkgICAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNT RURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAorCQkJICAgICAgICJj YW5ub3QgYmUgbWFza2VkOiB1bnN1cHBvcnRlZCB0cmFwcGluZyBzdG10OiAi KTsKKwkgICAgICBkdW1wX2dpbXBsZV9zdG10IChNU0dfTUlTU0VEX09QVElN SVpBVElPTiwgVERGX1NMSU0sIHN0bXQsIDApOworCSAgICB9CisJICBMT09Q X1ZJTkZPX0NBTl9CRV9NQVNLRUQgKGxvb3BfdmluZm8pID0gZmFsc2U7CisJ fQorICAgICAgZWxzZSBpZiAodmVjdF9zdG10X3Nob3VsZF9iZV9tYXNrZWRf Zm9yX2VwaWxvZ3VlIChzdG10KSkKKwl2ZWN0X2FkZF9yZXF1aXJlZF9tYXNr X2Zvcl9zdG10IChzdG10KTsKKyAgICB9CisKICAgaWYgKGJiX3ZpbmZvKQog ICAgIHJldHVybiB0cnVlOwogCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0 b3JpemVyLmggYi9nY2MvdHJlZS12ZWN0b3JpemVyLmgKaW5kZXggMmE3ZmEw YS4uMTk2YTA5YiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdG9yaXplci5o CisrKyBiL2djYy90cmVlLXZlY3Rvcml6ZXIuaApAQCAtMzM1LDYgKzMzNSwx NiBAQCB0eXBlZGVmIHN0cnVjdCBfbG9vcF92ZWNfaW5mbyA6IHB1YmxpYyB2 ZWNfaW5mbyB7CiAgIC8qIE1hcmsgbG9vcHMgaGF2aW5nIG1hc2tlZCBzdG9y ZXMuICAqLwogICBib29sIGhhc19tYXNrX3N0b3JlOwogCisgIC8qIFRydWUg aWYgdmVjdG9yaXplZCBsb29wIGNhbiBiZSBtYXNrZWQuICAqLworICBib29s IGNhbl9iZV9tYXNrZWQ7CisKKyAgLyogSWYgdmVjdG9yIG1hc2sgd2l0aCAy Xk4gZWxlbWVudHMgaXMgcmVxdWlyZWQgdG8gbWFzayB0aGUgbG9vcAorICAg ICB0aGVuIE4tdGggYml0IG9mIHRoaXMgZmllbGQgaXMgc2V0IHRvIDEuICAq LworICB1bnNpZ25lZCByZXF1aXJlZF9tYXNrczsKKworICAvKiBUcnVlIGlm IHdlIHNob3VsZCB2ZWN0b3JpemUgbG9vcCB3aXRoIG1hc2tpbmcuICAqLwor ICBib29sIG1hc2tfbG9vcDsKKwogICAvKiBGb3IgbG9vcHMgYmVpbmcgZXBp bG9ndWVzIG9mIGFscmVhZHkgdmVjdG9yaXplZCBsb29wcwogICAgICB0aGlz IHBvaW50cyB0byB0aGUgb3JpZ2luYWwgdmVjdG9yaXplZCBsb29wLiAgT3Ro ZXJ3aXNlIE5VTEwuICAqLwogICBfbG9vcF92ZWNfaW5mbyAqb3JpZ19sb29w X2luZm87CkBAIC0zNzgsNiArMzg4LDkgQEAgdHlwZWRlZiBzdHJ1Y3QgX2xv b3BfdmVjX2luZm8gOiBwdWJsaWMgdmVjX2luZm8gewogI2RlZmluZSBMT09Q X1ZJTkZPX0hBU19NQVNLX1NUT1JFKEwpICAgICAgIChMKS0+aGFzX21hc2tf c3RvcmUKICNkZWZpbmUgTE9PUF9WSU5GT19TQ0FMQVJfSVRFUkFUSU9OX0NP U1QoTCkgKEwpLT5zY2FsYXJfY29zdF92ZWMKICNkZWZpbmUgTE9PUF9WSU5G T19TSU5HTEVfU0NBTEFSX0lURVJBVElPTl9DT1NUKEwpIChMKS0+c2luZ2xl X3NjYWxhcl9pdGVyYXRpb25fY29zdAorI2RlZmluZSBMT09QX1ZJTkZPX0NB Tl9CRV9NQVNLRUQoTCkgICAgICAgIChMKS0+Y2FuX2JlX21hc2tlZAorI2Rl ZmluZSBMT09QX1ZJTkZPX1JFUVVJUkVEX01BU0tTKEwpICAgICAgIChMKS0+ cmVxdWlyZWRfbWFza3MKKyNkZWZpbmUgTE9PUF9WSU5GT19NQVNLX0xPT1Ao TCkgICAgICAgICAgICAoTCktPm1hc2tfbG9vcAogI2RlZmluZSBMT09QX1ZJ TkZPX09SSUdfTE9PUF9JTkZPKEwpICAgICAgIChMKS0+b3JpZ19sb29wX2lu Zm8KIAogI2RlZmluZSBMT09QX1JFUVVJUkVTX1ZFUlNJT05JTkdfRk9SX0FM SUdOTUVOVChMKQlcCkBAIC02NjUsNiArNjc4LDEwIEBAIHR5cGVkZWYgc3Ry dWN0IF9zdG10X3ZlY19pbmZvIHsKICAgLyogRm9yIGJvdGggbG9hZHMgYW5k IHN0b3Jlcy4gICovCiAgIGJvb2wgc2ltZF9sYW5lX2FjY2Vzc19wOwogCisg IC8qIFRydWUgZm9yIHRoZSBmaXJzdCB2ZWN0b3Igc3RhdGVtZW50IGNvcHkg d2hlbiBzY2FsYXIKKyAgICAgc3RhdGVtZW50IGlzIHZlY3Rvcml6ZWQgaW50 byBzZXZlcmFsIHZlY3RvciBvbmVzLiAgKi8KKyAgYm9vbCBmaXJzdF9jb3B5 X3A7CisKICAgLyogRm9yIHJlZHVjdGlvbiBsb29wcywgdGhpcyBpcyB0aGUg dHlwZSBvZiByZWR1Y3Rpb24uICAqLwogICBlbnVtIHZlY3RfcmVkdWN0aW9u X3R5cGUgdl9yZWR1Y190eXBlOwogCkBAIC03MjQsNiArNzQxLDcgQEAgU1RN VF9WSU5GT19CQl9WSU5GTyAoc3RtdF92ZWNfaW5mbyBzdG10X3ZpbmZvKQog I2RlZmluZSBTVE1UX1ZJTkZPX1NUUklERURfUChTKQkgICAJICAgKFMpLT5z dHJpZGVkX3AKICNkZWZpbmUgU1RNVF9WSU5GT19NRU1PUllfQUNDRVNTX1RZ UEUoUykgICAoUyktPm1lbW9yeV9hY2Nlc3NfdHlwZQogI2RlZmluZSBTVE1U X1ZJTkZPX1NJTURfTEFORV9BQ0NFU1NfUChTKSAgIChTKS0+c2ltZF9sYW5l X2FjY2Vzc19wCisjZGVmaW5lIFNUTVRfVklORk9fRklSU1RfQ09QWV9QKFMp CSAgIChTKS0+Zmlyc3RfY29weV9wCiAjZGVmaW5lIFNUTVRfVklORk9fVkVD X1JFRFVDVElPTl9UWVBFKFMpICAgKFMpLT52X3JlZHVjX3R5cGUKICNkZWZp bmUgU1RNVF9WSU5GT19WRUNfQ09OU1RfQ09ORF9SRURVQ19DT0RFKFMpIChT KS0+Y29uc3RfY29uZF9yZWR1Y19jb2RlCiAK --94eb2c18f7eec1495d05420c2c91--