From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/112853 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Joey McCollum via ntg-context Newsgroups: gmane.comp.tex.context Subject: Re: Implementing a custom authorconversion for bibliographies Date: Tue, 14 Sep 2021 23:06:41 -0400 Message-ID: References: Reply-To: mailing list for ConTeXt users Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5924093453044165731==" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="9953"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Joey McCollum To: mailing list for ConTeXt users Original-X-From: ntg-context-bounces@ntg.nl Wed Sep 15 05:07:37 2021 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane-mx.org Original-Received: from zapf.boekplan.nl ([5.39.185.232] helo=zapf.ntg.nl) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mQLGr-0002R2-7M for gctc-ntg-context-518@m.gmane-mx.org; Wed, 15 Sep 2021 05:07:37 +0200 Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 688992875A1; Wed, 15 Sep 2021 05:07:06 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MdfSbairayVO; Wed, 15 Sep 2021 05:07:04 +0200 (CEST) Original-Received: from zapf.ntg.nl (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id EEDFC28757C; Wed, 15 Sep 2021 05:07:03 +0200 (CEST) Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 5BEB6287535 for ; Wed, 15 Sep 2021 05:07:02 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gYHJEkkNO1-a for ; Wed, 15 Sep 2021 05:07:01 +0200 (CEST) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.166.171; helo=mail-il1-f171.google.com; envelope-from=jmccollum20140511@gmail.com; receiver= Original-Received: from mail-il1-f171.google.com (mail-il1-f171.google.com [209.85.166.171]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by zapf.ntg.nl (Postfix) with ESMTPS id 22A82286947 for ; Wed, 15 Sep 2021 05:07:00 +0200 (CEST) Original-Received: by mail-il1-f171.google.com with SMTP id v16so1399026ilg.3 for ; Tue, 14 Sep 2021 20:07:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=buF+ozTYeFp3BWF/OLw4SABiK7lJqB9XzJlVX0VLbF0=; b=p9ucJ0srpP8ifgyVok8SRwaz+alDlYRXYbOm10BveLBOGa3XOw/zalk/y1iYW+cAj5 xYTQspeVj/xf8/rjRfG6O8CcFXLR6wbB1XoPRtZtbfNB8eD1HYfZkjQb8kIhFQKcWyzF O8/tSEl2PxsBEHkPn5iMygqy7Gc0ZAR7cs8pTOY4oqLbafBLG6zq/eVvdENPBKn5BPbt 9QfQmh7uAO2MoX8fXrOwv94fvqSFULUDFdYS/0BzXN6JAcm9iaMr8MUGJxROAvQyVKQo 6msxB/Sbh5SbvwvYL8EUlNhpAa3pP5lduH422yJ9xEQn8/hG84m2tqIOGnNegNYEALx5 tR2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=buF+ozTYeFp3BWF/OLw4SABiK7lJqB9XzJlVX0VLbF0=; b=TMBx8t84iCQfO9hVwzfdq48TS62oIrGfuV/a70cTbabkt81X3RY039KPwmUulMtUsv E34IQhpx14i1/bP+jcJmW1rWzWnOXMvD5byx49mhy/Pdn1uXYgc/iQIdErj6S0JbZ0jx dtvsYWCZ2yMOaFhhXSPwVOfGXGvsadoT2ITtNRqvPbREfmjGTymIyXqwfwKpnmpDulxf KYB3n1ItgxMrkDyFgRcDTnVJxWGlssu86LQwP2ILgUOuAiuwFCbI6FW2Touozm1YirS9 CaQdfFp33Beyr8w5A8QTd+Ww/XQjPL+DYerKFOblsDjBZ2HyI1TQK6LAwVMwdw13AekM ElAw== X-Gm-Message-State: AOAM532ZNjFa7kyPoOPU58dAd/S9trK6R5sP4MivVuPPUPg0znMhHKJM 4PwxT7gf1s49BYVV//B5YpcMaImNATWbUw/BW55Hea9jZhE= X-Google-Smtp-Source: ABdhPJx4HTuXF3nMBPUBWcbGYIyY5YoG1041AQpAmHep2aWWeJPyV8XtTv6x7LJJdhPjf8kPMaIamLBtcCqF4sdYe7U= X-Received: by 2002:a92:cb07:: with SMTP id s7mr14688089ilo.257.1631675219671; Tue, 14 Sep 2021 20:06:59 -0700 (PDT) In-Reply-To: X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.26 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ntg-context-bounces@ntg.nl Original-Sender: "ntg-context" Xref: news.gmane.io gmane.comp.tex.context:112853 Archived-At: --===============5924093453044165731== Content-Type: multipart/alternative; boundary="000000000000db80c505cbfffd24" --000000000000db80c505cbfffd24 Content-Type: text/plain; charset="UTF-8" All right, I figured out where I needed to make this change for it to take effect. The relevant script is publ-aut.lua. The code I needed to change was for the "oneauthor" function definition, which itself is located in the "btxauthor" function definition. My changes are detailed below: ``` local function oneauthor(i,last,justone) local author = split[i] if index then ctx_btxstartauthor(i,1,0) elseif last then ctx_btxstartauthor(i,1,0) ctx_btxsetconcat(0) if combiner == "invertedfirst" then if i == 1 then ctx_btxsetauthorvariant("inverted") else ctx_btxsetauthorvariant("normal") end else ctx_btxsetauthorvariant(combiner) end else local state = author.state or 0 ctx_btxstartauthor(i,max,state) ctx_btxsetconcat(concatstate(i,max)) if combiner == "invertedfirst" then if i == 1 then ctx_btxsetauthorvariant("inverted") else ctx_btxsetauthorvariant("normal") end else ctx_btxsetauthorvariant(combiner) end end local initials = author.initials if initials and #initials > 0 then ctx_btxsetinitials() -- (concat(the_initials(initials,symbol)," ")) end local firstnames = author.firstnames if firstnames and #firstnames > 0 then ctx_btxsetfirstnames() -- (concat(firstnames," ")) end local vons = author.vons if vons and #vons > 0 then ctx_btxsetvons() -- (concat(vons," ")) end local surnames = author.surnames if surnames and #surnames > 0 then ctx_btxsetsurnames() -- (concat(surnames," ")) end local juniors = author.juniors if juniors and #juniors > 0 then ctx_btxsetjuniors() -- (concat(juniors," ")) end if not index and i == max then if split.others then ctx_btxsetoverflow(1) else local overflow = #split - max if overflow > 0 then ctx_btxsetoverflow(overflow) end end end if combiner == "invertedfirst" then if i == 1 then ctx_btxsetup("inverted") else ctx_btxsetup("normal") end else ctx_btxsetup(combiner) end ctx_btxstopauthor() end ``` I'll admit that the addition of entire if-else blocks around whether or not the combiner is a specific value may not be the best practice in terms of future maintenance (especially if similar index-dependent authorconversions are needed in the future). Alternatively, the "btxauthor" function could populate a "combiners" array of length "max" with a specific authorconversion for each author in the split; for most authorconversions, all entries in this array would be the same, but for authorconversions like "invertedfirst", the first entry would be different from the rest. Then, the "oneauthor" function could just reference combiners[i] instead of combiner. Joey On Fri, Sep 3, 2021 at 10:48 PM Joey McCollum wrote: > Hi, > > I mentioned this in an earlier e-mail but thought that now might be a good > time to describe this issue in detail. I'd like to define a new > authorconversion that renders the first author in a list differently than > the remaining authors in the list. Specifically, I'd like to use the > "inverted" authorconversion for the first author and the "normal" > authorconversion for the rest. > > In the newer bibl-bib.lua file, I can see what I might have to modify to > accomplish this (I added the if combiner == "invertedfirst" block): > > ``` > function authors.concat(author,combiner,what,settings) > if type(combiner) == "string" then > combiner = authors[combiner or "normal"] or authors.normal > end > local split = splitauthors(author) > local setting = settings[what] > local etallimit, etaldisplay, etaltext = 1000, 1000, "" > if setting then > etallimit = settings.etallimit or 1000 > etaldisplay = settings.etaldisplay or etallimit > etalltext = settings.etaltext or "" > end > local max = #split > if max > etallimit and etaldisplay < max then > max = etaldisplay > end > if combiner == "invertedfirst" then > for i=1,max do > if i == 1 then > split[i] = authors.inverted(split[i],settings) > else > split[i] = authors.normal(split[i],settings) > end > > end > else > for i=1,max do > split[i] = combiner(split[i],settings) > end > end > local result = bibtexconcat(split,settings) > if max < #split then > return result > else > return result .. etaltext > end > end > ``` > > Unfortunately, this doesn't seem to do anything. It's not clear to me > how bibl-bib.lua and bibl-bib.mkiv are being used by the other publication > support modules, if they're being used at all (publ-ini.mkiv doesn't appear > to register it, anyway). Is there another file I'd have to change to make > "invertedfirst" a working authorconversion? Is there a similar block of > code in publ-ini.lua where I should be implementing this change instead? > > Thanks! > > Joey > --000000000000db80c505cbfffd24 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+QWxsIHJpZ2h0LCBJIGZpZ3VyZWQgb3V0IHdoZXJlIEkgbmVlZGVkIHRv IG1ha2UgdGhpcyBjaGFuZ2UgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiBUaGUgcmVsZXZhbnQgc2Ny aXB0IGlzIHB1YmwtYXV0Lmx1YS4gVGhlIGNvZGUgSSBuZWVkZWQgdG8gY2hhbmdlIHdhcyBmb3Ig dGhlICZxdW90O29uZWF1dGhvciZxdW90OyBmdW5jdGlvbiBkZWZpbml0aW9uLCB3aGljaCBpdHNl bGYgaXMgbG9jYXRlZCBpbiB0aGUgJnF1b3Q7YnR4YXV0aG9yJnF1b3Q7IGZ1bmN0aW9uIGRlZmlu aXRpb24uIE15IGNoYW5nZXMgYXJlIGRldGFpbGVkIGJlbG93Ojxicj48YnI+YGBgPGJyPsKgIMKg IMKgIMKgIGxvY2FsIGZ1bmN0aW9uIG9uZWF1dGhvcihpLGxhc3QsanVzdG9uZSk8YnI+wqAgwqAg wqAgwqAgwqAgwqAgbG9jYWwgYXV0aG9yID0gc3BsaXRbaV08YnI+wqAgwqAgwqAgwqAgwqAgwqAg aWYgaW5kZXggdGhlbjxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjdHhfYnR4c3RhcnRhdXRo b3IoaSwxLDApPGJyPsKgIMKgIMKgIMKgIMKgIMKgIGVsc2VpZiBsYXN0IHRoZW48YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgY3R4X2J0eHN0YXJ0YXV0aG9yKGksMSwwKTxicj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBjdHhfYnR4c2V0Y29uY2F0KDApPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGlmIGNvbWJpbmVyID09ICZxdW90O2ludmVydGVkZmlyc3QmcXVvdDsgdGhlbjxicj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiBpID09IDEgdGhlbjxicj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjdHhfYnR4c2V0YXV0aG9ydmFyaWFudCgmcXVvdDtpbnZl cnRlZCZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZSA8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY3R4X2J0eHNldGF1dGhvcnZhcmlhbnQo JnF1b3Q7bm9ybWFsJnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbmQ8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBjdHhfYnR4c2V0YXV0aG9ydmFyaWFudChjb21iaW5lcik8YnI+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgZW5kPGJyPsKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8YnI+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgbG9jYWwgc3RhdGUgPSBhdXRob3Iuc3RhdGUgb3IgMDxicj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBjdHhfYnR4c3RhcnRhdXRob3IoaSxtYXgsc3RhdGUpPGJyPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGN0eF9idHhzZXRjb25jYXQoY29uY2F0c3RhdGUoaSxtYXgpKTxicj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiBjb21iaW5lciA9PSAmcXVvdDtpbnZlcnRlZGZpcnN0 JnF1b3Q7IHRoZW48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgaSA9PSAxIHRo ZW48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY3R4X2J0eHNldGF1dGhv cnZhcmlhbnQoJnF1b3Q7aW52ZXJ0ZWQmcXVvdDspPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGVsc2UgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGN0eF9i dHhzZXRhdXRob3J2YXJpYW50KCZxdW90O25vcm1hbCZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgZW5kPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY3R4X2J0eHNldGF1dGhvcnZhcmlhbnQoY29tYmlu ZXIpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVuZDxicj7CoCDCoCDCoCDCoCDCoCDCoCBl bmQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgbG9jYWwgaW5pdGlhbHMgPSBhdXRob3IuaW5pdGlhbHM8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgaWYgaW5pdGlhbHMgYW5kICNpbml0aWFscyAmZ3Q7IDAgdGhl bjxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjdHhfYnR4c2V0aW5pdGlhbHMoKSAtLSAoY29u Y2F0KHRoZV9pbml0aWFscyhpbml0aWFscyxzeW1ib2wpLCZxdW90OyAmcXVvdDspKTxicj7CoCDC oCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgbG9jYWwgZmlyc3RuYW1lcyA9 IGF1dGhvci5maXJzdG5hbWVzPGJyPsKgIMKgIMKgIMKgIMKgIMKgIGlmIGZpcnN0bmFtZXMgYW5k ICNmaXJzdG5hbWVzICZndDsgMCB0aGVuPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGN0eF9i dHhzZXRmaXJzdG5hbWVzKCkgLS0gKGNvbmNhdChmaXJzdG5hbWVzLCZxdW90OyAmcXVvdDspKTxi cj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgbG9jYWwgdm9ucyA9 IGF1dGhvci52b25zPGJyPsKgIMKgIMKgIMKgIMKgIMKgIGlmIHZvbnMgYW5kICN2b25zICZndDsg MCB0aGVuPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGN0eF9idHhzZXR2b25zKCkgLS0gKGNv bmNhdCh2b25zLCZxdW90OyAmcXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAg wqAgwqAgwqAgwqAgwqAgbG9jYWwgc3VybmFtZXMgPSBhdXRob3Iuc3VybmFtZXM8YnI+wqAgwqAg wqAgwqAgwqAgwqAgaWYgc3VybmFtZXMgYW5kICNzdXJuYW1lcyAmZ3Q7IDAgdGhlbjxicj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBjdHhfYnR4c2V0c3VybmFtZXMoKSAtLSAoY29uY2F0KHN1cm5h bWVzLCZxdW90OyAmcXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAgwqAgwqAg wqAgwqAgwqAgbG9jYWwganVuaW9ycyA9IGF1dGhvci5qdW5pb3JzPGJyPsKgIMKgIMKgIMKgIMKg IMKgIGlmIGp1bmlvcnMgYW5kICNqdW5pb3JzICZndDsgMCB0aGVuPGJyPsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGN0eF9idHhzZXRqdW5pb3JzKCkgLS0gKGNvbmNhdChqdW5pb3JzLCZxdW90OyAm cXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgaWYg bm90IGluZGV4IGFuZCBpID09IG1heCB0aGVuPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlm IHNwbGl0Lm90aGVycyB0aGVuPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGN0eF9i dHhzZXRvdmVyZmxvdygxKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlPGJyPsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxvY2FsIG92ZXJmbG93ID0gI3NwbGl0IC0gbWF4PGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIG92ZXJmbG93ICZndDsgMCB0aGVuPGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGN0eF9idHhzZXRvdmVyZmxvdyhv dmVyZmxvdyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZW5kPGJyPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGVuZDxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+wqAgwqAgwqAg wqAgwqAgwqAgaWYgY29tYmluZXIgPT0gJnF1b3Q7aW52ZXJ0ZWRmaXJzdCZxdW90OyB0aGVuPGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIGkgPT0gMSB0aGVuPGJyPsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGN0eF9idHhzZXR1cCgmcXVvdDtpbnZlcnRlZCZxdW90Oyk8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZSA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgY3R4X2J0eHNldHVwKCZxdW90O25vcm1hbCZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgZW5kPGJyPsKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgY3R4X2J0eHNldHVwKGNvbWJpbmVyKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8YnI+ wqAgwqAgwqAgwqAgwqAgwqAgY3R4X2J0eHN0b3BhdXRob3IoKTxicj7CoCDCoCDCoCDCoCBlbmQ8 YnI+YGBgPGJyPjxicj5JJiMzOTtsbCBhZG1pdCB0aGF0IHRoZSBhZGRpdGlvbiBvZiBlbnRpcmUg aWYtZWxzZSBibG9ja3MgYXJvdW5kIHdoZXRoZXIgb3Igbm90IHRoZSBjb21iaW5lciBpcyBhIHNw ZWNpZmljIHZhbHVlIG1heSBub3QgYmUgdGhlIGJlc3QgcHJhY3RpY2UgaW4gdGVybXMgb2YgZnV0 dXJlIG1haW50ZW5hbmNlIChlc3BlY2lhbGx5IGlmIHNpbWlsYXIgaW5kZXgtZGVwZW5kZW50IGF1 dGhvcmNvbnZlcnNpb25zwqBhcmUgbmVlZGVkIGluIHRoZSBmdXR1cmUpLiBBbHRlcm5hdGl2ZWx5 LCB0aGUgJnF1b3Q7YnR4YXV0aG9yJnF1b3Q7wqBmdW5jdGlvbiBjb3VsZCBwb3B1bGF0ZSBhICZx dW90O2NvbWJpbmVycyZxdW90OyBhcnJheSBvZiBsZW5ndGggJnF1b3Q7bWF4JnF1b3Q7IHdpdGgg YSBzcGVjaWZpYyBhdXRob3Jjb252ZXJzaW9uIGZvciBlYWNoIGF1dGhvciBpbiB0aGUgc3BsaXQ7 IGZvciBtb3N0IGF1dGhvcmNvbnZlcnNpb25zLCBhbGwgZW50cmllcyBpbiB0aGlzIGFycmF5IHdv dWxkIGJlIHRoZSBzYW1lLCBidXQgZm9yIGF1dGhvcmNvbnZlcnNpb25zIGxpa2UgJnF1b3Q7aW52 ZXJ0ZWRmaXJzdCZxdW90OywgdGhlIGZpcnN0IGVudHJ5IHdvdWxkIGJlIGRpZmZlcmVudCBmcm9t IHRoZSByZXN0LiBUaGVuLCB0aGUgJnF1b3Q7b25lYXV0aG9yJnF1b3Q7IGZ1bmN0aW9uIGNvdWxk IGp1c3QgcmVmZXJlbmNlIGNvbWJpbmVyc1tpXSBpbnN0ZWFkIG9mIGNvbWJpbmVyLjxkaXY+PGJy PjwvZGl2PjxkaXY+Sm9leTwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+ PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIEZyaSwgU2VwIDMsIDIwMjEgYXQg MTA6NDggUE0gSm9leSBNY0NvbGx1bSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmptY2NvbGx1bTIwMTQw NTExQGdtYWlsLmNvbSI+am1jY29sbHVtMjAxNDA1MTFAZ21haWwuY29tPC9hPiZndDsgd3JvdGU6 PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjow cHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtw YWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IGRpcj0ibHRyIj5IaSw8ZGl2Pjxicj48L2Rpdj48ZGl2Pkkg bWVudGlvbmVkIHRoaXMgaW4gYW4gZWFybGllciBlLW1haWzCoGJ1dCB0aG91Z2h0IHRoYXQgbm93 IG1pZ2h0IGJlIGEgZ29vZCB0aW1lIHRvIGRlc2NyaWJlIHRoaXMgaXNzdWUgaW4gZGV0YWlsLiBJ JiMzOTtkIGxpa2UgdG8gZGVmaW5lIGEgbmV3IGF1dGhvcmNvbnZlcnNpb24gdGhhdCByZW5kZXJz IHRoZSBmaXJzdCBhdXRob3IgaW4gYSBsaXN0IGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlbWFpbmlu ZyBhdXRob3JzIGluIHRoZcKgbGlzdC4gU3BlY2lmaWNhbGx5LCBJJiMzOTtkIGxpa2UgdG8gdXNl IHRoZSAmcXVvdDtpbnZlcnRlZCZxdW90OyBhdXRob3Jjb252ZXJzaW9uIGZvciB0aGUgZmlyc3Qg YXV0aG9yIGFuZCB0aGUgJnF1b3Q7bm9ybWFsJnF1b3Q7IGF1dGhvcmNvbnZlcnNpb24gZm9yIHRo ZSByZXN0LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SW4gdGhlIG5ld2VyIGJpYmwtYmliLmx1 YcKgZmlsZSwgSSBjYW4gc2VlIHdoYXQgSSBtaWdodCBoYXZlIHRvIG1vZGlmeSB0byBhY2NvbXBs aXNoIHRoaXMgKEkgYWRkZWQgdGhlwqANCg0KaWYgY29tYmluZXIgPT0gJnF1b3Q7aW52ZXJ0ZWRm aXJzdCZxdW90O8KgIGJsb2NrKTo8YnI+PGJyPmBgYDxicj5mdW5jdGlvbiBhdXRob3JzLmNvbmNh dChhdXRob3IsY29tYmluZXIsd2hhdCxzZXR0aW5ncyk8YnI+wqAgwqAgaWYgdHlwZShjb21iaW5l cikgPT0gJnF1b3Q7c3RyaW5nJnF1b3Q7IHRoZW48YnI+wqAgwqAgwqAgwqAgY29tYmluZXIgPSBh dXRob3JzW2NvbWJpbmVyIG9yICZxdW90O25vcm1hbCZxdW90O10gb3IgYXV0aG9ycy5ub3JtYWw8 YnI+wqAgwqAgZW5kPGJyPsKgIMKgIGxvY2FsIHNwbGl0ID0gc3BsaXRhdXRob3JzKGF1dGhvcik8 YnI+wqAgwqAgbG9jYWwgc2V0dGluZyA9IHNldHRpbmdzW3doYXRdPGJyPsKgIMKgIGxvY2FsIGV0 YWxsaW1pdCwgZXRhbGRpc3BsYXksIGV0YWx0ZXh0ID0gMTAwMCwgMTAwMCwgJnF1b3Q7JnF1b3Q7 PGJyPsKgIMKgIGlmIHNldHRpbmcgdGhlbjxicj7CoCDCoCDCoCDCoCBldGFsbGltaXQgwqAgPSBz ZXR0aW5ncy5ldGFsbGltaXQgwqAgb3IgMTAwMDxicj7CoCDCoCDCoCDCoCBldGFsZGlzcGxheSA9 IHNldHRpbmdzLmV0YWxkaXNwbGF5IG9yIGV0YWxsaW1pdDxicj7CoCDCoCDCoCDCoCBldGFsbHRl eHQgwqAgPSBzZXR0aW5ncy5ldGFsdGV4dCDCoCDCoG9yICZxdW90OyZxdW90Ozxicj7CoCDCoCBl bmQ8YnI+wqAgwqAgbG9jYWwgbWF4ID0gI3NwbGl0PGJyPsKgIMKgIGlmIG1heCAmZ3Q7IGV0YWxs aW1pdCBhbmQgZXRhbGRpc3BsYXkgJmx0OyBtYXggdGhlbjxicj7CoCDCoCDCoCDCoCBtYXggPSBl dGFsZGlzcGxheTxicj7CoCDCoCBlbmQ8YnI+wqAgwqAgaWYgY29tYmluZXIgPT0gJnF1b3Q7aW52 ZXJ0ZWRmaXJzdCZxdW90OyB0aGVuPGJyPsKgIMKgIMKgIMKgIGZvciBpPTEsbWF4IGRvPGJyPsKg IMKgIMKgIMKgIMKgIMKgIGlmIGkgPT0gMSB0aGVuPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHNwbGl0W2ldID0gYXV0aG9ycy5pbnZlcnRlZChzcGxpdFtpXSxzZXR0aW5ncyk8YnI+wqAgwqAg wqAgwqAgwqAgwqAgZWxzZTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzcGxpdFtpXSA9IGF1 dGhvcnMubm9ybWFsKHNwbGl0W2ldLHNldHRpbmdzKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBlbmQ8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKgIMKgIGVuZDxicj7CoCDCoCBlbHNlPGJy PsKgIMKgIMKgIMKgIGZvciBpPTEsbWF4IGRvPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHNwbGl0W2ld ID0gY29tYmluZXIoc3BsaXRbaV0sc2V0dGluZ3MpPGJyPsKgIMKgIMKgIMKgIGVuZDxicj7CoCDC oCBlbmQ8YnI+wqAgwqAgbG9jYWwgcmVzdWx0ID0gYmlidGV4Y29uY2F0KHNwbGl0LHNldHRpbmdz KTxicj7CoCDCoCBpZiBtYXggJmx0OyAjc3BsaXQgdGhlbjxicj7CoCDCoCDCoCDCoCByZXR1cm4g cmVzdWx0PGJyPsKgIMKgIGVsc2U8YnI+wqAgwqAgwqAgwqAgcmV0dXJuIHJlc3VsdCAuLiBldGFs dGV4dDxicj7CoCDCoCBlbmQ8YnI+ZW5kPGJyPmBgYDxicj48YnI+VW5mb3J0dW5hdGVseSwgdGhp cyBkb2VzbiYjMzk7dCBzZWVtIHRvIGRvIGFueXRoaW5nLiBJdCYjMzk7cyBub3QgY2xlYXIgdG8g bWUgaG93wqBiaWJsLWJpYi5sdWEgYW5kIGJpYmwtYmliLm1raXYgYXJlIGJlaW5nIHVzZWQgYnkg dGhlIG90aGVyIHB1YmxpY2F0aW9uIHN1cHBvcnQgbW9kdWxlcywgaWYgdGhleSYjMzk7cmUgYmVp bmcgdXNlZCBhdCBhbGwgKHB1YmwtaW5pLm1raXYgZG9lc24mIzM5O3QgYXBwZWFyIHRvIHJlZ2lz dGVyIGl0LCBhbnl3YXkpLiBJcyB0aGVyZSBhbm90aGVyIGZpbGUgSSYjMzk7ZCBoYXZlIHRvIGNo YW5nZSB0byBtYWtlICZxdW90O2ludmVydGVkZmlyc3QmcXVvdDsgYSB3b3JraW5nIGF1dGhvcmNv bnZlcnNpb24/IElzIHRoZXJlIGEgc2ltaWxhciBibG9jayBvZiBjb2RlIGluIHB1YmwtaW5pLmx1 YSB3aGVyZSBJIHNob3VsZCBiZSBpbXBsZW1lbnRpbmcgdGhpcyBjaGFuZ2UgaW5zdGVhZD88L2Rp dj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rcyE8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkpv ZXk8L2Rpdj48L2Rpdj4NCjwvYmxvY2txdW90ZT48L2Rpdj4NCg== --000000000000db80c505cbfffd24-- --===============5924093453044165731== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSWYgeW91ciBxdWVzdGlvbiBpcyBvZiBpbnRlcmVz dCB0byBvdGhlcnMgYXMgd2VsbCwgcGxlYXNlIGFkZCBhbiBlbnRyeSB0byB0aGUgV2lraSEKCm1h aWxsaXN0IDogbnRnLWNvbnRleHRAbnRnLm5sIC8gaHR0cDovL3d3dy5udGcubmwvbWFpbG1hbi9s aXN0aW5mby9udGctY29udGV4dAp3ZWJwYWdlICA6IGh0dHA6Ly93d3cucHJhZ21hLWFkZS5ubCAv IGh0dHA6Ly9jb250ZXh0LmFhbmhldC5uZXQKYXJjaGl2ZSAgOiBodHRwczovL2JpdGJ1Y2tldC5v cmcvcGhnL2NvbnRleHQtbWlycm9yL2NvbW1pdHMvCndpa2kgICAgIDogaHR0cDovL2NvbnRleHRn YXJkZW4ubmV0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCg== --===============5924093453044165731==--