From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by sourceware.org (Postfix) with ESMTPS id 32CE33858D32 for ; Sun, 13 Aug 2023 11:50:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 32CE33858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-31757edd9edso2868110f8f.2 for ; Sun, 13 Aug 2023 04:50:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691927435; x=1692532235; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=wCgby2okWxGF7p2bmDYy7g5E7AhJEQ0oe7P9UNRkQv0=; b=o9r+mjOXsmV2msd/VvWH3Z6qAJc/qdqqXtxbLSwNvZR4Zr/u8qcDQKsK/kRgqnAURi 3hT8xsHr6gSsqlZtqKFdAnTIpaFp8YwsipznZpssL5ewkci3RZb95zSusEGnjMlqZCMx eO38pz3bMMDvaT4oc+qwHKc1943PhkEIfkAmDUB0wB8VYqTqdOZ/YhPFcuCPnNJf7vla bW1CD+3P+sn6xx3GO4JKNXS0RqW+h8wGp2pfsMonrNRw/oxqhmF+Ayr9HJjMlo0Y9WPA e++G6s7Se4r1SpzoR5tmny8bPi20DLJejdiQUJ5QdrXHAz0ri9o4NauEQVCX8Itgq51n J76Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691927435; x=1692532235; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wCgby2okWxGF7p2bmDYy7g5E7AhJEQ0oe7P9UNRkQv0=; b=UAjralCoO43wVItcATPYEKyOcqP+eyc4YHWcQxAYUai9inc8gdgkFrv85QZL1PJ4Yn yHFVCuwxTN1L2aWz8kItDU4JXu2y/cz5P+IHCzghCJNaQS0qLsGdyDpB1zJc7mPlY0CR qPbf47/7/Tk8F2Qolga4doLT6ce7vR/pVuNBnSRJF/vhNX90QuCTAV7D8TZtn+zYDzzo mNdDTROmOB2sq2oJ4Im63BSU9YYqhhqJs5ZVasRI+n0pK7p06QBLbSvzvacLKG15wKWS lGEZH9Wjhcgin6W8dMQ7SVbcxko1SC2q+NgPfCnzHhar+rO5HZ/DzxEjGbvpA5dfMDor raEQ== X-Gm-Message-State: AOJu0Yw5ov1CSMyrmIy6xBQdrYcjmDI8hZJ2PH1D6VCFQwJ0YHDC02iZ RlRW/K+jcNichymnIx4mZCk0gHXYX1CupSIsf8UxNSnCfOVIXiZq X-Google-Smtp-Source: AGHT+IENUXXuWDoj5+PoBtJ3wFHiFj0hBAKoD6coapaQLdKEmXgbD9czqeEO8JmnglGp61+ubgmIfQJCVTT4UZxNRxQ= X-Received: by 2002:a5d:6b8f:0:b0:319:6ba9:716f with SMTP id n15-20020a5d6b8f000000b003196ba9716fmr2704844wrx.49.1691927434551; Sun, 13 Aug 2023 04:50:34 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Prathamesh Kulkarni Date: Sun, 13 Aug 2023 17:19:58 +0530 Message-ID: Subject: Re: [RFC] [v2] Extend fold_vec_perm to handle VLA vectors To: Prathamesh Kulkarni , gcc Patches , richard.sandiford@arm.com Content-Type: multipart/mixed; boundary="000000000000b912940602cc8d48" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000b912940602cc8d48 Content-Type: text/plain; charset="UTF-8" On Thu, 10 Aug 2023 at 21:27, Richard Sandiford wrote: > > Prathamesh Kulkarni writes: > >> static bool > >> is_simple_vla_size (poly_uint64 size) > >> { > >> if (size.is_constant ()) > >> return false; > >> for (int i = 1; i < ARRAY_SIZE (size.coeffs); ++i) > >> if (size[i] != (i <= 1 ? size[0] : 0)) > > Just wondering is this should be (i == 1 ? size[0] : 0) since i is > > initialized to 1 ? > > Both work. I prefer <= 1 because it doesn't depend on the micro > optimisation to start at coefficient 1. In a theoretical 3-indeterminate > poly_int, we want the first 2 coefficients to be nonzero and the rest to > be zero. > > > IIUC, is_simple_vla_size should return true for polynomials of first > > degree and having same coeff like 4 + 4x ? > > FWIW, poly_int only supports first-degree polynomials at the moment. > coeffs>2 means there is more than one indeterminate, rather than a > higher power. Oh OK, thanks for the clarification. > > >> return false; > >> return true; > >> } > >> > >> > >> FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_INT) > >> { > >> auto nunits = GET_MODE_NUNITS (mode); > >> if (!is_simple_vla_size (nunits)) > >> continue; > >> if (nunits[0] ...) > >> test_... (mode); > >> ... > >> > >> } > >> > >> test_vnx4si_v4si and test_v4si_vnx4si look good. But with the > >> loop structure above, I think we can apply the test_vnx4si and > >> test_vnx16qi to more cases. So the classification isn't the > >> exact number of elements, but instead a limit. > >> > >> I think the nunits[0] conditions for test_vnx4si are as follows > >> (inspection only, so could be wrong): > >> > >> > +/* Test cases where result and input vectors are VNx4SI */ > >> > + > >> > +static void > >> > +test_vnx4si (machine_mode vmode) > >> > +{ > >> > + /* Case 1: mask = {0, ...} */ > >> > + { > >> > + tree arg0 = build_vec_cst_rand (vmode, 2, 3, 1); > >> > + tree arg1 = build_vec_cst_rand (vmode, 2, 3, 1); > >> > + poly_uint64 len = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)); > >> > + > >> > + vec_perm_builder builder (len, 1, 1); > >> > + builder.quick_push (0); > >> > + vec_perm_indices sel (builder, 2, len); > >> > + tree res = fold_vec_perm_cst (TREE_TYPE (arg0), arg0, arg1, sel); > >> > + > >> > + tree expected_res[] = { vector_cst_elt (res, 0) }; > > This should be { vector_cst_elt (arg0, 0) }; will fix in next patch. > >> > + validate_res (1, 1, res, expected_res); > >> > + } > >> > >> nunits[0] >= 2 (could be all nunits if the inputs had nelts_per_pattern==1, > >> which I think would be better) > > IIUC, the vectors that can be used for a particular test should have > > nunits[0] >= res_npatterns, > > where res_npatterns is as computed in fold_vec_perm_cst without the > > canonicalization ? > > For above test -- res_npatterns = max(2, max (2, 1)) == 2, so we > > require nunits[0] >= 2 ? > > Which implies we can use above test for vectors with length 2 + 2x, 4 + 4x, etc. > > Right, that's what I meant. With the inputs as they stand it has to be > nunits[0] >= 2. We need that form the inputs correctly. But if the > inputs instead had nelts_per_pattern == 1, the test would work for all > nunits. In the attached patch, I have reordered the tests based on min or max limit. For tests where sel_npatterns < 3 (ie dup sequence), I have kept input npatterns = 1, so we can test more vector modes, and also input npatterns matter only for stepped sequence in sel (Since for a dup pattern we don't enforce the constraint of selecting elements from same input pattern). Does it look OK ? For the following tests with input vectors having shape (1, 3) sel = {0, 1, 2, ...} // (1, 3) res = { arg0[0], arg0[1], arg0[2], ... } // (1, 3) and sel = {len, len + 1, len + 2, ... } // (1, 3) res = { arg1[0], arg1[1], arg1[2], ... } // (1, 3) Altho res_npatterns = 1, I suppose these will need to be tested with vectors with length >= 4 + 4x, since index 2 can be ambiguous for length 2 + 2x ? (In the patch, these are cases 2 and 3 in test_nunits_min_4) Patch is bootstrapped+tested on aarch64-linux-gnu with and without SVE and on x86_64-linux-gnu (altho I suppose bootstrapping won't be necessary for changes to unit-tests?) > > > Sorry if this sounds like a silly question -- Won't nunits[0] >= 2 > > cover all nunits, > > since a vector, at a minimum, will contain 2 elements ? > > Not necessarily. VNx1TI makes conceptual sense. We just don't use it > currently (although that'll change with SME). And we do have single-element > VLS vectors like V1DI and V1DF. Thanks for the explanation, I wasn't aware of that. Thanks, Prathamesh > > Thanks, > Richard --000000000000b912940602cc8d48 Content-Type: text/plain; charset="US-ASCII"; name="gnu-790-v2-14.txt" Content-Disposition: attachment; filename="gnu-790-v2-14.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ll9b5np40 ZGlmZiAtLWdpdCBhL2djYy9mb2xkLWNvbnN0LmNjIGIvZ2NjL2ZvbGQtY29uc3QuY2MKaW5kZXgg N2U1NDk0ZGZkMzkuLjVlYWNiMWQxNDdlIDEwMDY0NAotLS0gYS9nY2MvZm9sZC1jb25zdC5jYwor KysgYi9nY2MvZm9sZC1jb25zdC5jYwpAQCAtNDAsNiArNDAsNyBAQCBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogICAgZ2ltcGxlIGNvZGUsIHdlIG5l ZWQgdG8gaGFuZGxlIEdJTVBMRSB0dXBsZXMgYXMgd2VsbCBhcyB0aGVpcgogICAgY29ycmVzcG9u ZGluZyB0cmVlIGVxdWl2YWxlbnRzLiAgKi8KIAorI2RlZmluZSBJTkNMVURFX0FMR09SSVRITQog I2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgInN5c3RlbS5oIgogI2luY2x1ZGUgImNvcmV0 eXBlcy5oIgpAQCAtMTA0OTQsMTUgKzEwNDk1LDkgQEAgZm9sZF9tdWx0X3pjb25qeiAobG9jYXRp b25fdCBsb2MsIHRyZWUgdHlwZSwgdHJlZSBleHByKQogc3RhdGljIGJvb2wKIHZlY19jc3RfY3Rv cl90b19hcnJheSAodHJlZSBhcmcsIHVuc2lnbmVkIGludCBuZWx0cywgdHJlZSAqZWx0cykKIHsK LSAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBpLCBudW5pdHM7CisgIHVuc2lnbmVkIEhPU1RfV0lE RV9JTlQgaTsKIAotICBpZiAoVFJFRV9DT0RFIChhcmcpID09IFZFQ1RPUl9DU1QKLSAgICAgICYm IFZFQ1RPUl9DU1RfTkVMVFMgKGFyZykuaXNfY29uc3RhbnQgKCZudW5pdHMpKQotICAgIHsKLSAg ICAgIGZvciAoaSA9IDA7IGkgPCBudW5pdHM7ICsraSkKLQllbHRzW2ldID0gVkVDVE9SX0NTVF9F TFQgKGFyZywgaSk7Ci0gICAgfQotICBlbHNlIGlmIChUUkVFX0NPREUgKGFyZykgPT0gQ09OU1RS VUNUT1IpCisgIGlmIChUUkVFX0NPREUgKGFyZykgPT0gQ09OU1RSVUNUT1IpCiAgICAgewogICAg ICAgY29uc3RydWN0b3JfZWx0ICplbHQ7CiAKQEAgLTEwNTIwLDYgKzEwNTE1LDE4MSBAQCB2ZWNf Y3N0X2N0b3JfdG9fYXJyYXkgKHRyZWUgYXJnLCB1bnNpZ25lZCBpbnQgbmVsdHMsIHRyZWUgKmVs dHMpCiAgIHJldHVybiB0cnVlOwogfQogCisvKiBIZWxwZXIgcm91dGluZSBmb3IgZm9sZF92ZWNf cGVybV9jc3QgdG8gY2hlY2sgaWYgU0VMIGlzIGEgc3VpdGFibGUKKyAgIG1hc2sgZm9yIFZMQSB2 ZWNfcGVybSBmb2xkaW5nLgorICAgUkVBU09OIGlmIHNwZWNpZmllZCwgd2lsbCBjb250YWluIHRo ZSByZWFzb24gd2h5IFNFTCBpcyBub3Qgc3VpdGFibGUuCisgICBVc2VkIG9ubHkgZm9yIGRlYnVn Z2luZyBhbmQgdW5pdC10ZXN0aW5nLiAgKi8KKworc3RhdGljIGJvb2wKK3ZhbGlkX21hc2tfZm9y X2ZvbGRfdmVjX3Blcm1fY3N0X3AgKHRyZWUgYXJnMCwgdHJlZSBhcmcxLAorCQkJCSAgICBjb25z dCB2ZWNfcGVybV9pbmRpY2VzICZzZWwsCisJCQkJICAgIGNvbnN0IGNoYXIgKipyZWFzb24gPSBO VUxMKQoreworICB1bnNpZ25lZCBzZWxfbnBhdHRlcm5zID0gc2VsLmVuY29kaW5nICgpLm5wYXR0 ZXJucyAoKTsKKyAgdW5zaWduZWQgc2VsX25lbHRzX3Blcl9wYXR0ZXJuID0gc2VsLmVuY29kaW5n ICgpLm5lbHRzX3Blcl9wYXR0ZXJuICgpOworCisgIGlmICghKHBvdzJwX2h3aSAoc2VsX25wYXR0 ZXJucykKKwkmJiBwb3cycF9od2kgKFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChhcmcwKSkKKwkmJiBw b3cycF9od2kgKFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChhcmcxKSkpKQorICAgIHsKKyAgICAgIGlm IChyZWFzb24pCisJKnJlYXNvbiA9ICJucGF0dGVybnMgaXMgbm90IHBvd2VyIG9mIDIiOworICAg ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXZSB3YW50IHRvIGF2b2lkIGNhc2VzIHdo ZXJlIHNlbC5sZW5ndGggaXMgbm90IGEgbXVsdGlwbGUgb2YgbnBhdHRlcm5zLgorICAgICBGb3Ig ZWc6IHNlbC5sZW5ndGggPSAyICsgMngsIGFuZCBzZWwgbnBhdHRlcm5zID0gNC4gICovCisgIHBv bHlfdWludDY0IGVzZWw7CisgIGlmICghbXVsdGlwbGVfcCAoc2VsLmxlbmd0aCAoKSwgc2VsX25w YXR0ZXJucywgJmVzZWwpKQorICAgIHsKKyAgICAgIGlmIChyZWFzb24pCisJKnJlYXNvbiA9ICJz ZWwubGVuZ3RoIGlzIG5vdCBtdWx0aXBsZSBvZiBzZWxfbnBhdHRlcm5zIjsKKyAgICAgIHJldHVy biBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHNlbF9uZWx0c19wZXJfcGF0dGVybiA8IDMpCisgICAg cmV0dXJuIHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBwYXR0ZXJuID0gMDsgcGF0dGVybiA8IHNl bF9ucGF0dGVybnM7IHBhdHRlcm4rKykKKyAgICB7CisgICAgICBwb2x5X3VpbnQ2NCBhMSA9IHNl bFtwYXR0ZXJuICsgc2VsX25wYXR0ZXJuc107CisgICAgICBwb2x5X3VpbnQ2NCBhMiA9IHNlbFtw YXR0ZXJuICsgMiAqIHNlbF9ucGF0dGVybnNdOworICAgICAgSE9TVF9XSURFX0lOVCBzdGVwOwor ICAgICAgaWYgKCFwb2x5X2ludDY0IChhMiAtIGExKS5pc19jb25zdGFudCAoJnN0ZXApKQorCXsK KwkgIGlmIChyZWFzb24pCisJICAgICpyZWFzb24gPSAic3RlcCBpcyBub3QgY29uc3RhbnQiOwor CSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIC8vIEZJWE1FOiBQdW50IG9uIHN0ZXAgPCAwIGZv ciBub3csIHJldmlzaXQgbGF0ZXIuCisgICAgICBpZiAoc3RlcCA8IDApCisJcmV0dXJuIGZhbHNl OworICAgICAgaWYgKHN0ZXAgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKCFwb3cycF9o d2kgKHN0ZXApKQorCXsKKwkgIGlmIChyZWFzb24pCisJICAgICpyZWFzb24gPSAic3RlcCBpcyBu b3QgcG93ZXIgb2YgMiI7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICAvKiBFbnN1cmUg dGhhdCBzdGVwcGVkIHNlcXVlbmNlIG9mIHRoZSBwYXR0ZXJuIHNlbGVjdHMgZWxlbWVudHMKKwkg b25seSBmcm9tIHRoZSBzYW1lIGlucHV0IHZlY3Rvci4gICovCisgICAgICB1aW50NjRfdCBxMSwg cWU7CisgICAgICBwb2x5X3VpbnQ2NCByMSwgcmU7CisgICAgICBwb2x5X3VpbnQ2NCBhZSA9IGEx ICsgKGVzZWwgLSAyKSAqIHN0ZXA7CisgICAgICBwb2x5X3VpbnQ2NCBhcmdfbGVuID0gVFlQRV9W RUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkpOworCisgICAgICBpZiAoIShjYW5fZGl2 X3RydW5jX3AgKGExLCBhcmdfbGVuLCAmcTEsICZyMSkKKwkgICAgJiYgY2FuX2Rpdl90cnVuY19w IChhZSwgYXJnX2xlbiwgJnFlLCAmcmUpCisJICAgICYmIHExID09IHFlKSkKKwl7CisJICBpZiAo cmVhc29uKQorCSAgICAqcmVhc29uID0gImNyb3NzZWQgaW5wdXQgdmVjdG9ycyI7CisJICByZXR1 cm4gZmFsc2U7CisJfQorCisgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgc3RlcHBlZCBzZXF1ZW5j ZSBhbHdheXMgc2VsZWN0cyBmcm9tIHRoZSBzYW1lCisJIGlucHV0IHBhdHRlcm4uICAqLworICAg ICAgdW5zaWduZWQgYXJnX25wYXR0ZXJucworCT0gKChxMSAmIDApID09IDApID8gVkVDVE9SX0NT VF9OUEFUVEVSTlMgKGFyZzApCisJCQkgIDogVkVDVE9SX0NTVF9OUEFUVEVSTlMgKGFyZzEpOwor CisgICAgICBpZiAoIW11bHRpcGxlX3AgKHN0ZXAsIGFyZ19ucGF0dGVybnMpKQorCXsKKwkgIGlm IChyZWFzb24pCisJICAgICpyZWFzb24gPSAic3RlcCBpcyBub3QgbXVsdGlwbGUgb2YgbnBhdHRl cm5zIjsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQor CisvKiBUcnkgdG8gZm9sZCBwZXJtdXRhdGlvbiBvZiBBUkcwIGFuZCBBUkcxIHdpdGggU0VMIHNl bGVjdG9yIHdoZW4KKyAgIHRoZSBpbnB1dCB2ZWN0b3JzIGFyZSBWRUNUT1JfQ1NULiBSZXR1cm4g TlVMTF9UUkVFIG90aGVyd2lzZS4KKyAgIFJFQVNPTiBoYXMgc2FtZSBwdXJwb3NlIGFzIGRlc2Ny aWJlZCBpbgorICAgdmFsaWRfbWFza19mb3JfZm9sZF92ZWNfcGVybV9jc3RfcC4gICovCisKK3N0 YXRpYyB0cmVlCitmb2xkX3ZlY19wZXJtX2NzdCAodHJlZSB0eXBlLCB0cmVlIGFyZzAsIHRyZWUg YXJnMSwgY29uc3QgdmVjX3Blcm1faW5kaWNlcyAmc2VsLAorCQkgICBjb25zdCBjaGFyICoqcmVh c29uID0gTlVMTCkKK3sKKyAgdW5zaWduZWQgcmVzX25wYXR0ZXJucywgcmVzX25lbHRzX3Blcl9w YXR0ZXJuOworICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHJlc19uZWx0czsKKworICAvKiAoMSkg SWYgU0VMIGlzIGEgc3VpdGFibGUgbWFzayBhcyBkZXRlcm1pbmVkIGJ5CisgICAgIHZhbGlkX21h c2tfZm9yX2ZvbGRfdmVjX3Blcm1fY3N0X3AsIHRoZW46CisgICAgIHJlc19ucGF0dGVybnMgPSBt YXggb2YgbnBhdHRlcm5zIGJldHdlZW4gQVJHMCwgQVJHMSwgYW5kIFNFTAorICAgICByZXNfbmVs dHNfcGVyX3BhdHRlcm4gPSBtYXggb2YgbmVsdHNfcGVyX3BhdHRlcm4gYmV0d2VlbgorCQkJICAg ICBBUkcwLCBBUkcxIGFuZCBTRUwuCisgICAgICgyKSBJZiBTRUwgaXMgbm90IGEgc3VpdGFibGUg bWFzaywgYW5kIFRZUEUgaXMgVkxTIHRoZW46CisgICAgIHJlc19ucGF0dGVybnMgPSBuZWx0cyBp biByZXN1bHQgdmVjdG9yLgorICAgICByZXNfbmVsdHNfcGVyX3BhdHRlcm4gPSAxLgorICAgICBU aGlzIGV4Y2VwdGlvbiBpcyBtYWRlIHNvIHRoYXQgVkxTIEFSRzAsIEFSRzEgYW5kIFNFTCB3b3Jr IGFzIGJlZm9yZS4gICovCisgIGlmICh2YWxpZF9tYXNrX2Zvcl9mb2xkX3ZlY19wZXJtX2NzdF9w IChhcmcwLCBhcmcxLCBzZWwsIHJlYXNvbikpCisgICAgeworICAgICAgcmVzX25wYXR0ZXJucwor CT0gc3RkOjptYXggKFZFQ1RPUl9DU1RfTlBBVFRFUk5TIChhcmcwKSwKKwkJICAgIHN0ZDo6bWF4 IChWRUNUT1JfQ1NUX05QQVRURVJOUyAoYXJnMSksCisJCQkgICAgICBzZWwuZW5jb2RpbmcgKCku bnBhdHRlcm5zICgpKSk7CisKKyAgICAgIHJlc19uZWx0c19wZXJfcGF0dGVybgorCT0gc3RkOjpt YXggKFZFQ1RPUl9DU1RfTkVMVFNfUEVSX1BBVFRFUk4gKGFyZzApLAorCQkgICAgc3RkOjptYXgg KFZFQ1RPUl9DU1RfTkVMVFNfUEVSX1BBVFRFUk4gKGFyZzEpLAorCQkJICAgICAgc2VsLmVuY29k aW5nICgpLm5lbHRzX3Blcl9wYXR0ZXJuICgpKSk7CisKKyAgICAgIHJlc19uZWx0cyA9IHJlc19u cGF0dGVybnMgKiByZXNfbmVsdHNfcGVyX3BhdHRlcm47CisgICAgfQorICBlbHNlIGlmIChUWVBF X1ZFQ1RPUl9TVUJQQVJUUyAodHlwZSkuaXNfY29uc3RhbnQgKCZyZXNfbmVsdHMpKQorICAgIHsK KyAgICAgIHJlc19ucGF0dGVybnMgPSByZXNfbmVsdHM7CisgICAgICByZXNfbmVsdHNfcGVyX3Bh dHRlcm4gPSAxOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMX1RSRUU7CisKKyAgdHJl ZV92ZWN0b3JfYnVpbGRlciBvdXRfZWx0cyAodHlwZSwgcmVzX25wYXR0ZXJucywgcmVzX25lbHRz X3Blcl9wYXR0ZXJuKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc19uZWx0czsgaSsr KQorICAgIHsKKyAgICAgIHBvbHlfdWludDY0IGxlbiA9IFRZUEVfVkVDVE9SX1NVQlBBUlRTIChU UkVFX1RZUEUgKGFyZzApKTsKKyAgICAgIHVpbnQ2NF90IHE7CisgICAgICBwb2x5X3VpbnQ2NCBy OworICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBpbmRleDsKKworICAgICAgLyogUHVudCBp ZiBzZWxbaV0gL3RydW5jX2RpdiBsZW4gY2Fubm90IGJlIGRldGVybWluZWQsCisJIGJlY2F1c2Ug dGhlIGlucHV0IHZlY3RvciB0byBiZSBjaG9zZW4gd2lsbCBkZXBlbmQgb24KKwkgcnVudGltZSB2 ZWN0b3IgbGVuZ3RoLgorCSBGb3IgZXhhbXBsZSBpZiBsZW4gPT0gNCArIDR4LCBhbmQgc2VsW2ld ID09IDQsCisJIElmIGxlbiBhdCBydW50aW1lIGVxdWFscyA0LCB3ZSBjaG9vc2UgYXJnMVswXS4K KwkgRm9yIGFueSBvdGhlciB2YWx1ZSBvZiBsZW4gPiA0IGF0IHJ1bnRpbWUsIHdlIGNob29zZSBh cmcwWzRdLgorCSB3aGljaCBtYWtlcyB0aGUgZWxlbWVudCBjaG9pY2UgZGVwZW5kZW50IG9uIHJ1 bnRpbWUgdmVjdG9yIGxlbmd0aC4gICovCisgICAgICBpZiAoIWNhbl9kaXZfdHJ1bmNfcCAoc2Vs W2ldLCBsZW4sICZxLCAmcikpCisJeworCSAgaWYgKHJlYXNvbikKKwkgICAgKnJlYXNvbiA9ICJj YW5ub3QgZGl2aWRlIHNlbGVjdG9yIGVsZW1lbnQgYnkgYXJnIGxlbiI7CisJICByZXR1cm4gTlVM TF9UUkVFOworCX0KKworICAgICAgLyogc2VsW2ldICUgbGVuIHdpbGwgZ2l2ZSB0aGUgaW5kZXgg b2YgZWxlbWVudCBpbiB0aGUgY2hvc2VuIGlucHV0CisJIHZlY3Rvci4gRm9yIGV4YW1wbGUgaWYg c2VsW2ldID09IDUgKyA0eCBhbmQgbGVuID09IDQgKyA0eCwKKwkgd2Ugd2lsbCBjaG9vc2UgYXJn MVsxXSBzaW5jZSAoNSArIDR4KSAlICg0ICsgNHgpID09IDEuICAqLworICAgICAgaWYgKCFyLmlz X2NvbnN0YW50ICgmaW5kZXgpKQorCXsKKwkgIGlmIChyZWFzb24pCisJICAgICpyZWFzb24gPSAi cmVtYWluZGVyIGlzIG5vdCBjb25zdGFudCI7CisJICByZXR1cm4gTlVMTF9UUkVFOworCX0KKwor ICAgICAgdHJlZSBhcmcgPSAoKHEgJiAxKSA9PSAwKSA/IGFyZzAgOiBhcmcxOworICAgICAgdHJl ZSBlbGVtID0gdmVjdG9yX2NzdF9lbHQgKGFyZywgaW5kZXgpOworICAgICAgb3V0X2VsdHMucXVp Y2tfcHVzaCAoZWxlbSk7CisgICAgfQorCisgIHJldHVybiBvdXRfZWx0cy5idWlsZCAoKTsKK30K KwogLyogQXR0ZW1wdCB0byBmb2xkIHZlY3RvciBwZXJtdXRhdGlvbiBvZiBBUkcwIGFuZCBBUkcx IHZlY3RvcnMgdXNpbmcgU0VMCiAgICBzZWxlY3Rvci4gIFJldHVybiB0aGUgZm9sZGVkIFZFQ1RP Ul9DU1Qgb3IgQ09OU1RSVUNUT1IgaWYgc3VjY2Vzc2Z1bCwKICAgIE5VTExfVFJFRSBvdGhlcndp c2UuICAqLwpAQCAtMTA1MjksNDMgKzEwNjk5LDQxIEBAIGZvbGRfdmVjX3Blcm0gKHRyZWUgdHlw ZSwgdHJlZSBhcmcwLCB0cmVlIGFyZzEsIGNvbnN0IHZlY19wZXJtX2luZGljZXMgJnNlbCkKIHsK ICAgdW5zaWduZWQgaW50IGk7CiAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbmVsdHM7Ci0gIGJv b2wgbmVlZF9jdG9yID0gZmFsc2U7CiAKLSAgaWYgKCFzZWwubGVuZ3RoICgpLmlzX2NvbnN0YW50 ICgmbmVsdHMpKQotICAgIHJldHVybiBOVUxMX1RSRUU7Ci0gIGdjY19hc3NlcnQgKGtub3duX2Vx IChUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAodHlwZSksIG5lbHRzKQotCSAgICAgICYmIGtub3duX2Vx IChUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSksIG5lbHRzKQotCSAgICAg ICYmIGtub3duX2VxIChUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcxKSksIG5l bHRzKSk7CisgIGdjY19hc3NlcnQgKGtub3duX2VxIChUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAodHlw ZSksIHNlbC5sZW5ndGggKCkpCisJICAgICAgJiYga25vd25fZXEgKFRZUEVfVkVDVE9SX1NVQlBB UlRTIChUUkVFX1RZUEUgKGFyZzApKSwKKwkJCSAgIFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVF X1RZUEUgKGFyZzEpKSkpOworCiAgIGlmIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAoYXJnMCkpICE9 IFRSRUVfVFlQRSAodHlwZSkKICAgICAgIHx8IFRSRUVfVFlQRSAoVFJFRV9UWVBFIChhcmcxKSkg IT0gVFJFRV9UWVBFICh0eXBlKSkKICAgICByZXR1cm4gTlVMTF9UUkVFOwogCisgIGlmIChUUkVF X0NPREUgKGFyZzApID09IFZFQ1RPUl9DU1QKKyAgICAgICYmIFRSRUVfQ09ERSAoYXJnMSkgPT0g VkVDVE9SX0NTVCkKKyAgICByZXR1cm4gZm9sZF92ZWNfcGVybV9jc3QgKHR5cGUsIGFyZzAsIGFy ZzEsIHNlbCk7CisKKyAgLyogRm9yIGZhbGwgYmFjayBjYXNlLCB3ZSB3YW50IHRvIGVuc3VyZSB3 ZSBoYXZlIFZMUyB2ZWN0b3JzCisgICAgIHdpdGggZXF1YWwgbGVuZ3RoLiAgKi8KKyAgaWYgKCFz ZWwubGVuZ3RoICgpLmlzX2NvbnN0YW50ICgmbmVsdHMpKQorICAgIHJldHVybiBOVUxMX1RSRUU7 CisKKyAgZ2NjX2Fzc2VydCAoa25vd25fZXEgKHNlbC5sZW5ndGggKCksCisJCQlUWVBFX1ZFQ1RP Ul9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSkpKTsKICAgdHJlZSAqaW5fZWx0cyA9IFhBTExP Q0FWRUMgKHRyZWUsIG5lbHRzICogMik7CiAgIGlmICghdmVjX2NzdF9jdG9yX3RvX2FycmF5IChh cmcwLCBuZWx0cywgaW5fZWx0cykKICAgICAgIHx8ICF2ZWNfY3N0X2N0b3JfdG9fYXJyYXkgKGFy ZzEsIG5lbHRzLCBpbl9lbHRzICsgbmVsdHMpKQogICAgIHJldHVybiBOVUxMX1RSRUU7CiAKLSAg dHJlZV92ZWN0b3JfYnVpbGRlciBvdXRfZWx0cyAodHlwZSwgbmVsdHMsIDEpOworICB2ZWM8Y29u c3RydWN0b3JfZWx0LCB2YV9nYz4gKnY7CisgIHZlY19hbGxvYyAodiwgbmVsdHMpOwogICBmb3Ig KGkgPSAwOyBpIDwgbmVsdHM7IGkrKykKICAgICB7CiAgICAgICBIT1NUX1dJREVfSU5UIGluZGV4 OwogICAgICAgaWYgKCFzZWxbaV0uaXNfY29uc3RhbnQgKCZpbmRleCkpCiAJcmV0dXJuIE5VTExf VFJFRTsKLSAgICAgIGlmICghQ09OU1RBTlRfQ0xBU1NfUCAoaW5fZWx0c1tpbmRleF0pKQotCW5l ZWRfY3RvciA9IHRydWU7Ci0gICAgICBvdXRfZWx0cy5xdWlja19wdXNoICh1bnNoYXJlX2V4cHIg KGluX2VsdHNbaW5kZXhdKSk7CisgICAgICBDT05TVFJVQ1RPUl9BUFBFTkRfRUxUICh2LCBOVUxM X1RSRUUsIGluX2VsdHNbaW5kZXhdKTsKICAgICB9Ci0KLSAgaWYgKG5lZWRfY3RvcikKLSAgICB7 Ci0gICAgICB2ZWM8Y29uc3RydWN0b3JfZWx0LCB2YV9nYz4gKnY7Ci0gICAgICB2ZWNfYWxsb2Mg KHYsIG5lbHRzKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuZWx0czsgaSsrKQotCUNPTlNUUlVD VE9SX0FQUEVORF9FTFQgKHYsIE5VTExfVFJFRSwgb3V0X2VsdHNbaV0pOwotICAgICAgcmV0dXJu IGJ1aWxkX2NvbnN0cnVjdG9yICh0eXBlLCB2KTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4g b3V0X2VsdHMuYnVpbGQgKCk7CisgIHJldHVybiBidWlsZF9jb25zdHJ1Y3RvciAodHlwZSwgdik7 CiB9CiAKIC8qIFRyeSB0byBmb2xkIGEgcG9pbnRlciBkaWZmZXJlbmNlIG9mIHR5cGUgVFlQRSB0 d28gYWRkcmVzcyBleHByZXNzaW9ucyBvZgpAQCAtMTY4OTIsNiArMTcwNjAsNTg4IEBAIHRlc3Rf YXJpdGhtZXRpY19mb2xkaW5nICgpCiAJCQkJICAgeCk7CiB9CiAKK25hbWVzcGFjZSB0ZXN0X2Zv bGRfdmVjX3Blcm1fY3N0IHsKKworLyogQnVpbGQgYSBWRUNUT1JfQ1NUIGNvcnJlc3BvbmRpbmcg dG8gVk1PREUsIGFuZCBoYXMKKyAgIGVuY29kaW5nIGdpdmVuIGJ5IE5QQVRURVJOUywgTkVMVFNf UEVSX1BBVFRFUk4gYW5kIFNURVAuCisgICBGaWxsIGl0IHdpdGggcmFuZG9taXplZCBlbGVtZW50 cywgdXNpbmcgcmFuZCgpICUgVEhSRVNIT0xELiAgKi8KKworc3RhdGljIHRyZWUKK2J1aWxkX3Zl Y19jc3RfcmFuZCAobWFjaGluZV9tb2RlIHZtb2RlLCB1bnNpZ25lZCBucGF0dGVybnMsCisJCSAg ICB1bnNpZ25lZCBuZWx0c19wZXJfcGF0dGVybiwKKwkJICAgIGludCBzdGVwID0gMCwgaW50IHRo cmVzaG9sZCA9IDEwMCkKK3sKKyAgdHJlZSBpbm5lcl90eXBlID0gbGFuZ19ob29rcy50eXBlcy50 eXBlX2Zvcl9tb2RlIChHRVRfTU9ERV9JTk5FUiAodm1vZGUpLCAxKTsKKyAgdHJlZSB2ZWN0eXBl ID0gYnVpbGRfdmVjdG9yX3R5cGVfZm9yX21vZGUgKGlubmVyX3R5cGUsIHZtb2RlKTsKKyAgdHJl ZV92ZWN0b3JfYnVpbGRlciBidWlsZGVyICh2ZWN0eXBlLCBucGF0dGVybnMsIG5lbHRzX3Blcl9w YXR0ZXJuKTsKKworICAvLyBGaWxsIGEwIGZvciBlYWNoIHBhdHRlcm4KKyAgZm9yICh1bnNpZ25l ZCBpID0gMDsgaSA8IG5wYXR0ZXJuczsgaSsrKQorICAgIGJ1aWxkZXIucXVpY2tfcHVzaCAoYnVp bGRfaW50X2NzdCAoaW5uZXJfdHlwZSwgcmFuZCAoKSAlIHRocmVzaG9sZCkpOworCisgIGlmIChu ZWx0c19wZXJfcGF0dGVybiA9PSAxKQorICAgIHJldHVybiBidWlsZGVyLmJ1aWxkICgpOworCisg IC8vIEZpbGwgYTEgZm9yIGVhY2ggcGF0dGVybgorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg bnBhdHRlcm5zOyBpKyspCisgICAgYnVpbGRlci5xdWlja19wdXNoIChidWlsZF9pbnRfY3N0IChp bm5lcl90eXBlLCByYW5kICgpICUgdGhyZXNob2xkKSk7CisKKyAgaWYgKG5lbHRzX3Blcl9wYXR0 ZXJuID09IDIpCisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQgKCk7CisKKyAgZm9yICh1bnNpZ25l ZCBpID0gbnBhdHRlcm5zICogMjsgaSA8IG5wYXR0ZXJucyAqIG5lbHRzX3Blcl9wYXR0ZXJuOyBp KyspCisgICAgeworICAgICAgdHJlZSBwcmV2X2VsZW0gPSBidWlsZGVyW2kgLSBucGF0dGVybnNd OworICAgICAgaW50IHByZXZfZWxlbV92YWwgPSBUUkVFX0lOVF9DU1RfTE9XIChwcmV2X2VsZW0p OworICAgICAgaW50IHZhbCA9IHByZXZfZWxlbV92YWwgKyBzdGVwOworICAgICAgYnVpbGRlci5x dWlja19wdXNoIChidWlsZF9pbnRfY3N0IChpbm5lcl90eXBlLCB2YWwpKTsKKyAgICB9CisKKyAg cmV0dXJuIGJ1aWxkZXIuYnVpbGQgKCk7Cit9CisKKy8qIFZhbGlkYXRlIHJlc3VsdCBvZiBWRUNf UEVSTV9FWFBSIGZvbGRpbmcgZm9yIHRoZSB1bml0LXRlc3RzIGJlbG93LAorICAgd2hlbiByZXN1 bHQgaXMgVkxBLiAgKi8KKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX3JlcyAodW5zaWduZWQgbnBh dHRlcm5zLCB1bnNpZ25lZCBuZWx0c19wZXJfcGF0dGVybiwKKwkgICAgICB0cmVlIHJlcywgdHJl ZSAqZXhwZWN0ZWRfcmVzKQoreworICAvKiBBY3R1YWwgbnBhdHRlcm5zIGFuZCBlbmNvZGVkX2Vs dHMgaW4gcmVzIG1heSBiZSBsZXNzIHRoYW4gZXhwZWN0ZWQgZHVlCisgICAgIHRvIGNhbm9uaWNh bGl6YXRpb24uICAqLworICBBU1NFUlRfVFJVRSAocmVzICE9IE5VTExfVFJFRSk7CisgIEFTU0VS VF9UUlVFIChWRUNUT1JfQ1NUX05QQVRURVJOUyAocmVzKSA8PSBucGF0dGVybnMpOworICBBU1NF UlRfVFJVRSAodmVjdG9yX2NzdF9lbmNvZGVkX25lbHRzIChyZXMpIDw9IG5wYXR0ZXJucyAqIG5l bHRzX3Blcl9wYXR0ZXJuKTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnBhdHRlcm5z ICogbmVsdHNfcGVyX3BhdHRlcm47IGkrKykKKyAgICBBU1NFUlRfVFJVRSAob3BlcmFuZF9lcXVh bF9wIChWRUNUT1JfQ1NUX0VMVCAocmVzLCBpKSwgZXhwZWN0ZWRfcmVzW2ldLCAwKSk7Cit9CisK Ky8qIFZhbGlkYXRlIHJlc3VsdCBvZiBWRUNfUEVSTV9FWFBSIGZvbGRpbmcgZm9yIHRoZSB1bml0 LXRlc3RzIGJlbG93LAorICAgd2hlbiB0aGUgcmVzdWx0IGlzIFZMUy4gICovCisKK3N0YXRpYyB2 b2lkCit2YWxpZGF0ZV9yZXNfdmxzICh0cmVlIHJlcywgdHJlZSAqZXhwZWN0ZWRfcmVzLCB1bnNp Z25lZCBleHBlY3RlZF9uZWx0cykKK3sKKyAgQVNTRVJUX1RSVUUgKGtub3duX2VxIChWRUNUT1Jf Q1NUX05FTFRTIChyZXMpLCBleHBlY3RlZF9uZWx0cykpOworICBmb3IgKHVuc2lnbmVkIGkgPSAw OyBpIDwgZXhwZWN0ZWRfbmVsdHM7IGkrKykKKyAgICBBU1NFUlRfVFJVRSAob3BlcmFuZF9lcXVh bF9wIChWRUNUT1JfQ1NUX0VMVCAocmVzLCBpKSwgZXhwZWN0ZWRfcmVzW2ldLCAwKSk7Cit9CisK Ky8qIEhlbHBlciByb3V0aW5lIHRvIHB1c2ggbXVsdGlwbGUgZWxlbWVudHMgaW50byBCVUlMREVS LiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkZXJfcHVzaF9lbGVtcyAodmVjX3Blcm1fYnVpbGRl ciYgYnVpbGRlciwgcG9seV91aW50NjQgKmVsZW1zKQoreworICBmb3IgKHVuc2lnbmVkIGkgPSAw OyBpIDwgYnVpbGRlci5lbmNvZGVkX25lbHRzICgpOyBpKyspCisgICAgYnVpbGRlci5xdWlja19w dXNoIChlbGVtc1tpXSk7Cit9CisKKyNkZWZpbmUgQVJHMChpbmRleCkgdmVjdG9yX2NzdF9lbHQg KGFyZzAsIGluZGV4KQorI2RlZmluZSBBUkcxKGluZGV4KSB2ZWN0b3JfY3N0X2VsdCAoYXJnMSwg aW5kZXgpCisKKy8qIFRlc3QgY2FzZXMgd2hlcmUgcmVzdWx0IGlzIFZOeDRTSSBhbmQgaW5wdXQg dmVjdG9ycyBhcmUgVjRTSS4gICovCisKK3N0YXRpYyB2b2lkCit0ZXN0X3ZueDRzaV92NHNpICht YWNoaW5lX21vZGUgdm54NHNpX21vZGUsIG1hY2hpbmVfbW9kZSB2NHNpX21vZGUpCit7CisgIGZv ciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICB7CisgICAgICAvKiBDYXNlIDE6CisJIHNl bCA9IHsgMCwgNCwgMSwgNSwgLi4uIH0KKwkgcmVzID0geyBhcmdbMF0sIGFyZzFbMF0sIGFyZzBb MV0sIGFyZzFbMV0sIC4uLn0gLy8gKDQsIDEpICAqLworICAgICAgeworCXRyZWUgYXJnMCA9IGJ1 aWxkX3ZlY19jc3RfcmFuZCAodjRzaV9tb2RlLCA0LCAxLCAwKTsKKwl0cmVlIGFyZzEgPSBidWls ZF92ZWNfY3N0X3JhbmQgKHY0c2lfbW9kZSwgNCwgMSwgMCk7CisKKwl0cmVlIGlubmVyX3R5cGUK KwkgID0gbGFuZ19ob29rcy50eXBlcy50eXBlX2Zvcl9tb2RlIChHRVRfTU9ERV9JTk5FUiAodm54 NHNpX21vZGUpLCAxKTsKKwl0cmVlIHJlc190eXBlID0gYnVpbGRfdmVjdG9yX3R5cGVfZm9yX21v ZGUgKGlubmVyX3R5cGUsIHZueDRzaV9tb2RlKTsKKworCXBvbHlfdWludDY0IHJlc19sZW4gPSBU WVBFX1ZFQ1RPUl9TVUJQQVJUUyAocmVzX3R5cGUpOworCXZlY19wZXJtX2J1aWxkZXIgYnVpbGRl ciAocmVzX2xlbiwgNCwgMSk7CisJcG9seV91aW50NjQgbWFza19lbGVtc1tdID0geyAwLCA0LCAx LCA1IH07CisJYnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2VsZW1zKTsKKworCXZl Y19wZXJtX2luZGljZXMgc2VsIChidWlsZGVyLCAyLCByZXNfbGVuKTsKKwl0cmVlIHJlcyA9IGZv bGRfdmVjX3Blcm1fY3N0IChyZXNfdHlwZSwgYXJnMCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhw ZWN0ZWRfcmVzW10gPSB7IEFSRzAoMCksIEFSRzEoMCksIEFSRzAoMSksIEFSRzEoMSkgfTsKKwl2 YWxpZGF0ZV9yZXMgKDQsIDEsIHJlcywgZXhwZWN0ZWRfcmVzKTsKKyAgICAgIH0KKworICAgICAg LyogQ2FzZSAyOiBTYW1lIGFzIGNhc2UgMSwgYnV0IGNvbnRhaW5zIGFuIG91dCBvZiBib3VuZHMg YWNjZXNzIHdoaWNoCisJIHNob3VsZCB3cmFwIGFyb3VuZC4KKwkgc2VsID0gezAsIDgsIDQsIDEy LCAuLi59ICg0LCAxKQorCSByZXMgPSB7IGFyZzBbMF0sIGFyZzBbMF0sIGFyZzFbMF0sIGFyZzFb MF0sIC4uLiB9ICg0LCAxKS4gICovCisgICAgICB7CisJdHJlZSBhcmcwID0gYnVpbGRfdmVjX2Nz dF9yYW5kICh2NHNpX21vZGUsIDQsIDEsIDApOworCXRyZWUgYXJnMSA9IGJ1aWxkX3ZlY19jc3Rf cmFuZCAodjRzaV9tb2RlLCA0LCAxLCAwKTsKKworCXRyZWUgaW5uZXJfdHlwZQorCSAgPSBsYW5n X2hvb2tzLnR5cGVzLnR5cGVfZm9yX21vZGUgKEdFVF9NT0RFX0lOTkVSICh2bng0c2lfbW9kZSks IDEpOworCXRyZWUgcmVzX3R5cGUgPSBidWlsZF92ZWN0b3JfdHlwZV9mb3JfbW9kZSAoaW5uZXJf dHlwZSwgdm54NHNpX21vZGUpOworCisJcG9seV91aW50NjQgcmVzX2xlbiA9IFRZUEVfVkVDVE9S X1NVQlBBUlRTIChyZXNfdHlwZSk7CisJdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyIChyZXNfbGVu LCA0LCAxKTsKKwlwb2x5X3VpbnQ2NCBtYXNrX2VsZW1zW10gPSB7IDAsIDgsIDQsIDEyIH07CisJ YnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2VsZW1zKTsKKworCXZlY19wZXJtX2lu ZGljZXMgc2VsIChidWlsZGVyLCAyLCByZXNfbGVuKTsKKwl0cmVlIHJlcyA9IGZvbGRfdmVjX3Bl cm1fY3N0IChyZXNfdHlwZSwgYXJnMCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhwZWN0ZWRfcmVz W10gPSB7IEFSRzAoMCksIEFSRzAoMCksIEFSRzEoMCksIEFSRzEoMCkgfTsKKwl2YWxpZGF0ZV9y ZXMgKDQsIDEsIHJlcywgZXhwZWN0ZWRfcmVzKTsKKyAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRl c3QgY2FzZXMgd2hlcmUgcmVzdWx0IGlzIFY0U0kgYW5kIGlucHV0IHZlY3RvcnMgYXJlIFZOeDRT SS4gICovCisKK3N0YXRpYyB2b2lkCit0ZXN0X3Y0c2lfdm54NHNpIChtYWNoaW5lX21vZGUgdjRz aV9tb2RlLCBtYWNoaW5lX21vZGUgdm54NHNpX21vZGUpCit7CisgIGZvciAoaW50IGkgPSAwOyBp IDwgMTA7IGkrKykKKyAgICB7CisgICAgICAvKiBDYXNlIDE6CisJIHNlbCA9IHsgMCwgMSwgMiwg M30KKwkgcmVzID0geyBhcmcwWzBdLCBhcmcwWzFdLCBhcmcwWzJdLCBhcmcwWzNdIH0uICAqLwor ICAgICAgeworCXRyZWUgYXJnMCA9IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm54NHNpX21vZGUsIDQs IDEpOworCXRyZWUgYXJnMSA9IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm54NHNpX21vZGUsIDQsIDEp OworCisJdHJlZSBpbm5lcl90eXBlCisJICA9IGxhbmdfaG9va3MudHlwZXMudHlwZV9mb3JfbW9k ZSAoR0VUX01PREVfSU5ORVIgKHY0c2lfbW9kZSksIDEpOworCXRyZWUgcmVzX3R5cGUgPSBidWls ZF92ZWN0b3JfdHlwZV9mb3JfbW9kZSAoaW5uZXJfdHlwZSwgdjRzaV9tb2RlKTsKKworCXBvbHlf dWludDY0IHJlc19sZW4gPSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAocmVzX3R5cGUpOworCXZlY19w ZXJtX2J1aWxkZXIgYnVpbGRlciAocmVzX2xlbiwgNCwgMSk7CisJcG9seV91aW50NjQgbWFza19l bGVtc1tdID0gezAsIDEsIDIsIDN9OworCWJ1aWxkZXJfcHVzaF9lbGVtcyAoYnVpbGRlciwgbWFz a19lbGVtcyk7CisKKwl2ZWNfcGVybV9pbmRpY2VzIHNlbCAoYnVpbGRlciwgMiwgcmVzX2xlbik7 CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAocmVzX3R5cGUsIGFyZzAsIGFyZzEsIHNl bCk7CisKKwl0cmVlIGV4cGVjdGVkX3Jlc1tdID0geyBBUkcwKDApLCBBUkcwKDEpLCBBUkcwKDIp LCBBUkcwKDMpIH07CisJdmFsaWRhdGVfcmVzX3ZscyAocmVzLCBleHBlY3RlZF9yZXMsIDQpOwor ICAgICAgfQorCisgICAgICAvKiBDYXNlIDI6IFNhbWUgYXMgQ2FzZSAxLCBidXQgY3Jvc3Npbmcg aW5wdXQgdmVjdG9yLgorCSBzZWwgPSB7MCwgMiwgNCwgNn0KKwkgSW4gdGhpcyBjYXNlLHRoZSBp bmRleCA0IGlzIGFtYmlndW91cyBzaW5jZSBsZW4gPSA0ICsgNHguCisJIFNpbmNlIHdlIGNhbm5v dCBkZXRlcm1pbmUsIHdoaWNoIHZlY3RvciB0byBjaG9vc2UgZnJvbSBkdXJpbmcKKwkgY29tcGls ZSB0aW1lLCBzaG91bGQgcmV0dXJuIE5VTExfVFJFRS4gICovCisgICAgICB7CisJdHJlZSBhcmcw ID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bng0c2lfbW9kZSwgNCwgMSk7CisJdHJlZSBhcmcxID0g YnVpbGRfdmVjX2NzdF9yYW5kICh2bng0c2lfbW9kZSwgNCwgMSk7CisKKwl0cmVlIGlubmVyX3R5 cGUKKwkgID0gbGFuZ19ob29rcy50eXBlcy50eXBlX2Zvcl9tb2RlIChHRVRfTU9ERV9JTk5FUiAo djRzaV9tb2RlKSwgMSk7CisJdHJlZSByZXNfdHlwZSA9IGJ1aWxkX3ZlY3Rvcl90eXBlX2Zvcl9t b2RlIChpbm5lcl90eXBlLCB2NHNpX21vZGUpOworCisJcG9seV91aW50NjQgcmVzX2xlbiA9IFRZ UEVfVkVDVE9SX1NVQlBBUlRTIChyZXNfdHlwZSk7CisJdmVjX3Blcm1fYnVpbGRlciBidWlsZGVy IChyZXNfbGVuLCA0LCAxKTsKKwlwb2x5X3VpbnQ2NCBtYXNrX2VsZW1zW10gPSB7MCwgMiwgNCwg Nn07CisJYnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2VsZW1zKTsKKworCXZlY19w ZXJtX2luZGljZXMgc2VsIChidWlsZGVyLCAyLCByZXNfbGVuKTsKKwljb25zdCBjaGFyICpyZWFz b247CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAocmVzX3R5cGUsIGFyZzAsIGFyZzEs IHNlbCwgJnJlYXNvbik7CisKKwlBU1NFUlRfVFJVRSAocmVzID09IE5VTExfVFJFRSk7CisJQVNT RVJUX1RSVUUgKCFzdHJjbXAgKHJlYXNvbiwgImNhbm5vdCBkaXZpZGUgc2VsZWN0b3IgZWxlbWVu dCBieSBhcmcgbGVuIikpOworICAgICAgfQorICAgIH0KK30KKworLyogVGVzdCBhbGwgaW5wdXQg dmVjdG9ycy4gICovCisKK3N0YXRpYyB2b2lkCit0ZXN0X2FsbF9udW5pdHMgKG1hY2hpbmVfbW9k ZSB2bW9kZSkKK3sKKyAgLyogVGVzdCB3aXRoIDEwIGRpZmZlcmVudCBpbnB1dHMuICAqLworICBm b3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCisgICAgeworICAgICAgdHJlZSBhcmcwID0gYnVp bGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMSk7CisgICAgICB0cmVlIGFyZzEgPSBidWls ZF92ZWNfY3N0X3JhbmQgKHZtb2RlLCAxLCAzLCAxKTsKKyAgICAgIHBvbHlfdWludDY0IGxlbiA9 IFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVFX1RZUEUgKGFyZzApKTsKKworICAgICAgLyogQ2Fz ZSAxOiBtYXNrID0gezAsIC4uLn0gLy8gKDEsIDEpCisJIHJlcyA9IHsgYXJnMFswXSwgLi4uIH0g Ly8gKDEsIDEpICAqLworICAgICAgeworCXZlY19wZXJtX2J1aWxkZXIgYnVpbGRlciAobGVuLCAx LCAxKTsKKwlidWlsZGVyLnF1aWNrX3B1c2ggKDApOworCXZlY19wZXJtX2luZGljZXMgc2VsIChi dWlsZGVyLCAyLCBsZW4pOworCXRyZWUgcmVzID0gZm9sZF92ZWNfcGVybV9jc3QgKFRSRUVfVFlQ RSAoYXJnMCksIGFyZzAsIGFyZzEsIHNlbCk7CisJdHJlZSBleHBlY3RlZF9yZXNbXSA9IHsgQVJH MCgwKSB9OworCXZhbGlkYXRlX3JlcyAoMSwgMSwgcmVzLCBleHBlY3RlZF9yZXMpOworICAgICAg fQorCisgICAgICAvKiBDYXNlIDI6IG1hc2sgPSB7bGVuLCAuLi59IC8vICgxLCAxKQorCSByZXMg PSB7IGFyZzFbMF0sIC4uLiB9IC8vICgxLCAxKSAgKi8KKyAgICAgIHsKKwl2ZWNfcGVybV9idWls ZGVyIGJ1aWxkZXIgKGxlbiwgMSwgMSk7CisJYnVpbGRlci5xdWlja19wdXNoIChsZW4pOworCXZl Y19wZXJtX2luZGljZXMgc2VsIChidWlsZGVyLCAyLCBsZW4pOworCXRyZWUgcmVzID0gZm9sZF92 ZWNfcGVybV9jc3QgKFRSRUVfVFlQRSAoYXJnMCksIGFyZzAsIGFyZzEsIHNlbCk7CisKKwl0cmVl IGV4cGVjdGVkX3Jlc1tdID0geyBBUkcxKDApIH07CisJdmFsaWRhdGVfcmVzICgxLCAxLCByZXMs IGV4cGVjdGVkX3Jlcyk7CisgICAgICB9CisKKyAgICAgIC8qIENhc2UgMzogbWFzayA9IHtsZW4s IDAsIDEsIC4uLn0gLy8gKDEsIDMpCisJIFRlc3QgdGhhdCBzdGVwcGVkIHNlcXVlbmNlIG9mIHRo ZSBwYXR0ZXJuIHNlbGVjdHMgZnJvbSBhcmcwLgorCSByZXMgPSB7IGFyZzFbMF0sIGFyZzBbMF0s IGFyZzBbMV0sIC4uLiB9IC8vICgxLCAzKSAgKi8KKyAgICAgIHsKKwl0cmVlIGFyZzAgPSBidWls ZF92ZWNfY3N0X3JhbmQgKHZtb2RlLCAxLCAzLCAxKTsKKwl0cmVlIGFyZzEgPSBidWlsZF92ZWNf Y3N0X3JhbmQgKHZtb2RlLCAxLCAzLCAxKTsKKwlwb2x5X3VpbnQ2NCBsZW4gPSBUWVBFX1ZFQ1RP Ul9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSk7CisKKwl2ZWNfcGVybV9idWlsZGVyIGJ1aWxk ZXIgKGxlbiwgMSwgMyk7CisJcG9seV91aW50NjQgbWFza19lbGVtc1tdID0geyBsZW4sIDAsIDEg fTsKKwlidWlsZGVyX3B1c2hfZWxlbXMgKGJ1aWxkZXIsIG1hc2tfZWxlbXMpOworCisJdmVjX3Bl cm1faW5kaWNlcyBzZWwgKGJ1aWxkZXIsIDIsIGxlbik7CisJdHJlZSByZXMgPSBmb2xkX3ZlY19w ZXJtX2NzdCAoVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhw ZWN0ZWRfcmVzW10gPSB7IEFSRzEoMCksIEFSRzAoMCksIEFSRzAoMSkgfTsKKwl2YWxpZGF0ZV9y ZXMgKDEsIDMsIHJlcywgZXhwZWN0ZWRfcmVzKTsKKyAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRl c3QgYWxsIHZlY3RvcnMgd2hpY2ggY29udGFpbiBhdC1sZWFzdCAyIGVsZW1lbnRzLiAgKi8KKwor c3RhdGljIHZvaWQKK3Rlc3RfbnVuaXRzX21pbl8yIChtYWNoaW5lX21vZGUgdm1vZGUpCit7Cisg IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICB7CisgICAgICAvKiBDYXNlIDE6IG1h c2sgPSB7IDAsIGxlbiwgLi4uIH0gIC8vICgyLCAxKQorCSByZXMgPSB7IGFyZzBbMF0sIGFyZzFb MF0sIC4uLiB9IC8vICgyLCAxKSAgKi8KKyAgICAgIHsKKwl0cmVlIGFyZzAgPSBidWlsZF92ZWNf Y3N0X3JhbmQgKHZtb2RlLCAxLCAzLCAxKTsKKwl0cmVlIGFyZzEgPSBidWlsZF92ZWNfY3N0X3Jh bmQgKHZtb2RlLCAxLCAzLCAxKTsKKwlwb2x5X3VpbnQ2NCBsZW4gPSBUWVBFX1ZFQ1RPUl9TVUJQ QVJUUyAoVFJFRV9UWVBFIChhcmcwKSk7CisKKwl2ZWNfcGVybV9idWlsZGVyIGJ1aWxkZXIgKGxl biwgMiwgMSk7CisJcG9seV91aW50NjQgbWFza19lbGVtc1tdID0geyAwLCBsZW4gfTsKKwlidWls ZGVyX3B1c2hfZWxlbXMgKGJ1aWxkZXIsIG1hc2tfZWxlbXMpOworCisJdmVjX3Blcm1faW5kaWNl cyBzZWwgKGJ1aWxkZXIsIDIsIGxlbik7CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAo VFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhwZWN0ZWRfcmVz W10gPSB7IEFSRzAoMCksIEFSRzEoMCkgfTsKKwl2YWxpZGF0ZV9yZXMgKDIsIDEsIHJlcywgZXhw ZWN0ZWRfcmVzKTsKKyAgICAgIH0KKworICAgICAgLyogQ2FzZSAyOiBtYXNrID0geyAwLCBsZW4s IDEsIGxlbisxLCAuLi4gfSAvLyAoMiwgMikKKwkgcmVzID0geyBhcmcwWzBdLCBhcmcxWzBdLCBh cmcwWzFdLCBhcmcxWzFdLCAuLi4gfSAvLyAoMiwgMikgICovCisgICAgICB7CisJdHJlZSBhcmcw ID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMSk7CisJdHJlZSBhcmcxID0gYnVp bGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMSk7CisJcG9seV91aW50NjQgbGVuID0gVFlQ RV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkpOworCisJdmVjX3Blcm1fYnVpbGRl ciBidWlsZGVyIChsZW4sIDIsIDIpOworCXBvbHlfdWludDY0IG1hc2tfZWxlbXNbXSA9IHsgMCwg bGVuLCAxLCBsZW4gKyAxIH07CisJYnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2Vs ZW1zKTsKKworCXZlY19wZXJtX2luZGljZXMgc2VsIChidWlsZGVyLCAyLCBsZW4pOworCXRyZWUg cmVzID0gZm9sZF92ZWNfcGVybV9jc3QgKFRSRUVfVFlQRSAoYXJnMCksIGFyZzAsIGFyZzEsIHNl bCk7CisKKwl0cmVlIGV4cGVjdGVkX3Jlc1tdID0geyBBUkcwKDApLCBBUkcxKDApLCBBUkcwKDEp LCBBUkcxKDEpIH07CisJdmFsaWRhdGVfcmVzICgyLCAyLCByZXMsIGV4cGVjdGVkX3Jlcyk7Cisg ICAgICB9CisKKyAgICAgIC8qIENhc2UgNDogbWFzayA9IHswLCAwLCAxLCAuLi59IC8vICgxLCAz KQorCSBUZXN0IHRoYXQgdGhlIHN0ZXBwZWQgc2VxdWVuY2Ugb2YgdGhlIHBhdHRlcm4gc2VsZWN0 cyBmcm9tCisJIHNhbWUgaW5wdXQgcGF0dGVybi4gU2luY2UgaW5wdXQgdmVjdG9ycyBoYXZlIG5w YXR0ZXJucyA9IDIsCisJIGFuZCBzdGVwIChhMiAtIGExKSA9IDEsIHN0ZXAgaXMgbm90IGEgbXVs dGlwbGUgb2YgbnBhdHRlcm5zCisJIGluIGlucHV0IHZlY3Rvci4gU28gcmV0dXJuIE5VTExfVFJF RS4gICovCisgICAgICB7CisJdHJlZSBhcmcwID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwg MiwgMywgMSk7CisJdHJlZSBhcmcxID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMiwgMywg MSk7CisJcG9seV91aW50NjQgbGVuID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAo YXJnMCkpOworCisJdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyIChsZW4sIDEsIDMpOworCXBvbHlf dWludDY0IG1hc2tfZWxlbXNbXSA9IHsgMCwgMCwgMSB9OworCWJ1aWxkZXJfcHVzaF9lbGVtcyAo YnVpbGRlciwgbWFza19lbGVtcyk7CisKKwl2ZWNfcGVybV9pbmRpY2VzIHNlbCAoYnVpbGRlciwg MiwgbGVuKTsKKwljb25zdCBjaGFyICpyZWFzb247CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJt X2NzdCAoVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgc2VsLAorCQkJCSAgICAgICZyZWFz b24pOworCUFTU0VSVF9UUlVFIChyZXMgPT0gTlVMTF9UUkVFKTsKKwlBU1NFUlRfVFJVRSAoIXN0 cmNtcCAocmVhc29uLCAic3RlcCBpcyBub3QgbXVsdGlwbGUgb2YgbnBhdHRlcm5zIikpOworICAg ICAgfQorICAgIH0KK30KKworLyogVGVzdCBhbGwgdmVjdG9ycyB3aGljaCBjb250YWluIGF0LWxl YXN0IDQgZWxlbWVudHMuICAqLworCitzdGF0aWMgdm9pZAordGVzdF9udW5pdHNfbWluXzQgKG1h Y2hpbmVfbW9kZSB2bW9kZSkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAg IHsKKyAgICAgIC8qIENhc2UgMTogbWFzayA9IHsgMCwgbGVuLCAxLCBsZW4rMSwgLi4uIH0gLy8g KDQsIDEpCisJIHJlczogeyBhcmcwWzBdLCBhcmcxWzBdLCBhcmcwWzFdLCBhcmcxWzFdLCAuLi4g fSAvLyAoNCwgMSkgICovCisgICAgICB7CisJdHJlZSBhcmcwID0gYnVpbGRfdmVjX2NzdF9yYW5k ICh2bW9kZSwgMSwgMywgMSk7CisJdHJlZSBhcmcxID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9k ZSwgMSwgMywgMSk7CisJcG9seV91aW50NjQgbGVuID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRS RUVfVFlQRSAoYXJnMCkpOworCisJdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyIChsZW4sIDQsIDEp OworCXBvbHlfdWludDY0IG1hc2tfZWxlbXNbXSA9IHsgMCwgbGVuLCAxLCBsZW4gKyAxIH07CisJ YnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2VsZW1zKTsKKworCXZlY19wZXJtX2lu ZGljZXMgc2VsIChidWlsZGVyLCAyLCBsZW4pOworCXRyZWUgcmVzID0gZm9sZF92ZWNfcGVybV9j c3QgKFRSRUVfVFlQRSAoYXJnMCksIGFyZzAsIGFyZzEsIHNlbCk7CisKKwl0cmVlIGV4cGVjdGVk X3Jlc1tdID0geyBBUkcwKDApLCBBUkcxKDApLCBBUkcwKDEpLCBBUkcxKDEpIH07CisJdmFsaWRh dGVfcmVzICg0LCAxLCByZXMsIGV4cGVjdGVkX3Jlcyk7CisgICAgICB9CisKKyAgICAgIC8qIENh c2UgMjogc2VsID0gezAsIDEsIDIsIC4uLn0gIC8vICgxLCAzKQorCSByZXM6IHsgYXJnMFswXSwg YXJnMFsxXSwgYXJnMFsyXSwgLi4uIH0gLy8gKDEsIDMpICovCisgICAgICB7CisJdHJlZSBhcmcw ID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMik7CisJdHJlZSBhcmcxID0gYnVp bGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMik7CisJcG9seV91aW50NjQgYXJnMF9sZW4g PSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJFRV9UWVBFIChhcmcwKSk7CisKKwl2ZWNfcGVybV9i dWlsZGVyIGJ1aWxkZXIgKGFyZzBfbGVuLCAxLCAzKTsKKwlwb2x5X3VpbnQ2NCBtYXNrX2VsZW1z W10gPSB7MCwgMSwgMn07CisJYnVpbGRlcl9wdXNoX2VsZW1zIChidWlsZGVyLCBtYXNrX2VsZW1z KTsKKworCXZlY19wZXJtX2luZGljZXMgc2VsIChidWlsZGVyLCAyLCBhcmcwX2xlbik7CisJdHJl ZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAoVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwg c2VsKTsKKwl0cmVlIGV4cGVjdGVkX3Jlc1tdID0geyBBUkcwKDApLCBBUkcwKDEpLCBBUkcwKDIp IH07CisJdmFsaWRhdGVfcmVzICgxLCAzLCByZXMsIGV4cGVjdGVkX3Jlcyk7CisgICAgICB9CisK KyAgICAgIC8qIENhc2UgMzogc2VsID0ge2xlbiwgbGVuKzEsIGxlbisyLCAuLi59IC8vICgxLCAz KQorCSByZXM6IHsgYXJnMVswXSwgYXJnMVsxXSwgYXJnMVsyXSwgLi4uIH0gLy8gKDEsIDMpICov CisgICAgICB7CisJdHJlZSBhcmcwID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywg Mik7CisJdHJlZSBhcmcxID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMik7CisJ cG9seV91aW50NjQgbGVuID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkp OworCisJdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyIChsZW4sIDEsIDMpOworCXBvbHlfdWludDY0 IG1hc2tfZWxlbXNbXSA9IHtsZW4sIGxlbiArIDEsIGxlbiArIDJ9OworCWJ1aWxkZXJfcHVzaF9l bGVtcyAoYnVpbGRlciwgbWFza19lbGVtcyk7CisKKwl2ZWNfcGVybV9pbmRpY2VzIHNlbCAoYnVp bGRlciwgMiwgbGVuKTsKKwl0cmVlIHJlcyA9IGZvbGRfdmVjX3Blcm1fY3N0IChUUkVFX1RZUEUg KGFyZzApLCBhcmcwLCBhcmcxLCBzZWwpOworCXRyZWUgZXhwZWN0ZWRfcmVzW10gPSB7IEFSRzEo MCksIEFSRzEoMSksIEFSRzEoMikgfTsKKwl2YWxpZGF0ZV9yZXMgKDEsIDMsIHJlcywgZXhwZWN0 ZWRfcmVzKTsKKyAgICAgIH0KKworICAgICAgLyogQ2FzZSA0OgorCXNlbCA9IHsgbGVuLCAwLCAy LCAuLi4gfSAvLyAoMSwgMykgCisJVGhpcyBzaG91bGQgcmV0dXJuIE5VTEwgYmVjYXVzZSB3ZSBj cm9zcyB0aGUgaW5wdXQgdmVjdG9ycy4KKwlCZWNhdXNlLAorCUxldCdzIGFzc3VtZSBsZW4gPSBD ICsgQ3gKKwlhMSA9IDAKKwlTID0gMgorCWVzZWwgPSBhcmcwX2xlbiAvIHNlbF9ucGF0dGVybnMg PSBDICsgQ3gKKwlhZSA9IDAgKyAoZXNlbCAtIDIpICogUworCSAgID0gMCArIChDICsgQ3ggLSAy KSAqIDIKKwkgICA9IDIoQy0yKSArIDJDeAorCisJRm9yIEMgPj0gNDoKKwlMZXQgcTEgPSBhMSAv IGFyZzBfbGVuID0gMCAvIChDICsgQ3gpID0gMAorCUxldCBxZSA9IGFlIC8gYXJnMF9sZW4gPSAo MihDLTIpICsgMkN4KSAvIChDICsgQ3gpID0gMQorCVNpbmNlIHExICE9IHFlLCB3ZSBjcm9zcyBp bnB1dCB2ZWN0b3JzLgorCVNvIHJldHVybiBOVUxMX1RSRUUuICAqLworICAgICAgeworCXRyZWUg YXJnMCA9IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm1vZGUsIDEsIDMsIDIpOworCXRyZWUgYXJnMSA9 IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm1vZGUsIDEsIDMsIDIpOworCXBvbHlfdWludDY0IGFyZzBf bGVuID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkpOworCisJdmVjX3Bl cm1fYnVpbGRlciBidWlsZGVyIChhcmcwX2xlbiwgMSwgMyk7CisJcG9seV91aW50NjQgbWFza19l bGVtc1tdID0geyBhcmcwX2xlbiwgMCwgMiB9OworCWJ1aWxkZXJfcHVzaF9lbGVtcyAoYnVpbGRl ciwgbWFza19lbGVtcyk7CisKKwl2ZWNfcGVybV9pbmRpY2VzIHNlbCAoYnVpbGRlciwgMiwgYXJn MF9sZW4pOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKKwl0cmVlIHJlcyA9IGZvbGRfdmVjX3Blcm1f Y3N0IChUUkVFX1RZUEUgKGFyZzApLCBhcmcwLCBhcmcxLCBzZWwsICZyZWFzb24pOworCUFTU0VS VF9UUlVFIChyZXMgPT0gTlVMTF9UUkVFKTsKKwlBU1NFUlRfVFJVRSAoIXN0cmNtcCAocmVhc29u LCAiY3Jvc3NlZCBpbnB1dCB2ZWN0b3JzIikpOworICAgICAgfQorCisgICAgICAvKiBDYXNlIDU6 IG5wYXR0ZXJucyhhcmcwKSA9IDQgPiBucGF0dGVybnMoc2VsKSA9IDIKKwkgbWFzayA9IHsgMCwg bGVuLCAxLCBsZW4gKyAxLCAuLi59IC8vICgyLCAyKQorCSByZXMgPSB7IGFyZzBbMF0sIGFyZzFb MF0sIGFyZzBbMV0sIGFyZzFbMV0sIC4uLiB9IC8vICgyLCAyKQorCisJIE5vdGUgdGhhdCBmb2xk X3ZlY19wZXJtX2NzdCB3aWxsIHNldAorCSByZXNfbnBhdHRlcm5zID0gbWF4KDQsIG1heCg0LCAy KSkgPSA0CisJIEhvd2V2ZXIgYWZ0ZXIgY2Fub25pY2FsaXppbmcsIHdlIHdpbGwgZW5kIHVwIHdp dGggc2hhcGUgKDIsIDIpLiAgKi8KKyAgICAgIHsKKwl0cmVlIGFyZzAgPSBidWlsZF92ZWNfY3N0 X3JhbmQgKHZtb2RlLCA0LCAxKTsKKwl0cmVlIGFyZzEgPSBidWlsZF92ZWNfY3N0X3JhbmQgKHZt b2RlLCA0LCAxKTsKKwlwb2x5X3VpbnQ2NCBsZW4gPSBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoVFJF RV9UWVBFIChhcmcwKSk7CisKKwl2ZWNfcGVybV9idWlsZGVyIGJ1aWxkZXIgKGxlbiwgMiwgMik7 CisJcG9seV91aW50NjQgbWFza19lbGVtc1tdID0geyAwLCBsZW4sIDEsIGxlbiArIDEgfTsKKwli dWlsZGVyX3B1c2hfZWxlbXMgKGJ1aWxkZXIsIG1hc2tfZWxlbXMpOworCisJdmVjX3Blcm1faW5k aWNlcyBzZWwgKGJ1aWxkZXIsIDIsIGxlbik7CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2Nz dCAoVFJFRV9UWVBFIChhcmcwKSwgYXJnMCwgYXJnMSwgc2VsKTsKKwl0cmVlIGV4cGVjdGVkX3Jl c1tdID0geyBBUkcwKDApLCBBUkcxKDApLCBBUkcwKDEpLCBBUkcxKDEpIH07CisJdmFsaWRhdGVf cmVzICgyLCAyLCByZXMsIGV4cGVjdGVkX3Jlcyk7CisgICAgICB9CisKKyAgICAgIC8qIENhc2Ug NjogVGVzdCBjb21iaW5hdGlvbiBpbiBzZWwsIHdoZXJlIG9uZSBwYXR0ZXJuIGlzIGR1cCBhbmQg b3RoZXIKKwkgaXMgc3RlcHBlZCBzZXF1ZW5jZS4KKwkgc2VsID0geyAwLCAwLCAwLCAxLCAwLCAy LCAuLi4gfSAvLyAoMiwgMykKKwkgcmVzID0geyBhcmcwWzBdLCBhcmcwWzBdLCBhcmcwWzBdLAor CQkgYXJnMFsxXSwgYXJnMFswXSwgYXJnMFsyXSwgLi4uIH0gLy8gKDIsIDMpICAqLworICAgICAg eworCXRyZWUgYXJnMCA9IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm1vZGUsIDEsIDMsIDEpOworCXRy ZWUgYXJnMSA9IGJ1aWxkX3ZlY19jc3RfcmFuZCAodm1vZGUsIDEsIDMsIDEpOworCXBvbHlfdWlu dDY0IGxlbiA9IFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVFX1RZUEUgKGFyZzApKTsKKworCXZl Y19wZXJtX2J1aWxkZXIgYnVpbGRlciAobGVuLCAyLCAzKTsKKwlwb2x5X3VpbnQ2NCBtYXNrX2Vs ZW1zW10gPSB7IDAsIDAsIDAsIDEsIDAsIDIgfTsKKwlidWlsZGVyX3B1c2hfZWxlbXMgKGJ1aWxk ZXIsIG1hc2tfZWxlbXMpOworCisJdmVjX3Blcm1faW5kaWNlcyBzZWwgKGJ1aWxkZXIsIDIsIGxl bik7CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAoVFJFRV9UWVBFIChhcmcwKSwgYXJn MCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhwZWN0ZWRfcmVzW10gPSB7IEFSRzAoMCksIEFSRzAo MCksIEFSRzAoMCksCisJCQkJQVJHMCgxKSwgQVJHMCgwKSwgQVJHMCgyKSB9OworCXZhbGlkYXRl X3JlcyAoMiwgMywgcmVzLCBleHBlY3RlZF9yZXMpOworICAgICAgfQorICAgIH0KK30KKworLyog VGVzdCBhbGwgdmVjdG9ycyB3aGljaCBjb250YWluIGF0LWxlYXN0IDggZWxlbWVudHMuICAqLwor CitzdGF0aWMgdm9pZAordGVzdF9udW5pdHNfbWluXzggKG1hY2hpbmVfbW9kZSB2bW9kZSkKK3sK KyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgIHsKKyAgICAgIC8qIENhc2UgMTog c2VsX25wYXR0ZXJucyAoNCkgPiBpbnB1dCBucGF0dGVybnMgKDIpCisJIHNlbDogeyAwLCAwLCAx LCBsZW4sIDIsIDAsIDMsIGxlbiwgNCwgMCwgNSwgbGVuLCAuLi59IC8vICg0LCAzKQorCSByZXM6 IHsgYXJnMFswXSwgYXJnMFswXSwgYXJnMFswXSwgYXJnMVswXSwKKwkJYXJnMFsyXSwgYXJnMFsw XSwgYXJnMFszXSwgYXJnMVswXSwKKwkJYXJnMFs0XSwgYXJnMFswXSwgYXJnMFs1XSwgYXJnMVsw XSwgLi4uIH0gLy8gKDQsIDMpICAqLworICAgICAgeworCXRyZWUgYXJnMCA9IGJ1aWxkX3ZlY19j c3RfcmFuZCAodm1vZGUsIDIsIDMsIDIpOworCXRyZWUgYXJnMSA9IGJ1aWxkX3ZlY19jc3RfcmFu ZCAodm1vZGUsIDIsIDMsIDIpOworCXBvbHlfdWludDY0IGxlbiA9IFRZUEVfVkVDVE9SX1NVQlBB UlRTIChUUkVFX1RZUEUgKGFyZzApKTsKKworCXZlY19wZXJtX2J1aWxkZXIgYnVpbGRlcihsZW4s IDQsIDMpOworCXBvbHlfdWludDY0IG1hc2tfZWxlbXNbXSA9IHsgMCwgMCwgMSwgbGVuLCAyLCAw LCAzLCBsZW4sCisJCQkJICAgICA0LCAwLCA1LCBsZW4gfTsKKwlidWlsZGVyX3B1c2hfZWxlbXMg KGJ1aWxkZXIsIG1hc2tfZWxlbXMpOworCisJdmVjX3Blcm1faW5kaWNlcyBzZWwgKGJ1aWxkZXIs IDIsIGxlbik7CisJdHJlZSByZXMgPSBmb2xkX3ZlY19wZXJtX2NzdCAoVFJFRV9UWVBFIChhcmcw KSwgYXJnMCwgYXJnMSwgc2VsKTsKKworCXRyZWUgZXhwZWN0ZWRfcmVzW10gPSB7IEFSRzAoMCks IEFSRzAoMCksIEFSRzAoMSksIEFSRzEoMCksCisJCQkJQVJHMCgyKSwgQVJHMCgwKSwgQVJHMCgz KSwgQVJHMSgwKSwKKwkJCQlBUkcwKDQpLCBBUkcwKDApLCBBUkcwKDUpLCBBUkcxKDApIH07CisJ dmFsaWRhdGVfcmVzICg0LCAzLCByZXMsIGV4cGVjdGVkX3Jlcyk7CisgICAgICB9CisgICAgfQor fQorCisvKiBUZXN0IHZlY3RvcnMgZm9yIHdoaWNoIG51bml0c1swXSA8PSA0LiAgKi8KKworc3Rh dGljIHZvaWQKK3Rlc3RfbnVuaXRzX21heF80IChtYWNoaW5lX21vZGUgdm1vZGUpCit7CisgIC8q IENhc2UgMTogbWFzayA9IHswLCA0LCAuLi59IC8vICgxLCAyKQorICAgICBUaGlzIHNob3VsZCBy ZXR1cm4gTlVMTF9UUkVFIGJlY2F1c2UgdGhlIGluZGV4IDQgbWF5IGNob29zZQorICAgICBmcm9t IGVpdGhlciBhcmcwIG9yIGFyZzEgZGVwZW5kaW5nIG9uIHZlY3RvciBsZW5ndGguICAqLworICB7 CisgICAgdHJlZSBhcmcwID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMSk7Cisg ICAgdHJlZSBhcmcxID0gYnVpbGRfdmVjX2NzdF9yYW5kICh2bW9kZSwgMSwgMywgMSk7CisgICAg cG9seV91aW50NjQgbGVuID0gVFlQRV9WRUNUT1JfU1VCUEFSVFMgKFRSRUVfVFlQRSAoYXJnMCkp OworCisgICAgdmVjX3Blcm1fYnVpbGRlciBidWlsZGVyIChsZW4sIDEsIDIpOworICAgIHBvbHlf dWludDY0IG1hc2tfZWxlbXNbXSA9IHswLCA0fTsKKyAgICBidWlsZGVyX3B1c2hfZWxlbXMgKGJ1 aWxkZXIsIG1hc2tfZWxlbXMpOworCisgICAgdmVjX3Blcm1faW5kaWNlcyBzZWwgKGJ1aWxkZXIs IDIsIGxlbik7CisgICAgY29uc3QgY2hhciAqcmVhc29uOworICAgIHRyZWUgcmVzID0gZm9sZF92 ZWNfcGVybV9jc3QgKFRSRUVfVFlQRSAoYXJnMCksIGFyZzAsIGFyZzEsIHNlbCwgJnJlYXNvbik7 CisgICAgQVNTRVJUX1RSVUUgKHJlcyA9PSBOVUxMX1RSRUUpOworICAgIEFTU0VSVF9UUlVFIChy ZWFzb24gIT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUgKCFzdHJjbXAgKHJlYXNvbiwgImNhbm5v dCBkaXZpZGUgc2VsZWN0b3IgZWxlbWVudCBieSBhcmcgbGVuIikpOworICB9Cit9CisKKyN1bmRl ZiBBUkcwCisjdW5kZWYgQVJHMQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBTSVpFIGlzIG9mIHRoZSBm b3JtIEMgKyBDeCBhbmQgQyBpcyBwb3dlciBvZiAyLiAgKi8KKworc3RhdGljIGJvb2wKK2lzX3Np bXBsZV92bGFfc2l6ZSAocG9seV91aW50NjQgc2l6ZSkKK3sKKyAgaWYgKHNpemUuaXNfY29uc3Rh bnQgKCkKKyAgICAgIHx8ICFwb3cycF9od2kgKHNpemUuY29lZmZzWzBdKSkKKyAgICByZXR1cm4g ZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBBUlJBWV9TSVpFIChzaXplLmNvZWZm cyk7ICsraSkKKyAgICBpZiAoc2l6ZS5jb2VmZnNbaV0gIT0gKGkgPD0gMSA/IHNpemUuY29lZmZz WzBdIDogMCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvKiBF eGVjdXRlIGZvbGRfdmVjX3Blcm1fY3N0IHVuaXQgdGVzdHMuICAqLworCitzdGF0aWMgdm9pZAor dGVzdCAoKQoreworICBtYWNoaW5lX21vZGUgdm54NHNpX21vZGUgPSBFX1ZPSURtb2RlOworICBt YWNoaW5lX21vZGUgdjRzaV9tb2RlID0gRV9WT0lEbW9kZTsKKworICBtYWNoaW5lX21vZGUgdm1v ZGU7CisgIEZPUl9FQUNIX01PREVfSU5fQ0xBU1MgKHZtb2RlLCBNT0RFX1ZFQ1RPUl9JTlQpCisg ICAgeworICAgICAgLyogT2J0YWluIG1vZGVzIGNvcnJlc3BvbmRpbmcgdG8gVk54NFNJIGFuZCBW NFNJLAorCSB0byBjYWxsIG1peGVkIG1vZGUgdGVzdHMgYmVsb3cuCisJIEZJWE1FOiBJcyB0aGVy ZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyA/ICAqLworICAgICAgaWYgKEdFVF9NT0RFX0lOTkVS ICh2bW9kZSkgPT0gU0ltb2RlKQorCXsKKwkgIHBvbHlfdWludDY0IG51bml0cyA9IEdFVF9NT0RF X05VTklUUyAodm1vZGUpOworCSAgaWYgKGlzX3NpbXBsZV92bGFfc2l6ZSAobnVuaXRzKQorCSAg ICAgICYmIG51bml0cy5jb2VmZnNbMF0gPT0gNCkKKwkgICAgdm54NHNpX21vZGUgPSB2bW9kZTsK KwkgIGVsc2UgaWYgKGtub3duX2VxIChudW5pdHMsIHBvbHlfdWludDY0ICg0KSkpCisJICAgIHY0 c2lfbW9kZSA9IHZtb2RlOworCX0KKworICAgICAgaWYgKCFpc19zaW1wbGVfdmxhX3NpemUgKEdF VF9NT0RFX05VTklUUyAodm1vZGUpKQorCSAgfHwgIXRhcmdldG0udmVjdG9yX21vZGVfc3VwcG9y dGVkX3AgKHZtb2RlKSkKKwljb250aW51ZTsKKworICAgICAgcG9seV91aW50NjQgbnVuaXRzID0g R0VUX01PREVfTlVOSVRTICh2bW9kZSk7CisgICAgICB0ZXN0X2FsbF9udW5pdHMgKHZtb2RlKTsK KyAgICAgIGlmIChudW5pdHMuY29lZmZzWzBdID49IDIpCisJdGVzdF9udW5pdHNfbWluXzIgKHZt b2RlKTsKKyAgICAgIGlmIChudW5pdHMuY29lZmZzWzBdID49IDQpCisJdGVzdF9udW5pdHNfbWlu XzQgKHZtb2RlKTsKKyAgICAgIGlmIChudW5pdHMuY29lZmZzWzBdID49IDgpCisJdGVzdF9udW5p dHNfbWluXzggKHZtb2RlKTsKKworICAgICAgaWYgKG51bml0cy5jb2VmZnNbMF0gPD0gNCkKKwl0 ZXN0X251bml0c19tYXhfNCAodm1vZGUpOworICAgIH0KKworICBpZiAodm54NHNpX21vZGUgIT0g RV9WT0lEbW9kZSAmJiB2NHNpX21vZGUgIT0gRV9WT0lEbW9kZQorICAgICAgJiYgdGFyZ2V0bS52 ZWN0b3JfbW9kZV9zdXBwb3J0ZWRfcCAodm54NHNpX21vZGUpCisgICAgICAmJiB0YXJnZXRtLnZl Y3Rvcl9tb2RlX3N1cHBvcnRlZF9wICh2NHNpX21vZGUpKQorICAgIHsKKyAgICAgIHRlc3Rfdm54 NHNpX3Y0c2kgKHZueDRzaV9tb2RlLCB2NHNpX21vZGUpOworICAgICAgdGVzdF92NHNpX3ZueDRz aSAodjRzaV9tb2RlLCB2bng0c2lfbW9kZSk7CisgICAgfQorfQorfTsgLy8gZW5kIG9mIHRlc3Rf Zm9sZF92ZWNfcGVybV9jc3QgbmFtZXNwYWNlCisKIC8qIFZlcmlmeSB0aGF0IHZhcmlvdXMgYmlu YXJ5IG9wZXJhdGlvbnMgb24gdmVjdG9ycyBhcmUgZm9sZGVkCiAgICBjb3JyZWN0bHkuICAqLwog CkBAIC0xNjk0Myw2ICsxNzY5Myw3IEBAIGZvbGRfY29uc3RfY2NfdGVzdHMgKCkKICAgdGVzdF9h cml0aG1ldGljX2ZvbGRpbmcgKCk7CiAgIHRlc3RfdmVjdG9yX2ZvbGRpbmcgKCk7CiAgIHRlc3Rf dmVjX2R1cGxpY2F0ZV9mb2xkaW5nICgpOworICB0ZXN0X2ZvbGRfdmVjX3Blcm1fY3N0Ojp0ZXN0 ICgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBzZWxmdGVzdAo= --000000000000b912940602cc8d48--