From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 97815 invoked by alias); 9 Jul 2017 18:43:23 -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 95013 invoked by uid 89); 9 Jul 2017 18:43:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-9.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_1,GIT_PATCH_2,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=albert, Strip, Albert, 2102 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-yb0-f177.google.com Received: from mail-yb0-f177.google.com (HELO mail-yb0-f177.google.com) (209.85.213.177) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 09 Jul 2017 18:43:11 +0000 Received: by mail-yb0-f177.google.com with SMTP id e201so22457934ybb.1; Sun, 09 Jul 2017 11:43:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=6Tb65DXFiXkjnJGhkHqf86N9374fv739gNVBmewvJA4=; b=T/ZsAUyQV3IrALx7n4V+RVCplg/KPZmjXPQWnBvwOpZIv069fchJ/I9+hd/RJEvOOK BLXTGCnsDaYfiaCyzaW0kRoncpL3PqERneNORHK0I4z1DC0X1VfitvO7E8PbqotwFIje rT9KMRiksCOsBqq1t8pJbTSz6gBJb/LzEPXuGE9hzCm9MCbyf5gb/uftEfmyCBtIwW5H ZfCUOuosm00bND2Zgx4FKT0SeiNVMjbBy0l7Y5MLqXBvZokEwayZOZ+HEa1o2pm7hSOe lziec9DL8C+0Z2WQ6Dr5iFdnyjfqMnoA8xmL8ct8r1myXo9424YjY9PmNYDFDiqp6+Sa uR+Q== X-Gm-Message-State: AIVw111RUmN5S6yRIX6ArpOorv7fdVWlUPOKpkdQrvSTdqxpBdIrk8yB UYJwP4HB16ukpu03D0Jg3H94KVBBQw== X-Received: by 10.37.177.37 with SMTP id g37mr8266678ybj.255.1499625789569; Sun, 09 Jul 2017 11:43:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.13.203.200 with HTTP; Sun, 9 Jul 2017 11:43:08 -0700 (PDT) In-Reply-To: <36a479a8-e22b-f675-7f3d-b7324f872357@netcologne.de> References: <36a479a8-e22b-f675-7f3d-b7324f872357@netcologne.de> From: Paul Richard Thomas Date: Sun, 09 Jul 2017 18:43:00 -0000 Message-ID: Subject: Re: [Patch, fortran] PR34640 - ICE when assigning item of a derived-component to a pointer To: Thomas Koenig Cc: "fortran@gcc.gnu.org" , gcc-patches , Damian Rouson , "Bader, Reinhold" Content-Type: multipart/mixed; boundary="f403045f289e7d04680553e6d634" X-SW-Source: 2017-07/txt/msg00420.txt.bz2 --f403045f289e7d04680553e6d634 Content-Type: text/plain; charset="UTF-8" Content-length: 7693 Hi Thomas, Hi All, Please find attached what I believe is the final version of the patch. The problem concerning temporaries being generated in lieu of the descriptor being passed directly - see pointer_array_7.f90 and the change to subref_array_4.f90. This latter necessitated a thread on clf to get right. Thanks are due to Thomas for initiating it. I took the opportunity of the delay, while the bounds issue was being discussed on clf, to fix class pointer arrays. They now function correctly, as evidenced by pointer_array_8.f90. A possible final tweak - as asked before, should I bump up the module version number? My inclination is to say that we should. Bootstrapped and regtested on FC23/x86_64 - OK for trunk? Paul 2017-07-09 Paul Thomas PR fortran/34640 PR fortran/40737 PR fortran/55763 PR fortran/57019 PR fortran/57116 * expr.c (is_subref_array): Add class pointer array dummies to the list of expressions that return true. * trans-array.c: Add SPAN_FIELD and update indices for subsequent fields. (gfc_conv_descriptor_span, gfc_conv_descriptor_span_get, gfc_conv_descriptor_span_set, is_pointer_array, get_array_span): New functions. (gfc_get_descriptor_offsets_for_info): New function to preserve API for access to descriptor fields for trans-types.c. (gfc_conv_scalarized_array_ref): If the expression is a subref array, make sure that info->descriptor is a descriptor type. Otherwise, if info->descriptor is a pointer array, set 'decl' and fix it if it is a component reference. (build_array_ref): Simplify handling of class array refs by passing the vptr to gfc_build_array_ref rather than generating the pointer arithmetic in this function. (gfc_conv_array_ref): As in gfc_conv_scalarized_array_ref, set 'decl'. (gfc_array_allocate): Set the span field if this is a pointer array. Use the expr3 element size if it is available, so that the dynamic type element size is used. (gfc_conv_expr_descriptor): Set the span field for pointer assignments. * trans-array.h: Prototypes for gfc_conv_descriptor_span_get gfc_conv_descriptor_span_set and gfc_get_descriptor_offsets_for_info added. trans-decl.c (gfc_get_symbol_decl): If a non-class pointer array, mark the declaration as a GFC_DECL_PTR_ARRAY_P. Remove the setting of GFC_DECL_SPAN. (gfc_trans_deferred_vars): Set the span field to zero in thge originating scope. * trans-expr.c (gfc_conv_procedure_call): Do not use copy-in/ copy-out to pass subref expressions to a pointer dummy. (gfc_trans_pointer_assignment): Remove code for setting of GFC_DECL_SPAN. Set the 'span' field for non-class pointers to class function results. Likewise for rank remap. * trans-intrinsic.c (conv_expr_ref_to_caf_ref): Pick up the 'token' offset from the field decl in the descriptor. (conv_isocbinding_subroutine): Set the 'span' field. * trans-io.c (gfc_trans_transfer): Always scalarize pointer array io. * trans-stmt.c (trans_associate_var): Set the 'span' field. * trans-types.c (gfc_get_array_descriptor_base): Add the 'span' field to the array descriptor. (gfc_get_derived_type): Pointer array components are marked as GFC_DECL_PTR_ARRAY_P. (gfc_get_array_descr_info): Replaced API breaking code for descriptor offset calling gfc_get_descriptor_offsets_for_info. * trans.c (get_array_span): New function. (gfc_build_array_ref): Simplify by calling get_array_span and obtain 'span' if 'decl' or 'vptr' present. * trans.h : Rename DECL_LANG_FLAG_6, GFC_DECL_SUBREF_ARRAY_P, as GFC_DECL_PTR_ARRAY_P. 2017-07-09 Paul Thomas PR fortran/34640 * gfortran.dg/assumed_type_2.f90: Adjust some of the tree dump checks. * gfortran.dg/no_arg_check_2.f90: Likewise. * gfortran.dg/pointer_array_1.f90: New test. * gfortran.dg/pointer_array_2.f90: New test. * gfortran.dg/pointer_array_7.f90: New test. * gfortran.dg/pointer_array_8.f90: New test. * gfortran.dg/pointer_array_component_1.f90: New test. * gfortran.dg/pointer_array_component_2.f90: New test. * gfortran.dg/goacc/kernels-alias-4.f95: Bump up both tree scan counts by 1. * gfortran.dg/subref_array_pointer_4.f90: Use the passed lower bound for 'Q' to provide an offset for array element access. PR fortran/40737 * gfortran.dg/pointer_array_3.f90: New test. PR fortran/57116 * gfortran.dg/pointer_array_4.f90: New test. PR fortran/55763 * gfortran.dg/pointer_array_5.f90: New test. PR fortran/57019 * gfortran.dg/pointer_array_6.f90: New test. 2017-07-09 Paul Thomas PR fortran/34640 * libgfortran/libgfortran.h: Add span field to descriptor. On 4 July 2017 at 22:03, Thomas Koenig wrote: > Hi Paul, > > first, this patch looks really good - it certainly fixes a lot of the > ICEs. > > I have a few points (a part already mentioned in private mail). > > Consider the test case: > > module x > use iso_c_binding > implicit none > type foo > complex :: c > integer :: i > end type foo > contains > subroutine printit(c) > complex, pointer, dimension(:) :: c > integer :: i > integer(kind=8) :: a > a = transfer(c_loc(c(1)),a) > print '(A,Z16)',"Adrress of first element is ", a > end subroutine printit > > subroutine p2(c) > complex, dimension(:), target :: c > integer :: i > integer(kind=8) :: a > a = transfer(c_loc(c(1)),a) > print '(A,Z16)',"Adrress of first element is ", a > end subroutine p2 > > end module x > > program main > use x > use iso_c_binding > implicit none > type(foo), dimension(5), target :: a > integer :: i > complex, dimension(:), pointer :: pc > complex, dimension(4), target :: v > integer(kind=8) :: s1, s2 > a%i = 0 > do i=1,5 > a(i)%c = cmplx(i**2,i) > end do > pc => a%c > print *,"Pointer to complex passed to pointer argument:" > call printit(pc) > print *,"Pointer to complex passed to array argument" > call p2(pc) > s1 = transfer(c_loc(a(1)),s1) > print '(A,Z16,/)',"Main program: Address of first element: ", s1 > > pc => v > print *,"Pointer to complex passed to pointer argument:" > call printit(pc) > print *,"Complex array passed to array argument" > call p2(v) > s1 = transfer(c_loc(v(1)),s1) > print '(A,Z16)',"Address of first element: ", s1 > end program main > > This yields: > > Pointer to complex passed to pointer argument: > Adrress of first element is 10021C90FF0 > Pointer to complex passed to array argument > Adrress of first element is 10021C90FF0 > Main program: Address of first element: 3FFFCEC599A4 > > Pointer to complex passed to pointer argument: > Adrress of first element is 10021C90FF0 > Complex array passed to array argument > Adrress of first element is 3FFFCEC59A20 > Address of first element: 3FFFCEC59A20 > > It appears that a temporary is created when passing > a pointer array to a pointer array dummy argument. > I think this would be wrong code, because the > subroutine could stash away the pointer and later > access data through it. > > The same seems to happen when passing a pointer to > a normal argument - a temporary copy appears to be made. > > While this code is correct, I am wodering if it > is intentional. Is the span field in the array > descriptor used in the called subroutine? > > Regards > > Thomas -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein --f403045f289e7d04680553e6d634 Content-Type: text/plain; charset="US-ASCII"; name="newsubmission.diff" Content-Disposition: attachment; filename="newsubmission.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j4x2gxv20 Content-length: 89776 SW5kZXg6IGdjYy9mb3J0cmFuL2V4cHIuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CioqKiBnY2MvZm9ydHJhbi9leHByLmMJKHJldmlzaW9uIDI0OTg2NSkK LS0tIGdjYy9mb3J0cmFuL2V4cHIuYwkod29ya2luZyBjb3B5KQoqKioqKioq KioqKioqKiogaXNfc3VicmVmX2FycmF5IChnZmNfZXhwciAqIGUpCioqKiA5 ODQsOTg5ICoqKioKLS0tIDk4NCw5OTQgLS0tLQogICAgaWYgKGUtPnN5bXRy ZWUtPm4uc3ltLT5hdHRyLnN1YnJlZl9hcnJheV9wb2ludGVyKQogICAgICBy ZXR1cm4gdHJ1ZTsKCisgICBpZiAoZS0+c3ltdHJlZS0+bi5zeW0tPnRzLnR5 cGUgPT0gQlRfQ0xBU1MKKyAgICAgICAmJiBlLT5zeW10cmVlLT5uLnN5bS0+ YXR0ci5kdW1teQorICAgICAgICYmIENMQVNTX0RBVEEgKGUtPnN5bXRyZWUt Pm4uc3ltKS0+YXR0ci5jbGFzc19wb2ludGVyKQorICAgICByZXR1cm4gdHJ1 ZTsKKwogICAgc2Vlbl9hcnJheSA9IGZhbHNlOwogICAgZm9yIChyZWYgPSBl LT5yZWY7IHJlZjsgcmVmID0gcmVmLT5uZXh0KQogICAgICB7CkluZGV4OiBn Y2MvZm9ydHJhbi90cmFucy1hcnJheS5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KKioqIGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmMJKHJldmlzaW9uIDI0 OTg2NSkKLS0tIGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmMJKHdvcmtpbmcg Y29weSkKKioqKioqKioqKioqKioqIGdmY19hcnJheV9kYXRhcHRyX3R5cGUg KHRyZWUgZGVzYykKKioqIDEyNSwxMzIgKioqKgogICNkZWZpbmUgREFUQV9G SUVMRCAwCiAgI2RlZmluZSBPRkZTRVRfRklFTEQgMQogICNkZWZpbmUgRFRZ UEVfRklFTEQgMgohICNkZWZpbmUgRElNRU5TSU9OX0ZJRUxEIDMKISAjZGVm aW5lIENBRl9UT0tFTl9GSUVMRCA0CgogICNkZWZpbmUgU1RSSURFX1NVQkZJ RUxEIDAKICAjZGVmaW5lIExCT1VORF9TVUJGSUVMRCAxCi0tLSAxMjUsMTMz IC0tLS0KICAjZGVmaW5lIERBVEFfRklFTEQgMAogICNkZWZpbmUgT0ZGU0VU X0ZJRUxEIDEKICAjZGVmaW5lIERUWVBFX0ZJRUxEIDIKISAjZGVmaW5lIFNQ QU5fRklFTEQgMwohICNkZWZpbmUgRElNRU5TSU9OX0ZJRUxEIDQKISAjZGVm aW5lIENBRl9UT0tFTl9GSUVMRCA1CgogICNkZWZpbmUgU1RSSURFX1NVQkZJ RUxEIDAKICAjZGVmaW5lIExCT1VORF9TVUJGSUVMRCAxCioqKioqKioqKioq KioqKiBnZmNfY29udl9kZXNjcmlwdG9yX2R0eXBlICh0cmVlIGRlc2MpCioq KiAyNDQsMjQ5ICoqKioKLS0tIDI0NSwyODAgLS0tLQogIAkJCSAgZGVzYywg ZmllbGQsIE5VTExfVFJFRSk7CiAgfQoKKyBzdGF0aWMgdHJlZQorIGdmY19j b252X2Rlc2NyaXB0b3Jfc3BhbiAodHJlZSBkZXNjKQorIHsKKyAgIHRyZWUg dHlwZTsKKyAgIHRyZWUgZmllbGQ7CisKKyAgIHR5cGUgPSBUUkVFX1RZUEUg KGRlc2MpOworICAgZ2NjX2Fzc2VydCAoR0ZDX0RFU0NSSVBUT1JfVFlQRV9Q ICh0eXBlKSk7CisKKyAgIGZpZWxkID0gZ2ZjX2FkdmFuY2VfY2hhaW4gKFRZ UEVfRklFTERTICh0eXBlKSwgU1BBTl9GSUVMRCk7CisgICBnY2NfYXNzZXJ0 IChmaWVsZCAhPSBOVUxMX1RSRUUgJiYgVFJFRV9UWVBFIChmaWVsZCkgPT0g Z2ZjX2FycmF5X2luZGV4X3R5cGUpOworCisgICByZXR1cm4gZm9sZF9idWls ZDNfbG9jIChpbnB1dF9sb2NhdGlvbiwgQ09NUE9ORU5UX1JFRiwgVFJFRV9U WVBFIChmaWVsZCksCisgCQkJICBkZXNjLCBmaWVsZCwgTlVMTF9UUkVFKTsK KyB9CisKKyB0cmVlCisgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9zcGFuX2dldCAo dHJlZSBkZXNjKQorIHsKKyAgIHJldHVybiBnZmNfY29udl9kZXNjcmlwdG9y X3NwYW4gKGRlc2MpOworIH0KKworIHZvaWQKKyBnZmNfY29udl9kZXNjcmlw dG9yX3NwYW5fc2V0IChzdG10YmxvY2tfdCAqYmxvY2ssIHRyZWUgZGVzYywK KyAJCQkJdHJlZSB2YWx1ZSkKKyB7CisgICB0cmVlIHQgPSBnZmNfY29udl9k ZXNjcmlwdG9yX3NwYW4gKGRlc2MpOworICAgZ2ZjX2FkZF9tb2RpZnkgKGJs b2NrLCB0LCBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQRSAodCksIHZhbHVlKSk7 CisgfQorCgogIHRyZWUKICBnZmNfY29udl9kZXNjcmlwdG9yX3JhbmsgKHRy ZWUgZGVzYykKKioqKioqKioqKioqKioqIGdmY19jb252X3NoaWZ0X2Rlc2Ny aXB0b3JfbGJvdW5kIChzdG10YmwKKioqIDQ2Niw0NzYgKioqKgotLS0gNDk3 LDUzNyAtLS0tCiAgfQoKCisgLyogT2J0YWluIG9mZnNldHMgZm9yIHRyYW5z LXR5cGVzLmMoZ2ZjX2dldF9hcnJheV9kZXNjcl9pbmZvKS4gICovCisKKyB2 b2lkCisgZ2ZjX2dldF9kZXNjcmlwdG9yX29mZnNldHNfZm9yX2luZm8gKGNv bnN0X3RyZWUgZGVzY190eXBlLCB0cmVlICpkYXRhX29mZiwKKyAJCQkJICAg ICB0cmVlICpkdHlwZV9vZmYsIHRyZWUgKmRpbV9vZmYsCisgCQkJCSAgICAg dHJlZSAqZGltX3NpemUsIHRyZWUgKnN0cmlkZV9zdWJvZmYsCisgCQkJCSAg ICAgdHJlZSAqbG93ZXJfc3Vib2ZmLCB0cmVlICp1cHBlcl9zdWJvZmYpCisg eworICAgdHJlZSBmaWVsZDsKKyAgIHRyZWUgdHlwZTsKKworICAgdHlwZSA9 IFRZUEVfTUFJTl9WQVJJQU5UIChkZXNjX3R5cGUpOworICAgZmllbGQgPSBn ZmNfYWR2YW5jZV9jaGFpbiAoVFlQRV9GSUVMRFMgKHR5cGUpLCBPRkZTRVRf RklFTEQpOworICAgKmRhdGFfb2ZmID0gYnl0ZV9wb3NpdGlvbiAoZmllbGQp OworICAgZmllbGQgPSBnZmNfYWR2YW5jZV9jaGFpbiAoVFlQRV9GSUVMRFMg KHR5cGUpLCBEVFlQRV9GSUVMRCk7CisgICAqZHR5cGVfb2ZmID0gYnl0ZV9w b3NpdGlvbiAoZmllbGQpOworICAgZmllbGQgPSBnZmNfYWR2YW5jZV9jaGFp biAoVFlQRV9GSUVMRFMgKHR5cGUpLCBESU1FTlNJT05fRklFTEQpOworICAg KmRpbV9vZmYgPSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CisgICB0eXBlID0g VFJFRV9UWVBFIChUUkVFX1RZUEUgKGZpZWxkKSk7CisgICAqZGltX3NpemUg PSBUWVBFX1NJWkVfVU5JVCAodHlwZSk7CisgICBmaWVsZCA9IGdmY19hZHZh bmNlX2NoYWluIChUWVBFX0ZJRUxEUyAodHlwZSksIFNUUklERV9TVUJGSUVM RCk7CisgICAqc3RyaWRlX3N1Ym9mZiA9IGJ5dGVfcG9zaXRpb24gKGZpZWxk KTsKKyAgIGZpZWxkID0gZ2ZjX2FkdmFuY2VfY2hhaW4gKFRZUEVfRklFTERT ICh0eXBlKSwgTEJPVU5EX1NVQkZJRUxEKTsKKyAgICpsb3dlcl9zdWJvZmYg PSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CisgICBmaWVsZCA9IGdmY19hZHZh bmNlX2NoYWluIChUWVBFX0ZJRUxEUyAodHlwZSksIFVCT1VORF9TVUJGSUVM RCk7CisgICAqdXBwZXJfc3Vib2ZmID0gYnl0ZV9wb3NpdGlvbiAoZmllbGQp OworIH0KKworCiAgLyogQ2xlYW51cCB0aG9zZSAjZGVmaW5lcy4gICovCgog ICN1bmRlZiBEQVRBX0ZJRUxECiAgI3VuZGVmIE9GRlNFVF9GSUVMRAogICN1 bmRlZiBEVFlQRV9GSUVMRAorICN1bmRlZiBTUEFOX0ZJRUxECiAgI3VuZGVm IERJTUVOU0lPTl9GSUVMRAogICN1bmRlZiBDQUZfVE9LRU5fRklFTEQKICAj dW5kZWYgU1RSSURFX1NVQkZJRUxECioqKioqKioqKioqKioqKiBnZmNfYWRk X3NzX3RvX2xvb3AgKGdmY19sb29waW5mbyAqIGxvb3AsCioqKiA3MjAsNzI1 ICoqKioKLS0tIDc4MSw4NjQgLS0tLQogIH0KCgorIC8qIFJldHVybnMgdHJ1 ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhbiBhcnJheSBwb2ludGVyLiAgKi8K KworIHN0YXRpYyBib29sCisgaXNfcG9pbnRlcl9hcnJheSAodHJlZSBleHBy KQorIHsKKyAgIGlmIChmbGFnX29wZW5tcCkKKyAgICAgcmV0dXJuIGZhbHNl OworCisgICBpZiAoZXhwciA9PSBOVUxMX1RSRUUKKyAgICAgICB8fCAhR0ZD X0RFU0NSSVBUT1JfVFlQRV9QIChUUkVFX1RZUEUgKGV4cHIpKQorICAgICAg IHx8IEdGQ19DTEFTU19UWVBFX1AgKFRSRUVfVFlQRSAoZXhwcikpKQorICAg ICByZXR1cm4gZmFsc2U7CisKKyAgIGlmIChUUkVFX0NPREUgKGV4cHIpID09 IFZBUl9ERUNMCisgICAgICAgJiYgR0ZDX0RFQ0xfUFRSX0FSUkFZX1AgKGV4 cHIpKQorICAgICByZXR1cm4gdHJ1ZTsKKworICAgaWYgKFRSRUVfQ09ERSAo ZXhwcikgPT0gUEFSTV9ERUNMCisgICAgICAgJiYgR0ZDX0RFQ0xfUFRSX0FS UkFZX1AgKGV4cHIpKQorICAgICByZXR1cm4gdHJ1ZTsKKworICAgaWYgKFRS RUVfQ09ERSAoZXhwcikgPT0gSU5ESVJFQ1RfUkVGCisgICAgICAgJiYgR0ZD X0RFQ0xfUFRSX0FSUkFZX1AgKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpKQor ICAgICByZXR1cm4gdHJ1ZTsKKworICAgLyogVGhlIGZpZWxkIGRlY2xhcmF0 aW9uIGlzIG1hcmtlZCBhcyBhbiBwb2ludGVyIGFycmF5LiAgKi8KKyAgIGlm IChUUkVFX0NPREUgKGV4cHIpID09IENPTVBPTkVOVF9SRUYKKyAgICAgICAm JiBHRkNfREVDTF9QVFJfQVJSQVlfUCAoVFJFRV9PUEVSQU5EIChleHByLCAx KSkKKyAgICAgICAmJiAhR0ZDX0NMQVNTX1RZUEVfUCAoVFJFRV9UWVBFIChU UkVFX09QRVJBTkQgKGV4cHIsIDEpKSkpCisgICAgIHJldHVybiB0cnVlOwor CisgICByZXR1cm4gZmFsc2U7CisgfQorCisKKyAvKiBSZXR1cm4gdGhlIHNw YW4gb2YgYW4gYXJyYXkuICAqLworCisgc3RhdGljIHRyZWUKKyBnZXRfYXJy YXlfc3BhbiAodHJlZSBkZXNjLCBnZmNfZXhwciAqZXhwcikKKyB7CisgICB0 cmVlIHRtcDsKKworICAgaWYgKGlzX3BvaW50ZXJfYXJyYXkgKGRlc2MpKQor ICAgICAvKiBUaGlzIHdpbGwgaGF2ZSB0aGUgc3BhbiBmaWVsZCBzZXQuICAq LworICAgICB0bXAgPSBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fZ2V0IChk ZXNjKTsKKyAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoZGVzYykgPT0gQ09NUE9O RU5UX1JFRgorIAkgICAmJiBHRkNfREVTQ1JJUFRPUl9UWVBFX1AgKFRSRUVf VFlQRSAoZGVzYykpCisgCSAgICYmIEdGQ19DTEFTU19UWVBFX1AgKFRSRUVf VFlQRSAoVFJFRV9PUEVSQU5EIChkZXNjLCAwKSkpKQorICAgICB7CisgICAg ICAgLyogVGhlIGRlc2NyaXB0b3IgaXMgYSBjbGFzcyBfZGF0YSBmaWVsZCBh bmQgc28gdXNlIHRoZSB2dGFibGUKKyAJIHNpemUgZm9yIHRoZSByZWNlaXZp bmcgc3BhbiBmaWVsZC4gICovCisgICAgICAgdG1wID0gZ2ZjX2dldF92cHRy X2Zyb21fZXhwciAoZGVzYyk7CisgICAgICAgdG1wID0gZ2ZjX3ZwdHJfc2l6 ZV9nZXQgKHRtcCk7CisgICAgIH0KKyAgIGVsc2UgaWYgKGV4cHIgJiYgZXhw ci0+ZXhwcl90eXBlID09IEVYUFJfVkFSSUFCTEUKKyAJICAgJiYgZXhwci0+ c3ltdHJlZS0+bi5zeW0tPnRzLnR5cGUgPT0gQlRfQ0xBU1MKKyAJICAgJiYg ZXhwci0+cmVmLT50eXBlID09IFJFRl9DT01QT05FTlQKKyAJICAgJiYgZXhw ci0+cmVmLT5uZXh0LT50eXBlID09IFJFRl9BUlJBWQorIAkgICAmJiBleHBy LT5yZWYtPm5leHQtPm5leHQgPT0gTlVMTAorIAkgICAmJiBDTEFTU19EQVRB IChleHByLT5zeW10cmVlLT5uLnN5bSktPmF0dHIuZGltZW5zaW9uKQorICAg ICB7CisgICAgICAgLyogRHVtbXlzIGNvbWUgaW4gc29tZXRpbWVzIHdpdGgg dGhlIGRlc2NyaXB0b3IgZGV0YWNoZWQgZnJvbQorIAkgdGhlIGNsYXNzIGZp ZWxkIG9yIGRlY2xhcmF0aW9uLiAgKi8KKyAgICAgICB0bXAgPSBnZmNfY2xh c3NfdnB0cl9nZXQgKGV4cHItPnN5bXRyZWUtPm4uc3ltLT5iYWNrZW5kX2Rl Y2wpOworICAgICAgIHRtcCA9IGdmY192cHRyX3NpemVfZ2V0ICh0bXApOwor ICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICAvKiBJZiBub25lIG9m IHRoZSBmYW5jeSBzdHVmZiB3b3JrcywgdGhlIHNwYW4gaXMgdGhlIGVsZW1l bnQKKyAJIHNpemUgb2YgdGhlIGFycmF5LiAgKi8KKyAgICAgICB0bXAgPSBn ZmNfZ2V0X2VsZW1lbnRfdHlwZSAoVFJFRV9UWVBFIChkZXNjKSk7CisgICAg ICAgdG1wID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwK KyAJCQkgIHNpemVfaW5fYnl0ZXMgKHRtcCkpOworICAgICB9CisgICByZXR1 cm4gdG1wOworIH0KKworCiAgLyogR2VuZXJhdGUgYW4gaW5pdGlhbGl6ZXIg Zm9yIGEgc3RhdGljIHBvaW50ZXIgb3IgYWxsb2NhdGFibGUgYXJyYXkuICAq LwoKICB2b2lkCioqKioqKioqKioqKioqKiBnZmNfY29udl9zY2FsYXJpemVk X2FycmF5X3JlZiAoZ2ZjX3NlICoKKioqIDMyMzksMzI0OSAqKioqCiAgICAg IGluZGV4ID0gZm9sZF9idWlsZDJfbG9jIChpbnB1dF9sb2NhdGlvbiwgUExV U19FWFBSLCBnZmNfYXJyYXlfaW5kZXhfdHlwZSwKICAJCQkgICAgIGluZGV4 LCBpbmZvLT5vZmZzZXQpOwoKISAgIGlmIChleHByICYmIChpc19zdWJyZWZf YXJyYXkgKGV4cHIpCiAgCSAgICAgICB8fCAoZXhwci0+dHMuZGVmZXJyZWQg JiYgKGV4cHItPmV4cHJfdHlwZSA9PSBFWFBSX1ZBUklBQkxFCiAgCQkJCQkg fHwgZXhwci0+ZXhwcl90eXBlID09IEVYUFJfRlVOQ1RJT04pKSkpCiAgICAg IGRlY2wgPSBleHByLT5zeW10cmVlLT5uLnN5bS0+YmFja2VuZF9kZWNsOwoK ICAgIHRtcCA9IGJ1aWxkX2ZvbGRfaW5kaXJlY3RfcmVmX2xvYyAoaW5wdXRf bG9jYXRpb24sIGluZm8tPmRhdGEpOwoKICAgIC8qIFVzZSB0aGUgdnB0ciAn c2l6ZScgZmllbGQgdG8gYWNjZXNzIGEgY2xhc3MgdGhlIGVsZW1lbnQgb2Yg YSBjbGFzcwotLS0gMzM3OCwzNDA3IC0tLS0KICAgICAgaW5kZXggPSBmb2xk X2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLCBQTFVTX0VYUFIsIGdmY19h cnJheV9pbmRleF90eXBlLAogIAkJCSAgICAgaW5kZXgsIGluZm8tPm9mZnNl dCk7CgohICAgaWYgKGV4cHIgJiYgKChpc19zdWJyZWZfYXJyYXkgKGV4cHIp CiEgCQkmJiBHRkNfREVTQ1JJUFRPUl9UWVBFX1AgKFRSRUVfVFlQRSAoaW5m by0+ZGVzY3JpcHRvcikpKQogIAkgICAgICAgfHwgKGV4cHItPnRzLmRlZmVy cmVkICYmIChleHByLT5leHByX3R5cGUgPT0gRVhQUl9WQVJJQUJMRQogIAkJ CQkJIHx8IGV4cHItPmV4cHJfdHlwZSA9PSBFWFBSX0ZVTkNUSU9OKSkpKQog ICAgICBkZWNsID0gZXhwci0+c3ltdHJlZS0+bi5zeW0tPmJhY2tlbmRfZGVj bDsKCisgICAvKiBBIHBvaW50ZXIgYXJyYXkgY29tcG9uZW50IGNhbiBiZSBk ZXRlY3RlZCBmcm9tIGl0cyBmaWVsZCBkZWNsLiBGaXgKKyAgICAgIHRoZSBk ZXNjcmlwdG9yLCBtYXJrIHRoZSByZXN1bHRpbmcgdmFyaWFibGUgZGVjbCBh bmQgcGFzcyBpdCB0bworICAgICAgZ2ZjX2J1aWxkX2FycmF5X3JlZi4gICov CisgICBpZiAoaXNfcG9pbnRlcl9hcnJheSAoaW5mby0+ZGVzY3JpcHRvcikp CisgICAgIHsKKyAgICAgICBpZiAoVFJFRV9DT0RFIChpbmZvLT5kZXNjcmlw dG9yKSA9PSBDT01QT05FTlRfUkVGKQorIAl7CisgCSAgZGVjbCA9IGdmY19l dmFsdWF0ZV9ub3cgKGluZm8tPmRlc2NyaXB0b3IsICZzZS0+cHJlKTsKKyAJ ICBHRkNfREVDTF9QVFJfQVJSQVlfUCAoZGVjbCkgPSAxOworIAkgIFRSRUVf VVNFRCAoZGVjbCkgPSAxOworIAl9CisgICAgICAgZWxzZSBpZiAoVFJFRV9D T0RFIChpbmZvLT5kZXNjcmlwdG9yKSA9PSBJTkRJUkVDVF9SRUYpCisgCWRl Y2wgPSBUUkVFX09QRVJBTkQgKGluZm8tPmRlc2NyaXB0b3IsIDApOworCisg ICAgICAgaWYgKGRlY2wgPT0gTlVMTF9UUkVFKQorIAlkZWNsID0gaW5mby0+ ZGVzY3JpcHRvcjsKKyAgICAgfQorCiAgICB0bXAgPSBidWlsZF9mb2xkX2lu ZGlyZWN0X3JlZl9sb2MgKGlucHV0X2xvY2F0aW9uLCBpbmZvLT5kYXRhKTsK CiAgICAvKiBVc2UgdGhlIHZwdHIgJ3NpemUnIGZpZWxkIHRvIGFjY2VzcyBh IGNsYXNzIHRoZSBlbGVtZW50IG9mIGEgY2xhc3MKKioqKioqKioqKioqKioq IGJ1aWxkX2FycmF5X3JlZiAodHJlZSBkZXNjLCB0cmVlIG9mZnNldCwKKioq IDMyODgsMzMzMiAqKioqCiAgewogICAgdHJlZSB0bXA7CiAgICB0cmVlIHR5 cGU7CiEgICB0cmVlIGNkZWNsOwohICAgYm9vbCBjbGFzc2FycmF5ID0gZmFs c2U7CgogICAgLyogRm9yIGNsYXNzIGFycmF5cyB0aGUgY2xhc3MgZGVjbGFy YXRpb24gaXMgc3RvcmVkIGluIHRoZSBzYXZlZAogICAgICAgZGVzY3JpcHRv ci4gICovCiAgICBpZiAoSU5ESVJFQ1RfUkVGX1AgKGRlc2MpCiAgICAgICAg JiYgREVDTF9MQU5HX1NQRUNJRklDIChUUkVFX09QRVJBTkQgKGRlc2MsIDAp KQogICAgICAgICYmIEdGQ19ERUNMX1NBVkVEX0RFU0NSSVBUT1IgKFRSRUVf T1BFUkFORCAoZGVzYywgMCkpKQohICAgICBjZGVjbCA9IGdmY19jbGFzc19k YXRhX2dldCAoR0ZDX0RFQ0xfU0FWRURfREVTQ1JJUFRPUiAoCiAgCQkJCSAg VFJFRV9PUEVSQU5EIChkZXNjLCAwKSkpOwogICAgZWxzZQohICAgICBjZGVj bCA9IGRlc2M7CgogICAgLyogQ2xhc3MgY29udGFpbmVyIHR5cGVzIGRvIG5v dCBhbHdheXMgaGF2ZSB0aGUgR0ZDX0NMQVNTX1RZUEVfUAogICAgICAgYnV0 IHRoZSBjYW5vbmljYWwgdHlwZSBkb2VzLiAgKi8KISAgIGlmIChHRkNfREVT Q1JJUFRPUl9UWVBFX1AgKFRSRUVfVFlQRSAoY2RlY2wpKQohICAgICAgICYm IFRSRUVfQ09ERSAoY2RlY2wpID09IENPTVBPTkVOVF9SRUYpCiAgICAgIHsK ISAgICAgICB0eXBlID0gVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKGNkZWNs LCAwKSk7CiAgICAgICAgaWYgKFRZUEVfQ0FOT05JQ0FMICh0eXBlKQogIAkg ICYmIEdGQ19DTEFTU19UWVBFX1AgKFRZUEVfQ0FOT05JQ0FMICh0eXBlKSkp CiEgCXsKISAJICB0eXBlID0gVFJFRV9UWVBFIChkZXNjKTsKISAJICBjbGFz c2FycmF5ID0gdHJ1ZTsKISAJfQohICAgICB9CiEgICBlbHNlCiEgICAgIHR5 cGUgPSBOVUxMOwohCiEgICAvKiBDbGFzcyBhcnJheSByZWZlcmVuY2VzIG5l ZWQgc3BlY2lhbCB0cmVhdG1lbnQgYmVjYXVzZSB0aGUgYXNzaWduZWQKISAg ICAgIHR5cGUgc2l6ZSBuZWVkcyB0byBiZSB1c2VkIHRvIHBvaW50IHRvIHRo ZSBlbGVtZW50LiAgKi8KISAgIGlmIChjbGFzc2FycmF5KQohICAgICB7CiEg ICAgICAgdHlwZSA9IGdmY19nZXRfZWxlbWVudF90eXBlICh0eXBlKTsKISAg ICAgICB0bXAgPSBUUkVFX09QRVJBTkQgKGNkZWNsLCAwKTsKISAgICAgICB0 bXAgPSBnZmNfZ2V0X2NsYXNzX2FycmF5X3JlZiAob2Zmc2V0LCB0bXAsIE5V TExfVFJFRSk7CiEgICAgICAgdG1wID0gZm9sZF9jb252ZXJ0IChidWlsZF9w b2ludGVyX3R5cGUgKHR5cGUpLCB0bXApOwohICAgICAgIHRtcCA9IGJ1aWxk X2ZvbGRfaW5kaXJlY3RfcmVmX2xvYyAoaW5wdXRfbG9jYXRpb24sIHRtcCk7 CiEgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQoKICAgIHRtcCA9IGdmY19j b252X2FycmF5X2RhdGEgKGRlc2MpOwotLS0gMzQ0NiwzNDcyIC0tLS0KICB7 CiAgICB0cmVlIHRtcDsKICAgIHRyZWUgdHlwZTsKISAgIHRyZWUgY2Rlc2M7 CgogICAgLyogRm9yIGNsYXNzIGFycmF5cyB0aGUgY2xhc3MgZGVjbGFyYXRp b24gaXMgc3RvcmVkIGluIHRoZSBzYXZlZAogICAgICAgZGVzY3JpcHRvci4g ICovCiAgICBpZiAoSU5ESVJFQ1RfUkVGX1AgKGRlc2MpCiAgICAgICAgJiYg REVDTF9MQU5HX1NQRUNJRklDIChUUkVFX09QRVJBTkQgKGRlc2MsIDApKQog ICAgICAgICYmIEdGQ19ERUNMX1NBVkVEX0RFU0NSSVBUT1IgKFRSRUVfT1BF UkFORCAoZGVzYywgMCkpKQohICAgICBjZGVzYyA9IGdmY19jbGFzc19kYXRh X2dldCAoR0ZDX0RFQ0xfU0FWRURfREVTQ1JJUFRPUiAoCiAgCQkJCSAgVFJF RV9PUEVSQU5EIChkZXNjLCAwKSkpOwogICAgZWxzZQohICAgICBjZGVzYyA9 IGRlc2M7CgogICAgLyogQ2xhc3MgY29udGFpbmVyIHR5cGVzIGRvIG5vdCBh bHdheXMgaGF2ZSB0aGUgR0ZDX0NMQVNTX1RZUEVfUAogICAgICAgYnV0IHRo ZSBjYW5vbmljYWwgdHlwZSBkb2VzLiAgKi8KISAgIGlmIChHRkNfREVTQ1JJ UFRPUl9UWVBFX1AgKFRSRUVfVFlQRSAoY2Rlc2MpKQohICAgICAgICYmIFRS RUVfQ09ERSAoY2Rlc2MpID09IENPTVBPTkVOVF9SRUYpCiAgICAgIHsKISAg ICAgICB0eXBlID0gVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKGNkZXNjLCAw KSk7CiAgICAgICAgaWYgKFRZUEVfQ0FOT05JQ0FMICh0eXBlKQogIAkgICYm IEdGQ19DTEFTU19UWVBFX1AgKFRZUEVfQ0FOT05JQ0FMICh0eXBlKSkpCiEg CXZwdHIgPSBnZmNfY2xhc3NfdnB0cl9nZXQgKFRSRUVfT1BFUkFORCAoY2Rl c2MsIDApKTsKICAgICAgfQoKICAgIHRtcCA9IGdmY19jb252X2FycmF5X2Rh dGEgKGRlc2MpOwoqKioqKioqKioqKioqKiogZ2ZjX2NvbnZfYXJyYXlfcmVm IChnZmNfc2UgKiBzZSwgZ2ZjX2FycgoqKiogMzM1MCwzMzU1ICoqKioKLS0t IDM0OTAsMzQ5NiAtLS0tCiAgICB0cmVlIG9mZnNldCwgY3N0X29mZnNldDsK ICAgIHRyZWUgdG1wOwogICAgdHJlZSBzdHJpZGU7CisgICB0cmVlIGRlY2wg PSBOVUxMX1RSRUU7CiAgICBnZmNfc2UgaW5kZXhzZTsKICAgIGdmY19zZSB0 bXBzZTsKICAgIGdmY19zeW1ib2wgKiBzeW0gPSBleHByLT5zeW10cmVlLT5u LnN5bTsKKioqKioqKioqKioqKioqIGdmY19jb252X2FycmF5X3JlZiAoZ2Zj X3NlICogc2UsIGdmY19hcnIKKioqIDM0OTQsMzUwMSAqKioqCiAgICAgIG9m ZnNldCA9IGZvbGRfYnVpbGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIFBMVVNf RVhQUiwKICAJCQkgICAgICBnZmNfYXJyYXlfaW5kZXhfdHlwZSwgb2Zmc2V0 LCBjc3Rfb2Zmc2V0KTsKCiEgICBzZS0+ZXhwciA9IGJ1aWxkX2FycmF5X3Jl ZiAoc2UtPmV4cHIsIG9mZnNldCwgc3ltLT50cy50eXBlID09IEJUX0NMQVNT ID8KISAJCQkJTlVMTF9UUkVFIDogc3ltLT5iYWNrZW5kX2RlY2wsIHNlLT5j bGFzc192cHRyKTsKICB9CgoKLS0tIDM2MzUsMzY2NSAtLS0tCiAgICAgIG9m ZnNldCA9IGZvbGRfYnVpbGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIFBMVVNf RVhQUiwKICAJCQkgICAgICBnZmNfYXJyYXlfaW5kZXhfdHlwZSwgb2Zmc2V0 LCBjc3Rfb2Zmc2V0KTsKCiEgICAvKiBBIHBvaW50ZXIgYXJyYXkgY29tcG9u ZW50IGNhbiBiZSBkZXRlY3RlZCBmcm9tIGl0cyBmaWVsZCBkZWNsLiBGaXgK ISAgICAgIHRoZSBkZXNjcmlwdG9yLCBtYXJrIHRoZSByZXN1bHRpbmcgdmFy aWFibGUgZGVjbCBhbmQgcGFzcyBpdCB0bwohICAgICAgYnVpbGRfYXJyYXlf cmVmLiAgKi8KISAgIGlmICghZXhwci0+dHMuZGVmZXJyZWQgJiYgIXN5bS0+ YXR0ci5jb2RpbWVuc2lvbgohICAgICAgICYmIGlzX3BvaW50ZXJfYXJyYXkg KHNlLT5leHByKSkKISAgICAgewohICAgICAgIGlmIChUUkVFX0NPREUgKHNl LT5leHByKSA9PSBDT01QT05FTlRfUkVGKQohIAl7CiEgCSAgZGVjbCA9IGdm Y19ldmFsdWF0ZV9ub3cgKHNlLT5leHByLCAmc2UtPnByZSk7CiEgCSAgR0ZD X0RFQ0xfUFRSX0FSUkFZX1AgKGRlY2wpID0gMTsKISAJICBUUkVFX1VTRUQg KGRlY2wpID0gMTsKISAJfQohICAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAo c2UtPmV4cHIpID09IElORElSRUNUX1JFRikKISAJZGVjbCA9IFRSRUVfT1BF UkFORCAoc2UtPmV4cHIsIDApOwohICAgICAgIGVsc2UKISAJZGVjbCA9IHNl LT5leHByOwohICAgICB9CiEgICBlbHNlIGlmIChleHByLT50cy5kZWZlcnJl ZAohIAkgICB8fCAoc3ltLT50cy50eXBlID09IEJUX0NIQVJBQ1RFUgohIAkg ICAgICAgJiYgc3ltLT5hdHRyLnNlbGVjdF90eXBlX3RlbXBvcmFyeSkpCiEg ICAgIGRlY2wgPSBzeW0tPmJhY2tlbmRfZGVjbDsKISAgIGVsc2UgaWYgKHN5 bS0+dHMudHlwZSA9PSBCVF9DTEFTUykKISAgICAgZGVjbCA9IE5VTExfVFJF RTsKIQohICAgc2UtPmV4cHIgPSBidWlsZF9hcnJheV9yZWYgKHNlLT5leHBy LCBvZmZzZXQsIGRlY2wsIHNlLT5jbGFzc192cHRyKTsKICB9CgoKKioqKioq KioqKioqKioqIGdmY19hcnJheV9hbGxvY2F0ZSAoZ2ZjX3NlICogc2UsIGdm Y19leHAKKioqIDU2NDgsNTY1MyAqKioqCi0tLSA1ODEyLDU4MzAgLS0tLQog ICAgaWYgKGRpbWVuc2lvbikKICAgICAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9v ZmZzZXRfc2V0ICgmc2V0X2Rlc2NyaXB0b3JfYmxvY2ssIHNlLT5leHByLCBv ZmZzZXQpOwoKKyAgIC8qIFBvaW50ZXIgYXJyYXlzIG5lZWQgdGhlIHNwYW4g ZmllbGQgdG8gYmUgc2V0LiAgKi8KKyAgIGlmIChpc19wb2ludGVyX2FycmF5 IChzZS0+ZXhwcikKKyAgICAgICB8fCAoZXhwci0+dHMudHlwZSA9PSBCVF9D TEFTUworIAkgICYmIENMQVNTX0RBVEEgKGV4cHIpLT5hdHRyLmNsYXNzX3Bv aW50ZXIpKQorICAgICB7CisgICAgICAgaWYgKGV4cHIzICYmIGV4cHIzX2Vs ZW1fc2l6ZSAhPSBOVUxMX1RSRUUpCisgCXRtcCA9IGV4cHIzX2VsZW1fc2l6 ZTsKKyAgICAgICBlbHNlCisgCXRtcCA9IFRZUEVfU0laRV9VTklUIChnZmNf Z2V0X2VsZW1lbnRfdHlwZSAoVFJFRV9UWVBFIChzZS0+ZXhwcikpKTsKKyAg ICAgICB0bXAgPSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBl LCB0bXApOworICAgICAgIGdmY19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQg KCZzZXRfZGVzY3JpcHRvcl9ibG9jaywgc2UtPmV4cHIsIHRtcCk7CisgICAg IH0KKwogICAgc2V0X2Rlc2NyaXB0b3IgPSBnZmNfZmluaXNoX2Jsb2NrICgm c2V0X2Rlc2NyaXB0b3JfYmxvY2spOwogICAgaWYgKHN0YXR1cyAhPSBOVUxM X1RSRUUpCiAgICAgIHsKKioqKioqKioqKioqKioqIGdmY19jb252X2V4cHJf ZGVzY3JpcHRvciAoZ2ZjX3NlICpzZSwgZ2YKKioqIDY4NTEsNjg1NiAqKioq Ci0tLSA3MDI4LDcwMzcgLS0tLQogIAkgICAgICAvKiBBZGQgYW55IG9mZnNl dHMgZnJvbSBzdWJyZWZlcmVuY2VzLiAgKi8KICAJICAgICAgZ2ZjX2dldF9k YXRhcHRyX29mZnNldCAoJnNlLT5wcmUsIHNlLT5leHByLCBkZXNjLCBOVUxM X1RSRUUsCiAgCQkJCSAgICAgIHN1YnJlZl9hcnJheV90YXJnZXQsIGV4cHIp OworCisgCSAgICAgIC8qIC4uLi5hbmQgc2V0IHRoZSBzcGFuIGZpZWxkLiAg Ki8KKyAJICAgICAgdG1wID0gZ2V0X2FycmF5X3NwYW4gKGRlc2MsIGV4cHIp OworIAkgICAgICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgmc2Ut PnByZSwgc2UtPmV4cHIsIHRtcCk7CiAgCSAgICB9CiAgCSAgZWxzZSBpZiAo c2UtPndhbnRfcG9pbnRlcikKICAJICAgIHsKKioqKioqKioqKioqKioqIGdm Y19jb252X2V4cHJfZGVzY3JpcHRvciAoZ2ZjX3NlICpzZSwgZ2YKKioqIDY4 ODYsNjg5MyAqKioqCi0tLSA3MDY3LDcwODQgLS0tLQogIAkgICAgc2UtPnNz ID0gc3M7CiAgCSAgZWxzZQogIAkgICAgZ2NjX2Fzc2VydCAoc2UtPnNzID09 IHNzKTsKKworIAkgIGlmICghaXNfcG9pbnRlcl9hcnJheSAoc2UtPmV4cHIp KQorIAkgICAgeworIAkgICAgICB0bXAgPSBnZmNfZ2V0X2VsZW1lbnRfdHlw ZSAoVFJFRV9UWVBFIChzZS0+ZXhwcikpOworIAkgICAgICB0bXAgPSBmb2xk X2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLAorIAkJCQkgIHNpemVf aW5fYnl0ZXMgKHRtcCkpOworIAkgICAgICBnZmNfY29udl9kZXNjcmlwdG9y X3NwYW5fc2V0ICgmc2UtPnByZSwgc2UtPmV4cHIsIHRtcCk7CisgCSAgICB9 CisKICAJICBzZS0+ZXhwciA9IGdmY19idWlsZF9hZGRyX2V4cHIgKE5VTExf VFJFRSwgc2UtPmV4cHIpOwogIAkgIGdmY19jb252X2V4cHIgKHNlLCBleHBy KTsKKwogIAkgIGdmY19mcmVlX3NzX2NoYWluIChzcyk7CiAgCSAgcmV0dXJu OwogIAl9CioqKioqKioqKioqKioqKiBnZmNfY29udl9leHByX2Rlc2NyaXB0 b3IgKGdmY19zZSAqc2UsIGdmCioqKiA3MTA3LDcxMTUgKioqKgogICAgICAg IGRlc2MgPSBpbmZvLT5kZXNjcmlwdG9yOwogICAgICAgIGlmIChzZS0+ZGly ZWN0X2J5cmVmICYmICFzZS0+YnlyZWZfbm9hc3NpZ24pCiAgCXsKISAJICAv KiBGb3IgcG9pbnRlciBhc3NpZ25tZW50cyB3ZSBmaWxsIGluIHRoZSBkZXN0 aW5hdGlvbi4gICovCiAgCSAgcGFybSA9IHNlLT5leHByOwogIAkgIHBhcm10 eXBlID0gVFJFRV9UWVBFIChwYXJtKTsKICAJfQogICAgICAgIGVsc2UKICAJ ewotLS0gNzI5OCw3MzEwIC0tLS0KICAgICAgICBkZXNjID0gaW5mby0+ZGVz Y3JpcHRvcjsKICAgICAgICBpZiAoc2UtPmRpcmVjdF9ieXJlZiAmJiAhc2Ut PmJ5cmVmX25vYXNzaWduKQogIAl7CiEgCSAgLyogRm9yIHBvaW50ZXIgYXNz aWdubWVudHMgd2UgZmlsbCBpbiB0aGUgZGVzdGluYXRpb24uLi4uICAqLwog IAkgIHBhcm0gPSBzZS0+ZXhwcjsKICAJICBwYXJtdHlwZSA9IFRSRUVfVFlQ RSAocGFybSk7CisKKyAJICAvKiAuLi4uYW5kIHNldCB0aGUgc3BhbiBmaWVs ZC4gICovCisgCSAgdG1wID0gZ2V0X2FycmF5X3NwYW4gKGRlc2MsIGV4cHIp OworIAkgIGdmY19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQgKCZsb29wLnBy ZSwgcGFybSwgdG1wKTsKICAJfQogICAgICAgIGVsc2UKICAJewoqKioqKioq KioqKioqKiogZ2ZjX2NvbnZfYXJyYXlfcGFyYW1ldGVyIChnZmNfc2UgKiBz ZSwgZwoqKiogNzU4Miw3NTg3ICoqKioKLS0tIDc3NzcsNzc4MyAtLS0tCiAg ICAgICAgLyogRXZlcnkgb3RoZXIgdHlwZSBvZiBhcnJheS4gICovCiAgICAg ICAgc2UtPndhbnRfcG9pbnRlciA9IDE7CiAgICAgICAgZ2ZjX2NvbnZfZXhw cl9kZXNjcmlwdG9yIChzZSwgZXhwcik7CisKICAgICAgICBpZiAoc2l6ZSkK ICAJYXJyYXlfcGFyYW1ldGVyX3NpemUgKGJ1aWxkX2ZvbGRfaW5kaXJlY3Rf cmVmX2xvYyAoaW5wdXRfbG9jYXRpb24sCiAgCQkJCQkJICAgICAgIHNlLT5l eHByKSwKSW5kZXg6IGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQoqKiogZ2NjL2ZvcnRyYW4vdHJhbnMtYXJyYXku aAkocmV2aXNpb24gMjQ5ODY1KQotLS0gZ2NjL2ZvcnRyYW4vdHJhbnMtYXJy YXkuaAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogdHJlZSBnZmNf Y29udl9hcnJheV91Ym91bmQgKHRyZWUsIGludCk7CioqKiAxNTIsMTYwICoq KioKLS0tIDE1MiwxNjQgLS0tLQogIHZvaWQgZ2ZjX3RyYW5zX2FycmF5X2Nv Ym91bmRzICh0cmVlLCBzdG10YmxvY2tfdCAqLCBjb25zdCBnZmNfc3ltYm9s ICopOwoKICAvKiBCdWlsZCBleHByZXNzaW9ucyBmb3IgYWNjZXNzaW5nIGNv bXBvbmVudHMgb2YgYW4gYXJyYXkgZGVzY3JpcHRvci4gICovCisgdm9pZCBn ZmNfZ2V0X2Rlc2NyaXB0b3Jfb2Zmc2V0c19mb3JfaW5mbyAoY29uc3RfdHJl ZSwgdHJlZSAqLCB0cmVlICosIHRyZWUgKiwgdHJlZSAqLAorIAkJCQkJICB0 cmVlICosIHRyZWUgKiwgdHJlZSAqKTsKKwogIHRyZWUgZ2ZjX2NvbnZfZGVz Y3JpcHRvcl9kYXRhX2dldCAodHJlZSk7CiAgdHJlZSBnZmNfY29udl9kZXNj cmlwdG9yX2RhdGFfYWRkciAodHJlZSk7CiAgdHJlZSBnZmNfY29udl9kZXNj cmlwdG9yX29mZnNldF9nZXQgKHRyZWUpOworIHRyZWUgZ2ZjX2NvbnZfZGVz Y3JpcHRvcl9zcGFuX2dldCAodHJlZSk7CiAgdHJlZSBnZmNfY29udl9kZXNj cmlwdG9yX2R0eXBlICh0cmVlKTsKICB0cmVlIGdmY19jb252X2Rlc2NyaXB0 b3JfcmFuayAodHJlZSk7CiAgdHJlZSBnZmNfZ2V0X2Rlc2NyaXB0b3JfZGlt ZW5zaW9uICh0cmVlKTsKKioqKioqKioqKioqKioqIHRyZWUgZ2ZjX2NvbnZf ZGVzY3JpcHRvcl90b2tlbiAodHJlZSk7CioqKiAxNjUsMTcwICoqKioKLS0t IDE2OSwxNzUgLS0tLQoKICB2b2lkIGdmY19jb252X2Rlc2NyaXB0b3JfZGF0 YV9zZXQgKHN0bXRibG9ja190ICosIHRyZWUsIHRyZWUpOwogIHZvaWQgZ2Zj X2NvbnZfZGVzY3JpcHRvcl9vZmZzZXRfc2V0IChzdG10YmxvY2tfdCAqLCB0 cmVlLCB0cmVlKTsKKyB2b2lkIGdmY19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9z ZXQgKHN0bXRibG9ja190ICosIHRyZWUsIHRyZWUpOwogIHZvaWQgZ2ZjX2Nv bnZfZGVzY3JpcHRvcl9zdHJpZGVfc2V0IChzdG10YmxvY2tfdCAqLCB0cmVl LCB0cmVlLCB0cmVlKTsKICB2b2lkIGdmY19jb252X2Rlc2NyaXB0b3JfbGJv dW5kX3NldCAoc3RtdGJsb2NrX3QgKiwgdHJlZSwgdHJlZSwgdHJlZSk7CiAg dm9pZCBnZmNfY29udl9kZXNjcmlwdG9yX3Vib3VuZF9zZXQgKHN0bXRibG9j a190ICosIHRyZWUsIHRyZWUsIHRyZWUpOwpJbmRleDogZ2NjL2ZvcnRyYW4v dHJhbnMtZGVjbC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9m b3J0cmFuL3RyYW5zLWRlY2wuYwkocmV2aXNpb24gMjQ5ODY1KQotLS0gZ2Nj L2ZvcnRyYW4vdHJhbnMtZGVjbC5jCSh3b3JraW5nIGNvcHkpCioqKioqKioq KioqKioqKiBnZmNfZ2V0X3N5bWJvbF9kZWNsIChnZmNfc3ltYm9sICogc3lt KQoqKiogMTUxNywxNTIyICoqKioKLS0tIDE1MTcsMTUyNSAtLS0tCiAgICAg ICAgLyogRHVtbXkgdmFyaWFibGVzIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVl biBjcmVhdGVkLiAgKi8KICAgICAgICBnY2NfYXNzZXJ0IChzeW0tPmJhY2tl bmRfZGVjbCk7CgorICAgICAgIGlmIChzeW0tPmF0dHIucG9pbnRlciAmJiBz eW0tPmF0dHIuZGltZW5zaW9uICYmIHN5bS0+dHMudHlwZSAhPSBCVF9DTEFT UykKKyAJR0ZDX0RFQ0xfUFRSX0FSUkFZX1AgKHN5bS0+YmFja2VuZF9kZWNs KSA9IDE7CisKICAgICAgICAvKiBDcmVhdGUgYSBjaGFyYWN0ZXIgbGVuZ3Ro IHZhcmlhYmxlLiAgKi8KICAgICAgICBpZiAoc3ltLT50cy50eXBlID09IEJU X0NIQVJBQ1RFUikKICAJewoqKioqKioqKioqKioqKiogZ2ZjX2dldF9zeW1i b2xfZGVjbCAoZ2ZjX3N5bWJvbCAqIHN5bSkKKioqIDE3NTEsMTc3NyAqKioq CiAgICBpZiAoc3ltLT50cy50eXBlID09IEJUX0NIQVJBQ1RFUikKICAgICAg LyogQ2hhcmFjdGVyIHZhcmlhYmxlcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcu ICAqLwogICAgICBnZmNfYWxsb2NhdGVfbGFuZ19kZWNsIChkZWNsKTsKLSAg IGVsc2UgaWYgKHN5bS0+YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikKLSAg ICAgLyogV2UgbmVlZCB0aGUgc3BhbiBmb3IgdGhlc2UgYmVhc3RzLiAgKi8K LSAgICAgZ2ZjX2FsbG9jYXRlX2xhbmdfZGVjbCAoZGVjbCk7CgohICAgaWYg KHN5bS0+YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikKISAgICAgewohICAg ICAgIHRyZWUgc3BhbjsKISAgICAgICBHRkNfREVDTF9TVUJSRUZfQVJSQVlf UCAoZGVjbCkgPSAxOwohICAgICAgIHNwYW4gPSBidWlsZF9kZWNsIChpbnB1 dF9sb2NhdGlvbiwKISAJCQkgVkFSX0RFQ0wsIGNyZWF0ZV90bXBfdmFyX25h bWUgKCJzcGFuIiksCiEgCQkJIGdmY19hcnJheV9pbmRleF90eXBlKTsKISAg ICAgICBnZmNfZmluaXNoX3Zhcl9kZWNsIChzcGFuLCBzeW0pOwohICAgICAg IFRSRUVfU1RBVElDIChzcGFuKSA9IFRSRUVfU1RBVElDIChkZWNsKTsKISAg ICAgICBERUNMX0FSVElGSUNJQUwgKHNwYW4pID0gMTsKCiEgICAgICAgR0ZD X0RFQ0xfU1BBTiAoZGVjbCkgPSBzcGFuOwohICAgICAgIEdGQ19UWVBFX0FS UkFZX1NQQU4gKFRSRUVfVFlQRSAoZGVjbCkpID0gc3BhbjsKISAgICAgfQoK ICAgIGlmIChzeW0tPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCiEgCUdGQ19ERUNM X0NMQVNTKGRlY2wpID0gMTsKCiAgICBzeW0tPmJhY2tlbmRfZGVjbCA9IGRl Y2w7CgotLS0gMTc1NCwxNzcxIC0tLS0KICAgIGlmIChzeW0tPnRzLnR5cGUg PT0gQlRfQ0hBUkFDVEVSKQogICAgICAvKiBDaGFyYWN0ZXIgdmFyaWFibGVz IG5lZWQgc3BlY2lhbCBoYW5kbGluZy4gICovCiAgICAgIGdmY19hbGxvY2F0 ZV9sYW5nX2RlY2wgKGRlY2wpOwoKISAgIGlmIChzeW0tPmFzc29jICYmIHN5 bS0+YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikKISAgICAgc3ltLT5hdHRy LnBvaW50ZXIgPSAxOwoKISAgIGlmIChzeW0tPmF0dHIucG9pbnRlciAmJiBz eW0tPmF0dHIuZGltZW5zaW9uCiEgICAgICAgJiYgIXN5bS0+dHMuZGVmZXJy ZWQKISAgICAgICAmJiAhKHN5bS0+YXR0ci5zZWxlY3RfdHlwZV90ZW1wb3Jh cnkKISAJICAgJiYgIXN5bS0+YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikp CiEgICAgIEdGQ19ERUNMX1BUUl9BUlJBWV9QIChkZWNsKSA9IDE7CgogICAg aWYgKHN5bS0+dHMudHlwZSA9PSBCVF9DTEFTUykKISAgICAgR0ZDX0RFQ0xf Q0xBU1MoZGVjbCkgPSAxOwoKICAgIHN5bS0+YmFja2VuZF9kZWNsID0gZGVj bDsKCioqKioqKioqKioqKioqKiBnZmNfdHJhbnNfZGVmZXJyZWRfdmFycyAo Z2ZjX3N5bWJvbCAqIHByCioqKiA0MjY5LDQyODEgKioqKgogICAgICAgIGlm IChzeW0tPmFzc29jKQogIAljb250aW51ZTsKCiEgICAgICAgaWYgKHN5bS0+ YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcgohIAkgICYmIEdGQ19ERUNMX1NQ QU4gKHN5bS0+YmFja2VuZF9kZWNsKQohIAkgICYmICFUUkVFX1NUQVRJQyAo R0ZDX0RFQ0xfU1BBTiAoc3ltLT5iYWNrZW5kX2RlY2wpKSkKICAJewogIAkg IGdmY19pbml0X2Jsb2NrICgmdG1wYmxvY2spOwohIAkgIGdmY19hZGRfbW9k aWZ5ICgmdG1wYmxvY2ssIEdGQ19ERUNMX1NQQU4gKHN5bS0+YmFja2VuZF9k ZWNsKSwKISAJCQkgIGJ1aWxkX2ludF9jc3QgKGdmY19hcnJheV9pbmRleF90 eXBlLCAwKSk7CiAgCSAgZ2ZjX2FkZF9pbml0X2NsZWFudXAgKGJsb2NrLCBn ZmNfZmluaXNoX2Jsb2NrICgmdG1wYmxvY2spLAogIAkJCQlOVUxMX1RSRUUp OwogIAl9Ci0tLSA0MjYzLDQyNzcgLS0tLQogICAgICAgIGlmIChzeW0tPmFz c29jKQogIAljb250aW51ZTsKCiEgICAgICAgaWYgKHN5bS0+YXR0ci5wb2lu dGVyICYmIHN5bS0+YXR0ci5kaW1lbnNpb24KISAJICAmJiAhc3ltLT5hdHRy LnVzZV9hc3NvYwohIAkgICYmICFzeW0tPmF0dHIuaG9zdF9hc3NvYwohIAkg ICYmICFzeW0tPmF0dHIuZHVtbXkKISAJICAmJiBHRkNfREVTQ1JJUFRPUl9U WVBFX1AgKFRSRUVfVFlQRSAoc3ltLT5iYWNrZW5kX2RlY2wpKSkKICAJewog IAkgIGdmY19pbml0X2Jsb2NrICgmdG1wYmxvY2spOwohIAkgIGdmY19jb252 X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQgKCZ0bXBibG9jaywgc3ltLT5iYWNrZW5k X2RlY2wsCiEgCQkJCWJ1aWxkX2ludF9jc3QgKGdmY19hcnJheV9pbmRleF90 eXBlLCAwKSk7CiAgCSAgZ2ZjX2FkZF9pbml0X2NsZWFudXAgKGJsb2NrLCBn ZmNfZmluaXNoX2Jsb2NrICgmdG1wYmxvY2spLAogIAkJCQlOVUxMX1RSRUUp OwogIAl9CkluZGV4OiBnY2MvZm9ydHJhbi90cmFucy1leHByLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQoqKiogZ2NjL2ZvcnRyYW4vdHJhbnMtZXhwci5j CShyZXZpc2lvbiAyNDk4NjUpCi0tLSBnY2MvZm9ydHJhbi90cmFucy1leHBy LmMJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqIGdmY19jb252X3By b2NlZHVyZV9jYWxsIChnZmNfc2UgKiBzZSwgZ2YKKioqIDU0MTMsNTQxOSAq KioqCiAgCQl9CgogIAkgICAgICBpZiAoZS0+ZXhwcl90eXBlID09IEVYUFJf VkFSSUFCTEUKISAJCSAgICAmJiBpc19zdWJyZWZfYXJyYXkgKGUpKQogIAkJ LyogVGhlIGFjdHVhbCBhcmd1bWVudCBpcyBhIGNvbXBvbmVudCByZWZlcmVu Y2UgdG8gYW4KICAJCSAgIGFycmF5IG9mIGRlcml2ZWQgdHlwZXMuICBJbiB0 aGlzIGNhc2UsIHRoZSBhcmd1bWVudAogIAkJICAgaXMgY29udmVydGVkIHRv IGEgdGVtcG9yYXJ5LCB3aGljaCBpcyBwYXNzZWQgYW5kIHRoZW4KLS0tIDU0 MTMsNTQyMCAtLS0tCiAgCQl9CgogIAkgICAgICBpZiAoZS0+ZXhwcl90eXBl ID09IEVYUFJfVkFSSUFCTEUKISAJCSAgICAmJiBpc19zdWJyZWZfYXJyYXkg KGUpCiEgCQkgICAgJiYgIShmc3ltICYmIGZzeW0tPmF0dHIucG9pbnRlcikp CiAgCQkvKiBUaGUgYWN0dWFsIGFyZ3VtZW50IGlzIGEgY29tcG9uZW50IHJl ZmVyZW5jZSB0byBhbgogIAkJICAgYXJyYXkgb2YgZGVyaXZlZCB0eXBlcy4g IEluIHRoaXMgY2FzZSwgdGhlIGFyZ3VtZW50CiAgCQkgICBpcyBjb252ZXJ0 ZWQgdG8gYSB0ZW1wb3JhcnksIHdoaWNoIGlzIHBhc3NlZCBhbmQgdGhlbgoq KioqKioqKioqKioqKiogZ2ZjX3RyYW5zX3BvaW50ZXJfYXNzaWdubWVudCAo Z2ZjX2V4cHIgKgoqKiogODIyMyw4MjI5ICoqKioKICAgIHN0bXRibG9ja190 IGJsb2NrOwogICAgdHJlZSBkZXNjOwogICAgdHJlZSB0bXA7Ci0gICB0cmVl IGRlY2w7CiAgICBib29sIHNjYWxhciwgbm9uX3Byb2NfcG9pbnRlcl9hc3Np Z247CiAgICBnZmNfc3MgKnNzOwoKLS0tIDgyMjQsODIyOSAtLS0tCioqKioq KioqKioqKioqKiBnZmNfdHJhbnNfcG9pbnRlcl9hc3NpZ25tZW50IChnZmNf ZXhwciAqCioqKiA4NDEyLDg0MzUgKioqKgogIAkgIGdmY19jb252X2V4cHJf ZGVzY3JpcHRvciAoJmxzZSwgZXhwcjIpOwogIAkgIHN0cmxlbl9yaHMgPSBs c2Uuc3RyaW5nX2xlbmd0aDsKCiEgCSAgLyogSWYgdGhpcyBpcyBhIHN1YnJl ZmVyZW5jZSBhcnJheSBwb2ludGVyIGFzc2lnbm1lbnQsIHVzZSB0aGUgcmhz CiEgCSAgICAgZGVzY3JpcHRvciBlbGVtZW50IHNpemUgZm9yIHRoZSBsaHMg c3Bhbi4gICovCiEgCSAgaWYgKGV4cHIxLT5zeW10cmVlLT5uLnN5bS0+YXR0 ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikKISAJICAgIHsKISAJICAgICAgZGVj bCA9IGV4cHIxLT5zeW10cmVlLT5uLnN5bS0+YmFja2VuZF9kZWNsOwohIAkg ICAgICBnZmNfaW5pdF9zZSAoJnJzZSwgTlVMTCk7CiEgCSAgICAgIHJzZS5k ZXNjcmlwdG9yX29ubHkgPSAxOwohIAkgICAgICBnZmNfY29udl9leHByICgm cnNlLCBleHByMik7CiEgCSAgICAgIGlmIChleHByMS0+dHMudHlwZSA9PSBC VF9DTEFTUykKISAJCXRyYW5zX2NsYXNzX3ZwdHJfbGVuX2Fzc2lnbm1lbnQg KCZibG9jaywgZXhwcjEsIGV4cHIyLCAmcnNlLAohIAkJCQkJCSBOVUxMLCBO VUxMKTsKISAJICAgICAgdG1wID0gZ2ZjX2dldF9lbGVtZW50X3R5cGUgKFRS RUVfVFlQRSAocnNlLmV4cHIpKTsKISAJICAgICAgdG1wID0gZm9sZF9jb252 ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgc2l6ZV9pbl9ieXRlcyAodG1w KSk7CiEgCSAgICAgIGlmICghSU5URUdFUl9DU1RfUCAodG1wKSkKISAJCWdm Y19hZGRfYmxvY2tfdG9fYmxvY2sgKCZsc2UucG9zdCwgJnJzZS5wcmUpOwoh IAkgICAgICBnZmNfYWRkX21vZGlmeSAoJmxzZS5wb3N0LCBHRkNfREVDTF9T UEFOKGRlY2wpLCB0bXApOwohIAkgICAgfQohIAkgIGVsc2UgaWYgKGV4cHIx LT50cy50eXBlID09IEJUX0NMQVNTKQogIAkgICAgewogIAkgICAgICByc2Uu ZXhwciA9IE5VTExfVFJFRTsKICAJICAgICAgcnNlLnN0cmluZ19sZW5ndGgg PSBOVUxMX1RSRUU7Ci0tLSA4NDEyLDg0MTggLS0tLQogIAkgIGdmY19jb252 X2V4cHJfZGVzY3JpcHRvciAoJmxzZSwgZXhwcjIpOwogIAkgIHN0cmxlbl9y aHMgPSBsc2Uuc3RyaW5nX2xlbmd0aDsKCiEgCSAgaWYgKGV4cHIxLT50cy50 eXBlID09IEJUX0NMQVNTKQogIAkgICAgewogIAkgICAgICByc2UuZXhwciA9 IE5VTExfVFJFRTsKICAJICAgICAgcnNlLnN0cmluZ19sZW5ndGggPSBOVUxM X1RSRUU7CioqKioqKioqKioqKioqKiBnZmNfdHJhbnNfcG9pbnRlcl9hc3Np Z25tZW50IChnZmNfZXhwciAqCioqKiA4NDQ2LDg0NTIgKioqKgogIAkgICAg ewogIAkgICAgICByc2UuZXhwciA9IGdmY19jbGFzc19kYXRhX2dldCAocnNl LmV4cHIpOwogIAkgICAgICBnZmNfYWRkX21vZGlmeSAoJmxzZS5wcmUsIGRl c2MsIHJzZS5leHByKTsKISAJICAgIH0KICAJICBlbHNlCiAgCSAgICB7CiAg CSAgICAgIGV4cHIxX3ZwdHIgPSB0cmFuc19jbGFzc192cHRyX2xlbl9hc3Np Z25tZW50ICgmYmxvY2ssIGV4cHIxLAotLS0gODQyOSw4NDQwIC0tLS0KICAJ ICAgIHsKICAJICAgICAgcnNlLmV4cHIgPSBnZmNfY2xhc3NfZGF0YV9nZXQg KHJzZS5leHByKTsKICAJICAgICAgZ2ZjX2FkZF9tb2RpZnkgKCZsc2UucHJl LCBkZXNjLCByc2UuZXhwcik7CiEgCSAgICAgIC8qIFNldCB0aGUgbGhzIHNw YW4uICAqLwohIAkgICAgICB0bXAgPSBUUkVFX1RZUEUgKHJzZS5leHByKTsK ISAJICAgICAgdG1wID0gVFlQRV9TSVpFX1VOSVQgKGdmY19nZXRfZWxlbWVu dF90eXBlICh0bXApKTsKISAJICAgICAgdG1wID0gZm9sZF9jb252ZXJ0IChn ZmNfYXJyYXlfaW5kZXhfdHlwZSwgdG1wKTsKISAJICAgICAgZ2ZjX2NvbnZf ZGVzY3JpcHRvcl9zcGFuX3NldCAoJmxzZS5wcmUsIGRlc2MsIHRtcCk7CiEg IAkgICAgfQogIAkgIGVsc2UKICAJICAgIHsKICAJICAgICAgZXhwcjFfdnB0 ciA9IHRyYW5zX2NsYXNzX3ZwdHJfbGVuX2Fzc2lnbm1lbnQgKCZibG9jaywg ZXhwcjEsCioqKioqKioqKioqKioqKiBnZmNfdHJhbnNfcG9pbnRlcl9hc3Np Z25tZW50IChnZmNfZXhwciAqCioqKiA4NDkyLDg0OTggKioqKgogIAkJIGNv bnZlcnRlZCBpbiByc2UgYW5kIG5vdyBoYXZlIHRvIGJ1aWxkIHRoZSBjb3Jy ZWN0IExIUwogIAkJIGRlc2NyaXB0b3IgZm9yIGl0LiAgKi8KCiEgCSAgICAg IHRyZWUgZHR5cGUsIGRhdGE7CiAgCSAgICAgIHRyZWUgb2Zmcywgc3RyaWRl OwogIAkgICAgICB0cmVlIGxib3VuZCwgdWJvdW5kOwoKLS0tIDg0ODAsODQ4 NiAtLS0tCiAgCQkgY29udmVydGVkIGluIHJzZSBhbmQgbm93IGhhdmUgdG8g YnVpbGQgdGhlIGNvcnJlY3QgTEhTCiAgCQkgZGVzY3JpcHRvciBmb3IgaXQu ICAqLwoKISAJICAgICAgdHJlZSBkdHlwZSwgZGF0YSwgc3BhbjsKICAJICAg ICAgdHJlZSBvZmZzLCBzdHJpZGU7CiAgCSAgICAgIHRyZWUgbGJvdW5kLCB1 Ym91bmQ7CgoqKioqKioqKioqKioqKiogZ2ZjX3RyYW5zX3BvaW50ZXJfYXNz aWdubWVudCAoZ2ZjX2V4cHIgKgoqKiogODUwNSw4NTEwICoqKioKLS0tIDg0 OTMsODUxMCAtLS0tCiAgCSAgICAgIGRhdGEgPSBnZmNfY29udl9kZXNjcmlw dG9yX2RhdGFfZ2V0IChyc2UuZXhwcik7CiAgCSAgICAgIGdmY19jb252X2Rl c2NyaXB0b3JfZGF0YV9zZXQgKCZibG9jaywgZGVzYywgZGF0YSk7CgorIAkg ICAgICAvKiBDb3B5IHRoZSBzcGFuLiAgKi8KKyAJICAgICAgaWYgKFRSRUVf Q09ERSAocnNlLmV4cHIpID09IFZBUl9ERUNMCisgCQkgICYmIEdGQ19ERUNM X1BUUl9BUlJBWV9QIChyc2UuZXhwcikpCisgCQlzcGFuID0gZ2ZjX2NvbnZf ZGVzY3JpcHRvcl9zcGFuX2dldCAocnNlLmV4cHIpOworIAkgICAgICBlbHNl CisgCQl7CisgCQkgIHRtcCA9IFRSRUVfVFlQRSAocnNlLmV4cHIpOworIAkJ ICB0bXAgPSBUWVBFX1NJWkVfVU5JVCAoZ2ZjX2dldF9lbGVtZW50X3R5cGUg KHRtcCkpOworIAkJICBzcGFuID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlf aW5kZXhfdHlwZSwgdG1wKTsKKyAJCX0KKyAJICAgICAgZ2ZjX2NvbnZfZGVz Y3JpcHRvcl9zcGFuX3NldCAoJmJsb2NrLCBkZXNjLCBzcGFuKTsKKwogIAkg ICAgICAvKiBDb3B5IG9mZnNldCBidXQgYWRqdXN0IGl0IHN1Y2ggdGhhdCBp dCB3b3VsZCBjb3JyZXNwb25kCiAgCQkgdG8gYSBsYm91bmQgb2YgemVyby4g ICovCiAgCSAgICAgIG9mZnMgPSBnZmNfY29udl9kZXNjcmlwdG9yX29mZnNl dF9nZXQgKHJzZS5leHByKTsKSW5kZXg6IGdjYy9mb3J0cmFuL3RyYW5zLWlu dHJpbnNpYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0 cmFuL3RyYW5zLWludHJpbnNpYy5jCShyZXZpc2lvbiAyNDk4NjUpCi0tLSBn Y2MvZm9ydHJhbi90cmFucy1pbnRyaW5zaWMuYwkod29ya2luZyBjb3B5KQoq KioqKioqKioqKioqKiogY29udl9leHByX3JlZl90b19jYWZfcmVmIChzdG10 YmxvY2tfdCAqYgoqKiogMTIyNSwxMjM0ICoqKioKICAJICAgICAgJiYgcmVm LT51LmMuY29tcG9uZW50LT5hdHRyLmRpbWVuc2lvbikKICAJICAgIHsKICAJ ICAgICAgdHJlZSBhcnJfZGVzY190b2tlbl9vZmZzZXQ7CiEgCSAgICAgIC8q IEdldCB0aGUgdG9rZW4gZnJvbSB0aGUgZGVzY3JpcHRvci4gICovCiEgCSAg ICAgIGFycl9kZXNjX3Rva2VuX29mZnNldCA9IGdmY19hZHZhbmNlX2NoYWlu ICgKISAJCSAgICBUWVBFX0ZJRUxEUyAoVFJFRV9UWVBFIChyZWYtPnUuYy5j b21wb25lbnQtPmJhY2tlbmRfZGVjbCkpLAohIAkJICAgIDQgLyogQ0FGX1RP S0VOX0ZJRUxEICAqLyk7CiAgCSAgICAgIGFycl9kZXNjX3Rva2VuX29mZnNl dAogIAkJICA9IGNvbXB1dGVfY29tcG9uZW50X29mZnNldCAoYXJyX2Rlc2Nf dG9rZW5fb2Zmc2V0LAogIAkJCQkJICAgICAgVFJFRV9UWVBFICh0bXApKTsK LS0tIDEyMjUsMTIzMyAtLS0tCiAgCSAgICAgICYmIHJlZi0+dS5jLmNvbXBv bmVudC0+YXR0ci5kaW1lbnNpb24pCiAgCSAgICB7CiAgCSAgICAgIHRyZWUg YXJyX2Rlc2NfdG9rZW5fb2Zmc2V0OwohIAkgICAgICAvKiBHZXQgdGhlIHRv a2VuIGZpZWxkIGZyb20gdGhlIGRlc2NyaXB0b3IuICAqLwohIAkgICAgICBh cnJfZGVzY190b2tlbl9vZmZzZXQgPSBUUkVFX09QRVJBTkQgKAohIAkJICAg IGdmY19jb252X2Rlc2NyaXB0b3JfdG9rZW4gKHJlZi0+dS5jLmNvbXBvbmVu dC0+YmFja2VuZF9kZWNsKSwgMSk7CiAgCSAgICAgIGFycl9kZXNjX3Rva2Vu X29mZnNldAogIAkJICA9IGNvbXB1dGVfY29tcG9uZW50X29mZnNldCAoYXJy X2Rlc2NfdG9rZW5fb2Zmc2V0LAogIAkJCQkJICAgICAgVFJFRV9UWVBFICh0 bXApKTsKKioqKioqKioqKioqKioqIGNvbnZfaXNvY2JpbmRpbmdfc3Vicm91 dGluZSAoZ2ZjX2NvZGUgKmMKKioqIDgxMjksODEzNCAqKioqCi0tLSA4MTI4 LDgxMzggLS0tLQogICAgZ2ZjX2FkZF9ibG9ja190b19ibG9jayAoJmJsb2Nr LCAmZnB0cnNlLnByZSk7CiAgICBkZXNjID0gZnB0cnNlLmV4cHI7CgorICAg LyogU2V0IHRoZSBzcGFuIGZpZWxkLiAgKi8KKyAgIHRtcCA9IFRZUEVfU0la RV9VTklUIChnZmNfZ2V0X2VsZW1lbnRfdHlwZSAoVFJFRV9UWVBFIChkZXNj KSkpOworICAgdG1wID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhf dHlwZSwgdG1wKTsKKyAgIGdmY19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQg KCZibG9jaywgZGVzYywgdG1wKTsKKwogICAgLyogU2V0IGRhdGEgdmFsdWUs IGR0eXBlLCBhbmQgb2Zmc2V0LiAgKi8KICAgIHRtcCA9IEdGQ19UWVBFX0FS UkFZX0RBVEFQVFJfVFlQRSAoVFJFRV9UWVBFIChkZXNjKSk7CiAgICBnZmNf Y29udl9kZXNjcmlwdG9yX2RhdGFfc2V0ICgmYmxvY2ssIGRlc2MsIGZvbGRf Y29udmVydCAodG1wLCBjcHRyc2UuZXhwcikpOwpJbmRleDogZ2NjL2ZvcnRy YW4vdHJhbnMtaW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2Mv Zm9ydHJhbi90cmFucy1pby5jCShyZXZpc2lvbiAyNDk4NjUpCi0tLSBnY2Mv Zm9ydHJhbi90cmFucy1pby5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioq KioqKiBnZmNfdHJhbnNfdHJhbnNmZXIgKGdmY19jb2RlICogY29kZSkKKioq IDI1NjMsMjU2OCAqKioqCi0tLSAyNTYzLDI1NzQgLS0tLQogIAkgIGdjY19h c3NlcnQgKHJlZiAmJiByZWYtPnR5cGUgPT0gUkVGX0FSUkFZKTsKICAJfQoK KyAgICAgICBpZiAoZXhwci0+dHMudHlwZSAhPSBCVF9DTEFTUworIAkgJiYg ZXhwci0+ZXhwcl90eXBlID09IEVYUFJfVkFSSUFCTEUKKyAJICYmIGdmY19l eHByX2F0dHIgKGV4cHIpLnBvaW50ZXIpCisgCWdvdG8gc2NhbGFyaXplOwor CisKICAgICAgICBpZiAoIShnZmNfYnRfc3RydWN0IChleHByLT50cy50eXBl KQogIAkgICAgICB8fCBleHByLT50cy50eXBlID09IEJUX0NMQVNTKQogIAkg ICAgJiYgcmVmICYmIHJlZi0+bmV4dCA9PSBOVUxMCioqKioqKioqKioqKioq KiBnZmNfdHJhbnNfdHJhbnNmZXIgKGdmY19jb2RlICogY29kZSkKKioqIDI1 OTcsMjYwMiAqKioqCi0tLSAyNjAzLDI2MDkgLS0tLQogIAkgIGdvdG8gZmlu aXNoX2Jsb2NrX2xhYmVsOwogIAl9CgorIHNjYWxhcml6ZToKICAgICAgICAv KiBJbml0aWFsaXplIHRoZSBzY2FsYXJpemVyLiAgKi8KICAgICAgICBzcyA9 IGdmY193YWxrX2V4cHIgKGV4cHIpOwogICAgICAgIGdmY19pbml0X2xvb3Bp bmZvICgmbG9vcCk7CioqKioqKioqKioqKioqKiBnZmNfdHJhbnNfdHJhbnNm ZXIgKGdmY19jb2RlICogY29kZSkKKioqIDI2MTIsMjYxOCAqKioqCi0tLSAy NjE5LDI2MjcgLS0tLQoKICAgICAgICBnZmNfY29weV9sb29waW5mb190b19z ZSAoJnNlLCAmbG9vcCk7CiAgICAgICAgc2Uuc3MgPSBzczsKKwogICAgICAg IGdmY19jb252X2V4cHJfcmVmZXJlbmNlICgmc2UsIGV4cHIpOworCiAgICAg ICAgaWYgKGV4cHItPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCiAgCXZwdHIgPSBn ZmNfZ2V0X3ZwdHJfZnJvbV9leHByIChzcy0+aW5mby0+ZGF0YS5hcnJheS5k ZXNjcmlwdG9yKTsKICAgICAgICBlbHNlCkluZGV4OiBnY2MvZm9ydHJhbi90 cmFucy1zdG10LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL2Zv cnRyYW4vdHJhbnMtc3RtdC5jCShyZXZpc2lvbiAyNDk4NjUpCi0tLSBnY2Mv Zm9ydHJhbi90cmFucy1zdG10LmMJKHdvcmtpbmcgY29weSkKKioqKioqKioq KioqKioqIHRyYW5zX2Fzc29jaWF0ZV92YXIgKGdmY19zeW1ib2wgKnN5bSwg Z2YKKioqIDE2MDYsMTYxMiAqKioqCiAgCSAgICAgIDogZS0+c3ltdHJlZS0+ bi5zeW0tPmJhY2tlbmRfZGVjbDsKICAJICB0bXAgPSBnZmNfZ2V0X2VsZW1l bnRfdHlwZSAoVFJFRV9UWVBFICh0bXApKTsKICAJICB0bXAgPSBmb2xkX2Nv bnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLCBzaXplX2luX2J5dGVzICh0 bXApKTsKISAJICBnZmNfYWRkX21vZGlmeSAoJnNlLnByZSwgR0ZDX0RFQ0xf U1BBTihkZXNjKSwgdG1wKTsKICAJfQoKICAgICAgICAvKiBEb25lLCByZWdp c3RlciBzdHVmZiBhcyBpbml0IC8gY2xlYW51cCBjb2RlLiAgKi8KLS0tIDE2 MDYsMTYxMiAtLS0tCiAgCSAgICAgIDogZS0+c3ltdHJlZS0+bi5zeW0tPmJh Y2tlbmRfZGVjbDsKICAJICB0bXAgPSBnZmNfZ2V0X2VsZW1lbnRfdHlwZSAo VFJFRV9UWVBFICh0bXApKTsKICAJICB0bXAgPSBmb2xkX2NvbnZlcnQgKGdm Y19hcnJheV9pbmRleF90eXBlLCBzaXplX2luX2J5dGVzICh0bXApKTsKISAJ ICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgmc2UucHJlLCBkZXNj LCB0bXApOwogIAl9CgogICAgICAgIC8qIERvbmUsIHJlZ2lzdGVyIHN0dWZm IGFzIGluaXQgLyBjbGVhbnVwIGNvZGUuICAqLwpJbmRleDogZ2NjL2ZvcnRy YW4vdHJhbnMtdHlwZXMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBn Y2MvZm9ydHJhbi90cmFucy10eXBlcy5jCShyZXZpc2lvbiAyNDk4NjUpCi0t LSBnY2MvZm9ydHJhbi90cmFucy10eXBlcy5jCSh3b3JraW5nIGNvcHkpCioq KioqKioqKioqKioqKiBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENP UFlJTkczLgoqKiogMzUsNDAgKioqKgotLS0gMzUsNDEgLS0tLQogICNpbmNs dWRlICJ0b3BsZXYuaCIJLyogRm9yIHJlc3Rfb2ZfZGVjbF9jb21waWxhdGlv bi4gICovCiAgI2luY2x1ZGUgInRyYW5zLXR5cGVzLmgiCiAgI2luY2x1ZGUg InRyYW5zLWNvbnN0LmgiCisgI2luY2x1ZGUgInRyYW5zLWFycmF5LmgiCiAg I2luY2x1ZGUgImR3YXJmMm91dC5oIgkvKiBGb3Igc3RydWN0IGFycmF5X2Rl c2NyX2luZm8uICAqLwogIAwKCioqKioqKioqKioqKioqKiBnZmNfZ2V0X2Fy cmF5X2Rlc2NyaXB0b3JfYmFzZSAoaW50IGRpbWVuCioqKiAxNzgyLDE3ODcg KioqKgotLS0gMTc4MywxNzk0IC0tLS0KICAJCQkJICAgIGdmY19hcnJheV9p bmRleF90eXBlLCAmY2hhaW4pOwogICAgVFJFRV9OT19XQVJOSU5HIChkZWNs KSA9IDE7CgorICAgLyogQWRkIHRoZSBzcGFuIGNvbXBvbmVudC4gICovCisg ICBkZWNsID0gZ2ZjX2FkZF9maWVsZF90b19zdHJ1Y3RfMSAoZmF0X3R5cGUs CisgCQkJCSAgICBnZXRfaWRlbnRpZmllciAoInNwYW4iKSwKKyAJCQkJICAg IGdmY19hcnJheV9pbmRleF90eXBlLCAmY2hhaW4pOworICAgVFJFRV9OT19X QVJOSU5HIChkZWNsKSA9IDE7CisKICAgIC8qIEJ1aWxkIHRoZSBhcnJheSB0 eXBlIGZvciB0aGUgc3RyaWRlIGFuZCBib3VuZCBjb21wb25lbnRzLiAgKi8K ICAgIGlmIChkaW1lbiArIGNvZGltZW4gPiAwKQogICAgICB7CioqKioqKioq KioqKioqKiBnZmNfZ2V0X2Rlcml2ZWRfdHlwZSAoZ2ZjX3N5bWJvbCAqIGRl cml2CioqKiAyNzA4LDI3MTMgKioqKgotLS0gMjcxNSwyNzI1IC0tLS0KICAg ICAgICBpZiAoIWMtPmJhY2tlbmRfZGVjbCkKICAJYy0+YmFja2VuZF9kZWNs ID0gZmllbGQ7CgorICAgICAgIGlmIChjLT5hdHRyLnBvaW50ZXIgJiYgYy0+ YXR0ci5kaW1lbnNpb24KKyAJICAmJiAhKGMtPnRzLnR5cGUgPT0gQlRfREVS SVZFRAorIAkgICAgICAgJiYgc3RyY21wIChjLT5uYW1lLCAiX2RhdGEiKSA9 PSAwKSkKKyAJR0ZDX0RFQ0xfUFRSX0FSUkFZX1AgKGMtPmJhY2tlbmRfZGVj bCkgPSAxOworCiAgICAgICAgLyogRG8gbm90IGFkZCBhIGNhZl90b2tlbiBm aWVsZCBmb3IgY2xhc3NlcycgZGF0YSBjb21wb25lbnRzLiAgKi8KICAgICAg ICBpZiAoY29kaW1lbiAmJiAhYy0+YXR0ci5kaW1lbnNpb24gJiYgIWMtPmF0 dHIuY29kaW1lbnNpb24KICAJICAmJiAoYy0+YXR0ci5hbGxvY2F0YWJsZSB8 fCBjLT5hdHRyLnBvaW50ZXIpCioqKioqKioqKioqKioqKiBnZmNfZ2V0X2Fy cmF5X2Rlc2NyX2luZm8gKGNvbnN0X3RyZWUgdHlwCioqKiAzMTQ2LDMxNTIg KioqKgogIHsKICAgIGludCByYW5rLCBkaW07CiAgICBib29sIGluZGlyZWN0 ID0gZmFsc2U7CiEgICB0cmVlIGV0eXBlLCBwdHlwZSwgZmllbGQsIHQsIGJh c2VfZGVjbDsKICAgIHRyZWUgZGF0YV9vZmYsIGRpbV9vZmYsIGR0eXBlX29m ZiwgZGltX3NpemUsIGVsZW1fc2l6ZTsKICAgIHRyZWUgbG93ZXJfc3Vib2Zm LCB1cHBlcl9zdWJvZmYsIHN0cmlkZV9zdWJvZmY7CgotLS0gMzE1OCwzMTY0 IC0tLS0KICB7CiAgICBpbnQgcmFuaywgZGltOwogICAgYm9vbCBpbmRpcmVj dCA9IGZhbHNlOwohICAgdHJlZSBldHlwZSwgcHR5cGUsIHQsIGJhc2VfZGVj bDsKICAgIHRyZWUgZGF0YV9vZmYsIGRpbV9vZmYsIGR0eXBlX29mZiwgZGlt X3NpemUsIGVsZW1fc2l6ZTsKICAgIHRyZWUgbG93ZXJfc3Vib2ZmLCB1cHBl cl9zdWJvZmYsIHN0cmlkZV9zdWJvZmY7CgoqKioqKioqKioqKioqKiogZ2Zj X2dldF9hcnJheV9kZXNjcl9pbmZvIChjb25zdF90cmVlIHR5cAoqKiogMzIw MywzMjI2ICoqKioKICAgIGlmIChpbmRpcmVjdCkKICAgICAgYmFzZV9kZWNs ID0gYnVpbGQxIChJTkRJUkVDVF9SRUYsIHB0eXBlLCBiYXNlX2RlY2wpOwoK ISAgIGlmIChHRkNfVFlQRV9BUlJBWV9TUEFOICh0eXBlKSkKISAgICAgZWxl bV9zaXplID0gR0ZDX1RZUEVfQVJSQVlfU1BBTiAodHlwZSk7CiEgICBlbHNl CiEgICAgIGVsZW1fc2l6ZSA9IGZvbGRfY29udmVydCAoZ2ZjX2FycmF5X2lu ZGV4X3R5cGUsIFRZUEVfU0laRV9VTklUIChldHlwZSkpOwohICAgZmllbGQg PSBUWVBFX0ZJRUxEUyAoVFlQRV9NQUlOX1ZBUklBTlQgKHR5cGUpKTsKISAg IGRhdGFfb2ZmID0gYnl0ZV9wb3NpdGlvbiAoZmllbGQpOwohICAgZmllbGQg PSBERUNMX0NIQUlOIChmaWVsZCk7CiEgICBmaWVsZCA9IERFQ0xfQ0hBSU4g KGZpZWxkKTsKISAgIGR0eXBlX29mZiA9IGJ5dGVfcG9zaXRpb24gKGZpZWxk KTsKISAgIGZpZWxkID0gREVDTF9DSEFJTiAoZmllbGQpOwohICAgZGltX29m ZiA9IGJ5dGVfcG9zaXRpb24gKGZpZWxkKTsKISAgIGRpbV9zaXplID0gVFlQ RV9TSVpFX1VOSVQgKFRSRUVfVFlQRSAoVFJFRV9UWVBFIChmaWVsZCkpKTsK ISAgIGZpZWxkID0gVFlQRV9GSUVMRFMgKFRSRUVfVFlQRSAoVFJFRV9UWVBF IChmaWVsZCkpKTsKISAgIHN0cmlkZV9zdWJvZmYgPSBieXRlX3Bvc2l0aW9u IChmaWVsZCk7CiEgICBmaWVsZCA9IERFQ0xfQ0hBSU4gKGZpZWxkKTsKISAg IGxvd2VyX3N1Ym9mZiA9IGJ5dGVfcG9zaXRpb24gKGZpZWxkKTsKISAgIGZp ZWxkID0gREVDTF9DSEFJTiAoZmllbGQpOwohICAgdXBwZXJfc3Vib2ZmID0g Ynl0ZV9wb3NpdGlvbiAoZmllbGQpOwoKICAgIHQgPSBiYXNlX2RlY2w7CiAg ICBpZiAoIWludGVnZXJfemVyb3AgKGRhdGFfb2ZmKSkKLS0tIDMyMTUsMzIy NSAtLS0tCiAgICBpZiAoaW5kaXJlY3QpCiAgICAgIGJhc2VfZGVjbCA9IGJ1 aWxkMSAoSU5ESVJFQ1RfUkVGLCBwdHlwZSwgYmFzZV9kZWNsKTsKCiEgICBl bGVtX3NpemUgPSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBl LCBUWVBFX1NJWkVfVU5JVCAoZXR5cGUpKTsKIQohICAgZ2ZjX2dldF9kZXNj cmlwdG9yX29mZnNldHNfZm9yX2luZm8gKHR5cGUsICZkYXRhX29mZiwgJmR0 eXBlX29mZiwgJmRpbV9vZmYsCiEgCQkJCSAgICAgICAmZGltX3NpemUsICZz dHJpZGVfc3Vib2ZmLAohIAkJCQkgICAgICAgJmxvd2VyX3N1Ym9mZiwgJnVw cGVyX3N1Ym9mZik7CgogICAgdCA9IGJhc2VfZGVjbDsKICAgIGlmICghaW50 ZWdlcl96ZXJvcCAoZGF0YV9vZmYpKQpJbmRleDogZ2NjL2ZvcnRyYW4vdHJh bnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvZm9ydHJhbi90 cmFucy5jCShyZXZpc2lvbiAyNDk4NjUpCi0tLSBnY2MvZm9ydHJhbi90cmFu cy5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiBnZmNfYnVpbGRf YWRkcl9leHByICh0cmVlIHR5cGUsIHRyZWUgdCkKKioqIDMwNSwzMTAgKioq KgotLS0gMzA1LDM3MSAtLS0tCiAgfQoKCisgc3RhdGljIHRyZWUKKyBnZXRf YXJyYXlfc3BhbiAodHJlZSB0eXBlLCB0cmVlIGRlY2wpCisgeworICAgdHJl ZSBzcGFuOworCisgICAvKiBSZXR1cm4gdGhlIHNwYW4gZm9yIGRlZmVycmVk IGNoYXJhY3RlciBsZW5ndGggYXJyYXkgcmVmZXJlbmNlcy4gICovCisgICBp ZiAodHlwZSAmJiBUUkVFX0NPREUgKHR5cGUpID09IEFSUkFZX1RZUEUKKyAg ICAgICAmJiBUWVBFX01BWFZBTCAoVFlQRV9ET01BSU4gKHR5cGUpKSAhPSBO VUxMX1RSRUUKKyAgICAgICAmJiAoVkFSX1AgKFRZUEVfTUFYVkFMIChUWVBF X0RPTUFJTiAodHlwZSkpKQorIAkgIHx8IFRSRUVfQ09ERSAoVFlQRV9NQVhW QUwgKFRZUEVfRE9NQUlOICh0eXBlKSkpID09IElORElSRUNUX1JFRikKKyAg ICAgICAmJiAoVFJFRV9DT0RFIChUWVBFX01BWFZBTCAoVFlQRV9ET01BSU4g KHR5cGUpKSkgPT0gSU5ESVJFQ1RfUkVGCisgCSAgfHwgVFJFRV9DT0RFIChk ZWNsKSA9PSBGVU5DVElPTl9ERUNMCisgCSAgfHwgREVDTF9DT05URVhUIChU WVBFX01BWFZBTCAoVFlQRV9ET01BSU4gKHR5cGUpKSkKKyAJCQkJCT09IERF Q0xfQ09OVEVYVCAoZGVjbCkpKQorICAgICB7CisgICAgICAgc3BhbiA9IFRZ UEVfTUFYVkFMIChUWVBFX0RPTUFJTiAodHlwZSkpOworICAgICAgIHNwYW4g PSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLCBzcGFuKTsK KyAgICAgfQorICAgLyogTGlrZXdpc2UgZm9yIGNsYXNzIGFycmF5IG9yIHBv aW50ZXIgYXJyYXkgcmVmZXJlbmNlcy4gICovCisgICBlbHNlIGlmIChUUkVF X0NPREUgKGRlY2wpID09IEZJRUxEX0RFQ0wKKyAJICAgfHwgVkFSX09SX0ZV TkNUSU9OX0RFQ0xfUCAoZGVjbCkKKyAJICAgfHwgVFJFRV9DT0RFIChkZWNs KSA9PSBQQVJNX0RFQ0wpCisgICAgIHsKKyAgICAgICBpZiAoR0ZDX0RFQ0xf Q0xBU1MgKGRlY2wpKQorIAl7CisgCSAgLyogV2hlbiBhIHRlbXBvcmFyeSBp cyBpbiBwbGFjZSBmb3IgdGhlIGNsYXNzIGFycmF5LCB0aGVuIHRoZQorIAkg ICAgIG9yaWdpbmFsIGNsYXNzJyBkZWNsYXJhdGlvbiBpcyBzdG9yZWQgaW4g dGhlIHNhdmVkCisgCSAgICAgZGVzY3JpcHRvci4gICovCisgCSAgaWYgKERF Q0xfTEFOR19TUEVDSUZJQyAoZGVjbCkgJiYgR0ZDX0RFQ0xfU0FWRURfREVT Q1JJUFRPUiAoZGVjbCkpCisgCSAgICBkZWNsID0gR0ZDX0RFQ0xfU0FWRURf REVTQ1JJUFRPUiAoZGVjbCk7CisgCSAgZWxzZQorIAkgICAgeworIAkgICAg ICAvKiBBbGxvdyBmb3IgZHVtbXkgYXJndW1lbnRzIGFuZCBvdGhlciBnb29k IHRoaW5ncy4gICovCisgCSAgICAgIGlmIChQT0lOVEVSX1RZUEVfUCAoVFJF RV9UWVBFIChkZWNsKSkpCisgCQlkZWNsID0gYnVpbGRfZm9sZF9pbmRpcmVj dF9yZWZfbG9jIChpbnB1dF9sb2NhdGlvbiwgZGVjbCk7CisKKyAJICAgICAg LyogQ2hlY2sgaWYgJ19kYXRhJyBpcyBhbiBhcnJheSBkZXNjcmlwdG9yLiAg SWYgaXQgaXMgbm90LAorIAkJIHRoZSBhcnJheSBtdXN0IGJlIG9uZSBvZiB0 aGUgY29tcG9uZW50cyBvZiB0aGUgY2xhc3MKKyAJCSBvYmplY3QsIHNvIHJl dHVybiBhIG51bGwgc3Bhbi4gICovCisgCSAgICAgIGlmICghR0ZDX0RFU0NS SVBUT1JfVFlQRV9QIChUUkVFX1RZUEUgKAorIAkJCQkJICBnZmNfY2xhc3Nf ZGF0YV9nZXQgKGRlY2wpKSkpCisgCQlyZXR1cm4gTlVMTF9UUkVFOworIAkg ICAgfQorIAkgIHNwYW4gPSBnZmNfY2xhc3NfdnRhYl9zaXplX2dldCAoZGVj bCk7CisgCX0KKyAgICAgICBlbHNlIGlmIChHRkNfREVDTF9QVFJfQVJSQVlf UCAoZGVjbCkpCisgCXsKKyAJICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBQ QVJNX0RFQ0wpCisgCSAgICBkZWNsID0gYnVpbGRfZm9sZF9pbmRpcmVjdF9y ZWZfbG9jIChpbnB1dF9sb2NhdGlvbiwgZGVjbCk7CisgCSAgc3BhbiA9IGdm Y19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9nZXQgKGRlY2wpOworIAl9CisgICAg ICAgZWxzZQorIAlzcGFuID0gTlVMTF9UUkVFOworICAgICB9CisgICBlbHNl CisgICAgIHNwYW4gPSBOVUxMX1RSRUU7CisKKyAgIHJldHVybiBzcGFuOwor IH0KKworCiAgLyogQnVpbGQgYW4gQVJSQVlfUkVGIHdpdGggaXRzIG5hdHVy YWwgdHlwZS4gICovCgogIHRyZWUKKioqKioqKioqKioqKioqIGdmY19idWls ZF9hcnJheV9yZWYgKHRyZWUgYmFzZSwgdHJlZSBvZmYKKioqIDMxMiwzMTgg KioqKgogIHsKICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAoYmFzZSk7CiAg ICB0cmVlIHRtcDsKISAgIHRyZWUgc3BhbjsKCiAgICBpZiAoR0ZDX0FSUkFZ X1RZUEVfUCAodHlwZSkgJiYgR0ZDX1RZUEVfQVJSQVlfUkFOSyAodHlwZSkg PT0gMCkKICAgICAgewotLS0gMzczLDM3OSAtLS0tCiAgewogICAgdHJlZSB0 eXBlID0gVFJFRV9UWVBFIChiYXNlKTsKICAgIHRyZWUgdG1wOwohICAgdHJl ZSBzcGFuID0gTlVMTF9UUkVFOwoKICAgIGlmIChHRkNfQVJSQVlfVFlQRV9Q ICh0eXBlKSAmJiBHRkNfVFlQRV9BUlJBWV9SQU5LICh0eXBlKSA9PSAwKQog ICAgICB7CioqKioqKioqKioqKioqKiBnZmNfYnVpbGRfYXJyYXlfcmVmICh0 cmVlIGJhc2UsIHRyZWUgb2ZmCioqKiAzMzEsNDA3ICoqKioKCiAgICB0eXBl ID0gVFJFRV9UWVBFICh0eXBlKTsKCi0gICAvKiBVc2UgcG9pbnRlciBhcml0 aG1ldGljIGZvciBkZWZlcnJlZCBjaGFyYWN0ZXIgbGVuZ3RoIGFycmF5Ci0g ICAgICByZWZlcmVuY2VzLiAgKi8KLSAgIGlmICh0eXBlICYmIFRSRUVfQ09E RSAodHlwZSkgPT0gQVJSQVlfVFlQRQotICAgICAgICYmIFRZUEVfTUFYVkFM IChUWVBFX0RPTUFJTiAodHlwZSkpICE9IE5VTExfVFJFRQotICAgICAgICYm IChWQVJfUCAoVFlQRV9NQVhWQUwgKFRZUEVfRE9NQUlOICh0eXBlKSkpCi0g CSAgfHwgVFJFRV9DT0RFIChUWVBFX01BWFZBTCAoVFlQRV9ET01BSU4gKHR5 cGUpKSkgPT0gSU5ESVJFQ1RfUkVGKQotICAgICAgICYmIGRlY2wKLSAgICAg ICAmJiAoVFJFRV9DT0RFIChUWVBFX01BWFZBTCAoVFlQRV9ET01BSU4gKHR5 cGUpKSkgPT0gSU5ESVJFQ1RfUkVGCi0gCSAgfHwgVFJFRV9DT0RFIChkZWNs KSA9PSBGVU5DVElPTl9ERUNMCi0gCSAgfHwgREVDTF9DT05URVhUIChUWVBF X01BWFZBTCAoVFlQRV9ET01BSU4gKHR5cGUpKSkKLSAJCQkJCT09IERFQ0xf Q09OVEVYVCAoZGVjbCkpKQotICAgICBzcGFuID0gVFlQRV9NQVhWQUwgKFRZ UEVfRE9NQUlOICh0eXBlKSk7Ci0gICBlbHNlCi0gICAgIHNwYW4gPSBOVUxM X1RSRUU7Ci0KICAgIGlmIChERUNMX1AgKGJhc2UpKQogICAgICBUUkVFX0FE RFJFU1NBQkxFIChiYXNlKSA9IDE7CgogICAgLyogU3RyaXAgTk9OX0xWQUxV RV9FWFBSIG5vZGVzLiAgKi8KICAgIFNUUklQX1RZUEVfTk9QUyAob2Zmc2V0 KTsKCiEgICAvKiBJZiB0aGUgYXJyYXkgcmVmZXJlbmNlIGlzIHRvIGEgcG9p bnRlciwgd2hvc2UgdGFyZ2V0IGNvbnRhaW5zIGEKISAgICAgIHN1YnJlZmVy ZW5jZSwgdXNlIHRoZSBzcGFuIHRoYXQgaXMgc3RvcmVkIHdpdGggdGhlIGJh Y2tlbmQgZGVjbAohICAgICAgYW5kIHJlZmVyZW5jZSB0aGUgZWxlbWVudCB3 aXRoIHBvaW50ZXIgYXJpdGhtZXRpYy4gICovCiEgICBpZiAoKGRlY2wgJiYg KFRSRUVfQ09ERSAoZGVjbCkgPT0gRklFTERfREVDTAohIAkJfHwgVkFSX09S X0ZVTkNUSU9OX0RFQ0xfUCAoZGVjbCkKISAJCXx8IFRSRUVfQ09ERSAoZGVj bCkgPT0gUEFSTV9ERUNMKQohICAgICAgICAmJiAoKEdGQ19ERUNMX1NVQlJF Rl9BUlJBWV9QIChkZWNsKQohIAkgICAgJiYgIWludGVnZXJfemVyb3AgKEdG Q19ERUNMX1NQQU4gKGRlY2wpKSkKISAJICAgfHwgR0ZDX0RFQ0xfQ0xBU1Mg KGRlY2wpCiEgCSAgIHx8IHNwYW4gIT0gTlVMTF9UUkVFKSkKISAgICAgICB8 fCB2cHRyICE9IE5VTExfVFJFRSkKICAgICAgewotICAgICAgIGlmIChkZWNs KQotIAl7Ci0gCSAgaWYgKEdGQ19ERUNMX0NMQVNTIChkZWNsKSkKLSAJICAg IHsKLSAJICAgICAgLyogV2hlbiBhIHRlbXBvcmFyeSBpcyBpbiBwbGFjZSBm b3IgdGhlIGNsYXNzIGFycmF5LCB0aGVuIHRoZQotIAkJIG9yaWdpbmFsIGNs YXNzJyBkZWNsYXJhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHNhdmVkCi0gCQkg ZGVzY3JpcHRvci4gICovCi0gCSAgICAgIGlmIChERUNMX0xBTkdfU1BFQ0lG SUMgKGRlY2wpICYmIEdGQ19ERUNMX1NBVkVEX0RFU0NSSVBUT1IgKGRlY2wp KQotIAkJZGVjbCA9IEdGQ19ERUNMX1NBVkVEX0RFU0NSSVBUT1IgKGRlY2wp OwotIAkgICAgICBlbHNlCi0gCQl7Ci0gCQkgIC8qIEFsbG93IGZvciBkdW1t eSBhcmd1bWVudHMgYW5kIG90aGVyIGdvb2QgdGhpbmdzLiAgKi8KLSAJCSAg aWYgKFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGRlY2wpKSkKLSAJCSAg ICBkZWNsID0gYnVpbGRfZm9sZF9pbmRpcmVjdF9yZWZfbG9jIChpbnB1dF9s b2NhdGlvbiwgZGVjbCk7Ci0KLSAJCSAgLyogQ2hlY2sgaWYgJ19kYXRhJyBp cyBhbiBhcnJheSBkZXNjcmlwdG9yLiAgSWYgaXQgaXMgbm90LAotIAkJICAg ICB0aGUgYXJyYXkgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbXBvbmVudHMgb2Yg dGhlIGNsYXNzCi0gCQkgICAgIG9iamVjdCwgc28gcmV0dXJuIGEgbm9ybWFs IGFycmF5IHJlZmVyZW5jZS4gICovCi0gCQkgIGlmICghR0ZDX0RFU0NSSVBU T1JfVFlQRV9QIChUUkVFX1RZUEUgKAotIAkJCQkJCWdmY19jbGFzc19kYXRh X2dldCAoZGVjbCkpKSkKLSAJCSAgICByZXR1cm4gYnVpbGQ0X2xvYyAoaW5w dXRfbG9jYXRpb24sIEFSUkFZX1JFRiwgdHlwZSwgYmFzZSwKLSAJCQkJICAg ICAgIG9mZnNldCwgTlVMTF9UUkVFLCBOVUxMX1RSRUUpOwotIAkJfQotCi0g CSAgICAgIHNwYW4gPSBnZmNfY2xhc3NfdnRhYl9zaXplX2dldCAoZGVjbCk7 Ci0gCSAgICB9Ci0gCSAgZWxzZSBpZiAoR0ZDX0RFQ0xfU1VCUkVGX0FSUkFZ X1AgKGRlY2wpKQotIAkgICAgc3BhbiA9IEdGQ19ERUNMX1NQQU4gKGRlY2wp OwotIAkgIGVsc2UgaWYgKHNwYW4pCi0gCSAgICBzcGFuID0gZm9sZF9jb252 ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgc3Bhbik7Ci0gCSAgZWxzZQot IAkgICAgZ2NjX3VucmVhY2hhYmxlICgpOwotIAl9Ci0gICAgICAgZWxzZSBp ZiAodnB0cikKLSAJc3BhbiA9IGdmY192cHRyX3NpemVfZ2V0ICh2cHRyKTsK LSAgICAgICBlbHNlCi0gCWdjY191bnJlYWNoYWJsZSAoKTsKLQogICAgICAg IG9mZnNldCA9IGZvbGRfYnVpbGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIE1V TFRfRVhQUiwKICAJCQkJZ2ZjX2FycmF5X2luZGV4X3R5cGUsCiAgCQkJCW9m ZnNldCwgc3Bhbik7Ci0tLSAzOTIsNDE0IC0tLS0KCiAgICB0eXBlID0gVFJF RV9UWVBFICh0eXBlKTsKCiAgICBpZiAoREVDTF9QIChiYXNlKSkKICAgICAg VFJFRV9BRERSRVNTQUJMRSAoYmFzZSkgPSAxOwoKICAgIC8qIFN0cmlwIE5P Tl9MVkFMVUVfRVhQUiBub2Rlcy4gICovCiAgICBTVFJJUF9UWVBFX05PUFMg KG9mZnNldCk7CgohICAgLyogSWYgZGVjbCBvciB2cHRyIGFyZSBub24tbnVs bCwgcG9pbnRlciBhcml0aG1ldGljIGZvciB0aGUgYXJyYXkgcmVmZXJlbmNl CiEgICAgICBpcyBsaWtlbHkuIEdlbmVyYXRlIHRoZSAnc3BhbicgZm9yIHRo ZSBhcnJheSByZWZlcmVuY2UuICAqLwohICAgaWYgKHZwdHIpCiEgICAgIHNw YW4gPSBnZmNfdnB0cl9zaXplX2dldCAodnB0cik7CiEgICBlbHNlIGlmIChk ZWNsKQohICAgICBzcGFuID0gZ2V0X2FycmF5X3NwYW4gKHR5cGUsIGRlY2wp OwohCiEgICAvKiBJZiBhIG5vbi1udWxsIHNwYW4gaGFzIGJlZW4gZ2VuZXJh dGVkIHJlZmVyZW5jZSB0aGUgZWxlbWVudCB3aXRoCiEgICAgICBwb2ludGVy IGFyaXRobWV0aWMuICAqLwohICAgaWYgKHNwYW4gIT0gTlVMTF9UUkVFKQog ICAgICB7CiAgICAgICAgb2Zmc2V0ID0gZm9sZF9idWlsZDJfbG9jIChpbnB1 dF9sb2NhdGlvbiwgTVVMVF9FWFBSLAogIAkJCQlnZmNfYXJyYXlfaW5kZXhf dHlwZSwKICAJCQkJb2Zmc2V0LCBzcGFuKTsKKioqKioqKioqKioqKioqIGdm Y19idWlsZF9hcnJheV9yZWYgKHRyZWUgYmFzZSwgdHJlZSBvZmYKKioqIDQx Miw0MTkgKioqKgogIAl0bXAgPSBidWlsZF9mb2xkX2luZGlyZWN0X3JlZl9s b2MgKGlucHV0X2xvY2F0aW9uLCB0bXApOwogICAgICAgIHJldHVybiB0bXA7 CiAgICAgIH0KICAgIGVsc2UKLSAgICAgLyogT3RoZXJ3aXNlIHVzZSBhIHN0 cmFpZ2h0Zm9yd2FyZCBhcnJheSByZWZlcmVuY2UuICAqLwogICAgICByZXR1 cm4gYnVpbGQ0X2xvYyAoaW5wdXRfbG9jYXRpb24sIEFSUkFZX1JFRiwgdHlw ZSwgYmFzZSwgb2Zmc2V0LAogIAkJICAgICAgIE5VTExfVFJFRSwgTlVMTF9U UkVFKTsKICB9Ci0tLSA0MTksNDI2IC0tLS0KICAJdG1wID0gYnVpbGRfZm9s ZF9pbmRpcmVjdF9yZWZfbG9jIChpbnB1dF9sb2NhdGlvbiwgdG1wKTsKICAg ICAgICByZXR1cm4gdG1wOwogICAgICB9CisgICAvKiBPdGhlcndpc2UgdXNl IGEgc3RyYWlnaHRmb3J3YXJkIGFycmF5IHJlZmVyZW5jZS4gICovCiAgICBl bHNlCiAgICAgIHJldHVybiBidWlsZDRfbG9jIChpbnB1dF9sb2NhdGlvbiwg QVJSQVlfUkVGLCB0eXBlLCBiYXNlLCBvZmZzZXQsCiAgCQkgICAgICAgTlVM TF9UUkVFLCBOVUxMX1RSRUUpOwogIH0KSW5kZXg6IGdjYy9mb3J0cmFuL3Ry YW5zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL2ZvcnRyYW4v dHJhbnMuaAkocmV2aXNpb24gMjQ5ODY1KQotLS0gZ2NjL2ZvcnRyYW4vdHJh bnMuaAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogc3RydWN0IEdU WSgoKSkgbGFuZ19kZWNsIHsKKioqIDk4Miw5ODggKioqKgogICNkZWZpbmUg R0ZDX0RFQ0xfQ09NTU9OX09SX0VRVUlWKG5vZGUpIERFQ0xfTEFOR19GTEFH XzMobm9kZSkKICAjZGVmaW5lIEdGQ19ERUNMX0NSQVlfUE9JTlRFRShub2Rl KSBERUNMX0xBTkdfRkxBR180KG5vZGUpCiAgI2RlZmluZSBHRkNfREVDTF9S RVNVTFQobm9kZSkgREVDTF9MQU5HX0ZMQUdfNShub2RlKQohICNkZWZpbmUg R0ZDX0RFQ0xfU1VCUkVGX0FSUkFZX1Aobm9kZSkgREVDTF9MQU5HX0ZMQUdf Nihub2RlKQogICNkZWZpbmUgR0ZDX0RFQ0xfQVNTT0NJQVRFX1ZBUl9QKG5v ZGUpIERFQ0xfTEFOR19GTEFHXzcobm9kZSkKICAjZGVmaW5lIEdGQ19ERUNM X0NMQVNTKG5vZGUpIERFQ0xfTEFOR19GTEFHXzgobm9kZSkKCi0tLSA5ODIs OTg4IC0tLS0KICAjZGVmaW5lIEdGQ19ERUNMX0NPTU1PTl9PUl9FUVVJVihu b2RlKSBERUNMX0xBTkdfRkxBR18zKG5vZGUpCiAgI2RlZmluZSBHRkNfREVD TF9DUkFZX1BPSU5URUUobm9kZSkgREVDTF9MQU5HX0ZMQUdfNChub2RlKQog ICNkZWZpbmUgR0ZDX0RFQ0xfUkVTVUxUKG5vZGUpIERFQ0xfTEFOR19GTEFH XzUobm9kZSkKISAjZGVmaW5lIEdGQ19ERUNMX1BUUl9BUlJBWV9QKG5vZGUp IERFQ0xfTEFOR19GTEFHXzYobm9kZSkKICAjZGVmaW5lIEdGQ19ERUNMX0FT U09DSUFURV9WQVJfUChub2RlKSBERUNMX0xBTkdfRkxBR183KG5vZGUpCiAg I2RlZmluZSBHRkNfREVDTF9DTEFTUyhub2RlKSBERUNMX0xBTkdfRkxBR184 KG5vZGUpCgpJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9hc3N1 bWVkX3R5cGVfMi5mOTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9hc3N1bWVkX3R5cGVfMi5mOTAJKHJl dmlzaW9uIDI0OTg2NSkKLS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcv YXNzdW1lZF90eXBlXzIuZjkwCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioq KioqKiBlbmQKKioqIDE1MSwxNTkgKioqKgogICEgeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC4mc2NhbGFyX3QxLCIg MSAib3JpZ2luYWwiIH0gfQoKICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcC10aW1lcyAic3ViX3NjYWxhciAuJlxcKC5cXChyZWFsLmtpbmQ9NC4u MDouIC4gcmVzdHJpY3RcXCkgYXJyYXlfcmVhbF9hbGxvYy5kYXRhIiAxICJv cmlnaW5hbCIgfSB9CiEgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgInN1Yl9zY2FsYXIgLiZcXCguXFwoY2hhcmFjdGVyLmtpbmQ9MS4u MDouLjE6MS4gLlxcKSBhcnJheV9jaGFyX3B0ci5kYXRhIiAxICJvcmlnaW5h bCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg InN1Yl9zY2FsYXIgLiZcXCguXFwoc3RydWN0IHQyLjA6LiAuIHJlc3RyaWN0 XFwpIGFycmF5X3QyX2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KISAh IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxh ciAuJlxcKC5cXChzdHJ1Y3QgdDMuMDouIC5cXCkgYXJyYXlfdDNfcHRyLmRh dGEiIDEgIm9yaWdpbmFsIiB9IH0KICAhIHsgZGctZmluYWwgeyBzY2FuLXRy ZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAuXFwoc3RydWN0IHQxIC5cXCkg YXJyYXlfY2xhc3NfdDFfYWxsb2MuX2RhdGEuZGF0YSIgMSAib3JpZ2luYWwi IH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJz dWJfc2NhbGFyIC5cXChzdHJ1Y3QgdDEgLlxcKSBcXChhcnJheV9jbGFzc190 MV9wdHIuX2RhdGEuZGF0IiAxICJvcmlnaW5hbCIgfSB9CgotLS0gMTUxLDE1 OSAtLS0tCiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg InN1Yl9zY2FsYXIgLiZzY2FsYXJfdDEsIiAxICJvcmlnaW5hbCIgfSB9Cgog ICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2Nh bGFyIC4mXFwoLlxcKHJlYWwua2luZD00Li4wOi4gLiByZXN0cmljdFxcKSBh cnJheV9yZWFsX2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KISAhIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAu XFwoY2hhcmFjdGVyLmtpbmQ9MS4uMToxLiAuXFwpIC5hcnJheV9jaGFyX3B0 ci5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLiZcXCguXFwoc3RydWN0 IHQyLjA6LiAuIHJlc3RyaWN0XFwpIGFycmF5X3QyX2FsbG9jLmRhdGEiIDEg Im9yaWdpbmFsIiB9IH0KISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyAic3ViX3NjYWxhciAuXFwoc3RydWN0IHQzIC5cXCkgLmFycmF5 X3QzX3B0ci5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiAgISB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLlxcKHN0cnVj dCB0MSAuXFwpIGFycmF5X2NsYXNzX3QxX2FsbG9jLl9kYXRhLmRhdGEiIDEg Im9yaWdpbmFsIiB9IH0KICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyAic3ViX3NjYWxhciAuXFwoc3RydWN0IHQxIC5cXCkgXFwoYXJy YXlfY2xhc3NfdDFfcHRyLl9kYXRhLmRhdCIgMSAib3JpZ2luYWwiIH0gfQoK SW5kZXg6IGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvZ29hY2Mva2VybmVs cy1hbGlhcy00LmY5NQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL2dvYWNjL2tlcm5lbHMtYWxpYXMtNC5m OTUJKHJldmlzaW9uIDI0OTg2NSkKLS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRy YW4uZGcvZ29hY2Mva2VybmVscy1hbGlhcy00LmY5NQkod29ya2luZyBjb3B5 KQoqKioqKioqKioqKioqKiogcHJvZ3JhbSBtYWluCioqKiAxNiwyMCAqKioq CiAgZW5kIHByb2dyYW0gbWFpbgoKICAhIE9ubHkgdGhlIG9tcF9kYXRhX2kg cmVsYXRlZCBsb2FkcyBzaG91bGQgYmUgYW5ub3RhdGVkIHdpdGggY2xpcXVl cy4KISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiY2xp cXVlIDEgYmFzZSAxIiAzICJlYWxpYXMiIH0gfQohICEgeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICIoP24pY2xpcXVlIDEgYmFzZSAwIiA0 ICJlYWxpYXMiIH0gfQotLS0gMTYsMjAgLS0tLQogIGVuZCBwcm9ncmFtIG1h aW4KCiAgISBPbmx5IHRoZSBvbXBfZGF0YV9pIHJlbGF0ZWQgbG9hZHMgc2hv dWxkIGJlIGFubm90YXRlZCB3aXRoIGNsaXF1ZXMuCiEgISB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgImNsaXF1ZSAxIGJhc2UgMSIgNCAi ZWFsaWFzIiB9IH0KISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10 aW1lcyAiKD9uKWNsaXF1ZSAxIGJhc2UgMCIgNSAiZWFsaWFzIiB9IH0KSW5k ZXg6IGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvbm9fYXJnX2NoZWNrXzIu ZjkwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUv Z2ZvcnRyYW4uZGcvbm9fYXJnX2NoZWNrXzIuZjkwCShyZXZpc2lvbiAyNDk4 NjUpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL25vX2FyZ19jaGVj a18yLmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogZW5kCioq KiAxMzMsMTQxICoqKioKICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyAic3ViX3NjYWxhciAuJnNjYWxhcl90MSwiIDEgIm9yaWdpbmFs IiB9IH0KCiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg InN1Yl9zY2FsYXIgLiZcXCguXFwocmVhbC5raW5kPTQuLjA6LiAuIHJlc3Ry aWN0XFwpIGFycmF5X3JlYWxfYWxsb2MuZGF0YSIgMSAib3JpZ2luYWwiIH0g fQohICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJf c2NhbGFyIC4mXFwoLlxcKGNoYXJhY3Rlci5raW5kPTEuLjA6Li4xOjEuIC5c XCkgYXJyYXlfY2hhcl9wdHIuZGF0YSIgMSAib3JpZ2luYWwiIH0gfQogICEg eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFy IC4mXFwoLlxcKHN0cnVjdCB0Mi4wOi4gLiByZXN0cmljdFxcKSBhcnJheV90 Ml9hbGxvYy5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiEgISB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLiZcXCguXFwo c3RydWN0IHQzLjA6LiAuXFwpIGFycmF5X3QzX3B0ci5kYXRhIiAxICJvcmln aW5hbCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgInN1Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MSAuXFwpIGFycmF5X2NsYXNz X3QxX2FsbG9jLl9kYXRhLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KICAhIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAu XFwoc3RydWN0IHQxIC5cXCkgXFwoYXJyYXlfY2xhc3NfdDFfcHRyLl9kYXRh LmRhdCIgMSAib3JpZ2luYWwiIH0gfQoKLS0tIDEzMywxNDEgLS0tLQogICEg eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFy IC4mc2NhbGFyX3QxLCIgMSAib3JpZ2luYWwiIH0gfQoKICAhIHsgZGctZmlu YWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAuJlxcKC5c XChyZWFsLmtpbmQ9NC4uMDouIC4gcmVzdHJpY3RcXCkgYXJyYXlfcmVhbF9h bGxvYy5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiEgISB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLlxcKGNoYXJhY3Rl ci5raW5kPTEuLjE6MS4gLlxcKSAuYXJyYXlfY2hhcl9wdHIuZGF0YSIgMSAi b3JpZ2luYWwiIH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w LXRpbWVzICJzdWJfc2NhbGFyIC4mXFwoLlxcKHN0cnVjdCB0Mi4wOi4gLiBy ZXN0cmljdFxcKSBhcnJheV90Ml9hbGxvYy5kYXRhIiAxICJvcmlnaW5hbCIg fSB9CiEgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1 Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MyAuXFwpIC5hcnJheV90M19wdHIuZGF0 YSIgMSAib3JpZ2luYWwiIH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC5cXChzdHJ1Y3QgdDEgLlxcKSBh cnJheV9jbGFzc190MV9hbGxvYy5fZGF0YS5kYXRhIiAxICJvcmlnaW5hbCIg fSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1 Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MSAuXFwpIFxcKGFycmF5X2NsYXNzX3Qx X3B0ci5fZGF0YS5kYXQiIDEgIm9yaWdpbmFsIiB9IH0KCkluZGV4OiBnY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfMS5mOTAKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJh bi5kZy9wb2ludGVyX2FycmF5XzEuZjkwCShub25leGlzdGVudCkKLS0tIGdj Yy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV8xLmY5MAko d29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0g MSw2MCAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEgQ2hlY2sgdGhl IGZpeCBmb3IgUFIzNDY0MCBjb21tZW50cyAxIGFuZCAzLgorICEKKyAhIFRo aXMgaW52b2x2ZXMgcGFzc2luZyBhbmQgcmV0dXJuaW5nIHBvaW50ZXIgYXJy YXkgY29tcG9uZW50cyB0aGF0CisgISBwb2ludCB0byBjb21wb25lbnRzIG9m IGFycmF5cyBvZiBkZXJpdmVkIHR5cGVzLgorICEKKyBNT0RVTEUgdGVzdAor ICAgSU1QTElDSVQgTk9ORQorICAgVFlQRSA6OiBteV90eXBlCisgICAgIElO VEVHRVIgOjogdmFsdWUKKyAgICAgaW50ZWdlciA6OiB0YWcKKyAgIEVORCBU WVBFCisgQ09OVEFJTlMKKyAgIFNVQlJPVVRJTkUgZ2V0X3ZhbHVlcyh2YWx1 ZXMsIHN3aXRjaCkKKyAgICAgSU5URUdFUiwgUE9JTlRFUiA6OiB2YWx1ZXMo OikKKyAgICAgaW50ZWdlciA6OiBzd2l0Y2gKKyAgICAgVFlQRShteV90eXBl KSwgUE9JTlRFUiA6OiBkKDopCisgICAgIGFsbG9jYXRlIChkLCBzb3VyY2Ug PSBbbXlfdHlwZSgxLDEwMSksIG15X3R5cGUoMiwxMDIpXSkKKyAgICAgaWYg KHN3aXRjaCAuZXEuIDEpIHRoZW4KKyAgICAgICB2YWx1ZXMgPT4gZCg6KSV2 YWx1ZQorICAgICAgIGlmIChhbnkgKHZhbHVlcyAubmUuIFsxLDJdKSkgcHJp bnQgKiwgdmFsdWVzKDIpCisgICAgIGVsc2UKKyAgICAgICB2YWx1ZXMgPT4g ZCg6KSV0YWcKKyAgICAgICBpZiAoYW55ICh2YWx1ZXMgLm5lLiBbMTAxLDEw Ml0pKSBjYWxsIGFib3J0CisgICAgIGVuZCBpZgorICAgRU5EIFNVQlJPVVRJ TkUKKworICAgZnVuY3Rpb24gcmV0dXJuX3ZhbHVlcyhzd2l0Y2gpIHJlc3Vs dCAodmFsdWVzKQorICAgICBJTlRFR0VSLCBQT0lOVEVSIDo6IHZhbHVlcyg6 KQorICAgICBpbnRlZ2VyIDo6IHN3aXRjaAorICAgICBUWVBFKG15X3R5cGUp LCBQT0lOVEVSIDo6IGQoOikKKyAgICAgYWxsb2NhdGUgKGQsIHNvdXJjZSA9 IFtteV90eXBlKDEsMTAxKSwgbXlfdHlwZSgyLDEwMildKQorICAgICBpZiAo c3dpdGNoIC5lcS4gMSkgdGhlbgorICAgICAgIHZhbHVlcyA9PiBkKDopJXZh bHVlCisgICAgICAgaWYgKGFueSAodmFsdWVzIC5uZS4gWzEsMl0pKSBjYWxs IGFib3J0CisgICAgIGVsc2UKKyAgICAgICB2YWx1ZXMgPT4gZCg6KSV0YWcK KyAgICAgICBpZiAoYW55ICh2YWx1ZXMoWzIsMV0pIC5uZS4gWzEwMiwxMDFd KSkgY2FsbCBhYm9ydAorICAgICBlbmQgaWYKKyAgIEVORCBmdW5jdGlvbgor IEVORCBNT0RVTEUKKworICAgdXNlIHRlc3QKKyAgIGludGVnZXIsIHBvaW50 ZXIgOjogeCg6KQorICAgdHlwZSA6OiB5b3VyX3R5cGUKKyAgICAgaW50ZWdl ciwgcG9pbnRlciA6OiB4KDopCisgICBlbmQgdHlwZQorICAgdHlwZSh5b3Vy X3R5cGUpIDo6IHkKKworICAgY2FsbCBnZXRfdmFsdWVzICh4LCAxKQorICAg aWYgKGFueSAoeCAubmUuIFsxLDJdKSkgY2FsbCBhYm9ydAorICAgY2FsbCBn ZXRfdmFsdWVzICh5JXgsIDIpCisgICBpZiAoYW55ICh5JXggLm5lLiBbMTAx LDEwMl0pKSBjYWxsIGFib3J0CisKKyAgIHggPT4gcmV0dXJuX3ZhbHVlcyAo MikKKyAgIGlmIChhbnkgKHggLm5lLiBbMTAxLDEwMl0pKSBjYWxsIGFib3J0 CisgICB5JXggPT4gcmV0dXJuX3ZhbHVlcyAoMSkKKyAgIGlmIChhbnkgKHkl eCAubmUuIFsxLDJdKSkgY2FsbCBhYm9ydAorIGVuZApJbmRleDogZ2NjL3Rl c3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzIuZjkwCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4u ZGcvcG9pbnRlcl9hcnJheV8yLmY5MAkobm9uZXhpc3RlbnQpCi0tLSBnY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfMi5mOTAJKHdv cmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEs MTQzIC0tLS0KKyAhIHsgZGctZG8gY29tcGlsZSB9CisgIQorICEgVGVzdCB0 aGUgZml4IGZvciBQUjQwNzM3IGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgZml4 IGZvciBQUjM0NjQwLgorICEKKyAhIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhv dWdoICA8ZGg0NThAb2FrYXBwbGUubmV0PgorICEKKyBtb2R1bGUgdGVzdG1v ZAorCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IHN0YW5kYXJkX2ludGVnZXIg PSAxCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGludCA9IEtJTkQoIHN0YW5k YXJkX2ludGVnZXIpCisKKyBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogaTggID0g c2VsZWN0ZWRfaW50X2tpbmQoMTIpCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6 IGk0ICA9IHNlbGVjdGVkX2ludF9raW5kKDgpCisgaW50ZWdlciwgcGFyYW1l dGVyIDo6IGkyICA9IHNlbGVjdGVkX2ludF9raW5kKDQpCisKKyBpbnRlZ2Vy LCBwYXJhbWV0ZXIgOjogc3RhbmRhcmRfcmVhbCA9IDEuCisgaW50ZWdlciwg cGFyYW1ldGVyIDo6IHN0ZF9yZWFsID0gS0lORCggc3RhbmRhcmRfcmVhbCkK KworIGludGVnZXIsIHBhcmFtZXRlciA6OiByOCAgPSBzZWxlY3RlZF9yZWFs X2tpbmQoMTIpCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IHI0ICA9IHNlbGVj dGVkX3JlYWxfa2luZCg2KQorIGludGVnZXIsIHBhcmFtZXRlciA6OiBkb3Vi bGUgID0gc2VsZWN0ZWRfcmVhbF9raW5kKDIwKQorCisgaW50ZWdlciwgcGFy YW1ldGVyIDo6IG5hbWVfc3RyaW5nX2xlbmd0aCA9IDQwCisgaW50ZWdlciwg cGFyYW1ldGVyIDo6IGZpbGVfbmFtZV9sZW5ndGggPSA2MAorIGludGVnZXIs IHBhcmFtZXRlciA6OiB0ZXh0X3N0cmluZ19sZW5ndGggPSA4MAorIGludGVn ZXIsIHBhcmFtZXRlciA6OiBtYXhfa3dkX2xndGggPSBmaWxlX25hbWVfbGVu Z3RoCisKKyBpbnRlZ2VyKGludCkgOjogYnl0ZXNfcGVyX2ludCAgPSA0Cisg aW50ZWdlcihpbnQpIDo6IGJ5dGVzX3Blcl9yZWFsID0gOAorIGludGVnZXIo aW50KSA6OiB3b3JrY29tbSwgc3BpbmNvbW0KKworICAgIGludGVnZXIoaW50 KSwgcGFyYW1ldGVyIDo6IG5iX2RpcmVjdGlvbnMgPSAzLCAgJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbl94ID0gMSwgICAg JgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbl95 ID0gMiwgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRp cmVjdGlvbl96ID0gMywgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG5iX2dob3N0X2NlbGxzID0gNSAgICAgISBtaWdodCBiZSBkaWZm ZXJlbnQgZm9yIHRoZSBsYWdyYW5nZSBzdGVwPworCisgICAgaW50ZWdlcihp bnQpLCBwYXJhbWV0ZXIgOjogZW5kcyA9IDQsICAgICAgICAgICAgJgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyX2dob3N0ID0gMSwg ICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9p bnRlcmlvciA9IDIsICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdXBwZXJfaW50ZXJpb3IgPSAzLCAgJgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVwcGVyX2dob3N0ID0gNAorCisgICAgISBOZWlnaGJv cnMKKyAgICBpbnRlZ2VyKGludCksIHBhcmFtZXRlciA6OiBzaWRlID0gMiwg ICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2Vy X2VuZCA9IDEsICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dXBwZXJfZW5kID0gMgorCisKKyAgICBpbnRlZ2VyKGludCksIHBhcmFtZXRl ciA6OiBuYl92YXJpYWJsZXMgPSA1LCAgICAmCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcm9fdmFyID0gMSwgICAgICAgICAgJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV0c192YXIgPSAyLCAgICAgICAg ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3ZhciA9IDMs ICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dXAxX3ZhciA9IDQsICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVwMl92YXIgPSA1LCAgICAgICAgICYKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBlaXNfdmFyID0gNiwgICAgICAgICAmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNzX3ZhciA9IDcsICAg ICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFy ID0gOCwgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjX3ZhciA9IDksICAgICAgICAgICAmCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbmJfdmFyX3NvcnRpZSA9IDkKKworICAgIHR5cGUg OjogVkFSSUFCTEVTX0xJR05FCisgICAgICAgc2VxdWVuY2UKKyAgICAgICBy ZWFsLCBwb2ludGVyLCBkaW1lbnNpb24oIDosIDopIDo6IGwKKyAgICBlbmQg dHlwZSBWQVJJQUJMRVNfTElHTkUKKworICAgIHR5cGUgVkFSSUFCTEVTX01B SUxMRQorICAgICAgIHNlcXVlbmNlCisgICAgICAgcmVhbChyOCksIGRpbWVu c2lvbiggbmJfdmFyaWFibGVzKSA6OiBjZWxsX3ZhcgorICAgIGVuZCB0eXBl IFZBUklBQkxFU19NQUlMTEUKKworICAgIGludGVnZXIoaW50KSwgZGltZW5z aW9uKCBuYl9kaXJlY3Rpb25zKSA6OiAmCisgICAgICAgICAgZmlyc3RfcmVh bF9jZWxsLCAgICAmICAhIHdpdGhvdXQgZ2hvc3QgY2VsbHMKKyAgICAgICAg ICBsYXN0X3JlYWxfY2VsbCwgICAgICYgICEKKyAgICAgICAgICBuYl9yZWFs X2NlbGxzLCAgICAgICYgICEKKyAgICAgICAgICBmaXJzdF93b3JrX2NlbGws ICAgICYgICEgaW5jbHVkaW5nIGdob3N0IGNlbGxzCisgICAgICAgICAgbGFz dF93b3JrX2NlbGwsICAgICAmICAhCisgICAgICAgICAgbmJfd29ya19jZWxs cywgICAgICAmICAhCisgICAgICAgICAgZ2xvYmFsX25iX2NlbGxzICAgICAg ICAhIG51bWJlciBvZiByZWFsIGNlbGxzLCBmb3IgdGhlIGVudGlyZSBncmlk CisKKyAgICBpbnRlZ2VyKGludCkgOjogZGltX3Byb2JsZW1lICAhIGRpbWVu c2lvbiBkdSBwcm9ibGVtZSAoMSwgMiBvdSAzKQorCisgICAgaW50ZWdlcihp bnQpIDo6IGxhcmdlc3RfbG9jYWxfc2l6ZSAgICEgdGhlIGxhcmdlc3Qgb2Yg dGhlIDMgZGltZW5zaW9ucyBvZiB0aGUgbG9jYWwgZ3JpZAorCisgICAgISBI eWRybyB2YXJpYWJsZXMgb2YgdGhlIGFjdHVhbCBkb21haW4KKyAgICAhIFRo ZXJlIGFyZSAzIGNvcGllcyBvZiB0aGVzZSwgZm9yIHVzZSBhY2NvcmRpbmcg dG8gY3VycmVudCB3b3JrIGRpcmVjdGlvbgorICAgIHR5cGUgKFZBUklBQkxF U19NQUlMTEUpLCBhbGxvY2F0YWJsZSwgdGFyZ2V0LCBkaW1lbnNpb24oIDos IDosIDopIDo6ICAmCisgICAgICAgICAgICAgSHlkcm9fdmFyc19YWVosICAm CisgICAgICAgICAgICAgSHlkcm9fdmFyc19ZWlgsICAmCisgICAgICAgICAg ICAgSHlkcm9fdmFyc19aWFkKKworICAgICEgUG9pbnRlcnMgdG8gY3VycmVu dCBhbmQgbmV4dCBIeWRybyB2YXIgYXJyYXlzCisgICAgdHlwZSAoVkFSSUFC TEVTX01BSUxMRSksIHBvaW50ZXIsIGRpbWVuc2lvbiggOiwgOiwgOikgOjog SHlkcm9fdmFycywgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHlkcm9fdmFy c19uZXh0CisKKyAgICAhIFdoaWNoIG9mIHRoZXNlIDMgY29waWVzIG9mIHRo ZSAzRCBhcnJheXMgaGFzIGJlZW4gdXBkYXRlZCBsYXN0CisgICAgaW50ZWdl cihpbnQpIDo6IGxhc3RfdXBkYXRlZF8zRF9hcnJheSA9IDAKKworICAgIHJl YWwocjgpLCBwb2ludGVyLCBkaW1lbnNpb24oIDopIDo6ICAgICAgICAmCisg ICAgICAgICAgISBWYXJpYWJsZXMgInBlcm1hbmVudGVzIiAoZW50cmFudCBk YW5zIGxhIHByb2plY3Rpb24pCisgICAgICAgICAgUm8sICAgICAgJiAhIGRl bnNpdGUKKyAgICAgICAgICBFdHMsICAgICAmICEgZW5lcmdpZSB0b3RhbGUg c3BlY2lmaXF1ZQorICAgICAgICAgIFVtLCAgICAgICYgISB2aXRlc3NlIGF1 eCBtYWlsbGVzLCBkYW5zIGxhIGRpcmVjdGlvbiBkZSB0cmF2YWlsCisgICAg ICAgICAgWG4sICAgICAgJiAhIGFic2Npc3NlIGVuIGZpbiBkZSBwYXMgZGUg dGVtcHMKKyAgICAgICAgICAhIFZhcmlhYmxlcyBlbiBsZWN0dXJlIHNldWxl bWVudAorICAgICAgICAgIFVtX3AxLCAgICYgISB2aXRlc3NlIGF1eCBtYWls bGVzLCBkYW5zIGxlcyBkaXJlY3Rpb25zCisgICAgICAgICAgVW1fcDIsICAg JiAhICAgICAgICAgICAgICAgICAgICAgIG9ydGhvZ29uYWxlcworICAgICAg ICAgIFhhLCAgICAgICYgISBhYnNjaXNzZXMgZGVzIG5vZXVkcyBlbiBkZWJ1 dCBkZSBwYXMgZGUgdGVtcHMKKyAgICAgICAgICBEeGEsICAgICAmICEgbG9u Z3VldXIgZGVzIG1haWxsZXMgZW4gZGVidXQgZGUgcGFzIGRlIHRlbXBzCisg ICAgICAgICAgVV9keGEgICAgICAhIGludmVyc2VzIGRlcyBsb25ndWV1cnMg ZGVzIG1haWxsZXMKKworIGVuZCBtb2R1bGUgdGVzdG1vZAorCisKKyBzdWJy b3V0aW5lIFRGX0FEX1NQTElUVElOR19EUklWRVJfUExBTkUKKworIHVzZSB0 ZXN0bW9kCisKKyBpbXBsaWNpdCBub25lCisgc2F2ZQorCisgICAgcmVhbChy OCksIGFsbG9jYXRhYmxlLCBkaW1lbnNpb24oIDopIDo6ICAmCisgICAgICAg ICAgISBWYXJpYWJsZXMgbWFpbGxlIHJlY2FsY3VsZWVzIGEgY2hhcXVlIHBh cyBkZSB0ZW1wcworICAgICAgICAgIEVpcywgICAgICYgISBlbmVyZ2llIGlu dGVybmUgc3BlY2lmaXF1ZSAoc2V1bGVtZW50IHBvdXIgY2FsY3VsZXIgbGEg cHJlc3Npb24pCisgICAgICAgICAgVml0X3NvbiwgJiAhIGNvbW1lIHNvbiBu b20gbCdpbmRpcXVlCisgICAgICAgICAgQ19mX2wsICAgJiAhIG5vbWJyZSBk ZSBDb3VyYW50CisgICAgICAgICAgUG0sICAgICAgJiAhIHByZXNzaW9uIGF1 eCBtYWlsbGVzCisgICAgICAgICAgISBWYXJpYWJsZXMgYXV4IG5vZXVkcwor ICAgICAgICAgIFVuLCAgICAgICYgISB2aXRlc3NlIGRlcyBub2V1ZHMKKyAg ICAgICAgICBQbiAgICAgICAgICEgcHJlc3Npb24gYXV4IG5vZXVkcworCisK KyBpbnRlZ2VyKGludCkgOjogaSwgaiwgaworIGludGVnZXIoaW50KSA6OiBm aXJzdF9jZWxsLCBsYXN0X2NlbGwKKworICAgICAgICAgIFJvID0+IEh5ZHJv X3ZhcnMoIGZpcnN0X2NlbGw6bGFzdF9jZWxsLCBqLCBrKSVjZWxsX3Zhcigg cm9fdmFyKQorICAgICAgICAgIEV0cyA9PiBIeWRyb192YXJzKCBmaXJzdF9j ZWxsOmxhc3RfY2VsbCwgaiwgayklY2VsbF92YXIoIGV0c192YXIpCisgICAg ICAgICAgVW0gPT4gSHlkcm9fdmFycyggZmlyc3RfY2VsbDpsYXN0X2NlbGws IGosIGspJWNlbGxfdmFyKCB1X3ZhcikKKyAgICAgICAgICBVbV9wMSA9PiBI eWRyb192YXJzKCBmaXJzdF9jZWxsOmxhc3RfY2VsbCwgaiwgayklY2VsbF92 YXIoIHVwMV92YXIpCisgICAgICAgICAgVW1fcDIgPT4gSHlkcm9fdmFycygg Zmlyc3RfY2VsbDpsYXN0X2NlbGwsIGosIGspJWNlbGxfdmFyKCB1cDJfdmFy KQorCisgZW5kIHN1YnJvdXRpbmUgVEZfQURfU1BMSVRUSU5HX0RSSVZFUl9Q TEFORQorCkluZGV4OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50 ZXJfYXJyYXlfMy5mOTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzMuZjkwCShu b25leGlzdGVudCkKLS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9p bnRlcl9hcnJheV8zLmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioq KioKKioqIDAgKioqKgotLS0gMSw1MSAtLS0tCisgISB7IGRnLWRvIHJ1biB9 CisgIQorICEgVGVzdCB0aGUgZml4IGZvciBQUjQwNzM3IGNvbW1lbnQgMTcg YXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBmaXggZm9yIFBSMzQ2NDAuCisgIQor ICEgQ29udHJpYnV0ZWQgYnkgSm9zaCBIeWtlcyAgPGpvc2h1YWh5a2VzQHlh aG9vLmNvbT4KKyAhCisgICAgbW9kdWxlIHRlc3RfbW9kCisgIQorICAgIHR5 cGUgdDEKKyAgICAgICBjaGFyYWN0ZXIoOCkgIDo6IHN0cmluZworICAgIGVu ZCB0eXBlIHQxCisgIQorICAgIHR5cGUgdDIKKyAgICAgIGludGVnZXIgOjog dGFiCisgICAgICB0eXBlKHQxKSwgcG9pbnRlciA6OiBmcCg6KQorICAgIGVu ZCB0eXBlIHQyCisgIQorICAgIHR5cGUgdDMKKyAgICAgICBpbnRlZ2VyIDo6 IHRhYgorICAgICAgIHR5cGUodDIpLCBwb2ludGVyIDo6IGFzCisgICAgZW5k IHR5cGUgdDMKKyAhCisgICAgdHlwZSh0MyksIHBvaW50ZXIgOjogYXNfdHlw KDopID0+IG51bGwoKQorICEKKyAgICBjaGFyYWN0ZXIoOCksICBwb2ludGVy LCBwdWJsaWMgOjogcCg6KQorICEKKyAgICBjb250YWlucworICEKKyAgICBz dWJyb3V0aW5lIGFzX3NldF9hbGlhcyAoaSkKKyAhCisgICAgaW1wbGljaXQg bm9uZQorICEKKyAgICBpbnRlZ2VyLCBpbnRlbnQoaW4pICAgIDo6IGkKKyAh CisgICAgICBhbGxvY2F0ZSAoYXNfdHlwKDIpKQorICAgICAgYWxsb2NhdGUg KGFzX3R5cCgxKSVhcykKKyAgICAgIGFsbG9jYXRlIChhc190eXAoMSklYXMl ZnAoMiksIHNvdXJjZSA9IFt0MSgiYWJjZGVmZ2giKSx0MSgiaWprbG1ub3Ai KV0pCisgICAgICBwID0+IGFzX3R5cChpKSVhcyVmcCg6KSVzdHJpbmcKKyAh CisgICAgZW5kIHN1YnJvdXRpbmUgYXNfc2V0X2FsaWFzCisgIQorICAgIGVu ZCBtb2R1bGUgdGVzdF9tb2QKKworICAgIHByb2dyYW0gdGVzdF9wcm9nCisg ICAgdXNlIHRlc3RfbW9kCisgICAgY2FsbCBhc19zZXRfYWxpYXMoMSkKKyAg ICBpZiAoYW55IChwIC5uZS4gWyJhYmNkZWZnaCIsImlqa2xtbm9wIl0pKSBj YWxsIGFib3J0CisgICAgZGVhbGxvY2F0ZSAoYXNfdHlwKDEpJWFzJWZwKQor ICAgIGRlYWxsb2NhdGUgKGFzX3R5cCgxKSVhcykKKyAgICBkZWFsbG9jYXRl IChhc190eXApCisgICAgZW5kIHByb2dyYW0gdGVzdF9wcm9nCkluZGV4OiBn Y2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfNC5mOTAK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9y dHJhbi5kZy9wb2ludGVyX2FycmF5XzQuZjkwCShub25leGlzdGVudCkKLS0t IGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV80LmY5 MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgot LS0gMSw3NSAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEgVGVzdCB0 aGUgZml4IGZvciBQUjU3MTE2IGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgZml4 IGZvciBQUjM0NjQwLgorICEKKyAhIENvbnRyaWJ1dGVkIGJ5IFJlaW5ob2xk IEJhZGVyICA8QmFkZXJAbHJ6LmRlPgorICEKKyBtb2R1bGUgbW9kX3J0dGlf cHRyCisgICBpbXBsaWNpdCBub25lCisgICB0eXBlIDo6IGZvbworICAgICAg cmVhbCA6OiB2CisgICAgICBpbnRlZ2VyIDo6IGkKKyAgIGVuZCB0eXBlIGZv bworIGNvbnRhaW5zCisgICBzdWJyb3V0aW5lIGV4dHJhY3QodGhpcywgdiwg aWMpCisgICAgIGNsYXNzKCopLCB0YXJnZXQgOjogdGhpcyg6KQorICAgICBy ZWFsLCBwb2ludGVyIDo6IHYoOikKKyAgICAgaW50ZWdlciA6OiBpYworICAg ICBzZWxlY3QgdHlwZSAodGhpcykKKyAgICAgdHlwZSBpcyAocmVhbCkKKyAg ICAgICAgdiA9PiB0aGlzKGljOikKKyAgICAgY2xhc3MgaXMgKGZvbykKKyAg ICAgICAgdiA9PiB0aGlzKGljOikldgorICAgICBlbmQgc2VsZWN0CisgICBl bmQgc3Vicm91dGluZSBleHRyYWN0CisgZW5kIG1vZHVsZQorCisgcHJvZ3Jh bSBwcm9nX3J0dGlfcHRyCisgICB1c2UgbW9kX3J0dGlfcHRyCisgICBjbGFz cygqKSwgYWxsb2NhdGFibGUsIHRhcmdldCA6OiBvKDopCisgICByZWFsLCBw b2ludGVyIDo6IHYoOikKKworICAgYWxsb2NhdGUobygzKSwgc291cmNlPVsx LjAsIDIuMCwgMy4wXSkKKyAgIGNhbGwgZXh0cmFjdChvLCB2LCAyKQorICAg aWYgKHNpemUodikgPT0gMiAuYW5kLiBhbGwgKHYgPT0gWzIuMCwgMy4wXSkp IHRoZW4KKyAgICAgIGRlYWxsb2NhdGUobykKKyAgIGVsc2UKKyAgICAgIGNh bGwgYWJvcnQKKyAgIGVuZCBpZgorCisgICBhbGxvY2F0ZShvKDMpLCBzb3Vy Y2U9W2ZvbygxLjAsIDEpLCBmb28oNC4wLCA0KSwgZm9vKDUuMCwgNSldKQor ICAgY2FsbCBleHRyYWN0KG8sIHYsIDIpCisgICBpZiAoc2l6ZSh2KSA9PSAy IC5hbmQuIGFsbCAodiA9PSBbNC4wLCA1LjBdKSkgdGhlbgorICAgICAgZGVh bGxvY2F0ZShvKQorICAgZWxzZQorICAgICAgY2FsbCBhYm9ydAorICAgZW5k IGlmCisKKyAhIFRoZSByZXN0IHRlc3RzIHRoZSBjYXNlIGluIGNvbW1lbnQg MiA8amFudXNAZ2NjLmdudS5vcmc+CisKKyAgIGNhbGwgZXh0cmFjdDEgKHYs IDEpCisgICBpZiAoYW55ICh2IC89IFsxLjAsIDIuMF0pKSBjYWxsIGFib3J0 CisgICBjYWxsIGV4dHJhY3QxICh2LCAyKSAgISBDYWxsIHRvIGRlYWxsb2Nh dGUgcG9pbnRlci4KKworIGNvbnRhaW5zCisgICBzdWJyb3V0aW5lIGV4dHJh Y3QxKHYsIGZsYWcpCisgICAgIHR5cGUgOjogZm9vCisgICAgICAgIHJlYWwg OjogdgorICAgICAgICBjaGFyYWN0ZXIoNCkgOjogc3RyCisgICAgIGVuZCB0 eXBlCisgICAgIGNsYXNzKGZvbyksIHBvaW50ZXIsIHNhdmUgOjogdGhpcyg6 KQorICAgICByZWFsLCBwb2ludGVyIDo6IHYoOikKKyAgICAgaW50ZWdlciA6 OiBmbGFnCisKKyAgICAgaWYgKGZsYWcgPT0gMSkgdGhlbgorICAgICAgIGFs bG9jYXRlICh0aGlzKDIpLCBzb3VyY2UgPSBbZm9vICgxLjAsICJvbmUgIiks IGZvbyAoMi4wLCAidHdvICIpXSkKKyAgICAgICBzZWxlY3QgdHlwZSAodGhp cykKKyAgICAgICAgIGNsYXNzIGlzIChmb28pCisgICAgICAgICAgIHYgPT4g dGhpcygxOjIpJXYKKyAgICAgICBlbmQgc2VsZWN0CisgICAgIGVsc2UKKyAg ICAgICBkZWFsbG9jYXRlICh0aGlzKQorICAgICBlbmQgaWYKKyAgIGVuZCBz dWJyb3V0aW5lCisKKyBlbmQgcHJvZ3JhbSBwcm9nX3J0dGlfcHRyCkluZGV4 OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfNS5m OTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9n Zm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzUuZjkwCShub25leGlzdGVudCkK LS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV81 LmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioq KgotLS0gMSw2NSAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEgVGVz dCB0aGUgZml4IGZvciBQUjU1NzYzIGNvbW1lbnQgOSBhcyBwYXJ0IG9mIHRo ZSBvdmVyYWxsIGZpeCBmb3IgUFIzNDY0MC4KKyAhCisgISBDb250cmlidXRl ZCBieSBUb2JpYXMgQnVybnVzICA8YnVybnVzQGdjYy5nbnUub3JnPgorICEK KyAgIHByb2dyYW0gY2hhbmdlX2ZpZWxkX3R5cGUKKyAgICAgdXNlLCBpbnRy aW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICBpbXBsaWNpdCBub25lCisg ICAgIFJFQUwoa2luZD1jX2Zsb2F0KSwgUE9JTlRFUiA6OiB2ZWN0b3JfY29t cCg6KQorICAgICBUWVBFLCBCSU5EKEMpIDo6IHNjYWxhcl92ZWN0b3IKKyAg ICAgICAgUkVBTChraW5kPWNfZmxvYXQpIDo6IHNjYWxhcgorICAgICAgICBS RUFMKGtpbmQ9Y19mbG9hdCkgOjogdmVjKDMpCisgICAgIEVORCBUWVBFCisg ICAgIFRZUEUsIEJJTkQoQykgOjogc2NhbGFyX3ZlY3Rvcl9tYXRyaXgKKyAg ICAgICAgUkVBTChraW5kPWNfZmxvYXQpIDo6IHNjYWxhcgorICAgICAgICBS RUFMKGtpbmQ9Y19mbG9hdCkgOjogdmVjKDMpCisgICAgICAgIFJFQUwoa2lu ZD1jX2Zsb2F0KSA6OiBtYXQoMywzKQorICAgICBFTkQgVFlQRQorICAgICBD TEFTUygqKSwgQUxMT0NBVEFCTEUsIFRBUkdFVCA6OiBvbmVfZF9maWVsZCg6 KQorICAgICByZWFsLCBwb2ludGVyIDo6IHYxKDopCisKKyAgICAgYWxsb2Nh dGUob25lX2RfZmllbGQoMyksICYKKyAgICAgICAgICAgICAgc291cmNlID0g KC8gc2NhbGFyX3ZlY3RvciggMS4wLCAoLyAtMS4wLCAwLjAsIDEuMCAvKSAp LCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhcl92ZWN0b3Io IDEuMSwgKC8gLTEuMiwgMC4yLCAwLjkgLykgKSwgJgorICAgICAgICAgICAg ICAgICAgICAgICAgICBzY2FsYXJfdmVjdG9yKCAxLjIsICgvIC0xLjQsIDAu NCwgMC44IC8pICkgIC8pICkKKworICAgICBjYWxsIGV4dHJhY3RfdmVjKG9u ZV9kX2ZpZWxkLCAxLCAyKQorICAgICBpZiAoYW55IChhYnMgKHZlY3Rvcl9j b21wIC0gWzAuMCwwLjIsMC40XSkgLmd0LiAxZS00KSkgY2FsbCBhYm9ydAor ICAgICBkZWFsbG9jYXRlKG9uZV9kX2ZpZWxkKSAgICEgdjEgYmVjb21lcyB1 bmRlZmluZWQKKworICAgICBhbGxvY2F0ZShvbmVfZF9maWVsZCgxKSwgJgor ICAgICAgICAgIHNvdXJjZSA9ICgvIHNjYWxhcl92ZWN0b3JfbWF0cml4KCAx LjAsICgvIC0xLjAsIDAuMCwgMS4wIC8pLCAmCisgICAgICAgICAgcmVzaGFw ZSggKC8gMS4wLCAwLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wLCAwLjAs IDEuMCAvKSwgJgorICAgICAgICAgICAgICAgICAgKC8zLCAzLykgKSApIC8p ICkKKworICAgICBjYWxsIGV4dHJhY3RfdmVjKG9uZV9kX2ZpZWxkLCAyLCAx KQorICAgICBpZiAoYWJzICh2ZWN0b3JfY29tcCgxKSArIDEuMCkgPiAxZS00 KSBjYWxsIGFib3J0CisgICAgIGNhbGwgZXh0cmFjdF92ZWMob25lX2RfZmll bGQsIDIsIDMpCisgICAgIGlmIChhYnMgKHZlY3Rvcl9jb21wKDEpIC0gMS4w KSA+IDFlLTQpIGNhbGwgYWJvcnQKKyAgICAgZGVhbGxvY2F0ZShvbmVfZF9m aWVsZCkgICAhIHYxIGJlY29tZXMgdW5kZWZpbmVkCisgICBjb250YWlucwor ICAgICBzdWJyb3V0aW5lIGV4dHJhY3RfdmVjKGZpZWxkLCB0YWcsIGljKQor ICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAg ICAgICAgQ0xBU1MoKiksIFRBUkdFVCA6OiBmaWVsZCg6KQorICAgICAgICAg SU5URUdFUihraW5kPWNfaW50KSwgdmFsdWUgOjogdGFnLCBpYworCisgICAg ICAgICB0eXBlKHNjYWxhcl92ZWN0b3IpLCBwb2ludGVyIDo6IHN2KDopCisg ICAgICAgICB0eXBlKHNjYWxhcl92ZWN0b3JfbWF0cml4KSwgcG9pbnRlciA6 OiBzdm0oOikKKworICAgICAgICAgc2VsZWN0IHR5cGUgKGZpZWxkKQorICAg ICAgICAgdHlwZSBpcyAocmVhbChjX2Zsb2F0KSkKKyAgICAgICAgICAgdmVj dG9yX2NvbXAgPT4gZmllbGQKKyAgICAgICAgIGNsYXNzIGRlZmF1bHQKKyAg ICAgICAgICAgc2VsZWN0IGNhc2UgKHRhZykKKyAgICAgICAgICAgY2FzZSAo MSkKKyAgICAgICAgICAgICAgc3YgPT4gZmllbGQKKyAgICAgICAgICAgICAg dmVjdG9yX2NvbXAgPT4gc3YoOikldmVjKGljKQorICAgICAgICAgICBjYXNl ICgyKQorICAgICAgICAgICAgICBzdm0gPT4gZmllbGQKKyAgICAgICAgICAg ICAgdmVjdG9yX2NvbXAgPT4gc3ZtKDopJXZlYyhpYykKKyAgICAgICAgICAg ZW5kIHNlbGVjdAorICAgICAgICAgZW5kIHNlbGVjdAorICAgICBlbmQgc3Vi cm91dGluZQorICAgZW5kIHByb2dyYW0KSW5kZXg6IGdjYy90ZXN0c3VpdGUv Z2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV82LmY5MAo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09CioqKiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50 ZXJfYXJyYXlfNi5mOTAJKG5vbmV4aXN0ZW50KQotLS0gZ2NjL3Rlc3RzdWl0 ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzYuZjkwCSh3b3JraW5nIGNv cHkpCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDI4IC0tLS0K KyAhIHsgZGctZG8gcnVuIH0KKyAhCisgISBUZXN0IHRoZSBmaXggZm9yIFBS NTcwMTkgY29tbWVudCA0IGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgZml4IGZv ciBQUjM0NjQwLgorICEKKyAhIENvbnRyaWJ1dGVkIGJ5ICA8dGhhbWJzdXBA Z21haWwuY29tPgorICEKKyAgIHR5cGUgY1BhcnRpY2xlCisgICAgIHJlYWwo NCkgOjogdigzKQorICAgZW5kdHlwZSBjUGFydGljbGUKKworICAgdHlwZSBw Q0l0ZW0KKyAgICAgdHlwZShjUGFydGljbGUpIDo6IEVsZQorICAgZW5kIHR5 cGUgcENJdGVtCisKKyAgIHR5cGUocENJdGVtKSwgdGFyZ2V0LCBkaW1lbnNp b24oMToxLDE6MSkgOjogcENlbGxBcnJheQorICAgdHlwZShjUGFydGljbGUp LCBwb2ludGVyLCBkaW1lbnNpb24oOiw6KSA6OiBwQXJyYXkKKyAgIHJlYWwo NCksIHBvaW50ZXIsIGRpbWVuc2lvbig6KSA6OiB2X3BvaW50ZXIKKyAgIHJl YWwoNCksIGRpbWVuc2lvbigzKSA6OiB2X3JlYWwgPSA5OS4KKworICAgcEFy cmF5ID0+IHBDZWxsQXJyYXklRWxlCisgICB2X3BvaW50ZXIgPT4gcEFycmF5 KDEsMSkldjsKKyAgIHZfcG9pbnRlciA9IHZfcmVhbCAhT0sgJSUlJSUlJSUl JSUlCisgICBpZiAoYW55IChpbnQgKHBBcnJheSgxLDEpJXYpIC5uZS4gOTkp KSBjYWxsIGFib3J0CisKKyAgIHZfcmVhbCA9IDg4CisgICBwQXJyYXkoMSwx KSV2ID0gdl9yZWFsICFTRUdGQVVMVCAlJSUlJSUlJSUlJSUlJSUlJSUlJSUl JSUKKyAgIGlmIChhbnkgKGludCAodl9wb2ludGVyKSAubmUuIDg4KSkgY2Fs bCBhYm9ydAorIGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5k Zy9wb2ludGVyX2FycmF5XzcuZjkwCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KioqIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV83 LmY5MAkobm9uZXhpc3RlbnQpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFu LmRnL3BvaW50ZXJfYXJyYXlfNy5mOTAJKHdvcmtpbmcgY29weSkKKioqKioq KioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNDYgLS0tLQorICEgeyBkZy1k byBydW4gfQorICEKKyAhIFRlc3QgZm9yIHRoZSBmaXggZm9yIFBSMzQ2NDAu IEluIHRoaXMgY2FzZSwgZmluYWwgdGVzdGluZyBvZiB0aGUKKyAhIHBhdGNo IHJldmVhbGVkIHRoYXQgaW4gc29tZSBjYXNlcyB0aGUgYWN0dWFsIGRlc2Ny aXB0b3Igd2FzIG5vdAorICEgYmVpbmcgcGFzc2VkIHRvIHByb2NlZHVyZSBk dW1teSBwb2ludGVycy4KKyAhCisgISBDb250cmlidXRlZCBieSBUaG9tYXMg S29lbmlnICA8dGtvZW5pZ0BuZXRjb2xvZ25lLmRlPgorICEKKyBtb2R1bGUg eAorICAgdXNlIGlzb19jX2JpbmRpbmcKKyAgIGltcGxpY2l0IG5vbmUKKyAg IHR5cGUgZm9vCisgICAgICBjb21wbGV4IDo6IGMKKyAgICAgIGludGVnZXIg OjogaQorICAgZW5kIHR5cGUgZm9vCisgY29udGFpbnMKKyAgIHN1YnJvdXRp bmUgcHJpbnRpdChjLCBhKQorICAgICBjb21wbGV4LCBwb2ludGVyLCBkaW1l bnNpb24oOikgOjogYworICAgICBpbnRlZ2VyIDo6IGkKKyAgICAgaW50ZWdl cihraW5kPTgpIDo6IGEKKyAgICAgYSA9IHRyYW5zZmVyKGNfbG9jKGMoMikp LGEpCisgICBlbmQgc3Vicm91dGluZSBwcmludGl0CisgZW5kIG1vZHVsZSB4 CisKKyBwcm9ncmFtIG1haW4KKyAgIHVzZSB4CisgICB1c2UgaXNvX2NfYmlu ZGluZworICAgaW1wbGljaXQgbm9uZQorICAgdHlwZShmb28pLCBkaW1lbnNp b24oNSksIHRhcmdldCA6OiBhCisgICBpbnRlZ2VyIDo6IGkKKyAgIGNvbXBs ZXgsIGRpbWVuc2lvbig6KSwgcG9pbnRlciA6OiBwYworICAgaW50ZWdlcihr aW5kPTgpIDo6IHMxLCBzMiwgczMKKyAgIGElaSA9IDAKKyAgIGRvIGk9MSw1 CisgICAgICBhKGkpJWMgPSBjbXBseChpKioyLGkpCisgICBlbmQgZG8KKyAg IHBjID0+IGElYworICAgY2FsbCBwcmludGl0KHBjLCBzMykKKworICAgczEg PSB0cmFuc2ZlcihjX2xvYyhhKDIpJWMpLHMxKQorICAgaWYgKHMxIC89IHMz KSBjYWxsIGFib3J0CisKKyAgIHMyID0gdHJhbnNmZXIoY19sb2MocGMoMikp LHMyKQorICAgaWYgKHMyIC89IHMzKSBjYWxsIGFib3J0CisKKyBlbmQgcHJv Z3JhbSBtYWluCkluZGV4OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3Bv aW50ZXJfYXJyYXlfOC5mOTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiog Z2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzguZjkw CShub25leGlzdGVudCkKLS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcv cG9pbnRlcl9hcnJheV84LmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioq KioqKioKKioqIDAgKioqKgotLS0gMSw4MCAtLS0tCisgISB7IGRnLWRvIHJ1 biB9CisgIQorICEgTWFrZSBzdXJlIHRoYXQgdGhlIGZpeCBmb3IgcHIzNDY0 MCB3b3JrcyB3aXRoIGNsYXNzIHBvaW50ZXJzLgorICEKKyAgIHR5cGUgOjog bXl0eXBlCisgICAgIHJlYWwgOjogcgorICAgICBpbnRlZ2VyIDo6IGkKKyAg IGVuZCB0eXBlCisKKyAgIHR5cGUgOjogdGh5dHlwZQorICAgICByZWFsIDo6 IHIKKyAgICAgaW50ZWdlciA6OiBpCisgICAgIHR5cGUobXl0eXBlKSA6OiBk ZXIKKyAgIGVuZCB0eXBlCisKKyAgIHR5cGUodGh5dHlwZSksIGRpbWVuc2lv bigwOjIpLCB0YXJnZXQgOjogdGd0CisgICBjbGFzcygqKSwgZGltZW5zaW9u KDopLCBwb2ludGVyIDo6IGNwdHIKKyAgIGNsYXNzKG15dHlwZSksIGRpbWVu c2lvbig6KSwgcG9pbnRlciA6OiBjcHRyMQorICAgaW50ZWdlciA6OiBpCisg ICBpbnRlZ2VyKDgpIDo6IHMxLCBzMgorCisgICB0Z3QgPSBbKHRoeXR5cGUo aW50KGkpLCBpLCBteXR5cGUoaW50KDIqaSksIDIqaSkpLCBpPSAxLDMpXQor CisgICBjcHRyID0+IHRndCVpCisKKyAgIHMxID0gbG9jKGNwdHIpCisgICBj YWxsIGZvbyAoY3B0ciwgczIpICAgICAgICAgICAgICAgICAgICAgICAgICAh IENoZWNrIGJvdW5kcyBub3QgY2hhbmdlZC4uLgorICAgaWYgKHMxIC5uZS4g czIpIENhbGwgYWJvcnQgICAgICAgICAgICAgICAgICAgISAuLi5hbmQgdGhh dCB0aGUgZGVzY3JpcHRvciBpcyBwYXNzZWQuCisKKyAgIHNlbGVjdCB0eXBl IChjcHRyKQorICAgICB0eXBlIGlzIChpbnRlZ2VyKQorICAgICAgIGlmIChh bnkgKGNwdHIgLm5lLiBbMSwyLDNdKSkgY2FsbCBhYm9ydCAgISBDaGVjayB0 aGUgdGhlIHNjYWxhcml6ZXIgd29ya3MuCisgICAgICAgaWYgKGNwdHIoMSkg Lm5lLiAyKSBjYWxsIGFib3J0ICAgICAgICAgICAhIENoZWNrIG9yZGluYXJ5 IGFycmF5IGluZGV4aW5nLgorICAgZW5kIHNlbGVjdAorCisgICBjcHRyKDE6 MykgPT4gdGd0JWRlciVyICAgICAgICAgICAgICAgICAgICAgICAhIFNvbWV0 aGluZyBhIHRhZCBtb3JlIGNvbXBsaWNhdGVkIQorCisgICBzZWxlY3QgdHlw ZSAoY3B0cikKKyAgICAgdHlwZSBpcyAocmVhbCkKKyAgICAgICBpZiAoYW55 IChpbnQoY3B0cikgLm5lLiBbMiw0LDZdKSkgY2FsbCBhYm9ydAorICAgICAg IGlmIChhbnkgKGludChjcHRyKFsyLDMsMV0pKSAubmUuIFs0LDYsMl0pKSBj YWxsIGFib3J0CisgICAgICAgaWYgKGludChjcHRyKDMpKSAubmUuIDYpIGNh bGwgYWJvcnQKKyAgIGVuZCBzZWxlY3QKKworICAgY3B0cjEoMTozKSA9PiB0 Z3QlZGVyCisKKyAgIHMxID0gbG9jKGNwdHIxKQorICAgY2FsbCBiYXIoY3B0 cjEsIHMyKQorICAgaWYgKHMxIC5uZS4gczIpIENhbGwgYWJvcnQgICAgICAg ICAgICAgICAgICAgISBDaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzIHBh c3NlZC4KKworICAgc2VsZWN0IHR5cGUgKGNwdHIxKQorICAgICB0eXBlIGlz IChteXR5cGUpCisgICAgICAgaWYgKGFueSAoY3B0cjElaSAubmUuIFsyLDQs Nl0pKSBjYWxsIGFib3J0CisgICAgICAgaWYgKGNwdHIxKDIpJWkgLm5lLiA0 KSBjYWxsIGFib3J0CisgICBlbmQgc2VsZWN0CisKKyBjb250YWlucworCisg ICBzdWJyb3V0aW5lIGZvbyAoYXJnLCBhZGRyKQorICAgICBjbGFzcygqKSwg ZGltZW5zaW9uKDopLCBwb2ludGVyIDo6IGFyZworICAgICBpbnRlZ2VyKDgp IDo6IGFkZHIKKyAgICAgYWRkciA9IGxvYyhhcmcpCisgICAgIHNlbGVjdCB0 eXBlIChhcmcpCisgICAgICAgdHlwZSBpcyAoaW50ZWdlcikKKyAgICAgICAg IGlmIChhbnkgKGFyZyAubmUuIFsxLDIsM10pKSBjYWxsIGFib3J0ICAhIENo ZWNrIHRoZSB0aGUgc2NhbGFyaXplciB3b3Jrcy4KKyAgICAgICAgIGlmIChh cmcoMSkgLm5lLiAyKSBjYWxsIGFib3J0ICAgICAgICAgICAhIENoZWNrIG9y ZGluYXJ5IGFycmF5IGluZGV4aW5nLgorICAgICBlbmQgc2VsZWN0CisgICBl bmQgc3Vicm91dGluZQorCisgICBzdWJyb3V0aW5lIGJhciAoYXJnLCBhZGRy KQorICAgICBjbGFzcyhteXR5cGUpLCBkaW1lbnNpb24oOiksIHBvaW50ZXIg OjogYXJnCisgICAgIGludGVnZXIoOCkgOjogYWRkcgorICAgICBhZGRyID0g bG9jKGFyZykKKyAgICAgc2VsZWN0IHR5cGUgKGFyZykKKyAgICAgICB0eXBl IGlzIChteXR5cGUpCisgICAgICAgICBpZiAoYW55IChhcmclaSAubmUuIFsy LDQsNl0pKSBjYWxsIGFib3J0CisgICAgICAgICBpZiAoYXJnKDIpJWkgLm5l LiA0KSBjYWxsIGFib3J0CisgICAgIGVuZCBzZWxlY3QKKyAgIGVuZCBzdWJy b3V0aW5lCisgZW5kCkluZGV4OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRn L3BvaW50ZXJfYXJyYXlfY29tcG9uZW50XzEuZjkwCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRl cl9hcnJheV9jb21wb25lbnRfMS5mOTAJKG5vbmV4aXN0ZW50KQotLS0gZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5X2NvbXBvbmVu dF8xLmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAg KioqKgotLS0gMSw0NyAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEg Q2hlY2sgdGhlIGZpeCBmb3IgUFIzNDY0MCBjb21tZW50IDI4LgorICEKKyAh IFRoaXMgaW52b2x2ZXMgcG9pbnRlciBhcnJheSBjb21wb25lbnRzIHRoYXQg cG9pbnQgdG8gY29tcG9uZW50cyBvZiBhcnJheXMKKyAhIG9mIGRlcml2ZWQg dHlwZXMuCisgIQorICAgdHlwZSB2YXJfdGFibGVzCisgICAgICByZWFsLCBw b2ludGVyIDo6IHJ2YXIoOikKKyAgIGVuZCB0eXBlCisKKyAgIHR5cGUgcmVh bF92YXJzCisgICAgICByZWFsIHIKKyAgICAgIHJlYWwgOjogaW5kZXgKKyAg IGVuZCB0eXBlCisKKyAgIHR5cGUodmFyX3RhYmxlcykgOjogIHZ0YWJfcgor ICAgdHlwZShyZWFsX3ZhcnMpLCAgdGFyZ2V0IDo6IHgoMikKKyAgIHJlYWws IHBvaW50ZXIgOjogeig6KQorICAgcmVhbCA6OiB5KDIpCisKKyAgIHggPSBb cmVhbF92YXJzICgxMS4wLCAxLjApLCByZWFsX3ZhcnMgKDQyLjAsIDIuMCld CisgICB2dGFiX3IlcnZhciA9PiB4JXIKKyAgIGlmIChhbnkgKGFicyAodnRh Yl9yJXJ2YXIgLSBbMTEuMCwgNDIuMF0pID4gMS4wZS01KSkgY2FsbCBhYm9y dCAgISBDaGVjayBza2lwcGluZyAnaW5kZXg7IGlzIE9LLgorCisgICB5ID0g dnRhYl9yJXJ2YXIKKyAgIGlmIChhbnkgKGFicyAoeSAtIFsxMS4wLCA0Mi4w XSkgPiAxLjBlLTUpKSBjYWxsIGFib3J0ICAhIENoZWNrIHRoYXQgdGhlIGNv bXBvbmVudCBpcyB1c2FibGUgaW4gYXNzaWdubWVudC4KKworICAgY2FsbCBm b29iYXIgKHZ0YWJfciwgWzExLjAsIDQyLjBdKQorCisgICB2dGFiX3IgPSBi YXJmb28gKCkKKworICAgY2FsbCBmb29iYXIgKHZ0YWJfciwgWzExMS4wLCAx NDIuMF0pCisKKyBjb250YWlucworICAgc3Vicm91dGluZSBmb29iYXIgKHZ0 YWIsIGFycmF5KQorICAgICB0eXBlKHZhcl90YWJsZXMpIDo6ICB2dGFiCisg ICAgIHJlYWwgOjogYXJyYXkgKDopCisgICAgIGlmIChhbnkgKGFicyAodnRh YiVydmFyIC0gYXJyYXkpID4gMS4wZS01KSkgY2FsbCBhYm9ydCAgISBDaGVj ayBwYXNzaW5nIGFzIGEgZHVtbXkuCisgICAgIGlmIChhYnMgKHZ0YWIlcnZh cigyKSAtIGFycmF5KDIpKSA+IDEuMGUtNSkgY2FsbCBhYm9ydCAgISBDaGVj ayBjb21wb25lbnQgcmVmZXJlbmNlLgorICAgZW5kIHN1YnJvdXRpbmUKKwor ICAgZnVuY3Rpb24gYmFyZm9vICgpIHJlc3VsdChyZXMpCisgICAgIHR5cGUo dmFyX3RhYmxlcykgOjogIHJlcworICAgICBhbGxvY2F0ZSAocmVzJXJ2YXIo MiksIHNvdXJjZSA9IFsxMTEuMCwgMTQyLjBdKSAgISBDaGVjayBhbGxvY2F0 aW9uCisgICBlbmQgZnVuY3Rpb24KKyBlbmQKSW5kZXg6IGdjYy90ZXN0c3Vp dGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV9jb21wb25lbnRfMi5mOTAK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9y dHJhbi5kZy9wb2ludGVyX2FycmF5X2NvbXBvbmVudF8yLmY5MAkobm9uZXhp c3RlbnQpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJf YXJyYXlfY29tcG9uZW50XzIuZjkwCSh3b3JraW5nIGNvcHkpCioqKioqKioq KioqKioqKgoqKiogMCAqKioqCi0tLSAxLDQzIC0tLS0KKyAhIHsgZGctZG8g cnVuIH0KKyAhCisgISBUZXN0IHRoZSBmaXggZm9yIFBSMzQ2NDAuIEluIHRo ZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBmaXgsIHRoZSBmaXJzdAorICEgdGVz dGNhc2UgaW4gUFI1MTIxOCBmYWlsZWQgd2l0aCBhIHNlZ2ZhdWx0LiBUaGlz IHRlc3QgZXh0cmFjdHMgdGhlCisgISBmYWlsaW5nIHBhcnQgYW5kIGNoZWNr cyB0aGF0IGFsbCBpcyB3ZWxsLgorICEKKyAgIHR5cGUgdF9pbmZvX2Jsb2Nr CisgICAgIGludGVnZXIgICAgICAgICAgICAgICAgICAgICAgOjogbiAgICAg PSAgMCAgICAgICEgbnVtYmVyIG9mIGVsZW1lbnRzCisgICBlbmQgdHlwZSB0 X2luZm9fYmxvY2sKKyAgICEKKyAgIHR5cGUgdF9kZWNfaW5mbworICAgICBp bnRlZ2VyICAgICAgICAgICAgICAgICAgICAgIDo6IG4gICAgID0gIDAgICAg ICAhIG51bWJlciBvZiBlbGVtZW50cworICAgICBpbnRlZ2VyICAgICAgICAg ICAgICAgICAgICAgIDo6IG5fYiAgID0gIDAgICAgICAhIG51bWJlciBvZiBi bG9ja3MKKyAgICAgdHlwZSAodF9pbmZvX2Jsb2NrKSAscG9pbnRlciA6OiBi ICg6KSA9PiBOVUxMKCkgISBpbmZvIGJsb2NrcworICAgZW5kIHR5cGUgdF9k ZWNfaW5mbworICAgIQorICAgdHlwZSB0X3ZlY3Rvcl9zZWdtCisgICAgIGlu dGVnZXIgICAgICAgICAgIDo6IG4gICAgPSAgMCAgICAgICEgbnVtYmVyIG9m IGVsZW1lbnRzCisgICAgIHJlYWwgLHBvaW50ZXIgOjogeCg6KSA9PiBOVUxM KCkgISBjb2VmZmljaWVudHMKKyAgIGVuZCB0eXBlIHRfdmVjdG9yX3NlZ20K KyAgICEKKyAgIHR5cGUgdF92ZWN0b3IKKyAgICAgdHlwZSAodF9kZWNfaW5m bykgICAgLHBvaW50ZXIgOjogaW5mbyAgICA9PiBOVUxMKCkgICEgZGVjb21w b3NpdGlvbiBpbmZvCisgICAgIGludGVnZXIgICAgICAgICAgICAgICAgICAg ICAgIDo6IG4gICAgICAgPSAgMCAgICAgICAhIG51bWJlciBvZiBlbGVtZW50 cworICAgICBpbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICA6OiBuX3Mg ICAgID0gIDAgICAgICAgISBudW1iZXIgb2Ygc2VnbWVudHMKKyAgICAgaW50 ZWdlciAgICAgICAgICAgICAgICAgICAgICAgOjogYWxsb2NfbCA9ICAwICAg ICAgICEgYWxsb2NhdGlvbiBsZXZlbAorICAgICB0eXBlICh0X3ZlY3Rvcl9z ZWdtKSAscG9pbnRlciA6OiBzICg6KSAgID0+IE5VTEwoKSAgISB2ZWN0b3Ig YmxvY2tzCisgICBlbmQgdHlwZSB0X3ZlY3RvcgorCisKKyAgIHR5cGUodF92 ZWN0b3IpIDo6IHoKKyAgIHR5cGUodF92ZWN0b3Jfc2VnbSksIHBvaW50ZXIg Ojogc3MKKworICAgYWxsb2NhdGUgKHolcygyKSkKKyAgIGRvIGkgPSAxLCAy CisgICAgIHNzID0+IHolcyhpKQorICAgICBhbGxvY2F0ZSAoc3MleCgyKSwg c291cmNlID0gWzEuMCwgMi4wXSpyZWFsKGkpKQorICAgZW5kIGRvCisKKyAh IFRoZXNlIGxpbmVzIHdvdWxkIHNlZ2ZhdWx0LgorICAgaWYgKGludCAoc3Vt ICh6JXMoMSkleCkpIC5uZS4gMykgY2FsbCBhYm9ydAorICAgaWYgKGludCAo c3VtICh6JXMoMSkleCAqIHolcygyKSV4KSkgLm5lLiAxMCkgY2FsbCBhYm9y dAorIGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9zdWJy ZWZfYXJyYXlfcG9pbnRlcl80LmY5MAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3N1YnJlZl9hcnJheV9w b2ludGVyXzQuZjkwCShyZXZpc2lvbiAyNDk4NjUpCi0tLSBnY2MvdGVzdHN1 aXRlL2dmb3J0cmFuLmRnL3N1YnJlZl9hcnJheV9wb2ludGVyXzQuZjkwCSh3 b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiBQUk9HUkFNIFgKKioqIDIy LDI4ICoqKioKICBDT05UQUlOUwogICAgU1VCUk9VVElORSBaKFEpCiAgICAg IElOVEVHRVIsIFBPSU5URVIgOjogUSg6KQohICAgICBRKDE6MzoyKSA9IDk5 OQogICAgRU5EIFNVQlJPVVRJTkUgWgogIEVORCBQUk9HUkFNIFgKCi0tLSAy MiwzMCAtLS0tCiAgQ09OVEFJTlMKICAgIFNVQlJPVVRJTkUgWihRKQogICAg ICBJTlRFR0VSLCBQT0lOVEVSIDo6IFEoOikKISAgICAgaW50ZWdlciA6OiBv ZmYKISAgICAgb2ZmID0gbGJvdW5kKFEsIDEpIC0gMQohICAgICBRKDErb2Zm IDogMytvZmYgOiAyKSA9IDk5OQogICAgRU5EIFNVQlJPVVRJTkUgWgogIEVO RCBQUk9HUkFNIFgKCkluZGV4OiBsaWJnZm9ydHJhbi9saWJnZm9ydHJhbi5o Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGxpYmdmb3J0cmFuL2xpYmdm b3J0cmFuLmgJKHJldmlzaW9uIDI0OTg2NSkKLS0tIGxpYmdmb3J0cmFuL2xp Ymdmb3J0cmFuLmgJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqIHN0 cnVjdCB7XAoqKiogMzM5LDM0NCAqKioqCi0tLSAzMzksMzQ1IC0tLS0KICAg IHR5cGUgKmJhc2VfYWRkcjtcCiAgICBzaXplX3Qgb2Zmc2V0O1wKICAgIGlu ZGV4X3R5cGUgZHR5cGU7XAorICAgaW5kZXhfdHlwZSBzcGFuO1wKICAgIGRl c2NyaXB0b3JfZGltZW5zaW9uIGRpbVtyXTtcCiAgfQoK --f403045f289e7d04680553e6d634--