From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 31B6BC3DA49 for ; Fri, 26 Jul 2024 21:37:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C333D6B008A; Fri, 26 Jul 2024 17:37:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BBAAD6B0092; Fri, 26 Jul 2024 17:37:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A347D6B0093; Fri, 26 Jul 2024 17:37:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 807E16B008A for ; Fri, 26 Jul 2024 17:37:05 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 29584120107 for ; Fri, 26 Jul 2024 21:37:05 +0000 (UTC) X-FDA: 82383214410.17.D9CC808 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) by imf10.hostedemail.com (Postfix) with ESMTP id AF701C0025 for ; Fri, 26 Jul 2024 21:37:02 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=linuxfoundation.org header.s=google header.b=MlUyJGTL; spf=pass (imf10.hostedemail.com: domain of torvalds@linuxfoundation.org designates 209.85.218.53 as permitted sender) smtp.mailfrom=torvalds@linuxfoundation.org; dmarc=pass (policy=none) header.from=linuxfoundation.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1722029773; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=tR7QK+rFRo8OTFjA+KTJMc1hqekqtaMP08BMkpFD0zY=; b=1UXuTQnaYY3DK1sestt8j91by3bCD6+vq6IVGcDCtkvS6SiMdLVf0l/q0J5XnkFkpLR4Je mqzr0MCpaLJBdXm627iFpT/HvqPdv/pAkuhjaMMCM0K+ETjJAgYqQOlPJwGJCBCcUvJsvp 9AvKwbWbyQTTBZTtawSeXY8xW6R3FOI= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722029773; a=rsa-sha256; cv=none; b=QTuEOfSEaj+RQ23ydeTcbxHTm4K3UYKYzOM3yPjPSihmWC4EnWC+JsBuhH7BPxQ428WhIr O+tZS1GnECBW0Fp84y+lDuCQ8qxK1IK9c6fvj2+YO2KPGxst11m/YF86/LcoyChqHiTIBZ HxRpivFYBlET5wpIrz+ytxTEvlj7Eks= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=linuxfoundation.org header.s=google header.b=MlUyJGTL; spf=pass (imf10.hostedemail.com: domain of torvalds@linuxfoundation.org designates 209.85.218.53 as permitted sender) smtp.mailfrom=torvalds@linuxfoundation.org; dmarc=pass (policy=none) header.from=linuxfoundation.org Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-a7aa212c1c9so271442566b.2 for ; Fri, 26 Jul 2024 14:37:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=google; t=1722029821; x=1722634621; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=tR7QK+rFRo8OTFjA+KTJMc1hqekqtaMP08BMkpFD0zY=; b=MlUyJGTLBwsaQzDGmG1v6sv4xOGM/rcGHVxlvlaThKTK/xNwfLAH88rxNqA7WvbXIy 5znX5E2XCjCtmn8rBFJlmSMieJwaTSA6gAnLSlofedyhfFKH6XvFnZ3aErkg0MrxzP6J cTfyzNtgrbqOLKj4dHHjXXfhyI6JNy7MwhC9Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722029821; x=1722634621; h=cc: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=tR7QK+rFRo8OTFjA+KTJMc1hqekqtaMP08BMkpFD0zY=; b=DbDEqOMzqMlYInd4XUsj63bk7G7JMobti4pmkxalAvxYVY5TOk4OgtdtWrabAtXwQ5 3TGrlwT+1Zn6x+IG40MtrDxPavwB0AVNuZGBK8qfk0rkKbaXwSXUEwJABzScNwWxSHFg 9NzmSCBw5fgq941xPdecd+tE1OyDBLankqFxPQGsH4MCrg/+IZVV0HpDRqJyAs7KG9Jm iCra30BF771tTkyozPStKY7+yGfIizDApISpRqYm+g7dmhtHNBCunHEteXaLcRxQQv6F 0sBj1+jPl/+Ljgd4QBcjhI7b34dTXquzMSlB261fNskmqWbWETDAXy5XCrvhlRufjovV Xr6A== X-Forwarded-Encrypted: i=1; AJvYcCV3ZeB5h5Z1iuwjF8NUCZuxOXwZXCIwN3zYsMoh6LOJRR9kEbf1CLlTeh9G3v6VfeHSAPm/Sqy8AjSMETgBQMTINTs= X-Gm-Message-State: AOJu0YwG/AlBtFxxh8x2bCr4ED1BUAlqif8fvJm1sDaEjAvITUG7iIAN LS7W+vDukgQnvY/4TKbR+5nvda57ZsTjYXlPkVePCXVBdYsw6/AhFltfOwbsd7cDFGi700pO4Sd lBBYHmg== X-Google-Smtp-Source: AGHT+IFTF8tfcJbf29fR2MsZyWx8y0cdllnk9JWgh8lmTgkSxWEZpS2bbn12BVBt5wLY6qMYBSiilQ== X-Received: by 2002:a17:907:3fa4:b0:a7a:aa35:408e with SMTP id a640c23a62f3a-a7d400943c6mr64073466b.27.1722029820479; Fri, 26 Jul 2024 14:37:00 -0700 (PDT) Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com. [209.85.208.46]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a7acad40cb9sm215005766b.120.2024.07.26.14.36.57 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 26 Jul 2024 14:36:57 -0700 (PDT) Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-58ef19aa69dso2378411a12.3 for ; Fri, 26 Jul 2024 14:36:57 -0700 (PDT) X-Forwarded-Encrypted: i=1; AJvYcCXTB29T27YMhKtu73NEk9VxCMLkbtGmDBuJfg9qgvL+S0skYcWCPTOgy7mSeL6aRdy8AoLwmG3C9WOpVigX/b1YeEQ= X-Received: by 2002:a50:aa9b:0:b0:5a2:9683:2bb6 with SMTP id 4fb4d7f45d1cf-5b020101651mr373039a12.1.1722029817285; Fri, 26 Jul 2024 14:36:57 -0700 (PDT) MIME-Version: 1.0 References: <23bdb6fc8d884ceebeb6e8b8653b8cfe@AcuMS.aculab.com> <902a9bf3-9404-44e8-9063-03da3168146a@lucifer.local> <137646a7-7017-490d-be78-5bd5627609c3@lucifer.local> <36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local> In-Reply-To: <36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local> From: Linus Torvalds Date: Fri, 26 Jul 2024 14:36:40 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 0/7] minmax: reduce compilation time To: Lorenzo Stoakes , Jens Axboe Cc: David Laight , "linux-kernel@vger.kernel.org" , "Matthew Wilcox (Oracle)" , Christoph Hellwig , Andrew Morton , Andy Shevchenko , Dan Carpenter , Arnd Bergmann , "Jason@zx2c4.com" , "pedro.falcato@gmail.com" , Mateusz Guzik , "linux-mm@kvack.org" Content-Type: multipart/mixed; boundary="0000000000008d8e98061e2d4ffa" X-Rspamd-Queue-Id: AF701C0025 X-Stat-Signature: bmps7kwm4eaayp47e4xxgtyyuf47nyqp X-Rspamd-Server: rspam09 X-Rspam-User: X-HE-Tag: 1722029822-596737 X-HE-Meta: U2FsdGVkX1/Upa/JSzB23Rnz/R2vJPy4d6wqc1394cNdcjIkX9GbsFyHz/hmU88VkfKbjszte0ngfBRFmj0Zq1q03V/jKeOpHrYx1Rj+ZxFAYcRyUT3h30R3cYu23TY+WJYsAVc3AqQTmDd9fSGUfyZ9CTbeLzXZT5GjYQ6rtf0Vu1AHO5ufekVCwNtP1RXhkIfMS0htqfsjNCNchOxR61JyX/ALg7rSg0VgRTyVWoJIMZ/0QGMw6FFTjlxyf05IMSbBEwCY94bITL928UtvhAB3fvzF/wBzyDoRY6eIQRtMp5MfeKm6ux1KHNSMcjx1a7lhHUicx7q9J+6PU1ENXz6NwWHB1adA9NKuSfbHHH9tTKMuIYe9Ej0kkiB+50mHzmkcM9Fj42qHFlbQQALhzgCAaRPN0Q0gLXpvTtv33B/DAPa8yyx/ctB4m/IJ1oRglW9AXJcUNTf4db8cympHHIu0iVgOUO9R850aPaqglYO4P72bSCCnANoeAu2kRw6KFuraDEjpghp9t699YHbsB5EURRlqIRbFKgZQnHtVqoCFLbJB/jc3ef0RWErgauk9CVZESvdW8BRv/tCdnDSKNArVHQf+mvAFx1h1oj/Ld+u+BjH4NEpSRVME5gOx8JyZPzTgRms+xph2yUu4Y+oGdxma3nbEZdecVe8xDVVZJvoxcvW67c1hG/nBqxAkNzsym5JItuzTxXw9t/OaM/8X+woOXvryvRa885lZbBhfnWoCEBBw9gxGT5dg1bWsYraiCl+drOnJqMTNOVjeuzeTwSv0Yxo12Klvaqqu11NddmoVDGb2+HPJQnVaWiyJZv1CcPztK5p+9DF/5A2POzB694JenJJqJYwFJiY4DZlQ8Yimsj4yyVxcQSmgHbPIzUuMsANk8j01chhDLksVhgADlM5ZXssaWt5JzNtcnq8vDmlydB9dPYXp+sOkMx175e6MjcTLvwKyhsY0RfFj0FW Prh8nKnQ ksdDaQvSlaMDDfNzEpWcSWAOEbdylKjqgJSX6Vf7KDxIlPuFT9hKVzOCQ7M44I9KB6x4bkQFQL1z0tZZXlLffH8thhJmZ4loLdaxna/4EYt3jTmw5r4DHMGnA6HfVk/G1ISlqOMmm0bbfEYPWF26qx7qCjIx9KeWAlD7G9rquhfHdsYqfT8hygPrpr57Ioqa58xPUPLYgEMgBhLlwuKmuAU+v/1CFtsgYvzm+/+n7V/jrjMTEjUZeZpViCYcPKrMwIqQ9Oc5KZsb/X1B8zHXSrdMPSvzmgApcxI9BBwSkHy9KFyDlLEdrZVO3GvcLKGB2onDyq+xQUDfOZ02m90k7NhxXZZw2L6ZnB8rg8vCeUdxeXorN3c7iFVX6d6GJ9C1OmS74+VRjGBGn0ZXMxl8tbFfhLzKnIqbPWtsyIlC18tfj9Fa08+4vxXxn6v8Vcnn6tCzhsHYWknHVvoMuBdOMCtCOT/L8rL18TbpdSNTnF5Mnjr4I7Bzey0I6EdaUpApi+83dyX5gUurPuUYuef5lut0RswtEL/rSAnLVJIJ758C0f6Wlmy7LccoP2YLSg/4y9d4jk+ctbcSaCYHSlSUzUQZIYymP/56k56WoXJUka7SDPmXT1eCEVBNmC1IHKVFy2bRMjXF+uOuQdCc2mg5fJgzgHd5XIBfH/NNfvU/DHVojaH0OrGWoVLjK+ff2nDOfHPCeACOPC2yCqfFCwU89R03JIPkBzk/GPrpU5L1cZWO0vHgVrePbeXhfK5fFyNiPTUf9jLDApEuF5PXSLS9Z1J0id+PAn021dRqlav6/5sZ/n0AD1xGtL7SSYQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --0000000000008d8e98061e2d4ffa Content-Type: text/plain; charset="UTF-8" On Fri, 26 Jul 2024 at 12:21, Lorenzo Stoakes wrote: > > A simple comparison pre-revert vs. post-revert gives some ideas for other > low-hanging fruit: > > 1334256./mm/compaction.o.pre LOL. At least some of that is because of 'pageblock_order', which expands to 2.5kB of text just because of this: /* * Huge pages are a constant size, but don't exceed the maximum allocation * granularity. */ #define pageblock_order min_t(unsigned int, HUGETLB_PAGE_ORDER, MAX_PAGE_ORDER) I think the two arguments to "min_t" are literally "(21 - 12)" and "10", and it expands to 2.5kB. So it _looks_ like "pageblock_order", and it *acts* like a simple compile-time constant, but our complex type-checking min() macro ends up making it horrible. But no, that's not nearly the longest expansion. Writing a little script, and I get Longest line is 85061 (253kB) so we have a single expansion that is 253kB in size. And it comes from this: case ISOLATE_SUCCESS: update_cached = false; last_migrated_pfn = max(cc->zone->zone_start_pfn, pageblock_start_pfn(cc->migrate_pfn - 1)); where that "max()" ends up interacting with "pageblock_start_pfn()", and that pageblock_start_pfn() thing is #define pageblock_nr_pages (1UL << pageblock_order) #define pageblock_start_pfn(pfn) ALIGN_DOWN((pfn), pageblock_nr_pages) so once again it's "pageblock_order", it's just that it's now mixed in with "max()". Now, fixing that, and you end up with Longest line is 61861 (82kB) so it's now "only" 82kB in size, and that actually comes from , which has this: static inline unsigned bio_segments(struct bio *bio) { ... bio_for_each_segment(bv, bio, iter) segs++; which looks very tame indeed, but it turns out that "bio_for_each_segment()" expands to 82kB of code. Jens? Maybe time to look into this? Linus --0000000000008d8e98061e2d4ffa Content-Type: text/x-patch; charset="US-ASCII"; name="patch.diff" Content-Disposition: attachment; filename="patch.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lz382o320 IGFyY2gveDg2L3hlbi9zZXR1cC5jICAgICAgICAgICAgfCA1ICsrKy0tCiBpbmNsdWRlL2xpbnV4 L21pbm1heC5oICAgICAgICAgIHwgNyArKysrKysrCiBpbmNsdWRlL2xpbnV4L3BhZ2VibG9jay1m bGFncy5oIHwgNCArKy0tCiAzIGZpbGVzIGNoYW5nZWQsIDEyIGluc2VydGlvbnMoKyksIDQgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94 ZW4vc2V0dXAuYwppbmRleCBhMGMzZTc3ZTNkNWIuLjgwNmRkYjIzOTFkOSAxMDA2NDQKLS0tIGEv YXJjaC94ODYveGVuL3NldHVwLmMKKysrIGIvYXJjaC94ODYveGVuL3NldHVwLmMKQEAgLTY5MCw2 ICs2OTAsNyBAQCBjaGFyICogX19pbml0IHhlbl9tZW1vcnlfc2V0dXAodm9pZCkKIAlzdHJ1Y3Qg eGVuX21lbW9yeV9tYXAgbWVtbWFwOwogCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzOwogCXVuc2ln bmVkIGxvbmcgZXh0cmFfcGFnZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbWF4bWVtX3BhZ2VzOwog CWludCBpOwogCWludCBvcDsKIApAQCAtNzYxLDggKzc2Miw4IEBAIGNoYXIgKiBfX2luaXQgeGVu X21lbW9yeV9zZXR1cCh2b2lkKQogCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIG5vIG1lbW9yeSBhYm92 ZSBtYXhfcGFnZXMsIGFzIHRoaXMgYXJlYQogCSAqIGlzbid0IGhhbmRsZWQgYnkgdGhlIHAybSBt YW5hZ2VtZW50LgogCSAqLwotCWV4dHJhX3BhZ2VzID0gbWluMyhFWFRSQV9NRU1fUkFUSU8gKiBt aW4obWF4X3BmbiwgUEZOX0RPV04oTUFYTUVNKSksCi0JCQkgICBleHRyYV9wYWdlcywgbWF4X3Bh Z2VzIC0gbWF4X3Bmbik7CisJbWF4bWVtX3BhZ2VzID0gRVhUUkFfTUVNX1JBVElPICogbWluKG1h eF9wZm4sIFBGTl9ET1dOKE1BWE1FTSkpOworCWV4dHJhX3BhZ2VzID0gbWluMyhtYXhtZW1fcGFn ZXMsIGV4dHJhX3BhZ2VzLCBtYXhfcGFnZXMgLSBtYXhfcGZuKTsKIAlpID0gMDsKIAlhZGRyID0g eGVuX2U4MjBfdGFibGUuZW50cmllc1swXS5hZGRyOwogCXNpemUgPSB4ZW5fZTgyMF90YWJsZS5l bnRyaWVzWzBdLnNpemU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pbm1heC5oIGIvaW5j bHVkZS9saW51eC9taW5tYXguaAppbmRleCAyZWM1NTkyODRhOWYuLjVlMGMwMmE4N2QwOCAxMDA2 NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taW5tYXguaAorKysgYi9pbmNsdWRlL2xpbnV4L21pbm1h eC5oCkBAIC03LDYgKzcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogI2luY2x1ZGUg PGxpbnV4L3R5cGVzLmg+CiAKKy8qCisgKiBVc2UgdGhlc2UgY2FyZWZ1bGx5OiBubyB0eXBlIGNo ZWNraW5nLCBhbmQgdXNlcyB0aGUgYXJndW1lbnRzCisgKiBtdWx0aXBsZSB0aW1lcy4gVXNlIGZv ciBvYnZpb3VzIGNvbnN0YW50cyBvbmx5LgorICovCisjZGVmaW5lIENPTlNUX01JTihhLGIpICgo YSk8KGIpPyhhKTooYikpCisjZGVmaW5lIENPTlNUX01BWChhLGIpICgoYSk+KGIpPyhhKTooYikp CisKIC8qCiAgKiBtaW4oKS9tYXgoKS9jbGFtcCgpIG1hY3JvcyBtdXN0IGFjY29tcGxpc2ggdGhy ZWUgdGhpbmdzOgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZWJsb2NrLWZsYWdz LmggYi9pbmNsdWRlL2xpbnV4L3BhZ2VibG9jay1mbGFncy5oCmluZGV4IDU0N2U4MmNkYzg5YS4u Y2UxYjdjNGQ1N2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2VibG9jay1mbGFncy5o CisrKyBiL2luY2x1ZGUvbGludXgvcGFnZWJsb2NrLWZsYWdzLmgKQEAgLTQxLDEzICs0MSwxMyBA QCBleHRlcm4gdW5zaWduZWQgaW50IHBhZ2VibG9ja19vcmRlcjsKICAqIEh1Z2UgcGFnZXMgYXJl IGEgY29uc3RhbnQgc2l6ZSwgYnV0IGRvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvY2F0aW9u CiAgKiBncmFudWxhcml0eS4KICAqLwotI2RlZmluZSBwYWdlYmxvY2tfb3JkZXIJCW1pbl90KHVu c2lnbmVkIGludCwgSFVHRVRMQl9QQUdFX09SREVSLCBNQVhfUEFHRV9PUkRFUikKKyNkZWZpbmUg cGFnZWJsb2NrX29yZGVyCSgodW5zaWduZWQgaW50KUNPTlNUX01JTihIVUdFVExCX1BBR0VfT1JE RVIsIE1BWF9QQUdFX09SREVSKSkKIAogI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0VfU0la RV9WQVJJQUJMRSAqLwogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFH RSkKIAotI2RlZmluZSBwYWdlYmxvY2tfb3JkZXIJCW1pbl90KHVuc2lnbmVkIGludCwgSFBBR0Vf UE1EX09SREVSLCBNQVhfUEFHRV9PUkRFUikKKyNkZWZpbmUgcGFnZWJsb2NrX29yZGVyICgodW5z aWduZWQgaW50KUNPTlNUX01JTihIUEFHRV9QTURfT1JERVIsIE1BWF9QQUdFX09SREVSKSkKIAog I2Vsc2UgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAK --0000000000008d8e98061e2d4ffa Content-Type: text/x-csrc; charset="US-ASCII"; name="longest-line.c" Content-Disposition: attachment; filename="longest-line.c" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lz382uw01 I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5o PgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCnN0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpyZWFz b24pCnsKCWZwcmludGYoc3RkZXJyLCAiRmF0YWw6ICVzXG4iLCByZWFzb24pOwoJZXhpdCgxKTsK fQoKc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIHVuc2ln bmVkIGxvbmcgbGVuKQp7Cgl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CglkbyB7CgkJcmVzKys7CgkJ aWYgKCpsaW5lID09ICdcbicpCgkJCWJyZWFrOwoJCWxpbmUrKzsKCX0gd2hpbGUgKC0tbGVuKTsK CXJldHVybiByZXM7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RydWN0 IHN0YXQgc3Q7CgljaGFyICpidWY7Cgl1bnNpZ25lZCBsb25nIGxlbjsKCWxvbmcgbG9uZ2VzdCA9 IDA7CgljaGFyICpsaW5lID0gIiI7CglpbnQgbGluZW5vID0gMCwgaTsKCglpZiAoZnN0YXQoMCwg JnN0KSkgZGllKCJzdGF0Iik7CglpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpIGRpZSgiTm90IGEg cmVndWxhcmZpbGUiKTsKCWxlbiA9IHN0LnN0X3NpemU7CglidWYgPSBtYWxsb2MobGVuKTsKCWlm ICghYnVmKSBkaWUoIm1hbGxvYyBmYWlsZWQiKTsKCWlmIChyZWFkKDAsIGJ1ZiwgbGVuKSAhPSBs ZW4pIGRpZSgicmVhZCBmYWlsZWQiKTsKCglmb3IgKGkgPSAxOyBsZW47IGkrKykgewoJCXVuc2ln bmVkIGxvbmcgbGluZWxlbjsKCQlsaW5lbGVuID0gZmluZF9saW5lKGJ1ZiwgbGVuKTsKCQlpZiAo bGluZWxlbiA+IGxvbmdlc3QpIHsKCQkJbG9uZ2VzdCA9IGxpbmVsZW47CgkJCWxpbmUgPSBidWY7 CgkJCWxpbmVubyA9IGk7CgkJfQoJCWJ1ZiArPSBsaW5lbGVuOwoJCWxlbiAtPSBsaW5lbGVuOwoJ fQoKCXByaW50ZigiTG9uZ2VzdCBsaW5lIGlzICVkICglbHVrQilcbiIsIGxpbmVubywgKGxvbmdl c3QrNTEyKSAvIDEwMjQpOwoJcHJpbnRmKCIgICAnJS4qcydcbiIsIChpbnQpIGxvbmdlc3QtMSwg bGluZSk7CglyZXR1cm4gMDsKfQo= --0000000000008d8e98061e2d4ffa--