From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9757 invoked by alias); 15 Apr 2002 15:06:04 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 9702 invoked by uid 71); 15 Apr 2002 15:06:00 -0000 Resent-Date: 15 Apr 2002 15:06:00 -0000 Resent-Message-ID: <20020415150600.9700.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, Dusan@sources.redhat.com, Bruncko@sources.redhat.com Received:(qmail 8673 invoked by uid 61); 15 Apr 2002 15:02:59 -0000 Message-Id:<20020415150259.8672.qmail@sources.redhat.com> Date: Mon, 15 Apr 2002 08:06:00 -0000 From: Dusan@sources.redhat.com, Bruncko@sources.redhat.com Reply-To: Dusan@sources.redhat.com, Bruncko@sources.redhat.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: other/6308: Internal compiler error X-SW-Source: 2002-04/txt/msg00775.txt.bz2 List-Id: >Number: 6308 >Category: other >Synopsis: Internal compiler error >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Apr 15 08:06:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Dusan Bruncko >Release: gcc version 2.95.3 20010315 (release) >Organization: >Environment: redhat7.2, 2.4.9-13smp >Description: Compile G4ReactionDynamics.cc from GEANT4.4.0, last corected file, I have /usr/local/bin/g++ -pipe -fno-for-scope -DGNU_GCC -fPIC -DG4OPTIMISE -DG4USE_STL -Iinclude -I/home/geant4.3.2/source/global/STLInterface -I/home/lhcxx/specific/redhat61/gcc-2.95.2/ CLHEP/pro/include -I/usr/local/include/g++-3 -I/usr/local/include -I/usr/local/lib/gcc-lib e/geant4.3.2/source/geometry/volumes/include -I/home/geant4.3.2/source/geometry/management/include -I/home/geant4.3.2/source/particles/management/include -I/home/geant4.3.2/source/particles/leptons/include -I/home/geant4.3.2/source/particles/bosons/include -I/home/geant4.3.2/source/particles/hadrons/mesons/include -I/home/geant4.3.2/source/particles/hadrons/barions/include -I/home/geant4.3.2/source/particles/hadrons/ions/include -I/home/geant4.3.2/source/processes/management/include -I/home/geant4.3.2/source/materials/include -c -o /home/simul/tmp/Linux-g++/G4hadronic_util/G4ReactionDynamics.o \ src/G4ReactionDynamics.cc src/G4ReactionDynamics.cc: In method `void G4ReactionDynamics::Rotate(double, const G4ThreeVector &, const G4ReactionProduct &, const G4DynamicParticle *, const G4Nucleus &, G4ReactionProduct &, G4ReactionProduct &, G4FastVector &, G4int &)': src/G4ReactionDynamics.cc:2696: Internal compiler error. src/G4ReactionDynamics.cc:2696: Please submit a full bug report. src/G4ReactionDynamics.cc:2696: See for instructions. cpp0: output pipe has been closed make: *** [/home/simul/tmp/Linux-g++/G4hadronic_util/G4ReactionDynamics.o] Error 1 >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="G4ReactionDynamics.cc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="G4ReactionDynamics.cc" Ly8KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKLy8gKiBESVNDTEFJTUVSICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiBUaGUg Zm9sbG93aW5nIGRpc2NsYWltZXIgc3VtbWFyaXplcyBhbGwgdGhlIHNwZWNpZmljIGRpc2NsYWlt ZXJzICoKLy8gKiBvZiBjb250cmlidXRvcnMgdG8gdGhpcyBzb2Z0d2FyZS4gVGhlIHNwZWNpZmlj IGRpc2NsYWltZXJzLHdoaWNoICoKLy8gKiBnb3Zlcm4sIGFyZSBsaXN0ZWQgd2l0aCB0aGVpciBs b2NhdGlvbnMgaW46ICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiAgIGh0dHA6Ly9jZXJuLmNo L2dlYW50NC9saWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICoKLy8gKiBOZWl0aGVyIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgc3lzdGVt LCBub3IgdGhlaXIgZW1wbG95aW5nICoKLy8gKiBpbnN0aXR1dGVzLG5vciB0aGUgYWdlbmNpZXMg cHJvdmlkaW5nIGZpbmFuY2lhbCBzdXBwb3J0IGZvciB0aGlzICoKLy8gKiB3b3JrICBtYWtlICBh bnkgcmVwcmVzZW50YXRpb24gb3IgIHdhcnJhbnR5LCBleHByZXNzIG9yIGltcGxpZWQsICoKLy8g KiByZWdhcmRpbmcgIHRoaXMgIHNvZnR3YXJlIHN5c3RlbSBvciBhc3N1bWUgYW55IGxpYWJpbGl0 eSBmb3IgaXRzICoKLy8gKiB1c2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLy8gKiBUaGlzICBjb2Rl ICBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgIGludGVsbGVjdHVhbCBwcm9wZXJ0eSAgb2YgdGhlICoK Ly8gKiBHRUFOVDQgY29sbGFib3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICoKLy8gKiBCeSBjb3B5aW5nLCAgZGlzdHJpYnV0aW5nICBvciBtb2RpZnlp bmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrICoKLy8gKiBiYXNlZCAgb24gIHRoZSBQcm9ncmFt KSAgeW91IGluZGljYXRlICB5b3VyICBhY2NlcHRhbmNlIG9mICB0aGlzICoKLy8gKiBzdGF0ZW1l bnQsIGFuZCBhbGwgaXRzIHRlcm1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICoKLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKLy8KLy8KLy8KIC8vIEhhZHJvbmljIFByb2Nlc3M6IFJlYWN0aW9u IER5bmFtaWNzCiAvLyBvcmlnaW5hbCBieSBILlAuIFdlbGxpc2NoCiAvLyBtb2RpZmllZCBieSBK LkwuIENodW1hLCBUUklVTUYsIDE5LU5vdi0xOTk2CiAvLyBMYXN0IG1vZGlmaWVkOiAyNy1NYXIt MTk5NwogLy8gbW9kaWZpZWQgYnkgSC5QLiBXZWxsaXNjaCwgMjQtQXByLTk3CiAvLyBILlAuIFdl bGxpc2NoLCAyNS5BcHItOTc6IFNpZGUgb2YgY3VycmVudCBhbmQgdGFyZ2V0IHBhcnRpY2xlIHRh a2VuIGludG8gYWNjb3VudAogLy8gSC5QLiBXZWxsaXNjaCwgMjkuQXByLTk3OiBCdWcgZml4IGlu IE51Y2xlYXJSZWFjdGlvbi4gKHBzZXVkbzEgd2FzIHdpdGhvdXQgZW5lcmd5KQogLy8gSi5MLiBD aHVtYSwgMzAtQXByLTk3OiAgQ2hhbmdlZCByZXR1cm4gdmFsdWUgZm9yIEdlbmVyYXRlWGFuZFB0 LiAgSXQgc2VlbXMgcG9zc2libGUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgR2Vu ZXJhdGVYYW5kUHQgY291bGQgZWxpbWluYXRlIHNvbWUgc2Vjb25kYXJpZXMsIGJ1dAogLy8gICAg ICAgICAgICAgICAgICAgICAgICAgc3RpbGwgZmluaXNoIGl0cyBjYWxjdWxhdGlvbnMsIHRodXMg d2Ugd291bGQgbm90IHdhbnQgdG8KIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdXNl IFR3b0NsdXN0ZXIgdG8gYWdhaW4gY2FsY3VsYXRlIHRoZSBtb21lbnRhIGlmIHZlY0xlbgogLy8g ICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGxlc3MgdGhhbiA2LgogLy8gSi5MLiBDaHVtYSwg MTAtSnVuLTk3OiAgTW9kaWZpZWQgTnVjbGVhclJlYWN0aW9uLiAgV2FzIG5vdCBjcmVhdGluZyBS ZWFjdGlvblByb2R1Y3QncwogLy8gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgbmV3 IG9wZXJhdG9yLCB0aHVzIHRoZXkgd291bGQgYmUgbWVhbmluZ2xlc3Mgd2hlbgogLy8gICAgICAg ICAgICAgICAgICAgICAgICAgZ29pbmcgb3V0IG9mIHNjb3BlLgogLy8gSi5MLiBDaHVtYSwgMjAt SnVuLTk3OiAgTW9kaWZpZWQgR2VuZXJhdGVYYW5kUHQgYW5kIFR3b0NsdXN0ZXIgdG8gZml4IHVu aXRzIHByb2JsZW1zCiAvLyBKLkwuIENodW1hLCAyMy1KdW4tOTc6ICBNb2RpZmllZCBQcm9kdWNl U3RyYW5nZVBhcnRpY2xlUGFpcnMgdG8gZml4IHVuaXRzIHByb2JsZW1zCiAvLyBKLkwuIENodW1h LCAyNi1KdW4tOTc6ICBNb2RpZmllZCBQcm9kdWNlU3RyYW5nZVBhcnRpY2xlUGFpcnMgdG8gZml4 IGFycmF5IGluZGljZXMKIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdlcmUgc29t ZXRpbWVzIGdvaW5nIG91dCBvZiBib3VuZHMKIC8vIEouTC4gQ2h1bWEsIDA0LUp1bC05NzogIE1h bnkgbWlub3IgbW9kaWZpY2F0aW9ucyB0byBHZW5lcmF0ZVhhbmRQdCBhbmQgVHdvQ2x1c3Rlcgog Ly8gSi5MLiBDaHVtYSwgMDYtQXVnLTk3OiAgQWRkZWQgb3JpZ2luYWwgaW5jaWRlbnQgcGFydGlj bGUsIGJlZm9yZSBGZXJtaSBtb3Rpb24gYW5kCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICBl dmFwb3JhdGlvbiBlZmZlY3RzIGFyZSBpbmNsdWRlZCwgbmVlZGVkIGZvciBzZWxmIGFic29ycHRp b24KIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb3JyZWN0aW9ucyBmb3Igc2luZ2xl IHBhcnRpY2xlIHNwZWN0cmEgKHNob3dlciBwYXJ0aWNsZXMpCiAvLyBKLiBBbGxpc29uLCAxNy1K dW4tOTk6ICBSZXBsYWNlZCBhIG1pbiBmdW5jdGlvbiB0byBnZXQgY29ycmVjdCBiZWhhdmlvdXIg b24gREVDLgogCiNpbmNsdWRlICJHNFJlYWN0aW9uRHluYW1pY3MuaGgiCiNpbmNsdWRlICJHNEFu dGlQcm90b24uaGgiCiNpbmNsdWRlICJHNEFudGlOZXV0cm9uLmhoIgojaW5jbHVkZSAiUmFuZG9t aXplLmhoIgojaW5jbHVkZSAiZzRzdGQvaW9zdHJlYW0iCi8vICNpbmNsdWRlICJEdW1wRnJhbWUu aGgiCiAvLyNpbmNsdWRlICIuLi8uLi9hbHBoYV90ZXN0L2N4eC9OYW1ldG9HaGVpc2hOdW1iZXIu Y2MiCiAKIEc0Ym9vbCBHNFJlYWN0aW9uRHluYW1pY3M6OkdlbmVyYXRlWGFuZFB0KAogICBHNEZh c3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiAmdmVjLAogICBHNGludCAmdmVjTGVuLAog ICBHNFJlYWN0aW9uUHJvZHVjdCAmbW9kaWZpZWRPcmlnaW5hbCwgICAvLyBGZXJtaSBtb3Rpb24g JiBldmFwLiBlZmZlY3RzIGluY2x1ZGVkCiAgIGNvbnN0IEc0RHluYW1pY1BhcnRpY2xlICpvcmln aW5hbEluY2lkZW50LCAgIC8vIHRoZSBvcmlnaW5hbCBpbmNpZGVudCBwYXJ0aWNsZQogICBHNFJl YWN0aW9uUHJvZHVjdCAmY3VycmVudFBhcnRpY2xlLAogICBHNFJlYWN0aW9uUHJvZHVjdCAmdGFy Z2V0UGFydGljbGUsCiAgIGNvbnN0IEc0TnVjbGV1cyAmdGFyZ2V0TnVjbGV1cywKICAgRzRib29s ICZpbmNpZGVudEhhc0NoYW5nZWQsCiAgIEc0Ym9vbCAmdGFyZ2V0SGFzQ2hhbmdlZCwKICAgRzRi b29sIGxlYWRGbGFnLAogICBHNFJlYWN0aW9uUHJvZHVjdCAmbGVhZGluZ1N0cmFuZ2VQYXJ0aWNs ZSApCiAgewogICAgLy8gCiAgICAvLyBkZXJpdmVkIGZyb20gb3JpZ2luYWwgRk9SVFJBTiBjb2Rl IEdFTlhQVCBieSBILiBGZXNlZmVsZHQgKDExLU9jdC0xOTg3KQogICAgLy8KICAgIC8vICBHZW5l cmF0aW9uIG9mIFgtIGFuZCBQVC0gdmFsdWVzIGZvciBpbmNpZGVudCwgdGFyZ2V0LCBhbmQgYWxs IHNlY29uZGFyeSBwYXJ0aWNsZXMgCiAgICAvLyAgQSBzaW1wbGUgc2luZ2xlIHZhcmlhYmxlIGRl c2NyaXB0aW9uIEUgRDNTL0RQMz0gRihRKSB3aXRoCiAgICAvLyAgUV4yID0gKE0qWCleMiArIFBU XjIgaXMgdXNlZC4gRmluYWwgc3RhdGUga2luZW1hdGljIGlzIHByb2R1Y2VkCiAgICAvLyAgYnkg YW4gRkYtdHlwZSBpdGVyYXRpdmUgY2FzY2FkZSBtZXRob2QKICAgIC8vCiAgICAvLyAgaW50ZXJu YWwgdW5pdHMgYXJlIEdlVgogICAgLy8KICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6 RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgIAogICAgLy8gUHJvdGVjdGlvbiBpbiBjYXNlIG5v IHNlY29uZGFyeSBoYXMgYmVlbiBjcmVhdGVkOyBjYXNjYWRlcyBkb3duIHRvIHR3by1ib2R5Lgog ICAgaWYodmVjTGVuID09IDApIHJldHVybiBmYWxzZTsKCiAgICBHNFBhcnRpY2xlRGVmaW5pdGlv biAqYVBpTWludXMgPSBHNFBpb25NaW51czo6UGlvbk1pbnVzKCk7CiAgICBHNFBhcnRpY2xlRGVm aW5pdGlvbiAqYW5BbnRpUHJvdG9uID0gRzRBbnRpUHJvdG9uOjpBbnRpUHJvdG9uKCk7CiAgICBH NFBhcnRpY2xlRGVmaW5pdGlvbiAqYW5BbnRpTmV1dHJvbiA9IEc0QW50aU5ldXRyb246OkFudGlO ZXV0cm9uKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVByb3RvbiA9IEc0UHJvdG9uOjpQ cm90b24oKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphTmV1dHJvbiA9IEc0TmV1dHJvbjo6 TmV1dHJvbigpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFQaVBsdXMgPSBHNFBpb25QbHVz OjpQaW9uUGx1cygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFQaVplcm8gPSBHNFBpb25a ZXJvOjpQaW9uWmVybygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFLYW9uUGx1cyA9IEc0 S2FvblBsdXM6Okthb25QbHVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYUthb25NaW51 cyA9IEc0S2Fvbk1pbnVzOjpLYW9uTWludXMoKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICph S2Fvblplcm9TID0gRzRLYW9uWmVyb1Nob3J0OjpLYW9uWmVyb1Nob3J0KCk7CiAgICBHNFBhcnRp Y2xlRGVmaW5pdGlvbiAqYUthb25aZXJvTCA9IEc0S2Fvblplcm9Mb25nOjpLYW9uWmVyb0xvbmco KTsKCiAgICBHNGludCBpLCBsOwogICAgCiAgICBjb25zdCBHNGRvdWJsZSBla09yaWdpbmFsID0g bW9kaWZpZWRPcmlnaW5hbC5HZXRLaW5ldGljRW5lcmd5KCkvR2VWOwogICAgY29uc3QgRzRkb3Vi bGUgZXRPcmlnaW5hbCA9IG1vZGlmaWVkT3JpZ2luYWwuR2V0VG90YWxFbmVyZ3koKS9HZVY7CiAg ICBjb25zdCBHNGRvdWJsZSBtT3JpZ2luYWwgPSBtb2RpZmllZE9yaWdpbmFsLkdldE1hc3MoKS9H ZVY7CiAgICBjb25zdCBHNGRvdWJsZSBwT3JpZ2luYWwgPSBtb2RpZmllZE9yaWdpbmFsLkdldE1v bWVudHVtKCkubWFnKCkvR2VWOwogICAgRzRkb3VibGUgdGFyZ2V0TWFzcyA9IHRhcmdldFBhcnRp Y2xlLkdldERlZmluaXRpb24oKS0+R2V0UERHTWFzcygpL0dlVjsKICAgIEc0ZG91YmxlIGNlbnRl cm9mbWFzc0VuZXJneSA9IHNxcnQoIG1PcmlnaW5hbCptT3JpZ2luYWwgKwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFzcyp0YXJnZXRNYXNzICsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMCp0YXJnZXRNYXNzKmV0T3JpZ2lu YWwgKTsgIC8vIEdlVgogICAgRzRkb3VibGUgY3VycmVudE1hc3MgPSBjdXJyZW50UGFydGljbGUu R2V0TWFzcygpL0dlVjsKICAgIHRhcmdldE1hc3MgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkv R2VWOwogICAgaWYoIGN1cnJlbnRNYXNzID09IDAuMCAmJiB0YXJnZXRNYXNzID09IDAuMCApICAg ICAgIC8vIGFubmloaWxhdGlvbgogICAgewogICAgICBHNGRvdWJsZSBlayA9IGN1cnJlbnRQYXJ0 aWNsZS5HZXRLaW5ldGljRW5lcmd5KCk7CiAgICAgIEc0VGhyZWVWZWN0b3IgbSA9IGN1cnJlbnRQ YXJ0aWNsZS5HZXRNb21lbnR1bSgpOwogICAgICBjdXJyZW50UGFydGljbGUgPSAqdmVjWzBdOwog ICAgICB0YXJnZXRQYXJ0aWNsZSA9ICp2ZWNbMV07CiAgICAgIGZvciggaT0wOyBpPCh2ZWNMZW4t Mik7ICsraSApKnZlY1tpXSA9ICp2ZWNbaSsyXTsKICAgICAgRzRSZWFjdGlvblByb2R1Y3QgKnRl bXAgPSB2ZWNbdmVjTGVuLTFdOwogICAgICBkZWxldGUgdGVtcDsKICAgICAgdGVtcCA9IHZlY1t2 ZWNMZW4tMl07CiAgICAgIGRlbGV0ZSB0ZW1wOwogICAgICB2ZWNMZW4gLT0gMjsKICAgICAgY3Vy cmVudE1hc3MgPSBjdXJyZW50UGFydGljbGUuR2V0TWFzcygpL0dlVjsKICAgICAgaW5jaWRlbnRI YXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgdGFyZ2V0SGFzQ2hhbmdlZCA9IHRydWU7CiAgICAgIGN1 cnJlbnRQYXJ0aWNsZS5TZXRLaW5ldGljRW5lcmd5KCBlayApOwogICAgICBjdXJyZW50UGFydGlj bGUuU2V0TW9tZW50dW0oIG0gKTsKICAgIH0KICAgIGNvbnN0IEc0ZG91YmxlIGF0b21pY1dlaWdo dCA9IHRhcmdldE51Y2xldXMuR2V0TigpOwogICAgY29uc3QgRzRkb3VibGUgYXRvbWljTnVtYmVy ID0gdGFyZ2V0TnVjbGV1cy5HZXRaKCk7CiAgICBjb25zdCBHNGRvdWJsZSBwcm90b25NYXNzID0g YVByb3Rvbi0+R2V0UERHTWFzcygpL01lVjsKICAgIGlmKCAob3JpZ2luYWxJbmNpZGVudC0+R2V0 RGVmaW5pdGlvbigpID09IGFLYW9uTWludXMgfHwKICAgICAgICAgb3JpZ2luYWxJbmNpZGVudC0+ R2V0RGVmaW5pdGlvbigpID09IGFLYW9uWmVyb0wgfHwKICAgICAgICAgb3JpZ2luYWxJbmNpZGVu dC0+R2V0RGVmaW5pdGlvbigpID09IGFLYW9uWmVyb1MgfHwKICAgICAgICAgb3JpZ2luYWxJbmNp ZGVudC0+R2V0RGVmaW5pdGlvbigpID09IGFLYW9uUGx1cykgJiYKICAgICAgICBHNFVuaWZvcm1S YW5kKCkgPj0gMC43ICkKICAgIHsKICAgICAgRzRSZWFjdGlvblByb2R1Y3QgdGVtcCA9IGN1cnJl bnRQYXJ0aWNsZTsKICAgICAgY3VycmVudFBhcnRpY2xlID0gdGFyZ2V0UGFydGljbGU7CiAgICAg IHRhcmdldFBhcnRpY2xlID0gdGVtcDsKICAgICAgaW5jaWRlbnRIYXNDaGFuZ2VkID0gdHJ1ZTsK ICAgICAgdGFyZ2V0SGFzQ2hhbmdlZCA9IHRydWU7CiAgICAgIGN1cnJlbnRNYXNzID0gY3VycmVu dFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7CiAgICAgIHRhcmdldE1hc3MgPSB0YXJnZXRQYXJ0aWNs ZS5HZXRNYXNzKCkvR2VWOwogICAgfQogICAgY29uc3QgRzRkb3VibGUgYWZjID0gRzRzdGQ6Om1p biggMC43NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTIrMC4yMDAqbG9nKGxv ZyhjZW50ZXJvZm1hc3NFbmVyZ3kqY2VudGVyb2ZtYXNzRW5lcmd5KSkrCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBvdyhjZW50ZXJvZm1hc3NFbmVyZ3kqY2VudGVyb2ZtYXNzRW5lcmd5 LDEuNSkvNjAwMC4wICk7CiAgICAKICAgIEc0ZG91YmxlIGZvcndhcmRFbmVyZ3kgPSBjZW50ZXJv Zm1hc3NFbmVyZ3kvMi4wIC0gY3VycmVudE1hc3M7CiAgICBHNGludCBmb3J3YXJkQ291bnQgPSAx OyAgICAgICAgICAgIC8vIG51bWJlciBvZiBwYXJ0aWNsZXMgaW4gZm9yd2FyZCBoZW1pc3BoZXJl CiAgICAKICAgIEc0ZG91YmxlIGJhY2t3YXJkRW5lcmd5ID0gY2VudGVyb2ZtYXNzRW5lcmd5LzIu MCAtIHRhcmdldE1hc3M7CiAgICBHNGludCBiYWNrd2FyZENvdW50ID0gMTsgICAgICAgICAgIC8v IG51bWJlciBvZiBwYXJ0aWNsZXMgaW4gYmFja3dhcmQgaGVtaXNwaGVyZQogICAgLy8KICAgIC8v ICByYW5kb21pemUgdGhlIG9yZGVyIG9mIHRoZSBzZWNvbmRhcnkgcGFydGljbGVzCiAgICAvLyAg bm90ZSB0aGF0IHRoZSBjdXJyZW50IGFuZCB0YXJnZXQgcGFydGljbGVzIGFyZSBub3QgYWZmZWN0 ZWQKICAgIC8vCiAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICB7CiAgICAgIEc0aW50 IGl0ZW1wID0gRzRpbnQoIEc0VW5pZm9ybVJhbmQoKSp2ZWNMZW4gKTsKICAgICAgRzRSZWFjdGlv blByb2R1Y3QgcFRlbXAgPSAqdmVjW2l0ZW1wXTsKICAgICAgKnZlY1tpdGVtcF0gPSAqdmVjW2ld OwogICAgICAqdmVjW2ldID0gcFRlbXA7CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1l czo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgIH0KICAgIGZvciggaT0wOyBpPHZlY0xlbjsg KytpICkKICAgIHsKICAgICAgaWYoIHZlY1tpXS0+R2V0U2lkZSgpID09IC0xICkKICAgICAgewog ICAgICAgICsrYmFja3dhcmRDb3VudDsKICAgICAgICBiYWNrd2FyZEVuZXJneSAtPSB2ZWNbaV0t PkdldE1hc3MoKS9HZVY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKytmb3J3YXJkQ291bnQ7CiAg ICAgICAgZm9yd2FyZEVuZXJneSAtPSB2ZWNbaV0tPkdldE1hc3MoKS9HZVY7CiAgICAgIH0KICAg IH0KICAgIC8vCiAgICAvLyAgYWRkIHBhcnRpY2xlcyBmcm9tIGludHJhbnVjbGVhciBjYXNjYWRl CiAgICAvLyAgbnVjbGVhckV4Y2l0YXRpb25Db3VudCA9IG51bWJlciBvZiBuZXcgc2Vjb25kYXJp ZXMgcHJvZHVjZWQgYnkgbnVjbGVhciBleGNpdGF0aW9uCiAgICAvLyAgZXh0cmFDb3VudCA9IG51 bWJlciBvZiBudWNsZW9ucyB3aXRoaW4gdGhlc2UgbmV3IHNlY29uZGFyaWVzCiAgICAvLwogICAg RzRkb3VibGUgeHRhcmc7CiAgICBpZiggY2VudGVyb2ZtYXNzRW5lcmd5IDwgKDIuMCtHNFVuaWZv cm1SYW5kKCkpICkKICAgICAgeHRhcmcgPSBhZmMgKiAocG93KGF0b21pY1dlaWdodCwwLjMzKS0x LjApICogKDIuMCpiYWNrd2FyZENvdW50K3ZlY0xlbisyKS8yLjA7CiAgICBlbHNlCiAgICAgIHh0 YXJnID0gYWZjICogKHBvdyhhdG9taWNXZWlnaHQsMC4zMyktMS4wKSAqICgyLjAqYmFja3dhcmRD b3VudCk7CiAgICBpZiggeHRhcmcgPD0gMC4wICl4dGFyZyA9IDAuMDE7CiAgICBHNGludCBudWNs ZWFyRXhjaXRhdGlvbkNvdW50ID0gUG9pc3NvbiggeHRhcmcgKTsKICAgIEc0aW50IGV4dHJhTnVj bGVvbkNvdW50ID0gMDsKICAgIEc0ZG91YmxlIGV4dHJhTnVjbGVvbk1hc3MgPSAwLjA7CiAgICBp ZiggbnVjbGVhckV4Y2l0YXRpb25Db3VudCA+IDAgKQogICAgewogICAgICBjb25zdCBHNGRvdWJs ZSBudWNzdXBbXSA9IHsgMS4wMCwgMC43LCAwLjUsIDAuNCwgMC4zNSwgMC4zIH07CiAgICAgIGNv bnN0IEc0ZG91YmxlIHBzdXBbXSA9IHsgMy4sIDYuLCAyMC4sIDUwLiwgMTAwLiwgMTAwMC4gfTsK ICAgICAgRzRpbnQgbW9tZW50dW1CaW4gPSAwOwogICAgICB3aGlsZSggKG1vbWVudHVtQmluIDwg NikgJiYKICAgICAgICAgICAgIChtb2RpZmllZE9yaWdpbmFsLkdldFRvdGFsTW9tZW50dW0oKS9H ZVYgPiBwc3VwW21vbWVudHVtQmluXSkgKQogICAgICAgICsrbW9tZW50dW1CaW47CiAgICAgIG1v bWVudHVtQmluID0gRzRzdGQ6Om1pbiggNSwgbW9tZW50dW1CaW4gKTsKICAgICAgLy8KICAgICAg Ly8gIE5PVEU6IGluIEdFTlhQVCwgdGhlc2UgbmV3IHBhcnRpY2xlcyB3ZXJlIGdpdmVuIG5lZ2F0 aXZlIGNvZGVzCiAgICAgIC8vICAgICAgICBoZXJlIEkgdXNlICBOZXdseUFkZGVkID0gdHJ1ZSAg aW5zdGVhZAogICAgICAvLwovLyAgICAgIEc0UmVhY3Rpb25Qcm9kdWN0ICpwVmVjID0gbmV3IEc0 UmVhY3Rpb25Qcm9kdWN0IFtudWNsZWFyRXhjaXRhdGlvbkNvdW50XTsKICAgICAgZm9yKCBpPTA7 IGk8bnVjbGVhckV4Y2l0YXRpb25Db3VudDsgKytpICkKICAgICAgewogICAgICAgIEc0UmVhY3Rp b25Qcm9kdWN0ICogcFZlYyA9IG5ldyBHNFJlYWN0aW9uUHJvZHVjdCgpOwogICAgICAgIGlmKCBH NFVuaWZvcm1SYW5kKCkgPCBudWNzdXBbbW9tZW50dW1CaW5dICkKICAgICAgICB7CiAgICAgICAg ICBpZiggRzRVbmlmb3JtUmFuZCgpID4gMS4wLWF0b21pY051bWJlci9hdG9taWNXZWlnaHQgKQog ICAgICAgICAgICBwVmVjLT5TZXREZWZpbml0aW9uKCBhUHJvdG9uICk7CiAgICAgICAgICBlbHNl CiAgICAgICAgICAgIHBWZWMtPlNldERlZmluaXRpb24oIGFOZXV0cm9uICk7CiAgICAgICAgICBw VmVjLT5TZXRTaWRlKCAtMiApOyAgICAgICAgICAgICAgICAvLyAtMiBtZWFucyBiYWNrc2lkZSBu dWNsZW9uCiAgICAgICAgICArK2V4dHJhTnVjbGVvbkNvdW50OwogICAgICAgICAgYmFja3dhcmRF bmVyZ3kgKz0gY2VudGVyb2ZtYXNzRW5lcmd5LzIuMDsKICAgICAgICAgIGV4dHJhTnVjbGVvbk1h c3MgKz0gcFZlYy0+R2V0TWFzcygpL0dlVjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAg IHsKICAgICAgICAgIEc0ZG91YmxlIHJhbiA9IEc0VW5pZm9ybVJhbmQoKTsKICAgICAgICAgIGlm KCByYW4gPCAwLjMxMiApCiAgICAgICAgICAgIHBWZWMtPlNldERlZmluaXRpb24oIGFQaVBsdXMg KTsKICAgICAgICAgIGVsc2UgaWYoIHJhbiA8IDAuNjg4ICkKICAgICAgICAgICAgcFZlYy0+U2V0 RGVmaW5pdGlvbiggYVBpWmVybyApOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBwVmVjLT5T ZXREZWZpbml0aW9uKCBhUGlNaW51cyApOwogICAgICAgICAgcFZlYy0+U2V0U2lkZSggLTEgKTsg ICAgICAgICAgICAgICAgLy8gYmFja3NpZGUgcGFydGljbGUsIGJ1dCBub3QgYSBudWNsZW9uCiAg ICAgICAgfQogICAgICAgIHBWZWMtPlNldE5ld2x5QWRkZWQoIHRydWUgKTsgICAgICAgICAgICAg ICAgLy8gdHJ1ZSBpcyB0aGUgc2FtZSBhcyBJUEEoaSk8MAogICAgICAgIHZlYy5TZXRFbGVtZW50 KCB2ZWNMZW4rKywgcFZlYyApOyAgICAKICAgICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFt ZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgICAgYmFja3dhcmRFbmVyZ3kgLT0gcFZl Yy0+R2V0TWFzcygpL0dlVjs7CiAgICAgICAgKytiYWNrd2FyZENvdW50OwogICAgICB9CiAgICB9 CiAgICAvLwogICAgLy8gIGFzc3VtZSBjb25zZXJ2YXRpb24gb2Yga2luZXRpYyBlbmVyZ3kgaW4g Zm9yd2FyZCAmIGJhY2t3YXJkIGhlbWlzcGhlcmVzCiAgICAvLwogICAgRzRpbnQgaXMsIGlza2lw OwogICAgd2hpbGUoIGZvcndhcmRFbmVyZ3kgPD0gMC4wICkgIC8vIG11c3QgZWxpbWluYXRlIGEg cGFydGljbGUgZnJvbSB0aGUgZm9yd2FyZCBzaWRlCiAgICB7CiAgICAgIC8vIERFQlVHR0lORyAt LT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgICAgaXNraXAgPSBHNGlu dChHNFVuaWZvcm1SYW5kKCkqZm9yd2FyZENvdW50KSArIDE7IC8vIDEgPD0gaXNraXAgPD0gZm9y d2FyZENvdW50CiAgICAgIGlzID0gMDsKICAgICAgRzRpbnQgZm9yd2FyZFBhcnRpY2xlc0xlZnQg PSAwOwogICAgICBmb3IoIGk9KHZlY0xlbi0xKTsgaT49MDsgLS1pICkKICAgICAgewogICAgICAg IGlmKCB2ZWNbaV0tPkdldFNpZGUoKSA9PSAxICkKICAgICAgICB7CiAgICAgICAgICBpZiggKytp cyA9PSBpc2tpcCApCiAgICAgICAgICB7CiAgICAgICAgICAgIGZvcndhcmRFbmVyZ3kgKz0gdmVj W2ldLT5HZXRNYXNzKCkvR2VWOwogICAgICAgICAgICBmb3IoIEc0aW50IGo9aTsgajwodmVjTGVu LTEpOyBqKysgKSp2ZWNbal0gPSAqdmVjW2orMV07ICAgIC8vIHNoaWZ0IHVwCiAgICAgICAgICAg IC0tZm9yd2FyZENvdW50OwogICAgICAgICAgICBmb3J3YXJkUGFydGljbGVzTGVmdCA9IDE7ICAK ICAgICAgICAgICAgRzRSZWFjdGlvblByb2R1Y3QgKnRlbXAgPSB2ZWNbdmVjTGVuLTFdOwogICAg ICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICAgICAgaWYoIC0tdmVjTGVuID09IDAgKXJldHVy biBmYWxzZTsgIC8vIGFsbCB0aGUgc2Vjb25kYXJpZXMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQKICAg ICAgICAgICAgYnJlYWs7ICAvLyAtLSsKICAgICAgICAgIH0gICAgICAgICAvLyAgIHwKICAgICAg ICB9ICAgICAgICAgICAvLyAgIHwKICAgICAgfSAgICAgICAgICAgICAvLyBicmVhayBnb2VzIGRv d24gdG8gaGVyZQogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2 ZWMsIHZlY0xlbik7CiAgICAgIGlmKCBmb3J3YXJkUGFydGljbGVzTGVmdCA9PSAwICkKICAgICAg ewogICAgICAgIGZvcndhcmRFbmVyZ3kgKz0gY3VycmVudFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7 CiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldERlZmluaXRpb25BbmRVcGRhdGVFKCB0YXJnZXRQ YXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgKTsKICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXREZWZp bml0aW9uQW5kVXBkYXRlRSggdmVjWzBdLT5HZXREZWZpbml0aW9uKCkgKTsKICAgICAgICAvLyBh Ym92ZSB0d28gbGluZXMgbW9kaWZpZWQgMjAtb2N0LTk3OiB3ZXJlIGp1c3Qgc2ltcGxlIGVxdWFs aXRpZXMKICAgICAgICAtLWZvcndhcmRDb3VudDsKICAgICAgICBmb3IoIEc0aW50IGo9MDsgajwo dmVjTGVuLTEpOyArK2ogKSp2ZWNbal0gPSAqdmVjW2orMV07CiAgICAgICAgRzRSZWFjdGlvblBy b2R1Y3QgKnRlbXAgPSB2ZWNbdmVjTGVuLTFdOwogICAgICAgIGRlbGV0ZSB0ZW1wOwogICAgICAg IGlmKCAtLXZlY0xlbiA9PSAwIClyZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHNlY29uZGFyaWVz IGhhdmUgYmVlbiBlbGltaW5hdGVkCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgICAg Ly8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAg d2hpbGUoIGJhY2t3YXJkRW5lcmd5IDw9IDAuMCApICAvLyBtdXN0IGVsaW1pbmF0ZSBhIHBhcnRp Y2xlIGZyb20gdGhlIGJhY2t3YXJkIHNpZGUKICAgIHsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBE dW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgICBpc2tpcCA9IEc0aW50KEc0 VW5pZm9ybVJhbmQoKSpiYWNrd2FyZENvdW50KSArIDE7IC8vIDEgPD0gaXNraXAgPD0gYmFja3dh cmRDb3VudAogICAgICBpcyA9IDA7CiAgICAgIEc0aW50IGJhY2t3YXJkUGFydGljbGVzTGVmdCA9 IDA7CiAgICAgIGZvciggaT0odmVjTGVuLTEpOyBpPj0wOyAtLWkgKQogICAgICB7CiAgICAgICAg aWYoIHZlY1tpXS0+R2V0U2lkZSgpIDwgMCApCiAgICAgICAgewogICAgICAgICAgaWYoICsraXMg PT0gaXNraXAgKSAgICAgICAgLy8gZWxpbWluYXRlIHRoZSBpJ3RoIHBhcnRpY2xlCiAgICAgICAg ICB7CiAgICAgICAgICAgIGlmKCB2ZWNbaV0tPkdldFNpZGUoKSA9PSAtMiApCiAgICAgICAgICAg IHsKICAgICAgICAgICAgICAtLWV4dHJhTnVjbGVvbkNvdW50OwogICAgICAgICAgICAgIGV4dHJh TnVjbGVvbk1hc3MgLT0gdmVjW2ldLT5HZXRNYXNzKCkvR2VWOwogICAgICAgICAgICB9CiAgICAg ICAgICAgIGJhY2t3YXJkRW5lcmd5ICs9IHZlY1tpXS0+R2V0TWFzcygpL0dlVjsKICAgICAgICAg ICAgZm9yKCBHNGludCBqPWk7IGo8KHZlY0xlbi0xKTsgKytqICkqdmVjW2pdID0gKnZlY1tqKzFd OyAgIC8vIHNoaWZ0IHVwCiAgICAgICAgICAgIC0tYmFja3dhcmRDb3VudDsKICAgICAgICAgICAg YmFja3dhcmRQYXJ0aWNsZXNMZWZ0ID0gMTsKICAgICAgICAgICAgRzRSZWFjdGlvblByb2R1Y3Qg KnRlbXAgPSB2ZWNbdmVjTGVuLTFdOwogICAgICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICAg ICAgaWYoIC0tdmVjTGVuID09IDAgKXJldHVybiBmYWxzZTsgIC8vIGFsbCB0aGUgc2Vjb25kYXJp ZXMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICB9CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZy YW1lKHZlYywgdmVjTGVuKTsKICAgICAgaWYoIGJhY2t3YXJkUGFydGljbGVzTGVmdCA9PSAwICkK ICAgICAgewogICAgICAgIGJhY2t3YXJkRW5lcmd5ICs9IHRhcmdldFBhcnRpY2xlLkdldE1hc3Mo KS9HZVY7CiAgICAgICAgdGFyZ2V0UGFydGljbGUgPSAqdmVjWzBdOwogICAgICAgIC0tYmFja3dh cmRDb3VudDsKICAgICAgICBmb3IoIEc0aW50IGo9MDsgajwodmVjTGVuLTEpOyArK2ogKSp2ZWNb al0gPSAqdmVjW2orMV07CiAgICAgICAgRzRSZWFjdGlvblByb2R1Y3QgKnRlbXAgPSB2ZWNbdmVj TGVuLTFdOwogICAgICAgIGRlbGV0ZSB0ZW1wOwogICAgICAgIGlmKCAtLXZlY0xlbiA9PSAwICly ZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHNlY29uZGFyaWVzIGhhdmUgYmVlbiBlbGltaW5hdGVk CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1w RnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgLy8KICAgIC8vICBkZWZpbmUgaW5p dGlhbCBzdGF0ZSB2ZWN0b3JzIGZvciBMb3JlbnR6IHRyYW5zZm9ybWF0aW9ucwogICAgLy8gIHRo ZSBwc2V1ZG9QYXJ0aWNsZXMgaGF2ZSBub24tc3RhbmRhcmQgbWFzc2VzLCBoZW5jZSB0aGUgInBz ZXVkbyIKICAgIC8vCiAgICBHNFJlYWN0aW9uUHJvZHVjdCBwc2V1ZG9QYXJ0aWNsZVsxMF07CiAg ICBmb3IoIGk9MDsgaTwxMDsgKytpIClwc2V1ZG9QYXJ0aWNsZVtpXS5TZXRaZXJvKCk7CiAgICAK ICAgIHBzZXVkb1BhcnRpY2xlWzBdLlNldE1hc3MoIG1PcmlnaW5hbCpHZVYgKTsKICAgIHBzZXVk b1BhcnRpY2xlWzBdLlNldE1vbWVudHVtKCAwLjAsIDAuMCwgcE9yaWdpbmFsKkdlViApOwogICAg cHNldWRvUGFydGljbGVbMF0uU2V0VG90YWxFbmVyZ3koCiAgICAgc3FydCggcE9yaWdpbmFsKnBP cmlnaW5hbCArIG1PcmlnaW5hbCptT3JpZ2luYWwgKSpHZVYgKTsKICAgIAogICAgcHNldWRvUGFy dGljbGVbMV0uU2V0TWFzcyggcHJvdG9uTWFzcypNZVYgKTsgICAgICAgIC8vIHRoaXMgY291bGQg YmUgdGFyZ2V0TWFzcwogICAgcHNldWRvUGFydGljbGVbMV0uU2V0VG90YWxFbmVyZ3koIHByb3Rv bk1hc3MqTWVWICk7CiAgICAKICAgIHBzZXVkb1BhcnRpY2xlWzNdLlNldE1hc3MoIHByb3Rvbk1h c3MqKDErZXh0cmFOdWNsZW9uQ291bnQpKk1lViApOwogICAgcHNldWRvUGFydGljbGVbM10uU2V0 VG90YWxFbmVyZ3koIHByb3Rvbk1hc3MqKDErZXh0cmFOdWNsZW9uQ291bnQpKk1lViApOwogICAg CiAgICBwc2V1ZG9QYXJ0aWNsZVs4XS5TZXRNb21lbnR1bSggMS4wKkdlViwgMC4wLCAwLjAgKTsK ICAgIAogICAgcHNldWRvUGFydGljbGVbMl0gPSBwc2V1ZG9QYXJ0aWNsZVswXSArIHBzZXVkb1Bh cnRpY2xlWzFdOwogICAgcHNldWRvUGFydGljbGVbM10gPSBwc2V1ZG9QYXJ0aWNsZVszXSArIHBz ZXVkb1BhcnRpY2xlWzBdOwogICAgCiAgICBwc2V1ZG9QYXJ0aWNsZVswXS5Mb3JlbnR6KCBwc2V1 ZG9QYXJ0aWNsZVswXSwgcHNldWRvUGFydGljbGVbMl0gKTsKICAgIHBzZXVkb1BhcnRpY2xlWzFd LkxvcmVudHooIHBzZXVkb1BhcnRpY2xlWzFdLCBwc2V1ZG9QYXJ0aWNsZVsyXSApOwogICAgCiAg ICBHNGRvdWJsZSBkbmRsWzIwXTsKICAgIC8vCiAgICAvLyAgbWFpbiBsb29wIGZvciA0LW1vbWVu dHVtIGdlbmVyYXRpb24KICAgIC8vICBzZWUgUGl0aGEtcmVwb3J0IChBYWNoZW4pIGZvciBhIGRl dGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXRob2QKICAgIC8vCiAgICBHNGRvdWJsZSBhc3Bh ciwgcHQsIGV0LCB4LCBwcCwgcHAxLCBydGhudmUsIHBoaW52ZSwgcm1iLCB3Z3Q7CiAgICBHNGlu dCAgICBpbm5lckNvdW50ZXIsIG91dGVyQ291bnRlcjsKICAgIEc0Ym9vbCAgIGVsaW1pbmF0ZVRo aXNQYXJ0aWNsZSwgcmVzZXRFbmVyZ2llcywgY29uc3RhbnRDcm9zc1NlY3Rpb247CiAgICAKICAg IEc0ZG91YmxlIGZvcndhcmRLaW5ldGljID0gMC4wLCBiYWNrd2FyZEtpbmV0aWMgPSAwLjA7CiAg ICAvLwogICAgLy8gcHJvY2VzcyB0aGUgc2Vjb25kYXJ5IHBhcnRpY2xlcyBpbiByZXZlcnNlIG9y ZGVyCiAgICAvLyB0aGUgaW5jaWRlbnQgcGFydGljbGUgaXMgRG9uZSBhZnRlciB0aGUgc2Vjb25k YXJpZXMKICAgIC8vIG51Y2xlb25zLCBpbmNsdWRpbmcgdGhlIHRhcmdldCwgaW4gdGhlIGJhY2t3 YXJkIGhlbWlzcGhlcmUgYXJlIGFsc28gRG9uZSBsYXRlcgogICAgLy8KICAgIEc0ZG91YmxlIGJp bmxbMjBdID0gezAuLDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45LDEuMCwxLjEx LDEuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAxLjQzLDEuNjcsMi4wLDIuNSwzLjMzLDUu MDAsMTAuMDB9OwogICAgRzRpbnQgYmFja3dhcmROdWNsZW9uQ291bnQgPSAwOyAgICAgICAvLyBu dW1iZXIgb2YgbnVjbGVvbnMgaW4gYmFja3dhcmQgaGVtaXNwaGVyZQogICAgRzRkb3VibGUgdG90 YWxFbmVyZ3ksIGtpbmV0aWNFbmVyZ3ksIHZlY01hc3M7CgogICAgZm9yKCBpPSh2ZWNMZW4tMSk7 IGk+PTA7IC0taSApCiAgICB7CiAgICAgIEc0ZG91YmxlIHBoaSA9IEc0VW5pZm9ybVJhbmQoKSp0 d29waTsKICAgICAgaWYoIHZlY1tpXS0+R2V0TmV3bHlBZGRlZCgpICkgICAgICAgICAgIC8vIGFk ZGVkIGZyb20gaW50cmFudWNsZWFyIGNhc2NhZGUKICAgICAgewogICAgICAgIGlmKCB2ZWNbaV0t PkdldFNpZGUoKSA9PSAtMiApICAgICAgICAgLy8gIGlzIGEgbnVjbGVvbgogICAgICAgIHsKICAg ICAgICAgIGlmKCBiYWNrd2FyZE51Y2xlb25Db3VudCA8IDE4ICkKICAgICAgICAgIHsKICAgICAg ICAgICAgaWYoIHZlY1tpXS0+R2V0RGVmaW5pdGlvbigpID09IEc0UGlvbk1pbnVzOjpQaW9uTWlu dXMoKSB8fAogICAgICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gRzRQaW9u UGx1czo6UGlvblBsdXMoKSB8fAogICAgICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9u KCkgPT0gRzRQaW9uWmVybzo6UGlvblplcm8oKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICBHNEV4Y2VwdGlvbigiRzRSZWFjdGlvbkR5bmFtaWNzOjpHZW5lcmF0ZVhhbmRQdCA6IGEgcGlv biBoYXMgYmVlbiBjb3VudGVkIGFzIGEgYmFja3dhcmQgbnVjbGVvbiIpOwogICAgICAgICAgICB9 CiAgICAgICAgICAgIHZlY1tpXS0+U2V0U2lkZSggLTMgKTsKICAgICAgICAgICAgKytiYWNrd2Fy ZE51Y2xlb25Db3VudDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICAgIC8vCiAgICAgIC8vICBzZXQgcHQgYW5kIHBoaSB2YWx1ZXMsIHRoZXkg YXJlIGNoYW5nZWQgc29tZXdoYXQgaW4gdGhlIGl0ZXJhdGlvbiBsb29wCiAgICAgIC8vICBzZXQg bWFzcyBwYXJhbWV0ZXIgZm9yIGxhbWJkYSBmcmFnbWVudGF0aW9uIG1vZGVsCiAgICAgIC8vCiAg ICAgIHZlY01hc3MgPSB2ZWNbaV0tPkdldE1hc3MoKS9HZVY7CiAgICAgIEc0ZG91YmxlIHJhbiA9 IC1sb2coMS4wLUc0VW5pZm9ybVJhbmQoKSkvMy41OwogICAgICBpZiggdmVjW2ldLT5HZXRTaWRl KCkgPT0gLTIgKSAgIC8vIGJhY2t3YXJkIG51Y2xlb24KICAgICAgewogICAgICAgIGlmKCB2ZWNb aV0tPkdldERlZmluaXRpb24oKSA9PSBhS2Fvbk1pbnVzIHx8CiAgICAgICAgICAgIHZlY1tpXS0+ R2V0RGVmaW5pdGlvbigpID09IGFLYW9uWmVyb0wgfHwKICAgICAgICAgICAgdmVjW2ldLT5HZXRE ZWZpbml0aW9uKCkgPT0gYUthb25aZXJvUyB8fAogICAgICAgICAgICB2ZWNbaV0tPkdldERlZmlu aXRpb24oKSA9PSBhS2FvblBsdXMgfHwKICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9u KCkgPT0gYVBpTWludXMgfHwKICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0g YVBpWmVybyB8fAogICAgICAgICAgICB2ZWNbaV0tPkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVz ICkKICAgICAgICB7CiAgICAgICAgICBhc3BhciA9IDAuNzU7CiAgICAgICAgICBwdCA9IHNxcnQo IHBvdyggcmFuLCAxLjcgKSApOwogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAg ICAgICAvLyB2ZWNbaV0gbXVzdCBiZSBhIHByb3RvbiwgbmV1dHJvbiwKICAgICAgICAgIGFzcGFy ID0gMC4yMDsgICAgICAgICAgICAgICAgICAgLy8gIGxhbWJkYSwgc2lnbWEsIHhzaSwgb3IgaW9u CiAgICAgICAgICBwdCA9IHNxcnQoIHBvdyggcmFuLCAxLjIgKSApOwogICAgICAgIH0KICAgICAg fSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGJhY2t3YXJkIG51Y2xl b24KICAgICAgICBpZiggdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYVBpTWludXMgfHwKICAg ICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYVBpWmVybyB8fAogICAgICAgICAg ICB2ZWNbaV0tPkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVzICkKICAgICAgICB7CiAgICAgICAg ICBhc3BhciA9IDAuNzU7CiAgICAgICAgICBwdCA9IHNxcnQoIHBvdyggcmFuLCAxLjcgKSApOwog ICAgICAgIH0gZWxzZSBpZiggdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYUthb25NaW51cyB8 fAogICAgICAgICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYUthb25aZXJv TCB8fAogICAgICAgICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYUthb25a ZXJvUyB8fAogICAgICAgICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYUth b25QbHVzICkKICAgICAgICB7CiAgICAgICAgICBhc3BhciA9IDAuNzA7CiAgICAgICAgICBwdCA9 IHNxcnQoIHBvdyggcmFuLCAxLjcgKSApOwogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAg ICAgICAgICAgLy8gdmVjW2ldIG11c3QgYmUgYSBwcm90b24sIG5ldXRyb24sIAogICAgICAgICAg YXNwYXIgPSAwLjY1OyAgICAgICAgICAgICAgICAgLy8gIGxhbWJkYSwgc2lnbWEsIHhzaSwgb3Ig aW9uCiAgICAgICAgICBwdCA9IHNxcnQoIHBvdyggcmFuLCAxLjUgKSApOwogICAgICAgIH0KICAg ICAgfQogICAgICBwdCA9IEc0c3RkOjptYXgoIDAuMDAxLCBwdCApOwogICAgICB2ZWNbaV0tPlNl dE1vbWVudHVtKCBwdCpjb3MocGhpKSpHZVYsIHB0KnNpbihwaGkpKkdlViApOwogICAgICBmb3Io IEc0aW50IGo9MDsgajwyMDsgKytqICliaW5sW2pdID0gai8oMTkuKnB0KTsKICAgICAgaWYoIHZl Y1tpXS0+R2V0U2lkZSgpID4gMCApCiAgICAgICAgZXQgPSBwc2V1ZG9QYXJ0aWNsZVswXS5HZXRU b3RhbEVuZXJneSgpL0dlVjsKICAgICAgZWxzZQogICAgICAgIGV0ID0gcHNldWRvUGFydGljbGVb MV0uR2V0VG90YWxFbmVyZ3koKS9HZVY7CiAgICAgIGRuZGxbMF0gPSAwLjA7CiAgICAgIC8vCiAg ICAgIC8vICAgc3RhcnQgb2Ygb3V0ZXIgaXRlcmF0aW9uIGxvb3AKICAgICAgLy8KICAgICAgb3V0 ZXJDb3VudGVyID0gMDsKICAgICAgZWxpbWluYXRlVGhpc1BhcnRpY2xlID0gdHJ1ZTsKICAgICAg cmVzZXRFbmVyZ2llcyA9IHRydWU7CiAgICAgIHdoaWxlKCArK291dGVyQ291bnRlciA8IDMgKQog ICAgICB7CiAgICAgICAgZm9yKCBsPTE7IGw8MjA7ICsrbCApCiAgICAgICAgewogICAgICAgICAg eCA9IChiaW5sW2xdK2JpbmxbbC0xXSkvMi47CiAgICAgICAgICBwdCA9IEc0c3RkOjptYXgoIDAu MDAxLCBwdCApOwogICAgICAgICAgaWYoIHggPiAxLjAvcHQgKQogICAgICAgICAgICBkbmRsW2xd ICs9IGRuZGxbbC0xXTsgICAvLyAgY2hhbmdlZCBmcm9tIGp1c3QgID0gIG9uIDAyIEFwcmlsIDk4 CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGRuZGxbbF0gPSBldCAqIGFzcGFyL3NxcnQoIHBv dygoMS4rYXNwYXIqeCphc3Bhcip4KSwzKSApCiAgICAgICAgICAgICAgKiAoYmlubFtsXS1iaW5s W2wtMV0pIC8gc3FydCggcHQqeCpldCpwdCp4KmV0ICsgcHQqcHQgKyB2ZWNNYXNzKnZlY01hc3Mg KQogICAgICAgICAgICAgICsgZG5kbFtsLTFdOwogICAgICAgIH0KICAgICAgICBpbm5lckNvdW50 ZXIgPSAwOwogICAgICAgIC8vIGJ1ZzogcmVzZXQgdGhlIHgseSBjb21wb25lbnRzIG9mIHRoZSBt b21lbnR1bSwgcGxlYXNlLiBAQEBAQEBACiAgICAgICAgdmVjW2ldLT5TZXRNb21lbnR1bSggcHQq Y29zKHBoaSkqR2VWLCBwdCpzaW4ocGhpKSpHZVYgKTsKICAgICAgICAvLwogICAgICAgIC8vICAg c3RhcnQgb2YgaW5uZXIgaXRlcmF0aW9uIGxvb3AKICAgICAgICAvLwogICAgICAgIHdoaWxlKCAr K2lubmVyQ291bnRlciA8IDcgKQogICAgICAgIHsKICAgICAgICAgIHJhbiA9IEc0VW5pZm9ybVJh bmQoKSpkbmRsWzE5XTsKICAgICAgICAgIGwgPSAxOwogICAgICAgICAgd2hpbGUoICggcmFuID49 IGRuZGxbbF0gKSAmJiAoIGwgPCAyMCApIClsKys7CiAgICAgICAgICBsID0gRzRzdGQ6Om1pbigg MTksIGwgKTsKICAgICAgICAgIHggPSBHNHN0ZDo6bWluKCAxLjAsIHB0KihiaW5sW2wtMV0gKyBH NFVuaWZvcm1SYW5kKCkqKGJpbmxbbF0tYmlubFtsLTFdKS8yLikgKTsKICAgICAgICAgIGlmKCB2 ZWNbaV0tPkdldFNpZGUoKSA8IDAgKXggKj0gLTEuOwogICAgICAgICAgdmVjW2ldLT5TZXRNb21l bnR1bSggeCpldCpHZVYgKTsgICAgICAgICAgICAgIC8vIHNldCB0aGUgei1tb21lbnR1bQogICAg ICAgICAgdG90YWxFbmVyZ3kgPSBzcXJ0KCB4KmV0KngqZXQgKyBwdCpwdCArIHZlY01hc3MqdmVj TWFzcyApOwogICAgICAgICAgdmVjW2ldLT5TZXRUb3RhbEVuZXJneSggdG90YWxFbmVyZ3kqR2VW ICk7CiAgICAgICAgICBraW5ldGljRW5lcmd5ID0gdmVjW2ldLT5HZXRLaW5ldGljRW5lcmd5KCkv R2VWOwogICAgICAgICAgaWYoIHZlY1tpXS0+R2V0U2lkZSgpID4gMCApICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC8vIGZvcndhcmQgc2lkZQogICAgICAgICAgewogICAgICAgICAgICBpZigg KGZvcndhcmRLaW5ldGljK2tpbmV0aWNFbmVyZ3kpIDwgMC45NSpmb3J3YXJkRW5lcmd5ICkKICAg ICAgICAgICAgewogICAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xlWzRdID0gcHNldWRvUGFydGlj bGVbNF0gKyAoKnZlY1tpXSk7CiAgICAgICAgICAgICAgZm9yd2FyZEtpbmV0aWMgKz0ga2luZXRp Y0VuZXJneTsKICAgICAgICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs2XSA9IHBzZXVkb1BhcnRpY2xl WzRdICsgcHNldWRvUGFydGljbGVbNV07CiAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVbNl0u U2V0TW9tZW50dW0oIDAuMCApOyAgICAgICAgICAgLy8gc2V0IHRoZSB6LW1vbWVudHVtCiAgICAg ICAgICAgICAgcGhpID0gcHNldWRvUGFydGljbGVbNl0uQW5nbGUoIHBzZXVkb1BhcnRpY2xlWzhd ICk7CiAgICAgICAgICAgICAgaWYoIHBzZXVkb1BhcnRpY2xlWzZdLkdldE1vbWVudHVtKCkueSgp L01lViA8IDAuMCApcGhpID0gdHdvcGkgLSBwaGk7CiAgICAgICAgICAgICAgcGhpICs9IHBpICsg bm9ybWFsKCkqcGkvMTIuMDsKICAgICAgICAgICAgICBpZiggcGhpID4gdHdvcGkgKXBoaSAtPSB0 d29waTsKICAgICAgICAgICAgICBpZiggcGhpIDwgMC4wIClwaGkgPSB0d29waSAtIHBoaTsKICAg ICAgICAgICAgICBvdXRlckNvdW50ZXIgPSAyOyAgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZl IG91dGVyIGxvb3AKICAgICAgICAgICAgICBlbGltaW5hdGVUaGlzUGFydGljbGUgPSBmYWxzZTsg ICAgICAgIC8vIGRvbid0IGVsaW1pbmF0ZSB0aGlzIHBhcnRpY2xlCiAgICAgICAgICAgICAgcmVz ZXRFbmVyZ2llcyA9IGZhbHNlOwogICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLy8gbGVhdmUgaW5uZXIgbG9vcAogICAgICAgICAgICB9CiAgICAgICAg ICAgIGlmKCBpbm5lckNvdW50ZXIgPiA1IClicmVhazsgICAgICAgICAgIC8vIGxlYXZlIGlubmVy IGxvb3AKICAgICAgICAgICAgaWYoIGJhY2t3YXJkRW5lcmd5ID49IHZlY01hc3MgKSAgLy8gc3dp dGNoIHNpZGVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2ZWNbaV0tPlNldFNpZGUoIC0x ICk7CiAgICAgICAgICAgICAgZm9yd2FyZEVuZXJneSArPSB2ZWNNYXNzOwogICAgICAgICAgICAg IGJhY2t3YXJkRW5lcmd5IC09IHZlY01hc3M7CiAgICAgICAgICAgICAgKytiYWNrd2FyZENvdW50 OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBzaWRlCiAgICAgICAgICAgaWYo IGV4dHJhTnVjbGVvbkNvdW50ID4gMTkgKSAgIC8vIGNvbW1lbnRlZCBvdXQgdG8gZHVwbGljYXRl ID9idWc/IGluIEdFTlhQVAogICAgICAgICAgICAgeCA9IDAuOTk5OwogICAgICAgICAgIEc0ZG91 YmxlIHh4eCA9IDAuOTUrMC4wNSpleHRyYU51Y2xlb25Db3VudC8yMC4wOwogICAgICAgICAgIGlm KCAoYmFja3dhcmRLaW5ldGljK2tpbmV0aWNFbmVyZ3kpIDwgeHh4KmJhY2t3YXJkRW5lcmd5ICkK ICAgICAgICAgICAgewogICAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xlWzVdID0gcHNldWRvUGFy dGljbGVbNV0gKyAoKnZlY1tpXSk7CiAgICAgICAgICAgICAgYmFja3dhcmRLaW5ldGljICs9IGtp bmV0aWNFbmVyZ3k7CiAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVbNl0gPSBwc2V1ZG9QYXJ0 aWNsZVs0XSArIHBzZXVkb1BhcnRpY2xlWzVdOwogICAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xl WzZdLlNldE1vbWVudHVtKCAwLjAgKTsgICAgICAgICAgIC8vIHNldCB0aGUgei1tb21lbnR1bQog ICAgICAgICAgICAgIHBoaSA9IHBzZXVkb1BhcnRpY2xlWzZdLkFuZ2xlKCBwc2V1ZG9QYXJ0aWNs ZVs4XSApOwogICAgICAgICAgICAgIGlmKCBwc2V1ZG9QYXJ0aWNsZVs2XS5HZXRNb21lbnR1bSgp LnkoKS9NZVYgPCAwLjAgKXBoaSA9IHR3b3BpIC0gcGhpOwogICAgICAgICAgICAgIHBoaSArPSBw aSArIG5vcm1hbCgpICogcGkgLyAxMi4wOwogICAgICAgICAgICAgIGlmKCBwaGkgPiB0d29waSAp cGhpIC09IHR3b3BpOwogICAgICAgICAgICAgIGlmKCBwaGkgPCAwLjAgKXBoaSA9IHR3b3BpIC0g cGhpOwogICAgICAgICAgICAgIG91dGVyQ291bnRlciA9IDI7ICAgICAgICAgICAgICAgICAgICAv LyBsZWF2ZSBvdXRlciBsb29wCiAgICAgICAgICAgICAgZWxpbWluYXRlVGhpc1BhcnRpY2xlID0g ZmFsc2U7ICAgICAgIC8vIGRvbid0IGVsaW1pbmF0ZSB0aGlzIHBhcnRpY2xlCiAgICAgICAgICAg ICAgcmVzZXRFbmVyZ2llcyA9IGZhbHNlOwogICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpbm5lciBsb29wCiAgICAgICAgICAgIH0KICAg ICAgICAgICAgaWYoIGlubmVyQ291bnRlciA+IDUgKWJyZWFrOyAgICAgICAgICAgLy8gbGVhdmUg aW5uZXIgbG9vcAogICAgICAgICAgICBpZiggZm9yd2FyZEVuZXJneSA+PSB2ZWNNYXNzICkgIC8v IHN3aXRjaCBzaWRlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmVjW2ldLT5TZXRTaWRl KCAxICk7CiAgICAgICAgICAgICAgZm9yd2FyZEVuZXJneSAtPSB2ZWNNYXNzOwogICAgICAgICAg ICAgIGJhY2t3YXJkRW5lcmd5ICs9IHZlY01hc3M7CiAgICAgICAgICAgICAgYmFja3dhcmRDb3Vu dC0tOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBHNFRocmVlVmVjdG9yIG1v bWVudHVtID0gdmVjW2ldLT5HZXRNb21lbnR1bSgpOwogICAgICAgICAgdmVjW2ldLT5TZXRNb21l bnR1bSggbW9tZW50dW0ueCgpICogMC45LCBtb21lbnR1bS55KCkgKiAwLjkgKTsKICAgICAgICAg IHB0ICo9IDAuOTsKICAgICAgICAgIGRuZGxbMTldICo9IDAuOTsKICAgICAgICB9ICAgICAgICAg ICAgICAgICAgICAgICAvLyBjbG9zZXMgaW5uZXIgbG9vcAogICAgICAgIGlmKCByZXNldEVuZXJn aWVzICkKICAgICAgICB7CiAgICAgICAgICAvLyAgIGlmIHdlIGdldCB0byBoZXJlLCB0aGUgaW5u ZXIgbG9vcCBoYXMgYmVlbiBEb25lIDYgVGltZXMKICAgICAgICAgIC8vICAgcmVzZXQgdGhlIGtp bmV0aWMgZW5lcmdpZXMgb2YgcHJldmlvdXNseSBEb25lIHBhcnRpY2xlcywgaWYgdGhleSBhcmUg bGlnaHRlcgogICAgICAgICAgLy8gICAgdGhhbiBwcm90b25zIGFuZCBpbiB0aGUgZm9yd2FyZCBo ZW1pc3BoZXJlCiAgICAgICAgICAvLyAgIHRoZW4gY29udGludWUgd2l0aCBvdXRlciBsb29wCiAg ICAgICAgICAvLwogICAgICAgICAgZm9yd2FyZEtpbmV0aWMgPSAwLjA7CiAgICAgICAgICBiYWNr d2FyZEtpbmV0aWMgPSAwLjA7CiAgICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5TZXRaZXJvKCk7 CiAgICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs1XS5TZXRaZXJvKCk7CiAgICAgICAgICBmb3IoIGw9 aSsxOyBsPHZlY0xlbjsgKytsICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYoIHZlY1tsXS0+ R2V0U2lkZSgpID4gMCB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkg PT0gYUthb25NaW51cyB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkg PT0gYUthb25aZXJvTCB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkg PT0gYUthb25aZXJvUyB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkg PT0gYUthb25QbHVzIHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9 PSBhUGlNaW51cyB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkgPT0g YVBpWmVybyB8fAogICAgICAgICAgICAgICAgdmVjW2xdLT5HZXREZWZpbml0aW9uKCkgPT0gYVBp UGx1cyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBHNGRvdWJsZSB0ZW1wTWFzcyA9IHZl Y1tsXS0+R2V0TWFzcygpL01lVjsKICAgICAgICAgICAgICB0b3RhbEVuZXJneSA9IDAuOTUqdmVj W2xdLT5HZXRUb3RhbEVuZXJneSgpL01lViArIDAuMDUqdGVtcE1hc3M7CiAgICAgICAgICAgICAg dG90YWxFbmVyZ3kgPSBHNHN0ZDo6bWF4KCB0ZW1wTWFzcywgdG90YWxFbmVyZ3kgKTsKICAgICAg ICAgICAgICB2ZWNbbF0tPlNldFRvdGFsRW5lcmd5KCB0b3RhbEVuZXJneSpNZVYgKTsKICAgICAg ICAgICAgICBwcCA9IHNxcnQoIGFicyggdG90YWxFbmVyZ3kqdG90YWxFbmVyZ3kgLSB0ZW1wTWFz cyp0ZW1wTWFzcyApICk7CiAgICAgICAgICAgICAgcHAxID0gdmVjW2xdLT5HZXRNb21lbnR1bSgp Lm1hZygpL01lVjsKICAgICAgICAgICAgICBpZiggcHAxIDwgMS4wZS02KkdlViApCiAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgRzRkb3VibGUgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFu ZCgpOwogICAgICAgICAgICAgICAgRzRkb3VibGUgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3JtUmFu ZCgpOwogICAgICAgICAgICAgICAgRzRkb3VibGUgc3J0aCA9IHNpbihydGhudmUpOwogICAgICAg ICAgICAgICAgdmVjW2xdLT5TZXRNb21lbnR1bSggcHAqc3J0aCpjb3MocGhpbnZlKSpNZVYsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpzcnRoKnNpbihwaGludmUpKk1l ViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1l ViApIDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmVjW2xdLT5TZXRN b21lbnR1bSggdmVjW2xdLT5HZXRNb21lbnR1bSgpICogKHBwL3BwMSkgKTsKICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgRzRkb3VibGUgcHggPSB2ZWNbbF0tPkdldE1vbWVudHVtKCkueCgp L01lVjsKICAgICAgICAgICAgICBHNGRvdWJsZSBweSA9IHZlY1tsXS0+R2V0TW9tZW50dW0oKS55 KCkvTWVWOwogICAgICAgICAgICAgIHB0ID0gRzRzdGQ6Om1heCggMS4wLCBzcXJ0KCBweCpweCAr IHB5KnB5ICkgKS9HZVY7CiAgICAgICAgICAgICAgaWYoIHZlY1tsXS0+R2V0U2lkZSgpID4gMCAp CiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yd2FyZEtpbmV0aWMgKz0gdmVjW2xd LT5HZXRLaW5ldGljRW5lcmd5KCkvR2VWOwogICAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVb NF0gPSBwc2V1ZG9QYXJ0aWNsZVs0XSArICgqdmVjW2xdKTsKICAgICAgICAgICAgICB9IGVsc2Ug ewogICAgICAgICAgICAgICAgYmFja3dhcmRLaW5ldGljICs9IHZlY1tsXS0+R2V0S2luZXRpY0Vu ZXJneSgpL0dlVjsKICAgICAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xlWzVdID0gcHNldWRvUGFy dGljbGVbNV0gKyAoKnZlY1tsXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAg ICAgICB9CiAgICAgICAgfQogICAgICB9ICAgIC8vIGNsb3NlcyBvdXRlciBsb29wCiAgICAgICAg ICAgICAgCiAgICAgIGlmKCBlbGltaW5hdGVUaGlzUGFydGljbGUgKSAgLy8gbm90IGVub3VnaCBl bmVyZ3ksIGVsaW1pbmF0ZSB0aGlzIHBhcnRpY2xlCiAgICAgIHsKICAgICAgICBpZiggdmVjW2ld LT5HZXRTaWRlKCkgPiAwICkKICAgICAgICB7CiAgICAgICAgICAtLWZvcndhcmRDb3VudDsKICAg ICAgICAgIGZvcndhcmRFbmVyZ3kgKz0gdmVjTWFzczsKICAgICAgICB9IGVsc2UgewogICAgICAg ICAgaWYoIHZlY1tpXS0+R2V0U2lkZSgpID09IC0yICkKICAgICAgICAgIHsKICAgICAgICAgICAg LS1leHRyYU51Y2xlb25Db3VudDsKICAgICAgICAgICAgZXh0cmFOdWNsZW9uTWFzcyAtPSB2ZWNN YXNzOwogICAgICAgICAgfQogICAgICAgICAgLS1iYWNrd2FyZENvdW50OwogICAgICAgICAgYmFj a3dhcmRFbmVyZ3kgKz0gdmVjTWFzczsKICAgICAgICB9CiAgICAgICAgZm9yKCBHNGludCBqPWk7 IGo8KHZlY0xlbi0xKTsgKytqICkqdmVjW2pdID0gKnZlY1tqKzFdOyAgICAvLyBzaGlmdCB1cAog ICAgICAgIEc0UmVhY3Rpb25Qcm9kdWN0ICp0ZW1wID0gdmVjW3ZlY0xlbi0xXTsKICAgICAgICBk ZWxldGUgdGVtcDsKICAgICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFt ZSh2ZWMsIHZlY0xlbik7CiAgICAgICAgaWYoIC0tdmVjTGVuID09IDAgKXJldHVybiBmYWxzZTsg IC8vIGFsbCB0aGUgc2Vjb25kYXJpZXMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQKICAgICAgICBwc2V1 ZG9QYXJ0aWNsZVs2XSA9IHBzZXVkb1BhcnRpY2xlWzRdICsgcHNldWRvUGFydGljbGVbNV07CiAg ICAgICAgcHNldWRvUGFydGljbGVbNl0uU2V0TW9tZW50dW0oIDAuMCApOyAgICAgICAgICAgICAg ICAgLy8gc2V0IHotbW9tZW50dW0KICAgICAgICBwaGkgPSBwc2V1ZG9QYXJ0aWNsZVs2XS5Bbmds ZSggcHNldWRvUGFydGljbGVbOF0gKTsKICAgICAgICBpZiggcHNldWRvUGFydGljbGVbNl0uR2V0 TW9tZW50dW0oKS55KCkvTWVWIDwgMC4wIClwaGkgPSB0d29waSAtIHBoaTsKICAgICAgICBwaGkg Kz0gcGkgKyBub3JtYWwoKSAqIHBpIC8gMTIuMDsKICAgICAgICBpZiggcGhpID4gdHdvcGkgKXBo aSAtPSB0d29waTsKICAgICAgICBpZiggcGhpIDwgMC4wIClwaGkgPSB0d29waSAtIHBoaTsKICAg ICAgfQogICAgfSAgIC8vIGNsb3NlcyBtYWluIGZvciBsb29wCgogICAgLy8KICAgIC8vICBmb3Ig dGhlIGluY2lkZW50IHBhcnRpY2xlOiAgaXQgd2FzIHBsYWNlZCBpbiB0aGUgZm9yd2FyZCBoZW1p c3BoZXJlCiAgICAvLyAgIHNldCBwdCBhbmQgcGhpIHZhbHVlcywgdGhleSBhcmUgY2hhbmdlZCBz b21ld2hhdCBpbiB0aGUgaXRlcmF0aW9uIGxvb3AKICAgIC8vICAgc2V0IG1hc3MgcGFyYW1ldGVy IGZvciBsYW1iZGEgZnJhZ21lbnRhdGlvbiBtb2RlbAogICAgLy8KICAgIEc0ZG91YmxlIHBoaSA9 IEc0VW5pZm9ybVJhbmQoKSp0d29waTsKICAgIEc0ZG91YmxlIHJhbiA9IC1sb2coMS4wLUc0VW5p Zm9ybVJhbmQoKSk7CiAgICBpZiggY3VycmVudFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBh UGlNaW51cyB8fAogICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBp WmVybyB8fAogICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBpUGx1 cyApCiAgICB7CiAgICAgIGFzcGFyID0gMC42MDsKICAgICAgcHQgPSBzcXJ0KCBwb3coIHJhbi82 LjAsIDEuNyApICk7CiAgICB9IGVsc2UgaWYoIGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9u KCkgPT0gYUthb25NaW51cyB8fAogICAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUuR2V0RGVm aW5pdGlvbigpID09IGFLYW9uWmVyb0wgfHwKICAgICAgICAgICAgICAgY3VycmVudFBhcnRpY2xl LkdldERlZmluaXRpb24oKSA9PSBhS2Fvblplcm9TIHx8CiAgICAgICAgICAgICAgIGN1cnJlbnRQ YXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25QbHVzICkKICAgIHsKICAgICAgYXNwYXIg PSAwLjUwOwogICAgICBwdCA9IHNxcnQoIHBvdyggcmFuLzUuMCwgMS40ICkgKTsKICAgIH0gZWxz ZSB7CiAgICAgIGFzcGFyID0gMC40MDsKICAgICAgcHQgPSBzcXJ0KCBwb3coIHJhbi80LjAsIDEu MiApICk7CiAgICB9CiAgICBmb3IoIEc0aW50IGo9MDsgajwyMDsgKytqICliaW5sW2pdID0gai8o MTkuKnB0KTsKICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggcHQqY29zKHBoaSkqR2VW LCBwdCpzaW4ocGhpKSpHZVYgKTsKICAgIGV0ID0gcHNldWRvUGFydGljbGVbMF0uR2V0VG90YWxF bmVyZ3koKS9HZVY7CiAgICBkbmRsWzBdID0gMC4wOwogICAgdmVjTWFzcyA9IGN1cnJlbnRQYXJ0 aWNsZS5HZXRNYXNzKCkvR2VWOwogICAgZm9yKCBsPTE7IGw8MjA7ICsrbCApCiAgICB7CiAgICAg IHggPSAoYmlubFtsXStiaW5sW2wtMV0pLzIuOwogICAgICBpZiggeCA+IDEuMC9wdCApCiAgICAg ICAgZG5kbFtsXSArPSBkbmRsW2wtMV07ICAgLy8gIGNoYW5nZWQgZnJvbSBqdXN0ICA9ICAgb24g MDIgQXByaWwgOTgKICAgICAgZWxzZQogICAgICAgIGRuZGxbbF0gPSBhc3Bhci9zcXJ0KCBwb3co KDEuK3Nxcihhc3Bhcip4KSksMykgKSAqCiAgICAgICAgICAoYmlubFtsXS1iaW5sW2wtMV0pICog ZXQgLyBzcXJ0KCBwdCp4KmV0KnB0KngqZXQgKyBwdCpwdCArIHZlY01hc3MqdmVjTWFzcyApICsK ICAgICAgICAgIGRuZGxbbC0xXTsKICAgIH0KICAgIHJhbiA9IEc0VW5pZm9ybVJhbmQoKSpkbmRs WzE5XTsKICAgIGwgPSAxOwogICAgd2hpbGUoIChyYW4+ZG5kbFtsXSkgJiYgKGw8MjApIClsKys7 CiAgICBsID0gRzRzdGQ6Om1pbiggMTksIGwgKTsKICAgIHggPSBHNHN0ZDo6bWluKCAxLjAsIHB0 KihiaW5sW2wtMV0gKyBHNFVuaWZvcm1SYW5kKCkqKGJpbmxbbF0tYmlubFtsLTFdKS8yLikgKTsg ICAKICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggeCpldCpHZVYgKTsgICAgICAgICAg ICAgICAgIC8vIHNldCB0aGUgei1tb21lbnR1bQogICAgaWYoIGZvcndhcmRFbmVyZ3kgPCBmb3J3 YXJkS2luZXRpYyApCiAgICAgIHRvdGFsRW5lcmd5ID0gdmVjTWFzcyArIDAuMDQqZmFicyhub3Jt YWwoKSk7CiAgICBlbHNlCiAgICAgIHRvdGFsRW5lcmd5ID0gdmVjTWFzcyArIGZvcndhcmRFbmVy Z3kgLSBmb3J3YXJkS2luZXRpYzsKICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRUb3RhbEVuZXJneSgg dG90YWxFbmVyZ3kqR2VWICk7CiAgICBwcCA9IHNxcnQoIGFicyggdG90YWxFbmVyZ3kqdG90YWxF bmVyZ3kgLSB2ZWNNYXNzKnZlY01hc3MgKSApKkdlVjsKICAgIHBwMSA9IGN1cnJlbnRQYXJ0aWNs ZS5HZXRNb21lbnR1bSgpLm1hZygpL01lVjsKICAgIGlmKCBwcDEgPCAxLjBlLTYqR2VWICkKICAg IHsKICAgICAgRzRkb3VibGUgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICBHNGRv dWJsZSBwaGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgIEc0ZG91YmxlIHNydGgg PSBzaW4ocnRobnZlKTsKICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBwcCpzcnRo KmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpz cnRoKnNpbihwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw cCpjb3MocnRobnZlKSpNZVYgKTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5T ZXRNb21lbnR1bSggY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocHAvcHAxKSApOwog ICAgfQogICAgcHNldWRvUGFydGljbGVbNF0gPSBwc2V1ZG9QYXJ0aWNsZVs0XSArIGN1cnJlbnRQ YXJ0aWNsZTsKICAgIC8vCiAgICAvLyB0aGlzIGZpbmlzaGVzIHRoZSBjdXJyZW50IHBhcnRpY2xl CiAgICAvLyBub3cgZm9yIHRoZSB0YXJnZXQgcGFydGljbGUKICAgIC8vCiAgICBpZiggYmFja3dh cmROdWNsZW9uQ291bnQgPCAxOCApCiAgICB7CiAgICAgIHRhcmdldFBhcnRpY2xlLlNldFNpZGUo IC0zICk7CiAgICAgICsrYmFja3dhcmROdWNsZW9uQ291bnQ7CiAgICB9CiAgICBlbHNlCiAgICB7 CiAgICAgIC8vICBzZXQgcHQgYW5kIHBoaSB2YWx1ZXMsIHRoZXkgYXJlIGNoYW5nZWQgc29tZXdo YXQgaW4gdGhlIGl0ZXJhdGlvbiBsb29wCiAgICAgIC8vICBzZXQgbWFzcyBwYXJhbWV0ZXIgZm9y IGxhbWJkYSBmcmFnbWVudGF0aW9uIG1vZGVsCiAgICAgIC8vCiAgICAgIHZlY01hc3MgPSB0YXJn ZXRQYXJ0aWNsZS5HZXRNYXNzKCkvR2VWOwogICAgICByYW4gPSAtbG9nKDEuMC1HNFVuaWZvcm1S YW5kKCkpOwogICAgICBhc3BhciA9IDAuNDA7CiAgICAgIHB0ID0gRzRzdGQ6Om1heCggMC4wMDEs IHNxcnQoIHBvdyggcmFuLzQuMCwgMS4yICkgKSApOwogICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRN b21lbnR1bSggcHQqY29zKHBoaSkqR2VWLCBwdCpzaW4ocGhpKSpHZVYgKTsKICAgICAgZm9yKCBH NGludCBqPTA7IGo8MjA7ICsraiApYmlubFtqXSA9IChqLTEuKS8oMTkuKnB0KTsKICAgICAgZXQg PSBwc2V1ZG9QYXJ0aWNsZVsxXS5HZXRUb3RhbEVuZXJneSgpL0dlVjsKICAgICAgZG5kbFswXSA9 IDAuMDsKICAgICAgb3V0ZXJDb3VudGVyID0gMDsKICAgICAgZWxpbWluYXRlVGhpc1BhcnRpY2xl ID0gdHJ1ZTsgICAgIC8vIHNob3VsZCBuZXZlciBlbGltaW5hdGUgdGhlIHRhcmdldCBwYXJ0aWNs ZQogICAgICByZXNldEVuZXJnaWVzID0gdHJ1ZTsKICAgICAgd2hpbGUoICsrb3V0ZXJDb3VudGVy IDwgMyApICAgICAvLyBzdGFydCBvZiBvdXRlciBpdGVyYXRpb24gbG9vcAogICAgICB7CiAgICAg ICAgZm9yKCBsPTE7IGw8MjA7ICsrbCApCiAgICAgICAgewogICAgICAgICAgeCA9IChiaW5sW2xd K2JpbmxbbC0xXSkvMi47CiAgICAgICAgICBpZiggeCA+IDEuMC9wdCApCiAgICAgICAgICAgIGRu ZGxbbF0gKz0gZG5kbFtsLTFdOyAgIC8vIGNoYW5nZWQgZnJvbSBqdXN0ICA9ICBvbiAwMiBBcHJp bCA5OAogICAgICAgICAgZWxzZQogICAgICAgICAgICBkbmRsW2xdID0gYXNwYXIvc3FydCggcG93 KCgxLithc3Bhcip4KmFzcGFyKngpLDMpICkgKgogICAgICAgICAgICAgIChiaW5sW2xdLWJpbmxb bC0xXSkqZXQgLyBzcXJ0KCBwdCp4KmV0KnB0KngqZXQrcHQqcHQrdmVjTWFzcyp2ZWNNYXNzICkg KwogICAgICAgICAgICAgIGRuZGxbbC0xXTsKICAgICAgICB9CiAgICAgICAgaW5uZXJDb3VudGVy ID0gMDsKICAgICAgICB3aGlsZSggKytpbm5lckNvdW50ZXIgPCA3ICkgICAgLy8gc3RhcnQgb2Yg aW5uZXIgaXRlcmF0aW9uIGxvb3AKICAgICAgICB7CiAgICAgICAgICBsID0gMTsKICAgICAgICAg IHJhbiA9IEc0VW5pZm9ybVJhbmQoKSpkbmRsWzE5XTsKICAgICAgICAgIHdoaWxlKCAoIHJhbiA+ PSBkbmRsW2xdICkgJiYgKCBsIDwgMjAgKSApbCsrOwogICAgICAgICAgbCA9IEc0c3RkOjptaW4o IDE5LCBsICk7CiAgICAgICAgICB4ID0gRzRzdGQ6Om1pbiggMS4wLCBwdCooYmlubFtsLTFdICsg RzRVbmlmb3JtUmFuZCgpKihiaW5sW2xdLWJpbmxbbC0xXSkvMi4pICk7CiAgICAgICAgICBpZigg dGFyZ2V0UGFydGljbGUuR2V0U2lkZSgpIDwgMCApeCAqPSAtMS47CiAgICAgICAgICB0YXJnZXRQ YXJ0aWNsZS5TZXRNb21lbnR1bSggeCpldCpHZVYgKTsgICAgICAgICAgICAgICAgLy8gc2V0IHRo ZSB6LW1vbWVudHVtCiAgICAgICAgICB0b3RhbEVuZXJneSA9IHNxcnQoIHgqZXQqeCpldCArIHB0 KnB0ICsgdmVjTWFzcyp2ZWNNYXNzICk7CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRUb3Rh bEVuZXJneSggdG90YWxFbmVyZ3kqR2VWICk7CiAgICAgICAgICBpZiggdGFyZ2V0UGFydGljbGUu R2V0U2lkZSgpIDwgMCApCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmKCBleHRyYU51Y2xlb25D b3VudCA+IDE5ICl4PTAuOTk5OwogICAgICAgICAgICBHNGRvdWJsZSB4eHggPSAwLjk1KzAuMDUq ZXh0cmFOdWNsZW9uQ291bnQvMjAuMDsKICAgICAgICAgICAgaWYoIChiYWNrd2FyZEtpbmV0aWMr dG90YWxFbmVyZ3ktdmVjTWFzcykgPCB4eHgqYmFja3dhcmRFbmVyZ3kgKQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVbNV0gPSBwc2V1ZG9QYXJ0aWNsZVs1XSArIHRh cmdldFBhcnRpY2xlOwogICAgICAgICAgICAgIGJhY2t3YXJkS2luZXRpYyArPSB0b3RhbEVuZXJn eSAtIHZlY01hc3M7CiAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVbNl0gPSBwc2V1ZG9QYXJ0 aWNsZVs0XSArIHBzZXVkb1BhcnRpY2xlWzVdOwogICAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xl WzZdLlNldE1vbWVudHVtKCAwLjAgKTsgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHotbW9t ZW50dW0KICAgICAgICAgICAgICBwaGkgPSBwc2V1ZG9QYXJ0aWNsZVs2XS5BbmdsZSggcHNldWRv UGFydGljbGVbOF0gKTsKICAgICAgICAgICAgICBpZiggcHNldWRvUGFydGljbGVbNl0uR2V0TW9t ZW50dW0oKS55KCkvTWVWIDwgMC4wIClwaGkgPSB0d29waSAtIHBoaTsKICAgICAgICAgICAgICBw aGkgKz0gcGkgKyBub3JtYWwoKSAqIHBpIC8gMTIuMDsKICAgICAgICAgICAgICBpZiggcGhpID4g dHdvcGkgKXBoaSAtPSB0d29waTsKICAgICAgICAgICAgICBpZiggcGhpIDwgMC4wIClwaGkgPSB0 d29waSAtIHBoaTsKICAgICAgICAgICAgICBvdXRlckNvdW50ZXIgPSAyOyAgICAgICAgICAgICAg ICAgICAgLy8gbGVhdmUgb3V0ZXIgbG9vcAogICAgICAgICAgICAgIGVsaW1pbmF0ZVRoaXNQYXJ0 aWNsZSA9IGZhbHNlOyAgICAgICAvLyBkb24ndCBlbGltaW5hdGUgdGhpcyBwYXJ0aWNsZQogICAg ICAgICAgICAgIHJlc2V0RW5lcmdpZXMgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgaW5uZXIgbG9vcAogICAgICAgICAg ICB9CiAgICAgICAgICAgIGlmKCBpbm5lckNvdW50ZXIgPiA1IClicmVhazsgICAgICAgICAgIC8v IGxlYXZlIGlubmVyIGxvb3AKICAgICAgICAgICAgaWYoIGZvcndhcmRFbmVyZ3kgPj0gdmVjTWFz cyApICAvLyBzd2l0Y2ggc2lkZXMKICAgICAgICAgICAgewogICAgICAgICAgICAgIHRhcmdldFBh cnRpY2xlLlNldFNpZGUoIDEgKTsKICAgICAgICAgICAgICBmb3J3YXJkRW5lcmd5IC09IHZlY01h c3M7CiAgICAgICAgICAgICAgYmFja3dhcmRFbmVyZ3kgKz0gdmVjTWFzczsKICAgICAgICAgICAg ICAtLWJhY2t3YXJkQ291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRzRUaHJlZVZlY3Rv ciBtb21lbnR1bSA9IHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCk7CiAgICAgICAgICAgIHRh cmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCBtb21lbnR1bS54KCkgKiAwLjksIG1vbWVudHVtLnko KSAqIDAuOSApOwogICAgICAgICAgICBwdCAqPSAwLjk7CiAgICAgICAgICAgIGRuZGxbMTldICo9 IDAuOTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8vIHRh cmdldCBoYXMgZ29uZSB0byBmb3J3YXJkIHNpZGUKICAgICAgICAgIHsKICAgICAgICAgICAgaWYo IGZvcndhcmRFbmVyZ3kgPCBmb3J3YXJkS2luZXRpYyApCiAgICAgICAgICAgICAgdG90YWxFbmVy Z3kgPSB2ZWNNYXNzICsgMC4wNCpmYWJzKG5vcm1hbCgpKTsKICAgICAgICAgICAgZWxzZQogICAg ICAgICAgICAgIHRvdGFsRW5lcmd5ID0gdmVjTWFzcyArIGZvcndhcmRFbmVyZ3kgLSBmb3J3YXJk S2luZXRpYzsKICAgICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0VG90YWxFbmVyZ3koIHRvdGFs RW5lcmd5KkdlViApOwogICAgICAgICAgICBwcCA9IHNxcnQoIGFicyggdG90YWxFbmVyZ3kqdG90 YWxFbmVyZ3kgLSB2ZWNNYXNzKnZlY01hc3MgKSApKkdlVjsKICAgICAgICAgICAgcHAxID0gdGFy Z2V0UGFydGljbGUuR2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7CiAgICAgICAgICAgIGlmKCBwcDEg PCAxLjBlLTYqR2VWICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIEc0ZG91YmxlIHJ0aG52 ZSA9IHBpKkc0VW5pZm9ybVJhbmQoKTsKICAgICAgICAgICAgICBHNGRvdWJsZSBwaGludmUgPSB0 d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgICAgICAgRzRkb3VibGUgc3J0aCA9IHNpbihy dGhudmUpOwogICAgICAgICAgICAgIHRhcmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCBwcCpzcnRo KmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcHAqc3J0aCpzaW4ocGhpbnZlKSpNZVYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1lViApOwogICAgICAgICAgICB9CiAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRNb21lbnR1bSggdGFyZ2V0 UGFydGljbGUuR2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CgogICAgICAgICAgICBwc2V1ZG9Q YXJ0aWNsZVs0XSA9IHBzZXVkb1BhcnRpY2xlWzRdICsgdGFyZ2V0UGFydGljbGU7CiAgICAgICAg ICAgIG91dGVyQ291bnRlciA9IDI7ICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBvdXRlciBs b29wCiAgICAgICAgICAgIGVsaW1pbmF0ZVRoaXNQYXJ0aWNsZSA9IGZhbHNlOyAgICAgICAvLyBk b24ndCBlbGltaW5hdGUgdGhpcyBwYXJ0aWNsZQogICAgICAgICAgICByZXNldEVuZXJnaWVzID0g ZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv LyBsZWF2ZSBpbm5lciBsb29wCiAgICAgICAgICB9CiAgICAgICAgfSAgICAvLyBjbG9zZXMgaW5u ZXIgbG9vcAogICAgICAgIGlmKCByZXNldEVuZXJnaWVzICkKICAgICAgICB7CiAgICAgICAgICAv LyAgIGlmIHdlIGdldCB0byBoZXJlLCB0aGUgaW5uZXIgbG9vcCBoYXMgYmVlbiBEb25lIDYgVGlt ZXMKICAgICAgICAgIC8vICAgcmVzZXQgdGhlIGtpbmV0aWMgZW5lcmdpZXMgb2YgcHJldmlvdXNs eSBEb25lIHBhcnRpY2xlcywgaWYgdGhleSBhcmUgbGlnaHRlcgogICAgICAgICAgLy8gICAgdGhh biBwcm90b25zIGFuZCBpbiB0aGUgZm9yd2FyZCBoZW1pc3BoZXJlCiAgICAgICAgICAvLyAgIHRo ZW4gY29udGludWUgd2l0aCBvdXRlciBsb29wCiAgICAgICAgICAKICAgICAgICAgIGZvcndhcmRL aW5ldGljID0gYmFja3dhcmRLaW5ldGljID0gMC4wOwogICAgICAgICAgcHNldWRvUGFydGljbGVb NF0uU2V0WmVybygpOwogICAgICAgICAgcHNldWRvUGFydGljbGVbNV0uU2V0WmVybygpOwogICAg ICAgICAgZm9yKCBsPTA7IGw8dmVjTGVuOyArK2wgKSAvLyBjaGFuZ2VkIGZyb20gbD0xICBvbiAw MiBBcHJpbCA5OAogICAgICAgICAgewogICAgICAgICAgICBpZiggdmVjW2xdLT5HZXRTaWRlKCkg PiAwIHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhS2Fvbk1p bnVzIHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhS2Fvblpl cm9MIHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhS2Fvblpl cm9TIHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhS2FvblBs dXMgfHwKICAgICAgICAgICAgICAgIHZlY1tsXS0+R2V0RGVmaW5pdGlvbigpID09IGFQaU1pbnVz IHx8CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhUGlaZXJvIHx8 CiAgICAgICAgICAgICAgICB2ZWNbbF0tPkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVzICkKICAg ICAgICAgICAgewogICAgICAgICAgICAgIEc0ZG91YmxlIHRlbXBNYXNzID0gdmVjW2xdLT5HZXRN YXNzKCkvR2VWOwogICAgICAgICAgICAgIHRvdGFsRW5lcmd5ID0KICAgICAgICAgICAgICAgIEc0 c3RkOjptYXgoIHRlbXBNYXNzLCAwLjk1KnZlY1tsXS0+R2V0VG90YWxFbmVyZ3koKS9HZVYgKyAw LjA1KnRlbXBNYXNzICk7CiAgICAgICAgICAgICAgdmVjW2xdLT5TZXRUb3RhbEVuZXJneSggdG90 YWxFbmVyZ3kqR2VWICk7CiAgICAgICAgICAgICAgcHAgPSBzcXJ0KCBhYnMoIHRvdGFsRW5lcmd5 KnRvdGFsRW5lcmd5IC0gdGVtcE1hc3MqdGVtcE1hc3MgKSApKkdlVjsKICAgICAgICAgICAgICBw cDEgPSB2ZWNbbF0tPkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICAgICAgICAgIGlmKCBw cDEgPCAxLjBlLTYqR2VWICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBHNGRvdWJs ZSBydGhudmUgPSBwaSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgICAgICAgICBHNGRvdWJsZSBw aGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgICAgICAgICBHNGRvdWJsZSBz cnRoID0gc2luKHJ0aG52ZSk7CiAgICAgICAgICAgICAgICB2ZWNbbF0tPlNldE1vbWVudHVtKCBw cCpzcnRoKmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBwKnNydGgqc2luKHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcHAqY29zKHJ0aG52ZSkqTWVWICk7CiAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgICAgIHZlY1tsXS0+U2V0TW9tZW50dW0oIHZlY1tsXS0+R2V0 TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CgogICAgICAgICAgICAgIHB0ID0gRzRzdGQ6Om1heCgg MC4wMDEqR2VWLCBzcXJ0KCBzcXIodmVjW2xdLT5HZXRNb21lbnR1bSgpLngoKS9NZVYpICsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXIodmVjW2xdLT5HZXRNb21l bnR1bSgpLnkoKS9NZVYpICkgKS9HZVY7CiAgICAgICAgICAgICAgaWYoIHZlY1tsXS0+R2V0U2lk ZSgpID4gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3J3YXJkS2luZXRpYyAr PSB2ZWNbbF0tPkdldEtpbmV0aWNFbmVyZ3koKS9HZVY7CiAgICAgICAgICAgICAgICBwc2V1ZG9Q YXJ0aWNsZVs0XSA9IHBzZXVkb1BhcnRpY2xlWzRdICsgKCp2ZWNbbF0pOwogICAgICAgICAgICAg IH0gZWxzZSB7CiAgICAgICAgICAgICAgICBiYWNrd2FyZEtpbmV0aWMgKz0gdmVjW2xdLT5HZXRL aW5ldGljRW5lcmd5KCkvR2VWOwogICAgICAgICAgICAgICAgcHNldWRvUGFydGljbGVbNV0gPSBw c2V1ZG9QYXJ0aWNsZVs1XSArICgqdmVjW2xdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAg IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gICAgLy8gY2xvc2VzIG91dGVyIGxvb3AK ICAgICAgaWYoIGVsaW1pbmF0ZVRoaXNQYXJ0aWNsZSApICAvLyBub3QgZW5vdWdoIGVuZXJneSwg ZWxpbWluYXRlIHRhcmdldAogICAgICB7CiAgICAgICAgRzRjZXJyIDw8ICJXYXJuaW5nOiBlbGlt aW5hdGluZyB0YXJnZXQgcGFydGljbGUiIDw8IEc0ZW5kbDsKLy8gICAgICAgIGV4aXQoIEVYSVRf RkFJTFVSRSApOwogICAgICB9CiAgICB9CiAgICAvLwogICAgLy8gIHRoaXMgZmluaXNoZXMgdGhl IHRhcmdldCBwYXJ0aWNsZQogICAgLy8gYmFja3dhcmQgbnVjbGVvbnMgcHJvZHVjZWQgd2l0aCBh IGNsdXN0ZXIgbW9kZWwKICAgIC8vCiAgICBwc2V1ZG9QYXJ0aWNsZVs2XS5Mb3JlbnR6KCBwc2V1 ZG9QYXJ0aWNsZVszXSwgcHNldWRvUGFydGljbGVbMl0gKTsKICAgIHBzZXVkb1BhcnRpY2xlWzZd ID0gcHNldWRvUGFydGljbGVbNl0gLSBwc2V1ZG9QYXJ0aWNsZVs0XTsKICAgIHBzZXVkb1BhcnRp Y2xlWzZdID0gcHNldWRvUGFydGljbGVbNl0gLSBwc2V1ZG9QYXJ0aWNsZVs1XTsKICAgIGlmKCBi YWNrd2FyZE51Y2xlb25Db3VudCA9PSAxICkgIC8vIHRhcmdldCBwYXJ0aWNsZSBpcyB0aGUgb25s eSBiYWNrd2FyZCBudWNsZW9uCiAgICB7CiAgICAgIEc0ZG91YmxlIGVraW4gPQogICAgICAgIEc0 c3RkOjptaW4oIGJhY2t3YXJkRW5lcmd5LWJhY2t3YXJkS2luZXRpYywgY2VudGVyb2ZtYXNzRW5l cmd5LzIuMC1wcm90b25NYXNzL0dlViApOwogICAgICBpZiggZWtpbiA8IDAuMDQgKWVraW4gPSAw LjA0ICogZmFicyggbm9ybWFsKCkgKTsKICAgICAgdmVjTWFzcyA9IHRhcmdldFBhcnRpY2xlLkdl dE1hc3MoKS9HZVY7CiAgICAgIHRvdGFsRW5lcmd5ID0gZWtpbit2ZWNNYXNzOwogICAgICB0YXJn ZXRQYXJ0aWNsZS5TZXRUb3RhbEVuZXJneSggdG90YWxFbmVyZ3kqR2VWICk7CiAgICAgIHBwID0g c3FydCggYWJzKCB0b3RhbEVuZXJneSp0b3RhbEVuZXJneSAtIHZlY01hc3MqdmVjTWFzcyApICkq R2VWOwogICAgICBwcDEgPSBwc2V1ZG9QYXJ0aWNsZVs2XS5HZXRNb21lbnR1bSgpLm1hZygpL01l VjsKICAgICAgaWYoIHBwMSA8IDEuMGUtNipHZVYgKQogICAgICB7IAogICAgICAgIHJ0aG52ZSA9 IHBpKkc0VW5pZm9ybVJhbmQoKTsKICAgICAgICBwaGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5k KCk7CiAgICAgICAgRzRkb3VibGUgc3J0aCA9IHNpbihydGhudmUpOwogICAgICAgIHRhcmdldFBh cnRpY2xlLlNldE1vbWVudHVtKCBwcCpzcnRoKmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcHAqc3J0aCpzaW4ocGhpbnZlKSpNZVYsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1lViApOwogICAgICB9 IGVsc2UgewogICAgICAgIHRhcmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCBwc2V1ZG9QYXJ0aWNs ZVs2XS5HZXRNb21lbnR1bSgpICogKHBwL3BwMSkgKTsKICAgICAgfQogICAgICBwc2V1ZG9QYXJ0 aWNsZVs1XSA9IHBzZXVkb1BhcnRpY2xlWzVdICsgdGFyZ2V0UGFydGljbGU7CiAgICB9CiAgICBl bHNlICAvLyBtb3JlIHRoYW4gb25lIGJhY2t3YXJkIG51Y2xlb24KICAgIHsKICAgICAgY29uc3Qg RzRkb3VibGUgY3BhcltdID0geyAwLjYsIDAuNiwgMC4zNSwgMC4xNSwgMC4xMCB9OwogICAgICBj b25zdCBHNGRvdWJsZSBncGFyW10gPSB7IDIuNiwgMi42LCAxLjgwLCAxLjMwLCAxLjIwIH07CiAg ICAgIC8vIFJlcGxhY2VkIHRoZSBmb2xsb3dpbmcgbWluIGZ1bmN0aW9uIHRvIGdldCBjb3JyZWN0 IGJlaGF2aW91ciBvbiBERUMuCiAgICAgIC8vIEc0aW50IHRlbXBDb3VudCA9IEc0c3RkOjptaW4o IDUsIGJhY2t3YXJkTnVjbGVvbkNvdW50ICkgLSAxOwogICAgICBHNGludCB0ZW1wQ291bnQ7CiAg ICAgIGlmIChiYWNrd2FyZE51Y2xlb25Db3VudCA8IDUpCgl7CgkgIHRlbXBDb3VudCA9IGJhY2t3 YXJkTnVjbGVvbkNvdW50OwoJfQogICAgICBlbHNlCgl7CgkgIHRlbXBDb3VudCA9IDU7Cgl9CiAg ICAgIHRlbXBDb3VudC0tOwogICAgICAvL2NvdXQgPDwgImJhY2t3YXJkTnVjbGVvbkNvdW50ICIg PDwgYmFja3dhcmROdWNsZW9uQ291bnQgPDwgRzRlbmRsOwogICAgICAvL2NvdXQgPDwgInRlbXBD b3VudCAiIDw8IHRlbXBDb3VudCA8PCBHNGVuZGw7CiAgICAgIEc0ZG91YmxlIHJtYjAgPSAwLjA7 CiAgICAgIGlmKCB0YXJnZXRQYXJ0aWNsZS5HZXRTaWRlKCkgPT0gLTMgKQogICAgICAgIHJtYjAg Kz0gdGFyZ2V0UGFydGljbGUuR2V0TWFzcygpL0dlVjsKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVu OyArK2kgKQogICAgICB7CiAgICAgICAgaWYoIHZlY1tpXS0+R2V0U2lkZSgpID09IC0zIClybWIw ICs9IHZlY1tpXS0+R2V0TWFzcygpL0dlVjsKICAgICAgfQogICAgICBybWIgPSBybWIwICsgcG93 KC1sb2coMS4wLUc0VW5pZm9ybVJhbmQoKSksY3Bhclt0ZW1wQ291bnRdKSAvIGdwYXJbdGVtcENv dW50XTsKICAgICAgdG90YWxFbmVyZ3kgPSBwc2V1ZG9QYXJ0aWNsZVs2XS5HZXRUb3RhbEVuZXJn eSgpL0dlVjsKICAgICAgdmVjTWFzcyA9IEc0c3RkOjptaW4oIHJtYiwgdG90YWxFbmVyZ3kgKTsK ICAgICAgcHNldWRvUGFydGljbGVbNl0uU2V0TWFzcyggdmVjTWFzcypHZVYgKTsKICAgICAgcHAg PSBzcXJ0KCBhYnMoIHRvdGFsRW5lcmd5KnRvdGFsRW5lcmd5IC0gdmVjTWFzcyp2ZWNNYXNzICkg KSpHZVY7CiAgICAgIHBwMSA9IHBzZXVkb1BhcnRpY2xlWzZdLkdldE1vbWVudHVtKCkubWFnKCkv TWVWOwogICAgICBpZiggcHAxIDwgMS4wZS02KkdlViApCiAgICAgIHsKICAgICAgICBydGhudmUg PSBwaSAqIEc0VW5pZm9ybVJhbmQoKTsKICAgICAgICBwaGludmUgPSB0d29waSAqIEc0VW5pZm9y bVJhbmQoKTsKICAgICAgICBHNGRvdWJsZSBzcnRoID0gc2luKHJ0aG52ZSk7CiAgICAgICAgcHNl dWRvUGFydGljbGVbNl0uU2V0TW9tZW50dW0oIC1wcCpzcnRoKmNvcyhwaGludmUpKk1lViwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXBwKnNydGgqc2luKHBoaW52ZSkq TWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcHAqY29zKHJ0aG52 ZSkqTWVWICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHBzZXVkb1BhcnRpY2xlWzZdLlNl dE1vbWVudHVtKCBwc2V1ZG9QYXJ0aWNsZVs2XS5HZXRNb21lbnR1bSgpICogKC1wcC9wcDEpICk7 CiAgICAgIAogICAgICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiB0ZW1wVjsg IC8vIHRlbXBWIGNvbnRhaW5zIHRoZSBiYWNrd2FyZCBudWNsZW9ucwogICAgICB0ZW1wVi5Jbml0 aWFsaXplKCBiYWNrd2FyZE51Y2xlb25Db3VudCApOwogICAgICBHNGludCB0ZW1wTGVuID0gMDsK ICAgICAgaWYoIHRhcmdldFBhcnRpY2xlLkdldFNpZGUoKSA9PSAtMyApdGVtcFYuU2V0RWxlbWVu dCggdGVtcExlbisrLCAmdGFyZ2V0UGFydGljbGUgKTsKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVu OyArK2kgKQogICAgICB7CiAgICAgICAgaWYoIHZlY1tpXS0+R2V0U2lkZSgpID09IC0zICl0ZW1w Vi5TZXRFbGVtZW50KCB0ZW1wTGVuKyssIHZlY1tpXSApOwogICAgICB9CiAgICAgIGlmKCB0ZW1w TGVuICE9IGJhY2t3YXJkTnVjbGVvbkNvdW50ICkKICAgICAgewogICAgICAgIEc0Y2VyciA8PCAi dGVtcExlbiBpcyBub3QgdGhlIHNhbWUgYXMgYmFja3dhcmROdWNsZW9uQ291bnQiIDw8IEc0ZW5k bDsKICAgICAgICBHNGNlcnIgPDwgInRlbXBMZW4gPSAiIDw8IHRlbXBMZW47CiAgICAgICAgRzRj ZXJyIDw8ICIsIGJhY2t3YXJkTnVjbGVvbkNvdW50ID0gIiA8PCBiYWNrd2FyZE51Y2xlb25Db3Vu dCA8PCBHNGVuZGw7CiAgICAgICAgRzRjZXJyIDw8ICJ0YXJnZXRQYXJ0aWNsZSBzaWRlID0gIiA8 PCB0YXJnZXRQYXJ0aWNsZS5HZXRTaWRlKCkgPDwgRzRlbmRsOwogICAgICAgIEc0Y2VyciA8PCAi Y3VycmVudFBhcnRpY2xlIHNpZGUgPSAiIDw8IGN1cnJlbnRQYXJ0aWNsZS5HZXRTaWRlKCkgPDwg RzRlbmRsOwogICAgICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytpICkKICAgICAgICAgIEc0Y2Vy ciA8PCAicGFydGljbGUgIyIgPDwgaSA8PCAiIHNpZGUgPSAiIDw8IHZlY1tpXS0+R2V0U2lkZSgp IDw8IEc0ZW5kbDsKICAgICAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKICAgICAgfQogICAgICBj b25zdGFudENyb3NzU2VjdGlvbiA9IHRydWU7CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZy YW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgICAgaWYoIHRlbXBMZW4gPj0gMiApCiAg ICAgIHsKICAgICAgICB3Z3QgPSBHZW5lcmF0ZU5Cb2R5RXZlbnQoCiAgICAgICAgIHBzZXVkb1Bh cnRpY2xlWzZdLkdldE1hc3MoKSwgY29uc3RhbnRDcm9zc1NlY3Rpb24sIHRlbXBWLCB0ZW1wTGVu ICk7CiAgICAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywg dmVjTGVuKTsKICAgICAgICBpZiggdGFyZ2V0UGFydGljbGUuR2V0U2lkZSgpID09IC0zICkKICAg ICAgICB7CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5Mb3JlbnR6KCB0YXJnZXRQYXJ0aWNsZSwg cHNldWRvUGFydGljbGVbNl0gKTsKICAgICAgICAgIC8vIHRlbXBWIGNvbnRhaW5zIHRoZSByZWFs IHN0dWZmCiAgICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs1XSA9IHBzZXVkb1BhcnRpY2xlWzVdICsg dGFyZ2V0UGFydGljbGU7CiAgICAgICAgfQogICAgICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytp ICkKICAgICAgICB7CiAgICAgICAgICBpZiggdmVjW2ldLT5HZXRTaWRlKCkgPT0gLTMgKQogICAg ICAgICAgewogICAgICAgICAgICB2ZWNbaV0tPkxvcmVudHooICp2ZWNbaV0sIHBzZXVkb1BhcnRp Y2xlWzZdICk7CiAgICAgICAgICAgIHBzZXVkb1BhcnRpY2xlWzVdID0gcHNldWRvUGFydGljbGVb NV0gKyAoKnZlY1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAvLyBERUJVR0dJTkcg LS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgIH0KICAgIH0KICAg IC8vCiAgICAvLyAgTG9yZW50eiB0cmFuc2Zvcm1hdGlvbiBpbiBsYWIgc3lzdGVtCiAgICAvLwog ICAgaWYoIHZlY0xlbiA9PSAwIClyZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHNlY29uZGFyaWVz IGhhdmUgYmVlbiBlbGltaW5hdGVkCiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6 RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgIAogICAgRzRpbnQgbnVtYmVyb2ZGaW5hbFN0YXRl TnVjbGVvbnMgPSAwOwogICAgaWYoIChjdXJyZW50UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFQcm90b24pIHx8CiAgICAgICAgKGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0g YU5ldXRyb24pICkrK251bWJlcm9mRmluYWxTdGF0ZU51Y2xlb25zOwogICAgY3VycmVudFBhcnRp Y2xlLkxvcmVudHooIGN1cnJlbnRQYXJ0aWNsZSwgcHNldWRvUGFydGljbGVbMV0gKTsKICAgIAog ICAgaWYoICh0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVByb3RvbikgfHwKICAg ICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFOZXV0cm9uKSApKytudW1i ZXJvZkZpbmFsU3RhdGVOdWNsZW9uczsKICAgIHRhcmdldFBhcnRpY2xlLkxvcmVudHooIHRhcmdl dFBhcnRpY2xlLCBwc2V1ZG9QYXJ0aWNsZVsxXSApOwogICAgCiAgICBmb3IoIGk9MDsgaTx2ZWNM ZW47ICsraSApCiAgICB7CiAgICAgIGlmKCAodmVjW2ldLT5HZXREZWZpbml0aW9uKCkgPT0gYVBy b3RvbikgfHwKICAgICAgICAgICh2ZWNbaV0tPkdldERlZmluaXRpb24oKSA9PSBhTmV1dHJvbikg KSsrbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnM7CiAgICAgICBpZiggKHZlY1tpXS0+R2V0RGVm aW5pdGlvbigpID09IGFuQW50aVByb3RvbikgfHwKICAgICAgICAgICh2ZWNbaV0tPkdldERlZmlu aXRpb24oKSA9PSBhbkFudGlOZXV0cm9uKSApLS1udW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9uczsK ICAgICB2ZWNbaV0tPkxvcmVudHooICp2ZWNbaV0sIHBzZXVkb1BhcnRpY2xlWzFdICk7CiAgICB9 CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVu KTsKICAgIG51bWJlcm9mRmluYWxTdGF0ZU51Y2xlb25zID0gRzRzdGQ6Om1heCggMSwgbnVtYmVy b2ZGaW5hbFN0YXRlTnVjbGVvbnMgKTsKICAgIC8vCiAgICAvLyBsZWFkRmxhZyB3aWxsIGJlIHRy dWUKICAgIC8vICBpZmYgb3JpZ2luYWwgcGFydGljbGUgaXMgYXQgbGVhc3QgYXMgaGVhdnkgYXMg SysgYW5kIG5vdCBhIHByb3RvbiBvciBuZXV0cm9uIEFORAogICAgLy8gICBpZgogICAgLy8gICAg aW5jaWRlbnQgcGFydGljbGUgaXMgYXQgbGVhc3QgYXMgaGVhdnkgYXMgSysgYW5kIGl0IGlzIG5v dCBhIHByb3RvbiBvciBuZXV0cm9uCiAgICAvLyAgICAgbGVhZEZsYWcgaXMgc2V0IHRvIHRoZSBp bmNpZGVudCBwYXJ0aWNsZQogICAgLy8gICBvcgogICAgLy8gICAgdGFyZ2V0IHBhcnRpY2xlIGlz IGF0IGxlYXN0IGFzIGhlYXZ5IGFzIEsrIGFuZCBpdCBpcyBub3QgYSBwcm90b24gb3IgbmV1dHJv bgogICAgLy8gICAgIGxlYWRGbGFnIGlzIHNldCB0byB0aGUgdGFyZ2V0IHBhcnRpY2xlCiAgICAv LwogICAgRzRib29sIGxlYWRpbmdTdHJhbmdlUGFydGljbGVIYXNDaGFuZ2VkID0gdHJ1ZTsKICAg IGlmKCBsZWFkRmxhZyApCiAgICB7CiAgICAgIGlmKCBjdXJyZW50UGFydGljbGUuR2V0RGVmaW5p dGlvbigpID09IGxlYWRpbmdTdHJhbmdlUGFydGljbGUuR2V0RGVmaW5pdGlvbigpICkKICAgICAg ICBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlSGFzQ2hhbmdlZCA9IGZhbHNlOwogICAgICBpZiggbGVh ZGluZ1N0cmFuZ2VQYXJ0aWNsZUhhc0NoYW5nZWQgJiYKICAgICAgICAgICggdGFyZ2V0UGFydGlj bGUuR2V0RGVmaW5pdGlvbigpID09IGxlYWRpbmdTdHJhbmdlUGFydGljbGUuR2V0RGVmaW5pdGlv bigpICkgKQogICAgICAgIGxlYWRpbmdTdHJhbmdlUGFydGljbGVIYXNDaGFuZ2VkID0gZmFsc2U7 CiAgICAgIGlmKCBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlSGFzQ2hhbmdlZCApCiAgICAgIHsKICAg ICAgICBmb3IoIGk9MDsgaTx2ZWNMZW47IGkrKyApCiAgICAgICAgewogICAgICAgICAgaWYoIHZl Y1tpXS0+R2V0RGVmaW5pdGlvbigpID09IGxlYWRpbmdTdHJhbmdlUGFydGljbGUuR2V0RGVmaW5p dGlvbigpICkKICAgICAgICAgIHsKICAgICAgICAgICAgbGVhZGluZ1N0cmFuZ2VQYXJ0aWNsZUhh c0NoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICAgIGlmKCBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlSGFzQ2hhbmdlZCApCiAg ICAgIHsKICAgICAgICBHNGJvb2wgbGVhZFRlc3QgPSAKICAgICAgICAgIChsZWFkaW5nU3RyYW5n ZVBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhS2Fvbk1pbnVzIHx8CiAgICAgICAgICAgbGVh ZGluZ1N0cmFuZ2VQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25aZXJvTCB8fAogICAg ICAgICAgIGxlYWRpbmdTdHJhbmdlUGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFLYW9uWmVy b1MgfHwKICAgICAgICAgICBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9 PSBhS2FvblBsdXMgfHwKICAgICAgICAgICBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlLkdldERlZmlu aXRpb24oKSA9PSBhUGlNaW51cyB8fAogICAgICAgICAgIGxlYWRpbmdTdHJhbmdlUGFydGljbGUu R2V0RGVmaW5pdGlvbigpID09IGFQaVplcm8gfHwKICAgICAgICAgICBsZWFkaW5nU3RyYW5nZVBh cnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVzKTsKICAgICAgICBHNGJvb2wgdGFyZ2V0 VGVzdCA9CiAgICAgICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFLYW9u TWludXMgfHwKICAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUth b25aZXJvTCB8fAogICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBh S2Fvblplcm9TIHx8CiAgICAgICAgICAgdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFLYW9uUGx1cyB8fAogICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9 PSBhUGlNaW51cyB8fAogICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9 PSBhUGlaZXJvIHx8CiAgICAgICAgICAgdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFQaVBsdXMpOwogICAgICAgIAogICAgICAgIC8vIGZvbGxvd2luZyBtb2RpZmllZCBieSBKTEMg MjItT2N0LTk3CiAgICAgICAgICAKICAgICAgICBpZiggKGxlYWRUZXN0JiZ0YXJnZXRUZXN0KSB8 fCAhKGxlYWRUZXN0fHx0YXJnZXRUZXN0KSApIC8vIGJvdGggdHJ1ZSBvciBib3RoIGZhbHNlCiAg ICAgICAgewogICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUo IGxlYWRpbmdTdHJhbmdlUGFydGljbGUuR2V0RGVmaW5pdGlvbigpICk7CiAgICAgICAgICB0YXJn ZXRIYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpE dW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewog ICAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldERlZmluaXRpb25BbmRVcGRhdGVFKCBsZWFkaW5n U3RyYW5nZVBhcnRpY2xlLkdldERlZmluaXRpb24oKSApOwogICAgICAgICAgaW5jaWRlbnRIYXND aGFuZ2VkID0gZmFsc2U7CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZy YW1lKHZlYywgdmVjTGVuKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gICAvLyBlbmQgb2YgaWYo IGxlYWRGbGFnICkKICAgIAogICAgcHNldWRvUGFydGljbGVbM10uU2V0TW9tZW50dW0oIDAuMCwg MC4wLCBwT3JpZ2luYWwqR2VWICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVszXS5TZXRNYXNzKCBtT3Jp Z2luYWwqR2VWICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVszXS5TZXRUb3RhbEVuZXJneSgKICAgICBz cXJ0KCBwT3JpZ2luYWwqcE9yaWdpbmFsICsgbU9yaWdpbmFsKm1PcmlnaW5hbCApKkdlViApOwog ICAgCi8vICAgIEc0ZG91YmxlIGVraW4wID0gcHNldWRvUGFydGljbGVbM10uR2V0S2luZXRpY0Vu ZXJneSgpL0dlVjsKICAgIAogICAgcHNldWRvUGFydGljbGVbNF0uU2V0TW9tZW50dW0oIDAuMCwg MC4wLCAwLjAgKTsKICAgIHBzZXVkb1BhcnRpY2xlWzRdLlNldE1hc3MoIHByb3Rvbk1hc3MqbnVt YmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMqTWVWICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5TZXRU b3RhbEVuZXJneSggcHJvdG9uTWFzcypudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9ucypNZVYgKTsK ICAgIAogICAgRzRkb3VibGUgdGhlb3JldGljYWxLaW5ldGljID0KICAgICAgcHNldWRvUGFydGlj bGVbM10uR2V0VG90YWxFbmVyZ3koKS9NZVYgKwogICAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5HZXRU b3RhbEVuZXJneSgpL01lViAtCiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXRNYXNzKCkvTWVWIC0K ICAgICAgdGFyZ2V0UGFydGljbGUuR2V0TWFzcygpL01lVjsKICAgIAogICAgRzRkb3VibGUgc2lt dWxhdGVkS2luZXRpYyA9CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXRLaW5ldGljRW5lcmd5KCkv TWVWICsgdGFyZ2V0UGFydGljbGUuR2V0S2luZXRpY0VuZXJneSgpL01lVjsKICAgIAogICAgcHNl dWRvUGFydGljbGVbNV0gPSBwc2V1ZG9QYXJ0aWNsZVszXSArIHBzZXVkb1BhcnRpY2xlWzRdOwog ICAgcHNldWRvUGFydGljbGVbM10uTG9yZW50eiggcHNldWRvUGFydGljbGVbM10sIHBzZXVkb1Bh cnRpY2xlWzVdICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5Mb3JlbnR6KCBwc2V1ZG9QYXJ0aWNs ZVs0XSwgcHNldWRvUGFydGljbGVbNV0gKTsKICAgIAogICAgcHNldWRvUGFydGljbGVbN10uU2V0 WmVybygpOwogICAgcHNldWRvUGFydGljbGVbN10gPSBwc2V1ZG9QYXJ0aWNsZVs3XSArIGN1cnJl bnRQYXJ0aWNsZTsKICAgIHBzZXVkb1BhcnRpY2xlWzddID0gcHNldWRvUGFydGljbGVbN10gKyB0 YXJnZXRQYXJ0aWNsZTsKICAgIAogICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kgKQogICAgewog ICAgICBwc2V1ZG9QYXJ0aWNsZVs3XSA9IHBzZXVkb1BhcnRpY2xlWzddICsgKnZlY1tpXTsKICAg ICAgc2ltdWxhdGVkS2luZXRpYyArPSB2ZWNbaV0tPkdldEtpbmV0aWNFbmVyZ3koKS9NZVY7CiAg ICAgIHRoZW9yZXRpY2FsS2luZXRpYyAtPSB2ZWNbaV0tPkdldE1hc3MoKS9NZVY7CiAgICB9CiAg ICBpZiggdmVjTGVuIDw9IDE2ICYmIHZlY0xlbiA+IDAgKQogICAgewogICAgICAvLyBtdXN0IGNy ZWF0ZSBhIG5ldyBzZXQgb2YgUmVhY3Rpb25Qcm9kdWN0cyBoZXJlIGJlY2F1c2UgR2VuZXJhdGVO Qm9keSB3aWxsCiAgICAgIC8vIG1vZGlmeSB0aGUgbW9tZW50YSBmb3IgdGhlIHBhcnRpY2xlcywg YW5kIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcwogICAgICAvLwogICAgICBHNFJlYWN0aW9uUHJv ZHVjdCB0ZW1wUlsxMzBdOwogICAgICAvL0c0UmVhY3Rpb25Qcm9kdWN0ICp0ZW1wUiA9IG5ldyBH NFJlYWN0aW9uUHJvZHVjdCBbdmVjTGVuKzJdOwogICAgICB0ZW1wUlswXSA9IGN1cnJlbnRQYXJ0 aWNsZTsKICAgICAgdGVtcFJbMV0gPSB0YXJnZXRQYXJ0aWNsZTsKICAgICAgZm9yKCBpPTA7IGk8 dmVjTGVuOyArK2kgKXRlbXBSW2krMl0gPSAqdmVjW2ldOwogICAgICBHNEZhc3RWZWN0b3I8RzRS ZWFjdGlvblByb2R1Y3QsMTI4PiB0ZW1wVjsKICAgICAgdGVtcFYuSW5pdGlhbGl6ZSggdmVjTGVu KzIgKTsKICAgICAgRzRpbnQgdGVtcExlbiA9IDA7CiAgICAgIGZvciggaT0wOyBpPHZlY0xlbisy OyArK2kgKXRlbXBWLlNldEVsZW1lbnQoIHRlbXBMZW4rKywgJnRlbXBSW2ldICk7CiAgICAgIGNv bnN0YW50Q3Jvc3NTZWN0aW9uID0gdHJ1ZTsKCiAgICAgIHdndCA9IEdlbmVyYXRlTkJvZHlFdmVu dCgKICAgICAgIHBzZXVkb1BhcnRpY2xlWzNdLkdldFRvdGFsRW5lcmd5KCkvTWVWK3BzZXVkb1Bh cnRpY2xlWzRdLkdldFRvdGFsRW5lcmd5KCkvTWVWLAogICAgICAgY29uc3RhbnRDcm9zc1NlY3Rp b24sIHRlbXBWLCB0ZW1wTGVuICk7CiAgICAgIHRoZW9yZXRpY2FsS2luZXRpYyA9IDAuMDsKICAg ICAgZm9yKCBpPTA7IGk8dGVtcExlbjsgKytpICkKICAgICAgewogICAgICAgIHBzZXVkb1BhcnRp Y2xlWzZdLkxvcmVudHooICp0ZW1wVltpXSwgcHNldWRvUGFydGljbGVbNF0gKTsKICAgICAgICB0 aGVvcmV0aWNhbEtpbmV0aWMgKz0gcHNldWRvUGFydGljbGVbNl0uR2V0S2luZXRpY0VuZXJneSgp L01lVjsKICAgICAgfQogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFt ZSh2ZWMsIHZlY0xlbik7CiAgICAgIC8vZGVsZXRlIFtdIHRlbXBSOwogICAgfQogICAgLy8KICAg IC8vICBNYWtlIHN1cmUsIHRoYXQgdGhlIGtpbmV0aWMgZW5lcmdpZXMgYXJlIGNvcnJlY3QKICAg IC8vCiAgICBpZiggc2ltdWxhdGVkS2luZXRpYyAhPSAwLjAgKQogICAgewogICAgICB3Z3QgPSB0 aGVvcmV0aWNhbEtpbmV0aWMvc2ltdWxhdGVkS2luZXRpYzsKICAgICAgdGhlb3JldGljYWxLaW5l dGljID0gY3VycmVudFBhcnRpY2xlLkdldEtpbmV0aWNFbmVyZ3koKS9NZVYgKiB3Z3Q7CiAgICAg IHNpbXVsYXRlZEtpbmV0aWMgPSB0aGVvcmV0aWNhbEtpbmV0aWM7CiAgICAgIGN1cnJlbnRQYXJ0 aWNsZS5TZXRLaW5ldGljRW5lcmd5KCB0aGVvcmV0aWNhbEtpbmV0aWMqTWVWICk7CiAgICAgIHBw ID0gY3VycmVudFBhcnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICAgIHBwMSA9IGN1 cnJlbnRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpLm1hZygpL01lVjsKICAgICAgaWYoIHBwMSA8IDEu MGUtNipHZVYgKQogICAgICB7CiAgICAgICAgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwog ICAgICAgIHBoaW52ZSA9IHR3b3BpKkc0VW5pZm9ybVJhbmQoKTsKICAgICAgICBjdXJyZW50UGFy dGljbGUuU2V0TW9tZW50dW0oIHBwKnNpbihydGhudmUpKmNvcyhwaGludmUpKk1lViwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbihydGhudmUpKnNpbihwaGludmUp Kk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKmNvcyhydGhudmUp Kk1lViApOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGN1cnJlbnRQYXJ0aWNs ZS5TZXRNb21lbnR1bSggY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocHAvcHAxKSAp OwogICAgICB9CiAgICAgIHRoZW9yZXRpY2FsS2luZXRpYyA9IHRhcmdldFBhcnRpY2xlLkdldEtp bmV0aWNFbmVyZ3koKS9NZVYgKiB3Z3Q7CiAgICAgIHRhcmdldFBhcnRpY2xlLlNldEtpbmV0aWNF bmVyZ3koIHRoZW9yZXRpY2FsS2luZXRpYypNZVYgKTsKICAgICAgc2ltdWxhdGVkS2luZXRpYyAr PSB0aGVvcmV0aWNhbEtpbmV0aWM7CiAgICAgIHBwID0gdGFyZ2V0UGFydGljbGUuR2V0VG90YWxN b21lbnR1bSgpL01lVjsKICAgICAgcHAxID0gdGFyZ2V0UGFydGljbGUuR2V0TW9tZW50dW0oKS5t YWcoKS9NZVY7CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZl YywgdmVjTGVuKTsKICAgICAgaWYoIHBwMSA8IDEuMGUtNipHZVYgKQogICAgICB7CiAgICAgICAg cnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAgIHBoaW52ZSA9IHR3b3BpKkc0VW5p Zm9ybVJhbmQoKTsKICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRNb21lbnR1bSggcHAqc2luKHJ0 aG52ZSkqY29zKHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSpNZVYsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1lViApOwogICAgICB9IGVsc2UgewogICAgICAg IHRhcmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCB0YXJnZXRQYXJ0aWNsZS5HZXRNb21lbnR1bSgp ICogKHBwL3BwMSkgKTsKICAgICAgfQogICAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAg ICAgIHsKICAgICAgICB0aGVvcmV0aWNhbEtpbmV0aWMgPSB2ZWNbaV0tPkdldEtpbmV0aWNFbmVy Z3koKS9NZVYgKiB3Z3Q7CiAgICAgICAgc2ltdWxhdGVkS2luZXRpYyArPSB0aGVvcmV0aWNhbEtp bmV0aWM7CiAgICAgICAgdmVjW2ldLT5TZXRLaW5ldGljRW5lcmd5KCB0aGVvcmV0aWNhbEtpbmV0 aWMqTWVWICk7CiAgICAgICAgcHAgPSB2ZWNbaV0tPkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAg ICAgICAgcHAxID0gdmVjW2ldLT5HZXRNb21lbnR1bSgpLm1hZygpL01lVjsKICAgICAgICBpZigg cHAxIDwgMS4wZS02KkdlViApCiAgICAgICAgewogICAgICAgICAgcnRobnZlID0gcGkqRzRVbmlm b3JtUmFuZCgpOwogICAgICAgICAgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3JtUmFuZCgpOwogICAg ICAgICAgdmVjW2ldLT5TZXRNb21lbnR1bSggcHAqc2luKHJ0aG52ZSkqY29zKHBoaW52ZSkqTWVW LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqc2luKHJ0aG52ZSkqc2luKHBoaW52 ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqY29zKHJ0aG52ZSkqTWVW ICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0o IHZlY1tpXS0+R2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgIH0KICAgIH0KICAgICAg Ly8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAg Um90YXRlKCBudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9ucywgcHNldWRvUGFydGljbGVbM10uR2V0 TW9tZW50dW0oKSwKICAgICAgICAgICAgbW9kaWZpZWRPcmlnaW5hbCwgb3JpZ2luYWxJbmNpZGVu dCwgdGFyZ2V0TnVjbGV1cywKICAgICAgICAgICAgY3VycmVudFBhcnRpY2xlLCB0YXJnZXRQYXJ0 aWNsZSwgdmVjLCB2ZWNMZW4gKTsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpE dW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgLy8KICAgIC8vIGFkZCBibGFjayB0cmFjayBwYXJ0 aWNsZXMKICAgIC8vIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFydGljbGVzIHByb2R1Y2VkIGlzIHJl c3RyaWN0ZWQgdG8gMTk4CiAgICAvLyB0aGlzIG1heSBoYXZlIGluZmx1ZW5jZSBvbiB2ZXJ5IGhp Z2ggZW5lcmdpZXMKICAgIC8vCiAgICBpZiggYXRvbWljV2VpZ2h0ID49IDEuNSApCiAgICB7CiAg ICAgIC8vIG5wbmIgaXMgbnVtYmVyIG9mIHByb3Rvbi9uZXV0cm9uIGJsYWNrIHRyYWNrIHBhcnRp Y2xlcwogICAgICAvLyBuZHRhIGlzIHRoZSBudW1iZXIgb2YgZGV1dGVyb25zLCB0cml0b25zLCBh bmQgYWxwaGFzIHByb2R1Y2VkCiAgICAgIC8vIGVwbmIgaXMgdGhlIGtpbmV0aWMgZW5lcmd5IGF2 YWlsYWJsZSBmb3IgcHJvdG9uL25ldXRyb24gYmxhY2sgdHJhY2sgcGFydGljbGVzCiAgICAgIC8v IGVkdGEgaXMgdGhlIGtpbmV0aWMgZW5lcmd5IGF2YWlsYWJsZSBmb3IgZGV1dGVyb24vdHJpdG9u L2FscGhhIHBhcnRpY2xlcwogICAgICAvLwogICAgICBHNGRvdWJsZSBlcG5iLCBlZHRhOwogICAg ICBHNGludCBucG5iID0gMDsKICAgICAgRzRpbnQgbmR0YSA9IDA7CiAgICAgIAogICAgICBlcG5i ID0gdGFyZ2V0TnVjbGV1cy5HZXRQTkJsYWNrVHJhY2tFbmVyZ3koKTsgICAgICAgICAgICAvLyB3 YXMgZW5wMSBpbiBmb3J0cmFuIGNvZGUKICAgICAgZWR0YSA9IHRhcmdldE51Y2xldXMuR2V0RFRB QmxhY2tUcmFja0VuZXJneSgpOyAgICAgICAgICAgLy8gd2FzIGVucDMgaW4gZm9ydHJhbiBjb2Rl CiAgICAgIGNvbnN0IEc0ZG91YmxlIHBuQ3V0T2ZmID0gMC4wMDE7CiAgICAgIGNvbnN0IEc0ZG91 YmxlIGR0YUN1dE9mZiA9IDAuMDAxOwogICAgICBjb25zdCBHNGRvdWJsZSBraW5ldGljTWluaW11 bSA9IDEuZS02OwogICAgICBjb25zdCBHNGRvdWJsZSBraW5ldGljRmFjdG9yID0gLTAuMDEwOwog ICAgICBHNGRvdWJsZSBzcHJvYiA9IDAuMDsgLy8gc3Byb2IgPSBwcm9iYWJpbGl0eSBvZiBzZWxm LWFic29ycHRpb24gaW4gaGVhdnkgbW9sZWN1bGVzCiAgICAgIGNvbnN0IEc0ZG91YmxlIGVrSW5j aWRlbnQgPSBvcmlnaW5hbEluY2lkZW50LT5HZXRLaW5ldGljRW5lcmd5KCkvR2VWOwogICAgICBp ZiggZWtJbmNpZGVudCA+PSA1LjAgKXNwcm9iID0gRzRzdGQ6Om1pbiggMS4wLCAwLjYqbG9nKGVr SW5jaWRlbnQtNC4wKSApOwogICAgICBpZiggZXBuYiA+PSBwbkN1dE9mZiApCiAgICAgIHsKICAg ICAgICBucG5iID0gUG9pc3NvbigoMS41KzEuMjUqbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMp KmVwbmIvKGVwbmIrZWR0YSkpOwogICAgICAgIGlmKCBudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9u cyArIG5wbmIgPiBhdG9taWNXZWlnaHQgKQogICAgICAgICAgbnBuYiA9IEc0aW50KGF0b21pY1dl aWdodCswLjAwMDAxIC0gbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMpOwogICAgICAgIG5wbmIg PSBHNHN0ZDo6bWluKCBucG5iLCAxMjctdmVjTGVuICk7CiAgICAgIH0KICAgICAgaWYoIGVkdGEg Pj0gZHRhQ3V0T2ZmICkKICAgICAgewogICAgICAgIG5kdGEgPSBQb2lzc29uKCAoMS41KzEuMjUq bnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMpKmVkdGEvKGVwbmIrZWR0YSkgKTsKICAgICAgICBu ZHRhID0gRzRzdGQ6Om1pbiggbmR0YSwgMTI3LXZlY0xlbiApOwogICAgICB9CiAgICAgIEc0ZG91 YmxlIHNwYWxsID0gbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnM7CiAgICAgIC8vIERFQlVHR0lO RyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgICAgQWRkQmxhY2tU cmFja1BhcnRpY2xlcyggZXBuYiwgbnBuYiwgZWR0YSwgbmR0YSwgc3Byb2IsIGtpbmV0aWNNaW5p bXVtLCBraW5ldGljRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVk T3JpZ2luYWwsIHNwYWxsLCB0YXJnZXROdWNsZXVzLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB2ZWMsIHZlY0xlbiApOwogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1 bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICB9CiAgICBpZiggY2VudGVyb2ZtYXNzRW5lcmd5IDw9 ICg0LjArRzRVbmlmb3JtUmFuZCgpKSApCiAgICAgIE1vbWVudHVtQ2hlY2soIG1vZGlmaWVkT3Jp Z2luYWwsIGN1cnJlbnRQYXJ0aWNsZSwgdGFyZ2V0UGFydGljbGUsIHZlYywgdmVjTGVuICk7CiAg ICAvLwogICAgLy8gIGNhbGN1bGF0ZSB0aW1lIGRlbGF5IGZvciBudWNsZWFyIHJlYWN0aW9ucwog ICAgLy8KICAgIGlmKCAoYXRvbWljV2VpZ2h0ID49IDEuNSkgJiYgKGF0b21pY1dlaWdodCA8PSAy MzAuMCkgJiYgKGVrT3JpZ2luYWwgPD0gMC4yKSApCiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRU T0YoIDEuMC01MDAuMCpleHAoLWVrT3JpZ2luYWwvMC4wNCkqbG9nKEc0VW5pZm9ybVJhbmQoKSkg KTsKICAgIGVsc2UKICAgICAgY3VycmVudFBhcnRpY2xlLlNldFRPRiggMS4wICk7CiAgICByZXR1 cm4gdHJ1ZTsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVj LCB2ZWNMZW4pOwogIH0KIAogdm9pZCBHNFJlYWN0aW9uRHluYW1pY3M6OlN1cHByZXNzQ2hhcmdl ZFBpb25zKAogICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiAmdmVjLAogICBH NGludCAmdmVjTGVuLAogICBjb25zdCBHNFJlYWN0aW9uUHJvZHVjdCAmbW9kaWZpZWRPcmlnaW5h bCwKICAgRzRSZWFjdGlvblByb2R1Y3QgJmN1cnJlbnRQYXJ0aWNsZSwKICAgRzRSZWFjdGlvblBy b2R1Y3QgJnRhcmdldFBhcnRpY2xlLAogICBjb25zdCBHNE51Y2xldXMgJnRhcmdldE51Y2xldXMs CiAgIEc0Ym9vbCAmaW5jaWRlbnRIYXNDaGFuZ2VkLAogICBHNGJvb2wgJnRhcmdldEhhc0NoYW5n ZWQgKQogIHsKICAgIC8vIHRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSBpbiB0aGUgZm9ydHJhbiBj b2RlIFRXT0NMVQogICAgLy8KICAgIC8vIHN1cHByZXNzIGNoYXJnZWQgcGlvbnMsIGZvciB2YXJp b3VzIHJlYXNvbnMKICAgIC8vCiAgICBjb25zdCBHNGRvdWJsZSBhdG9taWNXZWlnaHQgPSB0YXJn ZXROdWNsZXVzLkdldE4oKTsKICAgIGNvbnN0IEc0ZG91YmxlIGF0b21pY051bWJlciA9IHRhcmdl dE51Y2xldXMuR2V0WigpOwogICAgY29uc3QgRzRkb3VibGUgcE9yaWdpbmFsID0gbW9kaWZpZWRP cmlnaW5hbC5HZXRUb3RhbE1vbWVudHVtKCkvR2VWOwogICAgCiAgICAvLyBHNFBhcnRpY2xlRGVm aW5pdGlvbiAqYUdhbW1hID0gRzRHYW1tYTo6R2FtbWEoKTsKICAgIEc0UGFydGljbGVEZWZpbml0 aW9uICphUHJvdG9uID0gRzRQcm90b246OlByb3RvbigpOwogICAgRzRQYXJ0aWNsZURlZmluaXRp b24gKmFuQW50aVByb3RvbiA9IEc0QW50aVByb3Rvbjo6QW50aVByb3RvbigpOwogICAgRzRQYXJ0 aWNsZURlZmluaXRpb24gKmFOZXV0cm9uID0gRzROZXV0cm9uOjpOZXV0cm9uKCk7CiAgICBHNFBh cnRpY2xlRGVmaW5pdGlvbiAqYW5BbnRpTmV1dHJvbiA9IEc0QW50aU5ldXRyb246OkFudGlOZXV0 cm9uKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpTWludXMgPSBHNFBpb25NaW51czo6 UGlvbk1pbnVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpUGx1cyA9IEc0UGlvblBs dXM6OlBpb25QbHVzKCk7CiAgICAKICAgIGNvbnN0IEc0Ym9vbCBhbnRpVGVzdCA9CiAgICAgIG1v ZGlmaWVkT3JpZ2luYWwuR2V0RGVmaW5pdGlvbigpICE9IGFuQW50aVByb3RvbiAmJgogICAgICBt b2RpZmllZE9yaWdpbmFsLkdldERlZmluaXRpb24oKSAhPSBhbkFudGlOZXV0cm9uOwogICAgaWYo IGFudGlUZXN0ICYmICgKICAgICAgIC8vIGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkg PT0gYUdhbW1hIHx8CiAgICAgICAgICBjdXJyZW50UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFQaVBsdXMgfHwKICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0g YVBpTWludXMgKSAmJgogICAgICAgICggRzRVbmlmb3JtUmFuZCgpIDw9ICgxMC4wLXBPcmlnaW5h bCkvNi4wICkgJiYKICAgICAgICAoIEc0VW5pZm9ybVJhbmQoKSA8PSBhdG9taWNXZWlnaHQvMzAw LjAgKSApCiAgICB7CiAgICAgIGlmKCBHNFVuaWZvcm1SYW5kKCkgPiBhdG9taWNOdW1iZXIvYXRv bWljV2VpZ2h0ICkKICAgICAgICBjdXJyZW50UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0 ZUUoIGFOZXV0cm9uICk7CiAgICAgIGVsc2UKICAgICAgICBjdXJyZW50UGFydGljbGUuU2V0RGVm aW5pdGlvbkFuZFVwZGF0ZUUoIGFQcm90b24gKTsKICAgICAgaW5jaWRlbnRIYXNDaGFuZ2VkID0g dHJ1ZTsKICAgIH0KICAgIGlmKCBhbnRpVGVzdCAmJiAoCiAgICAgICAvLyB0YXJnZXRQYXJ0aWNs ZS5HZXREZWZpbml0aW9uKCkgPT0gYUdhbW1hIHx8CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5H ZXREZWZpbml0aW9uKCkgPT0gYVBpUGx1cyB8fAogICAgICAgICAgdGFyZ2V0UGFydGljbGUuR2V0 RGVmaW5pdGlvbigpID09IGFQaU1pbnVzICkgJiYKICAgICAgICAoIEc0VW5pZm9ybVJhbmQoKSA8 PSAoMTAuMC1wT3JpZ2luYWwpLzYuMCApICYmCiAgICAgICAgKCBHNFVuaWZvcm1SYW5kKCkgPD0g YXRvbWljV2VpZ2h0LzMwMC4wICkgKQogICAgewogICAgICBpZiggRzRVbmlmb3JtUmFuZCgpID4g YXRvbWljTnVtYmVyL2F0b21pY1dlaWdodCApCiAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0RGVm aW5pdGlvbkFuZFVwZGF0ZUUoIGFOZXV0cm9uICk7CiAgICAgIGVsc2UKICAgICAgICB0YXJnZXRQ YXJ0aWNsZS5TZXREZWZpbml0aW9uQW5kVXBkYXRlRSggYVByb3RvbiApOwogICAgICB0YXJnZXRI YXNDaGFuZ2VkID0gdHJ1ZTsKICAgIH0KICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVz OjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgZm9yKCBHNGludCBpPTA7IGk8dmVjTGVuOyAr K2kgKQogICAgewogICAgICBpZiggYW50aVRlc3QgJiYgKAogICAgICAgICAvLyB2ZWNbaV0tPkdl dERlZmluaXRpb24oKSA9PSBhR2FtbWEgfHwKICAgICAgICAgICAgdmVjW2ldLT5HZXREZWZpbml0 aW9uKCkgPT0gYVBpUGx1cyB8fAogICAgICAgICAgICB2ZWNbaV0tPkdldERlZmluaXRpb24oKSA9 PSBhUGlNaW51cyApICYmCiAgICAgICAgICAoIEc0VW5pZm9ybVJhbmQoKSA8PSAoMTAuMC1wT3Jp Z2luYWwpLzYuMCApICYmCiAgICAgICAgICAoIEc0VW5pZm9ybVJhbmQoKSA8PSBhdG9taWNXZWln aHQvMzAwLjAgKSApCiAgICAgIHsKICAgICAgICBpZiggRzRVbmlmb3JtUmFuZCgpID4gYXRvbWlj TnVtYmVyL2F0b21pY1dlaWdodCApCiAgICAgICAgICB2ZWNbaV0tPlNldERlZmluaXRpb25BbmRV cGRhdGVFKCBhTmV1dHJvbiApOwogICAgICAgIGVsc2UKICAgICAgICAgIHZlY1tpXS0+U2V0RGVm aW5pdGlvbkFuZFVwZGF0ZUUoIGFQcm90b24gKTsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1w RnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgICB9CiAgICB9CiAgICAgIC8vIERF QlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICB9CiAKIEc0 Ym9vbCBHNFJlYWN0aW9uRHluYW1pY3M6OlR3b0NsdXN0ZXIoCiAgIEc0RmFzdFZlY3RvcjxHNFJl YWN0aW9uUHJvZHVjdCwxMjg+ICZ2ZWMsCiAgIEc0aW50ICZ2ZWNMZW4sCiAgIEc0UmVhY3Rpb25Q cm9kdWN0ICZtb2RpZmllZE9yaWdpbmFsLCAvLyBGZXJtaSBtb3Rpb24gJiBldmFwLiBlZmZlY3Rz IGluY2x1ZGVkCiAgIGNvbnN0IEc0RHluYW1pY1BhcnRpY2xlICpvcmlnaW5hbEluY2lkZW50LCAv LyB0aGUgb3JpZ2luYWwgaW5jaWRlbnQgcGFydGljbGUKICAgRzRSZWFjdGlvblByb2R1Y3QgJmN1 cnJlbnRQYXJ0aWNsZSwKICAgRzRSZWFjdGlvblByb2R1Y3QgJnRhcmdldFBhcnRpY2xlLAogICBj b25zdCBHNE51Y2xldXMgJnRhcmdldE51Y2xldXMsCiAgIEc0Ym9vbCAmaW5jaWRlbnRIYXNDaGFu Z2VkLAogICBHNGJvb2wgJnRhcmdldEhhc0NoYW5nZWQsCiAgIEc0Ym9vbCBsZWFkRmxhZywKICAg RzRSZWFjdGlvblByb2R1Y3QgJmxlYWRpbmdTdHJhbmdlUGFydGljbGUgKQogIHsKICAgICAgLy8g REVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgLy8g ZGVyaXZlZCBmcm9tIG9yaWdpbmFsIEZPUlRSQU4gY29kZSBUV09DTFUgYnkgSC4gRmVzZWZlbGR0 ICgxMS1PY3QtMTk4NykKICAgIC8vCiAgICAvLyAgR2VuZXJhdGlvbiBvZiBYLSBhbmQgUFQtIHZh bHVlcyBmb3IgaW5jaWRlbnQsIHRhcmdldCwgYW5kIGFsbCBzZWNvbmRhcnkgcGFydGljbGVzIAog ICAgLy8gIAogICAgLy8gIEEgc2ltcGxlIHR3byBjbHVzdGVyIG1vZGVsIGlzIHVzZWQuCiAgICAv LyAgVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbG93IGVuZXJneSBpbnRlcmFjdGlvbnMu CiAgICAvLwogICAgRzRpbnQgaTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphUGlNaW51cyA9 IEc0UGlvbk1pbnVzOjpQaW9uTWludXMoKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphUHJv dG9uID0gRzRQcm90b246OlByb3RvbigpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFOZXV0 cm9uID0gRzROZXV0cm9uOjpOZXV0cm9uKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBp UGx1cyA9IEc0UGlvblBsdXM6OlBpb25QbHVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAq YVBpWmVybyA9IEc0UGlvblplcm86OlBpb25aZXJvKCk7CiAgICBjb25zdCBHNGRvdWJsZSBwcm90 b25NYXNzID0gYVByb3Rvbi0+R2V0UERHTWFzcygpL01lVjsKICAgIGNvbnN0IEc0ZG91YmxlIGVr T3JpZ2luYWwgPSBtb2RpZmllZE9yaWdpbmFsLkdldEtpbmV0aWNFbmVyZ3koKS9HZVY7CiAgICBj b25zdCBHNGRvdWJsZSBldE9yaWdpbmFsID0gbW9kaWZpZWRPcmlnaW5hbC5HZXRUb3RhbEVuZXJn eSgpL0dlVjsKICAgIGNvbnN0IEc0ZG91YmxlIG1PcmlnaW5hbCA9IG1vZGlmaWVkT3JpZ2luYWwu R2V0TWFzcygpL0dlVjsKICAgIGNvbnN0IEc0ZG91YmxlIHBPcmlnaW5hbCA9IG1vZGlmaWVkT3Jp Z2luYWwuR2V0TW9tZW50dW0oKS5tYWcoKS9HZVY7CiAgICBHNGRvdWJsZSB0YXJnZXRNYXNzID0g dGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpLT5HZXRQREdNYXNzKCkvR2VWOwogICAgRzRk b3VibGUgY2VudGVyb2ZtYXNzRW5lcmd5ID0gc3FydCggbU9yaWdpbmFsKm1PcmlnaW5hbCArCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXNzKnRhcmdldE1h c3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wKnRhcmdldE1h c3MqZXRPcmlnaW5hbCApOyAgLy8gR2VWCiAgICBHNGRvdWJsZSBjdXJyZW50TWFzcyA9IGN1cnJl bnRQYXJ0aWNsZS5HZXRNYXNzKCkvR2VWOwogICAgdGFyZ2V0TWFzcyA9IHRhcmdldFBhcnRpY2xl LkdldE1hc3MoKS9HZVY7CiAgICBpZiggY3VycmVudE1hc3MgPT0gMC4wICYmIHRhcmdldE1hc3Mg PT0gMC4wICkKICAgIHsKICAgICAgRzRkb3VibGUgZWsgPSBjdXJyZW50UGFydGljbGUuR2V0S2lu ZXRpY0VuZXJneSgpOwogICAgICBHNFRocmVlVmVjdG9yIG0gPSBjdXJyZW50UGFydGljbGUuR2V0 TW9tZW50dW0oKTsKICAgICAgY3VycmVudFBhcnRpY2xlID0gKnZlY1swXTsKICAgICAgdGFyZ2V0 UGFydGljbGUgPSAqdmVjWzFdOwogICAgICBmb3IoIGk9MDsgaTwodmVjTGVuLTIpOyArK2kgKSp2 ZWNbaV0gPSAqdmVjW2krMl07CiAgICAgIGlmKHZlY0xlbjwyKSBHNEV4Y2VwdGlvbigiRzRSZWFj dGlvbkR5bmFtaWNzOjpUd29DbHVzdGVyOiBOZWdhdGl2ZSBudW1iZXIgb2YgcGFydGljbGVzIik7 CiAgICAgIGRlbGV0ZSB2ZWNbdmVjTGVuLTFdOwogICAgICBkZWxldGUgdmVjW3ZlY0xlbi0yXTsK ICAgICAgdmVjTGVuIC09IDI7CiAgICAgIGN1cnJlbnRNYXNzID0gY3VycmVudFBhcnRpY2xlLkdl dE1hc3MoKS9HZVY7CiAgICAgIHRhcmdldE1hc3MgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkv R2VWOwogICAgICBpbmNpZGVudEhhc0NoYW5nZWQgPSB0cnVlOwogICAgICB0YXJnZXRIYXNDaGFu Z2VkID0gdHJ1ZTsKICAgICAgY3VycmVudFBhcnRpY2xlLlNldEtpbmV0aWNFbmVyZ3koIGVrICk7 CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggbSApOwogICAgfQogICAgY29uc3Qg RzRkb3VibGUgYXRvbWljV2VpZ2h0ID0gdGFyZ2V0TnVjbGV1cy5HZXROKCk7CiAgICBjb25zdCBH NGRvdWJsZSBhdG9taWNOdW1iZXIgPSB0YXJnZXROdWNsZXVzLkdldFooKTsKICAgIC8vCiAgICAv LyBwYXJ0aWNsZXMgaGF2ZSBiZWVuIGRpc3RyaWJ1dGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJk IGhlbWlzcGhlcmVzCiAgICAvLyBpbiBjZW50ZXIgb2YgbWFzcyBzeXN0ZW0gb2YgdGhlIGhhZHJv biBudWNsZW9uIGludGVyYWN0aW9uCiAgICAvLwogICAgLy8gaW5jaWRlbnQgaXMgYWx3YXlzIGlu IGZvcndhcmQgaGVtaXNwaGVyZQogICAgRzRpbnQgZm9yd2FyZENvdW50ID0gMTsgICAgICAgICAg ICAvLyBudW1iZXIgb2YgcGFydGljbGVzIGluIGZvcndhcmQgaGVtaXNwaGVyZQogICAgY3VycmVu dFBhcnRpY2xlLlNldFNpZGUoIDEgKTsKICAgIEc0ZG91YmxlIGZvcndhcmRNYXNzID0gY3VycmVu dFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7CiAgICAKICAgIC8vIHRhcmdldCBpcyBhbHdheXMgaW4g YmFja3dhcmQgaGVtaXNwaGVyZQogICAgRzRpbnQgYmFja3dhcmRDb3VudCA9IDE7ICAgICAgICAg ICAvLyBudW1iZXIgb2YgcGFydGljbGVzIGluIGJhY2t3YXJkIGhlbWlzcGhlcmUKICAgIEc0aW50 IGJhY2t3YXJkTnVjbGVvbkNvdW50ID0gMTsgICAgLy8gbnVtYmVyIG9mIG51Y2xlb25zIGluIGJh Y2t3YXJkIGhlbWlzcGhlcmUKICAgIHRhcmdldFBhcnRpY2xlLlNldFNpZGUoIC0xICk7CiAgICBH NGRvdWJsZSBiYWNrd2FyZE1hc3MgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkvR2VWOwogICAg CiAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICB7CiAgICAgIGlmKCB2ZWNbaV0tPkdl dFNpZGUoKSA8IDAgKXZlY1tpXS0+U2V0U2lkZSggLTEgKTsgLy8gYWRkZWQgYnkgSkxDLCAySnVs OTcKICAgICAgLy8gdG8gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIHdoZXJlIHZlYyBoYXMgYmVlbiBw cmVwcm9jZXNzZWQgYnkgR2VuZXJhdGVYYW5kUHQKICAgICAgLy8gYW5kIHNvbWUgb2YgdGhlbSBo YXZlIGJlZW4gc2V0IHRvIC0yIG9yIC0zCiAgICAgIGlmKCB2ZWNbaV0tPkdldFNpZGUoKSA9PSAt MSApCiAgICAgIHsKICAgICAgICArK2JhY2t3YXJkQ291bnQ7CiAgICAgICAgYmFja3dhcmRNYXNz ICs9IHZlY1tpXS0+R2V0TWFzcygpL0dlVjsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAg ICAgICArK2ZvcndhcmRDb3VudDsKICAgICAgICBmb3J3YXJkTWFzcyArPSB2ZWNbaV0tPkdldE1h c3MoKS9HZVY7CiAgICAgIH0KICAgIH0KICAgIC8vCiAgICAvLyBudWNsZW9ucyBhbmQgc29tZSBw aW9ucyBmcm9tIGludHJhbnVjbGVhciBjYXNjYWRlCiAgICAvLwogICAgRzRkb3VibGUgdGVybTEg PSBsb2coY2VudGVyb2ZtYXNzRW5lcmd5KmNlbnRlcm9mbWFzc0VuZXJneSk7CiAgICBpZih0ZXJt MSA8IDApIHRlcm0xID0gMC4wMDAxOyAvLyBtYWtpbmcgc3VyZSB4dGFyZzwwOwogICAgY29uc3Qg RzRkb3VibGUgYWZjID0gMC4zMTIgKyAwLjIgKiBsb2codGVybTEpOwogICAgRzRkb3VibGUgeHRh cmc7CiAgICBpZiggY2VudGVyb2ZtYXNzRW5lcmd5IDwgMi4wK0c0VW5pZm9ybVJhbmQoKSApICAg ICAgICAvLyBhZGRlZCArMiBiZWxvdywgSkxDIDRKdWw5NwogICAgICB4dGFyZyA9IGFmYyAqIChw b3coYXRvbWljV2VpZ2h0LDAuMzMpLTEuMCkgKiAoMipiYWNrd2FyZENvdW50K3ZlY0xlbisyKS8y LjA7CiAgICBlbHNlCiAgICAgIHh0YXJnID0gYWZjICogKHBvdyhhdG9taWNXZWlnaHQsMC4zMykt MS4wKSAqICgyKmJhY2t3YXJkQ291bnQpOwogICAgaWYoIHh0YXJnIDw9IDAuMCApeHRhcmcgPSAw LjAxOwogICAgRzRpbnQgbnVjbGVhckV4Y2l0YXRpb25Db3VudCA9IFBvaXNzb24oIHh0YXJnICk7 CiAgICBHNGludCBleHRyYU51Y2xlb25Db3VudCA9IDA7CiAgICBHNGRvdWJsZSBleHRyYU1hc3Mg PSAwLjA7CiAgICBHNGRvdWJsZSBleHRyYU51Y2xlb25NYXNzID0gMC4wOwogICAgaWYoIG51Y2xl YXJFeGNpdGF0aW9uQ291bnQgPiAwICkKICAgIHsKICAgICAgRzRpbnQgbW9tZW50dW1CaW4gPSBH NHN0ZDo6bWluKCA0LCBHNGludChwT3JpZ2luYWwvMy4wKSApOyAgICAgCiAgICAgIGNvbnN0IEc0 ZG91YmxlIG51Y3N1cFtdID0geyAxLjAsIDAuOCwgMC42LCAwLjUsIDAuNCB9OwogICAgICAvLwog ICAgICAvLyAgTk9URTogaW4gVFdPQ0xVLCB0aGVzZSBuZXcgcGFydGljbGVzIHdlcmUgZ2l2ZW4g bmVnYXRpdmUgY29kZXMKICAgICAgLy8gICAgICAgIGhlcmUgd2UgdXNlICBOZXdseUFkZGVkID0g dHJ1ZSAgaW5zdGVhZAogICAgICAvLwovLyAgICAgIEc0UmVhY3Rpb25Qcm9kdWN0ICpwVmVjID0g bmV3IEc0UmVhY3Rpb25Qcm9kdWN0IFtudWNsZWFyRXhjaXRhdGlvbkNvdW50XTsKICAgICAgZm9y KCBpPTA7IGk8bnVjbGVhckV4Y2l0YXRpb25Db3VudDsgKytpICkKICAgICAgewogICAgICAgIEc0 UmVhY3Rpb25Qcm9kdWN0KiBwVmVjID0gbmV3IEc0UmVhY3Rpb25Qcm9kdWN0KCk7CiAgICAgICAg aWYoIEc0VW5pZm9ybVJhbmQoKSA8IG51Y3N1cFttb21lbnR1bUJpbl0gKSAgLy8gYWRkIHByb3Rv biBvciBuZXV0cm9uCiAgICAgICAgewogICAgICAgICAgaWYoIEc0VW5pZm9ybVJhbmQoKSA+IDEu MC1hdG9taWNOdW1iZXIvYXRvbWljV2VpZ2h0ICkKICAgICAgICAgICAgLy8gSFBXOiBsb29rcyBs aWtlIGEgZ2hlaXNoYSBidWcgCiAgICAgICAgICAgIHBWZWMtPlNldERlZmluaXRpb24oIGFQcm90 b24gKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcFZlYy0+U2V0RGVmaW5pdGlvbiggYU5l dXRyb24gKTsKICAgICAgICAgICsrYmFja3dhcmROdWNsZW9uQ291bnQ7CiAgICAgICAgICArK2V4 dHJhTnVjbGVvbkNvdW50OwogICAgICAgICAgZXh0cmFOdWNsZW9uTWFzcyArPSBwVmVjLT5HZXRN YXNzKCkvR2VWOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgeyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhIHBpb24KICAgICAgICAgIEc0ZG91Ymxl IHJhbiA9IEc0VW5pZm9ybVJhbmQoKTsKICAgICAgICAgIGlmKCByYW4gPCAwLjMxMiApCiAgICAg ICAgICAgIHBWZWMtPlNldERlZmluaXRpb24oIGFQaVBsdXMgKTsKICAgICAgICAgIGVsc2UgaWYo IHJhbiA8IDAuNjg4ICkKICAgICAgICAgICAgcFZlYy0+U2V0RGVmaW5pdGlvbiggYVBpWmVybyAp OwogICAgICAgICAgZWxzZQogICAgICAgICAgICBwVmVjLT5TZXREZWZpbml0aW9uKCBhUGlNaW51 cyApOwogICAgICAgIH0KICAgICAgICBwVmVjLT5TZXRTaWRlKCAtMiApOyAgICAvLyBiYWNrc2lk ZSBwYXJ0aWNsZQogICAgICAgIGV4dHJhTWFzcyArPSBwVmVjLT5HZXRNYXNzKCkvR2VWOwogICAg ICAgIHBWZWMtPlNldE5ld2x5QWRkZWQoIHRydWUgKTsKICAgICAgICB2ZWMuU2V0RWxlbWVudCgg dmVjTGVuKyssIHBWZWMgKTsKICAgICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1 bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgIH0KICAgIH0KICAgICAgLy8gREVCVUdHSU5HIC0t PiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgRzRkb3VibGUgZm9yd2Fy ZEVuZXJneSA9IGNlbnRlcm9mbWFzc0VuZXJneS8yLjAgLSBmb3J3YXJkTWFzczsKICAgIEc0ZG91 YmxlIGJhY2t3YXJkRW5lcmd5ID0gY2VudGVyb2ZtYXNzRW5lcmd5LzIuMCAtIGJhY2t3YXJkTWFz czsKICAgIEc0ZG91YmxlIGVBdmFpbGFibGUgPSBjZW50ZXJvZm1hc3NFbmVyZ3kgLSAoZm9yd2Fy ZE1hc3MrYmFja3dhcmRNYXNzKTsKICAgIEc0Ym9vbCBzZWNvbmRhcnlEZWxldGVkOwogICAgRzRk b3VibGUgcE1hc3M7CiAgICB3aGlsZSggZUF2YWlsYWJsZSA8PSAwLjAgKSAgIC8vIG11c3QgZWxp bWluYXRlIGEgcGFydGljbGUKICAgIHsKICAgICAgc2Vjb25kYXJ5RGVsZXRlZCA9IGZhbHNlOwog ICAgICBmb3IoIGk9KHZlY0xlbi0xKTsgaT49MDsgLS1pICkKICAgICAgewogICAgICAgIGlmKCB2 ZWNbaV0tPkdldFNpZGUoKSA9PSAxICkKICAgICAgICB7CiAgICAgICAgICBwTWFzcyA9IHZlY1tp XS0+R2V0TWFzcygpL0dlVjsKICAgICAgICAgIGZvciggRzRpbnQgaj1pOyBqPCh2ZWNMZW4tMSk7 ICsraiApKnZlY1tqXSA9ICp2ZWNbaisxXTsgICAgIC8vIHNoaWZ0IHVwCiAgICAgICAgICAtLWZv cndhcmRDb3VudDsKICAgICAgICAgIGZvcndhcmRFbmVyZ3kgKz0gcE1hc3M7CiAgICAgICAgICBm b3J3YXJkTWFzcyAtPSBwTWFzczsKICAgICAgICAgIHNlY29uZGFyeURlbGV0ZWQgPSB0cnVlOwog ICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIHZlY1tpXS0+R2V0U2lk ZSgpID09IC0xICkKICAgICAgICB7CiAgICAgICAgICBwTWFzcyA9IHZlY1tpXS0+R2V0TWFzcygp L0dlVjsKICAgICAgICAgIGZvciggRzRpbnQgaj1pOyBqPCh2ZWNMZW4tMSk7ICsraiApKnZlY1tq XSA9ICp2ZWNbaisxXTsgICAgLy8gc2hpZnQgdXAKICAgICAgICAgIC0tYmFja3dhcmRDb3VudDsK ICAgICAgICAgIGJhY2t3YXJkRW5lcmd5ICs9IHBNYXNzOwogICAgICAgICAgYmFja3dhcmRNYXNz IC09IHBNYXNzOwogICAgICAgICAgc2Vjb25kYXJ5RGVsZXRlZCA9IHRydWU7CiAgICAgICAgICBi cmVhazsKICAgICAgICB9CiAgICAgIH0gICAgICAgICAgIC8vIGJyZWFrcyBnbyBkb3duIHRvIGhl cmUKICAgICAgaWYoIHNlY29uZGFyeURlbGV0ZWQgKQogICAgICB7ICAgICAgCiAgICAgICAgRzRS ZWFjdGlvblByb2R1Y3QgKnRlbXAgPSB2ZWNbdmVjTGVuLTFdOwogICAgICAgIGRlbGV0ZSB0ZW1w OwogICAgICAgIC0tdmVjTGVuOwogICAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6 RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAg ICBpZiggdmVjTGVuID09IDAgKQoJewoJICByZXR1cm4gZmFsc2U7ICAvLyBhbGwgc2Vjb25kYXJp ZXMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQKCX0KICAgICAgICBpZiggdGFyZ2V0UGFydGljbGUuR2V0 U2lkZSgpID09IC0xICkKICAgICAgICB7CiAgICAgICAgICBwTWFzcyA9IHRhcmdldFBhcnRpY2xl LkdldE1hc3MoKS9HZVY7CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZSA9ICp2ZWNbMF07CiAgICAg ICAgICBmb3IoIEc0aW50IGo9MDsgajwodmVjTGVuLTEpOyArK2ogKSp2ZWNbal0gPSAqdmVjW2or MV07ICAgIC8vIHNoaWZ0IHVwCiAgICAgICAgICAtLWJhY2t3YXJkQ291bnQ7CiAgICAgICAgICBi YWNrd2FyZEVuZXJneSArPSBwTWFzczsKICAgICAgICAgIGJhY2t3YXJkTWFzcyAtPSBwTWFzczsK ICAgICAgICAgIHNlY29uZGFyeURlbGV0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNl IGlmKCB0YXJnZXRQYXJ0aWNsZS5HZXRTaWRlKCkgPT0gMSApCiAgICAgICAgewogICAgICAgICAg cE1hc3MgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkvR2VWOwogICAgICAgICAgdGFyZ2V0UGFy dGljbGUgPSAqdmVjWzBdOwogICAgICAgICAgZm9yKCBHNGludCBqPTA7IGo8KHZlY0xlbi0xKTsg KytqICkqdmVjW2pdID0gKnZlY1tqKzFdOyAgICAvLyBzaGlmdCB1cAogICAgICAgICAgLS1mb3J3 YXJkQ291bnQ7CiAgICAgICAgICBmb3J3YXJkRW5lcmd5ICs9IHBNYXNzOwogICAgICAgICAgZm9y d2FyZE1hc3MgLT0gcE1hc3M7CiAgICAgICAgICBzZWNvbmRhcnlEZWxldGVkID0gdHJ1ZTsKICAg ICAgICB9CiAgICAgICAgaWYoIHNlY29uZGFyeURlbGV0ZWQgKQogICAgICAgIHsKICAgICAgICAg IEc0UmVhY3Rpb25Qcm9kdWN0ICp0ZW1wID0gdmVjW3ZlY0xlbi0xXTsKICAgICAgICAgIGRlbGV0 ZSB0ZW1wOwogICAgICAgICAgLS12ZWNMZW47CiAgICAgICAgICAvLyBERUJVR0dJTkcgLS0+IER1 bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgICAgfQogICAgICAgIGVsc2UK ICAgICAgICB7CiAgICAgICAgICBpZiggY3VycmVudFBhcnRpY2xlLkdldFNpZGUoKSA9PSAtMSAp CiAgICAgICAgICB7CiAgICAgICAgICAgIHBNYXNzID0gY3VycmVudFBhcnRpY2xlLkdldE1hc3Mo KS9HZVY7CiAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZSA9ICp2ZWNbMF07CiAgICAgICAgICAg IGZvciggRzRpbnQgaj0wOyBqPCh2ZWNMZW4tMSk7ICsraiApKnZlY1tqXSA9ICp2ZWNbaisxXTsg ICAgLy8gc2hpZnQgdXAKICAgICAgICAgICAgLS1iYWNrd2FyZENvdW50OwogICAgICAgICAgICBi YWNrd2FyZEVuZXJneSArPSBwTWFzczsKICAgICAgICAgICAgYmFja3dhcmRNYXNzIC09IHBNYXNz OwogICAgICAgICAgICBzZWNvbmRhcnlEZWxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAg ICAgIGVsc2UgaWYoIGN1cnJlbnRQYXJ0aWNsZS5HZXRTaWRlKCkgPT0gMSApCiAgICAgICAgICB7 CiAgICAgICAgICAgIHBNYXNzID0gY3VycmVudFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7CiAgICAg ICAgICAgIGN1cnJlbnRQYXJ0aWNsZSA9ICp2ZWNbMF07CiAgICAgICAgICAgIGZvciggRzRpbnQg aj0wOyBqPCh2ZWNMZW4tMSk7ICsraiApKnZlY1tqXSA9ICp2ZWNbaisxXTsgICAgLy8gc2hpZnQg dXAKICAgICAgICAgICAgLS1mb3J3YXJkQ291bnQ7CiAgICAgICAgICAgIGZvcndhcmRFbmVyZ3kg Kz0gcE1hc3M7CiAgICAgICAgICAgIGZvcndhcmRNYXNzIC09IHBNYXNzOwogICAgICAgICAgICBz ZWNvbmRhcnlEZWxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmKCBzZWNvbmRh cnlEZWxldGVkICkKICAgICAgICAgIHsKICAgICAgICAgICAgRzRSZWFjdGlvblByb2R1Y3QgKnRl bXAgPSB2ZWNbdmVjTGVuLTFdOwogICAgICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICAgICAg LS12ZWNMZW47CiAgICAgICAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZy YW1lKHZlYywgdmVjTGVuKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgYnJlYWs7CiAgICAg ICAgfQogICAgICB9CiAgICAgIGVBdmFpbGFibGUgPSBjZW50ZXJvZm1hc3NFbmVyZ3kgLSAoZm9y d2FyZE1hc3MrYmFja3dhcmRNYXNzKTsKICAgIH0KICAgIC8vCiAgICAvLyBUaGlzIGlzIHRoZSBz dGFydCBvZiB0aGUgVHdvQ2x1c3RlciBmdW5jdGlvbgogICAgLy8gIENob29zZSBtYXNzZXMgZm9y IHRoZSAzIGNsdXN0ZXJzOgogICAgLy8gICBmb3J3YXJkIGNsdXN0ZXIKICAgIC8vICAgYmFja3dh cmQgbWVzb24gY2x1c3RlcgogICAgLy8gICBiYWNrd2FyZCBudWNsZW9uIGNsdXN0ZXIKICAgIC8v CiAgICBHNGRvdWJsZSBybWMgPSAwLjAsIHJtZCA9IDAuMDsgLy8gcm1lID0gMC4wOwogICAgY29u c3QgRzRkb3VibGUgY3BhcltdID0geyAwLjYsIDAuNiwgMC4zNSwgMC4xNSwgMC4xMCB9OwogICAg Y29uc3QgRzRkb3VibGUgZ3BhcltdID0geyAyLjYsIDIuNiwgMS44LCAxLjMwLCAxLjIwIH07CiAg ICAKICAgIGlmKCBmb3J3YXJkQ291bnQgPT0gMSApcm1jID0gZm9yd2FyZE1hc3M7CiAgICBlbHNl CiAgICB7Ci8vICAgICAgRzRpbnQgbnRjID0gRzRzdGQ6Om1pbig1LGZvcndhcmRDb3VudCk7IC8v IGNoZWNrIGlmIG9mZnNldCBieSAxIEBACiAgICAgIEc0aW50IG50YyA9IEc0c3RkOjptYXgoMSwg RzRzdGQ6Om1pbig1LGZvcndhcmRDb3VudCkpOyAvLyBjaGVjayBpZiBvZmZzZXQgYnkgMSBAQAog ICAgICBybWMgPSBmb3J3YXJkTWFzcyArIHBvdygtbG9nKDEuMC1HNFVuaWZvcm1SYW5kKCkpLGNw YXJbbnRjLTFdKS9ncGFyW250Yy0xXTsKICAgIH0KICAgIGlmKCBiYWNrd2FyZENvdW50ID09IDEg KXJtZCA9IGJhY2t3YXJkTWFzczsKICAgIGVsc2UKICAgIHsKLy8gICAgICBHNGludCBudGMgPSBH NHN0ZDo6bWluKDUsYmFja3dhcmRDb3VudCk7IC8vIGNoZWNrLCBpZiBvZmZmc2V0IGJ5IDEgQEAK ICAgICAgRzRpbnQgbnRjID0gRzRzdGQ6Om1heCgxLCBHNHN0ZDo6bWluKDUsYmFja3dhcmRDb3Vu dCkpOyAvLyBjaGVjaywgaWYgb2ZmZnNldCBieSAxIEBACiAgICAgIHJtZCA9IGJhY2t3YXJkTWFz cyArIHBvdygtbG9nKDEuMC1HNFVuaWZvcm1SYW5kKCkpLGNwYXJbbnRjLTFdKS9ncGFyW250Yy0x XTsKICAgIH0KICAgIHdoaWxlKCBybWMrcm1kID4gY2VudGVyb2ZtYXNzRW5lcmd5ICkKICAgIHsK ICAgICAgaWYoIChybWMgPD0gZm9yd2FyZE1hc3MpICYmIChybWQgPD0gYmFja3dhcmRNYXNzKSAp CiAgICAgIHsKICAgICAgICBHNGRvdWJsZSB0ZW1wID0gMC45OTkqY2VudGVyb2ZtYXNzRW5lcmd5 LyhybWMrcm1kKTsKICAgICAgICBybWMgKj0gdGVtcDsKICAgICAgICBybWQgKj0gdGVtcDsKICAg ICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBybWMgPSAwLjEqZm9yd2FyZE1hc3MgKyAw Ljkqcm1jOwogICAgICAgIHJtZCA9IDAuMSpiYWNrd2FyZE1hc3MgKyAwLjkqcm1kOwogICAgICB9 CiAgICB9CiAgICAvLyBub3RlIHRoYXQgcm1lIGlzIG5ldmVyIHVzZWQgYmVsb3cgdGhpcyBzZWN0 aW9uCiAgICAvLwogICAgLy9pZiggbnVjbGVhckV4Y2l0YXRpb25Db3VudCA9PSAwIClybWUgPSAw LjA7CiAgICAvL2Vsc2UgaWYoIG51Y2xlYXJFeGNpdGF0aW9uQ291bnQgPT0gMSApcm1lID0gZXh0 cmFNYXNzOwogICAgLy9lbHNlCiAgICAvL3sKICAgIC8vICBHNGludCBudGMgPSBHNHN0ZDo6bWlu KDUsbnVjbGVhckV4Y2l0YXRpb25Db3VudCktMTsKICAgIC8vICBybWUgPSBleHRyYU1hc3MgKyBw b3coLWxvZygxLi1HNFVuaWZvcm1SYW5kKCkpLGNwYXJbbnRjXSkvZ3BhcltudGNdOwogICAgLy99 CiAgICAvLwogICAgLy8gIFNldCBiZWFtLCB0YXJnZXQgb2YgZmlyc3QgaW50ZXJhY3Rpb24gaW4g Y2VudHJlIG9mIG1hc3Mgc3lzdGVtCiAgICAvLwogICAgRzRSZWFjdGlvblByb2R1Y3QgcHNldWRv UGFydGljbGVbOF07CiAgICBmb3IoIGk9MDsgaTw4OyArK2kgKXBzZXVkb1BhcnRpY2xlW2ldLlNl dFplcm8oKTsKICAgIAogICAgcHNldWRvUGFydGljbGVbMV0uU2V0TWFzcyggbU9yaWdpbmFsKkdl ViApOwogICAgcHNldWRvUGFydGljbGVbMV0uU2V0VG90YWxFbmVyZ3koIGV0T3JpZ2luYWwqR2VW ICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVsxXS5TZXRNb21lbnR1bSggMC4wLCAwLjAsIHBPcmlnaW5h bCpHZVYgKTsKICAgIAogICAgcHNldWRvUGFydGljbGVbMl0uU2V0TWFzcyggcHJvdG9uTWFzcypN ZVYgKTsKICAgIHBzZXVkb1BhcnRpY2xlWzJdLlNldFRvdGFsRW5lcmd5KCBwcm90b25NYXNzKk1l ViApOwogICAgcHNldWRvUGFydGljbGVbMl0uU2V0TW9tZW50dW0oIDAuMCwgMC4wLCAwLjAgKTsK ICAgIC8vCiAgICAvLyAgdHJhbnNmb3JtIGludG8gY2VudHJlIG9mIG1hc3Mgc3lzdGVtCiAgICAv LwogICAgcHNldWRvUGFydGljbGVbMF0gPSBwc2V1ZG9QYXJ0aWNsZVsxXSArIHBzZXVkb1BhcnRp Y2xlWzJdOwogICAgcHNldWRvUGFydGljbGVbMV0uTG9yZW50eiggcHNldWRvUGFydGljbGVbMV0s IHBzZXVkb1BhcnRpY2xlWzBdICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVsyXS5Mb3JlbnR6KCBwc2V1 ZG9QYXJ0aWNsZVsyXSwgcHNldWRvUGFydGljbGVbMF0gKTsKICAgIAogICAgY29uc3QgRzRkb3Vi bGUgcGZNaW4gPSAwLjAwMDE7CiAgICBHNGRvdWJsZSBwZiA9IChjZW50ZXJvZm1hc3NFbmVyZ3kq Y2VudGVyb2ZtYXNzRW5lcmd5K3JtZCpybWQtcm1jKnJtYyk7CiAgICBwZiAqPSBwZjsKICAgIHBm IC09IDQqY2VudGVyb2ZtYXNzRW5lcmd5KmNlbnRlcm9mbWFzc0VuZXJneSpybWQqcm1kOwogICAg cGYgPSBzcXJ0KCBHNHN0ZDo6bWF4KHBmLHBmTWluKSApLygyLjAqY2VudGVyb2ZtYXNzRW5lcmd5 KTsKICAgIC8vCiAgICAvLyAgc2V0IGZpbmFsIHN0YXRlIG1hc3NlcyBhbmQgZW5lcmdpZXMgaW4g Y2VudHJlIG9mIG1hc3Mgc3lzdGVtCiAgICAvLwogICAgcHNldWRvUGFydGljbGVbM10uU2V0TWFz cyggcm1jKkdlViApOwogICAgcHNldWRvUGFydGljbGVbM10uU2V0VG90YWxFbmVyZ3koIHNxcnQo cGYqcGYrcm1jKnJtYykqR2VWICk7CiAgICAKICAgIHBzZXVkb1BhcnRpY2xlWzRdLlNldE1hc3Mo IHJtZCpHZVYgKTsKICAgIHBzZXVkb1BhcnRpY2xlWzRdLlNldFRvdGFsRW5lcmd5KCBzcXJ0KHBm KnBmK3JtZCpybWQpKkdlViApOwogICAgLy8KICAgIC8vIHNldCB8VHwgYW5kIHxUTUlOfAogICAg Ly8KICAgIGNvbnN0IEc0ZG91YmxlIGJNaW4gPSAwLjAxOwogICAgY29uc3QgRzRkb3VibGUgYjEg PSA0LjA7CiAgICBjb25zdCBHNGRvdWJsZSBiMiA9IDEuNjsKICAgIEc0ZG91YmxlIHQgPSBsb2co IDEuMC1HNFVuaWZvcm1SYW5kKCkgKSAvIEc0c3RkOjptYXgoIGJNaW4sIGIxK2IyKmxvZyhwT3Jp Z2luYWwpICk7CiAgICBHNGRvdWJsZSB0MSA9CiAgICAgIHBzZXVkb1BhcnRpY2xlWzFdLkdldFRv dGFsRW5lcmd5KCkvR2VWIC0gcHNldWRvUGFydGljbGVbM10uR2V0VG90YWxFbmVyZ3koKS9HZVY7 CiAgICBHNGRvdWJsZSBwaW4gPSBwc2V1ZG9QYXJ0aWNsZVsxXS5HZXRNb21lbnR1bSgpLm1hZygp L0dlVjsKICAgIEc0ZG91YmxlIHRhY21pbiA9IHQxKnQxIC0gKHBpbi1wZikqKHBpbi1wZik7CiAg ICAvLwogICAgLy8gY2FsY3VsYXRlIChzaW4odGV0YS8yLileMiBhbmQgY29zKHRldGEpLCBzZXQg YXppbXV0aCBhbmdsZSBwaGkKICAgIC8vCiAgICBjb25zdCBHNGRvdWJsZSBzbWFsbFZhbHVlID0g MS4wZS0xMDsKICAgIEc0ZG91YmxlIGR1bW52ZSA9IDQuMCpwaW4qcGY7CiAgICBpZiggZHVtbnZl ID09IDAuMCApZHVtbnZlID0gc21hbGxWYWx1ZTsKICAgIEc0ZG91YmxlIGN0ZXQgPSBHNHN0ZDo6 bWF4KCAtMS4wLCBHNHN0ZDo6bWluKCAxLjAsIDEuMCsyLjAqKHQtdGFjbWluKS9kdW1udmUgKSAp OwogICAgZHVtbnZlID0gRzRzdGQ6Om1heCggMC4wLCAxLjAtY3RldCpjdGV0ICk7CiAgICBHNGRv dWJsZSBzdGV0ID0gc3FydChkdW1udmUpOwogICAgRzRkb3VibGUgcGhpID0gRzRVbmlmb3JtUmFu ZCgpICogdHdvcGk7CiAgICAvLwogICAgLy8gY2FsY3VsYXRlIGZpbmFsIHN0YXRlIG1vbWVudGEg aW4gY2VudHJlIG9mIG1hc3Mgc3lzdGVtCiAgICAvLwogICAgcHNldWRvUGFydGljbGVbM10uU2V0 TW9tZW50dW0oIHBmKnN0ZXQqc2luKHBoaSkqR2VWLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBmKnN0ZXQqY29zKHBoaSkqR2VWLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBmKmN0ZXQqR2VWICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5TZXRNb21lbnR1 bSggcHNldWRvUGFydGljbGVbM10uR2V0TW9tZW50dW0oKSAqICgtMS4wKSApOwogICAgLy8KICAg IC8vIHNpbXVsYXRlIGJhY2t3YXJkIG51Y2xlb24gY2x1c3RlciBpbiBsYWIuIHN5c3RlbSBhbmQg dHJhbnNmb3JtIGluIGNtcwogICAgLy8KICAgIEc0ZG91YmxlIHBwLCBwcDEsIHJ0aG52ZSwgcGhp bnZlOwogICAgaWYoIG51Y2xlYXJFeGNpdGF0aW9uQ291bnQgPiAwICkKICAgIHsKICAgICAgY29u c3QgRzRkb3VibGUgZ2EgPSAxLjI7CiAgICAgIEc0ZG91YmxlIGVraXQxID0gMC4wNDsKICAgICAg RzRkb3VibGUgZWtpdDIgPSAwLjY7CiAgICAgIGlmKCBla09yaWdpbmFsIDw9IDUuMCApCiAgICAg IHsKICAgICAgICBla2l0MSAqPSBla09yaWdpbmFsKmVrT3JpZ2luYWwvMjUuMDsKICAgICAgICBl a2l0MiAqPSBla09yaWdpbmFsKmVrT3JpZ2luYWwvMjUuMDsKICAgICAgfQogICAgICBjb25zdCBH NGRvdWJsZSBhID0gKDEuMC1nYSkvKHBvdyhla2l0MiwoMS4wLWdhKSkgLSBwb3coZWtpdDEsKDEu MC1nYSkpKTsKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kgKQogICAgICB7CiAgICAgICAg aWYoIHZlY1tpXS0+R2V0U2lkZSgpID09IC0yICkKICAgICAgICB7CiAgICAgICAgICBHNGRvdWJs ZSBraW5ldGljRSA9CiAgICAgICAgICAgIHBvdyggKEc0VW5pZm9ybVJhbmQoKSooMS4wLWdhKS9h K3Bvdyhla2l0MSwoMS4wLWdhKSkpLCAoMS4wLygxLjAtZ2EpKSApOwogICAgICAgICAgdmVjW2ld LT5TZXRLaW5ldGljRW5lcmd5KCBraW5ldGljRSpHZVYgKTsKICAgICAgICAgIEc0ZG91YmxlIHZN YXNzID0gdmVjW2ldLT5HZXRNYXNzKCkvTWVWOwogICAgICAgICAgRzRkb3VibGUgdG90YWxFID0g a2luZXRpY0UgKyB2TWFzczsKICAgICAgICAgIHBwID0gc3FydCggYWJzKHRvdGFsRSp0b3RhbEUt dk1hc3Mqdk1hc3MpICk7CiAgICAgICAgICBHNGRvdWJsZSBjb3N0ID0gRzRzdGQ6Om1pbiggMS4w LCBHNHN0ZDo6bWF4KCAtMS4wLCBsb2coMi4yMypHNFVuaWZvcm1SYW5kKCkrMC4zODMpLzAuOTYg KSApOwogICAgICAgICAgRzRkb3VibGUgc2ludCA9IHNxcnQoIEc0c3RkOjptYXgoIDAuMCwgKDEu MC1jb3N0KmNvc3QpICkgKTsKICAgICAgICAgIHBoaSA9IHR3b3BpKkc0VW5pZm9ybVJhbmQoKTsK ICAgICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0oIHBwKnNpbnQqc2luKHBoaSkqTWVWLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqc2ludCpjb3MocGhpKSpNZVYsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3N0Kk1lViApOwogICAgICAgICAgdmVjW2ldLT5M b3JlbnR6KCAqdmVjW2ldLCBwc2V1ZG9QYXJ0aWNsZVswXSApOwogICAgICAgIH0KICAgICAgfQog ICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7 CiAgICB9CiAgICAvLwogICAgLy8gZnJhZ21lbnRhdGlvbiBvZiBmb3J3YXJkIGNsdXN0ZXIgYW5k IGJhY2t3YXJkIG1lc29uIGNsdXN0ZXIKICAgIC8vCiAgICBjdXJyZW50UGFydGljbGUuU2V0TW9t ZW50dW0oIHBzZXVkb1BhcnRpY2xlWzNdLkdldE1vbWVudHVtKCkgKTsKICAgIGN1cnJlbnRQYXJ0 aWNsZS5TZXRUb3RhbEVuZXJneSggcHNldWRvUGFydGljbGVbM10uR2V0VG90YWxFbmVyZ3koKSAp OwogICAgCiAgICB0YXJnZXRQYXJ0aWNsZS5TZXRNb21lbnR1bSggcHNldWRvUGFydGljbGVbNF0u R2V0TW9tZW50dW0oKSApOwogICAgdGFyZ2V0UGFydGljbGUuU2V0VG90YWxFbmVyZ3koIHBzZXVk b1BhcnRpY2xlWzRdLkdldFRvdGFsRW5lcmd5KCkgKTsKICAgIAogICAgcHNldWRvUGFydGljbGVb NV0uU2V0TW9tZW50dW0oIHBzZXVkb1BhcnRpY2xlWzNdLkdldE1vbWVudHVtKCkgKiAoLTEuMCkg KTsKICAgIHBzZXVkb1BhcnRpY2xlWzVdLlNldE1hc3MoIHBzZXVkb1BhcnRpY2xlWzNdLkdldE1h c3MoKSApOwogICAgcHNldWRvUGFydGljbGVbNV0uU2V0VG90YWxFbmVyZ3koIHBzZXVkb1BhcnRp Y2xlWzNdLkdldFRvdGFsRW5lcmd5KCkgKTsKICAgIAogICAgcHNldWRvUGFydGljbGVbNl0uU2V0 TW9tZW50dW0oIHBzZXVkb1BhcnRpY2xlWzRdLkdldE1vbWVudHVtKCkgKiAoLTEuMCkgKTsKICAg IHBzZXVkb1BhcnRpY2xlWzZdLlNldE1hc3MoIHBzZXVkb1BhcnRpY2xlWzRdLkdldE1hc3MoKSAp OwogICAgcHNldWRvUGFydGljbGVbNl0uU2V0VG90YWxFbmVyZ3koIHBzZXVkb1BhcnRpY2xlWzRd LkdldFRvdGFsRW5lcmd5KCkgKTsKICAgIAogICAgRzRkb3VibGUgd2d0OwogICAgICAvLyBERUJV R0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICBpZiggZm9y d2FyZENvdW50ID4gMSApICAgICAvLyB0ZW1wViB3aWxsIGNvbnRhaW4gdGhlIGZvcndhcmQgcGFy dGljbGVzCiAgICB7CiAgICAgIEc0RmFzdFZlY3RvcjxHNFJlYWN0aW9uUHJvZHVjdCwxMjg+IHRl bXBWOwogICAgICB0ZW1wVi5Jbml0aWFsaXplKCBmb3J3YXJkQ291bnQgKTsKICAgICAgRzRib29s IGNvbnN0YW50Q3Jvc3NTZWN0aW9uID0gdHJ1ZTsKICAgICAgRzRpbnQgdGVtcExlbiA9IDA7CiAg ICAgIGlmKCBjdXJyZW50UGFydGljbGUuR2V0U2lkZSgpID09IDEgKQogICAgICAgIHRlbXBWLlNl dEVsZW1lbnQoIHRlbXBMZW4rKywgJmN1cnJlbnRQYXJ0aWNsZSApOwogICAgICBpZiggdGFyZ2V0 UGFydGljbGUuR2V0U2lkZSgpID09IDEgKQogICAgICAgIHRlbXBWLlNldEVsZW1lbnQoIHRlbXBM ZW4rKywgJnRhcmdldFBhcnRpY2xlICk7CiAgICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytpICkK ICAgICAgewogICAgICAgIGlmKCB2ZWNbaV0tPkdldFNpZGUoKSA9PSAxICkKICAgICAgICB7CiAg ICAgICAgICBpZiggdGVtcExlbiA8IDE4ICkKICAgICAgICAgICAgdGVtcFYuU2V0RWxlbWVudCgg dGVtcExlbisrLCB2ZWNbaV0gKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAg ICAgdmVjW2ldLT5TZXRTaWRlKCAtMSApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg IH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoIHRlbXBMZW4gPj0gMiApCiAgICAgIHsKICAg ICAgICB3Z3QgPSBHZW5lcmF0ZU5Cb2R5RXZlbnQoIHBzZXVkb1BhcnRpY2xlWzNdLkdldE1hc3Mo KS9NZVYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudENyb3NzU2Vj dGlvbiwgdGVtcFYsIHRlbXBMZW4gKTsKICAgICAgICBpZiggY3VycmVudFBhcnRpY2xlLkdldFNp ZGUoKSA9PSAxICkKICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5Mb3JlbnR6KCBjdXJyZW50UGFy dGljbGUsIHBzZXVkb1BhcnRpY2xlWzVdICk7CiAgICAgICAgaWYoIHRhcmdldFBhcnRpY2xlLkdl dFNpZGUoKSA9PSAxICkKICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkxvcmVudHooIHRhcmdldFBh cnRpY2xlLCBwc2V1ZG9QYXJ0aWNsZVs1XSApOwogICAgICAgIGZvciggaT0wOyBpPHZlY0xlbjsg KytpICkKICAgICAgICB7CiAgICAgICAgICBpZiggdmVjW2ldLT5HZXRTaWRlKCkgPT0gMSApdmVj W2ldLT5Mb3JlbnR6KCAqdmVjW2ldLCBwc2V1ZG9QYXJ0aWNsZVs1XSApOwogICAgICAgIH0KICAg ICAgfQogICAgfQogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2 ZWMsIHZlY0xlbik7CiAgICBpZiggYmFja3dhcmRDb3VudCA+IDEgKSAgIC8vICB0ZW1wViB3aWxs IGNvbnRhaW4gdGhlIGJhY2t3YXJkIHBhcnRpY2xlcywKICAgIHsgICAgICAgICAgICAgICAgICAg ICAgICAgLy8gIGJ1dCBub3QgdGhvc2UgY3JlYXRlZCBmcm9tIHRoZSBpbnRyYW51Y2xlYXIgY2Fz Y2FkZQogICAgICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiB0ZW1wVjsKICAg ICAgdGVtcFYuSW5pdGlhbGl6ZSggYmFja3dhcmRDb3VudCApOwogICAgICBHNGJvb2wgY29uc3Rh bnRDcm9zc1NlY3Rpb24gPSB0cnVlOwogICAgICBHNGludCB0ZW1wTGVuID0gMDsKICAgICAgaWYo IGN1cnJlbnRQYXJ0aWNsZS5HZXRTaWRlKCkgPT0gLTEgKQogICAgICAgIHRlbXBWLlNldEVsZW1l bnQoIHRlbXBMZW4rKywgJmN1cnJlbnRQYXJ0aWNsZSApOwogICAgICBpZiggdGFyZ2V0UGFydGlj bGUuR2V0U2lkZSgpID09IC0xICkKICAgICAgICB0ZW1wVi5TZXRFbGVtZW50KCB0ZW1wTGVuKyss ICZ0YXJnZXRQYXJ0aWNsZSApOwogICAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICAg IHsKICAgICAgICBpZiggdmVjW2ldLT5HZXRTaWRlKCkgPT0gLTEgKQogICAgICAgIHsKICAgICAg ICAgIGlmKCB0ZW1wTGVuIDwgMTggKQogICAgICAgICAgICB0ZW1wVi5TZXRFbGVtZW50KCB0ZW1w TGVuKyssIHZlY1tpXSApOwogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICB2 ZWNbaV0tPlNldFNpZGUoIC0yICk7CiAgICAgICAgICAgIHZlY1tpXS0+U2V0S2luZXRpY0VuZXJn eSggMC4wICk7CiAgICAgICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0oIDAuMCwgMC4wLCAwLjAg KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAg ICAgIGlmKCB0ZW1wTGVuID49IDIgKQogICAgICB7CiAgICAgICAgd2d0ID0gR2VuZXJhdGVOQm9k eUV2ZW50KCBwc2V1ZG9QYXJ0aWNsZVs0XS5HZXRNYXNzKCkvTWVWLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3RhbnRDcm9zc1NlY3Rpb24sIHRlbXBWLCB0ZW1wTGVuICk7 CiAgICAgICAgaWYoIGN1cnJlbnRQYXJ0aWNsZS5HZXRTaWRlKCkgPT0gLTEgKQogICAgICAgICAg Y3VycmVudFBhcnRpY2xlLkxvcmVudHooIGN1cnJlbnRQYXJ0aWNsZSwgcHNldWRvUGFydGljbGVb Nl0gKTsKICAgICAgICBpZiggdGFyZ2V0UGFydGljbGUuR2V0U2lkZSgpID09IC0xICkKICAgICAg ICAgIHRhcmdldFBhcnRpY2xlLkxvcmVudHooIHRhcmdldFBhcnRpY2xlLCBwc2V1ZG9QYXJ0aWNs ZVs2XSApOwogICAgICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytpICkKICAgICAgICB7CiAgICAg ICAgICBpZiggdmVjW2ldLT5HZXRTaWRlKCkgPT0gLTEgKXZlY1tpXS0+TG9yZW50eiggKnZlY1tp XSwgcHNldWRvUGFydGljbGVbNl0gKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgICAgLy8g REVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgLy8K ICAgIC8vIExvcmVudHogdHJhbnNmb3JtYXRpb24gaW4gbGFiIHN5c3RlbQogICAgLy8KICAgIEc0 aW50IG51bWJlcm9mRmluYWxTdGF0ZU51Y2xlb25zID0gMDsKICAgIGlmKCBjdXJyZW50UGFydGlj bGUuR2V0TWFzcygpID4gMC41KkdlViApKytudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9uczsKICAg IGN1cnJlbnRQYXJ0aWNsZS5Mb3JlbnR6KCBjdXJyZW50UGFydGljbGUsIHBzZXVkb1BhcnRpY2xl WzJdICk7CiAgICBpZiggdGFyZ2V0UGFydGljbGUuR2V0TWFzcygpID4gMC41KkdlViApKytudW1i ZXJvZkZpbmFsU3RhdGVOdWNsZW9uczsKICAgIHRhcmdldFBhcnRpY2xlLkxvcmVudHooIHRhcmdl dFBhcnRpY2xlLCBwc2V1ZG9QYXJ0aWNsZVsyXSApOwogICAgZm9yKCBpPTA7IGk8dmVjTGVuOyAr K2kgKQogICAgewogICAgICBpZiggdmVjW2ldLT5HZXRNYXNzKCkgPiAwLjUqR2VWICkrK251bWJl cm9mRmluYWxTdGF0ZU51Y2xlb25zOwogICAgICB2ZWNbaV0tPkxvcmVudHooICp2ZWNbaV0sIHBz ZXVkb1BhcnRpY2xlWzJdICk7CiAgICB9CiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1l czo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAgIG51bWJlcm9mRmluYWxTdGF0ZU51Y2xlb25z ID0gRzRzdGQ6Om1heCggMSwgbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMgKTsKICAgIC8vCiAg ICAvLyBzb21ldGltZXMgdGhlIGxlYWRpbmcgc3RyYW5nZSBwYXJ0aWNsZSBpcyBsb3N0LCBzZXQg aXQgYmFjawogICAgLy8KICAgIEc0Ym9vbCBkdW0gPSB0cnVlOwogICAgaWYoIGxlYWRGbGFnICkK ICAgIHsKICAgICAgLy8gbGVhZEZsYWcgd2lsbCBiZSB0cnVlCiAgICAgIC8vICBpZmYgb3JpZ2lu YWwgcGFydGljbGUgaXMgYXQgbGVhc3QgYXMgaGVhdnkgYXMgSysgYW5kIG5vdCBhIHByb3RvbiBv ciBuZXV0cm9uIEFORAogICAgICAvLyAgIGlmCiAgICAgIC8vICAgIGluY2lkZW50IHBhcnRpY2xl IGlzIGF0IGxlYXN0IGFzIGhlYXZ5IGFzIEsrIGFuZCBpdCBpcyBub3QgYSBwcm90b24gb3IgbmV1 dHJvbgogICAgICAvLyAgICAgbGVhZEZsYWcgaXMgc2V0IHRvIHRoZSBpbmNpZGVudCBwYXJ0aWNs ZQogICAgICAvLyAgIG9yCiAgICAgIC8vICAgIHRhcmdldCBwYXJ0aWNsZSBpcyBhdCBsZWFzdCBh cyBoZWF2eSBhcyBLKyBhbmQgaXQgaXMgbm90IGEgcHJvdG9uIG9yIG5ldXRyb24KICAgICAgLy8g ICAgIGxlYWRGbGFnIGlzIHNldCB0byB0aGUgdGFyZ2V0IHBhcnRpY2xlCiAgICAgIC8vCiAgICAg IGlmKCBjdXJyZW50UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGxlYWRpbmdTdHJhbmdlUGFy dGljbGUuR2V0RGVmaW5pdGlvbigpICkKICAgICAgICBkdW0gPSBmYWxzZTsKICAgICAgZWxzZSBp ZiggdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGxlYWRpbmdTdHJhbmdlUGFydGlj bGUuR2V0RGVmaW5pdGlvbigpICkKICAgICAgICBkdW0gPSBmYWxzZTsKICAgICAgZWxzZQogICAg ICB7CiAgICAgICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kgKQogICAgICAgIHsKICAgICAgICAg IGlmKCB2ZWNbaV0tPkdldERlZmluaXRpb24oKSA9PSBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlLkdl dERlZmluaXRpb24oKSApCiAgICAgICAgICB7CiAgICAgICAgICAgIGR1bSA9IGZhbHNlOwogICAg ICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoIGR1 bSApCiAgICAgIHsKICAgICAgICBHNGRvdWJsZSBsZWFkTWFzcyA9IGxlYWRpbmdTdHJhbmdlUGFy dGljbGUuR2V0TWFzcygpL01lVjsKICAgICAgICBHNGRvdWJsZSBla2luOwogICAgICAgIGlmKCAo KGxlYWRNYXNzIDwgIHByb3Rvbk1hc3MpICYmICh0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkvTWVW IDwgIHByb3Rvbk1hc3MpKSB8fAogICAgICAgICAgICAoKGxlYWRNYXNzID49IHByb3Rvbk1hc3Mp ICYmICh0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkvTWVWID49IHByb3Rvbk1hc3MpKSApCiAgICAg ICAgewogICAgICAgICAgZWtpbiA9IHRhcmdldFBhcnRpY2xlLkdldEtpbmV0aWNFbmVyZ3koKS9H ZVY7CiAgICAgICAgICBwcDEgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpLm1hZygpL01l VjsgLy8gb2xkIG1vbWVudHVtCiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXREZWZpbml0aW9u KCBsZWFkaW5nU3RyYW5nZVBhcnRpY2xlLkdldERlZmluaXRpb24oKSApOwogICAgICAgICAgdGFy Z2V0UGFydGljbGUuU2V0S2luZXRpY0VuZXJneSggZWtpbipHZVYgKTsKICAgICAgICAgIHBwID0g dGFyZ2V0UGFydGljbGUuR2V0VG90YWxNb21lbnR1bSgpL01lVjsgICAvLyBuZXcgbW9tZW50dW0K ICAgICAgICAgIGlmKCBwcDEgPCAxLjBlLTMgKQogICAgICAgICAgewogICAgICAgICAgICBydGhu dmUgPSBwaSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgICAgIHBoaW52ZSA9IHR3b3BpKkc0VW5p Zm9ybVJhbmQoKTsKICAgICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0TW9tZW50dW0oIHBwKnNp bihydGhudmUpKmNvcyhydGhudmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBwKnNpbihydGhudmUpKnNpbihydGhudmUpKk1lViwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1lViApOwogICAgICAgICAg fQogICAgICAgICAgZWxzZQogICAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRNb21lbnR1bSgg dGFyZ2V0UGFydGljbGUuR2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgICAgICAKICAg ICAgICAgIHRhcmdldEhhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlCiAg ICAgICAgewogICAgICAgICAgZWtpbiA9IGN1cnJlbnRQYXJ0aWNsZS5HZXRLaW5ldGljRW5lcmd5 KCkvR2VWOwogICAgICAgICAgcHAxID0gY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkubWFn KCkvTWVWOwogICAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldERlZmluaXRpb24oIGxlYWRpbmdT dHJhbmdlUGFydGljbGUuR2V0RGVmaW5pdGlvbigpICk7CiAgICAgICAgICBjdXJyZW50UGFydGlj bGUuU2V0S2luZXRpY0VuZXJneSggZWtpbipHZVYgKTsKICAgICAgICAgIHBwID0gY3VycmVudFBh cnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICAgICAgICBpZiggcHAxIDwgMS4wZS0z ICkKICAgICAgICAgIHsKICAgICAgICAgICAgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwog ICAgICAgICAgICBwaGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgICAgIGN1 cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggcHAqc2luKHJ0aG52ZSkqY29zKHJ0aG52ZSkqTWVW LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbihydGhudmUp KnNpbihydGhudmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwcCpjb3MocnRobnZlKSpNZVYgKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAg ICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBjdXJyZW50UGFydGljbGUuR2V0TW9t ZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgICAgICAKICAgICAgICAgIGluY2lkZW50SGFzQ2hh bmdlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9ICAgIC8vIGVuZCBvZiBpZiggbGVh ZEZsYWcgKQogICAgLy8KICAgIC8vICBmb3IgdmFyaW91cyByZWFzb25zLCB0aGUgZW5lcmd5IGJh bGFuY2UgaXMgbm90IHN1ZmZpY2llbnQsCiAgICAvLyAgY2hlY2sgdGhhdCwgIGVuZXJneSBiYWxh bmNlLCBhbmdsZSBvZiBmaW5hbCBzeXN0ZW0sIGV0Yy4KICAgIC8vCiAgICBwc2V1ZG9QYXJ0aWNs ZVs0XS5TZXRNYXNzKCBtT3JpZ2luYWwqR2VWICk7CiAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5TZXRU b3RhbEVuZXJneSggZXRPcmlnaW5hbCpHZVYgKTsKICAgIHBzZXVkb1BhcnRpY2xlWzRdLlNldE1v bWVudHVtKCAwLjAsIDAuMCwgcE9yaWdpbmFsKkdlViApOwogICAgCiAgICBwc2V1ZG9QYXJ0aWNs ZVs1XS5TZXRNb21lbnR1bSggMC4wLCAwLjAsIDAuMCApOwogICAgcHNldWRvUGFydGljbGVbNV0u U2V0TWFzcyggcHJvdG9uTWFzcypudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9ucypNZVYgKTsKICAg IHBzZXVkb1BhcnRpY2xlWzVdLlNldFRvdGFsRW5lcmd5KCBwcm90b25NYXNzKm51bWJlcm9mRmlu YWxTdGF0ZU51Y2xlb25zKk1lViApOwogICAgCi8vICAgIEc0ZG91YmxlIGVraW4wID0gcHNldWRv UGFydGljbGVbNF0uR2V0S2luZXRpY0VuZXJneSgpL0dlVjsKICAgIEc0ZG91YmxlIHRoZW9yZXRp Y2FsS2luZXRpYyA9CiAgICAgIHBzZXVkb1BhcnRpY2xlWzRdLkdldFRvdGFsRW5lcmd5KCkvR2VW ICsgcHNldWRvUGFydGljbGVbNV0uR2V0VG90YWxFbmVyZ3koKS9HZVY7CiAgICAKICAgIHBzZXVk b1BhcnRpY2xlWzZdID0gcHNldWRvUGFydGljbGVbNF0gKyBwc2V1ZG9QYXJ0aWNsZVs1XTsKICAg IHBzZXVkb1BhcnRpY2xlWzRdLkxvcmVudHooIHBzZXVkb1BhcnRpY2xlWzRdLCBwc2V1ZG9QYXJ0 aWNsZVs2XSApOwogICAgcHNldWRvUGFydGljbGVbNV0uTG9yZW50eiggcHNldWRvUGFydGljbGVb NV0sIHBzZXVkb1BhcnRpY2xlWzZdICk7CiAgICAKICAgIGlmKCB2ZWNMZW4gPCAxNiApCiAgICB7 CiAgICAgIEc0UmVhY3Rpb25Qcm9kdWN0IHRlbXBSWzEzMF07CiAgICAgIC8vRzRSZWFjdGlvblBy b2R1Y3QgKnRlbXBSID0gbmV3IEc0UmVhY3Rpb25Qcm9kdWN0IFt2ZWNMZW4rMl07CiAgICAgIHRl bXBSWzBdID0gY3VycmVudFBhcnRpY2xlOwogICAgICB0ZW1wUlsxXSA9IHRhcmdldFBhcnRpY2xl OwogICAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApdGVtcFJbaSsyXSA9ICp2ZWNbaV07Cgog ICAgICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiB0ZW1wVjsKICAgICAgdGVt cFYuSW5pdGlhbGl6ZSggdmVjTGVuKzIgKTsKICAgICAgRzRib29sIGNvbnN0YW50Q3Jvc3NTZWN0 aW9uID0gdHJ1ZTsKICAgICAgRzRpbnQgdGVtcExlbiA9IDA7CiAgICAgIGZvciggaT0wOyBpPHZl Y0xlbisyOyArK2kgKXRlbXBWLlNldEVsZW1lbnQoIHRlbXBMZW4rKywgJnRlbXBSW2ldICk7Cgog ICAgICBpZiggdGVtcExlbiA+PSAyICkKICAgICAgewogICAgICAvLyBERUJVR0dJTkcgLS0+IER1 bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgICAgd2d0ID0gR2VuZXJhdGVO Qm9keUV2ZW50KAogICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs0XS5HZXRUb3RhbEVuZXJneSgpL01l Vitwc2V1ZG9QYXJ0aWNsZVs1XS5HZXRUb3RhbEVuZXJneSgpL01lViwKICAgICAgICAgY29uc3Rh bnRDcm9zc1NlY3Rpb24sIHRlbXBWLCB0ZW1wTGVuICk7CiAgICAgICAgdGhlb3JldGljYWxLaW5l dGljID0gMC4wOwogICAgICAgIGZvciggaT0wOyBpPHZlY0xlbisyOyArK2kgKQogICAgICAgIHsK ICAgICAgICAgIHBzZXVkb1BhcnRpY2xlWzddLlNldE1vbWVudHVtKCB0ZW1wVltpXS0+R2V0TW9t ZW50dW0oKSApOwogICAgICAgICAgcHNldWRvUGFydGljbGVbN10uU2V0TWFzcyggdGVtcFZbaV0t PkdldE1hc3MoKSApOwogICAgICAgICAgcHNldWRvUGFydGljbGVbN10uU2V0VG90YWxFbmVyZ3ko IHRlbXBWW2ldLT5HZXRUb3RhbEVuZXJneSgpICk7CiAgICAgICAgICBwc2V1ZG9QYXJ0aWNsZVs3 XS5Mb3JlbnR6KCBwc2V1ZG9QYXJ0aWNsZVs3XSwgcHNldWRvUGFydGljbGVbNV0gKTsKICAgICAg ICAgIHRoZW9yZXRpY2FsS2luZXRpYyArPSBwc2V1ZG9QYXJ0aWNsZVs3XS5HZXRLaW5ldGljRW5l cmd5KCkvR2VWOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBG cmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICAgIC8vZGVsZXRlIFtdIHRlbXBSOwog ICAgfQogICAgZWxzZQogICAgewogICAgICB0aGVvcmV0aWNhbEtpbmV0aWMgLT0KICAgICAgICAo IGN1cnJlbnRQYXJ0aWNsZS5HZXRNYXNzKCkvR2VWICsgdGFyZ2V0UGFydGljbGUuR2V0TWFzcygp L0dlViApOwogICAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApdGhlb3JldGljYWxLaW5ldGlj IC09IHZlY1tpXS0+R2V0TWFzcygpL0dlVjsKICAgIH0KICAgIEc0ZG91YmxlIHNpbXVsYXRlZEtp bmV0aWMgPQogICAgICBjdXJyZW50UGFydGljbGUuR2V0S2luZXRpY0VuZXJneSgpL0dlViArIHRh cmdldFBhcnRpY2xlLkdldEtpbmV0aWNFbmVyZ3koKS9HZVY7CiAgICBmb3IoIGk9MDsgaTx2ZWNM ZW47ICsraSApc2ltdWxhdGVkS2luZXRpYyArPSB2ZWNbaV0tPkdldEtpbmV0aWNFbmVyZ3koKS9H ZVY7CiAgICAvLwogICAgLy8gbWFrZSBzdXJlIHRoYXQga2luZXRpYyBlbmVyZ2llcyBhcmUgY29y cmVjdAogICAgLy8gdGhlIGJhY2t3YXJkIG51Y2xlb24gY2x1c3RlciBpcyBub3QgcHJvZHVjZWQg d2l0aGluIHByb3BlciBraW5lbWF0aWNzISEhCiAgICAvLwogICAgaWYoIHNpbXVsYXRlZEtpbmV0 aWMgIT0gMC4wICkKICAgIHsKICAgICAgd2d0ID0gdGhlb3JldGljYWxLaW5ldGljL3NpbXVsYXRl ZEtpbmV0aWM7CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRLaW5ldGljRW5lcmd5KCB3Z3QqY3Vy cmVudFBhcnRpY2xlLkdldEtpbmV0aWNFbmVyZ3koKSApOwogICAgICBwcCA9IGN1cnJlbnRQYXJ0 aWNsZS5HZXRUb3RhbE1vbWVudHVtKCkvTWVWOwogICAgICBwcDEgPSBjdXJyZW50UGFydGljbGUu R2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7CiAgICAgIGlmKCBwcDEgPCAwLjAwMSpNZVYgKQogICAg ICB7CiAgICAgICAgcnRobnZlID0gcGkgKiBHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgcGhpbnZl ID0gdHdvcGkgKiBHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1v bWVudHVtKCBwcCpzaW4ocnRobnZlKSpjb3MocGhpbnZlKSpNZVYsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSpNZVYsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3MocnRobnZlKSpNZVYgKTsKICAg ICAgfQogICAgICBlbHNlCiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBjdXJy ZW50UGFydGljbGUuR2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgIAogICAgICB0YXJn ZXRQYXJ0aWNsZS5TZXRLaW5ldGljRW5lcmd5KCB3Z3QqdGFyZ2V0UGFydGljbGUuR2V0S2luZXRp Y0VuZXJneSgpICk7CiAgICAgIHBwID0gdGFyZ2V0UGFydGljbGUuR2V0VG90YWxNb21lbnR1bSgp L01lVjsKICAgICAgcHAxID0gdGFyZ2V0UGFydGljbGUuR2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7 CiAgICAgIGlmKCBwcDEgPCAwLjAwMSpNZVYgKQogICAgICB7CiAgICAgICAgcnRobnZlID0gcGkg KiBHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgcGhpbnZlID0gdHdvcGkgKiBHNFVuaWZvcm1SYW5k KCk7CiAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0TW9tZW50dW0oIHBwKnNpbihydGhudmUpKmNv cyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqc2lu KHJ0aG52ZSkqc2luKHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwcCpjb3MocnRobnZlKSpNZVYgKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgdGFy Z2V0UGFydGljbGUuU2V0TW9tZW50dW0oIHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAo cHAvcHAxKSApOwogICAgICAKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kgKQogICAgICB7 CiAgICAgICAgdmVjW2ldLT5TZXRLaW5ldGljRW5lcmd5KCB3Z3QqdmVjW2ldLT5HZXRLaW5ldGlj RW5lcmd5KCkgKTsKICAgICAgICBwcCA9IHZlY1tpXS0+R2V0VG90YWxNb21lbnR1bSgpL01lVjsK ICAgICAgICBwcDEgPSB2ZWNbaV0tPkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICAgIGlm KCBwcDEgPCAwLjAwMSApCiAgICAgICAgewogICAgICAgICAgcnRobnZlID0gcGkgKiBHNFVuaWZv cm1SYW5kKCk7CiAgICAgICAgICBwaGludmUgPSB0d29waSAqIEc0VW5pZm9ybVJhbmQoKTsKICAg ICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0oIHBwKnNpbihydGhudmUpKmNvcyhwaGludmUpKk1l ViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbihydGhudmUpKnNpbihwaGlu dmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKmNvcyhydGhudmUpKk1l ViApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICB2ZWNbaV0tPlNldE1vbWVudHVt KCB2ZWNbaV0tPkdldE1vbWVudHVtKCkgKiAocHAvcHAxKSApOwogICAgICB9CiAgICB9CiAgICAg IC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZlYywgdmVjTGVuKTsKICAg IFJvdGF0ZSggbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMsIHBzZXVkb1BhcnRpY2xlWzRdLkdl dE1vbWVudHVtKCksCiAgICAgICAgICAgIG1vZGlmaWVkT3JpZ2luYWwsIG9yaWdpbmFsSW5jaWRl bnQsIHRhcmdldE51Y2xldXMsCiAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZSwgdGFyZ2V0UGFy dGljbGUsIHZlYywgdmVjTGVuICk7CiAgICAvLwogICAgLy8gIGFkZCBibGFjayB0cmFjayBwYXJ0 aWNsZXMKICAgIC8vICB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2xlcyBwcm9kdWNlZCBpcyBy ZXN0cmljdGVkIHRvIDE5OAogICAgLy8gIHRoaXMgbWF5IGhhdmUgaW5mbHVlbmNlIG9uIHZlcnkg aGlnaCBlbmVyZ2llcwogICAgLy8KICAgIGlmKCBhdG9taWNXZWlnaHQgPj0gMS41ICkKICAgIHsK ICAgICAgLy8gbnBuYiBpcyBudW1iZXIgb2YgcHJvdG9uL25ldXRyb24gYmxhY2sgdHJhY2sgcGFy dGljbGVzCiAgICAgIC8vIG5kdGEgaXMgdGhlIG51bWJlciBvZiBkZXV0ZXJvbnMsIHRyaXRvbnMs IGFuZCBhbHBoYXMgcHJvZHVjZWQKICAgICAgLy8gZXBuYiBpcyB0aGUga2luZXRpYyBlbmVyZ3kg YXZhaWxhYmxlIGZvciBwcm90b24vbmV1dHJvbiBibGFjayB0cmFjayBwYXJ0aWNsZXMKICAgICAg Ly8gZWR0YSBpcyB0aGUga2luZXRpYyBlbmVyZ3kgYXZhaWxhYmxlIGZvciBkZXV0ZXJvbi90cml0 b24vYWxwaGEgcGFydGljbGVzCiAgICAgIC8vCiAgICAgIEc0ZG91YmxlIGVwbmIsIGVkdGE7CiAg ICAgIEc0aW50IG5wbmIgPSAwOwogICAgICBHNGludCBuZHRhID0gMDsKICAgICAgCiAgICAgIGVw bmIgPSB0YXJnZXROdWNsZXVzLkdldFBOQmxhY2tUcmFja0VuZXJneSgpOyAgICAgICAgICAgIC8v IHdhcyBlbnAxIGluIGZvcnRyYW4gY29kZQogICAgICBlZHRhID0gdGFyZ2V0TnVjbGV1cy5HZXRE VEFCbGFja1RyYWNrRW5lcmd5KCk7ICAgICAgICAgICAvLyB3YXMgZW5wMyBpbiBmb3J0cmFuIGNv ZGUKICAgICAgY29uc3QgRzRkb3VibGUgcG5DdXRPZmYgPSAwLjAwMTsgICAgIC8vIEdlVgogICAg ICBjb25zdCBHNGRvdWJsZSBkdGFDdXRPZmYgPSAwLjAwMTsgICAgLy8gR2VWCiAgICAgIGNvbnN0 IEc0ZG91YmxlIGtpbmV0aWNNaW5pbXVtID0gMS5lLTY7CiAgICAgIGNvbnN0IEc0ZG91YmxlIGtp bmV0aWNGYWN0b3IgPSAtMC4wMDU7CiAgICAgIAogICAgICBHNGRvdWJsZSBzcHJvYiA9IDAuMDsg Ly8gc3Byb2IgPSBwcm9iYWJpbGl0eSBvZiBzZWxmLWFic29ycHRpb24gaW4gaGVhdnkgbW9sZWN1 bGVzCiAgICAgIGNvbnN0IEc0ZG91YmxlIGVrSW5jaWRlbnQgPSBvcmlnaW5hbEluY2lkZW50LT5H ZXRLaW5ldGljRW5lcmd5KCkvR2VWOwogICAgICBpZiggZWtJbmNpZGVudCA+PSA1LjAgKXNwcm9i ID0gRzRzdGQ6Om1pbiggMS4wLCAwLjYqbG9nKGVrSW5jaWRlbnQtNC4wKSApOwogICAgICAKICAg ICAgaWYoIGVwbmIgPj0gcG5DdXRPZmYgKQogICAgICB7CiAgICAgICAgbnBuYiA9IFBvaXNzb24o KDEuNSsxLjI1Km51bWJlcm9mRmluYWxTdGF0ZU51Y2xlb25zKSplcG5iLyhlcG5iK2VkdGEpKTsK ICAgICAgICBpZiggbnVtYmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMgKyBucG5iID4gYXRvbWljV2Vp Z2h0ICkKICAgICAgICAgIG5wbmIgPSBHNGludChhdG9taWNXZWlnaHQgLSBudW1iZXJvZkZpbmFs U3RhdGVOdWNsZW9ucyk7CiAgICAgICAgbnBuYiA9IEc0c3RkOjptaW4oIG5wbmIsIDEyNy12ZWNM ZW4gKTsKICAgICAgfQogICAgICBpZiggZWR0YSA+PSBkdGFDdXRPZmYgKQogICAgICB7CiAgICAg ICAgbmR0YSA9IFBvaXNzb24oICgxLjUrMS4yNSpudW1iZXJvZkZpbmFsU3RhdGVOdWNsZW9ucykq ZWR0YS8oZXBuYitlZHRhKSApOwogICAgICAgIG5kdGEgPSBHNHN0ZDo6bWluKCBuZHRhLCAxMjct dmVjTGVuICk7CiAgICAgIH0KICAgICAgRzRkb3VibGUgc3BhbGwgPSBudW1iZXJvZkZpbmFsU3Rh dGVOdWNsZW9uczsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUo dmVjLCB2ZWNMZW4pOwogICAgICBBZGRCbGFja1RyYWNrUGFydGljbGVzKCBlcG5iLCBucG5iLCBl ZHRhLCBuZHRhLCBzcHJvYiwga2luZXRpY01pbmltdW0sIGtpbmV0aWNGYWN0b3IsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkT3JpZ2luYWwsIHNwYWxsLCB0YXJnZXROdWNs ZXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMsIHZlY0xlbiApOwogICAgICAv LyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7CiAgICB9 CiAgICBpZiggY2VudGVyb2ZtYXNzRW5lcmd5IDw9ICg0LjArRzRVbmlmb3JtUmFuZCgpKSApCiAg ICAgIE1vbWVudHVtQ2hlY2soIG1vZGlmaWVkT3JpZ2luYWwsIGN1cnJlbnRQYXJ0aWNsZSwgdGFy Z2V0UGFydGljbGUsIHZlYywgdmVjTGVuICk7CiAgICAvLwogICAgLy8gIGNhbGN1bGF0ZSB0aW1l IGRlbGF5IGZvciBudWNsZWFyIHJlYWN0aW9ucwogICAgLy8KICAgIGlmKCAoYXRvbWljV2VpZ2h0 ID49IDEuNSkgJiYgKGF0b21pY1dlaWdodCA8PSAyMzAuMCkgJiYgKGVrT3JpZ2luYWwgPD0gMC4y KSApCiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRUT0YoIDEuMC01MDAuMCpleHAoLWVrT3JpZ2lu YWwvMC4wNCkqbG9nKEc0VW5pZm9ybVJhbmQoKSkgKTsKICAgIGVsc2UKICAgICAgY3VycmVudFBh cnRpY2xlLlNldFRPRiggMS4wICk7CiAgICAKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJh bWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgcmV0dXJuIHRydWU7CiAgfQogCiB2b2lk IEc0UmVhY3Rpb25EeW5hbWljczo6VHdvQm9keSgKICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblBy b2R1Y3QsMTI4PiAmdmVjLAogIEc0aW50ICZ2ZWNMZW4sCiAgRzRSZWFjdGlvblByb2R1Y3QgJm1v ZGlmaWVkT3JpZ2luYWwsCiAgY29uc3QgRzREeW5hbWljUGFydGljbGUgKm9yaWdpbmFsVGFyZ2V0 LAogIEc0UmVhY3Rpb25Qcm9kdWN0ICZjdXJyZW50UGFydGljbGUsCiAgRzRSZWFjdGlvblByb2R1 Y3QgJnRhcmdldFBhcnRpY2xlLAogIGNvbnN0IEc0TnVjbGV1cyAmdGFyZ2V0TnVjbGV1cywKICBH NGJvb2wgJnRhcmdldEhhc0NoYW5nZWQgKQogIHsKICAgIC8vIAogICAgLy8gZGVyaXZlZCBmcm9t IG9yaWdpbmFsIEZPUlRSQU4gY29kZSBUV09CIGJ5IEguIEZlc2VmZWxkdCAoMTUtU2VwLTE5ODcp CiAgICAvLwogICAgLy8gR2VuZXJhdGlvbiBvZiBtb21lbnRhIGZvciBlbGFzdGljIGFuZCBxdWFz aS1lbGFzdGljIDIgYm9keSByZWFjdGlvbnMKICAgIC8vCiAgICAvLyBUaGUgc2ltcGxlIGZvcm11 bGEgZHMvZHx0fCA9IHMwKiBleHAoLWIqfHR8KSBpcyB1c2VkLgogICAgLy8gVGhlIGIgdmFsdWVz IGFyZSBwYXJhbWV0cml6YXRpb25zIGZyb20gZXhwZXJpbWVudGFsIGRhdGEuCiAgICAvLyBOb3Qg YXZhaWxhYmxlIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB0aG9zZSBvZiBzaW1pbGFyIHJlYWN0aW9u cy4KICAgIC8vCiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpTWludXMgPSBHNFBpb25NaW51 czo6UGlvbk1pbnVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpUGx1cyA9IEc0UGlv blBsdXM6OlBpb25QbHVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpWmVybyA9IEc0 UGlvblplcm86OlBpb25aZXJvKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYUthb25QbHVz ID0gRzRLYW9uUGx1czo6S2FvblBsdXMoKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphS2Fv bk1pbnVzID0gRzRLYW9uTWludXM6Okthb25NaW51cygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRp b24gKmFLYW9uWmVyb1MgPSBHNEthb25aZXJvU2hvcnQ6Okthb25aZXJvU2hvcnQoKTsKICAgIEc0 UGFydGljbGVEZWZpbml0aW9uICphS2Fvblplcm9MID0gRzRLYW9uWmVyb0xvbmc6Okthb25aZXJv TG9uZygpOwogICAgCiAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1l KHZlYywgdmVjTGVuKTsgICAgCiAgICBzdGF0aWMgY29uc3QgRzRkb3VibGUgZXhweHUgPSAgODIu OyAgICAgICAgICAgLy8gdXBwZXIgYm91bmQgZm9yIGFyZy4gb2YgZXhwCiAgICBzdGF0aWMgY29u c3QgRzRkb3VibGUgZXhweGwgPSAtZXhweHU7ICAgICAgICAgLy8gbG93ZXIgYm91bmQgZm9yIGFy Zy4gb2YgZXhwCiAgICAKICAgIGNvbnN0IEc0ZG91YmxlIGVrT3JpZ2luYWwgPSBtb2RpZmllZE9y aWdpbmFsLkdldEtpbmV0aWNFbmVyZ3koKS9HZVY7CiAgICBjb25zdCBHNGRvdWJsZSBldE9yaWdp bmFsID0gbW9kaWZpZWRPcmlnaW5hbC5HZXRUb3RhbEVuZXJneSgpL0dlVjsKICAgIGNvbnN0IEc0 ZG91YmxlIG1PcmlnaW5hbCA9IG1vZGlmaWVkT3JpZ2luYWwuR2V0TWFzcygpL0dlVjsKICAgIGNv bnN0IEc0ZG91YmxlIHBPcmlnaW5hbCA9IG1vZGlmaWVkT3JpZ2luYWwuR2V0TW9tZW50dW0oKS5t YWcoKS9HZVY7CiAgICBHNGRvdWJsZSBjdXJyZW50TWFzcyA9IGN1cnJlbnRQYXJ0aWNsZS5HZXRN YXNzKCkvR2VWOwogICAgRzRkb3VibGUgdGFyZ2V0TWFzcyA9IHRhcmdldFBhcnRpY2xlLkdldERl ZmluaXRpb24oKS0+R2V0UERHTWFzcygpL0dlVjsKLy8gICAgRzRkb3VibGUgY2VudGVyb2ZtYXNz RW5lcmd5ID0gc3FydCggbU9yaWdpbmFsKm1PcmlnaW5hbCArCi8vICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hc3MqdGFyZ2V0TWFzcyArCi8vICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMCp0YXJnZXRNYXNzKmV0T3JpZ2luYWwg KTsgIC8vIEdlVgogICAgdGFyZ2V0TWFzcyA9IHRhcmdldFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7 CiAgICBjb25zdCBHNGRvdWJsZSBhdG9taWNXZWlnaHQgPSB0YXJnZXROdWNsZXVzLkdldE4oKTsK Ly8gICAgY29uc3QgRzRkb3VibGUgYXRvbWljTnVtYmVyID0gdGFyZ2V0TnVjbGV1cy5HZXRaKCk7 CiAgICAKICAgIEc0ZG91YmxlIGV0Q3VycmVudCA9IGN1cnJlbnRQYXJ0aWNsZS5HZXRUb3RhbEVu ZXJneSgpL0dlVjsKICAgIEc0ZG91YmxlIHBDdXJyZW50ID0gY3VycmVudFBhcnRpY2xlLkdldFRv dGFsTW9tZW50dW0oKS9HZVY7Ci8vICAgIEc0ZG91YmxlIGVrQ3VycmVudCA9IGN1cnJlbnRQYXJ0 aWNsZS5HZXRLaW5ldGljRW5lcmd5KCkvR2VWOwogICAgRzRkb3VibGUgY21FbmVyZ3kgPSBzcXJ0 KCBjdXJyZW50TWFzcypjdXJyZW50TWFzcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHRhcmdldE1hc3MqdGFyZ2V0TWFzcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIu MCp0YXJnZXRNYXNzKmV0Q3VycmVudCApOyAgLy8gaW4gR2VWCgogICAgLy9pZiggKHBPcmlnaW5h bCA8IDAuMSkgfHwKICAgIC8vICAgIChjZW50ZXJvZm1hc3NFbmVyZ3kgPCAwLjAxKSApIC8vIDIt Ym9keSBzY2F0dGVyaW5nIG5vdCBwb3NzaWJsZQogICAgLy8gQ29udGludWUgd2l0aCBvcmlnaW5h bCBwYXJ0aWNsZSwgYnV0IHNwZW5kIHRoZSBudWNsZWFyIGV2YXBvcmF0aW9uIGVuZXJneQogICAg Ly8gIHRhcmdldFBhcnRpY2xlLlNldE1hc3MoIDAuMCApOyAgLy8gZmxhZyB0aGF0IHRoZSB0YXJn ZXQgZG9lc24ndCBleGlzdAogICAgLy9lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g VHdvLWJvZHkgc2NhdHRlcmluZyBpcyBwb3NzaWJsZQoKICAgIGlmKCAocEN1cnJlbnQgPCAwLjEp IHx8IChjbUVuZXJneSA8IDAuMDEpICkgLy8gMi1ib2R5IHNjYXR0ZXJpbmcgbm90IHBvc3NpYmxl CiAgICB7CiAgICAgIHRhcmdldFBhcnRpY2xlLlNldE1hc3MoIDAuMCApOyAgLy8gZmxhZyB0aGF0 IHRoZSB0YXJnZXQgcGFydGljbGUgZG9lc24ndCBleGlzdAogICAgfQogICAgZWxzZQogICAgewov LyBtb3ZlZCB0aGlzIGlmLWJsb2NrIHRvIGEgbGF0ZXIgc3RhZ2UsIGkuZS4gdG8gdGhlIGFzc2ln bm1lbnQgb2YgdGhlIHNjYXR0ZXJpbmcgYW5nbGUKLy8gQEBAQEAgZG91YmxlLWNoZWNrLgovLyAg ICAgIGlmKCB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25NaW51cyB8fAov LyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25aZXJvTCB8 fAovLyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25aZXJv UyB8fAovLyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25Q bHVzIHx8Ci8vICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhUGlN aW51cyB8fAovLyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBp WmVybyB8fAovLyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBp UGx1cyApCi8vICAgICAgewovLyAgICAgICAgaWYoIEc0VW5pZm9ybVJhbmQoKSA8IDAuNSApCi8v ICAgICAgICAgIHRhcmdldFBhcnRpY2xlLlNldERlZmluaXRpb25BbmRVcGRhdGVFKCBhTmV1dHJv biApOwovLyAgICAgICAgZWxzZQovLyAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXREZWZpbml0 aW9uQW5kVXBkYXRlRSggYVByb3RvbiApOwovLyAgICAgICAgdGFyZ2V0SGFzQ2hhbmdlZCA9IHRy dWU7Ci8vICAgICAgICB0YXJnZXRNYXNzID0gdGFyZ2V0UGFydGljbGUuR2V0TWFzcygpL0dlVjsK Ly8gICAgICB9CiAgICAgIC8vCiAgICAgIC8vIFNldCBtYXNzZXMgYW5kIG1vbWVudGEgZm9yIGZp bmFsIHN0YXRlIHBhcnRpY2xlcwogICAgICAvLwogICAgICBHNGRvdWJsZSBwZiA9IGNtRW5lcmd5 KmNtRW5lcmd5ICsgdGFyZ2V0TWFzcyp0YXJnZXRNYXNzIC0gY3VycmVudE1hc3MqY3VycmVudE1h c3M7CiAgICAgIHBmID0gcGYqcGYgLSA0KmNtRW5lcmd5KmNtRW5lcmd5KnRhcmdldE1hc3MqdGFy Z2V0TWFzczsKICAgICAgCiAgICAgIGlmKCBwZiA8IDAuMDAxICkKICAgICAgICBHNEV4Y2VwdGlv bigiRzRSZWFjdGlvbkR5bmFtaWNzOjpUd29Cb2R5OiBwZiBpcyB0b28gc21hbGwgIik7CiAgICAg IAogICAgICBwZiA9IHNxcnQoIHBmICkgLyAoIDIuMCpjbUVuZXJneSApOwogICAgICAvLwogICAg ICAvLyBTZXQgYmVhbSBhbmQgdGFyZ2V0IGluIGNlbnRyZSBvZiBtYXNzIHN5c3RlbQogICAgICAv LwogICAgICBHNFJlYWN0aW9uUHJvZHVjdCBwc2V1ZG9QYXJ0aWNsZVszXTsKICAgICAgCiAgICAg IGlmKCB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25NaW51cyB8fAogICAg ICAgICAgdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFLYW9uWmVyb0wgfHwKICAg ICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhS2Fvblplcm9TIHx8CiAg ICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYUthb25QbHVzIHx8CiAg ICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBpTWludXMgfHwKICAg ICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhUGlaZXJvIHx8CiAgICAg ICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBpUGx1cyApCiAgICAgIHsK ICAgICAgICBwc2V1ZG9QYXJ0aWNsZVswXS5TZXRNYXNzKCB0YXJnZXRNYXNzKkdlViApOwogICAg ICAgIHBzZXVkb1BhcnRpY2xlWzBdLlNldFRvdGFsRW5lcmd5KCBldE9yaWdpbmFsKkdlViApOwog ICAgICAgIHBzZXVkb1BhcnRpY2xlWzBdLlNldE1vbWVudHVtKCAwLjAsIDAuMCwgcE9yaWdpbmFs KkdlViApOwogICAgICAKICAgICAgICBwc2V1ZG9QYXJ0aWNsZVsxXS5TZXRNb21lbnR1bSggMC4w LCAwLjAsIDAuMCApOwogICAgICAgIHBzZXVkb1BhcnRpY2xlWzFdLlNldE1hc3MoIG1PcmlnaW5h bCpHZVYgKTsKICAgICAgICBwc2V1ZG9QYXJ0aWNsZVsxXS5TZXRLaW5ldGljRW5lcmd5KCAwLjAg KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBwc2V1ZG9QYXJ0aWNsZVswXS5T ZXRNYXNzKCBtT3JpZ2luYWwqR2VWICk7CiAgICAgICAgcHNldWRvUGFydGljbGVbMF0uU2V0VG90 YWxFbmVyZ3koIGV0T3JpZ2luYWwqR2VWICk7CiAgICAgICAgcHNldWRvUGFydGljbGVbMF0uU2V0 TW9tZW50dW0oIDAuMCwgMC4wLCBwT3JpZ2luYWwqR2VWICk7CiAgICAgIAogICAgICAgIHBzZXVk b1BhcnRpY2xlWzFdLlNldE1vbWVudHVtKCAwLjAsIDAuMCwgMC4wICk7CiAgICAgICAgcHNldWRv UGFydGljbGVbMV0uU2V0TWFzcyggdGFyZ2V0TWFzcypHZVYgKTsKICAgICAgICBwc2V1ZG9QYXJ0 aWNsZVsxXS5TZXRLaW5ldGljRW5lcmd5KCAwLjAgKTsKICAgICAgfQogICAgICAvLwogICAgICAv LyBUcmFuc2Zvcm0gaW50byBjZW50cmUgb2YgbWFzcyBzeXN0ZW0KICAgICAgLy8KICAgICAgcHNl dWRvUGFydGljbGVbMl0gPSBwc2V1ZG9QYXJ0aWNsZVswXSArIHBzZXVkb1BhcnRpY2xlWzFdOwog ICAgICBwc2V1ZG9QYXJ0aWNsZVswXS5Mb3JlbnR6KCBwc2V1ZG9QYXJ0aWNsZVswXSwgcHNldWRv UGFydGljbGVbMl0gKTsKICAgICAgcHNldWRvUGFydGljbGVbMV0uTG9yZW50eiggcHNldWRvUGFy dGljbGVbMV0sIHBzZXVkb1BhcnRpY2xlWzJdICk7CiAgICAgIC8vCiAgICAgIC8vIFNldCBmaW5h bCBzdGF0ZSBtYXNzZXMgYW5kIGVuZXJnaWVzIGluIGNlbnRyZSBvZiBtYXNzIHN5c3RlbQogICAg ICAvLwogICAgICBjdXJyZW50UGFydGljbGUuU2V0VG90YWxFbmVyZ3koIHNxcnQocGYqcGYrY3Vy cmVudE1hc3MqY3VycmVudE1hc3MpKkdlViApOwogICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRUb3Rh bEVuZXJneSggc3FydChwZipwZit0YXJnZXRNYXNzKnRhcmdldE1hc3MpKkdlViApOwogICAgICAv LwogICAgICAvLyBTZXQgfHR8IGFuZCB8dG1pbnwKICAgICAgLy8KICAgICAgY29uc3QgRzRkb3Vi bGUgY2IgPSAwLjAxOwogICAgICBjb25zdCBHNGRvdWJsZSBiMSA9IDQuMjI1OwogICAgICBjb25z dCBHNGRvdWJsZSBiMiA9IDEuNzk1OwogICAgICAvLwogICAgICAvLyBDYWxjdWxhdGUgc2xvcGUg YiBmb3IgZWxhc3RpYyBzY2F0dGVyaW5nIG9uIHByb3Rvbi9uZXV0cm9uCiAgICAgIC8vCiAgICAg IEc0ZG91YmxlIGIgPSBHNHN0ZDo6bWF4KCBjYiwgYjErYjIqbG9nKHBPcmlnaW5hbCkgKTsgICAg IAogICAgICBHNGRvdWJsZSBidHJhbmcgPSBiICogNC4wICogcGYgKiBwc2V1ZG9QYXJ0aWNsZVsw XS5HZXRNb21lbnR1bSgpLm1hZygpL0dlVjsKICAgICAgCiAgICAgIEc0ZG91YmxlIGV4aW5kdCA9 IC0xLjA7CiAgICAgIGV4aW5kdCArPSBleHAoRzRzdGQ6Om1heCgtYnRyYW5nLGV4cHhsKSk7CiAg ICAgIC8vCiAgICAgIC8vIENhbGN1bGF0ZSBzcXIoc2luKHRldGEvMi4pIGFuZCBjb3ModGV0YSks IHNldCBhemltdXRoIGFuZ2xlIHBoaQogICAgICAvLwogICAgICBHNGRvdWJsZSBjdGV0ID0gMS4w ICsgMipsb2coIDEuMCtHNFVuaWZvcm1SYW5kKCkqZXhpbmR0ICkgLyBidHJhbmc7CiAgICAgIGlm KCBmYWJzKGN0ZXQpID4gMS4wICljdGV0ID4gMC4wID8gY3RldCA9IDEuMCA6IGN0ZXQgPSAtMS4w OwogICAgICBHNGRvdWJsZSBzdGV0ID0gc3FydCggKDEuMC1jdGV0KSooMS4wK2N0ZXQpICk7CiAg ICAgIEc0ZG91YmxlIHBoaSA9IHR3b3BpICogRzRVbmlmb3JtUmFuZCgpOwogICAgICAvLwogICAg ICAvLyBDYWxjdWxhdGUgZmluYWwgc3RhdGUgbW9tZW50YSBpbiBjZW50cmUgb2YgbWFzcyBzeXN0 ZW0KICAgICAgLy8KICAgICAgaWYoIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBh S2Fvbk1pbnVzIHx8CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0g YUthb25aZXJvTCB8fAogICAgICAgICAgdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFLYW9uWmVyb1MgfHwKICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9 PSBhS2FvblBsdXMgfHwKICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9 PSBhUGlNaW51cyB8fAogICAgICAgICAgdGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09 IGFQaVplcm8gfHwKICAgICAgICAgIHRhcmdldFBhcnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBh UGlQbHVzICkKICAgICAgewogICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggLXBm KnN0ZXQqc2luKHBoaSkqR2VWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LXBmKnN0ZXQqY29zKHBoaSkqR2VWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLXBmKmN0ZXQqR2VWICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgY3Vy cmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBwZipzdGV0KnNpbihwaGkpKkdlViwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmKnN0ZXQqY29zKHBoaSkqR2VWLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGYqY3RldCpHZVYgKTsKICAgICAgfQogICAg ICB0YXJnZXRQYXJ0aWNsZS5TZXRNb21lbnR1bSggY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVt KCkgKiAoLTEuMCkgKTsKICAgICAgLy8KICAgICAgLy8gVHJhbnNmb3JtIGludG8gbGFiIHN5c3Rl bQogICAgICAvLwogICAgICBjdXJyZW50UGFydGljbGUuTG9yZW50eiggY3VycmVudFBhcnRpY2xl LCBwc2V1ZG9QYXJ0aWNsZVsxXSApOwogICAgICB0YXJnZXRQYXJ0aWNsZS5Mb3JlbnR6KCB0YXJn ZXRQYXJ0aWNsZSwgcHNldWRvUGFydGljbGVbMV0gKTsKICAgICAgCiAgICAgIERlZnMxKCBtb2Rp ZmllZE9yaWdpbmFsLCBjdXJyZW50UGFydGljbGUsIHRhcmdldFBhcnRpY2xlLCB2ZWMsIHZlY0xl biApOwogICAgICAKICAgICAgRzRkb3VibGUgcHAsIHBwMSwgZWtpbjsKICAgICAgaWYoIGF0b21p Y1dlaWdodCA+PSAxLjUgKQogICAgICB7CiAgICAgICAgY29uc3QgRzRkb3VibGUgY2ZhID0gMC4w MjUqKChhdG9taWNXZWlnaHQtMS4pLzEyMC4pKmV4cCgtKGF0b21pY1dlaWdodC0xLikvMTIwLik7 CiAgICAgICAgcHAxID0gY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwog ICAgICAgIGlmKCBwcDEgPj0gMS4wICkKICAgICAgICB7CiAgICAgICAgICBla2luID0gY3VycmVu dFBhcnRpY2xlLkdldEtpbmV0aWNFbmVyZ3koKS9NZVYgLSBjZmEqKDEuMCswLjUqbm9ybWFsKCkp KkdlVjsKICAgICAgICAgIGVraW4gPSBHNHN0ZDo6bWF4KCAwLjAwMDEqR2VWLCBla2luICk7CiAg ICAgICAgICBjdXJyZW50UGFydGljbGUuU2V0S2luZXRpY0VuZXJneSggZWtpbipNZVYgKTsKICAg ICAgICAgIHBwID0gY3VycmVudFBhcnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICAg ICAgICBjdXJyZW50UGFydGljbGUuU2V0TW9tZW50dW0oIGN1cnJlbnRQYXJ0aWNsZS5HZXRNb21l bnR1bSgpICogKHBwL3BwMSkgKTsKICAgICAgICB9CiAgICAgICAgcHAxID0gdGFyZ2V0UGFydGlj bGUuR2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7CiAgICAgICAgaWYoIHBwMSA+PSAxLjAgKQogICAg ICAgIHsKICAgICAgICAgIGVraW4gPSB0YXJnZXRQYXJ0aWNsZS5HZXRLaW5ldGljRW5lcmd5KCkv TWVWIC0gY2ZhKigxLjArbm9ybWFsKCkvMi4pKkdlVjsKICAgICAgICAgIGVraW4gPSBHNHN0ZDo6 bWF4KCAwLjAwMDEqR2VWLCBla2luICk7CiAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRLaW5l dGljRW5lcmd5KCBla2luKk1lViApOwogICAgICAgICAgcHAgPSB0YXJnZXRQYXJ0aWNsZS5HZXRU b3RhbE1vbWVudHVtKCkvTWVWOwogICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0TW9tZW50dW0o IHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocHAvcHAxKSApOwogICAgICAgIH0KICAg ICAgfQogICAgfQogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2 ZWMsIHZlY0xlbik7CiAgICBpZiggYXRvbWljV2VpZ2h0ID49IDEuNSApCiAgICB7CiAgICAgIC8v IEFkZCBibGFjayB0cmFjayBwYXJ0aWNsZXMKICAgICAgLy8gIHRoZSBwcm9jZWR1cmUgaXMgc29t ZXdoYXQgZGlmZmVyZW50IHRoYW4gaW4gVHdvQ2x1c3RlciBhbmQgR2VuZXJhdGVYYW5kUHQuCiAg ICAgIC8vICBUaGUgcmVhc29uIGlzIHRoYXQgd2UgaGF2ZSB0byBhbHNvIHNpbXVsYXRlIHRoZSBu dWNsZWFyIHJlYWN0aW9ucwogICAgICAvLyAgYXQgbG93IGVuZXJnaWVzIGxpa2UgYShoLHApYiwg YShoLHAgcCliLCBhKGgsbiliIGV0Yy4KICAgICAgLy8KICAgICAgLy8gbnBuYiBpcyBudW1iZXIg b2YgcHJvdG9uL25ldXRyb24gYmxhY2sgdHJhY2sgcGFydGljbGVzCiAgICAgIC8vIG5kdGEgaXMg dGhlIG51bWJlciBvZiBkZXV0ZXJvbnMsIHRyaXRvbnMsIGFuZCBhbHBoYXMgcHJvZHVjZWQKICAg ICAgLy8gZXBuYiBpcyB0aGUga2luZXRpYyBlbmVyZ3kgYXZhaWxhYmxlIGZvciBwcm90b24vbmV1 dHJvbiBibGFjayB0cmFjayBwYXJ0aWNsZXMKICAgICAgLy8gZWR0YSBpcyB0aGUga2luZXRpYyBl bmVyZ3kgYXZhaWxhYmxlIGZvciBkZXV0ZXJvbi90cml0b24vYWxwaGEgcGFydGljbGVzCiAgICAg IC8vCiAgICAgIEc0ZG91YmxlIGVwbmIsIGVkdGE7CiAgICAgIEc0aW50IG5wbmI9MCwgbmR0YT0w OwogICAgICAKICAgICAgZXBuYiA9IHRhcmdldE51Y2xldXMuR2V0UE5CbGFja1RyYWNrRW5lcmd5 KCk7ICAgICAgICAgICAgLy8gd2FzIGVucDEgaW4gZm9ydHJhbiBjb2RlCiAgICAgIGVkdGEgPSB0 YXJnZXROdWNsZXVzLkdldERUQUJsYWNrVHJhY2tFbmVyZ3koKTsgICAgICAgICAgIC8vIHdhcyBl bnAzIGluIGZvcnRyYW4gY29kZQogICAgICBjb25zdCBHNGRvdWJsZSBwbkN1dE9mZiA9IDAuMDAw MTsgICAgICAgLy8gR2VWCiAgICAgIGNvbnN0IEc0ZG91YmxlIGR0YUN1dE9mZiA9IDAuMDAwMTsg ICAgICAvLyBHZVYKICAgICAgY29uc3QgRzRkb3VibGUga2luZXRpY01pbmltdW0gPSAwLjAwMDE7 CiAgICAgIGNvbnN0IEc0ZG91YmxlIGtpbmV0aWNGYWN0b3IgPSAtMC4wMTA7CiAgICAgIEc0ZG91 YmxlIHNwcm9iID0gMC4wOyAvLyBzcHJvYiA9IHByb2JhYmlsaXR5IG9mIHNlbGYtYWJzb3JwdGlv biBpbiBoZWF2eSBtb2xlY3VsZXMKICAgICAgaWYoIGVwbmIgPj0gcG5DdXRPZmYgKQogICAgICB7 CiAgICAgICAgbnBuYiA9IFBvaXNzb24oIGVwbmIvMC4wMiApOwogICAgICAgIGlmKCBucG5iID4g YXRvbWljV2VpZ2h0IClucG5iID0gRzRpbnQoYXRvbWljV2VpZ2h0KTsKICAgICAgICBpZiggKGVw bmIgPiBwbkN1dE9mZikgJiYgKG5wbmIgPD0gMCkgKW5wbmIgPSAxOwogICAgICAgIG5wbmIgPSBH NHN0ZDo6bWluKCBucG5iLCAxMjctdmVjTGVuICk7CiAgICAgIH0KICAgICAgaWYoIGVkdGEgPj0g ZHRhQ3V0T2ZmICkKICAgICAgewogICAgICAgIG5kdGEgPSBHNGludCgyLjAgKiBsb2coYXRvbWlj V2VpZ2h0KSk7CiAgICAgICAgbmR0YSA9IEc0c3RkOjptaW4oIG5kdGEsIDEyNy12ZWNMZW4gKTsK ICAgICAgfQogICAgICBHNGRvdWJsZSBzcGFsbCA9IDAuMDsKICAgICAgLy8gREVCVUdHSU5HIC0t PiBEdW1wRnJhbWVzOjpEdW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgICBBZGRCbGFja1RyYWNr UGFydGljbGVzKCBlcG5iLCBucG5iLCBlZHRhLCBuZHRhLCBzcHJvYiwga2luZXRpY01pbmltdW0s IGtpbmV0aWNGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkT3Jp Z2luYWwsIHNwYWxsLCB0YXJnZXROdWNsZXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB2ZWMsIHZlY0xlbiApOwogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBG cmFtZSh2ZWMsIHZlY0xlbik7CiAgICB9CiAgICAvLwogICAgLy8gIGNhbGN1bGF0ZSB0aW1lIGRl bGF5IGZvciBudWNsZWFyIHJlYWN0aW9ucwogICAgLy8KICAgIGlmKCAoYXRvbWljV2VpZ2h0ID49 IDEuNSkgJiYgKGF0b21pY1dlaWdodCA8PSAyMzAuMCkgJiYgKGVrT3JpZ2luYWwgPD0gMC4yKSAp CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRUT0YoIDEuMC01MDAuMCpleHAoLWVrT3JpZ2luYWwv MC4wNCkqbG9nKEc0VW5pZm9ybVJhbmQoKSkgKTsKICAgIGVsc2UKICAgICAgY3VycmVudFBhcnRp Y2xlLlNldFRPRiggMS4wICk7CiAgICByZXR1cm47CiAgfQogCiBHNGRvdWJsZSBHNFJlYWN0aW9u RHluYW1pY3M6OkdlbmVyYXRlTkJvZHlFdmVudCgKICBjb25zdCBHNGRvdWJsZSB0b3RhbEVuZXJn eSwgICAgICAgICAgICAgICAgLy8gTWVWCiAgY29uc3QgRzRib29sIGNvbnN0YW50Q3Jvc3NTZWN0 aW9uLAogIEc0RmFzdFZlY3RvcjxHNFJlYWN0aW9uUHJvZHVjdCwxMjg+ICZ2ZWMsCiAgRzRpbnQg JnZlY0xlbiApCiAgewovLyAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZy YW1lKHZlYywgdmVjTGVuKTsKICAgIC8vIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCBGT1JUUkFOIGNv ZGUgUEhBU1AgYnkgSC4gRmVzZWZlbGR0ICgwMi1EZWMtMTk4NikKICAgIC8vIFJldHVybnMgdGhl IHdlaWdodCBvZiB0aGUgZXZlbnQKICAgIC8vCiAgICBHNGludCBpOwogICAgY29uc3QgRzRkb3Vi bGUgZXhweHUgPSAgODIuOyAgICAgICAgICAgLy8gdXBwZXIgYm91bmQgZm9yIGFyZy4gb2YgZXhw CiAgICBjb25zdCBHNGRvdWJsZSBleHB4bCA9IC1leHB4dTsgICAgICAgICAvLyBsb3dlciBib3Vu ZCBmb3IgYXJnLiBvZiBleHAKICAgIGlmKCB2ZWNMZW4gPCAyICkKICAgIHsKICAgICAgRzRjZXJy IDw8ICIqKiogRXJyb3IgaW4gRzRSZWFjdGlvbkR5bmFtaWNzOjpHZW5lcmF0ZU5Cb2R5RXZlbnQi IDw8IEc0ZW5kbDsKICAgICAgRzRjZXJyIDw8ICIgICAgbnVtYmVyIG9mIHBhcnRpY2xlcyA8IDIi IDw8IEc0ZW5kbDsKICAgICAgRzRjZXJyIDw8ICJ0b3RhbEVuZXJneSA9ICIgPDwgdG90YWxFbmVy Z3kgPDwgIk1lViwgdmVjTGVuID0gIiA8PCB2ZWNMZW4gPDwgRzRlbmRsOwogICAgICByZXR1cm4g LTEuMDsKICAgIH0KICAgIEc0ZG91YmxlIG1hc3NbMThdOyAgICAvLyBtYXNzIG9mIGVhY2ggcGFy dGljbGUKICAgIEc0ZG91YmxlIGVuZXJneVsxOF07ICAvLyB0b3RhbCBlbmVyZ3kgb2YgZWFjaCBw YXJ0aWNsZQogICAgRzRkb3VibGUgcGNtWzNdWzE4XTsgICAgICAgICAgIC8vIHBjbSBpcyBhbiBh cnJheSB3aXRoIDMgcm93cyBhbmQgdmVjTGVuIGNvbHVtbnMKICAgIC8vRzRkb3VibGUgKm1hc3Mg PSBuZXcgRzRkb3VibGUgW3ZlY0xlbl07ICAgIC8vIG1hc3Mgb2YgZWFjaCBwYXJ0aWNsZQogICAg Ly9HNGRvdWJsZSAqZW5lcmd5ID0gbmV3IEc0ZG91YmxlIFt2ZWNMZW5dOyAgLy8gdG90YWwgZW5l cmd5IG9mIGVhY2ggcGFydGljbGUKICAgIC8vRzRkb3VibGUgKipwY207ICAgICAgICAgICAvLyBw Y20gaXMgYW4gYXJyYXkgd2l0aCAzIHJvd3MgYW5kIHZlY0xlbiBjb2x1bW5zCiAgICAvL3BjbSA9 IG5ldyBHNGRvdWJsZSAqIFszXTsKICAgIC8vZm9yKCBpPTA7IGk8MzsgKytpIClwY21baV0gPSBu ZXcgRzRkb3VibGUgW3ZlY0xlbl07CiAgICAKICAgIEc0ZG91YmxlIHRvdGFsTWFzcyA9IDAuMDsK ICAgIEc0ZG91YmxlIHNtWzE4XTsKICAgIC8vRzRkb3VibGUgKnNtID0gbmV3IEc0ZG91YmxlIFt2 ZWNMZW5dOwogICAgCiAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICB7CiAgICAgIG1h c3NbaV0gPSB2ZWNbaV0tPkdldE1hc3MoKS9HZVY7CiAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0o IDAuMCwgMC4wLCAwLjAgKTsKICAgICAgcGNtWzBdW2ldID0gMC4wOyAgICAgIC8vIHgtbW9tZW50 dW0gb2YgaS10aCBwYXJ0aWNsZQogICAgICBwY21bMV1baV0gPSAwLjA7ICAgICAgLy8geS1tb21l bnR1bSBvZiBpLXRoIHBhcnRpY2xlCiAgICAgIHBjbVsyXVtpXSA9IDAuMDsgICAgICAvLyB6LW1v bWVudHVtIG9mIGktdGggcGFydGljbGUKICAgICAgZW5lcmd5W2ldID0gbWFzc1tpXTsgIC8vIHRv dGFsIGVuZXJneSBvZiBpLXRoIHBhcnRpY2xlCiAgICAgIHRvdGFsTWFzcyArPSBtYXNzW2ldOwog ICAgICBzbVtpXSA9IHRvdGFsTWFzczsKICAgIH0KICAgIEc0ZG91YmxlIHRvdGFsRSA9IHRvdGFs RW5lcmd5L0dlVjsKICAgIGlmKCB0b3RhbE1hc3MgPiB0b3RhbEUgKQogICAgewogICAgICAvL0c0 Y2VyciA8PCAiKioqIEVycm9yIGluIEc0UmVhY3Rpb25EeW5hbWljczo6R2VuZXJhdGVOQm9keUV2 ZW50IiA8PCBHNGVuZGw7CiAgICAgIC8vRzRjZXJyIDw8ICIgICAgdG90YWwgbWFzcyAoIiA8PCB0 b3RhbE1hc3MqR2VWIDw8ICJNZVYpID4gdG90YWwgZW5lcmd5ICgiCiAgICAgIC8vICAgICA8PCB0 b3RhbEVuZXJneSA8PCAiTWVWKSIgPDwgRzRlbmRsOwogICAgICB0b3RhbEUgPSB0b3RhbE1hc3M7 CiAgICAgIC8vZGVsZXRlIFtdIG1hc3M7CiAgICAgIC8vZGVsZXRlIFtdIGVuZXJneTsKICAgICAg Ly9mb3IoIGk9MDsgaTwzOyArK2kgKWRlbGV0ZSBbXSBwY21baV07CiAgICAgIC8vZGVsZXRlIFtd IHBjbTsKICAgICAgLy9kZWxldGUgW10gc207CiAgICAgIHJldHVybiAtMS4wOwogICAgfQogICAg RzRkb3VibGUga2luZXRpY0VuZXJneSA9IHRvdGFsRSAtIHRvdGFsTWFzczsKICAgIEc0ZG91Ymxl IGVtbVsxOF07CiAgICAvL0c0ZG91YmxlICplbW0gPSBuZXcgRzRkb3VibGUgW3ZlY0xlbl07CiAg ICBlbW1bMF0gPSBtYXNzWzBdOwogICAgZW1tW3ZlY0xlbi0xXSA9IHRvdGFsRTsKICAgIGlmKCB2 ZWNMZW4gPiAyICkgICAgICAgICAgLy8gdGhlIHJhbmRvbSBudW1iZXJzIGFyZSBzb3J0ZWQKICAg IHsKICAgICAgRzRkb3VibGUgcmFuWzE4XTsKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kg KXJhbltpXSA9IEc0VW5pZm9ybVJhbmQoKTsKICAgICAgZm9yKCBpPTA7IGk8dmVjTGVuLTI7ICsr aSApCiAgICAgIHsKICAgICAgICBmb3IoIEc0aW50IGo9dmVjTGVuLTI7IGo+aTsgLS1qICkKICAg ICAgICB7CiAgICAgICAgICBpZiggcmFuW2ldID4gcmFuW2pdICkKICAgICAgICAgIHsKICAgICAg ICAgICAgRzRkb3VibGUgdGVtcCA9IHJhbltpXTsKICAgICAgICAgICAgcmFuW2ldID0gcmFuW2pd OwogICAgICAgICAgICByYW5bal0gPSB0ZW1wOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAg fQogICAgICBmb3IoIGk9MTsgaTx2ZWNMZW4tMTsgKytpICllbW1baV0gPSByYW5baS0xXSpraW5l dGljRW5lcmd5ICsgc21baV07CiAgICB9CiAgICAvLyAgIFdlaWdodCBpcyB0aGUgc3VtIG9mIGxv Z2FyaXRobXMgb2YgdGVybXMgaW5zdGVhZCBvZiB0aGUgcHJvZHVjdCBvZiB0ZXJtcwogICAgRzRi b29sIGx6ZXJvID0gdHJ1ZTsgICAgCiAgICBHNGRvdWJsZSB3dG1heCA9IDAuMDsKICAgIGlmKCBj b25zdGFudENyb3NzU2VjdGlvbiApICAgICAvLyB0aGlzIGlzIEtHRU5FVj0xIGluIFBIQVNQCiAg ICB7CiAgICAgIEc0ZG91YmxlIGVtbWF4ID0ga2luZXRpY0VuZXJneSArIG1hc3NbMF07CiAgICAg IEc0ZG91YmxlIGVtbWluID0gMC4wOwogICAgICBmb3IoIGk9MTsgaTx2ZWNMZW47ICsraSApCiAg ICAgIHsKICAgICAgICBlbW1pbiArPSBtYXNzW2ktMV07CiAgICAgICAgZW1tYXggKz0gbWFzc1tp XTsKICAgICAgICBHNGRvdWJsZSB3dGZjID0gMC4wOwogICAgICAgIGlmKCBlbW1heCplbW1heCA+ IDAuMCApCiAgICAgICAgewogICAgICAgICAgRzRkb3VibGUgYXJnID0gZW1tYXgqZW1tYXgKICAg ICAgICAgICAgKyAoZW1taW4qZW1taW4tbWFzc1tpXSptYXNzW2ldKSooZW1taW4qZW1taW4tbWFz c1tpXSptYXNzW2ldKS8oZW1tYXgqZW1tYXgpCiAgICAgICAgICAgIC0gMi4wKihlbW1pbiplbW1p bittYXNzW2ldKm1hc3NbaV0pOwogICAgICAgICAgaWYoIGFyZyA+IDAuMCApd3RmYyA9IDAuNSpz cXJ0KCBhcmcgKTsKICAgICAgICB9CiAgICAgICAgaWYoIHd0ZmMgPT0gMC4wICkKICAgICAgICB7 CiAgICAgICAgICBsemVybyA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAg ICAgIHd0bWF4ICs9IGxvZyggd3RmYyApOwogICAgICB9CiAgICAgIGlmKCBsemVybyApCiAgICAg ICAgd3RtYXggPSAtd3RtYXg7CiAgICAgIGVsc2UKICAgICAgICB3dG1heCA9IGV4cHh1OwogICAg fQogICAgZWxzZQogICAgewogICAgICAvLyAgIGZmcShuKSA9IHBpKigyKnBpKV4obi0yKS8obi0y KSEKICAgICAgY29uc3QgRzRkb3VibGUgZmZxWzE4XSA9IHsgMC4sIDMuMTQxNTkyLCAxOS43Mzky MSwgNjIuMDEyNTUsIDEyOS44Nzg4LCAyMDQuMDEzMSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMjU2LjM3MDQsIDI2OC40NzA1LCAyNDAuOTc4MCwgMTg5LjI2MzcsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMi4xMzA4LCAgODMuMDIwMiwgIDQ3LjQyMTAsICAy NC44Mjk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi4wMDA2LCAgIDUuMzg1 OCwgICAyLjI1NjAsICAgMC44ODU5IH07CiAgICAgIHd0bWF4ID0gbG9nKCBwb3coIGtpbmV0aWNF bmVyZ3ksIHZlY0xlbi0yICkgKiBmZnFbdmVjTGVuLTFdIC8gdG90YWxFICk7CiAgICB9CiAgICBs emVybyA9IHRydWU7CiAgICBHNGRvdWJsZSBwZFs1MF07CiAgICAvL0c0ZG91YmxlICpwZCA9IG5l dyBHNGRvdWJsZSBbdmVjTGVuLTFdOwogICAgZm9yKCBpPTA7IGk8dmVjTGVuLTE7ICsraSApCiAg ICB7CiAgICAgIHBkW2ldID0gMC4wOwogICAgICBpZiggZW1tW2krMV0qZW1tW2krMV0gPiAwLjAg KQogICAgICB7CiAgICAgICAgRzRkb3VibGUgYXJnID0gZW1tW2krMV0qZW1tW2krMV0KICAgICAg ICAgICsgKGVtbVtpXSplbW1baV0tbWFzc1tpKzFdKm1hc3NbaSsxXSkqKGVtbVtpXSplbW1baV0t bWFzc1tpKzFdKm1hc3NbaSsxXSkKICAgICAgICAgICAgLyhlbW1baSsxXSplbW1baSsxXSkKICAg ICAgICAgIC0gMi4wKihlbW1baV0qZW1tW2ldK21hc3NbaSsxXSptYXNzW2krMV0pOwogICAgICAg IGlmKCBhcmcgPiAwLjAgKXBkW2ldID0gMC41KnNxcnQoIGFyZyApOwogICAgICB9CiAgICAgIGlm KCBwZFtpXSA8PSAwLjAgKSAgICAvLyAgY2hhbmdlZCBmcm9tICA9PSAgb24gMDIgQXByaWwgOTgK ICAgICAgICBsemVybyA9IGZhbHNlOwogICAgICBlbHNlCiAgICAgICAgd3RtYXggKz0gbG9nKCBw ZFtpXSApOwogICAgfQogICAgRzRkb3VibGUgd2VpZ2h0ID0gMC4wOyAgICAgICAgICAgLy8gd2Vp Z2h0IGlzIHJldHVybmVkIGJ5IEdlbmVyYXRlTkJvZHlFdmVudAogICAgaWYoIGx6ZXJvICl3ZWln aHQgPSBleHAoIEc0c3RkOjptYXgoRzRzdGQ6Om1pbih3dG1heCxleHB4dSksZXhweGwpICk7CiAg ICAKICAgIEc0ZG91YmxlIGJhbmcsIGNiLCBzYiwgczAsIHMxLCBzMiwgYywgcywgZXN5cywgYSwg YiwgZ2FtYSwgYmV0YTsKICAgIHBjbVswXVswXSA9IDAuMDsKICAgIHBjbVsxXVswXSA9IHBkWzBd OwogICAgcGNtWzJdWzBdID0gMC4wOwogICAgZm9yKCBpPTE7IGk8dmVjTGVuOyArK2kgKQogICAg ewogICAgICBwY21bMF1baV0gPSAwLjA7CiAgICAgIHBjbVsxXVtpXSA9IC1wZFtpLTFdOwogICAg ICBwY21bMl1baV0gPSAwLjA7CiAgICAgIGJhbmcgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAg ICAgIGNiID0gY29zKGJhbmcpOwogICAgICBzYiA9IHNpbihiYW5nKTsKICAgICAgYyA9IDIuMCpH NFVuaWZvcm1SYW5kKCkgLSAxLjA7CiAgICAgIHMgPSBzcXJ0KCBmYWJzKCAxLjAtYypjICkgKTsK ICAgICAgaWYoIGkgPCB2ZWNMZW4tMSApCiAgICAgIHsKICAgICAgICBlc3lzID0gc3FydChwZFtp XSpwZFtpXSArIGVtbVtpXSplbW1baV0pOwogICAgICAgIGJldGEgPSBwZFtpXS9lc3lzOwogICAg ICAgIGdhbWEgPSBlc3lzL2VtbVtpXTsKICAgICAgICBmb3IoIEc0aW50IGo9MDsgajw9aTsgKytq ICkKICAgICAgICB7CiAgICAgICAgICBzMCA9IHBjbVswXVtqXTsKICAgICAgICAgIHMxID0gcGNt WzFdW2pdOwogICAgICAgICAgczIgPSBwY21bMl1bal07CiAgICAgICAgICBlbmVyZ3lbal0gPSBz cXJ0KCBzMCpzMCArIHMxKnMxICsgczIqczIgKyBtYXNzW2pdKm1hc3Nbal0gKTsKICAgICAgICAg IGEgPSBzMCpjIC0gczEqczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgcm90YXRpb24K ICAgICAgICAgIHBjbVsxXVtqXSA9IHMwKnMgKyBzMSpjOwogICAgICAgICAgYiA9IHBjbVsyXVtq XTsKICAgICAgICAgIHBjbVswXVtqXSA9IGEqY2IgLSBiKnNiOwogICAgICAgICAgcGNtWzJdW2pd ID0gYSpzYiArIGIqY2I7CiAgICAgICAgICBwY21bMV1bal0gPSBnYW1hKihwY21bMV1bal0gKyBi ZXRhKmVuZXJneVtqXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAg ICAgIGZvciggRzRpbnQgaj0wOyBqPD1pOyArK2ogKQogICAgICAgIHsKICAgICAgICAgIHMwID0g cGNtWzBdW2pdOwogICAgICAgICAgczEgPSBwY21bMV1bal07CiAgICAgICAgICBzMiA9IHBjbVsy XVtqXTsKICAgICAgICAgIGVuZXJneVtqXSA9IHNxcnQoIHMwKnMwICsgczEqczEgKyBzMipzMiAr IG1hc3Nbal0qbWFzc1tqXSApOwogICAgICAgICAgYSA9IHMwKmMgLSBzMSpzOyAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8vICByb3RhdGlvbgogICAgICAgICAgcGNtWzFdW2pdID0gczAqcyAr IHMxKmM7CiAgICAgICAgICBiID0gcGNtWzJdW2pdOwogICAgICAgICAgcGNtWzBdW2pdID0gYSpj YiAtIGIqc2I7CiAgICAgICAgICBwY21bMl1bal0gPSBhKnNiICsgYipjYjsKICAgICAgICB9CiAg ICAgIH0KICAgIH0KICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytpICkKICAgIHsKICAgICAgdmVj W2ldLT5TZXRNb21lbnR1bSggcGNtWzBdW2ldKkdlViwgcGNtWzFdW2ldKkdlViwgcGNtWzJdW2ld KkdlViApOwogICAgICB2ZWNbaV0tPlNldFRvdGFsRW5lcmd5KCBlbmVyZ3lbaV0qR2VWICk7CiAg ICB9CiAgICAvL2RlbGV0ZSBbXSBtYXNzOwogICAgLy9kZWxldGUgW10gZW5lcmd5OwogICAgLy9m b3IoIGk9MDsgaTwzOyArK2kgKWRlbGV0ZSBbXSBwY21baV07CiAgICAvL2RlbGV0ZSBbXSBwY207 CiAgICAvL2RlbGV0ZSBbXSBlbW07CiAgICAvL2RlbGV0ZSBbXSBzbTsKICAgIC8vZGVsZXRlIFtd IHBkOwogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZl Y0xlbik7CiAgICByZXR1cm4gd2VpZ2h0OwogIH0KIAogRzRkb3VibGUKICAgRzRSZWFjdGlvbkR5 bmFtaWNzOjpub3JtYWwoKQogICB7CiAgICAgRzRkb3VibGUgcmFuID0gLTYuMDsKICAgICBmb3Io IEc0aW50IGk9MDsgaTwxMjsgKytpIClyYW4gKz0gRzRVbmlmb3JtUmFuZCgpOwogICAgIHJldHVy biByYW47CiAgIH0KIAogRzRpbnQKICAgRzRSZWFjdGlvbkR5bmFtaWNzOjpQb2lzc29uKCBHNGRv dWJsZSB4ICkgIC8vIGdlbmVyYXRpb24gb2YgcG9pc3NvbiBkaXN0cmlidXRpb24KICAgewogICAg IEc0aW50IGlyYW47CiAgICAgRzRkb3VibGUgcmFuOwogICAgIAogICAgIGlmKCB4ID4gOS45ICkg ICAgLy8gdXNlIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBzaWdtYV4yID0gPHg+CiAgICAgICBp cmFuID0gc3RhdGljX2Nhc3Q8RzRpbnQ+KEc0c3RkOjptYXgoIDAuMCwgeCtub3JtYWwoKSpzcXJ0 KHgpICkgKTsKICAgICBlbHNlIHsKICAgICAgRzRpbnQgbW0gPSBHNGludCg1LjAqeCk7CiAgICAg IGlmKCBtbSA8PSAwICkgICAvLyBmb3IgdmVyeSBzbWFsbCB4IHRyeSBpcmFuPTEsMiwzCiAgICAg IHsKICAgICAgICBHNGRvdWJsZSBwMSA9IHgqZXhwKC14KTsKICAgICAgICBHNGRvdWJsZSBwMiA9 IHgqcDEvMi4wOwogICAgICAgIEc0ZG91YmxlIHAzID0geCpwMi8zLjA7CiAgICAgICAgcmFuID0g RzRVbmlmb3JtUmFuZCgpOwogICAgICAgIGlmKCByYW4gPCBwMyApCiAgICAgICAgICBpcmFuID0g MzsKICAgICAgICBlbHNlIGlmKCByYW4gPCBwMiApICAgLy8gdGhpcyBpcyBvcmlnaW5hbCBHZWlz aGEsIGl0IHNob3VsZCBiZSByYW4gPCBwMitwMwogICAgICAgICAgaXJhbiA9IDI7CiAgICAgICAg ZWxzZSBpZiggcmFuIDwgcDEgKSAgIC8vIHNob3VsZCBiZSByYW4gPCBwMStwMitwMwogICAgICAg ICAgaXJhbiA9IDE7CiAgICAgICAgZWxzZQogICAgICAgICAgaXJhbiA9IDA7CiAgICAgIH0KICAg ICAgZWxzZQogICAgICB7CiAgICAgICAgaXJhbiA9IDA7CiAgICAgICAgRzRkb3VibGUgciA9IGV4 cCgteCk7CiAgICAgICAgcmFuID0gRzRVbmlmb3JtUmFuZCgpOwogICAgICAgIGlmKCByYW4gPiBy ICkKICAgICAgICB7CiAgICAgICAgICBHNGRvdWJsZSBycnI7CiAgICAgICAgICBHNGRvdWJsZSBy ciA9IHI7CiAgICAgICAgICBmb3IoIEc0aW50IGk9MTsgaTw9bW07ICsraSApCiAgICAgICAgICB7 CiAgICAgICAgICAgIGlyYW4rKzsKICAgICAgICAgICAgaWYoIGkgPiA1ICkgICAvLyBTdGlybGlu ZydzIGZvcm11bGEgZm9yIGxhcmdlIG51bWJlcnMKICAgICAgICAgICAgICBycnIgPSBleHAoaSps b2coeCktKGkrMC41KSpsb2coKEc0ZG91YmxlKWkpK2ktMC45MTg5Mzg1KTsKICAgICAgICAgICAg ZWxzZQogICAgICAgICAgICAgIHJyciA9IHBvdyh4LGkpL0ZhY3RvcmlhbChpKTsKICAgICAgICAg ICAgcnIgKz0gcipycnI7CiAgICAgICAgICAgIGlmKCByYW4gPD0gcnIgKWJyZWFrOwogICAgICAg ICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGlyYW47CiAgfQogCiBHNGlu dAogICBHNFJlYWN0aW9uRHluYW1pY3M6OkZhY3RvcmlhbCggRzRpbnQgbiApCiAgIHsgICAvLyBj YWxjdWxhdGVzIGZhY3RvcmlhbCggbiApID0gbioobi0xKSoobi0yKSouLi4qMQogICAgIEc0aW50 IG0gPSBHNHN0ZDo6bWluKG4sMTApOwogICAgIEc0aW50IHJlc3VsdCA9IDE7CiAgICAgaWYoIG0g PD0gMSApcmV0dXJuIHJlc3VsdDsKICAgICBmb3IoIEc0aW50IGk9MjsgaTw9bTsgKytpIClyZXN1 bHQgKj0gaTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKIHZvaWQgRzRSZWFjdGlvbkR5bmFt aWNzOjpEZWZzMSgKICAgY29uc3QgRzRSZWFjdGlvblByb2R1Y3QgJm1vZGlmaWVkT3JpZ2luYWws CiAgIEc0UmVhY3Rpb25Qcm9kdWN0ICZjdXJyZW50UGFydGljbGUsCiAgIEc0UmVhY3Rpb25Qcm9k dWN0ICZ0YXJnZXRQYXJ0aWNsZSwKICAgRzRGYXN0VmVjdG9yPEc0UmVhY3Rpb25Qcm9kdWN0LDEy OD4gJnZlYywKICAgRzRpbnQgJnZlY0xlbiApCiAgewogICAgY29uc3QgRzRkb3VibGUgcGp4ID0g bW9kaWZpZWRPcmlnaW5hbC5HZXRNb21lbnR1bSgpLngoKS9NZVY7CiAgICBjb25zdCBHNGRvdWJs ZSBwankgPSBtb2RpZmllZE9yaWdpbmFsLkdldE1vbWVudHVtKCkueSgpL01lVjsKICAgIGNvbnN0 IEc0ZG91YmxlIHBqeiA9IG1vZGlmaWVkT3JpZ2luYWwuR2V0TW9tZW50dW0oKS56KCkvTWVWOwog ICAgY29uc3QgRzRkb3VibGUgcCA9IG1vZGlmaWVkT3JpZ2luYWwuR2V0TW9tZW50dW0oKS5tYWco KS9NZVY7CiAgICBpZiggcGp4KnBqeCtwankqcGp5ID4gMC4wICkKICAgIHsKICAgICAgRzRkb3Vi bGUgY29zdCwgc2ludCwgcGgsIGNvc3AsIHNpbnAsIHBpeCwgcGl5LCBwaXo7CiAgICAgIGNvc3Qg PSBwanovcDsKICAgICAgc2ludCA9IDAuNSAqICggc3FydChhYnMoKDEuMC1jb3N0KSooMS4wK2Nv c3QpKSkgKyBzcXJ0KHBqeCpwangrcGp5KnBqeSkvcCApOwogICAgICBpZiggcGp5IDwgMC4wICkK ICAgICAgICBwaCA9IDMqaGFsZnBpOwogICAgICBlbHNlCiAgICAgICAgcGggPSBoYWxmcGk7CiAg ICAgIGlmKCBhYnMoIHBqeCApID4gMC4wMDEqTWVWIClwaCA9IGF0YW4yKHBqeSxwangpOwogICAg ICBjb3NwID0gY29zKHBoKTsKICAgICAgc2lucCA9IHNpbihwaCk7CiAgICAgIHBpeCA9IGN1cnJl bnRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpLngoKS9NZVY7CiAgICAgIHBpeSA9IGN1cnJlbnRQYXJ0 aWNsZS5HZXRNb21lbnR1bSgpLnkoKS9NZVY7CiAgICAgIHBpeiA9IGN1cnJlbnRQYXJ0aWNsZS5H ZXRNb21lbnR1bSgpLnooKS9NZVY7CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSgg Y29zdCpjb3NwKnBpeCpNZVYgLSBzaW5wKnBpeStzaW50KmNvc3AqcGl6Kk1lViwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0KnNpbnAqcGl4Kk1lViArIGNvc3AqcGl5K3Np bnQqc2lucCpwaXoqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zaW50 KnBpeCpNZVYgICAgICsgY29zdCpwaXoqTWVWICk7CiAgICAgIHBpeCA9IHRhcmdldFBhcnRpY2xl LkdldE1vbWVudHVtKCkueCgpL01lVjsKICAgICAgcGl5ID0gdGFyZ2V0UGFydGljbGUuR2V0TW9t ZW50dW0oKS55KCkvTWVWOwogICAgICBwaXogPSB0YXJnZXRQYXJ0aWNsZS5HZXRNb21lbnR1bSgp LnooKS9NZVY7CiAgICAgIHRhcmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCBjb3N0KmNvc3AqcGl4 Kk1lViAtIHNpbnAqcGl5K3NpbnQqY29zcCpwaXoqTWVWLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29zdCpzaW5wKnBpeCpNZVYgKyBjb3NwKnBpeStzaW50KnNpbnAqcGl6Kk1l ViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zaW50KnBpeCpNZVYgICAgICsg Y29zdCpwaXoqTWVWICk7CiAgICAgIGZvciggRzRpbnQgaT0wOyBpPHZlY0xlbjsgKytpICkKICAg ICAgewogICAgICAgIHBpeCA9IHZlY1tpXS0+R2V0TW9tZW50dW0oKS54KCkvTWVWOwogICAgICAg IHBpeSA9IHZlY1tpXS0+R2V0TW9tZW50dW0oKS55KCkvTWVWOwogICAgICAgIHBpeiA9IHZlY1tp XS0+R2V0TW9tZW50dW0oKS56KCkvTWVWOwogICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0oIGNv c3QqY29zcCpwaXgqTWVWIC0gc2lucCpwaXkrc2ludCpjb3NwKnBpeipNZVYsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29zdCpzaW5wKnBpeCpNZVYgKyBjb3NwKnBpeStzaW50KnNpbnAq cGl6Kk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2ludCpwaXgqTWVWICAgICAr IGNvc3QqcGl6Kk1lViApOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmKCBw anogPCAwLjAgKQogICAgICB7CiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCAt Y3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkueigpICk7CiAgICAgICAgdGFyZ2V0UGFydGlj bGUuU2V0TW9tZW50dW0oIC10YXJnZXRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpLnooKSApOwogICAg ICAgIGZvciggRzRpbnQgaT0wOyBpPHZlY0xlbjsgKytpICkKICAgICAgICAgIHZlY1tpXS0+U2V0 TW9tZW50dW0oIC12ZWNbaV0tPkdldE1vbWVudHVtKCkueigpICk7CiAgICAgIH0KICAgIH0KICB9 CiAKIHZvaWQgRzRSZWFjdGlvbkR5bmFtaWNzOjpSb3RhdGUoCiAgY29uc3QgRzRkb3VibGUgbnVt YmVyb2ZGaW5hbFN0YXRlTnVjbGVvbnMsCiAgY29uc3QgRzRUaHJlZVZlY3RvciAmdGVtcCwKICBj b25zdCBHNFJlYWN0aW9uUHJvZHVjdCAmbW9kaWZpZWRPcmlnaW5hbCwgLy8gRmVybWkgbW90aW9u ICYgZXZhcC4gZWZmZWN0IGluY2x1ZGVkCiAgY29uc3QgRzREeW5hbWljUGFydGljbGUgKm9yaWdp bmFsSW5jaWRlbnQsIC8vIG9yaWdpbmFsIGluY2lkZW50IHBhcnRpY2xlCiAgY29uc3QgRzROdWNs ZXVzICZ0YXJnZXROdWNsZXVzLAogIEc0UmVhY3Rpb25Qcm9kdWN0ICZjdXJyZW50UGFydGljbGUs CiAgRzRSZWFjdGlvblByb2R1Y3QgJnRhcmdldFBhcnRpY2xlLAogIEc0RmFzdFZlY3RvcjxHNFJl YWN0aW9uUHJvZHVjdCwxMjg+ICZ2ZWMsCiAgRzRpbnQgJnZlY0xlbiApCiAgewogICAgLy8gZGVy aXZlZCBmcm9tIG9yaWdpbmFsIEZPUlRSQU4gY29kZSBpbiBHRU5YUFQgYW5kIFRXT0NMVSBieSBI LiBGZXNlZmVsZHQKICAgIC8vCiAgICAvLyAgIFJvdGF0ZSBpbiBkaXJlY3Rpb24gb2Ygei1heGlz LCB0aGlzIGRvZXMgZGlzdHVyYiBpbiBzb21lIHdheSBvdXIKICAgIC8vICAgIGluY2x1c2l2ZSBk aXN0cmlidXRpb25zLCBidXQgaXQgaXMgbmVjZXNzYXJ5IGZvciBtb21lbnR1bSBjb25zZXJ2YXRp b24KICAgIC8vCiAgICBjb25zdCBHNGRvdWJsZSBhdG9taWNXZWlnaHQgPSB0YXJnZXROdWNsZXVz LkdldE4oKTsKICAgIGNvbnN0IEc0ZG91YmxlIGxvZ1dlaWdodCA9IGxvZyhhdG9taWNXZWlnaHQp OwogICAgCiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpTWludXMgPSBHNFBpb25NaW51czo6 UGlvbk1pbnVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpUGx1cyA9IEc0UGlvblBs dXM6OlBpb25QbHVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVBpWmVybyA9IEc0UGlv blplcm86OlBpb25aZXJvKCk7CiAgICAKICAgIEc0aW50IGk7CiAgICBHNFRocmVlVmVjdG9yIHBz ZXVkb1BhcnRpY2xlWzRdOwogICAgZm9yKCBpPTA7IGk8NDsgKytpIClwc2V1ZG9QYXJ0aWNsZVtp XS5zZXQoMCwwLDApOwogICAgcHNldWRvUGFydGljbGVbMF0gPSBjdXJyZW50UGFydGljbGUuR2V0 TW9tZW50dW0oKQogICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldFBhcnRpY2xlLkdldE1v bWVudHVtKCk7CiAgICBmb3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICAgIHBzZXVkb1BhcnRp Y2xlWzBdID0gcHNldWRvUGFydGljbGVbMF0gKyAodmVjW2ldLT5HZXRNb21lbnR1bSgpKTsKICAg IC8vCiAgICAvLyAgU29tZSBzbWVhcmluZyBpbiB0cmFuc3ZlcnNlIGRpcmVjdGlvbiBmcm9tIEZl cm1pIG1vdGlvbgogICAgLy8KICAgIEc0ZmxvYXQgcHAsIHBwMTsKICAgIEc0ZG91YmxlIGFsZWt3 LCBwLCBydGhudmUsIHBoaW52ZTsKICAgIEc0ZG91YmxlIHIxLCByMiwgYTEsIHJhbjEsIHJhbjIs IHh4aCwgZXhoLCBweFRlbXAsIHB5VGVtcCwgcHpUZW1wOwogICAgCiAgICByMSA9IHR3b3BpKkc0 VW5pZm9ybVJhbmQoKTsKICAgIHIyID0gRzRVbmlmb3JtUmFuZCgpOwogICAgYTEgPSBzcXJ0KC0y LjAqbG9nKHIyKSk7CiAgICByYW4xID0gYTEqc2luKHIxKSowLjAyMCpudW1iZXJvZkZpbmFsU3Rh dGVOdWNsZW9ucypHZVY7CiAgICByYW4yID0gYTEqY29zKHIxKSowLjAyMCpudW1iZXJvZkZpbmFs U3RhdGVOdWNsZW9ucypHZVY7CiAgICBHNFRocmVlVmVjdG9yIGZlcm1pKHJhbjEsIHJhbjIsIDAp OwoKICAgIHBzZXVkb1BhcnRpY2xlWzBdID0gcHNldWRvUGFydGljbGVbMF0rZmVybWk7IC8vIGFs bCBwYXJ0aWNsZXMgKyBmZXJtaQogICAgcHNldWRvUGFydGljbGVbMl0gPSB0ZW1wOyAvLyBvcmln aW5hbCBpbiBjbXMgc3lzdGVtCiAgICBwc2V1ZG9QYXJ0aWNsZVszXSA9IHBzZXVkb1BhcnRpY2xl WzBdOwogICAgCiAgICBwc2V1ZG9QYXJ0aWNsZVsxXSA9IHBzZXVkb1BhcnRpY2xlWzJdLmNyb3Nz KHBzZXVkb1BhcnRpY2xlWzNdKTsKICAgIHBzZXVkb1BhcnRpY2xlWzJdID0gcHNldWRvUGFydGlj bGVbM10uY3Jvc3MocHNldWRvUGFydGljbGVbMV0pOyAgICAKICAgIGZvcihHNGludCBpaT0xOyBp aTw9MzsgaWkrKykKICAgIHsKICAgICAgcCA9IHBzZXVkb1BhcnRpY2xlW2lpXS5tYWcoKTsKICAg ICAgaWYoIHAgPT0gMC4wICkKICAgICAgICBwc2V1ZG9QYXJ0aWNsZVtpaV09IEc0VGhyZWVWZWN0 b3IoIDAuMCwgMC4wLCAwLjAgKTsKICAgICAgZWxzZQogICAgICAgIHBzZXVkb1BhcnRpY2xlW2lp XT0gcHNldWRvUGFydGljbGVbaWldICogKDEuL3ApOwogICAgfQogICAgCiAgICBweFRlbXAgPSBw c2V1ZG9QYXJ0aWNsZVsxXS5kb3QoY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkpOwogICAg cHlUZW1wID0gcHNldWRvUGFydGljbGVbMl0uZG90KGN1cnJlbnRQYXJ0aWNsZS5HZXRNb21lbnR1 bSgpKTsKICAgIHB6VGVtcCA9IHBzZXVkb1BhcnRpY2xlWzNdLmRvdChjdXJyZW50UGFydGljbGUu R2V0TW9tZW50dW0oKSk7CiAgICBjdXJyZW50UGFydGljbGUuU2V0TW9tZW50dW0oIHB4VGVtcCwg cHlUZW1wLCBwelRlbXAgKTsKICAgIAogICAgcHhUZW1wID0gcHNldWRvUGFydGljbGVbMV0uZG90 KHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkpOwogICAgcHlUZW1wID0gcHNldWRvUGFydGlj bGVbMl0uZG90KHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkpOwogICAgcHpUZW1wID0gcHNl dWRvUGFydGljbGVbM10uZG90KHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkpOwogICAgdGFy Z2V0UGFydGljbGUuU2V0TW9tZW50dW0oIHB4VGVtcCwgcHlUZW1wLCBwelRlbXAgKTsKICAgIAog ICAgZm9yKCBpPTA7IGk8dmVjTGVuOyArK2kgKQogICAgewogICAgICBweFRlbXAgPSBwc2V1ZG9Q YXJ0aWNsZVsxXS5kb3QodmVjW2ldLT5HZXRNb21lbnR1bSgpKTsKICAgICAgcHlUZW1wID0gcHNl dWRvUGFydGljbGVbMl0uZG90KHZlY1tpXS0+R2V0TW9tZW50dW0oKSk7CiAgICAgIHB6VGVtcCA9 IHBzZXVkb1BhcnRpY2xlWzNdLmRvdCh2ZWNbaV0tPkdldE1vbWVudHVtKCkpOwogICAgICB2ZWNb aV0tPlNldE1vbWVudHVtKCBweFRlbXAsIHB5VGVtcCwgcHpUZW1wICk7CiAgICB9CiAgICAvLwog ICAgLy8gIFJvdGF0ZSBpbiBkaXJlY3Rpb24gb2YgcHJpbWFyeSBwYXJ0aWNsZSwgc3VidHJhY3Qg YmluZGluZyBlbmVyZ2llcwogICAgLy8gICBhbmQgbWFrZSBzb21lIGZ1cnRoZXIgY29ycmVjdGlv bnMgaWYgcmVxdWlyZWQKICAgIC8vCiAgICBEZWZzMSggbW9kaWZpZWRPcmlnaW5hbCwgY3VycmVu dFBhcnRpY2xlLCB0YXJnZXRQYXJ0aWNsZSwgdmVjLCB2ZWNMZW4gKTsKICAgIEc0ZG91YmxlIGVr aW47CiAgICBHNGRvdWJsZSBkZWtpbiA9IDAuMDsKICAgIEc0ZG91YmxlIGVrMSA9IDAuMDsKICAg IEc0aW50IG5waW9ucyA9IDA7CiAgICBpZiggYXRvbWljV2VpZ2h0ID49IDEuNSApICAgICAgICAg ICAgLy8gc2VsZi1hYnNvcnB0aW9uIGluIGhlYXZ5IG1vbGVjdWxlcwogICAgewogICAgICAvLyBj b3JyZWN0aW9ucyBmb3Igc2luZ2xlIHBhcnRpY2xlIHNwZWN0cmEgKHNob3dlciBwYXJ0aWNsZXMp CiAgICAgIC8vCiAgICAgIGNvbnN0IEc0ZG91YmxlIGFsZW1bXSA9IHsgMS40MCwgMi4zMCwgMi43 MCwgMy4wMCwgMy40MCwgNC42MCwgNy4wMCB9OwogICAgICBjb25zdCBHNGRvdWJsZSB2YWwwW10g PSB7IDAuMDAsIDAuNDAsIDAuNDgsIDAuNTEsIDAuNTQsIDAuNjAsIDAuNjUgfTsKICAgICAgYWxl a3cgPSBsb2coIG9yaWdpbmFsSW5jaWRlbnQtPkdldEtpbmV0aWNFbmVyZ3koKS9HZVYgKTsKICAg ICAgZXhoID0gMS4wOwogICAgICBpZiggYWxla3cgPiBhbGVtWzBdICkgICAvLyAgIGdldCBlbmVy Z3kgYmluCiAgICAgIHsKICAgICAgICBleGggPSB2YWwwWzZdOwogICAgICAgIGZvciggRzRpbnQg aj0xOyBqPDc7ICsraiApCiAgICAgICAgewogICAgICAgICAgaWYoIGFsZWt3IDwgYWxlbVtqXSAp IC8vIHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbi9leHRyYXBvbGF0aW9uCiAgICAgICAgICB7CiAg ICAgICAgICAgIEc0ZG91YmxlIHJjbnZlID0gKHZhbDBbal0gLSB2YWwwW2otMV0pIC8gKGFsZW1b al0gLSBhbGVtW2otMV0pOwogICAgICAgICAgICBleGggPSByY252ZSAqIGFsZWt3ICsgdmFsMFtq LTFdIC0gcmNudmUgKiBhbGVtW2otMV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQog ICAgICAgIH0KICAgICAgICBleGggPSAxLjAgLSBleGg7CiAgICAgIH0KICAgICAgY29uc3QgRzRk b3VibGUgY2ZhID0gMC4wMjUqKChhdG9taWNXZWlnaHQtMS4pLzEyMC4pKmV4cCgtKGF0b21pY1dl aWdodC0xLikvMTIwLik7CiAgICAgIGVraW4gPSBjdXJyZW50UGFydGljbGUuR2V0S2luZXRpY0Vu ZXJneSgpL0dlViAtIGNmYSooMStub3JtYWwoKS8yLjApOwogICAgICBla2luID0gRzRzdGQ6Om1h eCggMS4wZS02LCBla2luICk7CiAgICAgIHh4aCA9IDEuMDsKICAgICAgaWYoICggKG1vZGlmaWVk T3JpZ2luYWwuR2V0RGVmaW5pdGlvbigpID09IGFQaVBsdXMpIHx8CiAgICAgICAgICAgIChtb2Rp ZmllZE9yaWdpbmFsLkdldERlZmluaXRpb24oKSA9PSBhUGlNaW51cykgKSAmJgogICAgICAgICAg KGN1cnJlbnRQYXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBpWmVybykgJiYKICAgICAgICAg IChHNFVuaWZvcm1SYW5kKCkgPD0gbG9nV2VpZ2h0KSApeHhoID0gZXhoOwogICAgICBkZWtpbiAr PSBla2luKigxLjAteHhoKTsKICAgICAgZWtpbiAqPSB4eGg7CiAgICAgIGlmKCAoY3VycmVudFBh cnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVzKSB8fAogICAgICAgICAgKGN1cnJlbnRQ YXJ0aWNsZS5HZXREZWZpbml0aW9uKCkgPT0gYVBpWmVybykgfHwKICAgICAgICAgIChjdXJyZW50 UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFQaU1pbnVzKSApCiAgICAgIHsKICAgICAgICAr K25waW9uczsKICAgICAgICBlazEgKz0gZWtpbjsKICAgICAgfQogICAgICBjdXJyZW50UGFydGlj bGUuU2V0S2luZXRpY0VuZXJneSggZWtpbipHZVYgKTsKICAgICAgcHAgPSBjdXJyZW50UGFydGlj bGUuR2V0VG90YWxNb21lbnR1bSgpL01lVjsKICAgICAgcHAxID0gY3VycmVudFBhcnRpY2xlLkdl dE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICBpZiggcHAxIDwgMC4wMDEqTWVWICkKICAgICAg ewogICAgICAgIHJ0aG52ZSA9IHBpKkc0VW5pZm9ybVJhbmQoKTsKICAgICAgICBwaGludmUgPSB0 d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVt KCBwcCpzaW4ocnRobnZlKSpjb3MocGhpbnZlKSpNZVYsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSpNZVYsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3MocnRobnZlKSpNZVYgKTsKICAgICAgfQog ICAgICBlbHNlCiAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBjdXJyZW50UGFy dGljbGUuR2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgIGVraW4gPSB0YXJnZXRQYXJ0 aWNsZS5HZXRLaW5ldGljRW5lcmd5KCkvR2VWIC0gY2ZhKigxK25vcm1hbCgpLzIuMCk7CiAgICAg IGVraW4gPSBHNHN0ZDo6bWF4KCAxLjBlLTYsIGVraW4gKTsKICAgICAgeHhoID0gMS4wOwogICAg ICBpZiggKCAobW9kaWZpZWRPcmlnaW5hbC5HZXREZWZpbml0aW9uKCkgPT0gYVBpUGx1cykgfHwK ICAgICAgICAgICAgKG1vZGlmaWVkT3JpZ2luYWwuR2V0RGVmaW5pdGlvbigpID09IGFQaU1pbnVz KSApICYmCiAgICAgICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFQaVpl cm8pICYmCiAgICAgICAgICAoRzRVbmlmb3JtUmFuZCgpIDwgbG9nV2VpZ2h0KSApeHhoID0gZXho OwogICAgICBkZWtpbiArPSBla2luKigxLjAteHhoKTsKICAgICAgZWtpbiAqPSB4eGg7CiAgICAg IGlmKCAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFQaVBsdXMpIHx8CiAgICAg ICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFQaVplcm8pIHx8CiAgICAg ICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFQaU1pbnVzKSApCiAgICAg IHsKICAgICAgICArK25waW9uczsKICAgICAgICBlazEgKz0gZWtpbjsKICAgICAgfQogICAgICB0 YXJnZXRQYXJ0aWNsZS5TZXRLaW5ldGljRW5lcmd5KCBla2luKkdlViApOwogICAgICBwcCA9IHRh cmdldFBhcnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICAgIHBwMSA9IHRhcmdldFBh cnRpY2xlLkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICBpZiggcHAxIDwgMC4wMDEqTWVW ICkKICAgICAgewogICAgICAgIHJ0aG52ZSA9IHBpKkc0VW5pZm9ybVJhbmQoKTsKICAgICAgICBw aGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0 TW9tZW50dW0oIHBwKnNpbihydGhudmUpKmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcHAqc2luKHJ0aG52ZSkqc2luKHBoaW52ZSkqTWVWLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3MocnRobnZlKSpNZVYgKTsKICAg ICAgfQogICAgICBlbHNlCiAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0TW9tZW50dW0oIHRhcmdl dFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocHAvcHAxKSApOwogICAgICBmb3IoIGk9MDsgaTx2 ZWNMZW47ICsraSApCiAgICAgIHsKICAgICAgICBla2luID0gdmVjW2ldLT5HZXRLaW5ldGljRW5l cmd5KCkvR2VWIC0gY2ZhKigxK25vcm1hbCgpLzIuMCk7CiAgICAgICAgZWtpbiA9IEc0c3RkOjpt YXgoIDEuMGUtNiwgZWtpbiApOwogICAgICAgIHh4aCA9IDEuMDsKICAgICAgICBpZiggKCAobW9k aWZpZWRPcmlnaW5hbC5HZXREZWZpbml0aW9uKCkgPT0gYVBpUGx1cykgfHwKICAgICAgICAgICAg ICAobW9kaWZpZWRPcmlnaW5hbC5HZXREZWZpbml0aW9uKCkgPT0gYVBpTWludXMpICkgJiYKICAg ICAgICAgICAgKHZlY1tpXS0+R2V0RGVmaW5pdGlvbigpID09IGFQaVplcm8pICYmCiAgICAgICAg ICAgIChHNFVuaWZvcm1SYW5kKCkgPCBsb2dXZWlnaHQpICl4eGggPSBleGg7CiAgICAgICAgZGVr aW4gKz0gZWtpbiooMS4wLXh4aCk7CiAgICAgICAgZWtpbiAqPSB4eGg7CiAgICAgICAgaWYoICh2 ZWNbaV0tPkdldERlZmluaXRpb24oKSA9PSBhUGlQbHVzKSB8fAogICAgICAgICAgICAodmVjW2ld LT5HZXREZWZpbml0aW9uKCkgPT0gYVBpWmVybykgfHwKICAgICAgICAgICAgKHZlY1tpXS0+R2V0 RGVmaW5pdGlvbigpID09IGFQaU1pbnVzKSApCiAgICAgICAgewogICAgICAgICAgKytucGlvbnM7 CiAgICAgICAgICBlazEgKz0gZWtpbjsKICAgICAgICB9CiAgICAgICAgdmVjW2ldLT5TZXRLaW5l dGljRW5lcmd5KCBla2luKkdlViApOwogICAgICAgIHBwID0gdmVjW2ldLT5HZXRUb3RhbE1vbWVu dHVtKCkvTWVWOwogICAgICAgIHBwMSA9IHZlY1tpXS0+R2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7 CiAgICAgICAgaWYoIHBwMSA8IDAuMDAxKk1lViApCiAgICAgICAgewogICAgICAgICAgcnRobnZl ID0gcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAgICAgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3Jt UmFuZCgpOwogICAgICAgICAgdmVjW2ldLT5TZXRNb21lbnR1bSggcHAqc2luKHJ0aG52ZSkqY29z KHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqc2luKHJ0aG52 ZSkqc2luKHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqY29z KHJ0aG52ZSkqTWVWICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHZlY1tpXS0+ U2V0TW9tZW50dW0oIHZlY1tpXS0+R2V0TW9tZW50dW0oKSAqIChwcC9wcDEpICk7CiAgICAgIH0K ICAgIH0KICAgIGlmKCAoZWsxICE9IDAuMCkgJiYgKG5waW9ucyA+IDApICkKICAgIHsKICAgICAg ZGVraW4gPSAxLjAgKyBkZWtpbi9lazE7CiAgICAgIC8vCiAgICAgIC8vICBmaXJzdCBkbyB0aGUg aW5jaWRlbnQgcGFydGljbGUKICAgICAgLy8KICAgICAgaWYoIChjdXJyZW50UGFydGljbGUuR2V0 RGVmaW5pdGlvbigpID09IGFQaVBsdXMpIHx8CiAgICAgICAgICAoY3VycmVudFBhcnRpY2xlLkdl dERlZmluaXRpb24oKSA9PSBhUGlaZXJvKSB8fAogICAgICAgICAgKGN1cnJlbnRQYXJ0aWNsZS5H ZXREZWZpbml0aW9uKCkgPT0gYVBpTWludXMpICkKICAgICAgewogICAgICAgIGN1cnJlbnRQYXJ0 aWNsZS5TZXRLaW5ldGljRW5lcmd5KAogICAgICAgICBHNHN0ZDo6bWF4KCAwLjAwMSpNZVYsIGRl a2luKmN1cnJlbnRQYXJ0aWNsZS5HZXRLaW5ldGljRW5lcmd5KCkgKSApOwogICAgICAgIHBwID0g Y3VycmVudFBhcnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICAgICAgcHAxID0gY3Vy cmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICAgIGlmKCBwcDEgPCAw LjAwMSApCiAgICAgICAgewogICAgICAgICAgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwog ICAgICAgICAgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAgICAgY3VycmVu dFBhcnRpY2xlLlNldE1vbWVudHVtKCBwcCpzaW4ocnRobnZlKSpjb3MocGhpbnZlKSpNZVYsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbihydGhudmUpKnNpbihw aGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqY29z KHJ0aG52ZSkqTWVWICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGN1cnJlbnRQ YXJ0aWNsZS5TZXRNb21lbnR1bSggY3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocHAv cHAxKSApOwogICAgICB9CiAgICAgIGlmKCAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigp ID09IGFQaVBsdXMpIHx8CiAgICAgICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigp ID09IGFQaVplcm8pIHx8CiAgICAgICAgICAodGFyZ2V0UGFydGljbGUuR2V0RGVmaW5pdGlvbigp ID09IGFQaU1pbnVzKSApCiAgICAgIHsKICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRLaW5ldGlj RW5lcmd5KAogICAgICAgICBHNHN0ZDo6bWF4KCAwLjAwMSpNZVYsIGRla2luKnRhcmdldFBhcnRp Y2xlLkdldEtpbmV0aWNFbmVyZ3koKSApICk7CiAgICAgICAgcHAgPSB0YXJnZXRQYXJ0aWNsZS5H ZXRUb3RhbE1vbWVudHVtKCkvTWVWOwogICAgICAgIHBwMSA9IHRhcmdldFBhcnRpY2xlLkdldE1v bWVudHVtKCkubWFnKCkvTWVWOwogICAgICAgIGlmKCBwcDEgPCAwLjAwMSApCiAgICAgICAgewog ICAgICAgICAgcnRobnZlID0gcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAgICAgcGhpbnZlID0g dHdvcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0TW9tZW50 dW0oIHBwKnNpbihydGhudmUpKmNvcyhwaGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSpNZVYsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqY29zKHJ0aG52ZSkqTWVWICk7CiAgICAg ICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHRhcmdldFBhcnRpY2xlLlNldE1vbWVudHVtKCB0 YXJnZXRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpICogKHBwL3BwMSkgKTsKICAgICAgfQogICAgICBm b3IoIGk9MDsgaTx2ZWNMZW47ICsraSApCiAgICAgIHsKICAgICAgICBpZiggKHZlY1tpXS0+R2V0 RGVmaW5pdGlvbigpID09IGFQaVBsdXMpIHx8CiAgICAgICAgICAgICh2ZWNbaV0tPkdldERlZmlu aXRpb24oKSA9PSBhUGlaZXJvKSB8fAogICAgICAgICAgICAodmVjW2ldLT5HZXREZWZpbml0aW9u KCkgPT0gYVBpTWludXMpICkKICAgICAgICB7CiAgICAgICAgICB2ZWNbaV0tPlNldEtpbmV0aWNF bmVyZ3koIEc0c3RkOjptYXgoIDAuMDAxKk1lViwgZGVraW4qdmVjW2ldLT5HZXRLaW5ldGljRW5l cmd5KCkgKSApOwogICAgICAgICAgcHAgPSB2ZWNbaV0tPkdldFRvdGFsTW9tZW50dW0oKS9NZVY7 CiAgICAgICAgICBwcDEgPSB2ZWNbaV0tPkdldE1vbWVudHVtKCkubWFnKCkvTWVWOwogICAgICAg ICAgaWYoIHBwMSA8IDAuMDAxICkKICAgICAgICAgIHsKICAgICAgICAgICAgcnRobnZlID0gcGkq RzRVbmlmb3JtUmFuZCgpOwogICAgICAgICAgICBwaGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5k KCk7CiAgICAgICAgICAgIHZlY1tpXS0+U2V0TW9tZW50dW0oIHBwKnNpbihydGhudmUpKmNvcyhw aGludmUpKk1lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAqc2luKHJ0aG52 ZSkqc2luKHBoaW52ZSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpj b3MocnRobnZlKSpNZVYgKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAg dmVjW2ldLT5TZXRNb21lbnR1bSggdmVjW2ldLT5HZXRNb21lbnR1bSgpICogKHBwL3BwMSkgKTsK ICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAKIHZvaWQgRzRSZWFjdGlvbkR5bmFtaWNzOjpB ZGRCbGFja1RyYWNrUGFydGljbGVzKAogICBjb25zdCBHNGRvdWJsZSBlcG5iLCAgICAgICAgICAg IC8vIEdlVgogICBjb25zdCBHNGludCBucG5iLAogICBjb25zdCBHNGRvdWJsZSBlZHRhLCAgICAg ICAgICAgIC8vIEdlVgogICBjb25zdCBHNGludCBuZHRhLAogICBjb25zdCBHNGRvdWJsZSBzcHJv YiwKICAgY29uc3QgRzRkb3VibGUga2luZXRpY01pbmltdW0sICAvLyBHZVYKICAgY29uc3QgRzRk b3VibGUga2luZXRpY0ZhY3RvciwgICAvLyBHZVYKICAgY29uc3QgRzRSZWFjdGlvblByb2R1Y3Qg Jm1vZGlmaWVkT3JpZ2luYWwsCiAgIEc0ZG91YmxlIHNwYWxsLAogICBjb25zdCBHNE51Y2xldXMg JnRhcmdldE51Y2xldXMsCiAgIEc0RmFzdFZlY3RvcjxHNFJlYWN0aW9uUHJvZHVjdCwxMjg+ICZ2 ZWMsCiAgIEc0aW50ICZ2ZWNMZW4gKQogIHsKICAgIC8vIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCBG T1JUUkFOIGNvZGUgaW4gR0VOWFBUIGFuZCBUV09DTFUgYnkgSC4gRmVzZWZlbGR0CiAgICAvLwog ICAgLy8gbnBuYiBpcyBudW1iZXIgb2YgcHJvdG9uL25ldXRyb24gYmxhY2sgdHJhY2sgcGFydGlj bGVzCiAgICAvLyBuZHRhIGlzIHRoZSBudW1iZXIgb2YgZGV1dGVyb25zLCB0cml0b25zLCBhbmQg YWxwaGFzIHByb2R1Y2VkCiAgICAvLyBlcG5iIGlzIHRoZSBraW5ldGljIGVuZXJneSBhdmFpbGFi bGUgZm9yIHByb3Rvbi9uZXV0cm9uIGJsYWNrIHRyYWNrIHBhcnRpY2xlcwogICAgLy8gZWR0YSBp cyB0aGUga2luZXRpYyBlbmVyZ3kgYXZhaWxhYmxlIGZvciBkZXV0ZXJvbi90cml0b24vYWxwaGEg cGFydGljbGVzCiAgICAvLwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFQcm90b24gPSBHNFBy b3Rvbjo6UHJvdG9uKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYU5ldXRyb24gPSBHNE5l dXRyb246Ok5ldXRyb24oKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphRGV1dGVyb24gPSBH NERldXRlcm9uOjpEZXV0ZXJvbigpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFUcml0b24g PSBHNFRyaXRvbjo6VHJpdG9uKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYW5BbHBoYSA9 IEc0QWxwaGE6OkFscGhhKCk7CiAgICAKICAgIGNvbnN0IEc0ZG91YmxlIGVrT3JpZ2luYWwgPSBt b2RpZmllZE9yaWdpbmFsLkdldEtpbmV0aWNFbmVyZ3koKS9NZVY7CiAgICBjb25zdCBHNGRvdWJs ZSBhdG9taWNXZWlnaHQgPSB0YXJnZXROdWNsZXVzLkdldE4oKTsKICAgIGNvbnN0IEc0ZG91Ymxl IGF0b21pY051bWJlciA9IHRhcmdldE51Y2xldXMuR2V0WigpOwogICAgCiAgICBjb25zdCBHNGRv dWJsZSBpa2ExID0gMy42OwogICAgY29uc3QgRzRkb3VibGUgaWthMiA9IDM1LjU2OwogICAgY29u c3QgRzRkb3VibGUgaWthMyA9IDYuNDU7CiAgICBjb25zdCBHNGRvdWJsZSBzcDEgPSAxLjA2NjsK ICAgIAogICAgRzRpbnQgaTsKICAgIEc0ZG91YmxlIHBwOwogICAgRzRkb3VibGUgY2ZhID0gMC4w MjUqKChhdG9taWNXZWlnaHQtMS4wKS8xMjAuMCkgKiBleHAoLShhdG9taWNXZWlnaHQtMS4wKS8x MjAuMCk7CiAgICBpZiggbnBuYiA+IDApICAvLyBmaXJzdCBhZGQgcHJvdG9ucyBhbmQgbmV1dHJv bnMKICAgIHsKLy8gICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqcDEgPSBuZXcgRzRSZWFjdGlvblBy b2R1Y3QgW25wbmJdOwogICAgICBHNGRvdWJsZSBla2luID0gZXBuYi9ucG5iOwogICAgICBHNGRv dWJsZSBiYWNrd2FyZEtpbmV0aWMgPSAwLjA7CiAgICAgIGZvciggaT0wOyBpPG5wbmI7ICsraSAp CiAgICAgIHsKICAgICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqIHAxID0gbmV3IEc0UmVhY3Rpb25Q cm9kdWN0KCk7CiAgICAgICAgaWYoIEc0VW5pZm9ybVJhbmQoKSA8IHNwcm9iICkKICAgICAgICB7 CiAgICAgICAgICBkZWxldGUgcDE7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAg ICAgaWYoIGJhY2t3YXJkS2luZXRpYyA+IGVwbmIgKQogICAgICAgIHsKICAgICAgICAgIGRlbGV0 ZSBwMTsKICAgICAgICAgIGJyZWFrOyAgICAKICAgICAgICB9CiAgICAgICAgRzRkb3VibGUgcmFu ID0gRzRVbmlmb3JtUmFuZCgpOwogICAgICAgIEc0ZG91YmxlIGtpbmV0aWMgPSAtZWtpbipsb2co cmFuKSAtIGNmYSooMS4wKzAuNSpub3JtYWwoKSk7CiAgICAgICAgaWYoIGtpbmV0aWMgPCAwLjAg KWtpbmV0aWMgPSAtMC4wMTAqbG9nKHJhbik7CiAgICAgICAgYmFja3dhcmRLaW5ldGljICs9IGtp bmV0aWM7CiAgICAgICAgaWYoIGJhY2t3YXJkS2luZXRpYyA+IGVwbmIgKQogICAgICAgICAga2lu ZXRpYyA9IEc0c3RkOjptYXgoIGtpbmV0aWNNaW5pbXVtLCBlcG5iLShiYWNrd2FyZEtpbmV0aWMt a2luZXRpYykgKTsKICAgICAgICBpZiggRzRVbmlmb3JtUmFuZCgpID4gKDEuMC1hdG9taWNOdW1i ZXIvYXRvbWljV2VpZ2h0KSApCiAgICAgICAgICBwMS0+U2V0RGVmaW5pdGlvbiggYVByb3RvbiAp OwogICAgICAgIGVsc2UKICAgICAgICAgIHAxLT5TZXREZWZpbml0aW9uKCBhTmV1dHJvbiApOwog ICAgICAgIHZlYy5TZXRFbGVtZW50KCB2ZWNMZW4sIHAxICk7CiAgICAgICAgKytzcGFsbDsKICAg ICAgICBHNGRvdWJsZSBjb3N0ID0gRzRVbmlmb3JtUmFuZCgpICogMi4wIC0gMS4wOwogICAgICAg IEc0ZG91YmxlIHNpbnQgPSBzcXJ0KGZhYnMoMS4wLWNvc3QqY29zdCkpOwogICAgICAgIEc0ZG91 YmxlIHBoaSA9IHR3b3BpICogRzRVbmlmb3JtUmFuZCgpOwogICAgICAgIHZlY1t2ZWNMZW5dLT5T ZXROZXdseUFkZGVkKCB0cnVlICk7CiAgICAgICAgdmVjW3ZlY0xlbl0tPlNldEtpbmV0aWNFbmVy Z3koIGtpbmV0aWMqR2VWICk7CiAgICAgICAgcHAgPSB2ZWNbdmVjTGVuXS0+R2V0VG90YWxNb21l bnR1bSgpL01lVjsKICAgICAgICB2ZWNbdmVjTGVuKytdLT5TZXRNb21lbnR1bSggcHAqc2ludCpz aW4ocGhpKSpNZVYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbnQq Y29zKHBoaSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3N0 Kk1lViApOwogICAgICAgIC8vIERFQlVHR0lORyAtLT4gRHVtcEZyYW1lczo6RHVtcEZyYW1lKHZl YywgdmVjTGVuKTsKICAgICAgfQogICAgICBpZiggKGF0b21pY1dlaWdodCA+PSAxMC4wKSAmJiAo ZWtPcmlnaW5hbCA8PSAyLjAqR2VWKSApCiAgICAgIHsKICAgICAgICBHNGRvdWJsZSBla3cgPSBl a09yaWdpbmFsL0dlVjsKICAgICAgICBHNGludCBpa2EsIGtrID0gMDsKICAgICAgICBpZiggZWt3 ID4gMS4wIClla3cgKj0gZWt3OwogICAgICAgIGVrdyA9IEc0c3RkOjptYXgoIDAuMSwgZWt3ICk7 CiAgICAgICAgaWthID0gRzRpbnQoaWthMSpleHAoKGF0b21pY051bWJlciphdG9taWNOdW1iZXIv YXRvbWljV2VpZ2h0LWlrYTIpL2lrYTMpL2Vrdyk7CiAgICAgICAgaWYoIGlrYSA+IDAgKQogICAg ICAgIHsKICAgICAgICAgIGZvciggaT0odmVjTGVuLTEpOyBpPj0wOyAtLWkgKQogICAgICAgICAg ewogICAgICAgICAgICBpZiggKHZlY1tpXS0+R2V0RGVmaW5pdGlvbigpID09IGFQcm90b24pICYm IHZlY1tpXS0+R2V0TmV3bHlBZGRlZCgpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZl Y1tpXS0+U2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFOZXV0cm9uICk7ICAvLyBtb2RpZmllZCAy Mi1PY3QtOTcKICAgICAgICAgICAgICBpZiggKytrayA+IGlrYSApYnJlYWs7CiAgICAgICAgICAg IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmKCBuZHRhID4gMCAp ICAgIC8vICBub3csIHRyeSB0byBhZGQgZGV1dGVyb25zLCB0cml0b25zIGFuZCBhbHBoYXMKICAg IHsKLy8gICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqcDIgPSBuZXcgRzRSZWFjdGlvblByb2R1Y3Qg W25kdGFdOwogICAgICBHNGRvdWJsZSBla2luID0gZWR0YS9uZHRhOwogICAgICBHNGRvdWJsZSBi YWNrd2FyZEtpbmV0aWMgPSAwLjA7CiAgICAgIGZvciggaT0wOyBpPG5kdGE7ICsraSApCiAgICAg IHsKICAgICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqcDIgPSBuZXcgRzRSZWFjdGlvblByb2R1Y3Qo KTsKICAgICAgICBpZiggRzRVbmlmb3JtUmFuZCgpIDwgc3Byb2IgKQogICAgICAgIHsKICAgICAg ICAgIGRlbGV0ZSBwMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZigg YmFja3dhcmRLaW5ldGljID4gZWR0YSApCiAgICAgICAgewogICAgICAgICAgZGVsZXRlIHAyOwog ICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIEc0ZG91YmxlIHJhbiA9IEc0VW5pZm9y bVJhbmQoKTsKICAgICAgICBHNGRvdWJsZSBraW5ldGljID0gLWVraW4qbG9nKHJhbiktY2ZhKigx LiswLjUqbm9ybWFsKCkpOwogICAgICAgIGlmKCBraW5ldGljIDwgMC4wIClraW5ldGljID0ga2lu ZXRpY0ZhY3Rvcipsb2cocmFuKTsKICAgICAgICBiYWNrd2FyZEtpbmV0aWMgKz0ga2luZXRpYzsK ICAgICAgICBpZiggYmFja3dhcmRLaW5ldGljID4gZWR0YSApa2luZXRpYyA9IGVkdGEtKGJhY2t3 YXJkS2luZXRpYy1raW5ldGljKTsKICAgICAgICBpZigga2luZXRpYyA8IDAuMCApa2luZXRpYyA9 IGtpbmV0aWNNaW5pbXVtOwogICAgICAgIEc0ZG91YmxlIGNvc3QgPSAyLjAqRzRVbmlmb3JtUmFu ZCgpIC0gMS4wOwogICAgICAgIEc0ZG91YmxlIHNpbnQgPSBzcXJ0KEc0c3RkOjptYXgoMC4wLCgx LjAtY29zdCpjb3N0KSkpOwogICAgICAgIEc0ZG91YmxlIHBoaSA9IHR3b3BpKkc0VW5pZm9ybVJh bmQoKTsKICAgICAgICByYW4gPSBHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgaWYoIHJhbiA8PSAw LjYwICkKICAgICAgICAgIHAyLT5TZXREZWZpbml0aW9uKCBhRGV1dGVyb24gKTsKICAgICAgICBl bHNlIGlmKCByYW4gPD0gMC45MCApCiAgICAgICAgICBwMi0+U2V0RGVmaW5pdGlvbiggYVRyaXRv biApOwogICAgICAgIGVsc2UKICAgICAgICAgIHAyLT5TZXREZWZpbml0aW9uKCBhbkFscGhhICk7 CiAgICAgICAgc3BhbGwgKz0gcDItPkdldE1hc3MoKS9HZVYgKiBzcDE7CiAgICAgICAgaWYoIHNw YWxsID4gYXRvbWljV2VpZ2h0ICkKCXsKCSAgZGVsZXRlIHAyOwoJICBicmVhazsKCX0KICAgICAg ICB2ZWMuU2V0RWxlbWVudCggdmVjTGVuLCBwMiApOwogICAgICAgIHZlY1t2ZWNMZW5dLT5TZXRO ZXdseUFkZGVkKCB0cnVlICk7CiAgICAgICAgdmVjW3ZlY0xlbl0tPlNldEtpbmV0aWNFbmVyZ3ko IGtpbmV0aWMqR2VWICk7CiAgICAgICAgcHAgPSB2ZWNbdmVjTGVuXS0+R2V0VG90YWxNb21lbnR1 bSgpL01lVjsKICAgICAgICB2ZWNbdmVjTGVuKytdLT5TZXRNb21lbnR1bSggcHAqc2ludCpzaW4o cGhpKSpNZVYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwKnNpbnQqY29z KHBoaSkqTWVWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCpjb3N0Kk1l ViApOwogICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZl Y0xlbik7CiAgICAgIH0KICAgIH0KICB9CiAKIHZvaWQgRzRSZWFjdGlvbkR5bmFtaWNzOjpNb21l bnR1bUNoZWNrKAogICBjb25zdCBHNFJlYWN0aW9uUHJvZHVjdCAmbW9kaWZpZWRPcmlnaW5hbCwK ICAgRzRSZWFjdGlvblByb2R1Y3QgJmN1cnJlbnRQYXJ0aWNsZSwKICAgRzRSZWFjdGlvblByb2R1 Y3QgJnRhcmdldFBhcnRpY2xlLAogICBHNEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4 PiAmdmVjLAogICBHNGludCAmdmVjTGVuICkKICB7CiAgICBjb25zdCBHNGRvdWJsZSBwT3JpZ2lu YWwgPSBtb2RpZmllZE9yaWdpbmFsLkdldFRvdGFsTW9tZW50dW0oKS9NZVY7CiAgICBHNGRvdWJs ZSB0ZXN0TW9tZW50dW0gPSBjdXJyZW50UGFydGljbGUuR2V0TW9tZW50dW0oKS5tYWcoKS9NZVY7 CiAgICBHNGRvdWJsZSBwTWFzczsKICAgIGlmKCB0ZXN0TW9tZW50dW0gPj0gcE9yaWdpbmFsICkK ICAgIHsKICAgICAgcE1hc3MgPSBjdXJyZW50UGFydGljbGUuR2V0TWFzcygpL01lVjsKICAgICAg Y3VycmVudFBhcnRpY2xlLlNldFRvdGFsRW5lcmd5KAogICAgICAgc3FydCggcE1hc3MqcE1hc3Mg KyBwT3JpZ2luYWwqcE9yaWdpbmFsICkqTWVWICk7CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRN b21lbnR1bSgKICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5HZXRNb21lbnR1bSgpICogKHBPcmlnaW5h bC90ZXN0TW9tZW50dW0pICk7CiAgICB9CiAgICB0ZXN0TW9tZW50dW0gPSB0YXJnZXRQYXJ0aWNs ZS5HZXRNb21lbnR1bSgpLm1hZygpL01lVjsKICAgIGlmKCB0ZXN0TW9tZW50dW0gPj0gcE9yaWdp bmFsICkKICAgIHsKICAgICAgcE1hc3MgPSB0YXJnZXRQYXJ0aWNsZS5HZXRNYXNzKCkvTWVWOwog ICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRUb3RhbEVuZXJneSgKICAgICAgIHNxcnQoIHBNYXNzKnBN YXNzICsgcE9yaWdpbmFsKnBPcmlnaW5hbCApKk1lViApOwogICAgICB0YXJnZXRQYXJ0aWNsZS5T ZXRNb21lbnR1bSgKICAgICAgIHRhcmdldFBhcnRpY2xlLkdldE1vbWVudHVtKCkgKiAocE9yaWdp bmFsL3Rlc3RNb21lbnR1bSkgKTsKICAgIH0KICAgIGZvciggRzRpbnQgaT0wOyBpPHZlY0xlbjsg KytpICkKICAgIHsKICAgICAgdGVzdE1vbWVudHVtID0gdmVjW2ldLT5HZXRNb21lbnR1bSgpLm1h ZygpL01lVjsKICAgICAgaWYoIHRlc3RNb21lbnR1bSA+PSBwT3JpZ2luYWwgKQogICAgICB7CiAg ICAgICAgcE1hc3MgPSB2ZWNbaV0tPkdldE1hc3MoKS9NZVY7CiAgICAgICAgdmVjW2ldLT5TZXRU b3RhbEVuZXJneSgKICAgICAgICAgc3FydCggcE1hc3MqcE1hc3MgKyBwT3JpZ2luYWwqcE9yaWdp bmFsICkqTWVWICk7CiAgICAgICAgdmVjW2ldLT5TZXRNb21lbnR1bSggdmVjW2ldLT5HZXRNb21l bnR1bSgpICogKHBPcmlnaW5hbC90ZXN0TW9tZW50dW0pICk7CiAgICAgIH0KICAgIH0KICB9Cgog dm9pZCBHNFJlYWN0aW9uRHluYW1pY3M6OlByb2R1Y2VTdHJhbmdlUGFydGljbGVQYWlycygKICAg RzRGYXN0VmVjdG9yPEc0UmVhY3Rpb25Qcm9kdWN0LDEyOD4gJnZlYywKICAgRzRpbnQgJnZlY0xl biwKICAgY29uc3QgRzRSZWFjdGlvblByb2R1Y3QgJm1vZGlmaWVkT3JpZ2luYWwsCiAgIGNvbnN0 IEc0RHluYW1pY1BhcnRpY2xlICpvcmlnaW5hbFRhcmdldCwgCiAgIEc0UmVhY3Rpb25Qcm9kdWN0 ICZjdXJyZW50UGFydGljbGUsCiAgIEc0UmVhY3Rpb25Qcm9kdWN0ICZ0YXJnZXRQYXJ0aWNsZSwK ICAgRzRib29sICZpbmNpZGVudEhhc0NoYW5nZWQsCiAgIEc0Ym9vbCAmdGFyZ2V0SGFzQ2hhbmdl ZCApCiAgewogICAgLy8gZGVyaXZlZCBmcm9tIG9yaWdpbmFsIEZPUlRSQU4gY29kZSBTVFBBSVIg YnkgSC4gRmVzZWZlbGR0ICgxNi1EZWMtMTk4NykKICAgIC8vCiAgICAvLyBDaG9vc2UgY2hhcmdl IGNvbWJpbmF0aW9ucyBLKyBLLSwgSysgSzBCLCBLMCBLMEIsIEswIEstLAogICAgLy8gICAgICAg ICAgICAgICAgICAgICAgICAgICAgSysgWTAsIEswIFkrLCAgSzAgWS0KICAgIC8vIEZvciBhbnRp YmFyeW9uIGluZHVjZWQgcmVhY3Rpb25zIGhhbGYgb2YgdGhlIGNyb3NzIHNlY3Rpb25zIEtCIFlC CiAgICAvLyBwYWlycyBhcmUgcHJvZHVjZWQuICBDaGFyZ2UgaXMgbm90IGNvbnNlcnZlZCwgbm8g ZXhwZXJpbWVudGFsIGRhdGEgYXZhaWxhYmxlCiAgICAvLyBmb3IgZXhjbHVzaXZlIHJlYWN0aW9u cywgdGhlcmVmb3JlIHNvbWUgYXZlcmFnZSBiZWhhdmlvdXIgYXNzdW1lZC4KICAgIC8vIFRoZSBy YXRpbyBML1NJR01BIGlzIHRha2VuIGFzIDM6MSAoZnJvbSBleHBlcmltZW50YWwgbG93IGVuZXJn eSkKICAgIC8vCiAgICBpZiggdmVjTGVuID09IDAgKXJldHVybjsKICAgIC8vCiAgICAvLyB0aGUg Zm9sbG93aW5nIHByb3RlY3RzIGFnYWluc3QgYW5uaWhpbGF0aW9uIHByb2Nlc3NlcwogICAgLy8K ICAgIGlmKCBjdXJyZW50UGFydGljbGUuR2V0TWFzcygpID09IDAuMCB8fCB0YXJnZXRQYXJ0aWNs ZS5HZXRNYXNzKCkgPT0gMC4wIClyZXR1cm47CiAgICAKICAgIGNvbnN0IEc0ZG91YmxlIGV0T3Jp Z2luYWwgPSBtb2RpZmllZE9yaWdpbmFsLkdldFRvdGFsRW5lcmd5KCkvR2VWOwogICAgY29uc3Qg RzRkb3VibGUgbU9yaWdpbmFsID0gbW9kaWZpZWRPcmlnaW5hbC5HZXREZWZpbml0aW9uKCktPkdl dFBER01hc3MoKS9HZVY7CiAgICBHNGRvdWJsZSB0YXJnZXRNYXNzID0gb3JpZ2luYWxUYXJnZXQt PkdldERlZmluaXRpb24oKS0+R2V0UERHTWFzcygpL0dlVjsKICAgIEc0ZG91YmxlIGNlbnRlcm9m bWFzc0VuZXJneSA9IHNxcnQoIG1PcmlnaW5hbCptT3JpZ2luYWwgKwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFzcyp0YXJnZXRNYXNzICsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMCp0YXJnZXRNYXNzKmV0T3JpZ2luYWwg KTsgIC8vIEdlVgogICAgRzRkb3VibGUgY3VycmVudE1hc3MgPSBjdXJyZW50UGFydGljbGUuR2V0 TWFzcygpL0dlVjsKICAgIEc0ZG91YmxlIGF2YWlsYWJsZUVuZXJneSA9IGNlbnRlcm9mbWFzc0Vu ZXJneS0odGFyZ2V0TWFzcytjdXJyZW50TWFzcyk7CiAgICBpZiggYXZhaWxhYmxlRW5lcmd5IDw9 IDEuMCApcmV0dXJuOwogICAgCiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVByb3RvbiA9IEc0 UHJvdG9uOjpQcm90b24oKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphbkFudGlQcm90b24g PSBHNEFudGlQcm90b246OkFudGlQcm90b24oKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICph TmV1dHJvbiA9IEc0TmV1dHJvbjo6TmV1dHJvbigpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24g KmFuQW50aU5ldXRyb24gPSBHNEFudGlOZXV0cm9uOjpBbnRpTmV1dHJvbigpOwogICAgRzRQYXJ0 aWNsZURlZmluaXRpb24gKmFTaWdtYU1pbnVzID0gRzRTaWdtYU1pbnVzOjpTaWdtYU1pbnVzKCk7 CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYVNpZ21hUGx1cyA9IEc0U2lnbWFQbHVzOjpTaWdt YVBsdXMoKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphU2lnbWFaZXJvID0gRzRTaWdtYVpl cm86OlNpZ21hWmVybygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFuQW50aVNpZ21hTWlu dXMgPSBHNEFudGlTaWdtYU1pbnVzOjpBbnRpU2lnbWFNaW51cygpOwogICAgRzRQYXJ0aWNsZURl ZmluaXRpb24gKmFuQW50aVNpZ21hUGx1cyA9IEc0QW50aVNpZ21hUGx1czo6QW50aVNpZ21hUGx1 cygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFuQW50aVNpZ21hWmVybyA9IEc0QW50aVNp Z21hWmVybzo6QW50aVNpZ21hWmVybygpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFLYW9u TWludXMgPSBHNEthb25NaW51czo6S2Fvbk1pbnVzKCk7CiAgICBHNFBhcnRpY2xlRGVmaW5pdGlv biAqYUthb25QbHVzID0gRzRLYW9uUGx1czo6S2FvblBsdXMoKTsKICAgIEc0UGFydGljbGVEZWZp bml0aW9uICphS2FvblpMID0gRzRLYW9uWmVyb0xvbmc6Okthb25aZXJvTG9uZygpOwogICAgRzRQ YXJ0aWNsZURlZmluaXRpb24gKmFLYW9uWlMgPSBHNEthb25aZXJvU2hvcnQ6Okthb25aZXJvU2hv cnQoKTsKICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphTGFtYmRhID0gRzRMYW1iZGE6OkxhbWJk YSgpOwogICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFuQW50aUxhbWJkYSA9IEc0QW50aUxhbWJk YTo6QW50aUxhbWJkYSgpOwogICAgCiAgICBjb25zdCBHNGRvdWJsZSBwcm90b25NYXNzID0gYVBy b3Rvbi0+R2V0UERHTWFzcygpL0dlVjsKICAgIGNvbnN0IEc0ZG91YmxlIHNpZ21hTWludXNNYXNz ID0gYVNpZ21hTWludXMtPkdldFBER01hc3MoKS9HZVY7CiAgICAvLwogICAgLy8gZGV0ZXJtaW5l IHRoZSBjZW50ZXIgb2YgbWFzcyBlbmVyZ3kgYmluCiAgICAvLwogICAgY29uc3QgRzRkb3VibGUg YXZyc1tdID0gezMuLDQuLDUuLDYuLDcuLDguLDkuLDEwLiwyMC4sMzAuLDQwLiw1MC59OwoKICAg IEc0aW50IGliaW4sIGkzLCBpNDsKICAgIEc0ZG91YmxlIGF2aywgYXZ5LCBhdm4sIHJhbjsKICAg IEc0aW50IGkgPSAxOwogICAgd2hpbGUoIChpPDEyKSAmJiAoY2VudGVyb2ZtYXNzRW5lcmd5PmF2 cnNbaV0pICkrK2k7CiAgICBpZiggaSA9PSAxMiApCiAgICAgIGliaW4gPSAxMTsKICAgIGVsc2UK ICAgICAgaWJpbiA9IGk7CiAgICAvLwogICAgLy8gdGhlIGZvcnRyYW4gY29kZSBjaG9vc2VzIGEg cmFuZG9tIHJlcGxhY2VtZW50IG9mIHByb2R1Y2VkIGthb25zCiAgICAvLyAgYnV0IGRvZXMgbm90 IHRha2UgaW50byBhY2NvdW50IGNoYXJnZSBjb25zZXJ2YXRpb24gCiAgICAvLwogICAgaWYoIHZl Y0xlbiA9PSAxICkgIC8vIHdlIGtub3cgdGhhdCB2ZWNMZW4gPiAwCiAgICB7CiAgICAgIGkzID0g MDsKICAgICAgaTQgPSAxOyAgIC8vIG5vdGUgdGhhdCB3ZSB3aWxsIGJlIGFkZGluZyBhIG5ldyBz ZWNvbmRhcnkgcGFydGljbGUgaW4gdGhpcyBjYXNlIG9ubHkKICAgIH0KICAgIGVsc2UgICAgICAg ICAgICAgICAvLyBvdGhlcndpc2UgIDAgPD0gaTMsaTQgPCB2ZWNMZW4KICAgIHsKICAgICAgRzRk b3VibGUgcmFuID0gRzRVbmlmb3JtUmFuZCgpOwogICAgICB3aGlsZSggcmFuID09IDEuMCApcmFu ID0gRzRVbmlmb3JtUmFuZCgpOwogICAgICBpNCA9IGkzID0gRzRpbnQoIHZlY0xlbipyYW4gKTsK ICAgICAgd2hpbGUoIGkzID09IGk0ICkKICAgICAgewogICAgICAgIHJhbiA9IEc0VW5pZm9ybVJh bmQoKTsKICAgICAgICB3aGlsZSggcmFuID09IDEuMCApcmFuID0gRzRVbmlmb3JtUmFuZCgpOwog ICAgICAgIGk0ID0gRzRpbnQoIHZlY0xlbipyYW4gKTsKICAgICAgfQogICAgfQogICAgLy8KICAg IC8vIHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvciBleHRyYXBvbGF0aW9uIGJ5IHk9Y2VudGVy b2ZtYXNzRW5lcmd5KngrYgogICAgLy8KICAgIGNvbnN0IEc0ZG91YmxlIGF2a2tiW10gPSB7IDAu MDAxNSwgMC4wMDUsIDAuMDEyLCAwLjAyODUsIDAuMDUyNSwgMC4wNzUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAwLjA5NzUsIDAuMTIzLCAwLjI4LCAgMC4zOTgsICAwLjQ5NSwgIDAu NTczIH07CiAgICBjb25zdCBHNGRvdWJsZSBhdmt5W10gPSB7IDAuMDA1LCAwLjAzLCAgMC4wNjQs IDAuMDk1LCAwLjExNSwgMC4xMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDUs IDAuMTU1LCAwLjIwLCAgMC4yMDUsIDAuMjEwLCAwLjIxMiB9OwogICAgY29uc3QgRzRkb3VibGUg YXZubmJbXSA9IHsgMC4wMDAwMSwgMC4wMDAxLCAwLjAwMDYsIDAuMDAyNSwgMC4wMSwgMC4wMiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQsICAgIDAuMDUsICAgMC4xMiwgICAw LjE1LCAgIDAuMTgsIDAuMjAgfTsKICAgIAogICAgYXZrID0gKGxvZyhhdmtrYltpYmluXSktbG9n KGF2a2tiW2liaW4tMV0pKSooY2VudGVyb2ZtYXNzRW5lcmd5LWF2cnNbaWJpbi0xXSkKICAgICAg LyhhdnJzW2liaW5dLWF2cnNbaWJpbi0xXSkgKyBsb2coYXZra2JbaWJpbi0xXSk7CiAgICBhdmsg PSBleHAoYXZrKTsKICAgIAogICAgYXZ5ID0gKGxvZyhhdmt5W2liaW5dKS1sb2coYXZreVtpYmlu LTFdKSkqKGNlbnRlcm9mbWFzc0VuZXJneS1hdnJzW2liaW4tMV0pCiAgICAgIC8oYXZyc1tpYmlu XS1hdnJzW2liaW4tMV0pICsgbG9nKGF2a3lbaWJpbi0xXSk7CiAgICBhdnkgPSBleHAoYXZ5KTsK ICAgIAogICAgYXZuID0gKGxvZyhhdm5uYltpYmluXSktbG9nKGF2bm5iW2liaW4tMV0pKSooY2Vu dGVyb2ZtYXNzRW5lcmd5LWF2cnNbaWJpbi0xXSkKICAgICAgLyhhdnJzW2liaW5dLWF2cnNbaWJp bi0xXSkgKyBsb2coYXZubmJbaWJpbi0xXSk7CiAgICBhdm4gPSBleHAoYXZuKTsKICAgIAogICAg aWYoIGF2aythdnkrYXZuIDw9IDAuMCApcmV0dXJuOwogICAgCiAgICBpZiggY3VycmVudE1hc3Mg PCBwcm90b25NYXNzIClhdnkgLz0gMi4wOwogICAgaWYoIHRhcmdldE1hc3MgPCBwcm90b25NYXNz IClhdnkgPSAwLjA7CiAgICBhdnkgKz0gYXZrK2F2bjsKICAgIGF2ayArPSBhdm47CiAgICByYW4g PSBHNFVuaWZvcm1SYW5kKCk7CiAgICBpZiggIHJhbiA8IGF2biApCiAgICB7CiAgICAgIGlmKCBh dmFpbGFibGVFbmVyZ3kgPCAyLjAgKXJldHVybjsKICAgICAgaWYoIHZlY0xlbiA9PSAxICkgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYSBuZXcgc2Vjb25kYXJ5CiAgICAgIHsK ICAgICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqcDEgPSBuZXcgRzRSZWFjdGlvblByb2R1Y3Q7CiAg ICAgICAgaWYoIEc0VW5pZm9ybVJhbmQoKSA8IDAuNSApCiAgICAgICAgewogICAgICAgICAgdmVj WzBdLT5TZXREZWZpbml0aW9uKCBhTmV1dHJvbiApOwogICAgICAgICAgcDEtPlNldERlZmluaXRp b24oIGFuQW50aU5ldXRyb24gKTsKICAgICAgICAgIChHNFVuaWZvcm1SYW5kKCkgPCAwLjUpID8g cDEtPlNldFNpZGUoIC0xICkgOiBwMS0+U2V0U2lkZSggMSApOwogICAgICAgIH0KICAgICAgICBl bHNlCiAgICAgICAgewogICAgICAgICAgdmVjWzBdLT5TZXREZWZpbml0aW9uKCBhUHJvdG9uICk7 CiAgICAgICAgICBwMS0+U2V0RGVmaW5pdGlvbiggYW5BbnRpUHJvdG9uICk7CiAgICAgICAgICAo RzRVbmlmb3JtUmFuZCgpIDwgMC41KSA/IHAxLT5TZXRTaWRlKCAtMSApIDogcDEtPlNldFNpZGUo IDEgKTsKICAgICAgICB9CiAgICAgICAgdmVjLlNldEVsZW1lbnQoIHZlY0xlbisrLCBwMSApOwog ICAgICAvLyBERUJVR0dJTkcgLS0+IER1bXBGcmFtZXM6OkR1bXBGcmFtZSh2ZWMsIHZlY0xlbik7 CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0d28gc2Vjb25kYXJpZXMKICAgICAgICBpZiggRzRV bmlmb3JtUmFuZCgpIDwgMC41ICkKICAgICAgICB7CiAgICAgICAgICB2ZWNbaTNdLT5TZXREZWZp bml0aW9uKCBhTmV1dHJvbiApOwogICAgICAgICAgdmVjW2k0XS0+U2V0RGVmaW5pdGlvbiggYW5B bnRpTmV1dHJvbiApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAg dmVjW2kzXS0+U2V0RGVmaW5pdGlvbiggYVByb3RvbiApOwogICAgICAgICAgdmVjW2k0XS0+U2V0 RGVmaW5pdGlvbiggYW5BbnRpUHJvdG9uICk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBl bHNlIGlmKCByYW4gPCBhdmsgKQogICAgewogICAgICBpZiggYXZhaWxhYmxlRW5lcmd5IDwgMS4w IClyZXR1cm47CiAgICAgIAogICAgICBjb25zdCBHNGRvdWJsZSBra2JbXSA9IHsgMC4yNTAwLCAw LjM3NTAsIDAuNTAwMCwgMC41NjI1LCAwLjYyNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAwLjY4NzUsIDAuNzUwMCwgMC44NzUwLCAxLjAwMCB9OwogICAgICBjb25zdCBHNGludCBp cGFra2IxW10gPSB7IDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMSwgMTIgfTsKICAgICAg Y29uc3QgRzRpbnQgaXBha2tiMltdID0geyAxMywgMTEsIDEyLCAxMSwgMTIsIDExLCAxMiwgMTMs IDEzIH07CiAgICAgIHJhbiA9IEc0VW5pZm9ybVJhbmQoKTsKICAgICAgaSA9IDA7CiAgICAgIHdo aWxlKCAoaTw5KSAmJiAocmFuPj1ra2JbaV0pICkrK2k7CiAgICAgIGlmKCBpID09IDkgKXJldHVy bjsKICAgICAgLy8KICAgICAgLy8gaXBha2tiW10gPSB7IDEwLDEzLCAxMCwxMSwgMTAsMTIsIDEx LDExLCAxMSwxMiwgMTIsMTEsIDEyLDEyLCAxMSwxMywgMTIsMTMgfTsKICAgICAgLy8gY2hhcmdl ICAgICAgICsgIC0gICArICAwICAgKyAgMCAgIDAgIDAgICAwICAwICAgMCAgMCAgIDAgIDAgICAw ICAtICAgMCAgLQogICAgICAvLwogICAgICBzd2l0Y2goIGlwYWtrYjFbaV0gKQogICAgICB7CiAg ICAgICBjYXNlIDEwOgogICAgICAgICB2ZWNbaTNdLT5TZXREZWZpbml0aW9uKCBhS2FvblBsdXMg KTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDExOgogICAgICAgICB2ZWNbaTNdLT5TZXRE ZWZpbml0aW9uKCBhS2FvblpTICk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAxMjoKICAg ICAgICAgdmVjW2kzXS0+U2V0RGVmaW5pdGlvbiggYUthb25aTCApOwogICAgICAgICBicmVhazsK ICAgICAgfQogICAgICBpZiggdmVjTGVuID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAg Ly8gYWRkIGEgc2Vjb25kYXJ5CiAgICAgIHsKICAgICAgICBHNFJlYWN0aW9uUHJvZHVjdCAqcDEg PSBuZXcgRzRSZWFjdGlvblByb2R1Y3Q7CiAgICAgICAgc3dpdGNoKCBpcGFra2IyW2ldICkKICAg ICAgICB7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgcDEtPlNldERlZmluaXRpb24oIGFL YW9uWlMgKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICBw MS0+U2V0RGVmaW5pdGlvbiggYUthb25aTCApOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBj YXNlIDEzOgogICAgICAgICAgIHAxLT5TZXREZWZpbml0aW9uKCBhS2Fvbk1pbnVzICk7CiAgICAg ICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIChHNFVuaWZvcm1SYW5kKCkgPCAwLjUpID8g cDEtPlNldFNpZGUoIC0xICkgOiBwMS0+U2V0U2lkZSggMSApOwogICAgICAgIHZlYy5TZXRFbGVt ZW50KCB2ZWNMZW4rKywgcDEgKTsKICAgICAgLy8gREVCVUdHSU5HIC0tPiBEdW1wRnJhbWVzOjpE dW1wRnJhbWUodmVjLCB2ZWNMZW4pOwogICAgICB9CiAgICAgIGVsc2UgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZQogICAgICB7CiAgICAgICAgc3dpdGNo KCBpcGFra2IyW2ldICkKICAgICAgICB7CiAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgdmVj W2k0XS0+U2V0RGVmaW5pdGlvbiggYUthb25aUyApOwogICAgICAgICAgIGJyZWFrOwogICAgICAg ICBjYXNlIDEyOgogICAgICAgICAgIHZlY1tpNF0tPlNldERlZmluaXRpb24oIGFLYW9uWkwgKTsK ICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICB2ZWNbaTRdLT5T ZXREZWZpbml0aW9uKCBhS2Fvbk1pbnVzICk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQog ICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCByYW4gPCBhdnkgKQogICAgewogICAgICBpZiggYXZh aWxhYmxlRW5lcmd5IDwgMS42IClyZXR1cm47CiAgICAgIAogICAgICBjb25zdCBHNGRvdWJsZSBr eVtdID0geyAwLjIwMCwgMC4zMDAsIDAuNDAwLCAwLjU1MCwgMC42MjUsIDAuNzAwLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAwLjgwMCwgMC44NTAsIDAuOTAwLCAwLjk1MCwgMC45NzUs IDEuMDAwIH07CiAgICAgIGNvbnN0IEc0aW50IGlwYWt5MVtdID0geyAxOCwgMTgsIDE4LCAyMCwg MjAsIDIwLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyIH07CiAgICAgIGNvbnN0IEc0aW50IGlwYWt5 MltdID0geyAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyLCAxMCwgMTEsIDEyIH07 CiAgICAgIGNvbnN0IEc0aW50IGlwYWt5YjFbXSA9IHsgMTksIDE5LCAxOSwgMjMsIDIzLCAyMywg MjQsIDI0LCAyNCwgMjUsIDI1LCAyNSB9OwogICAgICBjb25zdCBHNGludCBpcGFreWIyW10gPSB7 IDEzLCAxMiwgMTEsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTEsIDEzLCAxMiwgMTEgfTsKICAgICAg cmFuID0gRzRVbmlmb3JtUmFuZCgpOwogICAgICBpID0gMDsKICAgICAgd2hpbGUoIChpPDEyKSAm JiAocmFuPmt5W2ldKSApKytpOwogICAgICBpZiggaSA9PSAxMiApcmV0dXJuOwogICAgICBpZigg KGN1cnJlbnRNYXNzPHByb3Rvbk1hc3MpIHx8IChHNFVuaWZvcm1SYW5kKCk8MC41KSApCiAgICAg IHsKICAgICAgICAvLyBpcGFreVtdID0geyAxOCwxMCwgMTgsMTEsIDE4LDEyLCAyMCwxMCwgMjAs MTEsIDIwLDEyLAogICAgICAgIC8vICAgICAgICAgICAgIDAgICsgICAwICAwICAgMCAgMCAgICsg ICsgICArICAwICAgKyAgMAogICAgICAgIC8vCiAgICAgICAgLy8gICAgICAgICAgICAgMjEsMTAs IDIxLDExLCAyMSwxMiwgMjIsMTAsIDIyLDExLCAyMiwxMiB9CiAgICAgICAgLy8gICAgICAgICAg ICAgMCAgKyAgIDAgIDAgICAwICAwICAgLSAgKyAgIC0gIDAgICAtICAwCiAgICAgICAgc3dpdGNo KCBpcGFreTFbaV0gKQogICAgICAgIHsKICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICB0YXJn ZXRQYXJ0aWNsZS5TZXREZWZpbml0aW9uKCBhTGFtYmRhICk7CiAgICAgICAgICAgYnJlYWs7CiAg ICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgdGFyZ2V0UGFydGljbGUuU2V0RGVmaW5pdGlvbigg YVNpZ21hUGx1cyApOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDIxOgogICAgICAg ICAgIHRhcmdldFBhcnRpY2xlLlNldERlZmluaXRpb24oIGFTaWdtYVplcm8gKTsKICAgICAgICAg ICBicmVhazsKICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICB0YXJnZXRQYXJ0aWNsZS5TZXRE ZWZpbml0aW9uKCBhU2lnbWFNaW51cyApOwogICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAg ICAgICB0YXJnZXRIYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICBzd2l0Y2goIGlwYWt5MltpXSAp CiAgICAgICAgewogICAgICAgICBjYXNlIDEwOgogICAgICAgICAgIHZlY1tpM10tPlNldERlZmlu aXRpb24oIGFLYW9uUGx1cyApOyAKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxMToK ICAgICAgICAgICB2ZWNbaTNdLT5TZXREZWZpbml0aW9uKCBhS2FvblpTICk7CiAgICAgICAgICAg YnJlYWs7CiAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgdmVjW2kzXS0+U2V0RGVmaW5pdGlv biggYUthb25aTCApOwogICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBl bHNlICAvLyAoY3VycmVudE1hc3MgPj0gcHJvdG9uTWFzcykgJiYgKEc0VW5pZm9ybVJhbmQoKSA+ PSAwLjUpCiAgICAgIHsKICAgICAgICAvLyBpcGFreWJbXSA9IHsgMTksMTMsIDE5LDEyLCAxOSwx MSwgMjMsMTMsIDIzLDEyLCAyMywxMSwKICAgICAgICAvLyAgICAgICAgICAgICAgMjQsMTMsIDI0 LDEyLCAyNCwxMSwgMjUsMTMsIDI1LDEyLCAyNSwxMSB9OwogICAgICAgIGlmKCAoY3VycmVudFBh cnRpY2xlLkdldERlZmluaXRpb24oKSA9PSBhbkFudGlQcm90b24pIHx8CiAgICAgICAgICAgIChj dXJyZW50UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFuQW50aU5ldXRyb24pIHx8CiAgICAg ICAgICAgIChjdXJyZW50UGFydGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFuQW50aUxhbWJkYSkg fHwKICAgICAgICAgICAgKGN1cnJlbnRNYXNzID4gc2lnbWFNaW51c01hc3MpICkKICAgICAgICB7 CiAgICAgICAgICBzd2l0Y2goIGlwYWt5YjFbaV0gKQogICAgICAgICAgewogICAgICAgICAgIGNh c2UgMTk6CiAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0 ZUUoIGFuQW50aUxhbWJkYSApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSAy MzoKICAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXREZWZpbml0aW9uQW5kVXBkYXRlRSgg YW5BbnRpU2lnbWFQbHVzICk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIDI0 OgogICAgICAgICAgICAgY3VycmVudFBhcnRpY2xlLlNldERlZmluaXRpb25BbmRVcGRhdGVFKCBh bkFudGlTaWdtYVplcm8gKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgMjU6 CiAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFu QW50aVNpZ21hTWludXMgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAg ICAgaW5jaWRlbnRIYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIHN3aXRjaCggaXBha3liMltp XSApCiAgICAgICAgICB7CiAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgIHZlY1tpM10t PlNldERlZmluaXRpb24oIGFLYW9uWlMgKTsgCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICBjYXNlIDEyOgogICAgICAgICAgICAgdmVjW2kzXS0+U2V0RGVmaW5pdGlvbiggYUthb25aTCAp OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgIHZl Y1tpM10tPlNldERlZmluaXRpb24oIGFLYW9uTWludXMgKTsKICAgICAgICAgICAgIGJyZWFrOwog ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgc3dp dGNoKCBpcGFreTFbaV0gKQogICAgICAgICAgewogICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAg ICAgICBjdXJyZW50UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFMYW1iZGEgKTsK ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICBjdXJy ZW50UGFydGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFTaWdtYVBsdXMgKTsKICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICBjdXJyZW50UGFy dGljbGUuU2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFTaWdtYVplcm8gKTsKICAgICAgICAgICAg IGJyZWFrOwogICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUu U2V0RGVmaW5pdGlvbkFuZFVwZGF0ZUUoIGFTaWdtYU1pbnVzICk7CiAgICAgICAgICAgICBicmVh azsKICAgICAgICAgIH0KICAgICAgICAgIGluY2lkZW50SGFzQ2hhbmdlZCA9IHRydWU7CiAgICAg ICAgICBzd2l0Y2goIGlwYWt5MltpXSApCiAgICAgICAgICB7CiAgICAgICAgICAgY2FzZSAxMDoK ICAgICAgICAgICAgIHZlY1tpM10tPlNldERlZmluaXRpb24oIGFLYW9uUGx1cyApOyAKICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICB2ZWNbaTNdLT5T ZXREZWZpbml0aW9uKCBhS2FvblpTICk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBj YXNlIDEyOgogICAgICAgICAgICAgdmVjW2kzXS0+U2V0RGVmaW5pdGlvbiggYUthb25aTCApOwog ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAg ICBlbHNlIHJldHVybjsKICAgIC8vCiAgICAvLyAgY2hlY2sgdGhlIGF2YWlsYWJsZSBlbmVyZ3kK ICAgIC8vICAgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBlbmVyZ3kgZm9yIGtrYi9reSBwYWlyIHBy b2R1Y3Rpb24KICAgIC8vICAgdGhlbiByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWNvbmRhcnkgcGFy dGljbGVzIAogICAgLy8gIE5PVEU6CiAgICAvLyAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRh cmllcyBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQKICAgIC8vICAgICAgICB0aGUgaW5jaWRlbnQgYW5k L29yIHRhcmdldCBwYXJ0aWNsZXMgbWF5IGhhdmUgY2hhbmdlZAogICAgLy8gICAgICAgIGNoYXJn ZSBjb25zZXJ2YXRpb24gaXMgaWdub3JlZCAoYXMgd2VsbCBhcyBzdHJhbmduZXNzIGNvbnNlcnZh dGlvbikKICAgIC8vCiAgICBjdXJyZW50TWFzcyA9IGN1cnJlbnRQYXJ0aWNsZS5HZXRNYXNzKCkv R2VWOwogICAgdGFyZ2V0TWFzcyA9IHRhcmdldFBhcnRpY2xlLkdldE1hc3MoKS9HZVY7CiAgICAK ICAgIEc0ZG91YmxlIGVuZXJneUNoZWNrID0gY2VudGVyb2ZtYXNzRW5lcmd5LShjdXJyZW50TWFz cyt0YXJnZXRNYXNzKTsKICAgIGZvciggaT0wOyBpPHZlY0xlbjsgKytpICkKICAgIHsKICAgICAg ZW5lcmd5Q2hlY2sgLT0gdmVjW2ldLT5HZXRNYXNzKCkvR2VWOwogICAgICBpZiggZW5lcmd5Q2hl Y2sgPCAwLjAgKSAgICAgIC8vIGNob3Agb2ZmIHRoZSBzZWNvbmRhcnkgTGlzdAogICAgICB7CiAg ICAgICAgdmVjTGVuID0gRzRzdGQ6Om1heCggMCwgLS1pICk7IC8vIGxvb2tzIGxpa2UgYSBtZW1v cnkgbGVhayBAQEBAQEBAQEBAQEAKCUc0aW50IGo7Cglmb3Ioaj1pOyBqPHZlY0xlbjsgaisrKSBk ZWxldGUgdmVjW2pdOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm47CiAg fQoKIHZvaWQKICBHNFJlYWN0aW9uRHluYW1pY3M6Ok51Y2xlYXJSZWFjdGlvbigKICAgRzRGYXN0 VmVjdG9yPEc0UmVhY3Rpb25Qcm9kdWN0LDQ+ICZ2ZWMsCiAgIEc0aW50ICZ2ZWNMZW4sCiAgIGNv bnN0IEc0RHluYW1pY1BhcnRpY2xlICpvcmlnaW5hbEluY2lkZW50LAogICBjb25zdCBHNE51Y2xl dXMgJnRhcmdldE51Y2xldXMsCiAgIGNvbnN0IEc0ZG91YmxlIHRoZUF0b21pY01hc3MsCiAgIGNv bnN0IEc0ZG91YmxlICptYXNzICkKICB7CiAgICAvLyBkZXJpdmVkIGZyb20gb3JpZ2luYWwgRk9S VFJBTiBjb2RlIE5VQ1JFQyBieSBILiBGZXNlZmVsZHQgKDEyLUZlYi0xOTg3KQogICAgLy8KICAg IC8vIE51Y2xlYXIgcmVhY3Rpb24ga2luZW1hdGljcyBhdCBsb3cgZW5lcmdpZXMKICAgIC8vCiAg ICBHNFBhcnRpY2xlRGVmaW5pdGlvbiAqYUdhbW1hID0gRzRHYW1tYTo6R2FtbWEoKTsKICAgIEc0 UGFydGljbGVEZWZpbml0aW9uICphUHJvdG9uID0gRzRQcm90b246OlByb3RvbigpOwogICAgRzRQ YXJ0aWNsZURlZmluaXRpb24gKmFOZXV0cm9uID0gRzROZXV0cm9uOjpOZXV0cm9uKCk7CiAgICBH NFBhcnRpY2xlRGVmaW5pdGlvbiAqYURldXRlcm9uID0gRzREZXV0ZXJvbjo6RGV1dGVyb24oKTsK ICAgIEc0UGFydGljbGVEZWZpbml0aW9uICphVHJpdG9uID0gRzRUcml0b246OlRyaXRvbigpOwog ICAgRzRQYXJ0aWNsZURlZmluaXRpb24gKmFuQWxwaGEgPSBHNEFscGhhOjpBbHBoYSgpOwogICAg CiAgICBjb25zdCBHNGRvdWJsZSBhUHJvdG9uTWFzcyA9IGFQcm90b24tPkdldFBER01hc3MoKS9N ZVY7CiAgICBjb25zdCBHNGRvdWJsZSBhTmV1dHJvbk1hc3MgPSBhTmV1dHJvbi0+R2V0UERHTWFz cygpL01lVjsKICAgIGNvbnN0IEc0ZG91YmxlIGFEZXV0ZXJvbk1hc3MgPSBhRGV1dGVyb24tPkdl dFBER01hc3MoKS9NZVY7CiAgICBjb25zdCBHNGRvdWJsZSBhVHJpdG9uTWFzcyA9IGFUcml0b24t PkdldFBER01hc3MoKS9NZVY7CiAgICBjb25zdCBHNGRvdWJsZSBhbkFscGhhTWFzcyA9IGFuQWxw aGEtPkdldFBER01hc3MoKS9NZVY7CgogICAgRzRSZWFjdGlvblByb2R1Y3QgY3VycmVudFBhcnRp Y2xlOwogICAgY3VycmVudFBhcnRpY2xlID0gKm9yaWdpbmFsSW5jaWRlbnQ7CiAgICAvLwogICAg Ly8gU2V0IGJlYW0gcGFydGljbGUsIHRha2Uga2luZXRpYyBlbmVyZ3kgb2YgY3VycmVudCBwYXJ0 aWNsZSBhcyB0aGUKICAgIC8vIGZ1bmRhbWVudGFsIHF1YW50aXR5LiAgRHVlIHRvIHRoZSBkaWZm aWN1bHQga2luZW1hdGljLCBhbGwgbWFzc2VzIGhhdmUgdG8KICAgIC8vIGJlIGFzc2lnbmVkIHRo ZSBiZXN0IG1lYXN1cmVkIHZhbHVlcwogICAgLy8KICAgIEc0ZG91YmxlIHAgPSBjdXJyZW50UGFy dGljbGUuR2V0VG90YWxNb21lbnR1bSgpOwogICAgRzRkb3VibGUgcHAgPSBjdXJyZW50UGFydGlj bGUuR2V0TW9tZW50dW0oKS5tYWcoKTsKICAgIGlmKCBwcCA8PSAwLjAwMSpNZVYgKQogICAgewog ICAgICBHNGRvdWJsZSBwaGludmUgPSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgIEc0ZG91 YmxlIHJ0aG52ZSA9IGFjb3MoIEc0c3RkOjptYXgoIC0xLjAsIEc0c3RkOjptaW4oIDEuMCwgLTEu MCArIDIuMCpHNFVuaWZvcm1SYW5kKCkgKSApICk7CiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRN b21lbnR1bSggcCpzaW4ocnRobnZlKSpjb3MocGhpbnZlKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwKnNpbihydGhudmUpKnNpbihwaGludmUpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHAqY29zKHJ0aG52ZSkgKTsKICAgIH0KICAgIGVsc2UKICAgICAg Y3VycmVudFBhcnRpY2xlLlNldE1vbWVudHVtKCBjdXJyZW50UGFydGljbGUuR2V0TW9tZW50dW0o KSAqIChwL3BwKSApOwogICAgLy8KICAgIC8vIGNhbGN1bGF0ZSBRLXZhbHVlIG9mIHJlYWN0aW9u cwogICAgLy8KICAgIEc0ZG91YmxlIGN1cnJlbnRLaW5ldGljID0gY3VycmVudFBhcnRpY2xlLkdl dEtpbmV0aWNFbmVyZ3koKS9NZVY7CiAgICBHNGRvdWJsZSBjdXJyZW50TWFzcyA9IGN1cnJlbnRQ YXJ0aWNsZS5HZXREZWZpbml0aW9uKCktPkdldFBER01hc3MoKS9NZVY7CiAgICBHNGRvdWJsZSBx diA9IGN1cnJlbnRLaW5ldGljICsgdGhlQXRvbWljTWFzcyArIGN1cnJlbnRNYXNzOwogICAgCiAg ICBHNGRvdWJsZSBxdmFsWzldOwogICAgcXZhbFswXSA9IHF2IC0gbWFzc1swXTsKICAgIHF2YWxb MV0gPSBxdiAtIG1hc3NbMV0gLSBhTmV1dHJvbk1hc3M7CiAgICBxdmFsWzJdID0gcXYgLSBtYXNz WzJdIC0gYVByb3Rvbk1hc3M7CiAgICBxdmFsWzNdID0gcXYgLSBtYXNzWzNdIC0gYURldXRlcm9u TWFzczsKICAgIHF2YWxbNF0gPSBxdiAtIG1hc3NbNF0gLSBhVHJpdG9uTWFzczsKICAgIHF2YWxb NV0gPSBxdiAtIG1hc3NbNV0gLSBhbkFscGhhTWFzczsKICAgIHF2YWxbNl0gPSBxdiAtIG1hc3Nb Nl0gLSBhTmV1dHJvbk1hc3MgLSBhTmV1dHJvbk1hc3M7CiAgICBxdmFsWzddID0gcXYgLSBtYXNz WzddIC0gYU5ldXRyb25NYXNzIC0gYVByb3Rvbk1hc3M7CiAgICBxdmFsWzhdID0gcXYgLSBtYXNz WzhdIC0gYVByb3Rvbk1hc3MgIC0gYVByb3Rvbk1hc3M7CiAgICAKICAgIGlmKCBjdXJyZW50UGFy dGljbGUuR2V0RGVmaW5pdGlvbigpID09IGFOZXV0cm9uICkKICAgIHsKICAgICAgY29uc3QgRzRk b3VibGUgQSA9IHRhcmdldE51Y2xldXMuR2V0TigpOyAgICAvLyBhdG9taWMgd2VpZ2h0CiAgICAg IGlmKCBHNFVuaWZvcm1SYW5kKCkgPiAoKEEtMS4wKS8yMzAuMCkqKChBLTEuMCkvMjMwLjApICkK ICAgICAgICBxdmFsWzBdID0gMC4wOwogICAgICBpZiggRzRVbmlmb3JtUmFuZCgpID49IGN1cnJl bnRLaW5ldGljLzcuOTI1NCpBICkKICAgICAgICBxdmFsWzJdID0gcXZhbFszXSA9IHF2YWxbNF0g PSBxdmFsWzVdID0gcXZhbFs4XSA9IDAuMDsKICAgIH0KICAgIGVsc2UKICAgICAgcXZhbFswXSA9 IDAuMDsKICAgIAogICAgRzRpbnQgaTsKICAgIHF2ID0gMC4wOwogICAgZm9yKCBpPTA7IGk8OTsg KytpICkKICAgIHsKICAgICAgaWYoIG1hc3NbaV0gPCA1MDAuMCpNZVYgKXF2YWxbaV0gPSAwLjA7 CiAgICAgIGlmKCBxdmFsW2ldIDwgMC4wIClxdmFsW2ldID0gMC4wOwogICAgICBxdiArPSBxdmFs W2ldOwogICAgfQogICAgRzRkb3VibGUgcXYxID0gMC4wOwogICAgRzRkb3VibGUgcmFuID0gRzRV bmlmb3JtUmFuZCgpOwogICAgRzRpbnQgaW5kZXg7CiAgICBmb3IoIGluZGV4PTA7IGluZGV4PDk7 ICsraW5kZXggKQogICAgewogICAgICBpZiggcXZhbFtpbmRleF0gPiAwLjAgKQogICAgICB7CiAg ICAgICAgcXYxICs9IHF2YWxbaW5kZXhdL3F2OwogICAgICAgIGlmKCByYW4gPD0gcXYxIClicmVh azsKICAgICAgfQogICAgfQogICAgaWYoIGluZGV4ID09IDkgKSAgLy8gbG9vcCBjb250aW51ZWQg dG8gdGhlIGVuZAogICAgICBHNEV4Y2VwdGlvbigiRzRSZWFjdGlvbkR5bmFtaWNzOjpOdWNsZWFy UmVhY3Rpb246IGluZWxhc3RpYyByZWFjdGlvbiBraW5lbWF0aWNhbGx5IG5vdCBwb3NzaWJsZSIp OwogICAgCiAgICBHNGRvdWJsZSBrZSA9IGN1cnJlbnRQYXJ0aWNsZS5HZXRLaW5ldGljRW5lcmd5 KCkvR2VWOwogICAgRzRpbnQgbnQgPSAyOwogICAgaWYoIChpbmRleD49NikgfHwgKEc0VW5pZm9y bVJhbmQoKTxHNHN0ZDo6bWluKDAuNSxrZSoxMC4wKSkgKW50ID0gMzsKICAgIAogICAgRzRSZWFj dGlvblByb2R1Y3QgKip2ID0gbmV3IEc0UmVhY3Rpb25Qcm9kdWN0ICogWzNdOwogICAgdlswXSA9 ICBuZXcgRzRSZWFjdGlvblByb2R1Y3Q7CiAgICB2WzFdID0gIG5ldyBHNFJlYWN0aW9uUHJvZHVj dDsKICAgIHZbMl0gPSAgbmV3IEc0UmVhY3Rpb25Qcm9kdWN0OwogICAgCiAgICB2WzBdLT5TZXRN YXNzKCBtYXNzW2luZGV4XSpNZVYgKTsKICAgIHN3aXRjaCggaW5kZXggKQogICAgewogICAgIGNh c2UgMDoKICAgICAgIHZbMV0tPlNldERlZmluaXRpb24oIGFHYW1tYSApOwogICAgICAgdlsyXS0+ U2V0RGVmaW5pdGlvbiggYUdhbW1hICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDE6CiAgICAg ICB2WzFdLT5TZXREZWZpbml0aW9uKCBhTmV1dHJvbiApOwogICAgICAgdlsyXS0+U2V0RGVmaW5p dGlvbiggYUdhbW1hICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDI6CiAgICAgICB2WzFdLT5T ZXREZWZpbml0aW9uKCBhUHJvdG9uICk7CiAgICAgICB2WzJdLT5TZXREZWZpbml0aW9uKCBhR2Ft bWEgKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzoKICAgICAgIHZbMV0tPlNldERlZmluaXRp b24oIGFEZXV0ZXJvbiApOwogICAgICAgdlsyXS0+U2V0RGVmaW5pdGlvbiggYUdhbW1hICk7CiAg ICAgICBicmVhazsKICAgICBjYXNlIDQ6CiAgICAgICB2WzFdLT5TZXREZWZpbml0aW9uKCBhVHJp dG9uICk7CiAgICAgICB2WzJdLT5TZXREZWZpbml0aW9uKCBhR2FtbWEgKTsKICAgICAgIGJyZWFr OwogICAgIGNhc2UgNToKICAgICAgIHZbMV0tPlNldERlZmluaXRpb24oIGFuQWxwaGEgKTsKICAg ICAgIHZbMl0tPlNldERlZmluaXRpb24oIGFHYW1tYSApOwogICAgICAgYnJlYWs7CiAgICAgY2Fz ZSA2OgogICAgICAgdlsxXS0+U2V0RGVmaW5pdGlvbiggYU5ldXRyb24gKTsKICAgICAgIHZbMl0t PlNldERlZmluaXRpb24oIGFOZXV0cm9uICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDc6CiAg ICAgICB2WzFdLT5TZXREZWZpbml0aW9uKCBhTmV1dHJvbiApOwogICAgICAgdlsyXS0+U2V0RGVm aW5pdGlvbiggYVByb3RvbiApOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA4OgogICAgICAgdlsx XS0+U2V0RGVmaW5pdGlvbiggYVByb3RvbiApOwogICAgICAgdlsyXS0+U2V0RGVmaW5pdGlvbigg YVByb3RvbiApOwogICAgICAgYnJlYWs7CiAgICB9CiAgICAvLwogICAgLy8gY2FsY3VsYXRlIGNl bnRyZSBvZiBtYXNzIGVuZXJneQogICAgLy8KICAgIEc0UmVhY3Rpb25Qcm9kdWN0IHBzZXVkbzE7 CiAgICBwc2V1ZG8xLlNldE1hc3MoIHRoZUF0b21pY01hc3MqTWVWICk7CiAgICBwc2V1ZG8xLlNl dFRvdGFsRW5lcmd5KCB0aGVBdG9taWNNYXNzKk1lViApOwogICAgRzRSZWFjdGlvblByb2R1Y3Qg cHNldWRvMiA9IGN1cnJlbnRQYXJ0aWNsZSArIHBzZXVkbzE7CiAgICBwc2V1ZG8yLlNldE1vbWVu dHVtKCBwc2V1ZG8yLkdldE1vbWVudHVtKCkgKiAoLTEuMCkgKTsKICAgIC8vCiAgICAvLyB1c2Ug cGhhc2Ugc3BhY2Ugcm91dGluZSBpbiBjZW50cmUgb2YgbWFzcyBzeXN0ZW0KICAgIC8vCiAgICBH NEZhc3RWZWN0b3I8RzRSZWFjdGlvblByb2R1Y3QsMTI4PiB0ZW1wVjsKICAgIHRlbXBWLkluaXRp YWxpemUoIG50ICk7CiAgICBHNGludCB0ZW1wTGVuID0gMDsKICAgIHRlbXBWLlNldEVsZW1lbnQo IHRlbXBMZW4rKywgdlswXSApOwogICAgdGVtcFYuU2V0RWxlbWVudCggdGVtcExlbisrLCB2WzFd ICk7CiAgICBpZiggbnQgPT0gMyApdGVtcFYuU2V0RWxlbWVudCggdGVtcExlbisrLCB2WzJdICk7 CiAgICBHNGJvb2wgY29uc3RhbnRDcm9zc1NlY3Rpb24gPSB0cnVlOwogICAgR2VuZXJhdGVOQm9k eUV2ZW50KCBwc2V1ZG8yLkdldE1hc3MoKS9NZVYsIGNvbnN0YW50Q3Jvc3NTZWN0aW9uLCB0ZW1w ViwgdGVtcExlbiApOwogICAgdlswXS0+TG9yZW50eiggKnZbMF0sIHBzZXVkbzIgKTsKICAgIHZb MV0tPkxvcmVudHooICp2WzFdLCBwc2V1ZG8yICk7CiAgICBpZiggbnQgPT0gMyApdlsyXS0+TG9y ZW50eiggKnZbMl0sIHBzZXVkbzIgKTsKICAgIAogICAgRzRib29sIHBhcnRpY2xlSXNEZWZpbmVk ID0gZmFsc2U7CiAgICBpZiggdlswXS0+R2V0TWFzcygpL01lViAtIGFQcm90b25NYXNzIDwgMC4x ICkKICAgIHsKICAgICAgdlswXS0+U2V0RGVmaW5pdGlvbiggYVByb3RvbiApOwogICAgICBwYXJ0 aWNsZUlzRGVmaW5lZCA9IHRydWU7CiAgICB9CiAgICBlbHNlIGlmKCB2WzBdLT5HZXRNYXNzKCkv TWVWIC0gYU5ldXRyb25NYXNzIDwgMC4xICkKICAgIHsKICAgICAgdlswXS0+U2V0RGVmaW5pdGlv biggYU5ldXRyb24gKTsKICAgICAgcGFydGljbGVJc0RlZmluZWQgPSB0cnVlOwogICAgfQogICAg ZWxzZSBpZiggdlswXS0+R2V0TWFzcygpL01lViAtIGFEZXV0ZXJvbk1hc3MgPCAwLjEgKQogICAg ewogICAgICB2WzBdLT5TZXREZWZpbml0aW9uKCBhRGV1dGVyb24gKTsKICAgICAgcGFydGljbGVJ c0RlZmluZWQgPSB0cnVlOwogICAgfQogICAgZWxzZSBpZiggdlswXS0+R2V0TWFzcygpL01lViAt IGFUcml0b25NYXNzIDwgMC4xICkKICAgIHsKICAgICAgdlswXS0+U2V0RGVmaW5pdGlvbiggYVRy aXRvbiApOwogICAgICBwYXJ0aWNsZUlzRGVmaW5lZCA9IHRydWU7CiAgICB9CiAgICBlbHNlIGlm KCB2WzBdLT5HZXRNYXNzKCkvTWVWIC0gYW5BbHBoYU1hc3MgPCAwLjEgKQogICAgewogICAgICB2 WzBdLT5TZXREZWZpbml0aW9uKCBhbkFscGhhICk7CiAgICAgIHBhcnRpY2xlSXNEZWZpbmVkID0g dHJ1ZTsKICAgIH0KICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRLaW5ldGljRW5lcmd5KAogICAgIEc0 c3RkOjptYXgoIDAuMDAxLCBjdXJyZW50UGFydGljbGUuR2V0S2luZXRpY0VuZXJneSgpL01lViAp ICk7CiAgICBwID0gY3VycmVudFBhcnRpY2xlLkdldFRvdGFsTW9tZW50dW0oKTsKICAgIHBwID0g Y3VycmVudFBhcnRpY2xlLkdldE1vbWVudHVtKCkubWFnKCk7CiAgICBpZiggcHAgPD0gMC4wMDEq TWVWICkKICAgIHsKICAgICAgRzRkb3VibGUgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3JtUmFuZCgp OwogICAgICBHNGRvdWJsZSBydGhudmUgPSBhY29zKCBHNHN0ZDo6bWF4KCAtMS4wLCBHNHN0ZDo6 bWluKCAxLjAsIC0xLjAgKyAyLjAqRzRVbmlmb3JtUmFuZCgpICkgKSApOwogICAgICBjdXJyZW50 UGFydGljbGUuU2V0TW9tZW50dW0oIHAqc2luKHJ0aG52ZSkqY29zKHBoaW52ZSksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKmNvcyhydGhudmUpICk7CiAgICB9CiAg ICBlbHNlCiAgICAgIGN1cnJlbnRQYXJ0aWNsZS5TZXRNb21lbnR1bSggY3VycmVudFBhcnRpY2xl LkdldE1vbWVudHVtKCkgKiAocC9wcCkgKTsKICAgIAogICAgaWYoIHBhcnRpY2xlSXNEZWZpbmVk ICkKICAgIHsKICAgICAgdlswXS0+U2V0S2luZXRpY0VuZXJneSgKICAgICAgIEc0c3RkOjptYXgo IDAuMDAxLCAwLjUqRzRVbmlmb3JtUmFuZCgpKnZbMF0tPkdldEtpbmV0aWNFbmVyZ3koKS9NZVYg KSApOwogICAgICBwID0gdlswXS0+R2V0VG90YWxNb21lbnR1bSgpOwogICAgICBwcCA9IHZbMF0t PkdldE1vbWVudHVtKCkubWFnKCk7CiAgICAgIGlmKCBwcCA8PSAwLjAwMSpNZVYgKQogICAgICB7 CiAgICAgICAgRzRkb3VibGUgcGhpbnZlID0gdHdvcGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICAg IEc0ZG91YmxlIHJ0aG52ZSA9IGFjb3MoIEc0c3RkOjptYXgoLTEuMCxHNHN0ZDo6bWluKDEuMCwt MS4wKzIuMCpHNFVuaWZvcm1SYW5kKCkpKSApOwogICAgICAgIHZbMF0tPlNldE1vbWVudHVtKCBw KnNpbihydGhudmUpKmNvcyhwaGludmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHAqc2lu KHJ0aG52ZSkqc2luKHBoaW52ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcCpjb3MocnRo bnZlKSApOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB2WzBdLT5TZXRNb21lbnR1bSggdlsw XS0+R2V0TW9tZW50dW0oKSAqIChwL3BwKSApOwogICAgfQogICAgaWYoICh2WzFdLT5HZXREZWZp bml0aW9uKCkgPT0gYURldXRlcm9uKSB8fAogICAgICAgICh2WzFdLT5HZXREZWZpbml0aW9uKCkg PT0gYVRyaXRvbikgICB8fAogICAgICAgICh2WzFdLT5HZXREZWZpbml0aW9uKCkgPT0gYW5BbHBo YSkgKSAKICAgICAgdlsxXS0+U2V0S2luZXRpY0VuZXJneSgKICAgICAgIEc0c3RkOjptYXgoIDAu MDAxLCAwLjUqRzRVbmlmb3JtUmFuZCgpKnZbMV0tPkdldEtpbmV0aWNFbmVyZ3koKS9NZVYgKSAp OwogICAgZWxzZQogICAgICB2WzFdLT5TZXRLaW5ldGljRW5lcmd5KCBHNHN0ZDo6bWF4KCAwLjAw MSwgdlsxXS0+R2V0S2luZXRpY0VuZXJneSgpL01lViApICk7CiAgICAKICAgIHAgPSB2WzFdLT5H ZXRUb3RhbE1vbWVudHVtKCk7CiAgICBwcCA9IHZbMV0tPkdldE1vbWVudHVtKCkubWFnKCk7CiAg ICBpZiggcHAgPD0gMC4wMDEqTWVWICkKICAgIHsKICAgICAgRzRkb3VibGUgcGhpbnZlID0gdHdv cGkqRzRVbmlmb3JtUmFuZCgpOwogICAgICBHNGRvdWJsZSBydGhudmUgPSBhY29zKCBHNHN0ZDo6 bWF4KC0xLjAsRzRzdGQ6Om1pbigxLjAsLTEuMCsyLjAqRzRVbmlmb3JtUmFuZCgpKSkgKTsKICAg ICAgdlsxXS0+U2V0TW9tZW50dW0oIHAqc2luKHJ0aG52ZSkqY29zKHBoaW52ZSksCiAgICAgICAg ICAgICAgICAgICAgICAgIHAqc2luKHJ0aG52ZSkqc2luKHBoaW52ZSksCiAgICAgICAgICAgICAg ICAgICAgICAgIHAqY29zKHJ0aG52ZSkgKTsKICAgIH0KICAgIGVsc2UKICAgICAgdlsxXS0+U2V0 TW9tZW50dW0oIHZbMV0tPkdldE1vbWVudHVtKCkgKiAocC9wcCkgKTsKICAgIAogICAgaWYoIG50 ID09IDMgKQogICAgewogICAgICBpZiggKHZbMl0tPkdldERlZmluaXRpb24oKSA9PSBhRGV1dGVy b24pIHx8CiAgICAgICAgICAodlsyXS0+R2V0RGVmaW5pdGlvbigpID09IGFUcml0b24pICAgfHwK ICAgICAgICAgICh2WzJdLT5HZXREZWZpbml0aW9uKCkgPT0gYW5BbHBoYSkgKSAKICAgICAgICB2 WzJdLT5TZXRLaW5ldGljRW5lcmd5KAogICAgICAgICBHNHN0ZDo6bWF4KCAwLjAwMSwgMC41Kkc0 VW5pZm9ybVJhbmQoKSp2WzJdLT5HZXRLaW5ldGljRW5lcmd5KCkvTWVWICkgKTsKICAgICAgZWxz ZQogICAgICAgIHZbMl0tPlNldEtpbmV0aWNFbmVyZ3koIEc0c3RkOjptYXgoIDAuMDAxLCB2WzJd LT5HZXRLaW5ldGljRW5lcmd5KCkvTWVWICkgKTsKICAgICAgCiAgICAgIHAgPSB2WzJdLT5HZXRU b3RhbE1vbWVudHVtKCk7CiAgICAgIHBwID0gdlsyXS0+R2V0TW9tZW50dW0oKS5tYWcoKTsKICAg ICAgaWYoIHBwIDw9IDAuMDAxKk1lViApCiAgICAgIHsKICAgICAgICBHNGRvdWJsZSBwaGludmUg PSB0d29waSpHNFVuaWZvcm1SYW5kKCk7CiAgICAgICAgRzRkb3VibGUgcnRobnZlID0gYWNvcygg RzRzdGQ6Om1heCgtMS4wLEc0c3RkOjptaW4oMS4wLC0xLjArMi4wKkc0VW5pZm9ybVJhbmQoKSkp ICk7CiAgICAgICAgdlsyXS0+U2V0TW9tZW50dW0oIHAqc2luKHJ0aG52ZSkqY29zKHBoaW52ZSks CiAgICAgICAgICAgICAgICAgICAgICAgICAgcCpzaW4ocnRobnZlKSpzaW4ocGhpbnZlKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICBwKmNvcyhydGhudmUpICk7CiAgICAgIH0KICAgICAgZWxz ZQogICAgICAgIHZbMl0tPlNldE1vbWVudHVtKCB2WzJdLT5HZXRNb21lbnR1bSgpICogKHAvcHAp ICk7CiAgICB9CiAgICBHNGludCBkZWw7CiAgICBmb3IoZGVsPTA7IGRlbDx2ZWNMZW47IGRlbCsr KSBkZWxldGUgdmVjW2RlbF07CiAgICB2ZWNMZW4gPSAwOwogICAgaWYoIHBhcnRpY2xlSXNEZWZp bmVkICkKICAgIHsKICAgICAgdmVjLlNldEVsZW1lbnQoIHZlY0xlbisrLCB2WzBdICk7CiAgICB9 CiAgICBlbHNlCiAgICB7CiAgICAgIGRlbGV0ZSB2WzBdOwogICAgfQogICAgdmVjLlNldEVsZW1l bnQoIHZlY0xlbisrLCB2WzFdICk7CiAgICBpZiggbnQgPT0gMyApCiAgICB7CiAgICAgIHZlYy5T ZXRFbGVtZW50KCB2ZWNMZW4rKywgdlsyXSApOwogICAgfQogICAgZWxzZQogICAgewogICAgICBk ZWxldGUgdlsyXTsKICAgIH0KICAgIGRlbGV0ZSBbXSB2OwogICAgcmV0dXJuOwogIH0KIAogLyog ZW5kIG9mIGZpbGUgKi8KIAo=