From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Protesilaos Stavrou Newsgroups: gmane.emacs.bugs Subject: bug#45068: [PATCH] Modus themes 1.2.0 Date: Fri, 05 Mar 2021 19:50:26 +0200 Message-ID: <87a6rhqyl9.fsf@protesilaos.com> References: <87im9fgm27.fsf@protesilaos.com> <83v9agryuz.fsf@gnu.org> <87tupyw83e.fsf@protesilaos.com> <83zgzqncxx.fsf@gnu.org> <874khwn1qf.fsf@protesilaos.com> <603b8171.1c69fb81.aa664.7f40@mx.google.com> <87mtvoxsvs.fsf@protesilaos.com> <603b9b9d.1c69fb81.f37aa.cb7c@mx.google.com> <83eegz7xcx.fsf@gnu.org> <87o8g3exjv.fsf@protesilaos.com> <603d053a.1c69fb81.f4cb8.fb14@mx.google.com> <87h7luga3p.fsf@protesilaos.com> <87o8g2bg89.fsf@tcd.ie> <87r1kyrtrl.fsf@protesilaos.com> <878s75x2uk.fsf@tcd.ie> <87o8g0ryfz.fsf@tcd.ie> <6040d37e.1c69fb81.63467.ad62@mx.google.com> <87wnun9dgo.fsf_-_@protesilaos.com> <87ft1aoj74.fsf@tcd.ie> <87eeguab7o.fsf@protesilaos.com> <87czwdikzd.fsf@tcd.ie> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="34433"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: 45068@debbugs.gnu.org, Mauro Aranda To: "Basil L. Contovounesios" Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Mar 05 19:44:40 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lIFRI-0008u4-4W for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 05 Mar 2021 19:44:40 +0100 Original-Received: from localhost ([::1]:55990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lIFRH-0004k2-24 for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 05 Mar 2021 13:44:39 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:46392) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lIEbO-0007k2-U9 for bug-gnu-emacs@gnu.org; Fri, 05 Mar 2021 12:51:03 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:52066) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lIEbO-0001gV-K6 for bug-gnu-emacs@gnu.org; Fri, 05 Mar 2021 12:51:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lIEbO-0007oy-H0 for bug-gnu-emacs@gnu.org; Fri, 05 Mar 2021 12:51:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Protesilaos Stavrou Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 05 Mar 2021 17:51:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 45068 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 45068-submit@debbugs.gnu.org id=B45068.161496664030029 (code B ref 45068); Fri, 05 Mar 2021 17:51:02 +0000 Original-Received: (at 45068) by debbugs.gnu.org; 5 Mar 2021 17:50:40 +0000 Original-Received: from localhost ([127.0.0.1]:35380 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIEb2-0007oH-6k for submit@debbugs.gnu.org; Fri, 05 Mar 2021 12:50:40 -0500 Original-Received: from relay8-d.mail.gandi.net ([217.70.183.201]:55001) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIEb0-0007o1-5m for 45068@debbugs.gnu.org; Fri, 05 Mar 2021 12:50:38 -0500 X-Originating-IP: 94.46.225.161 Original-Received: from kronos (unknown [94.46.225.161]) (Authenticated sender: public@protesilaos.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 9FBE01BF20D; Fri, 5 Mar 2021 17:50:28 +0000 (UTC) In-Reply-To: <87czwdikzd.fsf@tcd.ie> (Basil L. Contovounesios's message of "Fri, 05 Mar 2021 17:11:34 +0000") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:201568 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 T24gMjAyMS0wMy0wNSwgMTc6MTEgKzAwMDAsICJCYXNpbCBMLiBDb250b3ZvdW5lc2lvcyIgPGNv bnRvdm9iQHRjZC5pZT4gd3JvdGU6DQoNCj4+Pj4gKysgSWRlYXMgYW5kIHVzZXIgZmVlZGJhY2sg OjogQWFyb24gSmVuc2VuLCBBZGFtIFNwaWVycywgQWRyaWFuIE1hbmVhLA0KPj4+PiArICBBbGV4 IEdyaWZmaW4sIEFsZXggUGVpdHNpbmlzLCBBbGV4ZXkgU2htYWxrbywgQWxvayBTaW5naCwgQW5k ZXJzDQo+Pj4+ICsgIEpvaGFuc3NvbiwgQW5kcsOpIEFsZXhhbmRyZSBHb21lcywgQXJpZiBSZXph aSwgQmFzaWwgTC4gQ29udG92b3VuZXNpb3MsDQo+Pj4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eDQo+Pj4gSG9wZWZ1bGx5IE9yZydz IFRleGluZm8gZXhwb3J0IGNhbiBvbmUgZGF5IGJlIHRhdWdodCB0aGF0IHRoaXMgaXMgbm90DQo+ Pj4gdGhlIGVuZCBvZiBhIHNlbnRlbmNlIDspLg0KPj4NCj4+IEFoIHllcywgSSByZWNhbGwgbm90 aWNpbmcgdGhhdCEgIENhbiB3ZSBjaXJjdW12ZW50IGl0IHNvbWVob3c/ICBQZXJoYXBzDQo+PiBi eSBvbWl0dGluZyB0aGUgc3BhY2U/DQo+DQo+IE9yIHRoZSAnTC4gJyB3aG9sZXNhbGUsIGJ1dCB1 c2luZyBAOiBhcyB5b3UndmUgZG9uZSBpcyBhbHNvIGZpbmUgOykuDQoNCkkgcHJlZmVycmVkIHRv IGtlZXAgdGhlIG5hbWUgdGhlIHdheSB5b3UgdXNlIGl0LCBzbyBhcyB0byBhdm9pZA0KYW1iaWd1 aXR5ICh0aG91Z2ggSSB3b3VsZCBub3QgbWluZCBpZiB5b3VyIGRvcHBlbGfDpG5nZXIgd2FzIGFs c28gaGFja2luZw0Kb24gRWxpc3AhKS4NCg0KPj4+PiArKGRlZnRoZW1lIG1vZHVzLXZpdmVuZGkN Cj4+Pj4gKyAgIkFjY2Vzc2libGUgYW5kIGN1c3RvbWl6YWJsZSBsaWdodCB0aGVtZSAoV0NBRyBB QUEgc3RhbmRhcmQpLg0KPj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5e Xg0KPj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJrDQo+Pg0KPj4gRml4 ZWQhDQo+Pg0KPj4gWyBBbnN3ZXIgb25seSBpZiBpdCBpcyBlYXN5OiBob3cgZG8geW91IGRyYXcg dGhvc2UgXl5eIGJlbG93IHRoZSB0ZXh0PyBdDQo+DQo+IElmIHRoZSBhbnN3ZXIgaXMgZWFzeSwg b3IgZHJhd2luZyB0aGUgY2lyY3VtZmxleGVzIGlzIGVhc3k/IDspDQo+DQo+IEVpdGhlciB3YXks IHRoZSBhbnN3ZXIgaXMgYm9yaW5nOiBJIGNyZWF0ZSBhIG5ldyBsaW5lLCBhZGQgdGhlDQo+IGFw cHJvcHJpYXRlIGluZGVudGF0aW9uIGUuZy4gdXNpbmcgaW5kZW50LXJlbGF0aXZlLCBhbmQgdGhl biBhZGQgdGhlDQo+IGNpcmN1bWZsZXhlcyBtYW51YWxseS4gIE1heWJlIHNvbWVvbmUgZWxzZSBr bm93cyBhIGZhc3RlciB0cmljay4NCg0KQWggb2theSwgdGhhbmtzIQ0KDQo+PiBPbiAyMDIxLTAz LTA0LCAxMzo1MyAtMDMwMCwgTWF1cm8gQXJhbmRhIDxtYXVyb29hcmFuZGFAZ21haWwuY29tPiB3 cm90ZToNCj4+DQo+Pj4+IDs7OyMjI2F1dG9sb2FkDQo+Pj4+ICh3aGVuIChhbmQgKGJvdW5kcCAn Y3VzdG9tLXRoZW1lLWxvYWQtcGF0aCkgbG9hZC1maWxlLW5hbWUpDQo+Pj4+ICAgKGFkZC10by1s aXN0ICdjdXN0b20tdGhlbWUtbG9hZC1wYXRoDQo+Pj4+ICAgICAgICAgICAgICAgIChmaWxlLW5h bWUtYXMtZGlyZWN0b3J5IChmaWxlLW5hbWUtZGlyZWN0b3J5IGxvYWQtZmlsZS1uYW1lKSkpKQ0K Pj4+DQo+Pj4gQSBuaXQ6IEkgdGhpbmsgdGhpcyBjb2RlIHNob3VsZCBhdm9pZCBhZGRpbmcgdGhl IHZhbHVlIG9mDQo+Pj4gY3VzdG9tLXRoZW1lLWRpcmVjdG9yeSBvciB0aGUgYnVpbHQtaW4gdGhl bWUgZGlyZWN0b3J5IG5hbWUgdG8NCj4+PiBjdXN0b20tdGhlbWUtbG9hZC1wYXRoICwgaWYgYGN1 c3RvbS10aGVtZS1kaXJlY3RvcnknIChmb3IgdGhlIGZvcm1lcikgb3INCj4+PiB0IChmb3IgdGhl IGxhdHRlcikgYXJlIGFscmVhZHkgcHJlc2VudCBpbiBjdXN0b20tdGhlbWUtbG9hZC1wYXRoLiAg SW4NCj4+PiBwYXJ0aWN1bGFyLCBhIHRoZW1lIGRpc3RyaWJ1dGVkIHdpdGggRW1hY3Mgc2hvdWxk IGF0IGxlYXN0IGNoZWNrIGZvciB0LA0KPj4+IHRvIGF2b2lkIGEgcmVwZWF0ZWQgZW50cnkuDQo+ Pj4NCj4+PiBJJ3ZlIG5vdGljZWQgdGhhdCB0aGUgbGV1dmVuIHRoZW1lIGhhcyBhIHNpbWlsYXIg Y29kZSBhcyB3ZWxsOiBJIHRoaW5rDQo+Pj4gdGhhdCBpcyBhIChyZWFsbHkgbWlub3IpIGJ1Zy4N Cj4+DQo+PiBJIGhhdmUgcmVtb3ZlZCB0aGF0IGZvcm0gYWx0b2dldGhlci4gIEl0IG1ha2VzIHNl bnNlIGZvciBwYWNrYWdlcyBidXQNCj4+IGhlcmUgdGhleSBhcmUgc2FmZSB0aGVtZXMuICBJcyB0 aGF0IG9rYXksIG9yIGhhdmUgSSBtaXN1bmRlcnN0b29kDQo+PiBzb21ldGhpbmc/DQo+DQo+IElm IHlvdSBkb24ndCBtaW5kIHRoZSAobWlub3IpIG1haW50ZW5hbmNlIG92ZXJoZWFkIG9mIHJlbW92 aW5nIHRoZSBmb3JtDQo+IGluIGVtYWNzLmdpdCwgdGhlbiB0aGF0J3MgZmluZS4gIEFsdGVybmF0 aXZlbHksIGEgbW9yZSBEV0lNIGFwcHJvYWNoDQo+IGNvdWxkIGJlIHNvbWV0aGluZyBsaWtlIHRo aXM6DQo+DQo+ICAgOzs7IyMjYXV0b2xvYWQNCj4gICAod2hlbiBsb2FkLWZpbGUtbmFtZQ0KPiAg ICAgKGxldCAoKGRpciAoZmlsZS1uYW1lLWRpcmVjdG9yeSBsb2FkLWZpbGUtbmFtZSkpKQ0KPiAg ICAgICAodW5sZXNzIChlcXVhbCBkaXIgKGV4cGFuZC1maWxlLW5hbWUgInRoZW1lcy8iIGRhdGEt ZGlyZWN0b3J5KSkNCj4gICAgICAgICAoYWRkLXRvLWxpc3QgJ2N1c3RvbS10aGVtZS1sb2FkLXBh dGggZGlyKSkpKQ0KPg0KPiBJJ20gbm90IHN1cmUgaWYgdGhpcyB3b3JrcyBvbiBub24tR05VL0xp bnV4IHBsYXRmb3JtcywgdGhvdWdoLg0KPiBEb2VzIGFueW9uZSBlbHNlIGtub3cgb3IgaGF2ZSBh IGJldHRlciBzdWdnZXN0aW9uPw0KPg0KPiBJdCBjb3VsZCBwcm9iYWJseSB1c2UgZmlsZS1pbi1k aXJlY3RvcnktcCBpbnN0ZWFkLCBidXQgdGhhdCdzIHF1aXRlIGENCj4gYml0IHNsb3dlciB0aGFu IGZpbGUtbmFtZS1kaXJlY3RvcnkgKyBleHBhbmQtZmlsZS1uYW1lLCBhdCBsZWFzdCBpbg0KPiBy ZWxhdGl2ZSB0ZXJtcy4NCj4NCj4gTGV0IG1lIGtub3cgd2hhdCB3b3JrcyBiZXN0IGZvciB5b3Uu DQoNCkkgd291bGQgcHJlZmVyIHRvIGF2b2lkIHRoZSBleHRyYSBtYWludGVuYW5jZSBjb3N0LCBu b3QgYmVjYXVzZSBJIG1pbmQNCmRvaW5nIHRoZSBhZGRlZCB3b3JrLCBidXQgaXQgY2FuIGJlIGEg Y2F1c2UgZm9yIGVycm9ycy4NCg0KVG8gbWUgeW91ciBzbmlwcGV0IGxvb2tzIHJpZ2h0LCB0aG91 Z2ggSSBhbSB1c2luZyBHTlUvTGludXggZXhjbHVzaXZlbHkuDQpJIGp1c3QgYWRkZWQgaXQgdG8g bXkgZmlsZSAoY2l0aW5nIHlvdSBhcyB0aGUgYXV0aG9yKSBhbmQgdXBkYXRlZCBteQ0KcmVwbyB0 byB2ZXJzaW9uIDEuMi4zLCB3aGljaCBpbmNsdWRlcyBldmVyeSBjaGFuZ2Ugd2UgaGF2ZSBjb3Zl cmVkIGluDQp0aGlzIHRocmVhZC4NCg0KPiBGb2xsb3dpbmcgdGhlIGRpc2N1c3Npb24gaW46DQo+ DQo+ICAgaHR0cHM6Ly9naXRsYWIuY29tL3Byb3Rlc2lsYW9zL21vZHVzLXRoZW1lcy8tL2lzc3Vl cy8xNjINCj4NCj4gSSdtIHByZXBhcmluZyB0byB1cGRhdGUgZW1hY3MuZ2l0IHRvIE1vZHVzIHZl cnNpb24gMS4yLjIuICBJIGp1c3Qgd2FudA0KPiB0byBjbGFyaWZ5IGEgdGhpbmcgaGVyZSBhbmQg dGhlcmUgZmlyc3QsIHNvIHN0YXkgdHVuZWQuDQoNCk5vdyB2ZXJzaW9uIDEuMi4zLiAgSSBndWVz cyB5b3UgcHJlZmVyIHRoZSBmaWxlcyBvdmVyIGEgcGF0Y2g/ICBJIGF0dGFjaA0KdGhlbS4NCg0K LS0gDQpQcm90ZXNpbGFvcyBTdGF2cm91DQpwcm90ZXNpbGFvcy5jb20NCg== --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=modus-operandi-theme.el ;;; modus-operandi-theme.el --- Accessible light theme (WCAG AAA) -*- lexical-binding:t -*- ;; Copyright (C) 2019-2021 Free Software Foundation, Inc. ;; Author: Protesilaos Stavrou ;; URL: https://gitlab.com/protesilaos/modus-themes ;; Version: 1.2.3 ;; Package-Requires: ((emacs "26.1")) ;; Keywords: faces, theme, accessibility ;; This file is part of GNU Emacs. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or (at ;; your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; ;; Modus Operandi is the light variant of the Modus themes (Modus ;; Vivendi is the dark one). The themes are designed for color-contrast ;; accessibility. More specifically: ;; ;; 1. Provide a consistent minimum contrast ratio between background ;; and foreground values of 7:1 or higher. This meets the highest ;; such accessibility criterion per the guidelines of the Worldwide ;; Web Consortium's Working Group on Accessibility (WCAG AAA ;; standard). ;; ;; 2. Offer as close to full face coverage as possible. The list is ;; already quite long, with more additions to follow as part of the ;; ongoing development process. ;; ;; For a complete view of the project, also refer to the following files ;; (should be distributed in the same repository/directory as the ;; current item): ;; ;; - modus-themes.el (Main code shared between the themes) ;; - modus-vivendi-theme.el (Dark theme) ;;; Code: (eval-and-compile (unless (and (fboundp 'require-theme) (require-theme 'modus-themes t)) (require 'modus-themes))) (deftheme modus-operandi "Accessible and customizable light theme (WCAG AAA standard). Conforms with the highest legibility standard for color contrast between background and foreground in any given piece of text, which corresponds to a minimum contrast in relative luminance of 7:1.") (modus-themes-theme modus-operandi) (provide-theme 'modus-operandi) ;;; modus-operandi-theme.el ends here --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=modus-themes.el ;;; modus-themes.el --- Highly accessible themes (WCAG AAA) -*- lexical-binding:t -*- ;; Copyright (C) 2019-2021 Free Software Foundation, Inc. ;; Author: Protesilaos Stavrou ;; URL: https://gitlab.com/protesilaos/modus-themes ;; Version: 1.2.3 ;; Package-Requires: ((emacs "26.1")) ;; Keywords: faces, theme, accessibility ;; This file is part of GNU Emacs. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or (at ;; your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; ;; The Modus themes conform with the highest standard for color-contrast ;; accessibility between background and foreground values (WCAG AAA). ;; This file contains all customization options, helper functions, ;; interactive commands, and face specifications. Please refer to the ;; official Info manual for further documentation (distributed with the ;; themes, or available at: ). ;; ;; The themes share the following customization options, all of which ;; are disabled by default (nil): ;; ;; modus-themes-slanted-constructs (boolean) ;; modus-themes-bold-constructs (boolean) ;; modus-themes-variable-pitch-headings (boolean) ;; modus-themes-variable-pitch-ui (boolean) ;; modus-themes-no-mixed-fonts (boolean) ;; modus-themes-headings (alist) ;; modus-themes-scale-headings (boolean) ;; modus-themes-fringes (choice) ;; modus-themes-lang-checkers (choice) ;; modus-themes-org-blocks (choice) ;; modus-themes-org-habit (choice) ;; modus-themes-prompts (choice) ;; modus-themes-mode-line (choice) ;; modus-themes-diffs (choice) ;; modus-themes-syntax (choice) ;; modus-themes-intense-hl-line (boolean) ;; modus-themes-subtle-line-numbers (boolean) ;; modus-themes-paren-match (choice) ;; modus-themes-region (choice) ;; modus-themes-links (choice) ;; modus-themes-completions (choice) ;; ;; The default scale for headings is as follows (it can be customized as ;; well---remember, no scaling takes place by default): ;; ;; modus-themes-scale-1 1.05 ;; modus-themes-scale-2 1.1 ;; modus-themes-scale-3 1.15 ;; modus-themes-scale-4 1.2 ;; modus-themes-scale-5 1.3 ;; ;; There also exist two unique customization options for overriding ;; color palette values. The specifics are documented in the manual. ;; The symbols are: ;; ;; modus-themes-operandi-color-overrides (alist) ;; modus-themes-vivendi-color-overrides (alist) ;; ;; Below is the list of explicitly supported packages or face groups ;; (there are implicitly supported packages as well, which inherit from ;; font-lock or some basic group). You are encouraged to report any ;; missing package or change you would like to see. ;; ;; ace-window ;; ag ;; alert ;; all-the-icons ;; annotate ;; anzu ;; apropos ;; apt-sources-list ;; artbollocks-mode ;; auctex and TeX ;; auto-dim-other-buffers ;; avy ;; awesome-tray ;; bbdb ;; binder ;; bm ;; bongo ;; boon ;; breakpoint (provided by built-in gdb-mi.el) ;; buffer-expose ;; calendar and diary ;; calfw ;; centaur-tabs ;; cfrs ;; change-log and log-view (`vc-print-log' and `vc-print-root-log') ;; cider ;; circe ;; color-rg ;; column-enforce-mode ;; company-mode ;; company-posframe ;; compilation-mode ;; completions ;; consult ;; counsel ;; counsel-css ;; counsel-notmuch ;; counsel-org-capture-string ;; cov ;; cperl-mode ;; csv-mode ;; ctrlf ;; custom (M-x customize) ;; dap-mode ;; dashboard (emacs-dashboard) ;; deadgrep ;; debbugs ;; define-word ;; deft ;; dictionary ;; diff-hl ;; diff-mode ;; dim-autoload ;; dir-treeview ;; dired ;; dired-async ;; dired-git ;; dired-git-info ;; dired-narrow ;; dired-subtree ;; diredc ;; diredfl ;; diredp (dired+) ;; disk-usage ;; display-fill-column-indicator-mode ;; doom-modeline ;; dynamic-ruler ;; easy-jekyll ;; easy-kill ;; ebdb ;; ediff ;; eglot ;; el-search ;; eldoc ;; eldoc-box ;; elfeed ;; elfeed-score ;; emms ;; enhanced-ruby-mode ;; epa ;; equake ;; erc ;; eros ;; ert ;; eshell ;; eshell-fringe-status ;; eshell-git-prompt ;; eshell-prompt-extras (epe) ;; eshell-syntax-highlighting ;; evil (evil-mode) ;; evil-goggles ;; evil-snipe ;; evil-visual-mark-mode ;; eww ;; exwm ;; eyebrowse ;; fancy-dabbrev ;; flycheck ;; flycheck-color-mode-line ;; flycheck-indicator ;; flycheck-posframe ;; flymake ;; flyspell ;; flyspell-correct ;; flx ;; freeze-it ;; frog-menu ;; focus ;; fold-this ;; font-lock (generic syntax highlighting) ;; forge ;; fountain (fountain-mode) ;; geiser ;; git-commit ;; git-gutter (and variants) ;; git-lens ;; git-rebase ;; git-timemachine ;; git-walktree ;; gnus ;; golden-ratio-scroll-screen ;; helm ;; helm-ls-git ;; helm-switch-shell ;; helm-xref ;; helpful ;; highlight-blocks ;; highlight-defined ;; highlight-escape-sequences (`hes-mode') ;; highlight-indentation ;; highlight-numbers ;; highlight-symbol ;; highlight-tail ;; highlight-thing ;; hl-defined ;; hl-fill-column ;; hl-line-mode ;; hl-todo ;; hydra ;; hyperlist ;; ibuffer ;; icomplete ;; ido-mode ;; iedit ;; iflipb ;; imenu-list ;; indium ;; info ;; info-colors ;; interaction-log ;; ioccur ;; isearch, occur, etc. ;; isl (isearch-light) ;; ivy ;; ivy-posframe ;; jira (org-jira) ;; journalctl-mode ;; js2-mode ;; julia ;; jupyter ;; kaocha-runner ;; keycast ;; line numbers (`display-line-numbers-mode' and global variant) ;; lsp-mode ;; lsp-ui ;; macrostep ;; magit ;; magit-imerge ;; make-mode ;; man ;; marginalia ;; markdown-mode ;; markup-faces (`adoc-mode') ;; mentor ;; messages ;; minibuffer-line ;; minimap ;; mmm-mode ;; modeline ;; mood-line ;; mpdel ;; mu4e ;; mu4e-conversation ;; multiple-cursors ;; neotree ;; no-emoji ;; notmuch ;; num3-mode ;; nxml-mode ;; objed ;; orderless ;; org ;; org-journal ;; org-noter ;; org-pomodoro ;; org-recur ;; org-roam ;; org-superstar ;; org-table-sticky-header ;; org-tree-slide ;; org-treescope ;; origami ;; outline-mode ;; outline-minor-faces ;; package (M-x list-packages) ;; page-break-lines ;; paradox ;; paren-face ;; parrot ;; pass ;; pdf-tools ;; persp-mode ;; perspective ;; phi-grep ;; phi-search ;; pkgbuild-mode ;; pomidor ;; popup ;; powerline ;; powerline-evil ;; prism (see "Note for prism.el" in the manual) ;; proced ;; prodigy ;; quick-peek ;; racket-mode ;; rainbow-blocks ;; rainbow-identifiers ;; rainbow-delimiters ;; rcirc ;; recursion-indicator ;; regexp-builder (also known as `re-builder') ;; rg ;; ripgrep ;; rmail ;; ruler-mode ;; sallet ;; selectrum ;; selectrum-prescient ;; semantic ;; sesman ;; shell-script-mode ;; shortdoc ;; show-paren-mode ;; shr ;; side-notes ;; sieve-mode ;; skewer-mode ;; smart-mode-line ;; smartparens ;; smerge ;; spaceline ;; speedbar ;; spell-fu ;; spray ;; stripes ;; suggest ;; switch-window ;; swiper ;; swoop ;; sx ;; symbol-overlay ;; tab-bar-mode ;; tab-line-mode ;; syslog-mode ;; table (built-in table.el) ;; telephone-line ;; terraform-mode ;; term ;; tomatinho ;; transient (pop-up windows like Magit's) ;; trashed ;; treemacs ;; tty-menu ;; tuareg ;; typescript ;; undo-tree ;; vc (built-in mode line status for version control) ;; vc-annotate (C-x v g) ;; vdiff ;; vimish-fold ;; visible-mark ;; visual-regexp ;; volatile-highlights ;; vterm ;; wcheck-mode ;; web-mode ;; wgrep ;; which-function-mode ;; which-key ;; whitespace-mode ;; window-divider-mode ;; winum ;; writegood-mode ;; woman ;; xah-elisp-mode ;; xref ;; xterm-color (and ansi-colors) ;; yaml-mode ;; yasnippet ;; ztree ;; ;; For a complete view of the project, also refer to the following files ;; (should be distributed in the same repository/directory as the ;; current item): ;; ;; - modus-operandi-theme.el (Light theme) ;; - modus-vivendi-theme.el (Dark theme) ;;; Code: (eval-when-compile (require 'cl-lib)) (defgroup modus-themes () "Options for `modus-operandi', `modus-vivendi'." :group 'faces :link '(info-link "(modus-themes) Top") :prefix "modus-themes-" :tag "Modus Themes") ;;; Variables for each theme variant ;;;; Modus Operandi (define-obsolete-variable-alias 'modus-operandi-theme-default-colors-alist 'modus-themes-colors-operandi "1.0.0") (define-obsolete-variable-alias 'modus-themes-colors-operandi 'modus-themes-operandi-colors "1.1.0") (defconst modus-themes-operandi-colors '(;; base values (bg-main . "#ffffff") (fg-main . "#000000") (bg-dim . "#f8f8f8") (fg-dim . "#282828") (bg-alt . "#f0f0f0") (fg-alt . "#505050") ;; specifically for on/off states and must be combined with ;; themselves, though the backgrounds are also meant to be used with ;; other "active" values, defined further below (bg-active . "#d7d7d7") (fg-active . "#0a0a0a") (bg-inactive . "#efefef") (fg-inactive . "#404148") ;; these special values are intended as alternatives to the base ;; values for cases where we need to avoid confusion between the ;; highlighted constructs; they must either be used as pairs based ;; on their name or each can be combined with {fg,bg}-{main,alt,dim} ;; always in accordance with their role as background or foreground (bg-special-cold . "#dde3f4") (fg-special-cold . "#093060") (bg-special-mild . "#c4ede0") (fg-special-mild . "#184034") (bg-special-warm . "#f0e0d4") (fg-special-warm . "#5d3026") (bg-special-calm . "#f8ddea") (fg-special-calm . "#61284f") ;; foregrounds that can be combined with bg-main, bg-dim, bg-alt (red . "#a60000") (red-alt . "#972500") (red-alt-other . "#a0132f") (red-faint . "#7f1010") (red-alt-faint . "#702f00") (red-alt-other-faint . "#7f002f") (green . "#005e00") (green-alt . "#315b00") (green-alt-other . "#145c33") (green-faint . "#104410") (green-alt-faint . "#30440f") (green-alt-other-faint . "#0f443f") (yellow . "#813e00") (yellow-alt . "#70480f") (yellow-alt-other . "#863927") (yellow-faint . "#5f4400") (yellow-alt-faint . "#5d5000") (yellow-alt-other-faint . "#5e3a20") (blue . "#0031a9") (blue-alt . "#2544bb") (blue-alt-other . "#0000c0") (blue-faint . "#003497") (blue-alt-faint . "#0f3d8c") (blue-alt-other-faint . "#001087") (magenta . "#721045") (magenta-alt . "#8f0075") (magenta-alt-other . "#5317ac") (magenta-faint . "#752f50") (magenta-alt-faint . "#7b206f") (magenta-alt-other-faint . "#55348e") (cyan . "#00538b") (cyan-alt . "#30517f") (cyan-alt-other . "#005a5f") (cyan-faint . "#005077") (cyan-alt-faint . "#354f6f") (cyan-alt-other-faint . "#125458") ;; these foreground values can only be combined with bg-main and are ;; thus not suitable for general purpose highlighting (red-intense . "#b60000") (orange-intense . "#904200") (green-intense . "#006800") (yellow-intense . "#605b00") (blue-intense . "#1f1fce") (magenta-intense . "#a8007f") (purple-intense . "#7f10d0") (cyan-intense . "#005f88") ;; those foregrounds are meant exclusively for bg-active, bg-inactive (red-active . "#8a0000") (green-active . "#004c2e") (yellow-active . "#702d1f") (blue-active . "#0030b4") (magenta-active . "#5c2092") (cyan-active . "#003f8a") ;; the "subtle" values below be combined with fg-dim, while the ;; "intense" should be paired with fg-main (red-subtle-bg . "#f2b0a2") (red-intense-bg . "#ff8892") (green-subtle-bg . "#aecf90") (green-intense-bg . "#5ada88") (yellow-subtle-bg . "#e4c340") (yellow-intense-bg . "#f5df23") (blue-subtle-bg . "#b5d0ff") (blue-intense-bg . "#6aaeff") (magenta-subtle-bg . "#f0d3ff") (magenta-intense-bg . "#d5baff") (cyan-subtle-bg . "#c0efff") (cyan-intense-bg . "#42cbd4") ;; those background values must be combined with fg-main and should ;; only be used for indicators that are placed on the fringes (red-fringe-bg . "#f08290") (green-fringe-bg . "#62c86a") (yellow-fringe-bg . "#dbba3f") (blue-fringe-bg . "#82afff") (magenta-fringe-bg . "#e0a3ff") (cyan-fringe-bg . "#2fcddf") ;; those background values should only be used for graphs or similar ;; applications where colored blocks are expected to be positioned ;; next to each other (red-graph-0-bg . "#ef6f79") (red-graph-1-bg . "#ff9f9f") (green-graph-0-bg . "#49d239") (green-graph-1-bg . "#6dec6d") (yellow-graph-0-bg . "#efec08") (yellow-graph-1-bg . "#dbff4e") (blue-graph-0-bg . "#55a2f0") (blue-graph-1-bg . "#7fcfff") (magenta-graph-0-bg . "#ba86ef") (magenta-graph-1-bg . "#e7afff") (cyan-graph-0-bg . "#30d3f0") (cyan-graph-1-bg . "#6fefff") ;; the following are for cases where both the foreground and the ;; background need to have a similar hue and so must be combined ;; with themselves, even though the foregrounds can be paired with ;; any of the base backgrounds (red-refine-bg . "#ffcccc") (red-refine-fg . "#780000") (green-refine-bg . "#aceaac") (green-refine-fg . "#004c00") (yellow-refine-bg . "#fff29a") (yellow-refine-fg . "#604000") (blue-refine-bg . "#8ac7ff") (blue-refine-fg . "#002288") (magenta-refine-bg . "#ffccff") (magenta-refine-fg . "#770077") (cyan-refine-bg . "#8eecf4") (cyan-refine-fg . "#004850") ;; the "nuanced" backgrounds can be combined with all of the above ;; foregrounds, as well as those included here, while the "nuanced" ;; foregrounds can in turn also be combined with bg-main, bg-dim, ;; bg-alt (red-nuanced-bg . "#fff1f0") (red-nuanced-fg . "#5f0000") (green-nuanced-bg . "#ecf7ed") (green-nuanced-fg . "#004000") (yellow-nuanced-bg . "#fff3da") (yellow-nuanced-fg . "#3f3000") (blue-nuanced-bg . "#f3f3ff") (blue-nuanced-fg . "#201f55") (magenta-nuanced-bg . "#fdf0ff") (magenta-nuanced-fg . "#541f4f") (cyan-nuanced-bg . "#ebf6fa") (cyan-nuanced-fg . "#0f3360") ;; the following are reserved for specific cases ;; ;; bg-hl-line is between bg-dim and bg-alt, so it should ;; work with all accents that cover those two, plus bg-main ;; ;; bg-hl-alt and bg-hl-alt-intense should only be used when no ;; other greyscale or fairly neutral background is available to ;; properly draw attention to a given construct ;; ;; bg-header is between bg-active and bg-inactive, so it ;; can be combined with any of the "active" values, plus the ;; "special" and base foreground colors ;; ;; bg-paren-match, bg-paren-match-intense, bg-region and ;; bg-tab-active must be combined with fg-main, while ;; bg-tab-inactive should be combined with fg-dim, whereas ;; bg-tab-inactive-alt goes together with fg-main ;; ;; bg-tab-bar is only intended for the bar that holds the tabs and ;; can only be combined with fg-main ;; ;; fg-tab-active is meant to be combined with bg-tab-active, ;; though only for styling special elements, such as underlining ;; the current tab ;; ;; fg-escape-char-construct and fg-escape-char-backslash can ;; be combined bg-main, bg-dim, bg-alt ;; ;; fg-lang-error, fg-lang-warning, fg-lang-note can be ;; combined with bg-main, bg-dim, bg-alt ;; ;; fg-mark-sel, fg-mark-del, fg-mark-alt can be combined ;; with bg-main, bg-dim, bg-alt, bg-hl-line ;; ;; fg-unfocused must be combined with bg-main ;; ;; fg-docstring, fg-comment-yellow can be combined with ;; bg-main, bg-dim, bg-alt ;; ;; the window divider colors apply to faces with just an fg value ;; ;; all pairs are combinable with themselves (bg-hl-line . "#f2eff3") (bg-hl-line-intense . "#e0e0e0") (bg-hl-alt . "#fbeee0") (bg-hl-alt-intense . "#e8dfd1") (bg-paren-match . "#e0af82") (bg-paren-match-intense . "#c488ff") (bg-region . "#bcbcbc") (bg-tab-bar . "#d5d5d5") (bg-tab-active . "#f6f6f6") (bg-tab-inactive . "#bdbdbd") (bg-tab-inactive-alt . "#999999") (fg-tab-active . "#30169e") (fg-escape-char-construct . "#8b1030") (fg-escape-char-backslash . "#654d0f") (fg-lang-error . "#9f004f") (fg-lang-warning . "#604f0f") (fg-lang-note . "#4040ae") (fg-lang-underline-error . "#ef4f54") (fg-lang-underline-warning . "#cf9f00") (fg-lang-underline-note . "#3f6fef") (fg-window-divider-inner . "#888888") (fg-window-divider-outer . "#585858") (fg-unfocused . "#56576d") (fg-docstring . "#2a486a") (fg-comment-yellow . "#5f4400") (bg-header . "#e5e5e5") (fg-header . "#2a2a2a") (bg-whitespace . "#f5efef") (fg-whitespace . "#624956") (bg-diff-heading . "#b7cfe0") (fg-diff-heading . "#041645") (bg-diff-added . "#d4fad4") (fg-diff-added . "#004500") (bg-diff-added-deuteran . "#daefff") (fg-diff-added-deuteran . "#002044") (bg-diff-changed . "#fcefcf") (fg-diff-changed . "#524200") (bg-diff-removed . "#ffe8ef") (fg-diff-removed . "#691616") (bg-diff-refine-added . "#94cf94") (fg-diff-refine-added . "#002a00") (bg-diff-refine-added-deuteran . "#77c0ef") (fg-diff-refine-added-deuteran . "#000035") (bg-diff-refine-changed . "#cccf8f") (fg-diff-refine-changed . "#302010") (bg-diff-refine-removed . "#daa2b0") (fg-diff-refine-removed . "#400000") (bg-diff-focus-added . "#bbeabb") (fg-diff-focus-added . "#002c00") (bg-diff-focus-added-deuteran . "#bacfff") (fg-diff-focus-added-deuteran . "#001755") (bg-diff-focus-changed . "#ecdfbf") (fg-diff-focus-changed . "#392900") (bg-diff-focus-removed . "#efcbcf") (fg-diff-focus-removed . "#4a0000") (bg-diff-neutral-0 . "#979797") (fg-diff-neutral-0 . "#040404") (bg-diff-neutral-1 . "#b0b0b0") (fg-diff-neutral-1 . "#252525") (bg-diff-neutral-2 . "#cccccc") (fg-diff-neutral-2 . "#3a3a3a") (bg-mark-sel . "#a0f0cf") (fg-mark-sel . "#005040") (bg-mark-del . "#ffccbb") (fg-mark-del . "#840040") (bg-mark-alt . "#f5d88f") (fg-mark-alt . "#782900")) "The entire palette of `modus-operandi' theme. Each element has the form (NAME . HEX) with the former as a symbol and the latter as a string.") ;;;; Modus Vivendi (define-obsolete-variable-alias 'modus-vivendi-theme-default-colors-alist 'modus-themes-colors-vivendi "1.0.0") (define-obsolete-variable-alias 'modus-themes-colors-vivendi 'modus-themes-vivendi-colors "1.1.0") (defconst modus-themes-vivendi-colors '(;; base values (bg-main . "#000000") (fg-main . "#ffffff") (bg-dim . "#110b11") (fg-dim . "#e0e6f0") (bg-alt . "#181a20") (fg-alt . "#a8a8a8") ;; specifically for on/off states and must be combined with ;; themselves, though the backgrounds are also meant to be used with ;; other "active" values, defined further below (bg-active . "#323232") (fg-active . "#f4f4f4") (bg-inactive . "#1e1e1e") (fg-inactive . "#bfc0c4") ;; these special values are intended as alternatives to the base ;; values for cases where we need to avoid confusion between the ;; highlighted constructs; they must either be used as pairs based ;; on their name or each can be combined with {fg,bg}-{main,alt,dim} ;; always in accordance with their role as background or foreground (bg-special-cold . "#203448") (fg-special-cold . "#c6eaff") (bg-special-mild . "#00322e") (fg-special-mild . "#bfebe0") (bg-special-warm . "#382f27") (fg-special-warm . "#f8dec0") (bg-special-calm . "#392a48") (fg-special-calm . "#fbd6f4") ;; foregrounds that can be combined with bg-main, bg-dim, bg-alt (red . "#ff8059") (red-alt . "#f4923b") (red-alt-other . "#ff9977") (red-faint . "#ffa0a0") (red-alt-faint . "#f5aa80") (red-alt-other-faint . "#ff9fbf") (green . "#44bc44") (green-alt . "#70c900") (green-alt-other . "#00cd68") (green-faint . "#88cf88") (green-alt-faint . "#a8cf88") (green-alt-other-faint . "#88cfaf") (yellow . "#eecc00") (yellow-alt . "#cfdf30") (yellow-alt-other . "#f0ce43") (yellow-faint . "#d2b580") (yellow-alt-faint . "#cabf77") (yellow-alt-other-faint . "#d0ba95") (blue . "#2fafff") (blue-alt . "#79a8ff" ) (blue-alt-other . "#00bcff") (blue-faint . "#92baff") (blue-alt-faint . "#a0acf5") (blue-alt-other-faint . "#87c8ff") (magenta . "#feacd0") (magenta-alt . "#f78fe7") (magenta-alt-other . "#b6a0ff") (magenta-faint . "#e0b2d6") (magenta-alt-faint . "#ef9fe4") (magenta-alt-other-faint . "#cfa6ff") (cyan . "#00d3d0") (cyan-alt . "#4ae8fc") (cyan-alt-other . "#6ae4b9") (cyan-faint . "#90c4ed") (cyan-alt-faint . "#a0bfdf") (cyan-alt-other-faint . "#a4d0bb") ;; these foreground values can only be combined with bg-main and are ;; thus not suitable for general purpose highlighting (red-intense . "#fe6060") (orange-intense . "#fba849") (green-intense . "#4fe42f") (yellow-intense . "#f0dd60") (blue-intense . "#4fafff") (magenta-intense . "#ff62d4") (purple-intense . "#9f80ff") (cyan-intense . "#3fdfd0") ;; those foregrounds are meant exclusively for bg-active, bg-inactive (red-active . "#ffa7ba") (green-active . "#70d73f") (yellow-active . "#dbbe5f") (blue-active . "#34cfff") (magenta-active . "#d5b1ff") (cyan-active . "#00d8b4") ;; the "subtle" values below be combined with fg-dim, while the ;; "intense" should be paired with fg-main (red-subtle-bg . "#762422") (red-intense-bg . "#a4202a") (green-subtle-bg . "#2f4a00") (green-intense-bg . "#006800") (yellow-subtle-bg . "#604200") (yellow-intense-bg . "#874900") (blue-subtle-bg . "#10387c") (blue-intense-bg . "#2a40b8") (magenta-subtle-bg . "#49366e") (magenta-intense-bg . "#7042a2") (cyan-subtle-bg . "#00415e") (cyan-intense-bg . "#005f88") ;; those background values must be combined with fg-main and should ;; only be used for indicators that are placed on the fringes (red-fringe-bg . "#8f1f4b") (green-fringe-bg . "#006700") (yellow-fringe-bg . "#6f4f00") (blue-fringe-bg . "#3f33af") (magenta-fringe-bg . "#6f2f89") (cyan-fringe-bg . "#004f8f") ;; those background values should only be used for graphs or similar ;; applications where colored blocks are expected to be positioned ;; next to each other (red-graph-0-bg . "#af0404") (red-graph-1-bg . "#801f2f") (green-graph-0-bg . "#24ba2f") (green-graph-1-bg . "#0f8f07") (yellow-graph-0-bg . "#ffd03e") (yellow-graph-1-bg . "#d7d800") (blue-graph-0-bg . "#406fff") (blue-graph-1-bg . "#2f50c8") (magenta-graph-0-bg . "#af7bee") (magenta-graph-1-bg . "#7f59cf") (cyan-graph-0-bg . "#47dcfa") (cyan-graph-1-bg . "#0bc0df") ;; the following are for cases where both the foreground and the ;; background need to have a similar hue and so must be combined ;; with themselves, even though the foregrounds can be paired with ;; any of the base backgrounds (red-refine-bg . "#77002a") (red-refine-fg . "#ffb9ab") (green-refine-bg . "#00422a") (green-refine-fg . "#9ff0cf") (yellow-refine-bg . "#693200") (yellow-refine-fg . "#e2d980") (blue-refine-bg . "#242679") (blue-refine-fg . "#8ec6ff") (magenta-refine-bg . "#71206a") (magenta-refine-fg . "#ffcaf0") (cyan-refine-bg . "#004065") (cyan-refine-fg . "#8ae4f2") ;; the "nuanced" backgrounds can be combined with all of the above ;; foregrounds, as well as those included here, while the "nuanced" ;; foregrounds can in turn also be combined with bg-main, bg-dim, ;; bg-alt (red-nuanced-bg . "#2c0614") (red-nuanced-fg . "#ffcccc") (green-nuanced-bg . "#001904") (green-nuanced-fg . "#b8e2b8") (yellow-nuanced-bg . "#221000") (yellow-nuanced-fg . "#dfdfb0") (blue-nuanced-bg . "#0f0e39") (blue-nuanced-fg . "#bfd9ff") (magenta-nuanced-bg . "#230631") (magenta-nuanced-fg . "#e5cfef") (cyan-nuanced-bg . "#041529") (cyan-nuanced-fg . "#a8e5e5") ;; the following are reserved for specific cases ;; ;; bg-hl-line is between bg-dim and bg-alt, so it should ;; work with all accents that cover those two, plus bg-main ;; ;; bg-hl-alt and bg-hl-alt-intense should only be used when no ;; other greyscale or fairly neutral background is available to ;; properly draw attention to a given construct ;; ;; bg-header is between bg-active and bg-inactive, so it ;; can be combined with any of the "active" values, plus the ;; "special" and base foreground colors ;; ;; bg-paren-match, bg-paren-match-intense, bg-region and ;; bg-tab-active must be combined with fg-main, while ;; bg-tab-inactive should be combined with fg-dim, whereas ;; bg-tab-inactive-alt goes together with fg-main ;; ;; bg-tab-bar is only intended for the bar that holds the tabs and ;; can only be combined with fg-main ;; ;; fg-tab-active is meant to be combined with bg-tab-active, ;; though only for styling special elements, such as underlining ;; the current tab ;; ;; fg-escape-char-construct and fg-escape-char-backslash can ;; be combined bg-main, bg-dim, bg-alt ;; ;; fg-lang-error, fg-lang-warning, fg-lang-note can be ;; combined with bg-main, bg-dim, bg-alt ;; ;; fg-mark-sel, fg-mark-del, fg-mark-alt can be combined ;; with bg-main, bg-dim, bg-alt, bg-hl-line ;; ;; fg-unfocused must be combined with bg-main ;; ;; fg-docstring, fg-comment-yellow can be combined with ;; bg-main, bg-dim, bg-alt ;; ;; the window divider colors apply to faces with just an fg value ;; ;; all pairs are combinable with themselves (bg-hl-line . "#151823") (bg-hl-line-intense . "#2f2f2f") (bg-hl-alt . "#181732") (bg-hl-alt-intense . "#282e46") (bg-paren-match . "#5f362f") (bg-paren-match-intense . "#7416b5") (bg-region . "#3c3c3c") (bg-tab-bar . "#2c2c2c") (bg-tab-active . "#0e0e0e") (bg-tab-inactive . "#3d3d3d") (bg-tab-inactive-alt . "#595959") (fg-tab-active . "#5ac3cf") (fg-escape-char-construct . "#e7a59a") (fg-escape-char-backslash . "#abab00") (fg-lang-error . "#ef8690") (fg-lang-warning . "#b0aa00") (fg-lang-note . "#9d9def") (fg-lang-underline-error . "#ff4a6f") (fg-lang-underline-warning . "#d0de00") (fg-lang-underline-note . "#5f6fff") (fg-window-divider-inner . "#646464") (fg-window-divider-outer . "#969696") (fg-unfocused . "#93959b") (fg-docstring . "#b0d6f5") (fg-comment-yellow . "#cab98f") (bg-header . "#212121") (fg-header . "#dddddd") (bg-whitespace . "#101424") (fg-whitespace . "#aa9e9f") (bg-diff-heading . "#304466") (fg-diff-heading . "#dae7ff") (bg-diff-added . "#0a280a") (fg-diff-added . "#94ba94") (bg-diff-added-deuteran . "#001a3f") (fg-diff-added-deuteran . "#c4cdf2") (bg-diff-changed . "#2a2000") (fg-diff-changed . "#b0ba9f") (bg-diff-removed . "#40160f") (fg-diff-removed . "#c6adaa") (bg-diff-refine-added . "#005a36") (fg-diff-refine-added . "#e0f6e0") (bg-diff-refine-added-deuteran . "#234f8f") (fg-diff-refine-added-deuteran . "#dde4ff") (bg-diff-refine-changed . "#585800") (fg-diff-refine-changed . "#ffffcc") (bg-diff-refine-removed . "#852828") (fg-diff-refine-removed . "#ffd9eb") (bg-diff-focus-added . "#203d20") (fg-diff-focus-added . "#b4ddb4") (bg-diff-focus-added-deuteran . "#00405f") (fg-diff-focus-added-deuteran . "#bfe4ff") (bg-diff-focus-changed . "#4a3a10") (fg-diff-focus-changed . "#d0daaf") (bg-diff-focus-removed . "#5e2526") (fg-diff-focus-removed . "#eebdba") (bg-diff-neutral-0 . "#575757") (fg-diff-neutral-0 . "#fcfcfc") (bg-diff-neutral-1 . "#454545") (fg-diff-neutral-1 . "#dddddd") (bg-diff-neutral-2 . "#313131") (fg-diff-neutral-2 . "#bfbfbf") (bg-mark-sel . "#002f2f") (fg-mark-sel . "#60cfa2") (bg-mark-del . "#5a0000") (fg-mark-del . "#ff99aa") (bg-mark-alt . "#3f2210") (fg-mark-alt . "#f0aa20")) "The entire palette of `modus-vivendi' theme. Each element has the form (NAME . HEX) with the former as a symbol and the latter as a string.") ;;; Custom faces ;; These faces are used internally to ensure consistency between various ;; groups and to streamline the evaluation of relevant customization ;; options. (defface modus-theme-subtle-red nil "Subtle red background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-green nil "Subtle green background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-yellow nil "Subtle yellow background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-blue nil "Subtle blue background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-magenta nil "Subtle magenta background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-cyan nil "Subtle cyan background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-subtle-neutral nil "Subtle gray background combined with a dimmed foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-red nil "Intense red background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-green nil "Intense green background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-yellow nil "Intense yellow background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-blue nil "Intense blue background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-magenta nil "Intense magenta background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-cyan nil "Intense cyan background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-intense-neutral nil "Intense gray background combined with the main foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-red nil "Combination of accented red background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-green nil "Combination of accented green background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-yellow nil "Combination of accented yellow background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-blue nil "Combination of accented blue background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-magenta nil "Combination of accented magenta background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-refine-cyan nil "Combination of accented cyan background and foreground. This is used for general purpose highlighting, mostly in buffers or for completion interfaces. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-red nil "A red background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-green nil "A green background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-yellow nil "A yellow background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-blue nil "A blue background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-magenta nil "A magenta background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-active-cyan nil "A cyan background meant for use on the modeline or similar. This is combined with the modelines primary foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-red nil "A red background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-green nil "A green background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-yellow nil "A yellow background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-blue nil "A blue background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-magenta nil "A magenta background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-fringe-cyan nil "A cyan background meant for use on the fringe or similar. This is combined with the main foreground value. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-red nil "A nuanced red background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-green nil "A nuanced green background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-yellow nil "A nuanced yellow background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-blue nil "A nuanced blue background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-magenta nil "A nuanced magenta background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-nuanced-cyan nil "A nuanced cyan background. This does not specify a foreground of its own. Instead it is meant to serve as the backdrop for elements such as Org blocks, headings, and any other surface that needs to retain the colors on display. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-special-cold nil "Combines the 'special cold' background and foreground values. This is intended for cases when a neutral gray background is not suitable and where a combination of more saturated colors would not be appropriate. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-special-mild nil "Combines the 'special mild' background and foreground values. This is intended for cases when a neutral gray background is not suitable and where a combination of more saturated colors would not be appropriate. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-special-warm nil "Combines the 'special warm' background and foreground values. This is intended for cases when a neutral gray background is not suitable and where a combination of more saturated colors would not be appropriate. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-special-calm nil "Combines the 'special calm' background and foreground values. This is intended for cases when a neutral gray background is not suitable and where a combination of more saturated colors would not be appropriate. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-added nil "Combines green colors for the 'added' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-changed nil "Combines yellow colors for the 'changed' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-removed nil "Combines red colors for the 'removed' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-refine-added nil "Combines green colors for word-wise 'added' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-refine-changed nil "Combines yellow colors for word-wise 'changed' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-refine-removed nil "Combines red colors for word-wise 'removed' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-focus-added nil "Combines green colors for the focused 'added' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-focus-changed nil "Combines yellow colors for the focused 'changed' state in. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-focus-removed nil "Combines red colors for the focused 'removed' state in diffs. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-diff-heading nil "Combines blue colors for the diff hunk heading. The applied colors are contingent on the value assigned to `modus-themes-diffs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-pseudo-header nil "Generic style for some elements that function like headings. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-mark-alt nil "Combines yellow colors for marking special lines This is intended for use in modes such as Dired, Ibuffer, Proced. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-mark-del nil "Combines red colors for marking deletable lines This is intended for use in modes such as Dired, Ibuffer, Proced. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-mark-sel nil "Combines green colors for marking lines This is intended for use in modes such as Dired, Ibuffer, Proced. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-mark-symbol nil "Applies a blue color and other styles for mark indicators. This is intended for use in modes such as Dired, Ibuffer, Proced. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-1 nil "General purpose face for use in headings level 1 The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-2 nil "General purpose face for use in headings level 2. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-3 nil "General purpose face for use in headings level 3. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-4 nil "General purpose face for use in headings level 4. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-5 nil "General purpose face for use in headings level 5. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-6 nil "General purpose face for use in headings level 6. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-7 nil "General purpose face for use in headings level 7. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-heading-8 nil "General purpose face for use in headings level 8. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-headings' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-hl-line nil "General purpose face for the current line. The exact attributes assigned to this face are contingent on the values assigned to the `modus-themes-intense-hl-line' variable. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-bold nil "Generic face for applying a conditional bold weight. This behaves in accordance with `modus-themes-bold-constructs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-slant nil "Generic face for applying a conditional slant (italics). This behaves in accordance with `modus-themes-slanted-constructs'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-variable-pitch nil "Generic face for applying a conditional `variable-pitch'. This behaves in accordance with `modus-themes-no-mixed-fonts', `modus-themes-variable-pitch-headings' for all heading levels, and `modus-themes-variable-pitch-ui'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-red-0 nil "Special subdued red face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-red-1 nil "Special prominent red face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-green-0 nil "Special subdued green face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-green-1 nil "Special prominent green face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-yellow-0 nil "Special subdued yellow face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-yellow-1 nil "Special prominent yellow face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-blue-0 nil "Special subdued blue face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-blue-1 nil "Special prominent blue face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-magenta-0 nil "Special subdued magenta face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-magenta-1 nil "Special prominent magenta face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-cyan-0 nil "Special subdued cyan face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-graph-cyan-1 nil "Special prominent cyan face for use in graphs. This is intended to be applied in contexts such as the Org agenda habit graph where faithfulness to the semantics of a color value is of paramount importance. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-lang-note nil "Generic face for linter or spell checker notes. The exact attributes and color combinations are controlled by `modus-themes-lang-checkers'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-lang-warning nil "Generic face for linter or spell checker warnings. The exact attributes and color combinations are controlled by `modus-themes-lang-checkers'. The actual styling of the face is done by `modus-themes-faces'.") (defface modus-theme-lang-error nil "Generic face for linter or spell checker errors. The exact attributes and color combinations are controlled by `modus-themes-lang-checkers'. The actual styling of the face is done by `modus-themes-faces'.") ;;; Customization options ;;;; Current customization options (>= 1.0.0) (defcustom modus-themes-operandi-color-overrides nil "Override colors in the Modus Operandi palette. For form, see `modus-themes-operandi-colors'." :group 'modus-themes :package-version '(modus-themes . "1.1.0") :version "28.1" :type '(alist :key-type symbol :value-type color) :link '(info-link "(modus-themes) Override colors (DIY)")) (defcustom modus-themes-vivendi-color-overrides nil "Override colors in the Modus Vivendi palette. For form, see `modus-themes-vivendi-colors'." :group 'modus-themes :package-version '(modus-themes . "1.1.0") :version "28.1" :type '(alist :key-type symbol :value-type color) :link '(info-link "(modus-themes) Override colors (DIY)")) ;; The byte compiler complains when a defcustom isn't a top level form (let* ((names (mapcar (lambda (pair) (symbol-name (car pair))) modus-themes-operandi-colors)) (colors (mapcar #'intern (sort names #'string<)))) (put 'modus-themes-operandi-color-overrides 'custom-options (copy-sequence colors)) (put 'modus-themes-vivendi-color-overrides 'custom-options (copy-sequence colors))) (defcustom modus-themes-slanted-constructs nil "Use slanted text in more code constructs (italics or oblique)." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Slanted constructs")) (defcustom modus-themes-bold-constructs nil "Use bold text in more code constructs." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Bold constructs")) (defcustom modus-themes-variable-pitch-headings nil "Use proportional fonts (variable-pitch) in headings." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Headings' typeface")) (defcustom modus-themes-variable-pitch-ui nil "Use proportional fonts (variable-pitch) in UI elements. This includes the mode line, header line, tab bar, and tab line." :group 'modus-themes :package-version '(modus-themes . "1.1.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) UI typeface")) (defcustom modus-themes-no-mixed-fonts nil "Disable inheritance from `fixed-pitch' in some faces. This is done by default to allow spacing-sensitive constructs, such as Org tables and code blocks, to remain monospaced when users opt for something like the command `variable-pitch-mode'. The downside with the default is that users need to explicitly configure the font family of `fixed-pitch' in order to get a consistent experience. That may be something they do not want to do. Hence this option to disable any kind of technique for mixing fonts." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) No mixed fonts")) (defcustom modus-themes-headings '((t . nil)) "Alist of styles for headings, with optional value per level. To control faces per level from 1-8, use something like this: (setq modus-themes-headings '((1 . highlight) (2 . line) (t . rainbow-line-no-bold))) To set a uniform value for all heading levels, use this pattern: (setq modus-themes-headings '((t . rainbow-line-no-bold))) The default uses a fairly desaturated foreground value in combination with a bold typographic weight. To specify this style for a given level N (assuming you wish to have another fallback option), just specify the value t like this: (setq modus-themes-headings '((1 . t) (2 . line) (t . rainbow-line-no-bold))) A description of all possible values: + `no-bold' retains the default text color while removing the typographic weight. + `line' is the same as the default plus an overline over the heading. + `line-no-bold' is the same as `line' without bold weight. + `rainbow' uses a more colorful foreground in combination with bold weight. + `rainbow-line' is the same as `rainbow' plus an overline. + `rainbow-line-no-bold' is the same as `rainbow-line' without the bold weight. + `highlight' retains the default style of a fairly desaturated foreground combined with a bold weight and add to it a subtle accented background. + `highlight-no-bold' is the same as `highlight' without a bold weight. + `rainbow-highlight' is the same as `highlight' but with a more colorful foreground. + `rainbow-highlight-no-bold' is the same as `rainbow-highlight' without a bold weight. + `section' retains the default looks and adds to them both an overline and a slightly accented background. It is, in effect, a combination of the `line' and `highlight' values. + `section-no-bold' is the same as `section' without a bold weight. + `rainbow-section' is the same as `section' but with a more colorful foreground. + `rainbow-section-no-bold' is the same as `rainbow-section' without a bold weight. + `no-color' does not apply any color to the heading, meaning that it uses the foreground of the `default' face. It still renders the text with a bold typographic weight. + `no-color-no-bold' is like `no-color' but without the bold weight." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type '(alist :key-type symbol :value-type (choice (const :tag "Fairly desaturated foreground with bold weight (default)" t) (const :tag "Like the default without bold weight" no-bold) (const :tag "Like the default plus overline" line) (const :tag "Like `line' without bold weight" line-no-bold) (const :tag "Like the default but with more colorful foreground" rainbow) (const :tag "Like `rainbow' plus overline" rainbow-line) (const :tag "Like `rainbow' without bold weight" rainbow-no-bold) (const :tag "Like `rainbow-line' without bold weight" rainbow-line-no-bold) (const :tag "Like the default plus subtle background" highlight) (const :tag "Like `highlight' without bold weight" highlight-no-bold) (const :tag "Like `highlight' with more colorful foreground" rainbow-highlight) (const :tag "Like `rainbow-highlight' without bold weight" rainbow-highlight-no-bold) (const :tag "Like `highlight' plus overline" section) (const :tag "Like `section' without bold weight" section-no-bold) (const :tag "Like `section' with more colorful foreground" rainbow-section) (const :tag "Like `rainbow-section' without bold weight" rainbow-section-no-bold) (const :tag "Do not use any distinct foreground color; just bold weight" no-color) (const :tag "Like `no-bold' but without the distinct foreground color" no-color-no-bold))) :link '(info-link "(modus-themes) Heading styles")) (defcustom modus-themes-scale-headings nil "Use font scaling for headings. For regular headings the scale is controlled by the variables `modus-themes-scale-1' (smallest) and its variants all the way up to `modus-themes-scale-4' (larger). While `modus-themes-scale-5' is reserved for special headings that must be the largest on the scale. A special heading is, in this context, one that does not fit into the syntax for heading levels that apply to the given mode. For example, Org's #+title keyword lies outside the normal eight levels of headings. Whereas, say, Markdown does not have such a special heading." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Scaled headings")) (defcustom modus-themes-scale-1 1.05 "Font size that is slightly larger than the base value. This size is used for level 4 headings, such as in Org and Markdown files. The default value is a floating point that is interpreted as a multiple of the base font size. It is recommended to use such a value. However, the variable also accepts an integer, understood as an absolute height that is 1/10 of the typeface's point size (e.g. a value of 140 is the same as setting the font at 14 point size). This will ignore the base font size and, thus, will not scale in accordance with it in cases where it changes, such as while using `text-scale-adjust'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'number :link '(info-link "(modus-themes) Scaled heading sizes")) (defcustom modus-themes-scale-2 1.1 "Font size slightly larger than `modus-themes-scale-1'. This size is used for level 3 headings, such as in Org and Markdown files. The default value is a floating point that is interpreted as a multiple of the base font size. It is recommended to use such a value. However, the variable also accepts an integer, understood as an absolute height that is 1/10 of the typeface's point size (e.g. a value of 140 is the same as setting the font at 14 point size). This will ignore the base font size and, thus, will not scale in accordance with it in cases where it changes, such as while using `text-scale-adjust'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'number :link '(info-link "(modus-themes) Scaled heading sizes")) (defcustom modus-themes-scale-3 1.15 "Font size slightly larger than `modus-themes-scale-2'. This size is used for level 2 headings, such as in Org and Markdown files. The default value is a floating point that is interpreted as a multiple of the base font size. It is recommended to use such a value. However, the variable also accepts an integer, understood as an absolute height that is 1/10 of the typeface's point size (e.g. a value of 140 is the same as setting the font at 14 point size). This will ignore the base font size and, thus, will not scale in accordance with it in cases where it changes, such as while using `text-scale-adjust'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'number :link '(info-link "(modus-themes) Scaled heading sizes")) (defcustom modus-themes-scale-4 1.2 "Font size slightly larger than `modus-themes-scale-3'. This size is used for level 1 headings, such as in Org and Markdown files. The default value is a floating point that is interpreted as a multiple of the base font size. It is recommended to use such a value. However, the variable also accepts an integer, understood as an absolute height that is 1/10 of the typeface's point size (e.g. a value of 140 is the same as setting the font at 14 point size). This will ignore the base font size and, thus, will not scale in accordance with it in cases where it changes, such as while using `text-scale-adjust'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'number :link '(info-link "(modus-themes) Scaled heading sizes")) (defcustom modus-themes-scale-5 1.3 "Font size slightly larger than `modus-themes-scale-4'. This size is only used for 'special' top level headings, such as Org's file title heading, denoted by the #+title key word, and the Org agenda structure headers. The default value is a floating point that is interpreted as a multiple of the base font size. It is recommended to use such a value. However, the variable also accepts an integer, understood as an absolute height that is 1/10 of the typeface's point size (e.g. a value of 140 is the same as setting the font at 14 point size). This will ignore the base font size and, thus, will not scale in accordance with it in cases where it changes, such as while using `text-scale-adjust'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'number :link '(info-link "(modus-themes) Scaled heading sizes")) (defcustom modus-themes-fringes nil "Define the visibility of fringes. Nil means the fringes have no background color. Option `subtle' will apply a greyscale value that is visible yet close to the main buffer background color. Option `intense' will use a more pronounced greyscale value." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "No visible fringes (default)" nil) (const :tag "Subtle greyscale background" subtle) (const :tag "Intense greyscale background" intense)) :link '(info-link "(modus-themes) Fringes")) (defcustom modus-themes-lang-checkers nil "Control the style of spelling and code checkers/linters. Nil (the default) applies a color-coded underline to the affected text, while it leaves the original foreground in tact. If the display spec of Emacs has support for it, the underline's style is that of a wave, otherwise it is a straight line. Options `subtle-foreground' and `intense-foreground' add a color-coded underline while also changing the text's foreground accordingly. The style of the underline is the same as with the default option. Option `straight-underline' is like the default but always applies a straight line under the affected text. Same principle for `subtle-foreground-straight-underline' and its counterpart `intense-foreground-straight-underline'. Option `colored-background' uses a straight underline, a background, and a foreground. All are color-coded. This is the most intense combination of face properties." :group 'modus-themes :package-version '(modus-themes . "1.1.0") :version "28.1" :type '(choice (const :tag "Only color-coded wavy underline (default)" nil) (const :tag "Like the default, but with a straight underline" straight-underline) (const :tag "Color-coded wavy underline; subtle foreground" subtle-foreground) (const :tag "Combines `straight-underline' and `subtle-foreground'" subtle-foreground-straight-underline) (const :tag "Color-coded wavy underline; intense foreground" intense-foreground) (const :tag "Combines `straight-underline' and `intense-foreground'" intense-foreground-straight-underline) (const :tag "Color-coded background, foreground, straight underline" colored-background)) :link '(info-link "(modus-themes) Language checkers")) (defcustom modus-themes-org-blocks nil "Use a subtle gray or color-coded background for Org blocks. Nil means that the block will have no background of its own and will use the default that applies to the rest of the buffer. Option `grayscale' (or `greyscale') will apply a subtle neutral gray background to the block's contents. It also affects the begin and end lines of the block: their background will be extended to the edge of the window for Emacs version >= 27 where the ':extend' keyword is recognized by `set-face-attribute'. Option `rainbow' will use an accented background for the contents of the block. The exact color will depend on the programming language and is controlled by the `org-src-block-faces' variable (refer to the theme's source code for the current association list)." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "No Org block background (default)" nil) (const :tag "Subtle gray block background" grayscale) (const :tag "Subtle gray block background (alt spelling)" greyscale) (const :tag "Color-coded background per programming language" rainbow)) :link '(info-link "(modus-themes) Org mode blocks")) (defcustom modus-themes-org-habit nil "Control the presentation of the `org-habit' graph. The default is meant to conform with the original aesthetic of `org-habit'. It employs all four color codes that correspond to the org-habit states---clear, ready, alert, and overdue---while distinguishing between their present and future variants. This results in a total of eight colors in use: red, yellow, green, blue, in tinted and shaded versions. They cover the full set of information provided by the `org-habit' consistency graph. Option `simplified' is like the default except that it removes the dichotomy between current and future variants by applying uniform color-coded values. It applies a total of four colors: red, yellow, green, blue. They produce a simplified consistency graph that is more legible (or less \"busy\") than the default. The intent is to shift focus towards the distinction between the four states of a habit task, rather than each state's present/future outlook. Option `traffic-light' further reduces the available colors to red, yellow, and green. As in `simplified', present and future variants appear uniformly, but differently from it, the 'clear' state is rendered in a green hue, instead of the original blue. This is meant to capture the use-case where a habit task being \"too early\" is less important than it being \"too late\". The difference between ready and clear states is attenuated by painting both of them using shades of green. This option thus highlights the alert and overdue states." :group 'modus-themes :package-version '(modus-themes . "1.1.0") :version "28.1" :type '(choice (const :tag "Respect the original design of org-habit (default)" nil) (const :tag "Like the default, but do not distinguish between present and future variants" simplified) (const :tag "Like `simplified', but only use red, yellow, green" traffic-light)) :link '(info-link "(modus-themes) Org agenda habits")) (defcustom modus-themes-mode-line nil "Adjust the overall style of the mode line. Nil is a two-dimensional rectangle with a border around it. The active and the inactive modelines use different shades of greyscale values for the background and foreground. A `3d' value will apply a three-dimensional effect to the active modeline. The inactive modelines remain two-dimensional and are toned down a bit, relative to the nil value. The `moody' option is meant to optimize the modeline for use with the library of the same name. This practically means to remove the box effect and rely on underline and overline properties instead. It also tones down the inactive modelines. Despite its intended purpose, this option can also be used without the `moody' library. The `borderless' option uses the same colors as the default (nil value), but removes the border effect. This is done by making the box property use the same color as the background, effectively blending the two and creating some padding. The `borderless-3d' and `borderless-moody' approximate the `3d' and `moody' options respectively, while removing the borders. However, to ensure that the inactive modelines remain visible, they apply a slightly more prominent background to them than what their counterparts do (same inactive background as with the default)." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "Two-dimensional box (default)" nil) (const :tag "Three-dimensional style for the active mode line" 3d) (const :tag "No box effects, which are optimal for use with the `moody' library" moody) (const :tag "Like the default, but without border effects" borderless) (const :tag "Like `3d', but without noticeable border" borderless-3d) (const :tag "Like `moody', but without noticeable border" borderless-moody)) :link '(info-link "(modus-themes) Mode line")) (defcustom modus-themes-diffs nil "Adjust the overall styles of diffs. Nil means to use fairly intense color combinations for diffs. For example, you get a rich green background with a green foreground for added lines. Word-wise or 'refined' diffs follow the same pattern but use different shades of those colors to remain distinct. A `desaturated' value follows the same principles as with the nil option, while it tones down all relevant colors. Option `fg-only' will remove all accented backgrounds, except from word-wise changes. It instead uses color-coded foreground values to differentiate between added/removed/changed lines. If a background is necessary, such as with `ediff', then a subtle greyscale value is used. Option `bg-only' applies a background but does not override the text's foreground. This makes it suitable for a non-nil value passed to `diff-font-lock-syntax' (note: Magit does not support syntax highlighting in diffs as of 2020-11-25, version 20201116.1057). Option `deuteranopia' accounts for red-green color defficiency by replacing all instances of green with colors on the blue side of the spectrum. Other stylistic changes are made in the interest of optimizing for such a use-case." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type '(choice (const :tag "Intensely colored backgrounds (default)" nil) (const :tag "Slightly accented backgrounds with tinted text" desaturated) (const :tag "No backgrounds, except for refined diffs" fg-only) (const :tag "Apply color-coded backgrounds; keep syntax colors in tact" bg-only) (const :tag "Optimized for red-green color defficiency" deuteranopia)) :link '(info-link "(modus-themes) Diffs")) (defcustom modus-themes-completions nil "Apply special styles to the UI of completion frameworks. This concerns Icomplete, Ivy, Helm, Selectrum, Ido, as well as any other tool meant to enhance their experience. The effect will vary depending on the completion framework. Nil means to remain faithful to the metaphors that each UI establishes. For example, Icomplete and Ido only use foreground colors to style their matches, whereas Ivy or Helm rely on an aesthetic that combines colored backgrounds with appropriate text color. Option `moderate' will apply a combination of background and foreground that is fairly subtle. For Icomplete and the like, this constitutes a departure from their standard style. While Ivy, Helm, and the others, will use less pronounced colors for applicable contexts. Option `opinionated' will apply color combinations that refashion the completion UI. So Icomplete et al will now use styles that resemble the defaults of Ivy and co., while the latter group will revert to an even more nuanced aesthetic." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "Respect the framework's established aesthetic (default)" nil) (const :tag "Subtle backgrounds for various elements" moderate) (const :tag "Radical alternative to the framework's looks" opinionated)) :link '(info-link "(modus-themes) Completion UIs")) (defcustom modus-themes-prompts nil "Use subtle or intense styles for minibuffer and REPL prompts. Nil means to only use an accented foreground color. Options `subtle-accented' and `intense-accented' will change both the background and the foreground values to use accented color combinations that follow the hue of the default styles' foreground (e.g. the default minibuffer prompt is cyan text, so these combinations will involved a cyan background and an appropriate cyan foreground). Options `subtle-gray' and `intense-gray' are like their `subtle-accented' and `intense-accented' counterparts, except they use grayscale values instead of accented ones." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice ;; `subtle' is the same as `subtle-accented', while `intense' is ;; equal to `intense-accented' for backward compatibility (const :tag "No prompt background (default)" nil) (const :tag "Subtle accented background for the prompt" subtle-accented) (const :tag "Same as `subtle-accented' for compatibility with older versions" subtle) (const :tag "Intense accented background and foreground for the prompt" intense-accented) (const :tag "Same as `intense-accented' for compatibility with older versions" intense) (const :tag "Like `subtle-accented' but grayscale" subtle-gray) (const :tag "Like `intense-accented' but grayscale" intense-gray)) :link '(info-link "(modus-themes) Command prompts")) (defcustom modus-themes-intense-hl-line nil "Use a more prominent background for command `hl-line-mode'." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Line highlighting")) (defcustom modus-themes-subtle-line-numbers nil "Use more subtle style for command `display-line-numbers-mode'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type 'boolean :link '(info-link "(modus-themes) Line numbers")) (defcustom modus-themes-paren-match nil "Choose the style of matching parentheses or delimiters. Nil means to use a subtle tinted background color (the default). Option `intense' applies a saturated background color. Option `subtle-bold' is the same as the default, but also makes use of bold typographic weight (inherits the `bold' face). Option `intense-bold' is the same as `intense', while it also uses a bold weight." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "Sublte tinted background (default)" nil) (const :tag "Like the default, but also use bold typographic weight" subtle-bold) (const :tag "Intense saturated background" intense) (const :tag "Like `intense' but with bold weight" intense-bold)) :link '(info-link "(modus-themes) Matching parentheses")) (defcustom modus-themes-syntax nil "Control the overall style of code syntax highlighting. Nil (the default) means to use colors on the cyan-blue-magenta side of the spectrum. There is little to no use of greens, yellows, and reds. Option `faint' is like the default in terms of the choice of palette but applies desaturated color values. Option `yellow-comments' applies a yellow tint to comments. The rest of the syntax is the same as the default. Option `green-strings' replaces the blue/cyan/cold color variants in strings with greener alternatives. The rest of the syntax remains the same. Option `yellow-comments-green-strings' combines yellow comments with green strings and the rest of the default syntax highlighting style. Option `alt-syntax' expands the color palette and applies new color combinations. Strings are green. Doc strings are magenta tinted. Comments are gray. Option `alt-syntax-yellow-comments' combines `alt-syntax' with `yellow-comments'. Option `faint-yellow-comments' combines the `faint' style with `yellow-comments'." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type '(choice (const :tag "Balanced use of blue, cyan, magenta, purple variants (default)" nil) (const :tag "Like the default, but with desaturated color values" faint) (const :tag "Apply yellow tint to comments, keep the default style for the rest" yellow-comments) (const :tag "Use green for strings, keep the default style for the rest" green-strings) (const :tag "Use green for strings, yellow for comments, keep the default style for the rest" yellow-comments-green-strings) (const :tag "Refashion syntax highlighting with more colors, gray comments" alt-syntax) (const :tag "Like `alt-syntax' but with yellow comments" alt-syntax-yellow-comments) (const :tag "Like `faint' but with yellow comments" faint-yellow-comments)) :link '(info-link "(modus-themes) Syntax styles")) (defcustom modus-themes-links nil "Set the style of links. Nil means to use an underline that is the same color as the foreground. Option `faint' applies desaturated colors to the link's text and underline. Option `neutral-underline' applies a subtle grey underline, while retaining the link's foreground. Option `faint-neutral-underline' combines a desaturated text color with a subtle grey underline. Option `no-underline' removes link underlines altogether, while retaining their original fairly vivid color. Option `underline-only' applies an underline while making the affected text colorless (it uses the same foreground as the theme's default). Option `neutral-underline-only' makes the text colorless while using a subtle underline below it." :group 'modus-themes :package-version '(modus-themes . "1.2.0") :version "28.1" :type '(choice (const :tag "Undeline link using the same color as the text (default)" nil) (const :tag "Like the default, but apply less intense colors to links" faint) (const :tag "Change the color of link underlines to a neutral grey" neutral-underline) (const :tag "Desaturated foreground with neutral grey underline" faint-neutral-underline) (const :tag "Remove underline property from links, keeping their foreground as-is" no-underline) (const :tag "Apply underline only; use default foreground" underline-only) (const :tag "Like `underline-only' but with a subtle underline" neutral-underline-only)) :link '(info-link "(modus-themes) Link styles")) (defcustom modus-themes-region nil "Change the overall appearance of the active region. Nil (the default) means to only use a prominent gray background with a neutral foreground. The foreground overrides all syntax highlighting. The region extends to the edge of the window. Option `no-extend' preserves the default aesthetic but prevents the region from extending to the edge of the window. Option `bg-only' applies a faint tinted background that is distinct from all others used in the theme, while it does not override any existing colors. It extends to the edge of the window. Option `bg-only-no-extend' is a combination of the `bg-only' and `no-extend' options." :group 'modus-themes :package-version '(modus-themes . "1.0.0") :version "28.1" :type '(choice (const :tag "Intense background; overrides colors; extends to edge of window (default)" nil) (const :tag "As with the default, but does not extend" no-extend) (const :tag "Subtle background; preserves colors; extends to edge of window" bg-only) (const :tag "As with the `subtle' option, but does not extend" bg-only-no-extend)) :link '(info-link "(modus-themes) Active region")) ;;;; Deprecated customization options (prior to 1.0.0) ;;;;; Modus Operandi obsolete options (make-obsolete 'modus-operandi-theme-override-colors-alist nil "1.0.0") (make-obsolete 'modus-operandi-theme-slanted-constructs 'modus-themes-slanted-constructs "1.0.0") (make-obsolete 'modus-operandi-theme-bold-constructs 'modus-themes-bold-constructs "1.0.0") (make-obsolete 'modus-operandi-theme-proportional-fonts 'modus-themes-variable-pitch-headings "1.0.0") (make-obsolete 'modus-operandi-theme-variable-pitch-headings 'modus-themes-variable-pitch-headings "1.0.0") (make-obsolete 'modus-operandi-theme-no-mixed-fonts 'modus-themes-no-mixed-fonts "1.0.0") (make-obsolete 'modus-operandi-theme-rainbow-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-operandi-theme-section-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-operandi-theme-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-operandi-theme-scale-headings 'modus-themes-scale-headings "1.0.0") (make-obsolete 'modus-operandi-theme-scale-1 'modus-themes-scale-1 "1.0.0") (make-obsolete 'modus-operandi-theme-scale-2 'modus-themes-scale-2 "1.0.0") (make-obsolete 'modus-operandi-theme-scale-3 'modus-themes-scale-3 "1.0.0") (make-obsolete 'modus-operandi-theme-scale-4 'modus-themes-scale-4 "1.0.0") (make-obsolete 'modus-operandi-theme-scale-5 'modus-themes-scale-5 "1.0.0") (make-obsolete 'modus-operandi-theme-visible-fringes 'modus-themes-fringes "1.0.0") (make-obsolete 'modus-operandi-theme-fringes 'modus-themes-fringes "1.0.0") (make-obsolete 'modus-operandi-theme-distinct-org-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-operandi-theme-rainbow-org-src-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-operandi-theme-org-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-operandi-theme-3d-modeline 'modus-themes-mode-line "1.0.0") (make-obsolete 'modus-operandi-theme-mode-line 'modus-themes-mode-line "1.0.0") (make-obsolete 'modus-operandi-theme-subtle-diffs 'modus-themes-diffs "1.0.0") (make-obsolete 'modus-operandi-theme-diffs 'modus-themes-diffs "1.0.0") (make-obsolete 'modus-operandi-theme-intense-standard-completions 'modus-themes-completions "1.0.0") (make-obsolete 'modus-operandi-theme-completions 'modus-themes-completions "1.0.0") (make-obsolete 'modus-operandi-theme-prompts 'modus-themes-prompts "1.0.0") (make-obsolete 'modus-operandi-theme-intense-hl-line 'modus-themes-intense-hl-line "1.0.0") (make-obsolete 'modus-operandi-theme-intense-paren-match 'modus-themes-paren-match "1.0.0") (make-obsolete 'modus-operandi-theme-faint-syntax 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-operandi-theme-comments 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-operandi-theme-syntax 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-operandi-theme-no-link-underline 'modus-themes-links "1.0.0") (make-obsolete 'modus-operandi-theme-links 'modus-themes-links "1.0.0") ;;;;; Modus Vivendi obsolete options (make-obsolete 'modus-vivendi-theme-override-colors-alist nil "1.0.0") (make-obsolete 'modus-vivendi-theme-slanted-constructs 'modus-themes-slanted-constructs "1.0.0") (make-obsolete 'modus-vivendi-theme-bold-constructs 'modus-themes-bold-constructs "1.0.0") (make-obsolete 'modus-vivendi-theme-proportional-fonts 'modus-themes-variable-pitch-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-variable-pitch-headings 'modus-themes-variable-pitch-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-no-mixed-fonts 'modus-themes-no-mixed-fonts "1.0.0") (make-obsolete 'modus-vivendi-theme-rainbow-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-section-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-headings 'modus-themes-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-headings 'modus-themes-scale-headings "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-1 'modus-themes-scale-1 "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-2 'modus-themes-scale-2 "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-3 'modus-themes-scale-3 "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-4 'modus-themes-scale-4 "1.0.0") (make-obsolete 'modus-vivendi-theme-scale-5 'modus-themes-scale-5 "1.0.0") (make-obsolete 'modus-vivendi-theme-visible-fringes 'modus-themes-fringes "1.0.0") (make-obsolete 'modus-vivendi-theme-fringes 'modus-themes-fringes "1.0.0") (make-obsolete 'modus-vivendi-theme-distinct-org-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-vivendi-theme-rainbow-org-src-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-vivendi-theme-org-blocks 'modus-themes-org-blocks "1.0.0") (make-obsolete 'modus-vivendi-theme-3d-modeline 'modus-themes-mode-line "1.0.0") (make-obsolete 'modus-vivendi-theme-mode-line 'modus-themes-mode-line "1.0.0") (make-obsolete 'modus-vivendi-theme-subtle-diffs 'modus-themes-diffs "1.0.0") (make-obsolete 'modus-vivendi-theme-diffs 'modus-themes-diffs "1.0.0") (make-obsolete 'modus-vivendi-theme-intense-standard-completions 'modus-themes-completions "1.0.0") (make-obsolete 'modus-vivendi-theme-completions 'modus-themes-completions "1.0.0") (make-obsolete 'modus-vivendi-theme-prompts 'modus-themes-prompts "1.0.0") (make-obsolete 'modus-vivendi-theme-intense-hl-line 'modus-themes-intense-hl-line "1.0.0") (make-obsolete 'modus-vivendi-theme-intense-paren-match 'modus-themes-paren-match "1.0.0") (make-obsolete 'modus-vivendi-theme-faint-syntax 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-vivendi-theme-comments 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-vivendi-theme-syntax 'modus-themes-syntax "1.0.0") (make-obsolete 'modus-vivendi-theme-no-link-underline 'modus-themes-links "1.0.0") (make-obsolete 'modus-vivendi-theme-links 'modus-themes-links "1.0.0") ;;; Internal functions (defun modus-themes--palette (theme) "Return color palette for Modus theme THEME. THEME is a symbol, either `modus-operandi' or `modus-vivendi'." (pcase theme ('modus-operandi (append modus-themes-operandi-color-overrides modus-themes-operandi-colors)) ('modus-vivendi (append modus-themes-vivendi-color-overrides modus-themes-vivendi-colors)) (_theme (error "'%s' is not a Modus theme" theme)))) (defvar modus-themes-faces) (defvar modus-themes-custom-variables) (defmacro modus-themes-theme (name) "Bind NAME's color palette around face specs and variables. NAME should be the proper name of a Modus theme, either `modus-operandi' or `modus-vivendi'. Face specifications are passed to `custom-theme-set-faces'. While variables are handled by `custom-theme-set-variables'. Those are stored in `modus-themes-faces' and `modus-themes-custom-variables' respectively." (declare (indent 0)) (let ((palette-sym (gensym)) (colors (mapcar #'car modus-themes-operandi-colors))) `(let* ((class '((class color) (min-colors 89))) (,palette-sym (modus-themes--palette ',name)) ,@(mapcar (lambda (color) (list color `(alist-get ',color ,palette-sym))) colors)) (custom-theme-set-faces ',name ,@modus-themes-faces) (custom-theme-set-variables ',name ,@modus-themes-custom-variables)))) (defun modus-themes--current-theme () "Return current theme." (car custom-enabled-themes)) ;; Helper functions that are meant to ease the implementation of the ;; above customization options. (defun modus-themes--bold-weight () "Conditional use of a heavier text weight." (when modus-themes-bold-constructs (list :inherit 'bold))) (defun modus-themes--mixed-fonts () "Conditional application of `fixed-pitch' inheritance." (unless modus-themes-no-mixed-fonts (list :inherit 'fixed-pitch))) (defun modus-themes--slant () "Conditional use of italics for slant attribute." (if modus-themes-slanted-constructs (list 'italic) (list 'normal))) (defun modus-themes--variable-pitch () "Conditional use of `variable-pitch' in headings." (when modus-themes-variable-pitch-headings (list :inherit 'variable-pitch))) (defun modus-themes--variable-pitch-ui () "Conditional use of `variable-pitch' in UI elements." (when modus-themes-variable-pitch-ui (list :inherit 'variable-pitch))) (defun modus-themes--fringe (mainbg subtlebg intensebg) "Conditional use of background colors for fringes. MAINBG is the default. SUBTLEBG should be a subtle greyscale value. INTENSEBG must be a more pronounced greyscale color." (pcase modus-themes-fringes ('intense (list :background intensebg)) ('subtle (list :background subtlebg)) (_ (list :background mainbg)))) (defun modus-themes--line-numbers (mainfg mainbg altfg &optional altbg) "Conditional use of colors for line numbers. MAINBG and MAINFG are the default colors. ALTFG is a color that combines with the theme's primary background (white/black)." (if modus-themes-subtle-line-numbers (list :background (or altbg 'unspecified) :foreground altfg) (list :background mainbg :foreground mainfg))) (defun modus-themes--lang-check (underline subtlefg intensefg bg) "Conditional use of foreground colors for language checkers. UNDERLINE is a color-code value for the affected text's underline property. SUBTLEFG and INTENSEFG follow the same color-coding pattern and represent a value that is faint or vibrant respectively. BG is a color-coded background." (pcase modus-themes-lang-checkers ('colored-background (list :underline underline :background bg :foreground intensefg)) ('intense-foreground (list :underline (list :color underline :style 'wave) :foreground intensefg)) ('intense-foreground-straight-underline (list :underline underline :foreground intensefg)) ('subtle-foreground (list :underline (list :color underline :style 'wave) :foreground subtlefg)) ('subtle-foreground-straight-underline (list :underline underline :foreground subtlefg)) ('straight-underline (list :underline underline)) (_ (list :underline (list :color underline :style 'wave))))) (defun modus-themes--prompt (mainfg subtlebg subtlefg intensebg intensefg) "Conditional use of background colors for prompts. MAINFG is the prompt's standard foreground. SUBTLEBG should be a subtle accented background that works with SUBTLEFG. INTENSEBG must be a more pronounced accented color that should be combinable with INTENSEFG." (pcase modus-themes-prompts ;; `subtle' is the same as `subtle-accented', while `intense' is ;; equal to `intense-accented' for backward compatibility ('intense-accented (list :background intensebg :foreground intensefg)) ('intense (list :background intensebg :foreground intensefg)) ('subtle-accented (list :background subtlebg :foreground subtlefg)) ('subtle (list :background subtlebg :foreground subtlefg)) ('subtle-gray (list :inherit 'modus-theme-subtle-neutral)) ('intense-gray (list :inherit 'modus-theme-intense-neutral)) (_ (list :background nil :foreground mainfg)))) (defun modus-themes--paren (normalbg intensebg) "Conditional use of intense colors for matching parentheses. NORMALBG should be the special palette color 'bg-paren-match' or something similar. INTENSEBG must be easier to discern next to other backgrounds, such as the special palette color 'bg-paren-match-intense'." (pcase modus-themes-paren-match ('subtle-bold (list :inherit 'bold :background normalbg)) ('intense-bold (list :inherit 'bold :background intensebg)) ('intense (list :background intensebg)) (_ (list :background normalbg)))) (defun modus-themes--syntax-foreground (fg faint) "Apply foreground value to code syntax. FG is the default. FAINT is typically the same color in its desaturated version." (pcase modus-themes-syntax ('faint (list :foreground faint)) ('faint-yellow-comments (list :foreground faint)) (_ (list :foreground fg)))) (defun modus-themes--syntax-extra (fg faint alt) "Apply foreground value to code syntax. FG is the default. FAINT is typically the same color in its desaturated version. ALT is another hue." (pcase modus-themes-syntax ('faint (list :foreground faint)) ('faint-yellow-comments (list :foreground faint)) ('alt-syntax (list :foreground alt)) ('alt-syntax-yellow-comments (list :foreground alt)) (_ (list :foreground fg)))) (defun modus-themes--syntax-string (fg faint green alt) "Apply foreground value to strings in code syntax. FG is the default. FAINT is typically the same color in its desaturated version. GREEN is a color variant in that side of the spectrum. ALT is another hue." (pcase modus-themes-syntax ('faint (list :foreground faint)) ('faint-yellow-comments (list :foreground faint)) ('green-strings (list :foreground green)) ('yellow-comments-green-strings (list :foreground alt)) ('alt-syntax (list :foreground alt)) ('alt-syntax-yellow-comments (list :foreground alt)) (_ (list :foreground fg)))) (defun modus-themes--syntax-docstring (fg faint green alt) "Apply foreground value to strings in code syntax. FG is the default. FAINT is typically the same color in its desaturated version. GREEN is a color variant in that side of the spectrum. ALT is another hue." (pcase modus-themes-syntax ('faint (list :foreground faint)) ('faint-yellow-comments (list :foreground faint)) ('green-strings (list :foreground green)) ('yellow-comments-green-strings (list :foreground green)) ('alt-syntax (list :foreground alt)) ('alt-syntax-yellow-comments (list :foreground alt)) (_ (list :foreground fg)))) (defun modus-themes--syntax-comment (fg yellow) "Apply foreground value to strings in code syntax. FG is the default. YELLOW is a color variant of that name." (pcase modus-themes-syntax ('yellow-comments (list :foreground yellow)) ('yellow-comments-green-strings (list :foreground yellow)) ('alt-syntax-yellow-comments (list :foreground yellow)) ('faint-yellow-comments (list :foreground yellow)) (_ (list :foreground fg)))) (defun modus-themes--heading-p (key) "Query style of KEY in `modus-themes-headings'." (cdr (assoc key modus-themes-headings))) (defun modus-themes--heading (level fg fg-alt bg border) "Conditional styles for `modus-themes-headings'. LEVEL is the heading's position in their order. FG is the default text color. FG-ALT is an accented, more saturated value than the default. BG is a nuanced, typically accented, background that can work well with either of the foreground values. BORDER is a color value that combines well with the background and alternative foreground." (let* ((key (modus-themes--heading-p `,level)) (style (or key (modus-themes--heading-p t))) (var (when modus-themes-variable-pitch-headings 'variable-pitch)) (varbold (if var (append (list 'bold) (list var)) 'bold))) (pcase style ('no-bold (list :inherit `,var :foreground fg)) ('no-color (list :inherit `,varbold)) ('no-color-no-bold (list :inherit `,var)) ('line (list :inherit `,varbold :foreground fg :overline border)) ('line-no-bold (list :inherit `,var :foreground fg :overline border)) ('rainbow (list :inherit `,varbold :foreground fg-alt)) ('rainbow-no-bold (list :inherit `,var :foreground fg-alt)) ('rainbow-line (list :inherit `,varbold :foreground fg-alt :overline border)) ('rainbow-line-no-bold (list :inherit `,var :foreground fg-alt :overline border)) ('highlight (list :inherit `,varbold :background bg :foreground fg)) ('highlight-no-bold (list :inherit `,var :background bg :foreground fg)) ('rainbow-highlight (list :inherit `,varbold :background bg :foreground fg-alt)) ('rainbow-highlight-no-bold (list :inherit `,var :background bg :foreground fg-alt)) ('section (list :inherit `,varbold :background bg :foreground fg :overline border :extend t)) ('section-no-bold (list :inherit `,var :background bg :foreground fg :overline border :extend t)) ('rainbow-section (list :inherit `,varbold :background bg :foreground fg-alt :overline border :extend t)) ('rainbow-section-no-bold (list :inherit `,var :background bg :foreground fg-alt :overline border :extend t)) (_ (list :inherit `,varbold :foreground fg))))) (defun modus-themes--org-block (bgblk) "Conditionally set the background of Org blocks. BGBLK applies to a distinct neutral background. Else blocks have no background of their own (the default), so they look the same as the rest of the buffer. `modus-themes-org-blocks' also accepts a `rainbow' option which is applied conditionally to `org-src-block-faces' (see the theme's source code)." (if (or (eq modus-themes-org-blocks 'grayscale) (eq modus-themes-org-blocks 'greyscale)) (list :background bgblk :extend t) (list :background 'unspecified))) (defun modus-themes--org-block-delim (bgaccent fgaccent bg fg) "Conditionally set the styles of Org block delimiters. BG, FG, BGACCENT, FGACCENT apply a background and foreground color respectively. The former pair is a greyscale combination that should be more distinct than the background of the block. It is applied to the default styles or when `modus-themes-org-blocks' is set to `greyscale'. The latter pair should be more subtle than the background of the block, as it is used when `modus-themes-org-blocks' is set to `rainbow'." (pcase modus-themes-org-blocks ('grayscale (list :background bg :foreground fg :extend t)) ('greyscale (list :background bg :foreground fg :extend t)) ('rainbow (list :background bgaccent :foreground fgaccent)) (_ (list :background bg :foreground fg)))) (defun modus-themes--org-habit (default &optional traffic simple) "Specify background values for `modus-themes-org-habit'. If no optional TRAFFIC argument is supplied, the DEFAULT is used instead. Same for SIMPLE." (pcase modus-themes-org-habit ('traffic-light (list :background (or traffic default))) ('simplified (list :background (or simple default))) (_ (list :background default)))) (defun modus-themes--mode-line-attrs (fg bg fg-alt bg-alt border border-3d &optional alt-style border-width fg-distant) "Color combinations for `modus-themes-mode-line'. FG and BG are the default colors. FG-ALT and BG-ALT are meant to accommodate the options for a 3D modeline or a `moody' compliant one. BORDER applies to all permutations of the modeline, except the three-dimensional effect, where BORDER-3D is used instead. Optional ALT-STYLE applies an appropriate style to the mode line's box property. Optional BORDER-WIDTH specifies an integer for the width of the rectangle that produces the box effect. Optional FG-DISTANT should be close to the main background values. It is intended to be used as a distant-foreground property." (pcase modus-themes-mode-line ('3d `(:background ,bg-alt :foreground ,fg-alt :box (:line-width ,(or border-width 1) :color ,border-3d :style ,(and alt-style 'released-button)))) ('moody `(:background ,bg-alt :foreground ,fg-alt :underline ,border :overline ,border :distant-foreground ,fg-distant)) ('borderless `(:foreground ,fg :background ,bg :box ,bg)) ('borderless-3d `(:foreground ,fg :background ,bg :box (:line-width ,(or border-width 1) :color ,bg :style ,(and alt-style 'released-button)))) ('borderless-moody `(:background ,bg :foreground ,fg :underline ,bg :overline ,bg :distant-foreground ,fg-distant)) (_ `(:foreground ,fg :background ,bg :box ,border)))) (defun modus-themes--diff (fg-only-bg fg-only-fg mainbg mainfg altbg altfg &optional deuteranbg deuteranfg bg-only-fg) "Color combinations for `modus-themes-diffs'. FG-ONLY-BG should be similar or the same as the main background. FG-ONLY-FG should be a saturated accent value that can be combined with the former. MAINBG must be one of the dedicated backgrounds for diffs while MAINFG must be the same for the foreground. ALTBG needs to be a slightly accented background that is meant to be combined with ALTFG. Both must be less intense than MAINBG and MAINFG respectively. DEUTERANBG and DEUTERANFG must be combinations of colors that account for red-green color defficiency (deuteranopia). Optional BG-ONLY-FG applies ALTFG else leaves the foreground unspecified." (pcase modus-themes-diffs ('fg-only (list :background fg-only-bg :foreground fg-only-fg)) ('desaturated (list :background altbg :foreground altfg)) ('deuteranopia (list :background (or deuteranbg mainbg) :foreground (or deuteranfg mainfg))) ('bg-only (list :background altbg :foreground (if bg-only-fg altfg 'unspecified))) (_ (list :background mainbg :foreground mainfg)))) (defun modus-themes--diff-deuteran (deuteran main) "Determine whether the DEUTERAN or MAIN color should be used. This is based on whether `modus-themes-diffs' has the value `deuteranopia'." (if (eq modus-themes-diffs 'deuteranopia) (list deuteran) (list main))) (defun modus-themes--diff-text (fg-only-fg default-fg) "Like `modus-themes--diff', but only for foregrounds. FG-ONLY-FG is the foreground that is used when diffs are styled using only foreground colors. DEFAULT-FG covers all other cases." (pcase modus-themes-diffs ('fg-only (list :foreground fg-only-fg)) ('bg-only (list :foreground 'unspecified)) (_ (list :foreground default-fg)))) (defun modus-themes--standard-completions (mainfg subtlebg intensebg intensefg) "Combinations for `modus-themes-completions'. MAINFG is an accented foreground value. SUBTLEBG is an accented background value that can be combined with MAINFG. INTENSEBG and INTENSEFG are accented colors that are designed to be used in tandem. These are intended for Icomplete, Ido, and related." (pcase modus-themes-completions ('opinionated (list :background intensebg :foreground intensefg)) ('moderate (list :background subtlebg :foreground mainfg)) (_ (list :foreground mainfg)))) (defun modus-themes--extra-completions (subtleface intenseface altface &optional altfg bold) "Combinations for `modus-themes-completions'. SUBTLEFACE and INTENSEFACE are custom theme faces that combine a background and foreground value. The difference between the two is a matter of degree. ALTFACE is a combination of colors that represents a departure from the UI's default aesthetics. Optional ALTFG is meant to be used in tandem with it. Optional BOLD will apply a heavier weight to the text. These are intended for Helm, Ivy, etc." (pcase modus-themes-completions ('opinionated (list :inherit (list altface bold) :foreground (or altfg 'unspecified))) ('moderate (list :inherit (list subtleface bold))) (_ (list :inherit (list intenseface bold))))) (defun modus-themes--link (fg fgfaint underline) "Conditional application of link styles. FG is the link's default color for its text and underline property. FGFAINT is a desaturated color for the text and underline. UNDERLINE is a grey color only for the undeline." (pcase modus-themes-links ('faint (list :foreground fgfaint :underline t)) ('neutral-underline (list :foreground fg :underline underline)) ('faint-neutral-underline (list :foreground fgfaint :underline underline)) ('no-underline (list :foreground fg :underline nil)) ('underline-only (list :underline t)) ('neutral-underline-only (list :underline underline)) (_ (list :foreground fg :underline t)))) (defun modus-themes--link-color (fg fgfaint &optional neutralfg) "Extends `modus-themes--link'. FG is the main accented foreground. FGFAINT is also accented, yet desaturated. Optional NEUTRALFG is a gray value." (pcase modus-themes-links ('faint (list :foreground fgfaint)) ('faint-neutral-underline (list :foreground fgfaint)) ('underline-only (list :underline t :foreground (or neutralfg 'unspecified))) ('neutral-underline-only (list :underline 'unspecified :foreground (or neutralfg 'unspecified))) (_ (list :foreground fg)))) (defun modus-themes--scale (amount) "Scale heading by AMOUNT. AMOUNT is a customization option." (when modus-themes-scale-headings (list :height amount))) (defun modus-themes--region (bg fg bgsubtle) "Apply `modus-themes-region' styles. BG and FG are the main values that are used by default. BGSUBTLE is a subtle background value that can be combined with all colors used to fontify text and code syntax." (pcase modus-themes-region ('bg-only (list :background bgsubtle)) ('bg-only-no-extend (list :background bgsubtle :extend nil)) ('no-extend (list :background bg :foreground fg :extend nil)) (_ (list :background bg :foreground fg)))) ;;;; Utilities for DIY users ;; This is the WCAG formula: https://www.w3.org/TR/WCAG20-TECHS/G18.html (defun modus-themes-wcag-formula (hex) "Get WCAG value of color value HEX. The value is defined in hexadecimal RGB notation, such as those in `modus-themes-operandi-colors' and `modus-themes-vivendi-colors'." (cl-loop for k in '(0.2126 0.7152 0.0722) for x in (color-name-to-rgb hex) sum (* k (if (<= x 0.03928) (/ x 12.92) (expt (/ (+ x 0.055) 1.055) 2.4))))) ;;;###autoload (defun modus-themes-contrast (c1 c2) "Measure WCAG contrast ratio between C1 and C2. C1 and C2 are color values written in hexadecimal RGB." (let ((ct (/ (+ (modus-themes-wcag-formula c1) 0.05) (+ (modus-themes-wcag-formula c2) 0.05)))) (max ct (/ ct)))) (defun modus-themes-current-palette () "Return current color palette." (modus-themes--palette (modus-themes--current-theme))) ;;;###autoload (defun modus-themes-color (color) "Return color value for COLOR from current palette. COLOR is a key in `modus-themes-operandi-colors' or `modus-themes-vivendi-colors'." (alist-get color (modus-themes-current-palette))) ;;;###autoload (defun modus-themes-color-alts (light-color dark-color) "Return color value from current palette. When Modus Operandi is enabled, return color value for color LIGHT-COLOR. When Modus Vivendi is enabled, return color value for DARK-COLOR. LIGHT-COLOR and DARK-COLOR are keys in `modus-themes-operandi-colors' or `modus-themes-vivendi-colors'." (let* ((theme (modus-themes--current-theme)) (color (pcase theme ('modus-operandi light-color) ('modus-vivendi dark-color) (_theme (error "'%s' is not a Modus theme" theme))))) (alist-get color (modus-themes--palette theme)))) (defmacro modus-themes-with-colors (&rest body) "Evaluate BODY with colors from current palette bound. For colors bound, see `modus-themes-operandi-colors' or `modus-themes-vivendi-colors'." (declare (indent 0)) (let ((palette-sym (gensym)) (colors (mapcar #'car modus-themes-operandi-colors))) `(let* ((class '((class color) (min-colors 89))) (,palette-sym (modus-themes-current-palette)) ,@(mapcar (lambda (color) (list color `(alist-get ',color ,palette-sym))) colors)) (ignore class ,@colors) ; Silence unused variable warnings ,@body))) ;;;; Commands ;;;###autoload (defun modus-themes-load-themes () "Ensure that the Modus themes are in `custom-enabled-themes'. This function is intended for use in package declarations such as those defined with the help of `use-package'. The idea is to add this function to the `:init' stage of the package's loading, so that subsequent calls that assume the presence of a loaded theme, like `modus-themes-toggle' or `modus-themes-load-operandi', will continue to work as intended even if they are lazy-loaded (such as when they are declared in the `:config' phase)." (unless (or (custom-theme-p 'modus-operandi) (custom-theme-p 'modus-vivendi)) (load-theme 'modus-operandi t t) (load-theme 'modus-vivendi t t))) (defvar modus-themes-after-load-theme-hook nil "Hook that runs after the `modus-themes-toggle' routines.") ;; The reason we use `load-theme' instead of `enable-theme' is that the ;; former does a kind of "reset" on the face specs. So it plays nicely ;; with `custom-set-faces', as well as defcustom user customizations, ;; including the likes of `modus-themes-operandi-color-overrides'. ;; ;; Tests show that `enable-theme' does not re-read those variables, so ;; it might appear to the unsuspecting user that the themes are somehow ;; broken. ;; ;; This "reset", however, comes at the cost of being a bit slower than ;; `enable-theme'. User who have a stable setup and seldom update their ;; variables during a given Emacs session, are better off using ;; something like this: ;; ;; (defun modus-themes-toggle-enabled () ;; "Toggle between `modus-operandi' and `modus-vivendi' themes." ;; (interactive) ;; (pcase (modus-themes--current-theme) ;; ('modus-operandi (progn (enable-theme 'modus-vivendi) ;; (disable-theme 'modus-operandi))) ;; ('modus-vivendi (progn (enable-theme 'modus-operandi) ;; (disable-theme 'modus-vivendi))) ;; (_ (error "No Modus theme is loaded; evaluate `modus-themes-load-themes' first")))) ;;;###autoload (defun modus-themes-load-operandi () "Load `modus-operandi' and disable `modus-vivendi'. Also run `modus-themes-after-load-theme-hook'." (disable-theme 'modus-vivendi) (load-theme 'modus-operandi t) (run-hooks 'modus-themes-after-load-theme-hook)) ;;;###autoload (defun modus-themes-load-vivendi () "Load `modus-vivendi' and disable `modus-operandi'. Also run `modus-themes-after-load-theme-hook'." (disable-theme 'modus-operandi) (load-theme 'modus-vivendi t) (run-hooks 'modus-themes-after-load-theme-hook)) (defun modus-themes--load-prompt () "Helper for `modus-themes-toggle'." (let ((theme (intern (completing-read "Load Modus theme (will disable all others): " '(modus-operandi modus-vivendi) nil t)))) (mapc #'disable-theme custom-enabled-themes) (pcase theme ('modus-operandi (modus-themes-load-operandi)) ('modus-vivendi (modus-themes-load-vivendi))))) ;;;###autoload (defun modus-themes-toggle () "Toggle between `modus-operandi' and `modus-vivendi' themes. Also runs `modus-themes-after-load-theme-hook' at its last stage by virtue of calling either of `modus-themes-load-operandi' and `modus-themes-load-vivendi' functions." (interactive) (modus-themes-load-themes) (pcase (modus-themes--current-theme) ('modus-operandi (modus-themes-load-vivendi)) ('modus-vivendi (modus-themes-load-operandi)) (_ (modus-themes--load-prompt)))) ;;;; Face specifications (defconst modus-themes-faces '( ;;;; custom faces ;; these bespoke faces are inherited by other constructs below ;;;;; subtle colored backgrounds `(modus-theme-subtle-red ((,class :background ,red-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-green ((,class :background ,green-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-yellow ((,class :background ,yellow-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-blue ((,class :background ,blue-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-magenta ((,class :background ,magenta-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-cyan ((,class :background ,cyan-subtle-bg :foreground ,fg-dim))) `(modus-theme-subtle-neutral ((,class :background ,bg-inactive :foreground ,fg-inactive))) ;;;;; intense colored backgrounds `(modus-theme-intense-red ((,class :background ,red-intense-bg :foreground ,fg-main))) `(modus-theme-intense-green ((,class :background ,green-intense-bg :foreground ,fg-main))) `(modus-theme-intense-yellow ((,class :background ,yellow-intense-bg :foreground ,fg-main))) `(modus-theme-intense-blue ((,class :background ,blue-intense-bg :foreground ,fg-main))) `(modus-theme-intense-magenta ((,class :background ,magenta-intense-bg :foreground ,fg-main))) `(modus-theme-intense-cyan ((,class :background ,cyan-intense-bg :foreground ,fg-main))) `(modus-theme-intense-neutral ((,class :background ,bg-active :foreground ,fg-main))) ;;;;; refined background and foreground combinations ;; general purpose styles that use an accented foreground against an ;; accented background `(modus-theme-refine-red ((,class :background ,red-refine-bg :foreground ,red-refine-fg))) `(modus-theme-refine-green ((,class :background ,green-refine-bg :foreground ,green-refine-fg))) `(modus-theme-refine-yellow ((,class :background ,yellow-refine-bg :foreground ,yellow-refine-fg))) `(modus-theme-refine-blue ((,class :background ,blue-refine-bg :foreground ,blue-refine-fg))) `(modus-theme-refine-magenta ((,class :background ,magenta-refine-bg :foreground ,magenta-refine-fg))) `(modus-theme-refine-cyan ((,class :background ,cyan-refine-bg :foreground ,cyan-refine-fg))) ;;;;; "active" combinations, mostly for use on the mode line `(modus-theme-active-red ((,class :background ,red-active :foreground ,bg-active))) `(modus-theme-active-green ((,class :background ,green-active :foreground ,bg-active))) `(modus-theme-active-yellow ((,class :background ,yellow-active :foreground ,bg-active))) `(modus-theme-active-blue ((,class :background ,blue-active :foreground ,bg-active))) `(modus-theme-active-magenta ((,class :background ,magenta-active :foreground ,bg-active))) `(modus-theme-active-cyan ((,class :background ,cyan-active :foreground ,bg-active))) ;;;;; nuanced backgrounds ;; useful for adding an accented background that is suitable for all ;; main foreground colors (intended for use in Org source blocks) `(modus-theme-nuanced-red ((,class :background ,red-nuanced-bg :extend t))) `(modus-theme-nuanced-green ((,class :background ,green-nuanced-bg :extend t))) `(modus-theme-nuanced-yellow ((,class :background ,yellow-nuanced-bg :extend t))) `(modus-theme-nuanced-blue ((,class :background ,blue-nuanced-bg :extend t))) `(modus-theme-nuanced-magenta ((,class :background ,magenta-nuanced-bg :extend t))) `(modus-theme-nuanced-cyan ((,class :background ,cyan-nuanced-bg :extend t))) ;;;;; fringe-specific combinations `(modus-theme-fringe-red ((,class :background ,red-fringe-bg :foreground ,fg-main))) `(modus-theme-fringe-green ((,class :background ,green-fringe-bg :foreground ,fg-main))) `(modus-theme-fringe-yellow ((,class :background ,yellow-fringe-bg :foreground ,fg-main))) `(modus-theme-fringe-blue ((,class :background ,blue-fringe-bg :foreground ,fg-main))) `(modus-theme-fringe-magenta ((,class :background ,magenta-fringe-bg :foreground ,fg-main))) `(modus-theme-fringe-cyan ((,class :background ,cyan-fringe-bg :foreground ,fg-main))) ;;;;; special base values ;; these are closer to the grayscale than the accents defined above ;; and should only be used when the next closest alternative would be ;; a greyscale value than an accented one `(modus-theme-special-cold ((,class :background ,bg-special-cold :foreground ,fg-special-cold))) `(modus-theme-special-mild ((,class :background ,bg-special-mild :foreground ,fg-special-mild))) `(modus-theme-special-warm ((,class :background ,bg-special-warm :foreground ,fg-special-warm))) `(modus-theme-special-calm ((,class :background ,bg-special-calm :foreground ,fg-special-calm))) ;;;;; diff-specific combinations ;; intended for `diff-mode' or equivalent `(modus-theme-diff-added ((,class ,@(modus-themes--diff bg-main green bg-diff-focus-added fg-diff-focus-added green-nuanced-bg fg-diff-added bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran)))) `(modus-theme-diff-changed ((,class ,@(modus-themes--diff bg-main yellow bg-diff-focus-changed fg-diff-focus-changed yellow-nuanced-bg fg-diff-changed)))) `(modus-theme-diff-removed ((,class ,@(modus-themes--diff bg-main red bg-diff-focus-removed fg-diff-focus-removed red-nuanced-bg fg-diff-removed)))) `(modus-theme-diff-refine-added ((,class ,@(modus-themes--diff bg-diff-added fg-diff-added bg-diff-refine-added fg-diff-refine-added bg-diff-focus-added fg-diff-focus-added bg-diff-refine-added-deuteran fg-diff-refine-added-deuteran)))) `(modus-theme-diff-refine-changed ((,class ,@(modus-themes--diff bg-diff-changed fg-diff-changed bg-diff-refine-changed fg-diff-refine-changed bg-diff-focus-changed fg-diff-focus-changed)))) `(modus-theme-diff-refine-removed ((,class ,@(modus-themes--diff bg-diff-removed fg-diff-removed bg-diff-refine-removed fg-diff-refine-removed bg-diff-focus-removed fg-diff-focus-removed)))) `(modus-theme-diff-focus-added ((,class ,@(modus-themes--diff bg-dim green bg-diff-focus-added fg-diff-focus-added bg-diff-added fg-diff-added bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran)))) `(modus-theme-diff-focus-changed ((,class ,@(modus-themes--diff bg-dim yellow bg-diff-focus-changed fg-diff-focus-changed bg-diff-changed fg-diff-changed)))) `(modus-theme-diff-focus-removed ((,class ,@(modus-themes--diff bg-dim red bg-diff-focus-removed fg-diff-focus-removed bg-diff-removed fg-diff-removed)))) `(modus-theme-diff-heading ((,class ,@(modus-themes--diff bg-main blue bg-diff-heading fg-diff-heading cyan-nuanced-bg cyan-nuanced-fg bg-header fg-main t)))) ;;;;; mark indicators ;; color combinations intended for Dired, Ibuffer, or equivalent `(modus-theme-pseudo-header ((,class :inherit bold :foreground ,fg-main))) `(modus-theme-mark-alt ((,class :inherit bold :background ,bg-mark-alt :foreground ,fg-mark-alt))) `(modus-theme-mark-del ((,class :inherit bold :background ,bg-mark-del :foreground ,fg-mark-del))) `(modus-theme-mark-sel ((,class :inherit bold :background ,bg-mark-sel :foreground ,fg-mark-sel))) `(modus-theme-mark-symbol ((,class :inherit bold :foreground ,blue-alt))) ;;;;; heading levels ;; styles for regular headings used in Org, Markdown, Info, etc. `(modus-theme-heading-1 ((,class ,@(modus-themes--heading 1 fg-main magenta-alt-other magenta-nuanced-bg bg-region) ,@(modus-themes--scale modus-themes-scale-4)))) `(modus-theme-heading-2 ((,class ,@(modus-themes--heading 2 fg-special-warm magenta-alt red-nuanced-bg bg-region) ,@(modus-themes--scale modus-themes-scale-3)))) `(modus-theme-heading-3 ((,class ,@(modus-themes--heading 3 fg-special-cold blue blue-nuanced-bg bg-region) ,@(modus-themes--scale modus-themes-scale-2)))) `(modus-theme-heading-4 ((,class ,@(modus-themes--heading 4 fg-special-mild cyan cyan-nuanced-bg bg-region) ,@(modus-themes--scale modus-themes-scale-1)))) `(modus-theme-heading-5 ((,class ,@(modus-themes--heading 5 fg-special-calm green-alt-other green-nuanced-bg bg-region)))) `(modus-theme-heading-6 ((,class ,@(modus-themes--heading 6 yellow-nuanced-fg yellow-alt-other yellow-nuanced-bg bg-region)))) `(modus-theme-heading-7 ((,class ,@(modus-themes--heading 7 red-nuanced-fg red-alt red-nuanced-bg bg-region)))) `(modus-theme-heading-8 ((,class ,@(modus-themes--heading 8 fg-dim magenta bg-alt bg-region)))) ;;;;; graph-specific faces `(modus-theme-graph-red-0 ((,class :background ,red-graph-0-bg))) `(modus-theme-graph-red-1 ((,class :background ,red-graph-1-bg))) `(modus-theme-graph-green-0 ((,class :background ,green-graph-0-bg))) `(modus-theme-graph-green-1 ((,class :background ,green-graph-1-bg))) `(modus-theme-graph-yellow-0 ((,class :background ,yellow-graph-0-bg))) `(modus-theme-graph-yellow-1 ((,class :background ,yellow-graph-1-bg))) `(modus-theme-graph-blue-0 ((,class :background ,blue-graph-0-bg))) `(modus-theme-graph-blue-1 ((,class :background ,blue-graph-1-bg))) `(modus-theme-graph-magenta-0 ((,class :background ,magenta-graph-0-bg))) `(modus-theme-graph-magenta-1 ((,class :background ,magenta-graph-1-bg))) `(modus-theme-graph-cyan-0 ((,class :background ,cyan-graph-0-bg))) `(modus-theme-graph-cyan-1 ((,class :background ,cyan-graph-1-bg))) ;;;;; language checkers `(modus-theme-lang-error ((,class ,@(modus-themes--lang-check fg-lang-underline-error fg-lang-error red red-nuanced-bg)))) `(modus-theme-lang-note ((,class ,@(modus-themes--lang-check fg-lang-underline-note fg-lang-note blue-alt blue-nuanced-bg)))) `(modus-theme-lang-warning ((,class ,@(modus-themes--lang-check fg-lang-underline-warning fg-lang-warning yellow yellow-nuanced-bg)))) ;;;;; other custom faces `(modus-theme-bold ((,class ,@(modus-themes--bold-weight)))) `(modus-theme-hl-line ((,class :background ,(if modus-themes-intense-hl-line bg-hl-line-intense bg-hl-line) :extend t))) `(modus-theme-slant ((,class :inherit italic :slant ,@(modus-themes--slant)))) `(modus-theme-variable-pitch ((,class ,@(modus-themes--variable-pitch)))) ;;;; standard faces ;;;;; absolute essentials `(default ((,class :background ,bg-main :foreground ,fg-main))) `(cursor ((,class :background ,fg-main))) `(fringe ((,class ,@(modus-themes--fringe bg-main bg-inactive bg-active) :foreground ,fg-main))) `(vertical-border ((,class :foreground ,fg-window-divider-inner))) ;;;;; basic and/or ungrouped styles `(bold ((,class :weight bold))) `(bold-italic ((,class :inherit (bold italic)))) `(buffer-menu-buffer ((,class :inherit bold))) `(comint-highlight-input ((,class :inherit bold))) `(comint-highlight-prompt ((,class :inherit modus-theme-bold ,@(modus-themes--prompt cyan blue-nuanced-bg blue-alt blue-refine-bg fg-main)))) `(error ((,class :inherit bold :foreground ,red))) `(escape-glyph ((,class :foreground ,fg-escape-char-construct))) `(file-name-shadow ((,class :foreground ,fg-unfocused))) `(header-line ((,class ,@(modus-themes--variable-pitch-ui) :background ,bg-header :foreground ,fg-header))) `(header-line-highlight ((,class :inherit modus-theme-active-blue))) `(help-argument-name ((,class :inherit modus-theme-slant :foreground ,cyan))) `(homoglyph ((,class :foreground ,red-alt-faint))) `(ibuffer-locked-buffer ((,class :foreground ,yellow-alt-other-faint))) `(italic ((,class :slant italic))) `(nobreak-hyphen ((,class :foreground ,fg-escape-char-construct))) `(nobreak-space ((,class :foreground ,fg-escape-char-construct :underline t))) `(minibuffer-prompt ((,class ,@(modus-themes--prompt cyan-alt-other cyan-nuanced-bg cyan cyan-refine-bg fg-main)))) `(mm-command-output ((,class :foreground ,red-alt-other))) `(mm-uu-extract ((,class :background ,bg-dim :foreground ,fg-special-mild))) `(next-error ((,class :inherit modus-theme-subtle-red))) `(rectangle-preview ((,class :inherit modus-theme-special-mild))) `(region ((,class ,@(modus-themes--region bg-region fg-main bg-hl-alt-intense)))) `(secondary-selection ((,class :inherit modus-theme-special-cold))) `(shadow ((,class :foreground ,fg-alt))) `(success ((,class :inherit bold :foreground ,green))) `(trailing-whitespace ((,class :background ,red-intense-bg))) `(warning ((,class :inherit bold :foreground ,yellow))) ;;;;; buttons, links, widgets `(button ((,class ,@(modus-themes--link blue-alt-other blue-alt-other-faint bg-region)))) `(link ((,class :inherit button))) `(link-visited ((,class :inherit button ,@(modus-themes--link-color magenta-alt-other magenta-alt-other-faint fg-alt)))) `(tooltip ((,class :background ,bg-special-cold :foreground ,fg-main))) `(widget-button ((,class :inherit button))) `(widget-button-pressed ((,class :inherit button ,@(modus-themes--link-color magenta magenta-faint)))) `(widget-documentation ((,class :foreground ,green))) `(widget-field ((,class :background ,bg-alt :foreground ,fg-dim))) `(widget-inactive ((,class :background ,bg-inactive :foreground ,fg-inactive))) `(widget-single-line-field ((,class :inherit widget-field))) ;;;;; ag `(ag-hit-face ((,class :foreground ,fg-special-cold))) `(ag-match-face ((,class :inherit modus-theme-special-calm))) ;;;;; alert `(alert-high-face ((,class :inherit bold :foreground ,red-alt))) `(alert-low-face ((,class :foreground ,fg-special-mild))) `(alert-moderate-face ((,class :inherit bold :foreground ,yellow))) `(alert-trivial-face ((,class :foreground ,fg-special-calm))) `(alert-urgent-face ((,class :inherit bold :foreground ,red-intense))) ;;;;; all-the-icons `(all-the-icons-blue ((,class :foreground ,blue))) `(all-the-icons-blue-alt ((,class :foreground ,blue-alt))) `(all-the-icons-cyan ((,class :foreground ,cyan))) `(all-the-icons-cyan-alt ((,class :foreground ,cyan-alt))) `(all-the-icons-dblue ((,class :foreground ,blue-alt-other))) `(all-the-icons-dcyan ((,class :foreground ,cyan-alt-other))) `(all-the-icons-dgreen ((,class :foreground ,green-alt-other))) `(all-the-icons-dired-dir-face ((,class :foreground ,blue))) `(all-the-icons-dmaroon ((,class :foreground ,magenta-alt-other))) `(all-the-icons-dorange ((,class :foreground ,red-alt-other))) `(all-the-icons-dpink ((,class :foreground ,magenta))) `(all-the-icons-dpurple ((,class :foreground ,magenta-alt))) `(all-the-icons-dred ((,class :foreground ,red))) `(all-the-icons-dsilver ((,class :foreground ,fg-special-cold))) `(all-the-icons-dyellow ((,class :foreground ,yellow))) `(all-the-icons-green ((,class :foreground ,green))) `(all-the-icons-lblue ((,class :foreground ,blue-refine-fg))) `(all-the-icons-lcyan ((,class :foreground ,cyan-refine-fg))) `(all-the-icons-lgreen ((,class :foreground ,green-refine-fg))) `(all-the-icons-lmaroon ((,class :foreground ,magenta-refine-fg))) `(all-the-icons-lorange ((,class :foreground ,red-refine-fg))) `(all-the-icons-lpink ((,class :foreground ,magenta-refine-fg))) `(all-the-icons-lpurple ((,class :foreground ,magenta-refine-fg))) `(all-the-icons-lred ((,class :foreground ,red-refine-fg))) `(all-the-icons-lsilver ((,class :foreground ,fg-special-cold))) `(all-the-icons-lyellow ((,class :foreground ,yellow-refine-fg))) `(all-the-icons-maroon ((,class :foreground ,magenta))) `(all-the-icons-orange ((,class :foreground ,red-alt))) `(all-the-icons-pink ((,class :foreground ,magenta))) `(all-the-icons-purple ((,class :foreground ,magenta-alt))) `(all-the-icons-purple-alt ((,class :foreground ,magenta-alt-other))) `(all-the-icons-red ((,class :foreground ,red))) `(all-the-icons-red-alt ((,class :foreground ,red-alt))) `(all-the-icons-silver ((,class :foreground ,fg-special-cold))) `(all-the-icons-yellow ((,class :foreground ,yellow))) ;;;;; annotate `(annotate-annotation ((,class :inherit modus-theme-subtle-blue))) `(annotate-annotation-secondary ((,class :inherit modus-theme-subtle-green))) `(annotate-highlight ((,class :background ,blue-nuanced-bg :underline ,blue-intense))) `(annotate-highlight-secondary ((,class :background ,green-nuanced-bg :underline ,green-intense))) ;;;;; anzu `(anzu-match-1 ((,class :inherit modus-theme-subtle-cyan))) `(anzu-match-2 ((,class :inherit modus-theme-subtle-green))) `(anzu-match-3 ((,class :inherit modus-theme-subtle-yellow))) `(anzu-mode-line ((,class :inherit bold :foreground ,green-active))) `(anzu-mode-line-no-match ((,class :inherit bold :foreground ,red-active))) `(anzu-replace-highlight ((,class :inherit modus-theme-refine-yellow :underline t))) `(anzu-replace-to ((,class :inherit (modus-theme-intense-green bold)))) ;;;;; apropos `(apropos-function-button ((,class :inherit button ,@(modus-themes--link-color magenta-alt-other magenta-alt-other-faint)))) `(apropos-keybinding ((,class :inherit bold :foreground ,cyan))) `(apropos-misc-button ((,class :inherit button ,@(modus-themes--link-color cyan-alt-other cyan-alt-other-faint)))) `(apropos-property ((,class :inherit modus-theme-bold :foreground ,magenta-alt))) `(apropos-symbol ((,class :inherit modus-theme-bold :foreground ,blue-alt-other))) `(apropos-user-option-button ((,class :inherit button ,@(modus-themes--link-color green-alt-other green-alt-other-faint)))) `(apropos-variable-button ((,class :inherit button ,@(modus-themes--link-color blue blue-faint)))) ;;;;; apt-sources-list `(apt-sources-list-components ((,class :foreground ,cyan))) `(apt-sources-list-options ((,class :foreground ,yellow))) `(apt-sources-list-suite ((,class :foreground ,green))) `(apt-sources-list-type ((,class :foreground ,magenta))) `(apt-sources-list-uri ((,class :foreground ,blue))) ;;;;; artbollocks-mode `(artbollocks-face ((,class :inherit modus-theme-lang-note))) `(artbollocks-lexical-illusions-face ((,class :background ,bg-alt :foreground ,red-alt :underline t))) `(artbollocks-passive-voice-face ((,class :inherit modus-theme-lang-warning))) `(artbollocks-weasel-words-face ((,class :inherit modus-theme-lang-error))) ;;;;; auctex and Tex `(font-latex-bold-face ((,class :inherit bold :foreground ,fg-special-calm))) `(font-latex-doctex-documentation-face ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(font-latex-doctex-preprocessor-face ((,class :inherit modus-theme-bold :foreground ,red-alt-other))) `(font-latex-italic-face ((,class :inherit italic :foreground ,fg-special-calm))) `(font-latex-math-face ((,class :foreground ,cyan-alt-other))) `(font-latex-script-char-face ((,class :foreground ,cyan-alt-other))) `(font-latex-sectioning-0-face ((,class :inherit modus-theme-variable-pitch :foreground ,blue-nuanced-fg))) `(font-latex-sectioning-1-face ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,blue-nuanced-fg))) `(font-latex-sectioning-2-face ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,blue-nuanced-fg))) `(font-latex-sectioning-3-face ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,blue-nuanced-fg))) `(font-latex-sectioning-4-face ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,blue-nuanced-fg))) `(font-latex-sectioning-5-face ((,class :inherit modus-theme-variable-pitch :foreground ,blue-nuanced-fg))) `(font-latex-sedate-face ((,class :inherit modus-theme-bold :foreground ,magenta-alt-other))) `(font-latex-slide-title-face ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,cyan-nuanced-fg ,@(modus-themes--scale modus-themes-scale-4)))) `(font-latex-string-face ((,class :inherit font-lock-string-face))) `(font-latex-subscript-face ((,class :height 0.95))) `(font-latex-superscript-face ((,class :height 0.95))) `(font-latex-verbatim-face ((,class :background ,bg-dim :foreground ,fg-special-mild))) `(font-latex-warning-face ((,class :inherit font-lock-warning-face))) `(tex-match ((,class :foreground ,blue-alt-other))) `(tex-verbatim ((,class :background ,bg-dim :foreground ,fg-special-mild))) `(texinfo-heading ((,class :foreground ,magenta))) `(TeX-error-description-error ((,class :inherit error))) `(TeX-error-description-help ((,class :foreground ,blue))) `(TeX-error-description-tex-said ((,class :foreground ,blue))) `(TeX-error-description-warning ((,class :inherit warning))) ;;;;; auto-dim-other-buffers `(auto-dim-other-buffers-face ((,class :background ,bg-alt))) ;;;;; avy `(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim))) `(avy-goto-char-timer-face ((,class :inherit (modus-theme-intense-yellow bold)))) `(avy-lead-face ((,class :inherit (modus-theme-intense-magenta bold)))) `(avy-lead-face-0 ((,class :inherit (modus-theme-intense-blue bold)))) `(avy-lead-face-1 ((,class :inherit (modus-theme-intense-red bold)))) `(avy-lead-face-2 ((,class :inherit (modus-theme-intense-green bold)))) ;;;;; aw (ace-window) `(aw-background-face ((,class :background ,bg-dim :foreground ,fg-dim))) `(aw-key-face ((,class :inherit bold :foreground ,blue-intense))) `(aw-leading-char-face ((,class :inherit bold :height 1.5 :slant normal :background ,bg-main :foreground ,red-intense))) `(aw-minibuffer-leading-char-face ((,class :foreground ,magenta-active))) `(aw-mode-line-face ((,class :inherit bold))) ;;;;; awesome-tray `(awesome-tray-module-awesome-tab-face ((,class :inherit bold :foreground ,red-alt-other))) `(awesome-tray-module-battery-face ((,class :inherit bold :foreground ,cyan-alt-other))) `(awesome-tray-module-buffer-name-face ((,class :inherit bold :foreground ,yellow-alt-other))) `(awesome-tray-module-circe-face ((,class :inherit bold :foreground ,blue-alt))) `(awesome-tray-module-date-face ((,class :inherit bold :foreground ,fg-dim))) `(awesome-tray-module-evil-face ((,class :inherit bold :foreground ,green-alt))) `(awesome-tray-module-git-face ((,class :inherit bold :foreground ,magenta))) `(awesome-tray-module-last-command-face ((,class :inherit bold :foreground ,blue-alt-other))) `(awesome-tray-module-location-face ((,class :inherit bold :foreground ,yellow))) `(awesome-tray-module-mode-name-face ((,class :inherit bold :foreground ,green))) `(awesome-tray-module-parent-dir-face ((,class :inherit bold :foreground ,cyan))) `(awesome-tray-module-rvm-face ((,class :inherit bold :foreground ,magenta-alt-other))) ;;;;; bbdb `(bbdb-name ((,class :foreground ,magenta-alt-other))) `(bbdb-organization ((,class :foreground ,red-alt-other))) `(bbdb-field-name ((,class :foreground ,cyan-alt-other))) ;;;;; binder `(binder-sidebar-highlight ((,class :inherit modus-theme-subtle-cyan))) `(binder-sidebar-marked ((,class :inherit modus-theme-mark-sel))) `(binder-sidebar-missing ((,class :inherit modus-theme-subtle-red))) `(binder-sidebar-tags ((,class :foreground ,cyan))) ;;;;; bm `(bm-face ((,class :inherit modus-theme-subtle-yellow :extend t))) `(bm-fringe-face ((,class :inherit modus-theme-fringe-yellow))) `(bm-fringe-persistent-face ((,class :inherit modus-theme-fringe-blue))) `(bm-persistent-face ((,class :inherit modus-theme-intense-blue :extend t))) ;;;;; bongo `(bongo-album-title ((,class :foreground ,yellow-active))) `(bongo-artist ((,class :foreground ,magenta-active))) `(bongo-currently-playing-track ((,class :inherit bold))) `(bongo-elapsed-track-part ((,class :inherit modus-theme-subtle-magenta :underline t))) `(bongo-filled-seek-bar ((,class :background ,blue-intense-bg :foreground ,fg-main))) `(bongo-marked-track ((,class :foreground ,fg-mark-alt))) `(bongo-marked-track-line ((,class :background ,bg-mark-alt))) `(bongo-played-track ((,class :foreground ,fg-unfocused :strike-through t))) `(bongo-track-length ((,class :foreground ,fg-active))) `(bongo-track-title ((,class :foreground ,cyan-active))) `(bongo-unfilled-seek-bar ((,class :background ,bg-special-cold :foreground ,fg-main))) ;;;;; boon `(boon-modeline-cmd ((,class :inherit modus-theme-active-blue))) `(boon-modeline-ins ((,class :inherit modus-theme-active-red))) `(boon-modeline-off ((,class :inherit modus-theme-active-yellow))) `(boon-modeline-spc ((,class :inherit modus-theme-active-green))) ;;;;; breakpoint (built-in gdb-mi.el) `(breakpoint-disabled ((,class :inherit shadow))) `(breakpoint-enabled ((,class :inherit bold :foreground ,red))) ;;;;; buffer-expose `(buffer-expose-ace-char-face ((,class :inherit bold :foreground ,red-active))) `(buffer-expose-mode-line-face ((,class :foreground ,cyan-active))) `(buffer-expose-selected-face ((,class :inherit modus-theme-special-mild))) ;;;;; calendar and diary `(calendar-month-header ((,class :inherit modus-theme-pseudo-header))) `(calendar-today ((,class :inherit bold :underline t))) `(calendar-weekday-header ((,class :inherit shadow))) `(calendar-weekend-header ((,class :inherit shadow))) `(diary ((,class :background ,green-nuanced-bg :foreground ,green-alt-other))) `(diary-anniversary ((,class :foreground ,red-alt-other))) `(diary-time ((,class :foreground ,blue-alt))) `(holiday ((,class :background ,magenta-nuanced-bg :foreground ,magenta-alt))) ;;;;; calfw `(cfw:face-annotation ((,class :foreground ,fg-special-warm))) `(cfw:face-day-title ((,class :foreground ,fg-main))) `(cfw:face-default-content ((,class :foreground ,green-alt))) `(cfw:face-default-day ((,class :inherit (cfw:face-day-title bold)))) `(cfw:face-disable ((,class :foreground ,fg-unfocused))) `(cfw:face-grid ((,class :foreground ,fg-window-divider-outer))) `(cfw:face-header ((,class :inherit bold :foreground ,fg-main))) `(cfw:face-holiday ((,class :foreground ,magenta-alt-other))) `(cfw:face-periods ((,class :foreground ,cyan-alt-other))) `(cfw:face-saturday ((,class :inherit bold :foreground ,cyan-alt-other))) `(cfw:face-select ((,class :inherit modus-theme-intense-blue))) `(cfw:face-sunday ((,class :inherit bold :foreground ,cyan-alt-other))) `(cfw:face-title ((,class :inherit modus-theme-variable-pitch :foreground ,fg-special-cold ,@(modus-themes--scale modus-themes-scale-5)))) `(cfw:face-today ((,class :background ,bg-inactive))) `(cfw:face-today-title ((,class :background ,bg-active))) `(cfw:face-toolbar ((,class :background ,bg-alt :foreground ,bg-alt))) `(cfw:face-toolbar-button-off ((,class :inherit shadow))) `(cfw:face-toolbar-button-on ((,class :inherit bold :background ,blue-nuanced-bg :foreground ,blue-alt))) ;;;;; centaur-tabs `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-active))) `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground ,red-active :underline t))) `(centaur-tabs-close-selected ((,class :inherit centaur-tabs-selected))) `(centaur-tabs-close-unselected ((,class :inherit centaur-tabs-unselected))) `(centaur-tabs-modified-marker-selected ((,class :inherit centaur-tabs-selected))) `(centaur-tabs-modified-marker-unselected ((,class :inherit centaur-tabs-unselected))) `(centaur-tabs-default ((,class :background ,bg-main :foreground ,bg-main))) `(centaur-tabs-selected ((,class :inherit bold :background ,bg-tab-active :foreground ,fg-main))) `(centaur-tabs-selected-modified ((,class :inherit italic :background ,bg-tab-active :foreground ,fg-main))) `(centaur-tabs-unselected ((,class :background ,bg-tab-inactive :foreground ,fg-dim))) `(centaur-tabs-unselected-modified ((,class :inherit italic :background ,bg-tab-inactive :foreground ,fg-dim))) ;;;;; cfrs `(cfrs-border-color ((,class :background ,fg-window-divider-inner))) ;;;;; change-log and log-view (`vc-print-log' and `vc-print-root-log') `(change-log-acknowledgment ((,class :foreground ,fg-alt))) `(change-log-conditionals ((,class :foreground ,yellow))) `(change-log-date ((,class :foreground ,cyan))) `(change-log-email ((,class :foreground ,cyan-alt-other))) `(change-log-file ((,class :inherit bold :foreground ,fg-special-cold))) `(change-log-function ((,class :foreground ,green-alt-other))) `(change-log-list ((,class :foreground ,magenta-alt))) `(change-log-name ((,class :foreground ,magenta-alt-other))) `(log-edit-header ((,class :foreground ,fg-special-warm))) `(log-edit-summary ((,class :inherit bold :foreground ,blue))) `(log-edit-unknown-header ((,class :inherit shadow))) `(log-view-commit-body ((,class :foreground ,blue-nuanced-fg))) `(log-view-file ((,class :inherit bold :foreground ,fg-special-cold))) `(log-view-message ((,class :background ,bg-alt :foreground ,fg-alt))) ;;;;; cider `(cider-debug-code-overlay-face ((,class :background ,bg-alt))) `(cider-debug-prompt-face ((,class :foreground ,magenta-alt :underline t))) `(cider-deprecated-face ((,class :inherit modus-theme-refine-yellow))) `(cider-docview-emphasis-face ((,class :inherit italic :foreground ,fg-special-cold))) `(cider-docview-literal-face ((,class :foreground ,blue-alt))) `(cider-docview-strong-face ((,class :inherit bold :foreground ,fg-special-cold))) `(cider-docview-table-border-face ((,class :inherit shadow))) `(cider-enlightened-face ((,class :box (:line-width -1 :color ,yellow-alt :style nil) :background ,bg-dim))) `(cider-enlightened-local-face ((,class :inherit bold :foreground ,yellow-alt-other))) `(cider-error-highlight-face ((,class :foreground ,red :underline t))) `(cider-fragile-button-face ((,class :box (:line-width 3 :color ,fg-alt :style released-button) :foreground ,yellow))) `(cider-fringe-good-face ((,class :foreground ,green-active))) `(cider-instrumented-face ((,class :box (:line-width -1 :color ,red :style nil) :background ,bg-dim))) `(cider-reader-conditional-face ((,class :inherit italic :foreground ,fg-special-warm))) `(cider-repl-input-face ((,class :inherit bold))) `(cider-repl-prompt-face ((,class :foreground ,cyan-alt-other))) `(cider-repl-stderr-face ((,class :inherit bold :foreground ,red))) `(cider-repl-stdout-face ((,class :foreground ,blue))) `(cider-result-overlay-face ((,class :box (:line-width -1 :color ,blue :style nil) :background ,bg-dim))) `(cider-stacktrace-error-class-face ((,class :inherit bold :foreground ,red))) `(cider-stacktrace-error-message-face ((,class :inherit italic :foreground ,red-alt-other))) `(cider-stacktrace-face ((,class :foreground ,fg-main))) `(cider-stacktrace-filter-active-face ((,class :foreground ,cyan-alt :underline t))) `(cider-stacktrace-filter-inactive-face ((,class :foreground ,cyan-alt))) `(cider-stacktrace-fn-face ((,class :inherit bold :foreground ,fg-main))) `(cider-stacktrace-ns-face ((,class :inherit italic :foreground ,fg-alt))) `(cider-stacktrace-promoted-button-face ((,class :box (:line-width 3 :color ,fg-alt :style released-button) :foreground ,red))) `(cider-stacktrace-suppressed-button-face ((,class :box (:line-width 3 :color ,fg-alt :style pressed-button) :background ,bg-alt :foreground ,fg-alt))) `(cider-test-error-face ((,class :inherit modus-theme-subtle-red))) `(cider-test-failure-face ((,class :inherit (modus-theme-intense-red bold)))) `(cider-test-success-face ((,class :inherit modus-theme-intense-green))) `(cider-traced-face ((,class :box (:line-width -1 :color ,cyan :style nil) :background ,bg-dim))) `(cider-warning-highlight-face ((,class :foreground ,yellow :underline t))) ;;;;; circe (and lui) `(circe-fool-face ((,class :inherit shadow))) `(circe-highlight-nick-face ((,class :inherit bold :foreground ,blue))) `(circe-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other))) `(circe-server-face ((,class :foreground ,fg-unfocused))) `(lui-button-face ((,class :inherit button))) `(lui-highlight-face ((,class :foreground ,magenta-alt))) `(lui-time-stamp-face ((,class :foreground ,blue-nuanced-fg))) ;;;;; color-rg `(color-rg-font-lock-column-number ((,class :foreground ,magenta-alt-other))) `(color-rg-font-lock-command ((,class :inherit bold :foreground ,fg-main))) `(color-rg-font-lock-file ((,class :inherit bold :foreground ,fg-special-cold))) `(color-rg-font-lock-flash ((,class :inherit modus-theme-intense-blue))) `(color-rg-font-lock-function-location ((,class :inherit modus-theme-special-calm))) `(color-rg-font-lock-header-line-directory ((,class :foreground ,blue-active))) `(color-rg-font-lock-header-line-edit-mode ((,class :foreground ,magenta-active))) `(color-rg-font-lock-header-line-keyword ((,class :foreground ,green-active))) `(color-rg-font-lock-header-line-text ((,class :foreground ,fg-active))) `(color-rg-font-lock-line-number ((,class :foreground ,fg-special-warm))) `(color-rg-font-lock-mark-changed ((,class :inherit bold :foreground ,blue))) `(color-rg-font-lock-mark-deleted ((,class :inherit bold :foreground ,red))) `(color-rg-font-lock-match ((,class :inherit modus-theme-special-calm))) `(color-rg-font-lock-position-splitter ((,class :inherit shadow))) ;;;;; column-enforce-mode `(column-enforce-face ((,class :inherit modus-theme-refine-yellow))) ;;;;; company-mode `(company-echo-common ((,class :foreground ,magenta-alt-other))) `(company-preview ((,class :background ,bg-dim :foreground ,fg-dim))) `(company-preview-common ((,class :foreground ,blue-alt))) `(company-preview-search ((,class :inherit modus-theme-special-calm))) `(company-scrollbar-bg ((,class :background ,bg-active))) `(company-scrollbar-fg ((,class :background ,fg-active))) `(company-template-field ((,class :inherit modus-theme-intense-magenta))) `(company-tooltip ((,class :background ,bg-alt :foreground ,fg-alt))) `(company-tooltip-annotation ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(company-tooltip-annotation-selection ((,class :inherit bold :foreground ,fg-main))) `(company-tooltip-common ((,class :inherit bold :foreground ,blue-alt))) `(company-tooltip-common-selection ((,class :foreground ,fg-main))) `(company-tooltip-mouse ((,class :inherit modus-theme-intense-blue))) `(company-tooltip-search ((,class :inherit (modus-theme-refine-cyan bold)))) `(company-tooltip-search-selection ((,class :inherit (modus-theme-intense-green bold) :underline t))) `(company-tooltip-selection ((,class :inherit (modus-theme-subtle-cyan bold)))) ;;;;; company-posframe `(company-posframe-active-backend-name ((,class :inherit bold :background ,bg-active :foreground ,blue-active))) `(company-posframe-inactive-backend-name ((,class :background ,bg-active :foreground ,fg-active))) `(company-posframe-metadata ((,class :background ,bg-inactive :foreground ,fg-inactive))) ;;;;; compilation feedback `(compilation-column-number ((,class :foreground ,magenta-alt-other))) `(compilation-error ((,class :inherit modus-theme-bold :foreground ,red))) `(compilation-info ((,class :inherit modus-theme-bold :foreground ,fg-special-cold))) `(compilation-line-number ((,class :foreground ,fg-special-warm))) `(compilation-mode-line-exit ((,class :inherit modus-theme-bold :foreground ,blue-active))) `(compilation-mode-line-fail ((,class :inherit modus-theme-bold :foreground ,red-active))) `(compilation-mode-line-run ((,class :inherit modus-theme-bold :foreground ,magenta-active))) `(compilation-warning ((,class :inherit modus-theme-bold :foreground ,yellow))) ;;;;; completions `(completions-annotations ((,class :inherit modus-theme-slant :foreground ,cyan-faint))) `(completions-common-part ((,class ,@(modus-themes--standard-completions blue-alt blue-nuanced-bg cyan-refine-bg cyan-refine-fg)))) `(completions-first-difference ((,class :inherit bold ,@(modus-themes--standard-completions magenta-alt blue-nuanced-bg magenta-intense-bg fg-main)))) ;;;;; consult `(consult-async-running ((,class :inherit bold :foreground ,blue))) `(consult-async-split ((,class :foreground ,magenta-alt))) `(consult-bookmark ((,class :foreground ,blue))) `(consult-file ((,class :foreground ,fg-special-cold))) `(consult-imenu-prefix ((,class :inherit shadow))) `(consult-key ((,class :inherit modus-themes-bold :foreground ,magenta-alt-other))) `(consult-line-number ((,class :foreground ,fg-special-warm))) `(consult-line-number-prefix ((,class :foreground ,fg-unfocused))) `(consult-narrow-indicator ((,class :foreground ,magenta-alt))) `(consult-preview-cursor ((,class :inherit modus-theme-intense-blue))) `(consult-preview-error ((,class :inherit modus-theme-intense-red))) `(consult-preview-line ((,class :background ,bg-hl-alt-intense))) ;;;;; counsel `(counsel-active-mode ((,class :foreground ,magenta-alt-other))) `(counsel-application-name ((,class :foreground ,red-alt-other))) `(counsel-key-binding ((,class :inherit bold :foreground ,blue-alt-other))) `(counsel-outline-1 ((,class :inherit org-level-1))) `(counsel-outline-2 ((,class :inherit org-level-2))) `(counsel-outline-3 ((,class :inherit org-level-3))) `(counsel-outline-4 ((,class :inherit org-level-4))) `(counsel-outline-5 ((,class :inherit org-level-5))) `(counsel-outline-6 ((,class :inherit org-level-6))) `(counsel-outline-7 ((,class :inherit org-level-7))) `(counsel-outline-8 ((,class :inherit org-level-8))) `(counsel-outline-default ((,class :foreground ,fg-main))) `(counsel-variable-documentation ((,class :inherit modus-theme-slant :foreground ,yellow-alt-other))) ;;;;; counsel-css `(counsel-css-selector-depth-face-1 ((,class :foreground ,blue))) `(counsel-css-selector-depth-face-2 ((,class :foreground ,cyan))) `(counsel-css-selector-depth-face-3 ((,class :foreground ,green))) `(counsel-css-selector-depth-face-4 ((,class :foreground ,yellow))) `(counsel-css-selector-depth-face-5 ((,class :foreground ,magenta))) `(counsel-css-selector-depth-face-6 ((,class :foreground ,red))) ;;;;; counsel-notmuch `(counsel-notmuch-count-face ((,class :foreground ,cyan))) `(counsel-notmuch-date-face ((,class :foreground ,blue))) `(counsel-notmuch-people-face ((,class :foreground ,magenta))) `(counsel-notmuch-subject-face ((,class :foreground ,magenta-alt-other))) ;;;;; counsel-org-capture-string `(counsel-org-capture-string-template-body-face ((,class :foreground ,fg-special-cold))) ;;;;; cov `(cov-coverage-not-run-face ((,class :foreground ,red-intense))) `(cov-coverage-run-face ((,class :foreground ,green-intense))) `(cov-heavy-face ((,class :foreground ,magenta-intense))) `(cov-light-face ((,class :foreground ,blue-intense))) `(cov-med-face ((,class :foreground ,yellow-intense))) `(cov-none-face ((,class :foreground ,cyan-intense))) ;;;;; cperl-mode `(cperl-nonoverridable-face ((,class :foreground unspecified))) `(cperl-array-face ((,class :inherit font-lock-keyword-face))) `(cperl-hash-face ((,class :inherit font-lock-variable-name-face))) ;;;;; csv-mode `(csv-separator-face ((,class :background ,bg-special-cold :foreground ,fg-main))) ;;;;; ctrlf `(ctrlf-highlight-active ((,class :inherit (modus-theme-intense-green bold)))) `(ctrlf-highlight-line ((,class :inherit modus-theme-hl-line))) `(ctrlf-highlight-passive ((,class :inherit modus-theme-refine-cyan))) ;;;;; custom (M-x customize) `(custom-button ((,class :box (:line-width 2 :color nil :style released-button) :background ,bg-active :foreground ,fg-main))) `(custom-button-mouse ((,class :box (:line-width 2 :color nil :style released-button) :background ,bg-active :foreground ,fg-active))) `(custom-button-pressed ((,class :box (:line-width 2 :color nil :style pressed-button) :background ,bg-active :foreground ,fg-main))) `(custom-changed ((,class :inherit modus-theme-subtle-cyan))) `(custom-comment ((,class :inherit shadow))) `(custom-comment-tag ((,class :background ,bg-alt :foreground ,yellow-alt-other))) `(custom-face-tag ((,class :inherit bold :foreground ,blue-intense))) `(custom-group-tag ((,class :inherit bold :foreground ,green-intense))) `(custom-group-tag-1 ((,class :inherit modus-theme-special-warm))) `(custom-invalid ((,class :inherit (modus-theme-intense-red bold)))) `(custom-modified ((,class :inherit modus-theme-subtle-cyan))) `(custom-rogue ((,class :inherit modus-theme-refine-magenta))) `(custom-set ((,class :foreground ,blue-alt))) `(custom-state ((,class :foreground ,cyan-alt-other))) `(custom-themed ((,class :inherit modus-theme-subtle-blue))) `(custom-variable-tag ((,class :inherit bold :foreground ,cyan))) ;;;;; dap-mode `(dap-mouse-eval-thing-face ((,class :box (:line-width -1 :color ,blue-active :style nil) :background ,bg-active :foreground ,fg-main))) `(dap-result-overlay-face ((,class :box (:line-width -1 :color ,bg-active :style nil) :background ,bg-active :foreground ,fg-main))) `(dap-ui-breakpoint-verified-fringe ((,class :inherit bold :foreground ,green-active))) `(dap-ui-compile-errline ((,class :inherit bold :foreground ,red-intense))) `(dap-ui-locals-scope-face ((,class :inherit bold :foreground ,magenta :underline t))) `(dap-ui-locals-variable-face ((,class :inherit bold :foreground ,cyan))) `(dap-ui-locals-variable-leaf-face ((,class :inherit italic :foreground ,cyan-alt-other))) `(dap-ui-marker-face ((,class :inherit modus-theme-subtle-blue))) `(dap-ui-sessions-stack-frame-face ((,class :inherit bold :foreground ,magenta-alt))) `(dap-ui-sessions-terminated-active-face ((,class :inherit bold :foreground ,fg-alt))) `(dap-ui-sessions-terminated-face ((,class :inherit shadow))) ;;;;; dashboard (emacs-dashboard) `(dashboard-banner-logo-title ((,class :inherit bold :foreground ,fg-special-cold))) `(dashboard-footer ((,class :inherit bold :foreground ,fg-special-mild))) `(dashboard-heading ((,class :inherit bold :foreground ,fg-special-warm))) `(dashboard-navigator ((,class :foreground ,cyan-alt-other))) `(dashboard-text-banner ((,class :foreground ,fg-dim))) ;;;;; deadgrep `(deadgrep-filename-face ((,class :inherit bold :foreground ,fg-special-cold))) `(deadgrep-match-face ((,class :inherit modus-theme-special-calm))) `(deadgrep-meta-face ((,class :inherit shadow))) `(deadgrep-regexp-metachar-face ((,class :inherit bold :foreground ,yellow-intense))) `(deadgrep-search-term-face ((,class :inherit bold :foreground ,green-intense))) ;;;;; debbugs `(debbugs-gnu-archived ((,class :inverse-video t))) `(debbugs-gnu-done ((,class :inherit shadow))) `(debbugs-gnu-forwarded ((,class :foreground ,fg-special-warm))) `(debbugs-gnu-handled ((,class :foreground ,green))) `(debbugs-gnu-new ((,class :foreground ,red))) `(debbugs-gnu-pending ((,class :foreground ,cyan))) `(debbugs-gnu-stale-1 ((,class :foreground ,yellow-nuanced-fg))) `(debbugs-gnu-stale-2 ((,class :foreground ,yellow))) `(debbugs-gnu-stale-3 ((,class :foreground ,yellow-alt))) `(debbugs-gnu-stale-4 ((,class :foreground ,yellow-alt-other))) `(debbugs-gnu-stale-5 ((,class :foreground ,red-alt))) `(debbugs-gnu-tagged ((,class :foreground ,magenta-alt))) ;;;;; define-word `(define-word-face-1 ((,class :foreground ,yellow))) `(define-word-face-2 ((,class :foreground ,fg-main))) ;;;;; deft `(deft-filter-string-error-face ((,class :inherit modus-theme-refine-red))) `(deft-filter-string-face ((,class :foreground ,green-intense))) `(deft-header-face ((,class :inherit bold :foreground ,fg-special-warm))) `(deft-separator-face ((,class :inherit shadow))) `(deft-summary-face ((,class :inherit modus-theme-slant :foreground ,fg-alt))) `(deft-time-face ((,class :foreground ,fg-special-cold))) `(deft-title-face ((,class :inherit bold :foreground ,fg-main))) ;;;;; dictionary `(dictionary-button-face ((,class :inherit bold :foreground ,fg-special-cold))) `(dictionary-reference-face ((,class :inherit button))) `(dictionary-word-definition-face (())) `(dictionary-word-entry-face ((,class :inherit font-lock-comment-face))) ;;;;; diff-hl `(diff-hl-change ((,class :inherit modus-theme-fringe-yellow))) `(diff-hl-delete ((,class :inherit modus-theme-fringe-red))) `(diff-hl-dired-change ((,class :inherit diff-hl-change))) `(diff-hl-dired-delete ((,class :inherit diff-hl-delete))) `(diff-hl-dired-ignored ((,class :inherit dired-ignored))) `(diff-hl-dired-insert ((,class :inherit diff-hl-insert))) `(diff-hl-dired-unknown ((,class :inherit dired-ignored))) `(diff-hl-insert ((,class :inherit modus-theme-fringe-green))) `(diff-hl-reverted-hunk-highlight ((,class :inherit (modus-theme-active-magenta bold)))) ;;;;; diff-mode `(diff-added ((,class :inherit modus-theme-diff-added))) `(diff-changed ((,class :inherit modus-theme-diff-changed :extend t))) `(diff-context ((,class ,@(modus-themes--diff-text fg-main fg-unfocused)))) `(diff-error ((,class :inherit modus-theme-intense-red))) `(diff-file-header ((,class :inherit (bold diff-header)))) `(diff-function ((,class :inherit modus-theme-diff-heading))) `(diff-header ((,class ,@(modus-themes--diff-text cyan-faint fg-main)))) `(diff-hunk-header ((,class :inherit (bold modus-theme-diff-heading)))) `(diff-index ((,class :inherit bold :foreground ,blue-alt))) `(diff-indicator-added ((,class :inherit (diff-added bold) :foreground ,@(modus-themes--diff-deuteran blue green)))) `(diff-indicator-changed ((,class :inherit (diff-changed bold) :foreground ,yellow))) `(diff-indicator-removed ((,class :inherit (diff-removed bold) :foreground ,red))) `(diff-nonexistent ((,class :inherit (modus-theme-neutral bold)))) `(diff-refine-added ((,class :inherit modus-theme-diff-refine-added))) `(diff-refine-changed ((,class :inherit modus-theme-diff-refine-changed))) `(diff-refine-removed ((,class :inherit modus-theme-diff-refine-removed))) `(diff-removed ((,class :inherit modus-theme-diff-removed))) ;;;;; dim-autoload `(dim-autoload-cookie-line ((,class :inherit font-lock-comment-face))) ;;;;; dir-treeview `(dir-treeview-archive-face ((,class :foreground ,fg-special-warm))) `(dir-treeview-archive-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,yellow))) `(dir-treeview-audio-face ((,class :foreground ,magenta))) `(dir-treeview-audio-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,magenta-alt))) `(dir-treeview-control-face ((,class :inherit shadow))) `(dir-treeview-control-mouse-face ((,class :inherit highlight))) `(dir-treeview-default-icon-face ((,class :inherit bold :family "Font Awesome" :foreground ,fg-alt))) `(dir-treeview-default-filename-face ((,class :foreground ,fg-main))) `(dir-treeview-directory-face ((,class :foreground ,blue))) `(dir-treeview-directory-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,blue-alt))) `(dir-treeview-executable-face ((,class :foreground ,red-alt))) `(dir-treeview-executable-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,red-alt-other))) `(dir-treeview-image-face ((,class :foreground ,green-alt-other))) `(dir-treeview-image-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,green-alt))) `(dir-treeview-indent-face ((,class :inherit shadow))) `(dir-treeview-label-mouse-face ((,class :inherit highlight))) `(dir-treeview-start-dir-face ((,class :inherit modus-theme-pseudo-header))) `(dir-treeview-symlink-face ((,class :inherit button ,@(modus-themes--link-color cyan cyan-faint)))) `(dir-treeview-video-face ((,class :foreground ,magenta-alt-other))) `(dir-treeview-video-icon-face ((,class :inherit dir-treeview-default-icon-face :foreground ,magenta-alt-other))) ;;;;; dired `(dired-broken-symlink ((,class :inherit button :foreground ,red))) `(dired-directory ((,class :foreground ,blue))) `(dired-flagged ((,class :inherit modus-theme-mark-del))) `(dired-header ((,class :inherit modus-theme-pseudo-header))) `(dired-ignored ((,class :inherit shadow))) `(dired-mark ((,class :inherit modus-theme-mark-symbol))) `(dired-marked ((,class :inherit modus-theme-mark-sel))) `(dired-perm-write ((,class :foreground ,fg-special-warm))) `(dired-symlink ((,class :inherit button ,@(modus-themes--link-color cyan-alt cyan-alt-faint)))) `(dired-warning ((,class :inherit bold :foreground ,yellow))) ;;;;; dired-async `(dired-async-failures ((,class :inherit modus-theme-bold :foreground ,red-active))) `(dired-async-message ((,class :inherit modus-theme-bold :foreground ,green-active))) `(dired-async-mode-message ((,class :inherit modus-theme-bold :foreground ,cyan-active))) ;;;;; dired-git `(dired-git-branch-else ((,class :inherit bold :foreground ,magenta-alt))) `(dired-git-branch-master ((,class :inherit bold :foreground ,magenta-alt-other))) ;;;;; dired-git-info `(dgi-commit-message-face ((,class :foreground ,fg-special-mild))) ;;;;; dired-narrow `(dired-narrow-blink ((,class :inherit (modus-theme-subtle-cyan bold)))) ;;;;; dired-subtree ;; remove backgrounds from dired-subtree faces, else they break ;; dired-{flagged,marked} and any other face that sets a background ;; such as hl-line. Also, denoting depth by varying shades of gray ;; is not good for accessibility. `(dired-subtree-depth-1-face (())) `(dired-subtree-depth-2-face (())) `(dired-subtree-depth-3-face (())) `(dired-subtree-depth-4-face (())) `(dired-subtree-depth-5-face (())) `(dired-subtree-depth-6-face (())) ;;;;; diredc `(diredc-face-chmod-font-lock-dir ((,class :foreground ,blue-alt))) `(diredc-face-chmod-font-lock-exec ((,class :foreground ,magenta))) `(diredc-face-chmod-font-lock-read ((,class :foreground ,fg-main))) `(diredc-face-chmod-font-lock-write ((,class :foreground ,cyan))) ;;;;; diredfl `(diredfl-autofile-name ((,class :inherit modus-theme-special-cold))) `(diredfl-compressed-file-name ((,class :foreground ,fg-special-warm))) `(diredfl-compressed-file-suffix ((,class :foreground ,red-alt))) `(diredfl-date-time ((,class :foreground ,cyan-alt-other))) `(diredfl-deletion ((,class :inherit modus-theme-mark-del))) `(diredfl-deletion-file-name ((,class :inherit modus-theme-mark-del))) `(diredfl-dir-heading ((,class :inherit modus-theme-pseudo-header))) `(diredfl-dir-name ((,class :inherit dired-directory))) `(diredfl-dir-priv ((,class :foreground ,blue-alt))) `(diredfl-exec-priv ((,class :foreground ,magenta))) `(diredfl-executable-tag ((,class :foreground ,magenta-alt))) `(diredfl-file-name ((,class :foreground ,fg-main))) `(diredfl-file-suffix ((,class :foreground ,cyan))) `(diredfl-flag-mark ((,class :inherit modus-theme-mark-sel))) `(diredfl-flag-mark-line ((,class :inherit modus-theme-mark-sel))) `(diredfl-ignored-file-name ((,class :inherit shadow))) `(diredfl-link-priv ((,class :foreground ,blue-alt-other))) `(diredfl-no-priv ((,class :inherit shadow))) `(diredfl-number ((,class :foreground ,cyan-alt))) `(diredfl-other-priv ((,class :foreground ,yellow))) `(diredfl-rare-priv ((,class :foreground ,red-alt))) `(diredfl-read-priv ((,class :foreground ,fg-main))) `(diredfl-symlink ((,class :inherit dired-symlink))) `(diredfl-tagged-autofile-name ((,class :inherit modus-theme-refine-magenta))) `(diredfl-write-priv ((,class :foreground ,cyan))) ;;;;; dired+ `(diredp-autofile-name ((,class :inherit modus-theme-special-cold))) `(diredp-compressed-file-name ((,class :foreground ,fg-special-warm))) `(diredp-compressed-file-suffix ((,class :foreground ,red-alt))) `(diredp-date-time ((,class :foreground ,cyan-alt-other))) `(diredp-deletion ((,class :inherit modus-theme-mark-del))) `(diredp-deletion-file-name ((,class :inherit modus-theme-mark-del))) `(diredp-dir-heading ((,class :inherit modus-theme-pseudo-header))) `(diredp-dir-name ((,class :inherit dired-directory))) `(diredp-dir-priv ((,class :foreground ,blue-alt))) `(diredp-exec-priv ((,class :foreground ,magenta))) `(diredp-executable-tag ((,class :foreground ,magenta-alt))) `(diredp-file-name ((,class :foreground ,fg-main))) `(diredp-file-suffix ((,class :foreground ,cyan))) `(diredp-flag-mark ((,class :inherit modus-theme-mark-sel))) `(diredp-flag-mark-line ((,class :inherit modus-theme-mark-sel))) `(diredp-ignored-file-name ((,class :inherit shadow))) `(diredp-link-priv ((,class :foreground ,blue-alt-other))) `(diredp-mode-line-flagged ((,class :foreground ,red-active))) `(diredp-mode-line-marked ((,class :foreground ,green-active))) `(diredp-no-priv ((,class :inherit shadow))) `(diredp-number ((,class :foreground ,cyan-alt))) `(diredp-omit-file-name ((,class :inherit shadow :strike-through t))) `(diredp-other-priv ((,class :foreground ,yellow))) `(diredp-rare-priv ((,class :foreground ,red-alt))) `(diredp-read-priv ((,class :foreground ,fg-main))) `(diredp-symlink ((,class :inherit dired-symlink))) `(diredp-tagged-autofile-name ((,class :inherit modus-theme-refine-magenta))) `(diredp-write-priv ((,class :foreground ,cyan))) ;;;;; disk-usage `(disk-usage-children ((,class :foreground ,yellow))) `(disk-usage-inaccessible ((,class :inherit bold :foreground ,red))) `(disk-usage-percent ((,class :foreground ,green))) `(disk-usage-size ((,class :foreground ,cyan))) `(disk-usage-symlink ((,class :inherit button))) `(disk-usage-symlink-directory ((,class :inherit bold :foreground ,blue-alt))) ;;;;; display-fill-column-indicator-mode `(fill-column-indicator ((,class :foreground ,bg-active))) ;;;;; doom-modeline `(doom-modeline-bar ((,class :inherit modus-theme-active-blue))) `(doom-modeline-bar-inactive ((,class :background ,fg-inactive :foreground ,bg-main))) `(doom-modeline-battery-charging ((,class :foreground ,green-active))) `(doom-modeline-battery-critical ((,class :inherit bold :foreground ,red-active))) `(doom-modeline-battery-error ((,class :inherit bold :box (:line-width -2) :foreground ,red-active))) `(doom-modeline-battery-full ((,class :foreground ,blue-active))) `(doom-modeline-battery-normal ((,class :foreground ,fg-active))) `(doom-modeline-battery-warning ((,class :inherit bold :foreground ,yellow-active))) `(doom-modeline-buffer-file ((,class :inherit bold :foreground ,fg-active))) `(doom-modeline-buffer-major-mode ((,class :inherit bold :foreground ,cyan-active))) `(doom-modeline-buffer-minor-mode ((,class :foreground ,fg-inactive))) `(doom-modeline-buffer-modified ((,class :inherit bold :foreground ,magenta-active))) `(doom-modeline-buffer-path ((,class :inherit bold :foreground ,fg-active))) `(doom-modeline-debug ((,class :inherit bold :foreground ,yellow-active))) `(doom-modeline-debug-visual ((,class :inherit bold :foreground ,red-active))) `(doom-modeline-evil-emacs-state ((,class :inherit bold :foreground ,magenta-active))) `(doom-modeline-evil-insert-state ((,class :inherit bold :foreground ,green-active))) `(doom-modeline-evil-motion-state ((,class :inherit bold :foreground ,fg-inactive))) `(doom-modeline-evil-normal-state ((,class :inherit bold :foreground ,fg-active))) `(doom-modeline-evil-operator-state ((,class :inherit bold :foreground ,blue-active))) `(doom-modeline-evil-replace-state ((,class :inherit bold :foreground ,red-active))) `(doom-modeline-evil-visual-state ((,class :inherit bold :foreground ,cyan-active))) `(doom-modeline-highlight ((,class :inherit bold :foreground ,blue-active))) `(doom-modeline-host ((,class :inherit italic))) `(doom-modeline-info ((,class :foreground ,green-active))) `(doom-modeline-lsp-error ((,class :inherit bold :foreground ,red-active))) `(doom-modeline-lsp-success ((,class :inherit bold :foreground ,green-active))) `(doom-modeline-lsp-warning ((,class :inherit bold :foreground ,yellow-active))) `(doom-modeline-panel ((,class :inherit modus-theme-active-blue))) `(doom-modeline-persp-buffer-not-in-persp ((,class :inherit italic :foreground ,yellow-active))) `(doom-modeline-persp-name ((,class :foreground ,fg-active))) `(doom-modeline-project-dir ((,class :inherit bold :foreground ,blue-active))) `(doom-modeline-project-parent-dir ((,class :foreground ,blue-active))) `(doom-modeline-project-root-dir ((,class :foreground ,fg-active))) `(doom-modeline-unread-number ((,class :inherit italic :foreground ,fg-active))) `(doom-modeline-urgent ((,class :inherit bold :foreground ,red-active))) `(doom-modeline-warning ((,class :inherit bold :foreground ,yellow-active))) ;;;;; dynamic-ruler `(dynamic-ruler-negative-face ((,class :inherit modus-theme-intense-neutral))) `(dynamic-ruler-positive-face ((,class :inherit modus-theme-intense-yellow))) ;;;;; easy-jekyll `(easy-jekyll-help-face ((,class :background ,bg-dim :foreground ,cyan-alt-other))) ;;;;; easy-kill `(easy-kill-origin ((,class :inherit modus-theme-subtle-red))) `(easy-kill-selection ((,class :inherit modus-theme-subtle-yellow))) ;;;;; ebdb `(ebdb-address-default ((,class :foreground ,fg-special-calm))) `(ebdb-defunct ((,class :inherit shadow))) `(ebdb-field-hidden ((,class :foreground ,magenta))) `(ebdb-label ((,class :foreground ,cyan-alt-other))) `(ebdb-mail-default ((,class :foreground ,fg-main))) `(ebdb-mail-primary ((,class :foreground ,magenta-alt))) `(ebdb-marked ((,class :background ,cyan-intense-bg))) `(ebdb-organization-name ((,class :foreground ,red-alt-other))) `(ebdb-person-name ((,class :foreground ,magenta-alt-other))) `(ebdb-phone-default ((,class :foreground ,cyan))) `(eieio-custom-slot-tag-face ((,class :foreground ,red-alt))) ;;;;; ediff ;; NOTE: here we break from the pattern of inheriting from the ;; modus-theme-diff-* faces. `(ediff-current-diff-A ((,class ,@(modus-themes--diff bg-dim red bg-diff-removed fg-diff-removed red-nuanced-bg red-faint)))) `(ediff-current-diff-Ancestor ((,class ,@(modus-themes--diff bg-dim fg-special-cold bg-special-cold fg-special-cold blue-nuanced-bg blue)))) `(ediff-current-diff-B ((,class ,@(modus-themes--diff bg-dim green bg-diff-added fg-diff-added green-nuanced-bg green-faint bg-diff-added-deuteran fg-diff-added-deuteran)))) `(ediff-current-diff-C ((,class ,@(modus-themes--diff bg-dim yellow bg-diff-changed fg-diff-changed yellow-nuanced-bg yellow-faint)))) `(ediff-even-diff-A ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1))) `(ediff-even-diff-Ancestor ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-1))) `(ediff-even-diff-B ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1))) `(ediff-even-diff-C ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2))) `(ediff-fine-diff-A ((,class :background ,bg-diff-focus-removed :foreground ,fg-diff-focus-removed))) `(ediff-fine-diff-Ancestor ((,class :inherit modus-theme-refine-cyan))) `(ediff-fine-diff-B ((,class :background ,@(modus-themes--diff-deuteran bg-diff-focus-added-deuteran bg-diff-focus-added) :foreground ,@(modus-themes--diff-deuteran fg-diff-focus-added-deuteran fg-diff-focus-added)))) `(ediff-fine-diff-C ((,class :background ,bg-diff-focus-changed :foreground ,fg-diff-focus-changed))) `(ediff-odd-diff-A ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2))) `(ediff-odd-diff-Ancestor ((,class :background ,bg-diff-neutral-0 :foreground ,fg-diff-neutral-0))) `(ediff-odd-diff-B ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2))) `(ediff-odd-diff-C ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1))) ;;;;; eglot `(eglot-mode-line ((,class :inherit modus-theme-bold :foreground ,magenta-active))) ;;;;; el-search `(el-search-highlight-in-prompt-face ((,class :inherit bold :foreground ,magenta-alt))) `(el-search-match ((,class :inherit modus-theme-intense-green))) `(el-search-other-match ((,class :inherit modus-theme-special-mild))) `(el-search-occur-match ((,class :inherit modus-theme-special-calm))) ;;;;; eldoc ;; NOTE: see https://github.com/purcell/package-lint/issues/187 (list 'eldoc-highlight-function-argument `((,class :inherit bold :foreground ,blue-alt-other))) ;;;;; eldoc-box `(eldoc-box-body ((,class :background ,bg-alt :foreground ,fg-main))) `(eldoc-box-border ((,class :background ,fg-alt))) ;;;;; elfeed `(elfeed-log-date-face ((,class :inherit elfeed-search-date-face))) `(elfeed-log-debug-level-face ((,class :inherit elfeed-search-filter-face))) `(elfeed-log-error-level-face ((,class :inherit error))) `(elfeed-log-info-level-face ((,class :inherit success))) `(elfeed-log-warn-level-face ((,class :inherit warning))) `(elfeed-search-date-face ((,class :foreground ,cyan))) `(elfeed-search-feed-face ((,class :foreground ,blue-faint))) `(elfeed-search-filter-face ((,class :inherit bold :foreground ,magenta-active))) `(elfeed-search-last-update-face ((,class :foreground ,cyan-active))) `(elfeed-search-tag-face ((,class :foreground ,cyan-alt-other))) `(elfeed-search-title-face ((,class :foreground ,fg-dim))) `(elfeed-search-unread-count-face ((,class :foreground ,green-active))) `(elfeed-search-unread-title-face ((,class :inherit bold :foreground ,fg-main))) ;;;;; elfeed-score `(elfeed-score-date-face ((,class :foreground ,blue))) `(elfeed-score-debug-level-face ((,class :foreground ,magenta-alt-other))) `(elfeed-score-error-level-face ((,class :foreground ,red))) `(elfeed-score-info-level-face ((,class :foreground ,cyan))) `(elfeed-score-warn-level-face ((,class :foreground ,yellow))) ;;;;; emms `(emms-playlist-track-face ((,class :foreground ,blue))) `(emms-playlist-selected-face ((,class :inherit bold :foreground ,magenta))) ;;;;; enhanced-ruby-mode `(enh-ruby-heredoc-delimiter-face ((,class :foreground ,blue-alt-other))) `(enh-ruby-op-face ((,class :foreground ,fg-main))) `(enh-ruby-regexp-delimiter-face ((,class :foreground ,green))) `(enh-ruby-regexp-face ((,class :foreground ,magenta))) `(enh-ruby-string-delimiter-face ((,class :foreground ,blue-alt))) `(erm-syn-errline ((,class :foreground ,red :underline t))) `(erm-syn-warnline ((,class :foreground ,yellow :underline t))) ;;;;; epa `(epa-field-body ((,class :foreground ,fg-main))) `(epa-field-name ((,class :inherit bold :foreground ,fg-dim))) `(epa-mark ((,class :inherit bold :foreground ,magenta))) `(epa-string ((,class :foreground ,blue-alt))) `(epa-validity-disabled ((,class :foreground ,red))) `(epa-validity-high ((,class :inherit bold :foreground ,cyan))) `(epa-validity-low ((,class :inherit shadow))) `(epa-validity-medium ((,class :foreground ,green-alt))) ;;;;; equake `(equake-buffer-face ((,class :background ,bg-main :foreground ,fg-main))) `(equake-shell-type-eshell ((,class :background ,bg-inactive :foreground ,green-active))) `(equake-shell-type-rash ((,class :background ,bg-inactive :foreground ,red-active))) `(equake-shell-type-shell ((,class :background ,bg-inactive :foreground ,cyan-active))) `(equake-shell-type-term ((,class :background ,bg-inactive :foreground ,yellow-active))) `(equake-shell-type-vterm ((,class :background ,bg-inactive :foreground ,magenta-active))) `(equake-tab-active ((,class :background ,fg-alt :foreground ,bg-alt))) `(equake-tab-inactive ((,class :foreground ,fg-inactive))) ;;;;; erc `(erc-action-face ((,class :inherit bold :foreground ,cyan))) `(erc-bold-face ((,class :inherit bold))) `(erc-button ((,class :inherit button))) `(erc-command-indicator-face ((,class :inherit bold :foreground ,cyan-alt))) `(erc-current-nick-face ((,class :foreground ,magenta-alt-other))) `(erc-dangerous-host-face ((,class :inherit modus-theme-intense-red))) `(erc-direct-msg-face ((,class :foreground ,magenta))) `(erc-error-face ((,class :inherit bold :foreground ,red))) `(erc-fool-face ((,class :foreground ,fg-inactive))) `(erc-header-line ((,class :background ,bg-header :foreground ,fg-header))) `(erc-input-face ((,class :foreground ,fg-special-calm))) `(erc-inverse-face ((,class :inherit erc-default-face :inverse-video t))) `(erc-keyword-face ((,class :inherit bold :foreground ,magenta-alt))) `(erc-my-nick-face ((,class :inherit bold :foreground ,magenta))) `(erc-my-nick-prefix-face ((,class :inherit erc-my-nick-face))) `(erc-nick-default-face ((,class :inherit bold :foreground ,blue))) `(erc-nick-msg-face ((,class :inherit bold :foreground ,green))) `(erc-nick-prefix-face ((,class :inherit erc-nick-default-face))) `(erc-notice-face ((,class :foreground ,fg-unfocused))) `(erc-pal-face ((,class :inherit bold :foreground ,red-alt))) `(erc-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other))) `(erc-timestamp-face ((,class :foreground ,blue-nuanced-fg))) `(erc-underline-face ((,class :underline t))) `(bg:erc-color-face0 ((,class :background "white"))) `(bg:erc-color-face1 ((,class :background "black"))) `(bg:erc-color-face10 ((,class :background ,cyan-subtle-bg))) `(bg:erc-color-face11 ((,class :background ,cyan-intense-bg))) `(bg:erc-color-face12 ((,class :background ,blue-subtle-bg))) `(bg:erc-color-face13 ((,class :background ,magenta-subtle-bg))) `(bg:erc-color-face14 ((,class :background "gray60"))) `(bg:erc-color-face15 ((,class :background "gray80"))) `(bg:erc-color-face2 ((,class :background ,blue-intense-bg))) `(bg:erc-color-face3 ((,class :background ,green-intense-bg))) `(bg:erc-color-face4 ((,class :background ,red-subtle-bg))) `(bg:erc-color-face5 ((,class :background ,red-intense-bg))) `(bg:erc-color-face6 ((,class :background ,magenta-refine-bg))) `(bg:erc-color-face7 ((,class :background ,yellow-subtle-bg))) `(bg:erc-color-face8 ((,class :background ,yellow-refine-bg))) `(bg:erc-color-face9 ((,class :background ,green-subtle-bg))) `(fg:erc-color-face0 ((,class :foreground "white"))) `(fg:erc-color-face1 ((,class :foreground "black"))) `(fg:erc-color-face10 ((,class :foreground ,cyan))) `(fg:erc-color-face11 ((,class :foreground ,cyan-alt-other))) `(fg:erc-color-face12 ((,class :foreground ,blue))) `(fg:erc-color-face13 ((,class :foreground ,magenta-alt))) `(fg:erc-color-face14 ((,class :foreground "gray60"))) `(fg:erc-color-face15 ((,class :foreground "gray80"))) `(fg:erc-color-face2 ((,class :foreground ,blue-alt-other))) `(fg:erc-color-face3 ((,class :foreground ,green))) `(fg:erc-color-face4 ((,class :foreground ,red))) `(fg:erc-color-face5 ((,class :foreground ,red-alt))) `(fg:erc-color-face6 ((,class :foreground ,magenta-alt-other))) `(fg:erc-color-face7 ((,class :foreground ,yellow-alt-other))) `(fg:erc-color-face8 ((,class :foreground ,yellow-alt))) `(fg:erc-color-face9 ((,class :foreground ,green-alt-other))) ;;;;; eros `(eros-result-overlay-face ((,class :box (:line-width -1 :color ,blue) :background ,bg-dim :foreground ,fg-dim))) ;;;;; ert `(ert-test-result-expected ((,class :inherit modus-theme-intense-green))) `(ert-test-result-unexpected ((,class :inherit modus-theme-intense-red))) ;;;;; eshell `(eshell-ls-archive ((,class :inherit bold :foreground ,cyan-alt))) `(eshell-ls-backup ((,class :foreground ,yellow-alt))) `(eshell-ls-clutter ((,class :foreground ,red-alt))) `(eshell-ls-directory ((,class :inherit bold :foreground ,blue-alt))) `(eshell-ls-executable ((,class :foreground ,magenta-alt))) `(eshell-ls-missing ((,class :inherit modus-theme-intense-red))) `(eshell-ls-product ((,class :foreground ,fg-special-warm))) `(eshell-ls-readonly ((,class :foreground ,fg-special-cold))) `(eshell-ls-special ((,class :inherit bold :foreground ,magenta))) `(eshell-ls-symlink ((,class :inherit button ,@(modus-themes--link-color cyan cyan-faint)))) `(eshell-ls-unreadable ((,class :background ,bg-inactive :foreground ,fg-inactive))) `(eshell-prompt ((,class :inherit modus-theme-bold ,@(modus-themes--prompt green-alt-other green-nuanced-bg green-alt green-refine-bg fg-main)))) ;;;;; eshell-fringe-status `(eshell-fringe-status-failure ((,class :foreground ,red))) `(eshell-fringe-status-success ((,class :foreground ,green))) ;;;;; eshell-git-prompt `(eshell-git-prompt-add-face ((,class :inherit shadow))) `(eshell-git-prompt-branch-face ((,class :inherit shadow))) `(eshell-git-prompt-directory-face ((,class :foreground ,cyan))) `(eshell-git-prompt-exit-fail-face ((,class :foreground ,red))) `(eshell-git-prompt-exit-success-face ((,class :foreground ,green))) `(eshell-git-prompt-modified-face ((,class :foreground ,yellow))) `(eshell-git-prompt-powerline-clean-face ((,class :background ,green-refine-bg))) `(eshell-git-prompt-powerline-dir-face ((,class :background ,blue-refine-bg))) `(eshell-git-prompt-powerline-not-clean-face ((,class :background ,magenta-refine-bg))) `(eshell-git-prompt-robyrussell-branch-face ((,class :foreground ,red))) `(eshell-git-prompt-robyrussell-git-dirty-face ((,class :foreground ,yellow))) `(eshell-git-prompt-robyrussell-git-face ((,class :foreground ,blue))) ;;;;; eshell-prompt-extras (epe) `(epe-dir-face ((,class :inherit modus-theme-bold :foreground ,blue))) `(epe-git-dir-face ((,class :foreground ,red-alt-other))) `(epe-git-face ((,class :foreground ,cyan-alt))) `(epe-pipeline-delimiter-face ((,class :foreground ,green-alt))) `(epe-pipeline-host-face ((,class :foreground ,blue))) `(epe-pipeline-time-face ((,class :foreground ,fg-special-warm))) `(epe-pipeline-user-face ((,class :foreground ,magenta))) `(epe-remote-face ((,class :inherit modus-theme-slant :foreground ,fg-alt))) `(epe-status-face ((,class :foreground ,magenta-alt-other))) `(epe-venv-face ((,class :inherit modus-theme-slant :foreground ,fg-alt))) ;;;;; eshell-syntax-highlighting `(eshell-syntax-highlighting-alias-face ((,class :foreground ,cyan))) `(eshell-syntax-highlighting-comment-face ((,class :inherit shadow))) `(eshell-syntax-highlighting-directory-face ((,class :foreground ,blue))) `(eshell-syntax-highlighting-envvar-face ((,class :foreground ,magenta-alt))) `(eshell-syntax-highlighting-invalid-face ((,class :foreground ,red))) `(eshell-syntax-highlighting-lisp-function-face ((,class :foreground ,magenta))) `(eshell-syntax-highlighting-shell-command-face ((,class :foreground ,cyan-alt-other))) `(eshell-syntax-highlighting-string-face ((,class :foreground ,blue-alt))) ;;;;; evil-mode `(evil-ex-commands ((,class :foreground ,magenta-alt-other))) `(evil-ex-info ((,class :foreground ,cyan-alt-other))) `(evil-ex-lazy-highlight ((,class :inherit modus-theme-refine-cyan))) `(evil-ex-search ((,class :inherit modus-theme-intense-green))) `(evil-ex-substitute-matches ((,class :inherit modus-theme-refine-yellow :underline t))) `(evil-ex-substitute-replacement ((,class :inherit (modus-theme-intense-green bold)))) ;;;;; evil-goggles `(evil-goggles-change-face ((,class :inherit modus-theme-refine-yellow))) `(evil-goggles-commentary-face ((,class :inherit (modus-theme-subtle-neutral modus-theme-slant)))) `(evil-goggles-default-face ((,class :inherit modus-theme-subtle-neutral))) `(evil-goggles-delete-face ((,class :inherit modus-theme-refine-red))) `(evil-goggles-fill-and-move-face ((,class :inherit evil-goggles-default-face))) `(evil-goggles-indent-face ((,class :inherit evil-goggles-default-face))) `(evil-goggles-join-face ((,class :inherit modus-theme-subtle-green))) `(evil-goggles-nerd-commenter-face ((,class :inherit evil-goggles-commentary-face))) `(evil-goggles-paste-face ((,class :inherit modus-theme-subtle-cyan))) `(evil-goggles-record-macro-face ((,class :inherit modus-theme-special-cold))) `(evil-goggles-replace-with-register-face ((,class :inherit modus-theme-refine-magenta))) `(evil-goggles-set-marker-face ((,class :inherit modus-theme-intense-magenta))) `(evil-goggles-shift-face ((,class :inherit evil-goggles-default-face))) `(evil-goggles-surround-face ((,class :inherit evil-goggles-default-face))) `(evil-goggles-yank-face ((,class :inherit modus-theme-subtle-blue))) ;;;;; evil-snipe `(evil-snipe-first-match-face ((,class :inherit (bold modus-theme-intense-blue)))) `(evil-snipe-matches-face ((,class :inherit modus-theme-refine-magenta))) ;;;;; evil-visual-mark-mode `(evil-visual-mark-face ((,class :inherit modus-theme-intense-magenta))) ;;;;; eww `(eww-invalid-certificate ((,class :foreground ,red-active))) `(eww-valid-certificate ((,class :foreground ,green-active))) `(eww-form-checkbox ((,class :box (:line-width 1 :color ,fg-inactive :style released-button) :background ,bg-inactive :foreground ,fg-main))) `(eww-form-file ((,class :box (:line-width 1 :color ,fg-inactive :style released-button) :background ,bg-active :foreground ,fg-main))) `(eww-form-select ((,class :inherit eww-form-checkbox))) `(eww-form-submit ((,class :inherit eww-form-file))) `(eww-form-text ((,class :box (:line-width 1 :color ,fg-inactive :style none) :background ,bg-active :foreground ,fg-active))) `(eww-form-textarea ((,class :background ,bg-alt :foreground ,fg-main))) ;;;;; eyebrowse `(eyebrowse-mode-line-active ((,class :inherit bold :foreground ,blue-active))) ;;;;; fancy-dabbrev `(fancy-dabbrev-menu-face ((,class :background ,bg-alt :foreground ,fg-alt))) `(fancy-dabbrev-preview-face ((,class :inherit shadow :underline t))) `(fancy-dabbrev-selection-face ((,class :inherit (modus-theme-intense-cyan bold)))) ;;;;; flycheck `(flycheck-error ((,class :inherit modus-theme-lang-error))) `(flycheck-error-list-checker-name ((,class :foreground ,magenta-active))) `(flycheck-error-list-column-number ((,class :foreground ,fg-special-cold))) `(flycheck-error-list-error ((,class :inherit modus-theme-bold :foreground ,red))) `(flycheck-error-list-filename ((,class :foreground ,blue))) `(flycheck-error-list-highlight ((,class :inherit modus-theme-hl-line))) `(flycheck-error-list-id ((,class :foreground ,magenta-alt-other))) `(flycheck-error-list-id-with-explainer ((,class :inherit flycheck-error-list-id :box t))) `(flycheck-error-list-info ((,class :foreground ,cyan))) `(flycheck-error-list-line-number ((,class :foreground ,fg-special-warm))) `(flycheck-error-list-warning ((,class :foreground ,yellow))) `(flycheck-fringe-error ((,class :inherit modus-theme-fringe-red))) `(flycheck-fringe-info ((,class :inherit modus-theme-fringe-cyan))) `(flycheck-fringe-warning ((,class :inherit modus-theme-fringe-yellow))) `(flycheck-info ((,class :inherit modus-theme-lang-note))) `(flycheck-verify-select-checker ((,class :box (:line-width 1 :color nil :style released-button)))) `(flycheck-warning ((,class :inherit modus-theme-lang-warning))) ;;;;; flycheck-color-mode-line `(flycheck-color-mode-line-error-face ((,class :inherit flycheck-fringe-error))) `(flycheck-color-mode-line-info-face ((,class :inherit flycheck-fringe-info))) `(flycheck-color-mode-line-running-face ((,class :inherit italic :foreground ,fg-inactive))) `(flycheck-color-mode-line-info-face ((,class :inherit flycheck-fringe-warning))) ;;;;; flycheck-indicator `(flycheck-indicator-disabled ((,class :inherit modus-theme-slant :foreground ,fg-inactive))) `(flycheck-indicator-error ((,class :inherit modus-theme-bold :foreground ,red-active))) `(flycheck-indicator-info ((,class :inherit modus-theme-bold :foreground ,blue-active))) `(flycheck-indicator-running ((,class :inherit modus-theme-bold :foreground ,magenta-active))) `(flycheck-indicator-success ((,class :inherit modus-theme-bold :foreground ,green-active))) `(flycheck-indicator-warning ((,class :inherit modus-theme-bold :foreground ,yellow-active))) ;;;;; flycheck-posframe `(flycheck-posframe-background-face ((,class :background ,bg-alt))) `(flycheck-posframe-border-face ((,class :inherit shadow))) `(flycheck-posframe-error-face ((,class :inherit bold :foreground ,red))) `(flycheck-posframe-face ((,class :inherit modus-theme-slant :foreground ,fg-main))) `(flycheck-posframe-info-face ((,class :inherit bold :foreground ,cyan))) `(flycheck-posframe-warning-face ((,class :inherit bold :foreground ,yellow))) ;;;;; flymake `(flymake-error ((,class :inherit modus-theme-lang-error))) `(flymake-note ((,class :inherit modus-theme-lang-note))) `(flymake-warning ((,class :inherit modus-theme-lang-warning))) ;;;;; flyspell `(flyspell-duplicate ((,class :inherit modus-theme-lang-warning))) `(flyspell-incorrect ((,class :inherit modus-theme-lang-error))) ;;;;; flyspell-correct `(flyspell-correct-highlight-face ((,class :inherit modus-theme-refine-green))) ;;;;; flx `(flx-highlight-face ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-intense-magenta 'modus-theme-nuanced-magenta magenta-alt 'bold)))) ;;;;; freeze-it `(freeze-it-show ((,class :background ,bg-dim :foreground ,fg-special-warm))) ;;;;; frog-menu `(frog-menu-action-keybinding-face ((,class :foreground ,blue-alt-other))) `(frog-menu-actions-face ((,class :foreground ,magenta))) `(frog-menu-border ((,class :background ,bg-active))) `(frog-menu-candidates-face ((,class :foreground ,fg-main))) `(frog-menu-posframe-background-face ((,class :background ,bg-dim))) `(frog-menu-prompt-face ((,class :foreground ,cyan))) ;;;;; focus `(focus-unfocused ((,class :foreground ,fg-unfocused))) ;;;;; fold-this `(fold-this-overlay ((,class :inherit modus-theme-special-mild))) ;;;;; font-lock `(font-lock-builtin-face ((,class :inherit modus-theme-bold ,@(modus-themes--syntax-extra magenta-alt magenta-alt-faint blue-alt)))) `(font-lock-comment-delimiter-face ((,class :inherit font-lock-comment-face))) `(font-lock-comment-face ((,class :inherit modus-theme-slant ,@(modus-themes--syntax-comment fg-alt fg-comment-yellow)))) `(font-lock-constant-face ((,class ,@(modus-themes--syntax-extra blue-alt-other blue-alt-other-faint magenta-alt-other)))) `(font-lock-doc-face ((,class :inherit modus-theme-slant ,@(modus-themes--syntax-docstring fg-docstring green-alt-other-faint green-alt-other-faint magenta-nuanced-fg)))) `(font-lock-function-name-face ((,class ,@(modus-themes--syntax-extra magenta magenta-faint magenta-alt)))) `(font-lock-keyword-face ((,class :inherit modus-theme-bold ,@(modus-themes--syntax-extra magenta-alt-other magenta-alt-other-faint cyan-alt-other)))) `(font-lock-negation-char-face ((,class :inherit modus-theme-bold ,@(modus-themes--syntax-foreground yellow yellow-faint)))) `(font-lock-preprocessor-face ((,class ,@(modus-themes--syntax-foreground red-alt-other red-alt-other-faint)))) `(font-lock-regexp-grouping-backslash ((,class :inherit bold ,@(modus-themes--syntax-string fg-escape-char-backslash yellow-alt-faint magenta-alt-other blue-alt)))) `(font-lock-regexp-grouping-construct ((,class :inherit bold ,@(modus-themes--syntax-string fg-escape-char-construct red-alt-other-faint red magenta-alt)))) `(font-lock-string-face ((,class ,@(modus-themes--syntax-string blue-alt blue-alt-faint green green-alt)))) `(font-lock-type-face ((,class :inherit modus-theme-bold ,@(modus-themes--syntax-extra cyan-alt-other cyan-alt-faint cyan-alt)))) `(font-lock-variable-name-face ((,class ,@(modus-themes--syntax-extra cyan cyan-faint blue-alt-faint)))) `(font-lock-warning-face ((,class :inherit modus-theme-bold ,@(modus-themes--syntax-foreground yellow-active yellow-alt-faint)))) ;;;;; forge `(forge-post-author ((,class :inherit bold :foreground ,fg-main))) `(forge-post-date ((,class :foreground ,fg-special-cold))) `(forge-topic-closed ((,class :inherit shadow))) `(forge-topic-merged ((,class :inherit shadow))) `(forge-topic-open ((,class :foreground ,fg-special-mild))) `(forge-topic-unmerged ((,class :inherit modus-theme-slant :foreground ,magenta))) `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main))) ;;;;; fountain-mode `(fountain-character ((,class :foreground ,blue-alt-other))) `(fountain-comment ((,class :inherit modus-theme-slant :foreground ,fg-alt))) `(fountain-dialog ((,class :foreground ,blue-alt))) `(fountain-metadata-key ((,class :foreground ,green-alt-other))) `(fountain-metadata-value ((,class :foreground ,blue))) `(fountain-non-printing ((,class :inherit shadow))) `(fountain-note ((,class :inherit modus-theme-slant :foreground ,yellow))) `(fountain-page-break ((,class :inherit bold :foreground ,red-alt))) `(fountain-page-number ((,class :inherit bold :foreground ,red-alt-other))) `(fountain-paren ((,class :foreground ,cyan))) `(fountain-scene-heading ((,class :inherit bold :foreground ,blue-nuanced-fg))) `(fountain-section-heading ((,class :inherit modus-theme-heading-1))) `(fountain-section-heading-1 ((,class :inherit modus-theme-heading-1))) `(fountain-section-heading-2 ((,class :inherit modus-theme-heading-2))) `(fountain-section-heading-3 ((,class :inherit modus-theme-heading-3))) `(fountain-section-heading-4 ((,class :inherit modus-theme-heading-4))) `(fountain-section-heading-5 ((,class :inherit modus-theme-heading-5))) `(fountain-synopsis ((,class :foreground ,cyan-alt))) `(fountain-trans ((,class :foreground ,yellow-alt-other))) ;;;;; geiser `(geiser-font-lock-autodoc-current-arg ((,class :inherit font-lock-function-name-face))) `(geiser-font-lock-autodoc-identifier ((,class :inherit font-lock-constant-face))) `(geiser-font-lock-doc-button ((,class :inherit button :foreground ,fg-docstring))) `(geiser-font-lock-doc-link ((,class :inherit button))) `(geiser-font-lock-error-link ((,class :inherit button :foreground ,red))) `(geiser-font-lock-image-button ((,class :inherit button :foreground ,green-alt))) `(geiser-font-lock-repl-input ((,class :inherit bold))) `(geiser-font-lock-repl-output ((,class :inherit font-lock-keyword-face))) `(geiser-font-lock-repl-prompt ((,class :inherit minibuffer-prompt))) `(geiser-font-lock-xref-header ((,class :inherit bold))) `(geiser-font-lock-xref-link ((,class :inherit button))) ;;;;; git-commit `(git-commit-comment-action ((,class :inherit font-lock-comment-face))) `(git-commit-comment-branch-local ((,class :inherit modus-theme-slant :foreground ,blue-alt))) `(git-commit-comment-branch-remote ((,class :inherit modus-theme-slant :foreground ,magenta-alt))) `(git-commit-comment-detached ((,class :inherit modus-theme-slant :foreground ,cyan-alt))) `(git-commit-comment-file ((,class :inherit modus-theme-slant ,@(modus-themes--syntax-comment fg-special-cold red-nuanced-fg)))) `(git-commit-comment-heading ((,class :inherit (bold modus-theme-slant) ,@(modus-themes--syntax-comment fg-dim fg-special-warm)))) `(git-commit-keyword ((,class :foreground ,magenta))) `(git-commit-known-pseudo-header ((,class :foreground ,cyan-alt-other))) `(git-commit-nonempty-second-line ((,class :inherit modus-theme-refine-yellow))) `(git-commit-overlong-summary ((,class :inherit modus-theme-refine-yellow))) `(git-commit-pseudo-header ((,class :foreground ,blue))) `(git-commit-summary ((,class :inherit bold :foreground ,cyan))) ;;;;; git-gutter `(git-gutter:added ((,class :inherit modus-theme-fringe-green))) `(git-gutter:deleted ((,class :inherit modus-theme-fringe-red))) `(git-gutter:modified ((,class :inherit modus-theme-fringe-yellow))) `(git-gutter:separator ((,class :inherit modus-theme-fringe-cyan))) `(git-gutter:unchanged ((,class :inherit modus-theme-fringe-magenta))) ;;;;; git-gutter-fr `(git-gutter-fr:added ((,class :inherit modus-theme-fringe-green))) `(git-gutter-fr:deleted ((,class :inherit modus-theme-fringe-red))) `(git-gutter-fr:modified ((,class :inherit modus-theme-fringe-yellow))) ;;;;; git-{gutter,fringe}+ `(git-gutter+-added ((,class :inherit modus-theme-fringe-green))) `(git-gutter+-deleted ((,class :inherit modus-theme-fringe-red))) `(git-gutter+-modified ((,class :inherit modus-theme-fringe-yellow))) `(git-gutter+-separator ((,class :inherit modus-theme-fringe-cyan))) `(git-gutter+-unchanged ((,class :inherit modus-theme-fringe-magenta))) `(git-gutter-fr+-added ((,class :inherit modus-theme-fringe-green))) `(git-gutter-fr+-deleted ((,class :inherit modus-theme-fringe-red))) `(git-gutter-fr+-modified ((,class :inherit modus-theme-fringe-yellow))) ;;;;; git-lens `(git-lens-added ((,class :inherit bold :foreground ,green))) `(git-lens-deleted ((,class :inherit bold :foreground ,red))) `(git-lens-header ((,class :inherit bold :height 1.1 :foreground ,cyan))) `(git-lens-modified ((,class :inherit bold :foreground ,yellow))) `(git-lens-renamed ((,class :inherit bold :foreground ,magenta))) ;;;;; git-rebase `(git-rebase-comment-hash ((,class :inherit modus-theme-slant ,@(modus-themes--syntax-comment fg-special-cold red-nuanced-fg)))) `(git-rebase-comment-heading ((,class :inherit (bold modus-theme-slant) ,@(modus-themes--syntax-comment fg-dim fg-special-warm)))) `(git-rebase-description ((,class :foreground ,fg-main))) `(git-rebase-hash ((,class :foreground ,cyan-alt-other))) ;;;;; git-timemachine `(git-timemachine-commit ((,class :inherit bold :foreground ,yellow-active))) `(git-timemachine-minibuffer-author-face ((,class :foreground ,fg-special-warm))) `(git-timemachine-minibuffer-detail-face ((,class :foreground ,red-alt))) ;;;;; git-walktree `(git-walktree-commit-face ((,class :foreground ,yellow))) `(git-walktree-symlink-face ((,class :inherit button))) `(git-walktree-tree-face ((,class :foreground ,magenta))) ;;;;; gnus `(gnus-button ((,class :inherit button))) `(gnus-cite-1 ((,class :foreground ,blue-faint))) `(gnus-cite-10 ((,class :foreground ,yellow-alt-other))) `(gnus-cite-11 ((,class :foreground ,magenta-alt))) `(gnus-cite-2 ((,class :foreground ,green-alt-other))) `(gnus-cite-3 ((,class :foreground ,red-alt-other))) `(gnus-cite-4 ((,class :foreground ,cyan))) `(gnus-cite-5 ((,class :foreground ,yellow-alt))) `(gnus-cite-6 ((,class :foreground ,magenta))) `(gnus-cite-7 ((,class :foreground ,green-alt))) `(gnus-cite-8 ((,class :foreground ,magenta-alt-other))) `(gnus-cite-9 ((,class :foreground ,cyan-alt))) `(gnus-cite-attribution ((,class :inherit italic :foreground ,fg-main))) `(gnus-emphasis-bold ((,class :inherit bold))) `(gnus-emphasis-bold-italic ((,class :inherit bold-italic))) `(gnus-emphasis-highlight-words ((,class :inherit modus-theme-refine-yellow))) `(gnus-emphasis-italic ((,class :inherit italic))) `(gnus-emphasis-underline-bold ((,class :inherit gnus-emphasis-bold :underline t))) `(gnus-emphasis-underline-bold-italic ((,class :inherit gnus-emphasis-bold-italic :underline t))) `(gnus-emphasis-underline-italic ((,class :inherit gnus-emphasis-italic :underline t))) `(gnus-group-mail-1 ((,class :inherit bold :foreground ,magenta-alt))) `(gnus-group-mail-1-empty ((,class :foreground ,magenta-alt))) `(gnus-group-mail-2 ((,class :inherit bold :foreground ,magenta))) `(gnus-group-mail-2-empty ((,class :foreground ,magenta))) `(gnus-group-mail-3 ((,class :inherit bold :foreground ,magenta-alt-other))) `(gnus-group-mail-3-empty ((,class :foreground ,magenta-alt-other))) `(gnus-group-mail-low ((,class :inherit bold :foreground ,magenta-nuanced-fg))) `(gnus-group-mail-low-empty ((,class :foreground ,magenta-nuanced-fg))) `(gnus-group-news-1 ((,class :inherit bold :foreground ,green))) `(gnus-group-news-1-empty ((,class :foreground ,green))) `(gnus-group-news-2 ((,class :inherit bold :foreground ,cyan))) `(gnus-group-news-2-empty ((,class :foreground ,cyan))) `(gnus-group-news-3 ((,class :inherit bold :foreground ,yellow-nuanced-fg))) `(gnus-group-news-3-empty ((,class :foreground ,yellow-nuanced-fg))) `(gnus-group-news-4 ((,class :inherit bold :foreground ,cyan-nuanced-fg))) `(gnus-group-news-4-empty ((,class :foreground ,cyan-nuanced-fg))) `(gnus-group-news-5 ((,class :inherit bold :foreground ,red-nuanced-fg))) `(gnus-group-news-5-empty ((,class :foreground ,red-nuanced-fg))) `(gnus-group-news-6 ((,class :inherit bold :foreground ,fg-alt))) `(gnus-group-news-6-empty ((,class :inherit shadow))) `(gnus-group-news-low ((,class :inherit bold :foreground ,green-nuanced-fg))) `(gnus-group-news-low-empty ((,class :foreground ,green-nuanced-fg))) `(gnus-header-content ((,class :inherit message-header-other))) `(gnus-header-from ((,class :inherit message-header-to :underline nil))) `(gnus-header-name ((,class :inherit message-header-name))) `(gnus-header-newsgroups ((,class :inherit message-header-newsgroups))) `(gnus-header-subject ((,class :inherit message-header-subject))) `(gnus-server-agent ((,class :inherit bold :foreground ,cyan))) `(gnus-server-closed ((,class :inherit bold :foreground ,magenta))) `(gnus-server-cloud ((,class :inherit bold :foreground ,cyan-alt))) `(gnus-server-cloud-host ((,class :inherit modus-theme-refine-cyan))) `(gnus-server-denied ((,class :inherit bold :foreground ,red))) `(gnus-server-offline ((,class :inherit bold :foreground ,yellow))) `(gnus-server-opened ((,class :inherit bold :foreground ,green))) `(gnus-signature ((,class :inherit italic :foreground ,fg-special-cold))) `(gnus-splash ((,class :inherit shadow))) `(gnus-summary-cancelled ((,class :inherit modus-theme-mark-alt))) `(gnus-summary-high-ancient ((,class :inherit bold :foreground ,fg-alt))) `(gnus-summary-high-read ((,class :inherit bold :foreground ,fg-special-cold))) `(gnus-summary-high-ticked ((,class :inherit bold :foreground ,red-alt-other))) `(gnus-summary-high-undownloaded ((,class :inherit bold :foreground ,yellow))) `(gnus-summary-high-unread ((,class :inherit bold :foreground ,fg-main))) `(gnus-summary-low-ancient ((,class :inherit italic :foreground ,fg-alt))) `(gnus-summary-low-read ((,class :inherit italic :foreground ,fg-alt))) `(gnus-summary-low-ticked ((,class :inherit italic :foreground ,red-refine-fg))) `(gnus-summary-low-undownloaded ((,class :inherit italic :foreground ,yellow-refine-fg))) `(gnus-summary-low-unread ((,class :inherit bold :foreground ,fg-special-cold))) `(gnus-summary-normal-ancient ((,class :foreground ,fg-special-calm))) `(gnus-summary-normal-read ((,class :inherit shadow))) `(gnus-summary-normal-ticked ((,class :foreground ,red-alt-other))) `(gnus-summary-normal-undownloaded ((,class :foreground ,yellow))) `(gnus-summary-normal-unread ((,class :foreground ,fg-main))) `(gnus-summary-selected ((,class :inherit modus-theme-subtle-blue))) ;;;;; golden-ratio-scroll-screen `(golden-ratio-scroll-highlight-line-face ((,class :background ,cyan-subtle-bg :foreground ,fg-main))) ;;;;; helm `(helm-M-x-key ((,class :inherit bold :foreground ,magenta-alt-other))) `(helm-action ((,class :underline t))) `(helm-bookmark-addressbook ((,class :foreground ,green-alt))) `(helm-bookmark-directory ((,class :inherit bold :foreground ,blue))) `(helm-bookmark-file ((,class :foreground ,fg-main))) `(helm-bookmark-file-not-found ((,class :background ,bg-alt :foreground ,fg-alt))) `(helm-bookmark-gnus ((,class :foreground ,magenta))) `(helm-bookmark-info ((,class :foreground ,cyan-alt))) `(helm-bookmark-man ((,class :foreground ,yellow-alt))) `(helm-bookmark-w3m ((,class :foreground ,blue-alt))) `(helm-buffer-archive ((,class :inherit bold :foreground ,cyan))) `(helm-buffer-directory ((,class :inherit bold :foreground ,blue))) `(helm-buffer-file ((,class :foreground ,fg-main))) `(helm-buffer-modified ((,class :foreground ,yellow-alt))) `(helm-buffer-not-saved ((,class :foreground ,red-alt))) `(helm-buffer-process ((,class :foreground ,magenta))) `(helm-buffer-saved-out ((,class :inherit bold :background ,bg-alt :foreground ,red))) `(helm-buffer-size ((,class :inherit shadow))) `(helm-candidate-number ((,class :foreground ,cyan-active))) `(helm-candidate-number-suspended ((,class :foreground ,yellow-active))) `(helm-comint-prompts-buffer-name ((,class :foreground ,green-active))) `(helm-comint-prompts-promptidx ((,class :foreground ,cyan-active))) `(helm-delete-async-message ((,class :inherit bold :foreground ,magenta-active))) `(helm-eob-line ((,class :background ,bg-main :foreground ,fg-main))) `(helm-eshell-prompts-buffer-name ((,class :foreground ,green-active))) `(helm-eshell-prompts-promptidx ((,class :foreground ,cyan-active))) `(helm-etags-file ((,class :foreground ,fg-dim :underline t))) `(helm-ff-backup-file ((,class :inherit shadow))) `(helm-ff-denied ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-red 'modus-theme-intense-red 'modus-theme-nuanced-red red)))) `(helm-ff-directory ((,class :inherit helm-buffer-directory))) `(helm-ff-dirs ((,class :inherit bold :foreground ,blue-alt-other))) `(helm-ff-dotted-directory ((,class :inherit bold :background ,bg-alt :foreground ,fg-alt))) `(helm-ff-dotted-symlink-directory ((,class :inherit (button helm-ff-dotted-directory)))) `(helm-ff-executable ((,class :foreground ,magenta-alt))) `(helm-ff-file ((,class :foreground ,fg-main))) `(helm-ff-file-extension ((,class :foreground ,fg-special-warm))) `(helm-ff-invalid-symlink ((,class :inherit button ,@(modus-themes--link-color red red-faint)))) `(helm-ff-pipe ((,class ,@(modus-themes--extra-completions 'modus-theme-refine-magenta 'modus-theme-subtle-magenta 'modus-theme-nuanced-magenta magenta)))) `(helm-ff-prefix ((,class ,@(modus-themes--extra-completions 'modus-theme-refine-yellow 'modus-theme-subtle-yellow 'modus-theme-nuanced-yellow yellow-alt-other)))) `(helm-ff-socket ((,class :foreground ,red-alt-other))) `(helm-ff-suid ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-red 'modus-theme-refine-red 'modus-theme-nuanced-yellow red-alt)))) `(helm-ff-symlink ((,class :inherit button ,@(modus-themes--link-color cyan cyan-faint)))) `(helm-ff-truename ((,class :foreground ,blue-alt-other))) `(helm-fd-finish ((,class :foreground ,green-active))) `(helm-grep-cmd-line ((,class :foreground ,yellow-alt-other))) `(helm-grep-file ((,class :inherit bold :foreground ,fg-special-cold))) `(helm-grep-finish ((,class :foreground ,green-active))) `(helm-grep-lineno ((,class :foreground ,fg-special-warm))) `(helm-grep-match ((,class :inherit modus-theme-special-calm))) `(helm-header ((,class :inherit bold :foreground ,fg-special-cold))) `(helm-header-line-left-margin ((,class :inherit bold :foreground ,yellow-intense))) `(helm-history-deleted ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-red 'modus-theme-intense-red 'modus-theme-nuanced-red red 'bold)))) `(helm-history-remote ((,class :foreground ,red-alt-other))) `(helm-lisp-completion-info ((,class :foreground ,fg-special-warm))) `(helm-lisp-show-completion ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-yellow 'modus-theme-refine-yellow 'modus-theme-nuanced-yellow yellow 'bold)))) `(helm-locate-finish ((,class :foreground ,green-active))) `(helm-match ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-cyan 'modus-theme-refine-cyan 'modus-theme-nuanced-cyan cyan 'bold)))) `(helm-match-item ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-neutral 'modus-theme-subtle-cyan 'modus-theme-nuanced-cyan cyan-alt-other)))) `(helm-minibuffer-prompt ((,class :inherit minibuffer-prompt))) `(helm-moccur-buffer ((,class :inherit button ,@(modus-themes--link-color cyan-alt-other cyan-alt-other-faint)))) `(helm-mode-prefix ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-intense-magenta 'modus-theme-nuanced-magenta magenta-alt 'bold)))) `(helm-non-file-buffer ((,class :inherit shadow))) `(helm-prefarg ((,class :foreground ,red-active))) `(helm-resume-need-update ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-refine-magenta 'modus-theme-nuanced-magenta magenta-alt-other)))) `(helm-selection ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-blue 'modus-theme-refine-blue 'modus-theme-special-cold nil 'bold)))) `(helm-selection-line ((,class :inherit modus-theme-special-cold))) `(helm-separator ((,class :foreground ,fg-special-mild))) `(helm-time-zone-current ((,class :foreground ,green))) `(helm-time-zone-home ((,class :foreground ,magenta))) `(helm-source-header ((,class :inherit bold :foreground ,red-alt ,@(modus-themes--scale modus-themes-scale-4)))) `(helm-top-columns ((,class :inherit helm-header))) `(helm-ucs-char ((,class :foreground ,yellow-alt-other))) `(helm-visible-mark ((,class :inherit modus-theme-subtle-cyan))) ;;;;; helm-ls-git `(helm-ls-git-added-copied-face ((,class :foreground ,green-intense))) `(helm-ls-git-added-modified-face ((,class :foreground ,yellow-intense))) `(helm-ls-git-conflict-face ((,class :inherit bold :foreground ,red-intense))) `(helm-ls-git-deleted-and-staged-face ((,class :foreground ,red-nuanced-fg))) `(helm-ls-git-deleted-not-staged-face ((,class :foreground ,red))) `(helm-ls-git-modified-and-staged-face ((,class :foreground ,yellow-nuanced-fg))) `(helm-ls-git-modified-not-staged-face ((,class :foreground ,yellow))) `(helm-ls-git-renamed-modified-face ((,class :foreground ,magenta))) `(helm-ls-git-untracked-face ((,class :foreground ,fg-special-cold))) ;;;;; helm-switch-shell `(helm-switch-shell-new-shell-face ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-refine-magenta 'modus-theme-nuanced-magenta magenta-alt-other 'bold)))) ;;;;; helm-xref `(helm-xref-file-name ((,class :inherit bold :foreground ,fg-special-cold))) `(helm-xref-file-name ((,class :foreground ,fg-special-warm))) ;;;;; helpful `(helpful-heading ((,class :inherit modus-theme-heading-1))) ;;;;; highlight region or ad-hoc regexp `(hi-aquamarine ((,class :background ,cyan-subtle-bg :foreground ,fg-main))) `(hi-black-b ((,class :inherit bold :background ,fg-main :foreground ,bg-main))) `(hi-black-hb ((,class :inherit bold :background ,fg-alt :foreground ,bg-main))) `(hi-blue ((,class :background ,blue-subtle-bg :foreground ,fg-main))) `(hi-blue-b ((,class :inherit (bold hi-blue)))) `(hi-green ((,class :background ,green-subtle-bg :foreground ,fg-main))) `(hi-green-b ((,class :inherit (bold hi-green)))) `(hi-pink ((,class :background ,magenta-subtle-bg :foreground ,fg-main))) `(hi-pink-b ((,class :inherit (bold hi-pink)))) `(hi-red-b ((,class :inherit bold :background ,red-intense-bg :foreground ,fg-main))) `(hi-salmon ((,class :background ,red-subtle-bg :foreground ,fg-main))) `(hi-yellow ((,class :background ,yellow-subtle-bg :foreground ,fg-main))) `(highlight ((,class :inherit modus-theme-subtle-blue))) `(highlight-changes ((,class :foreground ,yellow-alt-other))) `(highlight-changes-delete ((,class :foreground ,red-alt-other :underline t))) `(hl-line ((,class :inherit modus-theme-hl-line))) ;;;;; highlight-blocks `(highlight-blocks-depth-1-face ((,class :background ,bg-dim :foreground ,fg-main))) `(highlight-blocks-depth-2-face ((,class :background ,bg-alt :foreground ,fg-main))) `(highlight-blocks-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-main))) `(highlight-blocks-depth-4-face ((,class :background ,bg-special-calm :foreground ,fg-main))) `(highlight-blocks-depth-5-face ((,class :background ,bg-special-warm :foreground ,fg-main))) `(highlight-blocks-depth-6-face ((,class :background ,bg-special-mild :foreground ,fg-main))) `(highlight-blocks-depth-7-face ((,class :background ,bg-inactive :foreground ,fg-main))) `(highlight-blocks-depth-8-face ((,class :background ,bg-active :foreground ,fg-main))) `(highlight-blocks-depth-9-face ((,class :background ,cyan-subtle-bg :foreground ,fg-main))) ;;;;; highlight-defined `(highlight-defined-builtin-function-name-face ((,class :foreground ,magenta))) `(highlight-defined-face-name-face ((,class :foreground ,fg-main))) `(highlight-defined-function-name-face ((,class :foreground ,magenta))) `(highlight-defined-macro-name-face ((,class :foreground ,magenta-alt))) `(highlight-defined-special-form-name-face ((,class :foreground ,magenta-alt-other))) `(highlight-defined-variable-name-face ((,class :foreground ,cyan))) ;;;;; highlight-escape-sequences (`hes-mode') `(hes-escape-backslash-face ((,class :inherit bold :foreground ,fg-escape-char-construct))) `(hes-escape-sequence-face ((,class :inherit bold :foreground ,fg-escape-char-backslash))) ;;;;; highlight-indentation `(highlight-indentation-face ((,class :inherit modus-theme-hl-line))) `(highlight-indentation-current-column-face ((,class :background ,bg-active))) ;;;;; highlight-numbers `(highlight-numbers-number ((,class :foreground ,blue-alt-other))) ;;;;; highlight-symbol `(highlight-symbol-face ((,class :inherit modus-theme-special-mild))) ;;;;; highlight-thing `(highlight-thing ((,class :background ,bg-alt :foreground ,cyan))) ;;;;; hl-defined `(hdefd-functions ((,class :foreground ,blue))) `(hdefd-undefined ((,class :foreground ,red-alt))) `(hdefd-variables ((,class :foreground ,cyan-alt))) ;;;;; hl-fill-column `(hl-fill-column-face ((,class :background ,bg-active :foreground ,fg-active))) ;;;;; hl-todo `(hl-todo ((,class :inherit (bold modus-theme-slant) :foreground ,red-alt-other))) ;;;;; hydra `(hydra-face-amaranth ((,class :inherit bold :foreground ,yellow))) `(hydra-face-blue ((,class :inherit bold :foreground ,blue-alt))) `(hydra-face-pink ((,class :inherit bold :foreground ,magenta-alt))) `(hydra-face-red ((,class :inherit bold :foreground ,red))) `(hydra-face-teal ((,class :inherit bold :foreground ,cyan))) ;;;;; hyperlist `(hyperlist-condition ((,class :foreground ,green))) `(hyperlist-hashtag ((,class :foreground ,yellow))) `(hyperlist-operator ((,class :foreground ,blue-alt))) `(hyperlist-paren ((,class :foreground ,cyan-alt-other))) `(hyperlist-quote ((,class :foreground ,cyan-alt))) `(hyperlist-ref ((,class :foreground ,magenta-alt-other))) `(hyperlist-stars ((,class :inherit shadow))) `(hyperlist-tag ((,class :foreground ,red))) `(hyperlist-toplevel ((,class :inherit bold :foreground ,fg-main))) ;;;;; icomplete `(icomplete-first-match ((,class :inherit bold ,@(modus-themes--standard-completions magenta bg-alt bg-active fg-main)))) ;;;;; icomplete-vertical `(icomplete-vertical-separator ((,class :inherit shadow))) ;;;;; ido-mode `(ido-first-match ((,class :inherit bold ,@(modus-themes--standard-completions magenta bg-alt bg-active fg-main)))) `(ido-incomplete-regexp ((,class :inherit error))) `(ido-indicator ((,class :inherit modus-theme-subtle-yellow))) `(ido-only-match ((,class :inherit bold ,@(modus-themes--standard-completions green green-nuanced-bg green-intense-bg fg-main)))) `(ido-subdir ((,class :foreground ,blue))) `(ido-virtual ((,class :foreground ,fg-special-warm))) ;;;;; iedit `(iedit-occurrence ((,class :inherit modus-theme-refine-blue))) `(iedit-read-only-occurrence ((,class :inherit modus-theme-intense-yellow))) ;;;;; iflipb `(iflipb-current-buffer-face ((,class :inherit bold :foreground ,cyan-alt))) `(iflipb-other-buffer-face ((,class :inherit shadow))) ;;;;; imenu-list `(imenu-list-entry-face-0 ((,class :foreground ,cyan))) `(imenu-list-entry-face-1 ((,class :foreground ,blue))) `(imenu-list-entry-face-2 ((,class :foreground ,cyan-alt-other))) `(imenu-list-entry-face-3 ((,class :foreground ,blue-alt))) `(imenu-list-entry-subalist-face-0 ((,class :inherit bold :foreground ,magenta-alt-other :underline t))) `(imenu-list-entry-subalist-face-1 ((,class :inherit bold :foreground ,magenta :underline t))) `(imenu-list-entry-subalist-face-2 ((,class :inherit bold :foreground ,green-alt-other :underline t))) `(imenu-list-entry-subalist-face-3 ((,class :inherit bold :foreground ,red-alt-other :underline t))) ;;;;; indium `(indium-breakpoint-face ((,class :foreground ,red-active))) `(indium-frame-url-face ((,class :inherit button :foreground ,fg-alt))) `(indium-keyword-face ((,class :foreground ,magenta-alt-other))) `(indium-litable-face ((,class :inherit modus-theme-slant :foreground ,fg-special-warm))) `(indium-repl-error-face ((,class :inherit bold :foreground ,red))) `(indium-repl-prompt-face ((,class :foreground ,cyan-alt-other))) `(indium-repl-stdout-face ((,class :foreground ,fg-main))) ;;;;; info `(Info-quoted ((,class ,@(modus-themes--mixed-fonts) ; the capitalization is canonical :background ,bg-alt :foreground ,fg-special-calm))) `(info-header-node ((,class :inherit bold :foreground ,fg-alt))) `(info-header-xref ((,class :foreground ,blue-active))) `(info-index-match ((,class :inherit match))) `(info-menu-header ((,class :inherit modus-theme-heading-3))) `(info-menu-star ((,class :foreground ,red))) `(info-node ((,class :inherit bold))) `(info-title-1 ((,class :inherit modus-theme-heading-1))) `(info-title-2 ((,class :inherit modus-theme-heading-2))) `(info-title-3 ((,class :inherit modus-theme-heading-3))) `(info-title-4 ((,class :inherit modus-theme-heading-4))) ;;;;; info-colors `(info-colors-lisp-code-block ((,class :inherit fixed-pitch))) `(info-colors-ref-item-command ((,class :foreground ,magenta))) `(info-colors-ref-item-constant ((,class :inherit font-lock-constant-face))) `(info-colors-ref-item-function ((,class :inherit font-lock-function-name-face))) `(info-colors-ref-item-macro ((,class :inherit font-lock-keyword-face))) `(info-colors-ref-item-other ((,class :inherit font-lock-doc-face))) `(info-colors-ref-item-special-form ((,class :inherit font-lock-keyword-face))) `(info-colors-ref-item-syntax-class ((,class :inherit font-lock-builtin-face))) `(info-colors-ref-item-type ((,class :inherit font-lock-type-face))) `(info-colors-ref-item-user-option ((,class :inherit font-lock-variable-name-face))) `(info-colors-ref-item-variable ((,class :inherit font-lock-variable-name-face))) ;;;;; interaction-log `(ilog-buffer-face ((,class :foreground ,magenta-alt-other))) `(ilog-change-face ((,class :foreground ,magenta-alt))) `(ilog-echo-face ((,class :foreground ,yellow-alt-other))) `(ilog-load-face ((,class :foreground ,green))) `(ilog-message-face ((,class :inherit shadow))) `(ilog-non-change-face ((,class :foreground ,blue))) ;;;;; ioccur `(ioccur-cursor ((,class :foreground ,fg-main))) `(ioccur-invalid-regexp ((,class :foreground ,red))) `(ioccur-match-face ((,class :inherit modus-theme-special-calm))) `(ioccur-match-overlay-face ((,class :inherit modus-theme-special-cold :extend t))) `(ioccur-num-line-face ((,class :foreground ,fg-special-warm))) `(ioccur-overlay-face ((,class :inherit modus-theme-refine-blue :extend t))) `(ioccur-regexp-face ((,class :inherit (modus-theme-intense-magenta bold)))) `(ioccur-title-face ((,class :inherit bold :foreground ,red-alt ,@(modus-themes--scale modus-themes-scale-4)))) ;;;;; isearch, occur, and the like `(isearch ((,class :inherit (modus-theme-intense-green bold)))) `(isearch-fail ((,class :inherit modus-theme-refine-red))) `(isearch-group-1 ((,class :inherit modus-theme-intense-blue))) `(isearch-group-2 ((,class :inherit modus-theme-intense-magenta))) `(lazy-highlight ((,class :inherit modus-theme-refine-cyan))) `(match ((,class :inherit modus-theme-special-calm))) `(query-replace ((,class :inherit (modus-theme-intense-yellow bold)))) ;;;;; isl (isearch-light) `(isl-line ((,class :inherit modus-theme-subtle-green))) `(isl-match ((,class :inherit modus-theme-refine-cyan))) `(isl-number ((,class :inherit modus-theme-bold :foreground ,green-active))) `(isl-on ((,class :inherit (bold modus-theme-intense-green)))) `(isl-string ((,class :inherit modus-theme-bold :foreground ,cyan-active))) ;;;;; ivy `(ivy-action ((,class :inherit bold :foreground ,red-alt))) `(ivy-completions-annotations ((,class :inherit completions-annotations))) `(ivy-confirm-face ((,class :foreground ,cyan))) `(ivy-current-match ((,class ,@(modus-themes--extra-completions 'modus-theme-refine-cyan 'modus-theme-intense-cyan 'modus-theme-special-cold nil 'bold)))) `(ivy-cursor ((,class :background ,fg-main :foreground ,bg-main))) `(ivy-grep-info ((,class :foreground ,cyan-alt))) `(ivy-grep-line-number ((,class :foreground ,fg-special-warm))) `(ivy-highlight-face ((,class :foreground ,magenta))) `(ivy-match-required-face ((,class :inherit error))) `(ivy-minibuffer-match-face-1 ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-neutral 'modus-theme-intense-neutral 'modus-theme-nuanced-cyan fg-alt)))) `(ivy-minibuffer-match-face-2 ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-green 'modus-theme-refine-green 'modus-theme-nuanced-green green-alt-other 'bold)))) `(ivy-minibuffer-match-face-3 ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-blue 'modus-theme-refine-blue 'modus-theme-nuanced-blue blue-alt-other 'bold)))) `(ivy-minibuffer-match-face-4 ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-refine-magenta 'modus-theme-nuanced-magenta magenta-alt-other 'bold)))) `(ivy-minibuffer-match-highlight ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-cyan 'modus-theme-intense-cyan 'modus-theme-nuanced-cyan cyan-alt-other 'bold)))) `(ivy-modified-buffer ((,class :inherit modus-theme-slant :foreground ,yellow))) `(ivy-modified-outside-buffer ((,class :inherit modus-theme-slant :foreground ,yellow-alt))) `(ivy-org ((,class :foreground ,cyan-alt-other))) `(ivy-prompt-match ((,class :inherit ivy-current-match))) `(ivy-remote ((,class :foreground ,magenta))) `(ivy-separator ((,class :inherit shadow))) `(ivy-subdir ((,class :foreground ,blue-alt-other))) `(ivy-virtual ((,class :foreground ,magenta-alt-other))) `(ivy-yanked-word ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-blue 'modus-theme-refine-blue 'modus-theme-nuanced-blue blue-alt)))) ;;;;; ivy-posframe `(ivy-posframe ((,class :background ,bg-dim :foreground ,fg-main))) `(ivy-posframe-border ((,class :background ,fg-window-divider-inner))) `(ivy-posframe-cursor ((,class :background ,fg-main :foreground ,bg-main))) ;;;;; jira (org-jira) `(jiralib-comment-face ((,class :background ,bg-alt))) `(jiralib-comment-header-face ((,class :inherit bold))) `(jiralib-issue-info-face ((,class :inherit modus-theme-special-warm))) `(jiralib-issue-info-header-face ((,class :inherit (modus-theme-special-warm bold)))) `(jiralib-issue-summary-face ((,class :inherit bold))) `(jiralib-link-filter-face ((,class :underline t))) `(jiralib-link-issue-face ((,class :underline t))) `(jiralib-link-project-face ((,class :underline t))) ;;;;; journalctl-mode `(journalctl-error-face ((,class :inherit bold :foreground ,red))) `(journalctl-finished-face ((,class :inherit bold :foreground ,green))) `(journalctl-host-face ((,class :foreground ,blue))) `(journalctl-process-face ((,class :foreground ,cyan-alt-other))) `(journalctl-starting-face ((,class :foreground ,green))) `(journalctl-timestamp-face ((,class :foreground ,fg-special-cold))) `(journalctl-warning-face ((,class :inherit bold :foreground ,yellow))) ;;;;; js2-mode `(js2-error ((,class :foreground ,red))) `(js2-external-variable ((,class :foreground ,cyan-alt-other))) `(js2-function-call ((,class :foreground ,magenta))) `(js2-function-param ((,class :foreground ,blue))) `(js2-instance-member ((,class :foreground ,magenta-alt-other))) `(js2-jsdoc-html-tag-delimiter ((,class :foreground ,fg-main))) `(js2-jsdoc-html-tag-name ((,class :foreground ,cyan))) `(js2-jsdoc-tag ((,class :foreground ,fg-special-calm))) `(js2-jsdoc-type ((,class :foreground ,fg-special-cold))) `(js2-jsdoc-value ((,class :foreground ,fg-special-warm))) `(js2-object-property ((,class :foreground ,fg-main))) `(js2-object-property-access ((,class :foreground ,fg-main))) `(js2-private-function-call ((,class :foreground ,green-alt-other))) `(js2-private-member ((,class :foreground ,fg-special-mild))) `(js2-warning ((,class :foreground ,yellow-alt :underline t))) ;;;;; julia `(julia-macro-face ((,class :inherit modus-theme-bold :foreground ,magenta))) `(julia-quoted-symbol-face ((,class :foreground ,blue-alt-other))) ;;;;; jupyter `(jupyter-eval-overlay ((,class :inherit bold :foreground ,blue))) `(jupyter-repl-input-prompt ((,class :foreground ,cyan-alt-other))) `(jupyter-repl-output-prompt ((,class :foreground ,magenta-alt-other))) `(jupyter-repl-traceback ((,class :inherit modus-theme-intense-red))) ;;;;; kaocha-runner `(kaocha-runner-error-face ((,class :foreground ,red))) `(kaocha-runner-success-face ((,class :foreground ,green))) `(kaocha-runner-warning-face ((,class :foreground ,yellow))) ;;;;; keycast `(keycast-command ((,class :inherit bold :foreground ,blue-active))) `(keycast-key ((,class ,@(modus-themes--mode-line-attrs bg-main blue-active bg-main blue-active blue-active blue-intense 'alt-style -3)))) ;;;;; line numbers (display-line-numbers-mode and global variant) `(line-number ((,class :inherit default ,@(modus-themes--line-numbers fg-alt bg-dim fg-unfocused)))) `(line-number-current-line ((,class :inherit (bold default) ,@(modus-themes--line-numbers fg-main bg-active blue-alt-other)))) `(line-number-major-tick ((,class :inherit (bold default) ,@(modus-themes--line-numbers yellow-nuanced-fg yellow-nuanced-bg red-alt)))) `(line-number-minor-tick ((,class :inherit (bold default) ,@(modus-themes--line-numbers fg-alt bg-inactive fg-inactive)))) ;;;;; lsp-mode `(lsp-face-highlight-read ((,class :inherit modus-theme-subtle-blue :underline t))) `(lsp-face-highlight-textual ((,class :inherit modus-theme-subtle-blue))) `(lsp-face-highlight-write ((,class :inherit (modus-theme-refine-blue bold)))) `(lsp-face-semhl-constant ((,class :foreground ,blue-alt-other))) `(lsp-face-semhl-deprecated ((,(append '((supports :underline (:style wave))) class) :foreground ,yellow :underline (:style wave)) (,class :foreground ,yellow :underline t))) `(lsp-face-semhl-enummember ((,class :foreground ,blue-alt-other))) `(lsp-face-semhl-field ((,class :foreground ,cyan-alt))) `(lsp-face-semhl-field-static ((,class :inherit modus-theme-slant :foreground ,cyan-alt))) `(lsp-face-semhl-function ((,class :foreground ,magenta))) `(lsp-face-semhl-method ((,class :foreground ,magenta))) `(lsp-face-semhl-namespace ((,class :inherit modus-theme-bold :foreground ,magenta-alt))) `(lsp-face-semhl-preprocessor ((,class :foreground ,red-alt-other))) `(lsp-face-semhl-static-method ((,class :inherit modus-theme-slant :foreground ,magenta))) `(lsp-face-semhl-type-class ((,class :foreground ,magenta-alt))) `(lsp-face-semhl-type-enum ((,class :foreground ,magenta-alt))) `(lsp-face-semhl-type-primitive ((,class :inherit modus-theme-slant :foreground ,magenta-alt))) `(lsp-face-semhl-type-template ((,class :inherit modus-theme-slant :foreground ,magenta-alt))) `(lsp-face-semhl-type-typedef ((,class :inherit modus-theme-slant :foreground ,magenta-alt))) `(lsp-face-semhl-variable ((,class :foreground ,cyan))) `(lsp-face-semhl-variable-local ((,class :foreground ,cyan))) `(lsp-face-semhl-variable-parameter ((,class :foreground ,cyan-alt-other))) `(lsp-lens-face ((,class :height 0.8 :foreground ,fg-alt))) `(lsp-lens-mouse-face ((,class :height 0.8 :foreground ,blue-alt-other :underline t))) `(lsp-ui-doc-background ((,class :background ,bg-alt))) `(lsp-ui-doc-header ((,class :background ,bg-header :foreground ,fg-header))) `(lsp-ui-doc-url ((,class :inherit button))) `(lsp-ui-peek-filename ((,class :foreground ,fg-special-warm))) `(lsp-ui-peek-footer ((,class :background ,bg-header :foreground ,fg-header))) `(lsp-ui-peek-header ((,class :background ,bg-header :foreground ,fg-header))) `(lsp-ui-peek-highlight ((,class :inherit modus-theme-subtle-blue))) `(lsp-ui-peek-line-number ((,class :inherit shadow))) `(lsp-ui-peek-list ((,class :background ,bg-dim))) `(lsp-ui-peek-peek ((,class :background ,bg-alt))) `(lsp-ui-peek-selection ((,class :inherit modus-theme-subtle-cyan))) `(lsp-ui-sideline-code-action ((,class :foreground ,yellow))) `(lsp-ui-sideline-current-symbol ((,class :inherit bold :height 0.99 :box (:line-width -1 :style nil) :foreground ,fg-main))) `(lsp-ui-sideline-symbol ((,class :inherit bold :height 0.99 :box (:line-width -1 :style nil) :foreground ,fg-alt))) `(lsp-ui-sideline-symbol-info ((,class :inherit italic :height 0.99))) ;;;;; macrostep `(macrostep-compiler-macro-face ((,class :inherit italic))) `(macrostep-expansion-highlight-face ((,class :background ,blue-nuanced-bg))) `(macrostep-gensym-1 ((,class :inherit bold :foreground ,blue :box t))) `(macrostep-gensym-2 ((,class :inherit bold :foreground ,green :box t))) `(macrostep-gensym-3 ((,class :inherit bold :foreground ,yellow :box t))) `(macrostep-gensym-4 ((,class :inherit bold :foreground ,red :box t))) `(macrostep-gensym-5 ((,class :inherit bold :foreground ,magenta :box t))) `(macrostep-macro-face ((,class :inherit button :foreground ,green-alt))) ;;;;; magit `(magit-bisect-bad ((,class :foreground ,red-alt-other))) `(magit-bisect-good ((,class :foreground ,green-alt-other))) `(magit-bisect-skip ((,class :foreground ,yellow-alt-other))) `(magit-blame-date ((,class :foreground ,blue))) `(magit-blame-dimmed ((,class :inherit shadow))) `(magit-blame-hash ((,class :foreground ,fg-special-warm))) `(magit-blame-heading ((,class :background ,bg-alt))) `(magit-blame-highlight ((,class :inherit modus-theme-nuanced-cyan))) `(magit-blame-margin ((,class :inherit magit-blame-highlight))) `(magit-blame-name ((,class :foreground ,magenta-alt-other))) `(magit-blame-summary ((,class :foreground ,cyan-alt-other))) `(magit-branch-current ((,class :foreground ,blue-alt-other :box t))) `(magit-branch-local ((,class :foreground ,blue-alt))) `(magit-branch-remote ((,class :foreground ,magenta-alt))) `(magit-branch-remote-head ((,class :foreground ,magenta-alt-other :box t))) `(magit-branch-upstream ((,class :inherit italic))) `(magit-cherry-equivalent ((,class :background ,bg-main :foreground ,magenta-intense))) `(magit-cherry-unmatched ((,class :background ,bg-main :foreground ,cyan-intense))) ;; NOTE: here we break from the pattern of inheriting from the ;; modus-theme-diff-* faces, though only for the standard actions, ;; not the highlighted ones. This is because Magit's interaction ;; model relies on highlighting the current diff hunk. `(magit-diff-added ((,class ,@(modus-themes--diff bg-main green bg-diff-added fg-diff-added green-nuanced-bg fg-diff-added bg-diff-added-deuteran fg-diff-added-deuteran)))) `(magit-diff-added-highlight ((,class :inherit modus-theme-diff-focus-added))) `(magit-diff-base ((,class ,@(modus-themes--diff bg-main yellow bg-diff-changed fg-diff-changed yellow-nuanced-bg fg-diff-changed)))) `(magit-diff-base-highlight ((,class :inherit modus-theme-diff-focus-changed))) `(magit-diff-context ((,class :foreground ,fg-unfocused))) `(magit-diff-context-highlight ((,class ,@(modus-themes--diff bg-dim fg-dim bg-inactive fg-inactive bg-dim fg-alt)))) `(magit-diff-file-heading ((,class :inherit bold :foreground ,fg-special-cold))) `(magit-diff-file-heading-highlight ((,class :inherit (modus-theme-special-cold bold)))) `(magit-diff-file-heading-selection ((,class :inherit modus-theme-refine-cyan))) ;; NOTE: here we break from the pattern of inheriting from the ;; modus-theme-diff-* faces. `(magit-diff-hunk-heading ((,class :inherit bold :background ,bg-active :foreground ,fg-inactive))) `(magit-diff-hunk-heading-highlight ((,class :inherit bold :background ,@(modus-themes--diff-deuteran bg-region bg-diff-heading) :foreground ,@(modus-themes--diff-deuteran fg-main fg-diff-heading)))) `(magit-diff-hunk-heading-selection ((,class :inherit modus-theme-refine-blue))) `(magit-diff-hunk-region ((,class :inherit bold))) `(magit-diff-lines-boundary ((,class :background ,fg-main))) `(magit-diff-lines-heading ((,class :inherit modus-theme-refine-magenta))) `(magit-diff-removed ((,class ,@(modus-themes--diff bg-main red bg-diff-removed fg-diff-removed red-nuanced-bg fg-diff-removed)))) `(magit-diff-removed-highlight ((,class :inherit modus-theme-diff-focus-removed))) `(magit-diffstat-added ((,class :foreground ,@(modus-themes--diff-deuteran blue green)))) `(magit-diffstat-removed ((,class :foreground ,red))) `(magit-dimmed ((,class :foreground ,fg-unfocused))) `(magit-filename ((,class :foreground ,fg-special-cold))) `(magit-hash ((,class :inherit shadow))) `(magit-head ((,class :inherit magit-branch-local))) `(magit-header-line ((,class :inherit bold :foreground ,magenta-active))) `(magit-header-line-key ((,class :inherit bold :foreground ,blue-active))) `(magit-header-line-log-select ((,class :inherit bold :foreground ,fg-main))) `(magit-keyword ((,class :foreground ,magenta))) `(magit-keyword-squash ((,class :inherit bold :foreground ,yellow-alt-other))) `(magit-log-author ((,class :foreground ,cyan))) `(magit-log-date ((,class :inherit shadow))) `(magit-log-graph ((,class :foreground ,fg-dim))) `(magit-mode-line-process ((,class :inherit bold :foreground ,blue-active))) `(magit-mode-line-process-error ((,class :inherit bold :foreground ,red-active))) `(magit-process-ng ((,class :inherit error))) `(magit-process-ok ((,class :inherit success))) `(magit-reflog-amend ((,class :background ,bg-main :foreground ,magenta-intense))) `(magit-reflog-checkout ((,class :background ,bg-main :foreground ,blue-intense))) `(magit-reflog-cherry-pick ((,class :background ,bg-main :foreground ,green-intense))) `(magit-reflog-commit ((,class :background ,bg-main :foreground ,green-intense))) `(magit-reflog-merge ((,class :background ,bg-main :foreground ,green-intense))) `(magit-reflog-other ((,class :background ,bg-main :foreground ,cyan-intense))) `(magit-reflog-rebase ((,class :background ,bg-main :foreground ,magenta-intense))) `(magit-reflog-remote ((,class :background ,bg-main :foreground ,cyan-intense))) `(magit-reflog-reset ((,class :background ,bg-main :foreground ,red-intense))) `(magit-refname ((,class :inherit shadow))) `(magit-refname-pullreq ((,class :inherit shadow))) `(magit-refname-stash ((,class :inherit shadow))) `(magit-refname-wip ((,class :inherit shadow))) `(magit-section ((,class :background ,bg-dim :foreground ,fg-main))) `(magit-section-heading ((,class :inherit bold :foreground ,cyan))) `(magit-section-heading-selection ((,class :inherit (modus-theme-refine-cyan bold)))) `(magit-section-highlight ((,class :background ,bg-alt))) `(magit-sequence-done ((,class :foreground ,green-alt))) `(magit-sequence-drop ((,class :foreground ,red-alt))) `(magit-sequence-exec ((,class :foreground ,magenta-alt))) `(magit-sequence-head ((,class :foreground ,cyan-alt))) `(magit-sequence-onto ((,class :inherit shadow))) `(magit-sequence-part ((,class :foreground ,yellow-alt))) `(magit-sequence-pick ((,class :foreground ,blue-alt))) `(magit-sequence-stop ((,class :foreground ,red))) `(magit-signature-bad ((,class :inherit bold :foreground ,red))) `(magit-signature-error ((,class :foreground ,red-alt))) `(magit-signature-expired ((,class :foreground ,yellow))) `(magit-signature-expired-key ((,class :foreground ,yellow))) `(magit-signature-good ((,class :foreground ,green))) `(magit-signature-revoked ((,class :foreground ,magenta))) `(magit-signature-untrusted ((,class :foreground ,cyan))) `(magit-tag ((,class :foreground ,yellow-alt-other))) ;;;;; magit-imerge `(magit-imerge-overriding-value ((,class :inherit bold :foreground ,red-alt))) ;;;;; make-mode (makefiles) `(makefile-makepp-perl ((,class :background ,cyan-nuanced-bg))) `(makefile-space ((,class :background ,magenta-nuanced-bg))) ;;;;; man `(Man-overstrike ((,class :inherit bold :foreground ,magenta))) `(Man-reverse ((,class :inherit modus-theme-subtle-magenta))) `(Man-underline ((,class :foreground ,cyan :underline t))) ;;;;; marginalia `(marginalia-archive ((,class :foreground ,green-nuanced-fg))) `(marginalia-date ((,class :foreground ,blue-nuanced-fg))) `(marginalia-char ((,class :foreground ,red-active))) `(marginalia-documentation ((,class :foreground ,fg-special-cold :inherit modus-theme-slant))) `(marginalia-file-modes ((,class :inherit shadow))) `(marginalia-file-name ((,class :foreground ,fg-special-mild))) `(marginalia-file-owner ((,class :foreground ,red-nuanced-fg))) `(marginalia-key ((,class :foreground ,magenta-active))) `(marginalia-mode ((,class :foreground ,cyan-active))) `(marginalia-modified ((,class :foreground ,yellow-active))) `(marginalia-number ((,class :foreground ,blue-active))) `(marginalia-size ((,class :foreground ,green-active))) `(marginalia-type ((,class :foreground ,fg-special-warm))) `(marginalia-variable ((,class :foreground ,yellow-nuanced-fg))) `(marginalia-version ((,class :foreground ,cyan-active))) ;;;;; markdown-mode `(markdown-blockquote-face ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(markdown-bold-face ((,class :inherit bold))) `(markdown-code-face ((,class ,@(modus-themes--mixed-fonts) :background ,bg-dim :extend t))) `(markdown-comment-face ((,class :inherit font-lock-comment-face))) `(markdown-footnote-marker-face ((,class :inherit bold :foreground ,cyan-alt))) `(markdown-footnote-text-face ((,class :inherit modus-theme-slant :foreground ,fg-main))) `(markdown-gfm-checkbox-face ((,class :foreground ,cyan-alt-other))) `(markdown-header-delimiter-face ((,class :inherit modus-theme-bold :foreground ,fg-dim))) `(markdown-header-face ((t nil))) `(markdown-header-face-1 ((,class :inherit modus-theme-heading-1))) `(markdown-header-face-2 ((,class :inherit modus-theme-heading-2))) `(markdown-header-face-3 ((,class :inherit modus-theme-heading-3))) `(markdown-header-face-4 ((,class :inherit modus-theme-heading-4))) `(markdown-header-face-5 ((,class :inherit modus-theme-heading-5))) `(markdown-header-face-6 ((,class :inherit modus-theme-heading-6))) `(markdown-header-rule-face ((,class :inherit bold :foreground ,fg-special-warm))) `(markdown-hr-face ((,class :inherit bold :foreground ,fg-special-warm))) `(markdown-html-attr-name-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,cyan))) `(markdown-html-attr-value-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,blue))) `(markdown-html-entity-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,cyan))) `(markdown-html-tag-delimiter-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-special-mild))) `(markdown-html-tag-name-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,magenta-alt))) `(markdown-inline-code-face ((,class ,@(modus-themes--mixed-fonts) :background ,bg-alt :foreground ,fg-special-calm))) `(markdown-italic-face ((,class :inherit italic :foreground ,fg-special-cold))) `(markdown-language-info-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-special-cold))) `(markdown-language-keyword-face ((,class ,@(modus-themes--mixed-fonts) :background ,bg-alt :foreground ,fg-alt))) `(markdown-line-break-face ((,class :inherit modus-theme-refine-cyan :underline t))) `(markdown-link-face ((,class :inherit button))) `(markdown-link-title-face ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(markdown-list-face ((,class :foreground ,fg-dim))) `(markdown-markup-face ((,class :inherit shadow))) `(markdown-math-face ((,class :foreground ,magenta-alt-other))) `(markdown-metadata-key-face ((,class :foreground ,cyan-alt-other))) `(markdown-metadata-value-face ((,class :foreground ,blue-alt))) `(markdown-missing-link-face ((,class :inherit bold :foreground ,yellow))) `(markdown-plain-url-face ((,class :inherit markdown-link-face))) `(markdown-pre-face ((,class :inherit markdown-code-face :foreground ,fg-special-mild))) `(markdown-reference-face ((,class :inherit markdown-markup-face))) `(markdown-strike-through-face ((,class :strike-through t))) `(markdown-table-face ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-special-cold))) `(markdown-url-face ((,class :foreground ,blue-alt))) ;;;;; markup-faces (`adoc-mode') `(markup-anchor-face ((,class :foreground ,fg-inactive))) `(markup-attribute-face ((,class :inherit italic :foreground ,fg-inactive))) `(markup-big-face ((,class :height 1.3 :foreground ,blue-nuanced-fg))) `(markup-bold-face ((,class :inherit bold :foreground ,red-nuanced-fg))) `(markup-code-face ((,class :inherit fixed-pitch :foreground ,magenta))) `(markup-command-face ((,class :foreground ,fg-inactive))) `(markup-comment-face ((,class :inherit font-lock-comment-face))) `(markup-complex-replacement-face ((,class :box (:line-width 2 :color nil :style released-button) :inherit modus-theme-refine-magenta))) `(markup-emphasis-face ((,class :inherit italic :foreground ,fg-special-cold))) `(markup-error-face ((,class :inherit bold :foreground ,red))) `(markup-gen-face ((,class :foreground ,magenta-alt))) `(markup-internal-reference-face ((,class :inherit button :foreground ,fg-alt))) `(markup-italic-face ((,class :inherit italic :foreground ,fg-special-cold))) `(markup-list-face ((,class :inherit modus-theme-special-calm))) `(markup-meta-face ((,class :foreground ,fg-inactive))) `(markup-meta-hide-face ((,class :inherit shadow))) `(markup-passthrough-face ((,class :inherit fixed-pitch :foreground ,cyan))) `(markup-preprocessor-face ((,class :foreground ,red-alt-other))) `(markup-replacement-face ((,class :foreground ,yellow-alt-other))) `(markup-secondary-text-face ((,class :height 0.8 :foreground ,magenta-nuanced-fg))) `(markup-small-face ((,class :height 0.8 :foreground ,fg-main))) `(markup-strong-face ((,class :inherit bold :foreground ,red-nuanced-fg))) `(markup-subscript-face ((,class :height 0.8 :foreground ,fg-special-cold))) `(markup-superscript-face ((,class :height 0.8 :foreground ,fg-special-cold))) `(markup-table-cell-face ((,class :inherit modus-theme-special-cold))) `(markup-table-face ((,class :inherit modus-theme-subtle-cyan))) `(markup-table-row-face ((,class :inherit modus-theme-subtle-cyan))) `(markup-title-0-face ((,class :height 3.0 :foreground ,blue-nuanced-fg))) `(markup-title-1-face ((,class :height 2.4 :foreground ,blue-nuanced-fg))) `(markup-title-2-face ((,class :height 1.8 :foreground ,blue-nuanced-fg))) `(markup-title-3-face ((,class :height 1.4 :foreground ,blue-nuanced-fg))) `(markup-title-4-face ((,class :height 1.2 :foreground ,blue-nuanced-fg))) `(markup-title-5-face ((,class :height 1.2 :foreground ,blue-nuanced-fg :underline t))) `(markup-value-face ((,class :foreground ,fg-inactive))) `(markup-verbatim-face ((,class :inherit modus-theme-special-mild))) ;;;;; mentor `(mentor-download-message ((,class :foreground ,fg-special-warm))) `(mentor-download-name ((,class :foreground ,fg-special-cold))) `(mentor-download-progress ((,class :foreground ,blue-alt-other))) `(mentor-download-size ((,class :foreground ,magenta-alt-other))) `(mentor-download-speed-down ((,class :foreground ,cyan-alt))) `(mentor-download-speed-up ((,class :foreground ,red-alt))) `(mentor-download-state ((,class :foreground ,yellow-alt))) `(mentor-highlight-face ((,class :inherit modus-theme-subtle-blue))) `(mentor-tracker-name ((,class :foreground ,magenta-alt))) ;;;;; messages `(message-cited-text-1 ((,class :foreground ,blue-faint))) `(message-cited-text-2 ((,class :foreground ,green-alt-other))) `(message-cited-text-3 ((,class :foreground ,red-alt-other))) `(message-cited-text-4 ((,class :foreground ,cyan))) `(message-header-cc ((,class :foreground ,blue-alt-other))) `(message-header-name ((,class :inherit bold :foreground ,cyan))) `(message-header-newsgroups ((,class :inherit message-header-other))) `(message-header-other ((,class :foreground ,fg-special-calm))) `(message-header-subject ((,class :inherit bold :foreground ,magenta-alt))) `(message-header-to ((,class :inherit bold :foreground ,magenta-alt-other))) `(message-header-xheader ((,class :foreground ,blue-alt))) `(message-mml ((,class :foreground ,yellow))) `(message-separator ((,class :inherit modus-theme-intense-neutral))) ;;;;; minibuffer-line `(minibuffer-line ((,class :foreground ,fg-main))) ;;;;; minimap `(minimap-active-region-background ((,class :background ,bg-active))) `(minimap-current-line-face ((,class :background ,cyan-intense-bg :foreground ,fg-main))) ;;;;; mmm-mode `(mmm-cleanup-submode-face ((,class :background ,yellow-nuanced-bg))) `(mmm-code-submode-face ((,class :background ,bg-alt))) `(mmm-comment-submode-face ((,class :background ,blue-nuanced-bg))) `(mmm-declaration-submode-face ((,class :background ,cyan-nuanced-bg))) `(mmm-default-submode-face ((,class :background ,bg-dim))) `(mmm-init-submode-face ((,class :background ,magenta-nuanced-bg))) `(mmm-output-submode-face ((,class :background ,red-nuanced-bg))) `(mmm-special-submode-face ((,class :background ,green-nuanced-bg))) ;;;;; modeline `(mode-line ((,class ,@(modus-themes--variable-pitch-ui) ,@(modus-themes--mode-line-attrs fg-active bg-active fg-dim bg-active fg-alt bg-active 'alt-style nil bg-main)))) `(mode-line-buffer-id ((,class :inherit bold))) `(mode-line-emphasis ((,class :inherit bold :foreground ,blue-active))) `(mode-line-highlight ((,class :inherit modus-theme-active-blue :box (:line-width -1 :style pressed-button)))) `(mode-line-inactive ((,class ,@(modus-themes--variable-pitch-ui) ,@(modus-themes--mode-line-attrs fg-inactive bg-inactive fg-alt bg-dim bg-region bg-active)))) ;;;;; mood-line `(mood-line-modified ((,class :foreground ,magenta-active))) `(mood-line-status-error ((,class :inherit bold :foreground ,red-active))) `(mood-line-status-info ((,class :foreground ,cyan-active))) `(mood-line-status-neutral ((,class :foreground ,blue-active))) `(mood-line-status-success ((,class :foreground ,green-active))) `(mood-line-status-warning ((,class :inherit bold :foreground ,yellow-active))) `(mood-line-unimportant ((,class :foreground ,fg-inactive))) ;;;;; mpdel `(mpdel-browser-directory-face ((,class :foreground ,blue))) `(mpdel-playlist-current-song-face ((,class :inherit bold :foreground ,blue-alt-other))) ;;;;; mu4e `(mu4e-attach-number-face ((,class :inherit bold :foreground ,fg-dim))) `(mu4e-cited-1-face ((,class :foreground ,blue-faint))) `(mu4e-cited-2-face ((,class :foreground ,green-alt-other))) `(mu4e-cited-3-face ((,class :foreground ,red-alt-other))) `(mu4e-cited-4-face ((,class :foreground ,cyan))) `(mu4e-cited-5-face ((,class :foreground ,yellow-alt))) `(mu4e-cited-6-face ((,class :foreground ,magenta))) `(mu4e-cited-7-face ((,class :foreground ,green-alt))) `(mu4e-compose-header-face ((,class :inherit mu4e-compose-separator-face))) `(mu4e-compose-separator-face ((,class :inherit modus-theme-intense-neutral))) `(mu4e-contact-face ((,class :inherit message-header-to))) `(mu4e-context-face ((,class :foreground ,blue-active))) `(mu4e-draft-face ((,class :foreground ,magenta-alt))) `(mu4e-flagged-face ((,class :foreground ,red-alt))) `(mu4e-footer-face ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(mu4e-forwarded-face ((,class :foreground ,magenta-alt-other))) `(mu4e-header-face ((,class :inherit shadow))) `(mu4e-header-highlight-face ((,class :inherit modus-theme-hl-line))) `(mu4e-header-key-face ((,class :inherit message-header-name))) `(mu4e-header-marks-face ((,class :inherit mu4e-special-header-value-face))) `(mu4e-header-title-face ((,class :foreground ,fg-special-mild))) `(mu4e-header-value-face ((,class :inherit message-header-other))) `(mu4e-highlight-face ((,class :inherit bold :foreground ,blue-alt-other))) `(mu4e-link-face ((,class :inherit button))) `(mu4e-modeline-face ((,class :foreground ,magenta-active))) `(mu4e-moved-face ((,class :inherit modus-theme-slant :foreground ,yellow))) `(mu4e-ok-face ((,class :inherit bold :foreground ,green))) `(mu4e-region-code ((,class :inherit modus-theme-special-calm))) `(mu4e-replied-face ((,class :foreground ,blue))) `(mu4e-special-header-value-face ((,class :inherit message-header-subject))) `(mu4e-system-face ((,class :inherit modus-theme-slant :foreground ,fg-mark-del))) `(mu4e-title-face ((,class :foreground ,fg-main))) `(mu4e-trashed-face ((,class :foreground ,red))) `(mu4e-unread-face ((,class :inherit bold))) `(mu4e-url-number-face ((,class :foreground ,fg-alt))) `(mu4e-view-body-face ((,class :foreground ,fg-main))) `(mu4e-warning-face ((,class :inherit warning))) ;;;;; mu4e-conversation `(mu4e-conversation-header ((,class :inherit modus-theme-special-cold))) `(mu4e-conversation-sender-1 ((,class :foreground ,fg-special-warm))) `(mu4e-conversation-sender-2 ((,class :foreground ,fg-special-cold))) `(mu4e-conversation-sender-3 ((,class :foreground ,fg-special-mild))) `(mu4e-conversation-sender-4 ((,class :inherit shadow))) `(mu4e-conversation-sender-5 ((,class :foreground ,yellow-refine-fg))) `(mu4e-conversation-sender-6 ((,class :foreground ,cyan-refine-fg))) `(mu4e-conversation-sender-7 ((,class :foreground ,green-refine-fg))) `(mu4e-conversation-sender-8 ((,class :foreground ,blue-refine-fg))) `(mu4e-conversation-sender-me ((,class :foreground ,fg-main))) `(mu4e-conversation-unread ((,class :inherit bold))) ;;;;; multiple-cursors `(mc/cursor-bar-face ((,class :height 1 :background ,fg-main))) `(mc/cursor-face ((,class :inverse-video t))) `(mc/region-face ((,class :inherit region))) ;;;;; neotree `(neo-banner-face ((,class :foreground ,magenta))) `(neo-button-face ((,class :inherit button))) `(neo-dir-link-face ((,class :inherit bold :foreground ,blue))) `(neo-expand-btn-face ((,class :foreground ,cyan))) `(neo-file-link-face ((,class :foreground ,fg-main))) `(neo-header-face ((,class :inherit bold :foreground ,fg-main))) `(neo-root-dir-face ((,class :inherit bold :foreground ,cyan-alt))) `(neo-vc-added-face ((,class :foreground ,green))) `(neo-vc-conflict-face ((,class :inherit bold :foreground ,red))) `(neo-vc-default-face ((,class :foreground ,fg-main))) `(neo-vc-edited-face ((,class :foreground ,yellow))) `(neo-vc-ignored-face ((,class :foreground ,fg-inactive))) `(neo-vc-missing-face ((,class :foreground ,red-alt))) `(neo-vc-needs-merge-face ((,class :foreground ,magenta-alt))) `(neo-vc-needs-update-face ((,class :underline t))) `(neo-vc-removed-face ((,class :strike-through t))) `(neo-vc-unlocked-changes-face ((,class :inherit modus-theme-refine-blue))) `(neo-vc-up-to-date-face ((,class :inherit shadow))) `(neo-vc-user-face ((,class :foreground ,magenta))) ;;;;; no-emoji `(no-emoji ((,class :foreground ,cyan))) ;;;;; notmuch `(notmuch-crypto-decryption ((,class :inherit modus-theme-refine-magenta))) `(notmuch-crypto-part-header ((,class :foreground ,magenta-alt-other))) `(notmuch-crypto-signature-bad ((,class :inherit modus-theme-intense-red))) `(notmuch-crypto-signature-good ((,class :inherit modus-theme-refine-green))) `(notmuch-crypto-signature-good-key ((,class :inherit modus-theme-refine-yellow))) `(notmuch-crypto-signature-unknown ((,class :inherit modus-theme-refine-red))) `(notmuch-hello-logo-background ((,class :background "gray50"))) `(notmuch-message-summary-face ((,class :inherit modus-theme-nuanced-cyan))) `(notmuch-search-count ((,class :inherit shadow))) `(notmuch-search-date ((,class :foreground ,cyan))) `(notmuch-search-flagged-face ((,class :foreground ,red-alt))) `(notmuch-search-matching-authors ((,class :foreground ,fg-main))) `(notmuch-search-non-matching-authors ((,class :inherit shadow))) `(notmuch-search-subject ((,class :foreground ,fg-dim))) `(notmuch-search-unread-face ((,class :inherit bold))) `(notmuch-tag-added ((,(append '((supports :underline (:style wave))) class) :underline (:color ,green :style wave)) (,class :foreground ,green :underline t))) `(notmuch-tag-deleted ((,(append '((supports :underline (:style wave))) class) :underline (:color ,red :style wave)) (,class :foreground ,red :underline t))) `(notmuch-tag-face ((,class :inherit bold :foreground ,blue-alt))) `(notmuch-tag-flagged ((,class :foreground ,red-alt))) `(notmuch-tag-unread ((,class :foreground ,magenta-alt))) `(notmuch-tree-match-author-face ((,class :foreground ,fg-special-cold))) `(notmuch-tree-match-date-face ((,class :inherit notmuch-search-date))) `(notmuch-tree-match-face ((,class :foreground ,fg-main))) `(notmuch-tree-match-tag-face ((,class :inherit bold :foreground ,blue-alt))) `(notmuch-tree-no-match-face ((,class :inherit shadow))) `(notmuch-tree-no-match-date-face ((,class :inherit shadow))) `(notmuch-wash-cited-text ((,class :foreground ,cyan))) `(notmuch-wash-toggle-button ((,class :background ,bg-alt :foreground ,fg-alt))) ;;;;; num3-mode `(num3-face-even ((,class :inherit bold :background ,bg-alt))) ;;;;; nxml-mode `(nxml-attribute-colon ((,class :foreground ,fg-main))) `(nxml-attribute-local-name ((,class :inherit font-lock-variable-name-face))) `(nxml-attribute-prefix ((,class :inherit font-lock-type-face))) `(nxml-attribute-value ((,class :inherit font-lock-constant-face))) `(nxml-cdata-section-CDATA ((,class :inherit error))) `(nxml-cdata-section-delimiter ((,class :inherit error))) `(nxml-char-ref-delimiter ((,class :foreground ,fg-special-mild))) `(nxml-char-ref-number ((,class :inherit modus-theme-bold :foreground ,fg-special-mild))) `(nxml-delimited-data ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(nxml-delimiter ((,class :foreground ,fg-dim))) `(nxml-element-colon ((,class :foreground ,fg-main))) `(nxml-element-local-name ((,class :inherit font-lock-function-name-face))) `(nxml-element-prefix ((,class :inherit font-lock-builtin-face))) `(nxml-entity-ref-delimiter ((,class :foreground ,fg-special-mild))) `(nxml-entity-ref-name ((,class :inherit modus-theme-bold :foreground ,fg-special-mild))) `(nxml-glyph ((,class :inherit modus-theme-intense-neutral))) `(nxml-hash ((,class :inherit (bold font-lock-string-face)))) `(nxml-heading ((,class :inherit bold))) `(nxml-name ((,class :inherit font-lock-builtin-face))) `(nxml-namespace-attribute-colon ((,class :foreground ,fg-main))) `(nxml-namespace-attribute-prefix ((,class :inherit font-lock-variable-name-face))) `(nxml-processing-instruction-target ((,class :inherit font-lock-keyword-face))) `(nxml-prolog-keyword ((,class :inherit font-lock-keyword-face))) `(nxml-ref ((,class :inherit modus-theme-bold :foreground ,fg-special-mild))) `(rng-error ((,class :inherit error))) ;;;;; objed `(objed-hl ((,class :background ,(if modus-themes-intense-hl-line bg-hl-alt-intense bg-hl-alt)))) `(objed-mark ((,class :background ,bg-active))) `(objed-mode-line ((,class :foreground ,cyan-active))) ;;;;; orderless `(orderless-match-face-0 ((,class :inherit bold ,@(modus-themes--standard-completions blue-alt-other blue-nuanced-bg blue-refine-bg blue-refine-fg)))) `(orderless-match-face-1 ((,class :inherit bold ,@(modus-themes--standard-completions magenta-alt magenta-nuanced-bg magenta-refine-bg magenta-refine-fg)))) `(orderless-match-face-2 ((,class :inherit bold ,@(modus-themes--standard-completions green green-nuanced-bg green-refine-bg green-refine-fg)))) `(orderless-match-face-3 ((,class :inherit bold ,@(modus-themes--standard-completions yellow yellow-nuanced-bg yellow-refine-bg yellow-refine-fg)))) ;;;;; org `(org-agenda-calendar-event ((,class :foreground ,fg-main))) `(org-agenda-calendar-sexp ((,class :foreground ,cyan-alt))) `(org-agenda-clocking ((,class :inherit modus-theme-special-cold :extend t))) `(org-agenda-column-dateline ((,class :background ,bg-alt))) `(org-agenda-current-time ((,class :inherit bold :foreground ,blue-alt-other))) `(org-agenda-date ((,class :foreground ,cyan))) `(org-agenda-date-today ((,class :inherit bold :foreground ,fg-main :underline t))) `(org-agenda-date-weekend ((,class :foreground ,cyan-alt-other))) `(org-agenda-diary ((,class :foreground ,fg-main))) `(org-agenda-dimmed-todo-face ((,class :inherit bold :foreground ,fg-alt))) `(org-agenda-done ((,class :foreground ,green-alt))) `(org-agenda-filter-category ((,class :inherit bold :foreground ,magenta-active))) `(org-agenda-filter-effort ((,class :inherit bold :foreground ,magenta-active))) `(org-agenda-filter-regexp ((,class :inherit bold :foreground ,magenta-active))) `(org-agenda-filter-tags ((,class :inherit bold :foreground ,magenta-active))) `(org-agenda-restriction-lock ((,class :background ,bg-dim :foreground ,fg-dim))) `(org-agenda-structure ((,class ,@(modus-themes--scale modus-themes-scale-5) :foreground ,blue-alt))) `(org-archived ((,class :background ,bg-alt :foreground ,fg-alt))) `(org-block ((,class ,@(modus-themes--mixed-fonts) ,@(modus-themes--org-block bg-dim) :foreground ,fg-main))) `(org-block-begin-line ((,class ,@(modus-themes--mixed-fonts) ,@(modus-themes--org-block-delim bg-dim fg-special-cold bg-alt fg-special-mild)))) `(org-block-end-line ((,class :inherit org-block-begin-line))) `(org-checkbox ((,class :box (:line-width 1 :color ,bg-active) :background ,bg-inactive :foreground ,fg-active))) `(org-checkbox-statistics-done ((,class :inherit org-done))) `(org-checkbox-statistics-todo ((,class :inherit org-todo))) `(org-clock-overlay ((,class :inherit modus-theme-special-cold))) `(org-code ((,class ,@(modus-themes--mixed-fonts) :background ,red-nuanced-bg :foreground ,magenta))) `(org-column ((,class :background ,bg-alt))) `(org-column-title ((,class :inherit bold :underline t :background ,bg-alt))) `(org-date ((,class :inherit ,(if modus-themes-no-mixed-fonts 'button '(button fixed-pitch)) ,@(modus-themes--link-color cyan cyan-faint)))) `(org-date-selected ((,class :inherit bold :foreground ,blue-alt :inverse-video t))) `(org-dispatcher-highlight ((,class :inherit (bold modus-theme-mark-alt)))) `(org-document-info ((,class :foreground ,fg-special-cold))) `(org-document-info-keyword ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-alt))) `(org-document-title ((,class :inherit (bold modus-theme-variable-pitch) :foreground ,fg-special-cold ,@(modus-themes--scale modus-themes-scale-5)))) `(org-done ((,class :foreground ,green))) `(org-drawer ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-alt))) `(org-ellipsis (())) ; inherits from the heading's color `(org-footnote ((,class :inherit button ,@(modus-themes--link-color blue-alt blue-alt-faint)))) `(org-formula ((,class ,@(modus-themes--mixed-fonts) :foreground ,red-alt))) `(org-habit-alert-face ((,class ,@(modus-themes--org-habit yellow-graph-0-bg yellow-graph-0-bg yellow-graph-1-bg)))) `(org-habit-alert-future-face ((,class ,@(modus-themes--org-habit yellow-graph-1-bg yellow-graph-0-bg yellow-graph-1-bg)))) `(org-habit-clear-face ((,class ,@(modus-themes--org-habit blue-graph-0-bg green-graph-1-bg blue-graph-1-bg)))) `(org-habit-clear-future-face ((,class ,@(modus-themes--org-habit blue-graph-1-bg green-graph-1-bg blue-graph-1-bg)))) `(org-habit-overdue-face ((,class ,@(modus-themes--org-habit red-graph-0-bg red-graph-0-bg red-graph-1-bg)))) `(org-habit-overdue-future-face ((,class ,@(modus-themes--org-habit red-graph-1-bg red-graph-0-bg red-graph-1-bg)))) `(org-habit-ready-face ((,class ,@(modus-themes--org-habit green-graph-0-bg green-graph-0-bg green-graph-1-bg)))) `(org-habit-ready-future-face ((,class ,@(modus-themes--org-habit green-graph-1-bg green-graph-0-bg green-graph-1-bg)))) `(org-headline-done ((,class :inherit modus-theme-variable-pitch :foreground ,green-nuanced-fg))) `(org-headline-todo ((,class :inherit modus-theme-variable-pitch :foreground ,red-nuanced-fg))) `(org-hide ((,class :foreground ,bg-main))) `(org-indent ((,class :inherit (fixed-pitch org-hide)))) `(org-latex-and-related ((,class :foreground ,magenta-refine-fg))) `(org-level-1 ((,class :inherit modus-theme-heading-1))) `(org-level-2 ((,class :inherit modus-theme-heading-2))) `(org-level-3 ((,class :inherit modus-theme-heading-3))) `(org-level-4 ((,class :inherit modus-theme-heading-4))) `(org-level-5 ((,class :inherit modus-theme-heading-5))) `(org-level-6 ((,class :inherit modus-theme-heading-6))) `(org-level-7 ((,class :inherit modus-theme-heading-7))) `(org-level-8 ((,class :inherit modus-theme-heading-8))) `(org-link ((,class :inherit button))) `(org-list-dt ((,class :inherit bold))) `(org-macro ((,class ,@(modus-themes--mixed-fonts) :background ,blue-nuanced-bg :foreground ,magenta-alt-other))) `(org-meta-line ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-alt))) `(org-mode-line-clock ((,class :foreground ,fg-main))) `(org-mode-line-clock-overrun ((,class :inherit modus-theme-active-red))) `(org-priority ((,class :foreground ,magenta))) `(org-property-value ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-special-cold))) `(org-quote ((,class :inherit modus-theme-slant ,@(modus-themes--org-block bg-dim) :foreground ,fg-special-cold))) `(org-scheduled ((,class :foreground ,magenta-alt))) `(org-scheduled-previously ((,class :foreground ,yellow-alt-other))) `(org-scheduled-today ((,class :foreground ,magenta-alt-other))) `(org-sexp-date ((,class :inherit org-date))) `(org-special-keyword ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-alt))) `(org-table ((,class ,@(modus-themes--mixed-fonts) :foreground ,fg-special-cold))) `(org-table-header ((,class :inherit (fixed-pitch modus-theme-intense-neutral)))) `(org-tag ((,class :foreground ,magenta-nuanced-fg))) `(org-tag-group ((,class :inherit bold :foreground ,cyan-nuanced-fg))) `(org-target ((,class :underline t))) `(org-time-grid ((,class :foreground ,fg-unfocused))) `(org-todo ((,class :foreground ,red))) `(org-upcoming-deadline ((,class :foreground ,red-alt-other))) `(org-upcoming-distant-deadline ((,class :foreground ,red-nuanced-fg))) `(org-verbatim ((,class ,@(modus-themes--mixed-fonts) :background ,bg-alt :foreground ,fg-special-calm))) `(org-verse ((,class :inherit org-quote))) `(org-warning ((,class :inherit bold :foreground ,red-alt-other))) ;;;;; org-journal `(org-journal-calendar-entry-face ((,class :inherit modus-theme-slant :foreground ,yellow-alt-other))) `(org-journal-calendar-scheduled-face ((,class :inherit modus-theme-slant :foreground ,red-alt-other))) `(org-journal-highlight ((,class :foreground ,magenta-alt))) ;;;;; org-noter `(org-noter-no-notes-exist-face ((,class :inherit bold :foreground ,red-active))) `(org-noter-notes-exist-face ((,class :inherit bold :foreground ,green-active))) ;;;;; org-pomodoro `(org-pomodoro-mode-line ((,class :foreground ,red-active))) `(org-pomodoro-mode-line-break ((,class :foreground ,cyan-active))) `(org-pomodoro-mode-line-overtime ((,class :inherit bold :foreground ,red-active))) ;;;;; org-recur `(org-recur ((,class :foreground ,magenta-active))) ;;;;; org-roam `(org-roam-link ((,class :inherit button ,@(modus-themes--link-color green green-faint)))) `(org-roam-link-current ((,class :inherit button ,@(modus-themes--link-color green-alt green-alt-faint)))) `(org-roam-link-invalid ((,class :inherit button ,@(modus-themes--link-color red red-faint)))) `(org-roam-link-shielded ((,class :inherit button ,@(modus-themes--link-color yellow yellow-faint)))) `(org-roam-tag ((,class :inherit italic :foreground ,fg-alt))) ;;;;; org-superstar `(org-superstar-item ((,class :foreground ,fg-main))) `(org-superstar-leading ((,class :foreground ,fg-whitespace))) ;;;;; org-table-sticky-header `(org-table-sticky-header-face ((,class :inherit modus-theme-intense-neutral))) ;;;;; org-tree-slide `(org-tree-slide-header-overlay-face ((,class :inherit (bold modus-theme-variable-pitch) :background ,bg-main :foreground ,fg-special-cold :overline nil ,@(modus-themes--scale modus-themes-scale-5)))) ;;;;; org-treescope `(org-treescope-faces--markerinternal-midday ((,class :inherit modus-theme-intense-blue))) `(org-treescope-faces--markerinternal-range ((,class :inherit modus-theme-special-mild))) ;;;;; origami `(origami-fold-header-face ((,class :background ,bg-dim :foreground ,fg-dim :box t))) `(origami-fold-replacement-face ((,class :background ,bg-alt :foreground ,fg-alt))) ;;;;; outline-mode `(outline-1 ((,class :inherit modus-theme-heading-1))) `(outline-2 ((,class :inherit modus-theme-heading-2))) `(outline-3 ((,class :inherit modus-theme-heading-3))) `(outline-4 ((,class :inherit modus-theme-heading-4))) `(outline-5 ((,class :inherit modus-theme-heading-5))) `(outline-6 ((,class :inherit modus-theme-heading-6))) `(outline-7 ((,class :inherit modus-theme-heading-7))) `(outline-8 ((,class :inherit modus-theme-heading-8))) ;;;;; outline-minor-faces `(outline-minor-0 ((,class :background ,bg-alt))) ;;;;; package (M-x list-packages) `(package-description ((,class :foreground ,fg-special-cold))) `(package-help-section-name ((,class :inherit bold :foreground ,magenta-alt-other))) `(package-name ((,class :inherit button))) `(package-status-avail-obso ((,class :inherit bold :foreground ,red))) `(package-status-available ((,class :foreground ,fg-special-mild))) `(package-status-built-in ((,class :foreground ,magenta))) `(package-status-dependency ((,class :foreground ,magenta-alt-other))) `(package-status-disabled ((,class :inherit modus-theme-subtle-red))) `(package-status-external ((,class :foreground ,cyan-alt-other))) `(package-status-held ((,class :foreground ,yellow-alt))) `(package-status-incompat ((,class :inherit bold :foreground ,yellow))) `(package-status-installed ((,class :foreground ,fg-special-warm))) `(package-status-new ((,class :inherit bold :foreground ,green))) `(package-status-unsigned ((,class :inherit bold :foreground ,red-alt))) ;;;;; page-break-lines `(page-break-lines ((,class :inherit default :foreground ,fg-window-divider-outer))) ;;;;; paradox `(paradox-archive-face ((,class :foreground ,fg-special-mild))) `(paradox-comment-face ((,class :inherit font-lock-comment-face))) `(paradox-commit-tag-face ((,class :inherit modus-theme-refine-magenta :box t))) `(paradox-description-face ((,class :foreground ,fg-special-cold))) `(paradox-description-face-multiline ((,class :foreground ,fg-special-cold))) `(paradox-download-face ((,class :inherit modus-theme-bold :foreground ,blue-alt-other))) `(paradox-highlight-face ((,class :inherit modus-theme-bold :foreground ,cyan-alt-other))) `(paradox-homepage-button-face ((,class :foreground ,magenta-alt-other :underline t))) `(paradox-mode-line-face ((,class :inherit bold :foreground ,cyan-active))) `(paradox-name-face ((,class :foreground ,blue :underline t))) `(paradox-star-face ((,class :foreground ,magenta))) `(paradox-starred-face ((,class :foreground ,magenta-alt))) ;;;;; paren-face `(parenthesis ((,class :foreground ,fg-unfocused))) ;;;;; parrot `(parrot-rotate-rotation-highlight-face ((,class :inherit modus-theme-refine-magenta))) ;;;;; pass `(pass-mode-directory-face ((,class :inherit bold :foreground ,fg-special-cold))) `(pass-mode-entry-face ((,class :background ,bg-main :foreground ,fg-main))) `(pass-mode-header-face ((,class :foreground ,fg-special-warm))) ;;;;; pdf-tools `(pdf-links-read-link ((,class :background ,fg-main :foreground ,magenta-intense-bg :inherit bold))) ; Foreground is background and vice versa `(pdf-occur-document-face ((,class :inherit shadow))) `(pdf-occur-page-face ((,class :inherit shadow))) ;;;;; persp-mode `(persp-face-lighter-buffer-not-in-persp ((,class :inherit modus-theme-intense-red))) `(persp-face-lighter-default ((,class :inherit bold :foreground ,blue-active))) `(persp-face-lighter-nil-persp ((,class :inherit bold :foreground ,fg-active))) ;;;;; perspective `(persp-selected-face ((,class :inherit bold :foreground ,blue-active))) ;;;;; phi-grep `(phi-grep-heading-face ((,class :inherit bold :foreground ,red-alt ,@(modus-themes--scale modus-themes-scale-4)))) `(phi-grep-line-number-face ((,class :foreground ,fg-special-warm))) `(phi-grep-match-face ((,class :inherit modus-theme-special-calm))) `(phi-grep-modified-face ((,class :inherit modus-theme-refine-yellow))) `(phi-grep-overlay-face ((,class :inherit modus-theme-refine-blue))) ;;;;; phi-search `(phi-replace-preview-face ((,class :inherit modus-theme-intense-magenta))) `(phi-search-failpart-face ((,class :inherit modus-theme-refine-red))) `(phi-search-match-face ((,class :inherit modus-theme-refine-cyan))) `(phi-search-selection-face ((,class :inherit (modus-theme-intense-green bold)))) ;;;;; pkgbuild-mode `(pkgbuild-error-face ((,class :inherit modus-theme-lang-error))) ;;;;; pomidor `(pomidor-break-face ((,class :foreground ,blue-alt-other))) `(pomidor-overwork-face ((,class :foreground ,red-alt-other))) `(pomidor-skip-face ((,class :inherit modus-theme-slant :foreground ,fg-alt))) `(pomidor-work-face ((,class :foreground ,green-alt-other))) ;;;;; popup `(popup-face ((,class :background ,bg-alt :foreground ,fg-main))) `(popup-isearch-match ((,class :inherit (modus-theme-refine-cyan bold)))) `(popup-menu-mouse-face ((,class :inherit modus-theme-intense-blue))) `(popup-menu-selection-face ((,class :inherit (modus-theme-subtle-cyan bold)))) `(popup-scroll-bar-background-face ((,class :background ,bg-active))) `(popup-scroll-bar-foreground-face ((,class :foreground ,fg-active))) `(popup-summary-face ((,class :background ,bg-active :foreground ,fg-inactive))) `(popup-tip-face ((,class :inherit modus-theme-refine-yellow))) ;;;;; powerline `(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint :inverse-video t))) `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced-fg))) `(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active))) `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold))) `(powerline-inactive1 ((,class :background ,bg-dim :foreground ,fg-inactive))) `(powerline-inactive2 ((,class :background ,bg-inactive :foreground ,fg-inactive))) ;;;;; powerline-evil `(powerline-evil-base-face ((,class :background ,fg-main :foreground ,bg-main))) `(powerline-evil-emacs-face ((,class :inherit modus-theme-active-magenta))) `(powerline-evil-insert-face ((,class :inherit modus-theme-active-green))) `(powerline-evil-motion-face ((,class :inherit modus-theme-active-blue))) `(powerline-evil-normal-face ((,class :background ,fg-alt :foreground ,bg-main))) `(powerline-evil-operator-face ((,class :inherit modus-theme-active-yellow))) `(powerline-evil-replace-face ((,class :inherit modus-theme-active-red))) `(powerline-evil-visual-face ((,class :inherit modus-theme-active-cyan))) ;;;;; proced `(proced-mark ((,class :inherit modus-theme-mark-symbol))) `(proced-marked ((,class :inherit modus-theme-mark-alt))) `(proced-sort-header ((,class :inherit bold :foreground ,fg-special-calm :underline t))) ;;;;; prodigy `(prodigy-green-face ((,class :foreground ,green))) `(prodigy-red-face ((,class :foreground ,red))) `(prodigy-yellow-face ((,class :foreground ,yellow))) ;;;;; quick-peek `(quick-peek-background-face ((,class :background ,bg-alt))) `(quick-peek-border-face ((,class :background ,fg-window-divider-inner :height 1))) `(quick-peek-padding-face ((,class :background ,bg-alt :height 0.15))) ;;;;; racket-mode `(racket-debug-break-face ((,class :inherit modus-theme-intense-red))) `(racket-debug-locals-face ((,class :box (:line-width -1 :color nil) :foreground ,green-alt-other))) `(racket-debug-result-face ((,class :inherit bold :box (:line-width -1 :color nil) :foreground ,green))) `(racket-here-string-face ((,class :foreground ,blue-alt))) `(racket-keyword-argument-face ((,class :foreground ,red-alt))) `(racket-logger-config-face ((,class :inherit modus-theme-slant :foreground ,fg-alt))) `(racket-logger-debug-face ((,class :foreground ,blue-alt-other))) `(racket-logger-info-face ((,class :foreground ,fg-lang-note))) `(racket-logger-topic-face ((,class :inherit modus-theme-slant :foreground ,magenta))) `(racket-selfeval-face ((,class :foreground ,green-alt))) `(racket-xp-error-face ((,class :inherit modus-theme-lang-error))) ;;;;; rainbow-blocks `(rainbow-blocks-depth-1-face ((,class :foreground ,magenta-alt-other))) `(rainbow-blocks-depth-2-face ((,class :foreground ,blue))) `(rainbow-blocks-depth-3-face ((,class :foreground ,magenta-alt))) `(rainbow-blocks-depth-4-face ((,class :foreground ,green))) `(rainbow-blocks-depth-5-face ((,class :foreground ,magenta))) `(rainbow-blocks-depth-6-face ((,class :foreground ,cyan))) `(rainbow-blocks-depth-7-face ((,class :foreground ,yellow))) `(rainbow-blocks-depth-8-face ((,class :foreground ,cyan-alt))) `(rainbow-blocks-depth-9-face ((,class :foreground ,red-alt))) `(rainbow-blocks-unmatched-face ((,class :foreground ,red))) ;;;;; rainbow-identifiers `(rainbow-identifiers-identifier-1 ((,class :foreground ,green-alt-other))) `(rainbow-identifiers-identifier-2 ((,class :foreground ,magenta-alt-other))) `(rainbow-identifiers-identifier-3 ((,class :foreground ,cyan-alt-other))) `(rainbow-identifiers-identifier-4 ((,class :foreground ,yellow-alt-other))) `(rainbow-identifiers-identifier-5 ((,class :foreground ,blue-alt-other))) `(rainbow-identifiers-identifier-6 ((,class :foreground ,green-alt))) `(rainbow-identifiers-identifier-7 ((,class :foreground ,magenta-alt))) `(rainbow-identifiers-identifier-8 ((,class :foreground ,cyan-alt))) `(rainbow-identifiers-identifier-9 ((,class :foreground ,yellow-alt))) `(rainbow-identifiers-identifier-10 ((,class :foreground ,green))) `(rainbow-identifiers-identifier-11 ((,class :foreground ,magenta))) `(rainbow-identifiers-identifier-12 ((,class :foreground ,cyan))) `(rainbow-identifiers-identifier-13 ((,class :foreground ,yellow))) `(rainbow-identifiers-identifier-14 ((,class :foreground ,blue-alt))) `(rainbow-identifiers-identifier-15 ((,class :foreground ,red-alt))) ;;;;; rainbow-delimiters `(rainbow-delimiters-base-error-face ((,class :background ,red-subtle-bg :foreground ,fg-main))) `(rainbow-delimiters-base-face ((,class :foreground ,fg-main))) `(rainbow-delimiters-depth-1-face ((,class :foreground ,fg-main))) `(rainbow-delimiters-depth-2-face ((,class :foreground ,magenta-intense))) `(rainbow-delimiters-depth-3-face ((,class :foreground ,cyan-intense))) `(rainbow-delimiters-depth-4-face ((,class :foreground ,orange-intense))) `(rainbow-delimiters-depth-5-face ((,class :foreground ,purple-intense))) `(rainbow-delimiters-depth-6-face ((,class :foreground ,green-intense))) `(rainbow-delimiters-depth-7-face ((,class :foreground ,red-intense))) `(rainbow-delimiters-depth-8-face ((,class :foreground ,blue-intense))) `(rainbow-delimiters-depth-9-face ((,class :foreground ,yellow-intense))) `(rainbow-delimiters-mismatched-face ((,class :inherit (bold modus-theme-refine-yellow)))) `(rainbow-delimiters-unmatched-face ((,class :inherit (bold modus-theme-refine-red)))) ;;;;; rcirc `(rcirc-bright-nick ((,class :inherit bold :foreground ,magenta-alt))) `(rcirc-dim-nick ((,class :inherit shadow))) `(rcirc-my-nick ((,class :inherit bold :foreground ,magenta))) `(rcirc-nick-in-message ((,class :foreground ,magenta-alt-other))) `(rcirc-nick-in-message-full-line ((,class :inherit bold :foreground ,fg-special-mild))) `(rcirc-other-nick ((,class :inherit bold :foreground ,fg-special-cold))) `(rcirc-prompt ((,class :inherit bold :foreground ,cyan-alt-other))) `(rcirc-server ((,class :foreground ,fg-unfocused))) `(rcirc-timestamp ((,class :foreground ,blue-nuanced-fg))) `(rcirc-url ((,class :foreground ,blue :underline t))) ;;;;; recursion-indicator `(recursion-indicator-general ((,class :foreground ,blue-active))) `(recursion-indicator-minibuffer ((,class :foreground ,red-active))) ;;;;; regexp-builder (re-builder) `(reb-match-0 ((,class :inherit modus-theme-refine-cyan))) `(reb-match-1 ((,class :inherit modus-theme-subtle-magenta))) `(reb-match-2 ((,class :inherit modus-theme-subtle-green))) `(reb-match-3 ((,class :inherit modus-theme-refine-yellow))) `(reb-regexp-grouping-backslash ((,class :inherit font-lock-regexp-grouping-backslash))) `(reb-regexp-grouping-construct ((,class :inherit font-lock-regexp-grouping-construct))) ;;;;; rg (rg.el) `(rg-column-number-face ((,class :foreground ,magenta-alt-other))) `(rg-context-face ((,class :foreground ,fg-unfocused))) `(rg-error-face ((,class :inherit bold :foreground ,red))) `(rg-file-tag-face ((,class :foreground ,fg-special-cold))) `(rg-filename-face ((,class :inherit bold :foreground ,fg-special-cold))) `(rg-line-number-face ((,class :foreground ,fg-special-warm))) `(rg-literal-face ((,class :foreground ,blue-alt))) `(rg-match-face ((,class :inherit modus-theme-special-calm))) `(rg-regexp-face ((,class :foreground ,magenta-active))) `(rg-toggle-off-face ((,class :inherit bold :foreground ,fg-inactive))) `(rg-toggle-on-face ((,class :inherit bold :foreground ,cyan-active))) `(rg-warning-face ((,class :inherit bold :foreground ,yellow))) ;;;;; ripgrep `(ripgrep-context-face ((,class :foreground ,fg-unfocused))) `(ripgrep-error-face ((,class :inherit bold :foreground ,red))) `(ripgrep-hit-face ((,class :foreground ,cyan))) `(ripgrep-match-face ((,class :inherit modus-theme-special-calm))) ;;;;; rmail `(rmail-header-name ((,class :foreground ,cyan-alt-other))) `(rmail-highlight ((,class :inherit bold :foreground ,magenta-alt))) ;;;;; ruler-mode `(ruler-mode-column-number ((,class :inherit ruler-mode-default :foreground ,fg-main))) `(ruler-mode-comment-column ((,class :inherit ruler-mode-default :foreground ,red))) `(ruler-mode-current-column ((,class :inherit ruler-mode-default :background ,blue-subtle-bg :foreground ,fg-main))) `(ruler-mode-default ((,class :inherit default :background ,bg-alt :foreground ,fg-unfocused))) `(ruler-mode-fill-column ((,class :inherit ruler-mode-default :foreground ,green))) `(ruler-mode-fringes ((,class :inherit ruler-mode-default :foreground ,cyan))) `(ruler-mode-goal-column ((,class :inherit ruler-mode-default :foreground ,blue))) `(ruler-mode-margins ((,class :inherit ruler-mode-default :foreground ,bg-main))) `(ruler-mode-pad ((,class :inherit ruler-mode-default :background ,bg-active :foreground ,fg-inactive))) `(ruler-mode-tab-stop ((,class :inherit ruler-mode-default :foreground ,fg-special-warm))) ;;;;; sallet `(sallet-buffer-compressed ((,class :inherit italic :foreground ,yellow-nuanced-fg))) `(sallet-buffer-default-directory ((,class :foreground ,cyan-nuanced-fg))) `(sallet-buffer-directory ((,class :foreground ,blue-nuanced-fg))) `(sallet-buffer-help ((,class :foreground ,fg-special-cold))) `(sallet-buffer-modified ((,class :inherit italic :foreground ,yellow-alt-other))) `(sallet-buffer-ordinary ((,class :foreground ,fg-main))) `(sallet-buffer-read-only ((,class :foreground ,yellow-alt))) `(sallet-buffer-size ((,class :foreground ,fg-special-calm))) `(sallet-buffer-special ((,class :foreground ,magenta-alt-other))) `(sallet-flx-match ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-cyan 'modus-theme-refine-cyan 'modus-theme-nuanced-cyan cyan-alt-other)))) `(sallet-recentf-buffer-name ((,class :foreground ,blue-nuanced-fg))) `(sallet-recentf-file-path ((,class :foreground ,fg-special-mild))) `(sallet-regexp-match ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-magenta 'modus-theme-refine-magenta 'modus-theme-nuanced-magenta magenta-alt-other)))) `(sallet-source-header ((,class :inherit bold :foreground ,red-alt ,@(modus-themes--scale modus-themes-scale-4)))) `(sallet-substring-match ((,class ,@(modus-themes--extra-completions 'modus-theme-subtle-blue 'modus-theme-refine-blue 'modus-theme-nuanced-blue blue-alt-other)))) ;;;;; selectrum ;; NOTE 2021-02-22: The `selectrum-primary-highlight' and ;; `selectrum-secondary-highlight' are deprecated upstream in favour of ;; their selectrum-prescient counterparts. We shall remove those faces ;; from the themes once we are certain that they are no longer relevant. `(selectrum-current-candidate ((,class :inherit bold :foreground ,fg-main :background ,@(pcase modus-themes-completions ('opinionated (list bg-active)) (_ (list bg-inactive)))))) `(selectrum-primary-highlight ((,class :inherit bold ,@(modus-themes--standard-completions magenta-alt magenta-nuanced-bg magenta-refine-bg magenta-refine-fg)))) `(selectrum-secondary-highlight ((,class :inherit bold ,@(modus-themes--standard-completions cyan-alt-other cyan-nuanced-bg cyan-refine-bg cyan-refine-fg)))) ;;;;; selectrum-prescient `(selectrum-prescient-primary-highlight ((,class :inherit bold ,@(modus-themes--standard-completions magenta-alt magenta-nuanced-bg magenta-refine-bg magenta-refine-fg)))) `(selectrum-prescient-secondary-highlight ((,class :inherit bold ,@(modus-themes--standard-completions cyan-alt-other cyan-nuanced-bg cyan-refine-bg cyan-refine-fg)))) ;;;;; semantic `(semantic-complete-inline-face ((,class :foreground ,fg-special-warm :underline t))) `(semantic-decoration-on-fileless-includes ((,class :inherit modus-theme-refine-green))) `(semantic-decoration-on-private-members-face ((,class :inherit modus-theme-refine-cyan))) `(semantic-decoration-on-protected-members-face ((,class :background ,bg-dim))) `(semantic-decoration-on-unknown-includes ((,class :inherit modus-theme-refine-red))) `(semantic-decoration-on-unparsed-includes ((,class :inherit modus-theme-refine-yellow))) `(semantic-highlight-edits-face ((,class :background ,bg-alt))) `(semantic-highlight-func-current-tag-face ((,class :background ,bg-alt))) `(semantic-idle-symbol-highlight ((,class :inherit modus-theme-special-mild))) `(semantic-tag-boundary-face ((,class :overline ,blue-intense))) `(semantic-unmatched-syntax-face ((,class :underline ,fg-lang-error))) ;;;;; sesman `(sesman-browser-button-face ((,class :foreground ,blue-alt-other :underline t))) `(sesman-browser-highligh-face ((,class :inherit modus-theme-subtle-blue))) `(sesman-buffer-face ((,class :foreground ,magenta))) `(sesman-directory-face ((,class :inherit bold :foreground ,blue))) `(sesman-project-face ((,class :inherit bold :foreground ,magenta-alt-other))) ;;;;; shell-script-mode `(sh-heredoc ((,class :foreground ,blue-alt))) `(sh-quoted-exec ((,class :inherit modus-theme-bold :foreground ,magenta-alt))) ;;;;; shortdoc `(shortdoc-heading ((,class :inherit modus-theme-pseudo-header))) `(shortdoc-section (())) ; remove the default's variable-pitch style ;;;;; show-paren-mode `(show-paren-match ((,class ,@(modus-themes--paren bg-paren-match bg-paren-match-intense) :foreground ,fg-main))) `(show-paren-match-expression ((,class :inherit modus-theme-special-calm))) `(show-paren-mismatch ((,class :inherit modus-theme-intense-red))) ;;;;; shr `(shr-abbreviation ((,(append '((supports :underline (:style wave))) class) :foreground ,fg-docstring :underline (:color ,fg-alt :style wave)) (,class :foreground ,fg-docstring :underline t))) `(shr-selected-link ((,class :inherit modus-theme-subtle-cyan))) ;;;;; side-notes `(side-notes ((,class :background ,bg-dim :foreground ,fg-dim))) ;;;;; sieve-mode `(sieve-action-commands ((,class :inherit font-lock-builtin-face))) `(sieve-control-commands ((,class :inherit font-lock-keyword-face))) `(sieve-tagged-arguments ((,class :inherit font-lock-type-face))) `(sieve-test-commands ((,class :inherit font-lock-function-name-face))) ;;;;; skewer-mode `(skewer-error-face ((,class :foreground ,red :underline t))) ;;;;; smart-mode-line `(sml/charging ((,class :foreground ,green-active))) `(sml/discharging ((,class :foreground ,red-active))) `(sml/filename ((,class :inherit bold :foreground ,blue-active))) `(sml/folder ((,class :foreground ,fg-active))) `(sml/git ((,class :inherit bold :foreground ,green-active))) `(sml/global ((,class :foreground ,fg-active))) `(sml/line-number ((,class :inherit sml/global))) `(sml/minor-modes ((,class :inherit sml/global))) `(sml/modes ((,class :inherit bold :foreground ,fg-active))) `(sml/modified ((,class :inherit bold :foreground ,magenta-active))) `(sml/mule-info ((,class :inherit sml/global))) `(sml/name-filling ((,class :foreground ,yellow-active))) `(sml/not-modified ((,class :inherit sml/global))) `(sml/numbers-separator ((,class :inherit sml/global))) `(sml/outside-modified ((,class :inherit modus-theme-intense-red))) `(sml/position-percentage ((,class :inherit sml/global))) `(sml/prefix ((,class :foreground ,green-active))) `(sml/process ((,class :inherit sml/prefix))) `(sml/projectile ((,class :inherit sml/git))) `(sml/read-only ((,class :inherit bold :foreground ,cyan-active))) `(sml/remote ((,class :inherit sml/global))) `(sml/sudo ((,class :inherit modus-theme-subtle-red))) `(sml/time ((,class :inherit sml/global))) `(sml/vc ((,class :inherit sml/git))) `(sml/vc-edited ((,class :inherit bold :foreground ,yellow-active))) ;;;;; smartparens `(sp-pair-overlay-face ((,class :inherit modus-theme-special-warm))) `(sp-show-pair-enclosing ((,class :inherit modus-theme-special-mild))) `(sp-show-pair-match-face ((,class ,@(modus-themes--paren bg-paren-match bg-paren-match-intense) :foreground ,fg-main))) `(sp-show-pair-mismatch-face ((,class :inherit modus-theme-intense-red))) `(sp-wrap-overlay-closing-pair ((,class :inherit sp-pair-overlay-face))) `(sp-wrap-overlay-face ((,class :inherit sp-pair-overlay-face))) `(sp-wrap-overlay-opening-pair ((,class :inherit sp-pair-overlay-face))) `(sp-wrap-tag-overlay-face ((,class :inherit sp-pair-overlay-face))) ;;;;; smerge `(smerge-base ((,class :inherit modus-theme-diff-changed))) `(smerge-lower ((,class :inherit modus-theme-diff-added))) `(smerge-markers ((,class :background ,bg-diff-neutral-2 :foreground ,fg-diff-neutral-2))) `(smerge-refined-added ((,class :inherit modus-theme-diff-refine-added))) `(smerge-refined-changed (())) `(smerge-refined-removed ((,class :inherit modus-theme-diff-refine-removed))) `(smerge-upper ((,class :inherit modus-theme-diff-removed))) ;;;;; solaire `(solaire-default-face ((,class :inherit default :background ,bg-alt :foreground ,fg-dim))) `(solaire-line-number-face ((,class :inherit solaire-default-face :foreground ,fg-unfocused))) `(solaire-hl-line-face ((,class :background ,bg-active))) `(solaire-org-hide-face ((,class :background ,bg-alt :foreground ,bg-alt))) ;;;;; spaceline `(spaceline-evil-emacs ((,class :inherit modus-theme-active-magenta))) `(spaceline-evil-insert ((,class :inherit modus-theme-active-green))) `(spaceline-evil-motion ((,class :inherit modus-theme-active-blue))) `(spaceline-evil-normal ((,class :background ,fg-alt :foreground ,bg-alt))) `(spaceline-evil-replace ((,class :inherit modus-theme-active-red))) `(spaceline-evil-visual ((,class :inherit modus-theme-active-cyan))) `(spaceline-flycheck-error ((,class :foreground ,red-active))) `(spaceline-flycheck-info ((,class :foreground ,cyan-active))) `(spaceline-flycheck-warning ((,class :foreground ,yellow-active))) `(spaceline-highlight-face ((,class :inherit modus-theme-fringe-blue))) `(spaceline-modified ((,class :inherit modus-theme-fringe-magenta))) `(spaceline-python-venv ((,class :foreground ,magenta-active))) `(spaceline-read-only ((,class :inherit modus-theme-fringe-red))) `(spaceline-unmodified ((,class :inherit modus-theme-fringe-cyan))) ;;;;; speedbar `(speedbar-button-face ((,class :inherit button))) `(speedbar-directory-face ((,class :inherit bold :foreground ,blue))) `(speedbar-file-face ((,class :foreground ,fg-main))) `(speedbar-highlight-face ((,class :inherit modus-theme-subtle-blue))) `(speedbar-selected-face ((,class :inherit bold :foreground ,cyan))) `(speedbar-separator-face ((,class :inherit modus-theme-intense-neutral))) `(speedbar-tag-face ((,class :foreground ,yellow-alt-other))) ;;;;; spell-fu `(spell-fu-incorrect-face ((,class :inherit modus-theme-lang-error))) ;;;;; spray `(spray-accent-face ((,class :foreground ,red-intense))) `(spray-base-face ((,class :inherit default :foreground ,fg-special-cold))) ;;;;; stripes `(stripes ((,class :inherit modus-theme-hl-line))) ;;;;; success `(suggest-heading ((,class :inherit bold :foreground ,yellow-alt-other))) ;;;;; switch-window `(switch-window-background ((,class :background ,bg-dim))) `(switch-window-label ((,class :height 3.0 :foreground ,blue-intense))) ;;;;; swiper `(swiper-background-match-face-1 ((,class :inherit modus-theme-subtle-neutral))) `(swiper-background-match-face-2 ((,class :inherit modus-theme-refine-cyan))) `(swiper-background-match-face-3 ((,class :inherit modus-theme-refine-magenta))) `(swiper-background-match-face-4 ((,class :inherit modus-theme-refine-yellow))) `(swiper-line-face ((,class :inherit modus-theme-special-cold))) `(swiper-match-face-1 ((,class :inherit (bold modus-theme-intense-neutral)))) `(swiper-match-face-2 ((,class :inherit (bold modus-theme-intense-green)))) `(swiper-match-face-3 ((,class :inherit (bold modus-theme-intense-blue)))) `(swiper-match-face-4 ((,class :inherit (bold modus-theme-intense-red)))) ;;;;; swoop `(swoop-face-header-format-line ((,class :inherit bold :foreground ,red-alt ,@(modus-themes--scale modus-themes-scale-3)))) `(swoop-face-line-buffer-name ((,class :inherit bold :foreground ,blue-alt ,@(modus-themes--scale modus-themes-scale-4)))) `(swoop-face-line-number ((,class :foreground ,fg-special-warm))) `(swoop-face-target-line ((,class :inherit modus-theme-intense-blue :extend t))) `(swoop-face-target-words ((,class :inherit modus-theme-refine-cyan))) ;;;;; sx `(sx-inbox-item-type ((,class :foreground ,magenta-alt-other))) `(sx-inbox-item-type-unread ((,class :inherit (sx-inbox-item-type bold)))) `(sx-question-list-answers ((,class :foreground ,green))) `(sx-question-list-answers-accepted ((,class :box t :foreground ,green))) `(sx-question-list-bounty ((,class :inherit bold :background ,bg-alt :foreground ,yellow))) `(sx-question-list-date ((,class :foreground ,fg-special-cold))) `(sx-question-list-favorite ((,class :inherit bold :foreground ,fg-special-warm))) `(sx-question-list-parent ((,class :foreground ,fg-main))) `(sx-question-list-read-question ((,class :inherit shadow))) `(sx-question-list-score ((,class :foreground ,fg-special-mild))) `(sx-question-list-score-upvoted ((,class :inherit (sx-question-list-score bold)))) `(sx-question-list-unread-question ((,class :inherit bold :foreground ,fg-main))) `(sx-question-mode-accepted ((,class :inherit bold :height 1.3 :foreground ,green))) `(sx-question-mode-closed ((,class :inherit modus-theme-active-yellow :box (:line-width 2 :color nil)))) `(sx-question-mode-closed-reason ((,class :box (:line-width 2 :color nil) :foreground ,fg-main))) `(sx-question-mode-content-face ((,class :background ,bg-dim))) `(sx-question-mode-date ((,class :foreground ,blue))) `(sx-question-mode-header ((,class :inherit bold :foreground ,cyan))) `(sx-question-mode-kbd-tag ((,class :inherit bold :height 0.9 :box (:line-width 3 :color ,fg-main :style released-button) :foreground ,fg-main))) `(sx-question-mode-score ((,class :foreground ,fg-dim))) `(sx-question-mode-score-downvoted ((,class :foreground ,yellow))) `(sx-question-mode-score-upvoted ((,class :inherit bold :foreground ,magenta))) `(sx-question-mode-title ((,class :inherit bold :foreground ,fg-main))) `(sx-question-mode-title-comments ((,class :inherit bold :foreground ,fg-alt))) `(sx-tag ((,class :foreground ,magenta-alt))) `(sx-user-name ((,class :foreground ,blue-alt))) `(sx-user-reputation ((,class :inherit shadow))) ;;;;; symbol-overlay `(symbol-overlay-default-face ((,class :inherit modus-theme-special-warm))) `(symbol-overlay-face-1 ((,class :inherit modus-theme-intense-blue))) `(symbol-overlay-face-2 ((,class :inherit modus-theme-refine-magenta))) `(symbol-overlay-face-3 ((,class :inherit modus-theme-intense-yellow))) `(symbol-overlay-face-4 ((,class :inherit modus-theme-intense-magenta))) `(symbol-overlay-face-5 ((,class :inherit modus-theme-intense-red))) `(symbol-overlay-face-6 ((,class :inherit modus-theme-refine-red))) `(symbol-overlay-face-7 ((,class :inherit modus-theme-intense-cyan))) `(symbol-overlay-face-8 ((,class :inherit modus-theme-refine-cyan))) ;;;;; syslog-mode `(syslog-debug ((,class :inherit bold :foreground ,cyan-alt-other))) `(syslog-error ((,class :inherit bold :foreground ,red))) `(syslog-file ((,class :inherit bold :foreground ,fg-special-cold))) `(syslog-hide ((,class :background ,bg-main :foreground ,fg-main))) `(syslog-hour ((,class :inherit bold :foreground ,magenta-alt-other))) `(syslog-info ((,class :inherit bold :foreground ,blue-alt-other))) `(syslog-ip ((,class :inherit bold :foreground ,fg-special-mild :underline t))) `(syslog-su ((,class :inherit bold :foreground ,red-alt))) `(syslog-warn ((,class :inherit bold :foreground ,yellow))) ;;;;; tab-bar-mode `(tab-bar ((,class ,@(modus-themes--variable-pitch-ui) :background ,bg-tab-bar :foreground ,fg-main))) `(tab-bar-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active) :background ,bg-tab-active :foreground ,fg-main))) `(tab-bar-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive) :background ,bg-tab-inactive :foreground ,fg-dim))) ;;;;; tab-line-mode `(tab-line ((,class ,@(modus-themes--variable-pitch-ui) :height 0.95 :background ,bg-tab-bar :foreground ,fg-main))) `(tab-line-close-highlight ((,class :foreground ,red))) `(tab-line-highlight ((,class :background ,blue-subtle-bg :foreground ,fg-dim))) `(tab-line-tab ((,class :inherit bold :box (:line-width 2 :color ,bg-tab-active) :background ,bg-tab-active :foreground ,fg-main))) `(tab-line-tab-current ((,class :inherit tab-line-tab))) `(tab-line-tab-inactive ((,class :box (:line-width 2 :color ,bg-tab-inactive) :background ,bg-tab-inactive :foreground ,fg-dim))) `(tab-line-tab-inactive-alternate ((,class :box (:line-width 2 :color ,bg-tab-inactive-alt) :background ,bg-tab-inactive-alt :foreground ,fg-main))) ;;;;; table (built-in table.el) `(table-cell ((,class :background ,blue-nuanced-bg))) ;;;;; telephone-line `(telephone-line-accent-active ((,class :background ,fg-inactive :foreground ,bg-inactive))) `(telephone-line-accent-inactive ((,class :background ,bg-active :foreground ,fg-active))) `(telephone-line-error ((,class :inherit bold :foreground ,red-active))) `(telephone-line-evil ((,class :foreground ,fg-main))) `(telephone-line-evil-emacs ((,class :inherit telephone-line-evil :background ,magenta-intense-bg))) `(telephone-line-evil-insert ((,class :inherit telephone-line-evil :background ,green-intense-bg))) `(telephone-line-evil-motion ((,class :inherit telephone-line-evil :background ,yellow-intense-bg))) `(telephone-line-evil-normal ((,class :inherit telephone-line-evil :background ,bg-alt))) `(telephone-line-evil-operator ((,class :inherit telephone-line-evil :background ,yellow-subtle-bg))) `(telephone-line-evil-replace ((,class :inherit telephone-line-evil :background ,red-intense-bg))) `(telephone-line-evil-visual ((,class :inherit telephone-line-evil :background ,cyan-intense-bg))) `(telephone-line-projectile ((,class :foreground ,cyan-active))) `(telephone-line-unimportant ((,class :foreground ,fg-inactive))) `(telephone-line-warning ((,class :inherit bold :foreground ,yellow-active))) ;;;;; terraform-mode `(terraform--resource-name-face ((,class ,@(modus-themes--syntax-string magenta-alt-other magenta-alt-other-faint red-alt red-alt)))) `(terraform--resource-type-face ((,class ,@(modus-themes--syntax-string green green-faint blue-alt magenta-alt)))) ;;;;; term `(term ((,class :background ,bg-main :foreground ,fg-main))) `(term-bold ((,class :inherit bold))) `(term-color-black ((,class :background "gray35" :foreground "gray35"))) `(term-color-blue ((,class :background ,blue :foreground ,blue))) `(term-color-cyan ((,class :background ,cyan :foreground ,cyan))) `(term-color-green ((,class :background ,green :foreground ,green))) `(term-color-magenta ((,class :background ,magenta :foreground ,magenta))) `(term-color-red ((,class :background ,red :foreground ,red))) `(term-color-white ((,class :background "gray65" :foreground "gray65"))) `(term-color-yellow ((,class :background ,yellow :foreground ,yellow))) `(term-underline ((,class :underline t))) ;;;;; tomatinho `(tomatinho-ok-face ((,class :foreground ,blue-intense))) `(tomatinho-pause-face ((,class :foreground ,yellow-intense))) `(tomatinho-reset-face ((,class :inherit shadow))) ;;;;; transient `(transient-active-infix ((,class :inherit modus-theme-special-mild))) `(transient-amaranth ((,class :inherit bold :foreground ,yellow))) `(transient-argument ((,class :inherit bold :foreground ,red-alt))) `(transient-blue ((,class :inherit bold :foreground ,blue))) `(transient-disabled-suffix ((,class :inherit modus-theme-intense-red))) `(transient-enabled-suffix ((,class :inherit modus-theme-intense-green))) `(transient-heading ((,class :inherit bold :foreground ,fg-main))) `(transient-inactive-argument ((,class :inherit shadow))) `(transient-inactive-value ((,class :inherit shadow))) `(transient-key ((,class :inherit bold :foreground ,blue))) `(transient-mismatched-key ((,class :underline t))) `(transient-nonstandard-key ((,class :underline t))) `(transient-pink ((,class :inherit bold :foreground ,magenta))) `(transient-red ((,class :inherit bold :foreground ,red-intense))) `(transient-teal ((,class :inherit bold :foreground ,cyan-alt-other))) `(transient-unreachable ((,class :foreground ,fg-unfocused))) `(transient-unreachable-key ((,class :foreground ,fg-unfocused))) `(transient-value ((,class :inherit bold :foreground ,magenta-alt-other))) ;;;;; trashed `(trashed-deleted ((,class :inherit modus-theme-mark-del))) `(trashed-directory ((,class :foreground ,blue))) `(trashed-mark ((,class :inherit modus-theme-mark-symbol))) `(trashed-marked ((,class :inherit modus-theme-mark-alt))) `(trashed-restored ((,class :inherit modus-theme-mark-sel))) `(trashed-symlink ((,class :inherit button ,@(modus-themes--link-color cyan-alt cyan-alt-faint)))) ;;;;; treemacs `(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt))) `(treemacs-directory-face ((,class :inherit dired-directory))) `(treemacs-file-face ((,class :foreground ,fg-main))) `(treemacs-fringe-indicator-face ((,class :foreground ,fg-main))) `(treemacs-git-added-face ((,class :foreground ,green-intense))) `(treemacs-git-conflict-face ((,class :inherit (modus-theme-intense-red bold)))) `(treemacs-git-ignored-face ((,class :inherit shadow))) `(treemacs-git-modified-face ((,class :foreground ,yellow-alt-other))) `(treemacs-git-renamed-face ((,class :foreground ,cyan-alt-other))) `(treemacs-git-unmodified-face ((,class :foreground ,fg-main))) `(treemacs-git-untracked-face ((,class :foreground ,red-alt-other))) `(treemacs-help-column-face ((,class :inherit modus-theme-bold :foreground ,magenta-alt-other :underline t))) `(treemacs-help-title-face ((,class :foreground ,blue-alt-other))) `(treemacs-on-failure-pulse-face ((,class :inherit modus-theme-intense-red))) `(treemacs-on-success-pulse-face ((,class :inherit modus-theme-intense-green))) `(treemacs-root-face ((,class :inherit bold :foreground ,blue-alt-other :height 1.2 :underline t))) `(treemacs-root-remote-disconnected-face ((,class :inherit treemacs-root-remote-face :foreground ,yellow))) `(treemacs-root-remote-face ((,class :inherit treemacs-root-face :foreground ,magenta))) `(treemacs-root-remote-unreadable-face ((,class :inherit treemacs-root-unreadable-face))) `(treemacs-root-unreadable-face ((,class :inherit treemacs-root-face :strike-through t))) `(treemacs-tags-face ((,class :foreground ,blue-alt))) `(treemacs-tags-face ((,class :foreground ,magenta-alt))) ;;;;; tty-menu `(tty-menu-disabled-face ((,class :background ,bg-alt :foreground ,fg-alt))) `(tty-menu-enabled-face ((,class :inherit bold :background ,bg-alt :foreground ,fg-main))) `(tty-menu-selected-face ((,class :inherit modus-theme-intense-blue))) ;;;;; tuareg `(caml-types-def-face ((,class :inherit modus-theme-subtle-red))) `(caml-types-expr-face ((,class :inherit modus-theme-subtle-green))) `(caml-types-occ-face ((,class :inherit modus-theme-subtle-green))) `(caml-types-scope-face ((,class :inherit modus-theme-subtle-blue))) `(caml-types-typed-face ((,class :inherit modus-theme-subtle-magenta))) `(tuareg-font-double-semicolon-face ((,class :inherit font-lock-preprocessor-face))) `(tuareg-font-lock-attribute-face ((,class :inherit font-lock-function-name-face))) `(tuareg-font-lock-constructor-face ((,class :foreground ,fg-main))) `(tuareg-font-lock-error-face ((,class :inherit (modus-theme-intense-red bold)))) `(tuareg-font-lock-extension-node-face ((,class :background ,bg-alt :foreground ,magenta))) `(tuareg-font-lock-governing-face ((,class :inherit bold :foreground ,fg-main))) `(tuareg-font-lock-infix-extension-node-face ((,class :inherit font-lock-function-name-face))) `(tuareg-font-lock-interactive-directive-face ((,class :foreground ,fg-special-cold))) `(tuareg-font-lock-interactive-error-face ((,class :inherit error))) `(tuareg-font-lock-interactive-output-face ((,class :inherit font-lock-constant-face))) `(tuareg-font-lock-label-face ((,class :inherit font-lock-type-face))) `(tuareg-font-lock-line-number-face ((,class :foreground ,fg-special-warm))) `(tuareg-font-lock-module-face ((,class :inherit font-lock-builtin-face))) `(tuareg-font-lock-multistage-face ((,class :inherit bold :background ,bg-alt :foreground ,blue))) `(tuareg-font-lock-operator-face ((,class :inherit font-lock-preprocessor-face))) `(tuareg-opam-error-face ((,class :inherit error))) `(tuareg-opam-pkg-variable-name-face ((,class :inherit font-lock-variable-name-face))) ;;;;; typescript `(typescript-jsdoc-tag ((,class :inherit modus-theme-slant :foreground ,fg-special-mild))) `(typescript-jsdoc-type ((,class :inherit modus-theme-slant :foreground ,fg-special-calm))) `(typescript-jsdoc-value ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) ;;;;; undo-tree `(undo-tree-visualizer-active-branch-face ((,class :inherit bold :foreground ,fg-main))) `(undo-tree-visualizer-current-face ((,class :foreground ,blue-intense))) `(undo-tree-visualizer-default-face ((,class :inherit shadow))) `(undo-tree-visualizer-register-face ((,class :foreground ,magenta-intense))) `(undo-tree-visualizer-unmodified-face ((,class :foreground ,green-intense))) ;;;;; vc (vc-dir.el, vc-hooks.el) `(vc-dir-directory ((,class :foreground ,blue))) `(vc-dir-file ((,class :foreground ,fg-main))) `(vc-dir-header ((,class :foreground ,cyan-alt-other))) `(vc-dir-header-value ((,class :foreground ,magenta-alt-other))) `(vc-dir-mark-indicator ((,class :foreground ,blue-alt-other))) `(vc-dir-status-edited ((,class :foreground ,yellow))) `(vc-dir-status-ignored ((,class :foreground ,fg-unfocused))) `(vc-dir-status-up-to-date ((,class :foreground ,cyan))) `(vc-dir-status-warning ((,class :foreground ,red))) `(vc-conflict-state ((,class :inherit modus-theme-slant :foreground ,red-active))) `(vc-edited-state ((,class :foreground ,yellow-active))) `(vc-locally-added-state ((,class :foreground ,cyan-active))) `(vc-locked-state ((,class :foreground ,blue-active))) `(vc-missing-state ((,class :inherit modus-theme-slant :foreground ,magenta-active))) `(vc-needs-update-state ((,class :inherit modus-theme-slant :foreground ,green-active))) `(vc-removed-state ((,class :foreground ,red-active))) `(vc-state-base ((,class :foreground ,fg-active))) `(vc-up-to-date-state ((,class :foreground ,fg-special-cold))) ;;;;; vdiff `(vdiff-addition-face ((,class :inherit modus-theme-diff-added))) `(vdiff-change-face ((,class :inherit modus-theme-diff-changed))) `(vdiff-closed-fold-face ((,class :background ,bg-diff-neutral-1 :foreground ,fg-diff-neutral-1))) `(vdiff-refine-added ((,class :inherit modus-theme-diff-refine-added))) `(vdiff-refine-changed ((,class :inherit modus-theme-diff-refine-changed))) `(vdiff-subtraction-face ((,class :inherit modus-theme-diff-removed))) `(vdiff-target-face ((,class :inherit modus-theme-intense-blue))) ;;;;; vimish-fold `(vimish-fold-fringe ((,class :foreground ,cyan-active))) `(vimish-fold-mouse-face ((,class :inherit modus-theme-intense-blue))) `(vimish-fold-overlay ((,class :background ,bg-alt :foreground ,fg-special-cold))) ;;;;; visible-mark `(visible-mark-active ((,class :background ,blue-intense-bg))) `(visible-mark-face1 ((,class :background ,cyan-intense-bg))) `(visible-mark-face2 ((,class :background ,yellow-intense-bg))) `(visible-mark-forward-face1 ((,class :background ,magenta-intense-bg))) `(visible-mark-forward-face2 ((,class :background ,green-intense-bg))) ;;;;; visual-regexp `(vr/group-0 ((,class :inherit modus-theme-intense-blue))) `(vr/group-1 ((,class :inherit modus-theme-intense-magenta))) `(vr/group-2 ((,class :inherit modus-theme-intense-green))) `(vr/match-0 ((,class :inherit modus-theme-refine-yellow))) `(vr/match-1 ((,class :inherit modus-theme-refine-yellow))) `(vr/match-separator-face ((,class :inherit (modus-theme-intense-neutral bold)))) ;;;;; volatile-highlights `(vhl/default-face ((,class :background ,bg-alt :foreground ,blue-nuanced-fg :extend t))) ;;;;; vterm `(vterm-color-black ((,class :background "gray35" :foreground "gray35"))) `(vterm-color-blue ((,class :background ,blue :foreground ,blue))) `(vterm-color-cyan ((,class :background ,cyan :foreground ,cyan))) `(vterm-color-default ((,class :background ,bg-main :foreground ,fg-main))) `(vterm-color-green ((,class :background ,green :foreground ,green))) `(vterm-color-inverse-video ((,class :background ,bg-main :inverse-video t))) `(vterm-color-magenta ((,class :background ,magenta :foreground ,magenta))) `(vterm-color-red ((,class :background ,red :foreground ,red))) `(vterm-color-underline ((,class :foreground ,fg-special-warm :underline t))) `(vterm-color-white ((,class :background "gray65" :foreground "gray65"))) `(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow))) ;;;;; wcheck-mode `(wcheck-default-face ((,class :foreground ,red :underline t))) ;;;;; web-mode `(web-mode-annotation-face ((,class :inherit web-mode-comment-face))) `(web-mode-annotation-html-face ((,class :inherit web-mode-comment-face))) `(web-mode-annotation-tag-face ((,class :inherit web-mode-comment-face :underline t))) `(web-mode-block-attr-name-face ((,class :inherit font-lock-constant-face))) `(web-mode-block-attr-value-face ((,class :inherit font-lock-type-face))) `(web-mode-block-comment-face ((,class :inherit web-mode-comment-face))) `(web-mode-block-control-face ((,class :inherit font-lock-builtin-face))) `(web-mode-block-delimiter-face ((,class :foreground ,fg-main))) `(web-mode-block-face ((,class :background ,bg-dim))) `(web-mode-block-string-face ((,class :inherit web-mode-string-face))) `(web-mode-bold-face ((,class :inherit bold))) `(web-mode-builtin-face ((,class :inherit font-lock-builtin-face))) `(web-mode-comment-face ((,class :inherit font-lock-comment-face))) `(web-mode-comment-keyword-face ((,class :inherit font-lock-warning-face))) `(web-mode-constant-face ((,class :inherit font-lock-constant-face))) `(web-mode-css-at-rule-face ((,class :inherit font-lock-constant-face))) `(web-mode-css-color-face ((,class :inherit font-lock-builtin-face))) `(web-mode-css-comment-face ((,class :inherit web-mode-comment-face))) `(web-mode-css-function-face ((,class :inherit font-lock-builtin-face))) `(web-mode-css-priority-face ((,class :inherit font-lock-warning-face))) `(web-mode-css-property-name-face ((,class :inherit font-lock-keyword-face))) `(web-mode-css-pseudo-class-face ((,class :inherit font-lock-doc-face))) `(web-mode-css-selector-face ((,class :inherit font-lock-keyword-face))) `(web-mode-css-string-face ((,class :inherit web-mode-string-face))) `(web-mode-css-variable-face ((,class :foreground ,fg-special-warm))) `(web-mode-current-column-highlight-face ((,class :background ,bg-alt))) `(web-mode-current-element-highlight-face ((,class :inherit modus-theme-special-mild))) `(web-mode-doctype-face ((,class :inherit modus-theme-slant :foreground ,fg-special-cold))) `(web-mode-error-face ((,class :inherit modus-theme-intense-red))) `(web-mode-filter-face ((,class :inherit font-lock-function-name-face))) `(web-mode-folded-face ((,class :underline t))) `(web-mode-function-call-face ((,class :inherit font-lock-function-name-face))) `(web-mode-function-name-face ((,class :inherit font-lock-function-name-face))) `(web-mode-html-attr-custom-face ((,class :inherit font-lock-variable-name-face))) `(web-mode-html-attr-engine-face ((,class :foreground ,fg-main))) `(web-mode-html-attr-equal-face ((,class :foreground ,fg-main))) `(web-mode-html-attr-name-face ((,class :inherit font-lock-variable-name-face))) `(web-mode-html-attr-value-face ((,class :inherit font-lock-constant-face))) `(web-mode-html-entity-face ((,class :inherit font-lock-negation-char-face))) `(web-mode-html-tag-bracket-face ((,class :foreground ,fg-dim))) `(web-mode-html-tag-custom-face ((,class :inherit font-lock-function-name-face))) `(web-mode-html-tag-face ((,class :inherit font-lock-function-name-face))) `(web-mode-html-tag-namespaced-face ((,class :inherit font-lock-builtin-face))) `(web-mode-html-tag-unclosed-face ((,class :inherit error :underline t))) `(web-mode-inlay-face ((,class :background ,bg-alt))) `(web-mode-italic-face ((,class :inherit italic))) `(web-mode-javascript-comment-face ((,class :inherit web-mode-comment-face))) `(web-mode-javascript-string-face ((,class :inherit web-mode-string-face))) `(web-mode-json-comment-face ((,class :inherit web-mode-comment-face))) `(web-mode-json-context-face ((,class :inherit font-lock-builtin-face))) `(web-mode-json-key-face ((,class :foreground ,blue-nuanced-fg))) `(web-mode-json-string-face ((,class :inherit web-mode-string-face))) `(web-mode-jsx-depth-1-face ((,class :background ,blue-intense-bg :foreground ,fg-main))) `(web-mode-jsx-depth-2-face ((,class :background ,blue-subtle-bg :foreground ,fg-main))) `(web-mode-jsx-depth-3-face ((,class :background ,bg-special-cold :foreground ,fg-special-cold))) `(web-mode-jsx-depth-4-face ((,class :background ,bg-alt :foreground ,blue-refine-fg))) `(web-mode-jsx-depth-5-face ((,class :background ,bg-alt :foreground ,blue-nuanced-fg))) `(web-mode-keyword-face ((,class :inherit :inherit font-lock-keyword-face))) `(web-mode-param-name-face ((,class :inherit font-lock-function-name-face))) `(web-mode-part-comment-face ((,class :inherit web-mode-comment-face))) `(web-mode-part-face ((,class :inherit web-mode-block-face))) `(web-mode-part-string-face ((,class :inherit web-mode-string-face))) `(web-mode-preprocessor-face ((,class :inherit font-lock-preprocessor-face))) `(web-mode-script-face ((,class :inherit web-mode-part-face))) `(web-mode-sql-keyword-face ((,class :inherit font-lock-negation-char-face))) `(web-mode-string-face ((,class :inherit font-lock-string-face))) `(web-mode-style-face ((,class :inherit web-mode-part-face))) `(web-mode-symbol-face ((,class :inherit font-lock-constant-face))) `(web-mode-type-face ((,class :inherit font-lock-builtin-face))) `(web-mode-underline-face ((,class :underline t))) `(web-mode-variable-name-face ((,class :inherit font-lock-variable-name-face))) `(web-mode-warning-face ((,class :inherit font-lock-warning-face))) `(web-mode-whitespace-face ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) ;;;;; wgrep `(wgrep-delete-face ((,class :inherit modus-theme-refine-yellow))) `(wgrep-done-face ((,class :inherit modus-theme-refine-blue))) `(wgrep-face ((,class :inherit modus-theme-refine-green))) `(wgrep-file-face ((,class :foreground ,fg-special-warm))) `(wgrep-reject-face ((,class :inherit (modus-theme-intense-red bold)))) ;;;;; which-function-mode `(which-func ((,class :foreground ,magenta-active))) ;;;;; which-key `(which-key-command-description-face ((,class :foreground ,fg-main))) `(which-key-group-description-face ((,class :foreground ,magenta-alt))) `(which-key-highlighted-command-face ((,class :foreground ,yellow :underline t))) `(which-key-key-face ((,class :inherit bold :foreground ,blue-intense))) `(which-key-local-map-description-face ((,class :foreground ,fg-main))) `(which-key-note-face ((,class :foreground ,fg-special-warm))) `(which-key-separator-face ((,class :inherit shadow))) `(which-key-special-key-face ((,class :inherit bold :foreground ,orange-intense))) ;;;;; whitespace-mode `(whitespace-big-indent ((,class :inherit modus-theme-subtle-red))) `(whitespace-empty ((,class :inherit modus-theme-intense-magenta))) `(whitespace-hspace ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) `(whitespace-indentation ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) `(whitespace-line ((,class :background ,bg-alt))) `(whitespace-newline ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) `(whitespace-space ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) `(whitespace-space-after-tab ((,class :inherit modus-theme-subtle-magenta))) `(whitespace-space-before-tab ((,class :inherit modus-theme-subtle-cyan))) `(whitespace-tab ((,class :background ,bg-whitespace :foreground ,fg-whitespace))) `(whitespace-trailing ((,class :inherit modus-theme-intense-red))) ;;;;; window-divider-mode `(window-divider ((,class :foreground ,fg-window-divider-inner))) `(window-divider-first-pixel ((,class :foreground ,fg-window-divider-outer))) `(window-divider-last-pixel ((,class :foreground ,fg-window-divider-outer))) ;;;;; winum `(winum-face ((,class :inherit modus-theme-bold :foreground ,cyan-active))) ;;;;; writegood-mode `(writegood-duplicates-face ((,class :background ,bg-alt :foreground ,red-alt :underline t))) `(writegood-passive-voice-face ((,class :inherit modus-theme-lang-warning))) `(writegood-weasels-face ((,class :inherit modus-theme-lang-error))) ;;;;; woman `(woman-addition ((,class :foreground ,magenta-alt-other))) `(woman-bold ((,class :inherit bold :foreground ,magenta))) `(woman-italic ((,class :inherit italic :foreground ,cyan))) `(woman-unknown ((,class :inherit italic :foreground ,yellow))) ;;;;; xah-elisp-mode `(xah-elisp-at-symbol ((,class :inherit font-lock-warning-face))) `(xah-elisp-cap-variable ((,class :inherit font-lock-preprocessor-face))) `(xah-elisp-command-face ((,class :inherit font-lock-type-face))) `(xah-elisp-dollar-symbol ((,class :inherit font-lock-variable-name-face))) ;;;;; xref `(xref-file-header ((,class :inherit bold :foreground ,fg-special-cold))) `(xref-line-number ((,class :inherit shadow))) `(xref-match ((,class :inherit match))) ;;;;; yaml-mode `(yaml-tab-face ((,class :inherit modus-theme-intense-red))) ;;;;; yasnippet `(yas-field-highlight-face ((,class :background ,bg-hl-alt-intense))) ;;;;; ztree `(ztreep-arrow-face ((,class :foreground ,fg-inactive))) `(ztreep-diff-header-face ((,class :inherit bold :height 1.2 :foreground ,fg-special-cold))) `(ztreep-diff-header-small-face ((,class :inherit bold :foreground ,fg-special-mild))) `(ztreep-diff-model-add-face ((,class :foreground ,green))) `(ztreep-diff-model-diff-face ((,class :foreground ,red))) `(ztreep-diff-model-ignored-face ((,class :inherit shadow :strike-through t))) `(ztreep-diff-model-normal-face ((,class :inherit shadow))) `(ztreep-expand-sign-face ((,class :foreground ,blue))) `(ztreep-header-face ((,class :inherit bold :height 1.2 :foreground ,fg-special-cold))) `(ztreep-leaf-face ((,class :foreground ,cyan))) `(ztreep-node-count-children-face ((,class :foreground ,fg-special-warm))) `(ztreep-node-face ((,class :foreground ,fg-main)))) "Face specs for use with `modus-themes-theme'.") (defconst modus-themes-custom-variables '( ;;;; ansi-colors `(ansi-color-faces-vector [default bold shadow italic underline success warning error]) `(ansi-color-names-vector ["gray35" ,red ,green ,yellow ,blue ,magenta ,cyan "gray65"]) ;;;; awesome-tray `(awesome-tray-mode-line-active-color ,blue) `(awesome-tray-mode-line-inactive-color ,bg-active) ;;;; exwm `(exwm-floating-border-color ,fg-window-divider-inner) ;;;; flymake fringe indicators `(flymake-error-bitmap '(flymake-double-exclamation-mark modus-theme-fringe-red)) `(flymake-warning-bitmap '(exclamation-mark modus-theme-fringe-yellow)) `(flymake-note-bitmap '(exclamation-mark modus-theme-fringe-cyan)) ;;;; ibuffer `(ibuffer-deletion-face 'modus-theme-mark-del) `(ibuffer-filter-group-name-face 'modus-theme-mark-symbol) `(ibuffer-marked-face 'modus-theme-mark-sel) `(ibuffer-title-face 'modus-theme-pseudo-header) ;;;; highlight-tail `(highlight-tail-colors '((,green-subtle-bg . 0) (,cyan-subtle-bg . 20))) ;;;; hl-todo `(hl-todo-keyword-faces '(("HOLD" . ,yellow-alt) ("TODO" . ,magenta) ("NEXT" . ,magenta-alt-other) ("THEM" . ,magenta-alt) ("PROG" . ,cyan) ("OKAY" . ,cyan-alt) ("DONT" . ,green-alt) ("FAIL" . ,red) ("BUG" . ,red) ("DONE" . ,green) ("NOTE" . ,yellow-alt-other) ("KLUDGE" . ,yellow) ("HACK" . ,yellow) ("TEMP" . ,red-nuanced-fg) ("FIXME" . ,red-alt-other) ("XXX+" . ,red-alt) ("REVIEW" . ,cyan-alt-other) ("DEPRECATED" . ,blue-nuanced-fg))) ;;;; pdf-tools `(pdf-view-midnight-colors '(,fg-main . ,bg-dim)) ;;;; vc-annotate (C-x v g) `(vc-annotate-background nil) `(vc-annotate-background-mode nil) `(vc-annotate-color-map '((20 . ,red) (40 . ,magenta) (60 . ,magenta-alt) (80 . ,red-alt) (100 . ,yellow) (120 . ,yellow-alt) (140 . ,fg-special-warm) (160 . ,fg-special-mild) (180 . ,green) (200 . ,green-alt) (220 . ,cyan-alt-other) (240 . ,cyan-alt) (260 . ,cyan) (280 . ,fg-special-cold) (300 . ,blue) (320 . ,blue-alt) (340 . ,blue-alt-other) (360 . ,magenta-alt-other))) `(vc-annotate-very-old-color nil) ;;;; xterm-color `(xterm-color-names ["black" ,red ,green ,yellow ,blue ,magenta ,cyan "gray65"]) `(xterm-color-names-bright ["gray35" ,red-alt ,green-alt ,yellow-alt ,blue-alt ,magenta-alt ,cyan-alt "white"]) (if (eq modus-themes-org-blocks 'rainbow) `(org-src-block-faces ; TODO this list should be expanded `(("emacs-lisp" modus-theme-nuanced-magenta) ("elisp" modus-theme-nuanced-magenta) ("clojure" modus-theme-nuanced-magenta) ("clojurescript" modus-theme-nuanced-magenta) ("c" modus-theme-nuanced-blue) ("c++" modus-theme-nuanced-blue) ("sh" modus-theme-nuanced-green) ("shell" modus-theme-nuanced-green) ("html" modus-theme-nuanced-yellow) ("xml" modus-theme-nuanced-yellow) ("css" modus-theme-nuanced-red) ("scss" modus-theme-nuanced-red) ("python" modus-theme-nuanced-green) ("ipython" modus-theme-nuanced-magenta) ("r" modus-theme-nuanced-cyan) ("yaml" modus-theme-nuanced-cyan) ("conf" modus-theme-nuanced-cyan) ("docker" modus-theme-nuanced-cyan))) `(org-src-block-faces '()))) "Custom variables for `modus-themes-theme'.") ;;;###autoload (when load-file-name (let ((dir (file-name-directory load-file-name))) (unless (equal dir (expand-file-name "themes/" data-directory)) (add-to-list 'custom-theme-load-path dir)))) (provide 'modus-themes) ;;; modus-themes.el ends here --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=modus-vivendi-theme.el ;;; modus-vivendi-theme.el --- Accessible dark theme (WCAG AAA) -*- lexical-binding:t -*- ;; Copyright (C) 2019-2021 Free Software Foundation, Inc. ;; Author: Protesilaos Stavrou ;; URL: https://gitlab.com/protesilaos/modus-themes ;; Version: 1.2.3 ;; Package-Requires: ((emacs "26.1")) ;; Keywords: faces, theme, accessibility ;; This file is part of GNU Emacs. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or (at ;; your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; ;; Modus Vivendi is the dark variant of the Modus themes (Modus Operandi ;; is the light one). The themes are designed for color-contrast ;; accessibility. More specifically: ;; ;; 1. Provide a consistent minimum contrast ratio between background ;; and foreground values of 7:1 or higher. This meets the highest ;; such accessibility criterion per the guidelines of the Worldwide ;; Web Consortium's Working Group on Accessibility (WCAG AAA ;; standard). ;; ;; 2. Offer as close to full face coverage as possible. The list is ;; already quite long, with more additions to follow as part of the ;; ongoing development process. ;; ;; For a complete view of the project, also refer to the following files ;; (should be distributed in the same repository/directory as the ;; current item): ;; ;; - modus-themes.el (Main code shared between the themes) ;; - modus-operandi-theme.el (Light theme) ;;; Code: (eval-and-compile (unless (and (fboundp 'require-theme) (require-theme 'modus-themes t)) (require 'modus-themes))) (deftheme modus-vivendi "Accessible and customizable dark theme (WCAG AAA standard). Conforms with the highest legibility standard for color contrast between background and foreground in any given piece of text, which corresponds to a minimum contrast in relative luminance of 7:1.") (modus-themes-theme modus-vivendi) (provide-theme 'modus-vivendi) ;;; modus-vivendi-theme.el ends here --=-=-= Content-Type: application/vnd.lotus-organizer Content-Disposition: attachment; filename=modus-themes.org Content-Transfer-Encoding: base64 Iyt0aXRsZTogTW9kdXMgdGhlbWVzIGZvciBHTlUgRW1hY3MKIythdXRob3I6IFByb3Rlc2lsYW9z IFN0YXZyb3UKIytlbWFpbDogaW5mb0Bwcm90ZXNpbGFvcy5jb20KIytsYW5ndWFnZTogZW4KIytv cHRpb25zOiAnOnQgdG9jOm5pbCBhdXRob3I6dCBlbWFpbDp0CgojK21hY3JvOiBzdGFibGUtdmVy c2lvbiAxLjIuMwojK21hY3JvOiByZWxlYXNlLWRhdGUgMjAyMS0wMy0wNQojK21hY3JvOiBkZXZl bG9wbWVudC12ZXJzaW9uIDEuMy4wLWRldgojK21hY3JvOiBleHBvcnQtZGF0ZSAoZXZhbCAoZm9y bWF0LXRpbWUtc3RyaW5nICIlRiAlUiAleiIgKGN1cnJlbnQtdGltZSkpKQojK21hY3JvOiBmaWxl IEBAdGV4aW5mbzpAZmlsZXtAQCQxQEB0ZXhpbmZvOn1AQAojK21hY3JvOiBzcGFjZSBAQHRleGlu Zm86QDogQEAKIyBUaGUgImtiZCIgbWFjcm8gdHVybnMgS0JEIGludG8gQGtiZHtLQkR9LiAgQWRk aXRpb25hbGx5LCBpdAojIGVuY2xvc2VzIGNhc2Utc2Vuc2l0aXZlIHNwZWNpYWwga2V5cyAoU1BD LCBSRVQuLi4pIHdpdGhpbiBAa2V5ey4uLn0uCiMgSSBnb3QgdGhpcyBmcm9tIHRoZSBPcmcgc291 cmNlIGNvZGUuCiMrbWFjcm86IGtiZCAoZXZhbCAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCBuaWwp IChyZWdleHAgKHJlZ2V4cC1vcHQgJygiU1BDIiAiUkVUIiAiTEZEIiAiVEFCIiAiQlMiICJFU0Mi ICJERUxFVEUiICJTSElGVCIgIkN0cmwiICJNZXRhIiAiQWx0IiAiQ21kIiAiU3VwZXIiICJVUCIg IkxFRlQiICJSSUdIVCIgIkRPV04iKSAnd29yZHMpKSkgKGZvcm1hdCAiQEB0ZXhpbmZvOkBrYmR7 QEAlc0BAdGV4aW5mbzp9QEAiIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgcmVnZXhwICJAQHRl eGluZm86QGtleXtAQFxcJkBAdGV4aW5mbzp9QEAiICQxIHQpKSkpCgojK3RleGluZm9fZmlsZW5h bWU6IG1vZHVzLXRoZW1lcy5pbmZvCiMrdGV4aW5mb19kaXJfY2F0ZWdvcnk6IEVtYWNzIG1pc2Mg ZmVhdHVyZXMKIyt0ZXhpbmZvX2Rpcl90aXRsZTogTW9kdXMgVGhlbWVzOiAobW9kdXMtdGhlbWVz KQojK3RleGluZm9fZGlyX2Rlc2M6IEhpZ2hseSBhY2Nlc3NpYmxlIHRoZW1lcyAoV0NBRyBBQUEp CiMrdGV4aW5mb19oZWFkZXI6IEBzZXQgTUFJTlRBSU5FUlNJVEUgQHVyZWZ7aHR0cHM6Ly9wcm90 ZXNpbGFvcy5jb20sbWFpbnRhaW5lciB3ZWJwYWdlfQojK3RleGluZm9faGVhZGVyOiBAc2V0IE1B SU5UQUlORVIgUHJvdGVzaWxhb3MgU3RhdnJvdQojK3RleGluZm9faGVhZGVyOiBAc2V0IE1BSU5U QUlORVJFTUFJTCBAZW1haWx7aW5mb0Bwcm90ZXNpbGFvcy5jb219CiMrdGV4aW5mb19oZWFkZXI6 IEBzZXQgTUFJTlRBSU5FUkNPTlRBQ1QgQHVyZWZ7bWFpbHRvOmluZm9AcHJvdGVzaWxhb3MuY29t LGNvbnRhY3QgdGhlIG1haW50YWluZXJ9CgojK3RleGluZm86IEBpbnNlcnRjb3B5aW5nCgpUaGlz IG1hbnVhbCwgd3JpdHRlbiBieSBQcm90ZXNpbGFvcyBTdGF2cm91LCBkZXNjcmliZXMgdGhlIGN1 c3RvbWl6YXRpb24Kb3B0aW9ucyBmb3IgdGhlIH5tb2R1cy1vcGVyYW5kaX4gYW5kIH5tb2R1cy12 aXZlbmRpfiB0aGVtZXMsIGFuZCBwcm92aWRlcwpldmVyeSBvdGhlciBwaWVjZSBvZiBpbmZvcm1h dGlvbiBwZXJ0aW5lbnQgdG8gdGhlbS4KClRoZSBkb2N1bWVudGF0aW9uIGZ1cm5pc2hlZCBoZXJl aW4gY29ycmVzcG9uZHMgdG8gc3RhYmxlIHZlcnNpb24Ke3t7c3RhYmxlLXZlcnNpb259fX0sIHJl bGVhc2VkIG9uIHt7e3JlbGVhc2UtZGF0ZX19fS4gIEFueSByZWZlcmVuY2UgdG8gYSBuZXdlcgpm ZWF0dXJlIHdoaWNoIGRvZXMgbm90IHlldCBmb3JtIHBhcnQgb2YgdGhlIGxhdGVzdCB0YWdnZWQg Y29tbWl0LCBpcwpleHBsaWNpdGx5IG1hcmtlZCBhcyBzdWNoLgoKQ3VycmVudCBkZXZlbG9wbWVu dCB0YXJnZXQgaXMge3t7ZGV2ZWxvcG1lbnQtdmVyc2lvbn19fS4gIFRoaXMgbWFudWFsIHdhcwpi dWlsdCBvbiB7e3tleHBvcnQtZGF0ZX19fS4KCiMrdG9jOiBoZWFkbGluZXMgOCBpbnNlcnQgVE9D IGhlcmUsIHdpdGggZWlnaHQgaGVhZGxpbmUgbGV2ZWxzCgoqIENPUFlJTkcKOnByb3BlcnRpZXM6 Cjpjb3B5aW5nOiB0CjpjdXN0b21faWQ6IGg6YjE0YzNmY2ItMTNkZC00MTQ0LTlkOTItMmM1OGIz ZWQxNmQzCjplbmQ6CgpDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSAgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCgojK2JlZ2luX3F1b3RlClBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5 LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcwpkb2N1bWVudCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwKVmVyc2lvbiAxLjMgb3IgYW55 IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb247 IHdpdGggbm8gSW52YXJpYW50IFNlY3Rpb25zLCB3aXRoIG5vIEZyb250LUNvdmVyIFRleHRzLAph bmQgd2l0aCBubyBCYWNrLUNvdmVyIFRleHRzLgojK2VuZF9xdW90ZQoKKiBPdmVydmlldwo6cHJv cGVydGllczoKOmN1c3RvbV9pZDogaDpmMGYzZGJjYi02MDJkLTQwY2YtYjkxOC04ZjkyOWM0NDFi YWYKOmVuZDoKClRoZSBNb2R1cyB0aGVtZXMgYXJlIGRlc2lnbmVkIGZvciBhY2Nlc3NpYmxlIHJl YWRhYmlsaXR5LiAgVGhleSBjb25mb3JtCndpdGggdGhlIGhpZ2hlc3Qgc3RhbmRhcmQgZm9yIGNv bG9yIGNvbnRyYXN0IGJldHdlZW4gYW55IGdpdmVuCmNvbWJpbmF0aW9uIG9mIGJhY2tncm91bmQg YW5kIGZvcmVncm91bmQgdmFsdWVzLiAgVGhpcyBjb3JyZXNwb25kcyB0bwp0aGUgV0NBRyBBQUEg c3RhbmRhcmQsIHdoaWNoIHNwZWNpZmllcyBhIG1pbmltdW0gcmF0ZSBvZiBkaXN0YW5jZSBpbgpy ZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgNzoxLgoKTW9kdXMgT3BlcmFuZGkgKH5tb2R1cy1vcGVyYW5k aX4pIGlzIGEgbGlnaHQgdGhlbWUsIHdoaWxlIE1vZHVzIFZpdmVuZGkKKH5tb2R1cy12aXZlbmRp fikgaXMgZGFyay4gIEVhY2ggdGhlbWUncyBjb2xvciBwYWxldHRlIGlzIGRlc2lnbmVkIHRvIG1l ZXQKdGhlIG5lZWRzIG9mIHRoZSBudW1lcm91cyBpbnRlcmZhY2VzIHRoYXQgYXJlIHBvc3NpYmxl IGluIHRoZSBFbWFjcwpjb21wdXRpbmcgZW52aXJvbm1lbnQuCgpUaGUgb3ZlcmFyY2hpbmcgb2Jq ZWN0aXZlIG9mIHRoaXMgcHJvamVjdCBpcyB0byBhbHdheXMgb2ZmZXIgYWNjZXNzaWJsZQpjb2xv ciBjb21iaW5hdGlvbnMuICBUaGVyZSBzaGFsbCBuZXZlciBiZSBhIGNvbXByb21pc2Ugb24gdGhp cwpwcmluY2lwbGUuICBJZiB0aGVyZSBhcmlzZXMgYW4gaW5lc2NhcGFibGUgdHJhZGUtb2ZmIGJl dHdlZW4gcmVhZGFiaWxpdHkKYW5kIHN0eWxpc3RpYyBjb25zaWRlcmF0aW9ucywgd2Ugd2lsbCBh bHdheXMgb3B0IGZvciB0aGUgZm9ybWVyLgoKVG8gZW5zdXJlIHRoYXQgdXNlcnMgaGF2ZSBhIGNv bnNpc3RlbnRseSBhY2Nlc3NpYmxlIGV4cGVyaWVuY2UsIHRoZQp0aGVtZXMgc3RyaXZlIHRvIGFj aGlldmUgYXMgY2xvc2UgdG8gZnVsbCBmYWNlIGNvdmVyYWdlIGFzIHBvc3NpYmxlCihbWyNoOmE5 YzhmMjlkLTdmNzItNGI1NC1iNzRiLWRkZWZlMTVkNmExOV1bRmFjZSBjb3ZlcmFnZV1dKS4KClN0 YXJ0aW5nIHdpdGggdmVyc2lvbiAwLjEyLjAgYW5kIG9ud2FyZHMsIHRoZSB0aGVtZXMgYXJlIGJ1 aWx0IGludG8gR05VCkVtYWNzLgoKKiogSG93IGRvIHRoZSB0aGVtZXMgbG9vayBsaWtlCjpwcm9w ZXJ0aWVzOgo6Y3VzdG9tX2lkOiBoOjY5YjkyMDg5LTA2OWMtNGJhMS05ZDk0LWNjMzQxNWZjNGY4 Nwo6ZW5kOgojK2NpbmRleDogU2NyZWVuc2hvdHMKCkNoZWNrIHRoZSB3ZWIgcGFnZSB3aXRoIFtb aHR0cHM6Ly9wcm90ZXNpbGFvcy5jb20vbW9kdXMtdGhlbWVzLXBpY3R1cmVzL11bdGhlIHNjcmVl biBzaG90c11dLiAgVGhlcmUgYXJlIGxvdHMgb2Ygc2NlbmFyaW9zCm9uIGRpc3BsYXkgdGhhdCBk cmF3IGF0dGVudGlvbiB0byBkZXRhaWxzIGFuZCBpbXBvcnRhbnQgYXNwZWN0cyBpbiB0aGUKZGVz aWduIG9mIHRoZSB0aGVtZXMuICBUaGV5IGFsc28gc2hvd2Nhc2UgdGhlIG51bWVyb3VzIGN1c3Rv bWl6YXRpb24Kb3B0aW9ucy4KCltbI2g6YmYxYzgyZjItNDZjNy00ZWIyLWFkMDAtZGQxMWZkZDhi NTNmXVtDdXN0b21pemF0aW9uIG9wdGlvbnNdXS4KCioqIExlYXJuIGFib3V0IHRoZSBsYXRlc3Qg Y2hhbmdlcwo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDoyY2MzN2MzNi02YzFhLTQ4YjItYTAx MC0xMDUwYjI3MGVlMTgKOmVuZDoKIytjaW5kZXg6IENoYW5nZWxvZwoKUGxlYXNlIHJlZmVyIHRv IHRoZSBbW2h0dHBzOi8vcHJvdGVzaWxhb3MuY29tL21vZHVzLXRoZW1lcy1jaGFuZ2Vsb2ddW3dl YiBwYWdlIHdpdGggdGhlIGNoYW5nZSBsb2ddXS4gIEl0IGlzIGNvbXByZWhlbnNpdmUKYW5kIGNv dmVycyBldmVyeXRoaW5nIHRoYXQgZ29lcyBpbnRvIGV2ZXJ5IHRhZ2dlZCByZWxlYXNlIG9mIHRo ZSB0aGVtZXMuCgoqIEluc3RhbGxhdGlvbgo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDoxYWY4 NTM3My03ZjgxLTRjMzUtYWYyNS1hZmNlZjQ5MGMxMTEKOmVuZDoKClRoZSBNb2R1cyB0aGVtZXMg YXJlIGRpc3RyaWJ1dGVkIHdpdGggRW1hY3Mgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDI4LjEuCk9u IG9sZGVyIHZlcnNpb25zIG9mIEVtYWNzLCB0aGV5IGNhbiBiZSBpbnN0YWxsZWQgdXNpbmcgRW1h Y3MnIHBhY2thZ2UKbWFuYWdlciBvciBtYW51YWxseSBmcm9tIHRoZWlyIGNvZGUgcmVwb3NpdG9y eS4gIFRoZXJlIGFsc28gZXhpc3QKcGFja2FnZXMgZm9yIGRpc3RyaWJ1dGlvbnMgb2YgR05VL0xp bnV4LgoKKiogSW5zdGFsbCBtYW51YWxseSBmcm9tIHNvdXJjZQo6cHJvcGVydGllczoKOmN1c3Rv bV9pZDogaDpkYTM0MTRiNy0xNDI2LTQ2YjgtOGU3Ni00N2I4NDViNzZmZDAKOmVuZDoKCkluIHRo ZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2UgYXJlIGFzc3VtaW5nIHRoYXQgeW91ciBFbWFjcyBmaWxl cyBhcmUKc3RvcmVkIGluID1+Ly5lbWFjcy5kPSBhbmQgdGhhdCB5b3Ugd2FudCB0byBwbGFjZSB0 aGUgTW9kdXMgdGhlbWVzIGluCj1+Ly5lbWFjcy5kL21vZHVzLXRoZW1lcz0uCgoxLiBHZXQgdGhl IHNvdXJjZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGRlc2lyZWQgcGF0aCBieSBydW5uaW5nIHRoZQog ICBmb2xsb3dpbmcgaW4gdGhlIGNvbW1hbmQgbGluZSBzaGVsbDoKCjogJCBnaXQgY2xvbmUgaHR0 cHM6Ly9naXRsYWIuY29tL3Byb3Rlc2lsYW9zL21vZHVzLXRoZW1lcy5naXQgfi8uZW1hY3MuZC9t b2R1cy10aGVtZXMKCjIuIEFkZCB0aGF0IHBhdGggdG8geW91ciBrbm93biBFbGlzcCBsaWJyYXJp ZXMnIGxpc3QsIGJ5IHBsYWNpbmcgdGhpcwogICBzbmlwcGV0IG9mIEVtYWNzIExpc3AgaW4geW91 ciBpbml0IGZpbGUgKGUuZy4ge3t7ZmlsZShpbml0LmVsKX19fSk6CgojK2JlZ2luX3NyYyBlbWFj cy1saXNwCihhZGQtdG8tbGlzdCAnbG9hZC1wYXRoICJ+Ly5lbWFjcy5kL21vZHVzLXRoZW1lcyIp CiMrZW5kX3NyYwoKVGhlIHRoZW1lcyBhcmUgbm93IHJlYWR5IHRvIGJlIHVzZWQ6IFtbI2g6M2Yz YzM3MjgtMWIzNC00MzdkLTlkMGMtYjExMGY1YjE2MWE5XVtFbmFibGUgYW5kIGxvYWRdXS4KCioq IEluc3RhbGwgZnJvbSB0aGUgYXJjaGl2ZXMKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6YzRi MTAwODUtMTQ5Zi00M2UyLWJkNGQtMzQ3ZjMzYWVlMDU0CjplbmQ6CgpUaGUgPW1vZHVzLXRoZW1l cz0gcGFja2FnZSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgR05VIEVMUEEgYXJjaGl2ZSwgd2hpY2gK aXMgY29uZmlndXJlZCBieSBkZWZhdWx0LgoKUHJpb3IgdG8gcXVlcnlpbmcgYW55IHBhY2thZ2Ug YXJjaGl2ZSwgbWFrZSBzdXJlIHRvIGhhdmUgdXBkYXRlZCB0aGUKaW5kZXgsIHdpdGgge3t7a2Jk KE0teCBwYWNrYWdlLXJlZnJlc2gtY29udGVudHMpfX19LiAgVGhlbiBhbGwgeW91IG5lZWQgdG8g ZG8KaXMgdHlwZSB7e3trYmQoTS14IHBhY2thZ2UtaW5zdGFsbCl9fX0gYW5kIHNwZWNpZnkgdGhl IH5tb2R1cy10aGVtZXN+LgoKTm90ZSB0aGF0IG9sZGVyIHZlcnNpb25zIG9mIHRoZSB0aGVtZXMg dXNlZCB0byBiZSBkaXN0cmlidXRlZCBhcwpzdGFuZGFsb25lIHBhY2thZ2VzLiAgVGhpcyBwcmFj dGljZSBoYXMgYmVlbiBkaXNjb250aW51ZWQgc3RhcnRpbmcgd2l0aAp2ZXJzaW9uIDEuMC4wIG9m IHRoaXMgcHJvamVjdC4KCk9uY2UgaW5zdGFsbGVkLCB0aGUgdGhlbWVzIGFyZSByZWFkeSB0byBi ZSB1c2VkOiBbWyNoOjNmM2MzNzI4LTFiMzQtNDM3ZC05ZDBjLWIxMTBmNWIxNjFhOV1bRW5hYmxl IGFuZCBsb2FkXV0uCgoqKiBJbnN0YWxsIG9uIEdOVS9MaW51eAo6cHJvcGVydGllczoKOmN1c3Rv bV9pZDogaDpkYTY0MGViMS05NWRkLTRlODYtYmI0ZS0xMDI3YjI3ODg1ZjAKOmVuZDoKClRoZSB0 aGVtZXMgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gdGhlIGFyY2hpdmVzIG9mIHNvbWUgZGlzdHJp YnV0aW9ucyBvZgpHTlUvTGludXguICBUaGVzZSBzaG91bGQgY29ycmVzcG9uZCB0byBhIHRhZ2dl ZCByZWxlYXNlIHJhdGhlciB0aGFuCmJ1aWxkaW5nIGRpcmVjdGx5IGZyb20gdGhlIGxhdGVzdCBH aXQgY29tbWl0LiAgSXQgYWxsIGRlcGVuZHMgb24gdGhlCmRpc3RybydzIHBhY2thZ2luZyBwb2xp Y2llcy4KCioqKiBEZWJpYW4gMTEgQnVsbHNleWUKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6 N2U1NzAzNjAtOWVlNi00YmM1LThjMDQtOWRjMTE0MThhM2U0CjplbmQ6CgpUaGUgdGhlbWVzIGFy ZSBwYXJ0IG9mIERlYmlhbiAxMSBCdWxsc2V5ZS4gIEdldCB0aGVtIHdpdGg6CgojK2JlZ2luX3Ny YyBzaApzdWRvIGFwdCBpbnN0YWxsIGVscGEtbW9kdXMtdGhlbWVzCiMrZW5kX3NyYwoKVGhleSBh cmUgbm93IHJlYWR5IHRvIGJlIHVzZWQ6IFtbI2g6M2YzYzM3MjgtMWIzNC00MzdkLTlkMGMtYjEx MGY1YjE2MWE5XVtFbmFibGUgYW5kIGxvYWRdXS4KCioqKiBHTlUgR3VpeAo6cHJvcGVydGllczoK OmN1c3RvbV9pZDogaDphNGNhNTJjZC04NjlmLTQ2YTUtOWUxNi00ZDk2NjVmNWI4OGUKOmVuZDoK ClVzZXJzIG9mIEd1aXggY2FuIGdldCB0aGUgdGhlbWVzIHdpdGggdGhpcyBjb21tYW5kOgoKIyti ZWdpbl9zcmMgc2gKZ3VpeCBwYWNrYWdlIC1pIGVtYWNzLW1vZHVzLXRoZW1lcwojK2VuZF9zcmMK ClRoZXkgYXJlIG5vdyByZWFkeSB0byBiZSB1c2VkOiBbWyNoOjNmM2MzNzI4LTFiMzQtNDM3ZC05 ZDBjLWIxMTBmNWIxNjFhOV1bRW5hYmxlIGFuZCBsb2FkXV0uCgoqIEVuYWJsZSBhbmQgbG9hZAo6 cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDozZjNjMzcyOC0xYjM0LTQzN2QtOWQwYy1iMTEwZjVi MTYxYTkKOmVuZDoKIytmaW5kZXg6IG1vZHVzLXRoZW1lcy1sb2FkLXRoZW1lcwojK2ZpbmRleDog bW9kdXMtdGhlbWVzLXRvZ2dsZQojK2ZpbmRleDogbW9kdXMtdGhlbWVzLWxvYWQtb3BlcmFuZGkK IytmaW5kZXg6IG1vZHVzLXRoZW1lcy1sb2FkLXZpdmVuZGkKIytjaW5kZXg6IEVzc2VudGlhbCBj b25maWd1cmF0aW9uCiMrdmluZGV4OiBtb2R1cy10aGVtZXMtYWZ0ZXItbG9hZC10aGVtZS1ob29r CgpVc2VycyBvZiB0aGUgYnVpbHQtaW4gdGhlbWVzIGNhbiBsb2FkIGFuZCBhdXRvbWF0aWNhbGx5 IGVuYWJsZSB0aGUgdGhlbWUKb2YgdGhlaXIgcHJlZmVyZW5jZSBieSBhZGRpbmcgZWl0aGVyIGZv cm0gdG8gdGhlaXIgaW5pdCBmaWxlOgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAoobG9hZC10aGVt ZSAnbW9kdXMtb3BlcmFuZGkpICAgICAgICAgICAgOyBMaWdodCB0aGVtZQoobG9hZC10aGVtZSAn bW9kdXMtdml2ZW5kaSkgICAgICAgICAgICAgOyBEYXJrIHRoZW1lCiMrZW5kX3NyYwoKVGhpcyBp cyBhbGwgb25lIG5lZWRzLgoKVXNlcnMgb2YgcGFja2FnZWQgdmFyaWFudHMgb2YgdGhlIHRoZW1l cyBtdXN0IGFkZCBhIGZldyBtb3JlIGxpbmVzIHRvCmVuc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgd29y a3MgYXMgaW50ZW5kZWQuICBGaXJzdCwgb25lIGhhcyB0byByZXF1aXJlIHRoZQptYWluIGxpYnJh cnkgYmVmb3JlIGxvYWRpbmcgZWl0aGVyIHRoZW1lOgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAoo cmVxdWlyZSAnbW9kdXMtdGhlbWVzKQojK2VuZF9zcmMKClRoZW4gaXQgaXMgcmVjb21tZW5kZWQg dG8gbG9hZCB0aGUgaW5kaXZpZHVhbCB0aGVtZSBmaWxlcyB3aXRoIHRoZQpoZWxwZXIgZnVuY3Rp b24gfm1vZHVzLXRoZW1lcy1sb2FkLXRoZW1lc346CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCjs7 IExvYWQgdGhlIHRoZW1lIGZpbGVzIGJlZm9yZSBlbmFibGluZyBhIHRoZW1lIChlbHNlIHlvdSBn ZXQgYW4gZXJyb3IpLgoobW9kdXMtdGhlbWVzLWxvYWQtdGhlbWVzKQojK2VuZF9zcmMKCk9uY2Ug dGhlIGxpYnJhcmllcyB0aGF0IGRlZmluZSB0aGUgdGhlbWVzIGFyZSBlbmFibGVkLCBvbmUgY2Fu IGFjdGl2YXRlCmEgdGhlbWUgd2l0aCBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBleHByZXNzaW9u czoKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKG1vZHVzLXRoZW1lcy1sb2FkLW9wZXJhbmRpKSAg ICAgICAgICAgIDsgTGlnaHQgdGhlbWUKOzsgT1IKKG1vZHVzLXRoZW1lcy1sb2FkLXZpdmVuZGkp ICAgICAgICAgICAgIDsgRGFyayB0aGVtZQojK2VuZF9zcmMKCkNoYW5nZXMgdG8gdGhlIGF2YWls YWJsZSBjdXN0b21pemF0aW9uIG9wdGlvbnMgbXVzdCBhbHdheXMgYmUgZXZhbHVhdGVkCmJlZm9y ZSBsb2FkaW5nIGEgdGhlbWUgKFtbI2g6YmYxYzgyZjItNDZjNy00ZWIyLWFkMDAtZGQxMWZkZDhi NTNmXVtDdXN0b21pemF0aW9uIE9wdGlvbnNdXSkuICBUaGlzIGlzIGhvdyBhIGJhc2ljCnNldHVw IGNvdWxkIGxvb2sgbGlrZToKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKHJlcXVpcmUgJ21vZHVz LXRoZW1lcykKCjs7IFlvdXIgY3VzdG9taXNhdGlvbnMgaGVyZS4gIEZvciBleGFtcGxlOgooc2V0 cSBtb2R1cy10aGVtZXMtYm9sZC1jb25zdHJ1Y3RzIHQKICAgICAgbW9kdXMtdGhlbWVzLW1vZGUt bGluZSAnM2QpCgo7OyBMb2FkIHRoZSB0aGVtZSBmaWxlcyBiZWZvcmUgZW5hYmxpbmcgYSB0aGVt ZSAoZWxzZSB5b3UgZ2V0IGFuIGVycm9yKS4KKG1vZHVzLXRoZW1lcy1sb2FkLXRoZW1lcykKCjs7 IEVuYWJsZSB0aGUgdGhlbWUgb2YgeW91ciBwcmVmZXJlbmNlOgoobW9kdXMtdGhlbWVzLWxvYWQt b3BlcmFuZGkpCgo7OyBPcHRpb25hbGx5IGFkZCBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9nZ2xl IGJldHdlZW4gdGhlIHRoZW1lczoKKGRlZmluZS1rZXkgZ2xvYmFsLW1hcCAoa2JkICI8ZjU+Iikg Iydtb2R1cy10aGVtZXMtdG9nZ2xlKQojK2VuZF9zcmMKCltbI2g6ZTk3OTczNGMtYTllMS00Mzcz LTkzNjUtMGYyY2QzNjEwN2I4XVtTYW1wbGUgY29uZmlndXJhdGlvbiBmb3IgdXNlLXBhY2thZ2Vd XS4KCldpdGggdGhvc2UgZ3JhbnRlZCwgYmVhciBpbiBtaW5kIGEgY291cGxlIG9mIHRlY2huaWNh bCBwb2ludHMgb24Kfm1vZHVzLXRoZW1lcy1sb2FkLW9wZXJhbmRpfiBhbmQgfm1vZHVzLXRoZW1l cy1sb2FkLXZpdmVuZGl+LCBhcyB3ZWxsIGFzCn5tb2R1cy10aGVtZXMtdG9nZ2xlfiB3aGljaCBy ZWxpZXMgb24gdGhlbToKCjEuIFRob3NlIGZ1bmN0aW9ucyBjYWxsIH5sb2FkLXRoZW1lfi4gIFNv bWUgdXNlcnMgcHJlZmVyIHRvIG9wdCBmb3IKICAgfmVuYWJsZS10aGVtZX4gaW5zdGVhZCAoW1sj aDplNjg1NjBiMy03ZmIwLTQyYmMtYTE1MS1lMDE1OTQ4ZjhhMzVdW0RpZmZlcmVuY2VzIGJldHdl ZW4gbG9hZGluZyBhbmQgZW5hYmxpbmddXSkuCgoyLiBUaGUgZnVuY3Rpb25zIHdpbGwgcnVuIHRo ZSB+bW9kdXMtdGhlbWVzLWFmdGVyLWxvYWQtdGhlbWUtaG9va34gYXMKICAgdGhlaXIgZmluYWwg c3RlcC4gIFRoaXMgY2FuIGJlIGVtcGxveWVkIGZvciBiZXNwb2tlIGNvbmZpZ3VyYXRpb25zCiAg IChbWyNoOmY0NjUxZDU1LThjMDctNDZhYS1iNTJiLWJlZDFlNTM0NjNiYl1bQWR2YW5jZWQgY3Vz dG9taXphdGlvbiAoZG8taXQteW91cnNlbGYpXV0pLiAgRXhwZXJpZW5jZWQgdXNlcnMgbWF5IG5v dAogICB3aXNoIHRvIHJlbHkgb24gc3VjaCBhIGhvb2sgYW5kIHRoZSBmdW5jdGlvbnMgdGhhdCBy dW4gaXQ6IHRoZXkgbWF5CiAgIHByZWZlciBhIGN1c3RvbSBzb2x1dGlvbiAoW1sjaDo4NmY2OTA2 Yi1mMDkwLTQ2Y2MtOTgxNi0xZmU4YWViMzg3NzZdW0EgdGhlbWUtYWdub3N0aWMgaG9vayBmb3Ig dGhlbWUgbG9hZGluZ11dKS4KCioqIFNhbXBsZSBjb25maWd1cmF0aW9uIGZvciB1c2UtcGFja2Fn ZQo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDplOTc5NzM0Yy1hOWUxLTQzNzMtOTM2NS0wZjJj ZDM2MTA3YjgKOmVuZDoKIytjaW5kZXg6IHVzZS1wYWNrYWdlIGNvbmZpZ3VyYXRpb24KCkl0IGlz IGNvbW1vbiBmb3IgRW1hY3MgdXNlcnMgdG8gcmVseSBvbiB+dXNlLXBhY2thZ2V+IGZvciBkZWNs YXJpbmcKcGFja2FnZSBjb25maWd1cmF0aW9ucyBpbiB0aGVpciBzZXR1cC4gIFdlIHVzZSB0aGlz IGFzIGFuIGV4YW1wbGU6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCih1c2UtcGFja2FnZSBtb2R1 cy10aGVtZXMKICA6ZW5zdXJlICAgICAgICAgICAgICAgICAgICAgICAgIDsgb21pdCB0aGlzIHRv IHVzZSB0aGUgYnVpbHQtaW4gdGhlbWVzCiAgOmluaXQKICA7OyBBZGQgYWxsIHlvdXIgY3VzdG9t aXphdGlvbnMgcHJpb3IgdG8gbG9hZGluZyB0aGUgdGhlbWVzCiAgKHNldHEgbW9kdXMtdGhlbWVz LXNsYW50ZWQtY29uc3RydWN0cyB0CiAgICAgICAgbW9kdXMtdGhlbWVzLWJvbGQtY29uc3RydWN0 cyBuaWwpCgogIDs7IExvYWQgdGhlIHRoZW1lIGZpbGVzIGJlZm9yZSBlbmFibGluZyBhIHRoZW1l IChlbHNlIHlvdSBnZXQgYW4gZXJyb3IpLgogIChtb2R1cy10aGVtZXMtbG9hZC10aGVtZXMpCiAg OmNvbmZpZwogIDs7IExvYWQgdGhlIHRoZW1lIG9mIHlvdXIgY2hvaWNlOgogIChtb2R1cy10aGVt ZXMtbG9hZC1vcGVyYW5kaSkgOzsgT1IgKG1vZHVzLXRoZW1lcy1sb2FkLXZpdmVuZGkpCiAgOmJp bmQgKCI8ZjU+IiAuIG1vZHVzLXRoZW1lcy10b2dnbGUpKQojK2VuZF9zcmMKCltbI2g6ZTY4NTYw YjMtN2ZiMC00MmJjLWExNTEtZTAxNTk0OGY4YTM1XVtEaWZmZXJlbmNlcyBiZXR3ZWVuIGxvYWRp bmcgYW5kIGVuYWJsaW5nXV0uCgpOb3RlOiBtYWtlIHN1cmUgbm90IHRvIGN1c3RvbWl6ZSB0aGUg dmFyaWFibGUgfmN1c3RvbS10aGVtZS1sb2FkLXBhdGh+Cm9yIH5jdXN0b20tdGhlbWUtZGlyZWN0 b3J5fiBhZnRlciB0aGUgdGhlbWVzJyBwYWNrYWdlIGRlY2xhcmF0aW9uLiAgVGhhdAp3aWxsIGxl YWQgdG8gZmFpbHVyZXMgaW4gbG9hZGluZyB0aGUgZmlsZXMuICBJZiBlaXRoZXIgb3IgYm90aCBv ZiB0aG9zZQp2YXJpYWJsZXMgbmVlZCB0byBiZSBjaGFuZ2VkLCB0aGVpciB2YWx1ZXMgc2hvdWxk IGJlIGRlZmluZWQgYmVmb3JlIHRoZQpwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIHRoZSB0aGVtZXMu CgoqKiBEaWZmZXJlbmNlcyBiZXR3ZWVuIGxvYWRpbmcgYW5kIGVuYWJsaW5nCjpwcm9wZXJ0aWVz Ogo6Y3VzdG9tX2lkOiBoOmU2ODU2MGIzLTdmYjAtNDJiYy1hMTUxLWUwMTU5NDhmOGEzNQo6ZW5k OgojK2NpbmRleDogbG9hZC10aGVtZSBWUyBlbmFibGUtdGhlbWUKClRoZSByZWFzb24gd2UgcmVj b21tZW5kIH5sb2FkLXRoZW1lfiBpbnN0ZWFkIG9mIHRoZSBvdGhlciBvcHRpb24gb2YKfmVuYWJs ZS10aGVtZX4gaXMgdGhhdCB0aGUgZm9ybWVyIGRvZXMgYSBraW5kIG9mICJyZXNldCIgb24gdGhl IGZhY2UKc3BlY3MuICBJdCBxdWl0ZSBsaXRlcmFsbHkgbG9hZHMgKG9yIHJlLWxvYWRzKSB0aGUg dGhlbWUuICBXaGVyZWFzIHRoZQpsYXR0ZXIgc2ltcGx5IHB1dHMgYW4gYWxyZWFkeSBsb2FkZWQg dGhlbWUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCBvZgplbmFibGVkIGl0ZW1zLCByZS11c2luZyB3 aGF0ZXZlciBzdGF0ZSB3YXMgbGFzdCBsb2FkZWQuCgpBcyBzdWNoLCB+bG9hZC10aGVtZX4gcmVh ZHMgYWxsIGN1c3RvbWl6YXRpb25zIHRoYXQgbWF5IGhhcHBlbiBkdXJpbmcKYW55IGdpdmVuIEVt YWNzIHNlc3Npb246IGV2ZW4gYWZ0ZXIgdGhlIGluaXRpYWwgc2V0dXAgb2YgYSB0aGVtZS4KRXhh bXBsZXMgYXJlIGNhbGxzIHRvIH5jdXN0b20tc2V0LWZhY2VzfiwgYXMgd2VsbCBhcyBuZXcgdmFs dWVzIGFzc2lnbmVkCnRvIHRoZSBvcHRpb25zIHRoZSBNb2R1cyB0aGVtZXMgcHJvdmlkZSAoW1sj aDpiZjFjODJmMi00NmM3LTRlYjItYWQwMC1kZDExZmRkOGI1M2ZdW0N1c3RvbWl6YXRpb24gT3B0 aW9uc11dKS4KCk91ciB0ZXN0cyBzaG93IHRoYXQgfmVuYWJsZS10aGVtZX4gZG9lcyBub3QgcmVh ZCBzdWNoIHZhcmlhYmxlcyBhbmV3LCBzbwppdCBtaWdodCBhcHBlYXIgdG8gdGhlIHVuc3VzcGVj dGluZyB1c2VyIHRoYXQgdGhlIHRoZW1lcyBhcmUgc29tZWhvdwpicm9rZW4gd2hlbmV2ZXIgdGhl eSB0cnkgdG8gYXNzaWduIGEgbmV3IHZhbHVlIHRvIGEgY3VzdG9taXphdGlvbiBvcHRpb24Kb3Ig c29tZSBmYWNlLgoKVGhpcyAicmVzZXQiIHRoYXQgfmxvYWQtdGhlbWV+IGNvbmR1Y3RzIGRvZXMs IGhvd2V2ZXIsIGNvbWUgYXQgdGhlIGNvc3QKb2YgYmVpbmcgc29tZXdoYXQgc2xvd2VyIHRoYW4g fmVuYWJsZS10aGVtZX4uICBVc2VycyB3aG8gaGF2ZSBhIHN0YWJsZQpzZXR1cCBhbmQgd2hvIHNl bGRvbSB1cGRhdGUgdGhlaXIgdmFyaWFibGVzIGR1cmluZyBhIGdpdmVuIEVtYWNzCnNlc3Npb24s IGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIHNvbWV0aGluZyBsaWtlIHRoaXM6CgojK2JlZ2luX3NyYyBl bWFjcy1saXNwCihyZXF1aXJlICdtb2R1cy10aGVtZXMpCihsb2FkLXRoZW1lICdtb2R1cy1vcGVy YW5kaSB0IHQpCihsb2FkLXRoZW1lICdtb2R1cy12aXZlbmRpIHQgdCkKCihlbmFibGUtdGhlbWUg J21vZHVzLW9wZXJhbmRpKSA7OyBPUiAoZW5hYmxlLXRoZW1lICdtb2R1cy12aXZlbmRpKQojK2Vu ZF9zcmMKCltbI2g6ZTk3OTczNGMtYTllMS00MzczLTkzNjUtMGYyY2QzNjEwN2I4XVtTYW1wbGUg Y29uZmlndXJhdGlvbiBmb3IgdXNlLXBhY2thZ2VdXS4KCldpdGggdGhlIGFib3ZlIGdyYW50ZWQs IG90aGVyIHNlY3Rpb25zIG9mIHRoZSBtYW51YWwgZGlzY3VzcyBob3cgdG8KY29uZmlndXJlIGN1 c3RvbSBmYWNlcywgd2hlcmUgfmxvYWQtdGhlbWV+IGlzIGV4cGVjdGVkLCB0aG91Z2gKfmVuYWJs ZS10aGVtZX4gY291bGQgc3RpbGwgYXBwbHkgaW4gc3RhYmxlIHNldHVwczoKCltbI2g6MTQ4N2M2 MzEtZjRmZS00OTBkLThkNTgtZDcyZmZhM2JkNDc0XVtDYXNlLWJ5LWNhc2UgZmFjZSBzcGVjcyB1 c2luZyB0aGUgdGhlbWVzJyBwYWxldHRlXV0uCgpbWyNoOjUxYmEzNTQ3LWI4YzgtNDBkNi1iYTVh LTQ1ODY0NzdmZDRhZV1bRmFjZSBzcGVjcyBhdCBzY2FsZSB1c2luZyB0aGUgdGhlbWVzJyBwYWxl dHRlXV0uCgoqIEN1c3RvbWl6YXRpb24gT3B0aW9ucwo6cHJvcGVydGllczoKOmN1c3RvbV9pZDog aDpiZjFjODJmMi00NmM3LTRlYjItYWQwMC1kZDExZmRkOGI1M2YKOmVuZDoKClRoZSBNb2R1cyB0 aGVtZXMgYXJlIGhpZ2hseSBjb25maWd1cmFibGUsIHRob3VnaCB0aGV5IHNob3VsZCB3b3JrIHdl bGwKd2l0aG91dCBhbnkgZnVydGhlciB0d2Vha3MuICBCeSBkZWZhdWx0LCBhbGwgY3VzdG9taXph dGlvbiBvcHRpb25zIGFyZQpzZXQgdG8gbmlsLgoKUmVtZW1iZXIgdGhhdCBhbGwgY3VzdG9taXph dGlvbiBvcHRpb25zIG11c3QgYmUgZXZhbHVhdGVkIGJlZm9yZSBsb2FkaW5nCmEgdGhlbWUgKFtb I2g6M2YzYzM3MjgtMWIzNC00MzdkLTlkMGMtYjExMGY1YjE2MWE5XVtFbmFibGUgYW5kIGxvYWRd XSkuCgoqKiBPcHRpb24gZm9yIG1vcmUgYm9sZCBjb25zdHJ1Y3RzCjpwcm9wZXJ0aWVzOgo6YWx0 X3RpdGxlOiBCb2xkIGNvbnN0cnVjdHMKOmRlc2NyaXB0aW9uOiBUb2dnbGUgYm9sZCBjb25zdHJ1 Y3RzIGluIGNvZGUKOmN1c3RvbV9pZDogaDpiMjU3MTRmNi0wZmJlLTQxZjYtODliNS02OTEyZDMw NDA5MWUKOmVuZDoKIyt2aW5kZXg6IG1vZHVzLXRoZW1lcy1ib2xkLWNvbnN0cnVjdHMKClN5bWJv bDogfm1vZHVzLXRoZW1lcy1ib2xkLWNvbnN0cnVjdHN+CgpQb3NzaWJsZSB2YWx1ZXM6CgoxLiA9 bmlsPSAoZGVmYXVsdCkKMi4gPXQ9CgpUaGUgZGVmYXVsdCBpcyB0byB1c2UgYSBib2xkIHR5cG9n cmFwaGljIHdlaWdodCBvbmx5IHdoZW4gaXQgaXMKcmVxdWlyZWQuCgpXaXRoIGEgbm9uLW5pbCB2 YWx1ZSAoPXQ9KSBkaXNwbGF5IHNldmVyYWwgc3ludGFjdGljIGNvbnN0cnVjdHMgaW4gYm9sZAp3 ZWlnaHQuICBUaGlzIGNvbmNlcm5zIGtleXdvcmRzIGFuZCBvdGhlciBpbXBvcnRhbnQgYXNwZWN0 cyBvZiBjb2RlCnN5bnRheC4gIEl0IGFsc28gYWZmZWN0cyBjZXJ0YWluIG1vZGUgbGluZSBpbmRp Y2F0b3JzIGFuZCBjb21tYW5kLWxpbmUKcHJvbXB0cy4KCioqIE9wdGlvbiBmb3IgbW9yZSBzbGFu dGVkIGNvbnN0cnVjdHMKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IFNsYW50ZWQgY29uc3RydWN0 cwo6ZGVzY3JpcHRpb246IFRvZ2dsZSBzbGFudGVkIGNvbnN0cnVjdHMgKGl0YWxpY3MpIGluIGNv ZGUKOmN1c3RvbV9pZDogaDo5NzdjOTAwZC0wZDZkLTRkYmItODJkOS1jMmFhZTY5NTQzZDYKOmVu ZDoKIyt2aW5kZXg6IG1vZHVzLXRoZW1lcy1zbGFudGVkLWNvbnN0cnVjdHMKClN5bWJvbDogfm1v ZHVzLXRoZW1lcy1zbGFudGVkLWNvbnN0cnVjdHN+CgpQb3NzaWJsZSB2YWx1ZXM6CgoxLiA9bmls PSAoZGVmYXVsdCkKMi4gPXQ9CgpUaGUgZGVmYXVsdCBpcyB0byBub3QgdXNlIHNsYW50ZWQgdGV4 dCAoaXRhbGljcykgdW5sZXNzIGl0IGlzIGFic29sdXRlbHkKbmVjZXNzYXJ5LgoKV2l0aCBhIG5v bi1uaWwgdmFsdWUgKD10PSkgY2hvb3NlIHRvIHJlbmRlciBtb3JlIGZhY2VzIGluIHNsYW50ZWQg dGV4dC4KVGhpcyB0eXBpY2FsbHkgYWZmZWN0cyBkb2N1bWVudGF0aW9uIHN0cmluZ3MgYW5kIGNv ZGUgY29tbWVudHMuCgoqKiBPcHRpb24gZm9yIHN5bnRheCBoaWdobGlnaHRpbmcKOnByb3BlcnRp ZXM6CjphbHRfdGl0bGU6IFN5bnRheCBzdHlsZXMKOmRlc2NyaXB0aW9uOiBDaG9vc2UgdGhlIG92 ZXJhbGwgYWVzdGhldGljIG9mIGNvZGUgc3ludGF4CjpjdXN0b21faWQ6IGg6YzExOWQ3YjItZmNk NC00ZTQ0LTg5MGUtNWUyNTczM2Q1ZTUyCjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtc3lu dGF4CgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtc3ludGF4fgoKUG9zc2libGUgdmFsdWVzOgoKMS4g PW5pbD0gKGRlZmF1bHQpCjIuIH5mYWludH4KMy4gfnllbGxvdy1jb21tZW50c34KNC4gfmdyZWVu LXN0cmluZ3N+CjUuIH55ZWxsb3ctY29tbWVudHMtZ3JlZW4tc3RyaW5nc34KNi4gfmFsdC1zeW50 YXh+CjcuIH5hbHQtc3ludGF4LXllbGxvdy1jb21tZW50c34KOC4gfmZhaW50LXllbGxvdy1jb21t ZW50c34KClRoZSBkZWZhdWx0IHN0eWxlIChuaWwpIGZvciBjb2RlIHN5bnRheCBoaWdobGlnaHRp bmcgaXMgYSBiYWxhbmNlZApjb21iaW5hdGlvbiBvZiBjb2xvcnMgb24gdGhlIGN5YW4tYmx1ZS1t YWdlbnRhIHNpZGUgb2YgdGhlIHNwZWN0cnVtLgpUaGVyZSBpcyBsaXR0bGUgdG8gbm8gdXNlIG9m IGdyZWVucywgeWVsbG93cywgb3IgcmVkcywgZXhjZXB0IHdoZW4gaXQgaXMKbmVjZXNzYXJ5LgoK T3B0aW9uIH5mYWludH4gaXMgbGlrZSB0aGUgZGVmYXVsdCBpbiB0ZXJtcyBvZiB0aGUgY2hvaWNl IG9mIHBhbGV0dGUgYnV0CmFwcGxpZXMgZGVzYXR1cmF0ZWQgY29sb3IgdmFsdWVzLgoKT3B0aW9u IH55ZWxsb3ctY29tbWVudHN+IGFkZHMgYSB5ZWxsb3cgdGludCB0byBjb21tZW50cy4gIFRoZSBy ZXN0IG9mIHRoZQpzeW50YXggaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQuCgpPcHRpb24gfmdy ZWVuLXN0cmluZ3N+IHJlcGxhY2VzIHRoZSBibHVlL2N5YW4vY29sZCBjb2xvciB2YXJpYW50cyBp bgpzdHJpbmdzIHdpdGggZ3JlZW5lciBhbHRlcm5hdGl2ZXMuICBUaGUgcmVzdCBvZiB0aGUgc3lu dGF4IHJlbWFpbnMgdGhlCnNhbWUuCgpPcHRpb24gfnllbGxvdy1jb21tZW50cy1ncmVlbi1zdHJp bmdzfiBjb21iaW5lcyB5ZWxsb3cgY29tbWVudHMgd2l0aCBncmVlbgpzdHJpbmdzIGFuZCB0aGUg cmVzdCBvZiB0aGUgZGVmYXVsdCBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlLgoKT3B0aW9uIH5h bHQtc3ludGF4fiBleHBhbmRzIHRoZSBhY3RpdmUgc3BlY3RydW0gYnkgYXBwbHlpbmcgY29sb3IK Y29tYmluYXRpb25zIHdpdGggbW9yZSBjb250cmFzdGluZyBodWVzIGJldHdlZW4gdGhlbS4gIEV4 cGVjdCB0byBmaW5kCnJlZCBhbmQgZ3JlZW4gdmFyaWFudHMgaW4gYWRkaXRpb24gdG8gY3lhbiwg Ymx1ZSwgbWFnZW50YS4KCk9wdGlvbiB+YWx0LXN5bnRheC15ZWxsb3ctY29tbWVudHN+IGNvbWJp bmVzIH5hbHQtc3ludGF4fiB3aXRoCn55ZWxsb3ctY29tbWVudHN+LgoKT3B0aW9uIH5mYWludC15 ZWxsb3ctY29tbWVudHN+IGNvbWJpbmVzIHRoZSB+ZmFpbnR+IHN0eWxlIHdpdGgKfnllbGxvdy1j b21tZW50c34uCgoqKiBPcHRpb24gZm9yIG5vIGZvbnQgbWl4aW5nCjpwcm9wZXJ0aWVzOgo6YWx0 X3RpdGxlOiBObyBtaXhlZCBmb250cwo6ZGVzY3JpcHRpb246IFRvZ2dsZSBtaXhpbmcgb2YgZm9u dCBmYW1pbGllcwo6Y3VzdG9tX2lkOiBoOjExNWU2YzIzLWVlMzUtNGExNi04Y2VmLWUyZmNiYjA4 ZTI4Ygo6ZW5kOgojK3ZpbmRleDogbW9kdXMtdGhlbWVzLW5vLW1peGVkLWZvbnRzCgpTeW1ib2w6 IH5tb2R1cy10aGVtZXMtbm8tbWl4ZWQtZm9udHN+CgpQb3NzaWJsZSB2YWx1ZXM6CgoxLiA9bmls PSAoZGVmYXVsdCkKMi4gPXQ9CgpCeSBkZWZhdWx0LCB0aGUgdGhlbWVzIGNvbmZpZ3VyZSBzb21l IHNwYWNpbmctc2Vuc2l0aXZlIGZhY2VzIGxpa2UgT3JnCnRhYmxlcyBhbmQgY29kZSBibG9ja3Mg dG8gYWx3YXlzIGluaGVyaXQgZnJvbSB0aGUgfmZpeGVkLXBpdGNofiBmYWNlLgpUaGlzIGlzIHRv IGVuc3VyZSB0aGF0IHRob3NlIGNvbnN0cnVjdHMgcmVtYWluIG1vbm9zcGFjZWQgZXZlbiB3aGVu CnVzZXJzIG9wdCBmb3IgYSBtb2RlIHRoYXQgcmVtYXBzIHR5cGVmYWNlIGZhbWlsaWVzLCBzdWNo IGFzIHRoZSBidWlsdC1pbgp7e3trYmQoTS14IHZhcmlhYmxlLXBpdGNoLW1vZGUpfX19LiAgT3Ro ZXJ3aXNlIHRoZSBsYXlvdXQgd291bGQgYXBwZWFyCmJyb2tlbiwgZHVlIHRvIGhvdyBzcGFjaW5n IGlzIGRvbmUuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3VyLCBzZXQgdGhlCm9wdGlvbiB0byA9 dD0uCgpVc2VycyBtYXkgcHJlZmVyIHRvIHVzZSBhbm90aGVyIHBhY2thZ2UgZm9yIGhhbmRsaW5n IG1peGVkIHR5cGVmYWNlCmNvbmZpZ3VyYXRpb25zLCByYXRoZXIgdGhhbiBsZXR0aW5nIHRoZSB0 aGVtZSBkbyBpdCwgcGVyaGFwcyBiZWNhdXNlIGEKcHVycG9zZS1zcGVjaWZpYyBwYWNrYWdlIGhh cyBleHRyYSBmdW5jdGlvbmFsaXR5LiAgVHdvIHBvc3NpYmxlIG9wdGlvbnMKYXJlIH5vcmctdmFy aWFibGUtcGl0Y2h+IGFuZCB+bWl4ZWQtcGl0Y2h+LgoKW1sjaDpkZWZjZjRmYy04ZmE4LTRjMjkt YjEyZS03MTE5NTgyY2M5MjldW0ZvbnQgY29uZmlndXJhdGlvbnMgZm9yIE9yZyAoYW5kIG90aGVy cyldXS4KCioqIE9wdGlvbiBmb3IgbGlua3MKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IExpbmsg c3R5bGVzCjpkZXNjcmlwdGlvbjogQ2hvb3NlIGFtb25nIHNldmVyYWwgc3R5bGVzLCB3aXRoIG9y IHdpdGhvdXQgdW5kZXJsaW5lCjpjdXN0b21faWQ6IGg6YzExOWQ3YjItZmNkNC00ZTQ0LTg5MGUt NWUyNTczM2Q1ZTUyCjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtbGlua3MKClN5bWJvbDog fm1vZHVzLXRoZW1lcy1saW5rc34KClBvc3NpYmxlIHZhbHVlczoKCjEuID1uaWw9IChkZWZhdWx0 KQoyLiB+ZmFpbnR+CjMuIH5uZXV0cmFsLXVuZGVybGluZX4KNC4gfmZhaW50LW5ldXRyYWwtdW5k ZXJsaW5lfgo1LiB+bm8tdW5kZXJsaW5lfgo2LiB+dW5kZXJsaW5lLW9ubHl+CjcuIH5uZXV0cmFs LXVuZGVybGluZS1vbmx5fgoKVGhlIGRlZmF1bHQgc3R5bGUgKG5pbCkgZm9yIGxpbmtzIGlzIHRv IGFwcGx5IGFuIHVuZGVybGluZSBhbmQgYQpzYXR1cmF0ZWQgY29sb3IgdG8gdGhlIGFmZmVjdGVk IHRleHQuICBUaGUgY29sb3Igb2YgdGhlIHR3byBpcyB0aGUgc2FtZSwKd2hpY2ggbWFrZXMgdGhl IGxpbmsgZmFpcmx5IHByb21pbmVudC4KCk9wdGlvbiB+ZmFpbnR+IGZvbGxvd3MgdGhlIHNhbWUg YXBwcm9hY2ggYXMgdGhlIGRlZmF1bHQsIGJ1dCB1c2VzIGxlc3MKaW50ZW5zZSBjb2xvcnMuCgpP cHRpb24gfm5ldXRyYWwtdW5kZXJsaW5lfiBjaGFuZ2VzIHRoZSB1bmRlcmxpbmUncyBjb2xvciB0 byBhIHN1YnRsZSBncmF5LAp3aGlsZSByZXRhaW5pbmcgdGhlIGRlZmF1bHQgdGV4dCBjb2xvci4K Ck9wdGlvbiB+ZmFpbnQtbmV1dHJhbC11bmRlcmxpbmV+IGNvbWJpbmVzIGEgZGVzYXR1cmF0ZWQg dGV4dCBjb2xvciB3aXRoIGEKc3VidGxlIGdyYXkgdW5kZXJsaW5lLgoKT3B0aW9uIH5uby11bmRl cmxpbmV+IHJlbW92ZXMgbGluayB1bmRlcmxpbmVzIGFsdG9nZXRoZXIsIHdoaWxlIHJldGFpbmlu Zwp0aGVpciBvcmlnaW5hbCBmYWlybHkgdml2aWQgY29sb3IuCgpPcHRpb24gfnVuZGVybGluZS1v bmx5fiBhcHBsaWVzIGEgcHJvbWluZW50IHVuZGVybGluZSB3aGlsZSBtYWtpbmcgdGhlCmFmZmVj dGVkIHRleHQgY29sb3JsZXNzIChpdCB1c2VzIHRoZSBzYW1lIGZvcmVncm91bmQgYXMgdGhlIHRo ZW1lJ3MKZGVmYXVsdCkuCgpPcHRpb24gfm5ldXRyYWwtdW5kZXJsaW5lLW9ubHl+IG1ha2VzIHRo ZSB0ZXh0IGNvbG9ybGVzcyB3aGlsZSB1c2luZyBhCnN1YnRsZSBncmF5IHVuZGVybGluZSBiZWxv dyBpdC4KCk5PVEU6IFRoZSBwbGFjZW1lbnQgb2YgdGhlIHVuZGVybGluZSwgaS5lLiBpdHMgcHJv eGltaXR5IHRvIHRoZSBhZmZlY3RlZAp0ZXh0LCBpcyBjb250cm9sbGVkIGJ5IHRoZSBidWlsdC1p biB+eC11bmRlcmxpbmUtYXQtZGVzY2VudC1saW5lfiwKfngtdXNlLXVuZGVybGluZS1wb3NpdGlv bi1wcm9wZXJ0aWVzfiwgfnVuZGVybGluZS1taW5pbXVtLW9mZnNldH4uICBQbGVhc2UKcmVmZXIg dG8gdGhlaXIgZG9jdW1lbnRhdGlvbiBzdHJpbmdzLgoKKiogT3B0aW9uIGZvciBjb21tYW5kIHBy b21wdCBzdHlsZXMKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IENvbW1hbmQgcHJvbXB0cwo6ZGVz Y3JpcHRpb246IENob29zZSBhbW9uZyBwbGFpbiwgc3VidGxlLCBvciBpbnRlbnNlIHByb21wdHMK OmN1c3RvbV9pZDogaDpkYjVhOWE3Yy0yOTI4LTRhMjgtYjBmMC02ZjJiOWJkNTJiYTEKOmVuZDoK Iyt2aW5kZXg6IG1vZHVzLXRoZW1lcy1wcm9tcHRzCgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtcHJv bXB0c34KClBvc3NpYmxlIHZhbHVlczoKCjEuID1uaWw9IChkZWZhdWx0KQoyLiB+c3VidGxlLWFj Y2VudGVkfiAofnN1YnRsZX4gZXhpc3RzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQozLiB+ aW50ZW5zZS1hY2NlbnRlZH4gKH5pbnRlbnNlfiBleGlzdHMgZm9yIGJhY2t3YXJkIGNvbXBhdGli aWxpdHkpCjQuIH5zdWJ0bGUtZ3JheX4KNS4gfmludGVuc2UtZ3JheX4KClRoZSBkZWZhdWx0IGRv ZXMgbm90IHVzZSBhbnkgYmFja2dyb3VuZCBmb3IgbWluaWJ1ZmZlciBhbmQgY29tbWFuZCBsaW5l CnByb21wdHMuICBJdCByZWxpZXMgZXhjbHVzaXZlbHkgb24gYW4gYWNjZW50ZWQgZm9yZWdyb3Vu ZCBjb2xvci4KCk9wdGlvbnMgfnN1YnRsZS1hY2NlbnRlZH4gYW5kIH5pbnRlbnNlLWFjY2VudGVk fiB3aWxsIGNoYW5nZSBib3RoIHRoZQpiYWNrZ3JvdW5kIGFuZCB0aGUgZm9yZWdyb3VuZCB2YWx1 ZXMgdG8gdXNlIGFjY2VudGVkIGNvbG9yIGNvbWJpbmF0aW9ucwp0aGF0IGZvbGxvdyB0aGUgaHVl IG9mIHRoZSBkZWZhdWx0IHN0eWxlcycgZm9yZWdyb3VuZCAoZS5nLiB0aGUgZGVmYXVsdAptaW5p YnVmZmVyIHByb21wdCBpcyBjeWFuIHRleHQsIHNvIHRoZXNlIGNvbWJpbmF0aW9ucyB3aWxsIGlu dm9sdmVkIGEKY3lhbiBiYWNrZ3JvdW5kIGFuZCBhbiBhcHByb3ByaWF0ZSBjeWFuIGZvcmVncm91 bmQpLiAgVGhlIGRpZmZlcmVuY2UKYmV0d2VlbiB0aGUgdHdvIGlzIHRoYXQgdGhlIGxhdHRlciBo YXMgYSBtb3JlIHByb25vdW5jZWQvbm90aWNlYWJsZQplZmZlY3QgdGhhbiB0aGUgZm9ybWVyLgoK T3B0aW9ucyB+c3VidGxlLWdyYXl+LCB+aW50ZW5zZS1ncmF5fiBhcmUgbGlrZSB0aGVpciBhY2Nl bnRlZCBjb3VudGVycGFydHMsCmV4Y2VwdCB0aGV5IHVzZSBncmF5c2NhbGUgdmFsdWVzLgoKKiog T3B0aW9uIGZvciBtb2RlIGxpbmUgcHJlc2VudGF0aW9uCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxl OiBNb2RlIGxpbmUKOmRlc2NyaXB0aW9uOiBDaG9vc2UgYW1vbmcgc2V2ZXJhbCBzdHlsZXMsIHdp dGggb3Igd2l0aG91dCBib3JkZXJzCjpjdXN0b21faWQ6IGg6Mjc5NDNhZjYtZDk1MC00MmQwLWJj MjMtMTA2ZTQzZjUwYTI0CjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtbW9kZS1saW5lCgpT eW1ib2w6IH5tb2R1cy10aGVtZXMtbW9kZS1saW5lfgoKUG9zc2libGUgdmFsdWVzOgoKMS4gPW5p bD0gKGRlZmF1bHQpCjIuIH4zZH4KMy4gfm1vb2R5fgo0LiB+Ym9yZGVybGVzc34KNS4gfmJvcmRl cmxlc3MtM2R+CjYuIH5ib3JkZXJsZXNzLW1vb2R5fgoKVGhlIGRlZmF1bHQgcHJvZHVjZXMgYSB0 d28tZGltZW5zaW9uYWwgZWZmZWN0IGJvdGggZm9yIHRoZSBhY3RpdmUgYW5kCmluYWN0aXZlIG1v ZGVsaW5lcy4gIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gYXJlIGxpbWl0ZWQgdG8K ZGlzdGluY3Qgc2hhZGVzIG9mIGdyYXlzY2FsZSB2YWx1ZXMsIHdpdGggdGhlIGFjdGl2ZSBiZWlu ZyBtb3JlIGludGVuc2UKdGhhbiB0aGUgaW5hY3RpdmUuCgpPcHRpb24gfjNkfiB3aWxsIG1ha2Ug dGhlIGFjdGl2ZSBtb2RlbGluZSBsb29rIGxpa2UgYSB0aHJlZS1kaW1lbnNpb25hbApyZWN0YW5n bGUuICBJbmFjdGl2ZSBtb2RlbGluZXMgcmVtYWluIDJELCB0aG91Z2ggdGhleSBhcmUgc2xpZ2h0 bHkgdG9uZWQKZG93biByZWxhdGl2ZSB0byB0aGUgZGVmYXVsdC4gIFRoaXMgYWVzdGhldGljIGlz IHZpcnR1YWxseSB0aGUgc2FtZSBhcwp3aGF0IHlvdSBnZXQgd2hlbiB5b3UgcnVuIEVtYWNzIHdp dGhvdXQgYW55IGN1c3RvbWl6YXRpb25zICg9ZW1hY3MgLVE9IG9uCnRoZSBjb21tYW5kIGxpbmUp LgoKV2hpbGUgfm1vb2R5fiByZW1vdmVzIGFsbCBib3ggZWZmZWN0cyBmcm9tIHRoZSBtb2RlbGlu ZXMgYW5kIGFwcGxpZXMKdW5kZXJsaW5lIGFuZCBvdmVybGluZSBwcm9wZXJ0aWVzIGluc3RlYWQu ICBJdCBhbHNvIHRvbmVzIGRvd24gYSBiaXQgdGhlCmluYWN0aXZlIG1vZGVsaW5lcy4gIFRoaXMg aXMgbWVhbnQgdG8gb3B0aW1pemUgdGhpbmdzIGZvciB1c2Ugd2l0aCB0aGUKW1todHRwczovL2dp dGh1Yi5jb20vdGFyc2l1cy9tb29keV1bbW9vZHkgcGFja2FnZV1dIChoZXJlaW5hZnRlciByZWZl cnJlZCB0byBhcyAiTW9vZHkiKSwgdGhvdWdoIGl0IGNhbiB3b3JrCmZpbmUgZXZlbiB3aXRob3V0 IGl0LgoKVGhlIH5ib3JkZXJsZXNzfiBvcHRpb24gdXNlcyB0aGUgc2FtZSBjb2xvcnMgYXMgdGhl IGRlZmF1bHQgKG5pbCB2YWx1ZSksCmJ1dCByZW1vdmVzIHRoZSBib3JkZXIgZWZmZWN0LiAgVGhp cyBpcyBkb25lIGJ5IG1ha2luZyB0aGUgYm94IHByb3BlcnR5CnVzZSB0aGUgc2FtZSBjb2xvciBh cyB0aGUgYmFja2dyb3VuZCwgZWZmZWN0aXZlbHkgYmxlbmRpbmcgdGhlIHR3byBhbmQKY3JlYXRp bmcgc29tZSBwYWRkaW5nLgoKVGhlIH5ib3JkZXJsZXNzLTNkfiBhbmQgfmJvcmRlcmxlc3MtbW9v ZHl+IGFwcHJveGltYXRlIHRoZSB+M2R+IGFuZCB+bW9vZHl+Cm9wdGlvbnMgcmVzcGVjdGl2ZWx5 LCB3aGlsZSByZW1vdmluZyB0aGUgYm9yZGVycy4gIEhvd2V2ZXIsIHRvIGVuc3VyZQp0aGF0IHRo ZSBpbmFjdGl2ZSBtb2RlbGluZXMgcmVtYWluIHZpc2libGUsIHRoZXkgYXBwbHkgYSBzbGlnaHRs eSBtb3JlCnByb21pbmVudCBiYWNrZ3JvdW5kIHRvIHRoZW0gdGhhbiB3aGF0IHRoZWlyIGNvdW50 ZXJwYXJ0cyBkbyAoc2FtZQppbmFjdGl2ZSBiYWNrZ3JvdW5kIGFzIHdpdGggdGhlIGRlZmF1bHQp LgoKTm90ZSB0aGF0IE1vb2R5IGRvZXMgbm90IGV4cG9zZSBhbnkgZmFjZXMgdGhhdCB0aGUgdGhl bWVzIGNvdWxkIHN0eWxlCmRpcmVjdGx5LiAgSW5zdGVhZCBpdCByZS1wdXJwb3NlcyBleGlzdGlu ZyBvbmVzIHRvIHJlbmRlciBpdHMgdGFicyBhbmQKcmliYm9ucy4gIEFzIHN1Y2gsIHRoZXJlIG1h eSBiZSBjYXNlcyB3aGVyZSB0aGUgY29udHJhc3QgcmF0aW8gZmFsbHMKYmVsb3cgdGhlIDc6MSB0 YXJnZXQgdGhhdCB0aGUgdGhlbWVzIGNvbmZvcm0gd2l0aCAoV0NBRyBBQUEpLiAgVG8gaGVkZ2UK YWdhaW5zdCB0aGlzLCB3ZSBjb25maWd1cmUgYSBmYWxsYmFjayBmb3JlZ3JvdW5kIGZvciB0aGUg fm1vb2R5fiBvcHRpb24sCndoaWNoIHdpbGwgY29tZSBpbnRvIGVmZmVjdCB3aGVuIHRoZSBiYWNr Z3JvdW5kIG9mIHRoZSBtb2RlbGluZSBjaGFuZ2VzCnRvIHNvbWV0aGluZyBsZXNzIGFjY2Vzc2li bGUsIHN1Y2ggYXMgTW9vZHkgcmliYm9ucyAocmVhZCB0aGUgZG9jIHN0cmluZwpvZiB+c2V0LWZh Y2UtYXR0cmlidXRlfiwgc3BlY2lmaWNhbGx5IH46ZGlzdGFudC1mb3JlZ3JvdW5kfikuICBUaGlz IGZhbGxiYWNrCmlzIGFjdGl2YXRlZCB3aGVuIEVtYWNzIGRldGVybWluZXMgdGhhdCB0aGUgYmFj a2dyb3VuZCBhbmQgZm9yZWdyb3VuZCBvZgp0aGUgZ2l2ZW4gY29uc3RydWN0IGFyZSB0b28gY2xv c2UgdG8gZWFjaCBvdGhlciBpbiB0ZXJtcyBvZiBjb2xvcgpkaXN0YW5jZS4gIEluIGVmZmVjdCwg dXNlcnMgd291bGQgbmVlZCB0byBleHBlcmltZW50IHdpdGggdGhlIHZhcmlhYmxlCn5mYWNlLW5l YXItc2FtZS1jb2xvci10aHJlc2hvbGR+IHRvIHRyaWdnZXIgdGhlIGVmZmVjdC4gIFdlIGZpbmQg dGhhdCBhCnZhbHVlIG9mID00NTAwMD0gd2lsbCBzdWZmaWNlLCBjb250cmFyeSB0byB0aGUgZGVm YXVsdCA9MzAwMDA9LiAgRG8gbm90IHNldAp0aGUgdmFsdWUgdG9vIGhpZ2gsIGJlY2F1c2UgdGhh dCB3b3VsZCBoYXZlIHRoZSBhZHZlcnNlIGVmZmVjdCBvZiBhbHdheXMKb3ZlcnJpZGluZyB0aGUg ZGVmYXVsdCBjb2xvciAod2hpY2ggaGFzIGJlZW4gY2FyZWZ1bGx5IGRlc2lnbmVkIHRvIGJlCmhp Z2hseSBhY2Nlc3NpYmxlKS4KCkZ1cnRoZXJtb3JlLCBiZWNhdXNlIE1vb2R5IGV4cGVjdHMgYW4g dW5kZXJsaW5lIGFuZCBvdmVybGluZSBpbnN0ZWFkIG9mCmEgYm94IHN0eWxlLCBpdCBpcyBhZHZp c2VkIHlvdSBpbmNsdWRlIHRoaXMgaW4geW91ciBzZXR1cDoKCiMrYmVnaW5fc3JjIGVtYWNzLWxp c3AKKHNldHEgeC11bmRlcmxpbmUtYXQtZGVzY2VudC1saW5lIHQpCiMrZW5kX3NyYwoKKiogT3B0 aW9uIGZvciBjb21wbGV0aW9uIGZyYW1ld29yayBhZXN0aGV0aWNzCjpwcm9wZXJ0aWVzOgo6YWx0 X3RpdGxlOiBDb21wbGV0aW9uIFVJcwo6ZGVzY3JpcHRpb246IENob29zZSBhbW9uZyBzdGFuZGFy ZCwgbW9kZXJhdGUsIG9yIG9waW5pb25hdGVkIGxvb2tzCjpjdXN0b21faWQ6IGg6ZjFjMjBjMDIt N2IzNC00YzM1LTljNjUtOTkxNzBlZmIyODgyCjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMt Y29tcGxldGlvbnMKClN5bWJvbDogfm1vZHVzLXRoZW1lcy1jb21wbGV0aW9uc34KClBvc3NpYmxl IHZhbHVlczoKCjEuID1uaWw9IChkZWZhdWx0KQoyLiB+bW9kZXJhdGV+CjMuIH5vcGluaW9uYXRl ZH4KClRoaXMgaXMgYSBzcGVjaWFsIG9wdGlvbiB0aGF0IGhhcyBkaWZmZXJlbnQgZWZmZWN0cyBk ZXBlbmRpbmcgb24gdGhlCmNvbXBsZXRpb24gVUkuICBUaGUgaW50ZXJmYWNlcyBjYW4gYmUgZ3Jv dXBlZCBpbiB0d28gY2F0ZWdvcmllcywgYmFzZWQKb24gdGhlaXIgZGVmYXVsdCBhZXN0aGV0aWNz OiAoaSkgdGhvc2UgdGhhdCBvbmx5IG9yIG1vc3RseSB1c2UKZm9yZWdyb3VuZCBjb2xvcnMgZm9y IHRoZWlyIGludGVyYWN0aW9uIG1vZGVsLCBhbmQgKGlpKSB0aG9zZSB0aGF0CmNvbWJpbmUgYmFj a2dyb3VuZCBhbmQgZm9yZWdyb3VuZCB2YWx1ZXMgZm9yIHNvbWUgb2YgdGhlaXIgbWV0YXBob3Jz LgpUaGUgZm9ybWVyIGNhdGVnb3J5IGVuY29tcGFzc2VzIEljb21wbGV0ZSwgSWRvLCBTZWxlY3Ry dW0gYXMgd2VsbCBhcwpwYXR0ZXJuIG1hdGNoaW5nIHN0eWxlcyBsaWtlIE9yZGVybGVzcyBhbmQg Rmx4LiAgVGhlIGxhdHRlciBjb3ZlcnMgSGVsbSwKSXZ5LCBhbmQgc2ltaWxhci4KCkEgdmFsdWUg b2YgPW5pbD0gd2lsbCByZXNwZWN0IHRoZSBtZXRhcGhvcnMgb2YgZWFjaCBjb21wbGV0aW9uIGZy YW1ld29yay4KCk9wdGlvbiB+bW9kZXJhdGV+IGFwcGxpZXMgYSBjb21iaW5hdGlvbiBvZiBiYWNr Z3JvdW5kIGFuZCBmb3JlZ3JvdW5kIHRoYXQKaXMgZmFpcmx5IHN1YnRsZS4gIEZvciBJY29tcGxl dGUgYW5kIGZyaWVuZHMgdGhpcyBjb25zdGl0dXRlcyBhCmRlcGFydHVyZSBmcm9tIHRoZWlyIGRl ZmF1bHQgYWVzdGhldGljcywgaG93ZXZlciB0aGUgZGlmZmVyZW5jZSBpcwpzbWFsbC4gIFdoaWxl IEhlbG0sIEl2eSBldCBhbCBhcHBlYXIgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlaXIKb3Jp Z2luYWwgbG9va3MsIGFzIHRoZXkgYXJlIHRvbmVkIGRvd24gYSBiaXQuCgpPcHRpb24gfm9waW5p b25hdGVkfiB1c2VzIGNvbG9yIGNvbWJpbmF0aW9ucyB0aGF0IHJlZmFzaGlvbiB0aGUgY29tcGxl dGlvbgpVSS4gIEZvciB0aGUgSWNvbXBsZXRlIGNhbXAgdGhpcyBtZWFucyB0aGF0IGludGVuc2Ug YmFja2dyb3VuZCBhbmQKZm9yZWdyb3VuZCBjb21iaW5hdGlvbnMgYXJlIHVzZWQ6IGluIGVmZmVj dCB0aGVpciBsb29rcyBlbXVsYXRlIHRob3NlIG9mCkhlbG0sIEl2eSBhbmQgY28uIGluIHRoZWly IG9yaWdpbmFsIHN0eWxlLiAgV2hlcmVhcyB0aGUgb3RoZXIgZ3JvdXAgb2YKcGFja2FnZXMgd2ls bCByZXZlcnQgdG8gYW4gZXZlbiBtb3JlIG51YW5jZWQgYWVzdGhldGljIHdpdGggc29tZQphZGRp dGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNob2ljZSBvZiBodWVzLgoKVG8gYXBwcmVjaWF0ZSB0aGUg c2NvcGUgb2YgdGhpcyBjdXN0b21pemF0aW9uIG9wdGlvbiwgeW91IHNob3VsZCBzcGVuZApzb21l IHRpbWUgd2l0aCBldmVyeSBvbmUgb2YgdGhlID1uaWw9IChkZWZhdWx0KSwgfm1vZGVyYXRlfiwg YW5kIH5vcGluaW9uYXRlZH4KcG9zc2liaWxpdGllcy4KCioqIE9wdGlvbiBmb3IgZnJpbmdlIHZp c2liaWxpdHkKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IEZyaW5nZXMKOmRlc2NyaXB0aW9uOiBD aG9vc2UgYW1vbmcgaW52aXNpYmxlLCBzdWJ0bGUsIG9yIGludGVuc2UgZnJpbmdlIHN0eWxlcwo6 Y3VzdG9tX2lkOiBoOjE5ODNjM2ZjLTc0ZjYtNDRmMy1iOTE3LTk2N2M0MDNiZWJhZQo6ZW5kOgoj K3ZpbmRleDogbW9kdXMtdGhlbWVzLWZyaW5nZXMKClN5bWJvbDogfm1vZHVzLXRoZW1lcy1mcmlu Z2VzfgoKUG9zc2libGUgdmFsdWVzOgoKMS4gPW5pbD0gKGRlZmF1bHQpCjIuIH5zdWJ0bGV+CjMu IH5pbnRlbnNlfgoKVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBzYW1lIGNvbG9yIGFzIHRoYXQg b2YgdGhlIG1haW4gYmFja2dyb3VuZCwKbWVhbmluZyB0aGF0IHRoZSBmcmluZ2VzIGFyZSBub3Qg b2J2aW91cyB0aG91Z2ggdGhleSBzdGlsbCBvY2N1cHkgdGhlCnNwYWNlIGdpdmVuIHRvIHRoZW0g YnkgfmZyaW5nZS1tb2Rlfi4KCk9wdGlvbnMgfnN1YnRsZX4gYW5kIH5pbnRlbnNlfiBhcHBseSBh IGdyYXkgYmFja2dyb3VuZCwgbWFraW5nIHRoZSBmcmluZ2VzCnZpc2libGUuICBUaGUgZGlmZmVy ZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgb25lIG9mIGRlZ3JlZSwgYXMgdGhlaXIKbmFtZXMgaW1w bHkuCgoqKiBPcHRpb24gZm9yIGxhbmd1YWdlIGNoZWNrZXJzCjpwcm9wZXJ0aWVzOgo6YWx0X3Rp dGxlOiBMYW5ndWFnZSBjaGVja2Vycwo6ZGVzY3JpcHRpb246IENvbnRyb2wgdGhlIHN0eWxlIG9m IGxhbmd1YWdlIGNoZWNrZXJzL2xpbnRlcnMKOmN1c3RvbV9pZDogaDo0YjEzNzQzYS04ZWJmLTRk MmMtYTA0My1jY2ViYTEwYjFlYjQKOmVuZDoKIyt2aW5kZXg6IG1vZHVzLXRoZW1lcy1sYW5nLWNo ZWNrZXJzCgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtbGFuZy1jaGVja2Vyc34KClBvc3NpYmxlIHZh bHVlczoKCjEuID1uaWw9IChkZWZhdWx0KQoyLiB+c3VidGxlLWZvcmVncm91bmR+CjMuIH5pbnRl bnNlLWZvcmVncm91bmR+CjQuIH5zdHJhaWdodC11bmRlcmxpbmV+CjUuIH5zdWJ0bGUtZm9yZWdy b3VuZC1zdHJhaWdodC11bmRlcmxpbmV+CjYuIH5pbnRlbnNlLWZvcmVncm91bmQtc3RyYWlnaHQt dW5kZXJsaW5lfgo3LiB+Y29sb3JlZC1iYWNrZ3JvdW5kfgoKTmlsICh0aGUgZGVmYXVsdCkgYXBw bGllcyBhIGNvbG9yLWNvZGVkIHVuZGVybGluZSB0byB0aGUgYWZmZWN0ZWQgdGV4dCwKd2hpbGUg aXQgbGVhdmVzIHRoZSBvcmlnaW5hbCBmb3JlZ3JvdW5kIGluIHRhY3QuICBJZiB0aGUgZGlzcGxh eSBzcGVjCndoZXJlIEVtYWNzIHJ1bnMgaW4gaGFzIHN1cHBvcnQgZm9yIGl0IChlLmcuIEVtYWNz IEdVSSksIHRoZSB1bmRlcmxpbmUncwpzdHlsZSBpcyB0aGF0IG9mIGEgd2F2ZSwgb3RoZXJ3aXNl IGl0IGlzIGEgc3RyYWlnaHQgbGluZS4KCk9wdGlvbnMgfnN1YnRsZS1mb3JlZ3JvdW5kfiBhbmQg fmludGVuc2UtZm9yZWdyb3VuZH4gZm9sbG93IHRoZSBzYW1lCmNvbG9yLWNvZGluZyBwYXR0ZXJu IGFuZCB3YXZ5IHVuZGVybGluZSBvZiB0aGUgZGVmYXVsdCwgd2hpbGUgZXh0ZW5kaW5nCml0IHdp dGggYSBjb3JyZXNwb25kaW5nIGZvcmVncm91bmQgdmFsdWUgZm9yIHRoZSBhZmZlY3RlZCB0ZXh0 LiAgVGhlCmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIG9wdGlvbnMgaXMgb25lIG9mIGRlZ3Jl ZSwgYXMgdGhlaXIgbmFtZXMKc3VnZ2VzdC4KCk9wdGlvbiB+c3RyYWlnaHQtdW5kZXJsaW5lfiBp cyBsaWtlIHRoZSBkZWZhdWx0IGJ1dCBhbHdheXMgYXBwbGllcyBhCnN0cmFpZ2h0IGxpbmUgdW5k ZXIgdGhlIGFmZmVjdGVkIHRleHQuICBTYW1lIHByaW5jaXBsZSBmb3IKfnN1YnRsZS1mb3JlZ3Jv dW5kLXN0cmFpZ2h0LXVuZGVybGluZX4gYW5kIGl0cyBjb3VudGVycGFydAp+aW50ZW5zZS1mb3Jl Z3JvdW5kLXN0cmFpZ2h0LXVuZGVybGluZX4uCgpPcHRpb24gfmNvbG9yZWQtYmFja2dyb3VuZH4g dXNlcyBhIHN0cmFpZ2h0IHVuZGVybGluZSwgYSB0aW50ZWQKYmFja2dyb3VuZCwgYW5kIGEgc3Vp dGFibGUgZm9yZWdyb3VuZC4gIEFsbCBhcmUgY29sb3ItY29kZWQuICBUaGlzIGlzCnRoZSBtb3N0 IGludGVuc2UgY29tYmluYXRpb24gb2YgZmFjZSBwcm9wZXJ0aWVzLgoKVGhlIHByZXNlbnQgdmFy aWFibGUgYWZmZWN0cyBwYWNrYWdlcyBhbmQvb3IgZmFjZSBncm91cHMgc3VjaCBhcyB0aG9zZQpv ZiA9Zmx5c3BlbGw9LCA9Zmx5bWFrZT0sID1mbHljaGVjaz0sIH5hcnRib2xsb2Nrcy1tb2Rlfiwg YW5kIH53cml0ZWdvb2QtbW9kZX4uCgpOT1RFOiBUaGUgcGxhY2VtZW50IG9mIHRoZSBzdHJhaWdo dCB1bmRlcmxpbmUsIHRob3VnaCBub3QgdGhlIHdhdmUKc3R5bGUsIGlzIGNvbnRyb2xsZWQgYnkg dGhlIGJ1aWx0LWluIH54LXVuZGVybGluZS1hdC1kZXNjZW50LWxpbmV+LAp+eC11c2UtdW5kZXJs aW5lLXBvc2l0aW9uLXByb3BlcnRpZXN+LCB+dW5kZXJsaW5lLW1pbmltdW0tb2Zmc2V0fi4gIFBs ZWFzZQpyZWZlciB0byB0aGVpciBkb2N1bWVudGF0aW9uIHN0cmluZ3MuCgoqKiBPcHRpb24gZm9y IGxpbmUgaGlnaGxpZ2h0aW5nIChobC1saW5lLW1vZGUpCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxl OiBMaW5lIGhpZ2hsaWdodGluZwo6ZGVzY3JpcHRpb246IFRvZ2dsZSBpbnRlbnNlIHN0eWxlIGZv ciBjdXJyZW50IGxpbmUgaGlnaGxpZ2h0aW5nCjpjdXN0b21faWQ6IGg6MWRiYTFjZmUtZDA3OS00 YzEzLWE4MTAtZjc2OGU4Nzg5MTc3CjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtaW50ZW5z ZS1obC1saW5lCgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtaW50ZW5zZS1obC1saW5lfgoKUG9zc2li bGUgdmFsdWVzOgoKMS4gPW5pbD0gKGRlZmF1bHQpCjIuID10PQoKVGhlIGRlZmF1bHQgaXMgdG8g dXNlIGEgc3VidGxlIGdyYXkgYmFja2dyb3VuZCBmb3IgfmhsLWxpbmUtbW9kZX4gYW5kIGl0cwpn bG9iYWwgZXF1aXZhbGVudC4KCldpdGggYSBub24tbmlsIHZhbHVlICg9dD0pIHVzZSBhIG1vcmUg cHJvbWluZW50IGJhY2tncm91bmQgY29sb3IgaW5zdGVhZC4KClRoaXMgYWZmZWN0cyBzZXZlcmFs IHBhY2thZ2VzIHRoYXQgZW5hYmxlIH5obC1saW5lLW1vZGV+LCBzdWNoIGFzID1lbGZlZWQ9CmFu ZCA9bXU0ZT0uCgoqKiBPcHRpb24gZm9yIGxpbmUgbnVtYmVycyAoZGlzcGxheS1saW5lLW51bWJl cnMtbW9kZSkKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IExpbmUgbnVtYmVycwo6ZGVzY3JpcHRp b246IFRvZ2dsZSBzdWJ0bGUgc3R5bGUgZm9yIGxpbmUgbnVtYmVycwo6Y3VzdG9tX2lkOiBoOjhj NGE2MjMwLTJlNDMtNGFhMi1hNjMxLTNiNzE3OTM5MmUwOQo6ZW5kOgojK3ZpbmRleDogbW9kdXMt dGhlbWVzLXN1YnRsZS1saW5lLW51bWJlcnMKClN5bWJvbDogfm1vZHVzLXRoZW1lcy1zdWJ0bGUt bGluZS1udW1iZXJzfgoKUG9zc2libGUgdmFsdWU6CgoxLiA9bmlsPSAoZGVmYXVsdCkKMi4gPXQ9 CgpUaGUgZGVmYXVsdCBzdHlsZSBmb3IgfmRpc3BsYXktbGluZS1udW1iZXJzLW1vZGV+IGFuZCBp dHMgZ2xvYmFsIHZhcmlhbnQKaXMgdG8gYXBwbHkgYSBzdWJ0bGUgZ3JheSBiYWNrZ3JvdW5kIHRv IHRoZSBsaW5lIG51bWJlcnMuICBUaGUgY3VycmVudApsaW5lIGhhcyBhIG1vcmUgcHJvbm91bmNl ZCBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbWJpbmF0aW9uIHRvCmJyaW5nIG1vcmUgYXR0 ZW50aW9uIHRvIGl0c2VsZi4KClNpbWlsYXJseSwgdGhlIGZhY2VzIGZvciB+ZGlzcGxheS1saW5l LW51bWJlcnMtbWFqb3ItdGlja34gYW5kIGl0cwpjb3VudGVycGFydCB+ZGlzcGxheS1saW5lLW51 bWJlcnMtbWlub3ItdGlja34gdXNlIGFwcHJvcHJpYXRlIHN0eWxlcyB0aGF0Cmludm9sdmUgYSBi ZXNwb2tlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29tYmluYXRpb24uCgpXaXRoIGEgbm9u LW5pbCB2YWx1ZSAoPXQ9KSwgbGluZSBudW1iZXJzIGhhdmUgbm8gYmFja2dyb3VuZCBvZiB0aGVp ciBvd24uCkluc3RlYWQgdGhleSByZXRhaW4gdGhlIHByaW1hcnkgYmFja2dyb3VuZCBvZiB0aGUg dGhlbWUsIGJsZW5kaW5nIHdpdGgKdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4gIEZvcmVncm91bmQg dmFsdWVzIGZvciBhbGwgcmVsZXZhbnQgZmFjZXMgYXJlCnVwZGF0ZWQgdG8gYWNjb21tb2RhdGUg dGhpcyBhZXN0aGV0aWMuCgoqKiBPcHRpb24gZm9yIHBhcmVudGhlc2lzIG1hdGNoaW5nIChzaG93 LXBhcmVuLW1vZGUpCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxlOiBNYXRjaGluZyBwYXJlbnRoZXNl cwo6ZGVzY3JpcHRpb246IENob29zZSBiZXR3ZWVuIHZhcmlvdXMgc3R5bGVzIGZvciBtYXRjaGlu ZyBkZWxpbWl0ZXJzL3BhcmVudGhlc2VzCjpjdXN0b21faWQ6IGg6ZTY2YTdlNGQtYTUxMi00YmM3 LTlmODYtZmJiYjU5MjNiZjM3CjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtcGFyZW4tbWF0 Y2gKClN5bWJvbDogfm1vZHVzLXRoZW1lcy1wYXJlbi1tYXRjaH4KClBvc3NpYmxlIHZhbHVlczoK CjEuID1uaWw9IChkZWZhdWx0KQoyLiB+c3VidGxlLWJvbGR+CjMuIH5pbnRlbnNlfgo0LiB+aW50 ZW5zZS1ib2xkfgoKTmlsIG1lYW5zIHRvIHVzZSBhIHN1YnRsZSB0aW50ZWQgYmFja2dyb3VuZCBj b2xvciBmb3IgdGhlIG1hdGNoaW5nCmRlbGltaXRlcnMuCgpPcHRpb24gfmludGVuc2V+IGFwcGxp ZXMgYSBzYXR1cmF0ZWQgYmFja2dyb3VuZCBjb2xvci4KCk9wdGlvbiB+c3VidGxlLWJvbGR+IGlz IHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCBidXQgYWxzbyBtYWtlcyB1c2Ugb2YKYm9sZCB0eXBv Z3JhcGhpYyB3ZWlnaHQgKGluaGVyaXRzIHRoZSB+Ym9sZH4gZmFjZSkuCgpPcHRpb24gfmludGVu c2UtYm9sZH4gaXMgdGhlIHNhbWUgYXMgfmludGVuc2V+LCB3aGlsZSBpdCBhbHNvIHVzZXMgYSBi b2xkCndlaWdodC4KClRoaXMgY3VzdG9taXphdGlvbiB2YXJpYWJsZSBhZmZlY3RzIHRvb2xzIHN1 Y2ggYXMgdGhlIGJ1aWx0LWluCn5zaG93LXBhcmVuLW1vZGV+IGFuZCB0aGUgPXNtYXJ0cGFyZW5z PSBwYWNrYWdlLgoKKiogT3B0aW9uIGZvciBhY3RpdmUgcmVnaW9uCjpwcm9wZXJ0aWVzOgo6YWx0 X3RpdGxlOiBBY3RpdmUgcmVnaW9uCjpkZXNjcmlwdGlvbjogQ2hvb3NlIGJldHdlZW4gdmFyaW91 cyBzdHlsZXMgZm9yIHRoZSBhY3RpdmUgcmVnaW9uCjpjdXN0b21faWQ6IGg6NjA3OTgwNjMtYjRh ZC00NWVhLWI5YTctZmY3YjVjMGFiNzRjCjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtcmVn aW9uCgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtcmVnaW9ufgoKUG9zc2libGUgdmFsdWVzOgoKMS4g PW5pbD0gKGRlZmF1bHQpCjIuIH5uby1leHRlbmR+CjMuIH5iZy1vbmx5fgo0LiB+Ymctb25seS1u by1leHRlbmR+CgpOaWwgbWVhbnMgdG8gb25seSB1c2UgYSBwcm9taW5lbnQgZ3JheSBiYWNrZ3Jv dW5kIHdpdGggYSBuZXV0cmFsCmZvcmVncm91bmQuICBUaGUgZm9yZWdyb3VuZCBvdmVycmlkZXMg YWxsIHN5bnRheCBoaWdobGlnaHRpbmcuICBUaGUKcmVnaW9uIGV4dGVuZHMgdG8gdGhlIGVkZ2Ug b2YgdGhlIHdpbmRvdy4KCk9wdGlvbiB+bm8tZXh0ZW5kfiBwcmVzZXJ2ZXMgdGhlIGRlZmF1bHQg YWVzdGhldGljIGJ1dCBwcmV2ZW50cyB0aGUgcmVnaW9uCmZyb20gZXh0ZW5kaW5nIHRvIHRoZSBl ZGdlIG9mIHRoZSB3aW5kb3cuCgpPcHRpb24gfmJnLW9ubHl+IGFwcGxpZXMgYSBmYWludCB0aW50 ZWQgYmFja2dyb3VuZCB0aGF0IGlzIGRpc3RpbmN0IGZyb20KYWxsIG90aGVycyB1c2VkIGluIHRo ZSB0aGVtZSwgd2hpbGUgaXQgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IGV4aXN0aW5nCmNvbG9ycy4g IEl0IGV4dGVuZHMgdG8gdGhlIGVkZ2Ugb2YgdGhlIHdpbmRvdy4KCk9wdGlvbiB+Ymctb25seS1u by1leHRlbmR+IGlzIGEgY29tYmluYXRpb24gb2YgdGhlIH5iZy1vbmx5fiBhbmQgfm5vLWV4dGVu ZH4Kb3B0aW9ucy4KCioqIE9wdGlvbiBmb3IgZGlmZiBidWZmZXIgbG9va3MKOnByb3BlcnRpZXM6 CjphbHRfdGl0bGU6IERpZmZzCjpkZXNjcmlwdGlvbjogQ2hvb3NlIGFtb25nIGludGVuc2UsIGRl c2F0dXJhdGVkLCBvciB0ZXh0LW9ubHkgZGlmZnMKOmN1c3RvbV9pZDogaDplYTdhYzU0Zi01ODI3 LTQ5YmQtYjA5Zi02MjQyNGIzYjY0MjcKOmVuZDoKIyt2aW5kZXg6IG1vZHVzLXRoZW1lcy1kaWZm cwoKU3ltYm9sOiB+bW9kdXMtdGhlbWVzLWRpZmZzfgoKUG9zc2libGUgdmFsdWVzOgoKMS4gPW5p bD0gKGRlZmF1bHQpCjIuIH5kZXNhdHVyYXRlZH4KMy4gfmZnLW9ubHl+CjQuIH5iZy1vbmx5fgo1 LiB+ZGV1dGVyYW5vcGlhfgoKQnkgZGVmYXVsdCB0aGUgdGhlbWVzIGFwcGx5IHJpY2ggY29sb3Jh dGlvbiB0byB0aGUgb3V0cHV0IG9mIGRpZmZzLCBzdWNoCmFzIHRob3NlIG9mIH5kaWZmLW1vZGV+ LCB+ZWRpZmZ+LCB+c21lcmdlLW1vZGV+LCBhbmQgTWFnaXQuICBUaGVzZSBhcmUKY29sb3IgY29t YmluYXRpb25zIG9mIGFuIGFjY2VudGVkIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQgc28gdGhh dCwgZm9yCmV4YW1wbGUsIGFkZGVkIGxpbmVzIGhhdmUgYSBwcm9ub3VuY2VkIGdyZWVuIGJhY2tn cm91bmQgd2l0aCBhbgphcHByb3ByaWF0ZSBzaGFkZSBvZiBncmVlbiBmb3IgdGhlIGFmZmVjdGVk IHRleHQuICBXb3JkLXdpc2Ugb3IKInJlZmluZWQiIGNoYW5nZXMgZm9sbG93IHRoaXMgcGF0dGVy biBidXQgdXNlIGRpZmZlcmVudCBzaGFkZXMgb2YgdGhvc2UKY29sb3JzIHRvIHJlbWFpbiBkaXN0 aW5jdC4KCk9wdGlvbiB+ZGVzYXR1cmF0ZWR+IHRvbmVzIGRvd24gYWxsIHJlbGV2YW50IGNvbG9y IHZhbHVlcy4gIEl0IHN0aWxsCmNvbWJpbmVzIGFuIGFjY2VudGVkIGJhY2tncm91bmQgd2l0aCBh biBhcHByb3ByaWF0ZSBmb3JlZ3JvdW5kLCB5ZXQgaXRzCm92ZXJhbGwgaW1wcmVzc2lvbiBpcyBm YWlybHkgc3VidGxlLiAgUmVmaW5lZCBjaGFuZ2VzIGFyZSBhIGJpdCBtb3JlCmludGVuc2UgdG8g ZnVsZmlsIHRoZWlyIGludGVuZGVkIGZ1bmN0aW9uLCB0aG91Z2ggc3RpbGwgbGVzcyBzYXR1cmF0 ZWQKdGhhbiBkZWZhdWx0LgoKT3B0aW9uIH5mZy1vbmx5fiB3aWxsIHJlbW92ZSBtb3N0IGFjY2Vu dGVkIGJhY2tncm91bmRzIGFuZCBpbnN0ZWFkIHJlbHkKb24gY29sb3ItY29kZWQgdGV4dCB0byBk ZW5vdGUgY2hhbmdlcy4gIEZvciBpbnN0YW5jZSwgYWRkZWQgbGluZXMgdXNlIGEKZ3JlZW4gZm9y ZWdyb3VuZCwgd2hpbGUgdGhlaXIgYmFja2dyb3VuZCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBv ZiB0aGUKYnVmZmVyLiAgV29yZC13aXNlIGhpZ2hsaWdodHMgc3RpbGwgdXNlIGEgYmFja2dyb3Vu ZCB2YWx1ZSB3aGljaCBpcywKbm9uZXRoZWxlc3MsIG1vcmUgc3VidGxlIHRoYW4gaXRzIGRlZmF1 bHQgZXF1aXZhbGVudC4KCk9wdGlvbiB+Ymctb25seX4gYXBwbGllcyBjb2xvci1jb2RlZCBiYWNr Z3JvdW5kcyBidXQgZG9lcyBub3Qgb3ZlcnJpZGUKYW55IHN5bnRheCBoaWdobGlnaHRpbmcgdGhh dCBtYXkgYmUgcHJlc2VudC4gIFRoaXMgbWFrZXMgaXQgc3VpdGFibGUgZm9yCnVzZSB3aXRoIGEg bm9uLW5pbCB2YWx1ZSBmb3IgfmRpZmYtZm9udC1sb2NrLXN5bnRheH4gKHdoaWNoIGlzIHRoZQpk ZWZhdWx0IGZvciB+ZGlmZi1tb2RlfiBidWZmZXJzIGluIEVtYWNzIDI3IG9yIGhpZ2hlcikuCgpP cHRpb24gfmRldXRlcmFub3BpYX4gb3B0aW1pemVzIGZvciByZWQtZ3JlZW4gY29sb3IgZGVmaWNp ZW5jeS4gIEl0CnJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgZ3JlZW4gd2l0aCBibHVlIHZhcmlh bnRzLiAgVGhpcyBpcyB0byBlbnN1cmUKdGhhdCBpbmRpY2F0b3JzIGZvciAicmVtb3ZlZCIgYW5k ICJhZGRlZCIgc3RhdGVzIGFyZSBub3QgbWlzdGFrZW4gZm9yCmVhY2ggb3RoZXIuCgpDb25jZXJu aW5nIE1hZ2l0LCBhbiBleHRyYSBzZXQgb2YgdHdlYWtzIGFyZSBpbnRyb2R1Y2VkIGZvciB0aGUg ZWZmZWN0Cm9mIGhpZ2hsaWdodGluZyB0aGUgY3VycmVudCBkaWZmIGh1bmssIHNvIGFzIHRvIHJl bWFpbiBhbGlnbmVkIHdpdGggdGhlCm92ZXJhbGwgZXhwZXJpZW5jZSBvZiB0aGF0IG1vZGUuICBF eHBlY3QgY2hhbmdlcyB0aGF0IGFyZSBjb25zaXN0ZW50CndpdGggdGhlIG92ZXJhbGwgaW50ZW50 IG9mIHRoZSBhZm9yZW1lbnRpb25lZC4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlCn5iZy1vbmx5 fiBvcHRpb24gd2lsbCBub3QgZGVsaXZlciB0aGUgaW50ZW5kZWQgcmVzdWx0cyBpbiBNYWdpdCBk aWZmcwpiZWNhdXNlIG5vIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdXNlZCB0aGVyZSAobGFzdCBj aGVja2VkIHdpdGggTWFnaXQKdmVyc2lvbiAyMDIwMTExNi4xMDU3LCB0aG91Z2ggdXBzdHJlYW0g aGFzIGEgcGxhbiB0byBldmVudHVhbGx5IHN1cHBvcnQKc3VjaCBhIGZlYXR1cmUtLS10aGlzIGVu dHJ5IHNoYWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkpLgoKKiogT3B0aW9uIGZvciBvcmctbW9k ZSBibG9jayBzdHlsZXMKOnByb3BlcnRpZXM6CjphbHRfdGl0bGU6IE9yZyBtb2RlIGJsb2Nrcwo6 ZGVzY3JpcHRpb246IENob29zZSBhbW9uZyBwbGFpbiwgZ3JheXNjYWxlLCBvciByYWluYm93IHN0 eWxlcwo6Y3VzdG9tX2lkOiBoOmI3ZTMyOGMwLTMwMzQtNGRiNy05Y2RmLWQ1YmExMjA4MWNhMgo6 ZW5kOgojK3ZpbmRleDogbW9kdXMtdGhlbWVzLW9yZy1ibG9ja3MKClN5bWJvbDogfm1vZHVzLXRo ZW1lcy1vcmctYmxvY2tzfgoKUG9zc2libGUgdmFsdWVzOgoKMS4gPW5pbD0gKGRlZmF1bHQpCjIu IH5ncmF5c2NhbGV+CjMuIH5yYWluYm93fgoKVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBzYW1l IGJhY2tncm91bmQgYXMgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciBmb3IKdGhlIGNvbnRlbnRzIG9m IHRoZSBibG9jay4KCk9wdGlvbiB+Z3JheXNjYWxlfiBhcHBsaWVzIGEgc3VidGxlIG5ldXRyYWwg Z3JheSBiYWNrZ3JvdW5kIHRvIHRoZSBibG9jaydzCmNvbnRlbnRzLiAgSXQgd2lsbCBhbHNvIGV4 dGVuZCB0byB0aGUgZWRnZSBvZiB0aGUgd2luZG93IHRoZSBiYWNrZ3JvdW5kCm9mIHRoZSAiYmVn aW4iIGFuZCAiZW5kIiBibG9jayBkZWxpbWl0ZXIgbGluZXMgKG9ubHkgcmVsZXZhbnQgZm9yIEVt YWNzCnZlcnNpb25zID49IDI3IHdoZXJlIHRoZSAnZXh0ZW5kJyBrZXl3b3JkIGlzIHBhcnQgb2Yg dGhlIGZhY2UKc3BlY2lmaWNhdGlvbnMpLgoKT3B0aW9uIH5yYWluYm93fiB1c2VzIGFuIGFjY2Vu dGVkIGJhY2tncm91bmQgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUKYmxvY2suICBUaGUgZXhhY3Qg Y29sb3Igd2lsbCBkZXBlbmQgb24gdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBpcwpjb250 cm9sbGVkIGJ5IHRoZSB+b3JnLXNyYy1ibG9jay1mYWNlc34gdmFyaWFibGUuICBUaGlzIGlzIG1v c3Qgc3VpdGFibGUKZm9yIHVzZXJzIHdobyB3b3JrIG9uIGxpdGVyYXRlIHByb2dyYW1taW5nIGRv Y3VtZW50cyB0aGF0IG1peCBhbmQgbWF0Y2gKc2V2ZXJhbCBsYW5ndWFnZXMuCgpOb3RlIHRoYXQg dGhlICJyYWluYm93IiBibG9ja3MgbWF5IHJlcXVpcmUgeW91IHRvIGFsc28gcmVsb2FkIHRoZQpt YWpvci1tb2RlIHNvIHRoYXQgdGhlIGNvbG9ycyBhcmUgYXBwbGllZCBjb25zaXN0ZW50bHkgdGhy b3VnaG91dDogdXNlCnt7e2tiZChNLXggb3JnLW1vZGUpfX19IG9yIHt7e2tiZChNLXggb3JnLW1v ZGUtcmVzdGFydCl9fX0gdG8gcmVmcmVzaCB0aGUgYnVmZmVyLgpPciBzdGFydCB0eXBpbmcgaW4g ZWFjaCBjb2RlIGJsb2NrIChpbmVmZmljaWVudCBhdCBzY2FsZSwgYnV0IGl0IHN0aWxsCndvcmtz KS4KCioqIE9wdGlvbiBmb3Igb3JnLWhhYml0IGdyYXBoIHN0eWxlcwo6cHJvcGVydGllczoKOmFs dF90aXRsZTogT3JnIGFnZW5kYSBoYWJpdHMKOmRlc2NyaXB0aW9uOiBDaG9vc2UgYW1vbmcgc3Rh bmRhcmQsIHNpbXBsaWZpZWQsIG9yIHRyYWZmaWMgbGlnaHQgc3R5bGVzCjpjdXN0b21faWQ6IGg6 YjdlMzI4YzAtMzAzNC00ZGI3LTljZGYtZDViYTEyMDgxY2EyCjplbmQ6CiMrdmluZGV4OiBtb2R1 cy10aGVtZXMtb3JnLWhhYml0CgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtb3JnLWhhYml0fgoKUG9z c2libGUgdmFsdWVzOgoKMS4gPW5pbD0gKGRlZmF1bHQpCjIuIH5zaW1wbGlmaWVkfgozLiB+dHJh ZmZpYy1saWdodH4KClRoZSBkZWZhdWx0IGlzIG1lYW50IHRvIGNvbmZvcm0gd2l0aCB0aGUgb3Jp Z2luYWwgYWVzdGhldGljIG9mCj1vcmctaGFiaXQ9LiAgSXQgZW1wbG95cyBhbGwgZm91ciBjb2xv ciBjb2RlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlCm9yZy1oYWJpdCBzdGF0ZXMtLS1jbGVhciwg cmVhZHksIGFsZXJ0LCBhbmQgb3ZlcmR1ZS0tLXdoaWxlCmRpc3Rpbmd1aXNoaW5nIGJldHdlZW4g dGhlaXIgcHJlc2VudCBhbmQgZnV0dXJlIHZhcmlhbnRzLiAgVGhpcyByZXN1bHRzCmluIGEgdG90 YWwgb2YgZWlnaHQgY29sb3JzIGluIHVzZTogcmVkLCB5ZWxsb3csIGdyZWVuLCBibHVlLCBpbiB0 aW50ZWQKYW5kIHNoYWRlZCB2ZXJzaW9ucy4gIFRoZXkgY292ZXIgdGhlIGZ1bGwgc2V0IG9mIGlu Zm9ybWF0aW9uIHByb3ZpZGVkIGJ5CnRoZSA9b3JnLWhhYml0PSBjb25zaXN0ZW5jeSBncmFwaC4K Ck9wdGlvbiB+c2ltcGxpZmllZH4gaXMgbGlrZSB0aGUgZGVmYXVsdCBleGNlcHQgdGhhdCBpdCBy ZW1vdmVzIHRoZQpkaWNob3RvbXkgYmV0d2VlbiBjdXJyZW50IGFuZCBmdXR1cmUgdmFyaWFudHMg YnkgYXBwbHlpbmcgdW5pZm9ybQpjb2xvci1jb2RlZCB2YWx1ZXMuICBJdCBhcHBsaWVzIGEgdG90 YWwgb2YgZm91ciBjb2xvcnM6IHJlZCwgeWVsbG93LApncmVlbiwgYmx1ZS4gIFRoZXkgcHJvZHVj ZSBhIHNpbXBsaWZpZWQgY29uc2lzdGVuY3kgZ3JhcGggdGhhdCBpcyBtb3JlCmxlZ2libGUgKG9y IGxlc3MgImJ1c3kiKSB0aGFuIHRoZSBkZWZhdWx0LiAgVGhlIGludGVudCBpcyB0byBzaGlmdCBm b2N1cwp0b3dhcmRzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBmb3VyIHN0YXRlcyBvZiBh IGhhYml0IHRhc2ssIHJhdGhlcgp0aGFuIGVhY2ggc3RhdGUncyBwcmVzZW50L2Z1dHVyZSBvdXRs b29rLgoKT3B0aW9uIH50cmFmZmljLWxpZ2h0fiBmdXJ0aGVyIHJlZHVjZXMgdGhlIGF2YWlsYWJs ZSBjb2xvcnMgdG8gcmVkLAp5ZWxsb3csIGFuZCBncmVlbi4gIEFzIGluIH5zaW1wbGlmaWVkfiwg cHJlc2VudCBhbmQgZnV0dXJlIHZhcmlhbnRzIGFwcGVhcgp1bmlmb3JtbHksIGJ1dCBkaWZmZXJl bnRseSBmcm9tIGl0LCB0aGUgJ2NsZWFyJyBzdGF0ZSBpcyByZW5kZXJlZCBpbiBhCmdyZWVuIGh1 ZSwgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgYmx1ZS4gIFRoaXMgaXMgbWVhbnQgdG8gY2FwdHVy ZSB0aGUKdXNlLWNhc2Ugd2hlcmUgYSBoYWJpdCB0YXNrIGJlaW5nICJ0b28gZWFybHkiIGlzIGxl c3MgaW1wb3J0YW50IHRoYW4gaXQKYmVpbmcgInRvbyBsYXRlIi4gIFRoZSBkaWZmZXJlbmNlIGJl dHdlZW4gcmVhZHkgYW5kIGNsZWFyIHN0YXRlcyBpcwphdHRlbnVhdGVkIGJ5IHBhaW50aW5nIGJv dGggb2YgdGhlbSB1c2luZyBzaGFkZXMgb2YgZ3JlZW4uICBUaGlzIG9wdGlvbgp0aHVzIGhpZ2hs aWdodHMgdGhlIGFsZXJ0IGFuZCBvdmVyZHVlIHN0YXRlcy4KCioqIE9wdGlvbiBmb3IgdGhlIGhl YWRpbmdzJyBvdmVyYWxsIHN0eWxlCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxlOiBIZWFkaW5nIHN0 eWxlcwo6ZGVzY3JpcHRpb246IENob29zZSBhbW9uZyBzZXZlcmFsIHN0eWxlcywgYWxzbyBwZXIg aGVhZGluZyBsZXZlbAo6Y3VzdG9tX2lkOiBoOjI3MWVmZjE5LTk3YWEtNDA5MC05NDE1LWE2NDYz YzJmOWFlMQo6ZW5kOgojK3ZpbmRleDogbW9kdXMtdGhlbWVzLWhlYWRpbmdzCgpUaGlzIGlzIGRl ZmluZWQgYXMgYW4gYWxpc3QgYW5kLCB0aGVyZWZvcmUsIHVzZXMgYSBkaWZmZXJlbnQgYXBwcm9h Y2gKdGhhbiBvdGhlciBjdXN0b21pemF0aW9uIG9wdGlvbnMgZG9jdW1lbnRlZCBpbiB0aGlzIG1h bnVhbC4KClN5bWJvbDogfm1vZHVzLXRoZW1lcy1oZWFkaW5nc34KClBvc3NpYmxlIHZhbHVlcywg d2hpY2ggY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBoZWFkaW5nIGxldmVsIChleGFtcGxlcwpm dXJ0aGVyIGJlbG93KToKCisgbmlsIChkZWZhdWx0IGZhbGxiYWNrIG9wdGlvbi0tLWNvdmVycyBh bGwgaGVhZGluZyBsZXZlbHMpCisgPXQ9IChkZWZhdWx0IHN0eWxlIGZvciBhIHNpbmdsZSBoZWFk aW5nLCB3aGVuIHRoZSBmYWxsYmFjayBkaWZmZXJzKQorIH5uby1ib2xkfgorIH5saW5lfgorIH5s aW5lLW5vLWJvbGR+CisgfnJhaW5ib3d+CisgfnJhaW5ib3ctbGluZX4KKyB+cmFpbmJvdy1saW5l LW5vLWJvbGR+CisgfmhpZ2hsaWdodH4KKyB+aGlnaGxpZ2h0LW5vLWJvbGR+CisgfnJhaW5ib3ct aGlnaGxpZ2h0fgorIH5yYWluYm93LWhpZ2hsaWdodC1uby1ib2xkfgorIH5zZWN0aW9ufgorIH5z ZWN0aW9uLW5vLWJvbGR+CisgfnJhaW5ib3ctc2VjdGlvbn4KKyB+cmFpbmJvdy1zZWN0aW9uLW5v LWJvbGR+Cisgfm5vLWNvbG9yfgorIH5uby1jb2xvci1uby1ib2xkfgoKVG8gY29udHJvbCBmYWNl cyBwZXIgbGV2ZWwgZnJvbSAxLTgsIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzOgoKIytiZWdpbl9z cmMgZW1hY3MtbGlzcAooc2V0cSBtb2R1cy10aGVtZXMtaGVhZGluZ3MKICAgICAgJygoMSAuIHNl Y3Rpb24pCiAgICAgICAgKDIgLiBzZWN0aW9uLW5vLWJvbGQpCiAgICAgICAgKDMgLiByYWluYm93 LWxpbmUpCiAgICAgICAgKHQgLiByYWluYm93LWxpbmUtbm8tYm9sZCkpKQojK2VuZF9zcmMKClRo ZSBhYm92ZSB1c2VzIHRoZSB+c2VjdGlvbn4gdmFsdWUgZm9yIGhlYWRpbmcgbGV2ZWxzIDEsIH5z ZWN0aW9uLW5vLWJvbGR+CmZvciBoZWFkaW5ncyAyLCB+cmFpbmJvdy1saW5lfiBmb3IgMy4gIEFs bCBvdGhlciBsZXZlbHMgZmFsbCBiYWNrIHRvCn5yYWluYm93LWxpbmUtbm8tYm9sZH4uCgpUbyBz ZXQgYSB1bmlmb3JtIHZhbHVlIGZvciBhbGwgaGVhZGluZyBsZXZlbHMsIHVzZSB0aGlzIHBhdHRl cm46CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCjs7IEEgZ2l2ZW4gc3R5bGUgZm9yIGV2ZXJ5IGhl YWRpbmcKKHNldHEgbW9kdXMtdGhlbWVzLWhlYWRpbmdzCiAgICAgICcoKHQgLiBzZWN0aW9uKSkp Cgo7OyBEZWZhdWx0IGFlc3RoZXRpYyBmb3IgZXZlcnkgaGVhZGluZwooc2V0cSBtb2R1cy10aGVt ZXMtaGVhZGluZ3MKICAgICAgJygpKQojK2VuZF9zcmMKClRoZSBkZWZhdWx0IHN0eWxlIGZvciBo ZWFkaW5ncyB1c2VzIGEgZmFpcmx5IGRlc2F0dXJhdGVkIGZvcmVncm91bmQKdmFsdWUgaW4gY29t YmluYXRpb24gd2l0aCBib2xkIHR5cG9ncmFwaGljIHdlaWdodC4gIFRvIHNwZWNpZnkgdGhpcwpz dHlsZSBmb3IgYSBnaXZlbiBsZXZlbCBOLCBhc3N1bWluZyB5b3Ugd2lzaCB0byBoYXZlIGFub3Ro ZXIgZmFsbGJhY2sKb3B0aW9uLCBqdXN0IHNwZWNpZnkgdGhlIHZhbHVlID10PSBsaWtlIHRoaXM6 CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihzZXRxIG1vZHVzLXRoZW1lcy1oZWFkaW5ncwogICAg ICAnKCgxIC4gdCkKICAgICAgICAoMiAuIGxpbmUpCiAgICAgICAgKHQgLiByYWluYm93LWxpbmUt bm8tYm9sZCkpKQojK2VuZF9zcmMKCkEgZGVzY3JpcHRpb24gb2YgYWxsIG90aGVyIHBvc3NpYmxl IHN0eWxlcyBiZXlvbmQgdGhlIGRlZmF1bHQ6CgorIH5uby1ib2xkfiByZXRhaW5zIHRoZSBkZWZh dWx0IHRleHQgY29sb3Igd2hpbGUgcmVtb3ZpbmcgdGhlIGJvbGQKICB0eXBvZ3JhcGhpYyB3ZWln aHQuCgorIH5saW5lfiBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBwbHVzIGFuIG92ZXJsaW5l IGFjcm9zcyB0aGUKICBoZWFkaW5nJ3MgbGVuZ3RoLgoKKyB+bGluZS1uby1ib2xkfiBpcyB0aGUg c2FtZSBhcyB+bGluZX4gd2l0aG91dCBib2xkIHdlaWdodC4KCisgfnJhaW5ib3d+IHVzZXMgYSBt b3JlIGNvbG9yZnVsIGZvcmVncm91bmQgaW4gY29tYmluYXRpb24gd2l0aCBib2xkCiAgdHlwb2dy YXBoaWMgd2VpZ2h0LgoKKyB+cmFpbmJvdy1saW5lfiBpcyB0aGUgc2FtZSBhcyB+cmFpbmJvd34g cGx1cyBhbiBvdmVybGluZS4KCisgfnJhaW5ib3ctbGluZS1uby1ib2xkfiBpcyB0aGUgc2FtZSBh cyB+cmFpbmJvdy1saW5lfiB3aXRob3V0IHRoZSBib2xkCiAgd2VpZ2h0LgoKKyB+aGlnaGxpZ2h0 fiByZXRhaW5zIHRoZSBkZWZhdWx0IHN0eWxlIG9mIGEgZmFpcmx5IGRlc2F0dXJhdGVkCiAgZm9y ZWdyb3VuZCBjb21iaW5lZCB3aXRoIGEgYm9sZCB3ZWlnaHQgYW5kIGFkZHMgdG8gaXQgYSBzdWJ0 bGUKICBhY2NlbnRlZCBiYWNrZ3JvdW5kLgoKKyB+aGlnaGxpZ2h0LW5vLWJvbGR+IGlzIHRoZSBz YW1lIGFzIH5oaWdobGlnaHR+IHdpdGhvdXQgYSBib2xkIHdlaWdodC4KCisgfnJhaW5ib3ctaGln aGxpZ2h0fiBpcyB0aGUgc2FtZSBhcyB+aGlnaGxpZ2h0fiBidXQgd2l0aCBhIG1vcmUKICBjb2xv cmZ1bCBmb3JlZ3JvdW5kLgoKKyB+cmFpbmJvdy1oaWdobGlnaHQtbm8tYm9sZH4gaXMgdGhlIHNh bWUgYXMgfnJhaW5ib3ctaGlnaGxpZ2h0fiB3aXRob3V0CiAgYSBib2xkIHdlaWdodC4KCisgfnNl Y3Rpb25+IHJldGFpbnMgdGhlIGRlZmF1bHQgbG9va3MgYW5kIGFkZHMgdG8gdGhlbSBib3RoIGFu IG92ZXJsaW5lCiAgYW5kIGEgc2xpZ2h0bHkgYWNjZW50ZWQgYmFja2dyb3VuZC4gIEl0IGlzLCBp biBlZmZlY3QsIGEgY29tYmluYXRpb24KICBvZiB0aGUgfmxpbmV+IGFuZCB+aGlnaGxpZ2h0fiB2 YWx1ZXMuCgorIH5zZWN0aW9uLW5vLWJvbGR+IGlzIHRoZSBzYW1lIGFzIH5zZWN0aW9ufiB3aXRo b3V0IGEgYm9sZCB3ZWlnaHQuCgorIH5yYWluYm93LXNlY3Rpb25+IGlzIHRoZSBzYW1lIGFzIH5z ZWN0aW9ufiBidXQgd2l0aCBhIG1vcmUgY29sb3JmdWwKICBmb3JlZ3JvdW5kLgoKKyB+cmFpbmJv dy1zZWN0aW9uLW5vLWJvbGR+IGlzIHRoZSBzYW1lIGFzIH5yYWluYm93LXNlY3Rpb25+IHdpdGhv dXQgYQogIGJvbGQgd2VpZ2h0LgoKKyB+bm8tY29sb3J+IGRvZXMgbm90IGFwcGx5IGFueSBjb2xv ciB0byB0aGUgaGVhZGluZywgbWVhbmluZyB0aGF0IGl0CiAgdXNlcyB0aGUgZm9yZWdyb3VuZCBv ZiB0aGUgfmRlZmF1bHR+IGZhY2UuICBJdCBzdGlsbCByZW5kZXJzIHRoZSB0ZXh0CiAgd2l0aCBh IGJvbGQgdHlwb2dyYXBoaWMgd2VpZ2h0LgoKKyB+bm8tY29sb3Itbm8tYm9sZH4gaXMgbGlrZSB+ bm8tY29sb3J+IGJ1dCB3aXRob3V0IHRoZSBib2xkIHdlaWdodC4KCioqIE9wdGlvbiBmb3Igc2Nh bGVkIGhlYWRpbmdzCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxlOiBTY2FsZWQgaGVhZGluZ3MKOmRl c2NyaXB0aW9uOiBUb2dnbGUgc2NhbGluZyBvZiBoZWFkaW5ncwo6Y3VzdG9tX2lkOiBoOjA3NWVi MDIyLTM3YTYtNDFhNC1hMDQwLWNjMTg5ZjZiZmExZgo6ZW5kOgojK3ZpbmRleDogbW9kdXMtdGhl bWVzLXNjYWxlLWhlYWRpbmdzCgpTeW1ib2w6IH5tb2R1cy10aGVtZXMtc2NhbGUtaGVhZGluZ3N+ CgpQb3NzaWJsZSB2YWx1ZXM6CgoxLiA9bmlsPSAoZGVmYXVsdCkKMi4gPXQ9CgpUaGUgZGVmYXVs dCBpcyB0byB1c2UgdGhlIHNhbWUgc2l6ZSBmb3IgaGVhZGluZ3MgYW5kIHBhcmFncmFwaCB0ZXh0 LgoKV2l0aCBhIG5vbi1uaWwgdmFsdWUgKD10PSkgbWFrZSBoZWFkaW5ncyBsYXJnZXIgaW4gaGVp Z2h0IHJlbGF0aXZlIHRvIHRoZQptYWluIHRleHQuICBUaGlzIGlzIG5vdGljZWFibGUgaW4gbW9k ZXMgbGlrZSBPcmcsIE1hcmtkb3duLCBhbmQgSW5mby4KCioqKiBDb250cm9sIHRoZSBzY2FsZSBv ZiBoZWFkaW5ncwo6cHJvcGVydGllczoKOmFsdF90aXRsZTogU2NhbGVkIGhlYWRpbmcgc2l6ZXMK OmRlc2NyaXB0aW9uOiBTcGVjaWZ5IHJhdGUgb2YgaW5jcmVhc2UgZm9yIHNjYWxlZCBoZWFkaW5n cwo6Y3VzdG9tX2lkOiBoOjY4NjhiYWExLWJlYmEtNDVlZC1iYWE1LTVmZDY4MzIyY2NiMwo6ZW5k OgoKSW4gYWRkaXRpb24gdG8gdGhlIHRvZ2dsZSBmb3IgZW5hYmxpbmcgc2NhbGVkIGhlYWRpbmdz LCB1c2VycyBjYW4gYWxzbwpzcGVjaWZ5IGEgbnVtYmVyIG9mIHRoZWlyIG93bi4KCisgSWYgaXQg aXMgYSBmbG9hdGluZyBwb2ludCwgc2F5LCA9MS41PSwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBt dWx0aXBsZQogIG9mIHRoZSBiYXNlIGZvbnQgc2l6ZS4gIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVk IG1ldGhvZCwgYmVjYXVzZSBpdAogIHdpbGwgYWx3YXlzIGFkYXB0IHRvIGNoYW5nZXMgaW4gdGhl IGJhc2UgZm9udCBzaXplLCBzdWNoIGFzIHdoaWxlCiAgdXNpbmcgdGhlIH50ZXh0LXNjYWxlLWFk anVzdH4gY29tbWFuZC4KCisgSWYgaXQgaXMgYW4gaW50ZWdlciwgaXQgaXMgcmVhZCBhcyBhbiBh YnNvbHV0ZSBmb250IGhlaWdodCB0aGF0IGlzCiAgMS8xMCBvZiB0aGUgdHlwb2dyYXBoaWMgcG9p bnQgc2l6ZS4gIFRodXMgYSB2YWx1ZSBvZiA9MThwdD0gbXVzdCBiZQogIGV4cHJlc3NlZCBhcyA9 MTgwPS4gIFNldHRpbmcgYW4gYWJzb2x1dGUgdmFsdWUgaXMgZGlzY291cmFnZWQsIGFzIGl0CiAg d2lsbCBicmVhayB0aGUgbGF5b3V0IGluIGNhc2VzIHdoZXJlIHRoZSBiYXNlIGZvbnQgc2l6ZSBt dXN0IGNoYW5nZSwKICBzdWNoIGFzIHdpdGggdGhlIH50ZXh0LXNjYWxlLWFkanVzdH4gY29tbWFu ZCAoW1sjaDpkZWZjZjRmYy04ZmE4LTRjMjktYjEyZS03MTE5NTgyY2M5MjldW0ZvbnQgY29uZmln dXJhdGlvbnNdXSkuCiAgV2hpbGUgd2UgZGlzY291cmFnZSB1c2luZyBhYnNvbHV0ZSB2YWx1ZXMs IHdlIHN0aWxsIHByb3ZpZGUgZm9yIHRoaXMKICBvcHRpb24gZm9yIHVzZXJzIHdobyBkbyBub3Qg bmVlZCB0byBwZXJmb3JtIHRleHQtc2NhbGluZyBvcGVyYXRpb25zIG9yCiAgd2hvIGFyZSBjb250 ZW50IHdpdGggd2hhdGV2ZXIgZGlzY3JlcGFuY2llcyBpbiBoZWlnaHQuCgpCZWxvdyBhcmUgdGhl IHZhcmlhYmxlcyBpbiB0aGVpciBkZWZhdWx0IHZhbHVlcywgdXNpbmcgdGhlIGZsb2F0aW5nCnBv aW50IHBhcmFkaWdtLiAgVGhlIG51bWJlcnMgYXJlIHZlcnkgY29uc2VydmF0aXZlLCBidXQgb25l IGlzIGZyZWUgdG8KY2hhbmdlIHRoZW0gdG8gdGhlaXIgbGlraW5nLCBzdWNoIGFzID0xLjI9LCA9 MS40PSwgPTEuNj0sID0xLjg9LCA9Mi4wPS0tLW9yIHVzZSBhCnJlc291cmNlIGZvciBmaW5kaW5n IGEgY29uc2lzdGVudCBzY2FsZToKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKHNldHEgbW9kdXMt dGhlbWVzLXNjYWxlLTEgMS4wNQogICAgICBtb2R1cy10aGVtZXMtc2NhbGUtMiAxLjEKICAgICAg bW9kdXMtdGhlbWVzLXNjYWxlLTMgMS4xNQogICAgICBtb2R1cy10aGVtZXMtc2NhbGUtNCAxLjIK ICAgICAgbW9kdXMtdGhlbWVzLXNjYWxlLTUgMS4zKQojK2VuZF9zcmMKCkFzIGZvciB0aGUgYXBw bGljYXRpb24gb2YgdGhhdCBzY2FsZSwgdGhlIHZhcmlhYmxlcyB0aGF0IHJhbmdlIGZyb20Kfm1v ZHVzLXRoZW1lcy1zY2FsZS0xfiB1cCB0byB+bW9kdXMtdGhlbWVzLXNjYWxlLTR+IGFwcGx5IHRv IHJlZ3VsYXIKaGVhZGluZ3Mgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiBtYWpvciBt b2RlLiAgVGhlIGZvcm1lciBpcyB0aGUKc21hbGxlc3QsIHdoaWxlIHRoZSBsYXR0ZXIgaXMgdGhl IGxhcmdlc3QuICAiUmVndWxhciBoZWFkaW5ncyIgYXJlIHRob3NlCnRoYXQgaGF2ZSBhIHN0YW5k YXJkIHN5bnRheCBmb3IgdGhlaXIgc2NhbGUsIHN1Y2ggYXMgT3JnIG1vZGUncyBlaWdodApsZXZl bHMgb2YgYXN0ZXJpc2tzIG9yIE1hcmtkb3duJ3Mgc2l4IGNvbHVtbnMuCgpXaGVyZWFzIH5tb2R1 cy10aGVtZXMtc2NhbGUtNX4gaXMgYXBwbGllZCB0byBzcGVjaWFsIGhlYWRpbmdzIHRoYXQgZG8g bm90CmNvbmZvcm0gd2l0aCB0aGUgYWZvcmVtZW50aW9uZWQgc3ludGF4LCB5ZXQgd2hpY2ggYXJl IGV4cGVjdGVkIHRvIGJlCmxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHZhbHVlIG9uIHRoYXQgaW1w bGllZCBzY2FsZS4gIFB1dCBjb25jcmV0ZWx5LApPcmcncyA9Iyt0aXRsZT0gbWV0YSBkYXR1bSBp cyBub3QgcGFydCBvZiB0aGUgZWlnaHQgbGV2ZWxzIG9mIGhlYWRpbmdzIGluCmFuIE9yZyBmaWxl LCB5ZXQgaXMgc3VwcG9zZWQgdG8gc2lnbmlmeSB0aGUgcHJpbWFyeSBoZWFkZXIuICBTaW1pbGFy bHksCnRoZSBPcmcgQWdlbmRhJ3Mgc3RydWN0dXJlIGhlYWRpbmdzIGFyZSBub3QgcGFydCBvZiBh IHJlY29nbmlzYWJsZSBzY2FsZQphbmQgc28gdGhleSBhbHNvIGdldCB+bW9kdXMtdGhlbWVzLXNj YWxlLTV+LgoKVXNlcnMgd2hvIHdpc2ggdG8gbWFpbnRhaW4gc2NhbGVkIGhlYWRpbmdzIGZvciB0 aGUgbm9ybWFsIHN5bnRheCB3aGlsZQpwcmV2ZW50aW5nIHNwZWNpYWwgaGVhZGluZ3MgZnJvbSBz dGFuZGluZyBvdXQsIGNhbiBhc3NpZ24gYSB2YWx1ZSBvZiA9MS4wPQp0byB+bW9kdXMtdGhlbWVz LXNjYWxlLTV+IHRvIG1ha2UgaXQgdGhlIHNhbWUgYXMgYm9keSB0ZXh0IChvciB3aGF0ZXZlcgp2 YWx1ZSB3b3VsZCByZW5kZXIgaXQgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgZGVzaXJlZCBw b2ludCBvZgpyZWZlcmVuY2UpLgoKTm90ZSB0aGF0IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgT3Jn LCBzY2FsaW5nIHdvdWxkIG9ubHkgaW5jcmVhc2UgdGhlCnNpemUgb2YgdGhlIGhlYWRpbmcsIGJ1 dCBub3Qgb2Yga2V5d29yZHMgdGhhdCB3ZXJlIGFkZGVkIHRvIGl0LCBsaWtlCiJUT0RPIi4gIFRo ZSBpc3N1ZSBoYXMgYmVlbiBmaXhlZCB1cHN0cmVhbToKPGh0dHBzOi8vcHJvdGVzaWxhb3MuY29t L2NvZGVsb2cvMjAyMC0wOS0yNC1vcmctaGVhZGluZ3MtYWRhcHQvPi4KCioqIE9wdGlvbiBmb3Ig dmFyaWFibGUtcGl0Y2ggZm9udCBpbiBVSSBlbGVtZW50cwo6cHJvcGVydGllczoKOmFsdF90aXRs ZTogVUkgdHlwZWZhY2UKOmRlc2NyaXB0aW9uOiBUb2dnbGUgdGhlIHVzZSBvZiB2YXJpYWJsZS1w aXRjaCBhY3Jvc3MgdGhlIFVzZXIgSW50ZXJmYWNlCjpjdXN0b21faWQ6IGg6MTZjZjY2NmMtNWU2 NS00MjRjLWE4NTUtN2VhOGE0YTFmY2FjCjplbmQ6CiMrdmluZGV4OiBtb2R1cy10aGVtZXMtdmFy aWFibGUtcGl0Y2gtdWkKClN5bWJvbDogfm1vZHVzLXRoZW1lcy12YXJpYWJsZS1waXRjaC11aX4K ClBvc3NpYmxlIHZhbHVlczoKCjEuID1uaWw9IChkZWZhdWx0KQoyLiA9dD0KClRoaXMgb3B0aW9u IGNvbmNlcm5zIFVzZXIgSW50ZXJmYWNlIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBkaXJl Y3QKY29udHJvbCBvZiBFbWFjcy4gIEluIHBhcnRpY3VsYXI6IHRoZSBtb2RlIGxpbmUsIGhlYWRl ciBsaW5lLCB0YWIgYmFyLAphbmQgdGFiIGxpbmUuCgpUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhl IHNhbWUgZm9udCBhcyB0aGUgcmVzdCBvZiBFbWFjcywgd2hpY2ggdXN1YWxseQppcyBhIG1vbm9z cGFjZWQgZmFtaWx5LgoKV2l0aCBhIG5vbi1uaWwgdmFsdWUgKD10PSkgYXBwbHkgYSBwcm9wb3J0 aW9uYXRlbHkgc3BhY2VkIHR5cGVmYWNlLiAgVGhpcwppcyBkb25lIGJ5IGFzc2lnbmluZyB0aGUg fnZhcmlhYmxlLXBpdGNofiBmYWNlIHRvIHRoZSByZWxldmFudCBpdGVtcy4KCltbI2g6ZGVmY2Y0 ZmMtOGZhOC00YzI5LWIxMmUtNzExOTU4MmNjOTI5XVtGb250IGNvbmZpZ3VyYXRpb25zIGZvciBP cmcgYW5kIG90aGVyc11dLgoKKiogT3B0aW9uIGZvciB2YXJpYWJsZS1waXRjaCBmb250IGluIGhl YWRpbmdzCjpwcm9wZXJ0aWVzOgo6YWx0X3RpdGxlOiBIZWFkaW5ncycgdHlwZWZhY2UKOmRlc2Ny aXB0aW9uOiBUb2dnbGUgdGhlIHVzZSBvZiB2YXJpYWJsZS1waXRjaCBpbiBoZWFkaW5ncwo6Y3Vz dG9tX2lkOiBoOjk3Y2FjYTc2LWZhMTMtNDU2Yy1hZWYxLWEyYWExNjVlYTI3NAo6ZW5kOgojK3Zp bmRleDogbW9kdXMtdGhlbWVzLXZhcmlhYmxlLXBpdGNoLWhlYWRpbmdzCgpTeW1ib2w6IH5tb2R1 cy10aGVtZXMtdmFyaWFibGUtcGl0Y2gtaGVhZGluZ3N+CgpQb3NzaWJsZSB2YWx1ZXM6CgoxLiA9 bmlsPSAoZGVmYXVsdCkKMi4gPXQ9CgpUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIG1haW4gZm9u dCBmYW1pbHksIHdoaWNoIHR5cGljYWxseSBpcwptb25vc3BhY2VkLgoKV2l0aCBhIG5vbi1uaWwg dmFsdWUgKD10PSkgYXBwbHkgYSBwcm9wb3J0aW9uYXRlbHkgc3BhY2VkIHR5cGVmYWNlLCBlbHNl CiJ2YXJpYWJsZS1waXRjaCIsIHRvIGhlYWRpbmdzIChzdWNoIGFzIGluIE9yZyBtb2RlKS4KCltb I2g6ZGVmY2Y0ZmMtOGZhOC00YzI5LWIxMmUtNzExOTU4MmNjOTI5XVtGb250IGNvbmZpZ3VyYXRp b25zIGZvciBPcmcgYW5kIG90aGVyc11dLgoKKiBBZHZhbmNlZCBjdXN0b21pemF0aW9uIChkby1p dC15b3Vyc2VsZikKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6ZjQ2NTFkNTUtOGMwNy00NmFh LWI1MmItYmVkMWU1MzQ2M2JiCjplbmQ6CgpVbmxpa2UgdGhlIHByZWRlZmluZWQgY3VzdG9taXph dGlvbiBvcHRpb25zIHdoaWNoIGZvbGxvdyBhIGNsZWFyIHBhdHRlcm4Kb2YgYWxsb3dpbmcgdGhl IHVzZXIgdG8gcXVpY2tseSBzcGVjaWZ5IHRoZWlyIHByZWZlcmVuY2UsIHRoZSB0aGVtZXMKYWxz byBwcm92aWRlIGEgbW9yZSBmbGV4aWJsZSwgYWxiZWl0IGRpZmZpY3VsdCwgbWVjaGFuaXNtIHRv IGNvbnRyb2wKdGhpbmdzIHdpdGggcHJlY2lzaW9uIChbWyNoOmJmMWM4MmYyLTQ2YzctNGViMi1h ZDAwLWRkMTFmZGQ4YjUzZl1bQ3VzdG9taXphdGlvbiBPcHRpb25zXV0pLgoKVGhpcyBzZWN0aW9u IGlzIG9mIGludGVyZXN0IG9ubHkgdG8gdXNlcnMgd2hvIGFyZSBwcmVwYXJlZCB0byBtYWludGFp bgp0aGVpciBvd24gbG9jYWwgdHdlYWtzIGFuZCB3aG8gYXJlIHdpbGxpbmcgdG8gZGVhbCB3aXRo IGFueSBwb3NzaWJsZQppbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIHZlcnNpb25lZCByZWxlYXNl cyBvZiB0aGUgdGhlbWVzLiAgQXMgc3VjaCwKdGhleSBhcmUgbGFiZWxsZWQgYXMgImRvLWl0LXlv dXJzZWxmIiBvciAiRElZIi4KCioqIFBlci10aGVtZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIChE SVkpCjpwcm9wZXJ0aWVzOgo6Y3VzdG9tX2lkOiBoOmE4OTdiMzAyLThlMTAtNGEyNi1iZWFiLTNj YWFlZTFlMTE5Mwo6ZW5kOgoKSWYgeW91IHByZWZlciB0byBtYWludGFpbiBkaWZmZXJlbnQgY3Vz dG9taXphdGlvbiBvcHRpb25zIGJldHdlZW4gdGhlCnR3byB0aGVtZXMsIGl0IGlzIGJlc3QgeW91 IHdyaXRlIHlvdXIgb3duIGZ1bmN0aW9ucyB0aGF0IGZpcnN0IHNldCB0aG9zZQpvcHRpb25zIGFu ZCB0aGVuIGxvYWQgdGhlIHJlbGV2YW50IHRoZW1lLiAgVGhlIGZvbGxvd2luZyBjb2RlIGRvZXMK ZXhhY3RseSB0aGF0IGJ5IHNpbXBseSBkaWZmZXJlbnRpYXRpbmcgdGhlIHR3byB0aGVtZXMgb24g dGhlIGNob2ljZSBvZgpib2xkIGNvbnN0cnVjdHMgaW4gY29kZSBzeW50YXggKGVuYWJsZWQgZm9y IG9uZSwgZGlzYWJsZWQgZm9yIHRoZQpvdGhlcikuCgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihk ZWZ1biBteS1kZW1vLW1vZHVzLW9wZXJhbmRpICgpCiAgKGludGVyYWN0aXZlKQogIChzZXRxIG1v ZHVzLXRoZW1lcy1ib2xkLWNvbnN0cnVjdHMgdCkgOyBFTkFCTEUgYm9sZAogIChtb2R1cy10aGVt ZXMtbG9hZC1vcGVyYW5kaSkpCgooZGVmdW4gbXktZGVtby1tb2R1cy12aXZlbmRpICgpCiAgKGlu dGVyYWN0aXZlKQogIChzZXRxIG1vZHVzLXRoZW1lcy1ib2xkLWNvbnN0cnVjdHMgbmlsKSA7IERJ U0FCTEUgYm9sZAogIChtb2R1cy10aGVtZXMtbG9hZC12aXZlbmRpKSkKCihkZWZ1biBteS1kZW1v LW1vZHVzLXRoZW1lcy10b2dnbGUgKCkKICAoaWYgKGVxIChjYXIgY3VzdG9tLWVuYWJsZWQtdGhl bWVzKSAnbW9kdXMtb3BlcmFuZGkpCiAgICAgIChteS1kZW1vLW1vZHVzLXZpdmVuZGkpCiAgICAo bXktZGVtby1tb2R1cy1vcGVyYW5kaSkpKQojK2VuZF9zcmMKClRoZW4gYXNzaWduIH5teS1kZW1v LW1vZHVzLXRoZW1lcy10b2dnbGV+IHRvIGEga2V5IGluc3RlYWQgb2YgdGhlCmVxdWl2YWxlbnQg dGhlIHRoZW1lcyBwcm92aWRlLgoKRm9yIGEgbW9yZSBlbGFib3JhdGUgZGVzaWduLCBpdCBpcyBi ZXR0ZXIgdG8gaW5zcGVjdCB0aGUgc291cmNlIGNvZGUgb2YKfm1vZHVzLXRoZW1lcy10b2dnbGV+ IGFuZCByZWxldmFudCBmdW5jdGlvbnMuCgoqKiBDYXNlLWJ5LWNhc2UgZmFjZSBzcGVjcyB1c2lu ZyB0aGUgdGhlbWVzJyBwYWxldHRlIChESVkpCjpwcm9wZXJ0aWVzOgo6Y3VzdG9tX2lkOiBoOjE0 ODdjNjMxLWY0ZmUtNDkwZC04ZDU4LWQ3MmZmYTNiZDQ3NAo6ZW5kOgojK2ZpbmRleDogbW9kdXMt dGhlbWVzLWNvbG9yCiMrZmluZGV4OiBtb2R1cy10aGVtZXMtY29sb3ItYWx0cwojK2NpbmRleDog RXh0cmFjdGluZyBpbmRpdmlkdWFsIGNvbG9ycwoKVGhpcyBzZWN0aW9uIGlzIGFib3V0IHR3ZWFr aW5nIGluZGl2aWR1YWwgZmFjZXMuICBJZiB5b3UgcGxhbiB0byBkbwp0aGluZ3MgYXQgc2NhbGUs IGNvbnN1bHQgdGhlIG5leHQgc2VjdGlvbjogW1sjaDo1MWJhMzU0Ny1iOGM4LTQwZDYtYmE1YS00 NTg2NDc3ZmQ0YWVdW1NldCBtdWx0aXBsZSBmYWNlc11dLgoKV2UgYWxyZWFkeSBjb3ZlcmVkIGlu IHByZXZpb3VzIHNlY3Rpb25zIGhvdyB0byB0b2dnbGUgYmV0d2VlbiB0aGUgdGhlbWVzCmFuZCBo b3cgdG8gY29uZmlndXJlIG9wdGlvbnMgcHJpb3IgdG8gbG9hZGluZy4gIFdlIGFsc28gZXhwbGFp bmVkIHRoYXQKc29tZSBvZiB0aGUgZnVuY3Rpb25zIG1hZGUgYXZhaWxhYmxlIHRvIHVzZXJzIHdp bGwgZmlyZSB1cCBhIGhvb2sgdGhhdApjYW4gYmUgdXNlZCB0byBwYXNzIHR3ZWFrcyBpbiB0aGUg cG9zdC10aGVtZS1sb2FkIHBoYXNlLgoKTm93IGFzc3VtZSB5b3Ugd2lzaCB0byBjaGFuZ2UgYSBz aW5nbGUgZmFjZSwgc2F5LCB0aGUgfmN1cnNvcn4uICBBbmQgeW91CndvdWxkIGxpa2UgdG8gZ2V0 IHRoZSBzdGFuZGFyZCAiYmx1ZSIgY29sb3IgdmFsdWUgb2YgdGhlIGFjdGl2ZSBNb2R1cwp0aGVt ZSwgd2hldGhlciBpdCBpcyBNb2R1cyBPcGVyYW5kaSBvciBNb2R1cyBWaXZlbmRpLiAgVG8gZG8g dGhhdCwgeW91CmNhbiB1c2UgdGhlIH5tb2R1cy10aGVtZXMtY29sb3J+IGZ1bmN0aW9uLiAgSXQg YWNjZXB0cyBhIHN5bWJvbCB0aGF0IGlzCmFzc29jaWF0ZWQgd2l0aCBhIGNvbG9yIGluIH5tb2R1 cy10aGVtZXMtb3BlcmFuZGktY29sb3JzfiBhbmQKfm1vZHVzLXRoZW1lcy12aXZlbmRpLWNvbG9y c34uICBMaWtlIHRoaXM6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihtb2R1cy10aGVtZXMtY29s b3IgJ2JsdWUpCiMrZW5kX3NyYwoKVGhlIGZ1bmN0aW9uIGFsd2F5cyBleHRyYWN0cyB0aGUgY29s b3IgdmFsdWUgb2YgdGhlIGFjdGl2ZSBNb2R1cyB0aGVtZS4KCiMrYmVnaW5fc3JjIGVtYWNzLWxp c3AKKHByb2duCiAgKGxvYWQtdGhlbWUgJ21vZHVzLW9wZXJhbmRpIHQpCiAgKG1vZHVzLXRoZW1l cy1jb2xvciAnYmx1ZSkpICAgICAgICAgICA7ICIjMDAzMWE5IiBmb3IgYG1vZHVzLW9wZXJhbmRp JwoKKHByb2duCiAgKGxvYWQtdGhlbWUgJ21vZHVzLXZpdmVuZGkgdCkKICAobW9kdXMtdGhlbWVz LWNvbG9yICdibHVlKSkgICAgICAgICAgIDsgIiMyZmFmZmYiIGZvciBgbW9kdXMtdml2ZW5kaScK IytlbmRfc3JjCgpEbyB7e3trYmQoQy1oIHYpfX19IG9uIHRoZSBhZm9yZW1lbnRpb25lZCB2YXJp YWJsZXMgdG8gY2hlY2sgYWxsIHRoZSBhdmFpbGFibGUKc3ltYm9scyB0aGF0IGNhbiBiZSBwYXNz ZWQgdG8gdGhpcyBmdW5jdGlvbi4KCldpdGggdGhhdCBncmFudGVkLCBsZXQgdXMgZXhwYW5kIHRo ZSBleGFtcGxlIHRvIGFjdHVhbGx5IGNoYW5nZSB0aGUKfmN1cnNvcn4gZmFjZSdzIGJhY2tncm91 bmQgcHJvcGVydHkuICBXZSBlbXBsb3kgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIG9mCn5zZXQtZmFj ZS1hdHRyaWJ1dGV+OgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooc2V0LWZhY2UtYXR0cmlidXRl ICdjdXJzb3IgbmlsIDpiYWNrZ3JvdW5kIChtb2R1cy10aGVtZXMtY29sb3IgJ2JsdWUpKQojK2Vu ZF9zcmMKCklmIHlvdSBldmFsdWF0ZSB0aGlzIGZvcm0sIHlvdXIgY3Vyc29yIHdpbGwgYmVjb21l IGJsdWUuICBCdXQgaWYgeW91CmNoYW5nZSB0aGVtZXMsIHN1Y2ggYXMgd2l0aCB+bW9kdXMtdGhl bWVzLXRvZ2dsZX4sIHlvdXIgZWRpdHMgd2lsbCBiZQpsb3N0LCBiZWNhdXNlIHRoZSBuZXdseSBs b2FkZWQgdGhlbWUgd2lsbCBvdmVycmlkZSB0aGUgPTpiYWNrZ3JvdW5kPQphdHRyaWJ1dGUgeW91 IGhhZCBhc3NpZ25lZCB0byB0aGF0IGZhY2UuCgpGb3Igc3VjaCBjaGFuZ2VzIHRvIHBlcnNpc3Qs IHdlIG5lZWQgdG8gbWFrZSB0aGVtIGFmdGVyIGxvYWRpbmcgdGhlCnRoZW1lLiAgU28gd2UgcmVs eSBvbiB+bW9kdXMtdGhlbWVzLWFmdGVyLWxvYWQtdGhlbWUtaG9va34sIHdoaWNoIGdldHMKY2Fs bGVkIGZyb20gfm1vZHVzLXRoZW1lcy1sb2FkLW9wZXJhbmRpfiwgfm1vZHVzLXRoZW1lcy1sb2Fk LXZpdmVuZGl+LCBhcwp3ZWxsIGFzIHRoZSBjb21tYW5kIH5tb2R1cy10aGVtZXMtdG9nZ2xlfi4g IEhlcmUgaXMgYSBzYW1wbGUgZnVuY3Rpb24gdGhhdAp0d2Vha3MgdHdvIGZhY2VzIGFuZCB0aGVu IGdldHMgYWRkZWQgdG8gdGhlIGhvb2s6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihkZWZ1biBt eS1tb2R1cy10aGVtZXMtY3VzdG9tLWZhY2VzICgpCiAgKHNldC1mYWNlLWF0dHJpYnV0ZSAnY3Vy c29yIG5pbCA6YmFja2dyb3VuZCAobW9kdXMtdGhlbWVzLWNvbG9yICdibHVlKSkKICAoc2V0LWZh Y2UtYXR0cmlidXRlICdmb250LWxvY2stdHlwZS1mYWNlIG5pbCA6Zm9yZWdyb3VuZCAobW9kdXMt dGhlbWVzLWNvbG9yICdtYWdlbnRhLWFsdCkpKQoKKGFkZC1ob29rICdtb2R1cy10aGVtZXMtYWZ0 ZXItbG9hZC10aGVtZS1ob29rICMnbXktbW9kdXMtdGhlbWVzLWN1c3RvbS1mYWNlcykKIytlbmRf c3JjCgpbWyNoOjg2ZjY5MDZiLWYwOTAtNDZjYy05ODE2LTFmZThhZWIzODc3Nl1bQSB0aGVtZS1h Z25vc3RpYyBob29rIGZvciB0aGVtZSBsb2FkaW5nXV0uCgpVc2luZyB0aGlzIHByaW5jaXBsZSwg aXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHN0eWxlcyBvZiBmYWNlcwp3aXRob3V0IGhh dmluZyB0byBmaW5kIGNvbG9yIHZhbHVlcyBmb3IgZWFjaCBjYXNlLgoKQW5vdGhlciBhcHBsaWNh dGlvbiBpcyB0byBjb250cm9sIHRoZSBwcmVjaXNlIHdlaWdodCBmb3IgYm9sZApjb25zdHJ1Y3Rz LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHlvdXIgdHlwZWZhY2UgaGFzIHNldmVy YWwKdmFyaWFudHMgc3VjaCBhcyAiaGVhdnkiLCAiZXh0cmFib2xkIiwgInNlbWlib2xkIi4gIEFs bCB5b3UgaGF2ZSB0byBkbwppcyBlZGl0IHRoZSB+Ym9sZH4gZmFjZS4gIEZvciBleGFtcGxlOgoK IytiZWdpbl9zcmMgZW1hY3MtbGlzcAooc2V0LWZhY2UtYXR0cmlidXRlICdib2xkIG5pbCA6d2Vp Z2h0ICdzZW1pYm9sZCkKIytlbmRfc3JjCgpSZW1lbWJlciB0byB1c2UgdGhlIGN1c3RvbSBmdW5j dGlvbiBhbmQgaG9vayBjb21ibyB3ZSBkZW1vbnN0cmF0ZWQKYWJvdmUuICBCZWNhdXNlIHRoZSB0 aGVtZXMgZG8gbm90IGhhcmQtd2lyZSBhIHNwZWNpZmljIHdlaWdodCwgdGhpcwpzaW1wbGUgZm9y bSBpcyBlbm91Z2ggdG8gY2hhbmdlIHRoZSB3ZWlnaHQgb2YgYWxsIGJvbGQgY29uc3RydWN0cwp0 aHJvdWdob3V0IHRoZSBpbnRlcmZhY2UuCgpGaW5hbGx5LCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUg eW91IHdhbnQgdG8gdHdlYWsgY29sb3JzIHRob3VnaCB3aXNoIHRvCmFwcGx5IGRpZmZlcmVudCBv bmVzIHRvIGVhY2ggdGhlbWUsIHNheSwgYSBibHVlIGh1ZSBmb3IgTW9kdXMgT3BlcmFuZGkKYW5k IGEgc2hhZGUgb2YgcmVkIGZvciBNb2R1cyBWaXZlbmRpLiAgVG8gdGhpcyBlbmQsIHdlIHByb3Zp ZGUKfm1vZHVzLXRoZW1lcy1jb2xvci1hbHRzfiBhcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRv IHNhdmUgeW91IGZyb20gdGhlCnRyb3VibGUgb2Ygd3JpdGluZyBzZXBhcmF0ZSB3cmFwcGVycyBm b3IgZWFjaCB0aGVtZS4gIEl0IHN0aWxsIHJldHVybnMgYQpzaW5nbGUgdmFsdWUgYnkgcXVlcnlp bmcgZWl0aGVyIG9mIH5tb2R1cy10aGVtZXMtb3BlcmFuZGktY29sb3JzfiBhbmQKfm1vZHVzLXRo ZW1lcy12aXZlbmRpLWNvbG9yc34sIG9ubHkgaGVyZSB5b3UgcGFzcyB0aGUgdHdvIGtleXMgeW91 IHdhbnQsCmZpcnN0IGZvciB+bW9kdXMtb3BlcmFuZGl+IHRoZW4gfm1vZHVzLXZpdmVuZGl+LgoK VGFrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSB3aXRoIHRoZSB+Y3Vyc29yfiBmYWNlOgoKIytiZWdp bl9zcmMgZW1hY3MtbGlzcAo7OyBCbHVlIGZvciBgbW9kdXMtb3BlcmFuZGknIGFuZCByZWQgZm9y IGBtb2R1cy12aXZlbmRpJwooc2V0LWZhY2UtYXR0cmlidXRlICdjdXJzb3IgbmlsIDpiYWNrZ3Jv dW5kIChtb2R1cy10aGVtZXMtY29sb3ItYWx0cyAnYmx1ZSAncmVkKSkKIytlbmRfc3JjCgoqKiBG YWNlIHNwZWNzIGF0IHNjYWxlIHVzaW5nIHRoZSB0aGVtZXMnIHBhbGV0dGUgKERJWSkKOnByb3Bl cnRpZXM6CjpjdXN0b21faWQ6IGg6NTFiYTM1NDctYjhjOC00MGQ2LWJhNWEtNDU4NjQ3N2ZkNGFl CjplbmQ6CiMrZmluZGV4OiBtb2R1cy10aGVtZXMtd2l0aC1jb2xvcnMKIytjaW5kZXg6IEV4dHJh Y3RpbmcgY29sb3JzIGVuIG1hc3NlCgpUaGUgZXhhbXBsZXMgaGVyZSBhcmUgZm9yIGxhcmdlIHNj YWxlIG9wZXJhdGlvbnMuICBGb3Igc2ltcGxlLCBvbmUtb2ZmCnR3ZWFrcywgeW91IG1heSBwcmVm ZXIgdGhlIGFwcHJvYWNoIGRvY3VtZW50ZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24KKFtbI2g6 MTQ4N2M2MzEtZjRmZS00OTBkLThkNTgtZDcyZmZhM2JkNDc0XVtDYXNlLWJ5LWNhc2UgZmFjZSBz cGVjcyB1c2luZyB0aGUgdGhlbWVzJyBwYWxldHRlXV0pLgoKVGhlIH5tb2R1cy10aGVtZXMtd2l0 aC1jb2xvcnN+IG1hY3JvIGxldHMgeW91IHJldHJpZXZlIG11bHRpcGxlIGNvbG9yCnZhbHVlcyBi eSBlbXBsb3lpbmcgdGhlIGJhY2txdW90ZS9iYWNrdGljayBhbmQgY29tbWEgbm90YXRpb24uICBU aGUKdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGFsaXN0cyB+bW9kdXMtdGhlbWVzLW9wZXJhbmRp LWNvbG9yc34gYW5kCn5tb2R1cy10aGVtZXMtdml2ZW5kaS1jb2xvcnN+LCB3aGlsZSB0aGUgbWFj cm8gYWx3YXlzIHF1ZXJpZXMgdGhhdCBvZiB0aGUKYWN0aXZlIE1vZHVzIHRoZW1lLgoKSGVyZSBp cyBhbiBhYnN0cmFjdCBleGFtcGxlIHRoYXQganVzdCByZXR1cm5zIGEgbGlzdCBvZiBjb2xvciB2 YWx1ZXMKd2hpbGUgfm1vZHVzLW9wZXJhbmRpfiBpcyBlbmFibGVkOgoKIytiZWdpbl9zcmMgZW1h Y3MtbGlzcAoobW9kdXMtdGhlbWVzLXdpdGgtY29sb3JzCiAgKGxpc3QgZmctbWFpbgogICAgICAg IGJsdWUtZmFpbnQKICAgICAgICBtYWdlbnRhCiAgICAgICAgbWFnZW50YS1hbHQtb3RoZXIKICAg ICAgICBjeWFuLWFsdC1vdGhlcgogICAgICAgIGZnLXNwZWNpYWwtY29sZAogICAgICAgIGJsdWUt YWx0CiAgICAgICAgbWFnZW50YS1mYWludAogICAgICAgIGN5YW4KICAgICAgICBmZy1tYWluCiAg ICAgICAgZ3JlZW4tZmFpbnQKICAgICAgICByZWQtYWx0LWZhaW50CiAgICAgICAgYmx1ZS1hbHQt ZmFpbnQKICAgICAgICBmZy1zcGVjaWFsLXdhcm0KICAgICAgICBjeWFuLWFsdAogICAgICAgIGJs dWUpKQo7OyA9Pgo7OyAoIiMwMDAwMDAiICIjMDAyZjg4IiAiIzcyMTA0NSIgIiM1MzE3YWMiCjs7 ICAiIzAwNWE1ZiIgIiMwOTMwNjAiICIjMjU0NGJiIiAiIzc1MmY1MCIKOzsgICIjMDA1MzhiIiAi IzAwMDAwMCIgIiMxMDQ0MTAiICIjNzAyZjAwIgo7OyAgIiMwMDNmNzgiICIjNWQzMDI2IiAiIzMw NTE3ZiIgIiMwMDMxYTkiKQojK2VuZF9zcmMKCkdldHRpbmcgYSBsaXN0IG9mIGNvbG9ycyBtYXkg aGF2ZSBpdHMgYXBwbGljYXRpb25zLCB0aG91Z2ggd2hhdCB5b3UgYXJlCm1vc3QgbGlrZWx5IGlu dGVyZXN0ZWQgaW4gaXMgaG93IHRvIHVzZSB0aG9zZSB2YXJpYWJsZXMgdG8gY29uZmlndXJlCnNl dmVyYWwgZmFjZXMgYXQgb25jZS4gIFRvIGRvIHNvIHdlIGNhbiByZWx5IG9uIHRoZSBidWlsdC1p bgp+Y3VzdG9tLXNldC1mYWNlc34gZnVuY3Rpb24sIHdoaWNoIHNldHMgZmFjZSBzcGVjaWZpY2F0 aW9ucyBmb3IgdGhlCnNwZWNpYWwgPXVzZXI9IHRoZW1lLiAgVGhhdCAidGhlbWUiIGdldHMgYXBw bGllZCBvbiB0b3Agb2YgcmVndWxhciB0aGVtZXMKbGlrZSB+bW9kdXMtb3BlcmFuZGl+IGFuZCB+ bW9kdXMtdml2ZW5kaX4uCgpUaGlzIGlzIGhvdyBpdCB3b3JrczoKCiMrYmVnaW5fc3JjIGVtYWNz LWxpc3AKKG1vZHVzLXRoZW1lcy13aXRoLWNvbG9ycwogIChjdXN0b20tc2V0LWZhY2VzCiAgIGAo Y3Vyc29yICgoLGNsYXNzIDpiYWNrZ3JvdW5kICxibHVlKSkpCiAgIGAobW9kZS1saW5lICgoLGNs YXNzIDpiYWNrZ3JvdW5kICx5ZWxsb3ctbnVhbmNlZC1iZwogICAgICAgICAgICAgICAgICAgICAg ICA6Zm9yZWdyb3VuZCAseWVsbG93LW51YW5jZWQtZmcpKSkKICAgYChtb2RlLWxpbmUtaW5hY3Rp dmUgKCgsY2xhc3MgOmJhY2tncm91bmQgLGJsdWUtbnVhbmNlZC1iZwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA6Zm9yZWdyb3VuZCAsYmx1ZS1udWFuY2VkLWZnKSkpKSkKIytlbmRf c3JjCgpUaGUgYWJvdmUgc25pcHBldCB3aWxsIGltbWVkaWF0ZWx5IHJlZmFzaGlvbiB0aGUgZmFj ZXMgaXQgbmFtZXMgb25jZSBpdAppcyBldmFsdWF0ZWQuICBIb3dldmVyLCBpZiB5b3Ugc3dpdGNo IGJldHdlZW4gdGhlIE1vZHVzIHRoZW1lcywgc2F5LApmcm9tIH5tb2R1cy1vcGVyYW5kaX4gdG8g fm1vZHVzLXZpdmVuZGl+LCB0aGUgY29sb3JzIHdpbGwgbm90IGdldCB1cGRhdGVkIHRvCm1hdGNo IHRob3NlIG9mIHRoZSBuZXcgdGhlbWUuICBUbyBtYWtlIHRoaW5ncyB3b3JrIGFjcm9zcyB0aGUg dGhlbWVzLCB3ZQpuZWVkIHRvIGVtcGxveSB0aGUgc2FtZSB0ZWNobmlxdWUgd2UgZGlzY3Vzc2Vk IGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLApuYW1lbHksIHRvIHBhc3Mgb3VyIGNoYW5nZXMgYXQg dGhlIHBvc3QtdGhlbWUtbG9hZCBwaGFzZSB2aWEgYSBob29rLgoKVGhlIHRoZW1lcyBwcm92aWRl IHRoZSB+bW9kdXMtdGhlbWVzLWFmdGVyLWxvYWQtdGhlbWUtaG9va34sIHdoaWNoIGdldHMKY2Fs bGVkIGZyb20gfm1vZHVzLXRoZW1lcy1sb2FkLW9wZXJhbmRpfiwgfm1vZHVzLXRoZW1lcy1sb2Fk LXZpdmVuZGl+LCBhcwp3ZWxsIGFzIHRoZSBjb21tYW5kIH5tb2R1cy10aGVtZXMtdG9nZ2xlfi4g IFdpdGggdGhpcyBrbm93bGVkZ2UsIHlvdSBjYW4Kd3JhcCB0aGUgbWFjcm8gaW4gYSBmdW5jdGlv biBhbmQgdGhlbiBhc3NpZ24gdGhhdCBmdW5jdGlvbiB0byB0aGUgaG9vay4KVGh1czoKCiMrYmVn aW5fc3JjIGVtYWNzLWxpc3AKKGRlZnVuIG15LW1vZHVzLXRoZW1lcy1jdXN0b20tZmFjZXMgKCkK ICAobW9kdXMtdGhlbWVzLXdpdGgtY29sb3JzCiAgICAoY3VzdG9tLXNldC1mYWNlcwogICAgIGAo Y3Vyc29yICgoLGNsYXNzIDpiYWNrZ3JvdW5kICxibHVlKSkpCiAgICAgYChtb2RlLWxpbmUgKCgs Y2xhc3MgOmJhY2tncm91bmQgLHllbGxvdy1udWFuY2VkLWJnCiAgICAgICAgICAgICAgICAgICAg ICAgICAgOmZvcmVncm91bmQgLHllbGxvdy1udWFuY2VkLWZnKSkpCiAgICAgYChtb2RlLWxpbmUt aW5hY3RpdmUgKCgsY2xhc3MgOmJhY2tncm91bmQgLGJsdWUtbnVhbmNlZC1iZwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDpmb3JlZ3JvdW5kICxibHVlLW51YW5jZWQtZmcpKSkp KSkKCihhZGQtaG9vayAnbW9kdXMtdGhlbWVzLWFmdGVyLWxvYWQtdGhlbWUtaG9vayAjJ215LW1v ZHVzLXRoZW1lcy1jdXN0b20tZmFjZXMpCiMrZW5kX3NyYwoKW1sjaDo4NmY2OTA2Yi1mMDkwLTQ2 Y2MtOTgxNi0xZmU4YWViMzg3NzZdW0EgdGhlbWUtYWdub3N0aWMgaG9vayBmb3IgdGhlbWUgbG9h ZGluZ11dLgoKVG8gZGlzY292ZXIgdGhlIGZhY2VzIGRlZmluZWQgYnkgYWxsIGxvYWRlZCBsaWJy YXJpZXMsIHlvdSBtYXkgZG8Ke3t7a2JkKE0teCBsaXN0LWZhY2VzLWRpc3BsYXkpfX19LiAgQmUg d2FybmVkIHRoYXQgd2hlbiB5b3UgPTppbmhlcml0PSBhIGZhY2UKeW91IGFyZSBpbnRyb2R1Y2lu ZyBhbiBpbXBsaWNpdCBkZXBlbmRlbmN5LCBzbyB0cnkgdG8gYXZvaWQgZG9pbmcgc28gZm9yCmxp YnJhcmllcyBvdGhlciB0aGFuIHRoZSBidWlsdC1pbiB7e3tmaWxlKGZhY2VzLmVsKX19fSAob3Ig YXQgbGVhc3QgdW5kZXJzdGFuZAp0aGF0IHRoaW5ncyBtYXkgYnJlYWsgaWYgeW91IGluaGVyaXQg ZnJvbSBhIHlldC10by1iZS1sb2FkZWQgZmFjZSkuCgpBbHNvIGJlYXIgaW4gbWluZCB0aGF0IHRo ZXNlIGV4YW1wbGVzIGFyZSBtZWFudCB0byB3b3JrIHdpdGggdGhlIE1vZHVzCnRoZW1lcy4gIElm IHlvdSBhcmUgY3ljbGluZyBiZXR3ZWVuIG11bHRpcGxlIHRoZW1lcyB5b3UgbWF5IGVuY291bnRl cgp1bmZvcmVzZWVuIGlzc3Vlcywgc3VjaCBhcyB0aGUgY29sb3JzIG9mIHRoZSBNb2R1cyB0aGVt ZXMgYmVpbmcgYXBwbGllZAp0byBhIG5vbi1Nb2R1cyBpdGVtLgoKRmluYWxseSwgbm90ZSB0aGF0 IHlvdSBjYW4gc3RpbGwgdXNlIG90aGVyIGZ1bmN0aW9ucyB3aGVyZSB0aG9zZSBtYWtlCnNlbnNl LiAgRm9yIGV4YW1wbGUsIHRoZSB+bW9kdXMtdGhlbWVzLWNvbG9yLWFsdHN+IHRoYXQgd2FzIGRp c2N1c3NlZCBpbgp0aGUgcHJldmlvdXMgc2VjdGlvbi4gIEFkYXB0IHRoZSBhYm92ZSBleGFtcGxl IGxpa2UgdGhpczoKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKLi4uCihtb2R1cy10aGVtZXMtd2l0 aC1jb2xvcnMKICAoY3VzdG9tLXNldC1mYWNlcwogICBgKGN1cnNvciAoKCxjbGFzcyA6YmFja2dy b3VuZCAsKG1vZHVzLXRoZW1lcy1jb2xvci1hbHRzICdibHVlICdncmVlbikpKSkKICAgLi4uKSkK IytlbmRfc3JjCgoqKiBPdmVycmlkZSBjb2xvcnMgKERJWSkKOnByb3BlcnRpZXM6CjpjdXN0b21f aWQ6IGg6MzA3ZDk1ZGQtOGRiZC00ZWNlLWE1NDMtMTBhZTg2ZjE1NWE2CjplbmQ6CiMrdmluZGV4 OiBtb2R1cy10aGVtZXMtb3BlcmFuZGktY29sb3Itb3ZlcnJpZGVzCiMrdmluZGV4OiBtb2R1cy10 aGVtZXMtdml2ZW5kaS1jb2xvci1vdmVycmlkZXMKIytjaW5kZXg6IENoYW5nZSBhIHRoZW1lJ3Mg Y29sb3JzCgpUaGUgdGhlbWVzIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIG92ZXJyaWRpbmcgdGhl aXIgY29sb3IgdmFsdWVzLiAgVGhpcwppcyBjb250cm9sbGVkIGJ5IHRoZSB2YXJpYWJsZXMgfm1v ZHVzLXRoZW1lcy1vcGVyYW5kaS1jb2xvci1vdmVycmlkZXN+IGFuZAp+bW9kdXMtdGhlbWVzLXZp dmVuZGktY29sb3Itb3ZlcnJpZGVzfiwgd2hpY2ggYXJlIGFsaXN0cyB0aGF0IHNob3VsZAptaXJy b3IgYSBzdWJzZXQgb2YgdGhlIGFzc29jaWF0aW9ucyBpbiB+bW9kdXMtdGhlbWVzLW9wZXJhbmRp LWNvbG9yc34gYW5kCn5tb2R1cy10aGVtZXMtdml2ZW5kaS1jb2xvcnN+IHJlc3BlY3RpdmVseS4g IEFzIHdpdGggYWxsIGN1c3RvbWlzYXRpb25zLApvdmVycmlkaW5nIG11c3QgYmUgZG9uZSBiZWZv cmUgbG9hZGluZyB0aGUgYWZmZWN0ZWQgdGhlbWUuCgpMZXQgdXMgYXBwcm9hY2ggdGhlIHByZXNl bnQgdG9waWMgb25lIHN0ZXAgYXQgYSB0aW1lLiAgSGVyZSBpcyBhCnNpbXBsaWZpZWQgZXhjZXJw dCBvZiB0aGUgZGVmYXVsdCBwYWxldHRlIGZvciBNb2R1cyBPcGVyYW5kaSB3aXRoIHNvbWUKYmFz aWMgYmFja2dyb3VuZCB2YWx1ZXMgdGhhdCBhcHBseSB0byBidWZmZXJzIGFuZCB0aGUgbW9kZSBs aW5lCihyZW1lbWJlciB0byBpbnNwZWN0IHRoZSBhY3R1YWwgdmFsdWUgdG8gZmluZCBvdXQgYWxs IHRoZSBhc3NvY2lhdGlvbnMKdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbik6CgojK2JlZ2luX3NyYyBl bWFjcy1saXNwCihkZWZjb25zdCBtb2R1cy10aGVtZXMtY29sb3JzLW9wZXJhbmRpCiAgJygoYmct bWFpbiAuICIjZmZmZmZmIikKICAgIChiZy1kaW0gLiAiI2Y4ZjhmOCIpCiAgICAoYmctYWx0IC4g IiNmMGYwZjAiKQogICAgKGJnLWFjdGl2ZSAuICIjZDdkN2Q3IikKICAgIChiZy1pbmFjdGl2ZSAu ICIjZWZlZmVmIikpKQojK2VuZF9zcmMKCkFzIG9uZSBjYW4gdGVsbCwgd2UgYmluZCBhIGtleSB0 byBhIGhleGFkZWNpbWFsIFJHQiBjb2xvciB2YWx1ZS4gIE5vdwpzYXkgd2Ugd2lzaCB0byBvdmVy cmlkZSB0aG9zZSBzcGVjaWZpYyB2YWx1ZXMgYW5kIGhhdmUgb3VyIGNoYW5nZXMKcHJvcGFnYXRl IHRvIGFsbCBmYWNlcyB0aGF0IHVzZSB0aG9zZSBrZXlzLiAgV2UgY291bGQgd3JpdGUgc29tZXRo aW5nCmxpa2UgdGhpcywgd2hpY2ggYWRkcyBhIHN1YnRsZSBvY2hyZSB0aW50OgoKIytiZWdpbl9z cmMgZW1hY3MtbGlzcAooc2V0cSBtb2R1cy10aGVtZXMtb3BlcmFuZGktY29sb3Itb3ZlcnJpZGVz CiAgICAgICcoKGJnLW1haW4gLiAiI2ZlZmNmNCIpCiAgICAgICAgKGJnLWRpbSAuICIjZmFmNmVm IikKICAgICAgICAoYmctYWx0IC4gIiNmN2VmZTUiKQogICAgICAgIChiZy1hY3RpdmUgLiAiI2U4 ZGZkMSIpCiAgICAgICAgKGJnLWluYWN0aXZlIC4gIiNmNmVjZTUiKSkpCiMrZW5kX3NyYwoKT25j ZSB0aGlzIGlzIGV2YWx1YXRlZCwgYW55IHN1YnNlcXVlbnQgbG9hZGluZyBvZiB+bW9kdXMtb3Bl cmFuZGl+IHdpbGwKdXNlIHRob3NlIHZhbHVlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0cy4gIE5v IGZ1cnRoZXIgaW50ZXJ2ZW50aW9uIGlzCnJlcXVpcmVkLgoKVG8gcmVzZXQgdGhlIGNoYW5nZXMs IHdlIGFwcGx5IHRoaXMgYW5kIHJlbG9hZCB0aGUgdGhlbWU6CgojK2JlZ2luX3NyYyBlbWFjcy1s aXNwCihzZXRxIG1vZHVzLXRoZW1lcy1vcGVyYW5kaS1jb2xvci1vdmVycmlkZXMgbmlsKQojK2Vu ZF9zcmMKClVzZXJzIHdobyB3aXNoIHRvIGxldmVyYWdlIHN1Y2ggYSBtZWNoYW5pc20gY2FuIG9w dCB0byBpbXBsZW1lbnQgaXQKb24tZGVtYW5kIGJ5IG1lYW5zIG9mIGEgZ2xvYmFsIG1pbm9yIG1v ZGUuICBUaGUgZm9sbG93aW5nIHNuaXBwZXQgY292ZXJzCmJvdGggdGhlbWVzIGFuZCBleHBhbmRz IHRvIHNvbWUgbW9yZSBhc3Nvc2lhdGlvbnMgaW4gdGhlIHBhbGV0dGU6CgojK2JlZ2luX3NyYyBl bWFjcy1saXNwCihkZWZpbmUtbWlub3ItbW9kZSBteS1tb2R1cy10aGVtZXMtdGludGVkCiAgIlR3 ZWFrIHNvbWUgTW9kdXMgdGhlbWVzIGNvbG9ycy4iCiAgOmluaXQtdmFsdWUgbmlsCiAgOmdsb2Jh bCB0CiAgKGlmIG15LW1vZHVzLXRoZW1lcy10aW50ZWQKICAgICAgKHNldHEgbW9kdXMtdGhlbWVz LW9wZXJhbmRpLWNvbG9yLW92ZXJyaWRlcwogICAgICAgICAgICAnKChiZy1tYWluIC4gIiNmZWZj ZjQiKQogICAgICAgICAgICAgIChiZy1kaW0gLiAiI2ZhZjZlZiIpCiAgICAgICAgICAgICAgKGJn LWFsdCAuICIjZjdlZmU1IikKICAgICAgICAgICAgICAoYmctaGwtbGluZSAuICIjZjRmMGUzIikK ICAgICAgICAgICAgICAoYmctYWN0aXZlIC4gIiNlOGRmZDEiKQogICAgICAgICAgICAgIChiZy1p bmFjdGl2ZSAuICIjZjZlY2U1IikKICAgICAgICAgICAgICAoYmctcmVnaW9uIC4gIiNjNmJhYjEi KQogICAgICAgICAgICAgIChiZy1oZWFkZXIgLiAiI2VkZTNlMCIpCiAgICAgICAgICAgICAgKGJn LXRhYi1iYXIgLiAiI2RjZDNkMyIpCiAgICAgICAgICAgICAgKGJnLXRhYi1hY3RpdmUgLiAiI2Zk ZjZlYiIpCiAgICAgICAgICAgICAgKGJnLXRhYi1pbmFjdGl2ZSAuICIjYzhiYWI4IikKICAgICAg ICAgICAgICAoZmctdW5mb2N1c2VkIC4gIiM1NTU1NmYiKSkKICAgICAgICAgICAgbW9kdXMtdGhl bWVzLXZpdmVuZGktY29sb3Itb3ZlcnJpZGVzCiAgICAgICAgICAgICcoKGJnLW1haW4gLiAiIzEw MGIxNyIpCiAgICAgICAgICAgICAgKGJnLWRpbSAuICIjMTYxMTI5IikKICAgICAgICAgICAgICAo YmctYWx0IC4gIiMxODE3MzIiKQogICAgICAgICAgICAgIChiZy1obC1saW5lIC4gIiMxOTE2Mjgi KQogICAgICAgICAgICAgIChiZy1hY3RpdmUgLiAiIzI4MmU0NiIpCiAgICAgICAgICAgICAgKGJn LWluYWN0aXZlIC4gIiMxYTFlMzkiKQogICAgICAgICAgICAgIChiZy1yZWdpb24gLiAiIzM5M2E1 MyIpCiAgICAgICAgICAgICAgKGJnLWhlYWRlciAuICIjMjAyMDM3IikKICAgICAgICAgICAgICAo YmctdGFiLWJhciAuICIjMjYyYjQxIikKICAgICAgICAgICAgICAoYmctdGFiLWFjdGl2ZSAuICIj MTIwZjE4IikKICAgICAgICAgICAgICAoYmctdGFiLWluYWN0aXZlIC4gIiMzYTNhNWEiKQogICAg ICAgICAgICAgIChmZy11bmZvY3VzZWQgLiAiIzlhOWFhYiIpKSkKICAgIChzZXRxIG1vZHVzLXRo ZW1lcy1vcGVyYW5kaS1jb2xvci1vdmVycmlkZXMgbmlsCiAgICAgICAgICBtb2R1cy10aGVtZXMt dml2ZW5kaS1jb2xvci1vdmVycmlkZXMgbmlsKSkpCiMrZW5kX3NyYwoKV2l0aCB0aGlzIGluIHBs YWNlLCBvbmUgY2FuIGludm9rZSB7e3trYmQoTS14IG15LW1vZHVzLXRoZW1lcy10aW50ZWQpfX19 IGFuZAp0aGVuIGxvYWQgdGhlIE1vZHVzIHRoZW1lIG9mIHRoZWlyIGNob2ljZS4gIFRoZSBuZXcg cGFsZXR0ZSBzdWJzZXQgd2lsbApjb21lIGludG8gZWZmZWN0OiBzdWJ0bGUgb2NocmUgdGludHMg Zm9yIE1vZHVzIE9wZXJhbmRpIGFuZCBuaWdodCBza3kKc2hhZGVzIGZvciBNb2R1cyBWaXZlbmRp LiAgU3dpdGNoaW5nIGJldHdlZW4gdGhlIHR3byB0aGVtZXMsIHN1Y2ggYXMKd2l0aCB7e3trYmQo TS14IG1vZHVzLXRoZW1lcy10b2dnbGUpfX19IHdpbGwgYWxzbyB1c2UgdGhlIG92ZXJyaWRlcy4K CkdpdmVuIHRoYXQgdGhpcyBpcyBhIHVzZXItbGV2ZWwgY3VzdG9taXNhdGlvbiwgb25lIGlzIGZy ZWUgdG8gaW1wbGVtZW50CndoYXRldmVyIGNvbG9yIHZhbHVlcyB0aGV5IGRlc2lyZSwgZXZlbiBp ZiB0aGUgcG9zc2libGUgY29tYmluYXRpb25zCmZhbGwgYmVsb3cgdGhlIG1pbmltdW0gNzoxIGNv bnRyYXN0IHJhdGlvIHRoYXQgZ292ZXJucyB0aGUgZGVzaWduIG9mIHRoZQp0aGVtZXMgKHRoZSBX Q0FHIEFBQSBsZWdpYmlsaXR5IHN0YW5kYXJkKS4gIFByZWZlcmVuY2VzIGFzaWRlLCBpdCBpcwph ZHZpc2VkIHRvIGluc3BlY3QgdGhlIHNvdXJjZSBjb2RlIG9mIH5tb2R1cy10aGVtZXMtb3BlcmFu ZGktY29sb3JzfiBhbmQKfm1vZHVzLXRoZW1lcy12aXZlbmRpLWNvbG9yc34gdG8gcmVhZCB0aGUg aW5saW5lIGNvbW1lbnRhcnk6IGl0IGV4cGxhaW5zCndoYXQgdGhlIGludGVuZGVkIHVzZSBvZiBl YWNoIHBhbGV0dGUgc3Vic2V0IGlzLgoKRnVydGhlcm1vcmUsIHVzZXJzIG1heSBiZW5lZml0IGZy b20gdGhlIH5tb2R1cy10aGVtZXMtY29udHJhc3R+IGZ1bmN0aW9uCnRoYXQgd2UgcHJvdmlkZTog W1sjaDowMmUyNTkzMC1lNzFhLTQ5M2QtODI4YS04OTA3ZmM4MGY4NzRdW3Rlc3QgY29sb3IgY29t YmluYXRpb25zXV0uICBJdCBtZWFzdXJlcyB0aGUgY29udHJhc3QKcmF0aW8gYmV0d2VlbiB0d28g Y29sb3IgdmFsdWVzLCBzbyBpdCBjYW4gaGVscCBpbiBvdmVycmlkaW5nIHRoZSBwYWxldHRlCihv ciBhIHN1YnNldCB0aGVyZW9mKSB3aXRob3V0IG1ha2luZyB0aGUgZW5kIHJlc3VsdCBpbmFjY2Vz c2libGUuCgoqKiBGb250IGNvbmZpZ3VyYXRpb25zIGZvciBPcmcgYW5kIG90aGVycyAoRElZKQo6 cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDpkZWZjZjRmYy04ZmE4LTRjMjktYjEyZS03MTE5NTgy Y2M5MjkKOmVuZDoKIytjaW5kZXg6IEZvbnQgY29uZmlndXJhdGlvbnMKClRoZSB0aGVtZXMgYXJl IGRlc2lnbmVkIHRvIGNvcGUgd2VsbCB3aXRoIG1peGVkIGZvbnQgY29uZmlndXJhdGlvbnMuCgpb WyNoOjExNWU2YzIzLWVlMzUtNGExNi04Y2VmLWUyZmNiYjA4ZTI4Yl1bT3B0aW9uIGZvciBubyBm b250IG1peGluZ11dLgoKVGhpcyBtb3N0bHkgY29uY2VybnMgfm9yZy1tb2RlfiBhbmQgfm1hcmtk b3duLW1vZGV+LCB0aG91Z2ggZXhwZWN0IHRvIGZpbmQKaXQgZWxzZXdoZXJlIGxpa2UgaW4gfklu Zm8tbW9kZX4uCgpJbiBwcmFjdGljZSBpdCBtZWFucyB0aGF0IHRoZSB1c2VyIGNhbiBzYWZlbHkg b3B0IGZvciBhIG1vcmUKcHJvc2UtZnJpZW5kbHkgcHJvcG9ydGlvbmF0ZWx5IHNwYWNlZCB0eXBl ZmFjZSBhcyB0aGVpciBkZWZhdWx0LCB3aGlsZQpsZXR0aW5nIHNwYWNpbmctc2Vuc2l0aXZlIGVs ZW1lbnRzIGxpa2UgdGFibGVzIGFuZCBpbmxpbmUgY29kZSBhbHdheXMKdXNlIGEgbW9ub3NwYWNl ZCBmb250LCBieSBpbmhlcml0aW5nIGZyb20gdGhlIH5maXhlZC1waXRjaH4gZmFjZS4KClVzZXJz IGNhbiB0cnkgdGhlIGJ1aWx0LWluIHt7e2tiZChNLXggdmFyaWFibGUtcGl0Y2gtbW9kZSl9fX0g dG8gc2VlIHRoZQplZmZlY3QgaW4gYWN0aW9uLgoKVG8gbWFrZSBldmVyeXRoaW5nIHVzZSB5b3Vy IGRlc2lyZWQgZm9udCBmYW1pbGllcywgeW91IG5lZWQgdG8gY29uZmlndXJlCnRoZSB+dmFyaWFi bGUtcGl0Y2h+IChwcm9wb3J0aW9uYWwgc3BhY2luZykgYW5kIH5maXhlZC1waXRjaH4gKG1vbm9z cGFjZWQpCmZhY2VzIHJlc3BlY3RpdmVseS4gIEl0IG1heSBhbHNvIGJlIGNvbnZlbmllbnQgdG8g c2V0IHlvdXIgbWFpbiB0eXBlZmFjZQpieSBjb25maWd1cmluZyB0aGUgfmRlZmF1bHR+IGZhY2Ug dGhlIHNhbWUgd2F5LgoKUHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4geW91ciBpbml0aWFsaXph dGlvbiBmaWxlIChhbHNvIGNvbnNpZGVyCnJlYWRpbmcgdGhlIGRvYyBzdHJpbmcgb2YgfnNldC1m YWNlLWF0dHJpYnV0ZX4pOgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAo7OyBNYWluIHR5cGVmYWNl CihzZXQtZmFjZS1hdHRyaWJ1dGUgJ2RlZmF1bHQgbmlsIDpmYW1pbHkgIkRlamFWdSBTYW5zIE1v bm8iIDpoZWlnaHQgMTEwKQoKOzsgUHJvcG9ydGlvbmF0ZWx5IHNwYWNlZCB0eXBlZmFjZQooc2V0 LWZhY2UtYXR0cmlidXRlICd2YXJpYWJsZS1waXRjaCBuaWwgOmZhbWlseSAiRGVqYVZ1IFNlcmlm IiA6aGVpZ2h0IDEuMCkKCjs7IE1vbm9zcGFjZWQgdHlwZWZhY2UKKHNldC1mYWNlLWF0dHJpYnV0 ZSAnZml4ZWQtcGl0Y2ggbmlsIDpmYW1pbHkgIkRlamFWdSBTYW5zIE1vbm8iIDpoZWlnaHQgMS4w KQojK2VuZF9zcmMKCk5vdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSA9OmhlaWdodD0gcHJvcGVy dHkuICBUaGUgPWRlZmF1bHQ9IGZhY2UgbXVzdApzcGVjaWZ5IGFuIGFic29sdXRlIHZhbHVlLCB3 aGljaCBpcyB0aGUgcG9pbnQgc2l6ZSDDlyAxMC4gIFNvIGlmIHlvdSB3YW50CnRvIHVzZSBhIGZv bnQgYXQgcG9pbnQgc2l6ZSA9MTE9LCB5b3Ugc2V0IHRoZSBoZWlnaHQgdG8gPTExMD0uW2ZuOjog PTpoZWlnaHQ9CnZhbHVlcyBkbyBub3QgbmVlZCB0byBiZSByb3VuZGVkIHRvIG11bHRpcGxlcyBv ZiB0ZW46IHRoZSBsaWtlcyBvZiA9MTE1PQphcmUgcGVyZmVjdGx5IHZhbGlk4oCUc29tZSB0eXBl ZmFjZXMgd2lsbCBjaGFuZ2UgdG8gYWNjb3VudCBmb3IgdGhvc2UKZmluZXIgaW5jcmVtZW50cy5d ICBXaGVyZWFzIGV2ZXJ5IG90aGVyIGZhY2UgbXVzdCBoYXZlIGEgdmFsdWUgdGhhdCBpcwpyZWxh dGl2ZSB0byB0aGUgZGVmYXVsdCwgcmVwcmVzZW50ZWQgYXMgYSBmbG9hdGluZyBwb2ludCAoaWYg eW91IHVzZSBhbgppbnRlZ2VyLCB0aGVuIHRoYXQgbWVhbnMgYW4gYWJzb2x1dGUgaGVpZ2h0KS4g IFRoaXMgaXMgb2YgcGFyYW1vdW50CmltcG9ydGFuY2U6IGl0IGVuc3VyZXMgdGhhdCBhbGwgZm9u dHMgY2FuIHNjYWxlIGdyYWNlZnVsbHkgd2hlbiB1c2luZwpzb21ldGhpbmcgbGlrZSB0aGUgfnRl eHQtc2NhbGUtYWRqdXN0fiBjb21tYW5kIHdoaWNoIG9ubHkgb3BlcmF0ZXMgb24gdGhlCmJhc2Ug Zm9udCBzaXplIChpLmUuIHRoZSB+ZGVmYXVsdH4gZmFjZSdzIGFic29sdXRlIGhlaWdodCkuCgoq KiBDdXN0b20gT3JnIHVzZXIgZmFjZXMgKERJWSkKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6 ODlmMDY3OGQtYzVjMy00YTU3LWE1MjYtNjY4YjJiYjJkN2FkCjplbmQ6CiMrY2luZGV4OiBPcmcg ZXh0cmEgZmFjZXMKClVzZXJzIG9mIH5vcmctbW9kZX4gaGF2ZSB0aGUgb3B0aW9uIHRvIGNvbmZp Z3VyZSB2YXJpb3VzIGtleXdvcmRzIGFuZApwcmlvcml0eSBjb29raWVzIHRvIGJldHRlciBtYXRj aCB0aGVpciB3b3JrZmxvdy4gIFVzZXIgb3B0aW9ucyBhcmUKfm9yZy10b2RvLWtleXdvcmQtZmFj ZXN+IGFuZCB+b3JnLXByaW9yaXR5LWZhY2Vzfi4KCkFzIHRob3NlIGFyZSBtZWFudCB0byBiZSBj dXN0b20gZmFjZXMsIGl0IGlzIGZ1dGlsZSB0byBoYXZlIHRoZSB0aGVtZXMKZ3Vlc3Mgd2hhdCBl YWNoIHVzZXIgd2FudHMgdG8gdXNlLCB3aGljaCBrZXl3b3JkcyB0byB0YXJnZXQsIGFuZCBzbyBv bi4KSW5zdGVhZCwgd2UgY2FuIHByb3ZpZGUgZ3VpZGVsaW5lcyBvbiBob3cgdG8gY3VzdG9taXpl IHRoaW5ncyB0byBvbmUncwpsaWtpbmcgd2l0aCB0aGUgaW50ZW50IG9mIHJldGFpbmluZyB0aGUg b3ZlcmFsbCBhZXN0aGV0aWMgb2YgdGhlIHRoZW1lcy4KClBsZWFzZSBiZWFyIGluIG1pbmQgdGhh dCB0aGUgZW5kIHJlc3VsdCBvZiB0aG9zZSBpcyBub3QgY29udHJvbGxlZCBieQp0aGUgYWN0aXZl IE1vZHVzIHRoZW1lIGJ1dCBieSBob3cgT3JnIG1hcHMgZmFjZXMgdG8gaXRzIGNvbnN0cnVjdHMu CkVkaXRpbmcgdGhvc2Ugd2hpbGUgfm9yZy1tb2RlfiBpcyBhY3RpdmUgcmVxdWlyZXMgcmUtaW5p dGlhbGl6YXRpb24gb2YgdGhlCm1vZGUgd2l0aCB7e3trYmQoTS14IG9yZy1tb2RlLXJlc3RhcnQp fX19IGZvciBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgoKTGV0IHVzIGFzc3VtZSB5b3Ugd2lzaCB0 byB2aXN1YWxseSBkaWZmZXJlbnRpYXRlIHlvdXIga2V5d29yZHMuICBZb3UKaGF2ZSBzb21ldGhp bmcgbGlrZSB0aGlzOgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAooc2V0cSBvcmctdG9kby1rZXl3 b3JkcwogICAgICAnKChzZXF1ZW5jZSAiVE9ETyh0KSIgInwiICJET05FKEQpIiAiQ0FOQ0VMKEMp IikKICAgICAgICAoc2VxdWVuY2UgIk1FRVQobSkiICJ8IiAiTUVUKE0pIikKICAgICAgICAoc2Vx dWVuY2UgIlNUVURZKHMpIiAifCIgIlNUVURJRUQoUykiKQogICAgICAgIChzZXF1ZW5jZSAiV1JJ VEUodykiICJ8IiAiV1JPVEUoVykiKSkpCiMrZW5kX3NyYwoKWW91IGNvdWxkIHRoZW4gdXNlIGEg dmFyaWFudCBvZiB0aGUgZm9sbG93aW5nIHRvIGluaGVyaXQgZnJvbSBhIGZhY2UKdGhhdCB1c2Vz IHRoZSBzdHlsZXMgeW91IHdhbnQgYW5kIGFsc28gdG8gcHJlc2VydmUgdGhlIHByb3BlcnRpZXMK YXBwbGllZCBieSB0aGUgfm9yZy10b2RvfiBmYWNlOgoKIytiZWdpbl9zcmMgZW1hY3MtbGlzcAoo c2V0cSBvcmctdG9kby1rZXl3b3JkLWZhY2VzCiAgICAgICcoKCJNRUVUIiAuICcoZm9udC1sb2Nr LXByZXByb2Nlc3Nvci1mYWNlIG9yZy10b2RvKSkKICAgICAgICAoIlNUVURZIiAuICcoZm9udC1s b2NrLXZhcmlhYmxlLW5hbWUtZmFjZSBvcmctdG9kbykpCiAgICAgICAgKCJXUklURSIgLiAnKGZv bnQtbG9jay10eXBlLWZhY2Ugb3JnLXRvZG8pKSkpCiMrZW5kX3NyYwoKVGhpcyB3aWxsIHJlZmFz aGlvbiB0aGUga2V5d29yZHMgeW91IHNwZWNpZnksIHdoaWxlIGxldHRpbmcgdGhlIG90aGVyCml0 ZW1zIGluIH5vcmctdG9kby1rZXl3b3Jkc34gdXNlIHRoZWlyIG9yaWdpbmFsIHN0eWxlcyAod2hp Y2ggYXJlIGRlZmluZWQKaW4gdGhlIH5vcmctdG9kb34gYW5kIH5vcmctZG9uZX4gZmFjZXMpLgoK SWYgeW91IHdhbnQgYmFjayB0aGUgZGVmYXVsdHMsIHRyeSBzcGVjaWZ5aW5nIGp1c3QgdGhlIH5v cmctdG9kb34gZmFjZToKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKHNldHEgb3JnLXRvZG8ta2V5 d29yZC1mYWNlcwogICAgICAnKCgiTUVFVCIgLiBvcmctdG9kbykKICAgICAgICAoIlNUVURZIiAu IG9yZy10b2RvKQogICAgICAgICgiV1JJVEUiIC4gb3JnLXRvZG8pKSkKIytlbmRfc3JjCgpXaGVu IHlvdSBpbmhlcml0IGZyb20gbXVsdGlwbGUgZmFjZXMsIHlvdSBuZWVkIHRvIHF1b3RlIHRoZSBs aXN0IGFzCnNob3duIGZ1cnRoZXIgYWJvdmUuICBUaGUgb3JkZXIgaXMgaW1wb3J0YW50OiB0aGUg bGFzdCBpdGVtIGlzIGFwcGxpZWQKb3ZlciB0aGUgcHJldmlvdXMgb25lcy4gIElmIHlvdSBkbyBu b3Qgd2FudCB0byBibGVuZCBtdWx0aXBsZSBmYWNlcywgeW91CmRvIG5vdCBuZWVkIGEgcXVvdGVk IGxpc3QuICBBIHBhdHRlcm4gb2YgPWtleXdvcmQgLiBmYWNlPSB3aWxsIHN1ZmZpY2UuCgpCb3Ro IGFwcHJvYWNoZXMgY2FuIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHksIGFzIGlsbHVzdHJhdGVkIGlu IHRoaXMKY29uZmlndXJhdGlvbiBvZiB0aGUgcHJpb3JpdHkgY29va2llczoKCiMrYmVnaW5fc3Jj IGVtYWNzLWxpc3AKKHNldHEgb3JnLXByaW9yaXR5LWZhY2VzCiAgICAgICcoKD9BIC4gJyhvcmct c2NoZWR1bGVkLXRvZGF5IG9yZy1wcmlvcml0eSkpCiAgICAgICAgKD9CIC4gb3JnLXByaW9yaXR5 KQogICAgICAgICg/QyAuICcoc2hhZG93IG9yZy1wcmlvcml0eSkpKSkKIytlbmRfc3JjCgpUbyBm aW5kIGFsbCB0aGUgZmFjZXMgdGhhdCBhcmUgbG9hZGVkIGluIHlvdXIgY3VycmVudCBFbWFjcyBz ZXNzaW9uLCB1c2UKe3t7a2JkKE0teCBsaXN0LWZhY2VzLWRpc3BsYXkpfX19LiAgVHJ5IHt7e2ti ZChNLXggZGVzY3JpYmUtdmFyaWFibGUpfX19IGFzIHdlbGwgYW5kCnRoZW4gc3BlY2lmeSB0aGUg bmFtZSBvZiBlYWNoIG9mIHRob3NlIE9yZyB2YXJpYWJsZXMgZGVtb25zdHJhdGVkIGFib3ZlLgpU aGVpciBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgd2lsbCBvZmZlciB5b3UgZnVydGhlciBndWlkYW5j ZS4KClJlY2FsbCB0aGF0IHRoZSB0aGVtZXMgbGV0IHlvdSByZXRyaWV2ZSBhIGNvbG9yIGZyb20g dGhlaXIgcGFsZXR0ZS4gIERvCml0IGlmIHlvdSBwbGFuIHRvIGNvbnRyb2wgZmFjZSBhdHRyaWJ1 dGVzLgoKW1sjaDoxNDg3YzYzMS1mNGZlLTQ5MGQtOGQ1OC1kNzJmZmEzYmQ0NzRdW0N1c3RvbSBm YWNlIHNwZWNzIHVzaW5nIHRoZSB0aGVtZXMnIHBhbGV0dGVdXS4KCltbI2g6MDJlMjU5MzAtZTcx YS00OTNkLTgyOGEtODkwN2ZjODBmODc0XVtDaGVjayBjb2xvciBjb21iaW5hdGlvbnNdXS4KCioq IE1lYXN1cmUgY29sb3IgY29udHJhc3QgKERJWSkKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6 MDJlMjU5MzAtZTcxYS00OTNkLTgyOGEtODkwN2ZjODBmODc0CjplbmQ6CiMrZmluZGV4OiBtb2R1 cy10aGVtZXMtY29udHJhc3QKIytmaW5kZXg6IG1vZHVzLXRoZW1lcy13Y2FnLWZvcm11bGEKIytj aW5kZXg6IENvbG9yIGNvbnRyYXN0CgpUaGUgdGhlbWVzIHByb3ZpZGUgdGhlIGZ1bmN0aW9ucyB+ bW9kdXMtdGhlbWVzLXdjYWctZm9ybXVsYX4gYW5kCn5tb2R1cy10aGVtZXMtY29udHJhc3R+LiAg VGhlIGZvcm1lciBpcyBhIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKV0NBRyBmb3JtdWxh OiA8aHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9HMTguaHRtbD4uICBJdApjYWxj dWxhdGVzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYSBjb2xvciB2YWx1ZSB0aGF0IGlzIGV4 cHJlc3NlZCBpbgpoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24uICBXaGlsZSB0aGUgbGF0dGVyIGZ1 bmN0aW9uIGlzIGp1c3QgYQpjb252ZW5pZW50IHdyYXBwZXIgZm9yIGNvbXBhcmluZyB0aGUgcmVs YXRpdmUgbHVtaW5hbmNlIGJldHdlZW4gdHdvCmNvbG9ycy4KCkluIHByYWN0aWNlLCBvbmUgbmVl ZHMgdG8gd29yayBvbmx5IHdpdGggfm1vZHVzLXRoZW1lcy1jb250cmFzdH4uICBJdAphY2NlcHRz IHR3byBjb2xvciB2YWx1ZXMgYW5kIHJldHVybnMgdGhlaXIgY29udHJhc3QgcmF0aW8uICBWYWx1 ZXMgcmFuZ2UKZnJvbSAxIHRvIDIxIChsb3dlc3QgdG8gaGlnaGVzdCkuICBUaGUgdGhlbWVzIGFy ZSBkZXNpZ25lZCB0byBhbHdheXMgYmUKZXF1YWwgb3IgaGlnaGVyIHRoYW4gNyBmb3IgZWFjaCBj b21iaW5hdGlvbiBvZiBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kCnRoYXQgdGhleSB1c2UgKHRo aXMgaXMgdGhlIFdDQUcgQUFBIHN0YW5kYXJkLS0tdGhlIG1vc3QgZGVtYW5kaW5nIG9mIGl0cwpr aW5kKS4KCkEgY291cGxlIG9mIGV4YW1wbGVzIChyb3VuZGVkIG51bWJlcnMpOgoKIytiZWdpbl9z cmMgZW1hY3MtbGlzcAo7OyBQdXJlIHdoaXRlIHdpdGggcHVyZSBncmVlbgoobW9kdXMtdGhlbWVz LWNvbnRyYXN0ICIjZmZmZmZmIiAiIzAwZmYwMCIpCjs7ID0+IDEuMzcKOzsgVGhhdCBpcyBhbiBv dXRyaWdodCBpbmFjY2Vzc2libGUgY29tYm8KCjs7IFB1cmUgYmxhY2sgd2l0aCBwdXJlIGdyZWVu Cihtb2R1cy10aGVtZXMtY29udHJhc3QgIiMwMDAwMDAiICIjMDBmZjAwIikKOzsgPT4gMTUuMwo7 OyBUaGF0IGlzIGlzIGEgaGlnaGx5IGFjY2Vzc2libGUgY29tYm8KIytlbmRfc3JjCgpJdCBkb2Vz IG5vdCBtYXR0ZXIgd2hpY2ggY29sb3IgdmFsdWUgY29tZXMgZmlyc3QuICBUaGUgcmF0aW8gaXMg YWx3YXlzCnRoZSBzYW1lLgoKSWYgb25lIGRvZXMgbm90IHdpc2ggdG8gcmVhZCBhbGwgdGhlIGRl Y2ltYWwgcG9pbnRzLCBpdCBpcyBwb3NzaWJsZSB0bwp0cnkgc29tZXRoaW5nIGxpa2UgdGhpczoK CiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGZvcm1hdCAiJTAuMmYiIChtb2R1cy10aGVtZXMtY29u dHJhc3QgIiMwMDAwMDAiICIjMDBmZjAwIikpCiMrZW5kX3NyYwoKV2hpbGUgaXQgaXMgZmluZSB0 byBwZXJmb3JtIHN1Y2ggY2FsY3VsYXRpb25zIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzLAppdCBp cyBwcmVmZXJhYmxlIHRvIGltcGxlbWVudCBmb3JtdWxhcyBhbmQgdGFibGVzIGZvciBtb3JlIGRl bWFuZGluZwp0YXNrcy4gIFN1Y2ggaW5zdHJ1bWVudHMgYXJlIHByb3ZpZGVkIGJ5IH5vcmctbW9k ZX4gb3Igfm9yZ3RibC1tb2RlfiwgYm90aApvZiB3aGljaCBhcmUgYnVpbHQgaW50byBFbWFjcy4g IEJlbG93IGlzIHN1Y2ggYSB0YWJsZSB0aGF0IGRlcml2ZXMgdGhlCmNvbnRyYXN0IHJhdGlvIG9m IGFsbCBjb2xvcnMgaW4gdGhlIGZpcnN0IGNvbHVtbiAocHVyZSByZWQsIGdyZWVuLCBibHVlKQpy ZWxhdGl2ZSB0byB0aGUgY29sb3Igc3BlY2lmaWVkIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHNl Y29uZCBjb2x1bW4KKHB1cmUgd2hpdGUpIGFuZCByb3VuZHMgdGhlIHJlc3VsdHM6CgojK2JlZ2lu X2V4YW1wbGUKfCAgICAgICAgIHwgI2ZmZmZmZiB8CnwtLS0tLS0tLS0rLS0tLS0tLS0tfAp8ICNm ZjAwMDAgfCAgICA0LjAwIHwKfCAjMDBmZjAwIHwgICAgMS4zNyB8CnwgIzAwMDBmZiB8ICAgIDgu NTkgfAojK3RibGZtOiAkMj0nKG1vZHVzLXRoZW1lcy1jb250cmFzdCAkMSBAMSQyKTslMC4yZgoj K2VuZF9leGFtcGxlCgpUbyBtZWFzdXJlIGNvbG9yIGNvbnRyYXN0IG9uZSBuZWVkcyB0byBzdGFy dCBmcm9tIGEga25vd24gdmFsdWUuICBUaGlzCnR5cGljYWxseSBpcyB0aGUgYmFja2dyb3VuZC4g IFRoZSBNb2R1cyB0aGVtZXMgZGVmaW5lIGFuIGV4cGFuZGVkCnBhbGV0dGUgaW4gbGFyZ2UgcGFy dCBiZWNhdXNlIGNlcnRhaW4gY29sb3JzIGFyZSBvbmx5IG1lYW50IHRvIGJlIHVzZWQKaW4gY29t YmluYXRpb24gd2l0aCBzb21lIG90aGVycy4gIENvbnN1bHQgdGhlIHNvdXJjZSBjb2RlIGZvciB0 aGUKbWludXRpYSBhbmQgcmVsZXZhbnQgY29tbWVudGFyeS4KClN1Y2gga25vd2xlZGdlIG1heSBw cm92ZSB2YWx1YWJsZSB3aGlsZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHNvbWUgb2YKdGhlIHRo ZW1lcycgY29sb3JzOiBbWyNoOjMwN2Q5NWRkLThkYmQtNGVjZS1hNTQzLTEwYWU4NmYxNTVhNl1b T3ZlcnJpZGUgY29sb3JzXV0uCgoqKiBMb2FkIHRoZW1lIGRlcGVuZGluZyBvbiB0aW1lIG9mIGRh eQo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDoxZDFlZjRiNC04NjAwLTRhMDktOTkzYy02ZGUz YWYwZGRkMjYKOmVuZDoKCldoaWxlIHdlIGRvIHByb3ZpZGUgfm1vZHVzLXRoZW1lcy10b2dnbGV+ IHRvIG1hbnVhbGx5IHN3aXRjaCBiZXR3ZWVuIHRoZQp0aGVtZXMsIHVzZXJzIG1heSBhbHNvIHNl dCB1cCB0aGVpciBzeXN0ZW0gdG8gcGVyZm9ybSBzdWNoIGEgdGFzawphdXRvbWF0aWNhbGx5IGF0 IHN1bnJpc2UgYW5kIHN1bnNldC4KClRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSBzcGVjaWZ5 aW5nIHRoZSBjb29yZGluYXRlcyBvZiBvbmUncyBsb2NhdGlvbgp1c2luZyB0aGUgYnVpbHQtaW4g e3t7ZmlsZShzb2xhci5lbCl9fX0gYW5kIHRoZW4gY29uZmlndXJpbmcgdGhlID1jaXJjYWRpYW49 CnBhY2thZ2U6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCih1c2UtcGFja2FnZSBzb2xhciAgICAg ICAgICAgICAgICAgICAgICA7IGJ1aWx0LWluCiAgOmNvbmZpZwogIChzZXRxIGNhbGVuZGFyLWxh dGl0dWRlIDM1LjE3CiAgICAgICAgY2FsZW5kYXItbG9uZ2l0dWRlIDMzLjM2KSkKCih1c2UtcGFj a2FnZSBjaXJjYWRpYW4gICAgICAgICAgICAgICAgICA7IHlvdSBuZWVkIHRvIGluc3RhbGwgdGhp cwogIDplbnN1cmUKICA6YWZ0ZXIgc29sYXIKICAoc2V0cSBjaXJjYWRpYW4tdGhlbWVzICcoKDpz dW5yaXNlIC4gbW9kdXMtb3BlcmFuZGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICg6c3Vu c2V0ICAuIG1vZHVzLXZpdmVuZGkpKSkKICAoY2lyY2FkaWFuLXNldHVwKSkKIytlbmRfc3JjCgoq KiBBIHRoZW1lLWFnbm9zdGljIGhvb2sgZm9yIHRoZW1lIGxvYWRpbmcgKERJWSkKOnByb3BlcnRp ZXM6CjpjdXN0b21faWQ6IGg6ODZmNjkwNmItZjA5MC00NmNjLTk4MTYtMWZlOGFlYjM4Nzc2Cjpl bmQ6CgpUaGUgdGhlbWVzIGFyZSBkZXNpZ25lZCB3aXRoIHRoZSBpbnRlbnQgdG8gYmUgdXNlZnVs IHRvIEVtYWNzIHVzZXJzIG9mCnZhcnlpbmcgc2tpbGwgbGV2ZWxzLCBmcm9tIGJlZ2lubmVycyB0 byBleHBlcnRzLiAgVGhpcyBtZWFucyB0aGF0IHdlIHRyeQp0byBtYWtlIHRoaW5ncyBlYXNpZXIg Ynkgbm90IGV4cGVjdGluZyBhbnlvbmUgcmVhZGluZyB0aGlzIGRvY3VtZW50IHRvCmJlIHByb2Zp Y2llbnQgaW4gRW1hY3MgTGlzcCBvciBwcm9ncmFtbWluZyBpbiBnZW5lcmFsLgoKU3VjaCBhIGNh c2UgaXMgd2l0aCB0aGUgdXNlIG9mIHRoZSB+bW9kdXMtdGhlbWVzLWFmdGVyLWxvYWQtdGhlbWUt aG9va34sCndoaWNoIHJ1bnMgYWZ0ZXIgfm1vZHVzLXRoZW1lcy10b2dnbGV+LCB+bW9kdXMtdGhl bWVzLWxvYWQtb3BlcmFuZGl+LCBvcgp+bW9kdXMtdGhlbWVzLWxvYWQtdml2ZW5kaX4gaXMgZXZh bHVhdGVkLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoYXQgaG9vawpmb3IgYWR2YW5jZWQgY3VzdG9t aXphdGlvbnMsIGJlY2F1c2UgKDEpIHdlIGtub3cgZm9yIHN1cmUgdGhhdCBpdCBpcwphdmFpbGFi bGUgb25jZSB0aGUgdGhlbWVzIGFyZSBsb2FkZWQsIGFuZCAoMikgYW55b25lIGNvbnN1bHRpbmcg dGhpcwptYW51YWwsIGVzcGVjaWFsbHkgdGhlIHNlY3Rpb25zIG9uIGVuYWJsaW5nIGFuZCBsb2Fk aW5nIHRoZSB0aGVtZXMsIHdpbGwKYmUgaW4gYSBnb29kIHBvc2l0aW9uIHRvIGJlbmVmaXQgZnJv bSB0aGF0IGhvb2suCgpBZHZhbmNlZCB1c2VycyB3aG8gaGF2ZSBhIG5lZWQgdG8gc3dpdGNoIGJl dHdlZW4gdGhlIE1vZHVzIHRoZW1lcyBhbmQKb3RoZXIgaXRlbXMgd2lsbCBmaW5kIHRoYXQgc3Vj aCBhIGhvb2sgZG9lcyBub3QgbWVldCB0aGVpciByZXF1aXJlbWVudHM6Cml0IG9ubHkgd29ya3Mg d2l0aCB0aGUgTW9kdXMgdGhlbWVzIGFuZCBvbmx5IHdpdGggdGhlIGFmb3JlbWVudGlvbmVkCmZ1 bmN0aW9ucy4KCkEgdGhlbWUtYWdub3N0aWMgc2V0dXAgY2FuIGJlIGNvbmZpZ3VyZWQgdGh1czoK CiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKGRlZnZhciBhZnRlci1lbmFibGUtdGhlbWUtaG9vayBu aWwKICAgIk5vcm1hbCBob29rIHJ1biBhZnRlciBlbmFibGluZyBhIHRoZW1lLiIpCgooZGVmdW4g cnVuLWFmdGVyLWVuYWJsZS10aGVtZS1ob29rICgmcmVzdCBfYXJncykKICAgIlJ1biBgYWZ0ZXIt ZW5hYmxlLXRoZW1lLWhvb2snLiIKICAgKHJ1bi1ob29rcyAnYWZ0ZXItZW5hYmxlLXRoZW1lLWhv b2spKQoKKGFkdmljZS1hZGQgJ2VuYWJsZS10aGVtZSA6YWZ0ZXIgIydydW4tYWZ0ZXItZW5hYmxl LXRoZW1lLWhvb2spCiMrZW5kX3NyYwoKVGhpcyBjcmVhdGVzIHRoZSB+YWZ0ZXItZW5hYmxlLXRo ZW1lLWhvb2t+IGFuZCBtYWtlcyBpdCBydW4gYWZ0ZXIgZWFjaApjYWxsIHRvIH5lbmFibGUtdGhl bWV+LCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBmb3IgYWxsIHRoZW1lcyBhbmQKYWxz byBoYXMgdGhlIGJlbmVmaXQgdGhhdCBpdCBkb2VzIG5vdCBkZXBlbmQgb24gZnVuY3Rpb25zIHN1 Y2ggYXMKfm1vZHVzLXRoZW1lcy10b2dnbGV+IGFuZCB0aGUgb3RoZXJzIG1lbnRpb25lZCBhYm92 ZS4gIH5lbmFibGUtdGhlbWV+IGlzCmNhbGxlZCBpbnRlcm5hbGx5IGJ5IH5sb2FkLXRoZW1lfiwg c28gdGhlIGhvb2sgd29ya3MgZXZlcnl3aGVyZS4KCk5vdyB0aGlzIHNwZWNpZmljIHBpZWNlIG9m IEVsaXNwIG1heSBiZSBzaW1wbGUgZm9yIGV4cGVyaWVuY2VkIHVzZXJzLApidXQgaXQgaXMgbm90 IGVhc3kgdG8gcmVhZCBmb3IgbmV3Y29tZXJzLCBpbmNsdWRpbmcgdGhlIGF1dGhvciBvZiB0aGUK TW9kdXMgdGhlbWVzIGZvciB0aGUgZmlyc3Qgc2V2ZXJhbCBtb250aHMgb2YgdGhlaXIgdGltZSBh cyBhbiBFbWFjcwp1c2VyLiAgSGVuY2Ugb3VyIGhlc2l0YXRpb24gdG8gcmVjb21tZW5kIGl0IGFz IHBhcnQgb2YgdGhlIHN0YW5kYXJkCnNldHVwIG9mIHRoZSBNb2R1cyB0aGVtZXMgKGl0IGlzIGdl bmVyYWxseSBhIGdvb2QgaWRlYSB0byB1bmRlcnN0YW5kCndoYXQgdGhlIGltcGxpY2F0aW9ucyBh cmUgb2YgYWR2aXNpbmcgYSBmdW5jdGlvbikuCgoqIEZhY2UgY292ZXJhZ2UKOnByb3BlcnRpZXM6 CjpjdXN0b21faWQ6IGg6YTljOGYyOWQtN2Y3Mi00YjU0LWI3NGItZGRlZmUxNWQ2YTE5CjplbmQ6 CgpUaGUgTW9kdXMgdGhlbWVzIHRyeSB0byBwcm92aWRlIGFzIGNsb3NlIHRvIGZ1bGwgZmFjZSBj b3ZlcmFnZSBhcwpwb3NzaWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBhIGNvbnNp c3RlbnRseSBhY2Nlc3NpYmxlIHJlYWRpbmcKZXhwZXJpZW5jZSBhY3Jvc3MgYWxsIGF2YWlsYWJs ZSBpbnRlcmZhY2VzLgoKKiogRnVsbCBzdXBwb3J0IGZvciBwYWNrYWdlcyBvciBmYWNlIGdyb3Vw cwo6cHJvcGVydGllczoKOmFsdF90aXRsZTogU3VwcG9ydGVkIHBhY2thZ2VzCjpkZXNjcmlwdGlv bjogRnVsbCBsaXN0IG9mIGNvdmVyZWQgZmFjZSBncm91cHMKOmN1c3RvbV9pZDogaDo2MGVkNDI3 NS02MGQ2LTQ5ZjgtOTI4Ny05YTY0ZTU0YmVhMGUKOmVuZDoKIytjaW5kZXg6IEV4cGxpY2l0bHkg c3VwcG9ydGVkIHBhY2thZ2VzCgpUaGlzIGxpc3Qgd2lsbCBhbHdheXMgYmUgdXBkYXRlZCB0byBy ZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQpwcm9qZWN0LiAgVGhlIGlkZWEgaXMgdG8g b2ZmZXIgYW4gb3ZlcnZpZXcgb2YgdGhlIGtub3duIHN0YXR1cyBvZiBhbGwKYWZmZWN0ZWQgZmFj ZSBncm91cHMuICBUaGUgaXRlbXMgd2l0aCBhbiBhcHBlbmRlZCBhc3RlcmlzayA9Kj0gdGVuZCB0 bwpoYXZlIGxvdHMgb2YgZXh0ZW5zaW9ucywgc28gdGhlICJmdWxsIHN1cHBvcnQiIG1heSBub3Qg YmUgMTAwJSB0cnVl4oCmCgorIGFjZS13aW5kb3cKKyBhZworIGFsZXJ0CisgYWxsLXRoZS1pY29u cworIGFubm90YXRlCisgYW56dQorIGFwcm9wb3MKKyBhcHQtc291cmNlcy1saXN0CisgYXJ0Ym9s bG9ja3MtbW9kZQorIGF1Y3RleCBhbmQgVGVYCisgYXV0by1kaW0tb3RoZXItYnVmZmVycworIGF2 eQorIGF3ZXNvbWUtdHJheQorIGJiZGIKKyBiaW5kZXIKKyBibQorIGJvbmdvCisgYm9vbgorIGJy ZWFrcG9pbnQgKHByb3ZpZGVkIGJ5IHRoZSBidWlsdC1pbiB7e3tmaWxlKGdkYi1taS5lbCl9fX0g bGlicmFyeSkKKyBidWZmZXItZXhwb3NlCisgY2FsZW5kYXIgYW5kIGRpYXJ5CisgY2FsZncKKyBj ZW50YXVyLXRhYnMKKyBjZnJzCisgY2hhbmdlLWxvZyBhbmQgbG9nLXZpZXcgKHN1Y2ggYXMgfnZj LXByaW50LWxvZ34sIH52Yy1wcmludC1yb290LWxvZ34pCisgY2lkZXIKKyBjaXJjZQorIGNvbG9y LXJnCisgY29sdW1uLWVuZm9yY2UtbW9kZQorIGNvbXBhbnktbW9kZSoKKyBjb21wYW55LXBvc2Zy YW1lCisgY29tcGlsYXRpb24tbW9kZQorIGNvbXBsZXRpb25zCisgY29uc3VsdAorIGNvdW5zZWwq CisgY291bnNlbC1jc3MKKyBjb3Vuc2VsLW5vdG11Y2gKKyBjb3Vuc2VsLW9yZy1jYXB0dXJlLXN0 cmluZworIGNvdgorIGNwZXJsLW1vZGUKKyBjc3YtbW9kZQorIGN0cmxmCisgY3VzdG9tICh3aGF0 IHlvdSBnZXQgd2l0aCB7e3trYmQoTS14IGN1c3RvbWl6ZSl9fX0pCisgZGFwLW1vZGUKKyBkYXNo Ym9hcmQgKGVtYWNzLWRhc2hib2FyZCkKKyBkZWFkZ3JlcAorIGRlYmJ1Z3MKKyBkZWZpbmUtd29y ZAorIGRlZnQKKyBkaWN0aW9uYXJ5CisgZGlmZi1obAorIGRpZmYtbW9kZQorIGRpbS1hdXRvbG9h ZAorIGRpci10cmVldmlldworIGRpcmVkCisgZGlyZWQtYXN5bmMKKyBkaXJlZC1naXQKKyBkaXJl ZC1naXQtaW5mbworIGRpcmVkLW5hcnJvdworIGRpcmVkLXN1YnRyZWUKKyBkaXJlZGMKKyBkaXJl ZGZsCisgZGlyZWRwIChkaXJlZCspCisgZGlzay11c2FnZQorIGRpc3BsYXktZmlsbC1jb2x1bW4t aW5kaWNhdG9yLW1vZGUKKyBkb29tLW1vZGVsaW5lCisgZHluYW1pYy1ydWxlcgorIGVhc3ktamVr eWxsCisgZWFzeS1raWxsCisgZWJkYgorIGVkaWZmCisgZWdsb3QKKyBlbC1zZWFyY2gKKyBlbGRv Yy1ib3gKKyBlbGZlZWQKKyBlbGZlZWQtc2NvcmUKKyBlbW1zCisgZW5oYW5jZWQtcnVieS1tb2Rl CisgZXBhCisgZXF1YWtlCisgZXJjCisgZXJvcworIGVydAorIGVzaGVsbAorIGVzaGVsbC1mcmlu Z2Utc3RhdHVzCisgZXNoZWxsLWdpdC1wcm9tcHQKKyBlc2hlbGwtcHJvbXB0LWV4dHJhcyAoZXBl KQorIGVzaGVsbC1zeW50YXgtaGlnaGxpZ2h0aW5nCisgZXZpbCogKGV2aWwtbW9kZSkKKyBldmls LWdvZ2dsZXMKKyBldmlsLXNuaXBlCisgZXZpbC12aXN1YWwtbWFyay1tb2RlCisgZXd3CisgZXh3 bQorIGV5ZWJyb3dzZQorIGZhbmN5LWRhYmJyZXYKKyBmbHljaGVjaworIGZseWNoZWNrLWNvbG9y LW1vZGUtbGluZQorIGZseWNoZWNrLWluZGljYXRvcgorIGZseWNoZWNrLXBvc2ZyYW1lCisgZmx5 bWFrZQorIGZseXNwZWxsCisgZmx5c3BlbGwtY29ycmVjdAorIGZseAorIGZyZWV6ZS1pdAorIGZy b2ctbWVudQorIGZvY3VzCisgZm9sZC10aGlzCisgZm9udC1sb2NrIChnZW5lcmljIHN5bnRheCBo aWdobGlnaHRpbmcpCisgZm9yZ2UKKyBmb3VudGFpbiAoZm91bnRhaW4tbW9kZSkKKyBnZWlzZXIK KyBnaXQtY29tbWl0CisgZ2l0LWd1dHRlciAoYW5kIHZhcmlhbnRzKQorIGdpdC1sZW5zCisgZ2l0 LXJlYmFzZQorIGdpdC10aW1lbWFjaGluZQorIGdpdC13YWxrdHJlZQorIGdudXMKKyBnb2xkZW4t cmF0aW8tc2Nyb2xsLXNjcmVlbgorIGhlbG0qCisgaGVsbS1scy1naXQKKyBoZWxtLXN3aXRjaC1z aGVsbAorIGhlbG0teHJlZgorIGhlbHBmdWwKKyBoaWdobGlnaHQtYmxvY2tzCisgaGlnaGxpZ2h0 LWRlZmluZWQKKyBoaWdobGlnaHQtZXNjYXBlLXNlcXVlbmNlcyAofmhlcy1tb2RlfikKKyBoaWdo bGlnaHQtaW5kZW50YXRpb24KKyBoaWdobGlnaHQtbnVtYmVycworIGhpZ2hsaWdodC1zeW1ib2wK KyBoaWdobGlnaHQtdGFpbAorIGhpZ2hsaWdodC10aGluZworIGhsLWRlZmluZWQKKyBobC1maWxs LWNvbHVtbgorIGhsLWxpbmUtbW9kZQorIGhsLXRvZG8KKyBoeWRyYQorIGh5cGVybGlzdAorIGli dWZmZXIKKyBpY29tcGxldGUKKyBpY29tcGxldGUtdmVydGljYWwKKyBpZG8tbW9kZQorIGllZGl0 CisgaWZsaXBiCisgaW1lbnUtbGlzdAorIGluZGl1bQorIGluZm8KKyBpbmZvLWNvbG9ycworIGlu dGVyYWN0aW9uLWxvZworIGlvY2N1cgorIGlzZWFyY2gsIG9jY3VyLCBldGMuCisgaXNsIChpc2Vh cmNoLWxpZ2h0KQorIGl2eSoKKyBpdnktcG9zZnJhbWUKKyBqaXJhIChvcmctamlyYSkKKyBqb3Vy bmFsY3RsLW1vZGUKKyBqczItbW9kZQorIGp1bGlhCisganVweXRlcgorIGthb2NoYS1ydW5uZXIK KyBrZXljYXN0CisgbGluZSBudW1iZXJzICh+ZGlzcGxheS1saW5lLW51bWJlcnMtbW9kZX4gYW5k IGdsb2JhbCB2YXJpYW50KQorIGxzcC1tb2RlCisgbHNwLXVpCisgbWFjcm9zdGVwCisgbWFnaXQK KyBtYWdpdC1pbWVyZ2UKKyBtYWtlLW1vZGUKKyBtYW4KKyBtYXJnaW5hbGlhCisgbWFya2Rvd24t bW9kZQorIG1hcmt1cC1mYWNlcyAofmFkb2MtbW9kZX4pCisgbWVudG9yCisgbWVzc2FnZXMKKyBt aW5pYnVmZmVyLWxpbmUKKyBtaW5pbWFwCisgbW1tLW1vZGUKKyBtb2RlbGluZQorIG1vb2QtbGlu ZQorIG1vb2R5CisgbXBkZWwKKyBtdTRlCisgbXU0ZS1jb252ZXJzYXRpb24KKyBtdWx0aXBsZS1j dXJzb3JzCisgbmVvdHJlZQorIG5vLWVtb2ppCisgbm90bXVjaAorIG51bTMtbW9kZQorIG54bWwt bW9kZQorIG9iamVkCisgb3JkZXJsZXNzCisgb3JnKgorIG9yZy1qb3VybmFsCisgb3JnLW5vdGVy Cisgb3JnLXBvbW9kb3JvCisgb3JnLXJlY3VyCisgb3JnLXJvYW0KKyBvcmctc3VwZXJzdGFyCisg b3JnLXRhYmxlLXN0aWNreS1oZWFkZXIKKyBvcmctdHJlZS1zbGlkZQorIG9yZy10cmVlc2NvcGUK KyBvcmlnYW1pCisgb3V0bGluZS1tb2RlCisgb3V0bGluZS1taW5vci1mYWNlcworIHBhY2thZ2Ug KHdoYXQgeW91IGdldCB3aXRoIHt7e2tiZChNLXggbGlzdC1wYWNrYWdlcyl9fX0pCisgcGFnZS1i cmVhay1saW5lcworIHBhcmFkb3gKKyBwYXJlbi1mYWNlCisgcGFycm90CisgcGFzcworIHBkZi10 b29scworIHBlcnNwLW1vZGUKKyBwZXJzcGVjdGl2ZQorIHBoaS1ncmVwCisgcGhpLXNlYXJjaAor IHBrZ2J1aWxkLW1vZGUKKyBwb21pZG9yCisgcG9wdXAKKyBwb3dlcmxpbmUKKyBwb3dlcmxpbmUt ZXZpbAorIHByaXNtIChbWyNoOmE5NDI3MmUwLTk5ZGEtNDE0OS05ZTgwLTExYTdlNjdhMmNmMl1b Tm90ZSBmb3IgcHJpc20uZWxdXSkKKyBwcm9jZWQKKyBwcm9kaWd5CisgcXVpY2stcGVlaworIHJh Y2tldC1tb2RlCisgcmFpbmJvdy1ibG9ja3MKKyByYWluYm93LWlkZW50aWZpZXJzCisgcmFpbmJv dy1kZWxpbWl0ZXJzCisgcmNpcmMKKyByZWN1cnNpb24taW5kaWNhdG9yCisgcmVnZXhwLWJ1aWxk ZXIgKGFsc28ga25vd24gYXMgfnJlLWJ1aWxkZXJ+KQorIHJnIChyZy5lbCkKKyByaXBncmVwCisg cm1haWwKKyBydWxlci1tb2RlCisgc2FsbGV0Cisgc2VsZWN0cnVtCisgc2VsZWN0cnVtLXByZXNj aWVudAorIHNlbWFudGljCisgc2VzbWFuCisgc2hlbGwtc2NyaXB0LW1vZGUKKyBzaG9ydGRvYwor IHNob3ctcGFyZW4tbW9kZQorIHNocgorIHNpZGUtbm90ZXMKKyBzaWV2ZS1tb2RlCisgc2tld2Vy LW1vZGUKKyBzbWFydC1tb2RlLWxpbmUKKyBzbWFydHBhcmVucworIHNtZXJnZQorIHNvbGFpcmUK KyBzcGFjZWxpbmUKKyBzcGVlZGJhcgorIHNwZWxsLWZ1Cisgc3ByYXkKKyBzdHJpcGVzCisgc3Vn Z2VzdAorIHN3aXRjaC13aW5kb3cKKyBzd2lwZXIKKyBzd29vcAorIHN4Cisgc3ltYm9sLW92ZXJs YXkKKyBzeXNsb2ctbW9kZQorIHRhYmxlIChidWlsdC1pbiB0YWJsZS5lbCkKKyB0ZWxlcGhvbmUt bGluZQorIHRlcnJhZm9ybS1tb2RlCisgdGVybQorIHRvbWF0aW5obworIHRyYW5zaWVudCAocG9w LXVwIHdpbmRvd3Mgc3VjaCBhcyBNYWdpdCdzKQorIHRyYXNoZWQKKyB0cmVlbWFjcworIHR0eS1t ZW51CisgdHVhcmVnCisgdHlwZXNjcmlwdAorIHVuZG8tdHJlZQorIHZjIChidWlsdC1pbiBtb2Rl IGxpbmUgc3RhdHVzIGZvciB2ZXJzaW9uIGNvbnRyb2wpCisgdmMtYW5ub3RhdGUgKHRoZSBvdXQg cHV0IG9mIHt7e2tiZChDLXggdiBnKX19fSkKKyB2ZGlmZgorIHZpbWlzaC1mb2xkCisgdmlzaWJs ZS1tYXJrCisgdmlzdWFsLXJlZ2V4cAorIHZvbGF0aWxlLWhpZ2hsaWdodHMKKyB2dGVybQorIHdj aGVjay1tb2RlCisgd2ViLW1vZGUKKyB3Z3JlcAorIHdoaWNoLWZ1bmN0aW9uLW1vZGUKKyB3aGlj aC1rZXkKKyB3aGl0ZXNwYWNlLW1vZGUKKyB3aW5kb3ctZGl2aWRlci1tb2RlCisgd2ludW0KKyB3 cml0ZWdvb2QtbW9kZQorIHdvbWFuCisgeGFoLWVsaXNwLW1vZGUKKyB4cmVmCisgeHRlcm0tY29s b3IgKGFuZCBhbnNpLWNvbG9ycykKKyB5YW1sLW1vZGUKKyB5YXNuaXBwZXQKKyB6dHJlZQoKUGx1 cyBtYW55IG90aGVyIG1pc2NlbGxhbmVvdXMgZmFjZXMgdGhhdCBhcmUgcHJvdmlkZWQgYnkgdGhl IHVwc3RyZWFtCkdOVSBFbWFjcyBkaXN0cmlidXRpb24uCgoqKiBJbmRpcmVjdGx5IGNvdmVyZWQg cGFja2FnZXMKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6MmNiMzU5YzctM2E4NC00MjYyLWJh YjMtZGNkYzFkMDAzNGQ3CjplbmQ6CiMrY2luZGV4OiBJbXBsaWNpdGx5IHN1cHBvcnRlZCBwYWNr YWdlcwoKVGhlc2UgZG8gbm90IHJlcXVpcmUgYW55IGV4dHJhIHN0eWxlcyBiZWNhdXNlIHRoZXkg YXJlIGNvbmZpZ3VyZWQgdG8KaW5oZXJpdCBmcm9tIHNvbWUgYmFzaWMgZmFjZXMuICBQbGVhc2Ug Y29uZmlybS4KCisgZWRpdC1pbmRpcmVjdAorIGV2aWwtb3dsCisgZm9ydHJhbi1tb2RlCisgZ29n Z2xlcworIGkzd20tY29uZmlnLW1vZGUKKyBwZXJsLW1vZGUKKyBwaHAtbW9kZQorIHJqc3gtbW9k ZQorIHN3aWZ0LW1vZGUKKyB0YWItYmFyLWVjaG8tYXJlYQoKKiBOb3RlcyBmb3IgaW5kaXZpZHVh bCBwYWNrYWdlcwo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDo0YzRkOTAxYS04NGQ3LTRmMjAt YmQ5OS0wODA4YzJiMDZlYmEKOmVuZDoKClRoaXMgc2VjdGlvbiBjb3ZlcnMgaW5mb3JtYXRpb24g dGhhdCBtYXkgYmUgb2YgaW50ZXJlc3QgdG8gdXNlcnMgb2YKaW5kaXZpZHVhbCBwYWNrYWdlcy4K CioqIE5vdGUgZm9yIGRpc3BsYXktZmlsbC1jb2x1bW4taW5kaWNhdG9yLW1vZGUKOnByb3BlcnRp ZXM6CjpjdXN0b21faWQ6IGg6MmE2MDI4MTYtYmMxYi00NWJmLTk2NzUtNGNiYmQ3YmY2Y2FiCjpl bmQ6CgpXaGlsZSBkZXNpZ25pbmcgdGhlIHN0eWxlIGZvciB+ZGlzcGxheS1maWxsLWNvbHVtbi1p bmRpY2F0b3ItbW9kZX4sIHdlCnN0YXllZCBjbG9zZSB0byB0aGUgbW9kZSdzIGRlZmF1bHRzOiB0 byBhcHBseSBhIHN1YnRsZSBmb3JlZ3JvdW5kIGNvbG9yCnRvIHRoZSB+ZmlsbC1jb2x1bW4taW5k aWNhdG9yfiBmYWNlLCB3aGljaCBibGVuZHMgd2VsbCB3aXRoIHRoZSByZXN0IG9mCnRoZW1lIGFu ZCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJvbGUgb2YgdGhhdCBtb2RlLiAgVGhpcyBpcyB0byBu b3QKdXBzZXQgdGhlIGV4cGVjdGF0aW9ucyBvZiB1c2Vycy4KCk5ldmVydGhlbGVzcywgfmRpc3Bs YXktZmlsbC1jb2x1bW4taW5kaWNhdG9yLW1vZGV+IGhhcyBzb21lIGtub3duCmxpbWl0YXRpb25z IHBlcnRhaW5pbmcgdG8gaXRzIGNob2ljZSBvZiB1c2luZyB0eXBvZ3JhcGhpYyBjaGFyYWN0ZXJz IHRvCmRyYXcgaXRzIGluZGljYXRvci4gIFdoYXQgc2hvdWxkIGJlIGEgY29udGludW91cyB2ZXJ0 aWNhbCBsaW5lIG1pZ2h0CmFwcGVhciBhcyBhIHNlcmllcyBvZiBkYXNoZXMgaW4gY2VydGFpbiBj b250ZXh0cyBvciB1bmRlciBzcGVjaWZpYwpjb25kaXRpb25zOiBhIG5vbi1kZWZhdWx0IHZhbHVl IGZvciB+bGluZS1zcGFjaW5nfiwgc2NhbGVkIGFuZC9vcgp2YXJpYWJsZS1waXRjaCBoZWFkaW5n cyBoYXZlIGJlZW4gb2JzZXJ2ZWQgdG8gY2F1c2UgdGhpcyBlZmZlY3QuCgpHaXZlbiB0aGF0IHdl IGNhbm5vdCBjb250cm9sIHN1Y2ggZmFjdG9ycywgaXQgbWF5IGJlIGJldHRlciBmb3IgYWZmZWN0 ZWQKdXNlcnMgdG8gZGV2aWF0ZSBmcm9tIHRoZSBkZWZhdWx0IHN0eWxlIG9mIHRoZSB+ZmlsbC1j b2x1bW4taW5kaWNhdG9yfgpmYWNlLiAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgZm9yZWdyb3VuZCBj b2xvciwgb25lIGNvdWxkIHVzZSBhIGJhY2tncm91bmQKYW5kIGhhdmUgdGhlIGZvcmVncm91bmQg YmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBpdC4gIEZvciBleGFtcGxlOgoKIytiZWdpbl9zcmMg ZW1hY3MtbGlzcAoobW9kdXMtdGhlbWVzLXdpdGgtY29sb3JzCiAgKGN1c3RvbS1zZXQtZmFjZXMK ICAgYChmaWxsLWNvbHVtbi1pbmRpY2F0b3IgKCgsY2xhc3MgOmJhY2tncm91bmQgLGJnLWluYWN0 aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb3JlZ3JvdW5kICxiZy1p bmFjdGl2ZSkpKSkpCiMrZW5kX3NyYwoKW1sjaDo1MWJhMzU0Ny1iOGM4LTQwZDYtYmE1YS00NTg2 NDc3ZmQ0YWVdW0ZhY2Ugc3BlY3MgYXQgc2NhbGUgdXNpbmcgdGhlIHRoZW1lcycgcGFsZXR0ZV1d LgoKKiogTm90ZSBmb3IgbW1tLW1vZGUuZWwgYmFja2dyb3VuZCBjb2xvcnMKOnByb3BlcnRpZXM6 CjpjdXN0b21faWQ6IGg6OTljZjBkNmMtZTQ3OC00ZTI2LTk5MzItM2JmMzQyN2QxM2Y2CjplbmQ6 CgpUaGUgZmFjZXMgdXNlZCBieSB7e3tmaWxlKG1tbS1tb2RlLmVsKX19fSBhcmUgZXhwZWN0ZWQg dG8gaGF2ZSBhIGNvbG9yZnVsCmJhY2tncm91bmQsIHdoaWxlIHRoZXkgc2hvdWxkIG5vdCB0b3Vj aCBhbnkgZm9yZWdyb3VuZCB2YWx1ZS4gIFRoZSBpZGVhCmlzIHRoYXQgdGhleSBtdXN0IG5vdCBp bnRlcmZlcmUgd2l0aCBleGlzdGluZyBmb250aWZpY2F0aW9uLiAgVGhvc2UKYmFja2dyb3VuZCBj b2xvcnMgbmVlZCB0byBiZSBkaXN0aW5jdCBmcm9tIGVhY2ggb3RoZXIsIHN1Y2ggYXMgYW4KdW5h bWJpZ3VvdXMgcmVkIGp1eHRhcG9zZWQgd2l0aCBhIGNsZWFyIGJsdWUuCgpXaGlsZSB0aGlzIGRl c2lnbiBtYXkgYmUgaW50ZXJuYWxseSBjb25zaXN0ZW50IHdpdGggdGhlIHJhaXNvbiBkJ8OqdHJl IG9mCnRoYXQgbGlicmFyeSwgaXQgaW5ldml0YWJseSBwcm9kdWNlcyBpbmFjY2Vzc2libGUgY29s b3IgY29tYmluYXRpb25zLgoKVGhlcmUgYXJlIHR3byBjb21wZXRpbmcgZ29hbHMgYXQgcGxheToK CjEuIExlZ2liaWxpdHkgb2YgdGhlIHRleHQsIHVuZGVyc3Rvb2QgYXMgdGhlIGNvbnRyYXN0IHJh dGlvIGJldHdlZW4gdGhlCiAgIGJhY2tncm91bmQgYW5kIHRoZSBmb3JlZ3JvdW5kLgoKMi4gU2Vt YW50aWMgcHJlY2lzaW9uIG9mIGVhY2ggZmFjZSB3aGljaCBlbnRhaWxzIGZhaXRoZnVsbmVzcyB0 bwogICBjb2xvci1jb2Rpbmcgb2YgdGhlIHVuZGVybHlpbmcgYmFja2dyb3VuZC4KCkFzIHRoZSBN b2R1cyB0aGVtZXMgYXJlIGRlc2lnbmVkIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBjb25m b3JtaW5nCndpdGggdGhlIGZpcnN0IHBvaW50LCB3ZSBoYXZlIHRvIGZvcmdvIHRoZSBhcHBhcmVu dCBjb2xvci1jb2Rpbmcgb2YgdGhlCmJhY2tncm91bmQgZWxlbWVudHMuICBJbnN0ZWFkIHdlIHVz ZSBzdWJ0bGUgY29sb3JzIHRoYXQgZG8gbm90IHVuZGVybWluZQp0aGUgbGVnaWJpbGl0eSBvZiB0 aGUgYWZmZWN0ZWQgdGV4dCB3aGlsZSB0aGV5IHN0aWxsIG9mZmVyIGEgc2Vuc2Ugb2YKYWRkZWQg Y29udGV4dC4KClVzZXJzIHdobyBtaWdodCBwcmVmZXIgdG8gZmFsbCBiZWxvdyB0aGUgbWluaW11 bSA3OjEgY29udHJhc3QgcmF0aW8gaW4KcmVsYXRpdmUgbHVtaW5hbmNlICh0aGUgYWNjZXNzaWJp bGl0eSB0YXJnZXQgd2UgY29uZm9ybSB3aXRoKSwgY2FuIG9wdAp0byBjb25maWd1cmUgdGhlIHJl bGV2YW50IGZhY2VzIG9uIHRoZWlyIG93bi4KCltbI2g6NTFiYTM1NDctYjhjOC00MGQ2LWJhNWEt NDU4NjQ3N2ZkNGFlXVtGYWNlIHNwZWNzIGF0IHNjYWxlIHVzaW5nIHRoZSB0aGVtZXMnIHBhbGV0 dGVdXS4KClRoaXMgZXhhbXBsZSB1c2VzIG1vcmUgdml2aWQgYmFja2dyb3VuZCBjb2xvcnMsIHRo b3VnaCBpdCBjb21lcyBhdCB0aGUKdmVyeSBoaWdoIGNvc3Qgb2YgZGVncmFkZWQgbGVnaWJpbGl0 eS4KCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKG1vZHVzLXRoZW1lcy13aXRoLWNvbG9ycwogIChj dXN0b20tc2V0LWZhY2VzCiAgIGAobW1tLWNsZWFudXAtc3VibW9kZS1mYWNlICgoLGNsYXNzIDpi YWNrZ3JvdW5kICx5ZWxsb3ctcmVmaW5lLWJnKSkpCiAgIGAobW1tLWNvZGUtc3VibW9kZS1mYWNl ICgoLGNsYXNzIDpiYWNrZ3JvdW5kICxiZy1hY3RpdmUpKSkKICAgYChtbW0tY29tbWVudC1zdWJt b2RlLWZhY2UgKCgsY2xhc3MgOmJhY2tncm91bmQgLGJsdWUtcmVmaW5lLWJnKSkpCiAgIGAobW1t LWRlY2xhcmF0aW9uLXN1Ym1vZGUtZmFjZSAoKCxjbGFzcyA6YmFja2dyb3VuZCAsY3lhbi1yZWZp bmUtYmcpKSkKICAgYChtbW0tZGVmYXVsdC1zdWJtb2RlLWZhY2UgKCgsY2xhc3MgOmJhY2tncm91 bmQgLGJnLWFsdCkpKQogICBgKG1tbS1pbml0LXN1Ym1vZGUtZmFjZSAoKCxjbGFzcyA6YmFja2dy b3VuZCAsbWFnZW50YS1yZWZpbmUtYmcpKSkKICAgYChtbW0tb3V0cHV0LXN1Ym1vZGUtZmFjZSAo KCxjbGFzcyA6YmFja2dyb3VuZCAscmVkLXJlZmluZS1iZykpKQogICBgKG1tbS1zcGVjaWFsLXN1 Ym1vZGUtZmFjZSAoKCxjbGFzcyA6YmFja2dyb3VuZCAsZ3JlZW4tcmVmaW5lLWJnKSkpKSkKIytl bmRfc3JjCgoqKiBOb3RlIGZvciBwcmlzbS5lbAo6cHJvcGVydGllczoKOmFsdF90aXRsZTogTm90 ZSBmb3IgcHJpc20KOmN1c3RvbV9pZDogaDphOTQyNzJlMC05OWRhLTQxNDktOWU4MC0xMWE3ZTY3 YTJjZjIKOmVuZDoKClRoaXMgcGFja2FnZSBieSBBZGFtIFBvcnRlciwgYWthICJhbHBoYXBhcGEi IG9yICJnaXRodWItYWxwaGFwYXBhIiwKaW1wbGVtZW50cyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUg dHlwaWNhbCBjb2xvcmF0aW9uIG9mIGNvZGUuICBJbnN0ZWFkIG9mCmhpZ2hsaWdodGluZyB0aGUg c3ludGFjdGljIGNvbnN0cnVjdHMsIGl0IGFwcGxpZXMgY29sb3IgdG8gZGlmZmVyZW50CmxldmVs cyBvZiBkZXB0aCBpbiB0aGUgY29kZSBzdHJ1Y3R1cmUuCgpBcyB7e3tmaWxlKHByaXNtLmVsKX19 fSBvZmZlcnMgYSBicm9hZCByYW5nZSBvZiBjdXN0b21pc2F0aW9ucywgd2UgY2Fubm90CnN0eWxl IGl0IGRpcmVjdGx5IGF0IHRoZSB0aGVtZSBsZXZlbDogdGhhdCB3b3VsZCBydW4gY29udHJhcnkg dG8gdGhlCnNwaXJpdCBvZiB0aGUgcGFja2FnZS4gIEluc3RlYWQsIHdlIG1heSBvZmZlciBwcmVz ZXQgY29sb3Igc2NoZW1lcy4KVGhvc2Ugc2hvdWxkIG9mZmVyIGEgc3RhcnRpbmcgcG9pbnQgZm9y IHVzZXJzIHRvIGFkYXB0IHRvIHRoZWlyIG5lZWRzLgoKSW4gdGhlIGZvbGxvd2luZyBjb2RlIHNu aXBwZXRzLCB3ZSBlbXBsb3kgdGhlIH5tb2R1cy10aGVtZXMtd2l0aC1jb2xvcnN+Cm1hY3JvOiBb WyNoOjUxYmEzNTQ3LWI4YzgtNDBkNi1iYTVhLTQ1ODY0NzdmZDRhZV1bRmFjZSBzcGVjcyBhdCBz Y2FsZSB1c2luZyB0aGUgdGhlbWVzJyBwYWxldHRlXV0uCgpUaGVzZSBhcmUgdGhlIG1pbmltdW0g cmVjb21tZW5kZWQgc2V0dGluZ3Mgd2l0aCAxNiBjb2xvcnM6CgojK2JlZ2luX3NyYyBlbWFjcy1s aXNwCihzZXRxIHByaXNtLW51bS1mYWNlcyAxNikKCihwcmlzbS1zZXQtY29sb3JzCiAgOmRlc2F0 dXJhdGlvbnMgJygwKSA7IGRvIG5vdCBjaGFuZ2UtLS1tYXkgbG93ZXIgdGhlIGNvbnRyYXN0IHJh dGlvCiAgOmxpZ2h0ZW5zICcoMCkgICAgICA7IHNhbWUKICA6Y29sb3JzIChtb2R1cy10aGVtZXMt d2l0aC1jb2xvcnMKICAgICAgICAgICAgKGxpc3QgZmctbWFpbgogICAgICAgICAgICAgICAgICBt YWdlbnRhCiAgICAgICAgICAgICAgICAgIGN5YW4tYWx0LW90aGVyCiAgICAgICAgICAgICAgICAg IG1hZ2VudGEtYWx0LW90aGVyCiAgICAgICAgICAgICAgICAgIGJsdWUKICAgICAgICAgICAgICAg ICAgbWFnZW50YS1hbHQKICAgICAgICAgICAgICAgICAgY3lhbi1hbHQKICAgICAgICAgICAgICAg ICAgcmVkLWFsdC1vdGhlcgogICAgICAgICAgICAgICAgICBncmVlbgogICAgICAgICAgICAgICAg ICBmZy1tYWluCiAgICAgICAgICAgICAgICAgIGN5YW4KICAgICAgICAgICAgICAgICAgeWVsbG93 CiAgICAgICAgICAgICAgICAgIGJsdWUtYWx0CiAgICAgICAgICAgICAgICAgIHJlZC1hbHQKICAg ICAgICAgICAgICAgICAgZ3JlZW4tYWx0LW90aGVyCiAgICAgICAgICAgICAgICAgIGZnLXNwZWNp YWwtd2FybSkpKQojK2VuZF9zcmMKCldpdGggOCBjb2xvcnM6CgojK2JlZ2luX3NyYyBlbWFjcy1s aXNwCihzZXRxIHByaXNtLW51bS1mYWNlcyA4KQoKKHByaXNtLXNldC1jb2xvcnMKICA6ZGVzYXR1 cmF0aW9ucyAnKDApIDsgZG8gbm90IGNoYW5nZS0tLW1heSBsb3dlciB0aGUgY29udHJhc3QgcmF0 aW8KICA6bGlnaHRlbnMgJygwKSAgICAgIDsgc2FtZQogIDpjb2xvcnMgKG1vZHVzLXRoZW1lcy13 aXRoLWNvbG9ycwogICAgICAgICAgICAobGlzdCBmZy1zcGVjaWFsLWNvbGQKICAgICAgICAgICAg ICAgICAgbWFnZW50YQogICAgICAgICAgICAgICAgICBtYWdlbnRhLWFsdC1vdGhlcgogICAgICAg ICAgICAgICAgICBjeWFuLWFsdC1vdGhlcgogICAgICAgICAgICAgICAgICBmZy1tYWluCiAgICAg ICAgICAgICAgICAgIGJsdWUtYWx0CiAgICAgICAgICAgICAgICAgIHJlZC1hbHQtb3RoZXIKICAg ICAgICAgICAgICAgICAgY3lhbikpKQojK2VuZF9zcmMKCkFuZCB0aGlzIGlzIHdpdGggNCBjb2xv cnMsIHdoaWNoIHByb2R1Y2VzIHJlc3VsdHMgdGhhdCBhcmUgdGhlIGNsb3Nlc3QKdG8gdGhlIHRo ZW1lcycgZGVmYXVsdCBhZXN0aGV0aWM6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwCihzZXRxIHBy aXNtLW51bS1mYWNlcyA0KQoKKHByaXNtLXNldC1jb2xvcnMKICA6ZGVzYXR1cmF0aW9ucyAnKDAp IDsgZG8gbm90IGNoYW5nZS0tLW1heSBsb3dlciB0aGUgY29udHJhc3QgcmF0aW8KICA6bGlnaHRl bnMgJygwKSAgICAgIDsgc2FtZQogIDpjb2xvcnMgKG1vZHVzLXRoZW1lcy13aXRoLWNvbG9ycwog ICAgICAgICAgICAobGlzdCBmZy1tYWluCiAgICAgICAgICAgICAgICAgIGN5YW4tYWx0LW90aGVy CiAgICAgICAgICAgICAgICAgIG1hZ2VudGEtYWx0LW90aGVyCiAgICAgICAgICAgICAgICAgIG1h Z2VudGEpKSkKIytlbmRfc3JjCgpJZiB5b3UgbmVlZCB0byBhcHBseSBkZXNhdHVyYXRpb24gYW5k IGxpZ2h0ZW5pbmcsIHlvdSBjYW4gdXNlIHdoYXQgdGhlCnt7e2ZpbGUocHJpc20uZWwpfX19IGRv Y3VtZW50YXRpb24gcmVjb21tZW5kcywgbGlrZSB0aGlzIChhZGFwdGluZyB0byB0aGUKZXhhbXBs ZXMgd2l0aCB0aGUgNCwgOCwgMTYgY29sb3JzKToKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKHBy aXNtLXNldC1jb2xvcnMKICA6ZGVzYXR1cmF0aW9ucyAoY2wtbG9vcCBmb3IgaSBmcm9tIDAgYmVs b3cgMTYgY29sbGVjdCAoKiBpIDIuNSkpCiAgOmxpZ2h0ZW5zIChjbC1sb29wIGZvciBpIGZyb20g MCBiZWxvdyAxNiBjb2xsZWN0ICgqIGkgMi41KSkKICA6Y29sb3JzIChtb2R1cy10aGVtZXMtd2l0 aC1jb2xvcnMKICAgICAgICAgICAgKGxpc3QgZmctbWFpbgogICAgICAgICAgICAgICAgICBjeWFu LWFsdC1vdGhlcgogICAgICAgICAgICAgICAgICBtYWdlbnRhLWFsdC1vdGhlcgogICAgICAgICAg ICAgICAgICBtYWdlbnRhKSkpCiMrZW5kX3NyYwoKKiogTm90ZSBvbiBjb21wYW55LW1vZGUgb3Zl cmxheSBwb3AtdXAKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6MjBjZWY4YzQtZDExZi00MDUz LThiMmMtMjg3MjkyNTc4MGIxCjplbmQ6CgpCeSBkZWZhdWx0LCB0aGUgfmNvbXBhbnktbW9kZX4g cG9wLXVwIHRoYXQgbGlzdHMgY29tcGxldGlvbiBjYW5kaWRhdGVzIGlzCmRyYXduIHVzaW5nIGFu IG92ZXJsYXkuICBUaGlzIGNyZWF0ZXMgYWxpZ25tZW50IGlzc3VlcyBldmVyeSB0aW1lIGl0IGlz CnBsYWNlZCBhYm92ZSBhIHBpZWNlIG9mIHRleHQgdGhhdCBoYXMgYSBkaWZmZXJlbnQgaGVpZ2h0 IHRoYW4gdGhlCmRlZmF1bHQuCgpUaGUgc29sdXRpb24gcmVjb21tZW5kZWQgYnkgdGhlIHByb2pl Y3QncyBtYWludGFpbmVyIGlzIHRvIHVzZSBhbgphbHRlcm5hdGl2ZSBmcm9udC1lbmQgZm9yIGRy YXdpbmcgdGhlIHBvcC11cCB3aGljaCBkcmF3cyBjaGlsZCBmcmFtZXMKaW5zdGVhZCBvZiBvdmVy bGF5cy5bZm46OgpodHRwczovL2dpdGh1Yi5jb20vY29tcGFueS1tb2RlL2NvbXBhbnktbW9kZS9p c3N1ZXMvMTAxMF1bZm46OgpodHRwczovL2dpdGh1Yi5jb20vdHVtYXNodS9jb21wYW55LXBvc2Zy YW1lL10KCioqIE5vdGUgZm9yIEVSQyBlc2NhcGVkIGNvbG9yIHNlcXVlbmNlcwo6cHJvcGVydGll czoKOmN1c3RvbV9pZDogaDo5OGJkZjMxOS0xZTMyLTQ0NjktOGEwMS03NzEyMDBmYmE2NWMKOmVu ZDoKClRoZSBidWlsdC1pbiBJUkMgY2xpZW50IH5lcmN+IGhhcyB0aGUgYWJpbGl0eSB0byBjb2xv cmlzZSBhbnkgdGV4dCB1c2luZwplc2NhcGUgc2VxdWVuY2VzIHRoYXQgc3RhcnQgd2l0aCA9XkM9 IChpbnNlcnRlZCB3aXRoIHt7e2tiZChDLXEgQy1jKX19fSkgYW5kIGFyZQpmb2xsb3dlZCBieSBh IG51bWJlciBmb3IgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQuW2ZuOjogVGhpcyBwYWdl CmV4cGxhaW5zIHRoZSBiYXNpY3MsIHRob3VnaCBpdCBpcyBub3Qgc3BlY2lmaWMgdG8gRW1hY3M6 Cmh0dHBzOi8vd3d3Lm1pcmMuY29tL2NvbG9ycy5odG1sXSBQb3NzaWJsZSBudW1iZXJzIGFyZSAw LTE1LCB3aXRoIHRoZQpmaXJzdCBlbnRyeSBiZWluZyB0aGUgZm9yZWdyb3VuZCBhbmQgdGhlIHNl Y29uZCB0aGUgYmFja2dyb3VuZCwKc2VwYXJhdGVkIGJ5IGEgY29tbWEuICBMaWtlIHRoaXMgPV5D MSw2PS4gIFRoZSBtaW5pbXVtIHNldHVwIGlzIHRoaXM6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNw CihhZGQtdG8tbGlzdCAnZXJjLW1vZHVsZXMgJ2lyY2NvbnRyb2xzKQooc2V0cSBlcmMtaW50ZXJw cmV0LWNvbnRyb2xzLXAgdAogICAgICBlcmMtaW50ZXJwcmV0LW1pcmMtY29sb3IgdCkKIytlbmRf c3JjCgpBcyB0aGlzIGFsbG93cyB1c2VycyB0aGUgY2hhbmNlIHRvIG1ha2UgYXJiaXRyYXJ5IGNv bWJpbmF0aW9ucywgaXQgaXMKaW1wb3NzaWJsZSB0byBndWFyYW50ZWUgYSBjb25zaXN0ZW50bHkg aGlnaCBjb250cmFzdCByYXRpby4gIEFsbCB3ZSBjYW4Kd2UgZG8gaXMgcHJvdmlkZSBndWlkYW5j ZSBvbiB0aGUgY29tYmluYXRpb25zIHRoYXQgc2F0aXNmeSB0aGUKYWNjZXNzaWJpbGl0eSBzdGFu ZGFyZCBvZiB0aGUgdGhlbWVzOgoKKyBNb2R1cyBPcGVyYW5kaSA6OiBVc2UgZm9yZWdyb3VuZCBj b2xvciAxIGZvciBhbGwgYmFja2dyb3VuZHMgZnJvbQogIDItMTUuICBMaWtlIHNvOiB7e3trYmQo Qy1xIEMtYzEsTil9fX0gd2hlcmUgPU49IGlzIHRoZSBiYWNrZ3JvdW5kLgoKKyBNb2R1cyBWaXZl bmRpIDo6IFVzZSBmb3JlZ3JvdW5kIGNvbG9yIDAgZm9yIGFsbCBiYWNrZ3JvdW5kcyBmcm9tCiAg Mi0xMy4gIFVzZSBmb3JlZ3JvdW5kID0xPSBmb3IgYmFja2dyb3VuZHMgMTQsIDE1LgoKQ29sb3Jz IDAgYW5kIDEgYXJlIHdoaXRlIGFuZCBibGFjayByZXNwZWN0aXZlbHkuICBTbyBjb21iaW5lIHRo ZW0KdG9nZXRoZXIsIGlmIHlvdSBtdXN0LgoKKiogTm90ZSBmb3IgcG93ZXJsaW5lIG9yIHNwYWNl bGluZQo6cHJvcGVydGllczoKOmN1c3RvbV9pZDogaDo5MTMwYThiYS1kOGUzLTQxYmUtYTU4Yi0z Y2IxZWI3YjZkMTcKOmVuZDoKCkJvdGggUG93ZXJsaW5lIGFuZCBTcGFjZWxpbmUgcGFja2FnZSB1 c2VycyB3aWxsIGxpa2VseSBuZWVkIHRvIHVzZSB0aGUKY29tbWFuZCB+cG93ZXJsaW5lLXJlc2V0 fiB3aGVuZXZlciB0aGV5IG1ha2UgY2hhbmdlcyB0byB0aGVpciB0aGVtZXMKYW5kL29yIG1vZGVs aW5lIHNldHVwLgoKKiogTm90ZSBvbiBTSFIgY29sb3JzCjpwcm9wZXJ0aWVzOgo6Y3VzdG9tX2lk OiBoOjRjYzc2N2RjLWZmZWYtNGM1Yy05ZjEwLTgyZWI3Yjg5MjFiZgo6ZW5kOgoKRW1hY3MnIEhU TUwgcmVuZGVyaW5nIGxpYnJhcnkgKHt7e2ZpbGUoc2hyLmVsKX19fSkgbWF5IG5lZWQgZXhwbGlj aXQKY29uZmlndXJhdGlvbiB0byByZXNwZWN0IHRoZSB0aGVtZSdzIGNvbG9ycyBpbnN0ZWFkIG9m IHdoYXRldmVyCnNwZWNpZmljYXRpb25zIHRoZSB3ZWJwYWdlIHByb3ZpZGVzLgoKQ29uc3VsdCB7 e3trYmQoQy1oIHYgc2hyLXVzZS1jb2xvcnMpfX19LgoKKiogTm90ZSBmb3IgSGVsbSBncmVwCjpw cm9wZXJ0aWVzOgo6Y3VzdG9tX2lkOiBoOmQyODg3OWEyLThlNGItNDUyNS05ODZlLTE0YzBmODcz ZDIyOQo6ZW5kOgoKVGhlcmUgaXMgb25lIGZhY2UgZnJvbSB0aGUgSGVsbSBwYWNrYWdlIHRoYXQg aXMgbWVhbnQgdG8gaGlnaGxpZ2h0IHRoZQptYXRjaGVzIG9mIGEgZ3JlcCBvciBncmVwLWxpa2Ug Y29tbWFuZCAoPWFnPSBvciA9cmlwZ3JlcD0pLiAgSXQgaXMKfmhlbG0tZ3JlcC1tYXRjaH4uICBI b3dldmVyLCB0aGlzIGZhY2UgY2FuIG9ubHkgYXBwbHkgd2hlbiB0aGUgdXNlciBkb2VzCm5vdCBw YXNzID0tLWNvbG9yPWFsd2F5cz0gYXMgYSBjb21tYW5kLWxpbmUgb3B0aW9uIGZvciB0aGVpciBj b21tYW5kLgoKSGVyZSBpcyB0aGUgZG9jc3RyaW5nIGZvciB0aGF0IGZhY2UsIHdoaWNoIGlzIGRl ZmluZWQgaW4gdGhlCnt7e2ZpbGUoaGVsbS1ncmVwLmVsKX19fSBsaWJyYXJ5ICh5b3UgY2FuIGFs d2F5cyB2aXNpdCB0aGUgc291cmNlIGNvZGUgd2l0aAp7e3trYmQoTS14IGZpbmQtbGlicmFyeSl9 fX0pLgoKIytiZWdpbl9xdW90ZQpGYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IGdyZXAgbWF0Y2hlcy4g IEhhdmUgbm8gZWZmZWN0IHdoZW4gZ3JlcCBiYWNrZW5kCnVzZSAiLS1jb2xvcj0iCiMrZW5kX3F1 b3RlCgpUaGUgdXNlciBtdXN0IGVpdGhlciByZW1vdmUgPS0tY29sb3I9IGZyb20gdGhlIGZsYWdz IHBhc3NlZCB0byB0aGUgZ3JlcApmdW5jdGlvbiwgb3IgZXhwbGljaXRseSB1c2UgPS0tY29sb3I9 bmV2ZXI9IChvciBlcXVpdmFsZW50KS4gIEhlbG0KcHJvdmlkZXMgdXNlci1mYWNpbmcgY3VzdG9t aXphdGlvbiBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgZ3JlcApmdW5jdGlvbidzIHBhcmFt ZXRlcnMsIHN1Y2ggYXMgfmhlbG0tZ3JlcC1kZWZhdWx0LWNvbW1hbmR+IGFuZAp+aGVsbS1ncmVw LWdpdC1ncmVwLWNvbW1hbmR+LgoKV2hlbiA9LS1jb2xvcj1hbHdheXM9IGlzIGluIGVmZmVjdCwg dGhlIGdyZXAgb3V0cHV0IHdpbGwgdXNlIHJlZCB0ZXh0IGluCmJvbGQgbGV0dGVyIGZvcm1zIHRv IHByZXNlbnQgdGhlIG1hdGNoaW5nIHBhcnQgaW4gdGhlIGxpc3Qgb2YKY2FuZGlkYXRlcy4gIFRo YXQgc3R5bGUgc3RpbGwgbWVldHMgdGhlIGNvbnRyYXN0IHJhdGlvIHRhcmdldCBvZiA+PSA3OjEK KGFjY2Vzc2liaWxpdHkgc3RhbmRhcmQgV0NBRyBBQUEpLCBiZWNhdXNlIGl0IGRyYXdzIHRoZSBy ZWZlcmVuY2UgdG8KQU5TSSBjb2xvciBudW1iZXIgMSAocmVkKSBmcm9tIHRoZSBhbHJlYWR5LXN1 cHBvcnRlZCBhcnJheSBvZgp+YW5zaS1jb2xvci1uYW1lcy12ZWN0b3J+LgoKKiogTm90ZSBvbiB2 Yy1hbm5vdGF0ZS1iYWNrZ3JvdW5kLW1vZGUKOnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6NTA5 NWNiZDEtZTE3YS00MTljLTkzZTgtOTUxYzE4NjM2MmEzCjplbmQ6CgpEdWUgdG8gdGhlIHVuaXF1 ZSB3YXkgfnZjLWFubm90YXRlfiAoe3t7a2JkKEMteCB2IGcpfX19KSBhcHBsaWVzIGNvbG9ycywg c3VwcG9ydApmb3IgaXRzIGJhY2tncm91bmQgbW9kZSAofnZjLWFubm90YXRlLWJhY2tncm91bmQt bW9kZX4pIGlzIGRpc2FibGVkIGF0IHRoZQp0aGVtZSBsZXZlbC4KCk5vcm1hbGx5LCBzdWNoIGEg ZHJhc3RpYyBtZWFzdXJlIHNob3VsZCBub3QgYmVsb25nIGluIGEgdGhlbWU6IGFzc3VtaW5nCnRo ZSB1c2VyJ3MgcHJlZmVyZW5jZXMgaXMgYmFkIHByYWN0aWNlLiAgSG93ZXZlciwgaXQgaGFzIGJl ZW4gZGVlbWVkCm5lY2Vzc2FyeSBpbiB0aGUgaW50ZXJlc3Qgb2YgcHJlc2VydmluZyBjb2xvciBj b250cmFzdCBhY2Nlc3NpYmlsaXR5CndoaWxlIHN0aWxsIHN1cHBvcnRpbmcgYSB1c2VmdWwgYnVp bHQtaW4gdG9vbC4KCklmIHRoZXJlIGFjdHVhbGx5IGlzIGEgd2F5IHRvIGF2b2lkIHN1Y2ggYSBj b3Vyc2Ugb2YgYWN0aW9uLCB3aXRob3V0CnByZWp1ZGljZSB0byB0aGUgYWNjZXNzaWJpbGl0eSBz dGFuZGFyZCBvZiB0aGlzIHByb2plY3QsIHRoZW4gcGxlYXNlCnJlcG9ydCBhcyBtdWNoIG9yIHNl bmQgcGF0Y2hlcyAoW1sjaDo5YzNjZDg0Mi0xNGI3LTQ0ZDctODRiMi1hNWM4YmMzZmMzYjFdW0Nv bnRyaWJ1dGluZ11dKS4KCioqIE5vdGUgb24gcGRmLXRvb2xzIGxpbmsgaGludHMKOnByb3BlcnRp ZXM6CjpjdXN0b21faWQ6IGg6MjY1OWQxM2UtYjFhNS00MTZjLTlhODktN2MzY2UzYTc2NTc0Cjpl bmQ6CgpIaW50cyBhcmUgZHJhd24gYnkgW1todHRwczovL2ltYWdlbWFnaWNrLm9yZy9dW0ltYWdl TWFnaWNrXV0sIG5vdCBFbWFjcywgaS5lLiwgSW1hZ2VNYWdpY2sgZG9lc24ndAprbm93IGFib3V0 IHRoZSBoaW50IGZhY2UgdW5sZXNzIHlvdSB0ZWxsIEltYWdlTWFnaWNrIGFib3V0IGl0LiBCeQpk ZWZhdWx0LCBvbmx5IHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIGF0dHJpYnV0 ZXMgYXJlCnBhc3NlZC4gVGhlIGJlbG93IHNuaXBwZXQgYWRkcyB0byB0aG9zZSB0aGUgdmFyaW91 cyBmb250IGF0dHJpYnV0ZXMuICBBcwppdCBxdWVyaWVzIHZhcmlvdXMgZmFjZXMsIHNwZWNpZmlj YWxseSB+cGRmLWxpbmtzLXJlYWQtbGlua34gYW5kIHRoZSBmYWNlcwppdCBpbmhlcml0cywgaXQg bmVlZHMgdG8gYmUgYWRkZWQgdG8geW91ciBpbml0aWFsaXphdGlvbiBmaWxlIGFmdGVyCnlvdSd2 ZSBjdXN0b21pemVkIGFueSBmYWNlcy4KCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKHVzZS1wYWNr YWdlIHBkZi1saW5rcwogIDpjb25maWcKICAobGV0ICgoc3BlYwogICAgICAgICAoYXBwbHkgIydh cHBlbmQKICAgICAgICAgICAgICAgIChtYXBjYXIKICAgICAgICAgICAgICAgICAobGFtYmRhIChu YW1lKQogICAgICAgICAgICAgICAgICAgKGxpc3QgbmFtZQogICAgICAgICAgICAgICAgICAgICAg ICAgKGZhY2UtYXR0cmlidXRlICdwZGYtbGlua3MtcmVhZC1saW5rCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBuaWwgJ2RlZmF1bHQpKSkKICAgICAgICAgICAg ICAgICAnKDpmYW1pbHkgOndpZHRoIDp3ZWlnaHQgOnNsYW50KSkpKSkKICAgIChzZXRxIHBkZi1s aW5rcy1yZWFkLWxpbmstY29udmVydC1jb21tYW5kcwogICAgICAgICAgYCgiLWRlbnNpdHkiICAg ICI5NiIKICAgICAgICAgICAgIi1mYW1pbHkiICAgICAsKHBsaXN0LWdldCBzcGVjIDpmYW1pbHkp CiAgICAgICAgICAgICItc3RyZXRjaCIgICAgLChsZXQqICgod2lkdGggKHBsaXN0LWdldCBzcGVj IDp3aWR0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSAoc3ltYm9s LW5hbWUgd2lkdGgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGFjZS1yZWdl eHAtaW4tc3RyaW5nICItIiAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGNhcGl0YWxpemUgbmFtZSkpKQogICAgICAgICAgICAiLXdlaWdo dCIgICAgICwocGNhc2UgKHBsaXN0LWdldCBzcGVjIDp3ZWlnaHQpCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKCd1bHRyYS1saWdodCAiVGhpbiIpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKCdleHRyYS1saWdodCAiRXh0cmFMaWdodCIpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKCdsaWdodCAgICAgICAiTGlnaHQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgnc2VtaS1ib2xkICAgIlNlbWlCb2xkIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo J2JvbGQgICAgICAgICJCb2xkIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2V4dHJh LWJvbGQgICJFeHRyYUJvbGQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndWx0cmEt Ym9sZCAgIkJsYWNrIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3dlaWdodCAgICAg ICJOb3JtYWwiKSkKICAgICAgICAgICAgIi1zdHlsZSIgICAgICAsKHBjYXNlIChwbGlzdC1nZXQg c3BlYyA6c2xhbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpdGFsaWMgICJJdGFs aWMiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnb2JsaXF1ZSAiT2JsaXF1ZSIpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9zbGFudCAgICJOb3JtYWwiKSkKICAgICAgICAg ICAgIi1wb2ludHNpemUiICAiJVAiCiAgICAgICAgICAgICItdW5kZXJjb2xvciIgIiVmIgogICAg ICAgICAgICAiLWZpbGwiICAgICAgICIlYiIKICAgICAgICAgICAgIi1kcmF3IiAgICAgICAidGV4 dCAlWCwlWSAnJWMnIikpKSkKIytlbmRfc3JjCgoqIENvbnRyaWJ1dGluZwo6cHJvcGVydGllczoK OmN1c3RvbV9pZDogaDo5YzNjZDg0Mi0xNGI3LTQ0ZDctODRiMi1hNWM4YmMzZmMzYjEKOmVuZDoK ClRoaXMgc2VjdGlvbiBkb2N1bWVudHMgdGhlIGNhbm9uaWNhbCBzb3VyY2VzIG9mIHRoZSB0aGVt ZXMgYW5kIHRoZSB3YXlzCmluIHdoaWNoIHlvdSBjYW4gY29udHJpYnV0ZSB0byB0aGVpciBvbmdv aW5nIGRldmVsb3BtZW50LgoKKiogU291cmNlcyBvZiB0aGUgdGhlbWVzCjpwcm9wZXJ0aWVzOgo6 Y3VzdG9tX2lkOiBoOjg5NTA0ZjFjLWM5YTEtNGJkOS1hYjM5LTc4ZmQwZWRkYjQ3Ywo6ZW5kOgoj K2NpbmRleDogU291cmNlcyBvZiB0aGUgdGhlbWVzCgpUaGUgfm1vZHVzLW9wZXJhbmRpfiBhbmQg fm1vZHVzLXZpdmVuZGl+IHRoZW1lcyBhcmUgYnVpbHQgaW50byBFbWFjcy4KQ3VycmVudGx5IHRo ZXkgYXJlIGluIEVtYWNzJyBnaXQgbWFpbiBicmFuY2ggKHRydW5rKSwgd2hpY2ggaXMgdHJhY2tp bmcKdGhlIG5leHQgZGV2ZWxvcG1lbnQgcmVsZWFzZSB0YXJnZXQuCgpUaGUgc291cmNlIGNvZGUg b2YgdGhlIHRoZW1lcyBpcyBbW2h0dHBzOi8vZ2l0bGFiLmNvbS9wcm90ZXNpbGFvcy9tb2R1cy10 aGVtZXMvXVthdmFpbGFibGUgb24gR2l0bGFiXV0sIGZvciB0aGUgdGltZQpiZWluZy4gIEEgW1to dHRwczovL2dpdGh1Yi5jb20vcHJvdGVzaWxhb3MvbW9kdXMtdGhlbWVzL11bbWlycm9yIG9uIEdp dGh1Yl1dIGlzIGFsc28gb24gb2ZmZXIuCgpBbiBIVE1MIHZlcnNpb24gb2YgdGhpcyBtYW51YWwg aXMgcHJvdmlkZWQgYXMgYW4gZXh0ZW5zaW9uIG9mIHRoZQpbW2h0dHBzOi8vcHJvdGVzaWxhb3Mu Y29tL21vZHVzLXRoZW1lcy9dW2F1dGhvcidzIHBlcnNvbmFsIHdlYnNpdGVdXSAoZG9lcyBub3Qg cmVseSBvbiBhbnkgbm9uLWZyZWUgY29kZSkuCgoqKiBJc3N1ZXMgeW91IGNhbiBoZWxwIHdpdGgK OnByb3BlcnRpZXM6CjpjdXN0b21faWQ6IGg6NjUzNmM4ZDUtM2Y5OC00M2FiLWE3ODctYjk0MTIw ZTczNWU4CjplbmQ6CiMrY2luZGV4OiBDb250cmlidXRpbmcKCkEgZmV3IHRhc2tzIHlvdSBjYW4g aGVscCB3aXRoOgoKKyBTdWdnZXN0IHJlZmluZW1lbnRzIHRvIHBhY2thZ2VzIHRoYXQgYXJlIGNv dmVyZWQuCisgUmVwb3J0IHBhY2thZ2VzIG5vdCBjb3ZlcmVkIHRodXMgZmFyLgorIFJlcG9ydCBi dWdzLCBpbmNvbnNpc3RlbmNpZXMsIHNob3J0Y29taW5ncy4KKyBIZWxwIGV4cGFuZCB0aGUgZG9j dW1lbnRhdGlvbiBvZiBjb3ZlcmVkLWJ1dC1ub3Qtc3R5bGVkIHBhY2thZ2VzLgorIFN1Z2dlc3Qg cmVmaW5lbWVudHMgdG8gdGhlIGNvbG9yIHBhbGV0dGUuCisgSGVscCBleHBhbmQgdGhpcyBkb2N1 bWVudCBvciBhbnkgb3RoZXIgcGllY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyBNZXJnZSByZXF1ZXN0 cyBmb3IgY29kZSByZWZpbmVtZW50cy4KCltbI2g6MTExNzczZTItZjI2Zi00YjY4LThjNGYtOTc5 NGNhNmI5NjMzXVtQYXRjaGVzIHJlcXVpcmUgY29weXJpZ2h0IGFzc2lnbm1lbnQgdG8gdGhlIEZT Rl1dLgoKSXQgaXMgcHJlZmVyYWJsZSB0aGF0IHlvdXIgZmVlZGJhY2sgaW5jbHVkZXMgc29tZSBz Y3JlZW5zaG90cywgR0lGcywgb3IKc2hvcnQgdmlkZW9zLCBhcyB3ZWxsIGFzIGZ1cnRoZXIgaW5z dHJ1Y3Rpb25zIHRvIHJlcHJvZHVjZSBhIGdpdmVuCnNldHVwLiAgVGhvdWdoIHRoaXMgaXMgbm90 IGEgcmVxdWlyZW1lbnQuCgpXaGF0ZXZlciB5b3UgZG8sIGJlYXIgaW4gbWluZCB0aGUgb3ZlcmFy Y2hpbmcgb2JqZWN0aXZlIG9mIHRoZSBNb2R1cwp0aGVtZXM6IHRvIGtlZXAgYSBjb250cmFzdCBy YXRpbyB0aGF0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gNzoxIGJldHdlZW4KYmFja2dyb3VuZCBh bmQgZm9yZWdyb3VuZCBjb2xvcnMuICBJZiBhIGNvbXByb21pc2UgaXMgZXZlciBuZWNlc3NhcnkK YmV0d2VlbiBhZXN0aGV0aWNzIGFuZCBhY2Nlc3NpYmlsaXR5LCBpdCBzaGFsbCBhbHdheXMgYmUg bWFkZSBpbiB0aGUKaW50ZXJlc3Qgb2YgdGhlIGxhdHRlci4KCioqIFBhdGNoZXMgcmVxdWlyZSBj b3B5cmlnaHQgYXNzaWdubWVudCB0byB0aGUgRlNGCjpwcm9wZXJ0aWVzOgo6Y3VzdG9tX2lkOiBo OjExMTc3M2UyLWYyNmYtNGI2OC04YzRmLTk3OTRjYTZiOTYzMwo6ZW5kOgoKQ29kZSBjb250cmli dXRpb25zIGFyZSBtb3N0IHdlbGNvbWUuICBGb3IgYW55IG1ham9yIGVkaXQgKG1vcmUgdGhhbiAx NQpsaW5lcywgb3Igc28sIGluIGFnZ3JlZ2F0ZSBwZXIgcGVyc29uKSwgeW91IG5lZWQgdG8gbWFr ZSBhIGNvcHlyaWdodAphc3NpZ25tZW50IHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24u ICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCnRoZSB0aGVtZXMgYXJlIHBhcnQgb2YgdGhlIHVw c3RyZWFtIEVtYWNzIGRpc3RyaWJ1dGlvbjogdGhlIEZTRiBtdXN0IGF0CmFsbCB0aW1lcyBiZSBp biBhIHBvc2l0aW9uIHRvIGVuZm9yY2UgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgoK Q29weXJpZ2h0IGFzc2lnbm1lbnQgaXMgYSBzaW1wbGUgcHJvY2Vzcy4gIENoZWNrIHRoZSByZXF1 ZXN0IGZvcm0gYmVsb3cKKHBsZWFzZSBhZGFwdCBpdCBhY2NvcmRpbmdseSkuICBZb3UgbXVzdCB3 cml0ZSBhbiBlbWFpbCB0byB0aGUgYWRkcmVzcwptZW50aW9uZWQgaW4gdGhlIGZvcm0gYW5kIHRo ZW4gd2FpdCBmb3IgdGhlIEZTRiB0byBzZW5kIHlvdSBhIGxlZ2FsCmFncmVlbWVudC4gIFNpZ24g dGhlIGRvY3VtZW50IGFuZCBmaWxlIGl0IGJhY2sgdG8gdGhlbS4gIFRoaXMgY291bGQgYWxsCmhh cHBlbiB2aWEgZW1haWwgYW5kIHRha2UgYWJvdXQgYSB3ZWVrLiAgWW91IGFyZSBlbmNvdXJhZ2Vk IHRvIGdvCnRocm91Z2ggdGhpcyBwcm9jZXNzLiAgWW91IG9ubHkgbmVlZCB0byBkbyBpdCBvbmNl LiAgSXQgd2lsbCBhbGxvdyB5b3UKdG8gbWFrZSBjb250cmlidXRpb25zIHRvIEVtYWNzIGluIGdl bmVyYWwuCgojK2JlZ2luX2V4YW1wbGUgdGV4dApQbGVhc2UgZW1haWwgdGhlIGZvbGxvd2luZyBp bmZvcm1hdGlvbiB0byBhc3NpZ25AZ251Lm9yZywgYW5kIHdlCndpbGwgc2VuZCB5b3UgdGhlIGFz c2lnbm1lbnQgZm9ybSBmb3IgeW91ciBwYXN0IGFuZCBmdXR1cmUgY2hhbmdlcy4KClBsZWFzZSB1 c2UgeW91ciBmdWxsIGxlZ2FsIG5hbWUgKGluIEFTQ0lJIGNoYXJhY3RlcnMpIGFzIHRoZSBzdWJq ZWN0CmxpbmUgb2YgdGhlIG1lc3NhZ2UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUkVRVUVTVDogU0VORCBGT1JN IEZPUiBQQVNUIEFORCBGVVRVUkUgQ0hBTkdFUwoKW1doYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHBy b2dyYW0gb3IgcGFja2FnZSB5b3UncmUgY29udHJpYnV0aW5nIHRvP10KCkdOVSBFbWFjcwoKW0Rp ZCB5b3UgY29weSBhbnkgZmlsZXMgb3IgdGV4dCB3cml0dGVuIGJ5IHNvbWVvbmUgZWxzZSBpbiB0 aGVzZSBjaGFuZ2VzPwpFdmVuIGlmIHRoYXQgbWF0ZXJpYWwgaXMgZnJlZSBzb2Z0d2FyZSwgd2Ug bmVlZCB0byBrbm93IGFib3V0IGl0Ll0KCkNvcGllZCBhIGZldyBzbmlwcGV0cyBmcm9tIHRoZSBz YW1lIGZpbGVzIEkgZWRpdGVkLiAgVGhlaXIgYXV0aG9yLApQcm90ZXNpbGFvcyBTdGF2cm91LCBo YXMgYWxyZWFkeSBhc3NpZ25lZCBjb3B5cmlnaHQgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRh dGlvbi4KCltEbyB5b3UgaGF2ZSBhbiBlbXBsb3llciB3aG8gbWlnaHQgaGF2ZSBhIGJhc2lzIHRv IGNsYWltIHRvIG93bgp5b3VyIGNoYW5nZXM/ICBEbyB5b3UgYXR0ZW5kIGEgc2Nob29sIHdoaWNo IG1pZ2h0IG1ha2Ugc3VjaCBhIGNsYWltP10KCgpbRm9yIHRoZSBjb3B5cmlnaHQgcmVnaXN0cmF0 aW9uLCB3aGF0IGNvdW50cnkgYXJlIHlvdSBhIGNpdGl6ZW4gb2Y/XQoKCltXaGF0IHllYXIgd2Vy ZSB5b3UgYm9ybj9dCgoKW1BsZWFzZSB3cml0ZSB5b3VyIGVtYWlsIGFkZHJlc3MgaGVyZS5dCgoK W1BsZWFzZSB3cml0ZSB5b3VyIHBvc3RhbCBhZGRyZXNzIGhlcmUuXQoKCgoKCltXaGljaCBmaWxl cyBoYXZlIHlvdSBjaGFuZ2VkIHNvIGZhciwgYW5kIHdoaWNoIG5ldyBmaWxlcyBoYXZlIHlvdSB3 cml0dGVuCnNvIGZhcj9dCgojK2VuZF9leGFtcGxlCgoqIEFja25vd2xlZGdlbWVudHMKOnByb3Bl cnRpZXM6CjpjdXN0b21faWQ6IGg6OTVjM2RhMjMtMjE3Zi00MDRlLWI1ZjMtNTZjNzU3NjBlYmNm CjplbmQ6CiMrY2luZGV4OiBDb250cmlidXRvcnMKClRoZSBNb2R1cyB0aGVtZXMgYXJlIGEgY29s bGVjdGl2ZSBlZmZvcnQuICBFdmVyeSBiaXQgb2Ygd29yayBtYXR0ZXJzLgoKKyBBdXRob3IvbWFp bnRhaW5lciA6OiBQcm90ZXNpbGFvcyBTdGF2cm91LgoKKyBDb250cmlidXRpb25zIHRvIGNvZGUg b3IgZG9jdW1lbnRhdGlvbiA6OiBBbmRlcnMgSm9oYW5zc29uLCBCYXNpbAogIEwue3t7c3BhY2Uo KX19fSBDb250b3ZvdW5lc2lvcywgQ2FybG8gWmFuY2FuYXJvLCBFbGkgWmFyZXRza2lpLCBLb3N0 YWRpbgogIE5pbmV2LCBNYWRoYXZhbiBLcmlzaG5hbiwgTWFya3VzIEJlcHBsZXIsIE1hdHRoZXcg U3RldmVuc29uLCBOaWNvbGFzCiAgRGUgSmFlZ2hlcmUsIFNocmV5YXMgUmFnYXZhbiwgU3RlZmFu IEthbmdhcywgVmluY2VudCBNdXJwaHksIFhpbmdsdQogIENoZW4uCgorIElkZWFzIGFuZCB1c2Vy IGZlZWRiYWNrIDo6IEFhcm9uIEplbnNlbiwgQWRhbSBTcGllcnMsIEFkcmlhbiBNYW5lYSwKICBB bGV4IEdyaWZmaW4sIEFsZXggUGVpdHNpbmlzLCBBbGV4ZXkgU2htYWxrbywgQWxvayBTaW5naCwg QW5kZXJzCiAgSm9oYW5zc29uLCBBbmRyw6kgQWxleGFuZHJlIEdvbWVzLCBBcmlmIFJlemFpLCBC YXNpbCBMLnt7e3NwYWNlKCl9fX0KICBDb250b3ZvdW5lc2lvcywgQnVyZ2VzcyBDaGFuZywgQ2hy aXN0aWFuIFRpZXR6ZSwgQ2hyaXN0b3BoZXIgRGltZWNoLAogIERhbWllbiBDYXNzb3UsIERhbmll bCBNZW5kbGVyLCBEYXJpbyBHam9yZ2pldnNraSwgRGF2aWQgRWRtb25kc29uLAogIERhdm9yIFJv dGltLCBEaXZhbiBTYW50YW5hLCBHZXJyeSBBZ2JvYmFkYSwgR2lhbmx1Y2EgUmVjY2hpYSwgR3Vz dGF2bwogIEJhcnJvcywgSMO2cm1ldGphbiBZaWx0aXosIElsamEgS29ja2VuLCBJcmlzIEdhcmNp YSwgSmVyZW15IEZyaWVzZW4sCiAgSm9obiBIYW1hbiwgSm9zaHVhIE8nQ29ubm9yLCBLZXZpbiBG bGVtaW5nLCBLb3N0YWRpbiBOaW5ldiwgTGVuIFRyaWdnLAogIE1hbnVlbCBVYmVydGksIE1hcmsg QnVydG9uLCBNYXJrdXMgQmVwcGxlciwgTWljaGFlbCBHb2xkZW5iZXJnLCBNb3JnYW4KICBTbWl0 aCwgTXVyaWxvIFBlcmVpcmEsIE5pY29sYXMgRGUgSmFlZ2hlcmUsIFBhdWwgUG9sb3Nrb3YsIFBl dGUKICBLYXptaWVyLCBQZXRlciBXdSwgUGhpbGlwIEsuLCBQaWVycmUgVMOpY2hvdWV5cmVzLCBS b21hbiBSdWRha292LCBSeWFuCiAgUGhpbGxpcHMsIFNhbSBLbGVpbm1hbiwgU2hyZXlhcyBSYWdh dmFuLCBTaW1vbiBQdWduZXQsIFRhc3NpbG8gSG9ybiwKICBUaGliYXV0IFZlcnJvbiwgVHJleSBN ZXJrbGV5LCBUb2dhbiBNdWZ0dW9nbHUsIFRvb24gQ2xhZXMsIFVyaSBTaGFyZiwKICBVdGthcnNo IFNpbmdoLCBWaW5jZW50IEZvbGV5LiAgQXMgd2VsbCBhcyB1c2VyczogQmVuLCBDc0JpZ0RhdGFI dWIxLAogIEVtYWNzIENvbnRyaWIsIEV1Z2VuZSwgRm91cmNoYXV4LCBGcmVkcmlrLCBNb2VzYXNq aSwgTmljaywgVGhlQmxvYjQyLAogIGJlcG9seW1hdGhlLCBkb29saW8sIGZsZWltZ3J1YmVyLCBp U2VlVSwgaml4aXVmLCBva2Ftc24uCgorIFBhY2thZ2luZyA6OiBCYXNpbCBMLnt7e3NwYWNlKCl9 fX0gQ29udG92b3VuZXNpb3MsIEVsaSBaYXJldHNraWksIEdsZW5uCiAgTW9ycmlzLCBNYXVybyBB cmFuZGEsIFJpY2hhcmQgU3RhbGxtYW4sIFN0ZWZhbiBLYW5nYXMgKGNvcmUgRW1hY3MpLAogIFN0 ZWZhbiBNb25uaWVyIChHTlUgRWxwYSksIEFuZHLDqSBBbGV4YW5kcmUgR29tZXMsIERpbWFrYWtv cyBEaW1vcywKICBNb3JnYW4gU21pdGgsIE5pY29sYXMgR29hemlvdSAoR3VpeCksIERoYXZhbiBW YWlkeWEgKERlYmlhbikuCgorIEluc3BpcmF0aW9uIGZvciBjZXJ0YWluIGZlYXR1cmVzIDo6IEJv emhpZGFyIEJhdHNvdiAoemVuYnVybi10aGVtZSksCiAgRmFicmljZSBOaWVzc2VuIChsZXV2ZW4t dGhlbWUpLgoKU3BlY2lhbCB0aGFua3MsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHRvIE1hbnVl bCBVYmVydGkgYW5kIE9tYXIKQW50b2zDrW4gQ2FtYXJlbmEgZm9yIHRoZWlyIGxvbmcgdGltZSBj b250cmlidXRpb25zIGFuZCBpbnNpZ2h0ZnVsCmNvbW1lbnRhcnkuCgoqIE1ldGEKOnByb3BlcnRp ZXM6CjpjdXN0b21faWQ6IGg6MTM3NTI1ODEtNDM3OC00NzhjLWFmMTctMTY1YjZlNzZiYzFiCjpl bmQ6CiMrY2luZGV4OiBEZXZlbG9wbWVudCBub3RlcwoKSWYgeW91IGFyZSBjdXJpb3VzIGFib3V0 IHRoZSBwcmluY2lwbGVzIHRoYXQgZ292ZXJuIHRoZSBkZXZlbG9wbWVudCBvZgp0aGlzIHByb2pl Y3QgcmVhZCB0aGUgZXNzYXkgW1todHRwczovL3Byb3Rlc2lsYW9zLmNvbS9jb2RlbG9nLzIwMjAt MDMtMTctZGVzaWduLW1vZHVzLXRoZW1lcy1lbWFjcy9dW09uIHRoZSBkZXNpZ24gb2YgdGhlIE1v ZHVzIHRoZW1lc11dCigyMDIwLTAzLTE3KS4KCkhlcmUgYXJlIHNvbWUgbW9yZSBwdWJsaWNhdGlv bnMgZm9yIHRob3NlIGludGVyZXN0ZWQgaW4gdGhlIGtpbmQgb2Ygd29yawp0aGF0IGdvZXMgaW50 byB0aGlzIHByb2plY3QgKHNvbWV0aW1lcyB0aGUgY29tbWl0cyBhbHNvIGluY2x1ZGUgZGV0YWls cwpvZiB0aGlzIHNvcnQpOgoKKyBbW2h0dHBzOi8vcHJvdGVzaWxhb3MuY29tL2NvZGVsb2cvMjAy MC0wNS0xMC1tb2R1cy1vcGVyYW5kaS1wYWxldHRlLXJldmlldy9dW01vZHVzIE9wZXJhbmRpIHRo ZW1lIHN1YnRsZSBwYWxldHRlIHJldmlld11dICgyMDIwLTA1LTEwKQorIFtbaHR0cHM6Ly9wcm90 ZXNpbGFvcy5jb20vY29kZWxvZy8yMDIwLTA2LTEzLW1vZHVzLXZpdmVuZGktcGFsZXR0ZS1yZXZp ZXcvXVtNb2R1cyBWaXZlbmRpIHRoZW1lIHN1YnRsZSBwYWxldHRlIHJldmlld11dICgyMDIwLTA2 LTEzKQorIFtbaHR0cHM6Ly9wcm90ZXNpbGFvcy5jb20vY29kZWxvZy8yMDIwLTA3LTA0LW1vZHVz LXRoZW1lcy1mYWludC1jb2xvdXJzL11bTW9kdXMgdGhlbWVzOiBuZXcgImZhaW50IHN5bnRheCIg b3B0aW9uXV0gKDIwMjAtMDctMDQpCisgW1todHRwczovL3Byb3Rlc2lsYW9zLmNvbS9jb2RlbG9n LzIwMjAtMDctMDgtbW9kdXMtdGhlbWVzLW51YW5jZWQtY29sb3Vycy9dW01vZHVzIHRoZW1lczog bWFqb3IgcmV2aWV3IG9mICJudWFuY2VkIiBjb2xvdXJzXV0gKDIwMjAtMDctMDgpCisgW1todHRw czovL3Byb3Rlc2lsYW9zLmNvbS9jb2RlbG9nLzIwMjAtMDktMTQtbW9kdXMtdGhlbWVzLXJldmll dy1ibHVlcy9dW01vZHVzIHRoZW1lczogcmV2aWV3IG9mIGJsdWUgY29sb3Vyc11dICgyMDIwLTA5 LTE0KQorIFtbaHR0cHM6Ly9wcm90ZXNpbGFvcy5jb20vY29kZWxvZy8yMDIwLTEyLTI3LW1vZHVz LXRoZW1lcy1yZXZpZXctcmFpbmJvdy1kZWxpbWl0ZXJzL11bTW9kdXMgdGhlbWVzOiByZXZpZXcg cmFpbmJvdy1kZWxpbWl0ZXJzIGZhY2VzXV0gKDIwMjAtMTItMjcpCisgW1todHRwczovL3Byb3Rl c2lsYW9zLmNvbS9jb2RlbG9nLzIwMjEtMDEtMTEtbW9kdXMtdGhlbWVzLXJldmlldy1zZWxlY3Qt ZmFpbnQtY29sb3Vycy9dW01vZHVzIHRoZW1lczogcmV2aWV3IG9mIHNlbGVjdCAiZmFpbnQiIGNv bG91cnNdXSAoMjAyMS0wMS0xMSkKKyBbW2h0dHBzOi8vcHJvdGVzaWxhb3MuY29tL2NvZGVsb2cv MjAyMS0wMi0yNS1tb2R1cy10aGVtZXMtZGlmZnMtZGV1dGVyYW5vcGlhL11bVGhlIE1vZHVzIHRo ZW1lcyBub3cgY292ZXIgZGV1dGVyYW5vcGlhIGluIGRpZmZzXV0gKDIwMjEtMDItMjUpCgpBbmQg aGVyZSBhcmUgdGhlIGNhbm9uaWNhbCBzb3VyY2VzIG9mIHRoaXMgcHJvamVjdCdzIGRvY3VtZW50 YXRpb246CgorIE1hbnVhbCA6OiA8aHR0cHM6Ly9wcm90ZXNpbGFvcy5jb20vbW9kdXMtdGhlbWVz PgorIENoYW5nZSBMb2cgOjogPGh0dHBzOi8vcHJvdGVzaWxhb3MuY29tL21vZHVzLXRoZW1lcy1j aGFuZ2Vsb2c+CisgU2NyZWVuc2hvdHMgOjogPGh0dHBzOi8vcHJvdGVzaWxhb3MuY29tL21vZHVz LXRoZW1lcy1waWN0dXJlcz4KCiogR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlCjpwcm9w ZXJ0aWVzOgo6YXBwZW5kaXg6IHQKOmN1c3RvbV9pZDogaDozMDc3YzNkMi03ZjkwLTQyMjgtOGYw YS03MzEyNGY0MDI2ZjYKOmVuZDoKCiMrdGV4aW5mbzogQGluY2x1ZGUgZG9jbGljZW5zZS50ZXhp CgojK2JlZ2luX2V4cG9ydCBodG1sCgogICAgICAgICAgICAgICAgR05VIEZyZWUgRG9jdW1lbnRh dGlvbiBMaWNlbnNlCiAgICAgICAgICAgICAgICAgVmVyc2lvbiAxLjMsIDMgTm92ZW1iZXIgMjAw OAoKCiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDcsIDIwMDggRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICAgPGh0dHBzOi8vZnNmLm9yZy8+CiBFdmVyeW9uZSBp cyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKIG9mIHRo aXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgoKMC4g UFJFQU1CTEUKClRoZSBwdXJwb3NlIG9mIHRoaXMgTGljZW5zZSBpcyB0byBtYWtlIGEgbWFudWFs LCB0ZXh0Ym9vaywgb3Igb3RoZXIKZnVuY3Rpb25hbCBhbmQgdXNlZnVsIGRvY3VtZW50ICJmcmVl IiBpbiB0aGUgc2Vuc2Ugb2YgZnJlZWRvbTogdG8KYXNzdXJlIGV2ZXJ5b25lIHRoZSBlZmZlY3Rp dmUgZnJlZWRvbSB0byBjb3B5IGFuZCByZWRpc3RyaWJ1dGUgaXQsCndpdGggb3Igd2l0aG91dCBt b2RpZnlpbmcgaXQsIGVpdGhlciBjb21tZXJjaWFsbHkgb3Igbm9uY29tbWVyY2lhbGx5LgpTZWNv bmRhcmlseSwgdGhpcyBMaWNlbnNlIHByZXNlcnZlcyBmb3IgdGhlIGF1dGhvciBhbmQgcHVibGlz aGVyIGEgd2F5CnRvIGdldCBjcmVkaXQgZm9yIHRoZWlyIHdvcmssIHdoaWxlIG5vdCBiZWluZyBj b25zaWRlcmVkIHJlc3BvbnNpYmxlCmZvciBtb2RpZmljYXRpb25zIG1hZGUgYnkgb3RoZXJzLgoK VGhpcyBMaWNlbnNlIGlzIGEga2luZCBvZiAiY29weWxlZnQiLCB3aGljaCBtZWFucyB0aGF0IGRl cml2YXRpdmUKd29ya3Mgb2YgdGhlIGRvY3VtZW50IG11c3QgdGhlbXNlbHZlcyBiZSBmcmVlIGlu IHRoZSBzYW1lIHNlbnNlLiAgSXQKY29tcGxlbWVudHMgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlLCB3aGljaCBpcyBhIGNvcHlsZWZ0CmxpY2Vuc2UgZGVzaWduZWQgZm9yIGZyZWUgc29m dHdhcmUuCgpXZSBoYXZlIGRlc2lnbmVkIHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byB1c2UgaXQg Zm9yIG1hbnVhbHMgZm9yIGZyZWUKc29mdHdhcmUsIGJlY2F1c2UgZnJlZSBzb2Z0d2FyZSBuZWVk cyBmcmVlIGRvY3VtZW50YXRpb246IGEgZnJlZQpwcm9ncmFtIHNob3VsZCBjb21lIHdpdGggbWFu dWFscyBwcm92aWRpbmcgdGhlIHNhbWUgZnJlZWRvbXMgdGhhdCB0aGUKc29mdHdhcmUgZG9lcy4g IEJ1dCB0aGlzIExpY2Vuc2UgaXMgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgbWFudWFsczsKaXQg Y2FuIGJlIHVzZWQgZm9yIGFueSB0ZXh0dWFsIHdvcmssIHJlZ2FyZGxlc3Mgb2Ygc3ViamVjdCBt YXR0ZXIgb3IKd2hldGhlciBpdCBpcyBwdWJsaXNoZWQgYXMgYSBwcmludGVkIGJvb2suICBXZSBy ZWNvbW1lbmQgdGhpcyBMaWNlbnNlCnByaW5jaXBhbGx5IGZvciB3b3JrcyB3aG9zZSBwdXJwb3Nl IGlzIGluc3RydWN0aW9uIG9yIHJlZmVyZW5jZS4KCgoxLiBBUFBMSUNBQklMSVRZIEFORCBERUZJ TklUSU9OUwoKVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IG1hbnVhbCBvciBvdGhlciB3b3Jr LCBpbiBhbnkgbWVkaXVtLCB0aGF0CmNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29w eXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgY2FuIGJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGlzIExpY2Vuc2UuICBTdWNoIGEgbm90aWNlIGdyYW50cyBhCndvcmxkLXdpZGUsIHJv eWFsdHktZnJlZSBsaWNlbnNlLCB1bmxpbWl0ZWQgaW4gZHVyYXRpb24sIHRvIHVzZSB0aGF0Cndv cmsgdW5kZXIgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGhlcmVpbi4gIFRoZSAiRG9jdW1lbnQiLCBi ZWxvdywKcmVmZXJzIHRvIGFueSBzdWNoIG1hbnVhbCBvciB3b3JrLiAgQW55IG1lbWJlciBvZiB0 aGUgcHVibGljIGlzIGEKbGljZW5zZWUsIGFuZCBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICBZb3Ug YWNjZXB0IHRoZSBsaWNlbnNlIGlmIHlvdQpjb3B5LCBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUg d29yayBpbiBhIHdheSByZXF1aXJpbmcgcGVybWlzc2lvbgp1bmRlciBjb3B5cmlnaHQgbGF3LgoK QSAiTW9kaWZpZWQgVmVyc2lvbiIgb2YgdGhlIERvY3VtZW50IG1lYW5zIGFueSB3b3JrIGNvbnRh aW5pbmcgdGhlCkRvY3VtZW50IG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIGNvcGllZCB2ZXJi YXRpbSwgb3Igd2l0aAptb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhl ciBsYW5ndWFnZS4KCkEgIlNlY29uZGFyeSBTZWN0aW9uIiBpcyBhIG5hbWVkIGFwcGVuZGl4IG9y IGEgZnJvbnQtbWF0dGVyIHNlY3Rpb24gb2YKdGhlIERvY3VtZW50IHRoYXQgZGVhbHMgZXhjbHVz aXZlbHkgd2l0aCB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZQpwdWJsaXNoZXJzIG9yIGF1dGhvcnMg b2YgdGhlIERvY3VtZW50IHRvIHRoZSBEb2N1bWVudCdzIG92ZXJhbGwKc3ViamVjdCAob3IgdG8g cmVsYXRlZCBtYXR0ZXJzKSBhbmQgY29udGFpbnMgbm90aGluZyB0aGF0IGNvdWxkIGZhbGwKZGly ZWN0bHkgd2l0aGluIHRoYXQgb3ZlcmFsbCBzdWJqZWN0LiAgKFRodXMsIGlmIHRoZSBEb2N1bWVu dCBpcyBpbgpwYXJ0IGEgdGV4dGJvb2sgb2YgbWF0aGVtYXRpY3MsIGEgU2Vjb25kYXJ5IFNlY3Rp b24gbWF5IG5vdCBleHBsYWluCmFueSBtYXRoZW1hdGljcy4pICBUaGUgcmVsYXRpb25zaGlwIGNv dWxkIGJlIGEgbWF0dGVyIG9mIGhpc3RvcmljYWwKY29ubmVjdGlvbiB3aXRoIHRoZSBzdWJqZWN0 IG9yIHdpdGggcmVsYXRlZCBtYXR0ZXJzLCBvciBvZiBsZWdhbCwKY29tbWVyY2lhbCwgcGhpbG9z b3BoaWNhbCwgZXRoaWNhbCBvciBwb2xpdGljYWwgcG9zaXRpb24gcmVnYXJkaW5nCnRoZW0uCgpU aGUgIkludmFyaWFudCBTZWN0aW9ucyIgYXJlIGNlcnRhaW4gU2Vjb25kYXJ5IFNlY3Rpb25zIHdo b3NlIHRpdGxlcwphcmUgZGVzaWduYXRlZCwgYXMgYmVpbmcgdGhvc2Ugb2YgSW52YXJpYW50IFNl Y3Rpb25zLCBpbiB0aGUgbm90aWNlCnRoYXQgc2F5cyB0aGF0IHRoZSBEb2N1bWVudCBpcyByZWxl YXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBJZiBhCnNlY3Rpb24gZG9lcyBub3QgZml0IHRoZSBh Ym92ZSBkZWZpbml0aW9uIG9mIFNlY29uZGFyeSB0aGVuIGl0IGlzIG5vdAphbGxvd2VkIHRvIGJl IGRlc2lnbmF0ZWQgYXMgSW52YXJpYW50LiAgVGhlIERvY3VtZW50IG1heSBjb250YWluIHplcm8K SW52YXJpYW50IFNlY3Rpb25zLiAgSWYgdGhlIERvY3VtZW50IGRvZXMgbm90IGlkZW50aWZ5IGFu eSBJbnZhcmlhbnQKU2VjdGlvbnMgdGhlbiB0aGVyZSBhcmUgbm9uZS4KClRoZSAiQ292ZXIgVGV4 dHMiIGFyZSBjZXJ0YWluIHNob3J0IHBhc3NhZ2VzIG9mIHRleHQgdGhhdCBhcmUgbGlzdGVkLAph cyBGcm9udC1Db3ZlciBUZXh0cyBvciBCYWNrLUNvdmVyIFRleHRzLCBpbiB0aGUgbm90aWNlIHRo YXQgc2F5cyB0aGF0CnRoZSBEb2N1bWVudCBpcyByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2Uu ICBBIEZyb250LUNvdmVyIFRleHQgbWF5CmJlIGF0IG1vc3QgNSB3b3JkcywgYW5kIGEgQmFjay1D b3ZlciBUZXh0IG1heSBiZSBhdCBtb3N0IDI1IHdvcmRzLgoKQSAiVHJhbnNwYXJlbnQiIGNvcHkg b2YgdGhlIERvY3VtZW50IG1lYW5zIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5LApyZXByZXNlbnRl ZCBpbiBhIGZvcm1hdCB3aG9zZSBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUKZ2Vu ZXJhbCBwdWJsaWMsIHRoYXQgaXMgc3VpdGFibGUgZm9yIHJldmlzaW5nIHRoZSBkb2N1bWVudApz dHJhaWdodGZvcndhcmRseSB3aXRoIGdlbmVyaWMgdGV4dCBlZGl0b3JzIG9yIChmb3IgaW1hZ2Vz IGNvbXBvc2VkIG9mCnBpeGVscykgZ2VuZXJpYyBwYWludCBwcm9ncmFtcyBvciAoZm9yIGRyYXdp bmdzKSBzb21lIHdpZGVseSBhdmFpbGFibGUKZHJhd2luZyBlZGl0b3IsIGFuZCB0aGF0IGlzIHN1 aXRhYmxlIGZvciBpbnB1dCB0byB0ZXh0IGZvcm1hdHRlcnMgb3IKZm9yIGF1dG9tYXRpYyB0cmFu c2xhdGlvbiB0byBhIHZhcmlldHkgb2YgZm9ybWF0cyBzdWl0YWJsZSBmb3IgaW5wdXQKdG8gdGV4 dCBmb3JtYXR0ZXJzLiAgQSBjb3B5IG1hZGUgaW4gYW4gb3RoZXJ3aXNlIFRyYW5zcGFyZW50IGZp bGUKZm9ybWF0IHdob3NlIG1hcmt1cCwgb3IgYWJzZW5jZSBvZiBtYXJrdXAsIGhhcyBiZWVuIGFy cmFuZ2VkIHRvIHRod2FydApvciBkaXNjb3VyYWdlIHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uIGJ5 IHJlYWRlcnMgaXMgbm90IFRyYW5zcGFyZW50LgpBbiBpbWFnZSBmb3JtYXQgaXMgbm90IFRyYW5z cGFyZW50IGlmIHVzZWQgZm9yIGFueSBzdWJzdGFudGlhbCBhbW91bnQKb2YgdGV4dC4gIEEgY29w eSB0aGF0IGlzIG5vdCAiVHJhbnNwYXJlbnQiIGlzIGNhbGxlZCAiT3BhcXVlIi4KCkV4YW1wbGVz IG9mIHN1aXRhYmxlIGZvcm1hdHMgZm9yIFRyYW5zcGFyZW50IGNvcGllcyBpbmNsdWRlIHBsYWlu CkFTQ0lJIHdpdGhvdXQgbWFya3VwLCBUZXhpbmZvIGlucHV0IGZvcm1hdCwgTGFUZVggaW5wdXQg Zm9ybWF0LCBTR01MCm9yIFhNTCB1c2luZyBhIHB1YmxpY2x5IGF2YWlsYWJsZSBEVEQsIGFuZCBz dGFuZGFyZC1jb25mb3JtaW5nIHNpbXBsZQpIVE1MLCBQb3N0U2NyaXB0IG9yIFBERiBkZXNpZ25l ZCBmb3IgaHVtYW4gbW9kaWZpY2F0aW9uLiAgRXhhbXBsZXMgb2YKdHJhbnNwYXJlbnQgaW1hZ2Ug Zm9ybWF0cyBpbmNsdWRlIFBORywgWENGIGFuZCBKUEcuICBPcGFxdWUgZm9ybWF0cwppbmNsdWRl IHByb3ByaWV0YXJ5IGZvcm1hdHMgdGhhdCBjYW4gYmUgcmVhZCBhbmQgZWRpdGVkIG9ubHkgYnkK cHJvcHJpZXRhcnkgd29yZCBwcm9jZXNzb3JzLCBTR01MIG9yIFhNTCBmb3Igd2hpY2ggdGhlIERU RCBhbmQvb3IKcHJvY2Vzc2luZyB0b29scyBhcmUgbm90IGdlbmVyYWxseSBhdmFpbGFibGUsIGFu ZCB0aGUKbWFjaGluZS1nZW5lcmF0ZWQgSFRNTCwgUG9zdFNjcmlwdCBvciBQREYgcHJvZHVjZWQg Ynkgc29tZSB3b3JkCnByb2Nlc3NvcnMgZm9yIG91dHB1dCBwdXJwb3NlcyBvbmx5LgoKVGhlICJU aXRsZSBQYWdlIiBtZWFucywgZm9yIGEgcHJpbnRlZCBib29rLCB0aGUgdGl0bGUgcGFnZSBpdHNl bGYsCnBsdXMgc3VjaCBmb2xsb3dpbmcgcGFnZXMgYXMgYXJlIG5lZWRlZCB0byBob2xkLCBsZWdp Ymx5LCB0aGUgbWF0ZXJpYWwKdGhpcyBMaWNlbnNlIHJlcXVpcmVzIHRvIGFwcGVhciBpbiB0aGUg dGl0bGUgcGFnZS4gIEZvciB3b3JrcyBpbgpmb3JtYXRzIHdoaWNoIGRvIG5vdCBoYXZlIGFueSB0 aXRsZSBwYWdlIGFzIHN1Y2gsICJUaXRsZSBQYWdlIiBtZWFucwp0aGUgdGV4dCBuZWFyIHRoZSBt b3N0IHByb21pbmVudCBhcHBlYXJhbmNlIG9mIHRoZSB3b3JrJ3MgdGl0bGUsCnByZWNlZGluZyB0 aGUgYmVnaW5uaW5nIG9mIHRoZSBib2R5IG9mIHRoZSB0ZXh0LgoKVGhlICJwdWJsaXNoZXIiIG1l YW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgY29waWVzIG9mCnRoZSBE b2N1bWVudCB0byB0aGUgcHVibGljLgoKQSBzZWN0aW9uICJFbnRpdGxlZCBYWVoiIG1lYW5zIGEg bmFtZWQgc3VidW5pdCBvZiB0aGUgRG9jdW1lbnQgd2hvc2UKdGl0bGUgZWl0aGVyIGlzIHByZWNp c2VseSBYWVogb3IgY29udGFpbnMgWFlaIGluIHBhcmVudGhlc2VzIGZvbGxvd2luZwp0ZXh0IHRo YXQgdHJhbnNsYXRlcyBYWVogaW4gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlIFhZWiBzdGFuZHMg Zm9yIGEKc3BlY2lmaWMgc2VjdGlvbiBuYW1lIG1lbnRpb25lZCBiZWxvdywgc3VjaCBhcyAiQWNr bm93bGVkZ2VtZW50cyIsCiJEZWRpY2F0aW9ucyIsICJFbmRvcnNlbWVudHMiLCBvciAiSGlzdG9y eSIuKSAgVG8gIlByZXNlcnZlIHRoZSBUaXRsZSIKb2Ygc3VjaCBhIHNlY3Rpb24gd2hlbiB5b3Ug bW9kaWZ5IHRoZSBEb2N1bWVudCBtZWFucyB0aGF0IGl0IHJlbWFpbnMgYQpzZWN0aW9uICJFbnRp dGxlZCBYWVoiIGFjY29yZGluZyB0byB0aGlzIGRlZmluaXRpb24uCgpUaGUgRG9jdW1lbnQgbWF5 IGluY2x1ZGUgV2FycmFudHkgRGlzY2xhaW1lcnMgbmV4dCB0byB0aGUgbm90aWNlIHdoaWNoCnN0 YXRlcyB0aGF0IHRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIHRoZSBEb2N1bWVudC4gIFRoZXNlIFdh cnJhbnR5CkRpc2NsYWltZXJzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluY2x1ZGVkIGJ5IHJlZmVy ZW5jZSBpbiB0aGlzCkxpY2Vuc2UsIGJ1dCBvbmx5IGFzIHJlZ2FyZHMgZGlzY2xhaW1pbmcgd2Fy cmFudGllczogYW55IG90aGVyCmltcGxpY2F0aW9uIHRoYXQgdGhlc2UgV2FycmFudHkgRGlzY2xh aW1lcnMgbWF5IGhhdmUgaXMgdm9pZCBhbmQgaGFzCm5vIGVmZmVjdCBvbiB0aGUgbWVhbmluZyBv ZiB0aGlzIExpY2Vuc2UuCgoyLiBWRVJCQVRJTSBDT1BZSU5HCgpZb3UgbWF5IGNvcHkgYW5kIGRp c3RyaWJ1dGUgdGhlIERvY3VtZW50IGluIGFueSBtZWRpdW0sIGVpdGhlcgpjb21tZXJjaWFsbHkg b3Igbm9uY29tbWVyY2lhbGx5LCBwcm92aWRlZCB0aGF0IHRoaXMgTGljZW5zZSwgdGhlCmNvcHly aWdodCBub3RpY2VzLCBhbmQgdGhlIGxpY2Vuc2Ugbm90aWNlIHNheWluZyB0aGlzIExpY2Vuc2Ug YXBwbGllcwp0byB0aGUgRG9jdW1lbnQgYXJlIHJlcHJvZHVjZWQgaW4gYWxsIGNvcGllcywgYW5k IHRoYXQgeW91IGFkZCBubwpvdGhlciBjb25kaXRpb25zIHdoYXRzb2V2ZXIgdG8gdGhvc2Ugb2Yg dGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgdXNlCnRlY2huaWNhbCBtZWFzdXJlcyB0byBvYnN0 cnVjdCBvciBjb250cm9sIHRoZSByZWFkaW5nIG9yIGZ1cnRoZXIKY29weWluZyBvZiB0aGUgY29w aWVzIHlvdSBtYWtlIG9yIGRpc3RyaWJ1dGUuICBIb3dldmVyLCB5b3UgbWF5IGFjY2VwdApjb21w ZW5zYXRpb24gaW4gZXhjaGFuZ2UgZm9yIGNvcGllcy4gIElmIHlvdSBkaXN0cmlidXRlIGEgbGFy Z2UgZW5vdWdoCm51bWJlciBvZiBjb3BpZXMgeW91IG11c3QgYWxzbyBmb2xsb3cgdGhlIGNvbmRp dGlvbnMgaW4gc2VjdGlvbiAzLgoKWW91IG1heSBhbHNvIGxlbmQgY29waWVzLCB1bmRlciB0aGUg c2FtZSBjb25kaXRpb25zIHN0YXRlZCBhYm92ZSwgYW5kCnlvdSBtYXkgcHVibGljbHkgZGlzcGxh eSBjb3BpZXMuCgoKMy4gQ09QWUlORyBJTiBRVUFOVElUWQoKSWYgeW91IHB1Ymxpc2ggcHJpbnRl ZCBjb3BpZXMgKG9yIGNvcGllcyBpbiBtZWRpYSB0aGF0IGNvbW1vbmx5IGhhdmUKcHJpbnRlZCBj b3ZlcnMpIG9mIHRoZSBEb2N1bWVudCwgbnVtYmVyaW5nIG1vcmUgdGhhbiAxMDAsIGFuZCB0aGUK RG9jdW1lbnQncyBsaWNlbnNlIG5vdGljZSByZXF1aXJlcyBDb3ZlciBUZXh0cywgeW91IG11c3Qg ZW5jbG9zZSB0aGUKY29waWVzIGluIGNvdmVycyB0aGF0IGNhcnJ5LCBjbGVhcmx5IGFuZCBsZWdp Ymx5LCBhbGwgdGhlc2UgQ292ZXIKVGV4dHM6IEZyb250LUNvdmVyIFRleHRzIG9uIHRoZSBmcm9u dCBjb3ZlciwgYW5kIEJhY2stQ292ZXIgVGV4dHMgb24KdGhlIGJhY2sgY292ZXIuICBCb3RoIGNv dmVycyBtdXN0IGFsc28gY2xlYXJseSBhbmQgbGVnaWJseSBpZGVudGlmeQp5b3UgYXMgdGhlIHB1 Ymxpc2hlciBvZiB0aGVzZSBjb3BpZXMuICBUaGUgZnJvbnQgY292ZXIgbXVzdCBwcmVzZW50CnRo ZSBmdWxsIHRpdGxlIHdpdGggYWxsIHdvcmRzIG9mIHRoZSB0aXRsZSBlcXVhbGx5IHByb21pbmVu dCBhbmQKdmlzaWJsZS4gIFlvdSBtYXkgYWRkIG90aGVyIG1hdGVyaWFsIG9uIHRoZSBjb3ZlcnMg aW4gYWRkaXRpb24uCkNvcHlpbmcgd2l0aCBjaGFuZ2VzIGxpbWl0ZWQgdG8gdGhlIGNvdmVycywg YXMgbG9uZyBhcyB0aGV5IHByZXNlcnZlCnRoZSB0aXRsZSBvZiB0aGUgRG9jdW1lbnQgYW5kIHNh dGlzZnkgdGhlc2UgY29uZGl0aW9ucywgY2FuIGJlIHRyZWF0ZWQKYXMgdmVyYmF0aW0gY29weWlu ZyBpbiBvdGhlciByZXNwZWN0cy4KCklmIHRoZSByZXF1aXJlZCB0ZXh0cyBmb3IgZWl0aGVyIGNv dmVyIGFyZSB0b28gdm9sdW1pbm91cyB0byBmaXQKbGVnaWJseSwgeW91IHNob3VsZCBwdXQgdGhl IGZpcnN0IG9uZXMgbGlzdGVkIChhcyBtYW55IGFzIGZpdApyZWFzb25hYmx5KSBvbiB0aGUgYWN0 dWFsIGNvdmVyLCBhbmQgY29udGludWUgdGhlIHJlc3Qgb250byBhZGphY2VudApwYWdlcy4KCklm IHlvdSBwdWJsaXNoIG9yIGRpc3RyaWJ1dGUgT3BhcXVlIGNvcGllcyBvZiB0aGUgRG9jdW1lbnQg bnVtYmVyaW5nCm1vcmUgdGhhbiAxMDAsIHlvdSBtdXN0IGVpdGhlciBpbmNsdWRlIGEgbWFjaGlu ZS1yZWFkYWJsZSBUcmFuc3BhcmVudApjb3B5IGFsb25nIHdpdGggZWFjaCBPcGFxdWUgY29weSwg b3Igc3RhdGUgaW4gb3Igd2l0aCBlYWNoIE9wYXF1ZSBjb3B5CmEgY29tcHV0ZXItbmV0d29yayBs b2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBnZW5lcmFsIG5ldHdvcmstdXNpbmcKcHVibGljIGhhcyBh Y2Nlc3MgdG8gZG93bmxvYWQgdXNpbmcgcHVibGljLXN0YW5kYXJkIG5ldHdvcmsgcHJvdG9jb2xz CmEgY29tcGxldGUgVHJhbnNwYXJlbnQgY29weSBvZiB0aGUgRG9jdW1lbnQsIGZyZWUgb2YgYWRk ZWQgbWF0ZXJpYWwuCklmIHlvdSB1c2UgdGhlIGxhdHRlciBvcHRpb24sIHlvdSBtdXN0IHRha2Ug cmVhc29uYWJseSBwcnVkZW50IHN0ZXBzLAp3aGVuIHlvdSBiZWdpbiBkaXN0cmlidXRpb24gb2Yg T3BhcXVlIGNvcGllcyBpbiBxdWFudGl0eSwgdG8gZW5zdXJlCnRoYXQgdGhpcyBUcmFuc3BhcmVu dCBjb3B5IHdpbGwgcmVtYWluIHRodXMgYWNjZXNzaWJsZSBhdCB0aGUgc3RhdGVkCmxvY2F0aW9u IHVudGlsIGF0IGxlYXN0IG9uZSB5ZWFyIGFmdGVyIHRoZSBsYXN0IHRpbWUgeW91IGRpc3RyaWJ1 dGUgYW4KT3BhcXVlIGNvcHkgKGRpcmVjdGx5IG9yIHRocm91Z2ggeW91ciBhZ2VudHMgb3IgcmV0 YWlsZXJzKSBvZiB0aGF0CmVkaXRpb24gdG8gdGhlIHB1YmxpYy4KCkl0IGlzIHJlcXVlc3RlZCwg YnV0IG5vdCByZXF1aXJlZCwgdGhhdCB5b3UgY29udGFjdCB0aGUgYXV0aG9ycyBvZiB0aGUKRG9j dW1lbnQgd2VsbCBiZWZvcmUgcmVkaXN0cmlidXRpbmcgYW55IGxhcmdlIG51bWJlciBvZiBjb3Bp ZXMsIHRvCmdpdmUgdGhlbSBhIGNoYW5jZSB0byBwcm92aWRlIHlvdSB3aXRoIGFuIHVwZGF0ZWQg dmVyc2lvbiBvZiB0aGUKRG9jdW1lbnQuCgoKNC4gTU9ESUZJQ0FUSU9OUwoKWW91IG1heSBjb3B5 IGFuZCBkaXN0cmlidXRlIGEgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRG9jdW1lbnQgdW5kZXIK dGhlIGNvbmRpdGlvbnMgb2Ygc2VjdGlvbnMgMiBhbmQgMyBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5 b3UgcmVsZWFzZQp0aGUgTW9kaWZpZWQgVmVyc2lvbiB1bmRlciBwcmVjaXNlbHkgdGhpcyBMaWNl bnNlLCB3aXRoIHRoZSBNb2RpZmllZApWZXJzaW9uIGZpbGxpbmcgdGhlIHJvbGUgb2YgdGhlIERv Y3VtZW50LCB0aHVzIGxpY2Vuc2luZyBkaXN0cmlidXRpb24KYW5kIG1vZGlmaWNhdGlvbiBvZiB0 aGUgTW9kaWZpZWQgVmVyc2lvbiB0byB3aG9ldmVyIHBvc3Nlc3NlcyBhIGNvcHkKb2YgaXQuICBJ biBhZGRpdGlvbiwgeW91IG11c3QgZG8gdGhlc2UgdGhpbmdzIGluIHRoZSBNb2RpZmllZCBWZXJz aW9uOgoKQS4gVXNlIGluIHRoZSBUaXRsZSBQYWdlIChhbmQgb24gdGhlIGNvdmVycywgaWYgYW55 KSBhIHRpdGxlIGRpc3RpbmN0CiAgIGZyb20gdGhhdCBvZiB0aGUgRG9jdW1lbnQsIGFuZCBmcm9t IHRob3NlIG9mIHByZXZpb3VzIHZlcnNpb25zCiAgICh3aGljaCBzaG91bGQsIGlmIHRoZXJlIHdl cmUgYW55LCBiZSBsaXN0ZWQgaW4gdGhlIEhpc3Rvcnkgc2VjdGlvbgogICBvZiB0aGUgRG9jdW1l bnQpLiAgWW91IG1heSB1c2UgdGhlIHNhbWUgdGl0bGUgYXMgYSBwcmV2aW91cyB2ZXJzaW9uCiAg IGlmIHRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgb2YgdGhhdCB2ZXJzaW9uIGdpdmVzIHBlcm1pc3Np b24uCkIuIExpc3Qgb24gdGhlIFRpdGxlIFBhZ2UsIGFzIGF1dGhvcnMsIG9uZSBvciBtb3JlIHBl cnNvbnMgb3IgZW50aXRpZXMKICAgcmVzcG9uc2libGUgZm9yIGF1dGhvcnNoaXAgb2YgdGhlIG1v ZGlmaWNhdGlvbnMgaW4gdGhlIE1vZGlmaWVkCiAgIFZlcnNpb24sIHRvZ2V0aGVyIHdpdGggYXQg bGVhc3QgZml2ZSBvZiB0aGUgcHJpbmNpcGFsIGF1dGhvcnMgb2YgdGhlCiAgIERvY3VtZW50IChh bGwgb2YgaXRzIHByaW5jaXBhbCBhdXRob3JzLCBpZiBpdCBoYXMgZmV3ZXIgdGhhbiBmaXZlKSwK ICAgdW5sZXNzIHRoZXkgcmVsZWFzZSB5b3UgZnJvbSB0aGlzIHJlcXVpcmVtZW50LgpDLiBTdGF0 ZSBvbiB0aGUgVGl0bGUgcGFnZSB0aGUgbmFtZSBvZiB0aGUgcHVibGlzaGVyIG9mIHRoZQogICBN b2RpZmllZCBWZXJzaW9uLCBhcyB0aGUgcHVibGlzaGVyLgpELiBQcmVzZXJ2ZSBhbGwgdGhlIGNv cHlyaWdodCBub3RpY2VzIG9mIHRoZSBEb2N1bWVudC4KRS4gQWRkIGFuIGFwcHJvcHJpYXRlIGNv cHlyaWdodCBub3RpY2UgZm9yIHlvdXIgbW9kaWZpY2F0aW9ucwogICBhZGphY2VudCB0byB0aGUg b3RoZXIgY29weXJpZ2h0IG5vdGljZXMuCkYuIEluY2x1ZGUsIGltbWVkaWF0ZWx5IGFmdGVyIHRo ZSBjb3B5cmlnaHQgbm90aWNlcywgYSBsaWNlbnNlIG5vdGljZQogICBnaXZpbmcgdGhlIHB1Ymxp YyBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgTW9kaWZpZWQgVmVyc2lvbiB1bmRlciB0aGUKICAgdGVy bXMgb2YgdGhpcyBMaWNlbnNlLCBpbiB0aGUgZm9ybSBzaG93biBpbiB0aGUgQWRkZW5kdW0gYmVs b3cuCkcuIFByZXNlcnZlIGluIHRoYXQgbGljZW5zZSBub3RpY2UgdGhlIGZ1bGwgbGlzdHMgb2Yg SW52YXJpYW50IFNlY3Rpb25zCiAgIGFuZCByZXF1aXJlZCBDb3ZlciBUZXh0cyBnaXZlbiBpbiB0 aGUgRG9jdW1lbnQncyBsaWNlbnNlIG5vdGljZS4KSC4gSW5jbHVkZSBhbiB1bmFsdGVyZWQgY29w eSBvZiB0aGlzIExpY2Vuc2UuCkkuIFByZXNlcnZlIHRoZSBzZWN0aW9uIEVudGl0bGVkICJIaXN0 b3J5IiwgUHJlc2VydmUgaXRzIFRpdGxlLCBhbmQgYWRkCiAgIHRvIGl0IGFuIGl0ZW0gc3RhdGlu ZyBhdCBsZWFzdCB0aGUgdGl0bGUsIHllYXIsIG5ldyBhdXRob3JzLCBhbmQKICAgcHVibGlzaGVy IG9mIHRoZSBNb2RpZmllZCBWZXJzaW9uIGFzIGdpdmVuIG9uIHRoZSBUaXRsZSBQYWdlLiAgSWYK ICAgdGhlcmUgaXMgbm8gc2VjdGlvbiBFbnRpdGxlZCAiSGlzdG9yeSIgaW4gdGhlIERvY3VtZW50 LCBjcmVhdGUgb25lCiAgIHN0YXRpbmcgdGhlIHRpdGxlLCB5ZWFyLCBhdXRob3JzLCBhbmQgcHVi bGlzaGVyIG9mIHRoZSBEb2N1bWVudCBhcwogICBnaXZlbiBvbiBpdHMgVGl0bGUgUGFnZSwgdGhl biBhZGQgYW4gaXRlbSBkZXNjcmliaW5nIHRoZSBNb2RpZmllZAogICBWZXJzaW9uIGFzIHN0YXRl ZCBpbiB0aGUgcHJldmlvdXMgc2VudGVuY2UuCkouIFByZXNlcnZlIHRoZSBuZXR3b3JrIGxvY2F0 aW9uLCBpZiBhbnksIGdpdmVuIGluIHRoZSBEb2N1bWVudCBmb3IKICAgcHVibGljIGFjY2VzcyB0 byBhIFRyYW5zcGFyZW50IGNvcHkgb2YgdGhlIERvY3VtZW50LCBhbmQgbGlrZXdpc2UKICAgdGhl IG5ldHdvcmsgbG9jYXRpb25zIGdpdmVuIGluIHRoZSBEb2N1bWVudCBmb3IgcHJldmlvdXMgdmVy c2lvbnMKICAgaXQgd2FzIGJhc2VkIG9uLiAgVGhlc2UgbWF5IGJlIHBsYWNlZCBpbiB0aGUgIkhp c3RvcnkiIHNlY3Rpb24uCiAgIFlvdSBtYXkgb21pdCBhIG5ldHdvcmsgbG9jYXRpb24gZm9yIGEg d29yayB0aGF0IHdhcyBwdWJsaXNoZWQgYXQKICAgbGVhc3QgZm91ciB5ZWFycyBiZWZvcmUgdGhl IERvY3VtZW50IGl0c2VsZiwgb3IgaWYgdGhlIG9yaWdpbmFsCiAgIHB1Ymxpc2hlciBvZiB0aGUg dmVyc2lvbiBpdCByZWZlcnMgdG8gZ2l2ZXMgcGVybWlzc2lvbi4KSy4gRm9yIGFueSBzZWN0aW9u IEVudGl0bGVkICJBY2tub3dsZWRnZW1lbnRzIiBvciAiRGVkaWNhdGlvbnMiLAogICBQcmVzZXJ2 ZSB0aGUgVGl0bGUgb2YgdGhlIHNlY3Rpb24sIGFuZCBwcmVzZXJ2ZSBpbiB0aGUgc2VjdGlvbiBh bGwKICAgdGhlIHN1YnN0YW5jZSBhbmQgdG9uZSBvZiBlYWNoIG9mIHRoZSBjb250cmlidXRvciBh Y2tub3dsZWRnZW1lbnRzCiAgIGFuZC9vciBkZWRpY2F0aW9ucyBnaXZlbiB0aGVyZWluLgpMLiBQ cmVzZXJ2ZSBhbGwgdGhlIEludmFyaWFudCBTZWN0aW9ucyBvZiB0aGUgRG9jdW1lbnQsCiAgIHVu YWx0ZXJlZCBpbiB0aGVpciB0ZXh0IGFuZCBpbiB0aGVpciB0aXRsZXMuICBTZWN0aW9uIG51bWJl cnMKICAgb3IgdGhlIGVxdWl2YWxlbnQgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNl Y3Rpb24gdGl0bGVzLgpNLiBEZWxldGUgYW55IHNlY3Rpb24gRW50aXRsZWQgIkVuZG9yc2VtZW50 cyIuICBTdWNoIGEgc2VjdGlvbgogICBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBNb2RpZmll ZCBWZXJzaW9uLgpOLiBEbyBub3QgcmV0aXRsZSBhbnkgZXhpc3Rpbmcgc2VjdGlvbiB0byBiZSBF bnRpdGxlZCAiRW5kb3JzZW1lbnRzIgogICBvciB0byBjb25mbGljdCBpbiB0aXRsZSB3aXRoIGFu eSBJbnZhcmlhbnQgU2VjdGlvbi4KTy4gUHJlc2VydmUgYW55IFdhcnJhbnR5IERpc2NsYWltZXJz LgoKSWYgdGhlIE1vZGlmaWVkIFZlcnNpb24gaW5jbHVkZXMgbmV3IGZyb250LW1hdHRlciBzZWN0 aW9ucyBvcgphcHBlbmRpY2VzIHRoYXQgcXVhbGlmeSBhcyBTZWNvbmRhcnkgU2VjdGlvbnMgYW5k IGNvbnRhaW4gbm8gbWF0ZXJpYWwKY29waWVkIGZyb20gdGhlIERvY3VtZW50LCB5b3UgbWF5IGF0 IHlvdXIgb3B0aW9uIGRlc2lnbmF0ZSBzb21lIG9yIGFsbApvZiB0aGVzZSBzZWN0aW9ucyBhcyBp bnZhcmlhbnQuICBUbyBkbyB0aGlzLCBhZGQgdGhlaXIgdGl0bGVzIHRvIHRoZQpsaXN0IG9mIElu dmFyaWFudCBTZWN0aW9ucyBpbiB0aGUgTW9kaWZpZWQgVmVyc2lvbidzIGxpY2Vuc2Ugbm90aWNl LgpUaGVzZSB0aXRsZXMgbXVzdCBiZSBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBzZWN0aW9uIHRp dGxlcy4KCllvdSBtYXkgYWRkIGEgc2VjdGlvbiBFbnRpdGxlZCAiRW5kb3JzZW1lbnRzIiwgcHJv dmlkZWQgaXQgY29udGFpbnMKbm90aGluZyBidXQgZW5kb3JzZW1lbnRzIG9mIHlvdXIgTW9kaWZp ZWQgVmVyc2lvbiBieSB2YXJpb3VzCnBhcnRpZXMtLWZvciBleGFtcGxlLCBzdGF0ZW1lbnRzIG9m IHBlZXIgcmV2aWV3IG9yIHRoYXQgdGhlIHRleHQgaGFzCmJlZW4gYXBwcm92ZWQgYnkgYW4gb3Jn YW5pemF0aW9uIGFzIHRoZSBhdXRob3JpdGF0aXZlIGRlZmluaXRpb24gb2YgYQpzdGFuZGFyZC4K CllvdSBtYXkgYWRkIGEgcGFzc2FnZSBvZiB1cCB0byBmaXZlIHdvcmRzIGFzIGEgRnJvbnQtQ292 ZXIgVGV4dCwgYW5kIGEKcGFzc2FnZSBvZiB1cCB0byAyNSB3b3JkcyBhcyBhIEJhY2stQ292ZXIg VGV4dCwgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdApvZiBDb3ZlciBUZXh0cyBpbiB0aGUgTW9kaWZp ZWQgVmVyc2lvbi4gIE9ubHkgb25lIHBhc3NhZ2Ugb2YKRnJvbnQtQ292ZXIgVGV4dCBhbmQgb25l IG9mIEJhY2stQ292ZXIgVGV4dCBtYXkgYmUgYWRkZWQgYnkgKG9yCnRocm91Z2ggYXJyYW5nZW1l bnRzIG1hZGUgYnkpIGFueSBvbmUgZW50aXR5LiAgSWYgdGhlIERvY3VtZW50IGFscmVhZHkKaW5j bHVkZXMgYSBjb3ZlciB0ZXh0IGZvciB0aGUgc2FtZSBjb3ZlciwgcHJldmlvdXNseSBhZGRlZCBi eSB5b3Ugb3IKYnkgYXJyYW5nZW1lbnQgbWFkZSBieSB0aGUgc2FtZSBlbnRpdHkgeW91IGFyZSBh Y3Rpbmcgb24gYmVoYWxmIG9mLAp5b3UgbWF5IG5vdCBhZGQgYW5vdGhlcjsgYnV0IHlvdSBtYXkg cmVwbGFjZSB0aGUgb2xkIG9uZSwgb24gZXhwbGljaXQKcGVybWlzc2lvbiBmcm9tIHRoZSBwcmV2 aW91cyBwdWJsaXNoZXIgdGhhdCBhZGRlZCB0aGUgb2xkIG9uZS4KClRoZSBhdXRob3IocykgYW5k IHB1Ymxpc2hlcihzKSBvZiB0aGUgRG9jdW1lbnQgZG8gbm90IGJ5IHRoaXMgTGljZW5zZQpnaXZl IHBlcm1pc3Npb24gdG8gdXNlIHRoZWlyIG5hbWVzIGZvciBwdWJsaWNpdHkgZm9yIG9yIHRvIGFz c2VydCBvcgppbXBseSBlbmRvcnNlbWVudCBvZiBhbnkgTW9kaWZpZWQgVmVyc2lvbi4KCgo1LiBD T01CSU5JTkcgRE9DVU1FTlRTCgpZb3UgbWF5IGNvbWJpbmUgdGhlIERvY3VtZW50IHdpdGggb3Ro ZXIgZG9jdW1lbnRzIHJlbGVhc2VkIHVuZGVyIHRoaXMKTGljZW5zZSwgdW5kZXIgdGhlIHRlcm1z IGRlZmluZWQgaW4gc2VjdGlvbiA0IGFib3ZlIGZvciBtb2RpZmllZAp2ZXJzaW9ucywgcHJvdmlk ZWQgdGhhdCB5b3UgaW5jbHVkZSBpbiB0aGUgY29tYmluYXRpb24gYWxsIG9mIHRoZQpJbnZhcmlh bnQgU2VjdGlvbnMgb2YgYWxsIG9mIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMsIHVubW9kaWZpZWQs IGFuZApsaXN0IHRoZW0gYWxsIGFzIEludmFyaWFudCBTZWN0aW9ucyBvZiB5b3VyIGNvbWJpbmVk IHdvcmsgaW4gaXRzCmxpY2Vuc2Ugbm90aWNlLCBhbmQgdGhhdCB5b3UgcHJlc2VydmUgYWxsIHRo ZWlyIFdhcnJhbnR5IERpc2NsYWltZXJzLgoKVGhlIGNvbWJpbmVkIHdvcmsgbmVlZCBvbmx5IGNv bnRhaW4gb25lIGNvcHkgb2YgdGhpcyBMaWNlbnNlLCBhbmQKbXVsdGlwbGUgaWRlbnRpY2FsIElu dmFyaWFudCBTZWN0aW9ucyBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZQpjb3B5LiAgSWYg dGhlcmUgYXJlIG11bHRpcGxlIEludmFyaWFudCBTZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUg YnV0CmRpZmZlcmVudCBjb250ZW50cywgbWFrZSB0aGUgdGl0bGUgb2YgZWFjaCBzdWNoIHNlY3Rp b24gdW5pcXVlIGJ5CmFkZGluZyBhdCB0aGUgZW5kIG9mIGl0LCBpbiBwYXJlbnRoZXNlcywgdGhl IG5hbWUgb2YgdGhlIG9yaWdpbmFsCmF1dGhvciBvciBwdWJsaXNoZXIgb2YgdGhhdCBzZWN0aW9u IGlmIGtub3duLCBvciBlbHNlIGEgdW5pcXVlIG51bWJlci4KTWFrZSB0aGUgc2FtZSBhZGp1c3Rt ZW50IHRvIHRoZSBzZWN0aW9uIHRpdGxlcyBpbiB0aGUgbGlzdCBvZgpJbnZhcmlhbnQgU2VjdGlv bnMgaW4gdGhlIGxpY2Vuc2Ugbm90aWNlIG9mIHRoZSBjb21iaW5lZCB3b3JrLgoKSW4gdGhlIGNv bWJpbmF0aW9uLCB5b3UgbXVzdCBjb21iaW5lIGFueSBzZWN0aW9ucyBFbnRpdGxlZCAiSGlzdG9y eSIKaW4gdGhlIHZhcmlvdXMgb3JpZ2luYWwgZG9jdW1lbnRzLCBmb3JtaW5nIG9uZSBzZWN0aW9u IEVudGl0bGVkCiJIaXN0b3J5IjsgbGlrZXdpc2UgY29tYmluZSBhbnkgc2VjdGlvbnMgRW50aXRs ZWQgIkFja25vd2xlZGdlbWVudHMiLAphbmQgYW55IHNlY3Rpb25zIEVudGl0bGVkICJEZWRpY2F0 aW9ucyIuICBZb3UgbXVzdCBkZWxldGUgYWxsIHNlY3Rpb25zCkVudGl0bGVkICJFbmRvcnNlbWVu dHMiLgoKCjYuIENPTExFQ1RJT05TIE9GIERPQ1VNRU5UUwoKWW91IG1heSBtYWtlIGEgY29sbGVj dGlvbiBjb25zaXN0aW5nIG9mIHRoZSBEb2N1bWVudCBhbmQgb3RoZXIKZG9jdW1lbnRzIHJlbGVh c2VkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHJlcGxhY2UgdGhlIGluZGl2aWR1YWwKY29waWVz IG9mIHRoaXMgTGljZW5zZSBpbiB0aGUgdmFyaW91cyBkb2N1bWVudHMgd2l0aCBhIHNpbmdsZSBj b3B5CnRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGNvbGxlY3Rpb24sIHByb3ZpZGVkIHRoYXQgeW91 IGZvbGxvdyB0aGUgcnVsZXMKb2YgdGhpcyBMaWNlbnNlIGZvciB2ZXJiYXRpbSBjb3B5aW5nIG9m IGVhY2ggb2YgdGhlIGRvY3VtZW50cyBpbiBhbGwKb3RoZXIgcmVzcGVjdHMuCgpZb3UgbWF5IGV4 dHJhY3QgYSBzaW5nbGUgZG9jdW1lbnQgZnJvbSBzdWNoIGEgY29sbGVjdGlvbiwgYW5kCmRpc3Ry aWJ1dGUgaXQgaW5kaXZpZHVhbGx5IHVuZGVyIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgeW91IGlu c2VydCBhCmNvcHkgb2YgdGhpcyBMaWNlbnNlIGludG8gdGhlIGV4dHJhY3RlZCBkb2N1bWVudCwg YW5kIGZvbGxvdyB0aGlzCkxpY2Vuc2UgaW4gYWxsIG90aGVyIHJlc3BlY3RzIHJlZ2FyZGluZyB2 ZXJiYXRpbSBjb3B5aW5nIG9mIHRoYXQKZG9jdW1lbnQuCgoKNy4gQUdHUkVHQVRJT04gV0lUSCBJ TkRFUEVOREVOVCBXT1JLUwoKQSBjb21waWxhdGlvbiBvZiB0aGUgRG9jdW1lbnQgb3IgaXRzIGRl cml2YXRpdmVzIHdpdGggb3RoZXIgc2VwYXJhdGUKYW5kIGluZGVwZW5kZW50IGRvY3VtZW50cyBv ciB3b3JrcywgaW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yCmRpc3RyaWJ1dGlvbiBt ZWRpdW0sIGlzIGNhbGxlZCBhbiAiYWdncmVnYXRlIiBpZiB0aGUgY29weXJpZ2h0CnJlc3VsdGlu ZyBmcm9tIHRoZSBjb21waWxhdGlvbiBpcyBub3QgdXNlZCB0byBsaW1pdCB0aGUgbGVnYWwgcmln aHRzCm9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzIGJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFs IHdvcmtzIHBlcm1pdC4KV2hlbiB0aGUgRG9jdW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gYWdncmVn YXRlLCB0aGlzIExpY2Vuc2UgZG9lcyBub3QKYXBwbHkgdG8gdGhlIG90aGVyIHdvcmtzIGluIHRo ZSBhZ2dyZWdhdGUgd2hpY2ggYXJlIG5vdCB0aGVtc2VsdmVzCmRlcml2YXRpdmUgd29ya3Mgb2Yg dGhlIERvY3VtZW50LgoKSWYgdGhlIENvdmVyIFRleHQgcmVxdWlyZW1lbnQgb2Ygc2VjdGlvbiAz IGlzIGFwcGxpY2FibGUgdG8gdGhlc2UKY29waWVzIG9mIHRoZSBEb2N1bWVudCwgdGhlbiBpZiB0 aGUgRG9jdW1lbnQgaXMgbGVzcyB0aGFuIG9uZSBoYWxmIG9mCnRoZSBlbnRpcmUgYWdncmVnYXRl LCB0aGUgRG9jdW1lbnQncyBDb3ZlciBUZXh0cyBtYXkgYmUgcGxhY2VkIG9uCmNvdmVycyB0aGF0 IGJyYWNrZXQgdGhlIERvY3VtZW50IHdpdGhpbiB0aGUgYWdncmVnYXRlLCBvciB0aGUKZWxlY3Ry b25pYyBlcXVpdmFsZW50IG9mIGNvdmVycyBpZiB0aGUgRG9jdW1lbnQgaXMgaW4gZWxlY3Ryb25p YyBmb3JtLgpPdGhlcndpc2UgdGhleSBtdXN0IGFwcGVhciBvbiBwcmludGVkIGNvdmVycyB0aGF0 IGJyYWNrZXQgdGhlIHdob2xlCmFnZ3JlZ2F0ZS4KCgo4LiBUUkFOU0xBVElPTgoKVHJhbnNsYXRp b24gaXMgY29uc2lkZXJlZCBhIGtpbmQgb2YgbW9kaWZpY2F0aW9uLCBzbyB5b3UgbWF5CmRpc3Ry aWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoZSBEb2N1bWVudCB1bmRlciB0aGUgdGVybXMgb2Ygc2Vj dGlvbiA0LgpSZXBsYWNpbmcgSW52YXJpYW50IFNlY3Rpb25zIHdpdGggdHJhbnNsYXRpb25zIHJl cXVpcmVzIHNwZWNpYWwKcGVybWlzc2lvbiBmcm9tIHRoZWlyIGNvcHlyaWdodCBob2xkZXJzLCBi dXQgeW91IG1heSBpbmNsdWRlCnRyYW5zbGF0aW9ucyBvZiBzb21lIG9yIGFsbCBJbnZhcmlhbnQg U2VjdGlvbnMgaW4gYWRkaXRpb24gdG8gdGhlCm9yaWdpbmFsIHZlcnNpb25zIG9mIHRoZXNlIElu dmFyaWFudCBTZWN0aW9ucy4gIFlvdSBtYXkgaW5jbHVkZSBhCnRyYW5zbGF0aW9uIG9mIHRoaXMg TGljZW5zZSwgYW5kIGFsbCB0aGUgbGljZW5zZSBub3RpY2VzIGluIHRoZQpEb2N1bWVudCwgYW5k IGFueSBXYXJyYW50eSBEaXNjbGFpbWVycywgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBpbmNsdWRl CnRoZSBvcmlnaW5hbCBFbmdsaXNoIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGUgb3Jp Z2luYWwgdmVyc2lvbnMKb2YgdGhvc2Ugbm90aWNlcyBhbmQgZGlzY2xhaW1lcnMuICBJbiBjYXNl IG9mIGEgZGlzYWdyZWVtZW50IGJldHdlZW4KdGhlIHRyYW5zbGF0aW9uIGFuZCB0aGUgb3JpZ2lu YWwgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgYSBub3RpY2UKb3IgZGlzY2xhaW1lciwgdGhl IG9yaWdpbmFsIHZlcnNpb24gd2lsbCBwcmV2YWlsLgoKSWYgYSBzZWN0aW9uIGluIHRoZSBEb2N1 bWVudCBpcyBFbnRpdGxlZCAiQWNrbm93bGVkZ2VtZW50cyIsCiJEZWRpY2F0aW9ucyIsIG9yICJI aXN0b3J5IiwgdGhlIHJlcXVpcmVtZW50IChzZWN0aW9uIDQpIHRvIFByZXNlcnZlCml0cyBUaXRs ZSAoc2VjdGlvbiAxKSB3aWxsIHR5cGljYWxseSByZXF1aXJlIGNoYW5naW5nIHRoZSBhY3R1YWwK dGl0bGUuCgoKOS4gVEVSTUlOQVRJT04KCllvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGlj ZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgRG9jdW1lbnQKZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92 aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwg bW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIGl0IGlzIHZvaWQsIGFuZAp3aWxsIGF1 dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KCkhv d2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5 b3VyIGxpY2Vuc2UKZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3Rh dGVkIChhKSBwcm92aXNpb25hbGx5LAp1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9s ZGVyIGV4cGxpY2l0bHkgYW5kIGZpbmFsbHkKdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAo YikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyCmZhaWxzIHRvIG5vdGlmeSB5 b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMgcHJpb3IgdG8KNjAg ZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgoKTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEg cGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCnJlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYg dGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQp2aW9sYXRpb24gYnkgc29t ZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCnJlY2Vp dmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZy b20gdGhhdApjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlv ciB0byAzMCBkYXlzIGFmdGVyCnlvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgoKVGVybWluYXRp b24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0 aGUKbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRz IGZyb20geW91IHVuZGVyCnRoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0 ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKcmVpbnN0YXRlZCwgcmVjZWlwdCBvZiBhIGNv cHkgb2Ygc29tZSBvciBhbGwgb2YgdGhlIHNhbWUgbWF0ZXJpYWwgZG9lcwpub3QgZ2l2ZSB5b3Ug YW55IHJpZ2h0cyB0byB1c2UgaXQuCgoKMTAuIEZVVFVSRSBSRVZJU0lPTlMgT0YgVEhJUyBMSUNF TlNFCgpUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIG5ldywgcmV2aXNl ZCB2ZXJzaW9ucyBvZiB0aGUKR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIGZyb20gdGlt ZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMKd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0 byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbgpkZXRhaWwgdG8gYWRkcmVz cyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuICBTZWUKaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8uCgpFYWNoIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgaXMgZ2l2ZW4gYSBkaXN0aW5ndWlz aGluZyB2ZXJzaW9uIG51bWJlci4KSWYgdGhlIERvY3VtZW50IHNwZWNpZmllcyB0aGF0IGEgcGFy dGljdWxhciBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoaXMKTGljZW5zZSAib3IgYW55IGxhdGVyIHZl cnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YKZm9sbG93aW5nIHRo ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBzcGVjaWZpZWQgdmVyc2lvbiBv cgpvZiBhbnkgbGF0ZXIgdmVyc2lvbiB0aGF0IGhhcyBiZWVuIHB1Ymxpc2hlZCAobm90IGFzIGEg ZHJhZnQpIGJ5IHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgRG9jdW1lbnQg ZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24KbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1h eSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgKG5vdAphcyBhIGRyYWZ0KSBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIERvY3VtZW50CnNwZWNpZmllcyB0 aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcwpMaWNl bnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MgcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRh bmNlIG9mIGEKdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdSB0byBjaG9vc2UgdGhh dCB2ZXJzaW9uIGZvciB0aGUKRG9jdW1lbnQuCgoxMS4gUkVMSUNFTlNJTkcKCiJNYXNzaXZlIE11 bHRpYXV0aG9yIENvbGxhYm9yYXRpb24gU2l0ZSIgKG9yICJNTUMgU2l0ZSIpIG1lYW5zIGFueQpX b3JsZCBXaWRlIFdlYiBzZXJ2ZXIgdGhhdCBwdWJsaXNoZXMgY29weXJpZ2h0YWJsZSB3b3JrcyBh bmQgYWxzbwpwcm92aWRlcyBwcm9taW5lbnQgZmFjaWxpdGllcyBmb3IgYW55Ym9keSB0byBlZGl0 IHRob3NlIHdvcmtzLiAgQQpwdWJsaWMgd2lraSB0aGF0IGFueWJvZHkgY2FuIGVkaXQgaXMgYW4g ZXhhbXBsZSBvZiBzdWNoIGEgc2VydmVyLiAgQQoiTWFzc2l2ZSBNdWx0aWF1dGhvciBDb2xsYWJv cmF0aW9uIiAob3IgIk1NQyIpIGNvbnRhaW5lZCBpbiB0aGUgc2l0ZQptZWFucyBhbnkgc2V0IG9m IGNvcHlyaWdodGFibGUgd29ya3MgdGh1cyBwdWJsaXNoZWQgb24gdGhlIE1NQyBzaXRlLgoKIkND LUJZLVNBIiBtZWFucyB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZSBBbGlr ZSAzLjAKbGljZW5zZSBwdWJsaXNoZWQgYnkgQ3JlYXRpdmUgQ29tbW9ucyBDb3Jwb3JhdGlvbiwg YSBub3QtZm9yLXByb2ZpdApjb3Jwb3JhdGlvbiB3aXRoIGEgcHJpbmNpcGFsIHBsYWNlIG9mIGJ1 c2luZXNzIGluIFNhbiBGcmFuY2lzY28sCkNhbGlmb3JuaWEsIGFzIHdlbGwgYXMgZnV0dXJlIGNv cHlsZWZ0IHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZQpwdWJsaXNoZWQgYnkgdGhhdCBzYW1lIG9y Z2FuaXphdGlvbi4KCiJJbmNvcnBvcmF0ZSIgbWVhbnMgdG8gcHVibGlzaCBvciByZXB1Ymxpc2gg YSBEb2N1bWVudCwgaW4gd2hvbGUgb3IgaW4KcGFydCwgYXMgcGFydCBvZiBhbm90aGVyIERvY3Vt ZW50LgoKQW4gTU1DIGlzICJlbGlnaWJsZSBmb3IgcmVsaWNlbnNpbmciIGlmIGl0IGlzIGxpY2Vu c2VkIHVuZGVyIHRoaXMKTGljZW5zZSwgYW5kIGlmIGFsbCB3b3JrcyB0aGF0IHdlcmUgZmlyc3Qg cHVibGlzaGVkIHVuZGVyIHRoaXMgTGljZW5zZQpzb21ld2hlcmUgb3RoZXIgdGhhbiB0aGlzIE1N QywgYW5kIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgaW4gd2hvbGUgb3IKaW4gcGFydCBpbnRv IHRoZSBNTUMsICgxKSBoYWQgbm8gY292ZXIgdGV4dHMgb3IgaW52YXJpYW50IHNlY3Rpb25zLCBh bmQKKDIpIHdlcmUgdGh1cyBpbmNvcnBvcmF0ZWQgcHJpb3IgdG8gTm92ZW1iZXIgMSwgMjAwOC4K ClRoZSBvcGVyYXRvciBvZiBhbiBNTUMgU2l0ZSBtYXkgcmVwdWJsaXNoIGFuIE1NQyBjb250YWlu ZWQgaW4gdGhlIHNpdGUKdW5kZXIgQ0MtQlktU0Egb24gdGhlIHNhbWUgc2l0ZSBhdCBhbnkgdGlt ZSBiZWZvcmUgQXVndXN0IDEsIDIwMDksCnByb3ZpZGVkIHRoZSBNTUMgaXMgZWxpZ2libGUgZm9y IHJlbGljZW5zaW5nLgoKCkFEREVORFVNOiBIb3cgdG8gdXNlIHRoaXMgTGljZW5zZSBmb3IgeW91 ciBkb2N1bWVudHMKClRvIHVzZSB0aGlzIExpY2Vuc2UgaW4gYSBkb2N1bWVudCB5b3UgaGF2ZSB3 cml0dGVuLCBpbmNsdWRlIGEgY29weSBvZgp0aGUgTGljZW5zZSBpbiB0aGUgZG9jdW1lbnQgYW5k IHB1dCB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKbGljZW5zZSBub3RpY2VzIGp1c3QgYWZ0 ZXIgdGhlIHRpdGxlIHBhZ2U6CgogICAgQ29weXJpZ2h0IChjKSAgWUVBUiAgWU9VUiBOQU1FLgog ICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlm eSB0aGlzIGRvY3VtZW50CiAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBGcmVlIERvY3Vt ZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjMKICAgIG9yIGFueSBsYXRlciB2ZXJzaW9uIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOwogICAgd2l0aCBubyBJbnZh cmlhbnQgU2VjdGlvbnMsIG5vIEZyb250LUNvdmVyIFRleHRzLCBhbmQgbm8gQmFjay1Db3ZlciBU ZXh0cy4KICAgIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGUgc2VjdGlv biBlbnRpdGxlZCAiR05VCiAgICBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSIuCgpJZiB5b3Ug aGF2ZSBJbnZhcmlhbnQgU2VjdGlvbnMsIEZyb250LUNvdmVyIFRleHRzIGFuZCBCYWNrLUNvdmVy IFRleHRzLApyZXBsYWNlIHRoZSAid2l0aC4uLlRleHRzLiIgbGluZSB3aXRoIHRoaXM6CgogICAg d2l0aCB0aGUgSW52YXJpYW50IFNlY3Rpb25zIGJlaW5nIExJU1QgVEhFSVIgVElUTEVTLCB3aXRo IHRoZQogICAgRnJvbnQtQ292ZXIgVGV4dHMgYmVpbmcgTElTVCwgYW5kIHdpdGggdGhlIEJhY2st Q292ZXIgVGV4dHMgYmVpbmcgTElTVC4KCklmIHlvdSBoYXZlIEludmFyaWFudCBTZWN0aW9ucyB3 aXRob3V0IENvdmVyIFRleHRzLCBvciBzb21lIG90aGVyCmNvbWJpbmF0aW9uIG9mIHRoZSB0aHJl ZSwgbWVyZ2UgdGhvc2UgdHdvIGFsdGVybmF0aXZlcyB0byBzdWl0IHRoZQpzaXR1YXRpb24uCgpJ ZiB5b3VyIGRvY3VtZW50IGNvbnRhaW5zIG5vbnRyaXZpYWwgZXhhbXBsZXMgb2YgcHJvZ3JhbSBj b2RlLCB3ZQpyZWNvbW1lbmQgcmVsZWFzaW5nIHRoZXNlIGV4YW1wbGVzIGluIHBhcmFsbGVsIHVu ZGVyIHlvdXIgY2hvaWNlIG9mCmZyZWUgc29mdHdhcmUgbGljZW5zZSwgc3VjaCBhcyB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCnRvIHBlcm1pdCB0aGVpciB1c2UgaW4gZnJlZSBzb2Z0 d2FyZS4KIytlbmRfZXhwb3J0CgojK2h0bWw6IDwhLS0KCiogSW5kaWNlcwo6cHJvcGVydGllczoK OmN1c3RvbV9pZDogaDo1NTEwNGIyNi04ZTk0LTQ2Y2YtOTk3NS00M2VhMDAzMTY0ODkKOmVuZDoK CioqIEZ1bmN0aW9uIGluZGV4Cjpwcm9wZXJ0aWVzOgo6aW5kZXg6IGZuCjpjdXN0b21faWQ6IGg6 NmJlYzUwMDUtNTI5Yy00NTIxLWFlMDUtM2Q5OTBiYWZmYjViCjplbmQ6CgoqKiBWYXJpYWJsZSBp bmRleAo6cHJvcGVydGllczoKOmluZGV4OiB2cgo6Y3VzdG9tX2lkOiBoOjE2YWQ4ZGY2LWIwMTUt NDBhOS05MjU5LTAzZDRmN2EyM2VlNAo6ZW5kOgoKKiogQ29uY2VwdCBpbmRleAo6cHJvcGVydGll czoKOmluZGV4OiBjcAo6Y3VzdG9tX2lkOiBoOjZhYTdhNjU2LTg4NGItNGMzOS1iNzU5LTA4N2U0 MTJlZWMxMwo6ZW5kOgoKIytodG1sOiAtLT4K --=-=-=--