From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B279C433F5 for ; Tue, 5 Oct 2021 02:12:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F1C3561373 for ; Tue, 5 Oct 2021 02:12:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231474AbhJECO2 (ORCPT ); Mon, 4 Oct 2021 22:14:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44056 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231381AbhJECO0 (ORCPT ); Mon, 4 Oct 2021 22:14:26 -0400 Received: from mail-vk1-xa2d.google.com (mail-vk1-xa2d.google.com [IPv6:2607:f8b0:4864:20::a2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 149BEC061745 for ; Mon, 4 Oct 2021 19:12:37 -0700 (PDT) Received: by mail-vk1-xa2d.google.com with SMTP id z202so8616915vkd.1 for ; Mon, 04 Oct 2021 19:12:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=AZ805/C+DO95puS3gpWQrJg7B10IPlw3kxeZGNcrz50=; b=SfJLrLrmF0Cu9+p9OEXXWVkAI5yhwNIDZ9kYGBJxB9ZfFM4UBUq9lT/jOjzbF7D9dI mr3uvs/nRrajGJ1en4K9XVpi8lzUaQKa4cQT7STAJVrxMCVb7mVnGrPrTcmcGk9EFK7p R0avwu9M468OzrQa3+r/q9cOND66estY15Ei8NKYyLWpb/1aTCGMwaZePcKVYG01FV8N bAymkiNSas8oBCGZ7y8d8pBxh9HvjUlX798D+EF/+w0ijDKXGV6vx8o1yGtL9I2OcHNb 2ro5DlIXc7zS8HwZbL1zQJWnc3qhrmu64D3isH2ZHf6Kv4aHiP46KVA9S/ebbz5znLf1 REDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=AZ805/C+DO95puS3gpWQrJg7B10IPlw3kxeZGNcrz50=; b=uebp7KPCcXz3sq8OMKyOU53XVyRHsQ22ZHCfAJ80kZRMBSVMmzEf5PEkQWQon0e2EI VCb7mrVX1AgCAVoyqelFIxEFiNI6zKekHQW58g7FPYhia3fJ7UNVuXGNrjvEbsvW7NRa Q1V/fa/btsLk6UAm3aPQMcNa8gRDJRoXXz88Fb4CKT6xSxG51qtdh27GaSrTA8zjgM/o Sa/F3ziCo1PGkp4Qcyro0w1Rnu0eB9XyIqkRQVajtVhtx7U/NJgJPCuPNwuGLXi1jZg3 pzq6wY6YOe1rRoP/vX8ThxRtWNW3xkIG2VUR9kvnnTd+VaK1LdWatMJ6lxCJ55fqruwU i8OA== X-Gm-Message-State: AOAM533lecaIo3I6OGPTOZvp1UNUaKcPV175euNKe/SKSI/aRy1D7wWH AvSQUI0xyFUo7FKdMK3sxHGZcMlC8cNMOF73KQQ= X-Google-Smtp-Source: ABdhPJxfM6BrYyl11I+zrvOuqDDzuDgL2DfNdSPRPwgcAp3x5ccWRamSyapRSb2So9aw2m/TV6U4/KJOBO7orUZcebQ= X-Received: by 2002:a1f:a00e:: with SMTP id j14mr5471665vke.5.1633399956110; Mon, 04 Oct 2021 19:12:36 -0700 (PDT) MIME-Version: 1.0 References: <0e65c165e3d54a38cbba01603f325dca727274de.1631121222.git.greentime.hu@sifive.com> In-Reply-To: From: Ley Foon Tan Date: Tue, 5 Oct 2021 10:12:25 +0800 Message-ID: Subject: Re: [RFC PATCH v8 09/21] riscv: Add task switch support for vector To: Greentime Hu Cc: Darius Rad , linux-riscv , Linux Kernel Mailing List , Albert Ou , Palmer Dabbelt , Paul Walmsley , Vincent Chen Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 4, 2021 at 8:41 PM Greentime Hu wrote= : > > Ley Foon Tan =E6=96=BC 2021=E5=B9=B410=E6=9C=881= =E6=97=A5 =E9=80=B1=E4=BA=94 =E4=B8=8A=E5=8D=8810:46=E5=AF=AB=E9=81=93=EF= =BC=9A > > > > On Wed, Sep 29, 2021 at 11:54 PM Darius Rad wrote= : > > > > > > On Tue, Sep 28, 2021 at 10:56:52PM +0800, Greentime Hu wrote: > > > > Darius Rad =E6=96=BC 2021=E5=B9=B49=E6=9C=881= 3=E6=97=A5 =E9=80=B1=E4=B8=80 =E4=B8=8B=E5=8D=888:21=E5=AF=AB=E9=81=93=EF= =BC=9A > > > > > [....] > > > > > > > > > > So this will unconditionally enable vector instructions, and allo= cate > > > > > memory for vector state, for all processes, regardless of whether= vector > > > > > instructions are used? > > > > > > > > > > > > > Hi Darius, > > > > > > > > Yes, it will enable vector if has_vector() is true. The reason that= we > > > > choose to enable and allocate memory for user space program is beca= use > > > > we also implement some common functions in the glibc such as memcpy > > > > vector version and it is called very often by every process. So tha= t > > > > we assume if the user program is running in a CPU with vector ISA > > > > would like to use vector by default. If we disable it by default an= d > > > > make it trigger the illegal instruction, that might be a burden sin= ce > > > > almost every process will use vector glibc memcpy or something like > > > > that. > > > > > > Do you have any evidence to support the assertion that almost every p= rocess > > > would use vector operations? One could easily argue that the convers= e is > > > true: no existing software uses the vector extension now, so most lik= ely a > > > process will not be using it. > > > > > > > > > > > > Given the size of the vector state and potential power and perfor= mance > > > > > implications of enabling the vector engine, it seems like this sh= ould > > > > > treated similarly to Intel AMX on x86. The full discussion of th= at is > > > > > here: > > > > > > > > > > https://lore.kernel.org/lkml/CALCETrW2QHa2TLvnUuVxAAheqcbSZ-5_WRX= tDSAGcbG8N+gtdQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org/ > > > > > > > > > > The cover letter for recent Intel AMX patches has a summary of th= e x86 > > > > > implementation: > > > > > > > > > > https://lore.kernel.org/lkml/20210825155413.19673-1-chang.seok.ba= e@intel.com/ > > > > > > > > > > If RISC-V were to adopt a similar approach, I think the significa= nt > > > > > points are: > > > > > > > > > > 1. A process (or thread) must specifically request the desire t= o use > > > > > vector extensions (perhaps with some new arch_prctl() API), > > > > > > > > > > 2. The kernel is free to deny permission, perhaps based on > > > > > administrative rules or for other reasons, and > > > > > > > > > > 3. If a process attempts to use vector extensions before doing = the > > > > > above, the process will die due to an illegal instruction. > > > > > > > > Thank you for sharing this, but I am not sure if we should treat > > > > vector like AMX on x86. IMHO, compiler might generate code with vec= tor > > > > instructions automatically someday, maybe we should treat vector > > > > extensions like other extensions. > > > > If user knows the vector extension is supported in this CPU and he > > > > would like to use it, it seems we should let user use it directly j= ust > > > > like other extensions. > > > > If user don't know it exists or not, user should use the library AP= I > > > > transparently and let glibc or other library deal with it. The glib= c > > > > ifunc feature or multi-lib should be able to choose the correct > > > > implementation. > > > > > > What makes me think that the vector extension should be treated like = AMX is > > > that they both (1) have a significant amount of architectural state, = and > > > (2) likely have a significant power and/or area impact on (non-emulat= ed) > > > designs. > > > > > > For example, I think it is possible, maybe even likely, that vector > > > implementations will have one or more of the following behaviors: > > > > > > 1. A single vector unit shared among two or more harts, > > > > > > 2. Additional power consumption when the vector unit is enabled and= idle > > > versus not being enabled at all, > > > > > > 3. For a system which supports variable operating frequency, a redu= ction > > > in the maximum frequency when the vector unit is enabled, and/or > > > > > > 4. The inability to enter low power states and/or delays to low pow= er > > > states transitions when the vector unit is enabled. > > > > > > None of the above constraints apply to more ordinary extensions like > > > compressed or the various bit manipulation extensions. > > > > > > The discussion I linked to has some well reasoned arguments on why > > > substantial extensions should have a mechanism to request using them = by > > > user space. The discussion was in the context of Intel AMX, but appl= ies to > > > further x86 extensions, and I think should also apply to similar exte= nsions > > > on RISC-V, like vector here. > > > > > There is possible use case where not all cores support vector > > extension due to size, area and power. > > Perhaps can have the mechanism or flow to determine the > > application/thread require vector extension or it specifically request > > the desire to use > > vector extensions. Then this app/thread run on cpu with vector > > extension capability only. > > > > IIRC, we assume all harts has the same ability in Linux because of SMP > assumption. > If we have more information of hw capability and we may use this > information for scheduler to switch the correct process to the correct > CPU. > Do you have any idea how to implement it in Linux kernel? Maybe we can > list in the TODO list. I think we can refer to other arch implementations as reference: 1. ARM64 supports 32-bit thread on asymmetric AArch32 systems. There is a flag in ELF to check, then start the thread on the core that supports 32-bit execution. This patchset is merged to mainline 5.15. https://lore.kernel.org/linux-arm-kernel/20210730112443.23245-8-will@kernel= .org/T/ 2. Link shared by Darius, on-demand request implementation on Intel AMX https://lore.kernel.org/lkml/20210825155413.19673-1-chang.seok.bae@intel.co= m/ glibc support optimized library functions with vector, this is enabled by default if compiler is with vector extension enabled? If yes, then most of the app required vector core. Regards Ley Foon From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4645C433EF for ; Tue, 5 Oct 2021 02:14:40 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 83828613A1 for ; Tue, 5 Oct 2021 02:14:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 83828613A1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cBc+rb/OIUQIbZWS9cUcfM6lRppl6ianXFkMCIxiQBg=; b=tdGSsw4zFHXNE7 lv6pdrS32FrYA1oOTpJYAnUwFTE5iWfCnP8/Emt/s4z6lW8MRkQZ6IplJzrttJfWYEbj0KMmlTSgB KqFfYwVcR880YN1wdLFjUNH7crzh0b3LXwnniHUYU7aDC5Oxh/STTtJGaP9MIvPRUIYfmLLQFPNsA Tnpbct82NU3w+QZyM8Z5oSJUmhWctuCh5jzoWu4Kv5lVf4Zmw3sD5ioVRwuAo3FmpijCheWv4TxOe n89H71JIqXtm6tNA4Us3tQglCN3wEShuNSxyzp0yZ2Bs6XF8ZsrA+vIELOQ5qZDotNcMA6eh6naaI M36Nq9SAGdyWdYyaQSqg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mXZyR-008fXd-JK; Tue, 05 Oct 2021 02:14:31 +0000 Received: from mail-vk1-xa2f.google.com ([2607:f8b0:4864:20::a2f]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mXZwc-008eXo-1W for linux-riscv@lists.infradead.org; Tue, 05 Oct 2021 02:12:40 +0000 Received: by mail-vk1-xa2f.google.com with SMTP id y74so8606646vky.12 for ; Mon, 04 Oct 2021 19:12:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=AZ805/C+DO95puS3gpWQrJg7B10IPlw3kxeZGNcrz50=; b=SfJLrLrmF0Cu9+p9OEXXWVkAI5yhwNIDZ9kYGBJxB9ZfFM4UBUq9lT/jOjzbF7D9dI mr3uvs/nRrajGJ1en4K9XVpi8lzUaQKa4cQT7STAJVrxMCVb7mVnGrPrTcmcGk9EFK7p R0avwu9M468OzrQa3+r/q9cOND66estY15Ei8NKYyLWpb/1aTCGMwaZePcKVYG01FV8N bAymkiNSas8oBCGZ7y8d8pBxh9HvjUlX798D+EF/+w0ijDKXGV6vx8o1yGtL9I2OcHNb 2ro5DlIXc7zS8HwZbL1zQJWnc3qhrmu64D3isH2ZHf6Kv4aHiP46KVA9S/ebbz5znLf1 REDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=AZ805/C+DO95puS3gpWQrJg7B10IPlw3kxeZGNcrz50=; b=e66k1VmANkkrP/MDenKh6g0USCKkkRDleQwSHTDX9/LSRlvZYm08HoczvsElXvX+gw IUfZePRDbtmkM2fm/8ZCYP+qvA3CKjwRr6LsXqCzbpfh4kCR/EiIMJ2fZj8tD94lPCfP F7IHy3sTLEyP9FsXrq2r8QcaOS13YmrLQzymzGasoNrV+gdH8/2AggpucitEGriDa7WO CrdXzmLarIs8EC05n932i5kWH3LksjxFjRcS8sV7U6c5dZlxo4rk20sf87JEVAp6GBPZ i2IxSsOLT64YVKhxL2ZAqUSWnW+tUhbSISnwdZwnWhQWHSYoJKz0Gaj/EEDSpLAWMfz5 aoRA== X-Gm-Message-State: AOAM533XIopxHF3hqnNj01hJrsq8Hpyz/XJ5mde5UlkKSvOtDtmn+gpx hY9lMFUNVx8rY3lZKriOWU2Jb9us+mbGgw2JQXYkrSJOc/ovwg== X-Google-Smtp-Source: ABdhPJxfM6BrYyl11I+zrvOuqDDzuDgL2DfNdSPRPwgcAp3x5ccWRamSyapRSb2So9aw2m/TV6U4/KJOBO7orUZcebQ= X-Received: by 2002:a1f:a00e:: with SMTP id j14mr5471665vke.5.1633399956110; Mon, 04 Oct 2021 19:12:36 -0700 (PDT) MIME-Version: 1.0 References: <0e65c165e3d54a38cbba01603f325dca727274de.1631121222.git.greentime.hu@sifive.com> In-Reply-To: From: Ley Foon Tan Date: Tue, 5 Oct 2021 10:12:25 +0800 Message-ID: Subject: Re: [RFC PATCH v8 09/21] riscv: Add task switch support for vector To: Greentime Hu Cc: Darius Rad , linux-riscv , Linux Kernel Mailing List , Albert Ou , Palmer Dabbelt , Paul Walmsley , Vincent Chen X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211004_191238_129276_AF0B2583 X-CRM114-Status: GOOD ( 49.09 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gTW9uLCBPY3QgNCwgMjAyMSBhdCA4OjQxIFBNIEdyZWVudGltZSBIdSA8Z3JlZW50aW1lLmh1 QHNpZml2ZS5jb20+IHdyb3RlOgo+Cj4gTGV5IEZvb24gVGFuIDxsZnRhbi5saW51eEBnbWFpbC5j b20+IOaWvCAyMDIx5bm0MTDmnIgx5pelIOmAseS6lCDkuIrljYgxMDo0NuWvq+mBk++8mgo+ID4K PiA+IE9uIFdlZCwgU2VwIDI5LCAyMDIxIGF0IDExOjU0IFBNIERhcml1cyBSYWQgPGRhcml1c0Bi bHVlc3BlYy5jb20+IHdyb3RlOgo+ID4gPgo+ID4gPiBPbiBUdWUsIFNlcCAyOCwgMjAyMSBhdCAx MDo1Njo1MlBNICswODAwLCBHcmVlbnRpbWUgSHUgd3JvdGU6Cj4gPiA+ID4gRGFyaXVzIFJhZCA8 ZGFyaXVzQGJsdWVzcGVjLmNvbT4g5pa8IDIwMjHlubQ55pyIMTPml6Ug6YCx5LiAIOS4i+WNiDg6 MjHlr6vpgZPvvJoKPiA+ID4gPiA+ClsuLi4uXQoKCj4gPiA+ID4gPgo+ID4gPiA+ID4gU28gdGhp cyB3aWxsIHVuY29uZGl0aW9uYWxseSBlbmFibGUgdmVjdG9yIGluc3RydWN0aW9ucywgYW5kIGFs bG9jYXRlCj4gPiA+ID4gPiBtZW1vcnkgZm9yIHZlY3RvciBzdGF0ZSwgZm9yIGFsbCBwcm9jZXNz ZXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB2ZWN0b3IKPiA+ID4gPiA+IGluc3RydWN0aW9ucyBh cmUgdXNlZD8KPiA+ID4gPiA+Cj4gPiA+ID4KPiA+ID4gPiBIaSBEYXJpdXMsCj4gPiA+ID4KPiA+ ID4gPiBZZXMsIGl0IHdpbGwgZW5hYmxlIHZlY3RvciBpZiBoYXNfdmVjdG9yKCkgaXMgdHJ1ZS4g VGhlIHJlYXNvbiB0aGF0IHdlCj4gPiA+ID4gY2hvb3NlIHRvIGVuYWJsZSBhbmQgYWxsb2NhdGUg bWVtb3J5IGZvciB1c2VyIHNwYWNlIHByb2dyYW0gaXMgYmVjYXVzZQo+ID4gPiA+IHdlIGFsc28g aW1wbGVtZW50IHNvbWUgY29tbW9uIGZ1bmN0aW9ucyBpbiB0aGUgZ2xpYmMgc3VjaCBhcyBtZW1j cHkKPiA+ID4gPiB2ZWN0b3IgdmVyc2lvbiBhbmQgaXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4gYnkg ZXZlcnkgcHJvY2Vzcy4gU28gdGhhdAo+ID4gPiA+IHdlIGFzc3VtZSBpZiB0aGUgdXNlciBwcm9n cmFtIGlzIHJ1bm5pbmcgaW4gYSBDUFUgd2l0aCB2ZWN0b3IgSVNBCj4gPiA+ID4gd291bGQgbGlr ZSB0byB1c2UgdmVjdG9yIGJ5IGRlZmF1bHQuIElmIHdlIGRpc2FibGUgaXQgYnkgZGVmYXVsdCBh bmQKPiA+ID4gPiBtYWtlIGl0IHRyaWdnZXIgdGhlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIHRoYXQg bWlnaHQgYmUgYSBidXJkZW4gc2luY2UKPiA+ID4gPiBhbG1vc3QgZXZlcnkgcHJvY2VzcyB3aWxs IHVzZSB2ZWN0b3IgZ2xpYmMgbWVtY3B5IG9yIHNvbWV0aGluZyBsaWtlCj4gPiA+ID4gdGhhdC4K PiA+ID4KPiA+ID4gRG8geW91IGhhdmUgYW55IGV2aWRlbmNlIHRvIHN1cHBvcnQgdGhlIGFzc2Vy dGlvbiB0aGF0IGFsbW9zdCBldmVyeSBwcm9jZXNzCj4gPiA+IHdvdWxkIHVzZSB2ZWN0b3Igb3Bl cmF0aW9ucz8gIE9uZSBjb3VsZCBlYXNpbHkgYXJndWUgdGhhdCB0aGUgY29udmVyc2UgaXMKPiA+ ID4gdHJ1ZTogbm8gZXhpc3Rpbmcgc29mdHdhcmUgdXNlcyB0aGUgdmVjdG9yIGV4dGVuc2lvbiBu b3csIHNvIG1vc3QgbGlrZWx5IGEKPiA+ID4gcHJvY2VzcyB3aWxsIG5vdCBiZSB1c2luZyBpdC4K PiA+ID4KPiA+ID4gPgo+ID4gPiA+ID4gR2l2ZW4gdGhlIHNpemUgb2YgdGhlIHZlY3RvciBzdGF0 ZSBhbmQgcG90ZW50aWFsIHBvd2VyIGFuZCBwZXJmb3JtYW5jZQo+ID4gPiA+ID4gaW1wbGljYXRp b25zIG9mIGVuYWJsaW5nIHRoZSB2ZWN0b3IgZW5naW5lLCBpdCBzZWVtcyBsaWtlIHRoaXMgc2hv dWxkCj4gPiA+ID4gPiB0cmVhdGVkIHNpbWlsYXJseSB0byBJbnRlbCBBTVggb24geDg2LiAgVGhl IGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGF0IGlzCj4gPiA+ID4gPiBoZXJlOgo+ID4gPiA+ID4KPiA+ ID4gPiA+IGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvQ0FMQ0VUclcyUUhhMlRMdm5VdVZ4 QUFoZXFjYlNaLTVfV1JYdERTQUdjYkc4TitndGRRLUpzb0F3VUlzWG9zTitCcVE5ckJFVWdAcHVi bGljLmdtYW5lLm9yZy8KPiA+ID4gPiA+Cj4gPiA+ID4gPiBUaGUgY292ZXIgbGV0dGVyIGZvciBy ZWNlbnQgSW50ZWwgQU1YIHBhdGNoZXMgaGFzIGEgc3VtbWFyeSBvZiB0aGUgeDg2Cj4gPiA+ID4g PiBpbXBsZW1lbnRhdGlvbjoKPiA+ID4gPiA+Cj4gPiA+ID4gPiBodHRwczovL2xvcmUua2VybmVs Lm9yZy9sa21sLzIwMjEwODI1MTU1NDEzLjE5NjczLTEtY2hhbmcuc2Vvay5iYWVAaW50ZWwuY29t Lwo+ID4gPiA+ID4KPiA+ID4gPiA+IElmIFJJU0MtViB3ZXJlIHRvIGFkb3B0IGEgc2ltaWxhciBh cHByb2FjaCwgSSB0aGluayB0aGUgc2lnbmlmaWNhbnQKPiA+ID4gPiA+IHBvaW50cyBhcmU6Cj4g PiA+ID4gPgo+ID4gPiA+ID4gICAxLiBBIHByb2Nlc3MgKG9yIHRocmVhZCkgbXVzdCBzcGVjaWZp Y2FsbHkgcmVxdWVzdCB0aGUgZGVzaXJlIHRvIHVzZQo+ID4gPiA+ID4gdmVjdG9yIGV4dGVuc2lv bnMgKHBlcmhhcHMgd2l0aCBzb21lIG5ldyBhcmNoX3ByY3RsKCkgQVBJKSwKPiA+ID4gPiA+Cj4g PiA+ID4gPiAgIDIuIFRoZSBrZXJuZWwgaXMgZnJlZSB0byBkZW55IHBlcm1pc3Npb24sIHBlcmhh cHMgYmFzZWQgb24KPiA+ID4gPiA+IGFkbWluaXN0cmF0aXZlIHJ1bGVzIG9yIGZvciBvdGhlciBy ZWFzb25zLCBhbmQKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgIDMuIElmIGEgcHJvY2VzcyBhdHRlbXB0 cyB0byB1c2UgdmVjdG9yIGV4dGVuc2lvbnMgYmVmb3JlIGRvaW5nIHRoZQo+ID4gPiA+ID4gYWJv dmUsIHRoZSBwcm9jZXNzIHdpbGwgZGllIGR1ZSB0byBhbiBpbGxlZ2FsIGluc3RydWN0aW9uLgo+ ID4gPiA+Cj4gPiA+ID4gVGhhbmsgeW91IGZvciBzaGFyaW5nIHRoaXMsIGJ1dCBJIGFtIG5vdCBz dXJlIGlmIHdlIHNob3VsZCB0cmVhdAo+ID4gPiA+IHZlY3RvciBsaWtlIEFNWCBvbiB4ODYuIElN SE8sIGNvbXBpbGVyIG1pZ2h0IGdlbmVyYXRlIGNvZGUgd2l0aCB2ZWN0b3IKPiA+ID4gPiBpbnN0 cnVjdGlvbnMgYXV0b21hdGljYWxseSBzb21lZGF5LCBtYXliZSB3ZSBzaG91bGQgdHJlYXQgdmVj dG9yCj4gPiA+ID4gZXh0ZW5zaW9ucyBsaWtlIG90aGVyIGV4dGVuc2lvbnMuCj4gPiA+ID4gSWYg dXNlciBrbm93cyB0aGUgdmVjdG9yIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgaW4gdGhpcyBDUFUg YW5kIGhlCj4gPiA+ID4gd291bGQgbGlrZSB0byB1c2UgaXQsIGl0IHNlZW1zIHdlIHNob3VsZCBs ZXQgdXNlciB1c2UgaXQgZGlyZWN0bHkganVzdAo+ID4gPiA+IGxpa2Ugb3RoZXIgZXh0ZW5zaW9u cy4KPiA+ID4gPiBJZiB1c2VyIGRvbid0IGtub3cgaXQgZXhpc3RzIG9yIG5vdCwgdXNlciBzaG91 bGQgdXNlIHRoZSBsaWJyYXJ5IEFQSQo+ID4gPiA+IHRyYW5zcGFyZW50bHkgYW5kIGxldCBnbGli YyBvciBvdGhlciBsaWJyYXJ5IGRlYWwgd2l0aCBpdC4gVGhlIGdsaWJjCj4gPiA+ID4gaWZ1bmMg ZmVhdHVyZSBvciBtdWx0aS1saWIgc2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlIHRoZSBjb3JyZWN0 Cj4gPiA+ID4gaW1wbGVtZW50YXRpb24uCj4gPiA+Cj4gPiA+IFdoYXQgbWFrZXMgbWUgdGhpbmsg dGhhdCB0aGUgdmVjdG9yIGV4dGVuc2lvbiBzaG91bGQgYmUgdHJlYXRlZCBsaWtlIEFNWCBpcwo+ ID4gPiB0aGF0IHRoZXkgYm90aCAoMSkgaGF2ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBhcmNo aXRlY3R1cmFsIHN0YXRlLCBhbmQKPiA+ID4gKDIpIGxpa2VseSBoYXZlIGEgc2lnbmlmaWNhbnQg cG93ZXIgYW5kL29yIGFyZWEgaW1wYWN0IG9uIChub24tZW11bGF0ZWQpCj4gPiA+IGRlc2lnbnMu Cj4gPiA+Cj4gPiA+IEZvciBleGFtcGxlLCBJIHRoaW5rIGl0IGlzIHBvc3NpYmxlLCBtYXliZSBl dmVuIGxpa2VseSwgdGhhdCB2ZWN0b3IKPiA+ID4gaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSBv bmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGJlaGF2aW9yczoKPiA+ID4KPiA+ID4gICAxLiBB IHNpbmdsZSB2ZWN0b3IgdW5pdCBzaGFyZWQgYW1vbmcgdHdvIG9yIG1vcmUgaGFydHMsCj4gPiA+ Cj4gPiA+ICAgMi4gQWRkaXRpb25hbCBwb3dlciBjb25zdW1wdGlvbiB3aGVuIHRoZSB2ZWN0b3Ig dW5pdCBpcyBlbmFibGVkIGFuZCBpZGxlCj4gPiA+IHZlcnN1cyBub3QgYmVpbmcgZW5hYmxlZCBh dCBhbGwsCj4gPiA+Cj4gPiA+ICAgMy4gRm9yIGEgc3lzdGVtIHdoaWNoIHN1cHBvcnRzIHZhcmlh YmxlIG9wZXJhdGluZyBmcmVxdWVuY3ksIGEgcmVkdWN0aW9uCj4gPiA+IGluIHRoZSBtYXhpbXVt IGZyZXF1ZW5jeSB3aGVuIHRoZSB2ZWN0b3IgdW5pdCBpcyBlbmFibGVkLCBhbmQvb3IKPiA+ID4K PiA+ID4gICA0LiBUaGUgaW5hYmlsaXR5IHRvIGVudGVyIGxvdyBwb3dlciBzdGF0ZXMgYW5kL29y IGRlbGF5cyB0byBsb3cgcG93ZXIKPiA+ID4gc3RhdGVzIHRyYW5zaXRpb25zIHdoZW4gdGhlIHZl Y3RvciB1bml0IGlzIGVuYWJsZWQuCj4gPiA+Cj4gPiA+IE5vbmUgb2YgdGhlIGFib3ZlIGNvbnN0 cmFpbnRzIGFwcGx5IHRvIG1vcmUgb3JkaW5hcnkgZXh0ZW5zaW9ucyBsaWtlCj4gPiA+IGNvbXBy ZXNzZWQgb3IgdGhlIHZhcmlvdXMgYml0IG1hbmlwdWxhdGlvbiBleHRlbnNpb25zLgo+ID4gPgo+ ID4gPiBUaGUgZGlzY3Vzc2lvbiBJIGxpbmtlZCB0byBoYXMgc29tZSB3ZWxsIHJlYXNvbmVkIGFy Z3VtZW50cyBvbiB3aHkKPiA+ID4gc3Vic3RhbnRpYWwgZXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBh IG1lY2hhbmlzbSB0byByZXF1ZXN0IHVzaW5nIHRoZW0gYnkKPiA+ID4gdXNlciBzcGFjZS4gIFRo ZSBkaXNjdXNzaW9uIHdhcyBpbiB0aGUgY29udGV4dCBvZiBJbnRlbCBBTVgsIGJ1dCBhcHBsaWVz IHRvCj4gPiA+IGZ1cnRoZXIgeDg2IGV4dGVuc2lvbnMsIGFuZCBJIHRoaW5rIHNob3VsZCBhbHNv IGFwcGx5IHRvIHNpbWlsYXIgZXh0ZW5zaW9ucwo+ID4gPiBvbiBSSVNDLVYsIGxpa2UgdmVjdG9y IGhlcmUuCj4gPiA+Cj4gPiBUaGVyZSBpcyBwb3NzaWJsZSB1c2UgY2FzZSB3aGVyZSBub3QgYWxs IGNvcmVzIHN1cHBvcnQgdmVjdG9yCj4gPiBleHRlbnNpb24gZHVlIHRvIHNpemUsIGFyZWEgYW5k IHBvd2VyLgo+ID4gUGVyaGFwcyBjYW4gaGF2ZSB0aGUgbWVjaGFuaXNtIG9yIGZsb3cgdG8gZGV0 ZXJtaW5lIHRoZQo+ID4gYXBwbGljYXRpb24vdGhyZWFkIHJlcXVpcmUgdmVjdG9yIGV4dGVuc2lv biBvciBpdCBzcGVjaWZpY2FsbHkgcmVxdWVzdAo+ID4gdGhlIGRlc2lyZSB0byB1c2UKPiA+IHZl Y3RvciBleHRlbnNpb25zLiBUaGVuIHRoaXMgYXBwL3RocmVhZCBydW4gb24gY3B1IHdpdGggdmVj dG9yCj4gPiBleHRlbnNpb24gY2FwYWJpbGl0eSBvbmx5Lgo+ID4KPgo+IElJUkMsIHdlIGFzc3Vt ZSBhbGwgaGFydHMgaGFzIHRoZSBzYW1lIGFiaWxpdHkgaW4gTGludXggYmVjYXVzZSBvZiBTTVAK PiBhc3N1bXB0aW9uLgo+IElmIHdlIGhhdmUgbW9yZSBpbmZvcm1hdGlvbiBvZiBodyBjYXBhYmls aXR5IGFuZCB3ZSBtYXkgdXNlIHRoaXMKPiBpbmZvcm1hdGlvbiBmb3Igc2NoZWR1bGVyIHRvIHN3 aXRjaCB0aGUgY29ycmVjdCBwcm9jZXNzIHRvIHRoZSBjb3JyZWN0Cj4gQ1BVLgo+IERvIHlvdSBo YXZlIGFueSBpZGVhIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gTGludXgga2VybmVsPyBNYXliZSB3 ZSBjYW4KPiBsaXN0IGluIHRoZSBUT0RPIGxpc3QuCkkgdGhpbmsgd2UgY2FuIHJlZmVyIHRvIG90 aGVyIGFyY2ggaW1wbGVtZW50YXRpb25zIGFzIHJlZmVyZW5jZToKCjEuIEFSTTY0IHN1cHBvcnRz IDMyLWJpdCB0aHJlYWQgb24gYXN5bW1ldHJpYyBBQXJjaDMyIHN5c3RlbXMuIFRoZXJlCmlzIGEg ZmxhZyBpbiBFTEYgdG8gY2hlY2ssIHRoZW4gc3RhcnQgdGhlIHRocmVhZCBvbiB0aGUgY29yZSB0 aGF0CnN1cHBvcnRzIDMyLWJpdCBleGVjdXRpb24uIFRoaXMgcGF0Y2hzZXQgaXMgbWVyZ2VkIHRv IG1haW5saW5lIDUuMTUuCmh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4LWFybS1rZXJuZWwv MjAyMTA3MzAxMTI0NDMuMjMyNDUtOC13aWxsQGtlcm5lbC5vcmcvVC8KCjIuIExpbmsgc2hhcmVk IGJ5IERhcml1cywgb24tZGVtYW5kIHJlcXVlc3QgaW1wbGVtZW50YXRpb24gb24gSW50ZWwgQU1Y Cmh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTA4MjUxNTU0MTMuMTk2NzMtMS1jaGFu Zy5zZW9rLmJhZUBpbnRlbC5jb20vCgpnbGliYyBzdXBwb3J0IG9wdGltaXplZCBsaWJyYXJ5IGZ1 bmN0aW9ucyB3aXRoIHZlY3RvciwgdGhpcyBpcyBlbmFibGVkCmJ5IGRlZmF1bHQgaWYgY29tcGls ZXIgaXMgd2l0aCB2ZWN0b3IgZXh0ZW5zaW9uIGVuYWJsZWQ/IElmIHllcywgdGhlbgptb3N0IG9m IHRoZSBhcHAgcmVxdWlyZWQgdmVjdG9yIGNvcmUuCgpSZWdhcmRzCkxleSBGb29uCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWls aW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==