Ticket #14082: 0000-Test-Apply-Microcode-Update.diff

File 0000-Test-Apply-Microcode-Update.diff, 44.4 KB (added by nzimmermann, 18 months ago)

WIP patch implementing microcode updates

  • headers/private/kernel/arch/cpu.h

    commit cd4c99c9824d74fe97ad3acd030a4d4ae4493705
    Author: Nikolas Zimmermann <zimmermann@physik.rwth-aachen.de>
    Date:   Fri May 11 14:21:59 2018 +0200
    
        Start implementing a CPU microcode patcher.
        
        Work-in-progress, detailed change log will follow.
    
    diff --git a/headers/private/kernel/arch/cpu.h b/headers/private/kernel/arch/cpu.h
    index 6f82636..9fe2c6b 100644
    a b void arch_cpu_global_TLB_invalidate(void);  
    3636
    3737void arch_cpu_sync_icache(void *address, size_t length);
    3838
     39status_t arch_cpu_load_microcode();
    3940
    4041#ifdef __cplusplus
    4142}
  • new file headers/private/kernel/arch/x86/microcode_amd.h

    diff --git a/headers/private/kernel/arch/x86/microcode_amd.h b/headers/private/kernel/arch/x86/microcode_amd.h
    new file mode 100644
    index 0000000..bd93917
    - +  
     1/*
     2 * Copyright 2018 Nikolas Zimmermann, zimmermann@physik.rwth-aachen.de
     3 * Distributed under the terms of the MIT License.
     4 *
     5 * Copyright (C) 2008-2013 Advanced Micro Devices Inc.
     6 *               2013-2016 Borislav Petkov <bp@alien8.de>
     7 *
     8 * Distributed under the terms of the GNU General Public
     9 * License version 2.
     10 */
     11
     12#ifndef KERNEL_MICROCODE_AMD_H
     13#define KERNEL_MICROCODE_AMD_H
     14
     15#include <SupportDefs.h>
     16
     17#define UCODE_MAGIC                     0x00414d44
     18#define UCODE_EQUIV_CPU_TABLE_TYPE      0x00000000
     19#define UCODE_UCODE_TYPE                0x00000001
     20
     21#define SECTION_HDR_SIZE                8
     22#define CONTAINER_HDR_SZ                12
     23
     24
     25struct equiv_cpu_entry {
     26        uint32     installed_cpu;
     27        uint32     fixed_errata_mask;
     28        uint32     fixed_errata_compare;
     29        uint16     equiv_cpu;
     30        uint16     res;
     31} _PACKED;
     32
     33struct microcode_header_amd {
     34        uint32     data_code;
     35        uint32     patch_id;
     36        uint16     mc_patch_data_id;
     37        uint8      mc_patch_data_len;
     38        uint8      init_flag;
     39        uint32     mc_patch_data_checksum;
     40        uint32     nb_dev_id;
     41        uint32     sb_dev_id;
     42        uint16     processor_rev_id;
     43        uint8      nb_rev_id;
     44        uint8      sb_rev_id;
     45        uint8      bios_api_rev;
     46        uint8      reserved1[3];
     47        uint32     match_reg[8];
     48} _PACKED;
     49
     50struct microcode_amd {
     51        struct microcode_header_amd     hdr;
     52        unsigned int                    mpb[0];
     53};
     54
     55#define PATCH_MAX_SIZE B_PAGE_SIZE
     56
     57// Data from: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/amd-ucode/microcode_amd_fam15h.bin (fc4278900493525f8bb122033aef9b818274b378)
     58// Converted: hexdump -e '16/1 "_x%02X" "\n"' microcode_amd_fam15h.bin | sed 's/_/\\/g; s/\\x  //g; s/.*/    "&"/' > microcode_amd_fam15h.c
     59
     60size_t gMicrocodeSize_amd_15h = 7876; // bytes
     61const char* gMicrocode_amd_15h =
     62    "\x44\x4D\x41\x00\x00\x00\x00\x00\x40\x00\x00\x00\x20\x0F\x60\x00"
     63    "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x60\x00\x00\x01\x0F\x61\x00"
     64    "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x61\x00\x00\x12\x0F\x60\x00"
     65    "\x00\x00\x00\x00\x00\x00\x00\x00\x12\x60\x00\x00\x00\x00\x00\x00"
     66    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
     67    "\x20\x0A\x00\x00\x13\x20\x06\x03\x3D\x06\x00\x06\x02\x80\x00\x00"
     68    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x60\x00\x00"
     69    "\x00\x00\x00\x00\x59\xA9\x5B\x44\xAC\xED\xB4\x75\x3E\x94\xFF\x1A"
     70    "\x42\x6F\xFB\xE5\x16\x56\x6C\xAF\x1B\x72\xA5\x3A\xBA\x06\x18\xC6"
     71    "\x34\x77\xBF\xEE\x90\x5C\x02\xF7\xDB\xCA\x98\xA8\x16\xB1\xA5\xDA"
     72    "\x35\x3F\x8B\xA0\xB9\x3E\xD8\x11\x15\x4F\x0C\x07\xD0\x44\xFB\xE2"
     73    "\x26\xFC\xEF\x36\x48\x31\x26\x85\x50\xDD\x35\x83\x1D\x17\x4E\xB9"
     74    "\x06\x1D\x07\x68\x1D\x75\xC6\xCF\x2D\x03\xC2\x6E\x3E\x21\x67\xE4"
     75    "\x06\x84\xD0\x65\xF2\xD7\xAB\x81\x02\x43\x93\x75\xEE\x67\x90\xF4"
     76    "\xB9\x43\x24\xFD\xD1\x43\xA7\x40\x53\x65\xE0\x87\x92\x01\x29\x26"
     77    "\xB4\x3B\xCC\xC7\x72\xA1\xF2\x9F\xF2\x7E\xB9\x7B\xB8\x0D\x8D\x3F"
     78    "\xA1\xB3\xD3\x41\xCC\x01\x5E\x79\xF4\x4B\x19\xB3\x8B\x55\x6F\xCF"
     79    "\x4A\x70\x21\x9B\x1D\x32\xDB\x2D\xD6\xFA\x69\x0C\x0F\x01\xF7\x0E"
     80    "\x22\x8D\x65\x65\x8C\xAA\x0F\xB2\x4B\x3A\x59\xCD\x84\x21\xF5\x4F"
     81    "\x01\x0B\xA3\xEA\x5C\xA5\x30\x07\xC3\xF2\x0A\xB0\xBF\x8D\xA5\xC3"
     82    "\x97\x89\x33\x97\x9A\x39\x78\xC5\xA1\x0C\xEC\x17\x85\xB9\xAF\x9F"
     83    "\xDF\xC7\x24\xCE\xC2\xE1\x6A\x0F\x40\x5B\xC0\xF0\x21\x4A\x6F\x92"
     84    "\x52\xC3\x1F\x35\xD8\xEB\x5A\x15\x14\x10\x5B\x17\x93\x64\x42\x04"
     85    "\x29\x68\x40\xE8\x2A\x72\xE8\x3C\x4E\xD6\x33\xEF\x26\x4D\xA5\xA0"
     86    "\x5C\xA7\xAD\x45\x85\x94\x5B\xAE\x4B\x5F\xB9\xF6\x42\x87\x7D\xD7"
     87    "\xC3\x35\x64\xD8\xC3\xC9\x91\x7D\xF0\x2C\x69\xF6\xCB\x78\x7D\x7E"
     88    "\xF6\xE4\x8E\x6B\x86\x1A\x8B\x51\x03\x62\xC9\xF7\x29\x8E\xF0\xE5"
     89    "\x0A\x22\xB7\xC2\x15\x1B\x5D\xC3\x7E\x88\x3A\x6B\x60\x26\xB1\xD6"
     90    "\x88\x19\xAB\x4A\xA4\xF4\xA7\x1B\x51\xF7\x84\x07\x09\x2F\xDB\x62"
     91    "\xBE\x3E\x19\x62\x00\x68\xEE\x6B\x12\x31\x72\xF5\x70\xFE\x87\xDF"
     92    "\x49\x46\x2B\xDA\xD4\xB7\xD4\x13\x5F\x65\xD8\xAB\xA8\xBF\xFE\x21"
     93    "\xAD\xA4\x13\x79\x4B\x33\x0B\x29\x2A\x1A\xF7\x63\x14\xF0\x27\x88"
     94    "\xA2\x2F\x81\x69\x4F\xED\x05\x4C\xF4\xD2\x06\xAF\x1C\xE4\x7E\xF9"
     95    "\x84\xEA\xEC\xF4\x40\x76\x21\x08\x81\x99\x9E\xED\x0B\x9A\xE6\x8F"
     96    "\xD3\x51\xEE\x2E\x37\x02\x6C\xCA\xCE\xCE\xD3\xBA\xA1\x6C\x1E\x37"
     97    "\x7A\x59\x79\x3C\xC7\x12\x28\x36\xA4\x13\xE5\xAD\x94\x3F\x09\x18"
     98    "\xBF\x69\x84\x1E\x39\xDC\x59\x52\x98\xE1\x51\x6A\xEE\x95\xA9\x58"
     99    "\x03\xF1\x36\x0C\xB7\xBE\xEE\xB3\x64\x06\x83\x1C\x76\x81\x09\xDA"
     100    "\xF2\xFE\x4F\x8A\xAE\xF2\x73\xE9\x5F\x13\x29\xAB\x17\x3C\xAE\x39"
     101    "\x7E\xBE\x60\xCB\x17\xCF\xBE\x91\xAD\x19\xF1\xAB\x2D\xD8\x23\xE8"
     102    "\x8E\x43\x57\xC8\xDB\x27\xF6\xC7\xB0\x87\x90\x72\xEE\xB7\x53\xD4"
     103    "\x82\xFA\x15\xD6\x33\xFB\xE4\x4E\x63\x2E\xD6\xC9\x10\xBD\xC8\x76"
     104    "\x5E\x62\xD7\xDA\x9F\xD4\x0B\x80\x8F\x9E\x98\xC6\xFD\xF4\xB8\xA7"
     105    "\x75\x3D\x16\x07\x5C\x28\x35\x8E\x2C\xF0\x58\xAA\xAF\x14\xCA\xA2"
     106    "\x23\x8D\x7D\xBE\x63\x10\x21\x12\xA9\x7D\x70\x62\xD1\x6A\x1A\x79"
     107    "\x22\x11\x57\x75\xB7\xCE\xEF\x44\xB3\xA0\xFC\xBB\xEE\x94\x18\x5B"
     108    "\xFB\x01\x6A\x9A\x3F\xE5\x96\xB6\xB3\x58\xA1\xF6\x77\x1B\x4D\x58"
     109    "\x0C\x70\x13\x8F\x9A\x6F\x85\x9B\x36\xCA\x7D\x29\xEB\xA4\x67\x39"
     110    "\x57\x8A\x7F\xCE\x84\xAA\xB3\x55\xAF\x08\x95\xC0\x99\xD8\x11\x37"
     111    "\x95\x80\x5F\xBB\xFF\xF4\xA1\x5D\x2C\x6B\x0E\x12\x33\xB0\xEA\x48"
     112    "\xA5\x48\x57\xC2\xEA\xBF\x85\xDE\x0C\x70\xF1\xE0\x5F\x7C\x29\xAA"
     113    "\xE3\xF4\x74\x9F\x2D\x58\x3F\x09\x75\x42\xE5\xBC\x40\x95\xBB\x05"
     114    "\x3E\x79\x51\xDF\xE8\xE9\x57\x4F\xFB\x72\xF8\x86\x0D\xC6\x0B\x35"
     115    "\xCF\xF1\xE2\xB6\x46\xF4\x84\xCD\x67\xE5\x67\x32\xD4\x59\x32\xED"
     116    "\x55\x98\xE5\x3B\xE2\x48\xB8\xC1\xE4\x46\x5D\x55\x0E\xC4\xF2\xA5"
     117    "\x0E\xAC\xDE\xE6\x67\x94\x4B\x53\xED\xCC\xAA\xAB\x20\xEA\x20\x9D"
     118    "\xA6\x85\x5E\xC1\x52\xB5\x0C\x88\xDF\xD5\x5A\x26\x7F\x56\x50\xAE"
     119    "\xA2\x0A\x6F\xB4\x53\x4D\xF2\x6B\xB0\xE2\x95\x3F\x42\x26\x40\x8C"
     120    "\x6F\x8A\x0E\x17\xA6\x5C\x01\x30\x1A\x03\x99\xFE\x28\xFF\xEF\xA3"
     121    "\xA6\x8C\xF4\x56\x56\x04\x02\x7C\x1A\x0D\x29\xB5\x6A\x46\x85\xC7"
     122    "\x2B\xC3\x48\x6A\xBE\x20\xB6\x38\xF4\x85\x1D\x77\xF4\xE4\xF9\x71"
     123    "\x42\x8C\xD2\x6D\x46\xC0\x1E\x54\xB1\x7A\x91\xEE\x17\x1C\x77\xAA"
     124    "\x7A\xBB\x95\xF1\x32\x86\x90\x6B\xA2\xA2\x64\xD1\x00\xF0\x62\x45"
     125    "\x1C\xC4\x54\x1D\x1C\x23\x80\x16\x90\xEB\x39\x12\xC9\x50\x9A\x53"
     126    "\x75\x52\xE3\x97\x6A\xE1\xDB\xA9\x17\xA5\x68\x33\x5C\x7D\x84\x45"
     127    "\x40\x86\x43\x42\xCB\x3C\x69\xFC\x56\x8E\xAD\x84\xB5\xD6\x86\x91"
     128    "\xD8\x34\x13\x35\x7F\xB4\xFC\x7A\xE2\x9D\xFA\x7C\xC2\xF2\x29\x6C"
     129    "\xA1\xDF\xBD\x90\x46\x2E\x18\xDC\x15\x70\xB7\xC5\x0F\x76\x04\xFE"
     130    "\x1D\x3A\x63\x74\x13\x4F\x11\x89\xF6\x77\xD8\x79\x24\x36\xCB\x27"
     131    "\xAA\xE6\x12\x7E\x82\xEB\x62\x66\x1D\xF1\xEE\x89\x5B\x4A\x42\x88"
     132    "\x60\xD4\xD3\xFD\xCD\xDA\x34\x8E\x8A\x84\x41\xD4\x1F\x07\xDC\xA4"
     133    "\x7A\x31\x16\x27\x9A\x0E\x6F\xAE\xB0\x6E\xB3\x1F\x09\x18\xB3\x9D"
     134    "\x42\x68\x7E\x18\x22\x80\x4C\xFE\x55\x7B\x61\x3D\xE4\x9E\xE1\xBD"
     135    "\xF3\xA6\x6A\x41\xF5\x26\xAE\xA6\x1A\xB1\x49\xD6\x34\xC4\xED\x33"
     136    "\xE1\xC0\x65\xE6\xBB\x69\x14\xEC\xDF\x12\x94\xDF\x1E\x1C\xAC\x81"
     137    "\x31\xA8\xCC\x04\x54\x3F\x1A\xDC\xC7\x34\x3C\x59\xC7\xB9\xBF\x5F"
     138    "\x16\xB6\x97\x43\x1A\x76\xAE\x4F\xF2\x84\xF0\x1A\xD7\xD7\xB0\x2A"
     139    "\x7F\x2B\x4D\x05\x85\x26\x75\xB8\x22\x3F\x5D\x68\xF8\xFA\x53\x7D"
     140    "\x91\xBD\x2A\xB8\xD7\xC3\xF1\x7B\x22\x89\xB7\xEE\xC3\x27\xAB\x86"
     141    "\x87\x7A\xF9\xEF\x0C\x96\x04\x59\x7D\x63\x12\x14\x41\x43\xB5\xEC"
     142    "\xC0\x62\xEA\x34\x49\x33\xFD\x5B\x33\xCA\xDF\x61\x62\x15\xBF\x86"
     143    "\x1F\x31\x89\x4D\x4E\x23\x44\x83\xEE\xEE\x4F\xE3\x73\xEC\xDC\xDB"
     144    "\x50\xCB\x62\x54\x9B\x98\xC7\x5F\xCF\xB0\xD2\x58\x3D\x6F\xAB\x96"
     145    "\xB1\xAC\x84\x8E\x4E\xBA\x70\x10\x7F\xF6\x97\x58\xEE\x44\xFC\x20"
     146    "\xC5\x98\x58\xFB\x57\x23\xA7\xB4\xDB\x31\x00\x2E\xEC\x54\xA4\x57"
     147    "\x41\xC9\x71\x81\xA5\xD9\x18\x81\xD8\xEF\x8A\x0B\x73\x79\x50\xB4"
     148    "\x35\xA7\x89\xB4\x45\x7A\x46\xC6\x92\xF6\xB4\x7F\x02\x72\x49\xBD"
     149    "\x95\x40\x5B\x4B\x23\x60\x25\xC5\x60\x7A\xEF\x16\x2B\x35\x3A\xB9"
     150    "\xEA\x99\x17\x91\x7C\x59\xBE\x29\xCE\x3D\x88\x86\xE9\xF3\xC9\x0C"
     151    "\x31\xA4\xB2\x90\x45\xF3\x28\x5A\xE6\x3E\x51\x7F\x77\x8D\xA4\xA6"
     152    "\x66\x05\xCF\xA1\xF8\x84\xDD\x24\x0A\xDD\xCA\x33\xEA\x0D\xFA\x7E"
     153    "\x6A\x0C\x3B\x6D\x0B\xD9\x83\xCB\x39\x27\xFC\x98\xA9\x72\xF3\x98"
     154    "\x30\xB0\xC2\x7C\xAC\xA9\x59\x19\xAE\x26\xDB\xF1\xFF\xB1\x13\xB9"
     155    "\xD6\xD8\x55\x23\xA9\x19\x6B\x5F\x08\xE8\x3B\x54\x01\xF3\xF6\xF6"
     156    "\xA0\x3A\x45\x00\xB8\xF9\xCB\x3C\x48\x3D\xD7\x8C\xF1\x5E\x5F\xE6"
     157    "\x9A\x8D\x29\x90\x94\x38\x0E\x36\x18\xA4\x67\xAF\xAF\x3E\xA0\x25"
     158    "\x3D\x5A\xF2\x39\x8C\x93\x87\x07\x6E\xF2\x5E\x95\xD2\xFB\xFB\x23"
     159    "\x1B\x81\x86\x32\xBE\xE2\xD8\xE0\xC8\x33\x74\x98\x13\xCC\x8A\x17"
     160    "\x87\x0A\xCD\x79\xDA\xDE\x0B\x49\x8A\x30\xD8\x7F\x8E\x29\xF7\x32"
     161    "\x3E\x50\x1F\x46\x0B\x31\xFA\x68\x3E\xFD\x01\xF0\xB3\x74\x44\x77"
     162    "\x06\xFE\x0C\x82\x37\xD5\xEB\x9C\x2D\xC3\xAC\xD6\xDA\xEE\x87\x24"
     163    "\xC1\x7C\xFE\x1F\xAA\x51\xC8\xAD\xCD\xEB\xD6\x4C\x91\xC9\x92\x0B"
     164    "\xD3\x6B\xAF\x9F\x92\x7A\xFA\x32\x9D\xC3\xA5\xCB\x74\x85\xA9\x63"
     165    "\x4F\xEE\x52\x67\x31\x2B\x60\x4F\x5F\x61\x7C\x15\x05\x5C\xFA\xF2"
     166    "\xF5\xD7\xDF\x75\x9C\x50\xEC\x25\x30\xE3\x06\x4C\x75\xFB\x03\x83"
     167    "\xD5\x38\x61\x01\xF8\x85\x34\xEA\x16\xE1\x3E\xEB\x41\x14\xC0\xA2"
     168    "\x89\xC4\xFC\x66\x92\x50\x1F\x32\xF4\x0C\x8A\xC2\xAE\x76\xC6\x5B"
     169    "\x80\x98\xD3\x89\x9B\x84\x34\x87\xFD\x71\xF3\x6D\x62\x13\xD1\xDE"
     170    "\x50\x0D\x98\x6E\xA2\xC5\x42\x0A\xE0\x5D\x5A\xAE\x7E\x50\x17\x18"
     171    "\x25\xD2\x92\x0F\x75\x85\x07\x28\xBA\x86\x85\x0E\x5F\xF7\x01\xF1"
     172    "\x31\x84\xB7\xAB\x06\x07\x74\x5C\xEE\x0E\x9E\x02\x49\x0B\xB6\xA3"
     173    "\xE1\x61\x57\xC0\xF0\x0B\xA8\x7C\x19\x4F\xAD\xB0\x38\x82\x17\x75"
     174    "\xF1\x44\x1B\xD4\x10\xF4\xF6\x4B\x73\x78\x36\xA3\x90\xAD\x32\xED"
     175    "\x70\x66\x80\x5C\xAF\xB9\x52\xD5\xB0\x27\x51\x22\x01\x39\x5C\xD4"
     176    "\x56\x5C\xEA\xE0\xFA\xD1\x84\x33\x30\x70\xBE\x5D\x5D\xFA\x38\x65"
     177    "\x80\x70\x6E\x40\x6D\xB3\x83\x25\x7A\xB6\x69\x9F\x68\xF4\x75\xD1"
     178    "\xDA\xB7\x36\x03\x23\xDC\x23\x14\xDA\xB0\x14\x93\x2B\xA8\x89\x13"
     179    "\x49\xB4\x5E\x8F\x39\xC2\x62\x3B\x9C\x6A\x20\x02\x49\x13\x44\x19"
     180    "\xB1\xB5\x0F\x9F\x60\x64\xC5\x32\xDB\x70\x61\x5D\x5B\x66\x18\x80"
     181    "\x29\x56\xB8\x70\x06\xBD\x93\x72\x4E\x6A\xA7\x56\xAA\x4F\xB6\xC2"
     182    "\x5B\xD7\x82\x81\xB5\xB2\xB1\x4D\x84\x6E\xC4\xB9\x3D\x37\xC3\x73"
     183    "\xC3\x2F\xB3\xF4\x8D\x8E\x85\x3D\x8C\x9B\x9D\x70\x15\xCF\x93\x79"
     184    "\xDB\x06\xE1\xAA\x90\x48\x9D\x3B\x6D\x36\xA9\x1A\x21\xE7\xE2\xFE"
     185    "\xC0\xBE\x6F\x6F\x53\xBB\xC9\xDE\xDE\xE2\x29\x6E\xB8\xDC\x65\x29"
     186    "\x5D\x87\xEE\xCD\x6F\xB3\xD8\x23\x9B\x2E\x22\xCF\x22\xCD\x28\x8B"
     187    "\x41\x19\xB2\x34\x48\xF0\x0F\x76\xE3\xC9\x1A\xD8\x22\x1E\xD7\x02"
     188    "\x96\x7C\xC9\xD5\xB7\xB4\x28\x04\xC1\x16\xE2\xB6\x53\xB4\x33\x67"
     189    "\xBD\x1F\x48\xF6\x6D\x57\xDC\x33\xE2\x22\xC9\x43\x57\xA8\x88\x0D"
     190    "\x82\xDB\x64\x25\x8F\x9A\xA4\xE9\x12\xC3\x9B\x18\x25\x2F\xEF\xF2"
     191    "\xA2\xE0\x3F\xB8\x9A\x7B\x7C\x20\xFA\xCA\xAA\x9B\xD3\xF0\x76\x86"
     192    "\xB1\x52\x66\x60\x73\x4E\x76\xA5\x01\xA3\x03\x7D\xE5\xC4\x17\xDD"
     193    "\x25\xCB\xF3\x09\x14\xA4\x23\xD7\x45\xEE\x43\x08\x27\x2E\x04\x8B"
     194    "\x33\x54\x25\x8A\xCC\x59\xD8\x88\x40\xAC\x3D\x17\x8D\xCA\x32\x19"
     195    "\x00\x09\x91\x40\xDA\xF2\x7B\x33\x3B\xAC\x3C\x81\x51\xD5\x0C\x8B"
     196    "\xDD\x53\xF0\x0B\x96\xB8\x71\x9E\x93\x61\x64\xD1\x48\x35\xCF\xE2"
     197    "\xCC\xF1\x53\x40\x24\x90\x43\x9C\xC6\x5E\x84\xA0\xCF\x2C\x54\xDB"
     198    "\xB1\xF6\x70\x20\x65\x09\x60\x5D\x24\x4A\x7D\x61\x6A\x0C\xE6\x85"
     199    "\xAA\x96\x9E\x53\x5E\x34\xF8\x16\x3D\x06\x17\xE2\x82\x04\x82\xD1"
     200    "\xF2\x7E\xB1\x4C\x23\x6F\x46\xB3\x67\x70\xC1\x2E\x46\xDC\xB0\x5C"
     201    "\x6D\xE1\x91\xE9\xFA\x36\xBD\x68\x87\x6C\x99\xB6\x1E\x10\x41\x8A"
     202    "\x2B\x4D\x76\xE3\x3D\xC5\xBC\x35\x3D\x43\x5F\x73\x04\xD2\xDA\x69"
     203    "\x53\xDB\x44\x3E\x26\x21\x5A\x65\x4A\xAD\xD0\xDC\x34\xEA\x9A\x18"
     204    "\x09\x3B\x46\xF9\xBF\xE9\x82\x18\xD4\x38\xE6\xD1\xED\x34\xF4\x9B"
     205    "\x88\x70\x55\xDE\x0F\xDC\xDD\xD4\x20\x4C\x68\x22\xF6\x07\xD6\x14"
     206    "\x6E\xF0\xA7\x28\x47\xC3\xE8\x22\x80\xD6\xCD\x27\xA2\xF7\x2F\x64"
     207    "\x1F\xDB\x9E\x95\x6A\x96\xD3\x88\xB2\x2B\x60\xD9\x00\xFB\x39\x5E"
     208    "\x8E\xFF\xAC\x3C\x26\xA0\x3A\xE3\x26\xB5\x89\xC5\x25\x43\x55\x6A"
     209    "\xFA\x76\x2A\x54\x76\xA1\x1A\xA3\x13\x67\x04\xFC\x65\x61\x6B\x7A"
     210    "\xF9\xD4\xC7\x59\xF3\x94\xB0\x08\x4A\x46\x6D\x01\x9E\xE2\xF3\x84"
     211    "\x55\x1D\x66\x1C\x0F\x3A\x77\x5D\x9B\x15\xD9\x4D\x33\xD0\xB4\x3C"
     212    "\xEF\x1B\x27\xC7\xAE\x50\x63\x0D\x85\x80\xE6\xDC\x0D\x46\xE6\xED"
     213    "\x44\xF8\xDA\xA1\x3A\xCC\x33\x8F\x47\xDB\xD7\xA0\xE9\x09\x7F\x20"
     214    "\xC2\x2A\x38\x60\x39\xD1\x99\xA5\xB1\xC3\x1B\x8A\xD8\xD4\x9C\x14"
     215    "\x88\xA3\xC0\x6E\x18\x9A\x70\x5A\xA3\x2D\x18\xA3\x00\x9F\x45\x7E"
     216    "\xD5\x06\x17\x13\xF7\x78\x74\x57\xB7\xCB\xB7\x81\xC4\xA6\x27\xB3"
     217    "\x39\x29\x1F\x61\x6E\x65\x7C\x6F\x3D\x46\xA9\xB4\x46\x9D\x11\xBA"
     218    "\xEF\xEB\x2C\x54\x0F\x2B\x5D\xAD\xC9\x16\x37\xB5\x1E\x41\x5F\x31"
     219    "\x9B\xC8\x53\xF1\xF1\x22\x55\xA7\x9F\x4A\x28\x04\x7C\xDC\x9C\xE4"
     220    "\x9A\xDC\xF6\xD6\x5F\xD3\xD9\x22\x46\x14\xFE\xC4\x23\xA6\x9A\xEC"
     221    "\xAA\x85\xE8\xDD\x97\x94\xFA\x3E\xFB\xB3\x00\xF8\x65\x8D\x3F\xD4"
     222    "\xED\xAD\xE8\x06\xCC\xF1\xCE\x44\x0C\xFA\x6C\xE5\xE3\xE5\x07\xB8"
     223    "\x61\xC0\xBC\x48\x0B\x93\xAC\x5E\x84\x4A\xC4\x8D\x59\x98\x47\xEB"
     224    "\x76\x02\xEF\x97\x1D\x9E\xB6\x6D\xBD\xCF\xC6\x44\x2B\x61\x49\x4A"
     225    "\x53\xE5\xA9\x06\x8A\xB4\x06\xEE\xCB\x6E\xD1\xD3\xCF\xF4\xF5\x88"
     226    "\xA3\xA4\xE4\xCA\xC2\x82\x06\x1B\x02\x03\x08\xE2\xBA\x5B\x72\xAE"
     227    "\x4A\x44\x7D\x3C\x5A\x2B\x6A\x63\x23\x46\x1B\xFA\x76\xBB\x76\x7C"
     228    "\xE2\x6C\xCD\x40\xBA\x68\xD1\x3F\xFA\x62\xC5\x21\xDD\x05\x61\xDC"
     229    "\xBA\x54\x1B\x1B\x01\x00\x00\x00\x20\x0A\x00\x00\x16\x20\x25\x01"
     230    "\x4F\x08\x00\x06\x02\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     231    "\x00\x00\x00\x00\x20\x60\x00\x00\x00\x00\x00\x00\x6F\x1D\x57\x7D"
     232    "\x97\x42\x3D\x58\x90\x60\x91\x33\x45\x73\xA4\x21\xFF\x02\x61\x74"
     233    "\x8E\xB1\x6E\x13\xE9\xD4\x62\x4F\x87\xD5\x42\x56\x35\x4F\x62\x97"
     234    "\x86\x0D\xD4\x9A\xF5\x45\x81\x09\xBA\xFB\x72\x5B\x3E\x23\x6C\x22"
     235    "\x0F\x96\x5B\x10\xF2\x01\xBD\xF1\x7F\x77\xA6\x79\x69\x81\x85\xFD"
     236    "\x5F\x35\x45\x10\x90\x3B\x79\xF4\x17\xAF\x74\x57\x7B\xBF\xE4\xAE"
     237    "\xE7\x34\x78\xEE\x89\x52\x9B\xF8\x5A\x54\x2F\x60\x83\x72\xB9\xB2"
     238    "\x6B\xC6\x48\x71\x6C\xDE\x72\x67\xFF\xAA\xF1\xFD\xF9\x64\xD6\x58"
     239    "\x09\xB8\x7A\xB9\x8B\xF0\x10\x04\xE2\x39\xE8\x69\x65\x47\x8B\x04"
     240    "\xBF\x3D\xCE\x04\x35\x94\xB0\xE8\x2B\x2B\xC3\x44\x74\xE4\xCA\x3B"
     241    "\xE4\xAC\x36\x0D\x8A\x92\x46\xF3\x41\xB8\x2C\x10\xC5\x80\x90\xCF"
     242    "\x46\xCB\xB8\xAF\x01\x4D\xEE\x65\xB5\x83\xF9\x3A\xAF\x78\xCE\x0F"
     243    "\xB8\x60\xA5\x47\x37\x83\x20\x64\x7A\xCE\x89\xC8\x04\x06\x71\xB0"
     244    "\xA1\x94\xBE\x65\x68\x37\x60\x6C\x8A\x45\x2B\xE5\x01\x17\xCA\x3D"
     245    "\xA0\x98\xD9\xF2\x4F\x26\x4E\xF3\xC6\xB6\x54\xF7\x52\x91\xFF\xB0"
     246    "\xF8\x79\x1C\x19\xFC\x15\x50\xF7\x51\x37\xCB\x03\xF5\xE1\x57\x0D"
     247    "\x1E\x84\x23\x25\x08\xC7\xCF\xD7\xA5\x27\x03\xFD\x12\x3C\x55\x96"
     248    "\x77\xFC\x4A\x64\x4E\xAD\x93\x71\x5F\x27\x35\xF5\x89\x2F\x09\x58"
     249    "\xFC\x10\x77\x83\x01\xB5\xC3\x2B\x77\x5E\xDE\x90\x54\xBA\xC6\x61"
     250    "\x68\xC4\xFD\xAF\x38\x15\x62\xC9\xFA\xCE\x80\xBE\xB4\xE6\xC4\x4D"
     251    "\xE8\xF8\xC0\xC5\x25\x61\xB0\x79\x45\x22\xC6\x10\x8B\x48\x62\x2C"
     252    "\xF0\x9D\x13\x0E\x04\xBF\x54\x54\x45\x99\xEB\xD0\x85\x83\x2C\x34"
     253    "\xAA\x45\xE9\x5E\x24\x59\x93\x9A\xC1\x81\xAA\xE1\x45\x66\x35\xED"
     254    "\x55\x8F\x11\x40\x4D\xBD\xD7\x92\xFF\x67\x58\x12\xA7\x08\xD7\x6B"
     255    "\xAB\xAC\x94\x90\xCD\x47\x51\x43\x89\xC4\x2C\x01\x97\x05\x85\x39"
     256    "\x3F\x81\x80\xFB\xEE\x01\x38\x37\x4E\x85\xE4\x8E\x53\x16\x7F\x25"
     257    "\x57\xC3\x5F\x00\xF9\x19\xC9\x5E\xAA\x4A\x19\xC2\x90\xE4\x82\xCC"
     258    "\x9B\x0E\x9B\x99\x03\x6F\x05\xB3\x6A\xA6\x4C\x32\x35\x3A\xF5\xA2"
     259    "\x3E\x3E\x35\x99\x43\xD1\xF4\x65\xAB\xE6\xFE\x4C\x0B\x17\x55\x8D"
     260    "\x91\x2E\xAF\x68\xB2\x64\xC2\xFF\x1B\x9B\xF2\x1B\x75\x10\xF4\x83"
     261    "\xD1\x8A\xAD\x3E\x88\x9C\x55\xF1\x4F\x30\x94\x94\xAC\x32\xDC\x20"
     262    "\xB0\x4B\x54\xE9\xB4\x81\xDB\x15\x8E\x13\xBE\xAF\x05\x9B\x78\xC3"
     263    "\xFD\x2F\x24\xF1\xFB\x05\xD9\xD1\xBC\x3A\xC6\x04\xB1\x86\x78\x5F"
     264    "\xD9\x68\xC7\x62\x50\x68\xF9\xE9\x0D\x76\x01\xF0\xE6\x05\x99\xCC"
     265    "\xC5\x5B\x97\xB1\x1B\xAE\xF4\xA7\x83\x1B\x87\x13\x0E\x62\x56\xF3"
     266    "\xF4\x30\xAE\x63\x7D\xDD\xBD\x92\xC2\x41\xE8\xC3\xA4\x06\x4E\x89"
     267    "\x9D\x3B\xEA\x9E\xB5\x12\xB8\xE3\xAE\x72\xB4\x9F\x12\x05\x36\xA1"
     268    "\x58\x64\xE9\x73\x01\xE8\x8D\xFA\xA7\xCF\xAF\xC9\x80\xA1\x40\x92"
     269    "\x84\x38\xBA\x96\xCF\xC5\xEC\xD4\xAD\x18\x3D\x6E\x87\xA6\xF9\x50"
     270    "\xEB\x92\x53\x0F\xE1\xB6\x05\x04\xE9\x88\x83\x01\x3C\x57\xB9\x36"
     271    "\xF6\xA5\x61\x24\x00\xF9\x2D\x1E\x16\x9D\x31\xF7\x13\xDD\x06\x3C"
     272    "\xCC\x3E\x6B\x7C\xE5\x3E\x7A\xB2\xBC\xF2\x4A\xD1\xCD\xD1\x83\x94"
     273    "\xC1\xF9\x23\x52\x96\xDF\x93\xE8\x89\xBF\xD3\x84\x28\x73\x6D\x26"
     274    "\xD1\xCB\xB1\x48\x55\x94\x2C\x02\x1F\xE4\xFD\xBC\x3A\x27\xF7\x41"
     275    "\x26\x90\xF9\x5B\xB5\x56\x0C\xD3\x0C\xD1\x1E\x94\x73\x8F\x5C\xA3"
     276    "\xC1\xEB\x4A\x29\x8A\x07\xF9\xA8\x7B\x92\xCF\x12\x1E\x64\x35\xC3"
     277    "\x54\xAE\xA3\x0D\xEB\x03\xE4\xD8\x7B\xAB\xAE\x01\xAD\x8C\x78\x2E"
     278    "\xF7\x05\xFF\xBB\xC5\xA3\xEF\x96\x26\x36\x10\xD3\x79\xEC\xC1\xC3"
     279    "\x7D\xA7\x2D\xA6\x56\xFB\xF8\xD5\x9B\xED\x7A\x5D\xBB\xEA\xC7\xEB"
     280    "\x32\x51\x76\xA4\xF5\xD3\x8F\x3C\x9D\xE0\x4E\x58\x8E\x38\xDF\x9D"
     281    "\x7A\xA5\xA8\xE7\x07\x5D\xEA\x77\xE8\xF4\xC6\x71\xC3\xAE\xFC\xCF"
     282    "\x84\xAE\xB6\x5C\x1F\xDC\xDE\xAB\x6C\x3A\x69\xB3\xDD\x11\xAB\xEE"
     283    "\xBD\x71\xDC\xDA\x5A\x4C\x8C\x7B\x97\x3B\x01\x54\x2B\xC7\xE7\x17"
     284    "\xCB\xA0\xD6\x74\x5F\xF5\x0E\xB4\x5E\x9D\x4C\x29\xF1\x97\x38\x3E"
     285    "\xA7\xF7\xB5\xBB\xB9\xFC\xB5\x5C\x8D\xFA\xD2\x2E\x0C\x6A\x2B\x46"
     286    "\x34\x34\xC7\xB7\xB2\xE2\x9B\xEB\xC2\x06\xF7\xA9\xEE\x62\x12\xF9"
     287    "\xF7\x17\x09\xB8\x11\x32\x4F\xDA\x02\xB4\x85\xBF\x34\x19\x21\x49"
     288    "\x9A\x4B\x18\x88\x75\xC4\xA4\x8A\xA9\x73\xCC\xCA\xE6\x0E\x71\xAE"
     289    "\x6A\x06\xC2\xFE\xEA\xFD\x25\x6C\xDF\x36\x42\x2C\xD9\x48\x5E\x05"
     290    "\x0D\x6B\xE5\xE0\x9C\x49\x06\x4F\x81\xB4\xCF\xE4\x08\xDE\x42\x34"
     291    "\x78\x50\x13\xC2\xCF\x2B\x81\x20\x3B\xC3\x2A\x9F\x40\xE5\x59\xDB"
     292    "\x20\x93\x67\xFC\xAD\xAF\x12\x92\xBF\x44\xF8\xE5\x3A\x7C\x9B\x41"
     293    "\x32\xF3\xBF\x7E\x3D\x14\x2B\x42\xDE\x9A\xC2\xD8\xD1\x26\x4F\x27"
     294    "\x56\xCB\x7E\x1D\xA3\x06\x6A\x9F\x3B\x30\x63\x98\xEE\x41\x6F\xDB"
     295    "\x2A\x3D\x9D\x34\x04\x76\x87\xB3\xD6\x47\x88\xDA\x1B\x26\x06\xAF"
     296    "\x9C\x1A\xD5\x67\x46\xBE\x16\x19\x19\xDF\x4D\x26\xC9\x57\x1A\xC2"
     297    "\x32\x3B\x3C\x0E\x09\x53\x98\x66\xAE\x0D\xFA\x31\xDA\x6E\x9F\x49"
     298    "\x98\x6F\xFD\xAC\x74\x33\x4C\xD4\x46\x10\x4E\xBB\x6F\xB4\x18\x0C"
     299    "\x33\xAD\x18\x09\x74\x54\xC8\x4A\x73\x4B\x29\xB2\xBF\x3E\xE4\xA7"
     300    "\x3D\x5C\xB5\x12\x02\x63\x9C\xEF\xE7\xE3\xE1\xD6\x76\x53\x4A\x4E"
     301    "\x7F\xFC\xE1\x0E\x97\xE0\x74\xBF\xB4\x6B\x31\x3E\xAA\xC3\x0B\xA9"
     302    "\x70\x71\xAA\x55\x27\xBF\xDA\xBF\xA3\x3F\x6D\x0F\x94\xF2\x86\xA7"
     303    "\x4E\x44\x02\xDE\x3E\xE3\x47\xFB\x0C\x63\x91\xAC\x78\x13\xFD\x45"
     304    "\xDF\x8C\xB4\x3C\xDD\x63\x73\x2D\x41\x42\x8E\xD7\x2C\x5F\x3E\x9A"
     305    "\x22\xF5\xC1\x9A\xCB\x38\x99\xD6\xB7\x1D\x7C\x9C\x07\xCA\xC7\x81"
     306    "\x11\x20\x7B\x14\xB1\x45\x0F\xED\x0C\x75\xF6\x2B\x27\x9B\xBD\x1E"
     307    "\x04\x95\xBD\x15\xE9\x3D\x91\xCA\xB6\x43\x1C\x55\x2B\xA5\x7B\xF5"
     308    "\x47\x0C\x34\xF8\x1E\x18\x5F\x2A\xA8\x16\xE8\xBB\x26\xCD\xA8\x0F"
     309    "\x4F\xFE\x0F\x2C\x44\x4E\xA9\xB8\xFC\xF8\x4A\x09\x46\x2C\x9A\x6F"
     310    "\xFC\x29\x3B\x46\x98\x7F\xC7\xD5\x50\x5B\x29\x8A\x9D\xD5\x16\xFB"
     311    "\x24\x41\xA0\x7A\x51\x4F\x9F\x6E\x2E\xF7\x23\xBC\xDA\x77\xF8\x83"
     312    "\xE0\xBD\x8A\xA5\x45\x7D\x59\x14\xFA\xD5\x9B\xB8\xC8\x62\xB4\x40"
     313    "\x44\x18\x71\x4F\x50\x25\xE8\x54\x6F\xB0\xB4\x34\x02\x64\x8A\x4A"
     314    "\xFE\xA9\xC8\xC6\xFD\x07\xC2\x7D\xBC\x63\x88\x25\x1D\xFB\x63\x64"
     315    "\x56\x74\x7B\xB5\xCB\x90\x45\xC4\x0D\xD9\x2E\x50\x56\xE9\xAE\xD0"
     316    "\x20\xB8\x81\xDF\x82\x49\xD8\x05\x45\x9D\xCC\x92\x35\x6C\x6B\x10"
     317    "\x96\x33\x1E\x6C\x9E\xA8\x8D\xA0\x72\x2E\xE4\x66\x3A\x86\xB9\x60"
     318    "\x33\x3F\x3F\x36\x23\x3D\xEA\x75\x5B\xF7\x47\xA3\xB4\x23\xB2\xDB"
     319    "\x16\xBA\x9B\x35\x47\x89\xF5\x4F\x96\x99\x51\x43\x9B\xF8\xA4\xD6"
     320    "\x7D\xD2\x76\x62\x35\xEF\x0E\xCF\x5A\x98\xE9\xF5\x80\xFC\xB6\x3C"
     321    "\xD9\x54\x28\x9E\x71\x48\x76\xA4\x80\x38\x5C\x7A\x00\x81\x11\xC3"
     322    "\x80\x99\xDC\x75\xA8\xE9\xB8\x50\x23\x5C\x6F\x72\xCF\x35\xC8\x79"
     323    "\xCE\x53\x18\xB6\x67\x51\x22\x1F\x70\x8D\xA3\x43\x9E\xA4\x2E\xB0"
     324    "\xF5\x32\xC4\x55\xCB\xE0\xBD\xA6\x7C\x0B\x7D\x20\x88\xFF\x3A\xEA"
     325    "\xED\xB9\x21\xB2\xA7\x61\x86\x83\xDE\x2E\x87\x5F\xCC\x02\x5A\x6A"
     326    "\x57\x22\xEA\xDF\xE4\xFF\x61\xA4\x3D\x43\xE6\xA1\x1F\xB2\x45\x78"
     327    "\xFF\xEB\x4E\x97\xED\x31\xA6\xB8\xE9\x18\x2B\x63\x3E\xA7\x0C\xC9"
     328    "\x36\x45\x5D\x48\x35\x4D\x98\xA7\x94\xFA\xC1\xF3\x81\xD6\xB6\xFB"
     329    "\xD8\xE7\x63\x76\x93\x56\x14\x33\x6F\xF9\x75\xA3\xC4\xF5\x74\xE7"
     330    "\xE5\x2E\x0C\x58\x25\xCB\x60\x99\xD5\xBE\xEF\x3B\x4B\x2C\xD6\x32"
     331    "\x13\xA9\x96\x66\xBB\x5D\xF3\x72\x3C\x32\x34\x9B\x68\xBD\xC4\x12"
     332    "\x9B\xCA\xAA\xA1\xCC\x5F\xC5\x9A\xAE\x5E\xC8\x95\x66\x0F\xD2\xA6"
     333    "\x4A\xE1\x31\x40\xD4\xB7\xFC\xBE\xDF\x98\x3C\x0D\x69\x68\xD4\x91"
     334    "\x3E\x5C\x06\x21\xE5\x7A\x98\x0D\xEC\x7C\x8A\x28\xC7\xCA\xE5\xE1"
     335    "\x85\x03\x8A\xE4\x97\xE9\xA6\xDB\x3C\xF2\xFA\xD9\xB2\x94\xFF\x2D"
     336    "\x49\x2E\x3B\x91\xF7\x98\xDA\x97\x4A\x75\x82\x79\x04\x79\xAC\x0F"
     337    "\xBD\xBA\x60\xA1\x54\x36\x47\xF8\xAA\x58\x34\x5B\x09\xBC\xD3\xE9"
     338    "\x8D\xEC\x98\x67\x10\xD9\x29\xB9\x27\x6A\xC9\xF4\x7C\x50\xCF\x13"
     339    "\xCC\x7E\xAC\x75\xBC\xC8\x17\x65\x32\x77\xF9\x9A\x13\x37\x87\xFE"
     340    "\x05\x94\x60\x31\x5C\x18\xA7\x0C\xBE\xF6\xB8\xCB\x24\x97\xC0\x3E"
     341    "\x65\xFB\x01\x9A\x4D\x1E\x80\xFD\x6C\x39\x17\x15\x38\x04\x6A\x56"
     342    "\x89\x4E\x42\x55\x7D\x9C\xF2\x3B\x07\xC9\x38\xE7\xFD\x6D\x0B\x75"
     343    "\x04\x64\x71\x25\x05\x28\x97\x32\xC5\xEF\x32\xA8\xE5\xE3\xE1\x6F"
     344    "\x4A\x07\x84\x95\x49\xFE\x88\xE8\x09\xE3\xB5\xB2\x6A\x8A\x69\x92"
     345    "\x01\x72\xF1\xC6\x1C\x5C\xFB\x8B\xCA\xE0\x08\xDD\x03\xCE\x0F\x62"
     346    "\x9A\xB1\x6A\x32\x0D\x49\x27\x7F\x12\xCC\xB0\x84\x2C\xCD\xE2\xD1"
     347    "\xF2\x76\xE3\x72\x69\x3B\x73\xE3\x43\x2A\xDF\x2F\x61\x42\x37\x1A"
     348    "\x80\xDF\xF3\x56\x16\x84\xB0\x4F\x87\x70\xBC\xD1\xDD\xD1\x32\xD4"
     349    "\x2C\xD5\x8B\xE8\x22\xB3\x80\x5F\x2B\xF5\xEB\xA4\x3C\xD6\xCD\x66"
     350    "\x80\xCF\x2A\x7C\x86\xFC\xE0\xBF\xFC\x2B\xBD\xDD\x23\x30\x5B\x2A"
     351    "\x77\x9B\x12\x1E\x1F\x4C\xAD\x0C\xEF\xDB\x59\xA2\xB7\x05\x08\xED"
     352    "\x53\x7B\xA7\x47\xAE\xA9\x2B\x6D\x04\x6E\xD4\x78\x9D\xE6\xB4\xCC"
     353    "\x5C\x6F\x40\x31\x7B\x79\x56\xA5\xB9\xFB\x16\xBF\x77\x1B\xC2\x77"
     354    "\xCF\x6E\xD5\x56\x3F\xD8\x7A\xD0\x16\xCE\x5F\x4B\x00\x3B\x93\xB6"
     355    "\xF7\xAF\xD4\x8F\xFC\x6D\x36\xEE\xC0\xCE\x8E\xA9\x2F\x47\x66\x26"
     356    "\x4F\x6A\xE6\xA8\xF2\xB2\x29\x92\xEA\xDB\x55\x61\x15\x88\x6E\x07"
     357    "\x49\x9B\x2D\xA2\x99\x12\xB9\xA8\x36\xBD\x76\x3B\x72\xEA\x1D\x89"
     358    "\x4C\x7E\x45\x26\xD9\xA4\xA6\x1F\xFE\x92\x3A\x9A\xFD\xA5\x7D\x3A"
     359    "\xC1\xA4\xC0\x28\xDB\xAA\x7F\x24\x79\x27\xE8\xFB\x52\xFD\xED\xAA"
     360    "\x3B\xFC\xD5\x31\x45\xBC\x69\x79\x9D\x60\x54\x3A\x0C\x52\x56\xAD"
     361    "\xA4\x12\x89\xF1\x3A\xC0\xBF\x05\xA1\xB5\x31\xEF\x15\x21\xEE\x3C"
     362    "\x7A\xF7\x4D\x09\x7C\x68\xB8\x78\x33\x23\x40\xAA\xFC\xB1\x5A\xF4"
     363    "\x8C\x52\x5C\xDF\x3E\xF8\x6B\x92\x72\x6C\xDF\x77\xC1\x4D\xA3\x85"
     364    "\x97\x1A\x3E\x68\x8F\xB7\x8F\xCC\xA7\x68\xA0\x06\xB0\xD8\xC2\xEA"
     365    "\x3B\xBA\xB8\x0E\x50\x0F\xDF\x27\xC3\x49\xBD\x94\x1E\x19\xF3\x14"
     366    "\x3F\x60\x4E\x02\x68\x2E\xA0\x71\xD2\x1E\x0E\x03\x72\x1A\x4F\xB1"
     367    "\x76\x7D\xEA\x22\x6D\x4F\xD6\x3F\x40\x4D\xA0\x83\x63\xE5\xD5\x51"
     368    "\xFD\x8F\xAE\x45\x0D\x17\x57\xAD\x48\x4F\x29\xC1\x4D\x83\xDF\x85"
     369    "\xC8\xA5\x8E\x7C\xD0\x2F\x4D\x6C\x89\x35\x95\xEF\xD3\x1A\xB5\x8E"
     370    "\x32\x6A\xE3\xCB\x80\x4E\xC5\xBE\x25\x0A\x11\x27\xB9\x45\xCD\xEE"
     371    "\x9A\xFF\xC8\x90\x8F\x24\x25\x46\xDA\x5F\x48\x87\xB9\x5E\x4E\xF7"
     372    "\x9F\x4E\x99\xB9\xC6\x7A\xF1\x66\x01\xC7\xDB\xA7\xA8\xE6\xE5\x1F"
     373    "\x4A\x45\x90\x91\xDF\x35\x07\x3C\x83\x58\x96\x24\x82\xA5\xB8\x1D"
     374    "\xBB\xFC\x49\x08\x3E\xAC\xBC\x40\x7E\x1F\xEE\x06\xBB\xD2\xEE\xD5"
     375    "\x5F\xE9\x4B\xD9\x38\xDF\x0C\x35\xAD\xB0\x7F\x65\x46\x83\x5F\xEC"
     376    "\x4A\xC7\xF9\x61\x05\x7C\x70\xCB\x2F\x77\x76\x38\xF1\xE8\x5E\x61"
     377    "\x44\xA0\xEE\x61\x6A\xA4\x38\x19\x81\xC8\x5C\xE6\xE4\xFA\x01\x07"
     378    "\x94\xAE\x30\xA4\xAB\x0E\xA4\x44\xF4\x33\x84\x8D\x30\xA8\xA8\x4A"
     379    "\x86\xE2\x48\x79\x74\x93\x5C\x9C\xD3\x7A\xC9\x3E\x8B\x2B\x7E\x6A"
     380    "\xCE\x47\x37\x7A\x58\x77\x2C\x7C\x0B\x90\x9A\x82\x87\xE3\x99\x9A"
     381    "\x30\xCC\x95\x10\xCF\xB4\x78\x91\x83\x83\x05\x90\xA0\x5D\xED\x49"
     382    "\x8C\xCD\xC6\x8D\x40\xE7\xA2\x25\x6B\xD2\xB9\x55\x3E\xDC\xC8\x96"
     383    "\x96\x08\x9A\x7C\xBE\x25\x2C\x6A\x1B\x30\xE0\x32\x63\x40\x52\xF2"
     384    "\x58\xB0\x5C\x61\x0B\xA1\x58\x68\x67\x5C\xD9\xAA\xFD\x12\xCB\x64"
     385    "\x7D\x89\x7C\x9C\x23\xCD\xA8\x95\xD8\x4D\x1F\x62\xCC\x87\x74\xF1"
     386    "\x14\x7F\xB6\x5A\x65\x12\xA0\x1E\x37\x58\xF1\xE5\x01\xAE\x1C\x8D"
     387    "\x75\x0D\x5A\x5D\x45\x7D\xBE\xCB\x1A\xA5\xF5\x85\x43\xEB\x22\xC6"
     388    "\x15\xCF\xBD\xCB\x9C\xE6\xB8\x8A\xCA\x94\xB6\x7B\xA6\x02\x5F\xC2"
     389    "\x25\xDD\xC2\x69\x33\x05\x16\xFC\xEA\x26\xBA\xE1\x84\x86\x78\x03"
     390    "\xAE\x3A\xF4\xA1\xBB\x9D\x3F\xB5\x97\x96\x42\x91\x40\x82\x1A\x07"
     391    "\xE3\x48\x11\xA8\x6B\xD3\x2C\x3C\x51\xA3\x75\xC5\x01\x00\x00\x00"
     392    "\x20\x0A\x00\x00\x12\x20\x13\x07\x19\x11\x00\x06\x02\x80\x00\x00"
     393    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x61\x00\x00"
     394    "\x00\x00\x00\x00\x9D\x21\xC0\x3C\x37\x1B\x47\x68\x11\x7D\x4F\xA9"
     395    "\xFA\x7C\xD5\x0F\x46\xF3\x5D\x26\x2D\x71\xE5\xA0\x4E\x72\x2B\x56"
     396    "\xC4\x2E\x8D\x34\x20\x81\xFC\x95\xA5\x6E\xD9\x94\x07\x19\xB3\x36"
     397    "\xE5\x74\x35\x87\x0B\x99\x34\x1C\x6D\x1A\xDB\xDE\x5C\xB9\x6C\x84"
     398    "\x3A\xF2\xCB\xDF\xB2\x8C\xB2\x74\x46\x9D\x6A\xF8\xB8\x4D\x14\x10"
     399    "\xD7\xC4\xEB\x7D\x15\x09\xEE\x8F\x76\x29\x6E\x74\x40\xF1\x4C\x13"
     400    "\x70\xD9\x1A\xCE\xBD\x0E\x1A\xCD\x32\x7F\xE2\xB3\xBD\xF7\xE4\xF2"
     401    "\x32\xFB\xDF\x36\x0D\xCC\x7C\x11\xA0\x16\x73\x32\x65\xDD\xB0\x4E"
     402    "\x90\xC4\x95\xCB\x7B\xAB\x02\x67\xC7\x46\xAB\xEC\xCA\x35\x63\xCF"
     403    "\x14\xF8\xE1\x62\xEF\x50\x03\xAA\x8D\x4A\xEF\xA1\x03\x48\x38\x94"
     404    "\x88\xA8\x66\x7B\x5F\x85\xA7\x67\xC8\xA3\x6B\x7B\x55\xE1\xE4\xD9"
     405    "\xCC\x95\x21\x5A\x75\x29\x31\x1E\x4C\x45\x8A\x52\x88\x96\x48\xC6"
     406    "\x2C\x36\x2E\x9B\x13\x01\xE0\x3A\x1C\xA3\xF2\x17\x1E\x99\x17\xC2"
     407    "\x28\xB6\x8D\x0C\x47\xF4\x65\x6A\xC5\xAC\x1C\x08\x91\x79\xD0\x1B"
     408    "\xC1\x2C\x26\xE3\xF3\xF8\x88\xD6\x3E\x9E\x6E\xDC\x0C\x33\x49\xF3"
     409    "\xB2\x8F\x48\x20\x65\xF7\x19\xE0\x20\xEA\xC1\x68\x1F\xF1\x91\x1D"
     410    "\x05\xCA\x11\x00\xF2\xE9\x93\x42\xD2\x3C\xDB\xDB\xCF\x0D\xBE\x03"
     411    "\x72\x52\xB7\x3D\x0F\xDA\x7A\x57\xBE\x15\x54\x3F\xFD\x26\xD9\x55"
     412    "\xC1\xEB\xA4\x12\x73\xE3\xF0\x45\x71\x9A\xDB\x47\x3B\x64\xEE\x6C"
     413    "\xFE\x05\x54\xEE\x1C\x6B\xF5\x44\x6D\xD0\x6B\x39\x1C\x87\xE7\x99"
     414    "\x69\x84\xFF\x32\xE7\xBF\x54\x68\xA1\x01\xF0\x38\x3D\x94\x39\x07"
     415    "\xFD\x87\x1B\x87\x36\x15\xED\x54\x0E\x58\xB2\xAC\x73\x7C\xE9\x6E"
     416    "\xCB\xEA\x32\xD3\x2B\x97\x1D\x6D\x40\x75\xE1\x6F\xA5\x4D\xD7\xDC"
     417    "\x64\xBA\x52\x02\xC5\x71\xE6\x55\xC0\xC6\xE3\x3F\x51\x8F\x02\xA8"
     418    "\x25\x8E\x82\x0E\x32\xF8\x66\x85\x26\xBA\x66\x80\x2B\x9F\x8A\xB7"
     419    "\xB3\x61\x8E\xA3\xA5\x43\xA0\x0A\x67\x57\xB4\x3A\x3F\x87\x60\x11"
     420    "\xEC\xE6\xBB\x85\x56\x27\x46\x68\x73\xD6\xC0\x87\xD3\xDE\x51\xEC"
     421    "\x21\x68\x0A\x91\xA5\x91\x11\x76\xC8\x0E\x8A\xC0\xA0\x7A\xB4\x82"
     422    "\xBF\x83\x18\xA0\xD5\xE2\x28\xC5\x86\x9F\x18\x33\xAA\x58\x40\x14"
     423    "\x55\x81\xB1\x4C\xCE\x09\xC4\x4D\x01\x7D\x15\x8B\xBA\xFD\x05\xA2"
     424    "\x43\xB4\xAD\x33\xDC\x0B\x59\x2B\x9B\xB2\x71\xAA\x4C\x26\x33\x60"
     425    "\x4D\xB3\x53\x71\xDB\xF7\x21\xBC\x4B\x13\xF8\x37\xF5\x94\xB7\x46"
     426    "\x10\x9D\x58\x7B\xE1\x2F\x17\x56\x84\x67\x49\x43\x2F\xA5\x10\x59"
     427    "\x61\x60\xD2\x2C\x36\x3A\xD6\x79\x29\xDC\xB2\x87\x0F\x76\x77\xB2"
     428    "\xD2\xD2\xD7\xF8\x6C\x13\xFC\xEC\xF5\x50\xB4\x9A\x5F\x46\xE3\xC4"
     429    "\xE4\xBE\xF7\x88\x92\x7A\x49\x27\xDD\xBE\xA5\x04\x30\x2F\xEE\x2F"
     430    "\x67\x81\x49\x78\xEF\xA4\x87\x46\x00\xE7\x32\xD5\x3D\x93\x5B\x76"
     431    "\xD4\x97\x16\xBE\x69\x67\xF9\xE9\x36\xD8\x0D\x0B\x75\x50\xB7\x7A"
     432    "\xAE\xED\x94\x40\xF1\xD1\xE6\x65\xD0\xAD\x14\x38\x7E\x9D\x1F\x90"
     433    "\x9B\x76\xA4\xB4\x16\x40\xD9\x68\x98\xCC\xB7\xA9\x2F\x25\xAB\xC1"
     434    "\xA4\xA7\xA5\xED\x78\x8C\x5E\xD5\x68\xB9\xA4\x66\xDD\xE7\x05\xDF"
     435    "\x18\x84\x5A\x31\x9A\xD3\x8E\x61\xC2\x40\x12\xF4\x2B\x60\x0A\xF4"
     436    "\x5A\xCA\x70\xF7\x06\xE6\x1E\xDD\xA5\xF1\x8F\xF4\x73\xB1\x10\xAB"
     437    "\xE0\xFB\x15\xD8\xB9\x3C\xAD\x7A\x53\x62\x8F\xA4\x13\x90\xBC\xA4"
     438    "\x2E\x17\x01\x97\x19\x37\xEA\x6A\xBF\x35\xA1\xE4\x78\x2F\xA6\xA5"
     439    "\x07\xA6\x60\x93\x2D\x9D\x61\xD1\x7D\xFA\x02\xC8\xAA\xCB\x7B\x79"
     440    "\x84\xE2\xE3\xE3\x3A\x14\x5D\x7B\x4E\x89\x16\x27\x2D\x5B\xD9\xCD"
     441    "\x87\x90\x25\xF1\x34\xBB\x4A\x38\xC3\x35\xE8\x80\x0F\x18\x30\x87"
     442    "\x20\x9E\xB5\x0E\x55\x31\x5B\x33\x93\x65\xB3\xD2\x6E\xCD\x3A\xB8"
     443    "\x66\x9D\x5C\xE7\x8B\x4B\x90\xEF\x6C\xFB\x52\xE7\xB1\x98\x9A\x3E"
     444    "\x08\xE0\x4B\xA1\x01\x58\xE6\xA0\x70\x0B\xA5\x19\xC3\x83\xFA\xBA"
     445    "\x0B\x46\x18\xB7\xC8\xA4\x0D\x2B\xDF\x51\xF5\x44\xD2\x3A\x9D\x96"
     446    "\x2D\x7E\x8E\x49\x00\x83\x3A\x74\xC4\xF6\xAF\x07\x91\x06\x2F\x18"
     447    "\x72\xAA\xCC\xC9\x84\x18\x33\xC7\x0D\xA4\x0D\xAE\xD6\xD6\xC5\x87"
     448    "\x0A\xE5\xBC\xD5\x8A\x6E\xC4\x57\x9C\x05\x38\x66\x5C\x07\xE9\x10"
     449    "\x5C\x22\x13\x28\xFF\x53\xFB\x70\x14\x62\x17\x70\xF2\x5D\x6A\x6A"
     450    "\x85\x6C\x81\x89\xFB\x17\xFF\xF7\x33\xB1\x6C\xAA\x63\xD8\x51\xDE"
     451    "\xCF\x91\x8F\x25\x63\x66\x16\xFF\x21\xDE\x93\x74\xF2\x40\x40\xDD"
     452    "\x26\xED\xD5\x0D\x74\x30\x8D\xC4\x18\xB0\x40\x28\x65\xFF\x78\x36"
     453    "\x35\x7E\x58\x3D\x2A\x8C\x3E\x40\x96\x0C\xC2\x3A\x19\xE5\xA5\x26"
     454    "\x56\xC8\xE5\xA2\xE1\x7E\xD6\xAD\x7B\x0B\xEA\x60\x5F\xAB\xE1\xA0"
     455    "\xAE\x6F\x8D\xA2\x8F\x21\x3C\xE6\x95\x8C\xA6\x7A\x46\xF0\x87\xDA"
     456    "\x3A\x5F\xC5\xBE\xF3\x6E\x0C\xC5\xE8\x23\x37\x41\x9C\xE9\x09\xB8"
     457    "\x8E\xCD\x7A\x98\x4F\x31\x7E\xFE\x82\x7B\x77\xF5\xAE\x67\xAD\xBD"
     458    "\xA5\x61\xC1\x56\xDC\x36\x2A\xD4\xA6\x6B\x92\xB9\x0B\x88\x58\xF5"
     459    "\x81\x97\x52\x1E\xD6\xE5\x4F\xD0\xF5\xD2\xB1\x2A\x17\xAE\x55\xD0"
     460    "\x10\xAC\x99\xF3\x37\xD2\x1F\xB3\x4E\x4C\x5D\xEC\x7A\x32\xAE\xB5"
     461    "\xD8\x46\xBB\xB6\xFA\xEC\xE5\x0E\xA4\xA0\x20\x9A\xDD\xCB\x88\xAD"
     462    "\x60\xF4\x1A\xF5\x03\xD8\xFA\x59\x09\xEC\x5E\x0E\x4C\xAF\x15\x81"
     463    "\x69\x31\x8E\xC1\x27\x53\xF9\x7B\xC5\x90\xC9\xD6\x01\x35\x53\xD9"
     464    "\xDE\x00\xDF\xFA\x28\xB5\xBB\xC1\x19\x74\xD8\x00\x82\x2D\xAD\x40"
     465    "\xDB\x94\x77\xEC\x9F\x8F\x00\x4B\x9B\x26\xB5\xE7\xD7\x18\xB6\xB7"
     466    "\xB9\xE2\xB5\xE2\x51\xE0\x23\x09\xDB\x56\xE0\xC2\xA3\x44\xFD\x33"
     467    "\xAB\x51\x69\x48\xE0\x23\x7B\xB6\x7D\xB3\xFD\xA3\x5F\x6D\x7F\x58"
     468    "\x3F\x0A\xA2\x75\x49\x22\x89\x0F\xEE\xFC\xC3\xE1\xBE\x94\xD3\xC3"
     469    "\xFD\x28\xD1\xF1\xE3\xC4\xC9\x4B\xD8\xF7\x9D\x84\x02\x3D\x3C\xD2"
     470    "\xEC\x58\x83\x48\xB0\x61\xD9\x94\xD5\xA4\x23\xAC\xA7\x48\x8D\x58"
     471    "\x59\xD3\xE2\xE0\xAD\x61\x08\x35\xCF\xE1\x71\xB8\xED\x7F\xD9\x35"
     472    "\xEB\x14\x16\x09\xA8\x27\xD3\x9E\x45\xA6\xD5\xF3\x45\xC4\x5F\x20"
     473    "\x0E\x9F\xC9\x56\xED\x74\xAA\x57\x69\x65\x43\x22\x0E\xD5\x81\x7E"
     474    "\x11\xCC\x94\x60\xBE\x2A\xE5\x72\x19\x88\x9F\x70\xCC\x33\x0F\x42"
     475    "\x0B\x52\xBB\x65\xDF\xD2\x98\xE9\xE2\x73\xF4\xAB\x2C\x89\x00\xD8"
     476    "\x67\xBC\x9F\xEC\xE3\xD1\x9E\x53\x8D\x8A\x4B\x7D\xE3\x57\x4B\x2A"
     477    "\x16\x1A\xEA\x79\x65\xD8\x64\x6F\xA2\x6F\x6C\xAB\x51\xC8\x59\xDF"
     478    "\x65\x71\xBD\xBD\xBB\x4D\x74\xF7\xCA\x1C\x8D\xEB\x7E\xA7\x1C\x25"
     479    "\x7D\x58\x18\x17\xEC\x4A\x28\x37\x5A\xF0\xA1\x90\x0A\x0E\xBA\x8D"
     480    "\x91\x13\x8D\x05\x8F\xED\xB5\xF5\x4D\xD3\x1C\xD4\x9E\x60\xE3\x96"
     481    "\x00\xAA\xC6\x85\x16\xD9\x2F\x30\x7D\x15\x07\x94\xAB\xF7\xD0\x24"
     482    "\x94\xB5\x0C\x70\x26\xA4\xD1\x34\xBF\x76\x32\xF1\xAC\x2E\x5E\x4D"
     483    "\xCA\x33\xB9\x17\xEB\xAA\x51\x4A\xED\x29\x28\xE7\x1E\xF1\x63\x6F"
     484    "\x5E\xB9\xDC\x70\xCB\x94\x32\xE9\x36\x10\x9F\xC0\xDB\xEC\x3D\x16"
     485    "\x40\x9F\x62\x80\xCC\x83\x91\xFB\xD2\xFB\x02\x97\x15\xBE\xB3\x4F"
     486    "\xB6\x34\x13\xE9\x3E\x7E\xA4\x78\xF3\x17\xAF\xF1\x2D\xF1\xED\x67"
     487    "\x99\x92\xC4\x91\x66\xC0\xC5\xC5\x14\x10\xD2\x6A\x51\x7F\x37\x24"
     488    "\xDD\x0A\x94\xE4\x5A\xE4\x09\xD4\x75\x32\xF2\x7C\x86\x9D\xD4\xBD"
     489    "\x65\x0C\xBF\x17\x9B\x2C\xB0\x9D\xAC\x48\x3C\xE7\x5E\x4A\x44\xE7"
     490    "\xD1\x9B\xCB\x62\xB0\x06\xBE\x39\x58\xC5\x28\x63\x92\xE6\xD0\x3E"
     491    "\xF0\xE6\xC6\xAC\x6D\xC2\xF5\x5B\xDC\xF4\xF2\xFA\x9E\xE9\x63\xEA"
     492    "\x32\x36\x1B\x17\xB4\x6F\x0F\x20\xFB\xF0\x51\xD3\xD0\xE1\x67\xB7"
     493    "\x27\xC8\xC8\x8D\x7C\x47\xB2\xE2\x1F\x0F\xB0\x36\x03\x3F\xA3\x1A"
     494    "\xDB\x62\x0E\x9F\x5D\xC3\x83\x03\x83\x02\x32\x2F\xC4\xD6\xF0\x4F"
     495    "\x64\x6C\x9E\xFD\x66\x00\x0B\xE5\x1F\xE1\xE5\xEC\xD5\x82\x97\x41"
     496    "\xC4\xF1\xA6\xFE\xD5\x75\x39\x2F\x1E\x9B\x64\x0C\x80\x85\x7E\x05"
     497    "\xAD\xD5\xFD\x01\x18\x75\xE9\x6D\xC6\x18\x5D\xCA\x7A\x7C\x84\x6B"
     498    "\xF0\x9E\x3A\x46\xCC\x8D\xDD\x2F\x8F\xF7\xDD\xAB\x62\x8F\x2B\xE9"
     499    "\x99\xA6\xC2\x5A\xD5\x2D\x46\x2F\x7B\xD3\x77\x37\x4B\x20\xF1\x77"
     500    "\x5C\xE5\x86\xD7\x19\x97\xEE\xA8\x4C\x3B\x8A\x17\x71\x1D\xEF\xD2"
     501    "\x08\x0D\xE6\xD8\xB2\x07\x3B\x36\xA6\x74\xF4\x07\x8D\xAE\xC0\xCE"
     502    "\x66\x0E\xF6\x5E\x63\xA3\x40\xFF\xCA\xE6\x39\x42\x88\xA3\xDE\xD5"
     503    "\x45\x49\x8C\xA2\x86\xD0\x46\x91\x6F\xE2\x92\xD4\x77\x46\x40\xC3"
     504    "\x62\x8C\x14\xCC\xD4\x5F\x5E\x51\xDF\xB9\xF5\xED\xCA\x69\xA9\x02"
     505    "\x3B\xEE\xAF\x8F\x16\x96\x52\x34\x61\xA8\x5C\x2A\xAB\x0E\xA5\x0F"
     506    "\xF8\xDC\x66\xEF\x92\x4C\x3A\x0B\xA0\xC4\xA5\xFE\x13\xD7\xDA\x2C"
     507    "\x4E\x7D\xE0\x93\xD0\xC5\xF0\x68\x14\xAF\x6B\x25\x27\x89\x41\x95"
     508    "\x0E\x45\x02\xAE\xD4\x42\x49\x28\xAB\x56\xEA\x9C\x82\xC5\x76\x57"
     509    "\x18\x95\x0F\xCF\xD1\x8B\x99\xB8\xC1\x99\xDD\x7E\xCF\xDC\x94\x4E"
     510    "\xCC\x32\x43\x69\x0C\x41\x76\xD9\xC4\xCC\x34\x9A\x41\x54\x3B\x67"
     511    "\xB9\x4A\xA2\xAE\xA2\xCC\x33\x81\x08\x4B\x22\xFB\x24\x8C\xC5\xED"
     512    "\x2B\xD1\xBE\x75\xCE\x0F\x25\x8B\xA1\xD4\x26\x6C\xAD\xB1\x38\xF3"
     513    "\x03\x9D\x9A\x81\x33\xF2\x34\xD0\x82\xC1\xCB\x81\x16\x5A\xB3\x81"
     514    "\x47\x09\x18\xBD\x01\x90\x07\x81\x0A\xF4\xBE\xC2\xE6\x1B\x70\x40"
     515    "\x55\x84\xE8\x9E\xC3\x0A\x41\x6D\xE1\x29\x91\x7D\xA6\xA8\x7D\x51"
     516    "\xCB\x0F\xA8\x6F\x7F\x5C\xAA\xA9\x0F\x8F\x12\x83\x8A\x6D\x15\x1D"
     517    "\x8E\xEB\x72\xC6\x6A\x42\x1E\x5B\x47\xE2\x3D\xDF\xDD\x42\x80\x0A"
     518    "\xA2\x15\x46\x8A\xA7\x82\xA6\x4C\xA3\x00\x7A\xBA\x1F\x0D\xFB\x09"
     519    "\xFD\xD0\x83\x46\x15\x74\x54\x0F\x4C\xB6\xD4\xD1\xC3\x5D\x10\xCB"
     520    "\x37\x6A\x97\xEA\x34\x55\x4F\x3F\x46\x28\xED\x3D\xBC\xCA\x02\x03"
     521    "\x5E\x93\x93\x10\x7D\x17\x31\xEC\x14\x14\xF8\x7F\x0D\x52\x17\xCA"
     522    "\x37\x37\xF6\xE5\x65\x9E\xDA\x74\x13\x1C\xEC\xAC\xA8\xBC\x39\xA7"
     523    "\x0C\x88\xDC\x93\xC0\xB5\xA5\x0D\x2F\x72\x96\x44\x61\xEB\x41\x7B"
     524    "\x99\x93\x12\xA9\xA4\xFE\x21\x91\x0B\x0F\x88\x10\x68\x1B\x27\x95"
     525    "\x00\x4D\xCF\x4C\x44\xB4\x6D\xDC\x34\xC8\x8C\xFA\x88\xA1\xD0\x34"
     526    "\x86\xAC\xFD\xDD\x64\xA0\xA4\x58\xE5\x4D\x45\xF3\xFC\x0D\x67\xB6"
     527    "\xAD\x68\x79\xBD\x55\xC7\xA2\x03\x8F\x94\x98\x1B\x3F\xE1\xD0\x58"
     528    "\xF1\xC2\x8A\x52\x87\x25\x4D\x70\x46\x0F\x47\xA8\x5E\xC5\xB1\x85"
     529    "\x97\x30\xF1\x25\x00\x57\x57\xC4\x01\x0A\xB9\x7C\x58\x8F\x29\x9D"
     530    "\xCC\xB3\x9D\xCC\x1F\x39\x56\x38\x81\x90\x32\xC1\x44\xDF\xE4\x68"
     531    "\xF2\xC5\x0A\x9C\x06\x3A\x56\x80\x3B\x40\xAD\xC9\x88\x2C\x6A\x3A"
     532    "\x8B\x27\xC8\xA4\x0C\xBA\xC6\x13\x2E\xBC\x8E\x40\x3C\x7F\x27\xAE"
     533    "\xD4\x4F\x48\x9B\x5D\xF5\xFD\x2C\x6A\x02\xCD\x05\xB0\x9E\x9B\x08"
     534    "\x85\x4A\x96\x8D\x46\xA5\x25\xEA\x56\xB4\xC5\x24\x62\xB5\xF6\x88"
     535    "\xC8\x2A\xA9\x90\xB4\xB8\xC2\xD5\x38\x34\xAD\xAF\x4D\xEF\x89\xD2"
     536    "\xF0\x07\x78\x13\xC7\x3D\xF2\x70\x88\x27\x24\xA7\x34\x0C\xEC\x75"
     537    "\x0F\x3D\x4F\x82\xBA\x98\x92\xAC\xA9\xB1\x30\x7A\x8B\xD3\xB7\x37"
     538    "\x20\x78\x74\xDF\x09\x05\x19\xAA\x82\x44\x45\x79\xF4\x63\x4B\x61"
     539    "\x81\xCC\xB5\xBD\x29\x7C\x8B\x39\x43\x9B\x96\xE5\x9D\xBC\x01\xC7"
     540    "\x74\xFC\x08\x0C\xA8\x11\x4E\x70\x3D\x01\x55\xE6\x48\x2D\xC9\x87"
     541    "\xDC\x6F\x4E\x9F\x0E\x08\x96\x7C\x44\xF3\xBE\xC9\xE6\x1E\x93\xE8"
     542    "\xB7\x3D\xAE\xE0\xEC\x7F\xEE\x3F\x27\x9B\x9E\x61\x19\xA9\x98\x1C"
     543    "\x89\x3D\x48\xE1\xF9\xCE\x98\x5C\x5B\x74\xEE\xE3\x08\x4D\xE2\x06"
     544    "\x3E\x86\xBC\xEA\xF3\x6E\x6C\x54\x1A\x8C\x2B\xE4\x71\xEE\x97\xB3"
     545    "\x71\x45\x2C\xEC\x80\x13\xDB\x31\x0E\xF8\xE9\x31\x59\xD8\x32\xE1"
     546    "\x9C\xA2\x44\xDD\x53\xA7\x0D\xAF\xB3\x98\x74\xBF\x8A\xBB\x06\xED"
     547    "\xA7\xB6\x70\x3D\xF4\x35\x09\x1F\x54\x0F\x03\xDE\x0A\x9D\x6B\x19"
     548    "\xE2\xBF\x04\xAE\x17\x41\x7F\x26\xC5\x2E\x36\xD3\x6D\x86\xBC\x87"
     549    "\x49\x8A\xA2\xDE\x87\xD2\xE4\x3E\x66\xF9\x5A\x3B\x0B\x18\xBC\xEB"
     550    "\xB9\xCA\x8B\x28\x1C\xB4\xA3\xAB\x42\x33\x41\xDB\xF2\xD5\xE0\xA0"
     551    "\xD8\xEF\x79\xB7\x5D\xAF\x57\xF3\xCD\x1D\xF8\x98\x2A\x64\x3A\x79"
     552    "\xBE\xFA\x93\xCD\x70\x7C\xDE\xD1\x7C\x5E\xD1\xB5\x02\x88\xBE\xFA"
     553    "\xA4\x3F\x95\x41\x44\x8C\x01\x9F\x59\x24\x76\x66\xE3\xBA\xBF\x56"
     554    "\x4D\x14\xF8\x3E";
     555
     556#endif  /* KERNEL_MICROCODE_AMD_H */
  • src/system/kernel/arch/x86/Jamfile

    diff --git a/src/system/kernel/arch/x86/Jamfile b/src/system/kernel/arch/x86/Jamfile
    index dd068ac..a78bfc9 100644
    a b if $(TARGET_ARCH) = x86_64 {  
    7474local archGenericSources =
    7575    arch_altcodepatch.cpp
    7676    arch_cpu.cpp
     77    arch_cpu_microcode.cpp
    7778    arch_commpage.cpp
    7879    arch_debug.cpp
    7980    arch_debug_console.cpp
  • src/system/kernel/arch/x86/arch_cpu.cpp

    diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp b/src/system/kernel/arch/x86/arch_cpu.cpp
    index 85d2108..93a4516 100644
    a b arch_cpu_init_percpu(kernel_args* args, int cpu)  
    11291129            gCpuIdleFunc = halt_idle;
    11301130    }
    11311131
     1132    status_t mc_status = arch_cpu_load_microcode();
     1133    if (mc_status != B_OK)
     1134        return mc_status;
     1135
    11321136    return B_OK;
    11331137}
    11341138
  • new file src/system/kernel/arch/x86/arch_cpu_microcode.cpp

    diff --git a/src/system/kernel/arch/x86/arch_cpu_microcode.cpp b/src/system/kernel/arch/x86/arch_cpu_microcode.cpp
    new file mode 100644
    index 0000000..1f3fd48
    - +  
     1/*
     2 * Copyright 2018, Nikolas Zimmermann, zimmermann@physik.rwth-aachen.de
     3 * Distributed under the terms of the MIT License.
     4 *
     5 * Copyright (C) 2008-2013 Advanced Micro Devices Inc.
     6 *               2013-2016 Borislav Petkov <bp@alien8.de>
     7 *
     8 * Distributed under the terms of the GNU General Public
     9 * License version 2.
     10 */
     11
     12
     13#include <cpu.h>
     14
     15#include <stdio.h>
     16
     17#include <debug.h>
     18#include <microcode_amd.h>
     19
     20#include <arch_system_info.h>
     21#include <boot/kernel_args.h>
     22
     23#define MSR_AMD64_PATCH_LEVEL  0x0000008b
     24#define MSR_AMD64_PATCH_LOADER 0xc0010020
     25
     26/*
     27 * This points to the current valid container of microcode patches which we will
     28 * save from the initrd/builtin before jettisoning its contents. @mc is the
     29 * microcode patch we found to match.
     30 */
     31struct cont_desc {
     32        struct microcode_amd* mc;
     33        uint32 cpuid_1_eax;
     34        uint32 psize;
     35        uint8* data;
     36        size_t size;
     37};
     38
     39static uint16
     40find_equiv_id(struct equiv_cpu_entry* equiv_table, uint32 sig)
     41{
     42        for (; equiv_table && equiv_table->installed_cpu; equiv_table++) {
     43                if (sig == equiv_table->installed_cpu)
     44                        return equiv_table->equiv_cpu;
     45        }
     46
     47        return 0;
     48}
     49
     50/*
     51 * This scans the ucode blob for the proper container as we can have multiple
     52 * containers glued together. Returns the equivalence ID from the equivalence
     53 * table or 0 if none found.
     54 * Returns the amount of bytes consumed while scanning. @desc contains all the
     55 * data we're going to use in later stages of the application.
     56 */
     57static ssize_t
     58parse_container(uint8* ucode, ssize_t size, struct cont_desc* desc)
     59{
     60        struct equiv_cpu_entry* eq;
     61        ssize_t orig_size = size;
     62        uint32* hdr = (uint32*) ucode;
     63        uint16 eq_id;
     64        uint8* buf;
     65
     66        /* Am I looking at an equivalence table header? */
     67        if (hdr[0] != UCODE_MAGIC ||
     68            hdr[1] != UCODE_EQUIV_CPU_TABLE_TYPE ||
     69            hdr[2] == 0)
     70                return CONTAINER_HDR_SZ;
     71
     72        buf = ucode;
     73
     74        eq = (struct equiv_cpu_entry*)(buf + CONTAINER_HDR_SZ);
     75
     76        /* Find the equivalence ID of our CPU in this table: */
     77        eq_id = find_equiv_id(eq, desc->cpuid_1_eax);
     78
     79        buf  += hdr[2] + CONTAINER_HDR_SZ;
     80        size -= hdr[2] + CONTAINER_HDR_SZ;
     81
     82        /*
     83         * Scan through the rest of the container to find where it ends. We do
     84          some basic sanity-checking too.
     85         */
     86        while (size > 0) {
     87                struct microcode_amd *mc;
     88                uint32 patch_size;
     89
     90                hdr = (uint32 *)buf;
     91
     92                if (hdr[0] != UCODE_UCODE_TYPE)
     93                        break;
     94
     95                /* Sanity-check patch size. */
     96                patch_size = hdr[1];
     97                if (patch_size > PATCH_MAX_SIZE)
     98                        break;
     99
     100                /* Skip patch section header: */
     101                buf  += SECTION_HDR_SIZE;
     102                size -= SECTION_HDR_SIZE;
     103
     104                mc = (struct microcode_amd *)buf;
     105                if (eq_id == mc->hdr.processor_rev_id) {
     106                        desc->psize = patch_size;
     107                        desc->mc = mc;
     108                }
     109
     110                buf  += patch_size;
     111                size -= patch_size;
     112        }
     113
     114        /*
     115         * If we have found a patch (desc->mc), it means we're looking at the
     116         * container which has a patch for this CPU so return 0 to mean, @ucode
     117         * already points to the proper container. Otherwise, we return the size
     118         * we scanned so that we can advance to the next container in the
     119         * buffer.
     120         */
     121        if (desc->mc) {
     122                desc->data = ucode;
     123                desc->size = orig_size - size;
     124
     125                return 0;
     126        }
     127
     128        return orig_size - size;
     129}
     130
     131/*
     132 * Scan the ucode blob for the proper container as we can have multiple
     133 * containers glued together.
     134 */
     135static void
     136scan_containers(uint8* ucode, size_t size, struct cont_desc* desc)
     137{
     138        ssize_t rem = size;
     139
     140        while (rem >= 0) {
     141                ssize_t s = parse_container(ucode, rem, desc);
     142                if (!s)
     143                        return;
     144
     145                ucode += s;
     146                rem   -= s;
     147        }
     148}
     149
     150status_t
     151arch_cpu_load_microcode()
     152{
     153        cpu_ent* cpu = get_cpu_struct();
     154
     155    // TODO: Extend to Intel as well, and all AMD variants.
     156        if (cpu->arch.vendor != VENDOR_AMD)
     157                return B_OK;
     158
     159    // Currently only AMD 15h family is supported.
     160    if (cpu->arch.family == 0xf && cpu->arch.extended_family == 6) {
     161        dprintf("microcode: Obtaining AMD microcode update\n");
     162
     163        cpuid_info cpuid;
     164        get_current_cpuid(&cpuid, 1, 0);
     165
     166        struct cont_desc desc = { 0 };
     167        desc.cpuid_1_eax = cpuid.regs.eax;
     168        scan_containers((uint8*) gMicrocode_amd_15h, gMicrocodeSize_amd_15h, &desc);
     169        struct microcode_amd *mc = desc.mc;
     170        if (!mc) {
     171            dprintf("microcode: Failed to extract AMD microcode update. This should not happen!\n");
     172            return B_ERROR;
     173        }
     174
     175        dprintf("microcode: Successfully extracted AMD microcode firmware: patch_id: %d, processor_rev_id %d\n", mc->hdr.patch_id, mc->hdr.processor_rev_id);
     176
     177        uint32 rev = (uint32) x86_read_msr(MSR_AMD64_PATCH_LEVEL);
     178        dprintf("microcode: Currently loaded revision %d\n", rev);
     179
     180        if (rev >= mc->hdr.patch_id) {
     181            dprintf("microcode: No need to patch, microcode is using the newest available revision\n");
     182            return B_OK;
     183        }
     184
     185        x86_write_msr(MSR_AMD64_PATCH_LOADER, (uint64)(long)&mc->hdr.data_code);
     186
     187        rev = (uint32) x86_read_msr(MSR_AMD64_PATCH_LEVEL);
     188        if (rev != mc->hdr.patch_id) {
     189            dprintf("microcode: Patching microcode failed, expecting revision %d, but got %d\n", mc->hdr.patch_id, rev);
     190            return B_OK;
     191        }
     192
     193        dprintf("microcode: Successfully patched microcode to revision %d, from previous %d\n", mc->hdr.patch_id, rev);
     194    }
     195
     196    return B_OK;
     197}